From dfc14d9c3671722c9ad8214410de73dcfa5edd86 Mon Sep 17 00:00:00 2001 From: BlubbFish Date: Mon, 16 Nov 2015 00:10:59 +0000 Subject: [PATCH] masscheckin ganz viel kram --- NetMonitorClient/NetMonitorClient.csproj | 2 +- NetMonitorServer/ActionClass.cs | 5 +- NetMonitorServer/Actions/SetNetworks.cs | 569 +++++------ NetMonitorServer/Actions/SetOpenVPNService.cs | 31 +- NetMonitorServer/Actions/SetService.cs | 190 ++-- .../Controller/OpenVpnController.cs | 16 +- NetMonitorServer/Factory.cs | 5 +- NetMonitorServer/MainService.cs | 157 +-- NetMonitorServer/Program.cs | 85 +- NetMonitorTray/Controller/ControllerTray.cs | 52 +- NetMonitorTray/Controller/ControllerWindow.cs | 85 +- NetMonitorTray/Models/ModelWindow.cs | 129 +-- NetMonitorTray/NetMonitorTray.csproj | 5 + NetMonitorTray/Program.cs | 22 +- .../Properties/Resources.Designer.cs | 50 + NetMonitorTray/Properties/Resources.resx | 15 + NetMonitorTray/Views/ViewWindow.cs | 17 + .../Views/ViewWindowForm.Designer.cs | 952 +++++++++++++++--- NetMonitorTray/Views/ViewWindowForm.cs | 203 +++- NetMonitorTray/Views/ViewWindowForm.resx | 6 + NetMonitorUtils/NetworkSetter.cs | 4 + NetMonitorUtils/OpenVpnSetter.cs | 6 +- NetMonitorUtils/ServiceControl.cs | 12 + NetMonitorUtils/config.ini | 4 +- NetMonitorUtils/network.ini | 6 +- NetOpenVPNGUI/NetOpenVPNGUI.csproj | 2 +- bin/Debug/NetMonitorClient.exe | Bin 37376 -> 37376 bytes bin/Debug/NetMonitorConsole.exe | Bin 20992 -> 20992 bytes bin/Debug/NetMonitorServer.exe | Bin 31232 -> 36352 bytes bin/Debug/NetMonitorTray.exe | Bin 47616 -> 67584 bytes bin/Debug/NetMonitorUtils.dll | Bin 18432 -> 18944 bytes bin/Debug/NetOpenVPNGUI.exe | Bin 23040 -> 23040 bytes bin/Debug/Utils.dll | Bin 15872 -> 16384 bytes bin/Debug/config.ini | 4 +- bin/Debug/network.ini | 6 +- bin/Release/NetMonitorClient.exe | Bin 0 -> 35840 bytes bin/Release/NetMonitorConsole.exe | Bin 0 -> 20992 bytes bin/Release/NetMonitorServer.exe | Bin 0 -> 34816 bytes bin/Release/NetMonitorTray.exe | Bin 0 -> 66560 bytes bin/Release/NetMonitorUtils.dll | Bin 0 -> 17920 bytes bin/Release/NetOpenVPNGUI.exe | Bin 0 -> 22528 bytes bin/Release/Utils.dll | Bin 0 -> 15872 bytes bin/Release/config.ini | 9 + bin/Release/network.ini | 40 + bin/Release/vpn.ini | 7 + 45 files changed, 1862 insertions(+), 834 deletions(-) create mode 100644 bin/Release/NetMonitorClient.exe create mode 100644 bin/Release/NetMonitorConsole.exe create mode 100644 bin/Release/NetMonitorServer.exe create mode 100644 bin/Release/NetMonitorTray.exe create mode 100644 bin/Release/NetMonitorUtils.dll create mode 100644 bin/Release/NetOpenVPNGUI.exe create mode 100644 bin/Release/Utils.dll create mode 100644 bin/Release/config.ini create mode 100644 bin/Release/network.ini create mode 100644 bin/Release/vpn.ini diff --git a/NetMonitorClient/NetMonitorClient.csproj b/NetMonitorClient/NetMonitorClient.csproj index 4041811..c0d3563 100644 --- a/NetMonitorClient/NetMonitorClient.csproj +++ b/NetMonitorClient/NetMonitorClient.csproj @@ -47,7 +47,7 @@ pdbonly true - bin\Release\ + ..\bin\Release\ TRACE prompt 4 diff --git a/NetMonitorServer/ActionClass.cs b/NetMonitorServer/ActionClass.cs index f61ad26..8b5419b 100644 --- a/NetMonitorServer/ActionClass.cs +++ b/NetMonitorServer/ActionClass.cs @@ -4,9 +4,10 @@ using System.Linq; using System.Text; using System.Net.Sockets; using System.Net; +using BlubbFish.Utils; namespace NetMonitorServer { - abstract class ActionClass { + abstract class ActionClass : OwnObject { protected UdpClient outputNetworkStream; protected IPEndPoint outputNetworkPort; internal void SetAnswerStream(UdpClient udpClient, IPEndPoint iPEndPoint) { @@ -17,7 +18,7 @@ namespace NetMonitorServer { abstract internal bool Run(Queue arguments); protected void sendMessage(string message) { - Console.WriteLine(message); + this.addLog("ActionClass.sendMessage", "Nachricht geantwortet: "+message, LogLevel.Notice); byte[] answ = Encoding.UTF8.GetBytes(message); outputNetworkStream.Send(answ, answ.Length, outputNetworkPort); } diff --git a/NetMonitorServer/Actions/SetNetworks.cs b/NetMonitorServer/Actions/SetNetworks.cs index c090045..e79dd98 100644 --- a/NetMonitorServer/Actions/SetNetworks.cs +++ b/NetMonitorServer/Actions/SetNetworks.cs @@ -7,297 +7,284 @@ using System.Net; using System.Net.Sockets; using System.Text.RegularExpressions; -namespace NetMonitorServer -{ - class SetNetworks : ActionClass - { - private string netsh_output = ""; - private bool setNetworkWins(Queue data) - { - if (data.Count != 2) - { - this.sendMessage("To less arguments for SetNetworks.setNetworkWins class"); - return false; - } - string ip = data.Dequeue(); - string name = data.Dequeue(); - string netsh = "interface ipv4 set winsservers name=\"" + name + (ip == "auto" ? "\" source=dhcp" : "\" static " + ip); - try - { - this.runProgramNetsh(netsh); - } - catch (Exception e) - { - this.sendMessage(e.Message); - return false; - } - this.sendMessage("true"); - return true; - } +namespace NetMonitorServer { + class SetNetworks : ActionClass { + private string netsh_output = ""; - private bool setNetworkDns(Queue data) - { - if (data.Count != 2) - { - this.sendMessage("To less arguments for SetNetworks.setNetworkDns class"); - return false; - } - string ip = data.Dequeue(); - string name = data.Dequeue(); - string netsh = "interface ipv4 set dnsservers name=\"" + name + (ip == "auto" ? "\" source=dhcp" : "\" static " + ip + " primary"); - try - { - this.runProgramNetsh(netsh); - } - catch (Exception e) - { - this.sendMessage(e.Message); - return false; - } - this.sendMessage("true"); - return true; - } - - private bool setNetworkIp(Queue data) - { - if (data.Count != 2 && data.Count != 4) - { - this.sendMessage("To less arguments for SetNetworks.setNetworkIp class"); - return false; - } - string ip = data.Dequeue(); - string netsh = ""; - if (ip == "auto") - { - string name = data.Dequeue(); - netsh = "interface ipv4 set address name=\"" + name + "\" source=dhcp"; - } - else - { - string subnet = data.Dequeue(); - string gw = data.Dequeue(); - string name = data.Dequeue(); - netsh = "interface ipv4 set address \"" + name + "\" static " + ip + " " + subnet + " " + gw; - } - try - { - this.runProgramNetsh(netsh); - } - catch (Exception e) - { - this.sendMessage(e.Message); - return false; - } - this.sendMessage("true"); - return true; - } - - private bool setNetworkAuto(Queue data) - { - if (data.Count != 1) - { - this.sendMessage("To less arguments for SetNetworks.setNetworkAuto class"); - return false; - } - string name = data.Dequeue(); - try - { - this.runProgramNetsh("interface ipv4 set address name=\"" + name + "\" source=dhcp"); - this.runProgramNetsh("interface ipv4 set dnsservers name=\"" + name + "\" source=dhcp"); - this.runProgramNetsh("interface ipv4 set winsservers name=\"" + name + "\" source=dhcp"); - } - catch (Exception e) - { - this.sendMessage(e.Message); - return false; - } - this.sendMessage("true"); - return true; - } - - private bool getNetwork(Queue arguments) - { - if(arguments.Count != 1) { - this.sendMessage("To less arguments for SetNetworks.getNetwork class"); - return false; - } - string adapter = arguments.Dequeue(); - string ip = ""; - string subnet = ""; - string gateway = ""; - string dns = ""; - string wins = ""; - try - { - this.runProgramNetsh("interface ipv4 show interfaces"); - string[] text = this.netsh_output.Trim().Split('\n'); - foreach (string line in text) - { - string l = line.Trim(); - if (l == "") - { - continue; - } - if (Regex.IsMatch(l, "disconnected[ ]+"+adapter+"$", RegexOptions.IgnoreCase)) - { - this.sendMessage("disconnected"); - return true; - } - } - - this.runProgramNetsh("interface ipv4 show addresses"); - text = this.netsh_output.Trim().Split('\n'); - bool match = false; - foreach (string line in text) - { - string l = line.Trim(); - if (l == "") - { - continue; - } - if (Regex.IsMatch(l, "^Konfiguration der Schnittstelle", RegexOptions.IgnoreCase)) - { - match = false; - } - if (Regex.IsMatch(l, "^[a-z0-9 ]+\""+adapter+"\"", RegexOptions.IgnoreCase)) - { - match = true; - } - if (match) - { - if (Regex.IsMatch(l, "DHCP aktiviert:\\s+Ja", RegexOptions.IgnoreCase)) - { - ip = "auto"; - break; - } - if (Regex.IsMatch(l, "IP-Adresse:\\s+[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+", RegexOptions.IgnoreCase)) - { - ip = Regex.Match(l, "[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+").ToString(); - } - if (Regex.IsMatch(l, "Subnetzpräfix:\\s+[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+\\/[0-9]+ \\(Maske [0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+\\)", RegexOptions.IgnoreCase)) - { - subnet = Regex.Match(l, "\\(Maske ([0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+)\\)").Groups[1].ToString(); - } - if (Regex.IsMatch(l, "Standardgateway:\\s+[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+", RegexOptions.IgnoreCase)) - { - gateway = Regex.Match(l, "[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+").ToString(); - } - } - } - - this.runProgramNetsh("interface ipv4 show dnsservers"); - text = this.netsh_output.Trim().Split('\n'); - match = false; - foreach (string line in text) - { - string l = line.Trim(); - if (l == "") - { - continue; - } - if (Regex.IsMatch(l, "^Konfiguration der Schnittstelle", RegexOptions.IgnoreCase)) - { - match = false; - } - if (Regex.IsMatch(l, "^[a-z0-9 ]+\"" + adapter + "\"", RegexOptions.IgnoreCase)) - { - match = true; - } - if (match) - { - if (Regex.IsMatch(l, "Über DHCP konfigurierte DNS-Server:\\s+", RegexOptions.IgnoreCase)) - { - dns = "auto"; - } - if (Regex.IsMatch(l, "Statisch konfigurierte DNS-Server:\\s+[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+", RegexOptions.IgnoreCase)) - { - dns = Regex.Match(l, "[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+").ToString(); - } - } - } - - this.runProgramNetsh("interface ipv4 show winsservers"); - text = this.netsh_output.Trim().Split('\n'); - match = false; - foreach (string line in text) - { - string l = line.Trim(); - if (l == "") - { - continue; - } - if (Regex.IsMatch(l, "^Konfiguration der Schnittstelle", RegexOptions.IgnoreCase)) - { - match = false; - } - if (Regex.IsMatch(l, "^[a-z0-9 ]+\"" + adapter + "\"", RegexOptions.IgnoreCase)) - { - match = true; - } - if (match) - { - if (Regex.IsMatch(l, "Über DHCP konfigurierte WINS-Server:\\s+", RegexOptions.IgnoreCase)) - { - wins = "auto"; - } - if (Regex.IsMatch(l, "Statisch konfigurierte WINS-Server:\\s+[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+", RegexOptions.IgnoreCase)) - { - wins = Regex.Match(l, "[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+").ToString(); - } - } - } - } - catch (Exception e) - { - this.sendMessage(e.Message); - return false; - } - if (ip == "") - { - this.sendMessage("unknown"); - return false; - } - this.sendMessage("[" + ip + "|" + subnet + "|" + gateway + "|" + dns + "|" + wins + "]"); - return true; - } - - private bool runProgramNetsh(string args) - { - //Console.WriteLine("netsh args: "+args); - Process p = new Process(); - p.StartInfo.Arguments = args; - p.StartInfo.FileName = "netsh"; - p.StartInfo.CreateNoWindow = true; - p.StartInfo.RedirectStandardOutput = true; - p.StartInfo.UseShellExecute = false; - p.Start(); - this.netsh_output = p.StandardOutput.ReadToEnd(); - p.WaitForExit(); - //Console.WriteLine(this.netsh_output.Trim()); - if (p.ExitCode == 0) - { - return true; - } - throw new Exception(this.netsh_output.Trim()); - } - internal override bool Run(Queue arguments) - { - if (arguments.Count < 2) - { - this.sendMessage("To less arguments for SetNetwork class"); - return false; - } - switch (arguments.Dequeue().ToLower()) - { - case "auto": return this.setNetworkAuto(arguments); - case "ip": return this.setNetworkIp(arguments); - case "dns": return this.setNetworkDns(arguments); - case "wins": return this.setNetworkWins(arguments); - case "network": return this.getNetwork(arguments); - default: this.sendMessage("Wrong arguments for service on SetNetwork class"); return false; - } - } - - + internal override bool Run(Queue arguments) { + this.addLog("SetNetworks.Run", "Setze Netzwerk Befehl", LogLevel.Notice); + if(arguments.Count < 1) { + this.sendMessage("To less arguments for SetNetwork class"); + return false; + } + switch(arguments.Dequeue().ToLower()) { + case "auto": + return this.setNetworkAuto(arguments); + case "ip": + return this.setNetworkIp(arguments); + case "dns": + return this.setNetworkDns(arguments); + case "wins": + return this.setNetworkWins(arguments); + case "network": + return this.getNetwork(arguments); + case "adapters": + return this.getAdapters(arguments); + default: + this.sendMessage("Wrong arguments for service on SetNetwork class"); + return false; + } } + + private bool getAdapters(Queue arguments) { + if(arguments.Count != 0) { + this.sendMessage("To less arguments for SetNetworks.getAdapters class"); + return false; + } + this.addLog("SetNetworks.getNetwork", "Lese Liste Adapter", LogLevel.Notice); + List ret = new List(); + try { + this.runProgramNetsh("interface ipv4 show interfaces"); + string[] text = this.netsh_output.Trim().Split('\n'); + foreach(string line in text) { + string l = line.Trim(); + if(l == "") { + continue; + } + if(Regex.IsMatch(l, "(disconnected|connected) [ ]+([^ ].*)$", RegexOptions.IgnoreCase)) { + ret.Add(Regex.Match(l, "(disconnected|connected) [ ]+([^ ].*)$").Groups[2].ToString()); + } + } + } catch(Exception e) { + this.sendMessage(e.Message); + return false; + } + if(ret.Count == 0) { + this.sendMessage("unknown"); + return false; + } + this.sendMessage("[" + String.Join("|", ret.ToArray()) + "]"); + return true; + } + + private bool setNetworkWins(Queue data) { + if(data.Count != 2) { + this.sendMessage("To less arguments for SetNetworks.setNetworkWins class"); + return false; + } + string ip = data.Dequeue(); + string name = data.Dequeue(); + this.addLog("SetNetworks.setNetworkWins", "Setzte Wins auf " + name + " mit " + ip, LogLevel.Notice); + string netsh = "interface ipv4 set winsservers name=\"" + name + (ip == "auto" ? "\" source=dhcp" : "\" static " + ip); + try { + this.runProgramNetsh(netsh); + } catch(Exception e) { + this.sendMessage(e.Message); + return false; + } + this.sendMessage("true"); + return true; + } + + private bool setNetworkDns(Queue data) { + if(data.Count != 2) { + this.sendMessage("To less arguments for SetNetworks.setNetworkDns class"); + return false; + } + string ip = data.Dequeue(); + string name = data.Dequeue(); + this.addLog("SetNetworks.setNetworkDns", "Setzte Dns auf " + name + " mit " + ip, LogLevel.Notice); + string netsh = "interface ipv4 set dnsservers name=\"" + name + (ip == "auto" ? "\" source=dhcp" : "\" static " + ip + " primary"); + try { + this.runProgramNetsh(netsh); + } catch(Exception e) { + this.sendMessage(e.Message); + return false; + } + this.sendMessage("true"); + return true; + } + + private bool setNetworkIp(Queue data) { + if(data.Count != 2 && data.Count != 4) { + this.sendMessage("To less arguments for SetNetworks.setNetworkIp class"); + return false; + } + string ip = data.Dequeue(); + string netsh = ""; + if(ip == "auto") { + string name = data.Dequeue(); + this.addLog("SetNetworks.setNetworkIp", "Setzte Ip auf " + name + " mit " + ip, LogLevel.Notice); + netsh = "interface ipv4 set address name=\"" + name + "\" source=dhcp"; + } else { + string subnet = data.Dequeue(); + string gw = data.Dequeue(); + string name = data.Dequeue(); + this.addLog("SetNetworks.setNetworkIp", "Setzte Ip auf " + name + " mit " + ip, LogLevel.Notice); + netsh = "interface ipv4 set address \"" + name + "\" static " + ip + " " + subnet + " " + gw; + } + try { + this.runProgramNetsh(netsh); + } catch(Exception e) { + this.sendMessage(e.Message); + return false; + } + this.sendMessage("true"); + return true; + } + + private bool setNetworkAuto(Queue data) { + if(data.Count != 1) { + this.sendMessage("To less arguments for SetNetworks.setNetworkAuto class"); + return false; + } + string name = data.Dequeue(); + this.addLog("SetNetworks.setNetworkAuto", "Setzte DHCP auf " + name, LogLevel.Notice); + try { + this.runProgramNetsh("interface ipv4 set address name=\"" + name + "\" source=dhcp"); + this.runProgramNetsh("interface ipv4 set dnsservers name=\"" + name + "\" source=dhcp"); + this.runProgramNetsh("interface ipv4 set winsservers name=\"" + name + "\" source=dhcp"); + } catch(Exception e) { + this.sendMessage(e.Message); + return false; + } + this.sendMessage("true"); + return true; + } + + private bool getNetwork(Queue arguments) { + if(arguments.Count != 1) { + this.sendMessage("To less arguments for SetNetworks.getNetwork class"); + return false; + } + string adapter = arguments.Dequeue(); + this.addLog("SetNetworks.getNetwork", "Lese Netzwerk auf " + adapter, LogLevel.Notice); + string ip = ""; + string subnet = ""; + string gateway = ""; + string dns = ""; + string wins = ""; + try { + this.runProgramNetsh("interface ipv4 show interfaces"); + string[] text = this.netsh_output.Trim().Split('\n'); + foreach(string line in text) { + string l = line.Trim(); + if(l == "") { + continue; + } + if(Regex.IsMatch(l, "disconnected[ ]+" + adapter + "$", RegexOptions.IgnoreCase)) { + this.sendMessage("disconnected"); + return true; + } + } + + this.runProgramNetsh("interface ipv4 show addresses"); + text = this.netsh_output.Trim().Split('\n'); + bool match = false; + foreach(string line in text) { + string l = line.Trim(); + if(l == "") { + continue; + } + if(Regex.IsMatch(l, "^Konfiguration der Schnittstelle", RegexOptions.IgnoreCase)) { + match = false; + } + if(Regex.IsMatch(l, "^[a-z0-9 ]+\"" + adapter + "\"", RegexOptions.IgnoreCase)) { + match = true; + } + if(match) { + if(Regex.IsMatch(l, "DHCP aktiviert:\\s+Ja", RegexOptions.IgnoreCase)) { + ip = "auto"; + break; + } + if(Regex.IsMatch(l, "IP-Adresse:\\s+[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+", RegexOptions.IgnoreCase)) { + ip = Regex.Match(l, "[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+").ToString(); + } + if(Regex.IsMatch(l, "Subnetzpr.fix:\\s+[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+\\/[0-9]+ \\(Maske [0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+\\)", RegexOptions.IgnoreCase)) { + subnet = Regex.Match(l, "\\(Maske ([0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+)\\)").Groups[1].ToString(); + } + if(Regex.IsMatch(l, "Standardgateway:\\s+[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+", RegexOptions.IgnoreCase)) { + gateway = Regex.Match(l, "[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+").ToString(); + } + } + } + + this.runProgramNetsh("interface ipv4 show dnsservers"); + text = this.netsh_output.Trim().Split('\n'); + match = false; + foreach(string line in text) { + string l = line.Trim(); + if(l == "") { + continue; + } + if(Regex.IsMatch(l, "^Konfiguration der Schnittstelle", RegexOptions.IgnoreCase)) { + match = false; + } + if(Regex.IsMatch(l, "^[a-z0-9 ]+\"" + adapter + "\"", RegexOptions.IgnoreCase)) { + match = true; + } + if(match) { + if(Regex.IsMatch(l, "Über DHCP konfigurierte DNS-Server:\\s+", RegexOptions.IgnoreCase)) { + dns = "auto"; + } + if(Regex.IsMatch(l, "Statisch konfigurierte DNS-Server:\\s+[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+", RegexOptions.IgnoreCase)) { + dns = Regex.Match(l, "[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+").ToString(); + } + } + } + + this.runProgramNetsh("interface ipv4 show winsservers"); + text = this.netsh_output.Trim().Split('\n'); + match = false; + foreach(string line in text) { + string l = line.Trim(); + if(l == "") { + continue; + } + if(Regex.IsMatch(l, "^Konfiguration der Schnittstelle", RegexOptions.IgnoreCase)) { + match = false; + } + if(Regex.IsMatch(l, "^[a-z0-9 ]+\"" + adapter + "\"", RegexOptions.IgnoreCase)) { + match = true; + } + if(match) { + if(Regex.IsMatch(l, "Über DHCP konfigurierte WINS-Server:\\s+", RegexOptions.IgnoreCase)) { + wins = "auto"; + } + if(Regex.IsMatch(l, "Statisch konfigurierte WINS-Server:\\s+[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+", RegexOptions.IgnoreCase)) { + wins = Regex.Match(l, "[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+").ToString(); + } + } + } + } catch(Exception e) { + this.sendMessage(e.Message); + return false; + } + if(ip == "") { + this.sendMessage("unknown"); + return false; + } + this.sendMessage("[" + ip + "|" + subnet + "|" + gateway + "|" + dns + "|" + wins + "]"); + return true; + } + + private bool runProgramNetsh(string args) { + this.addLog("SetNetworks.runProgramNetsh", "Netsh: " + args, LogLevel.Info); + //Console.WriteLine("netsh args: "+args); + Process p = new Process(); + p.StartInfo.Arguments = args; + p.StartInfo.FileName = "netsh"; + p.StartInfo.CreateNoWindow = true; + p.StartInfo.RedirectStandardOutput = true; + p.StartInfo.UseShellExecute = false; + p.Start(); + this.netsh_output = p.StandardOutput.ReadToEnd(); + p.WaitForExit(); + //Console.WriteLine(this.netsh_output.Trim()); + if(p.ExitCode == 0) { + return true; + } + throw new Exception(this.netsh_output.Trim()); + } + } } diff --git a/NetMonitorServer/Actions/SetOpenVPNService.cs b/NetMonitorServer/Actions/SetOpenVPNService.cs index f86fcb5..2e4c25c 100644 --- a/NetMonitorServer/Actions/SetOpenVPNService.cs +++ b/NetMonitorServer/Actions/SetOpenVPNService.cs @@ -10,13 +10,14 @@ namespace NetMonitorServer { class SetOpenVPNService : ActionClass { internal override bool Run(Queue arguments) { + this.addLog("SetOpenVPNService.Run", "Starte OpenVpn Befehl", LogLevel.Notice); if(arguments.Count < 2) { this.sendMessage("To less arguments for SetOpenVpnService class"); return false; } switch(arguments.Dequeue().ToLower()) { case "status": - return this.getVpn(arguments); + return this.getVpnStatus(arguments); case"start": return this.getVpnStart(arguments); case"stop": @@ -28,7 +29,12 @@ namespace NetMonitorServer { } private bool getVpnStop(Queue arguments) { + if(arguments.Count != 1) { + this.sendMessage("To less arguments for SetOpenVpnService.getVpnStop"); + return false; + } string config = arguments.Dequeue(); + this.addLog("SetOpenVPNService.getVpnStop", "Stoppe OpenVPN: "+config, LogLevel.Notice); if(Model.openvpnInstances.Keys.Contains(config)) { //schon in der Liste OpenVpnController o = Model.openvpnInstances[config]; if(o.HasExited) { //läuft nicht! Fehler! @@ -41,11 +47,16 @@ namespace NetMonitorServer { return false; } this.sendMessage("true"); - return false; + return true; } private bool getVpnStart(Queue arguments) { + if(arguments.Count != 1) { + this.sendMessage("To less arguments for SetOpenVpnService.getVpnStart"); + return false; + } string config = arguments.Dequeue(); + this.addLog("SetOpenVPNService.getVpnStart", "Starte OpenVPN: " + config, LogLevel.Notice); if(Model.openvpnInstances.Keys.Contains(config)) { //schon in der Liste OpenVpnController o = Model.openvpnInstances[config]; if(!o.HasExited) { //läuft noch! Fehler! @@ -58,32 +69,30 @@ namespace NetMonitorServer { this.sendMessage("Fehler beim Starten von OpenVPN: " + e.Message); return false; } - this.sendMessage("true"); - return true; } else { //Noch nicht in der liste - string ovpn = InIReader.getInstance("config.ini").getValue("program", "openvpn"); + string ovpn = Factory.getSettings().getValue("program", "openvpn"); ovpn = (ovpn.EndsWith("\\")) ? ovpn : ovpn + "\\"; try { OpenVpnController o = new OpenVpnController(ovpn, config); + o.EventLog += this.addLog; Model.openvpnInstances.Add(config, o); o.Start(); } catch(Exception e) { this.sendMessage("Fehler beim Starten von OpenVPN: " + e.Message); return false; } - this.sendMessage("true"); - return true; } + this.sendMessage("true"); + return true; } - - - private bool getVpn(Queue arguments) { + private bool getVpnStatus(Queue arguments) { if(arguments.Count != 1) { - this.sendMessage("To less arguments for SetOpenVpnService.getVpn class"); + this.sendMessage("To less arguments for SetOpenVpnService.getVpnStatus"); return false; } string config = arguments.Dequeue(); + this.addLog("SetOpenVPNService.getVpnStatus", "Status des OpenVPN: " + config, LogLevel.Notice); string run = ""; try { if(Model.openvpnInstances.Keys.Contains(config)) { diff --git a/NetMonitorServer/Actions/SetService.cs b/NetMonitorServer/Actions/SetService.cs index d381b93..9303635 100644 --- a/NetMonitorServer/Actions/SetService.cs +++ b/NetMonitorServer/Actions/SetService.cs @@ -7,109 +7,93 @@ using System.Net; using System.Net.Sockets; using System.ServiceProcess; -namespace NetMonitorServer -{ - class SetService : ActionClass - { - ServiceController serviceController; +namespace NetMonitorServer { + class SetService : ActionClass { + ServiceController serviceController; - private bool setServiceStart(Queue data) - { - if (data.Count != 1) - { - this.sendMessage("To less arguments for SetService.setServiceStart class"); - return false; - } - this.serviceController.ServiceName = data.Dequeue(); - try - { - this.serviceController.Start(); - this.serviceController.WaitForStatus(ServiceControllerStatus.Running, new TimeSpan(0, 0, 30)); - } - catch (Exception e) - { - this.sendMessage(e.Message); - return false; - } - if (this.serviceController.Status == ServiceControllerStatus.Running) - { - this.sendMessage("true"); - } - else - { - this.sendMessage("The service isn't started"); - return false; - } - return true; - } - - private bool setServiceStop(Queue data) - { - if (data.Count != 1) - { - this.sendMessage("To less arguments for SetService.setServiceStop class"); - return false; - } - this.serviceController.ServiceName = data.Dequeue(); - try - { - this.serviceController.Stop(); - this.serviceController.WaitForStatus(ServiceControllerStatus.Stopped, new TimeSpan(0, 0, 30)); - } - catch (Exception e) - { - this.sendMessage(e.Message); - return false; - } - if (this.serviceController.Status == ServiceControllerStatus.Stopped) - { - this.sendMessage("true"); - } - else - { - this.sendMessage("The service isn't stopped"); - return false; - } - return true; - } - - private bool getServiceStatus(Queue data) - { - if (data.Count != 1) - { - this.sendMessage("To less arguments for SetService.setServiceStatus class"); - return false; - } - try - { - this.serviceController.ServiceName = data.Dequeue(); - if (this.serviceController.Status == ServiceControllerStatus.Running) - this.sendMessage("running"); - else - this.sendMessage("stopped"); - } - catch (Exception e) - { - this.sendMessage(e.Message); - return false; - } - return true; - } - internal override bool Run(Queue arguments) - { - if (arguments.Count != 2) - { - this.sendMessage("To less arguments for SetService class"); - return false; - } - this.serviceController = new ServiceController(); - switch (arguments.Dequeue().ToLower()) - { - case "start": return this.setServiceStart(arguments); - case "stop": return this.setServiceStop(arguments); - case "status": return this.getServiceStatus(arguments); - default: this.sendMessage("Wrong arguments for service on SetService class"); return false; - } - } + internal override bool Run(Queue arguments) { + this.addLog("SetService.Run", "Starte Service Befehl", LogLevel.Notice); + if(arguments.Count != 2) { + this.sendMessage("To less arguments for SetService class"); + return false; + } + this.serviceController = new ServiceController(); + switch(arguments.Dequeue().ToLower()) { + case "start": + return this.setServiceStart(arguments); + case "stop": + return this.setServiceStop(arguments); + case "status": + return this.getServiceStatus(arguments); + default: + this.sendMessage("Wrong arguments for service on SetService class"); + return false; + } } + + private bool setServiceStart(Queue data) { + if(data.Count != 1) { + this.sendMessage("To less arguments for SetService.setServiceStart class"); + return false; + } + this.serviceController.ServiceName = data.Dequeue(); + this.addLog("SetService.setServiceStart", "Starte Service: " + this.serviceController.ServiceName, LogLevel.Notice); + try { + this.serviceController.Start(); + this.serviceController.WaitForStatus(ServiceControllerStatus.Running, new TimeSpan(0, 0, 30)); + } catch(Exception e) { + this.sendMessage(e.Message); + return false; + } + if(this.serviceController.Status == ServiceControllerStatus.Running) { + this.sendMessage("true"); + } else { + this.sendMessage("The service isn't started"); + return false; + } + return true; + } + + private bool setServiceStop(Queue data) { + if(data.Count != 1) { + this.sendMessage("To less arguments for SetService.setServiceStop class"); + return false; + } + this.serviceController.ServiceName = data.Dequeue(); + this.addLog("SetService.setServiceStop", "Stoppe Service: " + this.serviceController.ServiceName, LogLevel.Notice); + try { + this.serviceController.Stop(); + this.serviceController.WaitForStatus(ServiceControllerStatus.Stopped, new TimeSpan(0, 0, 30)); + } catch(Exception e) { + this.sendMessage(e.Message); + return false; + } + if(this.serviceController.Status == ServiceControllerStatus.Stopped) { + this.sendMessage("true"); + } else { + this.sendMessage("The service isn't stopped"); + return false; + } + return true; + } + + private bool getServiceStatus(Queue data) { + if(data.Count != 1) { + this.sendMessage("To less arguments for SetService.setServiceStatus class"); + return false; + } + try { + this.serviceController.ServiceName = data.Dequeue(); + this.addLog("SetService.setServiceStatus", "Status des Service: " + this.serviceController.ServiceName, LogLevel.Notice); + if(this.serviceController.Status == ServiceControllerStatus.Running) + this.sendMessage("running"); + else + this.sendMessage("stopped"); + } catch(Exception e) { + this.sendMessage(e.Message); + return false; + } + return true; + } + } } diff --git a/NetMonitorServer/Controller/OpenVpnController.cs b/NetMonitorServer/Controller/OpenVpnController.cs index 368d5a0..76c57d0 100644 --- a/NetMonitorServer/Controller/OpenVpnController.cs +++ b/NetMonitorServer/Controller/OpenVpnController.cs @@ -6,9 +6,10 @@ using System.Threading.Tasks; using System.Diagnostics; using System.Text.RegularExpressions; using System.IO; +using BlubbFish.Utils; namespace NetMonitorServer.Controller { - class OpenVpnController { + class OpenVpnController : OwnObject { private Process proc; public bool HasExited { get; private set; } @@ -20,8 +21,10 @@ namespace NetMonitorServer.Controller { public string IpDate { get; private set; } public string SuccessDate { get; private set; } + private string config; + public OpenVpnController(string path, string config) { - // TODO: Complete member initialization + this.addLog("NetMonitorServer.Start", "Erstelle OpenVPN " + config, LogLevel.Notice); this.proc = new Process(); this.proc.StartInfo.Arguments = "--config " + config; this.proc.StartInfo.FileName = path + "bin\\openvpn.exe"; @@ -29,8 +32,9 @@ namespace NetMonitorServer.Controller { this.HasExited = true; this.Conntected = false; this.Error = ""; + this.config = config; } - + private void VpnOutputHandler(object sendingProcess, DataReceivedEventArgs outLine) { if(!String.IsNullOrEmpty(outLine.Data)) { string pattern = "^(.*?) N.*?IP/netmask of ([0-9\\./]*).*?DHCP-serv: ([0-9\\.]*).*?lease-time: ([0-9]*)"; @@ -47,16 +51,19 @@ namespace NetMonitorServer.Controller { this.SuccessDate = match.Groups[1].Value; this.Conntected = true; } - //Console.WriteLine("L: |" + outLine.Data + "|"); + this.addLog("NetMonitorServer.VpnOutputHandler", "OpenVPN: " + outLine.Data, LogLevel.Info); } } private void VpnErrorHandler(object sendingProcess, DataReceivedEventArgs outLine) { this.Error += outLine.Data; + this.addLog("NetMonitorServer.VpnErrorHandler", "OpenVPN:" + outLine.Data, LogLevel.Warn); } internal bool Start() { + this.addLog("NetMonitorServer.Start", "Starte OpenVPN " + this.config, LogLevel.Notice); if(!this.HasExited) { + this.addLog("NetMonitorServer.Start", "OpenVPN wurde schon gestartet " + this.config, LogLevel.Warn); return false; } this.HasExited = false; @@ -75,6 +82,7 @@ namespace NetMonitorServer.Controller { } internal bool Kill() { + this.addLog("NetMonitorServer.Kill", "Stoppe OpenVPN " + this.config, LogLevel.Notice); this.proc.CancelErrorRead(); this.proc.CancelOutputRead(); this.proc.Kill(); diff --git a/NetMonitorServer/Factory.cs b/NetMonitorServer/Factory.cs index 7b6b57f..d754dd6 100644 --- a/NetMonitorServer/Factory.cs +++ b/NetMonitorServer/Factory.cs @@ -2,7 +2,9 @@ using System.Collections.Generic; using System.Linq; using System.Text; +using System.IO; using BlubbFish.Utils; +using System.Reflection; namespace NetMonitorServer { class Factory { @@ -16,7 +18,8 @@ namespace NetMonitorServer { return null; } internal static InIReader getSettings() { - return InIReader.getInstance("config.ini"); + string path = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); + return InIReader.getInstance(path + "\\config.ini"); } } } diff --git a/NetMonitorServer/MainService.cs b/NetMonitorServer/MainService.cs index 3f8cdcc..d3595b1 100644 --- a/NetMonitorServer/MainService.cs +++ b/NetMonitorServer/MainService.cs @@ -11,74 +11,93 @@ using System.Net.Sockets; using System.Threading; using BlubbFish.Utils; -namespace NetMonitorServer -{ - public partial class MainService : ServiceBase - { - private Thread serverThread = new Thread(new ThreadStart(overwatch)); - private static UdpClient receiveStream; - public MainService() - { - InitializeComponent(); - this.serverThread.IsBackground = true; - } - - private static void overwatch() - { - IPEndPoint networkStreamAddress = new IPEndPoint(IPAddress.Loopback, 0); - while (true) - { - if (Thread.CurrentThread.ThreadState == System.Threading.ThreadState.AbortRequested) - { - receiveStream.Close(); - break; - } - byte[] data = receiveStream.Receive(ref networkStreamAddress); - Thread queryThread = new Thread(new ParameterizedThreadStart(ServerCommandProcessor)); - queryThread.Start(data); - } - } - - private static void ServerCommandProcessor(object threadParam) - { - string data = Encoding.UTF8.GetString((byte[])threadParam); - Console.WriteLine(data); - Queue arguments = new Queue(data.Split(' ')); - if (arguments.Count < 2) - { - Console.WriteLine("Zu wenig Argumente"); - return; - } - ActionClass a = Factory.getAction(arguments.Dequeue()); - if (a == null) - { - Console.WriteLine("Falsche Angabe der ActionClass"); - return; - } - a.SetAnswerStream(new UdpClient(), new IPEndPoint(IPAddress.Loopback, Int32.Parse(arguments.Dequeue()))); - a.Run(arguments); - } - - protected override void OnStart(string[] args) - { - this.initServerThread(); - this.serverThread.Start(); - } - - private void initServerThread() - { - receiveStream = new UdpClient(Int32.Parse(Factory.getSettings().getValue("ports", "server"))); - } - - protected override void OnStop() - { - this.serverThread.Abort(); - try { receiveStream.Close(); } catch { }; - } - - public void StartServiceConsole(string[] args) - { - this.OnStart(args); - } +namespace NetMonitorServer { + public partial class MainService : ServiceBase { + private Thread serverThread = new Thread(new ThreadStart(overwatch)); + private static UdpClient receiveStream; + private static FileLogger log; + private static OwnObject.LogLevel loglevel; + public MainService() { + string folder = Factory.getSettings().getValue("program", "logfolder"); + folder = folder.EndsWith("\\") ? folder : folder + "\\"; + log = FileLogger.getInstance(folder + "server.log", false); + loglevel = (OwnObject.LogLevel)Enum.Parse(typeof(OwnObject.LogLevel), Factory.getSettings().getValue("program", "loglevel")); + LogEvents("MainService", "Server Starten...", OwnObject.LogLevel.Notice); + + InitializeComponent(); + this.serverThread.IsBackground = true; } + + private static void overwatch() { + LogEvents("MainService.overwatch", "Empfangsthread gestartet.", OwnObject.LogLevel.Notice); + IPEndPoint networkStreamAddress = new IPEndPoint(IPAddress.Loopback, 0); + while(true) { + if(Thread.CurrentThread.ThreadState == System.Threading.ThreadState.AbortRequested) { + receiveStream.Close(); + break; + } + byte[] data = receiveStream.Receive(ref networkStreamAddress); + Thread queryThread = new Thread(new ParameterizedThreadStart(ServerCommandProcessor)); + queryThread.Start(data); + } + } + + private static void ServerCommandProcessor(object threadParam) { + string data = Encoding.UTF8.GetString((byte[])threadParam); + LogEvents("MainService.ServerCommandProcessor", "Befehl empfangen: "+data, OwnObject.LogLevel.Notice); + Queue arguments = new Queue(data.Split(' ')); + if(arguments.Count < 2) { + LogEvents("MainService.ServerCommandProcessor", "Zu wenig Argumente", OwnObject.LogLevel.Error); + return; + } + ActionClass a = Factory.getAction(arguments.Dequeue()); + a.EventLog += LogEvents; + if(a == null) { + LogEvents("MainService.ServerCommandProcessor", "Falsche Angabe der ActionClass", OwnObject.LogLevel.Error); + return; + } + a.SetAnswerStream(new UdpClient(), new IPEndPoint(IPAddress.Loopback, Int32.Parse(arguments.Dequeue()))); + a.Run(arguments); + } + + static void LogEvents(string location, string message, OwnObject.LogLevel level) { + LogEvents(location, message, level, DateTime.Now); + } + + static void LogEvents(string location, string message, OwnObject.LogLevel level, DateTime date) { + string msg = OwnObject.logToString(location, message, level, date, true, true); + //if(level >= loglevel) { + log.setLine(msg); + //} + Console.WriteLine(msg); + } + + protected override void OnStart(string[] args) { + LogEvents("MainService.OnStart", "Server gestartet", OwnObject.LogLevel.Notice); + this.initServerThread(); + this.serverThread.Start(); + } + + private void initServerThread() { + int port = Int32.Parse(Factory.getSettings().getValue("ports", "server")); + try { + receiveStream = new UdpClient(port); + } catch(Exception e) { + LogEvents("MainService.initServerThread", "Fehler beim Initialisieren des Ports "+port+": "+e.Message, OwnObject.LogLevel.Error); + throw e; + } + } + + protected override void OnStop() { + LogEvents("MainService.OnStop", "Server gestoppt", OwnObject.LogLevel.Notice); + this.serverThread.Abort(); + try { receiveStream.Close(); } catch { }; + } + + public void StartServiceConsole(string[] args) { + loglevel = OwnObject.LogLevel.Debug; + LogEvents("MainService.StartServiceConsole", "Server über die Konsole gestartet", OwnObject.LogLevel.Notice); + this.OnStart(args); + } + } } diff --git a/NetMonitorServer/Program.cs b/NetMonitorServer/Program.cs index 321ff74..d09880f 100644 --- a/NetMonitorServer/Program.cs +++ b/NetMonitorServer/Program.cs @@ -6,54 +6,45 @@ using System.Text; using System.Configuration.Install; using System.ComponentModel; -namespace NetMonitorServer -{ - [RunInstaller(true)] - public class TestWinInstaller : Installer - { - private ServiceInstaller m_ThisService; - private ServiceProcessInstaller m_ThisServiceProcess; +namespace NetMonitorServer { + [RunInstaller(true)] + public class TestWinInstaller : Installer { + private ServiceInstaller m_ThisService; + private ServiceProcessInstaller m_ThisServiceProcess; - public TestWinInstaller() - { - m_ThisService = new ServiceInstaller(); - m_ThisServiceProcess = new ServiceProcessInstaller(); + public TestWinInstaller() { + m_ThisService = new ServiceInstaller(); + m_ThisServiceProcess = new ServiceProcessInstaller(); - m_ThisServiceProcess.Account = ServiceAccount.LocalSystem; - m_ThisService.ServiceName = "NetMonitorServer"; - m_ThisService.StartType = ServiceStartMode.Automatic; - m_ThisService.Description = "Teil von NetMonitor der die Systemnahen Befele ausführt"; - m_ThisService.DisplayName = "Netzwerk Settings Tool"; + m_ThisServiceProcess.Account = ServiceAccount.LocalSystem; + m_ThisService.ServiceName = "NetMonitorServer"; + m_ThisService.StartType = ServiceStartMode.Automatic; + m_ThisService.Description = "Teil von NetMonitor der die Systemnahen Befele ausführt"; + m_ThisService.DisplayName = "Netzwerk Settings Tool"; - Installers.Add(m_ThisService); - Installers.Add(m_ThisServiceProcess); - } - } - static class Program - { - /// - /// The main entry point for the application. - /// - static void Main(string[] args) - { - if (args.Length == 0) - { - ServiceBase[] ServicesToRun; - ServicesToRun = new ServiceBase[] - { - new MainService() - }; - ServiceBase.Run(ServicesToRun); - } - else if (args.Length == 1 || args[0] == "-r") - { - MainService s = new MainService(); - s.StartServiceConsole(args); - while (true) - { - System.Threading.Thread.Sleep(100); - } - } - } - } + Installers.Add(m_ThisService); + Installers.Add(m_ThisServiceProcess); + } + } + static class Program { + /// + /// The main entry point for the application. + /// + static void Main(string[] args) { + if(args.Length == 0) { + ServiceBase[] ServicesToRun; + ServicesToRun = new ServiceBase[] + { + new MainService() + }; + ServiceBase.Run(ServicesToRun); + } else if(args.Length == 1 && args[0] == "-r") { + MainService s = new MainService(); + s.StartServiceConsole(args); + while(true) { + System.Threading.Thread.Sleep(100); + } + } + } + } } diff --git a/NetMonitorTray/Controller/ControllerTray.cs b/NetMonitorTray/Controller/ControllerTray.cs index c3431d7..a3bf196 100644 --- a/NetMonitorTray/Controller/ControllerTray.cs +++ b/NetMonitorTray/Controller/ControllerTray.cs @@ -6,6 +6,8 @@ using System.Threading.Tasks; using System.Windows.Forms; using NetMonitorUtils; using BlubbFish.Utils; +using System.Threading; +using System.Runtime.CompilerServices; namespace NetMonitorTray.Controller { public class Tray : OwnController { @@ -13,12 +15,14 @@ namespace NetMonitorTray.Controller { private static OpenVpnSetter vpn; private static NetworkSetter network; private static Controller.Window window; + private static Thread trayMenuRefresh; /// /// Tray Controller /// public Tray() { vpn = new OpenVpnSetter("vpn.ini", "config.ini"); network = new NetworkSetter("network.ini", "config.ini"); + trayMenuRefresh = new Thread(menuRefresh); } /// /// Init! @@ -28,15 +32,38 @@ namespace NetMonitorTray.Controller { window = new Controller.Window(); tray.setWorkingIcon(); try { - tray.Model.connectedStatus = false; - List vpns = tray.Model.getVpnList(); - tray.Model.VpnSelected = vpn.getStatus(vpns); - List adapter = tray.Model.getAdapterList(); - tray.Model.NetworkSelected = network.getNetwork(adapter); + updateMenu(); } catch(Exception e) { tray.showError(e.Message); tray.Model.connectedStatus = false; } + trayMenuRefresh.Start(); + } + + private static void menuRefresh() { + while(true) { + Thread.Sleep(10 * 60 * 1000); //Wait 10 Minutes + updateMenu(); + } + } + + [MethodImpl(MethodImplOptions.Synchronized)] + private static void updateMenu() { + List adapter = tray.Model.getAdapterList(); + tray.Model.NetworkSelected = network.getNetwork(adapter); + List vpns = tray.Model.getVpnList(); + tray.Model.VpnSelected = vpn.getStatus(vpns); + checkWorkingIcon(); + } + + private static void checkWorkingIcon() { + bool w = false; + foreach(KeyValuePair item in tray.Model.VpnSelected) { + if(item.Value == "connected") { + w = true; + } + } + tray.Model.connectedStatus = w; } /// /// User klickt auf den Eintrag Beenden @@ -44,10 +71,12 @@ namespace NetMonitorTray.Controller { /// /// internal static void Click_Quit(object sender, EventArgs e) { + trayMenuRefresh.Abort(); + while(trayMenuRefresh.ThreadState != ThreadState.Aborted) { Thread.Sleep(100); } tray.Dispose(); - //Application.ExitThread(); Application.Exit(); } + /// /// User klick auf einen Eintrag Service Starten/Stoppen /// @@ -55,7 +84,6 @@ namespace NetMonitorTray.Controller { /// internal static void Click_Vpn(object sender, EventArgs e) { tray.setWorkingIcon(); - string[] conf = ((ToolStripMenuItem)sender).Name.Split('|'); switch(tray.Model.VpnSelected[conf[1]]) { case "disconnected": @@ -74,7 +102,6 @@ namespace NetMonitorTray.Controller { System.Threading.Thread.Sleep(3000); } } catch(Exception ex) { - tray.Model.connectedStatus = false; tray.showError("Fehler beim starten von Openvpn mit " + conf[1] + ": " + ex.Message); } break; @@ -91,12 +118,13 @@ namespace NetMonitorTray.Controller { System.Threading.Thread.Sleep(1000); } } catch(Exception ex) { - tray.Model.connectedStatus = false; tray.showError("Fehler beim beenden von Openvpn mit " + conf + ": " + ex.Message); } break; } + checkWorkingIcon(); } + /// /// User klickt Doppelt auf das TrayIcon /// @@ -105,13 +133,14 @@ namespace NetMonitorTray.Controller { internal static void Click_Tray(object sender, EventArgs e) { Click_Open(sender, e); } + /// /// User klickt auf den Tray-Ballon /// /// /// internal static void Click_Ballon(object sender, EventArgs e) { - throw new NotImplementedException(); + Click_Open(sender, e); } /// /// User klickt auf einen Eintrag Netzwerk @@ -121,12 +150,13 @@ namespace NetMonitorTray.Controller { internal static void Click_Network(object sender, EventArgs e) { tray.setWorkingIcon(); try { - network.setNetwork(((ToolStripMenuItem)sender).Name); string n = ((ToolStripMenuItem)sender).Name; + network.setNetwork(n.Split('|')[1]); tray.Model.NetworkSelected[n.Split('|')[0]] = n.Split('|')[1]; } catch(Exception ex) { tray.showError("Fehler beim setzen des Netzwerks: " + ex.Message); } + checkWorkingIcon(); } /// /// User klickt auf den Eintrag Öffnen diff --git a/NetMonitorTray/Controller/ControllerWindow.cs b/NetMonitorTray/Controller/ControllerWindow.cs index 4d8f225..1f59b21 100644 --- a/NetMonitorTray/Controller/ControllerWindow.cs +++ b/NetMonitorTray/Controller/ControllerWindow.cs @@ -7,32 +7,65 @@ using System.Windows.Forms; using NetMonitorUtils; using BlubbFish.Utils; -namespace NetMonitorTray.Controller -{ - public class Window : OwnController - { - private static View.Window window; - /// - /// Tray Controller - /// - public Window() - { - - } +namespace NetMonitorTray.Controller { + public class Window : OwnController { + private static View.Window window; + /// + /// Tray Controller + /// + public Window() { - override protected void init() - { - window = new View.Window(); - } - - public static void FormClosed(object sender, FormClosedEventArgs e) - { - window.Dispose(); - } - - internal static void NetworkSelected(object sender, EventArgs e) - { - MessageBox.Show("Angeklickt!"); - } } + + override protected void init() { + window = new View.Window(); + } + + public static void FormClosed(object sender, FormClosedEventArgs e) { + window.Dispose(); + } + + internal static void NetworkSelected(object sender, EventArgs e) { + ListView list = sender as ListView; + for(int i = 0; i < list.Items.Count; i++) { + if(list.Items[i].Selected) { + window.networkSelected(i); + } + } + } + + internal static void VpnSelected(object sender, EventArgs e) { + ListView list = sender as ListView; + for(int i = 0; i < list.Items.Count; i++) { + if(list.Items[i].Selected) { + window.vpnSelected(i); + } + } + } + + private void button2_Click(object sender, EventArgs e) { + + } + + internal static void ChangeOpenVpnFolder(object sender, EventArgs e) { + window.Folderpicker(); + } + + internal static void ChangeLogFolder(object sender, EventArgs e) { + window.Folderpicker(); + } + + internal static void ChangeOpenVpnConfigFile(object sender, EventArgs e) { + window.Filepicker(); + } + + + internal static void NetworkAktivate(object sender, EventArgs e) { + MessageBox.Show("Network Verbinden!"); + } + + internal static void VpnAktivate(object sender, EventArgs e) { + MessageBox.Show("VPN Verbinden!"); + } + } } diff --git a/NetMonitorTray/Models/ModelWindow.cs b/NetMonitorTray/Models/ModelWindow.cs index eb0aa1f..b9cc795 100644 --- a/NetMonitorTray/Models/ModelWindow.cs +++ b/NetMonitorTray/Models/ModelWindow.cs @@ -6,63 +6,78 @@ using System.Threading.Tasks; using System.Windows.Forms; using NetMonitorTray.Properties; using BlubbFish.Utils; +using NetMonitorUtils; -namespace NetMonitorTray.Models -{ - public class Window : OwnModel - { - private InIReader networkfile; - private Window() - { - this.init(); - } - - override protected void init() - { - this.networkfile = InIReader.getInstance("network.ini"); - } - - /// - /// Listet alle Netzwerke auf - /// - public List Networks - { - get { return this.networkfile.getSections(); } - } - - public string getNetworkProperty(string network, string property) - { - return this.networkfile.getValue(network, property); - } - - /// - /// Fügt ein neues Netzwerk hinzu - /// - /// Netzwerkid - /// true if added, false if error - public bool addNetwork(string name) - { - if (this.networkfile.addSection(name)) - { - this.update(); - return true; - } - return false; - } - - /// - /// Löscht ein Netzwerk - /// - /// Netzwerkid - /// true if deleted, false if error - public bool removeNetwork(string name) - { - if (this.networkfile.removeSection(name)) - { - this.update(); - return true; - } - return false; - } +namespace NetMonitorTray.Models { + public class Window : OwnModel { + private InIReader networkfile; + private InIReader vpnfile; + private InIReader settingsfile; + private NetworkSetter networksetter; + private Window() { + this.init(); } + + override protected void init() { + this.networkfile = InIReader.getInstance("network.ini"); + this.vpnfile = InIReader.getInstance("vpn.ini"); + this.settingsfile = InIReader.getInstance("config.ini"); + this.networksetter = new NetworkSetter("network.ini", "config.ini"); + } + + /// + /// Listet alle Netzwerke auf + /// + public List Networks { + get { return this.networkfile.getSections(); } + } + + public List Vpns { + get { return this.vpnfile.getSections(); } + } + + + + /// + /// Fügt ein neues Netzwerk hinzu + /// + /// Netzwerkid + /// true if added, false if error + public bool addNetwork(string name) { + if(this.networkfile.addSection(name)) { + this.update(); + return true; + } + return false; + } + + /// + /// Löscht ein Netzwerk + /// + /// Netzwerkid + /// true if deleted, false if error + public bool removeNetwork(string name) { + if(this.networkfile.removeSection(name)) { + this.update(); + return true; + } + return false; + } + + internal string getVpnProperty(string vpn, string property) { + return this.vpnfile.getValue(vpn, property); + } + + public string getNetworkProperty(string network, string property) { + return this.networkfile.getValue(network, property); + } + + public string getSettingsProperty(string setting, string property) { + return this.settingsfile.getValue(setting, property); + } + + public List getNetworkAdapters() { + return this.networksetter.getAdapters(); + } + } } diff --git a/NetMonitorTray/NetMonitorTray.csproj b/NetMonitorTray/NetMonitorTray.csproj index 8639863..f7d80c4 100644 --- a/NetMonitorTray/NetMonitorTray.csproj +++ b/NetMonitorTray/NetMonitorTray.csproj @@ -74,7 +74,12 @@ + + + + + diff --git a/NetMonitorTray/Program.cs b/NetMonitorTray/Program.cs index b77e78a..dae6034 100644 --- a/NetMonitorTray/Program.cs +++ b/NetMonitorTray/Program.cs @@ -6,15 +6,17 @@ using System.Threading.Tasks; using System.Windows.Forms; -namespace NetMonitorTray -{ - class Program - { - static void Main(string[] args) - { - Controller.Tray t = new Controller.Tray(); - t.execute(); - Application.Run(); - } +namespace NetMonitorTray { + class Program { + [STAThread] + static void Main(string[] args) { + try { + Controller.Tray t = new Controller.Tray(); + t.execute(); + Application.Run(); + } catch(Exception e) { + MessageBox.Show("Fehler: " + e.Message + "\nStack: " + e.StackTrace, "Exception: " + e.GetType().ToString(), MessageBoxButtons.OK, MessageBoxIcon.Error); + } } + } } diff --git a/NetMonitorTray/Properties/Resources.Designer.cs b/NetMonitorTray/Properties/Resources.Designer.cs index 8c81f74..9dbcd0f 100644 --- a/NetMonitorTray/Properties/Resources.Designer.cs +++ b/NetMonitorTray/Properties/Resources.Designer.cs @@ -60,6 +60,46 @@ namespace NetMonitorTray.Properties { } } + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap add { + get { + object obj = ResourceManager.GetObject("add", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap delete { + get { + object obj = ResourceManager.GetObject("delete", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap file { + get { + object obj = ResourceManager.GetObject("file", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap folder { + get { + object obj = ResourceManager.GetObject("folder", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + /// /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Icon ähnlich wie (Symbol). /// @@ -139,5 +179,15 @@ namespace NetMonitorTray.Properties { return ((System.Drawing.Bitmap)(obj)); } } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap save { + get { + object obj = ResourceManager.GetObject("save", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } } } diff --git a/NetMonitorTray/Properties/Resources.resx b/NetMonitorTray/Properties/Resources.resx index 57be761..0a4dce8 100644 --- a/NetMonitorTray/Properties/Resources.resx +++ b/NetMonitorTray/Properties/Resources.resx @@ -118,6 +118,12 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + ..\resources\icons\add.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\resources\icons\cancel.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + ..\Resources\connected.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a @@ -142,4 +148,13 @@ ..\Resources\Icons\server_delete.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\resources\icons\disk.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\resources\icons\page_gear.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\resources\icons\folder.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + \ No newline at end of file diff --git a/NetMonitorTray/Views/ViewWindow.cs b/NetMonitorTray/Views/ViewWindow.cs index 60b05a4..af79127 100644 --- a/NetMonitorTray/Views/ViewWindow.cs +++ b/NetMonitorTray/Views/ViewWindow.cs @@ -41,5 +41,22 @@ namespace NetMonitorTray.View } public Models.Window Model { get; private set; } + + public string Folderpicker() { + return this.form.FolderPicker(); + } + + internal void networkSelected(int i) { + this.form.showSelectedNetwork(i); + } + + internal void vpnSelected(int i) { + this.form.showSelectedOpenvpn(i); + } + + internal string Filepicker() { + return this.form.FilePicker(); + } + } } diff --git a/NetMonitorTray/Views/ViewWindowForm.Designer.cs b/NetMonitorTray/Views/ViewWindowForm.Designer.cs index cbb3879..79fffca 100644 --- a/NetMonitorTray/Views/ViewWindowForm.Designer.cs +++ b/NetMonitorTray/Views/ViewWindowForm.Designer.cs @@ -28,165 +28,747 @@ /// private void InitializeComponent() { - this.statusStrip1 = new System.Windows.Forms.StatusStrip(); - this.tabControl1 = new System.Windows.Forms.TabControl(); - this.networks = new System.Windows.Forms.TabPage(); - this.groupBox2 = new System.Windows.Forms.GroupBox(); - this.groupBox1 = new System.Windows.Forms.GroupBox(); - this.listView1 = new System.Windows.Forms.ListView(); - this.columnHeader1 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeader2 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.buttonNetworkAdd = new System.Windows.Forms.Button(); - this.openvpn = new System.Windows.Forms.TabPage(); - this.global = new System.Windows.Forms.TabPage(); - this.label1 = new System.Windows.Forms.Label(); - this.logBox = new System.Windows.Forms.TextBox(); - this.tabControl1.SuspendLayout(); - this.networks.SuspendLayout(); - this.groupBox1.SuspendLayout(); - this.SuspendLayout(); - // - // statusStrip1 - // - this.statusStrip1.Location = new System.Drawing.Point(0, 336); - this.statusStrip1.Name = "statusStrip1"; - this.statusStrip1.Size = new System.Drawing.Size(780, 22); - this.statusStrip1.SizingGrip = false; - this.statusStrip1.TabIndex = 0; - this.statusStrip1.Text = "statusStrip1"; - // - // tabControl1 - // - this.tabControl1.Controls.Add(this.networks); - this.tabControl1.Controls.Add(this.openvpn); - this.tabControl1.Controls.Add(this.global); - this.tabControl1.Location = new System.Drawing.Point(12, 12); - this.tabControl1.Name = "tabControl1"; - this.tabControl1.SelectedIndex = 0; - this.tabControl1.Size = new System.Drawing.Size(591, 321); - this.tabControl1.TabIndex = 1; - // - // networks - // - this.networks.Controls.Add(this.groupBox2); - this.networks.Controls.Add(this.groupBox1); - this.networks.Location = new System.Drawing.Point(4, 22); - this.networks.Name = "networks"; - this.networks.Padding = new System.Windows.Forms.Padding(3); - this.networks.Size = new System.Drawing.Size(583, 295); - this.networks.TabIndex = 0; - this.networks.Text = "Netzwerke"; - this.networks.UseVisualStyleBackColor = true; - // - // groupBox2 - // - this.groupBox2.Location = new System.Drawing.Point(189, 6); - this.groupBox2.Name = "groupBox2"; - this.groupBox2.Size = new System.Drawing.Size(388, 283); - this.groupBox2.TabIndex = 3; - this.groupBox2.TabStop = false; - this.groupBox2.Text = "groupBox2"; - // - // groupBox1 - // - this.groupBox1.Controls.Add(this.listView1); - this.groupBox1.Controls.Add(this.buttonNetworkAdd); - this.groupBox1.Location = new System.Drawing.Point(6, 6); - this.groupBox1.Name = "groupBox1"; - this.groupBox1.Size = new System.Drawing.Size(177, 283); - this.groupBox1.TabIndex = 2; - this.groupBox1.TabStop = false; - this.groupBox1.Text = "groupBox1"; - // - // listView1 - // - this.listView1.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.statusStrip1 = new System.Windows.Forms.StatusStrip(); + this.tabControl1 = new System.Windows.Forms.TabControl(); + this.networks = new System.Windows.Forms.TabPage(); + this.groupBox2 = new System.Windows.Forms.GroupBox(); + this.networkButtonDelete = new System.Windows.Forms.Button(); + this.networkAdapter = new System.Windows.Forms.ComboBox(); + this.label16 = new System.Windows.Forms.Label(); + this.networkWins = new System.Windows.Forms.TextBox(); + this.label15 = new System.Windows.Forms.Label(); + this.networkAutoWins = new System.Windows.Forms.CheckBox(); + this.networkDns = new System.Windows.Forms.TextBox(); + this.label14 = new System.Windows.Forms.Label(); + this.networkAutoDns = new System.Windows.Forms.CheckBox(); + this.networkGateway = new System.Windows.Forms.TextBox(); + this.label13 = new System.Windows.Forms.Label(); + this.networkSubnet = new System.Windows.Forms.TextBox(); + this.label12 = new System.Windows.Forms.Label(); + this.networkIp = new System.Windows.Forms.TextBox(); + this.label11 = new System.Windows.Forms.Label(); + this.networkName = new System.Windows.Forms.TextBox(); + this.label10 = new System.Windows.Forms.Label(); + this.networkButtonSave = new System.Windows.Forms.Button(); + this.networkAutoIp = new System.Windows.Forms.CheckBox(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.networksList = new System.Windows.Forms.ListView(); + this.columnHeader1 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader2 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.networksAddButton = new System.Windows.Forms.Button(); + this.openvpn = new System.Windows.Forms.TabPage(); + this.groupBox4 = new System.Windows.Forms.GroupBox(); + this.openvpnList = new System.Windows.Forms.ListView(); + this.columnHeader3 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader4 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.openvpnButtonAdd = new System.Windows.Forms.Button(); + this.groupBox3 = new System.Windows.Forms.GroupBox(); + this.openvpnButtonSave = new System.Windows.Forms.Button(); + this.openvpnButtonDelete = new System.Windows.Forms.Button(); + this.openvpnConfig = new System.Windows.Forms.TextBox(); + this.label7 = new System.Windows.Forms.Label(); + this.openvpnButtonConfigfile = new System.Windows.Forms.Button(); + this.openvpnName = new System.Windows.Forms.TextBox(); + this.label6 = new System.Windows.Forms.Label(); + this.global = new System.Windows.Forms.TabPage(); + this.groupBox8 = new System.Windows.Forms.GroupBox(); + this.label8 = new System.Windows.Forms.Label(); + this.settingsLogLevel = new System.Windows.Forms.ComboBox(); + this.settingsButtonSave = new System.Windows.Forms.Button(); + this.settingsFolderPickerLog = new System.Windows.Forms.Button(); + this.settingsLogFolder = new System.Windows.Forms.TextBox(); + this.label9 = new System.Windows.Forms.Label(); + this.groupBox6 = new System.Windows.Forms.GroupBox(); + this.settingsFolderpickerVpn = new System.Windows.Forms.Button(); + this.settingsVpnFolder = new System.Windows.Forms.TextBox(); + this.label5 = new System.Windows.Forms.Label(); + this.groupBox5 = new System.Windows.Forms.GroupBox(); + this.label4 = new System.Windows.Forms.Label(); + this.settingsClientPortTo = new System.Windows.Forms.TextBox(); + this.settingsClientPortFrom = new System.Windows.Forms.TextBox(); + this.settingsServerPort = 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.logBox = new System.Windows.Forms.TextBox(); + this.folderBrowserDialog1 = new System.Windows.Forms.FolderBrowserDialog(); + this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog(); + this.tabControl1.SuspendLayout(); + this.networks.SuspendLayout(); + this.groupBox2.SuspendLayout(); + this.groupBox1.SuspendLayout(); + this.openvpn.SuspendLayout(); + this.groupBox4.SuspendLayout(); + this.groupBox3.SuspendLayout(); + this.global.SuspendLayout(); + this.groupBox8.SuspendLayout(); + this.groupBox6.SuspendLayout(); + this.groupBox5.SuspendLayout(); + this.SuspendLayout(); + // + // statusStrip1 + // + this.statusStrip1.Location = new System.Drawing.Point(0, 336); + this.statusStrip1.Name = "statusStrip1"; + this.statusStrip1.Size = new System.Drawing.Size(780, 22); + this.statusStrip1.SizingGrip = false; + this.statusStrip1.TabIndex = 0; + this.statusStrip1.Text = "statusStrip1"; + // + // tabControl1 + // + this.tabControl1.Controls.Add(this.networks); + this.tabControl1.Controls.Add(this.openvpn); + this.tabControl1.Controls.Add(this.global); + this.tabControl1.Location = new System.Drawing.Point(12, 12); + this.tabControl1.Name = "tabControl1"; + this.tabControl1.SelectedIndex = 0; + this.tabControl1.Size = new System.Drawing.Size(591, 321); + this.tabControl1.TabIndex = 1; + // + // networks + // + this.networks.Controls.Add(this.groupBox2); + this.networks.Controls.Add(this.groupBox1); + this.networks.Location = new System.Drawing.Point(4, 22); + this.networks.Name = "networks"; + this.networks.Padding = new System.Windows.Forms.Padding(3); + this.networks.Size = new System.Drawing.Size(583, 295); + this.networks.TabIndex = 0; + this.networks.Text = "Netzwerke"; + this.networks.UseVisualStyleBackColor = true; + // + // groupBox2 + // + this.groupBox2.Controls.Add(this.networkButtonDelete); + this.groupBox2.Controls.Add(this.networkAdapter); + this.groupBox2.Controls.Add(this.label16); + this.groupBox2.Controls.Add(this.networkWins); + this.groupBox2.Controls.Add(this.label15); + this.groupBox2.Controls.Add(this.networkAutoWins); + this.groupBox2.Controls.Add(this.networkDns); + this.groupBox2.Controls.Add(this.label14); + this.groupBox2.Controls.Add(this.networkAutoDns); + this.groupBox2.Controls.Add(this.networkGateway); + this.groupBox2.Controls.Add(this.label13); + this.groupBox2.Controls.Add(this.networkSubnet); + this.groupBox2.Controls.Add(this.label12); + this.groupBox2.Controls.Add(this.networkIp); + this.groupBox2.Controls.Add(this.label11); + this.groupBox2.Controls.Add(this.networkName); + this.groupBox2.Controls.Add(this.label10); + this.groupBox2.Controls.Add(this.networkButtonSave); + this.groupBox2.Controls.Add(this.networkAutoIp); + this.groupBox2.Location = new System.Drawing.Point(189, 6); + this.groupBox2.Name = "groupBox2"; + this.groupBox2.Size = new System.Drawing.Size(388, 283); + this.groupBox2.TabIndex = 3; + this.groupBox2.TabStop = false; + this.groupBox2.Text = "Eigenschaften"; + // + // networkButtonDelete + // + this.networkButtonDelete.Image = global::NetMonitorTray.Properties.Resources.delete; + this.networkButtonDelete.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.networkButtonDelete.Location = new System.Drawing.Point(220, 251); + this.networkButtonDelete.Name = "networkButtonDelete"; + this.networkButtonDelete.Size = new System.Drawing.Size(75, 23); + this.networkButtonDelete.TabIndex = 20; + this.networkButtonDelete.Text = "Löschen"; + this.networkButtonDelete.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + this.networkButtonDelete.UseVisualStyleBackColor = true; + // + // networkAdapter + // + this.networkAdapter.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.networkAdapter.FormattingEnabled = true; + this.networkAdapter.Location = new System.Drawing.Point(9, 231); + this.networkAdapter.Name = "networkAdapter"; + this.networkAdapter.Size = new System.Drawing.Size(198, 21); + this.networkAdapter.TabIndex = 19; + // + // label16 + // + this.label16.AutoSize = true; + this.label16.Location = new System.Drawing.Point(6, 214); + this.label16.Name = "label16"; + this.label16.Size = new System.Drawing.Size(47, 13); + this.label16.TabIndex = 18; + this.label16.Text = "Adapter:"; + // + // networkWins + // + this.networkWins.Location = new System.Drawing.Point(9, 191); + this.networkWins.Name = "networkWins"; + this.networkWins.Size = new System.Drawing.Size(266, 20); + this.networkWins.TabIndex = 17; + // + // label15 + // + this.label15.AutoSize = true; + this.label15.Location = new System.Drawing.Point(6, 175); + this.label15.Name = "label15"; + this.label15.Size = new System.Drawing.Size(34, 13); + this.label15.TabIndex = 16; + this.label15.Text = "Wins:"; + // + // networkAutoWins + // + this.networkAutoWins.AutoSize = true; + this.networkAutoWins.Location = new System.Drawing.Point(281, 193); + this.networkAutoWins.Name = "networkAutoWins"; + this.networkAutoWins.Size = new System.Drawing.Size(48, 17); + this.networkAutoWins.TabIndex = 15; + this.networkAutoWins.Text = "Auto"; + this.networkAutoWins.UseVisualStyleBackColor = true; + // + // networkDns + // + this.networkDns.Location = new System.Drawing.Point(9, 152); + this.networkDns.Name = "networkDns"; + this.networkDns.Size = new System.Drawing.Size(266, 20); + this.networkDns.TabIndex = 14; + // + // label14 + // + this.label14.AutoSize = true; + this.label14.Location = new System.Drawing.Point(6, 136); + this.label14.Name = "label14"; + this.label14.Size = new System.Drawing.Size(33, 13); + this.label14.TabIndex = 13; + this.label14.Text = "DNS:"; + // + // networkAutoDns + // + this.networkAutoDns.AutoSize = true; + this.networkAutoDns.Location = new System.Drawing.Point(281, 154); + this.networkAutoDns.Name = "networkAutoDns"; + this.networkAutoDns.Size = new System.Drawing.Size(48, 17); + this.networkAutoDns.TabIndex = 12; + this.networkAutoDns.Text = "Auto"; + this.networkAutoDns.UseVisualStyleBackColor = true; + // + // networkGateway + // + this.networkGateway.Location = new System.Drawing.Point(9, 113); + this.networkGateway.Name = "networkGateway"; + this.networkGateway.Size = new System.Drawing.Size(266, 20); + this.networkGateway.TabIndex = 11; + // + // label13 + // + this.label13.AutoSize = true; + this.label13.Location = new System.Drawing.Point(6, 97); + this.label13.Name = "label13"; + this.label13.Size = new System.Drawing.Size(52, 13); + this.label13.TabIndex = 10; + this.label13.Text = "Gateway:"; + // + // networkSubnet + // + this.networkSubnet.Location = new System.Drawing.Point(145, 74); + this.networkSubnet.Name = "networkSubnet"; + this.networkSubnet.Size = new System.Drawing.Size(130, 20); + this.networkSubnet.TabIndex = 8; + // + // label12 + // + this.label12.AutoSize = true; + this.label12.Location = new System.Drawing.Point(142, 58); + this.label12.Name = "label12"; + this.label12.Size = new System.Drawing.Size(44, 13); + this.label12.TabIndex = 7; + this.label12.Text = "Subnet:"; + // + // networkIp + // + this.networkIp.Location = new System.Drawing.Point(9, 74); + this.networkIp.Name = "networkIp"; + this.networkIp.Size = new System.Drawing.Size(130, 20); + this.networkIp.TabIndex = 5; + // + // label11 + // + this.label11.AutoSize = true; + this.label11.Location = new System.Drawing.Point(6, 58); + this.label11.Name = "label11"; + this.label11.Size = new System.Drawing.Size(20, 13); + this.label11.TabIndex = 4; + this.label11.Text = "IP:"; + // + // networkName + // + this.networkName.Location = new System.Drawing.Point(9, 35); + this.networkName.Name = "networkName"; + this.networkName.Size = new System.Drawing.Size(266, 20); + this.networkName.TabIndex = 3; + // + // label10 + // + this.label10.AutoSize = true; + this.label10.Location = new System.Drawing.Point(6, 19); + this.label10.Name = "label10"; + this.label10.Size = new System.Drawing.Size(38, 13); + this.label10.TabIndex = 2; + this.label10.Text = "Name:"; + // + // networkButtonSave + // + this.networkButtonSave.Image = global::NetMonitorTray.Properties.Resources.save; + this.networkButtonSave.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.networkButtonSave.Location = new System.Drawing.Point(301, 251); + this.networkButtonSave.Name = "networkButtonSave"; + this.networkButtonSave.Size = new System.Drawing.Size(81, 23); + this.networkButtonSave.TabIndex = 1; + this.networkButtonSave.Text = "Speichern"; + this.networkButtonSave.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + this.networkButtonSave.UseVisualStyleBackColor = true; + // + // networkAutoIp + // + this.networkAutoIp.AutoSize = true; + this.networkAutoIp.Location = new System.Drawing.Point(281, 76); + this.networkAutoIp.Name = "networkAutoIp"; + this.networkAutoIp.Size = new System.Drawing.Size(48, 17); + this.networkAutoIp.TabIndex = 0; + this.networkAutoIp.Text = "Auto"; + this.networkAutoIp.UseVisualStyleBackColor = true; + // + // groupBox1 + // + this.groupBox1.Controls.Add(this.networksList); + this.groupBox1.Controls.Add(this.networksAddButton); + this.groupBox1.Location = new System.Drawing.Point(6, 6); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(177, 283); + this.groupBox1.TabIndex = 2; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "Alle Netzwerke"; + // + // networksList + // + this.networksList.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { this.columnHeader1, this.columnHeader2}); - this.listView1.FullRowSelect = true; - this.listView1.GridLines = true; - this.listView1.HideSelection = false; - this.listView1.Location = new System.Drawing.Point(7, 19); - this.listView1.MultiSelect = false; - this.listView1.Name = "listView1"; - this.listView1.ShowGroups = false; - this.listView1.Size = new System.Drawing.Size(164, 226); - this.listView1.TabIndex = 2; - this.listView1.UseCompatibleStateImageBehavior = false; - this.listView1.View = System.Windows.Forms.View.Details; - // - // columnHeader1 - // - this.columnHeader1.Text = "ID"; - // - // columnHeader2 - // - this.columnHeader2.Text = "Label"; - this.columnHeader2.Width = 100; - // - // buttonNetworkAdd - // - this.buttonNetworkAdd.Location = new System.Drawing.Point(7, 251); - this.buttonNetworkAdd.Name = "buttonNetworkAdd"; - this.buttonNetworkAdd.Size = new System.Drawing.Size(164, 23); - this.buttonNetworkAdd.TabIndex = 1; - this.buttonNetworkAdd.Text = "Netzwerk Hinzufügen"; - this.buttonNetworkAdd.UseVisualStyleBackColor = true; - // - // openvpn - // - this.openvpn.Location = new System.Drawing.Point(4, 22); - this.openvpn.Name = "openvpn"; - this.openvpn.Padding = new System.Windows.Forms.Padding(3); - this.openvpn.Size = new System.Drawing.Size(583, 295); - this.openvpn.TabIndex = 1; - this.openvpn.Text = "OpenVPN"; - this.openvpn.UseVisualStyleBackColor = true; - // - // global - // - this.global.Location = new System.Drawing.Point(4, 22); - this.global.Name = "global"; - this.global.Size = new System.Drawing.Size(583, 295); - this.global.TabIndex = 2; - this.global.Text = "Einstellungen"; - this.global.UseVisualStyleBackColor = true; - // - // label1 - // - this.label1.AutoSize = true; - this.label1.Location = new System.Drawing.Point(609, 12); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(35, 13); - this.label1.TabIndex = 2; - this.label1.Text = "label1"; - // - // logBox - // - this.logBox.Location = new System.Drawing.Point(609, 34); - this.logBox.Multiline = true; - this.logBox.Name = "logBox"; - this.logBox.Size = new System.Drawing.Size(163, 295); - this.logBox.TabIndex = 3; - // - // ViewWindowForm - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(780, 358); - this.Controls.Add(this.logBox); - this.Controls.Add(this.label1); - this.Controls.Add(this.tabControl1); - this.Controls.Add(this.statusStrip1); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; - this.MaximizeBox = false; - this.Name = "ViewWindowForm"; - this.Text = "NetMonitorTray"; - this.tabControl1.ResumeLayout(false); - this.networks.ResumeLayout(false); - this.groupBox1.ResumeLayout(false); - this.ResumeLayout(false); - this.PerformLayout(); + this.networksList.FullRowSelect = true; + this.networksList.GridLines = true; + this.networksList.HideSelection = false; + this.networksList.Location = new System.Drawing.Point(7, 19); + this.networksList.MultiSelect = false; + this.networksList.Name = "networksList"; + this.networksList.ShowGroups = false; + this.networksList.Size = new System.Drawing.Size(164, 226); + this.networksList.TabIndex = 2; + this.networksList.UseCompatibleStateImageBehavior = false; + this.networksList.View = System.Windows.Forms.View.Details; + // + // columnHeader1 + // + this.columnHeader1.Text = "ID"; + // + // columnHeader2 + // + this.columnHeader2.Text = "Label"; + this.columnHeader2.Width = 100; + // + // networksAddButton + // + this.networksAddButton.Image = global::NetMonitorTray.Properties.Resources.add; + this.networksAddButton.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.networksAddButton.Location = new System.Drawing.Point(7, 251); + this.networksAddButton.Name = "networksAddButton"; + this.networksAddButton.Size = new System.Drawing.Size(164, 23); + this.networksAddButton.TabIndex = 1; + this.networksAddButton.Text = "Netzwerk Hinzufügen"; + this.networksAddButton.UseVisualStyleBackColor = true; + // + // openvpn + // + this.openvpn.Controls.Add(this.groupBox4); + this.openvpn.Controls.Add(this.groupBox3); + this.openvpn.Location = new System.Drawing.Point(4, 22); + this.openvpn.Name = "openvpn"; + this.openvpn.Padding = new System.Windows.Forms.Padding(3); + this.openvpn.Size = new System.Drawing.Size(583, 295); + this.openvpn.TabIndex = 1; + this.openvpn.Text = "OpenVPN"; + this.openvpn.UseVisualStyleBackColor = true; + // + // groupBox4 + // + this.groupBox4.Controls.Add(this.openvpnList); + this.groupBox4.Controls.Add(this.openvpnButtonAdd); + this.groupBox4.Location = new System.Drawing.Point(6, 6); + this.groupBox4.Name = "groupBox4"; + this.groupBox4.Size = new System.Drawing.Size(177, 283); + this.groupBox4.TabIndex = 5; + this.groupBox4.TabStop = false; + this.groupBox4.Text = "Alle Vpn Netze"; + // + // openvpnList + // + this.openvpnList.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.columnHeader3, + this.columnHeader4}); + this.openvpnList.FullRowSelect = true; + this.openvpnList.GridLines = true; + this.openvpnList.HideSelection = false; + this.openvpnList.Location = new System.Drawing.Point(7, 19); + this.openvpnList.MultiSelect = false; + this.openvpnList.Name = "openvpnList"; + this.openvpnList.ShowGroups = false; + this.openvpnList.Size = new System.Drawing.Size(164, 226); + this.openvpnList.TabIndex = 2; + this.openvpnList.UseCompatibleStateImageBehavior = false; + this.openvpnList.View = System.Windows.Forms.View.Details; + // + // columnHeader3 + // + this.columnHeader3.Text = "ID"; + // + // columnHeader4 + // + this.columnHeader4.Text = "Label"; + this.columnHeader4.Width = 100; + // + // openvpnButtonAdd + // + this.openvpnButtonAdd.Image = global::NetMonitorTray.Properties.Resources.add; + this.openvpnButtonAdd.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.openvpnButtonAdd.Location = new System.Drawing.Point(7, 251); + this.openvpnButtonAdd.Name = "openvpnButtonAdd"; + this.openvpnButtonAdd.Size = new System.Drawing.Size(164, 23); + this.openvpnButtonAdd.TabIndex = 1; + this.openvpnButtonAdd.Text = "OpenVPN Hinzufügen"; + this.openvpnButtonAdd.UseVisualStyleBackColor = true; + // + // groupBox3 + // + this.groupBox3.Controls.Add(this.openvpnButtonSave); + this.groupBox3.Controls.Add(this.openvpnButtonDelete); + this.groupBox3.Controls.Add(this.openvpnConfig); + this.groupBox3.Controls.Add(this.label7); + this.groupBox3.Controls.Add(this.openvpnButtonConfigfile); + this.groupBox3.Controls.Add(this.openvpnName); + this.groupBox3.Controls.Add(this.label6); + this.groupBox3.Location = new System.Drawing.Point(189, 6); + this.groupBox3.Name = "groupBox3"; + this.groupBox3.Size = new System.Drawing.Size(388, 283); + this.groupBox3.TabIndex = 4; + this.groupBox3.TabStop = false; + this.groupBox3.Text = "Eigenschaften"; + // + // openvpnButtonSave + // + this.openvpnButtonSave.Image = global::NetMonitorTray.Properties.Resources.save; + this.openvpnButtonSave.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.openvpnButtonSave.Location = new System.Drawing.Point(303, 251); + this.openvpnButtonSave.Name = "openvpnButtonSave"; + this.openvpnButtonSave.Size = new System.Drawing.Size(79, 23); + this.openvpnButtonSave.TabIndex = 6; + this.openvpnButtonSave.Text = "Speichern"; + this.openvpnButtonSave.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + this.openvpnButtonSave.UseVisualStyleBackColor = true; + // + // openvpnButtonDelete + // + this.openvpnButtonDelete.Image = global::NetMonitorTray.Properties.Resources.delete; + this.openvpnButtonDelete.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.openvpnButtonDelete.Location = new System.Drawing.Point(222, 251); + this.openvpnButtonDelete.Name = "openvpnButtonDelete"; + this.openvpnButtonDelete.Size = new System.Drawing.Size(75, 23); + this.openvpnButtonDelete.TabIndex = 5; + this.openvpnButtonDelete.Text = "Löschen"; + this.openvpnButtonDelete.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + this.openvpnButtonDelete.UseVisualStyleBackColor = true; + // + // openvpnConfig + // + this.openvpnConfig.Location = new System.Drawing.Point(9, 71); + this.openvpnConfig.Name = "openvpnConfig"; + this.openvpnConfig.ReadOnly = true; + this.openvpnConfig.Size = new System.Drawing.Size(248, 20); + this.openvpnConfig.TabIndex = 4; + // + // label7 + // + this.label7.AutoSize = true; + this.label7.Location = new System.Drawing.Point(6, 55); + this.label7.Name = "label7"; + this.label7.Size = new System.Drawing.Size(60, 13); + this.label7.TabIndex = 3; + this.label7.Text = "Configdatei"; + // + // openvpnButtonConfigfile + // + this.openvpnButtonConfigfile.Image = global::NetMonitorTray.Properties.Resources.file; + this.openvpnButtonConfigfile.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.openvpnButtonConfigfile.Location = new System.Drawing.Point(263, 69); + this.openvpnButtonConfigfile.Name = "openvpnButtonConfigfile"; + this.openvpnButtonConfigfile.Size = new System.Drawing.Size(92, 23); + this.openvpnButtonConfigfile.TabIndex = 2; + this.openvpnButtonConfigfile.Text = "Datei öffnen"; + this.openvpnButtonConfigfile.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + this.openvpnButtonConfigfile.UseVisualStyleBackColor = true; + // + // openvpnName + // + this.openvpnName.Location = new System.Drawing.Point(9, 32); + this.openvpnName.Name = "openvpnName"; + this.openvpnName.Size = new System.Drawing.Size(248, 20); + this.openvpnName.TabIndex = 1; + // + // label6 + // + this.label6.AutoSize = true; + this.label6.Location = new System.Drawing.Point(6, 16); + this.label6.Name = "label6"; + this.label6.Size = new System.Drawing.Size(35, 13); + this.label6.TabIndex = 0; + this.label6.Text = "Name"; + // + // global + // + this.global.Controls.Add(this.groupBox8); + this.global.Controls.Add(this.groupBox6); + this.global.Controls.Add(this.groupBox5); + this.global.Location = new System.Drawing.Point(4, 22); + this.global.Name = "global"; + this.global.Size = new System.Drawing.Size(583, 295); + this.global.TabIndex = 2; + this.global.Text = "Einstellungen"; + this.global.UseVisualStyleBackColor = true; + // + // groupBox8 + // + this.groupBox8.Controls.Add(this.label8); + this.groupBox8.Controls.Add(this.settingsLogLevel); + this.groupBox8.Controls.Add(this.settingsButtonSave); + this.groupBox8.Controls.Add(this.settingsFolderPickerLog); + this.groupBox8.Controls.Add(this.settingsLogFolder); + this.groupBox8.Controls.Add(this.label9); + this.groupBox8.Location = new System.Drawing.Point(3, 80); + this.groupBox8.Name = "groupBox8"; + this.groupBox8.Size = new System.Drawing.Size(577, 99); + this.groupBox8.TabIndex = 2; + this.groupBox8.TabStop = false; + this.groupBox8.Text = "Allgemein"; + // + // label8 + // + this.label8.AutoSize = true; + this.label8.Location = new System.Drawing.Point(6, 55); + this.label8.Name = "label8"; + this.label8.Size = new System.Drawing.Size(125, 13); + this.label8.TabIndex = 5; + this.label8.Text = "Server-Log Einstellungen"; + // + // settingsLogLevel + // + this.settingsLogLevel.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.settingsLogLevel.FormattingEnabled = true; + this.settingsLogLevel.Location = new System.Drawing.Point(9, 71); + this.settingsLogLevel.Name = "settingsLogLevel"; + this.settingsLogLevel.Size = new System.Drawing.Size(121, 21); + this.settingsLogLevel.TabIndex = 4; + // + // settingsButtonSave + // + this.settingsButtonSave.Image = global::NetMonitorTray.Properties.Resources.save; + this.settingsButtonSave.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.settingsButtonSave.Location = new System.Drawing.Point(489, 69); + this.settingsButtonSave.Name = "settingsButtonSave"; + this.settingsButtonSave.Size = new System.Drawing.Size(82, 23); + this.settingsButtonSave.TabIndex = 3; + this.settingsButtonSave.Text = "Speichern"; + this.settingsButtonSave.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + this.settingsButtonSave.UseVisualStyleBackColor = true; + // + // settingsFolderPickerLog + // + this.settingsFolderPickerLog.Image = global::NetMonitorTray.Properties.Resources.folder; + this.settingsFolderPickerLog.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.settingsFolderPickerLog.Location = new System.Drawing.Point(289, 30); + this.settingsFolderPickerLog.Name = "settingsFolderPickerLog"; + this.settingsFolderPickerLog.Size = new System.Drawing.Size(66, 23); + this.settingsFolderPickerLog.TabIndex = 3; + this.settingsFolderPickerLog.Text = "Ändern"; + this.settingsFolderPickerLog.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + this.settingsFolderPickerLog.UseVisualStyleBackColor = true; + // + // settingsLogFolder + // + this.settingsLogFolder.Location = new System.Drawing.Point(9, 32); + this.settingsLogFolder.Name = "settingsLogFolder"; + this.settingsLogFolder.ReadOnly = true; + this.settingsLogFolder.Size = new System.Drawing.Size(274, 20); + this.settingsLogFolder.TabIndex = 2; + // + // label9 + // + this.label9.AutoSize = true; + this.label9.Location = new System.Drawing.Point(6, 16); + this.label9.Name = "label9"; + this.label9.Size = new System.Drawing.Size(85, 13); + this.label9.TabIndex = 1; + this.label9.Text = "Log Verzeichnis:"; + // + // groupBox6 + // + this.groupBox6.Controls.Add(this.settingsFolderpickerVpn); + this.groupBox6.Controls.Add(this.settingsVpnFolder); + this.groupBox6.Controls.Add(this.label5); + this.groupBox6.Location = new System.Drawing.Point(209, 3); + this.groupBox6.Name = "groupBox6"; + this.groupBox6.Size = new System.Drawing.Size(371, 77); + this.groupBox6.TabIndex = 1; + this.groupBox6.TabStop = false; + this.groupBox6.Text = "VPN"; + // + // settingsFolderpickerVpn + // + this.settingsFolderpickerVpn.Image = global::NetMonitorTray.Properties.Resources.folder; + this.settingsFolderpickerVpn.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.settingsFolderpickerVpn.Location = new System.Drawing.Point(290, 44); + this.settingsFolderpickerVpn.Name = "settingsFolderpickerVpn"; + this.settingsFolderpickerVpn.Size = new System.Drawing.Size(66, 23); + this.settingsFolderpickerVpn.TabIndex = 2; + this.settingsFolderpickerVpn.Text = "Ändern"; + this.settingsFolderpickerVpn.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + this.settingsFolderpickerVpn.UseVisualStyleBackColor = true; + // + // settingsVpnFolder + // + this.settingsVpnFolder.Location = new System.Drawing.Point(10, 46); + this.settingsVpnFolder.Name = "settingsVpnFolder"; + this.settingsVpnFolder.ReadOnly = true; + this.settingsVpnFolder.Size = new System.Drawing.Size(274, 20); + this.settingsVpnFolder.TabIndex = 1; + // + // label5 + // + this.label5.AutoSize = true; + this.label5.Location = new System.Drawing.Point(7, 23); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(148, 13); + this.label5.TabIndex = 0; + this.label5.Text = "OpenVpn Installations Ordner:"; + // + // groupBox5 + // + this.groupBox5.Controls.Add(this.label4); + this.groupBox5.Controls.Add(this.settingsClientPortTo); + this.groupBox5.Controls.Add(this.settingsClientPortFrom); + this.groupBox5.Controls.Add(this.settingsServerPort); + this.groupBox5.Controls.Add(this.label3); + this.groupBox5.Controls.Add(this.label2); + this.groupBox5.Location = new System.Drawing.Point(3, 3); + this.groupBox5.Name = "groupBox5"; + this.groupBox5.Size = new System.Drawing.Size(200, 77); + this.groupBox5.TabIndex = 0; + this.groupBox5.TabStop = false; + this.groupBox5.Text = "UDP Ports"; + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Location = new System.Drawing.Point(121, 49); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(10, 13); + this.label4.TabIndex = 5; + this.label4.Text = "-"; + // + // settingsClientPortTo + // + this.settingsClientPortTo.Location = new System.Drawing.Point(137, 46); + this.settingsClientPortTo.Name = "settingsClientPortTo"; + this.settingsClientPortTo.Size = new System.Drawing.Size(40, 20); + this.settingsClientPortTo.TabIndex = 4; + // + // settingsClientPortFrom + // + this.settingsClientPortFrom.Location = new System.Drawing.Point(77, 46); + this.settingsClientPortFrom.Name = "settingsClientPortFrom"; + this.settingsClientPortFrom.Size = new System.Drawing.Size(38, 20); + this.settingsClientPortFrom.TabIndex = 3; + // + // settingsServerPort + // + this.settingsServerPort.Location = new System.Drawing.Point(77, 20); + this.settingsServerPort.Name = "settingsServerPort"; + this.settingsServerPort.Size = new System.Drawing.Size(100, 20); + this.settingsServerPort.TabIndex = 2; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(6, 49); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(63, 13); + this.label3.TabIndex = 1; + this.label3.Text = "Client Ports:"; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(6, 23); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(63, 13); + this.label2.TabIndex = 0; + this.label2.Text = "Server Port:"; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(609, 12); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(59, 13); + this.label1.TabIndex = 2; + this.label1.Text = "Server-Log"; + // + // logBox + // + this.logBox.Location = new System.Drawing.Point(609, 34); + this.logBox.Multiline = true; + this.logBox.Name = "logBox"; + this.logBox.Size = new System.Drawing.Size(163, 295); + this.logBox.TabIndex = 3; + // + // openFileDialog1 + // + this.openFileDialog1.FileName = "openFileDialog1"; + // + // ViewWindowForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(780, 358); + this.Controls.Add(this.logBox); + this.Controls.Add(this.label1); + this.Controls.Add(this.tabControl1); + this.Controls.Add(this.statusStrip1); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; + this.MaximizeBox = false; + this.Name = "ViewWindowForm"; + this.Text = "NetMonitorTray"; + this.tabControl1.ResumeLayout(false); + this.networks.ResumeLayout(false); + this.groupBox2.ResumeLayout(false); + this.groupBox2.PerformLayout(); + this.groupBox1.ResumeLayout(false); + this.openvpn.ResumeLayout(false); + this.groupBox4.ResumeLayout(false); + this.groupBox3.ResumeLayout(false); + this.groupBox3.PerformLayout(); + this.global.ResumeLayout(false); + this.groupBox8.ResumeLayout(false); + this.groupBox8.PerformLayout(); + this.groupBox6.ResumeLayout(false); + this.groupBox6.PerformLayout(); + this.groupBox5.ResumeLayout(false); + this.groupBox5.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); } @@ -200,10 +782,62 @@ private System.Windows.Forms.TextBox logBox; private System.Windows.Forms.GroupBox groupBox2; private System.Windows.Forms.GroupBox groupBox1; - private System.Windows.Forms.Button buttonNetworkAdd; + private System.Windows.Forms.Button networksAddButton; private System.Windows.Forms.TabPage global; - private System.Windows.Forms.ListView listView1; + private System.Windows.Forms.ListView networksList; private System.Windows.Forms.ColumnHeader columnHeader1; private System.Windows.Forms.ColumnHeader columnHeader2; + private System.Windows.Forms.GroupBox groupBox4; + private System.Windows.Forms.ListView openvpnList; + private System.Windows.Forms.ColumnHeader columnHeader3; + private System.Windows.Forms.ColumnHeader columnHeader4; + private System.Windows.Forms.Button openvpnButtonAdd; + private System.Windows.Forms.GroupBox groupBox3; + private System.Windows.Forms.GroupBox groupBox5; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.GroupBox groupBox6; + private System.Windows.Forms.Button settingsFolderpickerVpn; + private System.Windows.Forms.TextBox settingsVpnFolder; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.TextBox settingsClientPortTo; + private System.Windows.Forms.TextBox settingsClientPortFrom; + private System.Windows.Forms.TextBox settingsServerPort; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.FolderBrowserDialog folderBrowserDialog1; + private System.Windows.Forms.Button networkButtonDelete; + private System.Windows.Forms.ComboBox networkAdapter; + private System.Windows.Forms.Label label16; + private System.Windows.Forms.TextBox networkWins; + private System.Windows.Forms.Label label15; + private System.Windows.Forms.CheckBox networkAutoWins; + private System.Windows.Forms.TextBox networkDns; + private System.Windows.Forms.Label label14; + private System.Windows.Forms.CheckBox networkAutoDns; + private System.Windows.Forms.TextBox networkGateway; + private System.Windows.Forms.Label label13; + private System.Windows.Forms.TextBox networkSubnet; + private System.Windows.Forms.Label label12; + private System.Windows.Forms.TextBox networkIp; + private System.Windows.Forms.Label label11; + private System.Windows.Forms.TextBox networkName; + private System.Windows.Forms.Label label10; + private System.Windows.Forms.Button networkButtonSave; + private System.Windows.Forms.CheckBox networkAutoIp; + private System.Windows.Forms.GroupBox groupBox8; + private System.Windows.Forms.Label label8; + private System.Windows.Forms.ComboBox settingsLogLevel; + private System.Windows.Forms.Button settingsButtonSave; + private System.Windows.Forms.Button settingsFolderPickerLog; + private System.Windows.Forms.TextBox settingsLogFolder; + private System.Windows.Forms.Label label9; + private System.Windows.Forms.Button openvpnButtonSave; + private System.Windows.Forms.Button openvpnButtonDelete; + private System.Windows.Forms.TextBox openvpnConfig; + private System.Windows.Forms.Label label7; + private System.Windows.Forms.Button openvpnButtonConfigfile; + private System.Windows.Forms.TextBox openvpnName; + private System.Windows.Forms.Label label6; + private System.Windows.Forms.OpenFileDialog openFileDialog1; } } \ No newline at end of file diff --git a/NetMonitorTray/Views/ViewWindowForm.cs b/NetMonitorTray/Views/ViewWindowForm.cs index 1933c5a..1c99e67 100644 --- a/NetMonitorTray/Views/ViewWindowForm.cs +++ b/NetMonitorTray/Views/ViewWindowForm.cs @@ -7,38 +7,181 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; +using BlubbFish.Utils; -namespace NetMonitorTray.View -{ - public partial class ViewWindowForm : Form - { - private Models.Window model; - public ViewWindowForm() - { - InitializeComponent(); - this.FormClosed += Controller.Window.FormClosed; - listView1.ItemActivate += Controller.Window.NetworkSelected; - } +namespace NetMonitorTray.View { + public partial class ViewWindowForm : Form { + private Models.Window model; + private int clickedNetwork = 0; + private int clickedVpn = 0; - public void UpdateForm() - { - this.BeginInvoke((Action)(() => - { - this.logBox.Text = "Loaded"; - List networks = this.model.Networks; - foreach(string network in networks) { - ListViewItem item = new ListViewItem(); - item.Text = network; - item.SubItems.Add(this.model.getNetworkProperty(network, "Name")); - listView1.Items.Add(item); - } - - })); - } + public ViewWindowForm() { + this.InitializeComponent(); + this.FormClosed += Controller.Window.FormClosed; - public void SetModel(Models.Window window) - { - this.model = window; - } + this.networksList.ItemActivate += Controller.Window.NetworkAktivate; + this.openvpnList.ItemActivate += Controller.Window.VpnAktivate; + this.networksList.Click += Controller.Window.NetworkSelected; + this.openvpnList.Click += Controller.Window.VpnSelected; + + this.settingsFolderpickerVpn.Click += new System.EventHandler(Controller.Window.ChangeOpenVpnFolder); + this.openvpnButtonConfigfile.Click += new System.EventHandler(Controller.Window.ChangeOpenVpnConfigFile); + this.settingsFolderPickerLog.Click += new System.EventHandler(Controller.Window.ChangeLogFolder); } + + public void UpdateForm() { + this.BeginInvoke((Action)(() => { + updateLog(); + updateNetworks(); + updateVpn(); + updateSettings(); + })); + } + + private void updateLog() { + this.logBox.Text = "TODO: Read Log File"; + } + + private void updateVpn() { + List vpns = this.model.Vpns; + foreach(string vpn in vpns) { + ListViewItem item = new ListViewItem(); + item.Text = vpn; + item.SubItems.Add(this.model.getVpnProperty(vpn, "Name")); + openvpnList.Items.Add(item); + } + showSelectedOpenvpn(clickedVpn); + } + + public void showSelectedOpenvpn(int i) { + List vpns = this.model.Vpns; + if(vpns.Count == 0) { + return; + } + if(vpns.Count <= i) { + i = 0; + } + for(int j = 0; j < this.openvpnList.Items.Count; j++) { + if(j == i) { + this.openvpnList.Items[j].Selected = true; + } else { + this.openvpnList.Items[j].Selected = false; + } + string n = vpns[i]; + string v = this.model.getVpnProperty(n, "Name"); + this.openvpnName.Text = v; + v = this.model.getVpnProperty(n, "Config"); + this.openvpnConfig.Text = v; + } + } + + private void updateNetworks() { + List networks = this.model.Networks; + foreach(string network in networks) { + ListViewItem item = new ListViewItem(); + item.Text = network; + item.SubItems.Add(this.model.getNetworkProperty(network, "Name")); + networksList.Items.Add(item); + } + List adapters = this.model.getNetworkAdapters(); + this.networkAdapter.Items.AddRange(adapters.ToArray()); + showSelectedNetwork(clickedNetwork); + } + + public void showSelectedNetwork(int i) { + List networks = this.model.Networks; + if(networks.Count == 0) { + return; + } + if(networks.Count <= i) { + i = 0; + } + for(int j=0; j 17, 17 + + 133, 17 + + + 302, 17 + \ No newline at end of file diff --git a/NetMonitorUtils/NetworkSetter.cs b/NetMonitorUtils/NetworkSetter.cs index ccd2b60..cd1f386 100644 --- a/NetMonitorUtils/NetworkSetter.cs +++ b/NetMonitorUtils/NetworkSetter.cs @@ -248,5 +248,9 @@ namespace NetMonitorUtils } return ret; } + + public List getAdapters() { + return this.serviceController.NetworkGetAdapters(); + } } } diff --git a/NetMonitorUtils/OpenVpnSetter.cs b/NetMonitorUtils/OpenVpnSetter.cs index adfa768..97703f7 100644 --- a/NetMonitorUtils/OpenVpnSetter.cs +++ b/NetMonitorUtils/OpenVpnSetter.cs @@ -37,10 +37,10 @@ namespace NetMonitorUtils { String data = this.serviceController.VpnGetStatus(vpn); if(data == "unknown") { ret.Add(vpn, "unknown"); - } else if(data == "disconnected") { - ret.Add(vpn, "disconnected"); + } else if(data.StartsWith("[connected")) { + ret.Add(vpn, "connected"); } else { - + ret.Add(vpn, "disconnected"); } } return ret; diff --git a/NetMonitorUtils/ServiceControl.cs b/NetMonitorUtils/ServiceControl.cs index b0f03b0..9f26e23 100644 --- a/NetMonitorUtils/ServiceControl.cs +++ b/NetMonitorUtils/ServiceControl.cs @@ -236,5 +236,17 @@ namespace NetMonitorUtils { } return this.sendMessage("OPENVPN", "STOP " + name); } + + internal List NetworkGetAdapters() { + String adapters = ""; + try { + this.sendMessage("NET", "ADAPTERS"); + } catch(ServiceControlException e) { + if(e.Message.ToLower().Substring(0, 1) == "[") { + adapters = e.Message.Substring(0, e.Message.Length - 1).Substring(1); + } + } + return adapters.Split('|').ToList(); + } } } diff --git a/NetMonitorUtils/config.ini b/NetMonitorUtils/config.ini index d54f62d..4c594c2 100644 --- a/NetMonitorUtils/config.ini +++ b/NetMonitorUtils/config.ini @@ -4,4 +4,6 @@ client_from=54330 client_to=54340 [program] -openvpn=C:\Program Files\OpenVPN \ No newline at end of file +openvpn=C:\Program Files\OpenVPN +logfolder=E:\Programme\NetMonitor\logs +loglevel=Debug \ No newline at end of file diff --git a/NetMonitorUtils/network.ini b/NetMonitorUtils/network.ini index 8487cda..9d90440 100644 --- a/NetMonitorUtils/network.ini +++ b/NetMonitorUtils/network.ini @@ -7,7 +7,7 @@ Adapter=LAN-Verbindung [network2] Name=FHG -Ip=129.26.164.188 +Ip=129.26.164.222 Subnet=255.255.248.0 Gateway=129.26.160.1 Dns=129.26.165.177 @@ -19,8 +19,8 @@ Name=Test Ip=10.15.20.25 Subnet=255.255.255.0 Gateway=0.0.0.0 -Dns=none -Wins=none +Dns=0.0.0.0 +Wins=0.0.0.0 Adapter=LAN-Verbindung [network4] diff --git a/NetOpenVPNGUI/NetOpenVPNGUI.csproj b/NetOpenVPNGUI/NetOpenVPNGUI.csproj index 4aab4dc..35c4853 100644 --- a/NetOpenVPNGUI/NetOpenVPNGUI.csproj +++ b/NetOpenVPNGUI/NetOpenVPNGUI.csproj @@ -28,7 +28,7 @@ x86 pdbonly true - E:\Programme\NetMonitor\ + ..\bin\Release\ TRACE prompt 4 diff --git a/bin/Debug/NetMonitorClient.exe b/bin/Debug/NetMonitorClient.exe index 10d891464f03200dff35626f9443db128d8fffb1..0ab09cda80f2a3af325642942d53dbcb61224ce7 100644 GIT binary patch delta 68 zcmZoz!ql*YX+j6Hbk)y|-8UNq*lt}7V3NP#&|Wh6n%on`)0;~gQ&>T=lW(_43V6G` YcHCqo;;^huf7(;oeW{yS+W&9?023@8KL7v# delta 68 zcmZoz!ql*YX+j6{!iMh~yKgoKBxpEHpV2Do&=@yad8+*04Vz0EQ&>T=lW(_43S=4U X^QMLUai67`ly+qMW7o|r?SHrc5G5W* diff --git a/bin/Debug/NetMonitorConsole.exe b/bin/Debug/NetMonitorConsole.exe index 6877a29ddf423d6ed8abca2eba1218fa7aa3b638..63e2eb762e82e2f3a73cedf46ea49f18b465b228 100644 GIT binary patch delta 68 zcmZoz!q~8caY6^PY}L<=-K9DL@nN&q*=?Tazt?tisEFksfz1NCGRz>^$@&J80^CUx X&pZ?f@>(pjPV2l|!u`z=1}hW+ssI}l delta 68 zcmZoz!q~8caY6_4!iMh~yGwNhwrtAqwh7th*RqbmiQh!y+hze>8D@~|WPJlkfu6$` X*IEC$@4V$u@D&%HOxDd21}hW+-LxFI diff --git a/bin/Debug/NetMonitorServer.exe b/bin/Debug/NetMonitorServer.exe index 30973116fe02273b6a92108d8b78eb78102cfd7d..d93d0ad8a12c07dbd46fbb4f31eb37fcb3340855 100644 GIT binary patch literal 36352 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 SKj>ine*<3rhlOL7!2buzad%?? delta 10073 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 M>~nt1$UU2NE}Veg_~ zuOMPqRIFIBcinI1q>x0s?Y+>P(Xnja_#}2h z65FeP2s@EGGS*sEmDNeWI;amt^_7vO)|q|_6-v8LF=UiwlqsqSkPdwGu7V6ju_4Wd zCu)aj248PTQB1tyClbm5#}9*woJLXV^#3hSL6%QK%>=$7mmtIm5Cb2S)BeST2Qx(*fD|1> z<*|d!+X2rAkPmD$sFWc6lg0m7aUhE8?)SzkfkUN0Pwimg+7YeSU9KsgjH0qp2v-k?D07ej?m|&)ie*l9afGavjSSTm5YSnJve2T~Rb7-Qjy_Tg zB7#RjV!GrG(ba44%Y(2uv+A1V>_8#;K<^FG;x)_Q zKv5>@i1tVZouH)}l&+wiTx=E>tjgqqpR!aeOf?yt_K;GhG-Wt2idZ~XFgeEvQo6rn zRF$mcC_U&Lpkf0A`P#c`nv7q%z_lH>BS6$0v4$}D1~W(dFen4cK9Eua6`{n2mk-O9te#m{xcBZS92QoX&Ws+s34_fElz^XvdM*Y(^^7 zmq8_1dW9a?G4dMnx<;AHHRQ3;EHN9?MquhKMXRy2m>SHUW~d#L2jiUIeydK9OBCgF zAt$nplR2p9_!(|gHdK>CMrOdsR9D%t23ssbL0guJA}B$jC?>M6Bb z3J-nWE`HuXNe}aFd8hgLb|4h;92;QHjYK0_bYSm?X;siI3VLD63P!A7a*Dp%K=-$fD}vO z*kn>`z%F1S3I7#$U>1KC;CHu*B6_hR?Zn_}_GrbHNdR4s$^4yCcWEmiRHxmGy31A; z^x`^by#l}UXfujBPdJ(I=Q|aOn?bR$T|KC5m;mIsJwOj=ns5rI%)3!3fuKt+G)&GM zsPM_9$F4cf0Rhlv1#B~8Jj_@!EN}!%n2H>LjRF@Kv$#Fs217(e(W(uFW2F$&JoHv8x z0x(R7To|12gc(5=)&UX%d0Z6vc_ljE1@iorQVS~q zPdT)M3>cQ)Pk?(?<)8FdAy!*H7$Wov-S_0*u94IB`_7_Yoc?(KI z-khS`VXlScmfqgt3hWIRy}I4JEjb|+B{Z;>ydvK&8uI*Z;6jOp9N+FR@X_utF!^=|8tg|)13m`Z4-T}kW&a>; zeb9t90<7Flaj?dM5fr41z)J^tihQdvwU}TLreL3COszgH+-LF6A-I!)Mxm$EgUSQe zA->;pU^b<lmD(9#3rkF+>eT4?zrN5r=sjNggC7g#_)z$DxHc#yZ~ zt||ZL!Jx#2nU&s`S+Q^sgrVBdWAc1E!G6uE3XCK#Wh5;*u#23)E{2p>B;PKr>eS*J zLa&h23Ck6EqW)I}E&iQ4;e4$FO#<_Qoxod|EGB2#8VYkd zo>pPs0CzcU&Il;uub9RZFCTp55=@y4P9(s%3uC23!;QtvMQVN>WeZAyzh1yJ1&ojv z-1%K^0n+q;$DZ7OlD_1hq~GyR(l`E-^m=kq z_7ra~?ui<~-|z#gG<1U;Jhbtlodp90R_9poI`r+n;EWUlUIf4#!%T?-lrsv87#VD! z102YiDe(Yt6Zkl6K@o>Tz9cT72R#J%XbE~4Gm^L^pAYn*Bo1pC@&|1tanKZTXpA^c znNNaNz&;6D!GVnkK41fc41!I6zGq8E7+lYp%%UAwmHgdXa)1g4Gt7d}SpkUj`!sdy4~`EqnpNe+QsLg(V8t zCRyqw=m~uzsV9@00_Su)fRK;N{$kLeJf*8HL&5QS4ir%evMuC>&}xyc z{9}Y3Hx*dI0^IiZGF?F#Q>pUNd^F|$(GG%FG@=e-|JFfr{0@Sb9&`uE zNp%q4IiMOgq6gMa0}Ci|V7p+!g*6*S5F-Nz9`1u%`cRh&OKR!E&p<8Shjd$7>qA&A z{?LaOe!q2~s4cB@pj4T#1BIp+6^ohPYDKHvi`IjtgNI6YuOAL6x>$+VAJU>X5$KRf z;6*T6<@C7ew2|lxZ-{6VGBVu6OEDu+3P-z^x|oqDg&_~6laMpzIGKVEUz)DCG%0T! zDpHp(TSSYprDzkxXi>O`7BeDR)IwLFh0y2IMKxP7N>@-5w!JM4!;D13;J7Pln1z{u zTqGUIMbeQ}TKeR_CmmiGv`EK{gmfpmly6pAI#P(FV@4z$Nu{OJ2eS?>Lq$N0=RG;f zT85(Z_~W@7)aBcYR{#q07NOQg==t;n&B(BoB3LI)09z{w4wcdbRxJc|D56oC02T@% z2b$omBms3P0`@udj*yc9ZpO`oo3e$u0yhg1>#z{lPJiG+PYBG}2ywHKGzV^`us_a) zC%kXDa92-Zd~YaKRnn&4(kLhi-vaX)2uwk%Aulgs3RtW7Yre6^#D|KO6=fAs` zwNz$g!0ZN#wv2_09tAI;+kj9+`0d0OdQ*V|?#1P(!zL8G<;HnEWg384x0}|I=&OtrngBUkwV>`TD9&#JX0R0z(&9`hKw+N(Nm_MS9Uw_d!)Zg% zw)S+g2$f{hNm!{_Ssh!F#&nYA(1A|U)&ctoIe;}GNprvjosmLw=-iStrIR#=E_9MM zDjcnWmPY%xB!lQAZ75u?1+5s+LV$ZVfuV4{7Z41jleA_qiUFlX__h%E(Mh`B{OKeu zIG`ojmrl}x`_W0d3j^sS&CH^O*0P1xs)g3Nh1RSE?b^GQh=kGAxG%?sn#Yja$Tjb2M71I_0U2bWM z0Cs-{e4Xfy%@o%j>GZe)h3TH)>qmElK%y8-_lX$X7K}k#Z8={OlJfk-^gzHMWd)RS zSGJI_eNdS$(#jyQE_YQ69d9VI5?BvQ^|-6~rL=y0RdJT%3Um^Kd$bNav<^GA4)<&w zc4{4VZXI@M9q!dSj5BI0&2eoV#+kMiYWLP*oPk@R#@V2cTdGw7Q7 z+zl-mJ#KkR#z=|%R9Yjf!MiS|5d!Q}KxU*Pp%mgqT0*7J+4Z;^`Mfb>$i61c8e!f? zG1dqebv06z;7fy=;(U4X%$BiU7Rn^RZMRj$Ra_QVH=>^RZ9!QB3^))Fa(Tjj5H(~ zL4#^SVRW4_zX=og0L~R)vBlDo5a*2-lY~HP7NZ%o5ejnwDp5l)W5|Y$fTUX^%qtLM zjet={DT~pdsyJWXGOfO-8dMPqqw9!U3<1%o!HLmG z$!MI!P(_e;TuclCt(l9itt^y;v#F>Rm@zbplHiLNuThLI0!DUHwxU6nI8)wRFf`t}W2{5#z&Is~c#TX;NZbfIr+X;E&$|BMkGlo+7BE}05V~c>1wv@gI zwiV~eixJZo*D27~M8XgV^2UfUMxZsvKwPw<;MykA7c+)NS`us#C5MZm~ZN?!!^ zh5FJ}O2qWVm68LlBU+dcXjzyr$F`DbZDGP9-byj)bj@I?g$Y5?o{p|^TuOS&y2Phl z&!3!etroQ&GxXRt>MLOZ#Cg}nbU@&@fsLT9&;oQ7@o|lSXk5343>W4P*cG!exs0!j z7~DY$Hk8~yASLg;m_`V&cfjEIegA+(qMpHwX#YTSQBZ6d2DCDpKpFi)LwtY1)MaFJ zgc@b=HEf14o#1Zf>x!g$+%4jntt}Z{ZbeI`y_7>?Rb4KuZo=;tc%4xP!E(tj-QH5l zUQ0o<9>7gvnkRNy2gm=rjP7)&1p#bD{9 z36k>PYYA+NfaK8xkv|+wut-mMG@)577gLpAx|(k^T0g!&cY<0%RmI>gQm~XiBPDOE znEep=gFj=DXtu?S$e(F0)nZE0%1HThXQ)B@vnibr`ZJP>{F$E-_%mii{)`!Ef94Yi z{24R6dtxo&mkRtDGk@@BEE4%MzmmY8F(dM4RA0iMu^AHnj6jP&qv0j|8G#mm##}4@ zj4S1K&i!_`K1DXroEN#B>kb5&`HGLpw{8w*5LuI!y&E1p{>IM zrQlZ1YN#O36@PLbAZRFDj_4}lOCnuGbX3EfXmP?`kT^sl(4rXT*mrSC{*F^J{VGK80tt(F6T}pw zYf2v?5fqJIx{CN2lCC0B409sI&<|kK<0ByxLEcI+nFxr!Qo;=T3+O4e%S2q%Pv}UZ zJpg75jT|IoAjUf+CIbN@7pWZ(f}&j&UF9rR5lrpqmK=Mrbp?SIt749gzXvetBOw}b zUZa?3y4ooC3rZ-q&})?s`* zE>3M=6eQ6js0J@XtkDRt-5KD8F%o+%#6|vv8PT*xvzQ~+d~Bx34KO1;m=NQw5fh4l zQI?b&ASjw7=qfwJgrLzxZ<8=1dYgoq-{uGec@M=z(p2eE?~xD`%?W6KiP;%}mf?yy z_OsuIE8;wP<(8pCR~sNTToDw_6m%8wshO@KngKB<8m`#=9C+U)+MFWLq7~-Y9Z{nm4c%AdN|=$JQ4r%5ipfC0XrPoU@!2fl?^Nk3%f#Ac0aXMuiX|ombA%Xd)jDh~ z1+(j5nK6*CJ2K%_is^>{8>149`bms0#6=S+W<=wQW>F`mFDfbF0tmFY0Or`nD8W)f z6~uWr#Z;lINxJ}oBJGt zccGC*E`XW#;It*smBR0=5aU4@y=bjMfIS~qe95=Dh>O-0x|TE6O60qR8I%gVperT? zULXeBv<}<04tHxE?%q0VE(IG%x)Ex@n;_Ok1lVV=jgoGJxTuZ%Oj%3&cm-k&##V|9 ziy5PIBU=f}BFI}QCY7dQNtqQv(L7C8*(xRljmFMLMI}80ao!Fw-Ut|Rq$UFdMH4a_ z+Nhrt9|U=~#rV)vrc!(m6isZ{Gr&h%qOAz>lvG>1h^87T#Royr=)kTN84xpuQuafP z*Hw%s0!FS<_T#e=cspIC7giCtB|3&k2xbhW+#fOC5HTSL{3ZlJkzdeNMu`b&3#B3< zm|;Uy9wqf{E8@J#VuBDba+Ychf+7piRpy8ZYA51tEMa}b^|*WZo{AaXIx#_Xtu^37 zzkhj(MWT)!gcWyT#l18qc+XSi2Dc#hlzjkj_S2{y=K%erzt(2Q!9+<<#GHdP%2^5z zemJOL3J@UJ7D+_!H$=Au(c>JV`RQ^F(@$PK=*3yUPrns233AcpR?-D@RDdW0@84QV zFvC5kNZ=R6x_Z^WQ0`wMM%I4Gr|J?v?3_LjG#c5 z!^b$Zn&#^noTI2O#PGPmekE%#P%^kxbQ3rO0AX;e>2h-?h=;&Zt~;QV`A!JeJq9J5 z5X|z67<3ITC@Vy`$FXut-4k?nw2=N6GYn|yC|~YaC^Ch(A{qQG5&oW7gOLHHg1CH$ zl)?;Mt^wtsF~*b93i$yK`Ue@k1&A!y8&xoG$$Qaxs3-iLn0S4EVST!sNsWOgxU2@l zpiqd6K6VnO?2r8kw)IyP; z(qBq(&myfk|2KGCk-U_10B6xGX~ufo^I|*&Z1{Ega(MLMxX?lbVcv=$lpl6}Q36*I z;Wdb3452)=7)CUV7WnN)Er2YZS{wM~`z1&!E8q_XncO<0RRFf&4Fa~8X^7VzNV)Zx zW^%84R1wsLh+m{pq<>}x!oV%~ z!Z^cGiJL$wpcH2eOl~1R{2fjO|93blV!zk|!PsekPcYJm1S|YI1oOHGt*ELbW<>~A zWHN>PxwI9Pcn(rlR1#QG_!}bV90rv{4LZS(eP&QksX@JD)X-%x2J|&N+tdAb8!W-1 zWVv_X$!$Qh$T@C+Qi$q?w@)l(N>+h;56kYujqYLS^DJpUw1Hiv?pFmPCGUX{exJ_^aV<>W;(FsuV zIV7-}lOO-LXAn3J?QHo09`^+hs9I1;=E4|G9qLFu-!69r15b|o64~)bhb;G1OGcgx zwi1@W``%{E;cp!1k*3QZX`DAS`TznftyFpL&^P>_)>$a?;J0al45i0A1Q|{Qs4tj6 zWCee60Dt0UAXX}xM?2s=mI2P(GLK@$JX|23KQq9uqJmmqSS!csFATeOLk&P43{@HA=;8XD3+I!z)k99XKjQ3S+YIH zk4+uVi|v&ZJ3f^cHP(_HG(LK4LQFtxdMI~HY*Mdi2Zt#882cW!J-ge*+Bo(!`CZuf zq|}7OSfTWg*i;56r3x25;{^0xyr>BYNu#X&Vz^0`Y)SB6QOl-#oPC@_oUQFhdz+~4 zQSp)-tvwP_6Qh#<0zpCUUig1~@2LIT)?K<8JgobZ2!EYsuWmDxOCLqHT{1MTW9id6 zk1ikV`*-J*2Yv4|GVHirQs&yc^i0?>P)=~+ClfAMN-20VN5P^?IYat0Jcqz@4Ltk8 zb2MBrvar_rQ85%32D>MHPoiQWp9=SpKnOqG5EchQaViy0B>?Ft$^piRsAw=0@nGTP z7bSt$8TSJQNz{1Ck4mJXfIgN=p#tHaN=*)EWU=VaSI0S z3Bd1!3q@JCMi2sAc)$hkl5O*GqbR$-SH%msrwB|VG>W4a48AC^%t)%v2Yzll5}1#L z3(Yku0DgZS2bB;Q9tfpz(9*F$iV9@IZb~r)Oo93=g?@3P!2a+Dg$ThXepJw*gC#xf z-{8CQ$X`p6Ej><9oFWbwuc*{0IuVjEDON#_Ax(@h662)=9z)6h0JZ-_B|jlyWNJJ! zJ~m-gd@4v##A?Ei8dmSohUO&$4B2d$RN>D6mBaSI6pGZ<`T2Nxn1lf100tzK8(c_7 ze*_PHMsz1KGBSk0U=TSuIU+AFPnb+5QB+hU%F4<_MMZ_QY14+NtE&@DO--V$txa@w zb&0Nl4$;@wCvDrdC5DEEq(g@eqyxJHVYAu9*w~nK>ePvtnwk<0heOQG&560C8L_mq zB-Yl}#Ky*k*xK5X?%lf+J3BjK?_fuI^yonx9UV!}o;`_^lN0IHs~73ryEk!lbtR^O zy2O685$WbjwT~V zjwEq$ab(n}Q6xS-o+KnBkkO+@ld)sRlElPBl9ZH0xLhttnv_72latA~apMS&$0I2z zDI_&Dm87Mmk(BgtBrS(W($Z7O#EBEhq)C%VdgerunVCtlv$KiA5sElh$`j`!^2BKe zi}a~zOMG`4689;l#G}}l_$=%~`Yp2}1Bx9eeEoA{m8AtC2XNXSKFGNjgw48LGQMqIWbk+t1P^hE~}d(N4});N>6 z8W%G1iUUcw=0cK7BS`cbUovR{myFL#CK>tT$(UMqGWL=u8C&m860draq&jbsRPRlA zmjg)h6Gz|_^aoL7)}uI5(3n699>kNvM`K9Q%%laxNsA}e0xkjc4|NnTzanL2eUnLd3wnK@%7$yEeED*+V#Nwlux1LGw`~TQzomdIswg50cNUOU zt5%V9>(-I=>(`U=@^Z3y^JcPj>sC@xQ9<_X*+cg3-AfJ}I6x{ZE6LHLN6D({60-5w zO0uQCl&pF=nUuZGBW16qk~OcVk@c_h$)@HaQvRlZYL`vyGKuF&w)NZjykPt z28{Nlx50O6p2V>KbZo)YR46T6B#confX1r!%1lIZXpSHElh;j@CA@(UB38 z=H?fe>%ep@AW$+eGSShtii?Saxh5ilSDZCt#z;dwD8+e~kanHA>FMZL(uENbk(mV( zva&{X=D>W;RMeBu0(c?*}$bw4d^{y;BJ7j}E&-U;K=CT8a>Shk{c`RcMV_g=zs7cWo$;9)xk zPA-~LvaodRx{Vt)Zn{*rE6Jsd;8ObqKbwX_mTVQcYcBY#*yRe@9Juf)btzy~ znne|`L3VGb9P$O-9YlzKaG!!>g${!J&Kx|8of`^ z(9odwDmpqk^j^ilM4PZp+l%%lCMG7LeTkKo73tcwE9us)Tg!gL-k#o%Nbf@|e2j=g ziV?B(>q2b%cP1`lIK)54j`*cG(t8h2PfyX_BPb|HwC5N&a3H&QXulB^6-Dne zVq;?^_84QvjG^}#!o9@!@#E?JL|S$VNl#Cw_YpZcIi%;*cEqVzkM!E6MjVb(q$lhP zT&kGF|Ew+O;77K4j{=Y*KtUhveP~ zC%JcrlHB`4$P8GYXFQB13!BE%>+H;#Gf6=~0ll^s6&2CzYyRRqGOx6V6c-nhl9Ccq zx??^mt6WU4q1(4_Cp&iRAUk*NB!>?lCgo?BkCvg7?C zdi~pTYdx%c8_2P5Tj(|J^5x6q)~#Fgn)T?>BLe;Y-|N3NKp*&RH5Z>lTGAXFr|yO= zSz_nh-9S^WrLwZNddJRiltPmB8Yaely!}E#I;p9vKvrMN%g4vJZ@;i4(m|7u2unRv z|A2mBVc|hELwk>5!C~P;lXjaWf93p7tj8kG}?foe!%O4FR(Yb4;z?VunS)J*YQLbl;doin?q4m zK#z6sQg(ysm2XCT;^)7|=KuT0W*r@a-;d25*rKIL`q*q{X8DI>Gk=Nt(~-HIZXmHV z^CLD^{fKLCFVfA%m)Lg;C8kEBiFKDT#Kw&GKRz-K4Uhb%kIbVJCjIfqJZ@Y%9G}xk z3NNSS$PA-Pcx3KsI)zvo7Zckq3yFi(GGf5mK{Tl&L|49&aN1T7bHkman`t?5b1Wua zJ$Dfw=e=ZPL@D7V=aC8H^GQ}l5#ezckj(V?Bx}+F670K%XvtI&9oZ`2ag69QkCC=Y zCrEphlcb~iY0^pi1Tob)OS+q!Bi)QIlAdO@#MR~kT$hP^_gd1&;Ue*KK1Y0=Ylxpq zE%EPFL%bcXkN}r!q`!MDT=gW#^AZX1zD$BWuadz5m&riiD`c?$bu!5J776crn+)rJ zi$sK6ArS*^krBZSBr>!PuA3x!;2jb(=pGq4_zsC1(m)cU9+0Hy`-B(wh@{3hlC;r} zNP6O9GKu??WF|i**(ptAa@tdpo7P08XFenO*)PcC$+?op<(V^nJ1$SlTmCnX%hRT; zAq6wGk)nbvq`0Vp%qiIUPal^TmsFFomB&a~X+0^J{E`&qy(UFdUy+jh*JM#qGg(mZ zhAb+4Lzc{aOP0-hM@r#ZvEV&fwdg%rz4!wuTk?UdEB!#$FaJo&SAHaWw!I?dt3Hv< zYd(`LYd@2U^2M-u}IvI<a2-gYMK z;0qplX%t_Hl$DH~y!yMD@{i4}5Xj4_bTn2`f^)NW8zp%A*unvi%^DhNDr#yPZOyul zil4&y{n)Il$F{PG7#R~ixul@T8oxjiaDZd8v5vOoh}aljG%q?jy=2;~nZw)ZL#g1{ zY+?(?X7gw$gyNLE!tAM2BRiRjj?KO7JHfHp0?K*3l+=uZqTKx13El08aVPrNY}*5N z3I_W2QR86+pOiUg(Smu)mM!!+DQtSEr-w7UeaBvLnOQm0XDnX6a`}o?tIOP-h2_qk z9)3YXw}p6&#L)|Z#p)Fyrtl-s-c^x9kzwxeS7idAK6%P-YkuD^Qy#;xQ4 zLAg_(UO@vkA2@L!sRqif-MVx4e&fTZPcI0M&Ao?g-oEYF>2s&Y-fFo20FTYjU%q(N zd?8#YzfYenL(aglIsD19m#>L($6pt zuOSEE*nH;XiRzIJJ?H=lVMw`>0|S$1H1Zp`|Xe} z79N`q9NSyr=HmE!F&vw#kM7>*zj6Dy-3MAL28@4fKJ|yv|1I$Ur^jYpZ4=U=y{Tw# z@~kI}jw!_1F6S>lHm9a!OB|a!x0_0g^@>RcwQaC> zI7*_1E+L5tbBH#h3fBKB(na?yvF&()^fW(5+`C;S0lhAfey*3vfIhH}`_z$9;SI1J z->27NZuCQvn>~+A%Q;MP$2a})$UH4?F_}|TDmpSRn!kgTF0O3#$h>OVS+aUrJ=whe z7MVTe1u4vXMdr_HCQIhLrPsp^u>Nh^@P+K!!e8J1du0CaD*{|F|8TXe#eZ|IZ0*>r z&Oas7_4vnT{yDn6hH+kKf?qH~0AMJbt^5-_GNO-|l0y0VsgizxzW+ z44@2*7QmSz&`r8wX`oPyq*iLLa%Ew3vjLN`>4~!5&8oV%a1TPRMef={! zNYuqB6y%8!C&K6uObcaVoAJVk6CDEs8pk^Sqz-gFjA9Y;#kS#v(Jd$spLijLePZV8 zN4g}8A&zs3Nzd)Oi1Vp)M7LicO@lmIk&l@4hmN$ts2Plo!AKdDfo&1K0z}{M77|L# zl6l0qsF<|fR6*qTR}$*L5#n(6A_=*Cg?QIoCcc-h5Tp3fbUow&g8p;~b)egdaxnr2 z`xwU%%C>>A)}>@2F|620%aS=%MavUDQMPu~30iiq^EJft!X@H zo^@A=^Ul4Z$Rm`4HbvfO52-$(u+12mgyRawH%3IE4oHhSv9|6Y%*ta#>F5cfQgxE3 zA3IHSPMjsiXD$-|`s*b0+D#ICqk;6lc8d(T*+5^R7vZ%b%n=x|BGyhw{`R5g5S&Mm z9_Li_GmOZ>F@|r+E3xr0 z;XZmw!bkA={U%Wo5Y6K#ALlZRp2AnW7{!D0oA0VM#24Du_xf$Ror7-QBT@GrkYtdP z268f=JR@mOnn?E37xXpx*-Mi5{58oaETW@aKpfhj)eqVi=P-=w!nR^05k?SUgce2* zVLD=IDG{~}+m-T|FKg=aS0w)hyt;hZObTATA#-29CG%dtBMaWVCyU>HAd}`VprgY; z@E_%4pX0iPva#LxEidYTkx3YFgir2*1q9n9E^l7*J6c95$XWUBBU$y~6It`|Gg<%f z3)%Yl8-1;;J|>Ln`J;SXH!u+8iUEFv1BVoA5b)WEY3)%GP zE7|tt8`=5wJJ|)--fut19=P`Z_(=|b`$wm(v8zZ<-7mTdJ2quhL!ssRB zfwE8z$`JBL8QWgGBBgcp^b@0*Fp3E;jB3KVi2W`5V;Rar+hZS~A7FGCMoS4Jq-M^T zL1t8JBL$nckUWSQL%-tXWAYP{Q)D=FggvR*pL?I4fJ938{mxBzw)7NhBC45@j}}PZHWhEZ`CMTh=^ zQII%a;eH5p_*Vpr)uE#x(Fd@N7`=v3YS<4b8+F6TJG2c(^I^0l?!9onz;OzE{-^R$ z6;Ye9?HEai7s^JtXcx3Q&IveYVALq?L;p>(Q9gcX+Y9>{qZZL0agT|1v7La&l^Z)#{Ih$|6)}!M8 zD(kud<6N-|^Z)3_&Bw=wo`-NA#5u_x_HMAhJqiqR{|=K}O)V{Y-o|+x>tX~x?)k;e zOvp##0}*z)5M6f^Vq)nt14h>2KDB-4&cvvXH!*{AkTyiq;jaduB3?osZWxV+X9ARA z>f=i~z&S>*u$ZWA-bR=QkHS9s67hn4Yv+FbrO&U(BiG&CosP=GuN~Uv<`D|&;KhK; z49;A=;OyaAQ%8F8Qs}b-p3m?X3b^NYadA0{^ELi@0Qc8+S=mJQ_!+{6GeftFmq|G6 zWy5dXrT4KTN>>nw&=cxSw;$_agdVQB7;&CZG=~hieUC)LJ~S2fgj1Scz@8KLgUw{> z(Q2%ZZ5MrTZJ#h<0=>V&sJNoiQc?ta#)WU*k(KX1k`1t@+Wh$|*$(@ujd$*nVZ(+? z)W?3tUmD>2fAi)|vVHpwvg~p_S$5_uS#;*XN@TA3n^5D8XEja7Z{i zJLi^_mCS!9*{$a4w02BR}zdK#Pu6~VIk3G@%orHGc!AS`t)gX=gu8cS64?z z^S0}F_y4QWRytBYQsV#04&%J!@Fz+N z3=F8He}F{)j7S;3B+m~D^igHC#jpHT{d~RPS5|Z!uDT-pc9~nlCOdoeP7JgC2SnlWL9_rYC z-Mo7NAyN9L^IktMBOXmPN2^xfoY~K|(s$dtQ?{2ZhFbI~R`1iGo#HfHQFmTko8=vg zo{T%V>*BLJcXZD`tJ^iAZR4EB-tq&K?ydM-slF-Y`sA)IE>FK_uP|!PP_4>&w(`WM zPoK_5+I%_R{Q3C9w{Gfkj>`jKx~WRqcl7J+9Gw%^R4t*EHCXJBl{^9hDF z?bpsdzdUC2=viA>x$$ehL4TiNcZT^RF7qaFIl;6?A*-W{b%g*H7$9wbJN{^ zTk>VLRBZK3{=U8BMwd(KH+877Lk~wpjxLr$L zvZ%cY%t+_CYqK`Btva{K=-4bZYxffwixl2|u|9b4;F$_4EIj-{Zm9XR%3k^V4qHxa z4A*@->Ag;e!Xo&7&Qsq`nl7h1 z7`%s*>SD)89#3^ByW$fQ`*iAX+9a>oU{(FI$Q@x5SDXyr`e|oHMa@|@GjDa3 z3`{fCCr|d-y>H*HPmWb@Yo@(>cPRN#gWVvxh;4dsUJ2S5dT-OFO-VLxqeeZISFovD zknrNgi(UQt^)rmjd^ewZ9JKjrc}2yO=y3@N&uW)0ZL25S^zqvdo!n=i+T!w%qwC8x$Ivx;)(STD;veI94=YxhVh4 zCo%Dr=jHaZj_x%4e%i%+!KN<`>?8MX#1*HX1aGGN`UHAactlS5-#uDu{>srR8_6H7 z!{^=WA3nw78)G4JYf07A3Y~?3{~fq?Vp|Iqr0(<#rn;g z8-{J}Q!uMs{?Oi49y{inDd@8~tgWwltV^*Qel>3Rx0k)1mL*Jh>$f8Feeac@pESx$ zEHLe#XdN|suCYs(!|btIahwVLs>!{hLo#P17h2s(k3Yuy*5gSB%VT@@&fK_IOKXRQ z-GzZi=HKmYKh$Ap_8Ti1v&w)sDkqPgyjEc}##v+P1pTlOnHwb*`m?-}?axG7HchU( zp6@?qNO|;@N0kop>n(N!c3No_`FM$5U0?0Vuh`z2!Lz$uuY1vd)%R?bUe-oig1gMV zn>JsyAg-s3*;DmjH-BWv?48|StN*M02Ob`~=%evNeZ*{-w#}z9J=zSv&D_!IZiW*zFc3WxmEv5Vuv*wV?!f|JZnR{hB2;dOnWo3 z%XN-LnglwUuhJ)s3l9xO*86;#c%@-!W#I+GBdm?96hB74nJhbSO+;wFX~AjFIxIE( ze5u3EDerCsCGIV|^P}^~;~T16mY&jh_5J(dQ(rfop8U$}gSXSAJ-z32F9-~Mk;B;9 zeCqyv_LWgb-QNyTE~*dd^kVRIf0*^|7Y8q8u2-%LD?OC%GE(hP;VN@($>1^0W}S{tGzh#M9P>kE(;%J2 z$@)5>?Pkq7IoG#S(~B2*-fJ3p!Q(Wp+%gTkTsHdVpVD^zUftbAPvlfh z_1+aJHKsaM+o;@0aSi1gm&+0CNmDP%)rjFjTa?0q1DN{yolArP; zMx8Z{V`cR?au<69Rrhq-p)GEvC9#e&=ie%)&*0hLd|g&jHn`WR4vV{-vhCS3|JSc< z&I144d-jZ5Qn}>x1%tfmxf%s0cU)&I+_GhhY|ou)Ls|Z;PtQAz-`4h#YW#c$t4xUx})aaL5)ty}{bNVJ+`p=ng?!#{3uiGB*_!G{8c@3~V zpl1A(oy{<5GCuguTG4ol;+lE3H@su)c@?n%r%QLFrnFl>cEf^_VPzp9^;xA^n|r2O zZ3whFG4I0eRHyk@x)tyyG37} zZ`J1fXyjVfPq+6zHM*?L8Y}+`cL#BQeu>|A+dWu&%ODFlO9c%aC|_`L%DHp?BjZgL zK4WdUcQn6$fNf^j{({h5jQ&em2XZgQc@7?|S8)4P+}nvRmH|gtnSDRop4i^AA^-ZE zaGM8CGyI+!Si23%Sx_0#_575fb3S*SwB7dEv2UJTJY}c1t9>xp^Md@D;+%-iWwlRZ zmb|$1pkeIH1%rLY7#Ql0o*T9J+*5{WN&Y^6uchmU#D!m-=-e;Heqh0ZwW=0*+VcX< zG_RiCpIaSyf2(F)^XFZC?akgk8P~-me21Y!OvWa~ypPc*`p!6z8?o)_*6c;HlPS|u z-r=S3p6l;TxfrT6SHt9LGOOXS!v5UA4d459lFM_S-Lq3zJFeHkeTL7Hta{ATD=ybE z4qJF$-ma}`e^cX*+N_R#N^f{;JG^fkaG`FI&C{;#WrL_~ajtr>Mjsw%ta+@_=Jmj* zwx5qy&pf$!oW~NURxEc5Xsp?4`R?0nZ<9y7o+G;% ztQ}z1NmI$oSYxV3M>&Q}=DGt-_C_9emd@xnLp^3+;F^_AZ3esdm@p-$(d_2F83&r{ zJ}Dn67`oul^JO~D##=X)ZmXE`@)b92N9DS;y-P55^gm?H5Bw|Fe8zpj4t?(J{_|w? zPaTL)jQD8uMJ=`N8ZU0co^XXj$qOz9UbB2VcgEQ#qdaXBpD@7jKQ)OO7xH|s@49jeaUfa7tO4)=0P ziVq!%o$G(-Qe9pC-o0s-Gp?~q&i-2X{aHik)wyDv`_S^Mqql6C8nq+v_}KANx;eWINb5V-PFK$}e(YEm z#ku{)u1lNUYnkaCR5$TxvH)Eym=T^I4?b10k*VNk9DgecitaBhOC{i-emiBmEJ3J)PuIM zV(rU4n{2(`l)2`fi%@GjKU=+5_x*#f$*m5Wx#?-<>~>a{=7i{94SAz5rF_d47sdN$ zpX7&o&yV*kZ%SJe^uVp+3?oUou#0hb>yZu~4o>;DgE}lbafXwho}&)0W9%`5|=JUGkb%B=546p_JV=di;B-bj&HX6@!|aC&^2|6dDT>9gj&bqV^viY2pLeX z>Gqtx;MTg0E-t;>Z0Vw?*DkmIv5(6NubdoLC|5atCbzFCd_g$>$N8i*CF=>4(V%;c zjT;W#=;X%bb_EIuu7FMCyI=WUJ9}Jh{NVocSKFmNOLxRQ&wC$X;`01k$l%SRS6&H` z4YSn!nyJaQ?zEjfO)qotgo#lrM>S?&&A&M6`rAU=`>D6{yDkizYCpLD9f#*D&*j34 ziO|gh51iO)B{Mtk*ldLq?G?*Yj;9mNBLnn36Wu<`-;dSu|E9Y?X;Zguk(rq;Blq3z zsL0S+GGkHTs8NTvUp#2j?_GJj*}BFh52gL)zPc#;%&Z_%UiS` zoP48UYFUNMv!awYd#|o^96GRT4fU&Y#ZR7EzYD((dbqP>%fBo6UikXEMjytvsIS2Uni#=8@sDtXzEhyr(=#8Z;(9&OS-nvZ<2AjckS50 zQB@DF4=I0olGCIosLSDg*&XZh|hpFVQ3+Oq+w zFEe!Sw6F1~DX}xFpCz~Z#^!_>wZ}3yX|%WC?Y0VFuh5tpRc5ZNpjv-Yz2CUiWR-hu zboYu0>n`=R&}6sY?2??5wu-EoK6%-(OG7jRb={l>E0s)8G+6pbcD=Sz{LXi6PGzkL z+7>c5yJI+~k{eh3q`SMz;OXHLf+t>_VZ6Pn#=AjIZ*O~(it$}c-j2&m z)%tpB$_+S@WS<){&34kG_~VLUF;0`=e!z;yJK&EqPH&qS zyS;lyr#YHeQhRm^iM_OSclD{NOs#hL@4l$Zu5|I85%*%(5X;0t?7=IGUZ=B8eGb>Z zz9;BFyW+YfUiYiUE&k#~z1_Ov!~U1AL(O+RG+(~npS7OTmDzP)#Hy}mA8wSpdEn@X z^*IjF*|P55=Z(x9Hx~TojLML|a#YGZ7L3YyLj&5m>rekYNL$+~+Vt6xjc=-%D&-~m?JwGc<=Ax;Gj@dl^n6i;6G&2ZrgF1gw!;=x_cwqEwr zdf85{EN@$GzRx82f?GgVoAVJzrVX~Z|N6zQqsMck@&2gf{Xqqc6> zXtSVzLep&5y6}Bp*MZAkCixuSv)z_gL}&+(HVL(1bUZvZX+=Zoii?Q}*IsYz>Cn}x zVZelpy~}rHWz=YmuKZH^^y1g7?0ff`(^-^uX?eTKH20`_9oKz7*RSPFee2=$YHgTp zV9lPeJ3g=9cP%hyPVl#1w!L=As2^dSyp4})CD<4MN#djC^gph8FDwC$cHfuX4kA;{n2!;F15gQ+QB32b0aRUEgH0O z@l>UnePJQ(&Z?N|d1Ve!Z!){zy<}wMihg7^w9c~a3=hX&mp()}yB93* zonmJG-{6chzJEPjv&)N%cJ;1PK6){&Z&mjj_wzzy zyAofsotD#z)(0JWsGph?x%~CBD_SeYD%G6ZIH7Z7C@*tSl8{41yxzCxXg7{aj}Mep?A{;-MZ`7 z=X`Vc`C#Gw)HMsd9vDpAH!DS@=%G!oUaBQ$<+fc{K6+0L&bs?GNdAV&>Q#EJEOwB8cQ<^@=HfQBtUNCvyvZ)P8 zGpZxqhR)F3cH3#ypv_S|mIV)3r@k>#P0R4e7=PxVlCP|gHv3eJM|#UV_SS$u+}4-9 zuJ}|j>(If2RqtIkZQdLl60$2#sm-A0PY3n5yu)qkqbGwx77z7{TKMj5J=@&EqH!^A z&7ni>Sko9WgN7d2vPDI2+ui(tJ$;j#_EwBOI=kLz|HgvXN6!{pjWoRJV>Vy4)^_zoFn7LD2zsPqSIKi$H{0injWwV<8S1yYTWx=vICt!?Lu>SNz z$;~w@?{Ctni}Ok~n`z-t){e`T-!sH_zDJ)+){|s92DR_hD+~~9psMQxgB`K zF=fftti!iX=q${cz#B5LK0EgY(L0-)r8;@>qp|ls$3LqdJZjXdFrBd%(ym_{b?BAr z{3jV(FJ4(5{rY3^`_++7#@{RCGfdjV#Oj}V&bjbFJJZK_QJZ^L6=O#=hsw;kdLqGE zixt7!bXuF$WtE=ys_YlX)1I4}rv&>x%k~XWW51mcJp5(H=+s@^P7Gci&RIO$=JcH@ z^ZiyGw3+&D#%-JPD>n}O*$}akH&J%d3dgfUR!2V2SH9bPbE?vQZ}rrEGHGTqV=9fF z%;}*2^~I%W1<4;RPrUUliJZOpYlYI_pK?Bv)IO!K_G}%covE1evBL!qZSU8bADTz4 zUe~|+>cp9AE>77{`pQ;ktaE;NdTF>(b@-ZV3nq=x`|wgeeo6PBqbqWEChHe{lYdYW z=WZPRwQt!Q{g)S`!cO*PosOJ&os(G<-rw`_9M2`La_O(xN(0JAwVg8TM|}QS`5_~+ z8=rlBdg;XJOH&I`D3GS-q8M9ux0$dDA#(0 zX3n(h(?cc?u*scSYPWRaYVW!6b{-nL)j8~0(K3f}nSD5+mim2rYTq)R&*N%*uMi>Y_i z8rAIZ7#^$J9#;EK8=aO}N2LdN6rL@->t{6eLDXEg(8Mtc`>#ICn_=FqhpdlXud^FY zuhrhmI5+Ob0iDwq2ft`q`b9Re&d0jyLpP;^`_jj^@7Hzo&eb2z8lF?kdT*Kfq4ekH zm7DhJq=xmnq}!%AwFKwUc#soxD~-6f1)? z_FPeO-0r}^<0p?V(B2Y1uI%t*ho#>Z&0XMHB{yhhk^1w#5!rV~t$z8ntINwFUU3nw zcB%HZPDT&LcXrzOeZ;%KX$|@FHn@)4meOI#fvip(9ow;L1M+r9@?O2)XyZQaz1p3` zeI->Y7klOnY`;`>ZdKM3=D|}#?DP}QoOu>(?~y+~>;Cr+%=KygGw+qe$1it(Rghq+ zxP8u-uuC~R6~EQ33UcwdUVn_cc<&q8ovC@Lq1@snWP0x~qk*s2&0W&J=FGFAk&l)h z{VBifg7&LVp6bUXhUsp|{jdK!<)|@!1b^2Xb@mAH_mH9Es^D)|K|T%tSbBGx?zZrc zO2D61hQAmMfmpCwn`BeeOL%^OFMLcwQhD&_%~O!#zBNVNfxn<^GBAWX+>0OXWa2Z> z&kM>fK;8}lK}|fya-)$LKCqa|3~pbhq=bL#^IPZc6#NS)7*mxF7luv2AB3m>)VDJ{ z-@t`shH$}O@dj<+uY3#g_%}_k3}eNBCw(CY#Ne-DQx~a9xZj35i~2-0Q*9_snV*2@ z$y8FBl$}f`8BNL??kp-*CI;?DWRRu}18KG~u$HWB6N5#qpzoVyn?dq1*J;=Mi~88+D$wYt;k~;WTEh0s)|5|&WnKP4sXzl&|?)UowXPv#)UVH7e*Is*_z4tk1j!{O_D_H0Gfa7RY#mo5B z@kj77a~b_e=x+-2R{n|RiJbFkGd`hmCf!iE8=s%Ny^>`fsC*gUTzRJQ+n~H&c{env z4zWHLg;T~=sLiS#>3St;W^2j zI-Ya?c0A`U0xYAgpp?;dfJyoS#!MNloxnWro4~o(AzelX1U>_J25qQe{U54f`o9W% z9PliI?L2`dO=QV40NJyZfAfen@MvKzO~a^gu*HJ;F^)NJF@9#=kMU8XIhUb@#Z(6w z6|@OI{a%XmY{B~JD#7Lm=ZEl{{FN9ZOSP2yXgqDiujQ-y7~6z@l{D3u2-spw0qiuw zfSZl!fL9ymNcsYlc+^}C_zi*I6ZkVT49d+Orr#;>InND9hrM?It^=&3pL@RnSnN9j z%1`}&0Q@=LKsD$kfp-Tg4TByJj0gPpz$Cz%J+**;4lpbU)&Wiqo(*_za3o=QAe4)Q zvQpCPC4HHsdnKKe^wpByGmdq;P0HRkj_vS(&>tDc^?pNge=6`5DP2s73y|V5n=l^E6ijJWN;3shnw8Rdg56Hj%!@EST6MYE zC|6D&)z}hXmGnEohN;b5K~;1@=WRsZc=FCr^=$)ILm`b_4QvuVPp0y21vZ)LHFh7c zT3RgFu-I%WwF{;+n@aly+Z!C`Sw~apu*PZx`=!Dt?Ae68iTo=Pw3p5W7N%8#?V*L9 z%c+jyI`3j&XVC{Wb}6v4=`$KjLgoxQBAC);2E8Ge(q#rsnaMTmp(CCFaPG%u@dh-U{7eQ(R(+3>f%L>HGA*pAHJBy<@N@*Aa5p3)Yw(Xn@O_- z+e0^b*Wvq3hcxyv!8$ph!F#^wJ&3#k!BpR#OVsf<2+JUkc`JP*TXxnl))`s$fyURNH4!e&~O-i7v~Mrg(W*7r6Qs* ztK=GBQ@Ry)b;)hUeCibJo3P6)T0mC{wuf#kxyx8U_i5}yCHsv<^oU^Gz7gXBdQ32G z-)Dh6p*im=LGM94;(iIwjvoR1pOgN)XsaNWC(!>(Lg{p+4@?gMXc`9qXW@Fquo3V%W1+xDL4Uz$M*3yrYerjn zDbnl9XHhdKz8>#{sVmeZhMRc)sJUld|_B{en?P-wXZBTPOW~jGhV|_l}sa0UnUt5p#Cc z^PnuO+Hcf}{5qZ9T=lB=i1|R}>)uI#e};x^)jD&qY9C_5#)>n1ufp=Pd~N0(RdapE z%)6_W`i`5AAoorB8bk9pRhRn=&!@_JeMO$b<$b0)K?DvZPBLWWyJRk^m9U$gBK(C|J5vm%$kD5IV;~(`kd;Wg>A;5nS$hoi5j`82}MLZt@&xrYHz+?3N z@!$8wJa<<;;X6h@6UvJM|5ISe1m>9{@LYkN6Q1-PC+?%;blC*cIBxcWKFKpMVZSj5 zt)BG_d+wa@JmA3zFZ=4~=!ClfUzuD4~5`U++wdngpF=k;%(9y9c9 zfLBuyC>PKHq|^8^SUu*zA4U3H`Z(Y`;h9XkkzOYB4uO}_5m2_#?*d2YEYDHzbM!m2 z1@Jj@72t1>enIH>_#Q+0o+8d&I*#EL0;!nOhQNCTE-jHnZYl!1G;C$UDQk()(%e!``oY4|@Z?uy2KLhwpmdpL}Kh$^JqA@BC8&UNW%q@nF5< zM_e6`)jsc)z0VT`yg}go-iMK1VtyWQw!rUu|1Z+#_+JEU@V^S!B=7=(O9igaJ`JqGPhLd!2ZT~K$~IH?^UH?15y znf#YeOIHdJfQ5W`BGLVrIdl4(NZ&~tv3t3ZcaIjYPDTgf)`hgj%B)T%Vwq&BGZh)E zw{}^?i9-6aWFnKo`;AtLHpUXsUYELD5Q<1)cTynmWiEl0D*9ZQ7E0u{^ zY1$C8b}HE`lBq%o^_)xVGcnZB5+CU9UJ*-gtylQkoe7tEz(kiT8p-+oC#m;$X>IqF zR!>G_^{TFPJ=c~dsS{e*`bY}<&6 zAca4RNXvIviA-|}+wRNo&C+dM>jqF*C83~BNiQm5OC%mgF@`>piMd@Oo0e^jBzi5D37!?nIKINFX{(aGdAR05zio;2 zu874grYjdov@5Ow!DS#bOt`sYh}8$Nz#I#UVIKS8g=ZHvig!cEC&NS7_`?8asi#=Cb2`X zLT;L7YmP?xp_q&V_8quA*OySfljb(1sWm3LMpA=U%%#qO{Pcg)q?N-W~0mMNCGd*rwHRpz6cE5VP1**PLX)*st7v) z>97B`CAQ%Eu$o!Z#6(WGas;y3oP0KylV&i6crv4FMUnjB{d{(=Wox zlr_oBRt^vjhaT#Jb8pH|0Hj@A+?Av9INE{U=CV1e1cZE2hn3o4rF7*5>?*G{hR-F7 z&q#JUvcqx=#p8i=1Eq0Wat+J1$K4iAJMGBn<+LG3arDnoME4w;uXiEcrL*YU$5$ch z;izb3N3cfWQ?y>9s>FH~U=f!{r8qmiHM!IAR7W$Ft2IyOu{h09EY7GWB;*Q&xXKZ* zos~(^3WO@1%tocY{$v87TyeL-k{S3nczcpMhhssyACZ~baDj-i2V2XWOj0A8Z^8Cc zT1L5~8>utW&BAcOrc5>|T0otwuJf{~`KqBg>E~rH9IBuCrJuwNbo@qIU$n$VT0&E{94>n3z4l}ZPY8@b zT#-ulWy#8qnOEsCPkTp8D!DUlrCQOqa78t)@@S2YnN{OjRhWSjbSJrcw1sv2)SY>r zL&h8@t!eXdCB{6$U1lJY6b3D$HOt%Nly3$LlQqXmT$p!aYNT9doG=)sX^ZB4_N!fZw9bAEnNl_jxJGv^w69<9ZI5NL za*USgXiR3F?D>7JxkL=valRg-Z5adyj=d_@^jZlSH@|jHcT5F0p{me z7VE*14N+)AEFJ51w|C`0ESeMGNY*ADoxv_UDpOaB;nJH(rZce~TnDZ0f!^LoUR8>Q zZep)aXS+lz%hyQ=Pr0=PK}>v!6_4zaR63{9C8{8oLsoYz9?Q5)u9k1OJD zPwI(OI?b0=mDdrstbST;Wws`xZGHXmoctVZtrV8^#u~k9gqNwyIW12N^jYu(41|?d z#)bX8H7Jwu_DC#+g#pj+mJOs*xCBXBP1Jcj!f%uPUCXx*V7`zU#F*#x3;e%LO(xig z)ZERNqHLq|%+-xI_xEESB}PJnvBJy__ck8tT)o6NEc&p}05lB=vlFKD=Oq?N)L0jP_aIx%L^=~m^vFEELoXS5_N&uaE%0j4!B8N(Jj$-@ z&`kyEfs*ykWl8+Bm-g>fvBY+#ySY!=bY~-tl_`f^Ob65WA+RWQbT+HL$+;8U)e*D| z{@@ zE}T{opWT%)p7&^qGyJ7HvIzL}R?PA!?>xzTCx2)cWbn|i3im0T>kPW5%e7s>C_6+m z7SXbkz=q_hFlVTJipA@*>wpWpySf^Pd2umpYfcX)dbCUMOskixZLxY|iMGU!qOy=6q5UWDsQCQW?SJES<^b6mLDD$1mZX6w;IOmIzh=Jbri=WNjiY z7r!o<&tX3XyH?tq*{Kmb5-C|Qw)m*a1GAeUS&!pj)0xz<1CG#_Oz61^4-B1zw|6IM)SirC;Ia0rk~*9)qByahQ8sZU5WiN+k_KE@ z$+Y3>ze`2~I?-h;R!4U&mSsR3-Bf{gbT>yr&T*&V__$^vG+5IY)$S=C<@0k$30n5 zcH@Z5YL_Q?Kt!bs&%*h;GB84J2{g(QoTUu0Vjv#B#97IT1lTi*XoHI+*K%{Nuw!hIVOf;JGLZKm^S7tKNf9u zWLK;Yn(+02hkc*rIIWf10vQ^ER%^QvFtLLoo}Rr*EY{0&6-C%avY;0Q#Z%nVW^S9B z0*j?&-XuY(H8}vgs?fwiN~Xuj1g5G&gBN5ky}49D)X8#mSp5+-d*A`WTxye(Q)<${ zsd=KJ<75tJ6GE(>O-O=)GN6oo9x$pGnTwl~(=^+#97*D2K9|gm_BBLn?;a!qi6XS=us}-on?m0wuTNE-T9lLz;zBeMqHIHUb*! z%aV6U$uO;jC77Zt63*5_K9N^@DRddTWq91F^7QLxO}HMXWp7#k@{_lOd*v$K4wjcj zd)DC0)SWnUZ>5!u&Q^4%55weGnR{O8QYW@=hlG>lmN$bl0z0woQbZo~R#jnr=%b=F z(q9&S=hbZ&D%yY^W9d}xSbKx`AFWhUR!d)S@3N|rP#JFh1!DE2!&GyBUvS@oR&MQz_?CNVn?@&<$dUD_4 z_G)Pd(%rBK_W_l!L`m+8ojBudmOv|V@LWOBMzJ4K#rg2xT_v_qls`JCDl@?_&t+M-sBo(}jOjcSeZFw57}F(szc&pOnisq0IsYBZE`Fx`i=5I=vdnfFJ}KAef2;Mlk&B|0uFu3 zBZM&OTcPo)tUncMj7h4*W4GosV-0F@U!lTuv3SW<@R=?2M?D%0*ENE#8ly)Kyu_us zx{~Bt0L^RiM}JoDx_r7@JEbq3?L=kgiZ!N&qihKeJL}}Kvwb$>AB5mO3m>3Au*^gt{r#jOCu zr*23=9F^F{qo1{5591k~iglxV6A!*uDL-V6KG7e(?2-?TM)$RDcJ?~NF?8&Dj5@xS zV4qt!u=LesR)MOc{n>>aZYyQ`Y)&E93bfOiNwh?1TiGeL9>gP?O9hM)^R8=&EKQj$F4s80nMUb-VRO3tgJyx-rQu zEytP9hd4am&F6Tx0a-lTQZojc>WpY-?!_}WwmI`~EZ-pZ*r~6)QP6i{p2jxCe5h8% z-m&M|RQhB0h%a(_n95sV4UPir&lrt?{*>}rwf=G>WbpJQ zU39u7)l53KX3JpakMdK;YDqY|W+2-A%F&Ns@{Olj4}9t~zdd?x-8k}(4;2}q3U#Uu ze&MRk8zwb9bG^qOItRxj9JM$~aMXFiWZ;oN!%wC$C3H4O(^Yb&KkQIu2f{Qy)M%7> z!-iSr3!C^7XW$$~3O;mE*Y3(6jaxLHdFGpC8Z7jdg_huJF@6&@m?&tN0q6sUvY_TH zD*{!KJm-)ZWQm-Q7g>$kGHB9_V>upi3^g-Y&UA$@VZ6;7*pem*I%uuyDk1^x@c!V*tk>j%&RB(9kdvVQ-j172b0gfb{-q z)r$OPdi}MbHXj&=uCEE3wV|OK^YcSPw*yN7ZCMbRXicrB%!I%x!GK4hY~$fl z$PW!y2K@m~s4r;x$*3Hj#HB;C%kbKna#ehn#e^Nos&r3?Yih6b2}=<-e7F|c`Q~px zPEI_efLsT6ln#c5ebwUojwfY(oCnI&G9;=cRlpDs<%WIJ z0|AId^uu7i5vj3wO>sKpmpfJITFM=6jdQ%gg@dX*Vu9m;mBYU(Ld!$L$C2XpA_a17 z6<+6%&eBy&0A`J$rdcl2?q+Vv1Uex}5rnj9_6k7BQi3?%R%H#XvYJhG?^uh?fFWXGDu zpiuUijquk;!r{3MjhF|{G-&$5hVvF$J?GDx9ck!3Z+25tW7F*JgX=`ve0v-thpM@Pg|TfAgQ6 z%*|sBji9*Sp!oAdmvppt>@&8OEIuo^?2d=_m2dsmTR#{APjt~{bu%s8kr{}_lC1UI z&3Gz>AGA+zPFNY-N#t9+n{(!1Yiv$-U%6TCMi*q%_eZ-~f&W2&4=GEF#^2|3cx>el zx%d#!^L7Tbp`tJ?o|GP{6X1obXSn+jWA9e#R z$Bu9Z)_rTSJJW^p8mu$cO3ANyU;eXt$HpnF&KGI9tb&uHNm%_cZ3EUacrY022Hub2 zH6^bm_-{IKDRobPSC#HHrZCV$-Y;X28qi7Y*z#V(Xh|Oyo(A}Z`qzZriUtU{m?oku z?~3%v?gQ`dVhxH`@%};niYd3w;Jq*2)!?05Ui;u3F|1A;IsM2@V81)NTY~%+XwEz1 z-J)BX{SkHZ+gy&Wya&X)xoX$hSx19yOkI>k_!pws*Kr-r%Gn?q@gsn|4(Go{teqON z2iIE#ezr32(C|(LuOxHYj@5RjzIv3{g@gYt#xLR+*!jRSLLz~!*pGH|3wqJQ40uM< z!Zbo*{F@7%8eumcqpT0_7H~P<(_wuayD-N4LZ`NaTd$>JS9SL&3aj(oom}fqEeF*= zC$?vP`9iA}+H`@GX+{sGp=%%dISxxW`#8DYC@jbIor5EcV<`?pQb>exy!}6X5>h^n z`fi-xR_#Ohi1fSl$Fg)gPFn{q^KKvSLBQ@_)e)9wf` zavA<(J>KczuK(@o;I3a3d7HqopIe8w(+}?YbvehM?a6Ih?Tc>tx;^*mhwYMS=V$2- zpJTUoS~uiSVg2s*L=HS@?|tD-d-bu`?DKE zV>j&lvfa4rp#AypJS#ryE~EQ~P0N3I_8JQ>w7=7K=UjB=Ec^Vu58KP{`Ide8vESNj zo;+b+`t?dxR_^TZaldm}#@#;Pq$jth?CYQYy?x~~ zC+zgIuiIU}IAO2<*$Ml?_kH)I^|P$gIh=kJ-Ch0f*nrRHB<`?B{^L#iTKL09o`1u> z_UJ425c*}sM}Cr5htqzXiRqUFRCx32Vci)#!TEC-%W5bi_zv12a%5(E^`l|;I+3A1&o_+a)KeP8f_?@gAx4x*9ZI}1wu0uMZ066&t z*jNGIGy@op|Stz@$cC3 zot#nss6UqD*3T`M+kgTmJ)CmxGMax>Jtrd+)<3HC|IPKYK4ba7Sa$etX}{wQW7y%Z zQvVqBjMa9gz1#J>{pfVk?{@v}G5dDXZe6vla60`zF8`POx&0Njj*79TqY3NqcG~Rb zb@#(Nt)F##H+1+*>UVTtJ>KcTGT!PB9W)giY~?rtNPFxdGVDX>ICXG3dkpbbf<8D6 z7UP-GhX*wKWXCJW!#<|{M;w2KXx^vbZN)H->^?;h$SMAI@7}!>hy7N^%$YL}jwOc6 z-+lMp_7zuLVe^^gjFo2EsboC(;Db`0`{&@ngQLwlD^x?dF?z!hJ%d?K{oj&IQM-BgUVH6hFWAdI`=q`3Q^)Lmw|`9PXMVO5^A{dY{Vap^xa{L!v9I~% z>vsIf-`kN7+@CFvHZEm*b#-+~`y6>}yQNE)W{-74ciOi<^LzX1gTJ=-efaKddFVip zG4zXH{K9q)*2PJ?&;Rn{7wn@?J}bJieAeGxzM-K(>T7Rr7aO_bhdcd)AN)XM6qXNn zh3%yWm)Z>vHrV*7tE}$aKCX{#!n!&K*Uf*9{#?HO2kmzI|8BR#;V|nb2e-kohZHCP zPI;~q_Yc&;>9<*){c5a(+k2||S)GxQk%Mkq7pA#SxIYV2&qHs!?Y4ts)z37xVJsFq zm{$PEE4Y{N3Zf5UNA?)fOnlBB;2A2<9fy#91_wtMlfq#YW%y2pNfm$`bND`nbF1Rz zFCAQb(XPID7;hu-%TY_F;kMtjFka70@(XWErmgQ>F?+$ZFu%we#ji>vtR>S1t@N~u zE-W3lIHF%t4?{pAy=2-zDzPYy`;vW;^z6P^Pb!&CZpqBwXPYG3Vbxvla2*FI;G0kQYJ z{(f&@{%5VV*IsMwwb$NfpEJ<6RqOjyY~48L)vx_=A-SL9B$R*>Ald=JXh%4DAFgqH z58_MH9a<1+%;KXv7vQ#ko)~_8FVUqeIY{(D#kQKF;BlfL_g`3!c>maY zAd2I=!``ga`VNAs#P?qNNu}C<926YTKC*wQ)QrPbelC$>4?TVdOn-$)0bdROiSvjy zUJBDm>tb+l^v?L8W7{xeES+((1=l;hLzGks zdCYNI@eLY(CdM((4XOnFD1j*bl&omfX*&YK--z4H1F}eD5w>EML91lT*&vHN5l^i8 z)_;t6IBI|1fLKY_OLmwQkQeC@ed?ubPETJ%)SW=s{)VyO77cSTa2+{r+IdLhlrr=n zCo?cqWueo!SYXPlJc3~{BJu}~^g47kF>C(VkW%E0c&Bk8r1Ga$wbU zejx*OuptxcW}snep4Z%T$n-nIm&F%Lx1bv=ClVtgs)&Dp5NaZ@? zv0u~AvL>7qc^#GuN`#jmO7{<0Vb#&(=Wh_uG-*S+PIOu=yGljN+G zAf;AOoZ~%**7FiK>*1M_Ns)*!fkkyDWzK@bJ`Y-x(Bi8pR}{GPZ+K!FINIcFk(em^ z2ooC(`X=X)NMlmF6OBlce;p=WOHxszg3*KIB#2%XnvL#DdU7;#~GY!ki+n$;~4}g|?Sf(x?X>I(UQkH*7s#x*kHbVt<{A2EXWKRXP3u zc}?uO*iWVuK`AP?Xg`J{RgAPMunBM)Lb`cAF1`e`>T>I$lXRbXA&b*RP&5+Qiu~yk zkWPQgNY~{I$mPJGmxu%xlR16ZUVX76^2xo;kZZ0^iBYBrD!g(r=(?LJGZR#i7SX=M z-50#I{mt%lA2yF!(lIBcnH}>Ucx>qN&)+GC>O(P9LWMcoUK5;bVZn{07L1!(8E!C_ zVDFU8sGq2p?}7dh63mLek^B^CInmjbQX*%l?r&z^MsEC~{av#F%y?wp9$vn;RAn{B6?Hm%*W7&a&?ejkQphT>4y| zvcP9xuW^bsaWU&BF+5&oe1yP!u`Vuoy3C0$)#U;ovFnukuw5JyELsD@kR#QXz{6>) z*i&~_)FU%|+7kAeE$GSj&IUi1?i?8@p^MA}%MT(Ao>S6Lq}5Txo>36B4~7lvq!31C zJ2%fKhrsPddU!@daQe50pz&G5zPMnNg&ZRdm~P##JDX?XQXWfkv`EYa!CNU`k+CFi zU09bC;y&xqQ!7r)M;jJ#&}bM#>FY4buVY6Li3JdwR{%1t0KeYH+D@N99eJH?6yvuj zERDgWGiPH+^f3cxD%HSQ0kd&$am+dU?kW0*{(F6#Tk;$n z{qH*v;gFUK=y#{;V=!L`C{KTsdddL8@c-93O#MQKzpj7v|D*obt-sbm#S~zplpj&N z4vE65y9%l28OA+NCs914V;1$y)sQBx;U>|G)20SFW?awU4Cy!jPIln~x<+@w8m5ic zG!Ds{m3{^hnAbWzkv`3Y8y#y(-b_Mu7e`gO3Imi`45gsqHLqi3!@M3B(aT-D&fbSa z>*f+j$2l>WH-I+GHkJ^~$d!pbzu^a1nX0ogEps-Su|qj03ckx;vz|+W=qeIoNXH#Z z&n$&bVj0^>j^n+Goyyfv4?Ve?sr3QT%LytTQtFfv^6L#@43Q;{2R=@{Xk;@Kfb;_w2pgQc8mk@+f<*rIbJj&&ecu(VW? z(ijdUkV+C;J;+WdSnKdu19~MZ^Mr_A_HTB9NBkT>j%K$mop75u>R5a}c8`pS4raI0 zi^b`m@w~1Y5yXQyBv!{VX;#eS>W{wU(C^rKQ$Uwj+wWP=%ov^k+sFGB_;uH+_{qjzZs40!gO;0 zv89=goC`IVGFGoVIWQKb&&>;r1@S!?!50JLrqWzs%nS!MV#N)t9Q&_k0{o?0DzLTs z^_b`dp*?^TQ7^Bf2XwQ~85OU!60<*_`Pv8*GdGMdRn^ z-#*eD{~izQUBF4@#(Kj8b2{BI(y7G!y2Eh%=_Tx7qa)yPq*JE|s@u&?$Uo0I=e{cb zXLgsrj9Hvsm6vlC$k3`wPKt}=!^=SSvboo_j(4YZv%~NjMcEHmz4Xt*^wW8cSa5RL zv*b(4o|{T?WiL(rEYG{s>Xtok1^M3n*nfLjn0_nII}5(V7dMsWe94X<=J{g5@Dk&F zwZ!~}Gi+w!ZCJH=TMuWxnCma?@r*1u)~v3r4xN->77kB5Gfo#b!Mtrd#>bpAe=ILC z?{p$yCS8>0NcP$V|EJkWxGlG|#}FNy4w&DR*#c9EznAt(5_id~+|}bZ=JtlfRw+$5 zYnsitYuc4?>?cVq=XSF?zZ>5^T&0r4HrWzOd{bW2H5fs{*_+ZA@o3x}M9?Q@+EPj0 zwT2mI18`bm3Fn&l2UbizBofxQm?DvBzHh2ocdc z8Xo17%orRxn8D#eC*0TxiHwM{Ef_ZMS^Qo~uTE4aGT(s<>|KfRCksmXg;Bo7I?N~z zbKk1rknkG79rL|l6L?s~2of`K5#~SI*G(_6nC3TN`novxa~kHO<}P5h z@3P69M0Ug!;4w+`vd`F#I>Vt#caV7>>n8C=2`5c#Jrh*nhd>6ri6qaG z`7kScVHXc#uHElTQF;Z};cljN^ATLU=A*!I4wLx-Xh(pgaI)mv5A%l*7kTQM@x=HT z$e`O-I68)W7XoKq=?tsXpSTdD`6E!SYQAMyd7KUMbLV5ub0?-1ZxvYmZA@@){Qtr; z>kNC=a>ImU9{=CwIo*>>WXOj^!j8&zNAL{4hOx zFd{#x<`cM@13YGJ3QST|OZ*sIfK;#f6K;DFAZIX`lk9~A$8&x!-Y|-ce6bT18JZId z9x~*74(sgWJEgfF28QiF1%}^Vv9%g94D)FS95fGrEV&``3@+xg0F2ZypOXaQJP3lj zO>1%9m1sk;P~K$e<{>DA>d1$D@oP?j%6#?>%Xun!$6Z>Q`9Ij6Q~s*?{0QSQUl?I< zm;WhqNj%NSwG?xfQsPA^eHV`<4Waa1$h`A1s4kE`Jj_r@+NWc`y$JEsB4^R7&aWj& zerHpb*NmM>;dd&8#g3h;7Ns=2b1{?rJ2wDl@#DSjeKG?2=^T5<&RvROf4ljkGw*%> zhVt##-dHpK)3Y!Cb94JO)i5{>U;f;R@0Ivsbo57jcj5b~7vJ&%oknp$b3sNc@`k7=5>k&5-O-?^pfwuKJ1^qolT3l+%5l zO`b3v@q7jgzm}-zOh+V+me?S1j>Ha$w@Q3hVxi^b4ikWWI?v0YTp?*;eBkv{gHd7l zX_mw`iG32cOMF7&D-u7D822eYKTVc6!^eHEmG}+c8sF1&pN|vvs_!xAd?c~PZ?VgB z{T#$4KtC<S0`5v(xE>8ao*PdU92++-nv9|YNSV~DW{Sf|XxT-7N( zz!h{m&`%GA*u)PdJ_U@?vCw7_qZ7dKN^O|XcVYN5=x>$uqyo0qBC!n^quzqeB24{K z@`%Kvz{YaAyl|5zM!O5S`T0Wb_KL(`0e>&Y8l(CMJDUcy|MK8C%Y*j|3JU9dyou5A zCnUKlaJU=E9~ug25w$@cm%YZ^4F zl~Ujg{3H~ig-RT_SQ$$Z3l~=YqjDi|xnS&;_>{Pn9NnL+X>jkJP6iF+KkQ ze8lsgz+;~O0{+1>1Y9nJqL5E#EYWq~INc9CM-Kz1OI)BwK`)g$R$7mN*`${P@0R$W zJ{t5-b$0Muy&m-M^+w>IC3?Nhvh_A)ejMqbJ4%-+325FXxfiHIatm=ICj6GQMyW^J zO)j?qoJ#d$owhCDJQkhnviE@X(sY-55S))bak&9-0UDB=<1j=%-XySDvBMC>B=>Fl zXXRXQV@- z9!~;BpK`fA&nMtsklYLO6VC?RJN_cMetHI)mGmcRrJt%p%&k5fr;c0&SJFKQ{rp#{@-7h)E zLlqUC3oDje!Buo8v(!&D-Z@GY&7JCSmv}D+ca6M9_tW*>lu}JwCHEpmn4mHAkmNQ{ zx3^0fL%(#n)!r<&mro>j2LfHIoI&36q)i069$ca1tPRxfO~@Zi721mXsi3=o|9|L( zxStE!F6}?ypd~L4e*u4(Cs~Yc3O$i0IRIMFKS{~Ul77uwSg6ulQZgtdzZz~;=wYu< zS*B!_h{Q69H4?1}@-j){REbRzTO=+3ZlFbyZj;y{aTV|fNHs&yFgdc4!T)W8hT&4D?oD9?;H^_W7R|7y#twL;p=Ni;e{}AZKeV9kakpron(k zCls#dV(GHpHT`Db>uNnZY*Du>{~0*0lu5ZFILSU>0!LxSGHMH+P|L)|;OD?yK|@;$ z%`ousV68R@I_GFLvTqaU*`PlU&ecvpV$If$P&m}8wTLO9tg=9wTj0_+g%)Xx#Ie8< z=-eB+QR@KRsjZSGTEz3AjWER9%ywydr^MY74@o>C@uh6=dDIR!6jM~U-slrAb5 zQ1%Np*CH08^^jNzJPenwXh+013*G?kEBH5L;^l(x0zWJm1bzmc77;3BEXPhbL5_HW zyjce+QTUM-q{)S!YAu#Xpe8>QJolTRG^7>FhGMBSNQ(-Co_@A2yzws8+OZZFV>gPETS`Tl>s zxDsfo{J?pa`Y`aA!njBMSKwRPG2naJyTIQ`{7j})!tfM{WGPNePtS6hYCm%j%Hk@ANgxTKSnp!3UNvBqtH>Yx3b63yGRJx7l3VU#Ng?;Ipe+h=>qH7zqb0@p`e|FimM~i0{v33TQuEI4%t8oedmx1|{r?i*Pus#T608!CH!p$1hr9MSkI*Hi~s7iLeW2YvJfr zA%rf}I0e4O)Pi#X6C1A z2Dbp37@8TTqDP?zcB6%$TI`0w@pI!^oT7zV0sz^nVkeA~Q}<}x8N#f zIP4o0b!`RW8Z01OQKX(Sx3j#)X`D;n;Zsykr^m5{MY9*aM#{!=-AXHNgDXN<`I=?b0Ix;BHoXW|v9jA^fa|4d8c z`xDPjWu<|v_lF|=5f5skf0UQ!oUdLrdO`F8X`)Gwi^?#n(<>^Y%@U_#hLuQvm7(B% z$sewj%2Jj_`)g!*u9F5EAd2=+!oq^}vkhh@L@j*1&K$zm1UFjQctNzkiESB%w#gaNj!7Ib+I}-PLqdn2J;pkedJnrG@S-JWX zSThYubZtS-jq9Nxr|t4w+zJEs8Y)s{h+BY>{%t-CI@-Sl6pt7b#8pK!n)f3%4d=Y# zUGI)PA9gM%W5o|l`S)_AA@`qNcseUl9zT8(U;K)DMeD3qt8Vb4Z~dDw{oacPe{j+E zIeWB${tr-Ef7&ajUP2f@0#SThO^LG4e(J-8d*ixtP#FmST2*GeK=gfn_wRmg`UTNV xT8_gJ=_uhv$jIl0Lqv_O_qg-lX5v%!Ms($4Wm}{7{{V%anv?(l diff --git a/bin/Debug/NetMonitorUtils.dll b/bin/Debug/NetMonitorUtils.dll index 8b87172941f4aa2f64a4f2d809eb2e1cb5dd8967..8ed5364cb3bb266549559619b46b8c29450574e2 100644 GIT binary patch delta 3577 zcmb7H3v5%@8UD_(eed-nj$YyxPC|l1pat?M38B;h0U^+m0$VaLkfq?@q@ryA zC*n~y4Fo$K8xw2UXs1<7T2rqpbfC5y+d380!X`D%7y~r60jgHEQBj1@{&TJgq|iyb z*8R@^fB%2J^FFo*_OO8$*q)s&z5n@qF_O=D@IohZ0!>6{Ci!9~l>vGO=mk8==73eX zqiMi9d(Tw4=TY_o85sbkS@stCTn7Oc`RN@%o+#uKMLV0|c)5|N0KHA(o2=MAK$g^N z7QbKx_Jd?m19(iFV@25mq$r=q=;g4XZU!)10xYYHn74XzoiR6OhIWJTgngvFvhV^0j*pNdujr{5XS_{&}GIJ8j3ajHuK+RPQ5Y(yf<4+Ov_`22&Z)~u`7|BVD23O zswS(aP-({U|3@tI3o$EdsGcG0-b!C!R53SX#dhkZBN6ugj4`M9-1lSeXxJChuu#<+ zN^f}(osuzzzSBlm#=UL$s1392SHFb6{3U#u|G_$4{>s$RPC|~MU!-Mah`0RtEFgyc zYgvkD%&a22C-Y^pGqOzkfHJ(7`!7TU>Noaf`&X|X+fT0DoUZ>BC;Q7$L;A<8p1 zL+lcDN_8_cm`QTfSH<|;=*dYk{j#DZI&pOUX+w?CsHWtx8j4vlsu8DcZHiRh6_G3O zK6NBj?bsM4d_hDphet)wTdd~75*<&a&sx#rwFc=BI-E&$Jz7EPE+bY*vmMN*2ptih zEzMRb&ga;~J2|fS6eIQ*5{x$A6HJ4q$F57ZlvtY0R7q5mMv?%vL;ZFrsjcTyz1G`) z3y>=hsRL)BrBuLfPCv&K489?UBu||=Nwg|-tYh|6^kj^kB}v7mr;1Or^F&YX`1(Dx zCdFHTTU6dM$ZqS4b**31E7fjzfez9wUebo8v=8K37tdJ|rjcMR`90!vZq`idK5mxO zz)u^6OzI#=NA*V@rg`+r3UrUi4XQ+FBr4Y?OHq;+jtjn-yK#b0L&Cb>s^OgVB;j?1 zUYoS56}Bi`sc?(J{R&UpUbktur10O0acQzvomQr;!9u#|G{m*9Y8qZrcwDhWN9F#zjN^qIfoq*n?wukygeD(|eyhJ4sKXScDZ34zf~c+C07QA^-7~-X)Y8Ne~SQwy5#*RelxJDM=fth?YHFsUE z5(cvhm~1>aNqYNmguj9imMd=%XZc}N<2~i=z$bhNlkwN2cT;(kOwSJJ78%P+dOk~t zyyeOpM3H4G-Knn0Dl?8M%Nv-A6Q+w=3Qk8rZWEFTlUIvPNpC61)ZmsiKw~}5z zd5@rOidpXy9>Pp)N_slQ8gVS??Iy1Yi>I2I@dK9Qn1!Ici>SfFw=39Tw>Q#bk8 z%ubal>slTVjocUgx?-fh1ybLt^lfp~fTkpLNKpf_GQ$RiX0J_rPBF4cIu(RGIcE>< zG*fC^>C;(K`DWdFae?W`sbI-*n6}C9ypR8u5;8k<+p=8)K2R9o;X3_+fwqYB?u z_N{G4GK3BM)XZ=I=bWfYO1`Er1P*{ zA3`?!zV1M)5-L>KiXZ82VqVwZVy!q%(Lz?h-X{B`{##bfU<|YA#Qd2xvK-?Q3zK~c zt!$BTg|)I}#;1yLAk0=7pOM{TfVZ=L;}kKwjkv~J**+tcGxnNs8(r**5$4x$%?Qy3 z@Zf2}bUa6xg*agzwh;#K4Z`u*O&ElrFBT_u@+$anhAX6{@Q>1$lo+0z$^^(LN} zu#I`=NBTBKW8HJ^;YWhQ*4b^(_Vz{ARn3aVB1qcvy4G*N?DbEti^Mv=_EZGnyLLx4 z7DwlG_4c8yuQS%y`$SjYTKbhBJXJY~4=WF)c+witOxNK;ET+3{5!whf4>e^C(<7MC)*p+{|gjiM=1aR delta 3043 zcma)84RBOf75>hByYFo_n>E=ao9t#oHf(;D{Qp2934tVRAU{+SLR%V62{d-x5>8 zboyrQchC2o^UgW%-TQvV9;LBKn*3(Z^w@{%kvh&n6sJ=<(8hvkizfzo4)cif05Y{L z0EectVZij%>owjxIr=u`i37_Fxn)%jXY(+x`VtV5#iB}Xq;mHQD_IKjXp`TfNLrjN zm9InojEd66*x~|ME#IPrfoWBrk1iepPV8s`j+X!=pXgXB`^0$)BpZy|T@;p&q&L$7 zd73dI4No(b$Q7Pu+3K-m!n28rf^k&O{#k?*$oHLu!W z6{?k+W*2YdjSTD<>E$KKi{|l?K-da-WjGWnzb?4QdwsC2$RokR^{UeooS1h8@0gLH zd9hmA$8yjvwJX8}-7toEC%dy9m3R0Y(NZ?kAx2fN)^LTqvmkm?xof1J8;lmR&;K!H zJF}eCSuicF4wtbCRH}!C&#zXgRKTQstsu|~%2ZFxV(dPI&vAra2zB+GUp4vaye75s zpZ_;$w_%bwN_w)9T4D22my6>)CDs{{UlyH&AEd#i_SiL3KUUN%# zjOVW~kIBbF`O8(GS4tb<=ckv=Dju9iH&@T|S{@xdc<-tn^)Pr=u?~4T)SY-(>=a%c zWi;`q;{k_>la9lTzt{M_MxRqDl^SCj2Q@yR@mZ&In)r>z-)iL@jfJM$ybJaG&NC4= z+e{N<8V{HkSosNKI-c*>?su7#!{9DWv|GwOtnnbD7ssrf!iP7lS1cbcGMc!|x(_)n za+#=bEpYkJ!?q9Oj54@jT_T^aFcZgdfR`m5HhY;_8mFsf-&R`4I8J3S%{H+Ow~lp* zA;z0EuGe^*#zBpDXuOA!uutsctowz^@RTT<&Gu`f41Hm~vDlmZ=Yn=hjOQ1T7q#%z zD)GCR5s#w|ZJLeajCd0Dn9*!6&WoqffYT{;DR$P_fL>Jb2TPSW%N5iXC;W|fwT%MrX#4#HPXZs! zI<9knX0Q5;3V0X^c^V^Hshnr?8;c_w84WZ$66*b^LY$q1Jwi}wO@6nM@$vu%4`h|QZl4qU7A5lc7P8N{)*1>S zWNlz2YHjAoDr+m_Qfo-#Fym@#H#K2x!Ww0=!McJFwpmXjK%_ zEcN36dyA=vo@4v4b%N^Yymf|}Sos~b(^c!w)XnxO^i!kj0`=2!*Wb0`MmKf3F0tM3 z`iM5t7hR`V8FnQ;=AipsmLQsPeZXs+iF+AyFv6IR`x!&{Dq|Sqj3xYJxDds+QNu64 z&7ua`_yJ=9jx$CyR%&e2dJCRseU(-QG;YG5SlJGTQG;E`s^MuALBcyVxk2`TF|hGo`)8BzDUGmIfRqZ_?!AvY1GIBRWCJV8xpbUTPG` z$=YDDulC7|q_fpa@w$(JE=`vQS8PlAR_2n+3M1E7 z%0Ck2ZHwfFw#Sm0?G{yE`_)$8!4QAdy7-^Cs|{E;5E}^W?f(4FU#yEAUU8^>&{4XF zlARqE`MxvAv8m%n$_`Hz`^EI&RB?`caMeB18*8C>vM2VOk=AGbX#a9$GOO!dnyRz@ E2Ufx6oB#j- diff --git a/bin/Debug/NetOpenVPNGUI.exe b/bin/Debug/NetOpenVPNGUI.exe index 8eb15dd442163dd4d310d8163af451a7ed1ac130..77ab21fff2c50694368861764930af91708de547 100644 GIT binary patch delta 88 zcmZqJ!q~8daY6^PRMpRo-4ne9)^u-(x_pw`acW%G_XA(TBRA{#aIokAWkVQ%fC-3Y o7#SFR@_;yifgvc^B{+P2+tac&nNCYhoBuIN8p&-=2w1=g0Nhd^KmY&$ delta 88 zcmZqJ!q~8daY6_4f`;!KyC-@J>^<4!apFOT|LVN|VOgBoD>m!+aIokAWkVQ%fC-3Y o7#SFR@_;yifgvc^C76BT1;I-{Z#m4lJ*m9%zKrGOgn$K{02h8CZU6uP diff --git a/bin/Debug/Utils.dll b/bin/Debug/Utils.dll index 8e8adf777efa7d76f5d54a245d6cea2cb85be6f4..25746952e54dc4f8aad99ce4a7fe5290c981df90 100644 GIT binary patch delta 4149 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 delta 3752 zcmb7H4Qv$G5uSPbZg+3b*uFCt8*JdtHpai;Grz`8AaGDj9AvN!;V;3&jsr0qVDoFY zXA?uf`~+(Y4Jm=9Er?P;DMqbBQ9%s_Q9)WaQ3{nHC`sLhL`jJn5m1CXZ|j3Gjgkk_j_kIatWQVme4h(!SZ z6rKL0xK@BT(kp0kn(Y_)_FNoheKMLTA6;YY4$Q-G_OEdmmfF`beZX0Ypgz;+65xPf z5d}yGK)Z9?*scmOsGn=9N}8JmA~e-rm+*RWGJv#nm!W010$5FyPQ;0pWc$s;p)t0N z-?iB@5-mM4!+tg~pVS15BdLV&^(f}sPq-gA&2TGKIn8h@rw(_C8BLZ-$&$mVg%VCu z-Ch7UGzKZ51)@2P$_u?rO251{9xc0_Bo`Q=O*CrvWRi5tf`yth!Bu z5!y`lB!|bbN<&zY{R(NT3?&UE3FLk6L?g6Cnfj3_C!5y8qR?AuV80M`(V~JVZ3jsz z*Z2*6eSLN?$rtX}4+&(0q(TRLL8DMri)Pi$eBF_JPv&7VSbD)@QBsqR>}?b!G?^D& zG^a#7Qy%hEwyD5Gm4U6c(Bx(3rl+XQGbZE^rD zIwslIybHsdie#^`R%SXSMDb{2)JjKd0ggWfA zRJhZO?^!DS6~=EF(_Mq~2x{^!>Tf^DAgzs7X)mNv*E3+M z9Y|@Ondgd=ZdmThmI%i*HzHhRG^LUQjPn?OBvVn>e}OY#cIz=Y0cW>%F`i;P!+1_k zu(biNXdjvD>>UH{@VIs0K^_CCTf<(LE;Hcw1ym4prjVD&grgA+=D83vK@L~8&1Sde zC2e9aH*z&jWDVfF;|(nfo{Vbe9F;NJd53T)+xVD-$`iq&ACG_@ zmiv>85Q_uY>SJEX2sz=%z_^u;JOMii5tK~k7;A*T%045QkCn$T6G6q(reQ20Uce-_ z23anDNDiw;MAF1oTER{cj4k5-m8&`Bd_oOg;Fv3!QH5$i)^e(J15<4=<}LTlAYs@4 z;2p4=tU5~>xj#UzKJjndD-V))n@?h&ON zw3LIEa?l`8*h)^DsQYSiCmNPYa|TNZ6RmGVId`ZN2U=NB#XjZSrv==ny*R~+(|(1| zTGPp@x)|j6eq3rLYbrvTR;8G*Simg`auJBDtS8C5-kL}g)N)iYUlo#GBR^+EvtDx3zXyqTPXg+>drpM{_% zCo@yYI3J!S<|SBbf0$nL)K2^%b?wi13;VECED|lEO&k=b#0}xsW@+=ZH?_-JueMnJ zL|XKF2YRfjWBe+kDU}>xoF@xyJ0owV38U%MN~9NhLH_Y{R0w)pYQ&7A6TyVBgh-l$ z_yod47*D5w3B`nTvp741XqGp$ea%7AQ;&2pQRt?C?&{am!enZ=^luuo;C$93Z|=td0}N_sWx&DecMy*;liwRSfZI;f=pUB`20>RAD(3PoQ0 zRFLP&n(CGnJ&;DSG$XXOYgoXQn_XN}gcY$Yg8pjVPbgz_zrs4H?MZ71`VRU^yvPZmF=rp9KP<=)G z!$l-`-K{%fin9J&pY%bJra)vHTslp?Upp86ovFfIV2>Dki(XCc|ASOFl19tiKz|7v z=+$6WWw3Josf}5y->N8k?a-aCH{1=}>?$8;qUWvXe?gi6?<(2X>3>X|t+qE7FX)ON Se^(PXMt8ZN_!2t{jsF1WONagd diff --git a/bin/Debug/config.ini b/bin/Debug/config.ini index d54f62d..4c594c2 100644 --- a/bin/Debug/config.ini +++ b/bin/Debug/config.ini @@ -4,4 +4,6 @@ client_from=54330 client_to=54340 [program] -openvpn=C:\Program Files\OpenVPN \ No newline at end of file +openvpn=C:\Program Files\OpenVPN +logfolder=E:\Programme\NetMonitor\logs +loglevel=Debug \ No newline at end of file diff --git a/bin/Debug/network.ini b/bin/Debug/network.ini index 8487cda..9d90440 100644 --- a/bin/Debug/network.ini +++ b/bin/Debug/network.ini @@ -7,7 +7,7 @@ Adapter=LAN-Verbindung [network2] Name=FHG -Ip=129.26.164.188 +Ip=129.26.164.222 Subnet=255.255.248.0 Gateway=129.26.160.1 Dns=129.26.165.177 @@ -19,8 +19,8 @@ Name=Test Ip=10.15.20.25 Subnet=255.255.255.0 Gateway=0.0.0.0 -Dns=none -Wins=none +Dns=0.0.0.0 +Wins=0.0.0.0 Adapter=LAN-Verbindung [network4] diff --git a/bin/Release/NetMonitorClient.exe b/bin/Release/NetMonitorClient.exe new file mode 100644 index 0000000000000000000000000000000000000000..73fb0cd80d4394bf4793641f0c63f14a6446d26f GIT binary patch literal 35840 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 literal 0 HcmV?d00001 diff --git a/bin/Release/NetMonitorConsole.exe b/bin/Release/NetMonitorConsole.exe new file mode 100644 index 0000000000000000000000000000000000000000..030169ae1d553ce0e2d22302847c6f60f00e3423 GIT binary patch literal 20992 zcmeHP34ByV(yup}nS=n51m#+gmmnID3<=>rBtXKUT#^8~qA8`4PXiH4xHdTf=fACLa}2IdnrWKupRu z3W4hZZ2(bE78K&pHIEM&Syl=HxURu~s3(i4XH--M&!hePuxu8xk*hONgStct;;;$( zr4%Ahea`XIp1SE)>Vm8&pEwc7n&wDNB8m@k*g(bc@pc{IlKSw%2lfEI7R_Io>Q$8Ml=<9$tl?9t_*?RZ~Ppc@ZPsHyKmu~?sq zXlgPe=Au4`Mx{ba@u`r(uAf03Uo$gmuV25u54IlfYtHCKAU#Wg1TLTksc4LTLq%v1% zBwo^Ws|CVAZSgJZrpHhkYC*M$_2R8f>$I^pjK4YFdVL#fgZP^*_2YFkr^Na&bfcu+ zj1n<+DN)N6vL>sqm04+w5A}rVxA+`pu&K)j%Z_j9FffSYgDicd+sy8(n{J^@$N)P_ zoCsvSHnlA>w^H>i@csZ4OKLk1eC>gZ4nXntAm@{rTQ-`A{^nYP@=e5T;xUS7Vk)K& zyZ$KZk-2;wWobXC3Y!g$hDmMPbndS(5t<3`r>8;da zqrj(o-1)84VVZ8Zecobvn!beync7FW^&Kf{4gdt2wA|waQ&il166 z=I#G>No-ty-Ky2fRx`UeZhp4Y@05XDcexg8wOpQ=$()&?2CR>4-$Cpj%4I8cyZoc= zqcwNYXw1rSaa_!NuHoYCF;9W00I4d!ReA}-5CfX(;LY*TFwJcUW6UAO+6vL}3K3+W z8vTFK0PMvAumbGgfB$_fpa#P63<%d`;PCy!G**#wjC>L;HRKL)F2%!tSsEyL5ZXFs}N!MtZ*d*ziE zUtPFx!OJhdymntAi)t(!M*?z*{i0e^X6{oJ`Pu6yxCh8NZ`?+?J2 z;m3G$8uO2qp=HaK(o@;BYv;EoP8=5(FMc7u_~L@NaN)c-f9|X}ceX;DtvDkp&YTu! zPM;K~PM#1ak?+Lu&&Bc2KNFvSb~M8K$e}}m;j>ex#L;8N#KDh07Ke825(l?!6Cb?& zw)k+#60!RE=c~vtZrnI5+eBNpZml?W?5Mc(_1EI-uf7t0``ee|%P%jAi(mYhJg3Cz zQzxtN|MHt}#MkJ+3Y7cwv(Ln#J$uB#jTuuSxW$=oK_UztWapA%R0Z&=z zx-Q0!9V^Pq%fl7lf{%NQ^W%gJRqh{ohqhHnLuwcQ=dM4ssPg#-Zxx=$$J<0aoFUao}MmwJOci2zrCWu z?Ek}u4@>^dnl%%*+;WSQ!Q{my)|6|9FN&bx*HInUR8{jrGZ|(!uN&EKgMeEkBMVmHlL}q5D)FbPXZRTh5 zf9N5xdey23|D#8bO8!Ynbw#I6oumxhPHvwm2g|^EXwjmD1n#R=ty)Pi`M+A^63fd= z#X9JB+Y8T&kC!eLM>lN}XZG(GUt(OCx_RiK8Dj04)e-)O4jrn%BWl!$kLcQzgZn>P z=iCQ3-E@;^+O(-iPEHmnDJhZm&%0xoSTx2hR!*ECHq4qScFdb6_ODzaKHs)goIP|{ zY{6J&8D`9wF4nJK8{z-Sfdds4XU+(V#Uk~|x;Fcqd! zyht40uwHDMFd@`_@ZYrY{fZ6Y`ET!@J>Y*@@@HL}w$AP3Fx#2i?Ur+oDTir;95?&_ ziH_~WvpGG*U-E{C*9u)?S^2n#E$n@3so01)$khLq&6_GVY}g>@zg@d_RbXwE{COT3 zGiHqJbLP!sf%{+rWWVR0dm=hu-LUPmY$pHTXE?-@T{?;9`t}y{?qpjS4O>x?tV#cwm`0%rus5 z^NJN$h3#{vi)b+IpY3n^wrvsq+qZ44fPW$R^Bl`#-sN(MwQJW3%njnsJMWYV)vWIFf#%9ShSI?HPuuRFZv zF|cj$`on7>uZf(-GMV!58er;&b;OXGnkuYTYlJt;!usD0n={-0-h1mSPGZgGG$+<7 zwgHB_?z&3?>;H~B?vOOr56i{!@cPFxu{_*wEYsyWVtw(Pk(ihmkzoeL-yV!PlmGg) zYb)Sa%5=_Gr%s(JaLqN>2on+#5=1oAu3cM1L#Vf^3{rmS-?A*Ci zj=#58t~mRz`hTAt`&1k~dPIDBoMW^;rAf76%R-5GMa6OWwG+efw5%^wT5a*wIg=U&;O@`g)a?$_0?BLU~TZc@y6n@OO`CTZ^@F^C%*pr>yzdLvbQan zW<>S?a=-cb<6>q(s+f=)+iS;;9p!McU@vqo%Out2PO>@jiwU3I4K-MhDR&YU@N9v(Szq|h`?`XnBY2m3a!2x8y%;Y%-x z!`S!mzH2AKYiG_BuT5}^KTR9;z`=tDN*_aAye9Da%D{UFp09b{W(fYyDc+qPlzWCP zfq-}peD1mDZn1p%TS4p*N_p?cYd^1V>>IQH!M+�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 literal 0 HcmV?d00001 diff --git a/bin/Release/NetMonitorServer.exe b/bin/Release/NetMonitorServer.exe new file mode 100644 index 0000000000000000000000000000000000000000..f3969a8c21be9ae417304d1f94ecae90a7d93ef3 GIT binary patch literal 34816 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 Mviz?I$E|_?2LoH2w*UYD literal 0 HcmV?d00001 diff --git a/bin/Release/NetMonitorTray.exe b/bin/Release/NetMonitorTray.exe new file mode 100644 index 0000000000000000000000000000000000000000..7f47c0f12e1286e826f5dee7474e3d79b6d32720 GIT binary patch literal 66560 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 literal 0 HcmV?d00001 diff --git a/bin/Release/NetMonitorUtils.dll b/bin/Release/NetMonitorUtils.dll new file mode 100644 index 0000000000000000000000000000000000000000..c129d41c2727770dc5a8b2d41ab119eec9b8dcba GIT binary patch literal 17920 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 literal 0 HcmV?d00001 diff --git a/bin/Release/NetOpenVPNGUI.exe b/bin/Release/NetOpenVPNGUI.exe new file mode 100644 index 0000000000000000000000000000000000000000..789a9e4267db1f39a8c9932cd14ccebf8107212e GIT binary patch literal 22528 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 k`>=jKCqQ6WKkoAJ1z#IsgCw literal 0 HcmV?d00001 diff --git a/bin/Release/Utils.dll b/bin/Release/Utils.dll new file mode 100644 index 0000000000000000000000000000000000000000..93d4b1de17789252c7c9ff35af2c353fc9a9dfb7 GIT binary patch literal 15872 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 E0kMfp(EtDd literal 0 HcmV?d00001 diff --git a/bin/Release/config.ini b/bin/Release/config.ini new file mode 100644 index 0000000..4c594c2 --- /dev/null +++ b/bin/Release/config.ini @@ -0,0 +1,9 @@ +[ports] +server=54323 +client_from=54330 +client_to=54340 + +[program] +openvpn=C:\Program Files\OpenVPN +logfolder=E:\Programme\NetMonitor\logs +loglevel=Debug \ No newline at end of file diff --git a/bin/Release/network.ini b/bin/Release/network.ini new file mode 100644 index 0000000..9d90440 --- /dev/null +++ b/bin/Release/network.ini @@ -0,0 +1,40 @@ +[network1] +Name=Home +Ip=auto +Dns=auto +Wins=auto +Adapter=LAN-Verbindung + +[network2] +Name=FHG +Ip=129.26.164.222 +Subnet=255.255.248.0 +Gateway=129.26.160.1 +Dns=129.26.165.177 +Wins=129.26.165.167 +Adapter=LAN-Verbindung + +[network3] +Name=Test +Ip=10.15.20.25 +Subnet=255.255.255.0 +Gateway=0.0.0.0 +Dns=0.0.0.0 +Wins=0.0.0.0 +Adapter=LAN-Verbindung + +[network4] +Name=Wlan Home +Ip=10.15.20.106 +Subnet=255.255.0.0 +Gateway=10.15.20.200 +Dns=10.15.20.243 +Wins=10.15.20.243 +Adapter=Drahtlosnetzwerkverbindung + +[network5] +Name=Wlan Auto +Ip=auto +Dns=auto +Wins=auto +Adapter=Drahtlosnetzwerkverbindung \ No newline at end of file diff --git a/bin/Release/vpn.ini b/bin/Release/vpn.ini new file mode 100644 index 0000000..5c31b15 --- /dev/null +++ b/bin/Release/vpn.ini @@ -0,0 +1,7 @@ +[openvpn1] +Name=FH +Config=wlanfb02.ovpn + +[openvpn2] +Name=Home +Config=home.ovpn_ \ No newline at end of file