diff --git a/01_DCS/Hooks/Perun.lua b/01_DCS/Hooks/Perun.lua
new file mode 100644
index 0000000..ad50650
--- /dev/null
+++ b/01_DCS/Hooks/Perun.lua
@@ -0,0 +1,143 @@
+-- Perun for DCS World https://github.com/szporwolik/perun -> DCS Hook component
+
+-- Initial init
+ local Perun = {}
+ package.path = package.path..";"..lfs.currentdir().."/LuaSocket/?.lua"
+ package.cpath = package.cpath..";"..lfs.currentdir().."/LuaSocket/?.dll"
+
+-- ########### SETTINGS ###########
+
+ Perun.Refresh = 15 -- base refresh rate in secounds (values lower than 60 may affect performance!)
+ Perun.JsonLocation = "Scripts\\Json\\perun_export.json" -- relatve do user's SaveGames DCS folder
+ Perun.UDPTargetPort = 48620 -- UDP port to send data to
+
+-- ########### END OF SETTINGS ###########
+
+-- Variable init
+ Perun.Version = "v0.1.1"
+ Perun.StatusData = {}
+ Perun.MissionData = {}
+ Perun.VersionData = {}
+ Perun.lastSent =0
+ Perun.JsonLocation = lfs.writedir() .. Perun.JsonLocation
+ Perun.socket = require("socket")
+ Perun.UDP = assert(Perun.socket.udp())
+ Perun.UDP:settimeout(0)
+ Perun.UDP:setsockname("*", 48621)
+ Perun.UDP:setpeername("127.0.0.1",Perun.UDPTargetPort)
+ Perun.UDP:send("{'type':999,'payload':'Perun is onlne!'}") -- send welcome message
+
+-- Function definition
+ Perun.AddLog = function(text)
+ -- Adds logs to DCS.log file
+ net.log("Perun : ".. text)
+ end
+
+ Perun.UpdateJson = function()
+ -- Updates main json file
+ TempData={}
+ TempData["1"]=Perun.VersionData
+ TempData["2"]=Perun.StatusData
+ TempData["3"]=Perun.MissionData
+
+ io.open(Perun.JsonLocation,"w"):close()
+ perun_export = io.open(Perun.JsonLocation, "w")
+ perun_export:write(net.lua2json(TempData) .. "\n")
+ perun_export:close()
+ end
+
+ Perun.Send = function(data_id, data_package)
+ -- Sends data package
+ TempData={}
+ TempData["type"]=data_id
+ TempData["payload"]=data_package
+
+ temp=net.lua2json(TempData)
+ Perun.UDP:send(temp)
+ Perun.AddLog("Packet send")
+ end
+
+ Perun.UpdateStatusPart = function(part_id, data_package)
+ -- Helper for status update container
+ Perun.StatusData[part_id] = data_package
+ end
+
+ Perun.UpdateVersion = function()
+ -- Main function for debug/version information
+
+ -- Update Mission data
+ Perun.VersionData['v_dcs_hook']=Perun.Version
+
+ -- Send
+ Perun.Send(1,Perun.VersionData)
+ end
+
+ Perun.UpdateStatus = function()
+ -- Main function for status updates
+
+ -- Update all subsections
+ -- 1 - Mission
+ temp={}
+ temp['name']=DCS.getMissionName()
+ temp['filename']=DCS.getMissionFilename()
+ temp['modeltime']=DCS.getModelTime()
+ temp['realtime']=DCS.getRealTime()
+ temp['pause']=DCS.getPause()
+ temp['multiplayer']=DCS.isMultiplayer()
+ Perun.UpdateStatusPart("mission",temp)
+
+ -- 2 - Players
+ temp = net.get_player_list()
+ for _, i in ipairs(temp) do
+ temp[i]=net.get_player_info(i)
+ end
+ Perun.UpdateStatusPart("players",temp)
+
+ -- Send
+ Perun.Send(2,Perun.StatusData)
+ end
+
+ Perun.UpdateMission = function()
+ -- Main function for mission information updates
+
+ -- Update Mission data
+ Perun.MissionData['name']=DCS.getMissionName()
+ Perun.MissionData['description']=DCS.getMissionDescription()
+ Perun.MissionData['filename']=DCS.getMissionFilename()
+ Perun.MissionData['modeltime']=DCS.getModelTime()
+ Perun.MissionData['realtime']=DCS.getRealTime()
+ Perun.MissionData['data']=DCS.getCurrentMission()
+ Perun.MissionData['coalitions']=DCS.getAvailableCoalitions()
+ Perun.MissionData['slots']={}
+
+ for j, i in pairs(Perun.MissionData['coalitions']) do
+ Perun.MissionData['slots'][j]=DCS.getAvailableSlots(j)
+ end
+ -- Send
+ Perun.Send(3,Perun.MissionData)
+ end
+
+
+--- Event callbacks
+ Perun.onSimulationFrame = function()
+ local _now = DCS.getRealTime()
+
+ if _now > Perun.lastSent + Perun.Refresh then
+ Perun.lastSent = _now
+
+ Perun.UpdateMission()
+ Perun.UpdateStatus()
+ Perun.UpdateVersion()
+ Perun.UpdateJson()
+ end
+
+ end
+
+ Perun.onMissionLoadEnd = function()
+ Perun.UpdateMission()
+ Perun.UpdateJson()
+ end
+
+-- Finalize and set callbacks
+ DCS.setUserCallbacks(Perun)
+ net.log("Loaded - Perun - VladMordock - " .. Perun.Version )
\ No newline at end of file
diff --git a/01_DCS/Json/perun_export.json b/01_DCS/Json/perun_export.json
new file mode 100644
index 0000000..e69de29
diff --git a/01_DCS/Perun.lua b/01_DCS/Perun.lua
deleted file mode 100644
index 36a9626..0000000
--- a/01_DCS/Perun.lua
+++ /dev/null
@@ -1,122 +0,0 @@
--- Perun hook by VladMordock
-
-local Perun = {}
-
-Perun.Version = "0.1"
-Perun.Refresh = 15
-Perun.StatusData = {}
-Perun.MissionData = {}
-
-local _lastSent = 0;
-
-local json_path = lfs.writedir() .."Scripts\\Json\\perun_export.json"
-
-package.path = package.path..";"..lfs.currentdir().."/LuaSocket/?.lua"
-package.cpath = package.cpath..";"..lfs.currentdir().."/LuaSocket/?.dll"
-
-socket = require("socket")
-Perun.UDP = assert(socket.udp())
-Perun.UDP:settimeout(0)
-Perun.UDP:setsockname("*", 48621)
-Perun.UDP:setpeername("127.0.0.1",48620)
-
-Perun.UDP:send("Perun online!")
-
-Perun.AddLog = function(text)
- net.log("Perun : ".. text)
-end
-
-Perun.UpdateJson = function()
- TempData={}
- TempData["1"]=Perun.StatusData
- TempData["2"]=Perun.MissionData
-
- io.open(json_path,"w"):close()
- perun_export = io.open(json_path, "w")
- perun_export:write(net.lua2json(TempData) .. "\n")
- perun_export:close()
-end
-
-Perun.Send = function(data_id, data_package)
- TempData={}
- TempData["type"]=data_id
- TempData["payload"]=Perun.StatusData
-
- temp=net.lua2json(TempData)
- Perun.UDP:send(temp)
- Perun.AddLog("Packet send")
-end
-
-Perun.UpdateStatusPart = function(part_id, data_package)
- Perun.StatusData[part_id] = data_package
-end
-
-Perun.UpdateStatus = function()
- -- 1 - Update time
- Perun.UpdateStatusPart("updated","TODO: OS TIME")
-
- -- 2 - Mission
- temp={}
- temp['name']=DCS.getMissionName()
- temp['filename']=DCS.getMissionFilename()
- temp['modeltime']=DCS.getModelTime()
- temp['realtime']=DCS.getRealTime()
- temp['pause']=DCS.getPause()
- temp['multiplayer']=DCS.isMultiplayer()
- Perun.UpdateStatusPart("mission",temp)
-
- -- 3 - Players
- temp = net.get_player_list()
- for _, i in ipairs(temp) do
- temp[i]=net.get_player_info(i)
- end
- Perun.UpdateStatusPart("players",temp)
-
- -- Send
- Perun.Send(1,Perun.StatusData)
-end
-
-Perun.UpdateMission = function()
- -- Mission data
- Perun.MissionData['updated']="TODO: OS TIME"
- Perun.MissionData['name']=DCS.getMissionName()
- Perun.MissionData['description']=DCS.getMissionDescription()
- Perun.MissionData['filename']=DCS.getMissionFilename()
- Perun.MissionData['modeltime']=DCS.getModelTime()
- Perun.MissionData['realtime']=DCS.getRealTime()
- Perun.MissionData['data']=DCS.getCurrentMission()
- Perun.MissionData['coalitions']=DCS.getAvailableCoalitions()
- Perun.MissionData['slots']={}
-
- for j, i in pairs(Perun.MissionData['coalitions']) do
- Perun.MissionData['slots'][j]=DCS.getAvailableSlots(j)
- end
- -- Send
- Perun.Send(2,Perun.MissionData)
-end
-
-
---- Event callback
-
-Perun.onSimulationFrame = function()
- local _now = DCS.getRealTime()
-
- if _now > _lastSent + Perun.Refresh then
- _lastSent = _now
-
- Perun.UpdateMission()
- Perun.UpdateStatus()
- Perun.UpdateJson()
- end
-
-end
-
-Perun.onMissionLoadEnd = function()
- Perun.UpdateMission()
- Perun.UpdateJson()
-end
-
---- Finalize and set callbacks
-
-DCS.setUserCallbacks(Perun)
-net.log("Loaded - Perun - VladMordock - " .. Perun.Version )
\ No newline at end of file
diff --git a/02_Windows_App/Perun_v1.sln b/02_Windows_App/Perun.sln
similarity index 100%
rename from 02_Windows_App/Perun_v1.sln
rename to 02_Windows_App/Perun.sln
diff --git a/02_Windows_App/Perun_v1/App.config b/02_Windows_App/Perun_v1/App.config
index 731f6de..1a14eda 100644
--- a/02_Windows_App/Perun_v1/App.config
+++ b/02_Windows_App/Perun_v1/App.config
@@ -1,6 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ False
+
+
+ False
+
+
+
\ No newline at end of file
diff --git a/02_Windows_App/Perun_v1/Perun_v1.csproj b/02_Windows_App/Perun_v1/Perun_v1.csproj
index 4fa822b..e9bf3b5 100644
--- a/02_Windows_App/Perun_v1/Perun_v1.csproj
+++ b/02_Windows_App/Perun_v1/Perun_v1.csproj
@@ -12,6 +12,22 @@
512
true
true
+ false
+ C:\Users\simpo\Desktop\Perun\
+ true
+ Disk
+ false
+ Foreground
+ 7
+ Days
+ false
+ false
+ true
+ 1
+ 1.0.0.%2a
+ false
+ true
+ true
AnyCPU
@@ -32,9 +48,40 @@
prompt
4
+
+ perun_logo.ico
+
+
+ 2ACE4C8C2C325A04CA5986B1CD76744B4B03755D
+
+
+ Perun_v1_TemporaryKey.pfx
+
+
+ true
+
+
+ true
+
+
+ ..\packages\Google.Protobuf.3.5.1\lib\net45\Google.Protobuf.dll
+
+
+ ..\packages\MySql.Data.8.0.15\lib\net452\MySql.Data.dll
+
+
+ ..\packages\Newtonsoft.Json.12.0.1\lib\net45\Newtonsoft.Json.dll
+
+
+
+
+
+
+
+
@@ -65,7 +112,10 @@
True
Resources.resx
+ True
+
+
SettingsSingleFileGenerator
Settings.Designer.cs
@@ -79,5 +129,20 @@
+
+
+ False
+ Microsoft .NET Framework 4.6.1 %28x86 i x64%29
+ true
+
+
+ False
+ .NET Framework 3.5 SP1
+ false
+
+
+
+
+
\ No newline at end of file
diff --git a/02_Windows_App/Perun_v1/Program.cs b/02_Windows_App/Perun_v1/Program.cs
index 0394a13..0d3e1a5 100644
--- a/02_Windows_App/Perun_v1/Program.cs
+++ b/02_Windows_App/Perun_v1/Program.cs
@@ -1,22 +1,32 @@
using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Threading.Tasks;
using System.Windows.Forms;
namespace Perun_v1
{
+
static class Program
{
///
/// Główny punkt wejścia dla aplikacji.
///
[STAThread]
+
+
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
+
+ Application.ApplicationExit += new EventHandler(Application_ApplicationExit);
+
+ void Application_ApplicationExit(object sender, EventArgs e)
+ {
+ Properties.Settings.Default.Save();
+ }
+
Application.Run(new form_Main());
}
+
+
}
}
diff --git a/02_Windows_App/Perun_v1/Properties/AssemblyInfo.cs b/02_Windows_App/Perun_v1/Properties/AssemblyInfo.cs
index 8867272..02a1660 100644
--- a/02_Windows_App/Perun_v1/Properties/AssemblyInfo.cs
+++ b/02_Windows_App/Perun_v1/Properties/AssemblyInfo.cs
@@ -1,15 +1,16 @@
-using System.Reflection;
+using System.Resources;
+using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// Ogólne informacje o zestawie są kontrolowane poprzez następujący
// zestaw atrybutów. Zmień wartości tych atrybutów, aby zmodyfikować informacje
// powiązane z zestawem.
-[assembly: AssemblyTitle("Perun_v1")]
-[assembly: AssemblyDescription("")]
+[assembly: AssemblyTitle("Perun for DCS World")]
+[assembly: AssemblyDescription("https://github.com/szporwolik/perun")]
[assembly: AssemblyConfiguration("")]
-[assembly: AssemblyCompany("")]
-[assembly: AssemblyProduct("Perun_v1")]
+[assembly: AssemblyCompany("Szymon Porwolik")]
+[assembly: AssemblyProduct("Perun for DCS World")]
[assembly: AssemblyCopyright("Copyright © 2019")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
@@ -32,5 +33,7 @@ using System.Runtime.InteropServices;
// Możesz określić wszystkie wartości lub użyć domyślnych numerów kompilacji i poprawki
// przy użyciu symbolu „*”, tak jak pokazano poniżej:
// [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("1.0.0.0")]
-[assembly: AssemblyFileVersion("1.0.0.0")]
+[assembly: AssemblyVersion("0.1.0.0")]
+[assembly: AssemblyFileVersion("0.1.0.0")]
+[assembly: NeutralResourcesLanguage("en")]
+
diff --git a/02_Windows_App/Perun_v1/Properties/Resources.Designer.cs b/02_Windows_App/Perun_v1/Properties/Resources.Designer.cs
index 3dcfd19..9aee274 100644
--- a/02_Windows_App/Perun_v1/Properties/Resources.Designer.cs
+++ b/02_Windows_App/Perun_v1/Properties/Resources.Designer.cs
@@ -1,69 +1,61 @@
//------------------------------------------------------------------------------
//
// Ten kod został wygenerowany przez narzędzie.
-// Wersja środowiska uruchomieniowego: 4.0.30319.42000
+// Wersja wykonawcza:4.0.30319.42000
//
-// Modyfikacje tego pliku mogą spowodować niewłaściwe zachowanie i zostaną utracone
-// w przypadku ponownego wygenerowania kodu.
+// Zmiany w tym pliku mogą spowodować nieprawidłowe zachowanie i zostaną utracone, jeśli
+// kod zostanie ponownie wygenerowany.
//
//------------------------------------------------------------------------------
-namespace Perun_v1.Properties
-{
-
-
+namespace Perun_v1.Properties {
+ using System;
+
+
///
- /// Silnie typizowana klasa zasobów do wyszukiwania zlokalizowanych ciągów itd.
+ /// Klasa zasobu wymagająca zdefiniowania typu do wyszukiwania zlokalizowanych ciągów itd.
///
// Ta klasa została automatycznie wygenerowana za pomocą klasy StronglyTypedResourceBuilder
// przez narzędzie, takie jak ResGen lub Visual Studio.
- // Aby dodać lub usunąć składowe, edytuj plik ResX, a następnie ponownie uruchom narzędzie ResGen
- // z opcją /str lub ponownie skompiluj projekt programu VS.
- [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
+ // Aby dodać lub usunąć składową, edytuj plik ResX, a następnie ponownie uruchom narzędzie ResGen
+ // z opcją /str lub ponownie utwórz projekt VS.
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
- internal class Resources
- {
-
+ 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()
- {
+ internal Resources() {
}
-
+
///
- /// Zwraca buforowane wystąpienie składnika ResourceManager używane przez tę klasę.
+ /// Zwraca buforowane wystąpienie ResourceManager używane przez tę klasę.
///
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
- internal static global::System.Resources.ResourceManager ResourceManager
- {
- get
- {
- if ((resourceMan == null))
- {
+ internal static global::System.Resources.ResourceManager ResourceManager {
+ get {
+ if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Perun_v1.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
-
+
///
/// Przesłania właściwość CurrentUICulture bieżącego wątku dla wszystkich
- /// przypadków przeszukiwania zasobów za pomocą tej silnie typizowanej klasy zasobów.
+ /// przypadków przeszukiwania zasobów za pomocą tej klasy zasobów wymagającej zdefiniowania typu.
///
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
- internal static global::System.Globalization.CultureInfo Culture
- {
- get
- {
+ internal static global::System.Globalization.CultureInfo Culture {
+ get {
return resourceCulture;
}
- set
- {
+ set {
resourceCulture = value;
}
}
diff --git a/02_Windows_App/Perun_v1/Properties/Settings.Designer.cs b/02_Windows_App/Perun_v1/Properties/Settings.Designer.cs
index 66c6209..1b53716 100644
--- a/02_Windows_App/Perun_v1/Properties/Settings.Designer.cs
+++ b/02_Windows_App/Perun_v1/Properties/Settings.Designer.cs
@@ -1,30 +1,122 @@
//------------------------------------------------------------------------------
//
-// This code was generated by a tool.
-// Runtime Version:4.0.30319.42000
+// Ten kod został wygenerowany przez narzędzie.
+// Wersja wykonawcza:4.0.30319.42000
//
-// Changes to this file may cause incorrect behavior and will be lost if
-// the code is regenerated.
+// Zmiany w tym pliku mogą spowodować nieprawidłowe zachowanie i zostaną utracone, jeśli
+// kod zostanie ponownie wygenerowany.
//
//------------------------------------------------------------------------------
-namespace Perun_v1.Properties
-{
-
-
+namespace Perun_v1.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
- {
-
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "15.9.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
- {
+
+ public static Settings Default {
+ get {
return defaultInstance;
}
}
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("")]
+ public string MYSQL_Server {
+ get {
+ return ((string)(this["MYSQL_Server"]));
+ }
+ set {
+ this["MYSQL_Server"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("")]
+ public string MYSQL_User {
+ get {
+ return ((string)(this["MYSQL_User"]));
+ }
+ set {
+ this["MYSQL_User"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("")]
+ public string MYSQL_Password {
+ get {
+ return ((string)(this["MYSQL_Password"]));
+ }
+ set {
+ this["MYSQL_Password"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("")]
+ public string MYSQL_DB {
+ get {
+ return ((string)(this["MYSQL_DB"]));
+ }
+ set {
+ this["MYSQL_DB"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("")]
+ public string OTHER_LOTATC_FILE {
+ get {
+ return ((string)(this["OTHER_LOTATC_FILE"]));
+ }
+ set {
+ this["OTHER_LOTATC_FILE"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("")]
+ public string OTHER_SRS_FILE {
+ get {
+ return ((string)(this["OTHER_SRS_FILE"]));
+ }
+ set {
+ this["OTHER_SRS_FILE"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("False")]
+ public bool OTHER_LOTATC_USE {
+ get {
+ return ((bool)(this["OTHER_LOTATC_USE"]));
+ }
+ set {
+ this["OTHER_LOTATC_USE"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("False")]
+ public bool OTHER_SRS_USE {
+ get {
+ return ((bool)(this["OTHER_SRS_USE"]));
+ }
+ set {
+ this["OTHER_SRS_USE"] = value;
+ }
+ }
}
}
diff --git a/02_Windows_App/Perun_v1/Properties/Settings.settings b/02_Windows_App/Perun_v1/Properties/Settings.settings
index 3964565..e967b56 100644
--- a/02_Windows_App/Perun_v1/Properties/Settings.settings
+++ b/02_Windows_App/Perun_v1/Properties/Settings.settings
@@ -1,7 +1,30 @@
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ False
+
+
+ False
+
+
+
\ No newline at end of file
diff --git a/02_Windows_App/Perun_v1/form_Main.Designer.cs b/02_Windows_App/Perun_v1/form_Main.Designer.cs
index 9a68716..65867ed 100644
--- a/02_Windows_App/Perun_v1/form_Main.Designer.cs
+++ b/02_Windows_App/Perun_v1/form_Main.Designer.cs
@@ -28,46 +28,339 @@
///
private void InitializeComponent()
{
+ this.components = new System.ComponentModel.Container();
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(form_Main));
this.con_List_Received = new System.Windows.Forms.ListBox();
- this.con_Button_DEBUG = new System.Windows.Forms.Button();
+ this.con_Button_Listen_ON = new System.Windows.Forms.Button();
+ this.con_Button_Listen_OFF = new System.Windows.Forms.Button();
+ this.con_GroupBox_1 = new System.Windows.Forms.GroupBox();
+ this.tim_1000ms = new System.Windows.Forms.Timer(this.components);
+ this.con_GroupBox_2 = new System.Windows.Forms.GroupBox();
+ this.label4 = new System.Windows.Forms.Label();
+ this.con_txt_mysql_username = new System.Windows.Forms.TextBox();
+ this.label3 = new System.Windows.Forms.Label();
+ this.label2 = new System.Windows.Forms.Label();
+ this.label1 = new System.Windows.Forms.Label();
+ this.con_txt_mysql_database = new System.Windows.Forms.TextBox();
+ this.con_txt_mysql_server = new System.Windows.Forms.TextBox();
+ this.con_txt_mysql_password = new System.Windows.Forms.MaskedTextBox();
+ this.con_GroupBox_3 = new System.Windows.Forms.GroupBox();
+ this.con_txt_3rd_lotatc = new System.Windows.Forms.MaskedTextBox();
+ this.con_txt_3rd_srs = new System.Windows.Forms.MaskedTextBox();
+ this.con_check_3rd_lotatc = new System.Windows.Forms.CheckBox();
+ this.con_check_3rd_srs = new System.Windows.Forms.CheckBox();
+ this.con_Button_Quit = new System.Windows.Forms.Button();
+ this.con_lab_github = new System.Windows.Forms.LinkLabel();
+ this.label5 = new System.Windows.Forms.Label();
+ this.trayIconMain = new System.Windows.Forms.NotifyIcon(this.components);
+ this.openFileDialog_SRS = new System.Windows.Forms.OpenFileDialog();
+ this.openFileDialog_LotATC = new System.Windows.Forms.OpenFileDialog();
+ this.tim_10000ms = new System.Windows.Forms.Timer(this.components);
+ this.con_GroupBox_1.SuspendLayout();
+ this.con_GroupBox_2.SuspendLayout();
+ this.con_GroupBox_3.SuspendLayout();
this.SuspendLayout();
//
// con_List_Received
//
+ this.con_List_Received.Enabled = false;
this.con_List_Received.FormattingEnabled = true;
- this.con_List_Received.Location = new System.Drawing.Point(12, 12);
+ this.con_List_Received.Items.AddRange(new object[] {
+ "Loading",
+ "Loading",
+ "Loading",
+ "Loading",
+ "Loading",
+ "Loading",
+ "Loading",
+ "Loading",
+ "Loading",
+ "Loading"});
+ this.con_List_Received.Location = new System.Drawing.Point(6, 19);
this.con_List_Received.Name = "con_List_Received";
- this.con_List_Received.Size = new System.Drawing.Size(594, 550);
+ this.con_List_Received.Size = new System.Drawing.Size(307, 134);
this.con_List_Received.TabIndex = 0;
//
- // con_Button_DEBUG
+ // con_Button_Listen_ON
//
- this.con_Button_DEBUG.Location = new System.Drawing.Point(612, 21);
- this.con_Button_DEBUG.Name = "con_Button_DEBUG";
- this.con_Button_DEBUG.Size = new System.Drawing.Size(80, 48);
- this.con_Button_DEBUG.TabIndex = 1;
- this.con_Button_DEBUG.Text = "Debug";
- this.con_Button_DEBUG.UseVisualStyleBackColor = true;
- this.con_Button_DEBUG.Click += new System.EventHandler(this.con_Button_DEBUG_Click);
+ this.con_Button_Listen_ON.Location = new System.Drawing.Point(12, 405);
+ this.con_Button_Listen_ON.Name = "con_Button_Listen_ON";
+ this.con_Button_Listen_ON.Size = new System.Drawing.Size(86, 39);
+ this.con_Button_Listen_ON.TabIndex = 2;
+ this.con_Button_Listen_ON.Text = "Connect";
+ this.con_Button_Listen_ON.UseVisualStyleBackColor = true;
+ this.con_Button_Listen_ON.Click += new System.EventHandler(this.con_Button_Listen_ON_Click);
+ //
+ // con_Button_Listen_OFF
+ //
+ this.con_Button_Listen_OFF.Enabled = false;
+ this.con_Button_Listen_OFF.Location = new System.Drawing.Point(104, 405);
+ this.con_Button_Listen_OFF.Name = "con_Button_Listen_OFF";
+ this.con_Button_Listen_OFF.Size = new System.Drawing.Size(86, 39);
+ this.con_Button_Listen_OFF.TabIndex = 3;
+ this.con_Button_Listen_OFF.Text = "Disconnect";
+ this.con_Button_Listen_OFF.UseVisualStyleBackColor = true;
+ this.con_Button_Listen_OFF.Click += new System.EventHandler(this.con_Button_Listen_OFF_Click);
+ //
+ // con_GroupBox_1
+ //
+ this.con_GroupBox_1.Controls.Add(this.con_List_Received);
+ this.con_GroupBox_1.Location = new System.Drawing.Point(12, 235);
+ this.con_GroupBox_1.Name = "con_GroupBox_1";
+ this.con_GroupBox_1.Size = new System.Drawing.Size(324, 164);
+ this.con_GroupBox_1.TabIndex = 4;
+ this.con_GroupBox_1.TabStop = false;
+ this.con_GroupBox_1.Text = "UDP log";
+ //
+ // tim_1000ms
+ //
+ this.tim_1000ms.Interval = 1000;
+ this.tim_1000ms.Tick += new System.EventHandler(this.timer1_Tick);
+ //
+ // con_GroupBox_2
+ //
+ this.con_GroupBox_2.Controls.Add(this.label4);
+ this.con_GroupBox_2.Controls.Add(this.con_txt_mysql_username);
+ this.con_GroupBox_2.Controls.Add(this.label3);
+ this.con_GroupBox_2.Controls.Add(this.label2);
+ this.con_GroupBox_2.Controls.Add(this.label1);
+ this.con_GroupBox_2.Controls.Add(this.con_txt_mysql_database);
+ this.con_GroupBox_2.Controls.Add(this.con_txt_mysql_server);
+ this.con_GroupBox_2.Controls.Add(this.con_txt_mysql_password);
+ this.con_GroupBox_2.Location = new System.Drawing.Point(12, 27);
+ this.con_GroupBox_2.Name = "con_GroupBox_2";
+ this.con_GroupBox_2.Size = new System.Drawing.Size(324, 127);
+ this.con_GroupBox_2.TabIndex = 5;
+ this.con_GroupBox_2.TabStop = false;
+ this.con_GroupBox_2.Text = "MySQL";
+ //
+ // label4
+ //
+ this.label4.AutoSize = true;
+ this.label4.Location = new System.Drawing.Point(45, 74);
+ this.label4.Name = "label4";
+ this.label4.Size = new System.Drawing.Size(55, 13);
+ this.label4.TabIndex = 7;
+ this.label4.Text = "Username";
+ //
+ // con_txt_mysql_username
+ //
+ this.con_txt_mysql_username.Location = new System.Drawing.Point(106, 71);
+ this.con_txt_mysql_username.Name = "con_txt_mysql_username";
+ this.con_txt_mysql_username.Size = new System.Drawing.Size(207, 20);
+ this.con_txt_mysql_username.TabIndex = 6;
+ //
+ // label3
+ //
+ this.label3.AutoSize = true;
+ this.label3.Location = new System.Drawing.Point(47, 100);
+ this.label3.Name = "label3";
+ this.label3.Size = new System.Drawing.Size(53, 13);
+ this.label3.TabIndex = 5;
+ this.label3.Text = "Password";
+ //
+ // label2
+ //
+ this.label2.AutoSize = true;
+ this.label2.Location = new System.Drawing.Point(47, 48);
+ this.label2.Name = "label2";
+ this.label2.Size = new System.Drawing.Size(53, 13);
+ this.label2.TabIndex = 4;
+ this.label2.Text = "Database";
+ //
+ // label1
+ //
+ this.label1.AutoSize = true;
+ this.label1.Location = new System.Drawing.Point(22, 22);
+ this.label1.Name = "label1";
+ this.label1.Size = new System.Drawing.Size(78, 13);
+ this.label1.TabIndex = 3;
+ this.label1.Text = "Server address";
+ //
+ // con_txt_mysql_database
+ //
+ this.con_txt_mysql_database.Location = new System.Drawing.Point(106, 45);
+ this.con_txt_mysql_database.Name = "con_txt_mysql_database";
+ this.con_txt_mysql_database.Size = new System.Drawing.Size(207, 20);
+ this.con_txt_mysql_database.TabIndex = 2;
+ //
+ // con_txt_mysql_server
+ //
+ this.con_txt_mysql_server.Location = new System.Drawing.Point(106, 19);
+ this.con_txt_mysql_server.Name = "con_txt_mysql_server";
+ this.con_txt_mysql_server.Size = new System.Drawing.Size(207, 20);
+ this.con_txt_mysql_server.TabIndex = 1;
+ //
+ // con_txt_mysql_password
+ //
+ this.con_txt_mysql_password.Location = new System.Drawing.Point(106, 97);
+ this.con_txt_mysql_password.Name = "con_txt_mysql_password";
+ this.con_txt_mysql_password.PasswordChar = '*';
+ this.con_txt_mysql_password.Size = new System.Drawing.Size(207, 20);
+ this.con_txt_mysql_password.TabIndex = 0;
+ //
+ // con_GroupBox_3
+ //
+ this.con_GroupBox_3.Controls.Add(this.con_txt_3rd_lotatc);
+ this.con_GroupBox_3.Controls.Add(this.con_txt_3rd_srs);
+ this.con_GroupBox_3.Controls.Add(this.con_check_3rd_lotatc);
+ this.con_GroupBox_3.Controls.Add(this.con_check_3rd_srs);
+ this.con_GroupBox_3.Location = new System.Drawing.Point(12, 160);
+ this.con_GroupBox_3.Name = "con_GroupBox_3";
+ this.con_GroupBox_3.Size = new System.Drawing.Size(324, 69);
+ this.con_GroupBox_3.TabIndex = 6;
+ this.con_GroupBox_3.TabStop = false;
+ this.con_GroupBox_3.Text = "3rd Party";
+ //
+ // con_txt_3rd_lotatc
+ //
+ this.con_txt_3rd_lotatc.Location = new System.Drawing.Point(123, 39);
+ this.con_txt_3rd_lotatc.Name = "con_txt_3rd_lotatc";
+ this.con_txt_3rd_lotatc.Size = new System.Drawing.Size(190, 20);
+ this.con_txt_3rd_lotatc.TabIndex = 4;
+ this.con_txt_3rd_lotatc.MouseClick += new System.Windows.Forms.MouseEventHandler(this.con_txt_3rd_lotatc_Click);
+ //
+ // con_txt_3rd_srs
+ //
+ this.con_txt_3rd_srs.Location = new System.Drawing.Point(123, 16);
+ this.con_txt_3rd_srs.Name = "con_txt_3rd_srs";
+ this.con_txt_3rd_srs.Size = new System.Drawing.Size(190, 20);
+ this.con_txt_3rd_srs.TabIndex = 3;
+ this.con_txt_3rd_srs.MouseClick += new System.Windows.Forms.MouseEventHandler(this.con_txt_3rd_srs_Click);
+ //
+ // con_check_3rd_lotatc
+ //
+ this.con_check_3rd_lotatc.AutoSize = true;
+ this.con_check_3rd_lotatc.Location = new System.Drawing.Point(6, 42);
+ this.con_check_3rd_lotatc.Name = "con_check_3rd_lotatc";
+ this.con_check_3rd_lotatc.Size = new System.Drawing.Size(100, 17);
+ this.con_check_3rd_lotatc.TabIndex = 1;
+ this.con_check_3rd_lotatc.Text = "LotATC json file";
+ this.con_check_3rd_lotatc.UseVisualStyleBackColor = true;
+ //
+ // con_check_3rd_srs
+ //
+ this.con_check_3rd_srs.AutoSize = true;
+ this.con_check_3rd_srs.Location = new System.Drawing.Point(6, 19);
+ this.con_check_3rd_srs.Name = "con_check_3rd_srs";
+ this.con_check_3rd_srs.Size = new System.Drawing.Size(111, 17);
+ this.con_check_3rd_srs.TabIndex = 0;
+ this.con_check_3rd_srs.Text = "DCS SRS json file";
+ this.con_check_3rd_srs.UseVisualStyleBackColor = true;
+ //
+ // con_Button_Quit
+ //
+ this.con_Button_Quit.Location = new System.Drawing.Point(250, 405);
+ this.con_Button_Quit.Name = "con_Button_Quit";
+ this.con_Button_Quit.Size = new System.Drawing.Size(86, 39);
+ this.con_Button_Quit.TabIndex = 7;
+ this.con_Button_Quit.Text = "Quit";
+ this.con_Button_Quit.UseVisualStyleBackColor = true;
+ this.con_Button_Quit.Click += new System.EventHandler(this.con_Button_Quit_Click);
+ //
+ // con_lab_github
+ //
+ this.con_lab_github.AutoSize = true;
+ this.con_lab_github.Location = new System.Drawing.Point(141, 9);
+ this.con_lab_github.Name = "con_lab_github";
+ this.con_lab_github.Size = new System.Drawing.Size(181, 13);
+ this.con_lab_github.TabIndex = 8;
+ this.con_lab_github.TabStop = true;
+ this.con_lab_github.Text = "https://github.com/szporwolik/perun";
+ this.con_lab_github.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.con_lab_github_LinkClicked);
+ //
+ // label5
+ //
+ this.label5.AutoSize = true;
+ this.label5.Location = new System.Drawing.Point(15, 9);
+ this.label5.Name = "label5";
+ this.label5.Size = new System.Drawing.Size(120, 13);
+ this.label5.TabIndex = 9;
+ this.label5.Text = "Manual and bugtracker:";
+ //
+ // trayIconMain
+ //
+ this.trayIconMain.BalloonTipIcon = System.Windows.Forms.ToolTipIcon.Info;
+ this.trayIconMain.BalloonTipText = "Perun";
+ this.trayIconMain.BalloonTipTitle = "Perun for DCS World";
+ this.trayIconMain.Icon = ((System.Drawing.Icon)(resources.GetObject("trayIconMain.Icon")));
+ this.trayIconMain.Text = "Perun for DCS World";
+ this.trayIconMain.MouseClick += new System.Windows.Forms.MouseEventHandler(this.trayIconMain_MouseDoubleClick);
+ this.trayIconMain.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.trayIconMain_MouseDoubleClick);
+ //
+ // openFileDialog_SRS
+ //
+ this.openFileDialog_SRS.FileName = "openFileDialog1";
+ //
+ // openFileDialog_LotATC
+ //
+ this.openFileDialog_LotATC.FileName = "openFileDialog1";
+ //
+ // tim_10000ms
+ //
+ this.tim_10000ms.Interval = 10000;
+ this.tim_10000ms.Tick += new System.EventHandler(this.tim_10000ms_Tick);
//
// form_Main
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
- this.ClientSize = new System.Drawing.Size(738, 567);
- this.Controls.Add(this.con_Button_DEBUG);
- this.Controls.Add(this.con_List_Received);
+ this.ClientSize = new System.Drawing.Size(348, 456);
+ this.Controls.Add(this.label5);
+ this.Controls.Add(this.con_lab_github);
+ this.Controls.Add(this.con_Button_Quit);
+ this.Controls.Add(this.con_GroupBox_3);
+ this.Controls.Add(this.con_GroupBox_2);
+ this.Controls.Add(this.con_GroupBox_1);
+ this.Controls.Add(this.con_Button_Listen_OFF);
+ this.Controls.Add(this.con_Button_Listen_ON);
+ this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
+ this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+ this.MaximizeBox = false;
+ this.MinimizeBox = false;
this.Name = "form_Main";
+ this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "Perun for DCS World";
+ this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.form_Main_FormClosing);
this.Load += new System.EventHandler(this.form_Main_Load);
+ this.con_GroupBox_1.ResumeLayout(false);
+ this.con_GroupBox_2.ResumeLayout(false);
+ this.con_GroupBox_2.PerformLayout();
+ this.con_GroupBox_3.ResumeLayout(false);
+ this.con_GroupBox_3.PerformLayout();
this.ResumeLayout(false);
+ this.PerformLayout();
}
#endregion
private System.Windows.Forms.ListBox con_List_Received;
- private System.Windows.Forms.Button con_Button_DEBUG;
+ private System.Windows.Forms.Button con_Button_Listen_ON;
+ private System.Windows.Forms.Button con_Button_Listen_OFF;
+ private System.Windows.Forms.GroupBox con_GroupBox_1;
+ private System.Windows.Forms.Timer tim_1000ms;
+ private System.Windows.Forms.GroupBox con_GroupBox_2;
+ private System.Windows.Forms.GroupBox con_GroupBox_3;
+ private System.Windows.Forms.TextBox con_txt_mysql_database;
+ private System.Windows.Forms.TextBox con_txt_mysql_server;
+ private System.Windows.Forms.MaskedTextBox con_txt_mysql_password;
+ private System.Windows.Forms.Button con_Button_Quit;
+ private System.Windows.Forms.MaskedTextBox con_txt_3rd_lotatc;
+ private System.Windows.Forms.MaskedTextBox con_txt_3rd_srs;
+ private System.Windows.Forms.CheckBox con_check_3rd_lotatc;
+ private System.Windows.Forms.CheckBox con_check_3rd_srs;
+ private System.Windows.Forms.Label label4;
+ private System.Windows.Forms.TextBox con_txt_mysql_username;
+ private System.Windows.Forms.Label label3;
+ private System.Windows.Forms.Label label2;
+ private System.Windows.Forms.Label label1;
+ private System.Windows.Forms.LinkLabel con_lab_github;
+ private System.Windows.Forms.Label label5;
+ private System.Windows.Forms.NotifyIcon trayIconMain;
+ private System.Windows.Forms.OpenFileDialog openFileDialog_SRS;
+ private System.Windows.Forms.OpenFileDialog openFileDialog_LotATC;
+ private System.Windows.Forms.Timer tim_10000ms;
}
}
diff --git a/02_Windows_App/Perun_v1/form_Main.cs b/02_Windows_App/Perun_v1/form_Main.cs
index cfea823..fc7617c 100644
--- a/02_Windows_App/Perun_v1/form_Main.cs
+++ b/02_Windows_App/Perun_v1/form_Main.cs
@@ -1,30 +1,347 @@
using System;
-using System.Collections.Generic;
-using System.ComponentModel;
-using System.Data;
-using System.Drawing;
-using System.Linq;
+using System.Diagnostics;
+using System.Net;
+using System.Net.Sockets;
+using System.Reflection;
using System.Text;
-using System.Threading.Tasks;
+using System.Threading;
using System.Windows.Forms;
+using MySql.Data.MySqlClient;
+using Newtonsoft.Json;
+
namespace Perun_v1
{
public partial class form_Main : Form
{
- public form_Main()
+
+ // Variable definitions
+ public Thread thread_UDPListener; // Seperate thread for UDP
+ public class_UDPListener UDPListener; // Helper class for UDP comunication
+ public string[] LogHistory=new string[10]; // Log history for GUI
+ public string[] SendBuffer=new string[10]; // Mysql send buffer
+ public bool LetMeOut=false; // Helper to handle system tray
+ public string MySql_connStr; // MySQL connection string
+
+ public static void LogHistoryAdd(ref string[] LogHistory, string Comment)
{
- InitializeComponent();
+ // Add to log history and rotate
+ for (int i = 0; i < LogHistory.Length - 1; i++)
+ {
+ LogHistory[i] = LogHistory[i + 1];
+ }
+ LogHistory[9] = DateTime.Now.ToString("HH:mm:ss") + " > " + Comment;
}
- private void con_Button_DEBUG_Click(object sender, EventArgs e)
+ public void SendToMySql(string raw_udp_frame)
{
- con_List_Received.Items.Add("test");
+ // Main function to send data to mysql
+ // TODO : persistent connection and error handling
+
+ dynamic udp_frame = JsonConvert.DeserializeObject(raw_udp_frame);
+
+ // Cut raw data to type and paylod for proper mysql insert
+ string type = udp_frame.type;
+
+
+ // Type specyfic
+ if (type == "1") // Inject app version information
+ {
+ Assembly assembly = Assembly.GetExecutingAssembly();
+ FileVersionInfo fileVersionInfo = FileVersionInfo.GetVersionInfo(assembly.Location);
+ string version = fileVersionInfo.ProductVersion;
+ udp_frame.payload["v_win"] = "v"+version;
+ }
+
+ string payload = JsonConvert.SerializeObject(udp_frame.payload);
+ // Connect to mysql
+ MySqlConnection conn = new MySqlConnection(MySql_connStr);
+ try
+ {
+ Console.WriteLine("Sending data to MySQL - Begin");
+ conn.Open();
+
+ string sql = "INSERT INTO pe_DataRaw(pe_dataraw_type,pe_dataraw_payload) VALUES (" + type+",JSON_QUOTE('" + payload + "')) ON DUPLICATE KEY UPDATE pe_dataraw_payload = JSON_QUOTE('" + payload + "')";
+
+ MySqlCommand cmd = new MySqlCommand(sql, conn);
+ MySqlDataReader rdr = cmd.ExecuteReader();
+
+ while (rdr.Read())
+ {
+ Console.WriteLine(rdr[0] + " -- " + rdr[1]);
+ }
+ rdr.Close();
+ LogHistoryAdd(ref LogHistory, "MySQL updated, package type: "+ type);
+ }
+ catch (Exception ex)
+ {
+ Console.WriteLine(ex.ToString());
+ LogHistoryAdd(ref LogHistory, "ERROR: MySQL");
+ }
+
+ conn.Close();
+ Console.WriteLine("Sending data to MySQL - Done");
+ }
+
+
+
+ public class class_UDPListener
+ {
+ // Main class for UDP listener
+ int listenPort; // Port to listen at
+ public bool done; // Helper to exit main loop without killing thread
+ public UdpClient listener; // Listener object
+ public string[] LogHistory; // Log history for GUI
+ public string[] SendBuffer; // Mysql send buffer
+
+ public class_UDPListener(int port, ref string[] LogHistory, ref string[] SendBuffer)
+ {
+ // Create clas - NOTE that there is reference passing
+ this.listenPort = port;
+ this.LogHistory = LogHistory;
+ this.SendBuffer = SendBuffer;
+ }
+
+ public void StartListen()
+ {
+ // Start listening to UDP
+ this.done = false;
+ listener = new UdpClient(listenPort);
+ IPEndPoint groupEP = new IPEndPoint(IPAddress.Loopback, listenPort);
+ string received_data;
+ byte[] receive_byte_array;
+
+ Console.WriteLine("UDP Listen start");
+ try
+ {
+ while (!done)
+ {
+ Console.WriteLine("UDP: Waiting for packet");
+ receive_byte_array = listener.Receive(ref groupEP);
+ received_data = Encoding.ASCII.GetString(receive_byte_array, 0, receive_byte_array.Length);
+
+ Console.WriteLine("Sender: {0} Payload: {1}", groupEP.ToString(), received_data);
+
+ // Add to log history and rotate
+ dynamic udp_frame = JsonConvert.DeserializeObject(received_data);
+ string type = udp_frame.type;
+ LogHistoryAdd(ref LogHistory, "UDP packet received, type: "+ type);
+
+ // Add to mySQL send buffer and rotate
+ for (int i = 0; i < SendBuffer.Length - 1; i++)
+ {
+ SendBuffer[i] = SendBuffer[i + 1];
+ }
+ SendBuffer[9] = received_data;
+
+ }
+ }
+ catch (Exception e)
+ {
+ Console.WriteLine(e.ToString());
+ }
+ Console.WriteLine("UDP listen stop");
+ listener.Close();
+ }
+ }
+
+
+ public form_Main()
+ {
+ // Form init
+ InitializeComponent();
}
private void form_Main_Load(object sender, EventArgs e)
{
+ // Form loaded - fill controls with default values
+ LogHistory[0] = DateTime.Now.ToString("HH:mm:ss") + " > " + "Perun loaded...";
+ // Load settings
+ con_txt_mysql_database.Text = Properties.Settings.Default.MYSQL_DB;
+ con_txt_mysql_username.Text = Properties.Settings.Default.MYSQL_User;
+ con_txt_mysql_password.Text = Properties.Settings.Default.MYSQL_Password;
+ con_txt_mysql_server.Text = Properties.Settings.Default.MYSQL_Server;
+ con_txt_3rd_lotatc.Text = Properties.Settings.Default.OTHER_LOTATC_FILE;
+ con_txt_3rd_srs.Text = Properties.Settings.Default.OTHER_SRS_FILE;
+ con_check_3rd_lotatc.Checked = Properties.Settings.Default.OTHER_LOTATC_USE;
+ con_check_3rd_srs.Checked = Properties.Settings.Default.OTHER_SRS_USE;
+ }
+
+ private void con_Button_Listen_ON_Click(object sender, EventArgs e)
+ {
+ // Start listening
+ UDPListener = new class_UDPListener(48620,ref LogHistory, ref SendBuffer);
+ thread_UDPListener = new Thread(UDPListener.StartListen);
+ thread_UDPListener.Start();
+
+ // Update form controls
+ con_Button_Listen_ON.Enabled = false;
+ con_Button_Listen_OFF.Enabled = true;
+
+ con_txt_mysql_database.Enabled = false;
+ con_txt_mysql_username.Enabled = false;
+ con_txt_mysql_password.Enabled = false;
+ con_txt_mysql_server.Enabled = false;
+ con_txt_3rd_lotatc.Enabled = false;
+ con_txt_3rd_srs.Enabled = false;
+ con_check_3rd_lotatc.Enabled = false;
+ con_check_3rd_srs.Enabled = false;
+ // Prepare connection string
+ MySql_connStr = "server="+con_txt_mysql_server.Text+";user="+con_txt_mysql_username.Text+";database="+con_txt_mysql_database.Text+";port=3306;password="+con_txt_mysql_password.Text;
+
+ // Start timmers
+ tim_1000ms.Enabled = true;
+ tim_10000ms.Enabled = true;
+ }
+
+ private void con_Button_Listen_OFF_Click(object sender, EventArgs e)
+ {
+ // Stop listening
+ UDPListener.listener.Close();
+
+ // Update form controls
+ con_Button_Listen_ON.Enabled = true;
+ con_Button_Listen_OFF.Enabled = false;
+
+ con_txt_mysql_database.Enabled = true;
+ con_txt_mysql_username.Enabled = true;
+ con_txt_mysql_password.Enabled = true;
+ con_txt_mysql_server.Enabled = true;
+ con_txt_3rd_lotatc.Enabled = true;
+ con_txt_3rd_srs.Enabled = true;
+ con_check_3rd_lotatc.Enabled = true;
+ con_check_3rd_srs.Enabled = true;
+
+ // Stop timmers
+ tim_1000ms.Enabled = false;
+ tim_10000ms.Enabled = false;
+ }
+
+ private void timer1_Tick(object sender, EventArgs e)
+ {
+ // Main timer to sync GUI with background tasks and flush buffers
+ // Refresh Log Window
+ con_List_Received.Items.Clear();
+ foreach (string i in LogHistory)
+ {
+ if (i != null)
+ {
+ con_List_Received.Items.Add(i);
+ }
+ }
+
+ // Send buffer to MySQL
+ for (int i = 0; i < SendBuffer.Length - 1; i++)
+ {
+ if (SendBuffer[i] != null)
+ {
+ SendToMySql(SendBuffer[i]);
+ SendBuffer[i] = null;
+ }
+ }
+ }
+
+ private void con_lab_github_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
+ {
+ // Open default browser with link to Perun repo
+ ProcessStartInfo sInfo = new ProcessStartInfo("https://github.com/szporwolik/perun");
+ Process.Start(sInfo);
+ }
+
+ private void con_Button_Quit_Click(object sender, EventArgs e)
+ {
+ // Close app
+
+ DialogResult dialogResult = MessageBox.Show("Are you sure to exit Perun?", "Question", MessageBoxButtons.YesNo, System.Windows.Forms.MessageBoxIcon.Question);
+ if (dialogResult == DialogResult.Yes)
+ {
+ // Save settings on exit
+ Properties.Settings.Default.MYSQL_Server = con_txt_mysql_database.Text;
+ Properties.Settings.Default.MYSQL_DB = con_txt_mysql_database.Text;
+ Properties.Settings.Default.MYSQL_User = con_txt_mysql_username.Text;
+ Properties.Settings.Default.MYSQL_Password = con_txt_mysql_password.Text;
+ Properties.Settings.Default.MYSQL_Server = con_txt_mysql_server.Text;
+ Properties.Settings.Default.OTHER_LOTATC_FILE = con_txt_3rd_lotatc.Text;
+ Properties.Settings.Default.OTHER_SRS_FILE = con_txt_3rd_srs.Text;
+ Properties.Settings.Default.OTHER_LOTATC_USE = con_check_3rd_lotatc.Checked;
+ Properties.Settings.Default.OTHER_SRS_USE = con_check_3rd_srs.Checked;
+
+ Properties.Settings.Default.Save();
+
+ LetMeOut = true;
+ this.Close();
+ }
+ else if (dialogResult == DialogResult.No)
+ {
+ //do nothing
+ }
+ }
+
+ private void form_Main_FormClosing(object sender, FormClosingEventArgs e)
+ {
+ // Minimize to try
+ if (e.CloseReason == CloseReason.UserClosing && !LetMeOut)
+ {
+ e.Cancel = true;
+ trayIconMain.Visible = true;
+ this.WindowState = FormWindowState.Minimized;
+ this.ShowInTaskbar = false;
+ //this.Hide();
+
+ }
+ }
+
+ private void trayIconMain_MouseDoubleClick(object sender, MouseEventArgs e)
+ {
+ // Maximize from try
+ trayIconMain.Visible = false;
+ this.WindowState = FormWindowState.Normal;
+ this.ShowInTaskbar = true;
+
+ }
+
+ private void con_txt_3rd_srs_Click(object sender, MouseEventArgs e)
+ {
+ // Chose SRS Json file
+ if (openFileDialog_SRS.ShowDialog() == DialogResult.OK)
+ {
+ con_txt_3rd_srs.Text = openFileDialog_SRS.FileName;
+ con_check_3rd_srs.Checked = true;
+ } else
+ {
+ con_txt_3rd_srs.Text = "";
+ con_check_3rd_srs.Checked = false;
+ }
+ }
+
+ private void con_txt_3rd_lotatc_Click(object sender, MouseEventArgs e)
+ {
+ // Chose LotATC Json file
+ if (openFileDialog_LotATC.ShowDialog() == DialogResult.OK)
+ {
+ con_txt_3rd_lotatc.Text = openFileDialog_LotATC.FileName;
+ con_check_3rd_lotatc.Checked = true;
+ }
+ else
+ {
+ con_txt_3rd_lotatc.Text = "";
+ con_check_3rd_lotatc.Checked = false;
+ }
+ }
+
+ private void tim_10000ms_Tick(object sender, EventArgs e)
+ {
+ // Main timer to send JSON files to MySQL
+ string strSRSJson = System.IO.File.ReadAllText(con_txt_3rd_srs.Text);
+ LogHistoryAdd(ref LogHistory, "SRS data loaded");
+ string strLotATCJson = System.IO.File.ReadAllText(con_txt_3rd_lotatc.Text);
+ LogHistoryAdd(ref LogHistory, "LotATC data loaded");
+
+ strSRSJson = "{'type':'100','payload':'" + strSRSJson + "'}";
+ SendToMySql(strSRSJson);
+ strLotATCJson = "{'type':'101','payload':'" + strLotATCJson + "'}";
+ SendToMySql(strLotATCJson);
}
}
}
diff --git a/02_Windows_App/Perun_v1/form_Main.resx b/02_Windows_App/Perun_v1/form_Main.resx
index 1af7de1..91ed32d 100644
--- a/02_Windows_App/Perun_v1/form_Main.resx
+++ b/02_Windows_App/Perun_v1/form_Main.resx
@@ -117,4 +117,586 @@
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+ 17, 17
+
+
+ 134, 17
+
+
+
+
+ AAABAAEAQD8AAAEAIAAgQQAAFgAAACgAAABAAAAAfgAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIGB
+ gQGAgICFgICA7YCAgPaAgICfgICACwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAACAgIB6gICA/4CAgP+AgID/gICA/4CAgKcAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICA14CAgP+AgID/gICA/4CAgP+AgID8hISEAgAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOzs
+ 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
+ 7P/s7Oz/7OzsogAAAAAAAAAAAAAAAOzs7AXs7OzZ7Ozs/+zs7P/s7Oy2AAAAAAAAAAAAAAAAAAAAAOzs
+ 7MHs7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz77Ozshezs
+ 7A8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs7Owj7OzsDgAAAAAAAAAAAAAAAAAAAADs7Oyn7Ozs/uzs
+ 7Lvs7Ox47OzsVuzs7Evs7Oxn7Ozsnezs7Ozs7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
+ 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Ow2AAAAAAAAAAAAAAAA7OzsSuzs7P/s7Oz67OzsJwAA
+ AAAAAAAAAAAAAOzs7Fns7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
+ 7P/s7Oz/7Ozs/+zs7P/s7Ozz7OzsqOzs7G7s7OxW7OzsW+zs7Hjs7Oy57Ozs/ezs7IwAAAAAAAAAAAAA
+ AADs7Ow87Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
+ 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozsxubm5gAAAAAAAAAAAAAA
+ AADs7Oy17OzsjAAAAAAAAAAAAAAAAOzs7Ars7Ozi7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
+ 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
+ 7P/s7Oz57OzsJQAAAADs7OwD7Ozs0ezs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
+ 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
+ 7P/s7OxcAAAAAAAAAAAAAAAA7OzsJ+zs7A0AAAAAAAAAAAAAAADs7OyC7Ozs/+zs7P/s7Oz/7Ozs/+zs
+ 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
+ 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7LQAAAAA7OzsbOzs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
+ 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
+ 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs5Ozs7AoAAAAAgICATYCAgLOAgIC7gICAZGRkZADs7Owi7Ozs9+zs
+ 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
+ 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7OzsSezs7Gvs7Ox+7OzsgOzs
+ 7ILs7OyE7Ozsh+zs7Ins7OyL7Ozsjuzs7I/s7OyP7OzskOzs7JDs7OyR7Ozskuzs7JLs7OyT7OzslOzs
+ 7JTs7OyV7Ozsluzs7Jbs7OyX7Ozsl+zs7Jjs7OyZ7Ozsmezs7Jrs7Ow7gICAVoCAgP+AgID/gICA/4CA
+ gP+AgICA7OzsN+zs7G3s7Oxv7Ozscezs7HTs7Ox27Ozseezs7Hvs7Ox97Ozsf+zs7IHs7OyE7Ozshuzs
+ 7Ins7OyL7Ozsjezs7I7s7OyP7OzskOzs7JDs7OyR7Ozskuzs7JLs7OyT7Ozsk+zs7JTs7OyV7Ozslezs
+ 7G4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICA
+ gMyAgID/gICA/4CAgP+AgID/gICA8gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAACAgIDegICA/4CAgP+AgID/gICA/4CAgP+RkZEAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAl4CAgP+AgID/gICA/4CAgP+AgIC9AAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs7Oxw7Ozsm+zs
+ 7Jrs7Oya7Ozsmezs7Jns7OyY7Ozsl+zs7Jfs7OyW7Ozsluzs7JXs7OyU7OzslOzs7JPs7OyS7Ozskuzs
+ 7JHs7OyR7OzskOzs7I/s7OyP7Ozsjuzs7Ivs7OyJ7Ozsh+zs7IXs7OyD7OzsQoCAgAuAgICzgICA/4CA
+ gP+AgIDLgICAHezs7Dns7Oye7Ozsnuzs7J3s7Oyd7OzsnOzs7Jzs7Oyb7Ozsm+zs7Jrs7Oya7Ozsmezs
+ 7Jns7OyY7OzsmOzs7Jfs7OyW7Ozsluzs7JXs7OyV7OzslOzs7JPs7OyT7Ozskuzs7JHs7OyR7OzskOzs
+ 7JDs7Ox67OzsRezs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
+ 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs9ezs
+ 7B4AAAAAAAAAAICAgBuAgIAjfX19AAAAAADs7OwI7Ozs3+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
+ 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
+ 7P/s7Oz/7Ozs/+zs7P/s7Oz/7OzsYAAAAADs7Oy07Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
+ 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
+ 7P/s7Oz/7Ozs/+zs7H0AAAAAAAAAAAAAAADs7OwK7OzsHwAAAAAAAAAAAAAAAOzs7Ffs7Oz/7Ozs/+zs
+ 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
+ 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozsw+rq6gAAAAAA7OzsJ+zs7Pvs7Oz/7Ozs/+zs
+ 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
+ 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7N7s7OwIAAAAAAAAAAAAAAAA7Ozsg+zs7K0AAAAAAAAAAAAA
+ AADKysoA7Ozswezs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
+ 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs++zs7CwAAAAAAAAAAAAA
+ AADs7OyS7Ozs+Ozs7Kns7Oxn7OzsPuzs7Drs7OxY7Ozsjuzs7Ofs7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
+ 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7OxSAAAAAAAAAAAAAAAA7OzsIOzs
+ 7Pbs7Oz/7OzsQwAAAAAAAAAAAAAAAOzs7DDs7Oz+7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
+ 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Ozx7Ozspuzs7Gzs7OxT7OzsWuzs7Hjs7Oy57Ozs/ezs
+ 7IwAAAAAAAAAAAAAAAAAAAAA7OzsEOzs7BYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs7OwF7Ozsaezs
+ 7PPs7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oy8AAAAAAAA
+ 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
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AADs7Owz7Ozs/+zs7P/s7Oz/7Ozs/+zs7EsAAAAAAAAAAAAAAADs7Owl7Ozs+ezs7P/s7Oz/7Ozs/+zs
+ 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/uzs7DEAAAAAAAAAAAAA
+ AADs7OxN7Ozs/+zs7P/s7Oz/7Ozs/+zs7DEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAADs7OwD7Ozsxezs7P/s7Oz/7Ozs/+zs7LUAAAAAAAAAAAAAAAAAAAAA7OzstOzs
+ 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
+ 7P/s7OzB6urqAAAAAAAAAAAAAAAAAOzs7Lrs7Oz/7Ozs/+zs7P/s7OzB7OzsAgAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADr6+sA7Ozsluzs7P/s7Oz/7Ozs/+zs7Pjs7OwlAAAAAAAA
+ AAAAAAAA7OzsTOzs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P3s7OzT7Ozstuzs7Ljs7OzU7Ozs/uzs
+ 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7FQAAAAAAAAAAAAAAADs7Owq7Ozs/Ozs7P/s7Oz/7Ozs/+zs
+ 7JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs7OwO7Ozspuzs7P/s7Oz/7Ozs/+zs
+ 7P/s7OyIAAAAAAAAAAAAAAAA7OzsBuzs7Nrs7Oz/7Ozs/+zs7P/s7Oz/7Ozs6Ozs7G3s7OwSAAAAAAAA
+ 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
+ gP+AgIDjAAAAAAAAAAAAAAAAAAAAAAAAAADs7OyN7Ozs/+zs7P/s7Oz/7Ozs/+zs7Obs7OwLAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAOzs7ALs7OwI7OzsCOzs7Ajs7OwI7OzsCOzs7AQAAAAAAAAAAAAAAAAAAAAAAAAAAICA
+ gPaAgID/gICA/4CAgP+AgID/gICA5gAAAAAAAAAAAAAAAAAAAAAAAAAA7OzsBOzs7Ajs7OwI7OzsCOzs
+ 7Ajs7OwI6+vrAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAACAgICagICA/4CAgP+AgID/gICA/4CAgIkAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICACoCAgJeAgID0gICA8ICAgI6AgIAFAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD////4H///////
+ //gf////////+A///////4D4DwH/////wPgfA7////nA/B8Dn///+OB//gcf///wcD/8Dg////BwH/wO
+ D///4DgP8BwH///gOAPAHAf///gcAAA4H////BwAAHgf///8DgAAcD//+D4HAADgfB/wPgcAAOB8D/Ae
+ A4ABwHgP8B4DgAHAeA/wHgHAA4B4D/A+AeAHAHwP/HwA4AcAPj///ABwDgA////4AHAOAB////AAOBwA
+ D//PwAA4PAAD88AAABw4AAADgAAAHnAAAAEAAAAOcAAAAQAAAAQgAAAAAAAAAAAAAAD////4H///////
+ //gf////////+B////8AAAAAAAAAAAAAAAZgAAAAgAAADnAAAAGAAAAOeAAAAcAAABw4AAADz8AAPBwA
+ A/P/8AA4HAAP///4AHAOAB////wAcA4AP//4fADgBwA+P/A+AeAHgHwP8B4BwAOAeA/wHgPAAcB4D/Ae
+ A4ABwHgP8D4HAADgfA/4fgcAAOB8H//8DgAAcD////geAAB4H///+BwAADgf///gOAPAHAf//+A4D/Ac
+ B///4HAf+A4P///w8D/8Dg////jgf/4HH///+cD4Hgef////wPgfA/////+A+B8B/////4D4HwH/////
+ //gf////////+B////8=
+
+
+
+ 257, 17
+
+
+ 397, 17
+
+
+ 563, 19
+
+
+
+ AAABAAEAQD8AAAEAIAAgQQAAFgAAACgAAABAAAAAfgAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIGB
+ gQGAgICFgICA7YCAgPaAgICfgICACwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAACAgIB6gICA/4CAgP+AgID/gICA/4CAgKcAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICA14CAgP+AgID/gICA/4CAgP+AgID8hISEAgAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOzs
+ 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
+ 7P/s7Oz/7OzsogAAAAAAAAAAAAAAAOzs7AXs7OzZ7Ozs/+zs7P/s7Oy2AAAAAAAAAAAAAAAAAAAAAOzs
+ 7MHs7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz77Ozshezs
+ 7A8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs7Owj7OzsDgAAAAAAAAAAAAAAAAAAAADs7Oyn7Ozs/uzs
+ 7Lvs7Ox47OzsVuzs7Evs7Oxn7Ozsnezs7Ozs7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
+ 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Ow2AAAAAAAAAAAAAAAA7OzsSuzs7P/s7Oz67OzsJwAA
+ AAAAAAAAAAAAAOzs7Fns7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
+ 7P/s7Oz/7Ozs/+zs7P/s7Ozz7OzsqOzs7G7s7OxW7OzsW+zs7Hjs7Oy57Ozs/ezs7IwAAAAAAAAAAAAA
+ AADs7Ow87Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
+ 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozsxubm5gAAAAAAAAAAAAAA
+ AADs7Oy17OzsjAAAAAAAAAAAAAAAAOzs7Ars7Ozi7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
+ 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
+ 7P/s7Oz57OzsJQAAAADs7OwD7Ozs0ezs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
+ 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
+ 7P/s7OxcAAAAAAAAAAAAAAAA7OzsJ+zs7A0AAAAAAAAAAAAAAADs7OyC7Ozs/+zs7P/s7Oz/7Ozs/+zs
+ 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
+ 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7LQAAAAA7OzsbOzs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
+ 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
+ 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs5Ozs7AoAAAAAgICATYCAgLOAgIC7gICAZGRkZADs7Owi7Ozs9+zs
+ 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
+ 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7OzsSezs7Gvs7Ox+7OzsgOzs
+ 7ILs7OyE7Ozsh+zs7Ins7OyL7Ozsjuzs7I/s7OyP7OzskOzs7JDs7OyR7Ozskuzs7JLs7OyT7OzslOzs
+ 7JTs7OyV7Ozsluzs7Jbs7OyX7Ozsl+zs7Jjs7OyZ7Ozsmezs7Jrs7Ow7gICAVoCAgP+AgID/gICA/4CA
+ gP+AgICA7OzsN+zs7G3s7Oxv7Ozscezs7HTs7Ox27Ozseezs7Hvs7Ox97Ozsf+zs7IHs7OyE7Ozshuzs
+ 7Ins7OyL7Ozsjezs7I7s7OyP7OzskOzs7JDs7OyR7Ozskuzs7JLs7OyT7Ozsk+zs7JTs7OyV7Ozslezs
+ 7G4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICA
+ gMyAgID/gICA/4CAgP+AgID/gICA8gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAACAgIDegICA/4CAgP+AgID/gICA/4CAgP+RkZEAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAl4CAgP+AgID/gICA/4CAgP+AgIC9AAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs7Oxw7Ozsm+zs
+ 7Jrs7Oya7Ozsmezs7Jns7OyY7Ozsl+zs7Jfs7OyW7Ozsluzs7JXs7OyU7OzslOzs7JPs7OyS7Ozskuzs
+ 7JHs7OyR7OzskOzs7I/s7OyP7Ozsjuzs7Ivs7OyJ7Ozsh+zs7IXs7OyD7OzsQoCAgAuAgICzgICA/4CA
+ gP+AgIDLgICAHezs7Dns7Oye7Ozsnuzs7J3s7Oyd7OzsnOzs7Jzs7Oyb7Ozsm+zs7Jrs7Oya7Ozsmezs
+ 7Jns7OyY7OzsmOzs7Jfs7OyW7Ozsluzs7JXs7OyV7OzslOzs7JPs7OyT7Ozskuzs7JHs7OyR7OzskOzs
+ 7JDs7Ox67OzsRezs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
+ 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs9ezs
+ 7B4AAAAAAAAAAICAgBuAgIAjfX19AAAAAADs7OwI7Ozs3+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
+ 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
+ 7P/s7Oz/7Ozs/+zs7P/s7Oz/7OzsYAAAAADs7Oy07Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
+ 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
+ 7P/s7Oz/7Ozs/+zs7H0AAAAAAAAAAAAAAADs7OwK7OzsHwAAAAAAAAAAAAAAAOzs7Ffs7Oz/7Ozs/+zs
+ 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
+ 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozsw+rq6gAAAAAA7OzsJ+zs7Pvs7Oz/7Ozs/+zs
+ 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
+ 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7N7s7OwIAAAAAAAAAAAAAAAA7Ozsg+zs7K0AAAAAAAAAAAAA
+ AADKysoA7Ozswezs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
+ 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs++zs7CwAAAAAAAAAAAAA
+ AADs7OyS7Ozs+Ozs7Kns7Oxn7OzsPuzs7Drs7OxY7Ozsjuzs7Ofs7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
+ 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7OxSAAAAAAAAAAAAAAAA7OzsIOzs
+ 7Pbs7Oz/7OzsQwAAAAAAAAAAAAAAAOzs7DDs7Oz+7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
+ 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Ozx7Ozspuzs7Gzs7OxT7OzsWuzs7Hjs7Oy57Ozs/ezs
+ 7IwAAAAAAAAAAAAAAAAAAAAA7OzsEOzs7BYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs7OwF7Ozsaezs
+ 7PPs7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oy8AAAAAAAA
+ AAAAAAAAAAAAAOzs7K3s7Oz/7Ozs/+zs7NLs7OwCAAAAAAAAAAAAAAAA7Ozsnuzs7P/s7Oz/7Ozs/+zs
+ 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7Pns7OyB7OzsDgAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAOzs7CTs7OwMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAADs7Own7Ozs4ezs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
+ 7P/s7Oz77OzsKQAAAAAAAAAAAAAAAOzs7Ebs7Oz/7Ozs/+zs7P/s7Oz/7OzsaQAAAAAAAAAAAAAAAOzs
+ 7Bbs7Ozx7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7O/s7Ow6AAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOzs7Crs7Oz07Ozs/+zs7P/s7Oz/7Ozs/+zs
+ 7P/s7Oz/7Ozs/+zs7P/s7Oz/7OzsjwAAAAAAAAAAAAAAAOvr6wTs7OzW7Ozs/+zs7P/s7Oz/7Ozs/+zs
+ 7O3s7OwQAAAAAAAAAAAAAAAA7Ozsduzs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
+ 7Pns7Ow7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7Ozscuzs
+ 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs6+zs7A8AAAAAAAAAAAAAAADs7Oxu7Ozs/+zs
+ 7P/s7Oz/7Ozs/+zs7P/s7Oz/7OzskAAAAAAAAAAAAAAAAOzs7Afs7Ozc7Ozs/+zs7P/s7Oz/7Ozs/+zs
+ 7P/s7Oz/7Ozs/+zs7P/s7OyCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIGBgQOAgIBFgICAVICAgBMAAAAAAAAAAAAA
+ AAAAAAAAAAAAAOzs7Ajs7Ozs7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7GUAAAAAAAAAAAAA
+ AADs7OwV7Ozs8Ozs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7Pvs7OwpAAAAAAAAAAAAAAAA7OzsUOzs
+ 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Ozy7OzsDwAAAAAAAAAAAAAAAAAAAAAAAAAAgICACYCA
+ gDOAgIAdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgBOAgIDOgICA/4CA
+ gP+AgIDygICAQgAAAAAAAAAAAAAAAAAAAAAAAAAA7OzsnOzs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
+ 7Mzq6uoAAAAAAAAAAAAAAAAA7Ozsnezs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7OzsuAAA
+ AAAAAAAAAAAAAMPDwwDs7Oy/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7OzsqAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAgICARoCAgO6AgID/gICA/4CAgJeAgIABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AACAgICVgICA/4CAgP+AgID/gICA/4CAgOWAgIACAAAAAAAAAAAAAAAAAAAAAOzs7Gns7Oz/7Ozs/+zs
+ 7P/s7Oz/7Ozs/+zs7P7s7Ow3AAAAAAAAAAAAAAAA7OzsM+zs7P7s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
+ 7P/s7Oz/7Ozs/+zs7P/s7OxKAAAAAAAAAAAAAAAA7OzsLezs7P3s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
+ 7G8AAAAAAAAAAAAAAAAAAAAAgICAD4CAgPKAgID/gICA/4CAgP+AgID/gICAZAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAgICAzICAgP+AgID/gICA/4CAgP+AgID/gICAJgAAAAAAAAAAAAAAAAAA
+ AADs7OxT7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7OyjAAAAAAAAAAAAAAAA3d3dAOzs7MXs7Oz/7Ozs/+zs
+ 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs2ezs7AYAAAAAAAAAAAAAAADs7OyW7Ozs/+zs
+ 7P/s7Oz/7Ozs/+zs7P/s7OxjAAAAAAAAAAAAAAAAAAAAAICAgEGAgID/gICA/4CAgP+AgID/gICA/4CA
+ gKEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgKuAgID/gICA/4CAgP+AgID/gICA9IGB
+ gQcAAAAAAAAAAAAAAAAAAAAA7OzsYOzs7P/s7Oz/7Ozs/+zs7P/s7Ozz7OzsGgAAAAAAAAAAAAAAAOzs
+ 7F3s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Ox0AAAAAAAA
+ AAAAAAAA7OzsFezs7PHs7Oz/7Ozs/+zs7P/s7Oz/7OzsZQAAAAAAAAAAAAAAAAAAAACAgIAqgICA/4CA
+ gP+AgID/gICA/4CAgP+AgICMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAgIArgICA8YCA
+ gP+AgID/gICA/4CAgG8AAAAAAAAAAAAAAAAAAAAAAAAAAOzs7H/s7Oz/7Ozs/+zs7P/s7Oz/7OzsdQAA
+ AAAAAAAAAAAAAOzs7A3s7Ozn7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
+ 7P/s7Oz/7Ozs8Ozs7BQAAAAAAAAAAAAAAADs7Oxy7Ozs/+zs7P/s7Oz/7Ozs/+zs7IIAAAAAAAAAAAAA
+ AAAAAAAAAAAAAICAgK2AgID/gICA/4CAgP+AgIDwgICAIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAICAgB6AgICBgICAkoCAgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs7OzG7Ozs/+zs
+ 7P/s7Oz/7Ozs2ezs7AYAAAAAAAAAAAAAAADs7OyK7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
+ 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7OyZAAAAAAAAAAAAAAAA7OzsBezs7Njs7Oz/7Ozs/+zs
+ 7P/s7OzHAAAAAAAAAAAAAAAAAAAAAAAAAACAgIAFgICAb4CAgKyAgICTgICAIgAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AADs7Owz7Ozs/+zs7P/s7Oz/7Ozs/+zs7EsAAAAAAAAAAAAAAADs7Owl7Ozs+ezs7P/s7Oz/7Ozs/+zs
+ 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/uzs7DEAAAAAAAAAAAAA
+ AADs7OxN7Ozs/+zs7P/s7Oz/7Ozs/+zs7DEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAADs7OwD7Ozsxezs7P/s7Oz/7Ozs/+zs7LUAAAAAAAAAAAAAAAAAAAAA7OzstOzs
+ 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
+ 7P/s7OzB6urqAAAAAAAAAAAAAAAAAOzs7Lrs7Oz/7Ozs/+zs7P/s7OzB7OzsAgAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADr6+sA7Ozsluzs7P/s7Oz/7Ozs/+zs7Pjs7OwlAAAAAAAA
+ AAAAAAAA7OzsTOzs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P3s7OzT7Ozstuzs7Ljs7OzU7Ozs/uzs
+ 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7FQAAAAAAAAAAAAAAADs7Owq7Ozs/Ozs7P/s7Oz/7Ozs/+zs
+ 7JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs7OwO7Ozspuzs7P/s7Oz/7Ozs/+zs
+ 7P/s7OyIAAAAAAAAAAAAAAAA7OzsBuzs7Nrs7Oz/7Ozs/+zs7P/s7Oz/7Ozs6Ozs7G3s7OwSAAAAAAAA
+ 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
+ gP+AgIDjAAAAAAAAAAAAAAAAAAAAAAAAAADs7OyN7Ozs/+zs7P/s7Oz/7Ozs/+zs7Obs7OwLAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAOzs7ALs7OwI7OzsCOzs7Ajs7OwI7OzsCOzs7AQAAAAAAAAAAAAAAAAAAAAAAAAAAICA
+ gPaAgID/gICA/4CAgP+AgID/gICA5gAAAAAAAAAAAAAAAAAAAAAAAAAA7OzsBOzs7Ajs7OwI7OzsCOzs
+ 7Ajs7OwI6+vrAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAACAgICagICA/4CAgP+AgID/gICA/4CAgIkAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICACoCAgJeAgID0gICA8ICAgI6AgIAFAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD////4H///////
+ //gf////////+A///////4D4DwH/////wPgfA7////nA/B8Dn///+OB//gcf///wcD/8Dg////BwH/wO
+ D///4DgP8BwH///gOAPAHAf///gcAAA4H////BwAAHgf///8DgAAcD//+D4HAADgfB/wPgcAAOB8D/Ae
+ A4ABwHgP8B4DgAHAeA/wHgHAA4B4D/A+AeAHAHwP/HwA4AcAPj///ABwDgA////4AHAOAB////AAOBwA
+ D//PwAA4PAAD88AAABw4AAADgAAAHnAAAAEAAAAOcAAAAQAAAAQgAAAAAAAAAAAAAAD////4H///////
+ //gf////////+B////8AAAAAAAAAAAAAAAZgAAAAgAAADnAAAAGAAAAOeAAAAcAAABw4AAADz8AAPBwA
+ A/P/8AA4HAAP///4AHAOAB////wAcA4AP//4fADgBwA+P/A+AeAHgHwP8B4BwAOAeA/wHgPAAcB4D/Ae
+ A4ABwHgP8D4HAADgfA/4fgcAAOB8H//8DgAAcD////geAAB4H///+BwAADgf///gOAPAHAf//+A4D/Ac
+ B///4HAf+A4P///w8D/8Dg////jgf/4HH///+cD4Hgef////wPgfA/////+A+B8B/////4D4HwH/////
+ //gf////////+B////8=
+
+
\ No newline at end of file
diff --git a/02_Windows_App/Perun_v1/packages.config b/02_Windows_App/Perun_v1/packages.config
new file mode 100644
index 0000000..18cf35a
--- /dev/null
+++ b/02_Windows_App/Perun_v1/packages.config
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/02_Windows_App/Perun_v1/perun_logo.ico b/02_Windows_App/Perun_v1/perun_logo.ico
new file mode 100644
index 0000000..2e3ec01
Binary files /dev/null and b/02_Windows_App/Perun_v1/perun_logo.ico differ