diff --git a/Aura Debugger/Aura Debugger/Aura Debugger.csproj b/Aura Debugger/Aura Debugger/Aura Debugger.csproj index 728065a..6a4b4af 100644 --- a/Aura Debugger/Aura Debugger/Aura Debugger.csproj +++ b/Aura Debugger/Aura Debugger/Aura Debugger.csproj @@ -31,6 +31,9 @@ prompt 4 + + Cosmos.ico + @@ -45,16 +48,19 @@ + Form Form1.cs + Form1.cs + Designer ResXFileCodeGenerator @@ -78,5 +84,8 @@ + + + \ No newline at end of file diff --git a/Aura Debugger/Aura Debugger/ConfigManager.cs b/Aura Debugger/Aura Debugger/ConfigManager.cs new file mode 100644 index 0000000..ac92eac --- /dev/null +++ b/Aura Debugger/Aura Debugger/ConfigManager.cs @@ -0,0 +1,81 @@ +using System; +using System.IO; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Drawing; + +namespace Aura_Debugger +{ + public static class ConfigManager + { + public static string FileName = "cnd_config.ini"; + + public static bool WordWrap = true; + public static bool AutoScroll = true; + + public static void SaveConfig() + { + WordWrap = Program.MainForm.GetWordWrap(); + AutoScroll = Program.MainForm.GetAutoScroll(); + + string config = "word_wrap," + WordWrap.ToString() + "\n"; + config += "auto_scroll," + AutoScroll.ToString() + "\n"; + config += "win_pos," + Program.MainForm.Location.X.ToString() + "," + Program.MainForm.Location.Y.ToString() + "\n"; + config += "win_size," + Program.MainForm.Size.Width.ToString() + "," + Program.MainForm.Size.Height.ToString() + "\n"; + File.WriteAllText(FileName, config); + } + + public static void LoadConfig() + { + if (!File.Exists(FileName)) + { + NetworkManager.WriteInfo("Generating new configuration file"); + SaveConfig(); + } + + string[] config = File.ReadAllLines(FileName); + + for (int i = 0; i < config.Length; i++) + { + string[] parts = config[i].Split(','); + if (parts.Length == 0) { continue; } + + if (parts[0] == "word_wrap") + { + if (parts.Length < 2) { NetworkManager.WriteError("Error parsing word wrap property in configuration file"); return; } + WordWrap = bool.Parse(parts[1]); + Program.MainForm.SetWordWrap(WordWrap); + } + + if (parts[0] == "auto_scroll") + { + if (parts.Length < 2) { NetworkManager.WriteError("Error parsing auto scroll property in configuration file"); return; } + AutoScroll = bool.Parse(parts[1]); + Program.MainForm.SetAutoScroll(AutoScroll); + } + + if (parts[0] == "win_pos") + { + if (parts.Length < 3) { NetworkManager.WriteError("Error parsing window position property in configuration file"); return; } + int x = 0, y = 0; + if (!int.TryParse(parts[1], out x)) { NetworkManager.WriteError("Error parsing window X position value in configuration file"); return; } + if (!int.TryParse(parts[2], out y)) { NetworkManager.WriteError("Error parsing window Y position value in configuration file"); return; } + Program.MainForm.SetDesktopLocation(x, y); + } + + if (parts[0] == "win_size") + { + if (parts.Length < 3) { NetworkManager.WriteError("Error parsing window size property in configuration file"); return; } + int x = 0, y = 0; + if (!int.TryParse(parts[1], out x)) { NetworkManager.WriteError("Error parsing window width value in configuration file"); return; } + if (!int.TryParse(parts[2], out y)) { NetworkManager.WriteError("Error parsing window height value in configuration file"); return; } + Program.MainForm.Size = new Size(x, y); + } + } + + NetworkManager.WriteInfo("Loaded configuration file"); + } + } +} diff --git a/Aura Debugger/Aura Debugger/Cosmos.ico b/Aura Debugger/Aura Debugger/Cosmos.ico new file mode 100644 index 0000000..fcdc401 Binary files /dev/null and b/Aura Debugger/Aura Debugger/Cosmos.ico differ diff --git a/Aura Debugger/Aura Debugger/Form1.Designer.cs b/Aura Debugger/Aura Debugger/Form1.Designer.cs index ccbff9d..090f67d 100644 --- a/Aura Debugger/Aura Debugger/Form1.Designer.cs +++ b/Aura Debugger/Aura Debugger/Form1.Designer.cs @@ -28,146 +28,251 @@ protected override void Dispose(bool disposing) /// private void InitializeComponent() { - this.textBox1 = new System.Windows.Forms.TextBox(); - this.label1 = new System.Windows.Forms.Label(); - this.backgroundWorker1 = new System.ComponentModel.BackgroundWorker(); - this.checkBox1 = new System.Windows.Forms.CheckBox(); - this.button1 = new System.Windows.Forms.Button(); - this.button2 = new System.Windows.Forms.Button(); - this.label2 = new System.Windows.Forms.Label(); - this.button3 = new System.Windows.Forms.Button(); - this.textBox2 = new System.Windows.Forms.TextBox(); - this.button4 = new System.Windows.Forms.Button(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Form1)); + this.LabelStatus = new System.Windows.Forms.Label(); + this.WorkerWait = new System.ComponentModel.BackgroundWorker(); + this.ChkAutoScroll = new System.Windows.Forms.CheckBox(); + this.BtnClear = new System.Windows.Forms.Button(); + this.BtnCopy = new System.Windows.Forms.Button(); + this.LabelReceived = new System.Windows.Forms.Label(); + this.BtnConnect = new System.Windows.Forms.Button(); + this.TxtIP = new System.Windows.Forms.TextBox(); + this.BtnWait = new System.Windows.Forms.Button(); this.label3 = new System.Windows.Forms.Label(); - this.backgroundWorker2 = new System.ComponentModel.BackgroundWorker(); + this.WorkerConnect = new System.ComponentModel.BackgroundWorker(); + this.LabelIP = new System.Windows.Forms.Label(); + this.ChkWordWrap = new System.Windows.Forms.CheckBox(); + this.TxtOutput = new System.Windows.Forms.RichTextBox(); + this.BtnSave = new System.Windows.Forms.Button(); this.SuspendLayout(); // - // textBox1 - // - this.textBox1.Location = new System.Drawing.Point(13, 42); - this.textBox1.Multiline = true; - this.textBox1.Name = "textBox1"; - this.textBox1.ReadOnly = true; - this.textBox1.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; - this.textBox1.Size = new System.Drawing.Size(701, 453); - this.textBox1.TabIndex = 0; - this.textBox1.TextChanged += new System.EventHandler(this.textBox1_TextChanged); - // - // label1 - // - this.label1.AutoSize = true; - this.label1.Location = new System.Drawing.Point(10, 506); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(160, 13); - this.label1.TabIndex = 1; - this.label1.Text = "Waiting at XXX.XXX.X.XX, 4224"; - this.label1.Visible = false; - // - // backgroundWorker1 - // - this.backgroundWorker1.DoWork += new System.ComponentModel.DoWorkEventHandler(this.backgroundWorker1_DoWork); - // - // checkBox1 - // - this.checkBox1.AutoSize = true; - this.checkBox1.Location = new System.Drawing.Point(642, 505); - this.checkBox1.Name = "checkBox1"; - this.checkBox1.Size = new System.Drawing.Size(72, 17); - this.checkBox1.TabIndex = 2; - this.checkBox1.Text = "Autoscroll"; - this.checkBox1.UseVisualStyleBackColor = true; - this.checkBox1.CheckedChanged += new System.EventHandler(this.checkBox1_CheckedChanged); - // - // button1 - // - this.button1.Location = new System.Drawing.Point(13, 13); - this.button1.Name = "button1"; - this.button1.Size = new System.Drawing.Size(75, 23); - this.button1.TabIndex = 3; - this.button1.Text = "Clear"; - this.button1.UseVisualStyleBackColor = true; - this.button1.Click += new System.EventHandler(this.button1_Click); - // - // button2 - // - this.button2.Location = new System.Drawing.Point(94, 13); - this.button2.Name = "button2"; - this.button2.Size = new System.Drawing.Size(75, 23); - this.button2.TabIndex = 4; - this.button2.Text = "Copy"; - this.button2.UseVisualStyleBackColor = true; - this.button2.Click += new System.EventHandler(this.button2_Click); - // - // label2 - // - this.label2.AutoSize = true; - this.label2.Location = new System.Drawing.Point(175, 18); - this.label2.Name = "label2"; - this.label2.Size = new System.Drawing.Size(87, 13); - this.label2.TabIndex = 5; - this.label2.Text = "Received logs: 0"; - // - // button3 - // - this.button3.Location = new System.Drawing.Point(508, 13); - this.button3.Name = "button3"; - this.button3.Size = new System.Drawing.Size(59, 23); - this.button3.TabIndex = 6; - this.button3.Text = "Connect"; - this.button3.UseVisualStyleBackColor = true; - this.button3.Click += new System.EventHandler(this.button3_Click); - // - // textBox2 - // - this.textBox2.Location = new System.Drawing.Point(353, 15); - this.textBox2.Name = "textBox2"; - this.textBox2.Size = new System.Drawing.Size(149, 20); - this.textBox2.TabIndex = 7; - // - // button4 - // - this.button4.Location = new System.Drawing.Point(593, 13); - this.button4.Name = "button4"; - this.button4.Size = new System.Drawing.Size(121, 23); - this.button4.TabIndex = 8; - this.button4.Text = "Wait for connection"; - this.button4.UseVisualStyleBackColor = true; - this.button4.Click += new System.EventHandler(this.button4_Click); + // LabelStatus + // + this.LabelStatus.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.LabelStatus.AutoSize = true; + this.LabelStatus.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.LabelStatus.ForeColor = System.Drawing.Color.White; + this.LabelStatus.Location = new System.Drawing.Point(12, 522); + this.LabelStatus.Name = "LabelStatus"; + this.LabelStatus.Size = new System.Drawing.Size(38, 13); + this.LabelStatus.TabIndex = 1; + this.LabelStatus.Text = "Ready"; + this.LabelStatus.Visible = true; + // + // WorkerWait + // + this.WorkerWait.DoWork += new System.ComponentModel.DoWorkEventHandler(this.WorkerWait_DoWork); + // + // ChkAutoScroll + // + this.ChkAutoScroll.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.ChkAutoScroll.AutoSize = true; + this.ChkAutoScroll.Checked = true; + this.ChkAutoScroll.CheckState = System.Windows.Forms.CheckState.Checked; + this.ChkAutoScroll.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.ChkAutoScroll.ForeColor = System.Drawing.Color.White; + this.ChkAutoScroll.Location = new System.Drawing.Point(687, 521); + this.ChkAutoScroll.Name = "ChkAutoScroll"; + this.ChkAutoScroll.Size = new System.Drawing.Size(73, 17); + this.ChkAutoScroll.TabIndex = 2; + this.ChkAutoScroll.Text = "Autoscroll"; + this.ChkAutoScroll.UseVisualStyleBackColor = true; + this.ChkAutoScroll.CheckedChanged += new System.EventHandler(this.ChkAutoScroll_CheckedChanged); + // + // BtnClear + // + this.BtnClear.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(36)))), ((int)(((byte)(36)))), ((int)(((byte)(36))))); + this.BtnClear.FlatAppearance.BorderColor = System.Drawing.Color.Gray; + this.BtnClear.FlatAppearance.MouseDownBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(80)))), ((int)(((byte)(233))))); + this.BtnClear.FlatAppearance.MouseOverBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(112)))), ((int)(((byte)(255))))); + this.BtnClear.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.BtnClear.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.BtnClear.ForeColor = System.Drawing.Color.White; + this.BtnClear.Location = new System.Drawing.Point(12, 14); + this.BtnClear.Name = "BtnClear"; + this.BtnClear.Size = new System.Drawing.Size(75, 23); + this.BtnClear.TabIndex = 3; + this.BtnClear.Text = "Clear"; + this.BtnClear.UseVisualStyleBackColor = false; + this.BtnClear.Click += new System.EventHandler(this.BtnClear_Click); + // + // BtnCopy + // + this.BtnCopy.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(36)))), ((int)(((byte)(36)))), ((int)(((byte)(36))))); + this.BtnCopy.FlatAppearance.BorderColor = System.Drawing.Color.Gray; + this.BtnCopy.FlatAppearance.MouseDownBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(80)))), ((int)(((byte)(233))))); + this.BtnCopy.FlatAppearance.MouseOverBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(112)))), ((int)(((byte)(255))))); + this.BtnCopy.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.BtnCopy.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.BtnCopy.ForeColor = System.Drawing.Color.White; + this.BtnCopy.Location = new System.Drawing.Point(93, 14); + this.BtnCopy.Name = "BtnCopy"; + this.BtnCopy.Size = new System.Drawing.Size(75, 23); + this.BtnCopy.TabIndex = 4; + this.BtnCopy.Text = "Copy"; + this.BtnCopy.UseVisualStyleBackColor = false; + this.BtnCopy.Click += new System.EventHandler(this.BtnCopy_Click); + // + // LabelReceived + // + this.LabelReceived.Anchor = System.Windows.Forms.AnchorStyles.Bottom; + this.LabelReceived.AutoSize = true; + this.LabelReceived.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.LabelReceived.ForeColor = System.Drawing.Color.White; + this.LabelReceived.Location = new System.Drawing.Point(343, 522); + this.LabelReceived.Name = "LabelReceived"; + this.LabelReceived.Size = new System.Drawing.Size(86, 13); + this.LabelReceived.TabIndex = 5; + this.LabelReceived.Text = "Received logs: 0"; + // + // BtnConnect + // + this.BtnConnect.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.BtnConnect.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(36)))), ((int)(((byte)(36)))), ((int)(((byte)(36))))); + this.BtnConnect.FlatAppearance.BorderColor = System.Drawing.Color.Gray; + this.BtnConnect.FlatAppearance.MouseDownBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(80)))), ((int)(((byte)(233))))); + this.BtnConnect.FlatAppearance.MouseOverBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(112)))), ((int)(((byte)(255))))); + this.BtnConnect.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.BtnConnect.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.BtnConnect.ForeColor = System.Drawing.Color.Lime; + this.BtnConnect.Location = new System.Drawing.Point(542, 14); + this.BtnConnect.Name = "BtnConnect"; + this.BtnConnect.Size = new System.Drawing.Size(78, 23); + this.BtnConnect.TabIndex = 6; + this.BtnConnect.Text = "Connect"; + this.BtnConnect.UseVisualStyleBackColor = false; + this.BtnConnect.Click += new System.EventHandler(this.BtnConnect_Click); + // + // TxtIP + // + this.TxtIP.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.TxtIP.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(36)))), ((int)(((byte)(36)))), ((int)(((byte)(36))))); + this.TxtIP.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.TxtIP.Font = new System.Drawing.Font("Tahoma", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.TxtIP.ForeColor = System.Drawing.Color.White; + this.TxtIP.Location = new System.Drawing.Point(353, 14); + this.TxtIP.Name = "TxtIP"; + this.TxtIP.Size = new System.Drawing.Size(183, 23); + this.TxtIP.TabIndex = 7; + // + // BtnWait + // + this.BtnWait.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.BtnWait.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(36)))), ((int)(((byte)(36)))), ((int)(((byte)(36))))); + this.BtnWait.FlatAppearance.BorderColor = System.Drawing.Color.Gray; + this.BtnWait.FlatAppearance.MouseDownBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(80)))), ((int)(((byte)(233))))); + this.BtnWait.FlatAppearance.MouseOverBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(112)))), ((int)(((byte)(255))))); + this.BtnWait.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.BtnWait.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.BtnWait.ForeColor = System.Drawing.Color.White; + this.BtnWait.Location = new System.Drawing.Point(643, 14); + this.BtnWait.Name = "BtnWait"; + this.BtnWait.Size = new System.Drawing.Size(117, 23); + this.BtnWait.TabIndex = 8; + this.BtnWait.Text = "Wait for connection"; + this.BtnWait.UseVisualStyleBackColor = false; + this.BtnWait.Click += new System.EventHandler(this.BtnWait_Click); // // label3 // + this.label3.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); this.label3.AutoSize = true; - this.label3.Location = new System.Drawing.Point(573, 17); + this.label3.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label3.ForeColor = System.Drawing.Color.White; + this.label3.Location = new System.Drawing.Point(624, 19); this.label3.Name = "label3"; - this.label3.Size = new System.Drawing.Size(16, 13); + this.label3.Size = new System.Drawing.Size(17, 13); this.label3.TabIndex = 9; this.label3.Text = "or"; // - // backgroundWorker2 + // WorkerConnect + // + this.WorkerConnect.DoWork += new System.ComponentModel.DoWorkEventHandler(this.WorkerConnect_DoWork); + // + // LabelIP + // + this.LabelIP.AutoSize = true; + this.LabelIP.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.LabelIP.ForeColor = System.Drawing.Color.White; + this.LabelIP.Location = new System.Drawing.Point(302, 19); + this.LabelIP.Name = "LabelIP"; + this.LabelIP.Size = new System.Drawing.Size(45, 13); + this.LabelIP.TabIndex = 10; + this.LabelIP.Text = "IP/Port:"; // - this.backgroundWorker2.DoWork += new System.ComponentModel.DoWorkEventHandler(this.backgroundWorker2_DoWork); + // ChkWordWrap + // + this.ChkWordWrap.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.ChkWordWrap.AutoSize = true; + this.ChkWordWrap.Checked = true; + this.ChkWordWrap.CheckState = System.Windows.Forms.CheckState.Checked; + this.ChkWordWrap.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.ChkWordWrap.ForeColor = System.Drawing.Color.White; + this.ChkWordWrap.Location = new System.Drawing.Point(593, 521); + this.ChkWordWrap.Name = "ChkWordWrap"; + this.ChkWordWrap.Size = new System.Drawing.Size(81, 17); + this.ChkWordWrap.TabIndex = 11; + this.ChkWordWrap.Text = "Word Wrap"; + this.ChkWordWrap.UseVisualStyleBackColor = true; + this.ChkWordWrap.CheckedChanged += new System.EventHandler(this.ChkWordWrap_CheckedChanged); + // + // TxtOutput + // + this.TxtOutput.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.TxtOutput.BackColor = System.Drawing.Color.Black; + this.TxtOutput.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.TxtOutput.Font = new System.Drawing.Font("Consolas", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.TxtOutput.ForeColor = System.Drawing.Color.White; + this.TxtOutput.Location = new System.Drawing.Point(12, 50); + this.TxtOutput.Name = "TxtOutput"; + this.TxtOutput.Size = new System.Drawing.Size(748, 465); + this.TxtOutput.TabIndex = 12; + this.TxtOutput.Text = ""; + this.TxtOutput.TextChanged += new System.EventHandler(this.TxtOutput_TextChanged); + // + // BtnSave + // + this.BtnSave.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(36)))), ((int)(((byte)(36)))), ((int)(((byte)(36))))); + this.BtnSave.FlatAppearance.BorderColor = System.Drawing.Color.Gray; + this.BtnSave.FlatAppearance.MouseDownBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(80)))), ((int)(((byte)(233))))); + this.BtnSave.FlatAppearance.MouseOverBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(112)))), ((int)(((byte)(255))))); + this.BtnSave.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.BtnSave.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.BtnSave.ForeColor = System.Drawing.Color.White; + this.BtnSave.Location = new System.Drawing.Point(174, 14); + this.BtnSave.Name = "BtnSave"; + this.BtnSave.Size = new System.Drawing.Size(75, 23); + this.BtnSave.TabIndex = 13; + this.BtnSave.Text = "Save..."; + this.BtnSave.UseVisualStyleBackColor = false; + this.BtnSave.Click += new System.EventHandler(this.BtnSave_Click); // // Form1 // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.BackColor = System.Drawing.Color.White; - this.ClientSize = new System.Drawing.Size(726, 530); + this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(18)))), ((int)(((byte)(18)))), ((int)(((byte)(18))))); + this.ClientSize = new System.Drawing.Size(772, 545); + this.Controls.Add(this.BtnSave); + this.Controls.Add(this.TxtOutput); + this.Controls.Add(this.ChkWordWrap); + this.Controls.Add(this.LabelIP); this.Controls.Add(this.label3); - this.Controls.Add(this.button4); - this.Controls.Add(this.textBox2); - this.Controls.Add(this.button3); - this.Controls.Add(this.label2); - this.Controls.Add(this.button2); - this.Controls.Add(this.button1); - this.Controls.Add(this.checkBox1); - this.Controls.Add(this.label1); - this.Controls.Add(this.textBox1); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; - this.MaximizeBox = false; + this.Controls.Add(this.BtnWait); + this.Controls.Add(this.TxtIP); + this.Controls.Add(this.BtnConnect); + this.Controls.Add(this.LabelReceived); + this.Controls.Add(this.BtnCopy); + this.Controls.Add(this.BtnClear); + this.Controls.Add(this.ChkAutoScroll); + this.Controls.Add(this.LabelStatus); + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); this.Name = "Form1"; - this.ShowIcon = false; - this.Text = "Aura Debugger v0.2"; + this.Text = "Cosmos Network Debugger"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Form1_FormClosing); this.Load += new System.EventHandler(this.Form1_Load); this.ResumeLayout(false); this.PerformLayout(); @@ -175,19 +280,21 @@ private void InitializeComponent() } #endregion - - private System.Windows.Forms.TextBox textBox1; - private System.Windows.Forms.Label label1; - private System.ComponentModel.BackgroundWorker backgroundWorker1; - private System.Windows.Forms.CheckBox checkBox1; - private System.Windows.Forms.Button button1; - private System.Windows.Forms.Button button2; - private System.Windows.Forms.Label label2; - private System.Windows.Forms.Button button3; - private System.Windows.Forms.TextBox textBox2; - private System.Windows.Forms.Button button4; + private System.Windows.Forms.Label LabelStatus; + private System.ComponentModel.BackgroundWorker WorkerWait; + private System.Windows.Forms.CheckBox ChkAutoScroll; + private System.Windows.Forms.Button BtnClear; + private System.Windows.Forms.Button BtnCopy; + private System.Windows.Forms.Label LabelReceived; + private System.Windows.Forms.Button BtnConnect; + private System.Windows.Forms.TextBox TxtIP; + private System.Windows.Forms.Button BtnWait; private System.Windows.Forms.Label label3; - private System.ComponentModel.BackgroundWorker backgroundWorker2; + private System.ComponentModel.BackgroundWorker WorkerConnect; + private System.Windows.Forms.Label LabelIP; + private System.Windows.Forms.CheckBox ChkWordWrap; + private System.Windows.Forms.RichTextBox TxtOutput; + private System.Windows.Forms.Button BtnSave; } } diff --git a/Aura Debugger/Aura Debugger/Form1.cs b/Aura Debugger/Aura Debugger/Form1.cs index 4782af0..24aeae3 100644 --- a/Aura Debugger/Aura Debugger/Form1.cs +++ b/Aura Debugger/Aura Debugger/Form1.cs @@ -6,16 +6,20 @@ */ using System; +using System.IO; using System.ComponentModel; using System.Text; using System.Windows.Forms; using System.Net; using System.Net.Sockets; +using System.Drawing; namespace Aura_Debugger { public partial class Form1 : Form { + private bool autoscroll = true; + public Form1() { InitializeComponent(); @@ -23,202 +27,218 @@ public Form1() private void Form1_Load(object sender, EventArgs e) { - button1.Enabled = false; - button2.Enabled = false; - label1.Visible = false; + ResetState(); + ConfigManager.LoadConfig(); } - int packetnumber = 0; - int port = 4224; + // wait for connection + private void WorkerWait_DoWork(object sen, DoWorkEventArgs e) + { + NetworkManager.WaitForConnection(); + } - private void backgroundWorker1_DoWork(object sen, DoWorkEventArgs e) + // connect + private void WorkerConnect_DoWork(object sender, DoWorkEventArgs e) { - TcpListener server = null; + NetworkManager.Connect(TxtIP.Text); + } - try + public void ResetState() + { + Invoke((MethodInvoker)(() => { - server = new TcpListener(IPAddress.Any, port); - - server.Start(); - - Byte[] bytes = new Byte[256]; - - while (true) + if (TxtOutput.Text.Length == 0) { - WriteTextBox("Waiting for a connection..."); - - TcpClient client = server.AcceptTcpClient(); - WriteTextBox("Connected!"); - - DebuggerConnected(); - - NetworkStream stream = client.GetStream(); + BtnClear.Enabled = false; + BtnCopy.Enabled = false; + } + TxtIP.Enabled = true; + BtnWait.Enabled = true; + BtnConnect.Enabled = true; - int i; + BtnConnect.Text = "Connect"; + BtnConnect.ForeColor = Color.LawnGreen; - while ((i = stream.Read(bytes, 0, bytes.Length)) != 0) - { - packetnumber++; - WriteTextBox(Encoding.ASCII.GetString(bytes, 0, i)); - } + LabelStatus.Text = "Ready to connect"; + })); + } - client.Close(); - WriteTextBox("Connection closed!"); - } - } - catch (SocketException ee) - { - WriteTextBox("Socket Exception: " + ee); - } - finally + public void ConnectingState() + { + Invoke((MethodInvoker)(() => { - server.Stop(); - WriteTextBox("Connection closed!"); - } + BtnConnect.Text = "Disconnect"; + BtnConnect.ForeColor = Color.Tomato; + BtnWait.Enabled = false; + LabelStatus.Text = "Attempting connection to: " + NetworkManager.IP + ":" + NetworkManager.Port.ToString(); + })); } - private void backgroundWorker2_DoWork(object sender, DoWorkEventArgs e) + public void ConnectedState() { - try + Invoke((MethodInvoker)(() => { - string[] splitted = textBox2.Text.Split(':'); - string ip = splitted[0]; - string port = splitted[1]; - - Byte[] bytes = new Byte[256]; - - while (true) - { - WriteTextBox("Waiting to connect..."); + BtnClear.Enabled = true; + BtnCopy.Enabled = true; + TxtIP.Enabled = false; + BtnWait.Enabled = false; + BtnConnect.Enabled = true; + BtnWait.Enabled = false; - TcpClient client = new TcpClient(); + BtnConnect.Text = "Disconnect"; + BtnConnect.ForeColor = Color.Tomato; - client.Connect(ip, int.Parse(port)); - - //label1.Text = "Connected to " + ip + ", " + port; - //label1.Visible = true; + LabelStatus.Text = "Connected to: " + NetworkManager.IP + ":" + NetworkManager.Port.ToString(); + })); + } - WriteTextBox("Connected!"); + public void WaitState() + { + ConnectedState(); + Invoke((MethodInvoker)(() => + { + LabelStatus.Text = "Waiting for: " + NetworkManager.IP + ":" + NetworkManager.Port.ToString(); + })); + } - NetworkStream stream = client.GetStream(); + public void WriteTextBox(string message) + { + WriteTextBox(message, Color.White); + } - int i; + public void WriteTextBox(string message, Color color) + { + Invoke((MethodInvoker)(() => + { + TxtOutput.SelectionStart = TxtOutput.TextLength; + TxtOutput.SelectionLength = 0; - while ((i = stream.Read(bytes, 0, bytes.Length)) != 0) - { - packetnumber++; - WriteTextBox(Encoding.ASCII.GetString(bytes, 0, i)); - } + TxtOutput.SelectionColor = color; + TxtOutput.AppendText(message); + TxtOutput.SelectionColor = TxtOutput.ForeColor; + })); + } - client.Close(); - WriteTextBox("Connection closed!"); - } - } - catch (SocketException ee) - { - WriteTextBox("Socket Exception: " + ee); - } - finally + public void ClearLog() + { + Invoke((MethodInvoker)(() => { - WriteTextBox("Connection closed!"); - } + NetworkManager.PacketNumber = 0; + TxtOutput.Clear(); + LabelReceived.Text = "Received Logs: 0"; + })); + } + + public bool GetWordWrap() + { + return TxtOutput.WordWrap; } - void DebuggerConnected() + public bool GetAutoScroll() + { + return autoscroll; + } + + public void SetWordWrap(bool wrap) { Invoke((MethodInvoker)(() => { - button1.Enabled = true; - button2.Enabled = true; + if (wrap) + { + TxtOutput.WordWrap = true; + TxtOutput.ScrollBars = RichTextBoxScrollBars.ForcedVertical; + ChkWordWrap.Checked = true; + } + else + { + TxtOutput.WordWrap = false; + TxtOutput.ScrollBars = RichTextBoxScrollBars.ForcedBoth; + ChkWordWrap.Checked = false; + } })); } - void WriteTextBox(String message) + public void SetAutoScroll(bool autoscrl) { Invoke((MethodInvoker)(() => { - textBox1.Text += (@message + Environment.NewLine); - label2.Text = "Received logs: " + packetnumber.ToString(); + autoscroll = autoscrl; + ChkAutoScroll.Checked = autoscroll; })); } - private void textBox1_TextChanged(object sender, EventArgs e) + private void TxtOutput_TextChanged(object sender, EventArgs e) { if (autoscroll) { - textBox1.SelectionStart = textBox1.Text.Length; - textBox1.ScrollToCaret(); - } - else - { - //Find a way to not move the bar at the top and block it + TxtOutput.SelectionStart = TxtOutput.Text.Length; + TxtOutput.ScrollToCaret(); } } - bool autoscroll = false; - - private void checkBox1_CheckedChanged(object sender, EventArgs e) + private void ChkAutoScroll_CheckedChanged(object sender, EventArgs e) { - if (!checkBox1.Checked) - { - autoscroll = false; - } - else - { - autoscroll = true; - } - + SetAutoScroll(ChkAutoScroll.Checked); } - private void button1_Click(object sender, EventArgs e) + private void BtnClear_Click(object sender, EventArgs e) { - textBox1.Text = ""; - packetnumber = 0; - label2.Text = "Received logs: 0"; + ClearLog(); } - private void button2_Click(object sender, EventArgs e) + private void BtnCopy_Click(object sender, EventArgs e) { - Clipboard.SetText(textBox1.Text); + Clipboard.SetText(TxtOutput.Text); } - private void button4_Click(object sender, EventArgs e) + private void BtnWait_Click(object sender, EventArgs e) { - button4.Visible = false; - button3.Visible = false; - label3.Visible = false; - textBox2.Visible = false; - - string IP = "XX.XX.XX.XX"; - + string IP = string.Empty; using (Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, 0)) { - socket.Connect("8.8.8.8", 65530); + NetworkManager.IP = "8.8.8.8"; + NetworkManager.Port = 65530; + socket.Connect(NetworkManager.IP, NetworkManager.Port); var endPoint = socket.LocalEndPoint as IPEndPoint; IP = endPoint.Address.ToString(); } - label1.Text = "Waiting at " + IP + ", " + port; - label1.Visible = true; - - backgroundWorker1.RunWorkerAsync(); + WorkerWait.RunWorkerAsync(); } - private void button3_Click(object sender, EventArgs e) + private void BtnConnect_Click(object sender, EventArgs e) { - if (textBox2.Text == "") + if (NetworkManager.Waiting || NetworkManager.Connected) { - MessageBox.Show("Please specify an IP Address and Port."); + if (NetworkManager.Client != null) { NetworkManager.Client.Close(); } + if (NetworkManager.Listener != null) { NetworkManager.Listener.Stop(); } + ResetState(); + return; } - else - { - button4.Visible = false; - button3.Visible = false; - label3.Visible = false; - textBox2.Visible = false; - backgroundWorker2.RunWorkerAsync(); - } + if (TxtIP.Text.Length == 0) { MessageBox.Show("Please specify an IP address and port"); } + else { WorkerConnect.RunWorkerAsync(); } + } + + private void ChkWordWrap_CheckedChanged(object sender, EventArgs e) + { + SetWordWrap(ChkWordWrap.Checked); + } + + private void Form1_FormClosing(object sender, FormClosingEventArgs e) + { + ConfigManager.SaveConfig(); + } + + private void BtnSave_Click(object sender, EventArgs e) + { + SaveFileDialog diag = new SaveFileDialog(); + diag.Filter = "Text Files (.txt)|*.txt|All Files|*.*"; + + if (diag.ShowDialog() == DialogResult.OK) + { + File.WriteAllLines(diag.FileName, TxtOutput.Lines); + } } } } diff --git a/Aura Debugger/Aura Debugger/Form1.resx b/Aura Debugger/Aura Debugger/Form1.resx index 10e3d35..73016f4 100644 --- a/Aura Debugger/Aura Debugger/Form1.resx +++ b/Aura Debugger/Aura Debugger/Form1.resx @@ -117,10 +117,439 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + 17, 17 - - 181, 17 + + 124, 19 + + 53 + + + + + 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 + /wC0s7Fm3tvY/2tpZv9sa2j/Z2Zj/97b2P+LiYT/WldS/1RSTf9QTkr/TUtH/0tJRf+wrav/nJmTnP7+ + /gH///8A1NTTLt3b1/+bmpf/cnBt/3Jwbf+Ih4T/1NLO/29taf9pZ2L/YV9a/1tZVP9XVVH/mZeU/6qm + ntz5+fkG////APLy8g3BvbjxtLKv/3V0cP91dHD/dHJv/8TBvv/U0c7/iIeC/21rZ/+QjYn/iYeE/9LQ + zP+gnZii/f39Av///wD///8A3t7eItLQyvO1s7D/eHZz/3p4df96eHX/enh1/3FubP9xcGz/eXdy/6Oi + nv+3tbLM/Pz8A////wD///8A////AP7+/gGrqqel7Orn/5mXlP99e3f/fXt3/317d/99e3f/fXt3/317 + d/+RkIz/ycbB6PT09Av///8A////AP///wD///8A/v7+AcDAv0bQzcnt8O7q/8vKxv95eHX/b25r/25t + av+Tko7/6ujl/9LPyvHv7+8Q////AP///wD///8A////AP///wD+/v4BwcC/SbWxqtro5uL+8e/r//Lw + 7P/y8Oz/7+3p/+Ti3v2opaKQ/v7+Af///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAACAAAABAAAAAAQAgAAAAAACAEAAAAAAAAAAA + AAAAAAAAAAAAAP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD8/PwD7+/vELi3s1eQjIaUgn11s4B7c8KBe3O+g311r5eTjom9vLlQ6+rqFf39/QL///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD6+voF6enpFs3NzDSdmpV7f3lxwYuGf+iempP0qKWg+qWinPiZlY/yh4J64n14b72fnZl20tLSLerq + 6hX7+/sE////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP7+ + /gHs7OwTp6Wha5GOh+S2tLH/vbu4/8G+u//Bvrv/wb67/8G+u//Bvrv/wb67/8G+u//Bvrv/wb67/8C9 + uv++u7j/tbOw/4eCetvU09Mu/v7+Af///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD+/v4B7+/vEJqYlH+wran/vbu4/8K/vP/Cv7z/wr+8/8K/vP/Cv7z/wr+8/8K/vP/Cv7z/wr+8/8K/ + vP/Cv7z/wr+8/8K/vP/Bvrv/ure0/5yZl4n7+/sE////AP///wD///8A////AP///wD///8A////AP// + /wD///8A+vr6Ba+urFurqab8wL67/8PBvv/Dwb7/tbOw/0ZFRP8jIiD/JCMh/yQjIf8kIyH/JCMh/yQj + If8kIyH/JCMh/yQjIf8jIiH/PTw6/7WzsP/Dwb7/lZKL1Ovr6xT///8A////AP///wD///8A////AP// + /wD///8A////AP39/QLg4OAflZCK0cK/vP/Fwr//xcK//4eFg/8jIiD/JSQi/yUkIv8lJCL/JSQi/yUk + Iv8lJCL/JSQi/yUkIv8lJCL/JSQi/yUkIv8lJCL/paOg/8XCv/+WkY3R7OzsE////wD///8A////AP// + /wD///8A////AP///wD///8Azc3MNamlofnFwr//x8TB/5GPjP8mJST/JyYl/ycmJf8nJiX/JyYl/ycm + Jf8nJiX/JyYl/ycmJf8nJiX/JyYl/ycmJf8nJiX/JyYl/yYlJP/HxMH/xsPA/5yal6b5+fkG////AP// + /wD///8A////AP///wD///8A////APn5+QabmpeIwb+7/8jGwv/IxsL/PDs5/ykoJv8pKCb/KSgm/yko + Jv8pKCb/KSgm/ykoJv8pKCb/KSgm/ykoJv8pKCb/KSgm/ykoJv8pKCb/MC8u/8jGwv/GxMD/m5qXj/7+ + /gH///8A////AP///wD///8A////AP///wD7+/sEvLu6S7i1sPvKyMT/srCt/yopJ/8sKyn/LCsp/ywr + Kf8sKyn/LCsp/ywrKf8sKyn/KCcl/01MSv+Afnv/kpCN/4mIhf9mZWL/Ozo4/yopKP90cnD/ysjE/8C/ + u/+opqRn////AP///wD///8A////AP///wD///8A////APPz8wyGgHisxcPA/8vJxv99e3j/Liwq/y4s + Kv8uLCr/Liwq/y4sKv8uLCr/Liwq/09OTP/Ewr//y8nG/8vJxv/Lycb/y8nG/8vJxv/Lycb/r62q/7Sy + sP/Lycb/vby5/7u7uUz///8A////AP///wD///8A////AP///wD///8AyMfGPb27uP/Ny8f/zszI/zAv + Lf8xMC3/MTAt/zEwLf8xMC3/MTAt/0RCQP/OzMj/NzY0/y8uLP9CQT//LSwr/zEwLf8xMC3/Ly4r/zIx + L/+rqaX/zszI/87MyP/Bv7r+sK6sW/7+/gH///8A////AP///wD///8A////AP///wCsqqhhxMO//8/N + yf+Zl5X/MzIv/zMyL/8zMi//MzIv/zMyL/8zMi//hoSB/z8+O/8zMi//MzIv/zMyL/8zMi//MzIv/zMy + L/8zMi//MzIv/zk4Nv/Ny8f/z83J/8zKxv+cmpep9PT0C////wD///8A////AP///wD///8A+/v7BJ6d + mpvQzsr/x8XB/zQzMf83NTP/NzUz/zc1M/83NTP/NzUz/01MS//S0Mz/MC8u/zc1M/83NTP/NzUz/zc1 + M/83NTP/NzUz/zc1M/83NTP/NzUz/zc1M/+cm5f/0tDM/8G/u/y+vbtK/Pz8A////wD///8A////AP// + /wD19fUKoZ+atdPRzv+wrqz/MjEv/zk3NP85NzT/OTc0/zk3NP84NjP/paWi/9PRzv9FREL/OTc0/zk3 + NP85NzT/OTc0/zk3NP85NzT/OTc0/zk3NP85NzT/OTc0/317ef/T0c7/zMrH/5iUj4j39/cI////AP// + /wD///8A////AOjo6Befm5PW1tTQ/5OSj/88Ozj/PDs4/zw7OP88Ozj/PDs4/zw7OP/W1ND/1tTQ/2Zk + Yv88Ozj/PDs4/zw7OP88Ozj/PDs4/zw7OP88Ozj/PDs4/zw7OP88Ozj/QD88/6yqpv/T0c3/mJSM5djY + 1yr///8A////AP///wD///8A5OTkG6OfmN7Y1dL/joyK/z49Ov8+PTr/Pj06/z49Ov8+PTr/RkRC/9jV + 0v/Y1dL/SEZE/z49Ov8+PTr/Pj06/z49Ov8+PTr/Pj06/z49Ov8+PTr/Pj06/z49Ov86OTf/hIKA/9bT + 0f+yraj2xMPCQv///wD///8A////AP///wDj4+McpaKb39rY1f+PjYv/Q0E9/0NBPf9DQT3/Q0E9/0NB + Pf9RUE3/2tjV/9rY1f9FREL/TUpG/0xKRv9LSUX/S0lE/0lHQv9IRkL/R0RA/0ZEQP9FQz7/REI+/z48 + OP9sa2j/2dfU/8fFwf25uLZQ////AP///wD///8A////AOfn5xijn5jZ3NrW/5WTkP9FQz//RUM//0pI + RP9UUk3/Y2Ba/2VjX//c2tb/3NrW/1ZVVP9XVVD/VFJN/1FPSv9PTUj/TUtG/0xKRv9LSET/SkhD/0lH + Qv9IRkL/QT87/3l4dv/b2dX/vbq0+cHAvkf///8A////AP///wD///8A8vLyDaWhnb3f3Nn/t7Wz/2Zm + Yv9tbGn/bWxp/21saf9tbGn/ZGNf/9/c2f/f3Nn/sK6r/2FfWf9eXFf/W1hT/1hWUf9VU07/U1FN/1FP + Sv9QTkr/T0xI/05MR/9YVlP/0M3K/93a1/+WkIfg2trZJ////wD///8A////AP///wD4+PgHpKKep97c + 2P/Lycb/XFtZ/25tav9ubWr/bm1q/25tav9ramf/wL67/+De2v/g3tr/XFtW/2NiXf9fXlj/XFpW/1lX + U/9WVVH/VFNO/1NSTf9RUEv/UE9K/0pJRf+fnpv/3tzY/7Sxq/TGxcRA////AP///wD///8A////AP// + /wCmpaJt2tjU/+Ph3f+KiYf/cXBt/3Fwbf9xcG3/cXBt/3Fwbf9fXVv/4d/b/+Ph3f+opqP/cXBr/21q + ZP9oZWD/Y2Fc/2BdWP9dW1b/W1hT/1hWUf9XVFD/VFFN/0pIRv/j4d3/2dfT/6elom////8A////AP// + /wD///8A////AL28ukzV08//5OLe/9bU0P9ramf/c3Fu/3Nxbv9zcW7/c3Fu/3Nxbv+rqaf/5OLe/+Ti + 3v9qamj/c3Fs/29sZ/9pZ2L/ZWNe/2JfW/9fXVj/XFpV/1pYVP9TUE3/V1ZU/+Ti3v/X1tL/rKqnZP// + /wD///8A////AP///wD///8A7+/vEJGLgc3j4N3/5+Th/5mXk/92dXH/dnVx/3Z1cf92dXH/dnVx/3Fw + bP+ZmJb/5+Th/+fk4f/n5OH/uri1/3t5dv9raWf/i4mG/9rX1P/V09D/qail/9XT0P/n5OH/4+Dd/5mT + itrh4eAg////AP///wD///8A////AP///wD5+fkGpaOedN3b1//o5uL/rayp/3d1cv93dXL/d3Vy/3d1 + cv93dXL/d3Vy/3VzcP+dnJn/6Obi/+jm4v/o5uL/6Obi/+jm4v/o5uL/6Obi/+Lg3P/g3tr/6Obi/+jm + 4v/X1dH+rKqmaff39wj///8A////AP///wD///8A////AP///wDy8vINp6Sgrebk4P/q6OT/ysnF/3Fv + bP96eHX/enh1/3p4df96eHX/enh1/3p4df96eHX/dnNx/2hmY/9iYF//ZGNh/3JwbP96eHX/eHRu/2Fg + Xv/q6OT/5+Xh/5yal475+fkG////AP///wD///8A////AP///wD///8A////AP39/QKvratf29nX/+ro + 5f/r6eb/kZCN/3t5df97eXX/e3l1/3t5df97eXX/e3l1/3t5df97eXX/e3l1/3t5df97eXX/e3l1/3t5 + df97eXT/WlhS/+vp5v/p5+T/qKajpPj4+Af///8A////AP///wD///8A////AP///wD///8A////APr6 + +gXCwb9Fx8S+9Ozq5//t6+j/3t3a/3BvbP99fHj/fXx4/318eP99fHj/fXx4/318eP99fHj/fXx4/318 + eP99fHj/fXx4/318eP99fHj/vLu4/+3r6P+zrqbh4+PjHP///wD///8A////AP///wD///8A////AP// + /wD///8A////APDw8A+in5mi5uPg/+7r6P/v7On/ysfE/2RiYP9+fXn/fn15/359ef9+fXn/fn15/359 + ef9+fXn/fn15/359ef9+fXn/fn15/359ef+pp6T/7+zp/8nFv/TV1dQr////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////APj4+AfOzc00rqmi3uro5f/v7er/8O7r//Du6//c2tf/fn16/2Nj + YP9vbmr/fHp2/317eP95d3T/bWxp/2RjX/98e3r/2NbT//Du6//w7uv/ycXB89bW1in///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////APj4+Ae3trRTtrGq7ejm4v/w7ur/8e/r//Hv + 6//a2dX/mpmW/3Jxbv9kZGD/ZGNg/2VkYf92dXL/npyZ/9rZ1f/x7+v/8e/r/+/t6f+tqKDT6enpFv// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD4+PgH1dXULJiU + jJSyrqbo4uDc/+ro5P/w7ur/8vDs//Px7f/z8e3/8/Ht//Lw7P/w7ur/6ujk/+Lg3P+1sanqnZiRjOnp + 6Rb///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD8/PwD7e3tEszMyzahnph/lo+GycG9tvPh3tv+6Obj/+nn5P/o5uP/39zZ/b66tPKVj4XKop6Yf8zL + yzfu7u4R/f39Av///wD///8A////AP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAAwAAAAYAAAAAEAIAAAAAAAgCUAAAAA + AAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A/v7+Afr6+gXv7+8QysnHP6iloW+QjIaUhH92rIF7 + c7uAe3PCgHtzwoF7c7uDfXWvjomCmaGemXm9vLlQ4ODfIvb29gn9/f0C////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A/v7+Afb29gnp6ekW2traJcHAv0SdmpV7gHtzr395 + cdSLhn/omZSO8qKhmveopaD6qKWg+aKhmveZlY/yjoqD6oF9c9p9eG+9j4uGkrGwrVvS0tIt4+PjHPHx + 8Q77+/sE////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP39/QLy8vIN3t7eIbOysFiFgXmmh4J63aCd + l/eysKz/trSx/7m3s/+8urb/vry4/769uf++vbn/vr25/769uf++vLj/vLq2/7q4tP+4trL/tLKu/6yp + pf2RjYXsf3txx5uYk3/Y2Ngn8/PzDP7+/gH///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD+/v4B9/f3CODg4B+npaFrgnxzzaim + ovy2tLH/vLm2/7+9uv/Bvrv/wb67/8G+u//Bvrv/wb67/8G+u//Bvrv/wb67/8G+u//Bvrv/wb67/8G+ + u//Bvrv/wb67/8C9uv++u7j/ube0/7KvrP+Hgnrburm3T/Ly8g3+/v4B////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////APz8/APv7+8QxMPCQIF7 + cr6wran/u7i1/8C+u//Cv7z/wr+8/8K/vP/Cv7z/wr+8/8K/vP/Cv7z/wr+8/8K/vP/Cv7z/wr+8/8K/ + vP/Cv7z/wr+8/8K/vP/Cv7z/wr+8/8K/vP/Cv7z/wr+8/8C+u/+6t7T/jIaA49LR0TD7+/sE////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A+/v7BOXl + 5RqkoZ5wko6G6rm2s//Bvrv/w8C9/8PAvf/DwL3/w8C9/8PAvf+tq6j/enl2/1JQT/85Nzb/Li0s/ygn + Jv8nJiX/JyYl/ygnJv8tLCv/NzY0/0pJR/9raWf/l5WS/8G+u//DwL3/w8C9/8PAvf/Cv7z/s7Ct/6Gf + m3Xy8vIN////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD6+voF39/fII2Kg5erqab8vry5/8LAvf/Dwb7/w8G+/8PBvv+1s7D/YWBe/ywrKv8jIiD/JCMh/yQj + If8kIyH/JCMh/yQjIf8kIyH/JCMh/yQjIf8kIyH/JCMh/yQjIf8kIyH/JCMh/yMiIf89PDr/qKaj/8PB + vv/Dwb7/uLa0/4WBd6rr6+sU////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////APv7+wTg4OAfiIJ7pLWyr//Cv7z/xcK//8XCv//Fwr//vru4/1BPTv8jIiD/JSQi/yUk + Iv8lJCL/JSQi/yUkIv8lJCL/JSQi/yUkIv8lJCL/JSQi/yUkIv8lJCL/JSQi/yUkIv8lJCL/JSQi/yUk + Iv8lJCL/hYSB/8XCv//Fwr//ure1/4iCe6Ts7OwT////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A/v7+Aejo6BeTj4qOtrOw/8TBvv/Gw8D/xsPA/8bDwP+GhIL/JSQj/yYl + JP8mJST/JiUk/yYlJP8mJST/JiUk/yYlJP8mJST/JiUk/yYlJP8mJST/JiUk/yYlJP8mJST/JiUk/yYl + JP8mJST/JiUk/yYlJP8kIyL/rquo/8bDwP/Gw8D/uLWy/5+dmHjy8vIN////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A8vLyDa+tq16ppaH5w8C9/8fEwf/HxMH/x8TB/1ta + WP8mJST/JyYl/ycmJf8nJiX/JyYl/ycmJf8nJiX/JyYl/ycmJf8nJiX/JyYl/ycmJf8nJiX/JyYl/ycm + Jf8nJiX/JyYl/ycmJf8nJiX/JyYl/ycmJf8mJST/x8TB/8fEwf/Gw8D/rquo/Li3tVH5+fkG////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD5+fkG0NDQMI6KguHBv7v/yMbC/8jG + wv/IxsL/T09N/ykoJv8pKCb/KSgm/ykoJv8pKCb/KSgm/ykoJv8pKCb/KSgm/ykoJv8pKCb/KSgm/yko + Jv8pKCb/KSgm/ykoJv8pKCb/KSgm/ykoJv8pKCb/KSgm/ykoJv8wLy7/yMbC/8jGwv/GxMD/mZaP79HR + 0S/+/v4B////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP7+/gHm5uYZh4J6p7y7 + t//IxsL/ycfD/8nHw/9lZGL/Kikn/yopJ/8qKSf/Kikn/yopJ/8qKSf/Kikn/yopJ/8qKSf/Kikn/yop + J/8qKSf/Kikn/yopJ/8qKSf/Kikn/yopJ/8qKSf/Kikn/yopJ/8qKSf/Kikn/yopJ/9MS0r/ycfD/8nH + w//Dwr7/iYR72d3d3SL///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////APf3 + 9wi8u7pLqaWg+MfFwf/KyMT/ysjE/5uZlv8qKSf/LCsp/ywrKf8sKyn/LCsp/ywrKf8sKyn/LCsp/ywr + Kf8sKyn/LCsp/ywrKf8oJyX/Ozo4/2BfXP+Afnv/kZCM/5ORjv+JiIX/dXRx/1hXVP87Ojj/KSgn/ywr + Kf90cnD/ysjE/8rIxP/Av7v/hH51tubm5hn///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AOfn5xiGgHiswL67/8vJxv/Lycb/y8nG/y8tK/8uLCr/Liwq/y4sKv8uLCr/Liwq/y4s + Kv8uLCr/Liwq/y4sKv8uLCr/Kyoo/3Rzcf/Ewr//y8nG/8vJxv/Lycb/y8nG/8vJxv/Lycb/y8nG/8vJ + xv/Lycb/ycfE/5WTkf+0srD/y8nG/8vJxv+9vLn/l5OOiO/v7xD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A+/v7BM7OzTOdmJHuycbD/83Kx//Nysf/eHZ1/y8uLP8vLiz/Ly4s/y8u + LP8vLiz/Ly4s/y8uLP8vLiz/Ly4s/y8uLP9GRUP/zcrH/83Kx//Nysf/zcrH/83Kx/+3tLH/i4mH/3d1 + c/93dXP/jIqI/7e0sf/Nysf/zcrH/83Kx//Nysf/zcrH/83Kx/+3s7D9r66sWvT09Av///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A9PT0C6akoG+9u7j/zcvH/87MyP/OzMj/MC8t/zEw + Lf8xMC3/MTAt/zEwLf8xMC3/MTAt/zEwLf8xMC3/MTAt/1dVU//OzMj/QkE//y0sKf8vLiz/T05M/zY1 + M/8tLCv/MTAt/zEwLf8xMC3/MTAt/y0sKv8yMS//iIeD/87MyP/OzMj/zszI/87MyP/Bv7r+i4Z/nubm + 5hn+/v4B////AP///wD///8A////AP///wD///8A////AP///wD///8A6OjoF4aBeKzEw7//z83J/8/N + yf+Zl5X/MzIv/zMyL/8zMi//MzIv/zMyL/8zMi//MzIv/zMyL/8zMi//PTw6/8/Nyf8/Pjv/MzIv/zMy + L/8zMi//MzIv/zMyL/8zMi//MzIv/zMyL/8zMi//MzIv/zMyL/8zMi//MzIv/0A/Pf/Ny8f/z83J/8/N + yf/Mysb/sK6q+rOysFn09PQL////AP///wD///8A////AP///wD///8A////AP///wD+/v4B29vbJI2H + f9nLyMX/0c7L/9HOy/9UU1H/NTMx/zUzMf81MzH/NTMx/zUzMf81MzH/NTMx/zUzMf8wLiz/ure1/9HO + y/8vLiz/NTMx/zUzMf81MzH/NTMx/zUzMf81MzH/NTMx/zUzMf81MzH/NTMx/zUzMf81MzH/NTMx/zUz + Mf88Ozn/0c7L/9HOy//Rzsv/ycbD/4mCesvg4OAf/v7+Af///wD///8A////AP///wD///8A////AP// + /wD7+/sExMTCQaupovbQzsr/0tDM/7y7t/80MzH/NzUz/zc1M/83NTP/NzUz/zc1M/83NTP/NzUz/zc1 + M/9NTEv/0tDM/9LQzP8wLy7/NzUz/zc1M/83NTP/NzUz/zc1M/83NTP/NzUz/zc1M/83NTP/NzUz/zc1 + M/83NTP/NzUz/zc1M/83NTP/ZmZj/9LQzP/S0Mz/0M7K/7Oxrfq+vbtK+fn5Bv///wD///8A////AP// + /wD///8A////AP///wD19fUKqaajbMLBvv/T0c7/09HO/42Miv8yMS//OTc0/zk3NP85NzT/OTc0/zk3 + NP85NzT/OTc0/zg2M/+lpaL/09HO/9PRzv9FREL/OTc0/zk3NP85NzT/OTc0/zk3NP85NzT/OTc0/zk3 + NP85NzT/OTc0/zk3NP85NzT/OTc0/zk3NP85NzT/MjAv/8jGw//T0c7/09HO/8XDwP+YlI+I7+/vEP// + /wD///8A////AP///wD///8A////AP///wDu7u4RlZGKkcjGwv/V08//1dPP/2ppZ/85ODX/Ojk2/zo5 + Nv86OTb/Ojk2/zo5Nv86OTb/Ojk2/zIxMP/V08//1dPP/9XTz/+GhYL/Ojk2/zo5Nv86OTb/Ojk2/zo5 + Nv86OTb/Ojk2/zo5Nv86OTb/Ojk2/zo5Nv86OTb/Ojk2/zo5Nv86OTb/Ojk2/358ef/V08//1dPP/83L + x/+GgHbA3t3dIv39/QL///8A////AP///wD///8A////AP///wDo6OgXiIJ5rcvJxf/W1ND/1tTQ/1FQ + Tv88Ozj/PDs4/zw7OP88Ozj/PDs4/zw7OP88Ozj/PDs4/zw7Of/W1ND/1tTQ/9bU0P9mZGL/PDs4/zw7 + OP88Ozj/PDs4/zw7OP88Ozj/PDs4/zw7OP88Ozj/PDs4/zw7OP88Ozj/PDs4/zw7OP88Ozj/PDs4/0RD + Qf+sqqb/1tTQ/9HPy/+YlIzlvr27Tfj4+Af///8A////AP///wD///8A////AP///wDk5OQbh4J4vc/M + yf/Y1dL/2NXS/0VEQv8+PTr/Pj06/z49Ov8+PTr/Pj06/z49Ov8+PTr/Pj06/05MS//Y1dL/2NXS/9jV + 0v9IRkT/Pj06/z49Ov8+PTr/Pj06/z49Ov8+PTr/Pj06/z49Ov8+PTr/Pj06/z49Ov8+PTr/Pj06/z49 + Ov8+PTr/Pj06/zc2NP+EgoD/2NXS/9XS0P+yraj2pKGcd/Ly8g3///8A////AP///wD///8A////AP// + /wDj4+MciYN5w9DPy//Z19P/2dfT/0FBP/9APzz/QD88/0A/PP9APzz/QD88/0A/PP9APzz/QD88/11c + Wv/Z19P/2dfT/9nX0/9APz3/QD88/0A/PP9APzz/QD88/0A/PP9APzz/QD88/0A/PP9APzz/QD88/0A/ + PP9APzz/QD88/0A/PP9APzz/QD88/zY1M/9xb2z/2dfT/9jW0v/Avbn8mJSOjO/v7xD///8A////AP// + /wD///8A////AP///wDj4+MciIJ4wNHQzf/a2NX/2tjV/0RDQf9DQT3/Q0E9/0NBPf9DQT3/Q0E9/0NB + Pf9DQT3/REI+/19eXP/a2NX/2tjV/9rY1f9FREL/TUpG/01KRv9MSkb/TEpF/0tJRf9LSUT/SkhD/0lH + Qv9IRkL/R0VB/0dEQP9GRED/RUM//0VDPv9EQj7/REI+/zg2M/9sa2j/2tjV/9nX1P/HxcH9lZGKke/v + 7xD///8A////AP///wD///8A////AP///wDn5+cYiYN4s9LQzP/c2tb/3NrW/05NS/9FQz//RUM//0ZE + QP9KSET/UE5J/1lWUf9jYFr/aWZg/2JhX//c2tb/3NrW/9za1v9WVVT/WFZR/1ZUT/9UUk3/UlBL/1FO + Sv9PTUj/TkxH/01LRv9MSkb/S0lF/0tIRP9KSEP/SUdD/0lHQv9IRkL/SEZB/zs5Nv95eHb/3NrW/9rY + 1P+9urT5n5uWgfHx8Q7///8A////AP///wD///8A////AP///wDs7OwTkYyEm9DOyv/d29f/3dvX/2pp + Zv9WVFD/YmBd/2lnZP9samf/bGpn/2xqZ/9samf/bGpn/1pYVv/d29f/3dvX/93b1/91dHH/XltW/1tY + U/9ZVlH/V1RP/1VSTv9TUUz/UlBL/1FPSv9QTUn/T0xI/05MR/9NS0b/TEpG/0tJRf9LSUT/SkhE/0FA + Pv+dm5n/3dvX/9rY1P+kn5fstLKvXfb29gn///8A////AP///wD///8A////AP///wDy8vINoZ6Ze87M + yf/f3Nn/39zZ/5COjf9mZmL/bWxp/21saf9tbGn/bWxp/21saf9tbGn/bWxp/1taVv/f3Nn/39zZ/9/c + 2f+wrqv/YV9Z/2FfWf9eXFf/XFlU/1pXUv9YVlH/VlRP/1VSTv9TUU3/UlBL/1FPSv9QTkr/T01J/09M + SP9OTEf/TUtH/2RiYP/Qzcr/39zZ/9vY1f+WkIfgwL++SPj4+Af///8A////AP///wD///8A////AP// + /wD4+PgHube1U8LAuvve3Nj/4N7a/7e1sv9cW1n/bm1q/25tav9ubWr/bm1q/25tav9ubWr/bm1q/2lo + Zf/Avrv/4N7a/+De2v/g3tr/UVBN/2dmYP9jYl3/YV9a/15dV/9cWlb/WlhU/1hXUv9WVVH/VVRP/1RT + Tv9TUk3/UlFM/1FQS/9QT0r/T05K/0VEQP+fnpv/4N7a/93b1/+0sav0pqOfdPLy8g3///8A////AP// + /wD///8A////AP///wD+/v4B1NTTLKCblObd29j/4d/c/+Lg3f9eXlz/cG9s/3BvbP9wb2z/cG9s/3Bv + bP9wb2z/cG9s/3BvbP92dXP/4d/c/+Hf3P/h39z/n56b/25tZv9ramT/Z2Zh/2RjXf9hYFv/X15Z/11c + V/9bWlX/WVhT/1hXUv9WVVH/VVRQ/1RTT/9TUk7/UlFN/0dGQv9aWVf/4d/c/+De2//U0s//jYd+qenp + 6Rb///8A////AP///wD///8A////AP///wD///8A4+PjHIqEe77a2NT/4+Hd/+Ph3f+KiYf/cXBt/3Fw + bf9xcG3/cXBt/3Fwbf9xcG3/cXBt/3Fwbf9fXVv/4N7a/+Ph3f/j4d3/4+Hd/21raf9xcGv/b2xm/2to + Y/9oZWD/ZWJd/2JgW/9gXVj/XlxX/1xaVf9bWFP/WVdS/1hVUf9XVFD/VlNP/1JQTP9KSEb/4+Hd/+Ph + 3f/Z19P/joh9xOTk5Bv///8A////AP///wD///8A////AP///wD///8A7+/vEJuXkInV08//5OLe/+Ti + 3v/W1ND/ZGNh/3Nxbv9zcW7/c3Fu/3Nxbv9zcW7/c3Fu/3Nxbv9zcW7/cnFw/+Ti3v/k4t7/5OLe/+Ti + 3v9qamj/c3Fu/3Nxa/9vbGf/a2lj/2hmYf9lY17/Y2Fc/2FeWv9fXVj/XVtW/1xZVf9aWFT/WVdT/01K + R/9XVlT/5OLe/+Ti3v/X1tL/i4V7sejo6Bf///8A////AP///wD///8A////AP///wD///8A+fn5Br++ + vEnCv7r64uDc/+Xj3//l49//ZmVi/3VzcP91c3D/dXNw/3VzcP91c3D/dXNw/3VzcP91c3D/b25r/52c + mf/l49//5ePf/+Xj3//l49//nZya/1taVP9zcm3/c3Fr/3BtZ/9saWT/aWZh/2dkX/9RT0v/S0pG/1tY + VP9fXFj/WllU/3Fvbf/IxsL/5ePf/+Ph3f/Bvrj4op+ZfPHx8Q7///8A////AP///wD///8A////AP// + /wD///8A/v7+Ad/f3yCRi4HN39zZ/+fk4f/n5OH/xsPA/2xrZ/92dXH/dnVx/3Z1cf92dXH/dnVx/3Z1 + cf92dXH/dnVx/21rZ/+ZmJb/5+Th/+fk4f/n5OH/5+Th/+fk4f+6uLX/h4WC/29ta/9raWf/eHZ0/56c + mf/a19T/5+Th/8TCv/+pqKX/xMK//+fk4f/n5OH/5+Th/9/c2f+Zk4ray8vJPPr6+gX///8A////AP// + /wD///8A////AP///wD///8A////APLy8g2lo5501dPP/+bk4P/o5uL/6Obi/3NycP93dXL/d3Vy/3d1 + cv93dXL/d3Vy/3d1cv93dXL/d3Vy/3d1cv91c3D/ZmVj/9XU0P/o5uL/6Obi/+jm4v/o5uL/6Obi/+jm + 4v/o5uL/6Obi/+jm4v/o5uL/6Obi/93b1//g3tr/6Obi/+jm4v/o5uL/4+He/8zKxf2sqqZp7+/vEP7+ + /gH///8A////AP///wD///8A////AP///wD///8A////APz8/APa2tolmJKI1+Hf2//p5+P/6efj/+nn + 4/9gX1z/eXdz/3l3c/95d3P/eXdz/3l3c/95d3P/eXdz/3l3c/95d3P/eXdz/2xrZ/9kYmH/npya/83L + yP/n5eH/6efj/+nn4//p5+P/3tzY/768uf+Rj43/W1pX/2FfWf+Tko//6efj/+nn4//n5eH/zMnE+pWQ + iZbm5uYZ/f39Av///wD///8A////AP///wD///8A////AP///wD///8A////AP///wDy8vINsa+sYMvI + w/vm5OD/6ujk/+ro5P/KycX/aGdj/3p4df96eHX/enh1/3p4df96eHX/enh1/3p4df96eHX/enh1/3p4 + df96eHX/enh1/3Jvbf9oZmP/Y2Fg/2JgX/9kY2H/bGtn/3h2cv96eHX/enZw/3Zybf9hYF7/6ujk/+ro + 5P/n5eH/paCX6MrKyjX5+fkG////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD9/f0C5eXlGpCKgaXb2df/6efk/+vp5v/r6eb/uLa0/2tqZ/97eXX/e3l1/3t5df97eXX/e3l1/3t5 + df97eXX/e3l1/3t5df97eXX/e3l1/3t5df97eXX/e3l1/3t5df97eXX/e3l1/3t5df97eXX/e3l1/3t5 + c/9aWFL/6+nm/+vp5v/p5+T/y8jE+7y7uU74+PgH////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A+vr6BdfX1yiXkYjV4uDd/+vp5v/s6uf/7Orn/8G/vP9lZGL/fXp2/316 + dv99enb/fXp2/316dv99enb/fXp2/316dv99enb/fXp2/316dv99enb/fXp2/316dv99enb/fXp2/316 + dv99enb/fXp2/316dv92c2z/yMfE/+zq5//s6uf/3NrY/5yYkojv7+8Q////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////APX19QrCwb9Framh6uXj4P/s6uf/7evo/+3r + 6P/e3dr/ZGNh/318eP99fHj/fXx4/318eP99fHj/fXx4/318eP99fHj/fXx4/318eP99fHj/fXx4/318 + eP99fHj/fXx4/318eP99fHj/fXx4/318eP99fHj/jIuJ/+3r6P/t6+j/5OLf/5CKf8Pj4+Mc////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP7+/gHw8PAPtrSyWLOu + p+3m4+D/7ern/+/s6f/v7On/7+zp/6WjoP9kYmD/fn15/359ef9+fXn/fn15/359ef9+fXn/fn15/359 + ef9+fXn/fn15/359ef9+fXn/fn15/359ef9+fXn/fn15/359ef9+fXn/Y2Jg/+/s6f/v7On/6ufk/6un + n+nV1dQr/v7+Af///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD+/v4B7+/vELu6uFCinZTf4uDd/+zq5//v7er/7+3q/+/t6v/v7er/n52b/2JhX/90c2//f315/399 + ef9/fXn/f315/399ef9/fXn/f315/399ef9/fXn/f315/399ef9/fXn/f315/399ef93dnL/Z2Zk/+/t + 6v/v7er/7Orn/8TBvffJyMc9/f39Av///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A/v7+AfLy8g3Ozc00j4l+vdza2P/q6OX/7+3q//Du6//w7uv/8O7r//Du + 6//c2tf/lJOQ/2hnZf9jY2D/a2pm/3Rzb/98enb/fXt4/358eP95d3T/cXBs/2ppZv9kY1//aWhm/5CP + jv/Y1tP/8O7r//Du6//w7uv/6ujl/6ynoOjW1tYp/v7+Af///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD4+PgH3t7eIZ+alIW2sart5OLe/+zq + 5v/w7ur/8e/r//Hv6//x7+v/7uzo/8fGw/+amZb/fHt4/2lnZf9kZGD/ZGNg/2RjYP9lZGH/a2po/4GA + ff+enJn/x8bD/+7s6P/x7+v/8e/r//Hv6//v7en/4N7a/5KMgafp6ekW////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A+/v7BOzs + 7BPIx8Y9j4l+rLu4sfHi4Nz/6ujl//Du6v/y8Oz/8vDs//Lw7P/y8Oz/8vDs//Lw7P/y8Oz/8vDs//Lw + 7P/y8Oz/8vDs//Lw7P/y8Oz/8vDs//Lw7P/y8Oz/8O7q/+ro5f/f3dn/lpCFy9XU1Cz5+fkG////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP7+/gH4+PgH5ubmGcbFxD+YlIyUnpeO18zKxPni4Nz/6Obi/+zq5v/w7ur/8vDs//Px + 7f/z8e3/8/Ht//Px7f/z8e3/8/Ht//Lw7P/w7ur/7Orm/+jm4v/i4Nz/z83I+p+aj9qdmJGM2traJff3 + 9wj///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A/v7+Afn5+Qbt7e0S3NzcI7++vEqhnph/joh9tKKc + k97Bvbbz3NnW/ebk4f/o5uP/6efk/+nn5P/o5uP/5uTh/9jV0fy+urTyoJqS3o6Hfbainph/v768S9vb + 2yTu7u4R+/v7BP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A/v7+Afn5 + +Qbx8fEO5OTkG8vKyD2vrahonZiRjJGLgaePiX63kIp/vpCJfr2PiX6zlI6FoZ+blYexrqtly8vJPOTk + 5Bvx8fEO+fn5Bv7+/gH///8A////AP///wD///8A////AP///wD///8A////AP///wAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAA= + + \ No newline at end of file diff --git a/Aura Debugger/Aura Debugger/NetworkManager.cs b/Aura Debugger/Aura Debugger/NetworkManager.cs new file mode 100644 index 0000000..cde27bc --- /dev/null +++ b/Aura Debugger/Aura Debugger/NetworkManager.cs @@ -0,0 +1,197 @@ +using System; +using System.IO; +using System.ComponentModel; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Net; +using System.Net.Sockets; +using System.Drawing; + +namespace Aura_Debugger +{ + public static class NetworkManager + { + public static TcpListener Listener; + public static TcpClient Client; + + public static string IP; + public static int Port; + public static int PacketNumber; + public static bool Connected; + public static bool Waiting; + + public static void Initialize() + { + // reset values + Listener = null; + Client = null; + PacketNumber = 0; + Port = 0; + IP = "0.0.0.0"; + + // not connected + Connected = false; + Waiting = false; + } + + public static void WriteToLog(string text) + { + Program.MainForm.WriteTextBox(text); + } + + public static void WriteInfo(string text) + { + Program.MainForm.WriteTextBox("[ "); + Program.MainForm.WriteTextBox(">>>", Color.Cyan); + Program.MainForm.WriteTextBox(" ] "); + Program.MainForm.WriteTextBox(text + Environment.NewLine); + } + + public static void WriteError(string text) + { + Program.MainForm.WriteTextBox("[ "); + Program.MainForm.WriteTextBox("ERROR", Color.Red); + Program.MainForm.WriteTextBox(" ] "); + Program.MainForm.WriteTextBox(text + Environment.NewLine); + } + + public static void WaitForConnection() + { + Listener = null; + Waiting = true; + + try + { + Listener = new TcpListener(IPAddress.Any, Port); + Listener.Start(); + + int i = 0; + byte[] bytes = new byte[256]; + + while (true) + { + WriteInfo("Waiting for a connection..."); + Program.MainForm.WaitState(); + + Client = Listener.AcceptTcpClient(); + WriteInfo("Connected!"); + + Connected = true; + Waiting = false; + Program.MainForm.ConnectedState(); + + NetworkStream stream = Client.GetStream(); + while ((i = stream.Read(bytes, 0, bytes.Length)) != 0) + { + PacketNumber++; + WriteToLog(Encoding.ASCII.GetString(bytes, 0, i)); + } + + Client.Close(); + WriteInfo("Connection closed!"); + Program.MainForm.ResetState(); + Connected = false; + } + } + // socket exception error + catch (SocketException e) + { + if (e.SocketErrorCode == SocketError.Interrupted) { } + else { WriteError("Socket Exception: " + e); } + Program.MainForm.ResetState(); + Waiting = false; + Connected = false; + } + // stop listening and print message + finally + { + Listener.Stop(); + WriteInfo("Connection closed!"); + Program.MainForm.ResetState(); + Waiting = false; + Connected = false; + } + } + + public static void Connect(string addr) + { + Waiting = true; + + // parse input string + string[] parts = addr.Split(':'); + string ip = string.Empty; + string port = string.Empty; + + if (parts.Length >= 1) { ip = parts[0]; } + if (parts.Length >= 2) { port = parts[1]; } + + // set ip + IP = ip; + + // parse and set port + if (!int.TryParse(port, out Port)) + { + WriteError("Invalid port " + port); + Program.MainForm.ResetState(); + return; + } + + // validate port + if (Port >= 0xFFFF) + { + WriteError("Invalid port " + Port.ToString()); + Program.MainForm.ResetState(); + return; + } + + try + { + int i = 0; + byte[] bytes = new byte[256]; + + while (true) + { + WriteInfo("Waiting to connect..."); + Program.MainForm.ConnectingState(); + + Client = new TcpClient(); + Client.Connect(ip, Port); + + WriteInfo("Connected!"); + Connected = true; + Waiting = false; + Program.MainForm.ConnectedState(); + + NetworkStream stream = Client.GetStream(); + while ((i = stream.Read(bytes, 0, bytes.Length)) != 0) + { + PacketNumber++; + WriteToLog(Encoding.ASCII.GetString(bytes, 0, i)); + } + + Client.Close(); + WriteInfo("Connection closed!"); + Program.MainForm.ResetState(); + Connected = false; + } + } + catch (SocketException e) + { + if (e.SocketErrorCode == SocketError.Interrupted) { } + else { WriteError("Socket Exception: " + e); } + Program.MainForm.ResetState(); + Waiting = false; + Connected = false; + } + finally + { + WriteInfo("Connection closed!"); + Program.MainForm.ResetState(); + Waiting = false; + Connected = false; + } + } + } +} diff --git a/Aura Debugger/Aura Debugger/Program.cs b/Aura Debugger/Aura Debugger/Program.cs index 9809538..eed9444 100644 --- a/Aura Debugger/Aura Debugger/Program.cs +++ b/Aura Debugger/Aura Debugger/Program.cs @@ -8,15 +8,16 @@ namespace Aura_Debugger { static class Program { - /// - /// Point d'entrée principal de l'application. - /// + public static Form1 MainForm; + [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); - Application.Run(new Form1()); + + MainForm = new Form1(); + Application.Run(MainForm); } } }