diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..11a900b
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,10 @@
+################################################################################
+# 此 .gitignore 文件已由 Microsoft(R) Visual Studio 自动创建。
+################################################################################
+
+/packages
+/Ultron.Ngrok/bin
+/Ultron.Ngrok/obj
+/Ultron.Update/bin
+/Ultron.Update/obj
+/.vs/Ultron.Ngrok/v15/Server/sqlite3
diff --git a/.vs/Ultron.Ngrok/v15/.suo b/.vs/Ultron.Ngrok/v15/.suo
index 8cd851e..be6ac42 100644
Binary files a/.vs/Ultron.Ngrok/v15/.suo and b/.vs/Ultron.Ngrok/v15/.suo differ
diff --git a/Ultron.Ngrok.sln b/Ultron.Ngrok.sln
index 09705ee..f8da0c0 100644
--- a/Ultron.Ngrok.sln
+++ b/Ultron.Ngrok.sln
@@ -1,10 +1,12 @@
Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio 2013
-VisualStudioVersion = 12.0.21005.1
+# Visual Studio 15
+VisualStudioVersion = 15.0.28307.539
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Ultron.Ngrok", "Ultron.Ngrok\Ultron.Ngrok.csproj", "{D44A2DC3-FADD-47E7-A311-35C4B3404DFF}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Ultron.Update", "Ultron.Update\Ultron.Update.csproj", "{C11FF6DD-BABA-4D12-82A6-9DF1CFA3D8D9}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -15,8 +17,15 @@ Global
{D44A2DC3-FADD-47E7-A311-35C4B3404DFF}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D44A2DC3-FADD-47E7-A311-35C4B3404DFF}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D44A2DC3-FADD-47E7-A311-35C4B3404DFF}.Release|Any CPU.Build.0 = Release|Any CPU
+ {C11FF6DD-BABA-4D12-82A6-9DF1CFA3D8D9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {C11FF6DD-BABA-4D12-82A6-9DF1CFA3D8D9}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {C11FF6DD-BABA-4D12-82A6-9DF1CFA3D8D9}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {C11FF6DD-BABA-4D12-82A6-9DF1CFA3D8D9}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {78033F21-FBCD-499B-A09A-4D33E3F74647}
+ EndGlobalSection
EndGlobal
diff --git a/Ultron.Ngrok/Form/AboutBox.Designer.cs b/Ultron.Ngrok/Form/AboutBox.Designer.cs
index 81ca93a..4f11056 100644
--- a/Ultron.Ngrok/Form/AboutBox.Designer.cs
+++ b/Ultron.Ngrok/Form/AboutBox.Designer.cs
@@ -27,62 +27,41 @@
///
private void InitializeComponent()
{
- System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AboutBox));
this.tableLayoutPanel = new System.Windows.Forms.TableLayoutPanel();
- this.logoPictureBox = new System.Windows.Forms.PictureBox();
this.labelProductName = new System.Windows.Forms.Label();
this.labelVersion = new System.Windows.Forms.Label();
this.labelCopyright = new System.Windows.Forms.Label();
- this.textBoxDescription = new System.Windows.Forms.TextBox();
this.okButton = new System.Windows.Forms.Button();
this.tableLayoutPanel.SuspendLayout();
- ((System.ComponentModel.ISupportInitialize)(this.logoPictureBox)).BeginInit();
this.SuspendLayout();
//
// tableLayoutPanel
//
- this.tableLayoutPanel.ColumnCount = 2;
- this.tableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 33F));
- this.tableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 67F));
- this.tableLayoutPanel.Controls.Add(this.logoPictureBox, 0, 0);
- this.tableLayoutPanel.Controls.Add(this.labelProductName, 1, 0);
- this.tableLayoutPanel.Controls.Add(this.labelVersion, 1, 1);
- this.tableLayoutPanel.Controls.Add(this.labelCopyright, 1, 2);
- this.tableLayoutPanel.Controls.Add(this.textBoxDescription, 1, 4);
- this.tableLayoutPanel.Controls.Add(this.okButton, 1, 5);
+ this.tableLayoutPanel.ColumnCount = 1;
+ this.tableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));
+ this.tableLayoutPanel.Controls.Add(this.labelProductName, 0, 0);
+ this.tableLayoutPanel.Controls.Add(this.labelVersion, 0, 1);
+ this.tableLayoutPanel.Controls.Add(this.labelCopyright, 0, 2);
+ this.tableLayoutPanel.Controls.Add(this.okButton, 0, 3);
this.tableLayoutPanel.Dock = System.Windows.Forms.DockStyle.Fill;
this.tableLayoutPanel.Location = new System.Drawing.Point(9, 8);
this.tableLayoutPanel.Name = "tableLayoutPanel";
- this.tableLayoutPanel.RowCount = 6;
- this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 14.89362F));
- this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 16.31206F));
- this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 14.89362F));
- this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 6.382979F));
- this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 26.24113F));
- this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 24.11348F));
- this.tableLayoutPanel.Size = new System.Drawing.Size(417, 141);
+ this.tableLayoutPanel.RowCount = 4;
+ this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 25F));
+ this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 25F));
+ this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 25F));
+ this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 25F));
+ this.tableLayoutPanel.Size = new System.Drawing.Size(223, 100);
this.tableLayoutPanel.TabIndex = 0;
//
- // logoPictureBox
- //
- this.logoPictureBox.Dock = System.Windows.Forms.DockStyle.Fill;
- this.logoPictureBox.Image = ((System.Drawing.Image)(resources.GetObject("logoPictureBox.Image")));
- this.logoPictureBox.Location = new System.Drawing.Point(3, 3);
- this.logoPictureBox.Name = "logoPictureBox";
- this.tableLayoutPanel.SetRowSpan(this.logoPictureBox, 6);
- this.logoPictureBox.Size = new System.Drawing.Size(131, 135);
- this.logoPictureBox.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom;
- this.logoPictureBox.TabIndex = 12;
- this.logoPictureBox.TabStop = false;
- //
// labelProductName
//
this.labelProductName.Dock = System.Windows.Forms.DockStyle.Fill;
- this.labelProductName.Location = new System.Drawing.Point(143, 0);
+ this.labelProductName.Location = new System.Drawing.Point(6, 0);
this.labelProductName.Margin = new System.Windows.Forms.Padding(6, 0, 3, 0);
this.labelProductName.MaximumSize = new System.Drawing.Size(0, 16);
this.labelProductName.Name = "labelProductName";
- this.labelProductName.Size = new System.Drawing.Size(271, 16);
+ this.labelProductName.Size = new System.Drawing.Size(214, 16);
this.labelProductName.TabIndex = 19;
this.labelProductName.Text = "产品名称";
this.labelProductName.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
@@ -90,11 +69,11 @@
// labelVersion
//
this.labelVersion.Dock = System.Windows.Forms.DockStyle.Fill;
- this.labelVersion.Location = new System.Drawing.Point(143, 20);
+ this.labelVersion.Location = new System.Drawing.Point(6, 20);
this.labelVersion.Margin = new System.Windows.Forms.Padding(6, 0, 3, 0);
this.labelVersion.MaximumSize = new System.Drawing.Size(0, 16);
this.labelVersion.Name = "labelVersion";
- this.labelVersion.Size = new System.Drawing.Size(271, 16);
+ this.labelVersion.Size = new System.Drawing.Size(214, 16);
this.labelVersion.TabIndex = 0;
this.labelVersion.Text = "版本";
this.labelVersion.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
@@ -102,36 +81,22 @@
// labelCopyright
//
this.labelCopyright.Dock = System.Windows.Forms.DockStyle.Fill;
- this.labelCopyright.Location = new System.Drawing.Point(143, 42);
+ this.labelCopyright.Location = new System.Drawing.Point(6, 39);
this.labelCopyright.Margin = new System.Windows.Forms.Padding(6, 0, 3, 0);
this.labelCopyright.MaximumSize = new System.Drawing.Size(0, 16);
this.labelCopyright.Name = "labelCopyright";
- this.labelCopyright.Size = new System.Drawing.Size(271, 16);
+ this.labelCopyright.Size = new System.Drawing.Size(214, 16);
this.labelCopyright.TabIndex = 21;
this.labelCopyright.Text = "版权";
this.labelCopyright.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
- // textBoxDescription
- //
- this.textBoxDescription.Dock = System.Windows.Forms.DockStyle.Fill;
- this.textBoxDescription.Location = new System.Drawing.Point(143, 73);
- this.textBoxDescription.Margin = new System.Windows.Forms.Padding(6, 3, 3, 3);
- this.textBoxDescription.Multiline = true;
- this.textBoxDescription.Name = "textBoxDescription";
- this.textBoxDescription.ReadOnly = true;
- this.textBoxDescription.ScrollBars = System.Windows.Forms.ScrollBars.Both;
- this.textBoxDescription.Size = new System.Drawing.Size(271, 29);
- this.textBoxDescription.TabIndex = 23;
- this.textBoxDescription.TabStop = false;
- this.textBoxDescription.Text = "说明";
- //
// okButton
//
this.okButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.okButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
- this.okButton.Location = new System.Drawing.Point(339, 117);
+ this.okButton.Location = new System.Drawing.Point(145, 65);
this.okButton.Name = "okButton";
- this.okButton.Size = new System.Drawing.Size(75, 21);
+ this.okButton.Size = new System.Drawing.Size(75, 25);
this.okButton.TabIndex = 24;
this.okButton.Text = "确定(&O)";
this.okButton.Click += new System.EventHandler(this.okButton_Click);
@@ -141,7 +106,7 @@
this.AcceptButton = this.okButton;
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
- this.ClientSize = new System.Drawing.Size(435, 157);
+ this.ClientSize = new System.Drawing.Size(241, 116);
this.Controls.Add(this.tableLayoutPanel);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
this.MaximizeBox = false;
@@ -153,8 +118,6 @@
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
this.Text = "AboutBox";
this.tableLayoutPanel.ResumeLayout(false);
- this.tableLayoutPanel.PerformLayout();
- ((System.ComponentModel.ISupportInitialize)(this.logoPictureBox)).EndInit();
this.ResumeLayout(false);
}
@@ -162,11 +125,9 @@
#endregion
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel;
- private System.Windows.Forms.PictureBox logoPictureBox;
private System.Windows.Forms.Label labelProductName;
private System.Windows.Forms.Label labelVersion;
private System.Windows.Forms.Label labelCopyright;
- private System.Windows.Forms.TextBox textBoxDescription;
private System.Windows.Forms.Button okButton;
}
}
diff --git a/Ultron.Ngrok/Form/AboutBox.cs b/Ultron.Ngrok/Form/AboutBox.cs
index 5b50bd7..929c687 100644
--- a/Ultron.Ngrok/Form/AboutBox.cs
+++ b/Ultron.Ngrok/Form/AboutBox.cs
@@ -18,7 +18,6 @@ namespace Ultron.Ngrok
this.labelProductName.Text = AssemblyProduct;
this.labelVersion.Text = String.Format("版本 {0}", AssemblyVersion);
this.labelCopyright.Text = AssemblyCopyright;
- this.textBoxDescription.Text = AssemblyDescription;
}
#region 程序集特性访问器
diff --git a/Ultron.Ngrok/Form/AboutBox.resx b/Ultron.Ngrok/Form/AboutBox.resx
index 43d2af5..1af7de1 100644
--- a/Ultron.Ngrok/Form/AboutBox.resx
+++ b/Ultron.Ngrok/Form/AboutBox.resx
@@ -117,290 +117,4 @@
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
-
- 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
-
-
\ No newline at end of file
diff --git a/Ultron.Ngrok/Form/SettingForm.cs b/Ultron.Ngrok/Form/SettingForm.cs
index 492bb43..c3a2e1b 100644
--- a/Ultron.Ngrok/Form/SettingForm.cs
+++ b/Ultron.Ngrok/Form/SettingForm.cs
@@ -1,12 +1,10 @@
using System;
using System.Collections.Generic;
-using System.ComponentModel;
using System.Data;
-using System.Drawing;
using System.IO;
using System.Linq;
+using System.Reflection;
using System.Text;
-using System.Threading.Tasks;
using System.Windows.Forms;
using Ultron.Ngrok.Model;
using Ultron.Ngrok.Properties;
@@ -54,7 +52,7 @@ namespace Ultron.Ngrok
public void InitFile()
{
- string path = System.IO.Directory.GetCurrentDirectory();
+ string path = Directory.GetCurrentDirectory();
string ngrokFile = string.Empty;
if (Environment.Is64BitOperatingSystem)//判断是否为64位操作系统
{
@@ -80,12 +78,20 @@ namespace Ultron.Ngrok
}
}
+ public string AssemblyVersion
+ {
+ get
+ {
+ return Assembly.GetExecutingAssembly().GetName().Version.ToString();
+ }
+ }
+
///
/// 初始化配置文件
///
public void InitConfig()
{
- string path = System.IO.Directory.GetCurrentDirectory();
+ string path = Directory.GetCurrentDirectory();
ConfigFile = path + @"\ngrok.cfg";
if (!File.Exists(ConfigFile))
@@ -97,6 +103,7 @@ namespace Ultron.Ngrok
{
ServerAddr = "ngrok.aaqbee.com:8083",
TrustHostRootCerts = false,
+ Version = AssemblyVersion,
Tunnels = new Dictionary()
};
Tunnel httpTunnel = new Tunnel
@@ -131,6 +138,12 @@ namespace Ultron.Ngrok
var input = new StringReader(configText);
var deserializer = new Deserializer(namingConvention: new CamelCaseNamingConvention());
ServerConfig = deserializer.Deserialize(input);
+
+ if(ServerConfig.Version != AssemblyVersion)
+ {
+ ServerConfig.Version = AssemblyVersion;
+ SaveConfig();
+ }
}
this.tunnelListBox.DisplayMember = "TunnelName";
diff --git a/Ultron.Ngrok/FormMain.cs b/Ultron.Ngrok/FormMain.cs
index 9b2609c..4ce772a 100644
--- a/Ultron.Ngrok/FormMain.cs
+++ b/Ultron.Ngrok/FormMain.cs
@@ -1,45 +1,137 @@
using System;
-using System.Collections.Generic;
-using System.ComponentModel;
-using System.Data;
-using System.Drawing;
-using System.Linq;
using System.Text;
-using System.Threading.Tasks;
using System.Windows.Forms;
using System.Diagnostics;
using System.Reflection;
using System.Resources;
using System.Threading;
-using System.Text.RegularExpressions;
-using System.IO;
-using System.Net.NetworkInformation;
-using YamlDotNet.Serialization;
-using YamlDotNet.Serialization.NamingConventions;
using Ultron.Ngrok.Utils;
-using Ultron.Ngrok.Model;
+using System.Net;
+using System.IO;
using Ultron.Ngrok.Properties;
namespace Ultron.Ngrok
{
public partial class FormMain : Form
{
- CmdUtils cmd = new CmdUtils();
+ #region 属性
- SettingForm setting;
+ ///
+ /// 命令行
+ ///
+ public CmdUtils cmd { get; set; }
+ ///
+ /// 设置
+ ///
+ public SettingForm setting { get; set; }
+
+ ///
+ /// 数据集名称
+ ///
+ public string AssemblyProduct
+ {
+ get
+ {
+ object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyProductAttribute), false);
+ if (attributes.Length == 0)
+ {
+ return "";
+ }
+ return ((AssemblyProductAttribute)attributes[0]).Product;
+ }
+ }
+
+ ///
+ /// 数据集版本
+ ///
+ public string AssemblyVersion
+ {
+ get
+ {
+ return Assembly.GetExecutingAssembly().GetName().Version.ToString();
+ }
+ }
+
+ #endregion
+
+ #region 初始化
+
+ ///
+ /// 构造
+ ///
public FormMain()
{
//引用资源处理
AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
- //初始化
+ //初始化界面
InitializeComponent();
//初始化配置
InitSetting();
}
+ ///
+ /// 窗体Load
+ ///
+ ///
+ ///
+ private void FormMain_Load(object sender, EventArgs e)
+ {
+ //进程检测
+ CheckProcessAndKill(setting.ExeFile);
+
+ //初始化CMD
+ new Thread(new ThreadStart(InitCmd)).Start();
+
+ //检查更新
+ new Thread(new ThreadStart(CheckUpdateAsync)).Start();
+ }
+
+ #endregion
+
+ #region 事件
+
+ private void startBtn_Click(object sender, EventArgs e)
+ {
+ //网络检测
+ NetworkUtils.CheckServeStatus(this);
+ cmd.SendMsg(setting.ExecuteCommand);
+
+ startBtn.Enabled = false;
+ endBtn.Enabled = true;
+ }
+
+ private void endBtn_Click(object sender, EventArgs e)
+ {
+ CheckProcessAndKill(setting.ExeFile);
+ cmd.CloseCmd();
+ startBtn.Enabled = true;
+ endBtn.Enabled = false;
+ }
+
+ private void 设置ToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ setting.ReLoadConfig();
+ setting.ShowDialog();
+ }
+
+ private void 帮助ToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ Process.Start("explorer.exe", "http://git.iwangyu.cn/wixy/Ultron.Ngrok/wiki");
+ }
+
+ private void 关于ToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ AboutBox about = new AboutBox();
+ about.ShowDialog();
+ }
+
+ #endregion
+
+ #region 方法
+
Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
string dllName = args.Name.Contains(",") ? args.Name.Substring(0, args.Name.IndexOf(',')) : args.Name.Replace(".dll", "");
@@ -78,47 +170,25 @@ namespace Ultron.Ngrok
setting.WriteLogToForm += WriteLog;
}
- private void InitCmd() {
+ public void InitCmd()
+ {
//创建CMD
+ cmd = new CmdUtils();
cmd.ProcessMessageEvent += DealMessage;
cmd.ProcessKilled += cmd_Exited;
}
-
- private void startBtn_Click(object sender, EventArgs e)
- {
- //网络检测
- NetworkUtils.CheckServeStatus(this);
- cmd.SendMsg(setting.ExecuteCommand);
- startBtn.Enabled = false;
- endBtn.Enabled = true;
- }
-
- private void endBtn_Click(object sender, EventArgs e)
+ ///
+ /// 检查更新
+ ///
+ public void CheckUpdateAsync()
{
- CheckProcessAndKill(setting.ExeFile);
- cmd.CloseCmd();
- startBtn.Enabled = true;
- endBtn.Enabled = false;
+ string checkUrl = "https://blog.wixy.cn/api/release/" + AssemblyProduct + "/" + AssemblyVersion;
+ checkUrl = "https://blog.wixy.cn/api/release/NisStartTool/0.0.1";
+ HttpGet(checkUrl);
}
- private void 关于ToolStripMenuItem_Click(object sender, EventArgs e)
- {
- AboutBox about = new AboutBox();
- about.ShowDialog();
- }
-
- private void FormMain_Load(object sender, EventArgs e)
- {
- //进程检测
- CheckProcessAndKill(setting.ExeFile);
-
- //初始化CMD
- new Thread(new ThreadStart(InitCmd)).Start();
-
- }
-
- public void DealMessage(int proId,string message)
+ public void DealMessage(int proId, string message)
{
if (message.StartsWith("Server failed to allocate tunnel"))
{
@@ -168,14 +238,52 @@ namespace Ultron.Ngrok
endBtn.Enabled = false;
}
- private void 设置ToolStripMenuItem_Click(object sender, EventArgs e)
+ public void HttpGet(string url)
{
- setting.ReLoadConfig();
- setting.ShowDialog();
+ WebClient wc = new WebClient();
+ Uri uri = new Uri(url, UriKind.RelativeOrAbsolute);
+ wc.OpenReadCompleted += new OpenReadCompletedEventHandler(wc_OpenReadCompleted);
+ wc.OpenReadAsync(uri);
}
- private void 帮助ToolStripMenuItem_Click(object sender, EventArgs e)
+ public void wc_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
{
+ StreamReader read = new StreamReader(e.Result);
+ string str = read.ReadToEnd();
+ if (str.Contains("\"code\":1"))
+ return;
+ else
+ {
+ if (MessageBox.Show("检测到新版本,立即更新?", "版本更新", MessageBoxButtons.YesNo) == DialogResult.Yes)
+ {
+ int verStart = str.IndexOf("\"version\":\"") + 11;
+ int verEnd = str.IndexOf("\",\"title\"");
+ string version = str.Substring(verStart, verEnd - verStart);
+ string updateExe = Directory.GetCurrentDirectory() + @"\autoUpdate.exe";
+ if (File.Exists(updateExe))
+ {
+ File.Delete(updateExe);
+ }
+
+ FileStream stream = new FileStream(updateExe, FileMode.OpenOrCreate);
+ stream.Write(Resources.autoUpdate, 0, Resources.autoUpdate.Length);
+ stream.Close();
+
+ RunUpdateProgram(version);
+ }
+ }
}
+
+ public void RunUpdateProgram(string verion)
+ {
+ Application.Exit();
+ ProcessStartInfo startInfo = new ProcessStartInfo();
+ startInfo.FileName = "autoUpdate.exe";
+ startInfo.Arguments = "https://cloud-disk-1251608065.cos.ap-guangzhou.myqcloud.com/uNgrok_" + verion + ".exe" + " uNgrok.exe";
+ startInfo.WindowStyle = ProcessWindowStyle.Normal;
+ Process.Start(startInfo);
+ }
+
+ #endregion
}
}
diff --git a/Ultron.Ngrok/Properties/Resources.Designer.cs b/Ultron.Ngrok/Properties/Resources.Designer.cs
index 61f5f95..fde35fd 100644
--- a/Ultron.Ngrok/Properties/Resources.Designer.cs
+++ b/Ultron.Ngrok/Properties/Resources.Designer.cs
@@ -19,7 +19,7 @@ namespace Ultron.Ngrok.Properties {
// 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。
// 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen
// (以 /str 作为命令选项),或重新生成 VS 项目。
- [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources {
@@ -47,7 +47,7 @@ namespace Ultron.Ngrok.Properties {
}
///
- /// 使用此强类型资源类,为所有资源查找
+ /// 重写当前线程的 CurrentUICulture 属性
/// 重写当前线程的 CurrentUICulture 属性。
///
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
@@ -60,6 +60,16 @@ namespace Ultron.Ngrok.Properties {
}
}
+ ///
+ /// 查找 System.Byte[] 类型的本地化资源。
+ ///
+ internal static byte[] autoUpdate {
+ get {
+ object obj = ResourceManager.GetObject("autoUpdate", resourceCulture);
+ return ((byte[])(obj));
+ }
+ }
+
///
/// 查找 System.Byte[] 类型的本地化资源。
///
diff --git a/Ultron.Ngrok/Properties/Resources.resx b/Ultron.Ngrok/Properties/Resources.resx
index 05a859a..038321e 100644
--- a/Ultron.Ngrok/Properties/Resources.resx
+++ b/Ultron.Ngrok/Properties/Resources.resx
@@ -127,4 +127,7 @@
..\Resources\YamlDotNet.dll;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+ ..\Resources\autoUpdate.exe;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
\ No newline at end of file
diff --git a/Ultron.Ngrok/Resources/autoUpdate.exe b/Ultron.Ngrok/Resources/autoUpdate.exe
new file mode 100644
index 0000000..589b54e
Binary files /dev/null and b/Ultron.Ngrok/Resources/autoUpdate.exe differ
diff --git a/Ultron.Ngrok/Ultron.Ngrok.csproj b/Ultron.Ngrok/Ultron.Ngrok.csproj
index 9f28079..93616fa 100644
--- a/Ultron.Ngrok/Ultron.Ngrok.csproj
+++ b/Ultron.Ngrok/Ultron.Ngrok.csproj
@@ -89,6 +89,7 @@
SettingForm.cs
+
AboutBox.cs
@@ -149,6 +150,7 @@
+
diff --git a/Ultron.Ngrok/Utils/HttpUtils.cs b/Ultron.Ngrok/Utils/HttpUtils.cs
new file mode 100644
index 0000000..f8add4f
--- /dev/null
+++ b/Ultron.Ngrok/Utils/HttpUtils.cs
@@ -0,0 +1,102 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.IO.Compression;
+using System.Linq;
+using System.Net;
+using System.Net.NetworkInformation;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+using System.Xml.Linq;
+
+namespace Ultron.Ngrok.Utils
+{
+ public class HttpUtils
+ {
+ public static void HttpGet(string url)
+ {
+ WebClient wc = new WebClient();
+ Uri uri = new Uri(url, UriKind.RelativeOrAbsolute);
+ wc.OpenReadCompleted += new OpenReadCompletedEventHandler(wc_OpenReadCompleted);
+ wc.OpenReadAsync(uri);
+ }
+ public static void wc_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
+ {
+ StreamReader read = new StreamReader(e.Result);
+ string str = read.ReadToEnd();
+ }
+
+ public static void HttpPostAsync(string url,string postData)
+ {
+ HttpWebRequest request = HttpWebRequest.Create(url) as HttpWebRequest;
+ request.Timeout = 30000;
+ request.Method = "post"; ;
+ request.ContentType = "application/json;charset=UTF-8";
+ StatePara para = new StatePara
+ {
+ RequestInfo = request,
+ PostData = postData
+ };
+ request.BeginGetRequestStream(GetRequestStreamCallback, para);
+ }
+
+ private static void GetRequestStreamCallback(IAsyncResult asyncResult)
+ {
+ StatePara para = (StatePara)asyncResult.AsyncState;
+ try
+ {
+ para.RequestInfo.BeginGetResponse(GetResponseCallback, para);
+ }
+ catch (Exception ex)
+ {
+ string retString = ex.Message;
+ }
+ }
+ private static void GetResponseCallback(IAsyncResult asyncResult)
+ {
+ string retString = "";
+ StatePara para = (StatePara)asyncResult.AsyncState;
+ IAsyncResult IAResult = para.RequestInfo as IAsyncResult;
+ try
+ {
+ HttpWebRequest request = para.RequestInfo;
+ HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(asyncResult);
+
+
+ if (response.ContentEncoding.ToLower().Contains("gzip"))
+ {
+ using (var gzip = new GZipStream(response.GetResponseStream(), CompressionMode.Decompress))
+ {
+
+ var reader = new StreamReader(gzip, Encoding.GetEncoding("utf-8"));
+ retString = reader.ReadToEnd();
+ reader.Close();
+ }
+ }
+ else
+ {
+ Stream myResponseStream = response.GetResponseStream();
+ StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("utf-8"));
+ retString = myStreamReader.ReadToEnd();
+ myStreamReader.Close();
+ myResponseStream.Close();
+ }
+ }
+ catch (Exception ex)
+ {
+ retString = ex.Message;
+ }
+ }
+
+ class StatePara
+ {
+ public HttpWebRequest RequestInfo { get; set; }
+
+ public string PostData { get; set; }
+
+ public string ServerType { get; set; }
+
+ }
+ }
+}
diff --git a/Ultron.Update/App.config b/Ultron.Update/App.config
new file mode 100644
index 0000000..8e15646
--- /dev/null
+++ b/Ultron.Update/App.config
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Ultron.Update/Program.cs b/Ultron.Update/Program.cs
new file mode 100644
index 0000000..e9e3415
--- /dev/null
+++ b/Ultron.Update/Program.cs
@@ -0,0 +1,28 @@
+using System;
+using System.Diagnostics;
+using System.IO;
+using System.Windows.Forms;
+
+namespace Ultron.Update
+{
+ static class Program
+ {
+ ///
+ /// 应用程序的主入口点。
+ ///
+ [STAThread]
+ static void Main(string[] args)
+ {
+ Application.EnableVisualStyles();
+ Application.SetCompatibleTextRenderingDefault(false);
+ if (args.Length == 0)
+ {
+ Application.Run(new UpdateForm());
+ }
+ else
+ {
+ Application.Run(new UpdateForm(args));
+ }
+ }
+ }
+}
diff --git a/Ultron.Update/Properties/AssemblyInfo.cs b/Ultron.Update/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..74dc06c
--- /dev/null
+++ b/Ultron.Update/Properties/AssemblyInfo.cs
@@ -0,0 +1,36 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// 有关程序集的一般信息由以下
+// 控制。更改这些特性值可修改
+// 与程序集关联的信息。
+[assembly: AssemblyTitle("Ultron.Update")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("Ultron.Update")]
+[assembly: AssemblyCopyright("Copyright © 2019")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// 将 ComVisible 设置为 false 会使此程序集中的类型
+//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型
+//请将此类型的 ComVisible 特性设置为 true。
+[assembly: ComVisible(false)]
+
+// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
+[assembly: Guid("c11ff6dd-baba-4d12-82a6-9df1cfa3d8d9")]
+
+// 程序集的版本信息由下列四个值组成:
+//
+// 主版本
+// 次版本
+// 生成号
+// 修订号
+//
+// 可以指定所有值,也可以使用以下所示的 "*" 预置版本号和修订号
+// 方法是按如下所示使用“*”: :
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/Ultron.Update/Properties/Resources.Designer.cs b/Ultron.Update/Properties/Resources.Designer.cs
new file mode 100644
index 0000000..3e62cdc
--- /dev/null
+++ b/Ultron.Update/Properties/Resources.Designer.cs
@@ -0,0 +1,71 @@
+//------------------------------------------------------------------------------
+//
+// 此代码由工具生成。
+// 运行时版本: 4.0.30319.42000
+//
+// 对此文件的更改可能导致不正确的行为,如果
+// 重新生成代码,则所做更改将丢失。
+//
+//------------------------------------------------------------------------------
+
+namespace Ultron.Update.Properties
+{
+
+
+ ///
+ /// 强类型资源类,用于查找本地化字符串等。
+ ///
+ // 此类是由 StronglyTypedResourceBuilder
+ // 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。
+ // 若要添加或删除成员,请编辑 .ResX 文件,然后重新运行 ResGen
+ // (以 /str 作为命令选项),或重新生成 VS 项目。
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ internal class Resources
+ {
+
+ private static global::System.Resources.ResourceManager resourceMan;
+
+ private static global::System.Globalization.CultureInfo resourceCulture;
+
+ [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+ internal Resources()
+ {
+ }
+
+ ///
+ /// 返回此类使用的缓存 ResourceManager 实例。
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Resources.ResourceManager ResourceManager
+ {
+ get
+ {
+ if ((resourceMan == null))
+ {
+ global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Ultron.Update.Properties.Resources", typeof(Resources).Assembly);
+ resourceMan = temp;
+ }
+ return resourceMan;
+ }
+ }
+
+ ///
+ /// 覆盖当前线程的 CurrentUICulture 属性
+ /// 使用此强类型的资源类的资源查找。
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Globalization.CultureInfo Culture
+ {
+ get
+ {
+ return resourceCulture;
+ }
+ set
+ {
+ resourceCulture = value;
+ }
+ }
+ }
+}
diff --git a/Ultron.Update/Properties/Resources.resx b/Ultron.Update/Properties/Resources.resx
new file mode 100644
index 0000000..af7dbeb
--- /dev/null
+++ b/Ultron.Update/Properties/Resources.resx
@@ -0,0 +1,117 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/Ultron.Update/Properties/Settings.Designer.cs b/Ultron.Update/Properties/Settings.Designer.cs
new file mode 100644
index 0000000..aa69ce5
--- /dev/null
+++ b/Ultron.Update/Properties/Settings.Designer.cs
@@ -0,0 +1,30 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Runtime Version:4.0.30319.42000
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+namespace Ultron.Update.Properties
+{
+
+
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")]
+ internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase
+ {
+
+ private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
+
+ public static Settings Default
+ {
+ get
+ {
+ return defaultInstance;
+ }
+ }
+ }
+}
diff --git a/Ultron.Update/Properties/Settings.settings b/Ultron.Update/Properties/Settings.settings
new file mode 100644
index 0000000..3964565
--- /dev/null
+++ b/Ultron.Update/Properties/Settings.settings
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/Ultron.Update/Ultron.Update.csproj b/Ultron.Update/Ultron.Update.csproj
new file mode 100644
index 0000000..4a13fbc
--- /dev/null
+++ b/Ultron.Update/Ultron.Update.csproj
@@ -0,0 +1,88 @@
+
+
+
+
+ Debug
+ AnyCPU
+ {C11FF6DD-BABA-4D12-82A6-9DF1CFA3D8D9}
+ WinExe
+ Ultron.Update
+ autoUpdate
+ v4.5
+ 512
+ true
+
+
+ AnyCPU
+ true
+ full
+ false
+ bin\Debug\
+ DEBUG;TRACE
+ prompt
+ 4
+
+
+ AnyCPU
+ pdbonly
+ true
+ bin\Release\
+ TRACE
+ prompt
+ 4
+
+
+ favicon.ico
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Form
+
+
+ UpdateForm.cs
+
+
+
+
+ UpdateForm.cs
+
+
+ ResXFileCodeGenerator
+ Resources.Designer.cs
+ Designer
+
+
+ True
+ Resources.resx
+
+
+ SettingsSingleFileGenerator
+ Settings.Designer.cs
+
+
+ True
+ Settings.settings
+ True
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Ultron.Update/UpdateForm.Designer.cs b/Ultron.Update/UpdateForm.Designer.cs
new file mode 100644
index 0000000..d5884d5
--- /dev/null
+++ b/Ultron.Update/UpdateForm.Designer.cs
@@ -0,0 +1,90 @@
+namespace Ultron.Update
+{
+ partial class UpdateForm
+ {
+ ///
+ /// 必需的设计器变量。
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// 清理所有正在使用的资源。
+ ///
+ /// 如果应释放托管资源,为 true;否则为 false。
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows 窗体设计器生成的代码
+
+ ///
+ /// 设计器支持所需的方法 - 不要修改
+ /// 使用代码编辑器修改此方法的内容。
+ ///
+ private void InitializeComponent()
+ {
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(UpdateForm));
+ this.progressBar1 = new System.Windows.Forms.ProgressBar();
+ this.label1 = new System.Windows.Forms.Label();
+ this.label2 = new System.Windows.Forms.Label();
+ this.SuspendLayout();
+ //
+ // progressBar1
+ //
+ this.progressBar1.Location = new System.Drawing.Point(12, 12);
+ this.progressBar1.Name = "progressBar1";
+ this.progressBar1.Size = new System.Drawing.Size(233, 23);
+ this.progressBar1.TabIndex = 0;
+ //
+ // label1
+ //
+ this.label1.AutoSize = true;
+ this.label1.Location = new System.Drawing.Point(119, 45);
+ this.label1.Name = "label1";
+ this.label1.Size = new System.Drawing.Size(29, 12);
+ this.label1.TabIndex = 1;
+ this.label1.Text = "进度";
+ //
+ // label2
+ //
+ this.label2.AutoSize = true;
+ this.label2.Location = new System.Drawing.Point(12, 45);
+ this.label2.Name = "label2";
+ this.label2.Size = new System.Drawing.Size(29, 12);
+ this.label2.TabIndex = 2;
+ this.label2.Text = "提示";
+ this.label2.Visible = false;
+ //
+ // UpdateForm
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(257, 65);
+ this.Controls.Add(this.label2);
+ this.Controls.Add(this.label1);
+ this.Controls.Add(this.progressBar1);
+ this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
+ this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+ this.MaximizeBox = false;
+ this.MinimizeBox = false;
+ this.Name = "UpdateForm";
+ this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
+ this.Text = "自动更新";
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.ProgressBar progressBar1;
+ private System.Windows.Forms.Label label1;
+ private System.Windows.Forms.Label label2;
+ }
+}
+
diff --git a/Ultron.Update/UpdateForm.cs b/Ultron.Update/UpdateForm.cs
new file mode 100644
index 0000000..7bcd6aa
--- /dev/null
+++ b/Ultron.Update/UpdateForm.cs
@@ -0,0 +1,142 @@
+using System;
+using System.Diagnostics;
+using System.IO;
+using System.Net;
+using System.Windows.Forms;
+
+namespace Ultron.Update
+{
+ public partial class UpdateForm : Form
+ {
+ public string ExecuteFile { get; set; }
+
+ public UpdateForm()
+ {
+ InitializeComponent();
+
+ string fileVersion;
+ if (File.Exists("uNgrok.exe"))
+ {
+ try
+ {
+ FileVersionInfo file1 = FileVersionInfo.GetVersionInfo("uNgrok.exe");
+ fileVersion = string.Format("{0}.{1}.{2}.{3}", file1.FileMajorPart, file1.FileMinorPart, file1.FileBuildPart, file1.FilePrivatePart);
+ string checkUrl = "https://blog.wixy.cn/api/release/Ultron.Ngrok/" + fileVersion;
+ HttpGet(checkUrl);
+ }
+ catch (Exception)
+ {
+ fileVersion = "";
+ }
+ }
+ else
+ {
+ label1.Visible = false;
+ label2.Visible = true;
+ label2.Text = "未检测到uNgrok";
+ }
+ }
+
+ public UpdateForm(string[] args)
+ {
+ InitializeComponent();
+
+ ExecuteFile = args[1];
+
+ string updateFile = Directory.GetCurrentDirectory() + @"\"+ ExecuteFile;
+
+ if (File.Exists(updateFile))
+ File.Delete(updateFile);
+ if (File.Exists(Directory.GetCurrentDirectory() + @"\ngrok_x64.exe"))
+ File.Delete(Directory.GetCurrentDirectory() + @"\ngrok_x64.exe");
+ if (File.Exists(Directory.GetCurrentDirectory() + @"\ngrok_x86.exe"))
+ File.Delete(Directory.GetCurrentDirectory() + @"\ngrok_x86.exe");
+
+ DownLoadFile(args[0], args[1]);
+ }
+
+
+ public void HttpGet(string url)
+ {
+ WebClient wc = new WebClient();
+ Uri uri = new Uri(url, UriKind.RelativeOrAbsolute);
+ wc.OpenReadCompleted += new OpenReadCompletedEventHandler(wc_OpenReadCompleted);
+ wc.OpenReadAsync(uri);
+ }
+
+ public void wc_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
+ {
+ StreamReader read = new StreamReader(e.Result);
+ string str = read.ReadToEnd();
+ if (str.Contains("\"code\":1"))
+ {
+ label1.Visible = false;
+ label2.Visible = true;
+ label2.Text = "未检测到新版本";
+ return;
+ }
+ else
+ {
+ label2.Visible = false;
+ label1.Visible = true;
+ if (MessageBox.Show("检测到新版本,立即更新?", "版本更新", MessageBoxButtons.YesNo) == DialogResult.Yes)
+ {
+ int verStart = str.IndexOf("\"version\":\"") + 11;
+ int verEnd = str.IndexOf("\",\"title\"");
+ string version = str.Substring(verStart, verEnd - verStart);
+
+ DownLoadFile("https://cloud-disk-1251608065.cos.ap-guangzhou.myqcloud.com/uNgrok_" + version + ".exe", "uNgrok.exe");
+ }
+ }
+ }
+
+
+ private void DownLoadFile(string fileUrl,string fileName)
+ {
+ WebClient wc = new WebClient();
+ wc.DownloadProgressChanged += wc_DownloadProgressChanged;
+ wc.DownloadFileCompleted += Wc_DownloadFileCompleted;
+ wc.DownloadFileAsync(new Uri(fileUrl), fileName);
+ }
+
+ private void Wc_DownloadFileCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
+ {
+ label1.Text = "完成";
+ RunNewApp();
+ }
+
+ // int index = 0;
+ void wc_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
+ {
+ try
+ {
+ Action act = () =>
+ {
+ progressBar1.Value = e.ProgressPercentage;
+ label1.Text = e.ProgressPercentage + "%";
+ };
+ Invoke(act);
+ }
+ catch(Exception ex)
+ {
+
+ }
+ }
+
+ public void RunNewApp()
+ {
+ try
+ {
+ ProcessStartInfo startInfo = new ProcessStartInfo();
+ startInfo.FileName = "uNgrok.exe";
+ startInfo.WindowStyle = ProcessWindowStyle.Normal;
+ Process.Start(startInfo);
+ Application.Exit();
+ }
+ catch (Exception ex)
+ {
+
+ }
+ }
+ }
+}
diff --git a/Ultron.Update/UpdateForm.resx b/Ultron.Update/UpdateForm.resx
new file mode 100644
index 0000000..44a2792
--- /dev/null
+++ b/Ultron.Update/UpdateForm.resx
@@ -0,0 +1,408 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+
+
+ AAABAAEAQEAAAAEAIAAoQgAAFgAAACgAAABAAAAAgAAAAAEAIAAAAAAAAEAAABILAAASCwAAAAAAAAAA
+ AADdtIj/2aRr/9qocP/ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//2qhx/9iiZ//v2b//3bSI/9mka//aqHD/2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qocf/Yomf/79m//920iP/ZpGv/2qhw/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//aqHH/2KJn/+/Zv//dtIj/2aRr/9qo
+ cP/ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qhx/9ii
+ Z//v2b//3bSI/9mka//aqHD/2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qocf/Yomf/79m//920iP/ZpGv/2qhw/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnbv/ap27/2qdu/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qnb//aqHH/2KJn/+/Zv//dtIj/2aRr/9qocP/ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2aZu/9qnb//cqXP/3Kl0/9yp
+ dP/ap3D/2aZu/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qhx/9iiZ//v2b//3bSI/9mk
+ a//aqHD/2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2aZu/9yp
+ dP/bqHD/0qBc/9KfVv/Sn1r/2aZs/92qdv/apm//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qo
+ cf/Yomf/79m//920iP/ZpGv/2qhw/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//2aZu/92qdf/QnVf/uoUg/7J9Df+xfAn/sXsI/7aBFv/HlEL/26lz/9qncP/ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//aqHH/2KJn/+/Zv//dtIj/2aRr/9qocP/ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2aZt/96reP/Nl0n/rHMA/6txAP+scwD/r3YB/7N9C/+yfAr/rncB/8CN
+ Mf/bqHL/2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qhx/9iiZ//v2b//3bSI/9mka//aqHD/2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdu/9yqdf/SnFj/r3gG/72UO//Or2v/zK5p/76V
+ Pf+weQj/sHcE/7R/D/+tdwD/x5ND/92qdv/Zpm7/2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qocf/Yomf/79m//920
+ iP/ZpGv/2qhw/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qocP/bpW3/zKNe/+Xb
+ vv/////////+/////v//////6uHJ/7uPM/+vdQD/sn0K/7aAFv/Zpm7/2qdw/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//aqHH/2KJn/+/Zv//dtIj/2aRr/9qocP/ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qo
+ cf/Zo2n/3riL//r69v////////7+//79+//+/fv//v79///////4+PP/vZZA/692AP+yfAv/055c/9yp
+ c//ap27/2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qhx/9iiZ//v2b//3bSI/9mka//aqHD/2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2KZt//Ps3////////v37///////////////////////9/fr//////+/p
+ 1/+zfxL/r3kF/9KeWf/cqXT/2qdu/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qocf/Yomf/79m//920iP/ZpGv/2qhw/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qnb//aqHD/2aNp/9+5jf/9//////7+////////////////////
+ //////////////79+///////xaNZ/6tyAP/ToFz/3Kl0/9mnbv/ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//aqHH/2KJn/+/Z
+ v//dtIj/2aRr/9qocP/ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qhx/9ihZf/nyqf////////+
+ /f/////////////////////////////////+/fv//////9rDjf+pcQD/1KBd/9ypdP/ap27/2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//2qhx/9iiZ//v2b//3bSI/9mka//aqHD/2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9uo
+ cf/YoWX/5cmn///////+/v3//////////////////////////////////v37///////fypv/qnEA/9Sg
+ XP/cqXT/2adu/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qocf/Yomf/79m//920iP/ZpGv/2qhw/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//aqHH/16Fl/+XJp////////v79//////////////////////////////////79
+ +///////38qZ/6pxAP/UoFz/3Kl0/9mnbv/ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//aqHH/2KJn/+/Zv//dtIj/2aRr/9qo
+ cP/ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qhx/9ehZf/lyaf///////7+/f//////////////
+ ///////////////////+/fv//////9/Kmv+qcQD/1KBd/9ypdP/Zp27/2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qhx/9ii
+ Z//v2b//3bSI/9mka//aqHD/2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qocf/XoWX/5cmn////
+ ///+/v3//////////////////////////////////v37///////fypr/qnEA/9SgXf/cqXT/2adu/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qocf/Yomf/79m//920iP/ZpGv/2qhw/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//aqHH/16Fl/+XJp////////v79//////////////////////////////////79+///////38qa/6px
+ AP/UoF3/3Kl0/9mnbv/ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qnb//aqHH/2KJn/+/Zv//dtIj/2aRr/9qocP/ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qhx/9ehZf/lyaf///////7+/f//////////////////////////////
+ ///+/fv//////9/Kmv+qcQD/1KBd/9ypdP/Zp27/2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qhx/9iiZ//v2b//3bSI/9mk
+ a//aqHD/2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qocf/XoWX/5cmn///////+/v3/////////
+ /////////////////////////v37///////fypr/qnEA/9SgXf/cqXT/2adu/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qo
+ cf/Yomf/79m//920iP/ZpGv/2qhw/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//aqHH/16Fl/+XJ
+ p////////v79//////////////////////////////////79+///////38qa/6pxAP/UoF3/3Kl0/9mn
+ bv/ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//aqHH/2KJn/+/Zv//dtIj/2qVr/9qocP/ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//2qhx/9ehZf/lyaf///////7+/f/////////////////////////////////+/fv//////9/K
+ mv+qcQD/1KBd/9ypdP/Zp27/2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qhx/9iiZ//v2b//3bSH/9mkaf/ap3D/2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qocf/XoWX/5cmn///////+/v3/////////////////////////
+ /////////v37///////fypr/qnEA/9SgXf/cqXT/2adu/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qocf/Yomj/79m//963
+ jP/cqXL/2qhw/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//aqHH/16Fl/+XJp////////v79////
+ //////////////////////////////79+///////38qa/6pxAP/UoF3/3Kl0/9mnbv/ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//aqHH/2KJo/+/Zv//jwJn/4LSC/96xgP/ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qhx/9eh
+ Zf/lyaf///////7+/f/////////////////////////////////+/fv//////9/Kmv+qcQD/1KBd/9yp
+ dP/Zp27/2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//26hx/9iiaP/w28H/48CZ/9+ygP/htob/3q97/9mmbv/ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2aZu/9mm
+ bv/Zpm7/2qdu/9qocf/XoWX/5cmn///////+/v3//////////////////////////////////v37////
+ ///fypr/qnEA/9SgXf/cqXT/2adu/9qnb//ap27/2aZt/9mmbf/Zpm3/2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9mnb//bqnP/8uDK/+G/l//gs4H/4LWE/+G1
+ hf/cq3b/2qZu/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdu/9yqdf/dqnb/3ap3/9ypdf/aqHD/16Fl/+XJp////////v79////////////////////
+ //////////////79+///////38qa/6pxAP/UoF3/3Kl0/9qnbv/apm7/26hy/92qdv/dqnb/3ap2/9qn
+ cP/ap27/2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9mmbv/bq3b/37J+//Lf
+ yP/ctov/3rF+/+C2hf/gtYT/4LWD/9upcv/ap27/2qdv/9qnb//ap2//2qdu/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9ypc//MmE7/wo0v/8KNMP/Pm1T/3at4/9ehZP/lyaf///////7+
+ /f/////////////////////////////////+/fv//////9/Kmv+qcQD/1KBd/9ypdP/Zpmz/3Kl0/9ah
+ Yv/Ejzf/w40u/8eSQf/YpW3/2qhx/9qnbv/ap2//2qdv/9qnb//ap2//2qdu/9qnb//ap2//2qdv/9qn
+ bv/ZqHH/4LWE/9+xfv/y38j/37aL/9qpcf/gtoX/4LWE/+C2hf/fsoH/26Zw/9qnb//ap2//2qZu/9qo
+ cv/ap3D/2qdu/9qnb//ap2//2qdv/9qnb//ap2//2aZu/92rd//GkTz/rngD/7F7B/+veQX/r3kE/8iU
+ Q//bpG3/5cil///////+/v3//////////////////////////////////v37///////fypr/qnEA/9Sg
+ Xf/bqHL/3Kl0/9WiYf+0fg7/sHoF/7B7B/+ueAH/uIMe/9elav/aqHH/2qdu/9qnb//ap2//2qdu/9up
+ cv/Zpm7/2qdv/9qnb//apm7/3rGA/+G3hv/esX3/8t/I/+G4kP/bp2//3q55/+G2hf/gtYP/4LaG/96w
+ ff/apm7/2qZv/96ygf/jvZP/4biM/9qncf/ap27/2qdv/9qnb//ap2//2aZu/9yqdf/PmVL/q3IA/7B4
+ Bf+tdAD/snsJ/7N+Df+vegX/xo47/+jMrv///////v79//////////////////////////////////79
+ +///////38qa/6pxAP/ToFv/3qt5/9WhYf+wdwf/rXYC/652Av+vdgL/tH8P/654Af/Djzj/3ap2/9mm
+ bv/ap2//2qZv/+G3iP/kvZT/4LSG/9mnb//apm7/3a55/+G2hf/gtYX/3rF+//Hfx//gt47/3alz/9yp
+ c//esH3/4LaF/+C0g//gtob/3a14/9unb//jvZL/472U/+S/lv/gtYf/2aZt/9qnb//ap2//2qdv/9qn
+ cP/apW3/zqdp/+DSq//u5c3/2MOR/7OBGv+weAT/s38P/61zAP/Yu4r///////79/P//////////////
+ ///////////////////+/fv//////9/Kmv+qcAD/1aJi/9ymbf+4hSP/1LyE/+3kzf/k17X/wJpH/692
+ Av+yfAn/t4EY/9qmbv/aqHD/2qVt/+C0hP/kv5b/472T/+S+lf/cqXP/26p1/+G2hf/gtYT/4beH/9yt
+ eP/v2sD/4LeP/92pc//dq3j/26h0/+Czgf/gtoX/4LWE/+C2hP/bqXL/4LSF/+S/lv/ivJL/5L+W/96x
+ f//ZpW3/2qdw/9qocf/Yo2j/37yT//z9/P///////v79///////x6tj/t4Yf/7F7CP+udAD/yqtp////
+ ///+/fv//////////////////////////////////v37///////fypn/q3IA/9OeWv+7iS//6ODE////
+ ///+/v3////+///////JqWH/rnQA/7V/Fv/XpGr/2qZu/92ufP/kv5X/47yS/+O/lf/huIr/2qly/+C1
+ g//gtYT/4LWE/+C1hP/ZpGz/8NrB/+C3j//dqXP/3ax4/9yqdf/aqnT/4LWE/+C1hP/gtYX/4LOB/9mp
+ cv/iuo3/5L6U/+O9kv/kvpT/3Kx4/9mmbf/ap2//2ahx//Xv5v///////vz6//7+/f/9/Pn//////+nf
+ xv+vfBL/rHAA/8yub////////v37//////////////////////////////////79+///////38ua/61z
+ AP+6hiD/4da0///////9/Pn//v79//38+v//////8+/k/7B/Ef+9hiL/3Klz/9qqdf/jvZP/472T/+O9
+ lP/jvJH/26l0/9+yf//gtoX/4LWD/+C1hP/brHf/26Zu//Hbw//etor/3Khz/92reP/drHj/26l0/9ys
+ d//htoX/4LWD/+G2hf/esX7/3ap0/+S9kf/jvZT/472U/+O8kf/bqnT/2aNn/+C3i//+//////7+////
+ //////////////79+///////49m//6pxAP/Lq2r///////79+///////////////////////////////
+ ///+/fv//////9/Kmf+mawD/4NKs///////+/fv///////////////////79//////++l0L/zJVH/9yr
+ eP/huo3/476U/+O9k//kvpT/3at2/96ufP/htob/4LSD/+G2hf/drXj/3Kp1/9yncf/w28P/3LSI/9qn
+ bv/erHn/3at3/96seP/bqHP/3a57/+C2hv/gtIP/4baH/92uef/crXn/5L6W/+O8kv/kvpX/47qP/9mj
+ aP/guI3//////////v///////////////////////v37///////axpj/x6hl///////+/fz/////////
+ /////////////////////////v37///////axI7/1LyD///////+/fv/////////////////////////
+ /v/9////1rF+/9mjZ//htor/5L+W/+O8kv/kv5b/3q9+/9ysdv/gtob/4LSD/+G2hv/fsH7/3Khy/96s
+ ev/bp3D/8NvD/920iP/ZpGr/3Kp2/92reP/dq3f/3at3/9mnb//fsX//4LaF/+C1g//htob/3Kp1/96z
+ gv/kv5f/4ryS/+S/lv/fs4L/26x4//v38//////////+/////////////////////////v7//Pz7/+/r
+ 3v///////////////////////////////////////////////v//////8vDl//v69///////////////
+ /////////////////v//////+vn2/9yufP/fr33/5L+W/+O8kv/kv5b/37SF/9upc//gtoX/4LWE/+C1
+ hf/fs4L/2ahx/92qd//drHn/26dw//Dbw//dtIj/2aRq/9qncP/cqnb/3at4/92qdP/ap27/26hx/+C0
+ gv/gtYT/4LWE/+C1hP/bqHL/4biK/+S/lf/jvJL/5MCY/9uqdP/mzq////////79/P//////////////
+ //////////////7+/f//////////////////////////////////////////////////////////////
+ ///+/v3////////////////////////////+/fz//////+jRtf/ZqHD/5MCX/+O8kv/kvpX/4bmM/9mo
+ cf/gtIL/4LWF/+C1hP/htYT/26lz/9mmbv/cqnX/3qx6/9umbv/w2sD/3bSI/9qka//ap3D/2qdw/9uo
+ cf/ap3D/2qdw/9qmbv/bqnT/4bWF/+C1hP/gtoX/37KA/9upc//ivJH/472U/+O9k//kvpX/2adw/+rY
+ wv///////v39/////////////////////////////v7+////////////////////////////////////
+ /////////////////////v7////////////////////////////+/f3//////+3dyP/YpW3/5LyS/+O+
+ lP/jvZP/472T/9uqdf/esX7/4baF/+C1g//htoX/3Kx3/9qmbv/ap2//2qdw/9upc//Yomj/79m//920
+ iP/ZpGv/2qhw/9qnb//ap2//2qdv/9qnb//ap2//2qZt/96tef/htoX/4LWD/+G2hv/dr3v/3Kt4/+S+
+ lP/jvZL/476V/+S7j//YpG3/8OXV///////+/v3/////////////////////////////////////////
+ /////////////////////////////////////////////////////////////////////v3///////Dk
+ 1P/YpGv/4LiK/+S/lv/jvJL/5L6X/92vfP/erXn/4baG/+C0g//gtoX/3a97/9qmbv/ap2//2qdv/9qn
+ b//aqHD/2KJn/+/Zv//dtIj/2aRr/9qocP/ap2//2qdv/9qnb//ap2//2qdv/9qnb//apm3/3rB9/+C2
+ hv/gtYP/4baG/92rdv/dr37/5L+W/+O8kv/kv5f/4baH/9emb//0697///////7+/f//////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///+/v3///////Hp2//WpGv/4LOC/+TAl//jvJH/5L+X/9+zg//bqnP/4baG/+C1g//gtoX/4LKA/9qn
+ b//ap2//2qdv/9qnb//ap2//2qhx/9iiaP/v2b//3bSI/9mka//aqHD/2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qncP/fs4H/4LaF/+C1hP/gtYX/2ahz/9+1h//kv5b/47yR/+TAmP/dr3v/26t2//jz
+ 6v///////v79////////////////////////////////////////////////////////////////////
+ ///////////////////+/v3///////bx6f/YqXP/3a55/+PAl//jvJL/476V/+G5i//aqHL/4LSD/+C1
+ hP/gtYT/4LSD/9upcf/ap27/2qdv/9qnb//ap2//2qdv/9qocf/Yomf/79m//920iP/ZpGv/2qhw/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qnb//apm7/2qly/+C1g//gtYX/4beG/9ysd//apm7/4bmN/+O+
+ lf/jvJL/5MCW/9yqdv/arXn/9vPq/////////v3/////////////////////////////////////////
+ /////////////////////////////////////v3///////fz7P/ZrXr/2qlz/+S/lv/jvZL/476U/+K7
+ kP/aqHD/3Kp1/+G3hv/gtYT/4bWF/9ypdP/apm7/2qdv/9qnb//ap2//2qdv/9qnb//aqHH/2KJn/+/Z
+ v//dtIj/2aRr/9qocP/ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9mmbv/bq3X/37SC/9+x
+ f//bqHH/2aZt/9yqc//kvZH/472U/+O9k//jvZX/2qVt/9msff/28+3///////7+/f//////////////
+ ///////////////////////////////////////////////////+/v7///////n28f/bsYH/2aRp/+O9
+ kv/jvZT/472T/+O+lP/bq3j/2aZt/9mncf/esH3/37SC/92sd//Zpm7/2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//2qhx/9iiZ//v2b//3bSI/9mka//aqHD/2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//2qZu/9qncP/ap2//2qdu/9qocP/Zpm3/3a56/+S+lf/jvJL/4r6V/+K7j//Zomj/3bOG//v6
+ 9/////////7+/////////////////////////////////////////////////////////v7///////v7
+ +P/fuYv/16Fm/+G4jP/kvpX/47yS/+S/lv/dsH7/2aVt/9qncP/ap2//2qZv/9qncP/apm7/2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qocf/Yomf/79m//920iP/ZpGv/2qhw/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdw/9mlbf/fsoD/5L+V/+O8
+ kv/kv5b/4LeI/9mgZP/fu5H/+/z6/////////v7/////////////////////////////////////////
+ /////v7///////v8+v/fu5L/159j/9+0g//kv5b/4ryS/+S/lv/ftYf/2aVt/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//aqHH/2KJn/+/Zv//dtIj/2aRr/9qo
+ cP/ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//2qZu/+G3i//jvpX/47yS/+S/lv/fsoH/159j/+HAmv/9/v7///7+/////v//////////////
+ //////////////////////7///7+//7////iwp3/155j/92vfP/jvpT/47yS/+O+lf/iuY3/26dv/9qn
+ b//ap2//2qdw/9qnb//ap27/2qdu/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qhx/9ii
+ Z//v2b//3bSI/9mka//aqHD/2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qmbv/bqHL/4ruQ/+O+lP/jvpT/4bmN/9uocv/XoWX/5Mik//7/
+ /////v7///////////////////////////////7///7+//7////lyKX/2KFm/9qnb//gt4r/476W/+O9
+ k//jvZH/3Kp0/9qmbv/ap3D/2qZu/9qqdP/erXn/26hy/92seP/bqXH/2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qocf/Yomf/79m//920iP/ZpGv/2qhw/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap3D/2aZt/9ysd//kvZP/5L+X/9+0
+ hP/apm7/26ly/9efZf/r0rf///////79/P/+/v3////+/////v/+/v3///79///////kyqz/16Bk/9up
+ cv/Zpmz/37B//+W/lv/jvpX/3a15/9mlbP/ap3D/2qdv/9qnbf/aqXL/37F//9+wff/er3z/2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qnb//aqHH/2KJn/+/Zv//dtIj/2aRr/9qocP/ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//apm7/3Kp1/9ysef/ap3D/2qdv/9qnb//aqHD/2KJo/+zYwP////////7+//////////////7+////
+ ///r1bn/2KFm/9uocf/ap2//2qdv/9qmbv/drHj/26t2/9mmbv/ap2//2qdv/9qnb//aqHH/3q98/9+w
+ fv/fsH3/3q99/9upcv/ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qhx/9iiZ//v2b//3bSI/9mk
+ a//aqHD/2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qmbv/apm3/2qdv/9qnb//ap2//2qdw/9qnb//Yo2r/4sOe//Hn
+ 2f/7+PP/+vfy//Ho2f/jwp3/2KJo/9qncP/ap2//2qdv/9qnb//ap2//2aZt/9qmbf/ap2//2qdv/9qn
+ b//ap2//2qhy/9yrd//er3z/37B9/92vev/crHf/2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qo
+ cf/Yomf/79m//920iP/ZpGv/2qhw/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//26hw/9iiZ//Yo2n/26x4/9qrd//Xo2j/2KJn/9uocP/ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qnb//Zpm3/3Kt2/92tef/Zpm7/2adv/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//aqHH/2KJn/+/Zv//dtIj/2aRr/9qocP/ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qnb//aqHH/26hw/9mmbf/apm3/26hw/9qocf/ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qocP/bqHD/2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qhx/9iiZ//v2b//3bSI/9mka//aqHD/2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap3D/2qdw/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qocf/Yomf/79m//920
+ iP/ZpGv/2qhw/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdw/9uocf/ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//aqHH/2KJn/+/Zv//dtIj/2aRr/9qocP/ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qn
+ bv/aqXP/2qhx/9qmbv/bp3D/2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qmbv/apm7/2aZu/9ys
+ eP/drXj/2qZu/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qhx/9iiZ//v2b//3bSI/9mka//aqHD/2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//apm3/3Kt3/96vfP/drnr/26pz/9qnbv/ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qn
+ bv/cqnT/3ax3/9urdv/fsH7/3q97/9qncP/apm7/2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qocf/Yomf/79m//920iP/ZpGv/2qhw/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap27/26p0/9+wfP/fsX7/3rB9/9mncP/ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qly/9+wfv/gsX7/37B9/9+wff/fr3z/3a14/9uocP/ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//aqHH/2KJn/+/Z
+ v//dtIj/2aRr/9qocP/ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9mncP/brHj/37B+/9+u
+ e//cqnT/2qdu/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9mmbf/bq3X/37B9/9+wff/fsH3/3q99/9uq
+ df/ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//2qhx/9iiZ//v2b//3bSI/9mka//aqHD/2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//apm7/2qlz/9yrd//apm//2qdw/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//apm7/3q55/9+x
+ f//fsH3/37F+/9uqdP/Zpm3/2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qocf/Yomf/79m//920iP/ZpGv/2qhw/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//26hw/96teP/bqnT/26p0/9+wff/cqnX/2qZu/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//aqHH/2KJn/+/Zv//dtIj/2aRr/9qo
+ cP/ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qnb//bpm7/2qZu/9qmbv/aqHL/26lz/9qnbv/ap2//2qdv/9qn
+ b//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qdv/9qnb//ap2//2qhx/9ii
+ Z//v2b//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
+
+
+
\ No newline at end of file
diff --git a/Ultron.Update/favicon.ico b/Ultron.Update/favicon.ico
new file mode 100644
index 0000000..730194d
Binary files /dev/null and b/Ultron.Update/favicon.ico differ