Commit 2892c5ce 顾剑亮

coding

0 个父辈
正在显示 111 个修改的文件 包含 7541 行增加0 行删除
此文件类型无法预览
{
"CurrentProjectSetting": null
}
\ No newline at end of file
{
"ExpandedNodes": [
""
],
"PreviewInSolutionExplorer": false
}
\ No newline at end of file
此文件类型无法预览

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.30104.148
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AGVControl-ProductionLine", "AGVControl-ProductionLine\AGVControl-ProductionLine.csproj", "{E1C3207D-C67D-4B46-A9DB-D182F2074CCB}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AgvClient", "AgvClient\AgvClient.csproj", "{D9154766-67B0-4082-AF8B-DCC7C4CFB5A2}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AgvClientTest", "AgvClientTest\AgvClientTest.csproj", "{E1C0827A-FA12-49A9-AC71-6D3E6518754A}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{E1C3207D-C67D-4B46-A9DB-D182F2074CCB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E1C3207D-C67D-4B46-A9DB-D182F2074CCB}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E1C3207D-C67D-4B46-A9DB-D182F2074CCB}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E1C3207D-C67D-4B46-A9DB-D182F2074CCB}.Release|Any CPU.Build.0 = Release|Any CPU
{D9154766-67B0-4082-AF8B-DCC7C4CFB5A2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D9154766-67B0-4082-AF8B-DCC7C4CFB5A2}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D9154766-67B0-4082-AF8B-DCC7C4CFB5A2}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D9154766-67B0-4082-AF8B-DCC7C4CFB5A2}.Release|Any CPU.Build.0 = Release|Any CPU
{E1C0827A-FA12-49A9-AC71-6D3E6518754A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E1C0827A-FA12-49A9-AC71-6D3E6518754A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E1C0827A-FA12-49A9-AC71-6D3E6518754A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E1C0827A-FA12-49A9-AC71-6D3E6518754A}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {6958A655-C82F-4C09-951F-24E629575E89}
EndGlobalSection
EndGlobal
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{E1C3207D-C67D-4B46-A9DB-D182F2074CCB}</ProjectGuid>
<OutputType>WinExe</OutputType>
<RootNamespace>AGVControl</RootNamespace>
<AssemblyName>AGVControl-ProductionLine</AssemblyName>
<TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
<Deterministic>true</Deterministic>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup>
<ApplicationIcon>line.ico</ApplicationIcon>
</PropertyGroup>
<ItemGroup>
<Reference Include="log4net, Version=2.0.8.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\..\DLL\log4net.dll</HintPath>
</Reference>
<Reference Include="RestSharp, Version=106.11.4.0, Culture=neutral, PublicKeyToken=598062e77f915f75, processorArchitecture=MSIL">
<HintPath>..\packages\RestSharp.106.11.4\lib\net452\RestSharp.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Configuration" />
<Reference Include="System.Core" />
<Reference Include="System.Runtime.Serialization" />
<Reference Include="System.ServiceModel" />
<Reference Include="System.ServiceModel.Activation" />
<Reference Include="System.ServiceModel.Web" />
<Reference Include="System.Web" />
<Reference Include="System.Web.Extensions" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Deployment" />
<Reference Include="System.Drawing" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="BLL\AgvServer.cs" />
<Compile Include="BLL\Common.cs" />
<Compile Include="BLL\Control.cs" />
<Compile Include="FrmMain.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="FrmMain.Designer.cs">
<DependentUpon>FrmMain.cs</DependentUpon>
</Compile>
<Compile Include="BLL\MiR_API.cs" />
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="BLL\WebService.cs" />
<EmbeddedResource Include="FrmMain.resx">
<DependentUpon>FrmMain.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
<SubType>Designer</SubType>
</EmbeddedResource>
<Compile Include="Properties\Resources.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Resources.resx</DependentUpon>
<DesignTime>True</DesignTime>
</Compile>
<None Include="packages.config" />
<None Include="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
</None>
<Compile Include="Properties\Settings.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Settings.settings</DependentUpon>
<DesignTimeSharedInput>True</DesignTimeSharedInput>
</Compile>
</ItemGroup>
<ItemGroup>
<None Include="App.config" />
</ItemGroup>
<ItemGroup>
<Content Include="line.ico" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
</configSections>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
</startup>
<log4net>
<appender name="AgvServer" type="log4net.Appender.RollingFileAppender">
<file value="logs/AgvServer.log"/>
<param name="Encoding" value="UTF-8"/>
<appendToFile value="true"/>
<rollingStyle value="Date"/>
<datePattern value="yyyy-MM-dd"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="[%date][%t]%-5p %m%n"/>
</layout>
</appender>
<root>
<level value="Debug"/>
<appender-ref ref="AgvServer"/>
</root>
</log4net>
<appSettings>
<add key="ITS" value="http://10.85.17.233/ESMTCommonInterface/CommonService.asmx/VMIGetBoxDestInfo?boxRFID=" />
<add key="WebService" value="http://127.0.0.1/Webservice/AGVService/"/>
<add key="FLEET" value="10.85.199.3"/>
<!--<add key="LocalIP" value="192.168.103.12"/>
<add key="AutoCharge" value="false"/>
<add key="ChargeWait" value="1"/>
<add key="ChargeThreshold" value="20,70"/>-->
<add key="MiR_R1763" value="false"/>
<add key="MiR_R1764" value="false"/>
<add key="MiR_R1767" value="false"/>
<add key="MiR_R1768" value="false"/>
<add key="A5" value="false"/>
<add key="A6" value="false"/>
<add key="E1" value="false"/>
<add key="E2" value="false"/>
<add key="E3" value="false"/>
<add key="E4" value="false"/>
<add key="E5" value="false"/>
<add key="E6" value="false"/>
<add key="E8" value="false"/>
<add key="E9" value="false"/>
<add key="E10" value="false"/>
<add key="E11" value="false"/>
<add key="E12" value="false"/>
<add key="E14" value="false"/>
<add key="E15" value="false"/>
<add key="E16" value="false"/>
<add key="E21" value="false"/>
<add key="E22" value="false"/>
</appSettings>
</configuration>
\ No newline at end of file
using AGVControl;
using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Threading;
namespace BLL
{
/// <summary>
/// AGV服务端
/// </summary>
public class AgvServer
{
private bool _loop;
private Socket _server; //服务端
private List<Client> _client; //所有客户端
private Thread tListenClient; //监听客户端连接
private const int PORT = 12001; //端口
/// <summary>
/// 节点改变事件
/// </summary>
/// <param name="nodeIndex"></param>
public delegate void NodeChangedEvent(int nodeIndex);
/// <summary>
/// 节点改变
/// </summary>
public event NodeChangedEvent NodeChanged;
/// <summary>
/// 节点在线
/// </summary>
public event NodeChangedEvent NodeOnline;
/// <summary>
/// AGV服务端
/// </summary>
public AgvServer()
{
}
/// <summary>
/// 开启服务
/// </summary>
public void Start()
{
try
{
IPEndPoint localEP = new IPEndPoint(IPAddress.Any, PORT);
_server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
_server.Bind(localEP);
_server.Listen(100);
Common.log.Info("Server Start");
_loop = true;
_client = new List<Client>();
tListenClient = new Thread(new ThreadStart(ListenClient));
tListenClient.Start();
}
catch (Exception ex)
{
Common.log.Error("Start()", ex);
}
}
/// <summary>
/// 停止服务
/// </summary>
public void Stop()
{
_loop = false;
for (int i = 0; i < _client.Count; i++)
{
_client[i].Loop = false;
_client[i].IsConn = false;
_client[i].Socket.Close();
}
_server.Close();
_client = null;
Thread.Sleep(50);
Common.log.Info("Server Stop");
}
public bool ReadyEnter(string nodeName, string rfid = "")
{
int idx = FindClient(nodeName);
if (idx == -1)
{
Common.log.Info("ReadyEnter 没有找到" + nodeName);
return false;
}
else
{
ClientNode node = new ClientNode(nodeName, rfid, ClientAction.ReadyEnter);
byte[] buff = Encode(node);
return Send(idx, buff);
}
}
public bool ReadyLeave(string nodeName, string rfid = "")
{
int idx = FindClient(nodeName);
if (idx == -1)
{
Common.log.Info("ReadyLeave 没有找到" + nodeName);
return false;
}
else
{
ClientNode node = new ClientNode(nodeName, rfid, ClientAction.ReadyLeave);
byte[] buff = Encode(node);
return Send(idx, buff);
}
}
/// <summary>
/// 监听客户端
/// </summary>
private void ListenClient()
{
while (_loop)
{
try
{
Socket socket = _server.Accept(); //这边会暂停,不需要sleep
IPEndPoint ep = (IPEndPoint)socket.RemoteEndPoint;
Thread listen = new Thread(new ParameterizedThreadStart(ListenNet));
//string ip = ep.Address.ToString();
//if (ip == System.Configuration.ConfigurationManager.AppSettings["LocalIP"])
// ip += ":" + ep.Port;
//新的客户端
Client client = new Client
{
IP = ep.Address.ToString() + ":" + ep.Port,
Loop = true,
IsConn = true,
Socket = socket,
ListenNet = listen,
nodeName = new List<string>(),
};
//重连后关闭旧连接
//int idx = _client.FindIndex(s => s.IP.Equals(ip));
//if (idx > -1)
//{
// _client[idx].IsConn = false;
// _client[idx].nodeName.Clear();
// _client[idx].Loop = false;
// _client[idx].Socket.Close();
// _client.RemoveAt(idx);
//}
_client.Add(client);
listen.Start(_client.Count - 1);
Common.log.Info(string.Format("[{0}] 已连接", client.IP));
}
catch (SocketException)
{
//关闭连接,退出阻塞Accept
Common.log.Info("服务端关闭连接,退出阻塞Accept");
}
catch (Exception ex)
{
Common.log.Error("ListenClient()", ex);
}
}
}
/// <summary>
/// 客户端数据接收
/// </summary>
/// <param name="obj">索引</param>
private void ListenNet(object obj)
{
int sleep = 50;
Client client = _client[(int)obj];
byte[] temp = new byte[200];
int time = 0;
while (client.Loop)
{
Thread.Sleep(sleep);
try
{
if (!client.Loop) break;
if (client.Socket.Available > 0)
{
time = 0;
int count = client.Socket.Receive(temp);
byte[] buff = new byte[count];
Array.Copy(temp, 0, buff, 0, count);
ClientNode node = Decode(buff);
if (node == null)
{
Common.log.Info("解码失败:" + HexBuff(buff));
}
else
{
Common.log.Debug("Receive[" + client.IP + "] " + node.ToText());
int idx = client.nodeName.FindIndex(s => s == node.Name);
if (idx == -1) client.nodeName.Add(node.Name);
UpdateNode(node);
}
}
else
{
time += sleep;
if (time > 5000)
{
Offline(client);
Common.log.Info("[" + client.IP + "] 超过5s没有收到数据,关闭连接");
}
}
}
catch (Exception ex)
{
Common.log.Error("ListenNet()", ex);
}
}
}
/// <summary>
/// 编码
/// </summary>
/// <param name="node"></param>
/// <returns></returns>
private byte[] Encode(ClientNode node)
{
int idx = 0;
byte[] buff = new byte[12];
buff[idx++] = 0xAD;
buff[idx++] = (byte)node.Name[0];
buff[idx++] = Convert.ToByte(node.Name.Substring(1));
buff[idx++] = (byte)node.RFID[0];
buff[idx++] = Convert.ToByte(node.RFID.Substring(1));
buff[idx++] = (byte)node.Action;
buff[idx++] = (byte)node.Level;
idx += 4; //预留
buff[idx] = 0xDA;
return buff;
}
/// <summary>
/// 解码
/// </summary>
/// <param name="buff"></param>
/// <returns></returns>
private ClientNode Decode(byte[] buff)
{
int idx = 0;
if (buff[idx++] != 0xAD) return null;
string name = (char)buff[idx] + buff[idx + 1].ToString();
idx += 2;
string rfid = (char)buff[idx] + buff[idx + 1].ToString();
idx += 2;
ClientAction action = (ClientAction)buff[idx++];
ClientLevel level = (ClientLevel)buff[idx++];
idx += 4; //预留
if (buff[idx] != 0xDA) return null;
ClientNode node = new ClientNode(name, rfid, action, level);
return node;
}
private void UpdateNode(ClientNode node)
{
int idx = Common.nodeInfo.FindIndex(s => s.Name == node.Name);
if (idx == -1)
{
Common.log.Info("UpdateNode " + node.Name + " 不存在");
return;
}
if (!Common.nodeInfo[idx].Online)
{
Common.nodeInfo[idx].Online = true;
NodeOnline?.Invoke(idx);
}
if (Common.nodeInfo[idx].Action != node.Action ||
Common.nodeInfo[idx].Level != node.Level ||
Common.nodeInfo[idx].RFID != node.RFID)
{
Common.nodeInfo[idx].Action = node.Action;
Common.nodeInfo[idx].Level = node.Level;
Common.nodeInfo[idx].RFID = node.RFID;
Common.log.Info(node.Name + "更新 " + node.ToText());
NodeChanged?.Invoke(idx);
}
}
private void Offline(Client client)
{
client.Loop = false;
client.IsConn = false;
client.Socket.Close();
for (int i = 0; i < client.nodeName.Count; i++)
{
int idx = Common.nodeInfo.FindIndex(s => s.Name == client.nodeName[i]);
if (idx == -1) continue;
Common.nodeInfo[idx].Offline();
NodeChanged(idx);
NodeOnline(idx);
}
client.nodeName.Clear();
_client.Remove(client);
}
/// <summary>
/// 16进制
/// </summary>
/// <param name="buff"></param>
/// <returns></returns>
private string HexBuff(byte[] buff)
{
string s = "";
if (buff == null) return s;
for (int i = 0; i < buff.Length; i++)
s += buff[i].ToString("X2") + " ";
return s;
}
/// <summary>
/// 查找客户端
/// </summary>
/// <param name="name">节点名称</param>
/// <returns></returns>
private int FindClient(string name)
{
int index = -1;
for (int i = 0; i < _client.Count; i++)
{
if (_client[i].IsConn)
{
int idx = _client[i].nodeName.FindIndex(a => a == name);
if (idx != -1)
{
index = i;
break;
}
}
}
return index;
}
/// <summary>
/// 发送命令
/// </summary>
/// <param name="idx"></param>
/// <param name="buff"></param>
/// <returns></returns>
private bool Send(int idx, byte[] buff)
{
string ip = "[" + _client[idx].IP + "]";
if (!_client[idx].IsConn)
{
Common.log.Info(ip + " 没有连接");
return false;
}
try
{
_client[idx].Socket.Send(buff);
Common.log.Debug("SendTo" + ip + ": " + HexBuff(buff));
return true;
}
catch (Exception ex)
{
Common.log.Error("Send" + ip, ex);
return false;
}
}
}
}
\ No newline at end of file
using System;
using System.Collections.Generic;
using System.Net.Sockets;
using System.Runtime.InteropServices;
using System.Threading;
namespace AGVControl
{
/// <summary>
/// 公共参数
/// </summary>
public static class Common
{
/// <summary>
/// 节点信息
/// </summary>
public static List<ClientNode> nodeInfo;
/// <summary>
/// 小车信息
/// </summary>
public static List<Agv_Info> agvInfo;
public static List<string> linePlace;
public static BLL.AgvServer server;
public static BLL.Control control;
public static BLL.MiR_API mir;
public static BLL.WebService web;
public static string itsHttp;
public static log4net.ILog log;
public static Dictionary<string, string> agvMission;
public static Dictionary<string, string> agvProductionLine;
public static System.Configuration.Configuration appConfig;
public static readonly string CONFIG_PATH = AppDomain.CurrentDomain.BaseDirectory + "Config\\";
}
public static class API
{
[DllImport("user32.dll", EntryPoint = "ShowWindow", CharSet = CharSet.Auto)]
public static extern int ShowWindow(IntPtr hwnd, int nCmdShow);
[DllImport("user32.dll ", SetLastError = true)]
public static extern void SwitchToThisWindow(IntPtr hWnd, bool fAltTab);
public const int SW_RESTORE = 9;
}
/// <summary>
/// 客户端
/// </summary>
public class Client
{
/// <summary>
/// 循环
/// </summary>
public bool Loop;
/// <summary>
/// IP地址
/// </summary>
public string IP;
/// <summary>
/// 是否连接
/// </summary>
public bool IsConn;
/// <summary>
/// 节点名称
/// </summary>
public List<string> nodeName;
/// <summary>
/// 套接字
/// </summary>
public Socket Socket;
/// <summary>
/// 接收数据线程
/// </summary>
public Thread ListenNet;
}
/// <summary>
/// 客户端的节点
/// </summary>
public class ClientNode
{
private string rfid = "00";
/// <summary>
/// 节点名称
/// </summary>
public string Name { set; get; }
/// <summary>
/// RFID
/// </summary>
public string RFID
{
set
{
if (value.Length < 2)
rfid = value.PadLeft(2, '0');
else
rfid = value;
}
get
{
return rfid;
}
}
/// <summary>
/// 动作
/// </summary>
public ClientAction Action { set; get; }
/// <summary>
/// 优先级
/// </summary>
public ClientLevel Level { set; get; }
/// <summary>
/// 小车名称
/// </summary>
public string AgvName { set; get; }
/// <summary>
/// 在线
/// </summary>
public bool Online { set; get; }
/// <summary>
/// 是否可用
/// </summary>
public bool IsUse { set; get; }
/// <summary>
/// 客户端节点
/// </summary>
/// <param name="name"></param>
/// <param name="isUse"></param>
public ClientNode(string name, bool isUse)
{
Name = name;
RFID = rfid;
Action = ClientAction.None;
Level = ClientLevel.Low;
AgvName = "";
Online = false;
IsUse = isUse;
}
/// <summary>
/// 客户端节点
/// </summary>
/// <param name="name"></param>
/// <param name="rfid"></param>
/// <param name="action"></param>
/// <param name="level"></param>
public ClientNode(string name, string rfid = "", ClientAction action = ClientAction.None, ClientLevel level = ClientLevel.Low)
{
Name = name;
RFID = rfid;
Action = action;
Level = level;
AgvName = "";
Online = false;
IsUse = false;
}
/// <summary>
/// 所有属性的文本形式
/// </summary>
/// <returns></returns>
public string ToText()
{
string s = string.Format("Name={0}, Action={1}, Level={2}, RFID={3}", Name, Action, Level, RFID);
return s;
}
public string[] ToRow()
{
//节点,动作,优先级,RFID,AGV名称,在线,调用,清除AGV
string[] s = new string[8];
s[0] = Name;
if (Online)
{
s[1] = Action.ToString();
s[2] = Level.ToString();
s[3] = RFID;
s[4] = AgvName;
}
s[5] = Online.ToString();
s[6] = IsUse.ToString();
s[7] = "Clear";
return s;
}
/// <summary>
/// 脱机
/// </summary>
public void Offline()
{
RFID = "00";
Action = ClientAction.None;
Level = ClientLevel.Low;
AgvName = "";
Online = false;
}
}
public class Agv_Info
{
/// <summary>
/// 小车名称
/// </summary>
public string Name { private set; get; }
/// <summary>
/// 小车在FLEET中的ID号
/// </summary>
public string ID { private set; get; }
/// <summary>
/// IP地址
/// </summary>
public string IP { private set; get; }
/// <summary>
/// 授权码
/// </summary>
public string Authorization { private set; get; }
/// <summary>
/// 当前架子的RFID
/// </summary>
public string RFID { set; get; }
/// <summary>
/// 是否在线
/// </summary>
public bool IsCon { set; get; }
/// <summary>
/// 是否可用
/// </summary>
public bool IsUse { set; get; }
/// <summary>
/// 地点
/// </summary>
public string Place { private set; get; }
/// <summary>
/// 地点的状态
/// </summary>
public PlaceState PlaceState { private set; get; }
/// <summary>
/// 小车的状态ID,(从小车获取)
/// </summary>
public int StateID { private set; get; }
/// <summary>
/// 小车的状态,(从小车获取)
/// </summary>
public string StateText { private set; get; }
/// <summary>
/// 电量百分比,(从小车获取)
/// </summary>
public int Battery { private set; get; }
/// <summary>
/// 当前任务文本,(从小车获取)
/// </summary>
public string MissionText { private set; get; }
/// <summary>
/// 下一个地点
/// </summary>
public string NextPlace { set; get; }
/// <summary>
/// 关门,用于执行一次
/// </summary>
//public bool CloseDoor { set; get; }
/// <summary>
/// 任务发送
/// </summary>
public string TaskSend { set; get; }
/// <summary>
/// 闲置等待时间,用于充电
/// </summary>
//public int WaitTime { set; get; }
/// <summary>
/// 临时待机位,用于执行一次
/// </summary>
//public bool StandbyTemp { set; get; }
public Agv_Info(string id, string name, string ip, string authorization, bool isUse)
{
ID = id;
Name = name;
IP = ip;
Authorization = authorization;
RFID = "";
IsCon = false;
IsUse = isUse;
Place = "";
}
public void SetState(int stateID, string stateText, int battery, string missionText)
{
StateID = stateID;
StateText = stateText;
Battery = battery;
MissionText = missionText;
}
public void GetPlace(int value)
{
if (value < 1000)
{
Place = "";
PlaceState = PlaceState.None;
}
else
{
int a = value / 1000;
int b = (value - a * 1000) / 10;
int c = value - a * 1000 - b * 10;
Place = (char)(64 + a) + b.ToString();
PlaceState = (PlaceState)c;
}
}
public string[] ToRow()
{
//AGV名称,IP,AGV状态,任务状态,地点,后续任务,在线,电量,调用,清除缓存
string[] s = new string[10];
s[0] = Name;
s[1] = IP;
if (IsCon)
{
s[2] = StateText;
s[3] = MissionText;
s[4] = Place;
s[5] = NextPlace;
}
s[6] = IsCon.ToString();
s[7] = Battery + "%";
s[8] = IsUse.ToString();
s[9] = "Clear";
return s;
}
}
/// <summary>
/// 客户端的动作
/// </summary>
public enum ClientAction : byte
{
/// <summary>
/// 没有动作
/// </summary>
None = 0,
/// <summary>
/// 需要7寸D料架
/// </summary>
NeedD = 1,
/// <summary>
/// 需要大尺寸C料架
/// </summary>
NeedC = 2,
/// <summary>
/// 需要进入料架
/// </summary>
NeedEnter = 3,
/// <summary>
/// 需要出去料架
/// </summary>
NeedLeave = 4,
/// <summary>
/// 需要进入离开料架
/// </summary>
NeedEnterLeave = 5,
/// <summary>
/// 准备进入,服务器发送
/// </summary>
ReadyEnter = 6,
/// <summary>
/// 可以进入料架
/// </summary>
MayEnter = 7,
/// <summary>
/// 完成进入料架
/// </summary>
FinishEnter = 8,
/// <summary>
/// 准备离开,服务器发送
/// </summary>
ReadyLeave = 9,
/// <summary>
/// 可以出去料架
/// </summary>
MayLeave = 10,
/// <summary>
/// 完成出去料架
/// </summary>
FinishLeave = 11,
}
/// <summary>
/// 客户端的优先级
/// </summary>
public enum ClientLevel : byte
{
/// <summary>
/// 低
/// </summary>
Low = 0,
/// <summary>
/// 中等
/// </summary>
Middle = 1,
/// <summary>
/// 高
/// </summary>
High = 2
}
/// <summary>
/// 地点状态
/// </summary>
public enum PlaceState
{
/// <summary>
/// 没有任务
/// </summary>
None = 0,
/// <summary>
/// 小车移动任务
/// </summary>
Move = 1,
/// <summary>
/// 小车移动任务完成
/// </summary>
MoveFinish = 2,
/// <summary>
/// 小车Enter任务
/// </summary>
Enter = 3,
/// <summary>
/// 小车Enter任务完成
/// </summary>
EnterFinish = 4,
/// <summary>
/// 小车Leave任务
/// </summary>
Leave = 5,
/// <summary>
/// 小车Leave任务完成
/// </summary>
LeaveFinish = 6,
/// <summary>
/// 出错
/// </summary>
Error = 9
}
}
\ No newline at end of file
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Web.Script.Serialization;
using AGVControl;
using RestSharp;
namespace BLL
{
public class Control
{
private bool loop;
//private int areaC_Index;
private Thread tAgvCall;
private Thread tAgvState;
//public List<string> Marks;
private const int REG_STATUS = 20;
//private List<string> shelfLockedNodeNames;
public delegate void AgvChangedEvent(int agvIndex);
public event AgvChangedEvent AgvChanged;
public event AgvChangedEvent AgvOnline;
public Control()
{
}
public void Start()
{
loop = true;
tAgvState = new Thread(new ThreadStart(AgvState));
tAgvCall = new Thread(new ThreadStart(AgvCall));
tAgvState.Start();
tAgvCall.Start();
}
public void Stop()
{
loop = false;
}
private void AgvState()
{
bool rtn;
while (loop)
{
Thread.Sleep(1000);
for (int i = 0; i < Common.agvInfo.Count; i++)
{
if (!CheckOnline(i)) continue;
if (!loop) break;
//获取AGV状态
rtn = Common.mir.Get_State(Common.agvInfo[i], out int stateID, out string stateText, out int battery, out string mission_text);
Common.log.Info(string.Format("{0} Get_State StateID={1}, StateText={2}, Battery={3}, Mission_text={4}", Common.agvInfo[i].Name, stateID, stateText, battery, mission_text));
if (rtn) Common.agvInfo[i].SetState(stateID, stateText, battery, mission_text);
//获取地点任务状态
Thread.Sleep(50);
rtn = Common.mir.Get_Register(Common.agvInfo[i], REG_STATUS, out int regValue);
Common.log.Info(string.Format("{0} Get_Register PLC{1}={2}", Common.agvInfo[i].Name, REG_STATUS, regValue));
if (rtn) Common.agvInfo[i].GetPlace(regValue);
//执行任务更新状态
if (stateID == 5)
{
AgvChanged?.Invoke(i);
}
//获取任务队列
//rtn = Common.mir.Get_Mission_Queue(Common.agvInfo[i], out List<string> mission);
//if (rtn)
//{
// string[] arr = new string[mission.Count];
// for (int j = 0; j < mission.Count; j++)
// arr[j] = Common.agvMission.FirstOrDefault(q => q.Value == mission[j]).Key;
// string missionKey = string.Join(",", arr);
// if (Common.agvInfo[i].MissionQueue != missionKey)
// {
// Common.agvInfo[i].MissionQueue = missionKey;
// AgvChanged?.Invoke(i);
// }
//}
}
}
}
private void AgvCall()
{
while (loop)
{
Thread.Sleep(1000);
for (int i = 0; i < Common.agvInfo.Count; i++)
{
if (!loop) break;
if (!Common.agvInfo[i].IsCon) continue; //AGV网络连接
if (!Common.agvInfo[i].IsUse) continue; //AGV是否可用
//Ready,Pause,Executing
if (Common.agvInfo[i].StateID != 3 && Common.agvInfo[i].StateID != 4 && Common.agvInfo[i].StateID != 5)
{
Common.log.Info(string.Format("{0}不能调用 StateID={1}, StateText={2}", Common.agvInfo[i].Name, Common.agvInfo[i].StateID, Common.agvInfo[i].StateText));
continue;
}
switch (Common.agvInfo[i].PlaceState)
{
case PlaceState.None:
StateNone(i);
break;
case PlaceState.Move:
StateMove(i);
break;
case PlaceState.MoveFinish:
StateMoveFinish(i);
break;
case PlaceState.Enter:
StateEnter(i);
break;
case PlaceState.EnterFinish:
StateEnterFinish(i);
break;
case PlaceState.Leave:
StateLeave(i);
break;
case PlaceState.LeaveFinish:
StateLeaveFinish(i);
break;
case PlaceState.Error:
StateError(i);
break;
}
}
}
}
private bool CheckOnline(int idx)
{
bool rtn = Common.mir.CheckIP(Common.agvInfo[idx].IP);
if (rtn)
{
if (!Common.agvInfo[idx].IsCon)
{
Common.agvInfo[idx].IsCon = true;
Common.log.Info(Common.agvInfo[idx].Name + " Online");
AgvOnline?.Invoke(idx);
AgvChanged?.Invoke(idx);
}
}
else
{
if (Common.agvInfo[idx].IsCon)
{
Common.agvInfo[idx].IsCon = false;
Common.log.Info(Common.agvInfo[idx].Name + " Offline");
AgvOnline?.Invoke(idx);
AgvChanged?.Invoke(idx);
}
}
return rtn;
}
private void StateNone(int idx)
{
bool rtn;
int index;
Agv_Info agv = Common.agvInfo[idx];
if (agv.TaskSend != "") return;
//出满料
rtn = FindA6Leave(out string nextNode);
if (rtn)
{
rtn = Common.mir.Add_Mission(agv, Common.agvMission["MoveA6"]);
if (rtn)
{
agv.NextPlace = nextNode;
index = FindNode("A6");
Common.nodeInfo[index].AgvName = Common.agvInfo[idx].Name;
index = FindNode(nextNode);
Common.nodeInfo[index].AgvName = Common.agvInfo[idx].Name;
}
agv.TaskSend = rtn ? "MoveA6" : "";
return;
}
//出空料架
for (int i = 0; i < Common.linePlace.Count; i++)
{
string name = Common.linePlace[i];
index = Common.nodeInfo.FindIndex(s => s.Name.Equals(name) && s.Action == ClientAction.NeedLeave && s.IsUse);
if (index > -1)
{
rtn = Common.mir.Add_Mission(agv, Common.agvMission["Move" + name]);
if (rtn)
{
Common.nodeInfo[index].AgvName = Common.agvInfo[idx].Name;
Common.linePlace.RemoveAt(i);
}
agv.TaskSend = rtn ? "Move" + name : "";
}
if (rtn) break;
}
}
private void StateMove(int idx)
{
}
private void StateMoveFinish(int idx)
{
bool rtn;
Agv_Info agv = Common.agvInfo[idx];
int index = FindNode(agv.Place);
if (index == -1) return;
ClientNode node = Common.nodeInfo[index];
switch (agv.Place)
{
case "A5":
if (node.Action == ClientAction.MayEnter)
{
if (agv.TaskSend == "Leave") return;
rtn = Common.mir.Add_Mission(agv, Common.agvMission["Leave"]);
agv.TaskSend = rtn ? "Leave" : "";
}
else
{
rtn = Common.server.ReadyEnter(agv.Place);
if (!rtn) return;
}
break;
case "A6":
if (node.Action == ClientAction.MayEnter)
{
if (agv.TaskSend == "Leave") return;
rtn = Common.mir.Add_Mission(agv, Common.agvMission["Leave"]);
agv.TaskSend = rtn ? "Leave" : "";
}
else if (node.Action == ClientAction.MayLeave)
{
if (agv.TaskSend == "Leave") return;
rtn = Common.mir.Add_Mission(agv, Common.agvMission["Leave"]);
agv.TaskSend = rtn ? "Leave" : "";
}
else if (node.Action == ClientAction.NeedEnter)
{
rtn = Common.server.ReadyEnter(agv.Place);
if (!rtn) return;
}
else if (node.Action == ClientAction.NeedLeave)
{
rtn = Common.server.ReadyLeave(agv.Place);
if (!rtn) return;
}
else if (node.Action == ClientAction.NeedEnterLeave)
{
//rtn = Common.server.ReadyLeave(agv.Place);
//if (!rtn) return;
}
break;
case "E1":
case "E2":
case "E3":
case "E4":
case "E5":
case "E6":
case "E7":
case "E8":
case "E9":
case "E10":
case "E11":
case "E12":
if (node.Action == ClientAction.MayEnter)
{
if (agv.TaskSend == "Leave") return;
rtn = Common.mir.Add_Mission(agv, Common.agvMission["Leave"]);
agv.TaskSend = rtn ? "Leave" : "";
}
else if (node.Action == ClientAction.MayLeave)
{
if (agv.TaskSend == "Leave") return;
rtn = Common.mir.Add_Mission(agv, Common.agvMission["Leave"]);
agv.TaskSend = rtn ? "Leave" : "";
}
else if (node.Action == ClientAction.NeedEnter)
{
rtn = Common.server.ReadyEnter(agv.Place);
if (!rtn) return;
}
else if (node.Action == ClientAction.NeedLeave)
{
rtn = Common.server.ReadyLeave(agv.Place);
if (!rtn) return;
}
break;
}
}
private void StateEnter(int idx)
{
}
private void StateEnterFinish(int idx)
{
bool rtn;
Agv_Info agv = Common.agvInfo[idx];
int index = FindNode(agv.Place);
if (index == -1) return;
ClientNode node = Common.nodeInfo[index];
switch (agv.Place)
{
case "A6":
if (node.Action == ClientAction.FinishLeave)
{
}
break;
}
}
private void StateLeave(int idx)
{
}
private void StateLeaveFinish(int idx)
{
bool rtn;
Agv_Info agv = Common.agvInfo[idx];
int index = FindNode(agv.Place);
if (index == -1) return;
ClientNode node = Common.nodeInfo[index];
switch (agv.Place)
{
case "A5":
if (node.Action == ClientAction.FinishEnter)
{
}
break;
case "A6":
if (node.Action == ClientAction.FinishEnter)
{
}
break;
}
}
private void StateError(int idx)
{
}
private int FindNode(string nodeName)
{
int idx = Common.nodeInfo.FindIndex(s => s.Name.Equals(nodeName) && s.IsUse);
return idx;
}
private bool FindA6Leave(out string nextNode)
{
nextNode = "";
int idx = Common.nodeInfo.FindIndex(s => s.Name.Equals("A6") && (s.Action == ClientAction.NeedLeave || s.Action == ClientAction.NeedEnterLeave) && s.IsUse);
if (idx == -1) return false;
bool rtn = FindA6Destination(Common.nodeInfo[idx].RFID, out string dest);
if (!rtn) return false;
idx = Common.nodeInfo.FindIndex(s => s.Name.Equals(dest) && s.Action == ClientAction.NeedEnter && s.IsUse);
if (idx == -1)
{
return false;
}
else
{
nextNode = dest;
return true;
}
}
private bool FindA6Destination(string rfid, out string dest)
{
dest = "";
try
{
string url = Common.itsHttp + rfid;
var client = new RestClient(url) { Timeout = -1 };
var request = new RestRequest(Method.GET);
//request.AddHeader("Host", "10.85.17.233");
IRestResponse response = client.Execute(request);
string json = response.Content;
json = json.Replace("\r", "");
json = json.Replace("\n", "");
json = json.Replace(" ", "");
Common.log.Info("URL: " + url + "\r\nReturn: " + json);
if (string.IsNullOrWhiteSpace(json)) return false;
JavaScriptSerializer serializer = new JavaScriptSerializer();
Dictionary<string, object> dic = (Dictionary<string, object>)serializer.DeserializeObject(json);
if (dic == null) return false;
bool b1 = dic.TryGetValue("id", out object id);
bool b2 = dic.TryGetValue("location", out object location);
if (b1 && b2)
{
if (id.ToString() == rfid)
{
if (Common.agvProductionLine.TryGetValue(location.ToString(), out string loc))
{
dest = loc;
return true;
}
}
}
return false;
}
catch (Exception ex)
{
Common.log.Error("FindA6Destination", ex);
return false;
}
}
}
}
\ No newline at end of file
using System;
using System.Collections.Generic;
using System.Web.Script.Serialization;
using AGVControl;
using RestSharp;
namespace BLL
{
public class MiR_API
{
private const int httpTimeout = 5000;
public MiR_API()
{
}
/// <summary>
/// 获取IO模块guid列表
/// </summary>
/// <param name="info"></param>
/// <param name="guid"></param>
/// <returns></returns>
//public bool Get_IO_Modules(AGVControl.Agv_Info info, out string[] guid)
//{
// try
// {
// guid = null;
// string url = "http://" + info.IP + "/api/v2.0.0/status?whitelist=state_id,state_text";
// string json = HttpGet(url, info.IP, info.Authorization);
// //log.OutInfo("URL: " + url+"\n"+"Return: " + json);
// if (string.IsNullOrWhiteSpace(json)) return false;
// JavaScriptSerializer serializer = new JavaScriptSerializer();
// object[] obj = (object[])serializer.DeserializeObject(json);
// if (obj == null) return false;
// guid = new string[obj.Length];
// for (int i = 0; i < obj.Length; i++)
// {
// Dictionary<string, object> dic = (Dictionary<string, object>)obj[i];
// guid[i] = dic["guid"].ToString();
// }
// return true;
// }
// catch (Exception ex)
// {
// guid = null;
// Common.log.Error("Get_IO_Modules", ex);
// return false;
// }
//}
/// <summary>
/// 获取IO模块的状态
/// </summary>
/// <param name="info"></param>
/// <param name="input"></param>
/// <param name="output"></param>
/// <returns></returns>
//public bool Get_IO_Status(Agv_Info info, out bool[] input, out bool[] output)
//{
// try
// {
// input = null;
// output = null;
// string url = "http://" + info.IP + "/api/v2.0.0/io_modules/" + info.IOID + "/status";
// string json = HttpGet(url, info.IP, info.Authorization);
// //log.OutInfo("URL: " + url + "\n" + "Return: " + json);
// if (string.IsNullOrWhiteSpace(json)) return false;
// JavaScriptSerializer serializer = new JavaScriptSerializer();
// Dictionary<string, object> dic = (Dictionary<string, object>)serializer.DeserializeObject(json);
// if (dic == null) return false;
// object[] objInput = (object[])dic["input_state"];
// input = new bool[objInput.Length];
// for (int i = 0; i < input.Length; i++)
// input[i] = Convert.ToBoolean(objInput[i]);
// object[] objOutput = (object[])dic["output_state"];
// output = new bool[objOutput.Length];
// for (int i = 0; i < output.Length; i++)
// output[i] = Convert.ToBoolean(objOutput[i]);
// return true;
// }
// catch (Exception ex)
// {
// input = null;
// output = null;
// //Common.log.Error("", ex);
// return false;
// }
//}
/// <summary>
/// 获取PLC寄存器的内容
/// </summary>
/// <param name="info"></param>
/// <param name="reg"></param>
/// <param name="regValue"></param>
/// <returns></returns>
public bool Get_Register(Agv_Info info, int reg, out int regValue)
{
try
{
regValue = -1;
string url = "http://" + info.IP + "/api/v2.0.0/registers/" + reg + "?whitelist=value";
string json = HttpGet(url, info.IP, info.Authorization);
if (string.IsNullOrWhiteSpace(json)) return false;
JavaScriptSerializer serializer = new JavaScriptSerializer();
Dictionary<string, object> dic = (Dictionary<string, object>)serializer.DeserializeObject(json);
if (dic == null) return false;
string s = dic["value"].ToString();
float f = Convert.ToSingle(s);
regValue = Convert.ToInt32(f);
return true;
}
catch (Exception ex)
{
regValue = -1;
Common.log.Error("Get_Register", ex);
return false;
}
}
/// <summary>
/// 设置PLC寄存器的内容
/// </summary>
/// <param name="info"></param>
/// <param name="reg"></param>
/// <param name="regValue"></param>
/// <returns></returns>
public bool Set_Register(Agv_Info info, int reg, int regValue)
{
try
{
string url = "http://" + info.IP + "/api/v2.0.0/registers/" + reg;
string body = "{\"value\": " + regValue + "}";
string json = HttpPost(url, info.IP, info.Authorization, body);
if (string.IsNullOrWhiteSpace(json)) return false;
JavaScriptSerializer serializer = new JavaScriptSerializer();
Dictionary<string, object> dic = (Dictionary<string, object>)serializer.DeserializeObject(json);
if (dic == null) return false;
string s = dic["value"].ToString();
float f = Convert.ToSingle(s);
if (regValue == Convert.ToInt32(f))
return true;
else
return false;
}
catch (Exception ex)
{
Common.log.Error("Set_Register", ex);
return false;
}
}
/// <summary>
/// 添加任务到任务队列
/// </summary>
/// <param name="info"></param>
/// <param name="mission_id"></param>
/// <returns></returns>
public bool Add_Mission(Agv_Info info, string mission_id)
{
try
{
//防止上一个任务已执行但返回失败时,删除任务
Del_Mission(info);
string url = "http://" + info.IP + "/api/v2.0.0/mission_queue";
string body = "{\"mission_id\":\"" + mission_id + "\"}";
string json = HttpPost(url, info.IP, info.Authorization, body);
if (string.IsNullOrWhiteSpace(json)) return false;
JavaScriptSerializer serializer = new JavaScriptSerializer();
Dictionary<string, object> dic = (Dictionary<string, object>)serializer.DeserializeObject(json);
if (dic == null) return false;
string s = dic["mission_id"].ToString();
if (s == mission_id)
return true;
else
return false;
}
catch (Exception ex)
{
Common.log.Error("Add_Mission", ex);
return false;
}
}
/// <summary>
/// 添加任务到任务队列
/// </summary>
/// <param name="info"></param>
/// <param name="mission_id"></param>
/// <returns></returns>
public bool Add_Mission_Fleet(Agv_Info info, string mission_id)
{
try
{
//防止上一个任务已执行但返回失败时,删除任务
Del_Mission(info);
string ip = Common.appConfig.AppSettings.Settings["FLEET"].Value;
string url = "http://" + ip + "/api/v2.0.0/mission_scheduler";
string body = "{\"mission_id\":\"" + mission_id + "\",\"robot_id\":" + info.ID + "}";
string json = HttpPost(url, info.IP, info.Authorization, body);
if (string.IsNullOrWhiteSpace(json)) return false;
JavaScriptSerializer serializer = new JavaScriptSerializer();
Dictionary<string, object> dic = (Dictionary<string, object>)serializer.DeserializeObject(json);
if (dic == null) return false;
string s = dic["mission_id"].ToString();
if (s == mission_id)
return true;
else
return false;
}
catch (Exception ex)
{
Common.log.Error("Add_Mission_Fleet", ex);
return false;
}
}
/// <summary>
/// 获取所有任务列表
/// </summary>
/// <param name="info"></param>
/// <param name="mission">任务(名称,guid)</param>
/// <returns></returns>
public bool Get_Mission(Agv_Info info, out Dictionary<string, string> mission)
{
mission = null;
try
{
string url = "http://" + info.IP + "/api/v2.0.0/missions/search?whitelist=guid,name";
string body = "{\"filters\" :[]}";
string json = HttpPost(url, info.IP, info.Authorization, body);
if (string.IsNullOrWhiteSpace(json)) return false;
JavaScriptSerializer serializer = new JavaScriptSerializer();
object[] obj = (object[])serializer.DeserializeObject(json);
if (obj == null) return false;
mission = new Dictionary<string, string>();
for (int i = 0; i < obj.Length; i++)
{
Dictionary<string, object> dic = (Dictionary<string, object>)obj[i];
mission.Add(dic["name"].ToString(), dic["guid"].ToString());
}
return true;
}
catch (Exception ex)
{
Common.log.Error("Get_Mission", ex);
return false;
}
}
/// <summary>
/// 获取当前任务队列guid
/// </summary>
/// <param name="info"></param>
/// <param name="mission"></param>
/// <returns></returns>
public bool Get_Mission_Queue(Agv_Info info, out List<string> mission)
{
mission = null;
try
{
string url = "http://" + info.IP + "/api/v2.0.0/mission_queue/search";
string body = "{\"filters\" : [{\"fieldname\": \"state\", \"operator\": \"IN\", \"value\": [\"Pending\", \"Executing\"]}]}";
string json = HttpPost(url, info.IP, info.Authorization, body);
if (string.IsNullOrWhiteSpace(json)) return false;
JavaScriptSerializer serializer = new JavaScriptSerializer();
object[] obj = (object[])serializer.DeserializeObject(json);
if (obj == null) return false;
mission = new List<string>();
Dictionary<string, object> dic;
for (int i = 0; i < obj.Length; i++)
{
dic = (Dictionary<string, object>)obj[i];
mission.Add(dic["id"].ToString());
}
for (int i = 0; i < mission.Count; i++)
{
url = "http://" + info.IP + "/api/v2.0.0/mission_queue/" + mission[i];
json = HttpGet(url, info.IP, info.Authorization);
serializer = new JavaScriptSerializer();
dic = (Dictionary<string, object>)serializer.DeserializeObject(json);
mission[i] = dic["mission_id"].ToString();
}
return true;
}
catch (Exception ex)
{
Common.log.Error("Get_Mission_Queue", ex);
return false;
}
}
/// <summary>
/// 删除当前所有任务
/// </summary>
/// <param name="info"></param>
public void Del_Mission(Agv_Info info)
{
try
{
string url = "http://" + info.IP + "/api/v2.0.0/mission_queue";
HttpDel(url, info.IP, info.Authorization);
}
catch (Exception ex)
{
Common.log.Error("Del_Mission", ex);
}
}
/// <summary>
/// 获取当前小车状态
/// </summary>
/// <param name="info"></param>
/// <param name="stateID"></param>
/// <param name="stateText"></param>
/// <param name="battery"></param>
/// <param name="mission_text"></param>
/// <returns></returns>
public bool Get_State(Agv_Info info, out int stateID, out string stateText, out int battery, out string mission_text)
{
stateID = -1;
stateText = "";
battery = 0;
mission_text = "";
try
{
string url = "http://" + info.IP + "/api/v2.0.0/status?whitelist=state_id,state_text,battery_percentage,mission_text";
string json = HttpGet(url, info.IP, info.Authorization);
if (string.IsNullOrWhiteSpace(json)) return false;
JavaScriptSerializer serializer = new JavaScriptSerializer();
Dictionary<string, object> dic = (Dictionary<string, object>)serializer.DeserializeObject(json);
if (dic == null) return false;
stateID = Convert.ToInt32(dic["state_id"].ToString());
stateText = dic["state_text"].ToString();
mission_text = dic["mission_text"].ToString();
string s = dic["battery_percentage"].ToString();
float f = Convert.ToSingle(s);
battery = Convert.ToInt32(f);
return true;
}
catch (Exception ex)
{
Common.log.Error("Get_State", ex);
return false;
}
}
/// <summary>
/// 小车状态改为Ready
/// </summary>
/// <param name="info"></param>
/// <returns></returns>
public bool State_Ready(Agv_Info info)
{
try
{
string url = "http://" + info.IP + "/api/v2.0.0/status?whitelist=state_id,state_text";
string body = "{\"state_id\": 3}";
string json = HttpPut(url, info.IP, info.Authorization, body);
if (string.IsNullOrWhiteSpace(json)) return false;
JavaScriptSerializer serializer = new JavaScriptSerializer();
Dictionary<string, object> dic = (Dictionary<string, object>)serializer.DeserializeObject(json);
if (dic == null) return false;
string s = dic["state_id"].ToString();
if (s == "3")
return true;
else
return false;
}
catch (Exception ex)
{
Common.log.Error("State_Ready", ex);
return false;
}
}
/// <summary>
/// 小车状态改为Pause
/// </summary>
/// <param name="info"></param>
/// <returns></returns>
public bool State_Pause(Agv_Info info)
{
try
{
string url = "http://" + info.IP + "/api/v2.0.0/status?whitelist=state_id,state_text";
string body = "{\"state_id\": 4}";
string json = HttpPut(url, info.IP, info.Authorization, body);
if (string.IsNullOrWhiteSpace(json)) return false;
JavaScriptSerializer serializer = new JavaScriptSerializer();
Dictionary<string, object> dic = (Dictionary<string, object>)serializer.DeserializeObject(json);
if (dic == null) return false;
string s = dic["state_id"].ToString();
if (s == "4")
return true;
else
return false;
}
catch (Exception ex)
{
Common.log.Error("State_Pause", ex);
return false;
}
}
/// <summary>
/// 清除错误
/// </summary>
/// <param name="info"></param>
/// <returns></returns>
public bool Clear_Error(Agv_Info info)
{
try
{
string url = "http://" + info.IP + "/api/v2.0.0/status";
string body = "{\"clear_error\": true}";
string json = HttpPut(url, info.IP, info.Authorization, body);
if (string.IsNullOrWhiteSpace(json)) return false;
return true;
}
catch (Exception ex)
{
Common.log.Error("Clear_Error", ex);
return false;
}
}
/// <summary>
/// 检查IP地址
/// </summary>
/// <param name="ip"></param>
/// <returns></returns>
public bool CheckIP(string ip)
{
//IP合法
string pattern = @"^((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)$";
bool rtn = System.Text.RegularExpressions.Regex.IsMatch(ip, pattern);
if (!rtn)
{
Common.log.Info("非法的IP地址" + ip);
return false;
}
//Ping服务端
try
{
System.Net.NetworkInformation.Ping ping = new System.Net.NetworkInformation.Ping();
System.Net.NetworkInformation.PingReply result = ping.Send(ip, 2000);
ping.Dispose();
if (result.Status != System.Net.NetworkInformation.IPStatus.Success)
{
Common.log.Info("Ping " + ip + " 请求没有响应");
return false;
}
return true;
}
catch (Exception ex)
{
Common.log.Error("CheckIP", ex);
return false;
}
}
private string HttpGet(string url, string ip, string authorization)
{
RestClient client = new RestClient(url) { Timeout = httpTimeout };
RestRequest request = new RestRequest(Method.GET);
request.AddHeader("Host", ip);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Accept-Language", "zh_CN");
request.AddHeader("Authorization", authorization);
IRestResponse response = client.Execute(request);
string s = response.Content;
s = s.Replace("\n", "");
s = s.Replace(" ", "");
Common.log.Debug("HttpGet URL: " + url + "\r\nReturn: " + s);
return s;
}
private string HttpPost(string url, string ip, string authorization, string body)
{
var client = new RestClient(url) { Timeout = httpTimeout };
var request = new RestRequest(Method.POST);
request.AddHeader("Host", ip);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Accept-Language", "zh_CN");
request.AddHeader("Authorization", authorization);
request.AddParameter("application/json", body, ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
string s = response.Content;
s = s.Replace("\n", "");
s = s.Replace(" ", "");
Common.log.Debug(string.Format("HttpPost URL: {0}; Body: {1}\r\nReturn: {2}", url, body, s));
return s;
}
private string HttpPut(string url, string ip, string authorization, string body)
{
RestClient client = new RestClient(url) { Timeout = httpTimeout };
RestRequest request = new RestRequest(Method.PUT);
request.AddHeader("Host", ip);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Accept-Language", "zh_CN");
request.AddHeader("Authorization", authorization);
request.AddParameter("application/json", body, ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
string s = response.Content;
s = s.Replace("\n", "");
s = s.Replace(" ", "");
Common.log.Debug(string.Format("HttpPut URL: {0}; Body: {1}\r\nReturn: {2}", url, body, s));
return s;
}
private void HttpDel(string url, string ip, string authorization)
{
RestClient client = new RestClient(url) { Timeout = httpTimeout };
RestRequest request = new RestRequest(Method.DELETE);
request.AddHeader("Host", ip);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Authorization", authorization);
request.AddHeader("Accept-Language", "zh_CN");
request.AddParameter("application/json", "", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
string s = response.Content;
Common.log.Debug("HttpDel URL: " + url);
}
}
}
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Runtime.Serialization;
using System.ServiceModel.Activation;
using System;
namespace BLL
{
[ServiceContract(Name = "Services")]
internal interface IWebService
{
[OperationContract]
[WebGet(UriTemplate = "CreateEmptyRecycleTask?emptyStation={line}", BodyStyle = WebMessageBodyStyle.Bare, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
Result CreateEmptyRecycleTask(string line);
}
[DataContract]
internal class Result
{
[DataMember]
public string Succeed { get; set; }
[DataMember]
public string ResultData { get; set; }
[DataMember]
public string ErrorMessage { get; set; }
}
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Single, IncludeExceptionDetailInFaults = true)]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
internal class ClsWebService : IWebService
{
internal ClsWebService()
{
}
public Result CreateEmptyRecycleTask(string line)
{
AGVControl.Common.log.Info("WebService Request emptyStation=" + line);
Result res;
if (AGVControl.Common.agvProductionLine.TryGetValue(line, out string value))
{
res = new Result() { Succeed = "true", ResultData = "", ErrorMessage = "" };
AGVControl.Common.log.Info("WebService Response OK");
//加到任务
AGVControl.Common.linePlace.Add(value);
}
else
{
res = new Result() { Succeed = "false", ResultData = "", ErrorMessage = "Not find " + line };
AGVControl.Common.log.Info("WebService Response false");
}
return res;
}
}
public class WebService
{
private WebServiceHost _serviceHost;
public void Open(string url)
{
try
{
ClsWebService service = new ClsWebService();
_serviceHost = new WebServiceHost(service, new Uri(url));
_serviceHost.Open();
AGVControl.Common.log.Info("Web服务已开启");
}
catch (Exception ex)
{
AGVControl.Common.log.Error("Open", ex);
}
}
public void Close()
{
try
{
_serviceHost.Close();
AGVControl.Common.log.Info("Web服务已关闭");
}
catch (Exception ex)
{
AGVControl.Common.log.Error("Close", ex);
}
}
}
}
namespace AGVControl
{
partial class FrmMain
{
/// <summary>
/// 必需的设计器变量。
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// 清理所有正在使用的资源。
/// </summary>
/// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows 窗体设计器生成的代码
/// <summary>
/// 设计器支持所需的方法 - 不要修改
/// 使用代码编辑器修改此方法的内容。
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmMain));
this.DgvAgv = new System.Windows.Forms.DataGridView();
this.Column1 = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.Column2 = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.Column3 = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.Column14 = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.Column18 = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.Column4 = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.Column13 = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.Column19 = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.Column11 = new System.Windows.Forms.DataGridViewButtonColumn();
this.Column17 = new System.Windows.Forms.DataGridViewButtonColumn();
this.tabControl1 = new System.Windows.Forms.TabControl();
this.tabPage1 = new System.Windows.Forms.TabPage();
this.DgvNode = new System.Windows.Forms.DataGridView();
this.Column6 = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.Column7 = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.Column12 = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.Column9 = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.Column10 = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.Column5 = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.Column16 = new System.Windows.Forms.DataGridViewButtonColumn();
this.Column15 = new System.Windows.Forms.DataGridViewButtonColumn();
this.tabPage3 = new System.Windows.Forms.TabPage();
this.BtnAddPlace = new System.Windows.Forms.Button();
this.TxtPlace = new System.Windows.Forms.TextBox();
this.CloseDoor = new System.Windows.Forms.Button();
this.BtnReady = new System.Windows.Forms.Button();
this.BtnArrive = new System.Windows.Forms.Button();
this.BtnClearError = new System.Windows.Forms.Button();
this.label2 = new System.Windows.Forms.Label();
this.label1 = new System.Windows.Forms.Label();
this.BtnWriteCharge2 = new System.Windows.Forms.Button();
this.BtnReadCharge2 = new System.Windows.Forms.Button();
this.TxtCharge2 = new System.Windows.Forms.TextBox();
this.BtnWriteCharge1 = new System.Windows.Forms.Button();
this.BtnReadCharge1 = new System.Windows.Forms.Button();
this.TxtCharge1 = new System.Windows.Forms.TextBox();
this.ChkAutoCharge = new System.Windows.Forms.CheckBox();
this.BtnMissionAdd = new System.Windows.Forms.Button();
this.BtnMissionPause = new System.Windows.Forms.Button();
this.BtnMissionReady = new System.Windows.Forms.Button();
this.LstAgvPlace = new System.Windows.Forms.ListBox();
this.tabPage2 = new System.Windows.Forms.TabPage();
this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();
this.TxtLog = new System.Windows.Forms.TextBox();
this.dgvMission = new System.Windows.Forms.DataGridView();
this.Column20 = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.Column21 = new System.Windows.Forms.DataGridViewTextBoxColumn();
((System.ComponentModel.ISupportInitialize)(this.DgvAgv)).BeginInit();
this.tabControl1.SuspendLayout();
this.tabPage1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.DgvNode)).BeginInit();
this.tabPage3.SuspendLayout();
this.tabPage2.SuspendLayout();
this.tableLayoutPanel1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.dgvMission)).BeginInit();
this.SuspendLayout();
//
// DgvAgv
//
this.DgvAgv.AllowUserToAddRows = false;
this.DgvAgv.AllowUserToDeleteRows = false;
this.DgvAgv.AllowUserToResizeColumns = false;
this.DgvAgv.AllowUserToResizeRows = false;
this.DgvAgv.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.DgvAgv.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
this.DgvAgv.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
this.Column1,
this.Column2,
this.Column3,
this.Column14,
this.Column18,
this.Column4,
this.Column13,
this.Column19,
this.Column11,
this.Column17});
this.DgvAgv.Location = new System.Drawing.Point(12, 12);
this.DgvAgv.Name = "DgvAgv";
this.DgvAgv.ReadOnly = true;
this.DgvAgv.RowHeadersWidth = 51;
this.DgvAgv.RowTemplate.Height = 23;
this.DgvAgv.Size = new System.Drawing.Size(932, 126);
this.DgvAgv.TabIndex = 3;
this.DgvAgv.CellClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.DgvAgv_CellClick);
//
// Column1
//
this.Column1.HeaderText = "AGV名称";
this.Column1.MinimumWidth = 6;
this.Column1.Name = "Column1";
this.Column1.ReadOnly = true;
this.Column1.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable;
this.Column1.Width = 80;
//
// Column2
//
this.Column2.HeaderText = "IP";
this.Column2.MinimumWidth = 6;
this.Column2.Name = "Column2";
this.Column2.ReadOnly = true;
this.Column2.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable;
this.Column2.Width = 125;
//
// Column3
//
this.Column3.HeaderText = "AGV状态";
this.Column3.MinimumWidth = 6;
this.Column3.Name = "Column3";
this.Column3.ReadOnly = true;
this.Column3.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable;
this.Column3.Width = 125;
//
// Column14
//
this.Column14.HeaderText = "任务状态";
this.Column14.MinimumWidth = 6;
this.Column14.Name = "Column14";
this.Column14.ReadOnly = true;
this.Column14.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable;
this.Column14.Width = 120;
//
// Column18
//
this.Column18.HeaderText = "目标地点";
this.Column18.MinimumWidth = 6;
this.Column18.Name = "Column18";
this.Column18.ReadOnly = true;
this.Column18.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable;
this.Column18.Width = 80;
//
// Column4
//
this.Column4.HeaderText = "后续任务";
this.Column4.MinimumWidth = 6;
this.Column4.Name = "Column4";
this.Column4.ReadOnly = true;
this.Column4.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable;
this.Column4.Width = 80;
//
// Column13
//
this.Column13.HeaderText = "在线";
this.Column13.MinimumWidth = 6;
this.Column13.Name = "Column13";
this.Column13.ReadOnly = true;
this.Column13.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable;
this.Column13.Width = 60;
//
// Column19
//
this.Column19.HeaderText = "电量";
this.Column19.MinimumWidth = 6;
this.Column19.Name = "Column19";
this.Column19.ReadOnly = true;
this.Column19.Width = 60;
//
// Column11
//
this.Column11.HeaderText = "调用";
this.Column11.MinimumWidth = 6;
this.Column11.Name = "Column11";
this.Column11.ReadOnly = true;
this.Column11.Width = 60;
//
// Column17
//
this.Column17.HeaderText = "清除缓存";
this.Column17.MinimumWidth = 6;
this.Column17.Name = "Column17";
this.Column17.ReadOnly = true;
this.Column17.Width = 80;
//
// tabControl1
//
this.tabControl1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.tabControl1.Controls.Add(this.tabPage1);
this.tabControl1.Controls.Add(this.tabPage3);
this.tabControl1.Controls.Add(this.tabPage2);
this.tabControl1.Location = new System.Drawing.Point(12, 144);
this.tabControl1.Name = "tabControl1";
this.tabControl1.SelectedIndex = 0;
this.tabControl1.Size = new System.Drawing.Size(932, 547);
this.tabControl1.TabIndex = 6;
//
// tabPage1
//
this.tabPage1.Controls.Add(this.DgvNode);
this.tabPage1.Location = new System.Drawing.Point(4, 22);
this.tabPage1.Name = "tabPage1";
this.tabPage1.Padding = new System.Windows.Forms.Padding(3);
this.tabPage1.Size = new System.Drawing.Size(924, 521);
this.tabPage1.TabIndex = 0;
this.tabPage1.Text = "节点";
this.tabPage1.UseVisualStyleBackColor = true;
//
// DgvNode
//
this.DgvNode.AllowUserToAddRows = false;
this.DgvNode.AllowUserToDeleteRows = false;
this.DgvNode.AllowUserToResizeColumns = false;
this.DgvNode.AllowUserToResizeRows = false;
this.DgvNode.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.DgvNode.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
this.DgvNode.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
this.Column6,
this.Column7,
this.Column12,
this.Column9,
this.Column10,
this.Column5,
this.Column16,
this.Column15});
this.DgvNode.Location = new System.Drawing.Point(6, 6);
this.DgvNode.Name = "DgvNode";
this.DgvNode.ReadOnly = true;
this.DgvNode.RowHeadersWidth = 50;
this.DgvNode.RowTemplate.Height = 23;
this.DgvNode.Size = new System.Drawing.Size(912, 509);
this.DgvNode.TabIndex = 1;
this.DgvNode.CellClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.DgvNode_CellClick);
//
// Column6
//
this.Column6.HeaderText = "地点";
this.Column6.MinimumWidth = 6;
this.Column6.Name = "Column6";
this.Column6.ReadOnly = true;
this.Column6.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable;
this.Column6.Width = 70;
//
// Column7
//
this.Column7.HeaderText = "动作";
this.Column7.MinimumWidth = 6;
this.Column7.Name = "Column7";
this.Column7.ReadOnly = true;
this.Column7.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable;
this.Column7.Width = 125;
//
// Column12
//
this.Column12.HeaderText = "优先级";
this.Column12.MinimumWidth = 6;
this.Column12.Name = "Column12";
this.Column12.ReadOnly = true;
this.Column12.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable;
this.Column12.Width = 125;
//
// Column9
//
this.Column9.HeaderText = "RFID";
this.Column9.MinimumWidth = 6;
this.Column9.Name = "Column9";
this.Column9.ReadOnly = true;
this.Column9.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable;
this.Column9.Width = 125;
//
// Column10
//
this.Column10.HeaderText = "AGV名称";
this.Column10.MinimumWidth = 6;
this.Column10.Name = "Column10";
this.Column10.ReadOnly = true;
this.Column10.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable;
this.Column10.Width = 125;
//
// Column5
//
this.Column5.HeaderText = "在线";
this.Column5.MinimumWidth = 6;
this.Column5.Name = "Column5";
this.Column5.ReadOnly = true;
this.Column5.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable;
this.Column5.Width = 60;
//
// Column16
//
this.Column16.HeaderText = "调用";
this.Column16.MinimumWidth = 6;
this.Column16.Name = "Column16";
this.Column16.ReadOnly = true;
this.Column16.Width = 60;
//
// Column15
//
this.Column15.HeaderText = "清除AGV";
this.Column15.MinimumWidth = 6;
this.Column15.Name = "Column15";
this.Column15.ReadOnly = true;
this.Column15.Width = 80;
//
// tabPage3
//
this.tabPage3.Controls.Add(this.BtnAddPlace);
this.tabPage3.Controls.Add(this.TxtPlace);
this.tabPage3.Controls.Add(this.CloseDoor);
this.tabPage3.Controls.Add(this.BtnReady);
this.tabPage3.Controls.Add(this.BtnArrive);
this.tabPage3.Controls.Add(this.BtnClearError);
this.tabPage3.Controls.Add(this.label2);
this.tabPage3.Controls.Add(this.label1);
this.tabPage3.Controls.Add(this.BtnWriteCharge2);
this.tabPage3.Controls.Add(this.BtnReadCharge2);
this.tabPage3.Controls.Add(this.TxtCharge2);
this.tabPage3.Controls.Add(this.BtnWriteCharge1);
this.tabPage3.Controls.Add(this.BtnReadCharge1);
this.tabPage3.Controls.Add(this.TxtCharge1);
this.tabPage3.Controls.Add(this.ChkAutoCharge);
this.tabPage3.Controls.Add(this.BtnMissionAdd);
this.tabPage3.Controls.Add(this.BtnMissionPause);
this.tabPage3.Controls.Add(this.BtnMissionReady);
this.tabPage3.Controls.Add(this.LstAgvPlace);
this.tabPage3.Location = new System.Drawing.Point(4, 22);
this.tabPage3.Name = "tabPage3";
this.tabPage3.Padding = new System.Windows.Forms.Padding(3);
this.tabPage3.Size = new System.Drawing.Size(924, 521);
this.tabPage3.TabIndex = 2;
this.tabPage3.Text = "任务";
this.tabPage3.UseVisualStyleBackColor = true;
//
// BtnAddPlace
//
this.BtnAddPlace.Location = new System.Drawing.Point(390, 445);
this.BtnAddPlace.Name = "BtnAddPlace";
this.BtnAddPlace.Size = new System.Drawing.Size(96, 30);
this.BtnAddPlace.TabIndex = 25;
this.BtnAddPlace.Text = "目标地点";
this.BtnAddPlace.UseVisualStyleBackColor = true;
//
// TxtPlace
//
this.TxtPlace.Location = new System.Drawing.Point(390, 418);
this.TxtPlace.Name = "TxtPlace";
this.TxtPlace.Size = new System.Drawing.Size(96, 21);
this.TxtPlace.TabIndex = 24;
//
// CloseDoor
//
this.CloseDoor.Location = new System.Drawing.Point(390, 382);
this.CloseDoor.Name = "CloseDoor";
this.CloseDoor.Size = new System.Drawing.Size(96, 30);
this.CloseDoor.TabIndex = 22;
this.CloseDoor.Text = "CloseDoor";
this.CloseDoor.UseVisualStyleBackColor = true;
//
// BtnReady
//
this.BtnReady.Location = new System.Drawing.Point(390, 346);
this.BtnReady.Name = "BtnReady";
this.BtnReady.Size = new System.Drawing.Size(96, 30);
this.BtnReady.TabIndex = 21;
this.BtnReady.Text = "Ready";
this.BtnReady.UseVisualStyleBackColor = true;
//
// BtnArrive
//
this.BtnArrive.Location = new System.Drawing.Point(390, 310);
this.BtnArrive.Name = "BtnArrive";
this.BtnArrive.Size = new System.Drawing.Size(96, 30);
this.BtnArrive.TabIndex = 20;
this.BtnArrive.Text = "Arrive";
this.BtnArrive.UseVisualStyleBackColor = true;
//
// BtnClearError
//
this.BtnClearError.Location = new System.Drawing.Point(162, 114);
this.BtnClearError.Name = "BtnClearError";
this.BtnClearError.Size = new System.Drawing.Size(96, 30);
this.BtnClearError.TabIndex = 19;
this.BtnClearError.Text = "清除错误";
this.BtnClearError.UseVisualStyleBackColor = true;
this.BtnClearError.Click += new System.EventHandler(this.BtnClearError_Click);
//
// label2
//
this.label2.AutoSize = true;
this.label2.Location = new System.Drawing.Point(592, 120);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(47, 12);
this.label2.TabIndex = 18;
this.label2.Text = "充电桩2";
//
// label1
//
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(490, 120);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(47, 12);
this.label1.TabIndex = 17;
this.label1.Text = "充电桩1";
//
// BtnWriteCharge2
//
this.BtnWriteCharge2.Location = new System.Drawing.Point(589, 198);
this.BtnWriteCharge2.Name = "BtnWriteCharge2";
this.BtnWriteCharge2.Size = new System.Drawing.Size(96, 30);
this.BtnWriteCharge2.TabIndex = 16;
this.BtnWriteCharge2.Text = "写";
this.BtnWriteCharge2.UseVisualStyleBackColor = true;
//
// BtnReadCharge2
//
this.BtnReadCharge2.Location = new System.Drawing.Point(589, 162);
this.BtnReadCharge2.Name = "BtnReadCharge2";
this.BtnReadCharge2.Size = new System.Drawing.Size(96, 30);
this.BtnReadCharge2.TabIndex = 15;
this.BtnReadCharge2.Text = "读";
this.BtnReadCharge2.UseVisualStyleBackColor = true;
//
// TxtCharge2
//
this.TxtCharge2.Location = new System.Drawing.Point(589, 135);
this.TxtCharge2.Name = "TxtCharge2";
this.TxtCharge2.Size = new System.Drawing.Size(96, 21);
this.TxtCharge2.TabIndex = 14;
//
// BtnWriteCharge1
//
this.BtnWriteCharge1.Location = new System.Drawing.Point(487, 198);
this.BtnWriteCharge1.Name = "BtnWriteCharge1";
this.BtnWriteCharge1.Size = new System.Drawing.Size(96, 30);
this.BtnWriteCharge1.TabIndex = 13;
this.BtnWriteCharge1.Text = "写";
this.BtnWriteCharge1.UseVisualStyleBackColor = true;
//
// BtnReadCharge1
//
this.BtnReadCharge1.Location = new System.Drawing.Point(487, 162);
this.BtnReadCharge1.Name = "BtnReadCharge1";
this.BtnReadCharge1.Size = new System.Drawing.Size(96, 30);
this.BtnReadCharge1.TabIndex = 12;
this.BtnReadCharge1.Text = "读";
this.BtnReadCharge1.UseVisualStyleBackColor = true;
//
// TxtCharge1
//
this.TxtCharge1.Location = new System.Drawing.Point(487, 135);
this.TxtCharge1.Name = "TxtCharge1";
this.TxtCharge1.Size = new System.Drawing.Size(96, 21);
this.TxtCharge1.TabIndex = 11;
//
// ChkAutoCharge
//
this.ChkAutoCharge.AutoSize = true;
this.ChkAutoCharge.Location = new System.Drawing.Point(385, 135);
this.ChkAutoCharge.Name = "ChkAutoCharge";
this.ChkAutoCharge.Size = new System.Drawing.Size(72, 16);
this.ChkAutoCharge.TabIndex = 10;
this.ChkAutoCharge.Text = "自动充电";
this.ChkAutoCharge.UseVisualStyleBackColor = true;
//
// BtnMissionAdd
//
this.BtnMissionAdd.Location = new System.Drawing.Point(162, 78);
this.BtnMissionAdd.Name = "BtnMissionAdd";
this.BtnMissionAdd.Size = new System.Drawing.Size(96, 30);
this.BtnMissionAdd.TabIndex = 3;
this.BtnMissionAdd.Text = "添加任务";
this.BtnMissionAdd.UseVisualStyleBackColor = true;
this.BtnMissionAdd.Click += new System.EventHandler(this.BtnMissionAdd_Click);
//
// BtnMissionPause
//
this.BtnMissionPause.Location = new System.Drawing.Point(162, 42);
this.BtnMissionPause.Name = "BtnMissionPause";
this.BtnMissionPause.Size = new System.Drawing.Size(96, 30);
this.BtnMissionPause.TabIndex = 2;
this.BtnMissionPause.Text = "暂停";
this.BtnMissionPause.UseVisualStyleBackColor = true;
this.BtnMissionPause.Click += new System.EventHandler(this.BtnMissionPause_Click);
//
// BtnMissionReady
//
this.BtnMissionReady.Location = new System.Drawing.Point(162, 6);
this.BtnMissionReady.Name = "BtnMissionReady";
this.BtnMissionReady.Size = new System.Drawing.Size(96, 30);
this.BtnMissionReady.TabIndex = 1;
this.BtnMissionReady.Text = "运行";
this.BtnMissionReady.UseVisualStyleBackColor = true;
this.BtnMissionReady.Click += new System.EventHandler(this.BtnMissionReady_Click);
//
// LstAgvPlace
//
this.LstAgvPlace.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)));
this.LstAgvPlace.FormattingEnabled = true;
this.LstAgvPlace.IntegralHeight = false;
this.LstAgvPlace.ItemHeight = 12;
this.LstAgvPlace.Location = new System.Drawing.Point(6, 6);
this.LstAgvPlace.Name = "LstAgvPlace";
this.LstAgvPlace.Size = new System.Drawing.Size(150, 509);
this.LstAgvPlace.TabIndex = 0;
//
// tabPage2
//
this.tabPage2.Controls.Add(this.tableLayoutPanel1);
this.tabPage2.Location = new System.Drawing.Point(4, 22);
this.tabPage2.Name = "tabPage2";
this.tabPage2.Padding = new System.Windows.Forms.Padding(3);
this.tabPage2.Size = new System.Drawing.Size(924, 521);
this.tabPage2.TabIndex = 3;
this.tabPage2.Text = "日志";
this.tabPage2.UseVisualStyleBackColor = true;
//
// tableLayoutPanel1
//
this.tableLayoutPanel1.ColumnCount = 2;
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 35.06064F));
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 64.93936F));
this.tableLayoutPanel1.Controls.Add(this.TxtLog, 0, 0);
this.tableLayoutPanel1.Controls.Add(this.dgvMission, 1, 0);
this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill;
this.tableLayoutPanel1.Location = new System.Drawing.Point(3, 3);
this.tableLayoutPanel1.Name = "tableLayoutPanel1";
this.tableLayoutPanel1.RowCount = 1;
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.tableLayoutPanel1.Size = new System.Drawing.Size(918, 515);
this.tableLayoutPanel1.TabIndex = 5;
//
// TxtLog
//
this.TxtLog.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.TxtLog.Location = new System.Drawing.Point(3, 3);
this.TxtLog.Multiline = true;
this.TxtLog.Name = "TxtLog";
this.TxtLog.ScrollBars = System.Windows.Forms.ScrollBars.Both;
this.TxtLog.Size = new System.Drawing.Size(315, 509);
this.TxtLog.TabIndex = 4;
//
// dgvMission
//
this.dgvMission.AllowUserToAddRows = false;
this.dgvMission.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
this.dgvMission.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
this.Column20,
this.Column21});
this.dgvMission.Dock = System.Windows.Forms.DockStyle.Top;
this.dgvMission.Location = new System.Drawing.Point(324, 3);
this.dgvMission.Name = "dgvMission";
this.dgvMission.RowHeadersVisible = false;
this.dgvMission.RowHeadersWidth = 51;
this.dgvMission.RowTemplate.Height = 27;
this.dgvMission.Size = new System.Drawing.Size(591, 186);
this.dgvMission.TabIndex = 5;
//
// Column20
//
this.Column20.HeaderText = "AGV名称";
this.Column20.MinimumWidth = 6;
this.Column20.Name = "Column20";
//
// Column21
//
this.Column21.HeaderText = "任务";
this.Column21.MinimumWidth = 6;
this.Column21.Name = "Column21";
this.Column21.Width = 450;
//
// FrmMain
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(956, 703);
this.Controls.Add(this.tabControl1);
this.Controls.Add(this.DgvAgv);
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.Name = "FrmMain";
this.Text = "Form1";
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FrmMain_FormClosing);
this.Load += new System.EventHandler(this.FrmMain_Load);
((System.ComponentModel.ISupportInitialize)(this.DgvAgv)).EndInit();
this.tabControl1.ResumeLayout(false);
this.tabPage1.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)(this.DgvNode)).EndInit();
this.tabPage3.ResumeLayout(false);
this.tabPage3.PerformLayout();
this.tabPage2.ResumeLayout(false);
this.tableLayoutPanel1.ResumeLayout(false);
this.tableLayoutPanel1.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.dgvMission)).EndInit();
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.DataGridView DgvAgv;
private System.Windows.Forms.DataGridViewTextBoxColumn Column1;
private System.Windows.Forms.DataGridViewTextBoxColumn Column2;
private System.Windows.Forms.DataGridViewTextBoxColumn Column3;
private System.Windows.Forms.DataGridViewTextBoxColumn Column14;
private System.Windows.Forms.DataGridViewTextBoxColumn Column18;
private System.Windows.Forms.DataGridViewTextBoxColumn Column4;
private System.Windows.Forms.DataGridViewTextBoxColumn Column13;
private System.Windows.Forms.DataGridViewTextBoxColumn Column19;
private System.Windows.Forms.DataGridViewButtonColumn Column11;
private System.Windows.Forms.DataGridViewButtonColumn Column17;
private System.Windows.Forms.TabControl tabControl1;
private System.Windows.Forms.TabPage tabPage1;
private System.Windows.Forms.DataGridView DgvNode;
private System.Windows.Forms.DataGridViewTextBoxColumn Column6;
private System.Windows.Forms.DataGridViewTextBoxColumn Column7;
private System.Windows.Forms.DataGridViewTextBoxColumn Column12;
private System.Windows.Forms.DataGridViewTextBoxColumn Column9;
private System.Windows.Forms.DataGridViewTextBoxColumn Column10;
private System.Windows.Forms.DataGridViewTextBoxColumn Column5;
private System.Windows.Forms.DataGridViewButtonColumn Column16;
private System.Windows.Forms.DataGridViewButtonColumn Column15;
private System.Windows.Forms.TabPage tabPage3;
private System.Windows.Forms.Button BtnAddPlace;
private System.Windows.Forms.TextBox TxtPlace;
private System.Windows.Forms.Button CloseDoor;
private System.Windows.Forms.Button BtnReady;
private System.Windows.Forms.Button BtnArrive;
private System.Windows.Forms.Button BtnClearError;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.Button BtnWriteCharge2;
private System.Windows.Forms.Button BtnReadCharge2;
private System.Windows.Forms.TextBox TxtCharge2;
private System.Windows.Forms.Button BtnWriteCharge1;
private System.Windows.Forms.Button BtnReadCharge1;
private System.Windows.Forms.TextBox TxtCharge1;
private System.Windows.Forms.CheckBox ChkAutoCharge;
private System.Windows.Forms.Button BtnMissionAdd;
private System.Windows.Forms.Button BtnMissionPause;
private System.Windows.Forms.Button BtnMissionReady;
private System.Windows.Forms.ListBox LstAgvPlace;
private System.Windows.Forms.TabPage tabPage2;
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1;
private System.Windows.Forms.TextBox TxtLog;
private System.Windows.Forms.DataGridView dgvMission;
private System.Windows.Forms.DataGridViewTextBoxColumn Column20;
private System.Windows.Forms.DataGridViewTextBoxColumn Column21;
}
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace AGVControl
{
public partial class FrmMain : Form
{
private bool exit = false;
private NotifyIcon notify;
private ContextMenuStrip notifyMenu;
public FrmMain()
{
InitializeComponent();
}
private void ShowConfig()
{
int n;
for (int i = 0; i < Common.agvInfo.Count; i++)
{
n = DgvAgv.Rows.Add(Common.agvInfo[i].ToRow());
DgvAgv.Rows[n].HeaderCell.Value = (n + 1).ToString();
if (!Common.agvInfo[i].IsCon)
DgvAgv.Rows[n].DefaultCellStyle.ForeColor = Color.Red;
}
for (int i = 0; i < Common.nodeInfo.Count; i++)
{
n = DgvNode.Rows.Add(Common.nodeInfo[i].ToRow());
DgvNode.Rows[n].HeaderCell.Value = (n + 1).ToString();
if (!Common.nodeInfo[i].Online)
DgvNode.Rows[n].DefaultCellStyle.ForeColor = Color.Red;
}
LstAgvPlace.Items.Clear();
LstAgvPlace.Items.AddRange(Common.agvMission.Keys.ToArray());
LstAgvPlace.SelectedIndex = 0;
}
private void Server_NodeChanged(int nodeIndex)
{
Invoke(new Action(() =>
{
DgvNode.Rows[nodeIndex].SetValues(Common.nodeInfo[nodeIndex].ToRow());
}));
}
private void Server_NodeOnline(int nodeIndex)
{
Invoke(new Action(() => { DgvNode.Rows[nodeIndex].DefaultCellStyle.ForeColor = Common.nodeInfo[nodeIndex].Online ? Color.Black : Color.Red; }));
}
private void Control_AgvChanged(int agvIndex)
{
//Invoke(new Action(() =>
//{
// DgvAgv.Rows[agvIndex].SetValues(Common.agvInfo[agvIndex].ToRow());
// dgvMission.Rows[agvIndex].SetValues(Common.agvInfo[agvIndex].ToMission());
//}));
}
private void Control_AgvOnline(int agvIndex)
{
//Invoke(new Action(() => { DgvAgv.Rows[agvIndex].DefaultCellStyle.ForeColor = Common.agvInfo[agvIndex].IsCon ? Color.Black : Color.Red; }));
}
private void ItemShow_Click(object sender, EventArgs e)
{
Show();
if (WindowState == FormWindowState.Minimized)
WindowState = FormWindowState.Normal;
}
private void ItemExit_Click(object sender, EventArgs e)
{
notify.Dispose();
exit = true;
Close();
}
private void Notify_MouseDoubleClick(object sender, MouseEventArgs e)
{
Show();
if (WindowState == FormWindowState.Minimized)
WindowState = FormWindowState.Normal;
}
private void FrmMain_Load(object sender, EventArgs e)
{
//托盘菜单
notifyMenu = new ContextMenuStrip();
ToolStripMenuItem itemShow = new ToolStripMenuItem("显示(&S)");
itemShow.Click += ItemShow_Click;
ToolStripMenuItem itemExit = new ToolStripMenuItem("退出(&X)");
itemExit.Click += ItemExit_Click;
notifyMenu.Items.Add(itemShow);
notifyMenu.Items.Add(itemExit);
//托盘控件
notify = new NotifyIcon { Icon = Icon, Visible = true, ContextMenuStrip = notifyMenu, Text = Text };
notify.MouseDoubleClick += Notify_MouseDoubleClick;
ShowConfig();
//Common.control.AgvChanged += Control_AgvChanged;
//Common.control.AgvOnline += Control_AgvOnline;
Common.server.NodeChanged += Server_NodeChanged;
Common.server.NodeOnline += Server_NodeOnline;
}
private void FrmMain_FormClosing(object sender, FormClosingEventArgs e)
{
if (!exit)
{
e.Cancel = true;
Hide();
}
}
private void DgvAgv_CellClick(object sender, DataGridViewCellEventArgs e)
{
if (e.RowIndex == -1) return;
if (e.ColumnIndex == 8) //调用
{
Common.agvInfo[e.RowIndex].IsUse = !Common.agvInfo[e.RowIndex].IsUse;
DgvAgv.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = Common.agvInfo[e.RowIndex].IsUse.ToString();
Common.appConfig.AppSettings.Settings[Common.agvInfo[e.RowIndex].Name].Value = Common.agvInfo[e.RowIndex].IsUse.ToString();
Common.appConfig.Save();
}
else if (e.ColumnIndex == 9) //清除缓存
{
//清除小车缓存
//Common.log.OutInfo(string.Format("手动清除缓存,{0} {1}", Common.agvInfo[e.RowIndex].Name, Common.agvInfo[e.RowIndex].Place));
//string place = Common.agvInfo[e.RowIndex].Place;
//Common.agvInfo[e.RowIndex].Mark = "";
//Common.agvInfo[e.RowIndex].Place = "";
//Common.agvInfo[e.RowIndex].RFID = "";
//Common.agvInfo[e.RowIndex].NextMission = "";
//DgvAgv.Rows[e.RowIndex].SetValues(Common.agvInfo[e.RowIndex].ToRow());
//清除节点缓存
//int idx = Common.nodeInfo.FindIndex(s => s.Name == place);
//if (idx > -1)
//{
// Common.nodeInfo[idx].AgvName = "";
// DgvNode.Rows[idx].Cells[5].Value = "";
//}
////添加Init任务
//Common.mir.Add_Mission_Fleet(Common.agvInfo[e.RowIndex], Common.agvMission["Init"]);
//Common.mir.State_Ready(Common.agvInfo[e.RowIndex]);
}
}
private void DgvNode_CellClick(object sender, DataGridViewCellEventArgs e)
{
if (e.RowIndex == -1) return;
if (e.ColumnIndex == 6) //调用
{
Common.nodeInfo[e.RowIndex].IsUse = !Common.nodeInfo[e.RowIndex].IsUse;
DgvNode.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = Common.nodeInfo[e.RowIndex].IsUse.ToString();
Common.appConfig.AppSettings.Settings[Common.nodeInfo[e.RowIndex].Name].Value = Common.nodeInfo[e.RowIndex].IsUse.ToString();
Common.appConfig.Save();
}
else if (e.ColumnIndex == 7) //清除缓存
{
//清除节点缓存
//Common.log.OutInfo(string.Format("手动清除缓存,{0} {1}", Common.nodeInfo[e.RowIndex].AgvName, Common.nodeInfo[e.RowIndex].Name));
//string name = Common.nodeInfo[e.RowIndex].AgvName;
//Common.nodeInfo[e.RowIndex].AgvName = "";
//DgvNode.Rows[e.RowIndex].Cells[5].Value = "";
//清除小车缓存
//int idx = Common.agvInfo.FindIndex(s => s.Name == name);
//if (idx > -1)
//{
// Common.agvInfo[idx].Mark = "";
// Common.agvInfo[idx].Place = "";
// Common.agvInfo[idx].RFID = "";
// Common.agvInfo[idx].NextMission = "";
// DgvAgv.Rows[idx].SetValues(Common.agvInfo[idx].ToRow());
// //添加Init任务
// Common.mir.Add_Mission_Fleet(Common.agvInfo[idx], Common.agvMission["Init"]);
// Common.mir.State_Ready(Common.agvInfo[idx]);
//}
}
}
private void BtnMissionReady_Click(object sender, EventArgs e)
{
if (DgvAgv.SelectedCells.Count == 0) return;
int idx = DgvAgv.SelectedCells[0].RowIndex;
if (idx < 0) return;
if (Common.agvInfo[idx].IsCon)
Common.mir.State_Ready(Common.agvInfo[idx]);
}
private void BtnMissionPause_Click(object sender, EventArgs e)
{
if (DgvAgv.SelectedCells.Count == 0) return;
int idx = DgvAgv.SelectedCells[0].RowIndex;
if (idx < 0) return;
if (Common.agvInfo[idx].IsCon)
Common.mir.State_Pause(Common.agvInfo[idx]);
}
private void BtnMissionAdd_Click(object sender, EventArgs e)
{
if (DgvAgv.SelectedCells.Count == 0) return;
int idx = DgvAgv.SelectedCells[0].RowIndex;
if (idx < 0) return;
if (Common.agvInfo[idx].IsCon)
Common.mir.Add_Mission(Common.agvInfo[idx], Common.agvMission[LstAgvPlace.Text]);
}
private void BtnClearError_Click(object sender, EventArgs e)
{
if (DgvAgv.SelectedCells.Count == 0) return;
int idx = DgvAgv.SelectedCells[0].RowIndex;
if (idx < 0) return;
if (Common.agvInfo[idx].IsCon)
Common.mir.Clear_Error(Common.agvInfo[idx]);
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="Column1.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="Column2.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="Column3.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="Column14.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="Column18.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="Column4.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="Column13.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="Column19.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="Column11.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="Column17.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="Column6.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="Column7.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="Column12.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="Column9.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="Column10.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="Column5.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="Column16.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="Column15.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="Column20.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="Column21.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAABAAEAgHEAAAEAIAA46QAAFgAAACgAAACAAAAA4gAAAAEAIAAAAAAAAOIAAGEPAABhDwAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAwAAAEAAAACEAAAAjwAAAI8AAACPAAAAjwAAAI8AAACPAAAAjwAAAI8AAACPAAAAjwAA
AI8AAACPAAAAjwAAAI8AAACPAAAAjwAAAI8AAACPAAAAjwAAAI8AAACPAAAAjwAAAI8AAACPAAAAjwAA
AI8AAACPAAAAjwAAAI8AAACPAAAAjwAAAI8AAABqAAAAEHFKLAD7pGIAYkAmAAAAACwAAACAAAAAjwAA
AI8AAACPAAAAjwAAAI8AAACPAAAAjwAAAI8AAACPAAAAjwAAAI8AAACPAAAAjwAAAI8AAACPAAAAjwAA
AI8AAACPAAAAjwAAAI8AAACPAAAAjwAAAI8AAACPAAAAjwAAAI8AAACPAAAAjwAAAI8AAACPAAAAjwAA
AI8AAACPAAAAjwAAAI8AAACPAAAAjwAAAI8AAACPAAAAjwAAAI8AAACPAAAAjwAAAI8AAACPAAAAjwAA
AI8AAACPAAAAjwAAAI8AAACPAAAAjwAAAI8AAACPAAAAjwAAAI8AAACPAAAAjwAAAI8AAACPAAAAjwAA
AI8AAACPAAAAjwAAAI8AAACPAAAAjwAAAI8AAABvAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAA7gAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8IBQN8/75yDP+yaw1rRiobAQEBvwAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAADCAAAAIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAFQAAANAAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/1s7I+v7pGLI/aVjx9yPVs8fFAz6AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAB9AAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAtAAAA7AAAAP8AAAD/EwsG/yMV
DP8jFAz/IxQM/yMUDP8jFAz/IxQM/yMUDP8jEwv/IxIK/yMSCv8jEgr/IxIK/xcMB/8AAAD/AAAA/wEB
AP8aEQr/JBcO/yMXDv8jFw7/IxcO/yMXDv8jFw7/IxcO/yMXDv8jFw7/IxcO/yMXDv8jFw7/IxcO/yIX
Df8/KRn/xoJN//2lY//7pGL/+aNh/5JfOf8qHBH/IxcO/yMXDv8jFw7/IxcO/yMXDv8jFw7/IxcO/yMX
Dv8jFw7/IxcO/yMXDv8jFw7/IxcO/yMXDv8jFw7/IxcO/yMXDv8jFw7/IxcO/yMXDv8jFw7/IxcO/yMX
Dv8jFw7/IxcO/yMXDv8jFw7/IxcO/yMXDv8jFw7/IxcO/yMXDv8jFw7/IxcO/yMXDv8jFw7/IxcO/yMX
Dv8jFw7/IxcO/yMXDv8jFw7/IxcO/yMXDv8jFw7/IxcO/yMXDv8jFw7/IxcO/yMXDv8jFw7/IxcO/yMX
Dv8jFw7/IxcO/yMXDv8jFw7/IxcO/yMXDv8jFw7/IxcO/yMXDf8jFQz/IxQM/yMUDP8jFQz/IRML/wcE
Av8AAAD/AAAA/wAAAKEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAC8AAADuAAAA/wAAAP92RSf/4oRL/9+DSv/fg0r/34NK/9+DSv/fg0r/34NK/958
R//ec0H/3nNB/95zQf/idUL/kUwr/wEBAP8AAAD/BgQC/6FpP//klVn/4JNY/+CTWP/gk1j/4JNY/+CT
WP/gk1j/4JNY/+CTWP/gk1j/4JNY/+CTWP/gk1j/4ZNY/+2bXf/8pWL/+6Ri//ukYv/7pGL/+qNi/+aX
Wv/gklj/4JNY/+CTWP/gk1j/4JNY/+CTWP/gk1j/4JNY/+CTWP/gk1j/4JNY/+CTWP/gk1j/4JNY/+CT
WP/gk1j/4JNY/+CTWP/gk1j/4JNY/+CTWP/gk1j/4JNY/+CTWP/gk1j/4JNY/+CTWP/gk1j/4JNY/+CT
WP/gk1j/4JNY/+CTWP/gk1j/4JNY/+CTWP/gk1j/4JNY/+CTWP/gk1j/4JNY/+CTWP/gk1j/4JNY/+CT
WP/gk1j/4JNY/+CTWP/gk1j/4JNY/+CTWP/gk1j/4JNY/+CTWP/gk1j/4JNY/+CTWP/gk1j/4JNY/+CT
WP/gk1j/4JFW/9+ETP/fgkr/34NK/9+DSv/QekX/KxkO/wAAAP8AAAD/AAAAoQAAAAEAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALwAAAO4AAAD/AAAA/4RO
LP/+lVX/+5NU//uTVP/7k1T/+5NU//uTVP/7k1T/+oxP//qCSf/6gkn/+oJJ//6ES/+kVTD/AQEA/wAA
AP8HBAP/tXZH//+oZP/9pWP//aVj//2lY//9pWP//aVj//2lY//9pWP//aVj//2lY//9pWP//aVj//2l
Y//9pWP//KVi//ukYv/7pGL/+6Ri//ukYv/7pGL//KVj//2lY//9pWP//aVj//2lY//9pWP//aVj//2l
Y//9pWP//aVj//2lY//9pWP//aVj//2lY//9pWP//aVj//2lY//9pWP//aVj//2lY//9pWP//aVj//2l
Y//9pWP//aVj//2lY//9pWP//aVj//2lY//9pWP//aVj//2lY//9pWP//aVj//2lY//9pWP//aVj//2l
Y//9pWP//aVj//2lY//9pWP//aVj//2lY//9pWP//aVj//2lY//9pWP//aVj//2lY//9pWP//aVj//2l
Y//9pWP//aVj//2lY//9pWP//aVj//2lY//9pWP//aVj//2lY//8o2H/+5VV//uTU//7k1T//JRU/+qJ
Tv8wHBD/AAAA/wAAAP8AAAChAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAvAAAA7gAAAP8AAAD/g00s//yUVP/5klP/+ZJT//mSU//5klP/+ZJT//mS
U//5i0//+IFJ//iBSf/4gUn//INK/6NVMP8BAQD/AAAA/wcEA/+zdUb//6dk//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//uiYP/5lFX/+ZJT//mSU//6k1P/6YhO/y8cEP8AAAD/AAAA/wAAAKEAAAABAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC8AAADuAAAA/wAA
AP+DTSz//JRU//mSU//5klP/+ZJT//mSU//5klP/+ZJT//mLT//4gUn/+IFJ//iBSf/8g0r/o1Uw/wEB
AP8AAAD/BwQD/7N1Rv//p2T/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Jg//mUVf/5klP/+ZJT//qT
U//piE7/LxwQ/wAAAP8AAAD/AAAAoQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAALwAAAO4AAAD/AAAA/4NNLP/8lFT/+ZJT//mSU//5klP/+ZJT//mS
U//5klP/+YtP//iBSf/4gUn/+IFJ//yDSv+jVTD/AQEA/wAAAP8HBAP/s3VG//+nZP/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7omD/+ZRV//mSU//5klP/+pNT/+mITv8vHBD/AAAA/wAAAP8AAAChAAAAAQAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvAAAA7gAA
AP8AAAD/g00s//yUVP/5klP/+ZJT//mSU//5klP/+ZJT//mSU//5i0//+IFJ//iBSf/4gUn//INK/6NV
MP8BAQD/AAAA/wcEA/+zdUb//6dk//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uiYP/5lFX/+ZJT//mS
U//6k1P/6YhO/y8cEP8AAAD/AAAA/wAAAKEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC8AAADuAAAA/wAAAP+DTSz//JRU//mSU//5klP/+ZJT//mS
U//5klP/+ZJT//mLT//4gUn/+IFJ//iBSf/8g0r/o1Uw/wEBAP8AAAD/BwQD/7N1Rv//p2T/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Jg//mUVf/5klP/+ZJT//qTU//piE7/LxwQ/wAAAP8AAAD/AAAAoQAA
AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALwAA
AO4AAAD/AAAA/4NNLP/8lFT/+ZJT//mSU//5klP/+ZJT//mSU//5klP/+YtP//iBSf/4gUn/+IFJ//yD
Sv+jVTD/AQEA/wAAAP8HBAP/s3VG//+nZP/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7omD/+ZRV//mS
U//5klP/+pNT/+mITv8vHBD/AAAA/wAAAP8AAAChAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvAAAA7gAAAP8AAAD/g00s//yUVP/5klP/+ZJT//mS
U//5klP/+ZJT//mSU//5i0//+IFJ//iBSf/4gUn//INK/6NVMP8BAQD/AAAA/wcEA/+zdUb//6dk//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uiYP/5lFX/+ZJT//mSU//6k1P/6YhO/y8cEP8AAAD/AAAA/wAA
AKEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AC8AAADuAAAA/wAAAP+DTSz//JRU//mSU//5klP/+ZJT//mSU//5klP/+ZJT//mLT//4gUn/+IFJ//iB
Sf/8g0r/o1Uw/wEBAP8AAAD/BwQD/7N1Rv//p2T/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Jg//mU
Vf/5klP/+ZJT//qTU//piE7/LxwQ/wAAAP8AAAD/AAAAoQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALwAAAO4AAAD/AAAA/4NNLP/8lFT/+ZJT//mS
U//5klP/+ZJT//mSU//5klP/+YtP//iBSf/4gUn/+IFJ//yDSv+jVTD/AQEA/wAAAP8HBAP/s3VG//+n
ZP/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7omD/+ZRV//mSU//5klP/+pNT/+mITv8vHBD/AAAA/wAA
AP8AAAChAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAvAAAA7gAAAP8AAAD/g00s//yUVP/5klP/+ZJT//mSU//5klP/+ZJT//mSU//5i0//+IFJ//iB
Sf/4gUn//INK/6NVMP8BAQD/AAAA/wcEA/+zdUb//6dk//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ui
YP/5lFX/+ZJT//mSU//6k1P/6YhO/y8cEP8AAAD/AAAA/wAAAKEAAAABAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC8AAADuAAAA/wAAAP+DTSz//JRU//mS
U//5klP/+ZJT//mSU//5klP/+ZJT//mLT//4gUn/+IFJ//iBSf/8g0r/o1Uw/wEBAP8AAAD/BwQD/7N1
Rv//p2T/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Jg//mUVf/5klP/+ZJT//qTU//piE7/LxwQ/wAA
AP8AAAD/AAAAoQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAALwAAAO4AAAD/AAAA/4NNLP/8lFT/+ZJT//mSU//5klP/+ZJT//mSU//5klP/+YtP//iB
Sf/4gUn/+IFJ//yDSv+jVTD/AQEA/wAAAP8HBAP/s3VG//+nZP/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7omD/+ZRV//mSU//5klP/+pNT/+mITv8vHBD/AAAA/wAAAP8AAAChAAAAAQAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvAAAA7gAAAP8AAAD/g00s//yU
VP/5klP/+ZJT//mSU//5klP/+ZJT//mSU//5i0//+IFJ//iBSf/4gUn//INK/6NVMP8BAQD/AAAA/wcE
A/+zdUb//6dk//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uiYP/5lFX/+ZJT//mSU//6k1P/6YhO/y8c
EP8AAAD/AAAA/wAAAKEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAC8AAADuAAAA/wAAAP+DTSz//JRU//mSU//5klP/+ZJT//mSU//5klP/+ZJT//mL
T//4gUn/+IFJ//iBSf/8g0r/o1Uw/wEBAP8AAAD/BwQD/7N1Rv//p2T/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Jg//mUVf/5klP/+ZJT//qTU//piE7/LxwQ/wAAAP8AAAD/AAAAoQAAAAEAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALwAAAO4AAAD/AAAA/4NN
LP/8lFT/+ZJT//mSU//5klP/+ZJT//mSU//5klP/+YtP//iBSf/4gUn/+IFJ//yDSv+jVTD/AQEA/wAA
AP8HBQP/tXZH//+oZP/9pmP//aZj//2mY//9pmP//aZj//2mY//9pmP//aZj//2mY//9pmP//aZj//2m
Y//9pmP//aZj//2mY//9pmP//aZj//2mY//9pmP//aZj//2mY//9pmP//aZj//2mY//9pmP//aZj//2m
Y//9pmP//aZj//2mY//9pmP//aZj//2mY//9pmP//aZj//2mY//9pmP//aZj//2mY//9pmP//aZj//2m
Y//9pmP//aZj//2mY//9pmP//aZj//2mY//9pmP//aZj//2mY//9pmP//aZj//2mY//9pmP//aZj//2m
Y//9pmP//aZj//2mY//9pmP//aZj//2mY//9pmP//aZj//2mY//9pmP//aZj//2mY//9pmP//aZj//2m
Y//9pmP//aZj//2mY//9pmP//aZj//2mY//9pmP//aZj//2mY//9o2H//JZW//uTVP/7k1T//ZRU/+yL
T/8wHBD/AAAA/wAAAP8AAAChAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAvAAAA7gAAAP8AAAD/g00s//yUVP/5klP/+ZJT//mSU//5klP/+ZJT//mS
U//5i0//+IFJ//iBSf/4gUn//INK/6NVMP8BAQD/AAAA/wQCAf9WOCL/eE8v/3ZNLv92TS7/dk0u/3ZN
Lv92TS7/dk0u/3ZNLv92TS7/dk0u/3ZNLv92TS7/dk0u/3ZNLv92TS7/dk0u/3ZNLv92TS7/dk0u/3ZN
Lv92TS7/dk0u/3ZNLv92TS7/dk0u/3ZNLv92TS7/dk0u/3ZNLv92TS7/dk0u/3ZNLv92TS7/dk0u/3ZN
Lv92TS7/dk0u/3ZNLv92TS7/dk0u/3ZNLv92TS7/dk0u/3ZNLv92TS7/dk0u/3ZNLv92TS7/dk0u/3ZN
Lv92TS7/dk0u/3ZNLv92TS7/dk0u/3ZNLv92TS7/dk0u/3ZNLv92TS7/dk0u/3ZNLv92TS7/dk0u/3ZN
Lv92TS7/dk0u/3ZNLv92TS7/dk0u/3ZNLv92TS7/dk0u/3ZNLv92TS7/dk0u/3ZNLv92TS7/dk0u/3ZN
Lv92TS7/dk0u/3ZMLf92Rij/dkUn/3VFJ/97SCn/hE0s/x8SCv8AAAD/AAAA/wAAAKEAAAABAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC8AAADuAAAA/wAA
AP+DTSz//JRU//mSU//5klP/+ZJT//mSU//5klP/+ZJT//mLT//4gUn/+IFJ//iBSf/8g0r/o1Uw/wEB
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAALwAAAO4AAAD/AAAA/4RNLP/8lFT/+ZJT//mSU//5klP/+ZJT//mS
U//5klP/+YtP//iBSf/4gUn/+IFJ//yDSv+jVTD/AQEA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADKAAAAJQAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsAAAA6wAA
AP8AAAD/fUkq//yUVP/5klP/+ZJT//mSU//5klP/+ZJT//mSU//5i0//+IFJ//iBSf/4gUn//INK/6FU
L/8BAAD/AAAA/wEBAf8TEA7/GRYT/xkVE/8ZFRP/GRUT/xkVE/8ZFRP/GRUT/xkVE/8ZFRP/GRUT/xkV
E/8ZFRP/GRUT/xkVE/8ZFRP/GRUT/xkVE/8ZFRP/GRUT/xkVE/8ZFRP/GRUT/xkVE/8ZFRP/GRUT/xkV
E/8ZFRP/GRUT/xkVE/8ZFRP/GRUT/xkVE/8ZFRP/GRUT/xkVE/8ZFRP/GRUT/xkVE/8ZFRP/GRUT/xkV
E/8ZFRP/GRUT/xkVE/8ZFRP/GRUT/xkVE/8ZFRP/GRUT/xkVE/8ZFRP/GRUT/xkVE/8ZFRP/GRUT/xkV
E/8ZFRP/GRUT/xkVE/8ZFRP/GRUT/xkVE/8ZFRP/GRUT/xkVE/8ZFRP/GRUT/xkVE/8ZFRP/GRUT/xkV
E/8ZFRP/GRUT/xkVE/8ZFRP/GRUT/xkVE/8ZFRP/GRUT/xkVE/8ZFRP/GRUT/xkVE/8ZFRL/GRQQ/xkT
D/8XEg7/CggG/wAAAP8AAAD/AAAA/wAAAP8AAADDAAAAIQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAADcAAAA/wAAAP9fNyD/+ZJT//mSU//5klP/+ZJT//mS
U//5klP/+ZJT//iJTv/4gUn/+IFJ//iBSf/8g0r/h0Yo/wAAAP8AAAD/DAoJ/6qSgP/cvaX/2bqj/9m6
o//ZuqP/2bqj/9m6o//ZuqP/2bqj/9m6o//ZuqP/2bqj/9m6o//ZuqP/2bqj/9m6o//ZuqP/2bqj/9m6
o//ZuqP/2bqj/9m6o//ZuqP/2bqj/9m6o//ZuqP/2bqj/9m6o//ZuqP/2bqj/9m6o//ZuqP/2bqj/9m6
o//ZuqP/2bqj/9m6o//ZuqP/2bqj/9m6o//ZuqP/2bqj/9m6o//ZuqP/2bqj/9m6o//ZuqP/2bqj/9m6
o//ZuqP/2bqj/9m6o//ZuqP/2bqj/9m6o//ZuqP/2bqj/9m6o//ZuqP/2bqj/9m6o//ZuqP/2bqj/9m6
o//ZuqP/2bqj/9m6o//ZuqP/2bqj/9m6o//ZuqP/2bqj/9m6o//ZuqP/2bqj/9m6o//ZuqP/2bqj/9m6
o//ZuqP/2bqj/9m6o//ZuqP/2bqj/9m6o//ZtJf/2KyI/9aqhv+5k3T/alRD/xMPDP8AAAD/AAAA/wAA
AP8AAAClAAAACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAA
AL0AAAD/AAAA/yoZDv/gg0v/+5NU//mSU//5klP/+ZJT//mSU//5kVP/+IZM//iBSf/4gUn/+YFJ//B9
R/9JJhX/AAAA/wAAAP8kHxv/48Kq///dwf//28D//9vA///bwP//28D//9vA///bwP//28D//9vA///b
wP//28D//9vA///bwP//28D//9vA///bwP//28D//9vA///bwP//28D//9vA///bwP//28D//9vA///b
wP//28D//9vA///bwP//28D//9vA///bwP//28D//9vA///bwP//28D//9vA///bwP//28D//9vA///b
wP//28D//9vA///bwP//28D//9vA///bwP//28D//9vA///bwP//28D//9vA///bwP//28D//9vA///b
wP//28D//9vA///bwP//28D//9vA///bwP//28D//9vA///bwP//28D//9vA///bwP//28D//9vA///b
wP//28D//9vA///bwP//28D//9vA///bwP//28D//9vA///bwP//28D//9vA///bwP//28D//9vA///a
vv//0Kv//sqf///LoP/7x57/s45x/yIbFf8AAAD/AAAA/wAAAPgAAABWAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAP8AAAD/AgEB/4tRLv/7k1T/+ZJT//mS
U//5klP/+ZJT//mOUf/4gkr/+IFJ//iBSf/8g0r/rloz/wwGBP8AAAD/AAAA/1lNQ//51rv//dm+//3Z
vv/92b7//tq///7av//92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//7a
v//+2r///dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//tq///3Z
vv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//7av//+2r7//dm+//3Z
vv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/+2r///tq///3Zvv/92b7//dm+//3Z
vv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//tq///7av//92b7//dm+//3Zvv/92b7//dm+//3Z
vv/92b7//dm+//3Zvv/92b7//dm+//7avv/+2r///dm///3WuP/8yqH//Mie//zInv//y6D/rYls/w4L
Cf8AAAD/AAAA/wAAALQAAAAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAvAAAA5gAAAP8AAAD/Gg8J/7ZqPf/8lFT/+pNT//mSU//5klP/+IdN//iBSf/5gUn//INK/81q
PP8vGA7/AAAA/wAAAP8JCAf/sJeE///cwf/92b7//dm+//7av//uzLP/7cuy//7av//92b7//dm+//3Z
vv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/+2r//8tC2/+nIr//82L3//dm+//3Zvv/92b7//dm+//3Z
vv/92b7//dm+//3Zvv/92b7//tq///fUuv/nxq7/+da7//7av//92b7//dm+//3Zvv/92b7//dm+//3Z
vv/92b7//dm+//7avv/717z/6Meu//XSuP/+2r///dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//3Z
vv/92b7//dm+/+vJsP/wzrT//tq///3Zvv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//7a
v//vzbT/7Mqx//7Zvv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/+2r//9NG3/+jH
rv/72L3//tm+//zOqf/8yJ7//Mie//3Inv/3xJv/V0U3/wAAAP8AAAD/AAAA5gAAACcAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAACEAAAA/wAAAP8AAAD/HhIK/5pb
M//si0///JRU//2NUP/8hEv//INK//F9R/+vWzT/LxkO/wAAAP8AAAD/AAAA/1VJQP/00bf//tq///3Z
vv//28D/vqOP/zsyLP83Lyn/tZuI///av//92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//9u//9m6
o/9OQzv/LCYh/5WAcP/72L3//dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//7av//syrH/Z1hN/ygj
Hv90Y1f/8tC2//7av//92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7/+NW6/4ZzZf8qJB//WU1D/+PD
qv//2r///dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//7avv+mjn3/MSol/0I5Mv/Lrpj//9vA//3Z
vv/92b7//dm+//3Zvv/92b7//dm+//3Zvv//28D/xamU/z82L/80LCf/rpWD//7av//92b7//dm+//3Z
vv/92b7//dm+//3Zvv/92b7//9q//96/p/9USD//KyQg/415av/61rz//dKw//zInv/8yJ7//Mie///L
of+dfWP/AQEB/wAAAP8AAADvAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAABYAAAC3AAAA/wAAAP8AAAD/BwQC/0AlFf+DSyv/plcx/6dXMf+MSSn/TCgW/w0H
BP8AAAD/AAAA/wAAAP8sJiH/07Wf///bwP/92b7//dm+//rWvP9VSUD/AAAA/wAAAP9MQTn/99S6//3Z
vv/92b7//dm+//3Zvv/92b7//dm+//3Zvv//3MH/h3Rl/wAAAP8AAAD/JB8b/+PDq///2r///dm+//3Z
vv/92b7//dm+//3Zvv/92b7//9zB/7OZhv8EBAP/AAAA/wwKCf/FqZT//9zA//3Zvv/92b7//dm+//3Z
vv/92b7//dm+///bwP/WuKH/FxMR/wAAAP8AAAD/m4V1///dwf/92b7//dm+//3Zvv/92b7//dm+//3Z
vv/+2r//8M61/zoxK/8AAAD/AAAA/2tcUP/+2r///dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//zZ
vv9fUkj/AAAA/wAAAP9CODH/9NG3//7Zvv/92b7//dm+//3Zvv/92b7//dm+//3Zvv//3MH/k35u/wAA
AP8AAAD/HBgV/9y9pv//1bT//Mie//zInv/8yJ7//8ug/76Wd/8KCAb/AAAA/wAAAO4AAAAvAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEEAAADzAAAA/wAA
AP8AAAD/AAAA/wAAAP8CAQH/AgEB/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/5WAcP//3cH//dm+//3Z
vv/92b7//dm+/3NjVv8AAAD/AAAA/2dZTv/717z//dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+///c
wf+giXj/BQQE/wAAAP8+NS//7cuy//7av//92b7//dm+//3Zvv/92b7//dm+//3Zvv//3MD/xqqV/xQR
D/8AAAD/IBsY/9W3oP//28D//dm+//3Zvv/92b7//dm+//3Zvv/92b7//9q//+PDqv8vKCP/AAAA/wsJ
CP+ymYb//9zB//3Zvv/92b7//dm+//3Zvv/92b7//dm+//7Zvv/207n/VUlA/wAAAP8AAAD/h3Rm///b
wP/92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//tq//31rXv8AAAD/AAAA/15QRv/51bv//dm+//3Z
vv/92b7//dm+//3Zvv/92b7//dm+///cwf+qkoD/CAcG/wAAAP81Lij/58eu//7Us//8yJ7//Mie//zI
nv//y6D/tpBy/wcGBf8AAAD/AAAA7gAAAC8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAANQAAAO8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8BAQD/pI17///dwf/92b7//dm+//3Zvv/+2r//5sWs/4l2Z/+FcmT/4cGp//7a
v//92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//tq///PQtv+ahHT/emlc/8+xm//+2r///dm+//3Z
vv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/61rv/r5aD/3ZlWf+5n4v//Ni9//3Zvv/92b7//dm+//3Z
vv/92b7//dm+//3Zvv/92b7//tm+/8WplP93Zlr/pI17//fTuf/92b7//dm+//3Zvv/92b7//dm+//3Z
vv/92b7//dm+//7av//ZuqP/gG1g/5B8bP/syrH//tq///3Zvv/92b7//dm+//3Zvv/92b7//dm+//3Z
vv/+2r//6civ/415av+CcGL/3b6m//7av//92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//tq+//XS
uP+fiXj/eGda/8mtl//+2r///dCu//zInv/8yJ7//Mie///LoP+Ha1X/AAAA/wAAAP8AAADuAAAALwAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2AAAA8AAA
AP8AAAD/KyIb/yohGv8NCgj/BgUE/wYFBP8LCQf/IxwW/zktJP8FBAP/AAAA/wEAAP+ji3r//93B//3Z
vv/92b7//dm+//3Zvv/+2r///9zA///bwP//2r///dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//3Z
vv/92b7//tq////cwP//28D//9vA//3Zvv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//3Z
vv//3MD//9vA///bwP/92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//9vA///b
wP//3MD//tm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+///bv///28D//9zA//7a
v//92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/+2r///9zA///bwP//2r///dm+//3Z
vv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//tq+///cwP//28D//9vA//3YvP/8zKb//Mie//zI
nv/+yp//57eR/zcrIv8AAAD/AAAA/wAAANkAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADYAAADwAAAA/wAAAP+Lblf/6LiR/8Sce/+zjnD/so1v/8CY
eP/hs43/uJJ0/woIBv8AAAD/AQAA/6KLev//3cH//dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//3Z
vv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//3Z
vv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//3Z
vv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//3Z
vv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//3Z
vv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//3Z
vv/92b7//dm+//3Zvv/92b7//dOz//zJn//8yJ7//8qg//bDmv91XUr/AQEB/wAAAP8AAAD/AAAAkwAA
AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANgAA
APAAAAD/AAAA/45xWf//zaL//8ug///LoP//y6D//8ug///Mof++lnf/CggG/wAAAP8AAAD/pY18///h
xf//3cH//93B///dwf//3cH//93B///dwf//3cH//93B///dwf//3cH//93B///dwf//3cH//93B///d
wf//3MH//tq+//3Zvv/92b7//dm+//7av///3cH//93B///dwf//3cH//93B///dwf//3cH//93B///d
wf//3cH//93B///dwf//3cH//93B///dwf//3cH//93B///dwf//3cH//93B///dwf//3cH//93B///d
wf//3cH//93B///dwf//3cH//93B///dwf//3cH//93B///dwf//3cH//93B///dwf//3cH//93B///d
wf//3cH//93B///dwf//3cH//93B///dwf//3cH//93B///dwf//3cH//93B///dwf//3cH//93B///d
wf//3cH//93B///dwf//3cH//93B///dwf//3cH//93B///dwf//3cH//93C///avP//z6f//8ug//3I
nv/cr4r/bldF/wcFBP8AAAD/AAAA/wAAAOQAAAAyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2AAAA8AAAAP8AAAD/jnFZ///Lof/8yJ7//Mie//zI
nv/8yJ7//8ug/72Wd/8KCAb/AAAA/wAAAP9dUEb/lH9v/5J9bf+SfW3/kn1t/5J9bf+SfW3/kn1t/5J9
bf+SfW3/kn1t/5J9bf+SfW3/kn1t/5J9bf+SfW3/kn1u/7Sah//00bf//tq///3Zvv/+2r//6Meu/6aO
fP+RfG3/kn1t/5J9bf+SfW3/kn1t/5J9bf+SfW3/kn1t/5J9bf+SfW3/kn1t/5J9bf+SfW3/kn1t/5J9
bf+SfW3/kn1t/5J9bf+SfW3/kn1t/5J9bf+SfW3/kn1t/5J9bf+SfW3/kn1t/5J9bf+SfW3/kn1t/5J9
bf+SfW3/kn1t/5J9bf+SfW3/kn1t/5J9bf+SfW3/kn1t/5J9bf+SfW3/kn1t/5J9bf+SfW3/kn1t/5J9
bf+SfW3/kn1t/5J9bf+SfW3/kn1t/5J9bf+SfW3/kn1t/5J9bf+SfW3/kn1t/5J9bf+SfW3/kn1t/5J9
bf+SfW3/kn1t/5J9bf+SfW3/kXdi/5FzW/+OcFn/aFNB/yYeGP8AAAD/AAAA/wAAAP8AAAD5AAAAbgAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
ADYAAADwAAAA/wAAAP+OcVn//8uh//zInv/8yJ7//Mie//zInv//y6D/vZZ3/woIBv8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/CAcG/456a///2r///tm+//bTuf9fUUf/AQEB/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA9wAAAIMAAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANgAAAPAAAAD/AAAA/45xWf//y6H//Mie//zI
nv/8yJ7//Mie///LoP+9lnf/CggG/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/LykkzvrWvHb/3MB11LafgBMR
D+cAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAANoAAABkAAAABgAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAA2AAAA8AAAAP8AAAD/jnFZ///Lof/8yJ7//Mie//zInv/8yJ7//8ug/72Wd/8KCAb/AAAA/wAA
AP8AAAD1AAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAA
APAAAADwAAAA8AAAAN8AAABSoYp5AOrJsAD///8AAAAAfQAAAOoAAADwAAAA8AAAAPAAAADwAAAA8AAA
APAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAA
APAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAA
APAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAA
APAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAA
APAAAADuAAAA5AAAAMEAAAB6AAAAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADYAAADwAAAA/wAAAP+OcVn//8uh//zI
nv/8yJ7//Mie//zInv//y6D/vZZ3/woIBv8AAAD/AAAA/wAAAH4AAAAzAAAANgAAADYAAAA2AAAANgAA
ADYAAAA2AAAANgAAADYAAAA2AAAANgAAADYAAAA2AAAANgAAADYAAAA2AAAAIgAAAAEAAAAAAAAAAAAA
AAAAAAAHAAAAKwAAADYAAAA2AAAANgAAADYAAAA2AAAANgAAADYAAAA2AAAANgAAADYAAAA2AAAANgAA
ADYAAAA2AAAANgAAADYAAAA2AAAANgAAADYAAAA2AAAANgAAADYAAAA2AAAANgAAADYAAAA2AAAANgAA
ADYAAAA2AAAANgAAADYAAAA2AAAANgAAADYAAAA2AAAANgAAADYAAAA2AAAANgAAADYAAAA2AAAANgAA
ADYAAAA2AAAANgAAADYAAAA2AAAANgAAADYAAAA2AAAANgAAADYAAAA2AAAANgAAADYAAAA2AAAANgAA
ADYAAAA2AAAANgAAADYAAAA2AAAANgAAADYAAAA2AAAANgAAADIAAAAkAAAADAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAANgAAAPAAAAD/AAAA/45xWf//y6H//Mie//zInv/8yJ7//Mie///LoP+9lnf/CggG/wAA
AP8AAAD/AAAAWgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2AAAA8AAAAP8AAAD/jnFZ///L
of/8yJ7//Mie//zInv/8yJ7//8ug/72Wd/8KCAb/AAAA/wAAAP8AAABcAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAADYAAADwAAAA/wAAAP+OcVn//8uh//zInv/8yJ7//Mie//zInv//y6D/vZZ3/woI
Bv8AAAD/AAAA/wAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANgAAAPAAAAD/AAAA/45x
Wf//y6H//Mie//zInv/8yJ7//Mie///LoP+9lnf/CggG/wAAAP8AAAD/AAAAXAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAA2AAAA8AAAAP8AAAD/jnFZ///Lof/8yJ7//Mie//zInv/8yJ7//8ug/72W
d/8KCAb/AAAA/wAAAP8AAABcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADYAAADwAAAA/wAA
AP+OcVn//8uh//zInv/8yJ7//Mie//zInv//y6D/vZZ3/woIBv8AAAD/AAAA/wAAAFwAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAANgAAAPAAAAD/AAAA/45xWf//y6H//Mie//zInv/8yJ7//Mie///L
oP+9lnf/CggG/wAAAP8AAAD/AAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2AAAA8AAA
AP8AAAD/jnFZ///Lof/8yJ7//Mie//zInv/8yJ7//8ug/72Wd/8KCAb/AAAA/wAAAP8AAABcAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADYAAADwAAAA/wAAAP+OcVn//8uh//zInv/8yJ7//Mie//zI
nv//y6D/vZZ3/woIBv8AAAD/AAAA/wAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAcAAAAvAAAAIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANgAA
APAAAAD/AAAA/45xWf//y6H//Mie//zInv/8yJ7//Mie///LoP+9lnf/CggG/wAAAP8AAAD/AAAAXAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAfQAAAO4AAADaAAAAQgAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2AAAA8AAAAP8AAAD/jnFZ///Lof/8yJ7//Mie//zI
nv/8yJ7//8ug/72Wd/8KCAb/AAAA/wAAAP8AAABcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAC4AAADnAAAA/wAAAP8AAACPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
ADYAAADwAAAA/wAAAP+OcVn//8uh//zInv/8yJ7//Mie//zInv//y6D/vZZ3/woIBv8AAAD/AAAA/wAA
AFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhQAAAP8AAAD/AAAA/AAA
AGIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANgAAAPAAAAD/AAAA/45xWf//y6H//Mie//zI
nv/8yJ7//Mie///LoP+9lnf/CggG/wAAAP8AAAD/AAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAB8AAADXAAAA/wAAAP8AAADRAAAAGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAIAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAA2AAAA8AAAAP8AAAD/jnFZ///Lof/8yJ7//Mie//zInv/8yJ7//8ug/72Wd/8KCAb/AAAA/wAA
AP8AAABcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVwAAAP0AAAD/AAAA/wAA
AIsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWQAAALwAAACTAAAAFgAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADYAAADwAAAA/wAAAP+OcVn//8uh//zI
nv/8yJ7//Mie//zInv//y6D/vZZ3/woIBv8AAAD/AAAA/wAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAABDAAAA8wAAAP8AAAD/AAAAvQAAABEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
ACgAAADhAAAA/wAAAP8AAABnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAANgAAAPAAAAD/AAAA/45xWf//zKH//Mie//zInv/8yJ7//Mie///LoP++lnf/CggG/wAA
AP8AAAD/AAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAACnAAAA/wAA
AP8AAAD8AAAAaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAAAP8AAAD/AAAA/gAAAGIAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAA7QAAAP8AAAD/fWNP///M
of/8yJ7//Mie//zInv/8yJ7//8yh/6aEaP8EAwL/AAAA/wAAAP0AAABXAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAADqAAAA/wAAAP8AAADSAAAAHAAAAAAAAAALAAAAJAAA
AFMAAADZAAAA/wAAAP8AAADXAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAABkAAADXAAAA/wAAAP8pIRr/xp18//nGnP/7x53/+8ed//rGnf/ZrIj/QjQp/wAA
AP8AAAD/AAAA7gAAADQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAA
AI4AAAD/AAAA/wAAAP4AAACmAAAAjgAAAMAAAADjAAAA+QAAAP8AAAD/AAAA/wAAAIQAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAI0AAAD/AAAA/wAA
AP8cFhL/UUAz/15LO/9eSzv/VkQ2/ycfGP8AAAD/AAAA/wAAAP8AAACyAAAACgAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJgAAANoAAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAADmAAAALQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAKwAAAOIAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA9AAAAEkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAlQAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADxAAAA0gAAAGcAAAACAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABTAAAA8wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD8AAAAbwAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAADRAAAA/wAAAP8AAAD9AAAA6AAA
AMYAAACYAAAAZgAAADgAAAAWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAALsAAAD/AAAA/wkEAv88Gw//LxYM/ygSCv8oEgr/LBQL/zwc
EP8PBwT/AAAA/wAAAP8AAADTAAAAGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAhQAAAP8AAAD/AAAA/wAAAJ0AAAAoAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0AAAA7gAA
AP8AAAD/WSkX/+prPf/maTz/42g7/+NoO//laTv/7W09/3M1Hv8AAAD/AAAA/wAAAPkAAABOAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADUAAADnAAAA/wAAAP8AAADaAAAAJQAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFUAAAD8AAAA/wQCAf+mTCv//HNB//hxQP/4ckD/+HJA//hy
QP/7c0H/v1gy/w0GA/8AAAD/AAAA/wAAAHUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAHAAAApQAAAP8AAAD/AAAA/QAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXQAA
AP4AAAD/BwMC/7dUL//7c0H/93FA//dxQP/3cUD/93FA//pyQf/PXzb/FgoG/wAAAP8AAAD/AAAAgwAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAD1AAAA/wAAAP8AAADCAAAAEwAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABNAAAA+gAAAP8BAAD/k0Mm//tzQf/3cUD/93FA//dx
QP/3cUD/+3NB/65QLf8HAwL/AAAA/wAAAP8AAABoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAATAAAAwQAAAP8AAAD/AAAA9QAAAFEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
ACYAAADjAAAA/wAAAP83GQ7/3GU5//tzQf/4cUD/+HFA//tzQf/pazz/TSMU/wAAAP8AAAD/AAAA9wAA
AE8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAIAAAALAAAAEwAAABPAAAAMAAAAHYAAAD9AAAA/wAAAP8AAACmAAAABwAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAJ4AAAD/AAAA/wAAAP9IIRP/wFgy/+pr
Pf/sbD3/yFs0/1opF/8DAQH/AAAA/wAAAP8AAAD+AAAA1wAAAH4AAAAXAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAARQAAALEAAADpAAAA+gAA
APsAAADtAAAA8gAAAP8AAAD/AAAA5gAAADUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAMgAAAOEAAAD/AAAA/wAAAP8SCAX/NxkO/zsbD/8WCgb/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAALoAAAAjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAgAAAGoAAADtAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAACfAAAAAgAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVwAAAOkAAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8FBAP/AAAA/wAAAP8AAAD/AAAA/wAAAKkAAAALAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABKAAAA7wAAAP8AAAD/AAAA/wIC
Af8DAwL/AAAA/wAAAP8AAAD/AAAA/wAAAOUAAABRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAARQAAAMEAAAD5AAAA/wAAAP8AAAD/AAAA/wICAf81KiH/jG9Y/6+L
bv97Yk3/GRQQ/wAAAP8AAAD/AAAA+QAAAFoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAEAAAAL8AAAD/AAAA/wIBAf9IOS3/oH9k/6iFaf9iTj3/Ew8M/wAAAP8AAAD/AAAA/wAA
ANoAAAAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAA
AHAAAAD3AAAA/wAAAP8UEA3/i25X/+e3kf//y6D//8uh///KoP+riGv/DgsJ/wAAAP8AAAD/AAAAwgAA
ABEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABeAAAA+gAAAP8AAAD/Tz4x/+q6
k///zKH//8uh//nGnP/Dm3r/SDkt/wAAAP8AAAD/AAAA/wAAAIYAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAP0AAAD/AQEB/4hsVf/+yqD//smf//zI
nv/8yJ7//cme//jFnP9dSjr/AAAA/wAAAP8AAAD7AAAAYQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAEwAAAMUAAAD/AAAA/xIOC//BmXn//8ug//zInv/8yJ7//Mie///Lof/dr4r/LCMc/wAA
AP8AAAD/AAAAyAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAB/AAAA/wAAAP8VEQ3/0qaD///KoP/8yJ7//Mie//zInv/8yJ7//8ug/8Sce/8UEA3/AAAA/wAA
AP8AAADIAAAAFQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABlAAAA/AAAAP8AAAD/Y08+//nF
nP/8yJ7//Mie//zInv/8yJ7//Mie//7Kn/9sVkT/AAAA/wAAAP8AAADgAAAAHgAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH0AAAD/AAAA/xMPDP/MooD//8qg//zI
nv/8yJ7//Mie//zInv/8yJ7/+sac/2dSQf8AAAD/AAAA/wAAAP0AAABpAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAGAAAAMwAAAD/AAAA/xcSDv/Jn37//8qg//zInv/8yJ7//Mie//zInv/8yJ7//Mie/2ZR
QP8AAAD/AAAA/wAAAN8AAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAWQAAAPwAAAD/AAAA/4FnUf/+yZ///Mie//zInv/8yJ7//Mie//zInv//yqD/zKKA/xkU
EP8AAAD/AAAA/wAAAM8AAAAaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABvAAAA/gAAAP8AAAD/bFZE//rH
nf/8yJ7//Mie//zInv/8yJ7//Mie//7Kn//arYn/JR4X/wAAAP8AAAD/AAAAwgAAAA0AAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAA2gAAAP8AAAD/IxwW/9ir
h//+yp///Mie//zInv/8yJ7//Mie//zInv/7x53/b1hG/wAAAP8AAAD/AAAA/wAAAHQAAAAAAAAAAAAA
AAAAAAAAAAAAHQAAANMAAAD/AAAA/xoVEf/PpIH//8qg//zInv/8yJ7//Mie//zInv/8yJ7//cmf/31j
Tv8AAAD/AAAA/wAAAP8AAAB7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAB+AAAA/wAAAP8AAAD/eWBM//3Jnv/8yJ7//Mie//zInv/8yJ7//Mie///K
oP/RpoP/HBcS/wAAAP8AAAD/AAAA1gAAAB8AAAAAAAAAAAAAAAAAAAB3AAAA/wAAAP8AAAD/c1tI//zI
nv/8yJ7//Mie//zInv/8yJ7//Mie//7KoP/WqYb/IRoU/wAAAP8AAAD/AAAA2gAAACMAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACEAAADYAAAA/wAA
AP8eGBP/06iE///KoP/8yJ7//Mie//zInv/8yJ7//Mie//zInv93Xkv/AAAA/wAAAP8AAAD/AAAAewAA
AAAAAAAAAAAAIQAAANgAAAD/AAAA/yAZFP/UqIX//8qg//zInv/8yJ7//Mie//zInv/8yJ7//Mie/3Ze
Sv8AAAD/AAAA/wAAAP8AAAB5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHUAAAD/AAAA/wAAAP9yW0j//Mie//zInv/8yJ7//Mie//zI
nv/8yJ7//sqf/9erh/8jHBb/AAAA/wAAAP8AAADaAAAAJAAAAAAAAAB/AAAA/wAAAP8AAAD/fWNO//3J
n//8yJ7//Mie//zInv/8yJ7//Mie///KoP/QpYL/HBYS/wAAAP8AAAD/AAAA0wAAAB0AAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGwAA
ANAAAAD/AAAA/xoVEP/No4H//8qg//zInv/8yJ7//Mie//zInv/8yJ7//cmf/4FmUf8AAAD/AAAA/wAA
AP8AAACBAAAAJwAAAN4AAAD/AAAA/yYeGP/arYn//sqf//zInv/8yJ7//Mie//zInv/8yJ7/+8ed/21X
RP8AAAD/AAAA/wAAAP4AAABvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAawAAAP0AAAD/AAAA/2lTQv/6xp3//Mie//zI
nv/8yJ7//Mie//zInv/+yp//3a+K/yggGf8AAAD/AAAA/wAAAN8AAACsAAAA/wAAAP8AAAD/hWpT//7K
n//8yJ7//Mie//zInv/8yJ7//Mie///KoP/Jn37/FxIO/wAAAP8AAAD/AAAAzQAAABgAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAWAAAAygAAAP8AAAD/FBAN/8WdfP//yqD//Mie//zInv/8yJ7//Mie//zInv/+yp//iWxW/wAA
AP8AAAD/AAAA/wAAAP4AAAD/AAAA/yoiG//fsYz//sqf//zInv/8yJ7//Mie//zInv/8yJ7/+cac/2NP
Pv8AAAD/AAAA/wAAAP0AAABoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABkAAAA/AAAAP8AAAD/YEw8//jF
nP/8yJ7//Mie//zInv/8yJ7//Mie//7Jn//hs43/LSQc/wAAAP8AAAD/AAAA/wAAAP8BAQH/jXBY///K
oP/8yJ7//Mie//zInv/8yJ7//Mie///LoP/Dm3r/Ew8M/wAAAP8AAAD/AAAAxwAAABQAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAABMAAADEAAAA/wAAAP8RDgv/wJh4///LoP/8yJ7//Mie//zInv/8yJ7//Mie///K
oP+Rc1v/AgIB/wAAAP8AAAD/AAAA/zIoH//ktY///smf//zInv/8yJ7//Mie//zInv/8yJ7/98Sb/11K
Ov8AAAD/AAAA/wAAAPoAAABfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFsAAAD5AAAA/wAA
AP9ZRzj/9sOa//3Inv/8yJ7//Mie//zInv/8yJ7//smf/+a2kP8yKCD/AAAA/wAAAP8CAgH/lHZd///L
oP/8yJ7//Mie//zInv/8yJ7//Mie///LoP+8lXb/DwwK/wAAAP8AAAD/AAAAvwAAABAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAALsAAAD/AAAA/w4LCf+4knP//8ug//zInv/8yJ7//Mie//zI
nv//yqD//Mie/2JOPf8AAAD/AAAA/xENCv/In37//82i//3Jn//8yJ7//Mie//zInv/9yZ7/9MKZ/1RC
NP8AAAD/AAAA/wAAAPgAAABWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUwAA
APcAAAD/AAAA/08/Mv/zwZj//cme//zInv/9yZ7//Mie/8adfP9oUkH/GhQQ/wAAAP8AAAD/BAMD/z4x
J/+XeF//67qT//7Kn//8yJ7//Mie///LoP+zjnD/CwkH/wAAAP8AAAD/AAAAuAAAAAwAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALAAAAtQAAAP8AAAD/CggG/7CMbv//zKH//cmf//fE
m/+Pclr/FxIP/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wICAf9IOS3/06iE//7KoP/9yZ//88GY/0w8
L/8AAAD/AAAA/wAAAPYAAABPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAABMAAAA9AAAAP8AAAD/Oi4k/9irh//9yZ7/j3FZ/wgHBf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP85LST/266K//nGnP+Pclr/BwYE/wAAAP8AAAD/AAAAsQAAAAoAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAACrAAAA/wAAAP8AAAD/LCMc/2RP
P/8VEQ3/AAAA/wAAAP8CAQH/ORoP/3o4IP+GPSP/XysY/xUKBv8AAAD/AAAA/wAAAP9ENiv/VUQ1/wwJ
B/8AAAD/AAAA/wAAAPIAAABGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAADUAAADfAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AwEB/24yHP/laTv/+nNB//tz
Qf/2cUD/t1Qw/yYRCv8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAjwAAAAUAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEgAAADWAAAA/wAA
AP8AAAD/AAAA/wAAAP89HBD/5mk8//lyQf/3cUD/93FA//dxQP/7c0H/nUgp/wYDAf8AAAD/AAAA/wAA
AP8AAAD/AAAA9wAAAJYAAAARAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYAAACIAAAA1QAAAP4AAAD/AAAA/4E7If/7c0H/93FA//dx
QP/3cUD/93FA//lyQP/cZTn/Ig8J/wAAAP8AAAD/AAAA8AAAALIAAABVAAAACAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAABGAAAA9AAAAP8AAAD/kEIl//tzQf/3cUD/93FA//dxQP/3cUD/+HJA/+RoO/8qEwv/AAAA/wAA
AP8AAACrAAAACQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACoAAADpAAAA/wAAAP9qMBv/+HJA//dx
QP/3cUD/93FA//dxQP/6ckH/y101/xYKBv8AAAD/AAAA/wAAAI8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAADwAAAMUAAAD/AAAA/xwNB//CWTL//HNB//lyQP/4cUD/+nJB//JvP/9pMBv/AAAA/wAA
AP8AAAD9AAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcwAAAP8AAAD/AAAA/y0V
DP+mTCv/4Gc6/+dqPP/OXjX/azEc/wcDAv8AAAD/AAAA/wAAANIAAAAbAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAYAAAAwQAAAP8AAAD/AAAA/wgEAv8nEgr/MRYN/xgLBv8AAAD/AAAA/wAA
AP8AAAD3AAAAYgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzAAAAzwAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA+AAAAIIAAAAGAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAowAAAPAAAAD/AAAA/wAAAP8AAAD/AAAA/QAA
ANQAAABkAAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAHAAAAPQAAAH4AAACjAAAAqwAAAJQAAABgAAAAHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAEAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////////
/////////gAAAAAcAAAAAAAAAAAD//gAAAAAAAAAAAAAAAAAAP/wAAAAAAAAAAAAAAAAAAB/8AAAAAAA
AAAAAAAAAAAAf/AAAAAAAAAAAAAAAAAAAH/wAAAAAAAAAAAAAAAAAAB/8AAAAAAAAAAAAAAAAAAAf/AA
AAAAAAAAAAAAAAAAAH/wAAAAAAAAAAAAAAAAAAB/8AAAAAAAAAAAAAAAAAAAf/AAAAAAAAAAAAAAAAAA
AH/wAAAAAAAAAAAAAAAAAAB/8AAAAAAAAAAAAAAAAAAAf/AAAAAAAAAAAAAAAAAAAH/wAAAAAAAAAAAA
AAAAAAB/8AAAAAAAAAAAAAAAAAAAf/AAAAAAAAAAAAAAAAAAAH/wAAAAAAAAAAAAAAAAAAB/8AAAAAAA
AAAAAAAAAAAAf/AAAAAAAAAAAAAAAAAAAH/wAAAAAAAAAAAAAAAAAAB/8AAAAAAAAAAAAAAAAAAAf/AA
AAAAAAAAAAAAAAAAAH/wAAAAAAAAAAAAAAAAAAB/8AAAAAAAAAAAAAAAAAAAP/AAAAAAAAAAAAAAAAAA
AB/wAAAAAAAAAAAAAAAAAAAf8AAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAA
AAAAAAAP8AAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAA/4AAAAAAAAAAAAAAAAAAAP+AAAAAAA
AAAAAAAAAAAAD/wAAAAAAAAAAAAAAAAAAA/+AAAAAAAAAAAAAAAAAAAP/gAAAAAAAAAAAAAAAAAAD/4A
AAAAAAAAAAAAAAAAAA/+AAAAAAAAAAAAAAAAAAAP/gAAAAAAAAAAAAAAAAAAH/4AAAAAAAAAAAAAAAAA
AD/+AAAAAAAAAAAAAAAAAAA//gAAAAAAAAAAAAAAAAAA//4AAAAAAAAAAAAAAAAAAf/+AAB/////////
/////////gAAf/////////////////4AAH/////////////////+AAB//////////////////gAAf///
//////////////4AAH/////////////////+AAB///8B/////////////gAAf///AP////////////4A
AH///gD////////////+AAB///4A/////////////gAAf//+AOB///////////4AAH///gDAf///////
///+AAB///4BwD///////////gAAf//+AIA///////////4AAH///gAAP//////////+AAB///4AAD//
/////////gAAf//+AAB///////////4AAH///wAAf//////////+AAB///8AAP///////////gAAf///
AAD///////////4AAH///gAB///////////+AAB///4AB////////////gAAf//8AH////////////4A
AH///AD////////////+AAAf/wAA/////////////gAAD/4AAf////////////4AAAf8AAP/////////
///+AAAH+AAD/////////////gAAA/gAA/////////////8AAAPwAAH/////////////gAAB8AAB////
/////////8AAAeAAAf/////////////gAADgAAH/////////////4AAAwAAB/////////////+AAAAAA
Af/////////////gAAAAAAH/////////////8AAAAAAB//////////////AAAAAAA//////////////4
AAAAAAP/////////////+AAAAAAD//////////////wAAAAAB//////////////8AAAAAA//////////
/////gAAAAAP//////////////4AAAAAH///////////////AAAAAB///////////////wAAAAA/////
//////////+AAAAAP///////////////gAAAAH///////////////8AAAAB////////////////AAAAA
////////////////4AAAAP///////////////+AAAAH////////////////wAAAB////////////////
+AAAA/////////////////wAAA//////////////////AAAf/////////////////wAAH///////////
//////8AAD//////////////////AAA//////////////////4AAf//////////////////AAP//////
////////////4AH///////////////////wH////////////////////////////////////////////
//////////////////////////////////8=
</value>
</data>
</root>
\ No newline at end of file
using BLL;
using log4net.Config;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace AGVControl
{
static class Program
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
Application.ThreadException += Application_ThreadException;
AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
XmlConfigurator.Configure();
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
//程序只能运行一次
Process current = Process.GetCurrentProcess();
Process[] processes = Process.GetProcessesByName(current.ProcessName);
foreach (Process process in processes)
{
if (process.Id == current.Id) continue; //自己
if (process.MainModule.FileName == current.MainModule.FileName)
{
//显示已打开的程序
API.ShowWindow(process.MainWindowHandle, API.SW_RESTORE);
API.SwitchToThisWindow(process.MainWindowHandle, true);
return;
}
}
Common.log = log4net.LogManager.GetLogger("AgvServer");
Common.log.Info("=====程序开始=====");
ReadConfig();
Common.linePlace = new List<string>();
Common.mir = new MiR_API();
Common.control = new BLL.Control();
Common.control.Start();
Common.server = new AgvServer();
Common.server.Start();
Common.web = new WebService();
Common.web.Open(Common.appConfig.AppSettings.Settings["WebService"].Value);
Application.Run(new FrmMain());
Common.control.Stop();
Common.server.Stop();
Common.web.Close();
Common.log.Info("=====程序结束=====\r\n");
}
private static void ReadConfig()
{
string path;
string[] line;
string[] temp;
bool isuse;
Common.appConfig = System.Configuration.ConfigurationManager.OpenExeConfiguration(System.Configuration.ConfigurationUserLevel.None);
Common.agvInfo = new List<Agv_Info>();
path = Common.CONFIG_PATH + "AgvName.csv";
line = System.IO.File.ReadAllLines(path);
for (int i = 0; i < line.Length; i++)
{
temp = line[i].Split(',');
if (temp.Length != 4) continue;
isuse = Convert.ToBoolean(Common.appConfig.AppSettings.Settings[temp[1]].Value);
Common.agvInfo.Add(new Agv_Info(temp[0], temp[1], temp[2], temp[3], isuse));
}
Common.agvMission = new Dictionary<string, string>();
path = Common.CONFIG_PATH + "AgvMission.csv";
line = System.IO.File.ReadAllLines(path);
for (int i = 0; i < line.Length; i++)
{
temp = line[i].Split(',');
if (temp.Length != 2) continue;
Common.agvMission.Add(temp[0], temp[1]);
}
Common.agvProductionLine = new Dictionary<string, string>();
path = Common.CONFIG_PATH + "AgvProductionLine.csv";
line = System.IO.File.ReadAllLines(path);
for (int i = 0; i < line.Length; i++)
{
temp = line[i].Split(',');
if (temp.Length != 2) continue;
Common.agvProductionLine.Add(temp[0], temp[1]);
}
Common.itsHttp = Common.appConfig.AppSettings.Settings["ITS"].Value;
Common.nodeInfo = new List<ClientNode>
{
new ClientNode("A5", Convert.ToBoolean(Common.appConfig.AppSettings.Settings["A5"].Value)),
new ClientNode("A6", Convert.ToBoolean(Common.appConfig.AppSettings.Settings["A6"].Value)),
new ClientNode("E1", Convert.ToBoolean(Common.appConfig.AppSettings.Settings["E1"].Value)),
new ClientNode("E2", Convert.ToBoolean(Common.appConfig.AppSettings.Settings["E2"].Value)),
new ClientNode("E3", Convert.ToBoolean(Common.appConfig.AppSettings.Settings["E3"].Value)),
new ClientNode("E4", Convert.ToBoolean(Common.appConfig.AppSettings.Settings["E4"].Value)),
new ClientNode("E5", Convert.ToBoolean(Common.appConfig.AppSettings.Settings["E5"].Value)),
new ClientNode("E6", Convert.ToBoolean(Common.appConfig.AppSettings.Settings["E6"].Value)),
new ClientNode("E8", Convert.ToBoolean(Common.appConfig.AppSettings.Settings["E8"].Value)),
new ClientNode("E9", Convert.ToBoolean(Common.appConfig.AppSettings.Settings["E9"].Value)),
new ClientNode("E10", Convert.ToBoolean(Common.appConfig.AppSettings.Settings["E10"].Value)),
new ClientNode("E11", Convert.ToBoolean(Common.appConfig.AppSettings.Settings["E11"].Value)),
new ClientNode("E12", Convert.ToBoolean(Common.appConfig.AppSettings.Settings["E12"].Value)),
new ClientNode("E14", Convert.ToBoolean(Common.appConfig.AppSettings.Settings["E14"].Value)),
new ClientNode("E15", Convert.ToBoolean(Common.appConfig.AppSettings.Settings["E15"].Value)),
new ClientNode("E16", Convert.ToBoolean(Common.appConfig.AppSettings.Settings["E16"].Value)),
new ClientNode("E21", Convert.ToBoolean(Common.appConfig.AppSettings.Settings["E21"].Value)),
new ClientNode("E22", Convert.ToBoolean(Common.appConfig.AppSettings.Settings["E22"].Value))
};
}
private static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
Common.log.Error("CurrentDomain_UnhandledException", (Exception)e.ExceptionObject);
}
private static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
{
Common.log.Error("Application_ThreadException", e.Exception);
}
}
}
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// 有关程序集的一般信息由以下
// 控制。更改这些特性值可修改
// 与程序集关联的信息。
[assembly: AssemblyTitle("AGVControl-ProductionLine")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("AGVControl-ProductionLine")]
[assembly: AssemblyCopyright("Copyright © 2020")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// 将 ComVisible 设置为 false 会使此程序集中的类型
//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型
//请将此类型的 ComVisible 特性设置为 true。
[assembly: ComVisible(false)]
// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
[assembly: Guid("e1c3207d-c67d-4b46-a9db-d182f2074ccb")]
// 程序集的版本信息由下列四个值组成:
//
// 主版本
// 次版本
// 生成号
// 修订号
//
//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值
//通过使用 "*",如下所示:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
//------------------------------------------------------------------------------
// <auto-generated>
// 此代码由工具生成。
// 运行时版本:4.0.30319.42000
//
// 对此文件的更改可能会导致不正确的行为,并且如果
// 重新生成代码,这些更改将会丢失。
// </auto-generated>
//------------------------------------------------------------------------------
namespace AGVControl.Properties {
using System;
/// <summary>
/// 一个强类型的资源类,用于查找本地化的字符串等。
/// </summary>
// 此类是由 StronglyTypedResourceBuilder
// 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。
// 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen
// (以 /str 作为命令选项),或重新生成 VS 项目。
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources {
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Resources() {
}
/// <summary>
/// 返回此类使用的缓存的 ResourceManager 实例。
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager {
get {
if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("AGVControl.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// 重写当前线程的 CurrentUICulture 属性
/// 重写当前线程的 CurrentUICulture 属性。
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set {
resourceCulture = value;
}
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>
\ No newline at end of file
//------------------------------------------------------------------------------
// <auto-generated>
// 此代码由工具生成。
// 运行时版本:4.0.30319.42000
//
// 对此文件的更改可能会导致不正确的行为,并且如果
// 重新生成代码,这些更改将会丢失。
// </auto-generated>
//------------------------------------------------------------------------------
namespace AGVControl.Properties {
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.5.0.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
public static Settings Default {
get {
return defaultInstance;
}
}
}
}
<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)">
<Profiles>
<Profile Name="(Default)" />
</Profiles>
<Settings />
</SettingsFile>
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
</configSections>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
</startup>
<log4net>
<appender name="AgvServer" type="log4net.Appender.RollingFileAppender">
<file value="logs/AgvServer.log"/>
<param name="Encoding" value="UTF-8"/>
<appendToFile value="true"/>
<rollingStyle value="Date"/>
<datePattern value="yyyy-MM-dd"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="[%date][%t]%-5p %m%n"/>
</layout>
</appender>
<root>
<level value="Debug"/>
<appender-ref ref="AgvServer"/>
</root>
</log4net>
<appSettings>
<add key="ITS" value="http://10.85.17.233/ESMTCommonInterface/CommonService.asmx/VMIGetBoxDestInfo?boxRFID=" />
<add key="WebService" value="http://127.0.0.1/Webservice/AGVService/"/>
<add key="FLEET" value="10.85.199.3"/>
<!--<add key="LocalIP" value="192.168.103.12"/>
<add key="AutoCharge" value="false"/>
<add key="ChargeWait" value="1"/>
<add key="ChargeThreshold" value="20,70"/>-->
<add key="MiR_R1763" value="false"/>
<add key="MiR_R1764" value="false"/>
<add key="MiR_R1767" value="false"/>
<add key="MiR_R1768" value="false"/>
<add key="A5" value="false"/>
<add key="A6" value="false"/>
<add key="E1" value="false"/>
<add key="E2" value="false"/>
<add key="E3" value="false"/>
<add key="E4" value="false"/>
<add key="E5" value="false"/>
<add key="E6" value="false"/>
<add key="E8" value="false"/>
<add key="E9" value="false"/>
<add key="E10" value="false"/>
<add key="E11" value="false"/>
<add key="E12" value="false"/>
<add key="E14" value="false"/>
<add key="E15" value="false"/>
<add key="E16" value="false"/>
<add key="E21" value="false"/>
<add key="E22" value="false"/>
</appSettings>
</configuration>
\ No newline at end of file
MoveA5,
MoveA6,
MoveE1,
MoveE2,
MoveE3,
MoveE4,
MoveE5,
MoveE6,
MoveE7,
MoveE8,
MoveE9,
MoveE10,
MoveE11,
MoveE12,
MoveE13,
MoveE14,
MoveE15,
MoveE16,
MoveE21,
MoveE22,
\ No newline at end of file
7,MiR_R1763,10.85.199.55,Basic ZGlzdHJpYnV0b3I6NjJmMmYwZjFlZmYxMGQzMTUyYzk1ZjZmMDU5NjU3NmU0ODJiYjhlNDQ4MDY0MzNmNGNmOTI5NzkyODM0YjAxNA==
8,MiR_R1764,10.85.199.56,Basic ZGlzdHJpYnV0b3I6NjJmMmYwZjFlZmYxMGQzMTUyYzk1ZjZmMDU5NjU3NmU0ODJiYjhlNDQ4MDY0MzNmNGNmOTI5NzkyODM0YjAxNA==
9,MiR_R1767,10.85.199.57,Basic ZGlzdHJpYnV0b3I6NjJmMmYwZjFlZmYxMGQzMTUyYzk1ZjZmMDU5NjU3NmU0ODJiYjhlNDQ4MDY0MzNmNGNmOTI5NzkyODM0YjAxNA==
10,MiR_R1768,10.85.199.58,Basic ZGlzdHJpYnV0b3I6NjJmMmYwZjFlZmYxMGQzMTUyYzk1ZjZmMDU5NjU3NmU0ODJiYjhlNDQ4MDY0MzNmNGNmOTI5NzkyODM0YjAxNA==
\ No newline at end of file
D1,E1
D2,E2
D3,E3
D4,E4
D5,E5
D6,E6
D7,E7
D8,E8
D9,E9
D10,E10
D11,E11
D12,E12
D13,E13
D14,E14
D15,E15
D16,E16
FeederIn,E21
FeederOut,E22
\ No newline at end of file
此文件的差异太大,无法显示。
[2020-06-17 17:01:26,538][1]INFO =====程序开始=====
[2020-06-17 17:01:26,570][1]INFO Server Start
[2020-06-17 17:01:35,111][5]INFO 服务端关闭连接,退出阻塞Accept
[2020-06-17 17:01:35,156][1]INFO Server Stop
[2020-06-17 17:01:35,156][1]INFO =====程序结束=====
[2020-06-17 17:07:39,662][1]INFO =====程序开始=====
[2020-06-17 17:07:39,697][1]INFO Server Start
[2020-06-17 17:07:55,781][5]INFO 服务端关闭连接,退出阻塞Accept
[2020-06-17 17:07:55,827][1]INFO Server Stop
[2020-06-17 17:07:57,276][1]INFO =====程序结束=====
[2020-06-18 09:07:35,336][1]INFO =====程序开始=====
[2020-06-18 09:07:35,413][1]INFO Server Start
[2020-06-18 09:07:37,717][3]INFO Ping 192.168.0.1 请求没有响应
[2020-06-18 09:07:40,207][3]INFO Ping 192.168.0.2 请求没有响应
[2020-06-18 09:07:42,707][3]INFO Ping 192.168.0.3 请求没有响应
[2020-06-18 09:07:45,207][3]INFO Ping 192.168.0.4 请求没有响应
[2020-06-18 09:07:47,707][3]INFO Ping 192.168.0.1 请求没有响应
[2020-06-18 09:07:50,207][3]INFO Ping 192.168.0.2 请求没有响应
[2020-06-18 09:07:51,531][5]INFO 服务端关闭连接,退出阻塞Accept
[2020-06-18 09:07:51,535][1]INFO Server Stop
[2020-06-18 09:07:51,535][1]INFO =====程序结束=====
[2020-06-18 09:07:52,707][3]INFO Ping 192.168.0.3 请求没有响应
[2020-06-18 09:07:55,207][3]INFO Ping 192.168.0.4 请求没有响应
[2020-06-18 10:29:57,766][1]INFO =====程序开始=====
[2020-06-18 10:29:57,828][1]INFO Server Start
[2020-06-18 10:30:00,709][3]INFO Ping 192.168.0.1 请求没有响应
[2020-06-18 10:30:02,916][3]INFO Ping 192.168.0.2 请求没有响应
[2020-06-18 10:30:06,291][3]INFO Ping 192.168.0.3 请求没有响应
[2020-06-18 10:30:09,399][3]INFO Ping 192.168.0.4 请求没有响应
[2020-06-18 10:30:13,717][3]INFO Ping 192.168.0.1 请求没有响应
[2020-06-18 10:30:16,233][3]INFO Ping 192.168.0.2 请求没有响应
[2020-06-18 10:30:21,614][3]INFO Ping 192.168.0.3 请求没有响应
[2020-06-18 10:30:23,206][3]INFO Ping 192.168.0.4 请求没有响应
[2020-06-18 10:30:26,207][3]INFO Ping 192.168.0.1 请求没有响应
[2020-06-18 10:30:28,207][3]INFO Ping 192.168.0.2 请求没有响应
[2020-06-18 10:30:30,207][3]INFO Ping 192.168.0.3 请求没有响应
[2020-06-18 10:30:32,207][3]INFO Ping 192.168.0.4 请求没有响应
[2020-06-18 10:30:35,207][3]INFO Ping 192.168.0.1 请求没有响应
[2020-06-18 10:30:37,207][3]INFO Ping 192.168.0.2 请求没有响应
[2020-06-18 10:30:39,206][3]INFO Ping 192.168.0.3 请求没有响应
[2020-06-18 10:30:40,757][5]INFO 服务端关闭连接,退出阻塞Accept
[2020-06-18 10:30:40,801][1]INFO Server Stop
[2020-06-18 10:30:40,801][1]INFO =====程序结束=====
[2020-06-18 10:30:41,206][3]INFO Ping 192.168.0.4 请求没有响应
[2020-06-18 10:31:10,817][1]INFO =====程序开始=====
[2020-06-18 10:31:10,870][1]INFO Server Start
[2020-06-18 10:31:14,115][3]INFO Ping 192.168.0.1 请求没有响应
[2020-06-18 10:31:15,868][3]INFO Ping 192.168.0.2 请求没有响应
[2020-06-18 10:31:21,686][3]INFO Ping 192.168.0.3 请求没有响应
[2020-06-18 10:31:27,474][3]INFO Ping 192.168.0.4 请求没有响应
[2020-06-18 10:31:30,207][3]INFO Ping 192.168.0.1 请求没有响应
[2020-06-18 10:31:32,207][3]INFO Ping 192.168.0.2 请求没有响应
[2020-06-18 10:31:34,206][3]INFO Ping 192.168.0.3 请求没有响应
[2020-06-18 10:31:35,717][5]INFO 服务端关闭连接,退出阻塞Accept
[2020-06-18 10:31:35,761][1]INFO Server Stop
[2020-06-18 10:31:35,761][1]INFO =====程序结束=====
[2020-06-18 10:31:36,207][3]INFO Ping 192.168.0.4 请求没有响应
此文件类型无法预览
D:\OneDrive - 上海挚锦科技有限公司\SMD\AGVControl-Qisda-ProductionLine\AGVControl-ProductionLine\AGVControl-ProductionLine\bin\Debug\AGVControl-ProductionLine.exe.config
D:\OneDrive - 上海挚锦科技有限公司\SMD\AGVControl-Qisda-ProductionLine\AGVControl-ProductionLine\AGVControl-ProductionLine\bin\Debug\AGVControl-ProductionLine.exe
D:\OneDrive - 上海挚锦科技有限公司\SMD\AGVControl-Qisda-ProductionLine\AGVControl-ProductionLine\AGVControl-ProductionLine\bin\Debug\AGVControl-ProductionLine.pdb
D:\OneDrive - 上海挚锦科技有限公司\SMD\AGVControl-Qisda-ProductionLine\AGVControl-ProductionLine\AGVControl-ProductionLine\obj\Debug\AGVControl-ProductionLine.csprojAssemblyReference.cache
D:\OneDrive - 上海挚锦科技有限公司\SMD\AGVControl-Qisda-ProductionLine\AGVControl-ProductionLine\AGVControl-ProductionLine\obj\Debug\AGVControl_ProductionLine.Properties.Resources.resources
D:\OneDrive - 上海挚锦科技有限公司\SMD\AGVControl-Qisda-ProductionLine\AGVControl-ProductionLine\AGVControl-ProductionLine\obj\Debug\AGVControl-ProductionLine.csproj.GenerateResource.cache
D:\OneDrive - 上海挚锦科技有限公司\SMD\AGVControl-Qisda-ProductionLine\AGVControl-ProductionLine\AGVControl-ProductionLine\obj\Debug\AGVControl-ProductionLine.csproj.CoreCompileInputs.cache
D:\OneDrive - 上海挚锦科技有限公司\SMD\AGVControl-Qisda-ProductionLine\AGVControl-ProductionLine\AGVControl-ProductionLine\obj\Debug\AGVControl-ProductionLine.exe
D:\OneDrive - 上海挚锦科技有限公司\SMD\AGVControl-Qisda-ProductionLine\AGVControl-ProductionLine\AGVControl-ProductionLine\obj\Debug\AGVControl-ProductionLine.pdb
D:\OneDrive - 上海挚锦科技有限公司\SMD\AGVControl-Qisda-ProductionLine\AGVControl-ProductionLine\bin\Debug\AGVControl-ProductionLine.exe.config
D:\OneDrive - 上海挚锦科技有限公司\SMD\AGVControl-Qisda-ProductionLine\AGVControl-ProductionLine\bin\Debug\AGVControl-ProductionLine.exe
D:\OneDrive - 上海挚锦科技有限公司\SMD\AGVControl-Qisda-ProductionLine\AGVControl-ProductionLine\bin\Debug\AGVControl-ProductionLine.pdb
D:\OneDrive - 上海挚锦科技有限公司\SMD\AGVControl-Qisda-ProductionLine\AGVControl-ProductionLine\bin\Debug\log4net.dll
D:\OneDrive - 上海挚锦科技有限公司\SMD\AGVControl-Qisda-ProductionLine\AGVControl-ProductionLine\bin\Debug\RestSharp.dll
D:\OneDrive - 上海挚锦科技有限公司\SMD\AGVControl-Qisda-ProductionLine\AGVControl-ProductionLine\bin\Debug\RestSharp.xml
D:\OneDrive - 上海挚锦科技有限公司\SMD\AGVControl-Qisda-ProductionLine\AGVControl-ProductionLine\obj\Debug\AGVControl.FrmMain.resources
D:\OneDrive - 上海挚锦科技有限公司\SMD\AGVControl-Qisda-ProductionLine\AGVControl-ProductionLine\obj\Debug\AGVControl.Properties.Resources.resources
D:\OneDrive - 上海挚锦科技有限公司\SMD\AGVControl-Qisda-ProductionLine\AGVControl-ProductionLine\obj\Debug\AGVControl-ProductionLine.csproj.GenerateResource.cache
D:\OneDrive - 上海挚锦科技有限公司\SMD\AGVControl-Qisda-ProductionLine\AGVControl-ProductionLine\obj\Debug\AGVControl-ProductionLine.csproj.CoreCompileInputs.cache
D:\OneDrive - 上海挚锦科技有限公司\SMD\AGVControl-Qisda-ProductionLine\AGVControl-ProductionLine\obj\Debug\AGVControl-ProductionLine.csproj.CopyComplete
D:\OneDrive - 上海挚锦科技有限公司\SMD\AGVControl-Qisda-ProductionLine\AGVControl-ProductionLine\obj\Debug\AGVControl-ProductionLine.exe
D:\OneDrive - 上海挚锦科技有限公司\SMD\AGVControl-Qisda-ProductionLine\AGVControl-ProductionLine\obj\Debug\AGVControl-ProductionLine.pdb
D:\OneDrive - 上海挚锦科技有限公司\SMD\AGVControl-Qisda-ProductionLine\AGVControl-ProductionLine\obj\Debug\AGVControl-ProductionLine.csprojAssemblyReference.cache
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="RestSharp" version="106.11.4" targetFramework="net461" />
</packages>
\ No newline at end of file
此文件类型无法预览
using Microsoft.Win32.SafeHandles;
using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Threading;
namespace AsaPL
{
/// <summary>
/// AGV客户端,对接双层线、生产线
/// </summary>
public class AgvClient
{
private bool _loop;
private Socket _client; //客户端
private List<ClientNode> _node;
private int countRecon; //重连次数
private Thread tSend; //发送线程
private Thread tListen; //监听网络线程
private Thread tRecon; //重连线程
private readonly log4net.ILog LOG;
private readonly string IP; //远程IP地址
private const int PORT = 12001; //端口
private const int SEND_INTERVAL = 2000; //客户端发送所有节点后的间隔
/// <summary>
/// 小车动作事件
/// </summary>
public delegate void ActionEvent(string name);
/// <summary>
/// 小车已准备好,料架准备进入流水线
/// </summary>
public event ActionEvent ReadyEnter;
/// <summary>
/// 小车已准备好,料架准备流出流水线
/// </summary>
public event ActionEvent ReadyLeave;
/// <summary>
/// AGV客户端,对接双层线、生产线
/// </summary>
/// <param name="serverIP">服务器IP地址</param>
/// <param name="logName"></param>
public AgvClient(string serverIP, string logName = "AgvClient")
{
IP = serverIP;
_node = new List<ClientNode>();
LOG = log4net.LogManager.GetLogger(logName);
}
/// <summary>
/// 是否连接服务器
/// </summary>
public bool IsConn { private set; get; } = false;
/// <summary>
/// 取消状态,true发送none,false发送实际状态
/// </summary>
public bool CancelState { set; get; } = false;
/// <summary>
/// 连接
/// </summary>
public void Connect()
{
countRecon = 0;
_loop = true;
IsConn = false;
tRecon = new Thread(new ThreadStart(Reconnect));
tListen = new Thread(new ThreadStart(ListenNet));
tSend = new Thread(new ThreadStart(SendStatus));
tRecon.Start();
tListen.Start();
tSend.Start();
LOG.Info("Connect");
}
/// <summary>
/// 关闭
/// </summary>
public void Close()
{
_loop = false;
IsConn = false;
if (_client != null)
{
_client.Close();
_client = null;
}
LOG.Info("Close");
}
/// <summary>
/// 设置状态
/// </summary>
/// <param name="name">节点名称</param>
/// <param name="rfid">RFID</param>
/// <param name="action"></param>
/// <param name="level"></param>
public void SetStatus(string name, string rfid = "", ClientAction action = ClientAction.None, ClientLevel level = ClientLevel.Low)
{
int idx = _node.FindIndex(s => s.Name.Equals(name));
if (idx == -1)
{
ClientNode node = new ClientNode(name, rfid, action, level);
_node.Add(node);
idx = _node.Count - 1;
}
else
{
_node[idx].RFID = rfid;
_node[idx].Action = action;
_node[idx].Level = level;
}
LOG.Info("SetStatus " + _node[idx].ToText());
}
/// <summary>
/// 允许进入
/// </summary>
/// <param name="name"></param>
public void MayEnter(string name)
{
LOG.Info(name + " MayEnter");
ClientNode node = new ClientNode(name, "", ClientAction.MayEnter, ClientLevel.High);
byte[] buff = Encode(node);
bool bln = Send(buff);
}
/// <summary>
/// 允许离开
/// </summary>
/// <param name="name"></param>
public void MayLeave(string name)
{
LOG.Info(name + " MayLeave");
ClientNode node = new ClientNode(name, "", ClientAction.MayLeave, ClientLevel.High);
byte[] buff = Encode(node);
bool bln = Send(buff);
}
/// <summary>
/// 完成进入
/// </summary>
/// <param name="name"></param>
public void FinishEnter(string name)
{
LOG.Info(name + " FinishEnter");
ClientNode node = new ClientNode(name, "", ClientAction.FinishEnter, ClientLevel.High);
byte[] buff = Encode(node);
bool bln = Send(buff);
}
/// <summary>
/// 完成离开
/// </summary>
/// <param name="name"></param>
public void FinishLeave(string name)
{
LOG.Info(name + " FinishLeave");
ClientNode node = new ClientNode(name, "", ClientAction.FinishLeave, ClientLevel.High);
byte[] buff = Encode(node);
bool bln = Send(buff);
}
/// <summary>
/// 重连线程
/// </summary>
private void Reconnect()
{
while (_loop)
{
if (!IsConn)
{
Open();
if (IsConn)
{
countRecon = 0;
LOG.Info("Server connection successful");
}
else
{
LOG.Info("Server connection failed " + ++countRecon + " times");
}
}
Thread.Sleep(1000);
}
}
/// <summary>
/// 打开,连接到服务器
/// </summary>
private void Open()
{
try
{
LOG.Info("Connect " + IP + ":" + PORT);
if (CheckIP(IP))
{
_client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
_client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.SendTimeout, 2000);
_client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 2000);
_client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.NoDelay, 1);
_client.Connect(IPAddress.Parse(IP), PORT);
if (!_loop) return;
IsConn = true;
LOG.Info("Connect OK");
}
}
catch (Exception ex)
{
IsConn = false;
LOG.Error("Open()", ex);
}
}
/// <summary>
/// 监听线程
/// </summary>
private void ListenNet()
{
byte[] temp = new byte[200];
while (_loop)
{
Thread.Sleep(100);
if (!IsConn) continue;
if (_client == null) continue;
try
{
if (_client.Available > 0)
{
int count = _client.Receive(temp);
byte[] _buffer = new byte[count];
Array.Copy(temp, 0, _buffer, 0, count);
ClientNode node = Decode(_buffer);
if (node == null)
{
LOG.Info("Command decoding failed: " + HexBuff(_buffer));
}
else
{
LOG.Info("From server: " + node.ToText());
Resolve(node);
}
}
}
catch (Exception ex)
{
IsConn = false;
LOG.Error("ListenNet()", ex);
}
}
}
/// <summary>
/// 分析数据包
/// </summary>
/// <param name="result"></param>
private void Resolve(ClientNode result)
{
try
{
if (result.Action == ClientAction.ReadyEnter)
{
LOG.Info("Trigger ReadyEnter Event");
ReadyEnter?.Invoke(result.Name);
}
else if (result.Action == ClientAction.ReadyLeave)
{
LOG.Info("Trigger ReadyLeave Event");
ReadyLeave?.Invoke(result.Name);
}
}
catch (Exception ex)
{
LOG.Error("Resolve()", ex);
}
}
/// <summary>
/// 连续发送状态线程
/// </summary>
private void SendStatus()
{
while (_loop)
{
if (!IsConn) continue;
Thread.Sleep(SEND_INTERVAL);
if (!IsConn) continue;
for (int i = 0; i < _node.Count; i++)
{
if (!_loop) break;
Thread.Sleep(100);
byte[] buff = Encode(_node[i]);
bool bln = Send(buff);
if (!bln)
{
IsConn = false;
break;
}
}
}
}
/// <summary>
/// 发送命令
/// </summary>
/// <param name="buff"></param>
/// <returns></returns>
private bool Send(byte[] buff)
{
if (!IsConn)
{
LOG.Info("服务器没有连接");
return false;
}
try
{
_client.Send(buff);
LOG.Debug("Send: " + HexBuff(buff));
return true;
}
catch (Exception ex)
{
LOG.Error("Send()", ex);
IsConn = false;
return false;
}
}
/// <summary>
/// 编码
/// </summary>
/// <param name="node"></param>
/// <returns></returns>
private byte[] Encode(ClientNode node)
{
int idx = 0;
byte[] buff = new byte[12];
buff[idx++] = 0xAD;
buff[idx++] = (byte)node.Name[0];
buff[idx++] = Convert.ToByte(node.Name.Substring(1));
buff[idx++] = (byte)node.RFID[0];
buff[idx++] = Convert.ToByte(node.RFID.Substring(1));
if (CancelState)
buff[idx++] = (byte)ClientAction.None;
else
buff[idx++] = (byte)node.Action;
buff[idx++] = (byte)node.Level;
idx += 4; //预留
buff[idx] = 0xDA;
return buff;
}
/// <summary>
/// 解码
/// </summary>
/// <param name="buff"></param>
/// <returns></returns>
private ClientNode Decode(byte[] buff)
{
int idx = 0;
if (buff[idx++] != 0xAD) return null;
string name = (char)buff[idx] + buff[idx + 1].ToString();
idx += 2;
string rfid = (char)buff[idx] + buff[idx + 1].ToString();
idx += 2;
ClientAction action = (ClientAction)buff[idx++];
ClientLevel level = (ClientLevel)buff[idx++];
idx += 4; //预留
if (buff[idx] != 0xDA) return null;
ClientNode node = new ClientNode(name, rfid, action, level);
return node;
}
/// <summary>
/// 16进制
/// </summary>
/// <param name="buff"></param>
/// <returns></returns>
private string HexBuff(byte[] buff)
{
string s = "";
if (buff == null) return s;
for (int i = 0; i < buff.Length; i++)
s += buff[i].ToString("X2") + " ";
return s;
}
/// <summary>
/// 检查IP地址
/// </summary>
/// <param name="ip"></param>
/// <returns></returns>
private bool CheckIP(string ip)
{
//IP合法
string pattern = @"^((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)$";
bool rtn = System.Text.RegularExpressions.Regex.IsMatch(ip, pattern);
if (!rtn)
{
LOG.Info("Illegal IP address " + ip);
return false;
}
//Ping服务端
try
{
System.Net.NetworkInformation.Ping ping = new System.Net.NetworkInformation.Ping();
System.Net.NetworkInformation.PingReply result = ping.Send(ip, 2000);
ping.Dispose();
if (result.Status != System.Net.NetworkInformation.IPStatus.Success)
{
LOG.Info("Ping " + ip + " request timeout");
return false;
}
return true;
}
catch (Exception ex)
{
LOG.Error("CheckIP()", ex);
return false;
}
}
}
/// <summary>
/// 客户端的节点
/// </summary>
public class ClientNode
{
private string rfid = "00";
/// <summary>
/// 节点名称
/// </summary>
public string Name { set; get; }
/// <summary>
/// RFID
/// </summary>
public string RFID
{
set
{
if (value.Length < 2)
rfid = value.PadLeft(2, '0');
else
rfid = value;
}
get
{
return rfid;
}
}
/// <summary>
/// 动作
/// </summary>
public ClientAction Action { set; get; }
/// <summary>
/// 优先级
/// </summary>
public ClientLevel Level { set; get; }
/// <summary>
/// 客户端节点
/// </summary>
/// <param name="name"></param>
/// <param name="rfid"></param>
/// <param name="action"></param>
/// <param name="level"></param>
public ClientNode(string name, string rfid, ClientAction action, ClientLevel level)
{
Name = name;
RFID = rfid;
Action = action;
Level = level;
}
/// <summary>
/// 所有属性的文本形式
/// </summary>
/// <returns></returns>
public string ToText()
{
string s = string.Format("Name={0}, Action={1}, Level={2}", Name, Action, Level);
return s;
}
}
/// <summary>
/// 客户端的动作
/// </summary>
public enum ClientAction : byte
{
/// <summary>
/// 没有动作
/// </summary>
None = 0,
/// <summary>
/// 需要7寸D料架
/// </summary>
NeedD = 1,
/// <summary>
/// 需要大尺寸C料架
/// </summary>
NeedC = 2,
/// <summary>
/// 需要进入料架
/// </summary>
NeedEnter = 3,
/// <summary>
/// 需要出去料架
/// </summary>
NeedLeave = 4,
/// <summary>
/// 需要进入离开料架
/// </summary>
NeedEnterLeave = 5,
/// <summary>
/// 准备进入,服务器发送
/// </summary>
ReadyEnter = 6,
/// <summary>
/// 可以进入料架
/// </summary>
MayEnter = 7,
/// <summary>
/// 完成进入料架
/// </summary>
FinishEnter = 8,
/// <summary>
/// 准备离开,服务器发送
/// </summary>
ReadyLeave = 9,
/// <summary>
/// 可以出去料架
/// </summary>
MayLeave = 10,
/// <summary>
/// 完成出去料架
/// </summary>
FinishLeave = 11,
}
/// <summary>
/// 客户端的优先级
/// </summary>
public enum ClientLevel : byte
{
/// <summary>
/// 低
/// </summary>
Low = 0,
/// <summary>
/// 中等
/// </summary>
Middle = 1,
/// <summary>
/// 高
/// </summary>
High = 2
}
}
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{D9154766-67B0-4082-AF8B-DCC7C4CFB5A2}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>AgvClient</RootNamespace>
<AssemblyName>AsaPL.AgvClient</AssemblyName>
<TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<Deterministic>true</Deterministic>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="log4net">
<HintPath>..\..\..\DLL\log4net.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="AgvClient.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>
\ No newline at end of file
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// 有关程序集的一般信息由以下
// 控制。更改这些特性值可修改
// 与程序集关联的信息。
[assembly: AssemblyTitle("AgvClient")]
[assembly: AssemblyDescription("AGV对接双层线生产线客户端")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("挚锦科技")]
[assembly: AssemblyProduct("AgvClient")]
[assembly: AssemblyCopyright("Copyright © 2020")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// 将 ComVisible 设置为 false 会使此程序集中的类型
//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型
//请将此类型的 ComVisible 特性设置为 true。
[assembly: ComVisible(false)]
// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
[assembly: Guid("d9154766-67b0-4082-af8b-dcc7c4cfb5a2")]
// 程序集的版本信息由下列四个值组成:
//
// 主版本
// 次版本
// 生成号
// 修订号
//
//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值
//通过使用 "*",如下所示:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.1")]
[assembly: AssemblyFileVersion("1.0.0.1")]
此文件类型无法预览
此文件类型无法预览
此文件类型无法预览
D:\OneDrive - 上海挚锦科技有限公司\SMD\AGVControl-Qisda-ProductionLine\AgvClient_DL\bin\Debug\AgvClient_DL.dll
D:\OneDrive - 上海挚锦科技有限公司\SMD\AGVControl-Qisda-ProductionLine\AgvClient_DL\bin\Debug\AgvClient_DL.pdb
D:\OneDrive - 上海挚锦科技有限公司\SMD\AGVControl-Qisda-ProductionLine\AgvClient_DL\bin\Debug\log4net.dll
D:\OneDrive - 上海挚锦科技有限公司\SMD\AGVControl-Qisda-ProductionLine\AgvClient_DL\obj\Debug\AgvClient.csprojAssemblyReference.cache
D:\OneDrive - 上海挚锦科技有限公司\SMD\AGVControl-Qisda-ProductionLine\AgvClient_DL\obj\Debug\AgvClient.csproj.CoreCompileInputs.cache
D:\OneDrive - 上海挚锦科技有限公司\SMD\AGVControl-Qisda-ProductionLine\AgvClient_DL\obj\Debug\AgvClient.csproj.CopyComplete
D:\OneDrive - 上海挚锦科技有限公司\SMD\AGVControl-Qisda-ProductionLine\AgvClient_DL\obj\Debug\AgvClient_DL.dll
D:\OneDrive - 上海挚锦科技有限公司\SMD\AGVControl-Qisda-ProductionLine\AgvClient_DL\obj\Debug\AgvClient_DL.pdb
D:\OneDrive - 上海挚锦科技有限公司\SMD\AGVControl-Qisda-ProductionLine\AgvClient\bin\Debug\log4net.dll
D:\OneDrive - 上海挚锦科技有限公司\SMD\AGVControl-Qisda-ProductionLine\AgvClient\obj\Debug\AgvClient.csproj.CoreCompileInputs.cache
D:\OneDrive - 上海挚锦科技有限公司\SMD\AGVControl-Qisda-ProductionLine\AgvClient\obj\Debug\AgvClient.csproj.CopyComplete
D:\OneDrive - 上海挚锦科技有限公司\SMD\AGVControl-Qisda-ProductionLine\AgvClient\bin\Debug\AsaPL.AgvClient.dll
D:\OneDrive - 上海挚锦科技有限公司\SMD\AGVControl-Qisda-ProductionLine\AgvClient\bin\Debug\AsaPL.AgvClient.pdb
D:\OneDrive - 上海挚锦科技有限公司\SMD\AGVControl-Qisda-ProductionLine\AgvClient\obj\Debug\AsaPL.AgvClient.dll
D:\OneDrive - 上海挚锦科技有限公司\SMD\AGVControl-Qisda-ProductionLine\AgvClient\obj\Debug\AsaPL.AgvClient.pdb
此文件类型无法预览
此文件类型无法预览
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{E1C0827A-FA12-49A9-AC71-6D3E6518754A}</ProjectGuid>
<OutputType>WinExe</OutputType>
<RootNamespace>AgvClientTest</RootNamespace>
<AssemblyName>AgvClientTest</AssemblyName>
<TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
<Deterministic>true</Deterministic>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="log4net">
<HintPath>..\..\..\DLL\log4net.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Deployment" />
<Reference Include="System.Drawing" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="Form1.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="Form1.Designer.cs">
<DependentUpon>Form1.cs</DependentUpon>
</Compile>
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<EmbeddedResource Include="Form1.resx">
<DependentUpon>Form1.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
<SubType>Designer</SubType>
</EmbeddedResource>
<Compile Include="Properties\Resources.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
<None Include="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
</None>
<Compile Include="Properties\Settings.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Settings.settings</DependentUpon>
<DesignTimeSharedInput>True</DesignTimeSharedInput>
</Compile>
</ItemGroup>
<ItemGroup>
<None Include="App.config" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\AgvClient\AgvClient.csproj">
<Project>{d9154766-67b0-4082-af8b-dcc7c4cfb5a2}</Project>
<Name>AgvClient</Name>
</ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
</configSections>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
</startup>
<log4net>
<appender name="AgvClient" type="log4net.Appender.RollingFileAppender">
<file value="logs/AgvClient.log"/>
<param name="Encoding" value="UTF-8"/>
<appendToFile value="true"/>
<rollingStyle value="Date"/>
<datePattern value="yyyy-MM-dd"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="[%date][%t]%-5p %m%n"/>
</layout>
</appender>
<root>
<level value="Debug"/>
<appender-ref ref="AgvClient"/>
</root>
</log4net>
</configuration>
\ No newline at end of file
namespace AgvClientTest
{
partial class Form1
{
/// <summary>
/// 必需的设计器变量。
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// 清理所有正在使用的资源。
/// </summary>
/// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows 窗体设计器生成的代码
/// <summary>
/// 设计器支持所需的方法 - 不要修改
/// 使用代码编辑器修改此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.button1 = new System.Windows.Forms.Button();
this.textBox1 = new System.Windows.Forms.TextBox();
this.comboBox1 = new System.Windows.Forms.ComboBox();
this.SuspendLayout();
//
// button1
//
this.button1.Font = new System.Drawing.Font("宋体", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.button1.Location = new System.Drawing.Point(189, 12);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(86, 27);
this.button1.TabIndex = 0;
this.button1.Text = "button1";
this.button1.UseVisualStyleBackColor = true;
this.button1.Click += new System.EventHandler(this.button1_Click);
//
// textBox1
//
this.textBox1.Location = new System.Drawing.Point(240, 91);
this.textBox1.Name = "textBox1";
this.textBox1.Size = new System.Drawing.Size(100, 21);
this.textBox1.TabIndex = 1;
//
// comboBox1
//
this.comboBox1.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.comboBox1.Font = new System.Drawing.Font("宋体", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.comboBox1.FormattingEnabled = true;
this.comboBox1.Location = new System.Drawing.Point(12, 12);
this.comboBox1.Name = "comboBox1";
this.comboBox1.Size = new System.Drawing.Size(171, 27);
this.comboBox1.TabIndex = 2;
//
// Form1
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(800, 450);
this.Controls.Add(this.comboBox1);
this.Controls.Add(this.textBox1);
this.Controls.Add(this.button1);
this.Name = "Form1";
this.Text = "Form1";
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Form1_FormClosing);
this.Load += new System.EventHandler(this.Form1_Load);
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.Button button1;
private System.Windows.Forms.TextBox textBox1;
private System.Windows.Forms.ComboBox comboBox1;
}
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace AgvClientTest
{
public partial class Form1 : Form
{
private AsaPL.AgvClient client;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
for (int i = 0; i < 12; i++)
comboBox1.Items.Add((AsaPL.ClientAction)i);
comboBox1.SelectedIndex = 0;
client = new AsaPL.AgvClient("127.0.0.1");
client.SetStatus("E1", "C6", AsaPL.ClientAction.None);
client.Connect();
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
client.Close();
}
private void button1_Click(object sender, EventArgs e)
{
client.SetStatus("E1", "C6", (AsaPL.ClientAction)comboBox1.SelectedIndex);
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>
\ No newline at end of file
using log4net.Config;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace AgvClientTest
{
static class Program
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
XmlConfigurator.Configure();
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
}
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// 有关程序集的一般信息由以下
// 控制。更改这些特性值可修改
// 与程序集关联的信息。
[assembly: AssemblyTitle("AgvClientTest")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("AgvClientTest")]
[assembly: AssemblyCopyright("Copyright © 2020")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// 将 ComVisible 设置为 false 会使此程序集中的类型
//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型
//请将此类型的 ComVisible 特性设置为 true。
[assembly: ComVisible(false)]
// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
[assembly: Guid("e1c0827a-fa12-49a9-ac71-6d3e6518754a")]
// 程序集的版本信息由下列四个值组成:
//
// 主版本
// 次版本
// 生成号
// 修订号
//
//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值
//通过使用 "*",如下所示:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
//------------------------------------------------------------------------------
// <auto-generated>
// 此代码由工具生成。
// 运行时版本: 4.0.30319.42000
//
// 对此文件的更改可能导致不正确的行为,如果
// 重新生成代码,则所做更改将丢失。
// </auto-generated>
//------------------------------------------------------------------------------
namespace AgvClientTest.Properties
{
/// <summary>
/// 强类型资源类,用于查找本地化字符串等。
/// </summary>
// 此类是由 StronglyTypedResourceBuilder
// 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。
// 若要添加或删除成员,请编辑 .ResX 文件,然后重新运行 ResGen
// (以 /str 作为命令选项),或重新生成 VS 项目。
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources
{
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Resources()
{
}
/// <summary>
/// 返回此类使用的缓存 ResourceManager 实例。
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager
{
get
{
if ((resourceMan == null))
{
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("AgvClientTest.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// 覆盖当前线程的 CurrentUICulture 属性
/// 使用此强类型的资源类的资源查找。
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture
{
get
{
return resourceCulture;
}
set
{
resourceCulture = value;
}
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>
\ No newline at end of file
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace AgvClientTest.Properties
{
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase
{
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
public static Settings Default
{
get
{
return defaultInstance;
}
}
}
}
<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)">
<Profiles>
<Profile Name="(Default)" />
</Profiles>
<Settings />
</SettingsFile>
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
</configSections>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
</startup>
<log4net>
<appender name="AgvClient" type="log4net.Appender.RollingFileAppender">
<file value="logs/AgvClient.log"/>
<param name="Encoding" value="UTF-8"/>
<appendToFile value="true"/>
<rollingStyle value="Date"/>
<datePattern value="yyyy-MM-dd"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="[%date][%t]%-5p %m%n"/>
</layout>
</appender>
<root>
<level value="Debug"/>
<appender-ref ref="AgvClient"/>
</root>
</log4net>
</configuration>
\ No newline at end of file
此文件类型无法预览
[2020-06-17 14:18:25,695][1]INFO SetStatus Name=E1, Action=NeedC, Level=Low
[2020-06-17 14:18:25,726][1]INFO Connect
[2020-06-17 14:18:27,766][3]INFO 127.0.0.1:12001 服务器没有响应
[2020-06-17 14:18:27,766][3]INFO Server connection failed 1 times
[2020-06-17 14:18:30,785][3]INFO 127.0.0.1:12001 服务器没有响应
[2020-06-17 14:18:30,785][3]INFO Server connection failed 2 times
[2020-06-17 14:18:33,797][3]INFO 127.0.0.1:12001 服务器没有响应
[2020-06-17 14:18:33,797][3]INFO Server connection failed 3 times
[2020-06-17 14:18:36,808][3]INFO 127.0.0.1:12001 服务器没有响应
[2020-06-17 14:18:36,808][3]INFO Server connection failed 4 times
[2020-06-17 14:18:39,819][3]INFO 127.0.0.1:12001 服务器没有响应
[2020-06-17 14:18:39,820][3]INFO Server connection failed 5 times
[2020-06-17 14:18:42,831][3]INFO 127.0.0.1:12001 服务器没有响应
[2020-06-17 14:18:42,831][3]INFO Server connection failed 6 times
[2020-06-17 14:18:45,844][3]INFO 127.0.0.1:12001 服务器没有响应
[2020-06-17 14:18:45,844][3]INFO Server connection failed 7 times
[2020-06-17 14:18:48,857][3]INFO 127.0.0.1:12001 服务器没有响应
[2020-06-17 14:18:48,857][3]INFO Server connection failed 8 times
[2020-06-17 14:18:51,870][3]INFO 127.0.0.1:12001 服务器没有响应
[2020-06-17 14:18:51,870][3]INFO Server connection failed 9 times
[2020-06-17 14:18:54,886][3]INFO 127.0.0.1:12001 服务器没有响应
[2020-06-17 14:18:54,886][3]INFO Server connection failed 10 times
[2020-06-17 14:18:57,898][3]INFO 127.0.0.1:12001 服务器没有响应
[2020-06-17 14:18:57,898][3]INFO Server connection failed 11 times
[2020-06-17 14:19:00,908][3]INFO 127.0.0.1:12001 服务器没有响应
[2020-06-17 14:19:00,908][3]INFO Server connection failed 12 times
[2020-06-17 14:19:03,919][3]INFO 127.0.0.1:12001 服务器没有响应
[2020-06-17 14:19:03,919][3]INFO Server connection failed 13 times
[2020-06-17 14:19:06,930][3]INFO 127.0.0.1:12001 服务器没有响应
[2020-06-17 14:19:06,930][3]INFO Server connection failed 14 times
[2020-06-17 14:19:09,941][3]INFO 127.0.0.1:12001 服务器没有响应
[2020-06-17 14:19:09,941][3]INFO Server connection failed 15 times
[2020-06-17 14:19:12,953][3]INFO 127.0.0.1:12001 服务器没有响应
[2020-06-17 14:19:12,953][3]INFO Server connection failed 16 times
[2020-06-17 14:19:15,965][3]INFO 127.0.0.1:12001 服务器没有响应
[2020-06-17 14:19:15,965][3]INFO Server connection failed 17 times
[2020-06-17 14:19:18,977][3]INFO 127.0.0.1:12001 服务器没有响应
[2020-06-17 14:19:18,977][3]INFO Server connection failed 18 times
[2020-06-17 14:19:21,989][3]INFO 127.0.0.1:12001 服务器没有响应
[2020-06-17 14:19:21,989][3]INFO Server connection failed 19 times
[2020-06-17 14:19:25,002][3]INFO 127.0.0.1:12001 服务器没有响应
[2020-06-17 14:19:25,002][3]INFO Server connection failed 20 times
[2020-06-17 14:19:28,013][3]INFO 127.0.0.1:12001 服务器没有响应
[2020-06-17 14:19:28,013][3]INFO Server connection failed 21 times
[2020-06-17 14:19:31,026][3]INFO 127.0.0.1:12001 服务器没有响应
[2020-06-17 14:19:31,026][3]INFO Server connection failed 22 times
[2020-06-17 14:19:34,035][3]INFO 127.0.0.1:12001 服务器没有响应
[2020-06-17 14:19:34,035][3]INFO Server connection failed 23 times
[2020-06-17 14:19:37,041][3]INFO Server connection successful
[2020-06-17 14:19:37,850][5]DEBUG Send: AD 45 01 43 06 02 00 00 00 00 00 DA
[2020-06-17 14:19:40,952][5]DEBUG Send: AD 45 01 43 06 02 00 00 00 00 00 DA
[2020-06-17 14:19:44,054][5]DEBUG Send: AD 45 01 43 06 02 00 00 00 00 00 DA
[2020-06-17 14:19:47,156][5]DEBUG Send: AD 45 01 43 06 02 00 00 00 00 00 DA
[2020-06-17 14:19:50,258][5]DEBUG Send: AD 45 01 43 06 02 00 00 00 00 00 DA
[2020-06-17 14:19:53,360][5]DEBUG Send: AD 45 01 43 06 02 00 00 00 00 00 DA
[2020-06-17 14:19:56,462][5]DEBUG Send: AD 45 01 43 06 02 00 00 00 00 00 DA
[2020-06-17 14:19:59,564][5]DEBUG Send: AD 45 01 43 06 02 00 00 00 00 00 DA
[2020-06-17 14:20:02,666][5]DEBUG Send: AD 45 01 43 06 02 00 00 00 00 00 DA
[2020-06-17 14:20:05,768][5]DEBUG Send: AD 45 01 43 06 02 00 00 00 00 00 DA
[2020-06-17 14:20:08,869][5]DEBUG Send: AD 45 01 43 06 02 00 00 00 00 00 DA
[2020-06-17 14:20:11,971][5]DEBUG Send: AD 45 01 43 06 02 00 00 00 00 00 DA
[2020-06-17 14:20:15,073][5]DEBUG Send: AD 45 01 43 06 02 00 00 00 00 00 DA
[2020-06-17 14:20:18,175][5]DEBUG Send: AD 45 01 43 06 02 00 00 00 00 00 DA
[2020-06-17 14:20:21,277][5]DEBUG Send: AD 45 01 43 06 02 00 00 00 00 00 DA
[2020-06-17 14:20:24,389][5]ERROR Send()
System.Net.Sockets.SocketException (0x80004005): 你的主机中的软件中止了一个已建立的连接。
在 System.Net.Sockets.Socket.Send(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags)
在 System.Net.Sockets.Socket.Send(Byte[] buffer)
在 Asa.AgvClient.Send(Byte[] buff) 位置 D:\OneDrive - 上海挚锦科技有限公司\SMD\AGVControl-Qisda-ProductionLine\AgvClient\AgvClient.cs:行号 335
[2020-06-17 14:20:27,095][3]INFO 127.0.0.1:12001 服务器没有响应
[2020-06-17 14:20:27,095][3]INFO Server connection failed 1 times
[2020-06-17 14:20:30,106][3]INFO 127.0.0.1:12001 服务器没有响应
[2020-06-17 14:20:30,106][3]INFO Server connection failed 2 times
[2020-06-17 14:20:33,117][3]INFO 127.0.0.1:12001 服务器没有响应
[2020-06-17 14:20:33,117][3]INFO Server connection failed 3 times
[2020-06-17 14:20:36,128][3]INFO 127.0.0.1:12001 服务器没有响应
[2020-06-17 14:20:36,128][3]INFO Server connection failed 4 times
[2020-06-17 14:20:39,139][3]INFO 127.0.0.1:12001 服务器没有响应
[2020-06-17 14:20:39,139][3]INFO Server connection failed 5 times
[2020-06-17 14:20:42,152][3]INFO 127.0.0.1:12001 服务器没有响应
[2020-06-17 14:20:42,152][3]INFO Server connection failed 6 times
[2020-06-17 14:20:45,163][3]INFO 127.0.0.1:12001 服务器没有响应
[2020-06-17 14:20:45,163][3]INFO Server connection failed 7 times
[2020-06-17 14:20:48,174][3]INFO 127.0.0.1:12001 服务器没有响应
[2020-06-17 14:20:48,174][3]INFO Server connection failed 8 times
[2020-06-17 14:20:51,185][3]INFO 127.0.0.1:12001 服务器没有响应
[2020-06-17 14:20:51,185][3]INFO Server connection failed 9 times
[2020-06-17 14:20:54,198][3]INFO 127.0.0.1:12001 服务器没有响应
[2020-06-17 14:20:54,198][3]INFO Server connection failed 10 times
[2020-06-17 14:20:57,207][3]INFO 127.0.0.1:12001 服务器没有响应
[2020-06-17 14:20:57,207][3]INFO Server connection failed 11 times
[2020-06-17 14:21:00,216][3]INFO 127.0.0.1:12001 服务器没有响应
[2020-06-17 14:21:00,216][3]INFO Server connection failed 12 times
[2020-06-17 14:21:01,045][1]INFO Close
[2020-06-17 14:27:26,246][1]INFO SetStatus Name=E1, Action=NeedC, Level=Low
[2020-06-17 14:29:48,177][1]INFO SetStatus Name=E1, Action=None, Level=Low
[2020-06-17 14:30:09,516][1]INFO SetStatus Name=E1, Action=None, Level=Low
[2020-06-17 14:30:09,526][1]INFO Connect
[2020-06-17 14:30:09,550][3]INFO Connect 127.0.0.1:12001
[2020-06-17 14:30:09,567][3]INFO Connect OK
[2020-06-17 14:30:09,567][3]INFO Server connection successful
[2020-06-17 14:30:12,655][5]DEBUG Send: AD 45 01 43 06 00 00 00 00 00 00 DA
[2020-06-17 14:30:15,758][5]DEBUG Send: AD 45 01 43 06 00 00 00 00 00 00 DA
[2020-06-17 14:30:18,860][5]DEBUG Send: AD 45 01 43 06 00 00 00 00 00 00 DA
[2020-06-17 14:30:21,962][5]DEBUG Send: AD 45 01 43 06 00 00 00 00 00 00 DA
[2020-06-17 14:30:22,266][1]INFO SetStatus Name=E1, Action=NeedD, Level=Low
[2020-06-17 14:30:25,064][5]DEBUG Send: AD 45 01 43 06 01 00 00 00 00 00 DA
[2020-06-17 14:30:28,165][5]DEBUG Send: AD 45 01 43 06 01 00 00 00 00 00 DA
[2020-06-17 14:30:31,267][5]DEBUG Send: AD 45 01 43 06 01 00 00 00 00 00 DA
[2020-06-17 14:30:34,369][5]DEBUG Send: AD 45 01 43 06 01 00 00 00 00 00 DA
[2020-06-17 14:30:37,471][5]DEBUG Send: AD 45 01 43 06 01 00 00 00 00 00 DA
[2020-06-17 14:30:39,929][1]INFO SetStatus Name=E1, Action=NeedEnter, Level=Low
[2020-06-17 14:30:40,573][5]DEBUG Send: AD 45 01 43 06 03 00 00 00 00 00 DA
[2020-06-17 14:30:43,675][5]DEBUG Send: AD 45 01 43 06 03 00 00 00 00 00 DA
[2020-06-17 14:30:44,739][1]INFO SetStatus Name=E1, Action=FinishEnter, Level=Low
[2020-06-17 14:30:46,777][5]DEBUG Send: AD 45 01 43 06 08 00 00 00 00 00 DA
[2020-06-17 14:30:49,879][5]DEBUG Send: AD 45 01 43 06 08 00 00 00 00 00 DA
[2020-06-17 14:30:52,981][5]DEBUG Send: AD 45 01 43 06 08 00 00 00 00 00 DA
[2020-06-17 14:30:53,437][1]INFO SetStatus Name=E1, Action=NeedC, Level=Low
[2020-06-17 14:30:56,082][5]DEBUG Send: AD 45 01 43 06 02 00 00 00 00 00 DA
[2020-06-17 14:30:59,184][5]DEBUG Send: AD 45 01 43 06 02 00 00 00 00 00 DA
[2020-06-17 14:30:59,499][1]INFO Close
[2020-06-17 14:48:12,949][1]INFO SetStatus Name=E1, Action=None, Level=Low
[2020-06-17 14:48:12,961][3]INFO Connect 127.0.0.1:12001
[2020-06-17 14:48:12,961][1]INFO Connect
[2020-06-17 14:48:14,995][3]ERROR Open()
System.Net.Sockets.SocketException (0x80004005): 由于目标计算机积极拒绝,无法连接。 127.0.0.1:12001
在 System.Net.Sockets.Socket.DoConnect(EndPoint endPointSnapshot, SocketAddress socketAddress)
在 System.Net.Sockets.Socket.Connect(EndPoint remoteEP)
在 System.Net.Sockets.Socket.Connect(IPAddress address, Int32 port)
在 Asa.AgvClient.Open() 位置 D:\OneDrive - 上海挚锦科技有限公司\SMD\AGVControl-Qisda-ProductionLine\AgvClient\AgvClient.cs:行号 212
[2020-06-17 14:48:15,017][3]INFO Server connection failed 1 times
[2020-06-17 14:48:16,018][3]INFO Connect 127.0.0.1:12001
[2020-06-17 14:48:18,033][3]ERROR Open()
System.Net.Sockets.SocketException (0x80004005): 由于目标计算机积极拒绝,无法连接。 127.0.0.1:12001
在 System.Net.Sockets.Socket.DoConnect(EndPoint endPointSnapshot, SocketAddress socketAddress)
在 System.Net.Sockets.Socket.Connect(EndPoint remoteEP)
在 System.Net.Sockets.Socket.Connect(IPAddress address, Int32 port)
在 Asa.AgvClient.Open() 位置 D:\OneDrive - 上海挚锦科技有限公司\SMD\AGVControl-Qisda-ProductionLine\AgvClient\AgvClient.cs:行号 212
[2020-06-17 14:48:18,034][3]INFO Server connection failed 2 times
[2020-06-17 14:48:19,035][3]INFO Connect 127.0.0.1:12001
[2020-06-17 14:48:21,047][3]ERROR Open()
System.Net.Sockets.SocketException (0x80004005): 由于目标计算机积极拒绝,无法连接。 127.0.0.1:12001
在 System.Net.Sockets.Socket.DoConnect(EndPoint endPointSnapshot, SocketAddress socketAddress)
在 System.Net.Sockets.Socket.Connect(EndPoint remoteEP)
在 System.Net.Sockets.Socket.Connect(IPAddress address, Int32 port)
在 Asa.AgvClient.Open() 位置 D:\OneDrive - 上海挚锦科技有限公司\SMD\AGVControl-Qisda-ProductionLine\AgvClient\AgvClient.cs:行号 212
[2020-06-17 14:48:21,048][3]INFO Server connection failed 3 times
[2020-06-17 14:48:22,049][3]INFO Connect 127.0.0.1:12001
[2020-06-17 14:48:22,050][3]INFO Connect OK
[2020-06-17 14:48:22,050][3]INFO Server connection successful
[2020-06-17 14:48:24,153][5]DEBUG Send: AD 45 01 43 06 00 00 00 00 00 00 DA
[2020-06-17 14:48:26,256][5]DEBUG Send: AD 45 01 43 06 00 00 00 00 00 00 DA
[2020-06-17 14:48:28,358][5]DEBUG Send: AD 45 01 43 06 00 00 00 00 00 00 DA
[2020-06-17 14:48:30,460][5]DEBUG Send: AD 45 01 43 06 00 00 00 00 00 00 DA
[2020-06-17 14:48:31,502][1]INFO SetStatus Name=E1, Action=NeedD, Level=Low
[2020-06-17 14:48:32,562][5]DEBUG Send: AD 45 01 43 06 01 00 00 00 00 00 DA
[2020-06-17 14:48:34,664][5]DEBUG Send: AD 45 01 43 06 01 00 00 00 00 00 DA
[2020-06-17 14:48:35,227][1]INFO SetStatus Name=E1, Action=ReadyEnter, Level=Low
[2020-06-17 14:48:36,766][5]DEBUG Send: AD 45 01 43 06 06 00 00 00 00 00 DA
[2020-06-17 14:48:38,868][5]DEBUG Send: AD 45 01 43 06 06 00 00 00 00 00 DA
[2020-06-17 14:48:38,994][1]INFO SetStatus Name=E1, Action=None, Level=Low
[2020-06-17 14:48:40,969][5]DEBUG Send: AD 45 01 43 06 00 00 00 00 00 00 DA
[2020-06-17 14:48:42,098][1]INFO Close
[2020-06-17 15:48:08,449][1]INFO SetStatus Name=E1, Action=None, Level=Low
[2020-06-17 15:48:08,460][1]INFO Connect
[2020-06-17 15:48:08,466][3]INFO Connect 127.0.0.1:12001
[2020-06-17 15:48:10,521][3]ERROR Open()
System.Net.Sockets.SocketException (0x80004005): 由于目标计算机积极拒绝,无法连接。 127.0.0.1:12001
在 System.Net.Sockets.Socket.DoConnect(EndPoint endPointSnapshot, SocketAddress socketAddress)
在 System.Net.Sockets.Socket.Connect(EndPoint remoteEP)
在 System.Net.Sockets.Socket.Connect(IPAddress address, Int32 port)
在 Asa.AgvClient.Open() 位置 D:\OneDrive - 上海挚锦科技有限公司\SMD\AGVControl-Qisda-ProductionLine\AgvClient\AgvClient.cs:行号 212
[2020-06-17 15:48:10,585][3]INFO Server connection failed 1 times
[2020-06-17 15:48:11,586][3]INFO Connect 127.0.0.1:12001
[2020-06-17 15:48:13,594][3]ERROR Open()
System.Net.Sockets.SocketException (0x80004005): 由于目标计算机积极拒绝,无法连接。 127.0.0.1:12001
在 System.Net.Sockets.Socket.DoConnect(EndPoint endPointSnapshot, SocketAddress socketAddress)
在 System.Net.Sockets.Socket.Connect(EndPoint remoteEP)
在 System.Net.Sockets.Socket.Connect(IPAddress address, Int32 port)
在 Asa.AgvClient.Open() 位置 D:\OneDrive - 上海挚锦科技有限公司\SMD\AGVControl-Qisda-ProductionLine\AgvClient\AgvClient.cs:行号 212
[2020-06-17 15:48:13,594][3]INFO Server connection failed 2 times
[2020-06-17 15:48:14,429][1]INFO Close
D:\OneDrive - 上海挚锦科技有限公司\SMD\AGVControl-Qisda-ProductionLine\AgvClientTest\bin\Debug\AgvClientTest.exe.config
D:\OneDrive - 上海挚锦科技有限公司\SMD\AGVControl-Qisda-ProductionLine\AgvClientTest\bin\Debug\AgvClientTest.exe
D:\OneDrive - 上海挚锦科技有限公司\SMD\AGVControl-Qisda-ProductionLine\AgvClientTest\bin\Debug\AgvClientTest.pdb
D:\OneDrive - 上海挚锦科技有限公司\SMD\AGVControl-Qisda-ProductionLine\AgvClientTest\bin\Debug\log4net.dll
D:\OneDrive - 上海挚锦科技有限公司\SMD\AGVControl-Qisda-ProductionLine\AgvClientTest\obj\Debug\AgvClientTest.csprojAssemblyReference.cache
D:\OneDrive - 上海挚锦科技有限公司\SMD\AGVControl-Qisda-ProductionLine\AgvClientTest\obj\Debug\AgvClientTest.Form1.resources
D:\OneDrive - 上海挚锦科技有限公司\SMD\AGVControl-Qisda-ProductionLine\AgvClientTest\obj\Debug\AgvClientTest.Properties.Resources.resources
D:\OneDrive - 上海挚锦科技有限公司\SMD\AGVControl-Qisda-ProductionLine\AgvClientTest\obj\Debug\AgvClientTest.csproj.GenerateResource.cache
D:\OneDrive - 上海挚锦科技有限公司\SMD\AGVControl-Qisda-ProductionLine\AgvClientTest\obj\Debug\AgvClientTest.csproj.CoreCompileInputs.cache
D:\OneDrive - 上海挚锦科技有限公司\SMD\AGVControl-Qisda-ProductionLine\AgvClientTest\obj\Debug\AgvClientTest.csproj.CopyComplete
D:\OneDrive - 上海挚锦科技有限公司\SMD\AGVControl-Qisda-ProductionLine\AgvClientTest\obj\Debug\AgvClientTest.exe
D:\OneDrive - 上海挚锦科技有限公司\SMD\AGVControl-Qisda-ProductionLine\AgvClientTest\obj\Debug\AgvClientTest.pdb
D:\OneDrive - 上海挚锦科技有限公司\SMD\AGVControl-Qisda-ProductionLine\AgvClientTest\bin\Debug\AsaPL.AgvClient.dll
D:\OneDrive - 上海挚锦科技有限公司\SMD\AGVControl-Qisda-ProductionLine\AgvClientTest\bin\Debug\AsaPL.AgvClient.pdb
using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Threading;
namespace Asa
{
/// <summary>
/// AGV服务端
/// </summary>
public class AgvServer
{
private bool _loop;
private Socket _server; //服务端
private List<Client> _client; //所有客户端
private Thread tListenClient; //监听客户端连接
private readonly log4net.ILog LOG;
private const int PORT = 12001; //端口
/// <summary>
/// 节点改变事件
/// </summary>
/// <param name="nodeIndex"></param>
public delegate void NodeChangedEvent(int nodeIndex);
/// <summary>
/// 节点改变
/// </summary>
public event NodeChangedEvent NodeChanged;
/// <summary>
/// 节点在线
/// </summary>
public event NodeChangedEvent NodeOnline;
/// <summary>
/// AGV服务端
/// </summary>
/// <param name="logName"></param>
public AgvServer(string logName = "AgvServer")
{
LOG = log4net.LogManager.GetLogger(logName);
}
/// <summary>
/// 开启服务
/// </summary>
public void Start()
{
try
{
IPEndPoint localEP = new IPEndPoint(IPAddress.Any, PORT);
_server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
_server.Bind(localEP);
_server.Listen(100);
LOG.Info("=====Server Start=====");
_loop = true;
_client = new List<Client>();
Common.nodeInfo = new List<ClientNode>();
tListenClient = new Thread(new ThreadStart(ListenClient));
tListenClient.Start();
}
catch (Exception ex)
{
LOG.Error("Start()", ex);
}
}
/// <summary>
/// 停止服务
/// </summary>
public void Stop()
{
_loop = false;
for (int i = 0; i < _client.Count; i++)
{
_client[i].Loop = false;
_client[i].IsConn = false;
_client[i].Socket.Close();
}
_server.Close();
_client = null;
LOG.Info("=====Server Stop=====");
}
///// <summary>
///// 小车已准备好
///// </summary>
///// <param name="info"></param>
///// <returns></returns>
//public bool Ready(Agv_Info info)
//{
// int idx;
// int n = 0;
// do
// {
// idx = FindClient(info.Place);
// if (idx == -1)
// {
// Common.log.OutInfo("没有找到" + info.Place);
// Thread.Sleep(500);
// n++;
// }
// else
// {
// n = 10;
// }
// } while (n < 4);
// if (idx == -1) return false;
// ClientNode node = new ClientNode(info.Place, info.RFID, ClientAction.Ready);
// Common.log.OutInfo("SendTo " + info.Place + " " + ClientAction.Ready);
// byte[] buff = Encode(node);
// return Send(idx, buff);
//}
///// <summary>
///// 关门
///// </summary>
///// <param name="info"></param>
///// <returns></returns>
//public bool CloseDoor(Agv_Info info)
//{
// int idx;
// int n = 0;
// do
// {
// idx = FindClient(info.Place);
// if (idx == -1)
// {
// Common.log.OutInfo("没有找到" + info.Place);
// Thread.Sleep(500);
// n++;
// }
// else
// {
// n = 10;
// }
// } while (n < 4);
// if (idx == -1) return false;
// ClientNode node = new ClientNode(info.Place, info.RFID, ClientAction.CloseDoor);
// Common.log.OutInfo("SendTo " + info.Place + " " + ClientAction.CloseDoor);
// byte[] buff = Encode(node);
// return Send(idx, buff);
//}
///// <summary>
///// 需要进入料架
///// </summary>
///// <param name="info"></param>
///// <returns></returns>
//public bool EnterShelf(Agv_Info info)
//{
// int idx;
// int n = 0;
// do
// {
// idx = FindClient(info.Place);
// if (idx == -1)
// {
// Common.log.OutInfo("没有找到" + info.Place);
// Thread.Sleep(500);
// n++;
// }
// else
// {
// n = 10;
// }
// } while (n < 4);
// if (idx == -1) return false;
// ClientNode node = new ClientNode(info.Place, info.RFID, ClientAction.EnterShelf);
// Common.log.OutInfo("SendTo " + info.Place + " " + ClientAction.EnterShelf);
// byte[] buff = Encode(node);
// return Send(idx, buff);
//}
/// <summary>
/// 监听客户端
/// </summary>
private void ListenClient()
{
while (_loop)
{
try
{
Socket socket = _server.Accept(); //这边会暂停,不需要sleep
IPEndPoint ep = (IPEndPoint)socket.RemoteEndPoint;
Thread listen = new Thread(new ParameterizedThreadStart(ListenNet));
//string ip = ep.Address.ToString();
//if (ip == System.Configuration.ConfigurationManager.AppSettings["LocalIP"])
// ip += ":" + ep.Port;
//新的客户端
Client client = new Client
{
IP = ep.Address.ToString() + ":" + ep.Port,
Loop = true,
IsConn = true,
Socket = socket,
ListenNet = listen,
nodeName = new List<string>(),
};
//重连后关闭旧连接
//int idx = _client.FindIndex(s => s.IP.Equals(ip));
//if (idx > -1)
//{
// _client[idx].IsConn = false;
// _client[idx].nodeName.Clear();
// _client[idx].Loop = false;
// _client[idx].Socket.Close();
// _client.RemoveAt(idx);
//}
_client.Add(client);
listen.Start(_client.Count - 1);
LOG.Info(string.Format("[{0}] 已连接", client.IP));
}
catch (SocketException)
{
//关闭连接,退出阻塞Accept
LOG.Info("服务端关闭连接,退出阻塞Accept");
}
catch (Exception ex)
{
LOG.Error("ListenClient()", ex);
}
}
}
/// <summary>
/// 客户端数据接收
/// </summary>
/// <param name="obj">索引</param>
private void ListenNet(object obj)
{
int sleep = 50;
Client client = _client[(int)obj];
byte[] temp = new byte[200];
int time = 0;
while (client.Loop)
{
Thread.Sleep(sleep);
try
{
if (!client.Loop) break;
if (client.Socket.Available > 0)
{
time = 0;
int count = client.Socket.Receive(temp);
byte[] buff = new byte[count];
Array.Copy(temp, 0, buff, 0, count);
ClientNode node = Decode(buff);
if (node == null)
{
LOG.Info("解码失败:" + HexBuff(buff));
}
else
{
LOG.Debug("Receive[" + client.IP + "] " + node.ToText());
int idx = client.nodeName.FindIndex(s => s == node.Name);
if (idx == -1) client.nodeName.Add(node.Name);
UpdateNode(node);
}
}
else
{
time += sleep;
if (time > 8000)
{
Offline(client);
LOG.Info("[" + client.IP + "] 超过8s没有收到数据,关闭连接");
}
}
}
catch (Exception ex)
{
LOG.Error("ListenNet()", ex);
}
}
}
/// <summary>
/// 编码
/// </summary>
/// <param name="node"></param>
/// <returns></returns>
private byte[] Encode(ClientNode node)
{
int idx = 0;
byte[] buff = new byte[8];
buff[idx++] = 0xAD;
buff[idx++] = (byte)node.Name[0];
buff[idx++] = Convert.ToByte(node.Name.Substring(1));
buff[idx++] = (byte)node.RFID[0];
buff[idx++] = Convert.ToByte(node.RFID.Substring(1));
buff[idx++] = (byte)node.Action;
buff[idx++] = (byte)node.Level;
idx += 4; //预留
buff[idx] = 0xDA;
return buff;
}
/// <summary>
/// 解码
/// </summary>
/// <param name="buff"></param>
/// <returns></returns>
private ClientNode Decode(byte[] buff)
{
int idx = 0;
if (buff[idx++] != 0xAD) return null;
string name = (char)buff[idx] + buff[idx + 1].ToString();
idx += 2;
string rfid = (char)buff[idx] + buff[idx + 1].ToString();
idx += 2;
ClientAction action = (ClientAction)buff[idx++];
ClientLevel level = (ClientLevel)buff[idx++];
idx += 4; //预留
if (buff[idx] != 0xDA) return null;
ClientNode node = new ClientNode(name, rfid, action, level);
return node;
}
private void UpdateNode(ClientNode node)
{
int idx = Common.nodeInfo.FindIndex(s => s.Name == node.Name);
if (idx == -1)
{
LOG.Info("UpdateNode " + node.Name + " 不存在");
return;
}
if (!Common.nodeInfo[idx].Online)
{
Common.nodeInfo[idx].Online = true;
NodeOnline?.Invoke(idx);
}
if (Common.nodeInfo[idx].Action != node.Action ||
Common.nodeInfo[idx].Level != node.Level ||
Common.nodeInfo[idx].RFID != node.RFID)
{
Common.nodeInfo[idx].Action = node.Action;
Common.nodeInfo[idx].Level = node.Level;
Common.nodeInfo[idx].RFID = node.RFID;
LOG.Info(node.Name + "更新 " + node.ToText());
NodeChanged?.Invoke(idx);
}
}
private void Offline(Client client)
{
client.Loop = false;
client.IsConn = false;
client.Socket.Close();
for (int i = 0; i < client.nodeName.Count; i++)
{
int idx = Common.nodeInfo.FindIndex(s => s.Name == client.nodeName[i]);
if (idx == -1) continue;
Common.nodeInfo[idx].Offline();
NodeChanged(idx);
NodeOnline(idx);
}
client.nodeName.Clear();
_client.Remove(client);
}
/// <summary>
/// 16进制
/// </summary>
/// <param name="buff"></param>
/// <returns></returns>
private string HexBuff(byte[] buff)
{
string s = "";
if (buff == null) return s;
for (int i = 0; i < buff.Length; i++)
s += buff[i].ToString("X2") + " ";
return s;
}
///// <summary>
///// 查找客户端
///// </summary>
///// <param name="name">节点名称</param>
///// <returns></returns>
//private int FindClient(string name)
//{
// int index = -1;
// for (int i = 0; i < _client.Count; i++)
// {
// if (_client[i].IsConn)
// {
// int idx = _client[i].nodeName.FindIndex(a => a == name);
// if (idx != -1)
// {
// index = i;
// break;
// }
// }
// }
// return index;
//}
///// <summary>
///// 发送命令
///// </summary>
///// <param name="idx"></param>
///// <param name="buff"></param>
///// <returns></returns>
//private bool Send(int idx, byte[] buff)
//{
// for (int i = 1; i <= 3; i++)
// {
// try
// {
// _client[idx].Socket.Send(buff);
// Common.log.OutInfo("[" + _client[idx].IP + "] " + HexBuff(buff));
// return true;
// }
// catch (Exception ex)
// {
// Common.log.OutInfo("发送失败" + i + "次:" + ex.Message);
// }
// Thread.Sleep(100);
// }
// return false;
//}
}
}
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{9208965E-3C78-408A-AFDB-466881033768}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>AgvServer_DL</RootNamespace>
<AssemblyName>AgvServer_DL</AssemblyName>
<TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<Deterministic>true</Deterministic>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<DocumentationFile>bin\Debug\AgvServer_DL.xml</DocumentationFile>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="log4net">
<HintPath>..\..\..\DLL\log4net.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="AgvServer.cs" />
<Compile Include="Common.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>
\ No newline at end of file
using System;
using System.Collections.Generic;
using System.Net.Sockets;
using System.Threading;
namespace Asa
{
/// <summary>
/// 公共参数
/// </summary>
public static class Common
{
/// <summary>
/// 节点信息
/// </summary>
public static List<ClientNode> nodeInfo;
/// <summary>
/// 小车信息
/// </summary>
public static List<AgvInfo> agvInfo;
}
/// <summary>
/// 客户端
/// </summary>
public class Client
{
/// <summary>
/// 循环
/// </summary>
public bool Loop;
/// <summary>
/// IP地址
/// </summary>
public string IP;
/// <summary>
/// 是否连接
/// </summary>
public bool IsConn;
/// <summary>
/// 节点名称
/// </summary>
public List<string> nodeName;
/// <summary>
/// 套接字
/// </summary>
public Socket Socket;
/// <summary>
/// 接收数据线程
/// </summary>
public Thread ListenNet;
}
/// <summary>
/// 客户端的节点
/// </summary>
public class ClientNode
{
private string rfid = "00";
/// <summary>
/// 节点名称
/// </summary>
public string Name { set; get; }
/// <summary>
/// RFID
/// </summary>
public string RFID
{
set
{
if (value.Length < 2)
rfid = value.PadLeft(2, '0');
else
rfid = value;
}
get
{
return rfid;
}
}
/// <summary>
/// 动作
/// </summary>
public ClientAction Action { set; get; }
/// <summary>
/// 优先级
/// </summary>
public ClientLevel Level { set; get; }
/// <summary>
/// 小车名称
/// </summary>
public string AgvName { set; get; }
/// <summary>
/// 在线
/// </summary>
public bool Online { set; get; }
/// <summary>
/// 是否可用
/// </summary>
public bool IsUse { set; get; }
/// <summary>
/// 客户端节点
/// </summary>
/// <param name="name"></param>
/// <param name="isUse"></param>
public ClientNode(string name, bool isUse)
{
Name = name;
RFID = rfid;
Action = ClientAction.None;
Level = ClientLevel.Low;
AgvName = "";
Online = false;
IsUse = isUse;
}
/// <summary>
/// 客户端节点
/// </summary>
/// <param name="name"></param>
/// <param name="rfid"></param>
/// <param name="action"></param>
/// <param name="level"></param>
public ClientNode(string name, string rfid = "", ClientAction action = ClientAction.None, ClientLevel level = ClientLevel.Low)
{
Name = name;
RFID = rfid;
Action = action;
Level = level;
AgvName = "";
Online = false;
IsUse = false;
}
/// <summary>
/// 所有属性的文本形式
/// </summary>
/// <returns></returns>
public string ToText()
{
string s = string.Format("Name={0}, Action={1}, Level={2}", Name, Action, Level);
return s;
}
/// <summary>
/// 脱机
/// </summary>
public void Offline()
{
RFID = "00";
Action = ClientAction.None;
Level = ClientLevel.Low;
AgvName = "";
Online = false;
}
}
public class AgvInfo
{
/// <summary>
/// 小车名称
/// </summary>
public string Name { set; get; }
/// <summary>
/// 小车在FLEET中的ID号
/// </summary>
public string ID { set; get; }
/// <summary>
/// IP地址
/// </summary>
public string IP { set; get; }
/// <summary>
/// 授权码
/// </summary>
public string Authorization { set; get; }
/// <summary>
/// 当前架子的RFID
/// </summary>
public string RFID { set; get; }
/// <summary>
/// 是否在线
/// </summary>
public bool IsCon { set; get; }
/// <summary>
/// 是否可用
/// </summary>
public bool IsUse { set; get; }
/// <summary>
/// 地点
/// </summary>
public string Place { set; get; }
/// <summary>
/// 小车的状态id
/// </summary>
public int StateID { set; get; }
/// <summary>
/// 小车的状态
/// </summary>
public string StateText { set; get; }
/// <summary>
/// 电量百分比
/// </summary>
public int Battery { set; get; }
/// <summary>
/// 任务文本
/// </summary>
public string Mission_text { set; get; }
/// <summary>
/// 任务的状态
/// </summary>
//public Mission_Status MissionStatus { set; get; }
/// <summary>
/// 下一个任务
/// </summary>
public string NextMission { set; get; }
/// <summary>
/// 关门,用于执行一次
/// </summary>
public bool CloseDoor { set; get; }
/// <summary>
/// 任务发送,用于已调用API,但还没有修改状态
/// </summary>
public bool TaskSend { set; get; }
/// <summary>
/// 闲置等待时间,用于充电
/// </summary>
public int WaitTime { set; get; }
/// <summary>
/// 临时待机位,用于执行一次
/// </summary>
public bool StandbyTemp { set; get; }
public AgvInfo(string id, string name, string ip, string authorization, string ioId, bool isUse)
{
ID = id;
Name = name;
IP = ip;
Authorization = authorization;
RFID = "";
IsCon = false;
IsUse = isUse;
Place = "";
StateText = "";
WaitTime = 0;
}
public string[] ToRow()
{
//AGV名称,IP,AGV状态,任务状态,地点,后续任务,在线,电量,调用,清除缓存
string[] s = new string[10];
s[0] = Name;
s[1] = IP;
if (IsCon)
{
s[2] = StateText;
//s[3] = string.Format("{0}({1})", MissionStatus.ToString(), (int)MissionStatus);
s[4] = Place;
s[5] = NextMission;
}
s[6] = IsCon.ToString();
s[7] = Battery + "%";
s[8] = IsUse.ToString();
s[9] = "Clear";
return s;
}
public string[] ToMission()
{
//AGV名称,IP,AGV状态,任务状态,地点,后续任务,在线,电量,调用,清除缓存
string[] s = new string[2];
s[0] = Name;
s[1] = Mission_text;
return s;
}
/// <summary>
/// 脱机
/// </summary>
public void Offline()
{
IsCon = false;
//Mark = "";
//RFID = "";
//Place = "";
//StateID = -1;
//StateText = "";
//MissionStatus = Mission_Status.None;
//MissionQueue = "";
}
}
/// <summary>
/// 客户端的动作
/// </summary>
public enum ClientAction : byte
{
/// <summary>
/// 没有动作
/// </summary>
None = 0,
/// <summary>
/// 需要7寸D料架
/// </summary>
NeedD = 1,
/// <summary>
/// 需要大尺寸C料架
/// </summary>
NeedC = 2,
/// <summary>
/// 需要进入料架
/// </summary>
NeedEnter = 3,
/// <summary>
/// 需要出去料架
/// </summary>
NeedLeave = 4,
/// <summary>
/// 需要进入离开料架
/// </summary>
NeedEnterLeave = 5,
/// <summary>
/// 准备进入,服务器发送
/// </summary>
ReadyEnter = 6,
/// <summary>
/// 可以进入料架
/// </summary>
MayEnter = 7,
/// <summary>
/// 完成进入料架
/// </summary>
FinishEnter = 8,
/// <summary>
/// 准备离开,服务器发送
/// </summary>
ReadyLeave = 9,
/// <summary>
/// 可以出去料架
/// </summary>
MayLeave = 10,
/// <summary>
/// 完成出去料架
/// </summary>
FinishLeave = 11,
}
/// <summary>
/// 客户端的优先级
/// </summary>
public enum ClientLevel : byte
{
/// <summary>
/// 低
/// </summary>
Low = 0,
/// <summary>
/// 中等
/// </summary>
Middle = 1,
/// <summary>
/// 高
/// </summary>
High = 2
}
}
\ No newline at end of file
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// 有关程序集的一般信息由以下
// 控制。更改这些特性值可修改
// 与程序集关联的信息。
[assembly: AssemblyTitle("AgvServer_DL")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("AgvServer_DL")]
[assembly: AssemblyCopyright("Copyright © 2020")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// 将 ComVisible 设置为 false 会使此程序集中的类型
//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型
//请将此类型的 ComVisible 特性设置为 true。
[assembly: ComVisible(false)]
// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
[assembly: Guid("9208965e-3c78-408a-afdb-466881033768")]
// 程序集的版本信息由下列四个值组成:
//
// 主版本
// 次版本
// 生成号
// 修订号
//
//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值
//通过使用 "*",如下所示:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
此文件类型无法预览
此文件类型无法预览
<?xml version="1.0"?>
<doc>
<assembly>
<name>AgvServer_DL</name>
</assembly>
<members>
<member name="T:Asa.AgvServer">
<summary>
AGV服务端
</summary>
</member>
<member name="M:Asa.AgvServer.#ctor(System.String)">
<summary>
AGV服务端
</summary>
<param name="logName"></param>
</member>
<member name="M:Asa.AgvServer.Start">
<summary>
开启服务
</summary>
</member>
<member name="M:Asa.AgvServer.Stop">
<summary>
停止服务
</summary>
</member>
<member name="M:Asa.AgvServer.ListenClient">
<summary>
监听客户端
</summary>
</member>
<member name="M:Asa.AgvServer.ListenNet(System.Object)">
<summary>
客户端数据接收
</summary>
<param name="obj">索引</param>
</member>
<member name="M:Asa.AgvServer.Encode(Asa.AgvServer.ClientNode)">
<summary>
编码
</summary>
<param name="node"></param>
<returns></returns>
</member>
<member name="M:Asa.AgvServer.Decode(System.Byte[])">
<summary>
解码
</summary>
<param name="buff"></param>
<returns></returns>
</member>
<member name="M:Asa.AgvServer.HexBuff(System.Byte[])">
<summary>
16进制
</summary>
<param name="buff"></param>
<returns></returns>
</member>
<member name="T:Asa.AgvServer.ClientNode">
<summary>
客户端的节点
</summary>
</member>
<member name="P:Asa.AgvServer.ClientNode.Name">
<summary>
节点名称
</summary>
</member>
<member name="P:Asa.AgvServer.ClientNode.RFID">
<summary>
RFID
</summary>
</member>
<member name="P:Asa.AgvServer.ClientNode.Action">
<summary>
动作
</summary>
</member>
<member name="P:Asa.AgvServer.ClientNode.Level">
<summary>
优先级
</summary>
</member>
<member name="M:Asa.AgvServer.ClientNode.#ctor(System.String,System.String,Asa.AgvServer.ClientAction,Asa.AgvServer.ClientLevel)">
<summary>
客户端节点
</summary>
<param name="name"></param>
<param name="rfid"></param>
<param name="action"></param>
<param name="level"></param>
</member>
<member name="M:Asa.AgvServer.ClientNode.ToText">
<summary>
所有属性的文本形式
</summary>
<returns></returns>
</member>
<member name="T:Asa.AgvServer.ClientAction">
<summary>
客户端的动作
</summary>
</member>
<member name="F:Asa.AgvServer.ClientAction.None">
<summary>
没有动作
</summary>
</member>
<member name="F:Asa.AgvServer.ClientAction.NeedD">
<summary>
需要7寸D料架
</summary>
</member>
<member name="F:Asa.AgvServer.ClientAction.NeedC">
<summary>
需要大尺寸C料架
</summary>
</member>
<member name="F:Asa.AgvServer.ClientAction.NeedEnter">
<summary>
需要进入料架
</summary>
</member>
<member name="F:Asa.AgvServer.ClientAction.NeedLeave">
<summary>
需要出去料架
</summary>
</member>
<member name="F:Asa.AgvServer.ClientAction.NeedEnterLeave">
<summary>
需要进入离开料架
</summary>
</member>
<member name="F:Asa.AgvServer.ClientAction.ReadyEnter">
<summary>
准备进入,服务器发送
</summary>
</member>
<member name="F:Asa.AgvServer.ClientAction.MayEnter">
<summary>
可以进入料架
</summary>
</member>
<member name="F:Asa.AgvServer.ClientAction.FinishEnter">
<summary>
完成进入料架
</summary>
</member>
<member name="F:Asa.AgvServer.ClientAction.ReadyLeave">
<summary>
准备离开,服务器发送
</summary>
</member>
<member name="F:Asa.AgvServer.ClientAction.MayLeave">
<summary>
可以出去料架
</summary>
</member>
<member name="F:Asa.AgvServer.ClientAction.FinishLeave">
<summary>
完成出去料架
</summary>
</member>
<member name="T:Asa.AgvServer.ClientLevel">
<summary>
客户端的优先级
</summary>
</member>
<member name="F:Asa.AgvServer.ClientLevel.Low">
<summary>
</summary>
</member>
<member name="F:Asa.AgvServer.ClientLevel.Middle">
<summary>
中等
</summary>
</member>
<member name="F:Asa.AgvServer.ClientLevel.High">
<summary>
</summary>
</member>
</members>
</doc>
此文件类型无法预览
D:\OneDrive - 上海挚锦科技有限公司\SMD\AGVControl-Qisda-ProductionLine\AgvServer_DL\bin\Debug\AgvServer_DL.xml
D:\OneDrive - 上海挚锦科技有限公司\SMD\AGVControl-Qisda-ProductionLine\AgvServer_DL\bin\Debug\AgvServer_DL.dll
D:\OneDrive - 上海挚锦科技有限公司\SMD\AGVControl-Qisda-ProductionLine\AgvServer_DL\bin\Debug\AgvServer_DL.pdb
D:\OneDrive - 上海挚锦科技有限公司\SMD\AGVControl-Qisda-ProductionLine\AgvServer_DL\obj\Debug\AgvServer.csproj.CoreCompileInputs.cache
D:\OneDrive - 上海挚锦科技有限公司\SMD\AGVControl-Qisda-ProductionLine\AgvServer_DL\obj\Debug\AgvServer_DL.dll
D:\OneDrive - 上海挚锦科技有限公司\SMD\AGVControl-Qisda-ProductionLine\AgvServer_DL\obj\Debug\AgvServer_DL.pdb
D:\OneDrive - 上海挚锦科技有限公司\SMD\AGVControl-Qisda-ProductionLine\AgvServer\bin\Debug\AgvServer_DL.xml
D:\OneDrive - 上海挚锦科技有限公司\SMD\AGVControl-Qisda-ProductionLine\AgvServer\bin\Debug\AgvServer_DL.dll
D:\OneDrive - 上海挚锦科技有限公司\SMD\AGVControl-Qisda-ProductionLine\AgvServer\bin\Debug\AgvServer_DL.pdb
D:\OneDrive - 上海挚锦科技有限公司\SMD\AGVControl-Qisda-ProductionLine\AgvServer\bin\Debug\log4net.dll
D:\OneDrive - 上海挚锦科技有限公司\SMD\AGVControl-Qisda-ProductionLine\AgvServer\obj\Debug\AgvServer.csproj.CoreCompileInputs.cache
D:\OneDrive - 上海挚锦科技有限公司\SMD\AGVControl-Qisda-ProductionLine\AgvServer\obj\Debug\AgvServer.csproj.CopyComplete
D:\OneDrive - 上海挚锦科技有限公司\SMD\AGVControl-Qisda-ProductionLine\AgvServer\obj\Debug\AgvServer_DL.dll
D:\OneDrive - 上海挚锦科技有限公司\SMD\AGVControl-Qisda-ProductionLine\AgvServer\obj\Debug\AgvServer_DL.pdb
D:\OneDrive - 上海挚锦科技有限公司\SMD\AGVControl-Qisda-ProductionLine\AgvServer\obj\Debug\AgvServer.csprojAssemblyReference.cache
此文件类型无法预览
此文件类型无法预览
此文件的差异太大,无法显示。
此文件的差异太大,无法显示。
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!