From 2d481986b1be911bad6012c56fe3e45e973f843d Mon Sep 17 00:00:00 2001
From: applelon <380149513@qq.com>
Date: Thu, 18 Aug 2022 10:52:41 +0800
Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0demo?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
DosingSystem/App.xaml.cs | 4 +-
SmartClient.sln | 23 +++
WPFDemo/App.xaml | 9 ++
WPFDemo/App.xaml.cs | 17 +++
WPFDemo/AssemblyInfo.cs | 10 ++
WPFDemo/MainWindow.xaml | 23 +++
WPFDemo/MainWindow.xaml.cs | 53 +++++++
WPFDemo/Segment.cs | 31 ++++
WPFDemo/Silo.xaml | 36 +++++
WPFDemo/Silo.xaml.cs | 60 ++++++++
WPFDemo/SiloPanel.xaml | 16 +++
WPFDemo/SiloPanel.xaml.cs | 288 +++++++++++++++++++++++++++++++++++++
WPFDemo/WPFDemo.csproj | 24 ++++
WPFDemo/device.png | Bin 0 -> 2655 bytes
14 files changed, 592 insertions(+), 2 deletions(-)
create mode 100644 WPFDemo/App.xaml
create mode 100644 WPFDemo/App.xaml.cs
create mode 100644 WPFDemo/AssemblyInfo.cs
create mode 100644 WPFDemo/MainWindow.xaml
create mode 100644 WPFDemo/MainWindow.xaml.cs
create mode 100644 WPFDemo/Segment.cs
create mode 100644 WPFDemo/Silo.xaml
create mode 100644 WPFDemo/Silo.xaml.cs
create mode 100644 WPFDemo/SiloPanel.xaml
create mode 100644 WPFDemo/SiloPanel.xaml.cs
create mode 100644 WPFDemo/WPFDemo.csproj
create mode 100644 WPFDemo/device.png
diff --git a/DosingSystem/App.xaml.cs b/DosingSystem/App.xaml.cs
index bd6c6670..126af7ed 100644
--- a/DosingSystem/App.xaml.cs
+++ b/DosingSystem/App.xaml.cs
@@ -30,8 +30,8 @@ namespace BPASmartClient.DosingSystem
MenuInit();
DataInit();
DeviceInquire.GetInstance.Init();//配料机设备上线监听,设备列表初始化
- NewMaterialDeviceParView newMaterialDeviceParView = new NewMaterialDeviceParView();
- newMaterialDeviceParView.ShowDialog();
+ //NewMaterialDeviceParView newMaterialDeviceParView = new NewMaterialDeviceParView();
+ //newMaterialDeviceParView.ShowDialog();
MainView mv = new MainView();
//mv.Show();
LoginView lv = new LoginView();
diff --git a/SmartClient.sln b/SmartClient.sln
index f2ae20db..e2b2a72e 100644
--- a/SmartClient.sln
+++ b/SmartClient.sln
@@ -132,6 +132,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BPASmartClient.JXJFoodBigSt
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BPASmartClient.JXJFoodSmallStation", "BPASmartClient.JXJFoodSmallStation\BPASmartClient.JXJFoodSmallStation.csproj", "{D609C4CF-FA5C-4D39-B12F-07A60FFE5E40}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WPFDemo", "WPFDemo\WPFDemo.csproj", "{A456D582-D910-4CA2-8620-6D8F63344B47}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -1266,6 +1268,26 @@ Global
{D609C4CF-FA5C-4D39-B12F-07A60FFE5E40}.Release|x64.Build.0 = Release|Any CPU
{D609C4CF-FA5C-4D39-B12F-07A60FFE5E40}.Release|x86.ActiveCfg = Release|Any CPU
{D609C4CF-FA5C-4D39-B12F-07A60FFE5E40}.Release|x86.Build.0 = Release|Any CPU
+ {A456D582-D910-4CA2-8620-6D8F63344B47}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {A456D582-D910-4CA2-8620-6D8F63344B47}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {A456D582-D910-4CA2-8620-6D8F63344B47}.Debug|ARM.ActiveCfg = Debug|Any CPU
+ {A456D582-D910-4CA2-8620-6D8F63344B47}.Debug|ARM.Build.0 = Debug|Any CPU
+ {A456D582-D910-4CA2-8620-6D8F63344B47}.Debug|ARM64.ActiveCfg = Debug|Any CPU
+ {A456D582-D910-4CA2-8620-6D8F63344B47}.Debug|ARM64.Build.0 = Debug|Any CPU
+ {A456D582-D910-4CA2-8620-6D8F63344B47}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {A456D582-D910-4CA2-8620-6D8F63344B47}.Debug|x64.Build.0 = Debug|Any CPU
+ {A456D582-D910-4CA2-8620-6D8F63344B47}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {A456D582-D910-4CA2-8620-6D8F63344B47}.Debug|x86.Build.0 = Debug|Any CPU
+ {A456D582-D910-4CA2-8620-6D8F63344B47}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {A456D582-D910-4CA2-8620-6D8F63344B47}.Release|Any CPU.Build.0 = Release|Any CPU
+ {A456D582-D910-4CA2-8620-6D8F63344B47}.Release|ARM.ActiveCfg = Release|Any CPU
+ {A456D582-D910-4CA2-8620-6D8F63344B47}.Release|ARM.Build.0 = Release|Any CPU
+ {A456D582-D910-4CA2-8620-6D8F63344B47}.Release|ARM64.ActiveCfg = Release|Any CPU
+ {A456D582-D910-4CA2-8620-6D8F63344B47}.Release|ARM64.Build.0 = Release|Any CPU
+ {A456D582-D910-4CA2-8620-6D8F63344B47}.Release|x64.ActiveCfg = Release|Any CPU
+ {A456D582-D910-4CA2-8620-6D8F63344B47}.Release|x64.Build.0 = Release|Any CPU
+ {A456D582-D910-4CA2-8620-6D8F63344B47}.Release|x86.ActiveCfg = Release|Any CPU
+ {A456D582-D910-4CA2-8620-6D8F63344B47}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -1327,6 +1349,7 @@ Global
{D1F2379E-1755-4B50-9D67-15C960C33FFA} = {3D1D0E04-03FD-480A-8CF8-6E01A2E28625}
{FA695D7E-6F12-4483-A16D-8494609FAE68} = {8712125E-14CD-4E1B-A1CE-4BDE03805942}
{D609C4CF-FA5C-4D39-B12F-07A60FFE5E40} = {8712125E-14CD-4E1B-A1CE-4BDE03805942}
+ {A456D582-D910-4CA2-8620-6D8F63344B47} = {8712125E-14CD-4E1B-A1CE-4BDE03805942}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {9AEC9B81-0222-4DE9-B642-D915C29222AC}
diff --git a/WPFDemo/App.xaml b/WPFDemo/App.xaml
new file mode 100644
index 00000000..fae8c33d
--- /dev/null
+++ b/WPFDemo/App.xaml
@@ -0,0 +1,9 @@
+
+
+
+
+
diff --git a/WPFDemo/App.xaml.cs b/WPFDemo/App.xaml.cs
new file mode 100644
index 00000000..5bde2402
--- /dev/null
+++ b/WPFDemo/App.xaml.cs
@@ -0,0 +1,17 @@
+using System;
+using System.Collections.Generic;
+using System.Configuration;
+using System.Data;
+using System.Linq;
+using System.Threading.Tasks;
+using System.Windows;
+
+namespace WPFDemo
+{
+ ///
+ /// Interaction logic for App.xaml
+ ///
+ public partial class App : Application
+ {
+ }
+}
diff --git a/WPFDemo/AssemblyInfo.cs b/WPFDemo/AssemblyInfo.cs
new file mode 100644
index 00000000..8b5504ec
--- /dev/null
+++ b/WPFDemo/AssemblyInfo.cs
@@ -0,0 +1,10 @@
+using System.Windows;
+
+[assembly: ThemeInfo(
+ ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
+ //(used if a resource is not found in the page,
+ // or application resource dictionaries)
+ ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
+ //(used if a resource is not found in the page,
+ // app, or any theme specific resource dictionaries)
+)]
diff --git a/WPFDemo/MainWindow.xaml b/WPFDemo/MainWindow.xaml
new file mode 100644
index 00000000..b542c9f7
--- /dev/null
+++ b/WPFDemo/MainWindow.xaml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/WPFDemo/MainWindow.xaml.cs b/WPFDemo/MainWindow.xaml.cs
new file mode 100644
index 00000000..61c65ad4
--- /dev/null
+++ b/WPFDemo/MainWindow.xaml.cs
@@ -0,0 +1,53 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+
+namespace WPFDemo
+{
+ ///
+ /// Interaction logic for MainWindow.xaml
+ ///
+ public partial class MainWindow : Window
+ {
+ public MainWindow()
+ {
+ InitializeComponent();
+ }
+
+ private void Button_Click(object sender, RoutedEventArgs e)
+ {
+ sp.AddSilo();
+ }
+
+ private void Button_Click_1(object sender, RoutedEventArgs e)
+ {
+ sp.AddLine();
+ }
+
+ private void Button_Click_2(object sender, RoutedEventArgs e)
+ {
+ sp.Load();
+ }
+
+ private void Button_Click_3(object sender, RoutedEventArgs e)
+ {
+ sp.Save();
+ }
+
+ private void Button_Click_4(object sender, RoutedEventArgs e)
+ {
+ sp.Clear();
+ }
+ }
+}
diff --git a/WPFDemo/Segment.cs b/WPFDemo/Segment.cs
new file mode 100644
index 00000000..495b693d
--- /dev/null
+++ b/WPFDemo/Segment.cs
@@ -0,0 +1,31 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Shapes;
+
+namespace WPFDemo
+{
+ public class Segment
+ {
+ public List Silos { get; set; } = new List();
+
+ public List Lines { get; set; } = new List();
+
+ public class SimpleSilo
+ {
+ public string Caption { get; set; }
+ public string Index { get; set; }
+ public double Top { get; set; }
+ public double Left { get; set; }
+ }
+
+ public class SimpleLine {
+ public double X1 { get; set; }
+ public double X2 { get; set; }
+ public double Y1 { get; set; }
+ public double Y2 { get; set; }
+ }
+ }
+}
diff --git a/WPFDemo/Silo.xaml b/WPFDemo/Silo.xaml
new file mode 100644
index 00000000..5399f469
--- /dev/null
+++ b/WPFDemo/Silo.xaml
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/WPFDemo/Silo.xaml.cs b/WPFDemo/Silo.xaml.cs
new file mode 100644
index 00000000..639b4dd8
--- /dev/null
+++ b/WPFDemo/Silo.xaml.cs
@@ -0,0 +1,60 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+
+namespace WPFDemo
+{
+ ///
+ /// Silo.xaml 的交互逻辑
+ ///
+ public partial class Silo : UserControl, INotifyPropertyChanged
+ {
+
+
+ public string Index
+ {
+ get { return (string)GetValue(IndexProperty); }
+ set { SetValue(IndexProperty, value);
+ PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Index"));
+ }
+ }
+
+ // Using a DependencyProperty as the backing store for Index. This enables animation, styling, binding, etc...
+ public static readonly DependencyProperty IndexProperty =
+ DependencyProperty.Register("Index", typeof(string), typeof(Silo), new PropertyMetadata("Unkown"));
+
+
+
+ public string Caption
+ {
+ get { return (string)GetValue(CaptionProperty); }
+ set { SetValue(CaptionProperty, value);
+ PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Caption"));
+ }
+ }
+
+ // Using a DependencyProperty as the backing store for Caption. This enables animation, styling, binding, etc...
+ public static readonly DependencyProperty CaptionProperty =
+ DependencyProperty.Register("Caption", typeof(string), typeof(Silo), new PropertyMetadata("Null"));
+
+
+ public Silo()
+ {
+ InitializeComponent();
+ }
+
+ public event PropertyChangedEventHandler? PropertyChanged;
+ }
+}
diff --git a/WPFDemo/SiloPanel.xaml b/WPFDemo/SiloPanel.xaml
new file mode 100644
index 00000000..8158d6f8
--- /dev/null
+++ b/WPFDemo/SiloPanel.xaml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/WPFDemo/SiloPanel.xaml.cs b/WPFDemo/SiloPanel.xaml.cs
new file mode 100644
index 00000000..5f79a630
--- /dev/null
+++ b/WPFDemo/SiloPanel.xaml.cs
@@ -0,0 +1,288 @@
+using Microsoft.Win32;
+using Newtonsoft.Json;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+
+namespace WPFDemo
+{
+ ///
+ /// SiloPanel.xaml 的交互逻辑
+ ///
+ public partial class SiloPanel : UserControl, INotifyPropertyChanged
+ {
+ //料仓模块左键按下标识
+ bool siloIsMouseDown = false;
+ //画线标识
+ bool lineIsDraw = false;
+ //当前线条
+ private Line currentLine;
+ //线条集合
+ private List lines = new List();
+ //料仓集合
+ private List silos = new List();
+ //用于序列化
+ private Segment segment = new Segment();
+
+ //提示
+ private string tips = "常规模式";
+ ///
+ /// 提示
+ ///
+ public string Tips
+ {
+ get { return tips; }
+ set
+ {
+ tips = value;
+ PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Tips"));
+ }
+ }
+ ///
+ /// 当前选中的料仓
+ ///
+ public Silo CurrentSilo { get; private set; }
+
+ ///
+ /// 画布宽度
+ ///
+ public double PanelWidth
+ {
+ get { return (double)GetValue(PanelWidthProperty); }
+ set { SetValue(PanelWidthProperty, value); }
+ }
+
+ // Using a DependencyProperty as the backing store for PanelWidth. This enables animation, styling, binding, etc...
+ public static readonly DependencyProperty PanelWidthProperty =
+ DependencyProperty.Register("PanelWidth", typeof(double), typeof(SiloPanel), new PropertyMetadata(1920d));
+
+
+ ///
+ /// 画布高度
+ ///
+ public double PanelHeight
+ {
+ get { return (double)GetValue(PanelHeightProperty); }
+ set { SetValue(PanelHeightProperty, value); }
+ }
+
+ // Using a DependencyProperty as the backing store for PanelHeight. This enables animation, styling, binding, etc...
+ public static readonly DependencyProperty PanelHeightProperty =
+ DependencyProperty.Register("PanelHeight", typeof(double), typeof(SiloPanel), new PropertyMetadata(1080d));
+
+ public event PropertyChangedEventHandler? PropertyChanged;
+
+ public SiloPanel()
+ {
+ InitializeComponent();
+ cvMain.PreviewMouseLeftButtonDown += CvMain_PreviewMouseLeftButtonDown;
+ cvMain.PreviewMouseMove += CvMain_PreviewMouseMove;
+ cvMain.PreviewMouseLeftButtonUp += CvMain_PreviewMouseLeftButtonUp;
+ }
+
+ ///
+ /// 开始画线
+ ///
+ public void AddLine()
+ {
+ lineIsDraw = true;
+ Tips = "线条绘制";
+ }
+
+ ///
+ /// 添加料仓模块
+ ///
+ public void AddSilo()
+ {
+ if (lineIsDraw)
+ lineIsDraw = false;
+ newSilo(String.Empty, String.Empty);
+ }
+
+ ///
+ /// 保存文件
+ ///
+ public void Save()
+ {
+ segment.Silos.Clear();
+ segment.Lines.Clear();
+ lines.ForEach(line =>
+ {
+ segment.Lines.Add(new Segment.SimpleLine() { X1 = line.X1, X2 = line.X2, Y1 = line.Y1, Y2 = line.Y2 });
+ });
+ silos.ForEach(silo =>
+ {
+ segment.Silos.Add(new Segment.SimpleSilo()
+ {
+ Left = (double)silo.GetValue(Canvas.LeftProperty),
+ Top = (double)silo.GetValue(Canvas.TopProperty),
+ Caption = silo.Caption,
+ Index = silo.Index
+ });
+ });
+
+
+ string ResultJson = JsonConvert.SerializeObject(segment);
+ SaveFileDialog dialog = new SaveFileDialog();
+ dialog.Filter = "配置文件|*.json";
+ if (dialog.ShowDialog() == true)
+ {
+ File.WriteAllText(dialog.FileName, ResultJson);
+ }
+ }
+
+ ///
+ /// 加载文件
+ ///
+ public void Load()
+ {
+ OpenFileDialog dialog = new OpenFileDialog();
+ dialog.Filter = "配置文件|*.json";
+ if (dialog.ShowDialog() == true)
+ {
+ string content = File.ReadAllText(dialog.FileName);
+ try
+ {
+ segment = JsonConvert.DeserializeObject(content);
+ lines.Clear();
+ silos.Clear();
+ cvMain.Children.Clear();
+ foreach (var line in segment.Lines)
+ {
+ newLine(line.X1, line.Y1, line.X2, line.Y2);
+ }
+ foreach (var temp in segment.Silos)
+ {
+ newSilo(temp.Caption, temp.Index,temp.Left,temp.Top);
+ }
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show(ex.Message);
+ }
+ }
+ }
+
+ ///
+ /// 清空画布
+ ///
+ public void Clear()
+ {
+ lines.Clear();
+ silos.Clear();
+ cvMain.Children.Clear();
+ }
+
+ private void newSilo(string caption, string index, double left = -1, double top = -1)
+ {
+ Silo silo = new Silo() { Caption = caption, Index = index };
+ if (left == -1)
+ silo.SetValue(Canvas.LeftProperty, cvMain.ActualWidth / 2 - silo.Width / 2);
+ else
+ silo.SetValue(Canvas.LeftProperty, left);
+
+ if (top == -1)
+ silo.SetValue(Canvas.TopProperty, cvMain.ActualHeight / 2 - silo.Height / 2);
+ else
+ silo.SetValue(Canvas.TopProperty, top);
+
+ silo.AllowDrop = true;
+ cvMain.Children.Add(silo);
+ silos.Add(silo);
+ silo.PreviewMouseLeftButtonDown += Silo_PreviewMouseLeftButtonDown;
+ silo.PreviewMouseMove += Silo_PreviewMouseMove;
+ silo.PreviewMouseLeftButtonUp += Silo_PreviewMouseLeftButtonUp;
+
+ CurrentSilo = silo;
+ }
+
+ private void newLine(double x1, double y1, double x2, double y2)
+ {
+ var temp = new Line();
+ temp.Stroke = Brushes.Green;
+ temp.StrokeThickness = 1;
+ temp.X1 = x1;
+ temp.Y1 = y1;
+ temp.X2 = x2;
+ temp.Y2 = y2;
+ cvMain.Children.Add(temp);
+ lines.Add(temp);
+
+ currentLine = temp;
+ }
+
+ private void CvMain_PreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
+ {
+ lineIsDraw = false;
+ Tips = "常规模式";
+ }
+
+ private void CvMain_PreviewMouseMove(object sender, MouseEventArgs e)
+ {
+ if (e.LeftButton == MouseButtonState.Pressed && lineIsDraw)
+ {
+ Point point = e.GetPosition(cvMain);
+ currentLine.X2 = point.X;
+ currentLine.Y2 = point.Y;
+ }
+ }
+
+ private void CvMain_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
+ {
+ if (!lineIsDraw)
+ return;
+ var point = e.GetPosition(cvMain);
+ newLine(point.X, point.Y, point.X, point.Y);
+
+ }
+
+
+
+ private void Silo_PreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
+ {
+ var c = sender as UIElement;
+ siloIsMouseDown = false;
+ c.ReleaseMouseCapture();
+ CurrentSilo = sender as Silo;
+ }
+
+ private void Silo_PreviewMouseMove(object sender, MouseEventArgs e)
+ {
+ if (siloIsMouseDown)
+ {
+ var c = sender as UIElement;
+ var pos = e.GetPosition(this);
+ c.SetValue(Canvas.LeftProperty, pos.X);
+ c.SetValue(Canvas.TopProperty, pos.Y);
+ }
+ }
+
+ private void Silo_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
+ {
+ var c = sender as UIElement;
+ siloIsMouseDown = true;
+ var transform = c.RenderTransform as TranslateTransform;
+ if (transform == null)
+ {
+ transform = new TranslateTransform();
+ c.RenderTransform = transform;
+ }
+ c.CaptureMouse();
+ }
+
+
+ }
+}
diff --git a/WPFDemo/WPFDemo.csproj b/WPFDemo/WPFDemo.csproj
new file mode 100644
index 00000000..e28acaaa
--- /dev/null
+++ b/WPFDemo/WPFDemo.csproj
@@ -0,0 +1,24 @@
+
+
+
+ WinExe
+ net6.0-windows
+ enable
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+ Always
+
+
+
+
diff --git a/WPFDemo/device.png b/WPFDemo/device.png
new file mode 100644
index 0000000000000000000000000000000000000000..4c2ea7ff2eec5b74bfaee45300a1b04e658ae14a
GIT binary patch
literal 2655
zcmeHJZ8*~l8{hsmwrRADa14JL=7>VE#IZRJ+e3y@PK|^@)>m*vyi)OPp-kNfDzCRzH=X`yh5BL4M?w8+n-`D-&cin|ikzrWO
zHy9WUhGo!0VhpJG%TUG!-xw#UG5|a?CM*~xc|;tA!7w(A5ZZcPf~In9{l0CM{OVoc
z+Px~Okj_9Fl_AP{VkVD*<%fj}=~u*rnh0C9-v&M06|*D#Y>=38k2-&Eth;EG
zIua=g#!B)~K=sSw+cOo}n)c}qwKlcOZZNxXN|LHM+O;~jx_RccBOJ{RPpoE>K!FBL
zK9+hEkp+suDtmm?;$ArVE@~EoAKv~n7)4eD8}BUl0{){g!b9;p^m_AGvv^eM05Mec
zz3PxhelIq>CFc(dVTEy?T`PvNeX_AF1{lEeY+D^>SLu>m>LO^5kQ|t&f(^Yq;i{u>
zU3C%0g^OsBK!+)-^7_`yejIf=y}Pb0G^pkD?^?ti2cx*y4E(tvDXHYbxX1
zDL2JhNR#0%r2=yZjD6JK)_0+wXgy{pYS^L|0CyC6iVV1XqFHnP)|qiQ)eKiJ|>F
zzZgNK&;w|52|~WC2-*#~L32>qZ`y&_>G3IfC^E-{($r$j_0pw*j~1heAQz{j!@6Zq
zbo*``?S+TBcX|mB8Q;DG5sWQ?XowfT+zW@hyobfN+z&&fXTQJY_aU%*5Sj{vOUj^c
zfNZ#OU(AkOPX}zLPZb{nH9l{1eI>fbcd}B)nQM|+o`OnLo=KXLvcD)pkfq@aJ1wP;
z{CtT`BCF6mw5$G{d?OBQEYOkMNg2Uc`dP-S4tWL7>iV&rbD
z$o`JxAxR8g*!wWPiZ49lP=iguM~Nb&?>w1Q+Wq1_V{bH>?h>DQ&Q%P)4NEh+fUqEy
zO4=R}qC^u;Hv|y?<}^e3@~xq14)=oU0!QAf&CpIDENbUbJHb-EFy+ar>>L0SbMUaQ
zh(V=!k6x4oz>#i2!M2M3kNsai^0idN>biL{JJAo%yOp`F1<>avO;0ULXlzHO9SI;s
zo#G4Em!H>Hp5Y54jt?aDqsa7|g>A1GXtJWV)nmioEst%Y-Tra+lgUJ{e@^#2JYG`1
z)XHa@Etc@yr$y#YpCzu~ngEzLqmFRoC!&aYl7AKS;)Hq}<_njl^xd*?68|^hHFsni
zy0yKzy4PseK6xt(Sc9XO@tO&bA3}D4UM0D;61aBM4PcqgH~Gll;-42n+o0wCxOmf-
z0|WwY1W;YCS_&CKv6Wt)=b%W0)3FtLKI|*v
z_G8&rw7
zb1EnI(9nTJxDl3WRD0Z*p12=)5AO}RZ-%Sw&!~3WV&}#_iEvrUb?B1}9x193Rv-e9
zL|g+$gxG_=ZJvkaId9rt4>oEoq29~3DgS>qNJzefZVLt4+m^i&vjrD~|VA@YUUkvz9NZ
z)u=;M`h(I{&yMvpI|`=L`^^PPUsmVirbRR}3yzY((IveJ&E!T`P-Q4y>L32y(xwYS
zV*P<9M*_UoM@
zwySgZj8ETm036tJYU#EE^vrdp-YHje-Fzo1FKWlV$D9*0r!Ik$qK%@Q*6fY3B2LO>
z1X)40o-8HPzZ+&Yh`~wjxTFCbRD`0VMA0kWxkiifAEF5a02j5kKEC3Oh*I+eRp
zY42W3{(ZB_g`=Oyv6d+oCkGjM$k9+=Cf~r1HxP#6Z%RRpl|3`=%bTH8namF?g4rYKn-6xfDKE@~g$pg^;H>E6^&9?OHN2IgzP4e0>i8DEi
z1+R>@T)A6&3Dn?N*|Ea0gdi7gV4wYO8{gHF>4)_0s(J4-gK17WlJ3+FvSCq5OLynZ
zjHQE2&qm+cH~O8-5RURYX%(|$^M1)Pdh+vwJgw<3oy_qi_1fWl#8>!j>F11~`3)2G
zo^-|sj?@f}yyD}Y?QaA}UVuxT)r+G<{>^*pd<K1LYh
LhsY2~aH8-}X;Yg*
literal 0
HcmV?d00001