From 35e83a5fb39a2c75024f6a15537e75616ee678ab Mon Sep 17 00:00:00 2001 From: hogantp Date: Mon, 9 Nov 2009 18:26:40 +0000 Subject: [PATCH] added ghost dynamic configurator with source code written by HardwareBug --- ghost configurator/ReadMe.txt | 22 + ghost configurator/ghost configurator.sln | 20 + .../ghost configurator/Form1.Designer.vb | 379 +++++ .../ghost configurator/Form1.resx | 209 +++ .../ghost configurator/Form1.vb | 1288 +++++++++++++++++ .../My Project/Application.Designer.vb | 38 + .../My Project/Application.myapp | 10 + .../My Project/AssemblyInfo.vb | 39 + .../My Project/Resources.Designer.vb | 79 + .../My Project/Resources.resx | 127 ++ .../My Project/Settings.Designer.vb | 97 ++ .../My Project/Settings.settings | 12 + .../My Project/app.manifest | 26 + .../Resources/parametres 3D.ico | Bin 0 -> 16478 bytes .../ghost configurator/bin/Debug/ghost.cfg | 411 ++++++ .../ghost configurator.vbproj | 183 +++ .../ghost configurator.vbproj.user | 17 + ghost dynamic configurator.exe | Bin 0 -> 94208 bytes 18 files changed, 2957 insertions(+) create mode 100644 ghost configurator/ReadMe.txt create mode 100644 ghost configurator/ghost configurator.sln create mode 100644 ghost configurator/ghost configurator/Form1.Designer.vb create mode 100644 ghost configurator/ghost configurator/Form1.resx create mode 100644 ghost configurator/ghost configurator/Form1.vb create mode 100644 ghost configurator/ghost configurator/My Project/Application.Designer.vb create mode 100644 ghost configurator/ghost configurator/My Project/Application.myapp create mode 100644 ghost configurator/ghost configurator/My Project/AssemblyInfo.vb create mode 100644 ghost configurator/ghost configurator/My Project/Resources.Designer.vb create mode 100644 ghost configurator/ghost configurator/My Project/Resources.resx create mode 100644 ghost configurator/ghost configurator/My Project/Settings.Designer.vb create mode 100644 ghost configurator/ghost configurator/My Project/Settings.settings create mode 100644 ghost configurator/ghost configurator/My Project/app.manifest create mode 100644 ghost configurator/ghost configurator/Resources/parametres 3D.ico create mode 100644 ghost configurator/ghost configurator/bin/Debug/ghost.cfg create mode 100644 ghost configurator/ghost configurator/ghost configurator.vbproj create mode 100644 ghost configurator/ghost configurator/ghost configurator.vbproj.user create mode 100644 ghost dynamic configurator.exe diff --git a/ghost configurator/ReadMe.txt b/ghost configurator/ReadMe.txt new file mode 100644 index 00000000..d39b1b7e --- /dev/null +++ b/ghost configurator/ReadMe.txt @@ -0,0 +1,22 @@ +Installation: +Place this application in your ghost++ directory. + +Support: +For any help check out the information at the help tab(in the app). + +Info: +release: 27.9.2009 +auto: HardwareBug +version: 1.05 +written with: Virtual Basic 2008 Express Edition + +change log: +27.9.2009 - v1.05 +-the ghost.cfg path is now customizable +-added a button to remove a bnet server +-added checkboxes to "run ghost after closing" or "don't save settings on exit" +-if the settings can not be saved to the cfg file the settings will be saved to a backup file +-fixed some small bugs + +19.9.2009 - v1.0 +-initial release \ No newline at end of file diff --git a/ghost configurator/ghost configurator.sln b/ghost configurator/ghost configurator.sln new file mode 100644 index 00000000..f42d6111 --- /dev/null +++ b/ghost configurator/ghost configurator.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual Basic Express 2008 +Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "ghost configurator", "ghost configurator\ghost configurator.vbproj", "{CDE6F876-E220-4495-8552-422354CDED44}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {CDE6F876-E220-4495-8552-422354CDED44}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CDE6F876-E220-4495-8552-422354CDED44}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CDE6F876-E220-4495-8552-422354CDED44}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CDE6F876-E220-4495-8552-422354CDED44}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/ghost configurator/ghost configurator/Form1.Designer.vb b/ghost configurator/ghost configurator/Form1.Designer.vb new file mode 100644 index 00000000..00784bdc --- /dev/null +++ b/ghost configurator/ghost configurator/Form1.Designer.vb @@ -0,0 +1,379 @@ + _ +Partial Class Form1 + Inherits System.Windows.Forms.Form + + 'Das Formular überschreibt den Löschvorgang, um die Komponentenliste zu bereinigen. + _ + Protected Overrides Sub Dispose(ByVal disposing As Boolean) + Try + If disposing AndAlso components IsNot Nothing Then + components.Dispose() + End If + Finally + MyBase.Dispose(disposing) + End Try + End Sub + + 'Wird vom Windows Form-Designer benötigt. + Private components As System.ComponentModel.IContainer + + 'Hinweis: Die folgende Prozedur ist für den Windows Form-Designer erforderlich. + 'Das Bearbeiten ist mit dem Windows Form-Designer möglich. + 'Das Bearbeiten mit dem Code-Editor ist nicht möglich. + _ + Private Sub InitializeComponent() + Me.components = New System.ComponentModel.Container + Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(Form1)) + Me.TabControl1 = New System.Windows.Forms.TabControl + Me.TabBot = New System.Windows.Forms.TabPage + Me.TabBnet = New System.Windows.Forms.TabPage + Me.TabControl2 = New System.Windows.Forms.TabControl + Me.SubTab1 = New System.Windows.Forms.TabPage + Me.addServer = New System.Windows.Forms.Button + Me.TabAgame = New System.Windows.Forms.TabPage + Me.GroupReplay = New System.Windows.Forms.GroupBox + Me.GroupLAN = New System.Windows.Forms.GroupBox + Me.GroupAHost = New System.Windows.Forms.GroupBox + Me.GroupUdpTcp = New System.Windows.Forms.GroupBox + Me.GroupAGame = New System.Windows.Forms.GroupBox + Me.Tabdb = New System.Windows.Forms.TabPage + Me.TabCfgUp = New System.Windows.Forms.TabPage + Me.BtnUpdate = New System.Windows.Forms.Button + Me.UpdateInfo = New System.Windows.Forms.Label + Me.TabHelp = New System.Windows.Forms.TabPage + Me.RichTextBox1 = New System.Windows.Forms.RichTextBox + Me.InfoLabel = New System.Windows.Forms.Label + Me.CBoxInfoTimer = New System.Windows.Forms.Timer(Me.components) + Me.OpenACfg = New System.Windows.Forms.OpenFileDialog + Me.CfgPathBox = New System.Windows.Forms.TextBox + Me.CfgBrowserBtn = New System.Windows.Forms.Button + Me.dontSaveCB = New System.Windows.Forms.CheckBox + Me.runGhostCB = New System.Windows.Forms.CheckBox + Me.TabControl1.SuspendLayout() + Me.TabBnet.SuspendLayout() + Me.TabControl2.SuspendLayout() + Me.SubTab1.SuspendLayout() + Me.TabAgame.SuspendLayout() + Me.TabCfgUp.SuspendLayout() + Me.TabHelp.SuspendLayout() + Me.SuspendLayout() + ' + 'TabControl1 + ' + Me.TabControl1.Anchor = CType(((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Left) _ + Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles) + Me.TabControl1.Controls.Add(Me.TabBot) + Me.TabControl1.Controls.Add(Me.TabBnet) + Me.TabControl1.Controls.Add(Me.TabAgame) + Me.TabControl1.Controls.Add(Me.Tabdb) + Me.TabControl1.Controls.Add(Me.TabCfgUp) + Me.TabControl1.Controls.Add(Me.TabHelp) + Me.TabControl1.Location = New System.Drawing.Point(12, 22) + Me.TabControl1.MinimumSize = New System.Drawing.Size(0, 200) + Me.TabControl1.Name = "TabControl1" + Me.TabControl1.SelectedIndex = 0 + Me.TabControl1.Size = New System.Drawing.Size(426, 390) + Me.TabControl1.TabIndex = 0 + ' + 'TabBot + ' + Me.TabBot.AutoScroll = True + Me.TabBot.Location = New System.Drawing.Point(4, 22) + Me.TabBot.Name = "TabBot" + Me.TabBot.Padding = New System.Windows.Forms.Padding(3) + Me.TabBot.Size = New System.Drawing.Size(418, 364) + Me.TabBot.TabIndex = 0 + Me.TabBot.Text = "Bot" + Me.TabBot.UseVisualStyleBackColor = True + ' + 'TabBnet + ' + Me.TabBnet.Controls.Add(Me.TabControl2) + Me.TabBnet.Location = New System.Drawing.Point(4, 22) + Me.TabBnet.Name = "TabBnet" + Me.TabBnet.Padding = New System.Windows.Forms.Padding(3) + Me.TabBnet.Size = New System.Drawing.Size(418, 364) + Me.TabBnet.TabIndex = 1 + Me.TabBnet.Text = "Battle.net" + Me.TabBnet.UseVisualStyleBackColor = True + ' + 'TabControl2 + ' + Me.TabControl2.Anchor = CType(((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Left) _ + Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles) + Me.TabControl2.Controls.Add(Me.SubTab1) + Me.TabControl2.Location = New System.Drawing.Point(6, 6) + Me.TabControl2.Name = "TabControl2" + Me.TabControl2.SelectedIndex = 0 + Me.TabControl2.Size = New System.Drawing.Size(406, 214) + Me.TabControl2.TabIndex = 0 + ' + 'SubTab1 + ' + Me.SubTab1.BackColor = System.Drawing.Color.WhiteSmoke + Me.SubTab1.Controls.Add(Me.addServer) + Me.SubTab1.Location = New System.Drawing.Point(4, 22) + Me.SubTab1.Name = "SubTab1" + Me.SubTab1.Padding = New System.Windows.Forms.Padding(3) + Me.SubTab1.Size = New System.Drawing.Size(398, 188) + Me.SubTab1.TabIndex = 0 + Me.SubTab1.Text = "Server 1" + ' + 'addServer + ' + Me.addServer.Anchor = CType((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles) + Me.addServer.Location = New System.Drawing.Point(322, 8) + Me.addServer.Name = "addServer" + Me.addServer.Size = New System.Drawing.Size(74, 20) + Me.addServer.TabIndex = 0 + Me.addServer.Text = "add server" + Me.addServer.UseVisualStyleBackColor = True + ' + 'TabAgame + ' + Me.TabAgame.Controls.Add(Me.GroupReplay) + Me.TabAgame.Controls.Add(Me.GroupLAN) + Me.TabAgame.Controls.Add(Me.GroupAHost) + Me.TabAgame.Controls.Add(Me.GroupUdpTcp) + Me.TabAgame.Controls.Add(Me.GroupAGame) + Me.TabAgame.Location = New System.Drawing.Point(4, 22) + Me.TabAgame.Name = "TabAgame" + Me.TabAgame.Size = New System.Drawing.Size(418, 364) + Me.TabAgame.TabIndex = 2 + Me.TabAgame.Text = "Admin Game & more" + Me.TabAgame.UseVisualStyleBackColor = True + ' + 'GroupReplay + ' + Me.GroupReplay.Anchor = CType(((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Left) _ + Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles) + Me.GroupReplay.Location = New System.Drawing.Point(3, 195) + Me.GroupReplay.Name = "GroupReplay" + Me.GroupReplay.Size = New System.Drawing.Size(412, 59) + Me.GroupReplay.TabIndex = 0 + Me.GroupReplay.TabStop = False + Me.GroupReplay.Text = "Replay" + ' + 'GroupLAN + ' + Me.GroupLAN.Anchor = CType(((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Left) _ + Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles) + Me.GroupLAN.Location = New System.Drawing.Point(3, 260) + Me.GroupLAN.Name = "GroupLAN" + Me.GroupLAN.Size = New System.Drawing.Size(412, 59) + Me.GroupLAN.TabIndex = 0 + Me.GroupLAN.TabStop = False + Me.GroupLAN.Text = "LAN" + ' + 'GroupAHost + ' + Me.GroupAHost.Anchor = CType(((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Left) _ + Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles) + Me.GroupAHost.Location = New System.Drawing.Point(3, 130) + Me.GroupAHost.Name = "GroupAHost" + Me.GroupAHost.Size = New System.Drawing.Size(412, 59) + Me.GroupAHost.TabIndex = 0 + Me.GroupAHost.TabStop = False + Me.GroupAHost.Text = "AutoHost" + ' + 'GroupUdpTcp + ' + Me.GroupUdpTcp.Anchor = CType(((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Left) _ + Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles) + Me.GroupUdpTcp.Location = New System.Drawing.Point(3, 74) + Me.GroupUdpTcp.Name = "GroupUdpTcp" + Me.GroupUdpTcp.Size = New System.Drawing.Size(412, 50) + Me.GroupUdpTcp.TabIndex = 0 + Me.GroupUdpTcp.TabStop = False + Me.GroupUdpTcp.Text = "UDP && TCP" + ' + 'GroupAGame + ' + Me.GroupAGame.Anchor = CType(((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Left) _ + Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles) + Me.GroupAGame.Location = New System.Drawing.Point(3, 3) + Me.GroupAGame.Name = "GroupAGame" + Me.GroupAGame.Size = New System.Drawing.Size(412, 65) + Me.GroupAGame.TabIndex = 0 + Me.GroupAGame.TabStop = False + Me.GroupAGame.Text = "Admin Game" + ' + 'Tabdb + ' + Me.Tabdb.Location = New System.Drawing.Point(4, 22) + Me.Tabdb.Name = "Tabdb" + Me.Tabdb.Size = New System.Drawing.Size(418, 364) + Me.Tabdb.TabIndex = 3 + Me.Tabdb.Text = "Database" + Me.Tabdb.UseVisualStyleBackColor = True + ' + 'TabCfgUp + ' + Me.TabCfgUp.Controls.Add(Me.BtnUpdate) + Me.TabCfgUp.Controls.Add(Me.UpdateInfo) + Me.TabCfgUp.Location = New System.Drawing.Point(4, 22) + Me.TabCfgUp.Name = "TabCfgUp" + Me.TabCfgUp.Size = New System.Drawing.Size(418, 364) + Me.TabCfgUp.TabIndex = 4 + Me.TabCfgUp.Text = "Cfg Updater" + Me.TabCfgUp.UseVisualStyleBackColor = True + ' + 'BtnUpdate + ' + Me.BtnUpdate.Location = New System.Drawing.Point(164, 126) + Me.BtnUpdate.Name = "BtnUpdate" + Me.BtnUpdate.Size = New System.Drawing.Size(80, 25) + Me.BtnUpdate.TabIndex = 1 + Me.BtnUpdate.Text = "Update!" + Me.BtnUpdate.UseVisualStyleBackColor = True + ' + 'UpdateInfo + ' + Me.UpdateInfo.AutoSize = True + Me.UpdateInfo.Location = New System.Drawing.Point(3, 47) + Me.UpdateInfo.MaximumSize = New System.Drawing.Size(400, 0) + Me.UpdateInfo.Name = "UpdateInfo" + Me.UpdateInfo.Size = New System.Drawing.Size(395, 65) + Me.UpdateInfo.TabIndex = 0 + Me.UpdateInfo.Text = resources.GetString("UpdateInfo.Text") + ' + 'TabHelp + ' + Me.TabHelp.Controls.Add(Me.RichTextBox1) + Me.TabHelp.Location = New System.Drawing.Point(4, 22) + Me.TabHelp.Name = "TabHelp" + Me.TabHelp.Size = New System.Drawing.Size(418, 364) + Me.TabHelp.TabIndex = 5 + Me.TabHelp.Text = "Help" + Me.TabHelp.UseVisualStyleBackColor = True + ' + 'RichTextBox1 + ' + Me.RichTextBox1.Anchor = CType((((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Bottom) _ + Or System.Windows.Forms.AnchorStyles.Left) _ + Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles) + Me.RichTextBox1.Location = New System.Drawing.Point(10, 10) + Me.RichTextBox1.Name = "RichTextBox1" + Me.RichTextBox1.ReadOnly = True + Me.RichTextBox1.ScrollBars = System.Windows.Forms.RichTextBoxScrollBars.ForcedVertical + Me.RichTextBox1.Size = New System.Drawing.Size(395, 351) + Me.RichTextBox1.TabIndex = 0 + Me.RichTextBox1.Text = resources.GetString("RichTextBox1.Text") + ' + 'InfoLabel + ' + Me.InfoLabel.Anchor = CType(((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Left) _ + Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles) + Me.InfoLabel.AutoSize = True + Me.InfoLabel.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte)) + Me.InfoLabel.Location = New System.Drawing.Point(9, 415) + Me.InfoLabel.MaximumSize = New System.Drawing.Size(434, 0) + Me.InfoLabel.Name = "InfoLabel" + Me.InfoLabel.Size = New System.Drawing.Size(393, 13) + Me.InfoLabel.TabIndex = 1 + Me.InfoLabel.Text = "Click at a Textbox or hover over a checkbox to get informatione about this settin" & _ + "g!" + ' + 'CBoxInfoTimer + ' + Me.CBoxInfoTimer.Interval = 200 + ' + 'OpenACfg + ' + Me.OpenACfg.Filter = "a ghost cfg|*.cfg" + ' + 'CfgPathBox + ' + Me.CfgPathBox.Anchor = CType((System.Windows.Forms.AnchorStyles.Bottom Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles) + Me.CfgPathBox.Location = New System.Drawing.Point(95, 419) + Me.CfgPathBox.Name = "CfgPathBox" + Me.CfgPathBox.Size = New System.Drawing.Size(309, 20) + Me.CfgPathBox.TabIndex = 2 + Me.CfgPathBox.Visible = False + ' + 'CfgBrowserBtn + ' + Me.CfgBrowserBtn.Anchor = CType((System.Windows.Forms.AnchorStyles.Bottom Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles) + Me.CfgBrowserBtn.Location = New System.Drawing.Point(410, 419) + Me.CfgBrowserBtn.Name = "CfgBrowserBtn" + Me.CfgBrowserBtn.Size = New System.Drawing.Size(28, 19) + Me.CfgBrowserBtn.TabIndex = 3 + Me.CfgBrowserBtn.Text = "..." + Me.CfgBrowserBtn.UseVisualStyleBackColor = True + Me.CfgBrowserBtn.Visible = False + ' + 'dontSaveCB + ' + Me.dontSaveCB.AutoSize = True + Me.dontSaveCB.Location = New System.Drawing.Point(148, 3) + Me.dontSaveCB.Name = "dontSaveCB" + Me.dontSaveCB.Size = New System.Drawing.Size(148, 17) + Me.dontSaveCB.TabIndex = 7 + Me.dontSaveCB.Text = "don't save settings on exit" + Me.dontSaveCB.UseVisualStyleBackColor = True + ' + 'runGhostCB + ' + Me.runGhostCB.AutoSize = True + Me.runGhostCB.Location = New System.Drawing.Point(12, 3) + Me.runGhostCB.Name = "runGhostCB" + Me.runGhostCB.Size = New System.Drawing.Size(130, 17) + Me.runGhostCB.TabIndex = 8 + Me.runGhostCB.Text = "run ghost after closing" + Me.runGhostCB.UseVisualStyleBackColor = True + ' + 'Form1 + ' + Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) + Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font + Me.ClientSize = New System.Drawing.Size(450, 448) + Me.Controls.Add(Me.runGhostCB) + Me.Controls.Add(Me.dontSaveCB) + Me.Controls.Add(Me.CfgBrowserBtn) + Me.Controls.Add(Me.CfgPathBox) + Me.Controls.Add(Me.InfoLabel) + Me.Controls.Add(Me.TabControl1) + Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.Fixed3D + Me.MaximizeBox = False + Me.MinimizeBox = False + Me.Name = "Form1" + Me.Text = "Loading..." + Me.TabControl1.ResumeLayout(False) + Me.TabBnet.ResumeLayout(False) + Me.TabControl2.ResumeLayout(False) + Me.SubTab1.ResumeLayout(False) + Me.TabAgame.ResumeLayout(False) + Me.TabCfgUp.ResumeLayout(False) + Me.TabCfgUp.PerformLayout() + Me.TabHelp.ResumeLayout(False) + Me.ResumeLayout(False) + Me.PerformLayout() + + End Sub + Friend WithEvents TabControl1 As System.Windows.Forms.TabControl + Friend WithEvents TabBot As System.Windows.Forms.TabPage + Friend WithEvents TabAgame As System.Windows.Forms.TabPage + Friend WithEvents Tabdb As System.Windows.Forms.TabPage + Friend WithEvents InfoLabel As System.Windows.Forms.Label + Friend WithEvents CBoxInfoTimer As System.Windows.Forms.Timer + Friend WithEvents TabBnet As System.Windows.Forms.TabPage + Friend WithEvents TabControl2 As System.Windows.Forms.TabControl + Friend WithEvents SubTab1 As System.Windows.Forms.TabPage + Friend WithEvents TabCfgUp As System.Windows.Forms.TabPage + Friend WithEvents BtnUpdate As System.Windows.Forms.Button + Friend WithEvents UpdateInfo As System.Windows.Forms.Label + Friend WithEvents OpenACfg As System.Windows.Forms.OpenFileDialog + Friend WithEvents GroupLAN As System.Windows.Forms.GroupBox + Friend WithEvents GroupAHost As System.Windows.Forms.GroupBox + Friend WithEvents GroupUdpTcp As System.Windows.Forms.GroupBox + Friend WithEvents GroupAGame As System.Windows.Forms.GroupBox + Friend WithEvents GroupReplay As System.Windows.Forms.GroupBox + Friend WithEvents addServer As System.Windows.Forms.Button + Friend WithEvents TabHelp As System.Windows.Forms.TabPage + Friend WithEvents RichTextBox1 As System.Windows.Forms.RichTextBox + Friend WithEvents CfgPathBox As System.Windows.Forms.TextBox + Friend WithEvents CfgBrowserBtn As System.Windows.Forms.Button + Friend WithEvents dontSaveCB As System.Windows.Forms.CheckBox + Friend WithEvents runGhostCB As System.Windows.Forms.CheckBox + +End Class diff --git a/ghost configurator/ghost configurator/Form1.resx b/ghost configurator/ghost configurator/Form1.resx new file mode 100644 index 00000000..823ebfea --- /dev/null +++ b/ghost configurator/ghost configurator/Form1.resx @@ -0,0 +1,209 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + This tool should help to add old settings to a new cfg file! + + +To update your settings run this application in the directory were the new cfg file is, +then press the "Update!" button and browse for the old cfg file and open it! + + + = Info = +release: 27.10.2009 +autor: HardwareBug + += FAQ = +1. A setting has a wrong edit tool(a TextBox, NumericUpDown or a CheckBox). + What should i do? a.k.a. An edit box accept only numbers, NO letters! + -> open the ghost.cfg with a text editor and edit the description of the setting! + Add or remove some keywords form it (they are listed below, + at "the edit tool select system") + +2. The ghost.cfg has a new setting but I cant find it in the ghost configurator. + Whats wrong? + -> the configurator shows only settings starting with: "bot_", "admingame_", + "db_", "bnet", "udp_", "tcp_", "lan_", "autohost_" and "replay_". + If the prefix of your setting is not included it won't be showed, + maybe check for an update of the configurator. + +3. I customized the virtualhostname but ghost doesn't change it, whats wrong? + -> this setting has a max length of 15 characters, if a colored name is used it + has a max length of 5 characters (because 10 characters are used for + the color code) IF you want a name longer than 5 charaters you must + disable the color (with the checkbox next to the color button). + += Some error codes from the configurator = +#002 - Too many settings in the cfg file! + -> not all settings will be displayed in the configurator, + there may be an update for the ghost configurator! +#003 - An "=" is missing! + -> add an "=" in the ghost.cfg in the mentioned line after a setting + eg. "bot_port" => "bot_port =" +#005 - Only numbers after the setting "bnet" are allowed! + -> edit in the ghost.cfg the mentioned line to "bnet" and + a number between 2-10 => eg. "bnet4_server =" +#006 - An "#" is missing! + -> add an "#" in the ghost.cfg at the start of the mentioned line + eg. "my description" => "#my description" + += The edit tool select system = +At start up the application decides what each setting requires, +depending on keywords in the description and the name of the setting. + +Keywords for a: +NumericUpDown: "port", "max", "Numeric", "method", "higher", "set to", + "percent" or "number" in the description + OR "max" or "port" in the name of the setting +Checkbox: "1" or "0" as value of the setting +Textbox with a directory browser: "directory" or "path" in the description +Textbox with a color editor: "color" in the description +-> the application checks the settings in the same order as them are listed here, + eg. if a keyword for a NumericUpDown was found in a description the other + keywords would not be checked OR if no keywords in a description + and the setting was found the setting get a simple textbox! + += Some default settings = +-Bot- + language = language.cfg + latency = 100 + synclimit = 50 + +-Battle.net- + bnlswardencookie = 1 + custom_war3version = 24 + +-Replay- + war3version = 24 + buildnumber = 6059 + +-Lan- + war3version = 24 + +-Database- + type = sqlite3 + sqlite3_file = ghost.dbs + + + 17, 17 + + + 148, 17 + + \ No newline at end of file diff --git a/ghost configurator/ghost configurator/Form1.vb b/ghost configurator/ghost configurator/Form1.vb new file mode 100644 index 00000000..5d66d5f8 --- /dev/null +++ b/ghost configurator/ghost configurator/Form1.vb @@ -0,0 +1,1288 @@ +Public Class Form1 + Dim Label(300) As Label + Dim TextBox(300) As TextBox + Dim Numeric(300) As NumericUpDown + Dim CheckBox(300), ColorCBox(300) As CheckBox + Dim Button(300) As Button + Dim DirBrowser(300) As FolderBrowserDialog + Dim ColorWin(300) As ColorDialog + Dim SubTab(10) As TabPage + Dim pfad, version, keyStr, zedStr, ErrorStr(10), key(300), schluessel(300), wert(300), info(300), textlines() As String + Dim InfoNum, InfoCount, zed, HeigthAdd, ErrorN(10), BNetIndex(50), line(300), type(300), tab(300), LTool(2, 300) As Integer + 'bugs:!? + + Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load + 'start konfiguration + Me.Icon = My.Resources.parametres_3D + version = "v1.05" + 'fenster initalisieren + Dim teile(), templine As String + Dim count(40) As Integer '30 für anzahl tabs(1-4, 21-40) + Dim de As Integer = 1 + pfad = My.Computer.FileSystem.GetParentPath(Application.ExecutablePath) + "\ghost.cfg" + + 'pfad zur cfg datei einstellen + If My.Settings.Update Then + My.Settings.Upgrade() + My.Settings.Update = False + End If + + If My.Settings.CfgPath = Nothing Then + If Not My.Computer.FileSystem.FileExists(pfad) Then + If openCfgBrowse() Then + ErrorN(0) = 2 + AppError() + Exit Sub + End If + End If + Else + If My.Computer.FileSystem.FileExists(My.Settings.CfgPath) Then + pfad = My.Settings.CfgPath + Me.CfgPathBox.Text = My.Settings.CfgPath + Else + If openCfgBrowse() Then + ErrorN(0) = 2 + AppError() + Exit Sub + End If + End If + End If + + 'falls i was schief läuft error #001 + Try + textlines = IO.File.ReadAllLines(pfad) + For i As Integer = 0 To UBound(textlines) + templine = LTrim(textlines(i)) + + 'sortieren von infos und keys + If templine = "" Then + 'nichts unternehmen (debug) + ElseIf templine.StartsWith("#") Then + templine = LTrim(templine.Remove(0, templine.LastIndexOf("#") + 1)) + If Not (templine.Contains("CONFIGURATION") Or IsSubfix(templine) Or templine.StartsWith("example")) And templine <> "" Then + info(de) += LTrim(templine) + If info(de) <> "" Then + info(de) += Chr(13) + End If + End If + ElseIf templine.Contains("=") And IsSubfix(templine) Then + line(de) = i + 'schluessel & wert trennen + teile = Split(textlines(i), "=") + key(de) = Trim(teile(0)) + schluessel(de) = Trim(teile(0)) + 'schluessel prefix entfernen + If schluessel(de).StartsWith("bot_") Then + schluessel(de) = schluessel(de).Remove(0, 4) + ElseIf schluessel(de).StartsWith("admingame_") Then + schluessel(de) = schluessel(de).Remove(0, 10) + ElseIf schluessel(de).StartsWith("db_") Then + schluessel(de) = schluessel(de).Remove(0, 3) + ElseIf schluessel(de).StartsWith("bnet_") Then + schluessel(de) = schluessel(de).Remove(0, 5) + ElseIf schluessel(de).StartsWith("bnet") Then + If IsNumeric(Mid(schluessel(de), 5, (Mid(schluessel(de), 5).IndexOf("_")))) Then + If Mid(schluessel(de), 5, (Mid(schluessel(de), 5).IndexOf("_"))) <= 10 Then + schluessel(de) = schluessel(de).Remove(0, 5 + Mid(templine, 5).IndexOf("_")) + Else + 'bereits gesetzte variablen zurückgsetzten + key(de) = "" + schluessel(de) = "" + line(de) = 0 + ErrorN(3) = 1 'error: syntax fehler("bnet11_") + ErrorStr(3) += " " & templine & Chr(13) + End If + Else + 'bereits gesetzte variablen zurückgsetzten + key(de) = "" + schluessel(de) = "" + line(de) = 0 + ErrorN(4) = 1 'error: syntax fehler("bnetABC_") + ErrorStr(4) += " " & templine & Chr(13) + End If + ElseIf schluessel(de).StartsWith("udp_") Or schluessel(de).StartsWith("tcp_") Or _ + schluessel(de).StartsWith("lan_") Then + schluessel(de) = schluessel(de).Remove(0, 4) + ElseIf schluessel(de).StartsWith("autohost_") Then + schluessel(de) = schluessel(de).Remove(0, 9) + ElseIf schluessel(de).StartsWith("replay_") Then + schluessel(de) = schluessel(de).Remove(0, 7) + End If + wert(de) = LTrim(teile(1)) + 'wert einordnen + If info(de) <> "" Then + If info(de).Contains("port") Or info(de).Contains("max") Or info(de).Contains("Numeric") Or _ + info(de).Contains("method") Or info(de).Contains("higher") Or info(de).Contains("set to") Or _ + info(de).Contains("percent") Or info(de).Contains("number") Or _ + schluessel(de).Contains("max") Or schluessel(de).Contains("port") Then + 'NummericUpDown + type(de) = 2 + ElseIf wert(de) = "0" Or wert(de) = "1" Then + 'checkbox + type(de) = 3 + ElseIf info(de).Contains("directory") Or info(de).Contains("path") Then + 'textbox mit dir browser + type(de) = 11 + ElseIf info(de).Contains("colour") Or info(de).Contains("color") Then + 'textbox mit farb auswahl + type(de) = 12 + Else + 'für alle nicht erkannte -> normale textbox + type(de) = 1 + End If + Else + info(de) += "NO description available!" + If schluessel(de) <> "" Then + If schluessel(de).Contains("max") Or schluessel(de).Contains("port") Then + 'NummericUpDown + type(de) = 2 + ElseIf schluessel(de).Contains("path") Then + 'textbox mit dir browser + type(de) = 11 + Else + 'für alle nicht erkannten -> normale textbox + type(de) = 1 + End If + End If + End If + de += 1 + If de = UBound(key) + 1 Then 'error: zu viele werte + ErrorN(1) = 1 + Exit For + End If + ElseIf Not templine.Contains("=") Then + If IsSubfix(templine) Then + ErrorN(2) = 1 'error: syntax fehler(kein "=") + ErrorStr(2) += " " & templine & Chr(13) + Else + ErrorN(6) = 1 + ErrorStr(6) += " " & templine & Chr(13) 'error: syntaxfehler (kein "#") + End If + End If + Next + If de = 1 Then 'error: keine einstellungen gefunden + ErrorN(0) = 3 + AppError() + Exit Sub + End If + Catch ex As Exception 'error: lade fehler + ErrorN(0) = 1 + AppError() + Exit Sub + End Try + + 'unvollständige BNetKey's rausfilltern + Dim aNum, runs As Integer + For Me.zed = 2 To 10 + zedStr = zed + If Array.FindIndex(key, AddressOf FindBNetKey) <> -1 Then + If Array.FindIndex(key, AddressOf FindPasswordKey) = -1 Then + For Each Me.keyStr In Array.FindAll(key, AddressOf FindBNetKey) + aNum = Array.FindIndex(key, AddressOf FindKey) + type(aNum) = 0 + For be As Integer = line(aNum) To UBound(textlines) - 1 + textlines(be) = textlines(be + 1) + Next + For da As Integer = 1 To UBound(line) + If line(da) > line(aNum) Then line(da) -= 1 + Next + runs += 1 + line(aNum) = 0 + Next + End If + End If + Next + 'map_loadInGame schüssel entfernen + If Array.FindIndex(textlines, AddressOf IsKeyLoadInGame) <> -1 Then + Dim index As Integer = Array.FindIndex(textlines, AddressOf IsKeyLoadInGame) + For be As Integer = index To UBound(textlines) - 1 + textlines(be) = textlines(be + 1) + Next + For da As Integer = 1 To UBound(line) + If line(da) > index Then line(da) -= 1 + Next + runs += 1 + End If + Array.Resize(textlines, textlines.Length - runs) + + 'Tools anpassen + Dim b As Integer + 'setzen der tools + For a As Integer = 1 To UBound(key) + If key(a) <> "" Then + If Not key(a).StartsWith("#") Then + If type(a) = 1 Or type(a) = 11 Or type(a) = 12 Then + 'Texetbox + Lable erstellen + Label(a) = New Label + Label(a).Name = "Label" & a + Label(a).AutoSize = True + TextBox(a) = New TextBox + TextBox(a).Name = "TextBox" & a + TextBox(a).Size = New Size(212, 20) + Label(a).Text = schluessel(a) + TextBox(a).Text = wert(a) + AddHandler TextBox(a).Click, AddressOf TextBox_click + If type(a) = 11 Then + Button(a) = New Button + With Button(a) + .Width = 30 + .Height = 20 + .Name = "Button" & a + .Text = "..." + AddHandler Button(a).Click, AddressOf ButtonFolder_click + End With + DirBrowser(a) = New FolderBrowserDialog + DirBrowser(a).Description = "Please select the " & Label(a).Text & "!" + ElseIf type(a) = 12 Then + Button(a) = New Button + ColorCBox(a) = New CheckBox + With Button(a) + .Width = 30 + .Height = 20 + .Name = "Button" & a + .Text = "" + AddHandler .Click, AddressOf ButtonColor_click + End With + With ColorCBox(a) + .Name = "ColorCBox" & a + .Text = "" + .AutoSize = True + AddHandler .Click, AddressOf ColorCheckBox_Click + End With + If wert(a).StartsWith("|cFF") And IsHex(Mid(wert(a), 5, 2)) And IsHex(Mid(wert(a), 7, 2)) And _ + IsHex(Mid(wert(a), 9, 2)) Then + Button(a).BackColor = Color.FromArgb(CInt(CHex(False, Mid(wert(a), 5, 2))), _ + CInt(CHex(False, Mid(wert(a), 7, 2))), _ + CInt(CHex(False, Mid(wert(a), 9, 2)))) + TextBox(a).Text = Mid(wert(a), 11) + ColorCBox(a).Checked = True + Else + Button(a).Enabled = False + End If + ColorWin(a) = New ColorDialog + End If + ElseIf type(a) = 2 Then + 'NummericUpDown + Lable erstellen + Label(a) = New Label + Label(a).Name = "Label" & b + Label(a).AutoSize = True + Numeric(a) = New NumericUpDown + With Numeric(a) + .Name = "NumericUpDown" & a + .Size = New Size(90, 20) + .Maximum = 9999 + End With + Label(a).Text = schluessel(a) + Numeric(a).Text = wert(a) + AddHandler Numeric(a).Click, AddressOf Numeric_click + ElseIf type(a) = 3 Then + 'nur checkbox erstellen + CheckBox(a) = New CheckBox + With CheckBox(a) + .Name = "CheckBox" & a + .AutoSize = True + .Text = schluessel(a) + .Checked = CBool(wert(a)) + AddHandler .MouseMove, AddressOf CheckBox_MouseMove + End With + End If + End If + End If + Next + 'tabs den tools zuordnen + Dim UTab As Integer + For a As Integer = 1 To UBound(LTool, 2) + If key(a) <> "" And type(a) <> 0 Then + If Not key(a).StartsWith("#") Then + If key(a).StartsWith("bot_") Then + tab(a) = 1 + ElseIf key(a).StartsWith("bnet") Then + If key(a).StartsWith("bnet_") Then + tab(a) = 21 + Else + tab(a) = 20 + CInt(Mid(key(a), 5, Mid(key(a), 5).IndexOf("_"))) 'legt die tabanzahl zwischen 22-30 fest! + If tab(a) > UTab Then + UTab = tab(a) + End If + End If + ElseIf key(a).StartsWith("admingame_") Then + tab(a) = 31 + ElseIf key(a).StartsWith("db_") Then + tab(a) = 4 + ElseIf key(a).StartsWith("udp_") Or key(a).StartsWith("tcp_") Then + tab(a) = 32 + ElseIf key(a).StartsWith("autohost_") Then + tab(a) = 33 + ElseIf key(a).StartsWith("replay_") Then + tab(a) = 34 + ElseIf key(a).StartsWith("lan_") Then + tab(a) = 35 + End If + End If + End If + Next + + 'bnet subtabs erstellen + SubTab(1) = SubTab1 + AddHandler SubTab(1).MouseMove, AddressOf Any_MouseMove + For i As Integer = 2 To (UTab - 20) + SubTab(i) = New TabPage + With SubTab(i) + .Text = "Server " & i + .Name = "SubTab" & i + .BackColor = Color.WhiteSmoke + .Parent = Me.TabControl2 + AddHandler .MouseMove, AddressOf Any_MouseMove + End With + If i = UTab - 20 Then 'letztem tab remove Button hinzufügen + Dim rmvServer As New Button + With rmvServer + .Top = 8 + .Left = 322 + .Height = 20 + .Width = 74 + .Name = "rmvServer" & UTab - 20 + .Text = "del. server" + .UseVisualStyleBackColor = True + .Parent = SubTab(i) + AddHandler .Click, AddressOf removeServer_click + End With + End If + Next + 'höhe des sub tabs & gruppen ermitteln + Dim SubToolNum(30) As Double '30 für anzahl tabs(untertabs von bnet) von 21-30 + Dim GroupToolNum(40) As Double '40 für anzahl tabs(gruppen auf tab 3) von 31-35 + For i As Integer = 1 To UBound(type) + If tab(i) > 20 And tab(i) <= 30 Then + If type(i) = 1 Or type(i) = 11 Or type(i) = 12 Then + SubToolNum(tab(i)) += 1 + ElseIf type(i) = 2 Or type(i) = 3 Then + SubToolNum(tab(i)) += 0.5 + End If + ElseIf tab(i) > 30 Then + If type(i) = 1 Or type(i) = 11 Or type(i) = 12 Then + GroupToolNum(tab(i)) += 1 + ElseIf type(i) = 2 Or type(i) = 3 Then + GroupToolNum(tab(i)) += 0.5 + End If + End If + Next + 'höhe mit der anzahl der tools ausrechnen + Me.TabControl2.Height = Math.Ceiling(SubToolNum.Max) * 23 + 33 + + 'höhe der Gruppen setzen + Me.GroupAGame.Height = Math.Ceiling(GroupToolNum(31)) * 23 + 12 + Me.GroupUdpTcp.Height = Math.Ceiling(GroupToolNum(32)) * 23 + 12 + Me.GroupAHost.Height = Math.Ceiling(GroupToolNum(33)) * 23 + 12 + Me.GroupReplay.Height = Math.Ceiling(GroupToolNum(34)) * 23 + 12 + Me.GroupLAN.Height = Math.Ceiling(GroupToolNum(35)) * 23 + 12 + 'position der Gruppen setzen + Me.GroupUdpTcp.Top = Me.GroupAGame.Top + Me.GroupAGame.Height + 3 + Me.GroupAHost.Top = Me.GroupUdpTcp.Top + Me.GroupUdpTcp.Height + 3 + Me.GroupReplay.Top = Me.GroupAHost.Top + Me.GroupAHost.Height + 3 + Me.GroupLAN.Top = Me.GroupReplay.Top + Me.GroupReplay.Height + 3 + + 'sortieren: textboxen zuerst + For a As Integer = 1 To UBound(LTool, 2) + If type(a) = 1 Or type(a) = 11 Or type(a) = 12 Then + If tab(a) <> 0 Then + If LTool(0, tab(a)) <> 0 Then + TextBox(a).Top = TextBox(LTool(0, tab(a))).Top + TextBox(LTool(0, tab(a))).Height + 3 + Else + If tab(a) <> 2 And tab(a) < 31 Then + TextBox(a).Top = 8 + ElseIf tab(a) = 2 Then + TextBox(a).Top = TabControl2.Height + 12 + ElseIf tab(a) > 30 Then + TextBox(a).Top = 10 + End If + End If + Label(a).Top = TextBox(a).Top + 2 + If Len(schluessel(a)) > 18 Then 'wenn schluessel(a) zu lang ist + TextBox(a).Left = 148 + Else + TextBox(a).Left = 108 + End If + If type(a) = 11 Or type(a) = 12 Then Button(a).Top = TextBox(a).Top + If type(a) = 12 Then ColorCBox(a).Top = TextBox(a).Top + 4 + + 'neu erstellte tools zu tabs zuweisen + If tab(a) = 1 Then + Label(a).Parent = Me.TabBot + TextBox(a).Parent = Me.TabBot + If type(a) = 11 Or type(a) = 12 Then Button(a).Parent = Me.TabBot + If type(a) = 12 Then ColorCBox(a).Parent = Me.TabBot + ElseIf tab(a) = 2 Then + Label(a).Parent = Me.TabBnet + TextBox(a).Parent = Me.TabBnet + If type(a) = 11 Or type(a) = 12 Then Button(a).Parent = Me.TabBnet + If type(a) = 12 Then ColorCBox(a).Parent = Me.TabBnet + ElseIf tab(a) = 3 Then + Label(a).Parent = Me.TabAgame + TextBox(a).Parent = Me.TabAgame + If type(a) = 11 Or type(a) = 12 Then Button(a).Parent = Me.TabAgame + If type(a) = 12 Then ColorCBox(a).Parent = Me.TabAgame + ElseIf tab(a) = 4 Then + Label(a).Parent = Me.Tabdb + TextBox(a).Parent = Me.Tabdb + If type(a) = 11 Or type(a) = 12 Then Button(a).Parent = Me.Tabdb + If type(a) = 12 Then ColorCBox(a).Parent = Me.Tabdb + ElseIf tab(a) > 20 And tab(a) <= 30 Then + Label(a).Parent = SubTab(tab(a) - 20) + TextBox(a).Parent = SubTab(tab(a) - 20) + If type(a) = 11 Or type(a) = 12 Then Button(a).Parent = SubTab(tab(a) - 20) + If type(a) = 12 Then ColorCBox(a).Parent = SubTab(tab(a) - 20) + ElseIf tab(a) = 31 Then + Label(a).Parent = Me.GroupAGame + TextBox(a).Parent = Me.GroupAGame + If type(a) = 11 Or type(a) = 12 Then Button(a).Parent = Me.GroupAGame + If type(a) = 12 Then ColorCBox(a).Parent = Me.GroupAGame + ElseIf tab(a) = 32 Then + Label(a).Parent = Me.GroupUdpTcp + TextBox(a).Parent = Me.GroupUdpTcp + If type(a) = 11 Or type(a) = 12 Then Button(a).Parent = Me.GroupUdpTcp + If type(a) = 12 Then ColorCBox(a).Parent = Me.GroupUdpTcp + ElseIf tab(a) = 33 Then + Label(a).Parent = Me.GroupAHost + TextBox(a).Parent = Me.GroupAHost + If type(a) = 11 Or type(a) = 12 Then Button(a).Parent = Me.GroupAHost + If type(a) = 12 Then ColorCBox(a).Parent = Me.GroupAHost + ElseIf tab(a) = 34 Then + Label(a).Parent = Me.GroupReplay + TextBox(a).Parent = Me.GroupReplay + If type(a) = 11 Or type(a) = 12 Then Button(a).Parent = Me.GroupReplay + If type(a) = 12 Then ColorCBox(a).Parent = Me.GroupReplay + ElseIf tab(a) = 35 Then + Label(a).Parent = Me.GroupLAN + TextBox(a).Parent = Me.GroupLAN + If type(a) = 11 Or type(a) = 12 Then Button(a).Parent = Me.GroupLAN + If type(a) = 12 Then ColorCBox(a).Parent = Me.GroupLAN + End If + Label(a).Left = TextBox(a).Left - (Label(a).Width + 2) + If type(a) = 11 Or type(a) = 12 Then Button(a).Left = TextBox(a).Left + TextBox(a).Width + 3 + If type(a) = 12 Then ColorCBox(a).Left = Button(a).Left + Button(a).Width + 3 + LTool(0, tab(a)) = a + End If + End If + Next + 'NummericUpDown & Checkboxen zählen + For a As Integer = 1 To UBound(LTool, 2) + If (type(a) = 2 Or type(a) = 3) And tab(a) <> 0 Then + count(tab(a)) += 1 + End If + Next + For a As Integer = 0 To UBound(count) + count(a) = Math.Ceiling(count(a) / 2) + Next + 'letzte textbox merken + For a As Integer = 1 To UBound(LTool, 2) + LTool(1, a) = LTool(0, a) + Next + 'sortieren: Nummeric unter textboxen + For a As Integer = 1 To UBound(LTool, 2) + If type(a) = 2 Then + If tab(a) <> 0 Then + If count(tab(a)) > 0 Then 'erste oda zweite reihe + Numeric(a).Left = 108 + Else + If count(tab(a)) = 0 Then + LTool(0, tab(a)) = LTool(1, tab(a)) + End If + Numeric(a).Left = 308 + End If + count(tab(a)) -= 1 + If LTool(0, tab(a)) <> 0 Then 'oberster platz? + If LTool(1, tab(a)) = LTool(0, tab(a)) Then 'unter textbox? + Numeric(a).Top = TextBox(LTool(0, tab(a))).Top + TextBox(LTool(0, tab(a))).Height + 3 + Else + Numeric(a).Top = Numeric(LTool(0, tab(a))).Top + Numeric(LTool(0, tab(a))).Height + 3 + End If + Else + If tab(a) <> 2 And tab(a) < 31 Then + Numeric(a).Top = 8 + ElseIf tab(a) = 2 Then + Numeric(a).Top = TabControl2.Height + 12 + ElseIf tab(a) > 30 Then + Numeric(a).Top = 10 + End If + End If + Label(a).Top = Numeric(a).Top + 2 + If tab(a) = 1 Then 'neu erstellte tools zu tabs zuweisen + Label(a).Parent = Me.TabBot + Numeric(a).Parent = Me.TabBot + ElseIf tab(a) = 2 Then + Label(a).Parent = Me.TabBnet + Numeric(a).Parent = Me.TabBnet + ElseIf tab(a) = 3 Then + Label(a).Parent = Me.TabAgame + Numeric(a).Parent = Me.TabAgame + ElseIf tab(a) = 4 Then + Label(a).Parent = Me.Tabdb + Numeric(a).Parent = Me.Tabdb + ElseIf tab(a) > 20 And tab(a) <= 30 Then + Label(a).Parent = SubTab(tab(a) - 20) + Numeric(a).Parent = SubTab(tab(a) - 20) + ElseIf tab(a) = 31 Then + Label(a).Parent = Me.GroupAGame + Numeric(a).Parent = Me.GroupAGame + ElseIf tab(a) = 32 Then + Label(a).Parent = Me.GroupUdpTcp + Numeric(a).Parent = Me.GroupUdpTcp + ElseIf tab(a) = 33 Then + Label(a).Parent = Me.GroupAHost + Numeric(a).Parent = Me.GroupAHost + ElseIf tab(a) = 34 Then + Label(a).Parent = Me.GroupReplay + Numeric(a).Parent = Me.GroupReplay + ElseIf tab(a) = 35 Then + Label(a).Parent = Me.GroupLAN + Numeric(a).Parent = Me.GroupLAN + End If + Label(a).Left = Numeric(a).Left - (Label(a).Width + 2) + LTool(0, tab(a)) = a + End If + End If + Next + 'letzte NumericUpDown merken + For a As Integer = 1 To UBound(LTool, 2) + LTool(2, a) = LTool(0, a) + Next + 'sortieren: nach NummericUpDown die Checkboxen + For a As Integer = 1 To UBound(LTool, 2) + If type(a) = 3 Then + If tab(a) <> 0 Then + If count(tab(a)) > 0 Then 'erste oda zweite reihe + CheckBox(a).Left = 108 + Else + If count(tab(a)) = 0 Then + LTool(0, tab(a)) = LTool(1, tab(a)) + End If + CheckBox(a).Left = 258 + End If + count(tab(a)) -= 1 + If LTool(0, tab(a)) <> 0 Then 'oberster platz? + If LTool(1, tab(a)) = LTool(0, tab(a)) Then 'unter textbox? + CheckBox(a).Top = TextBox(LTool(0, tab(a))).Top + TextBox(LTool(0, tab(a))).Height + 5 + ElseIf LTool(2, tab(a)) = LTool(0, tab(a)) Then 'unter numeric? + CheckBox(a).Top = Numeric(LTool(0, tab(a))).Top + Numeric(LTool(0, tab(a))).Height + 5 + Else + CheckBox(a).Top = CheckBox(LTool(0, tab(a))).Top + CheckBox(LTool(0, tab(a))).Height + 6 + End If + Else + If tab(a) <> 2 And tab(a) < 31 Then + CheckBox(a).Top = 8 + ElseIf tab(a) = 2 Then + CheckBox(a).Top = TabControl2.Height + 12 + ElseIf tab(a) > 30 Then + CheckBox(a).Top = 10 + End If + End If + If tab(a) = 1 Then 'neu erstellte tools zu tabs zuweisen + CheckBox(a).Parent = Me.TabBot + ElseIf tab(a) = 2 Then + CheckBox(a).Parent = Me.TabBnet + ElseIf tab(a) = 3 Then + CheckBox(a).Parent = Me.TabAgame + ElseIf tab(a) = 4 Then + CheckBox(a).Parent = Me.Tabdb + ElseIf tab(a) > 20 And tab(a) <= 30 Then + CheckBox(a).Parent = SubTab(tab(a) - 20) + ElseIf tab(a) = 31 Then + CheckBox(a).Parent = Me.GroupAGame + ElseIf tab(a) = 32 Then + CheckBox(a).Parent = Me.GroupUdpTcp + ElseIf tab(a) = 33 Then + CheckBox(a).Parent = Me.GroupAHost + ElseIf tab(a) = 34 Then + CheckBox(a).Parent = Me.GroupReplay + ElseIf tab(a) = 35 Then + CheckBox(a).Parent = Me.GroupLAN + End If + LTool(0, tab(a)) = a + End If + End If + Next + + 'fenster anschaulicher machen + Me.Width = 460 + Dim Tall(300) As Integer 'MAX + Tall(0) = Me.GroupLAN.Top + Me.GroupLAN.Height - 20 + For a As Integer = 1 To UBound(Tall) + If tab(a) <> 0 Then + If type(a) = 1 Or type(a) = 11 Or type(a) = 12 Then + Tall(a) = TextBox(a).Top + ElseIf type(a) = 2 Then + Tall(a) = Numeric(a).Top + ElseIf type(a) = 3 Then + Tall(a) = CheckBox(a).Top + End If + End If + Next + 'bnet subtabs & gruppen auch berücksichtigen + If (TabControl2.Height + TabControl2.Top) > (GroupLAN.Top + GroupLAN.Height) Then + Tall(0) = TabControl2.Height - 10 + Else + Tall(0) = GroupLAN.Top + GroupLAN.Height - 20 + End If + + 'kleine desktop größen berücksichtigen + Dim TallMax As Integer = Tall.Max + If Tall.Max > My.Computer.Screen.Bounds.Height - 300 Then + TallMax = My.Computer.Screen.Bounds.Height - 300 + End If + TabControl1.Height = TallMax + 47 + Me.Height = TabControl1.Height + 107 + InfoLabel.Top = TabControl1.Top + TabControl1.Height + 1 + InfoLabel.Height = 89 + Me.Text = "Bot Configuration - " & version + Me.CenterToScreen() + End Sub + + Private Sub Form1_Shown(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Shown + AppError() + + 'MouseMove events objekten zuordnen + AddHandler TabBot.MouseMove, AddressOf Any_MouseMove + AddHandler TabBnet.MouseMove, AddressOf Any_MouseMove + AddHandler TabAgame.MouseMove, AddressOf Any_MouseMove + AddHandler Tabdb.MouseMove, AddressOf Any_MouseMove + AddHandler GroupAGame.MouseMove, AddressOf Any_MouseMove + AddHandler GroupAHost.MouseMove, AddressOf Any_MouseMove + AddHandler GroupLAN.MouseMove, AddressOf Any_MouseMove + AddHandler GroupReplay.MouseMove, AddressOf Any_MouseMove + AddHandler GroupUdpTcp.MouseMove, AddressOf Any_MouseMove + + 'systemkompatibilität + If My.Computer.Info.OSFullName.Contains("Vista") Then + HeigthAdd = 0 + Else + HeigthAdd = 5 + End If + End Sub + + Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing + 'werte von tools auslesen + For i As Integer = 1 To UBound(wert) + If tab(i) <> 0 Then + If type(i) = 1 Or type(i) = 11 Then + wert(i) = TextBox(i).Text + ElseIf type(i) = 2 Then + wert(i) = Numeric(i).Text + ElseIf type(i) = 3 Then + wert(i) = -CInt(CheckBox(i).Checked) + ElseIf type(i) = 12 Then + If wert(i).StartsWith("|cFF") And IsHex(Mid(wert(i), 5, 2)) And IsHex(Mid(wert(i), 7, 2)) And _ + IsHex(Mid(wert(i), 9, 2)) And ColorCBox(i).Checked Then + wert(i) = Mid(wert(i), 1, 10) & TextBox(i).Text + Else + wert(i) = TextBox(i).Text + End If + End If + End If + Next + + 'werte von variablen in "textlines" übernehmen + For i As Integer = 1 To UBound(line) + If line(i) <> 0 Then + textlines(line(i)) = key(i) & " = " & wert(i) + End If + Next + + 'in cfg schreiben & cfg pfad speichern + If (ErrorN(0) > 3 Or ErrorN(0) = 0) And Not Me.dontSaveCB.Checked Then + Try + IO.File.WriteAllLines(pfad, textlines) + + 'ghost nach speichern starten + If Me.runGhostCB.Checked Then + Dim Ghost As New System.Diagnostics.Process() + Ghost.StartInfo.WorkingDirectory = My.Computer.FileSystem.GetParentPath(pfad) + Ghost.StartInfo.FileName = My.Computer.FileSystem.GetParentPath(pfad) & "\ghost.exe " + Ghost.Start() + End If + + 'my setting verwaltung + If Not My.Settings.CfgPath = "" Or My.Settings.CfgPath <> Me.CfgPathBox.Text Then + My.Settings.CfgPath = Me.CfgPathBox.Text + If My.Settings.CfgPath = My.Computer.FileSystem.GetParentPath(Application.ExecutablePath) & "\ghost.cfg" Then + My.Settings.CfgPath = "" + End If + My.Settings.Save() + End If + Catch ex As Exception + If Not My.Computer.FileSystem.FileExists(pfad & ".bak") Then + IO.File.WriteAllLines(pfad & ".bak", textlines) + ErrorN(0) = 9 + Else + ErrorN(0) = 10 + End If + AppError() + End Try + ElseIf ErrorN(0) = 1 Or ErrorN(0) = 3 Then + If My.Settings.CfgPath <> "" Then + My.Settings.CfgPath = "" + My.Settings.Save() + End If + ElseIf Me.dontSaveCB.Checked And Me.runGhostCB.Checked Then + 'wenn run ghost + dont save aktive ist + Dim Ghost As New System.Diagnostics.Process() + Ghost.StartInfo.WorkingDirectory = My.Computer.FileSystem.GetParentPath(pfad) + Ghost.StartInfo.FileName = My.Computer.FileSystem.GetParentPath(pfad) & "\ghost.exe " + Ghost.Start() + End If + End Sub + + Private Sub Update_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles BtnUpdate.Click + OpenACfg.FileName = "" + OpenACfg.InitialDirectory = My.Computer.FileSystem.GetParentPath(Application.ExecutablePath) + If OpenACfg.ShowDialog = Windows.Forms.DialogResult.OK Then + 'aktuelle werte in fariablen speichern + For i As Integer = 1 To UBound(wert) + If tab(i) <> 0 Then + If type(i) = 1 Or type(i) = 11 Then + wert(i) = TextBox(i).Text + ElseIf type(i) = 2 Then + wert(i) = Numeric(i).Text + ElseIf type(i) = 3 Then + wert(i) = -CInt(CheckBox(i).Checked) + ElseIf type(i) = 12 Then + If wert(i).StartsWith("|cFF") And IsHex(Mid(wert(i), 5, 2)) And IsHex(Mid(wert(i), 7, 2)) And _ + IsHex(Mid(wert(i), 9, 2)) And ColorCBox(i).Checked Then + wert(i) = Mid(wert(i), 1, 10) & TextBox(i).Text + Else + wert(i) = TextBox(i).Text + End If + End If + End If + Next + + 'update variablen erstellen + Dim oldPfad As String = OpenACfg.FileName + Dim oldTextlines() As String = IO.File.ReadAllLines(oldPfad) + Dim oldtempline, oldKey(300), oldWert(300), Teile() As String 'MAX + Dim d As Integer = 1 + Dim iWerte As Integer + ErrorN(8) = 0 + For i As Integer = 0 To UBound(oldTextlines) + oldtempline = LTrim(oldTextlines(i)) + If oldtempline = "" Then + 'nichts unternehmen (debug) + ElseIf Not IsSubfix(oldtempline) Then + 'nichts unternehmen (aussortieren der infos) + ElseIf oldtempline.Contains("=") Then + 'oldKey & oldWert trennen + Teile = Split(oldTextlines(i), "=") + oldKey(d) = Trim(Teile(0)) + oldWert(d) = LTrim(Teile(1)) + d += 1 + End If + Next + If d = 1 Then ErrorN(8) = 1 ' error: keine Werte gefunden! + + 'werte von alter cfg übernehmen + For t As Integer = 1 To UBound(oldKey) + For i As Integer = 1 To UBound(key) + If key(i) = oldKey(t) And Not oldWert(t) = "" And Not wert(i) = oldWert(t) Then + wert(i) = oldWert(t) + iWerte += 1 + End If + Next + Next + + 'werte im interface aktualiesieren + For a As Integer = 1 To UBound(key) + If key(a) <> "" Then + If Not key(a).StartsWith("#") Then + If type(a) = 1 Or type(a) = 11 Or type(a) = 12 Then + TextBox(a).Text = wert(a) + If type(a) = 12 Then + If wert(a).StartsWith("|cFF") And IsHex(Mid(wert(a), 5, 2)) And IsHex(Mid(wert(a), 7, 2)) And _ + IsHex(Mid(wert(a), 9, 2)) Then + Button(a).BackColor = Color.FromArgb(CInt(CHex(False, Mid(wert(a), 5, 2))), _ + CInt(CHex(False, Mid(wert(a), 7, 2))), _ + CInt(CHex(False, Mid(wert(a), 9, 2)))) + TextBox(a).Text = Mid(wert(a), 11) + ColorCBox(a).Checked = True + Button(a).Enabled = True + Else + Button(a).Enabled = False + Button(a).BackColor = Color.WhiteSmoke + ColorCBox(a).Checked = False + End If + End If + ElseIf type(a) = 2 Then + Numeric(a).Text = wert(a) + ElseIf type(a) = 3 Then + CheckBox(a).Checked = CBool(wert(a)) + End If + End If + End If + Next + If iWerte > 0 Then 'Meldung: Erfolg! + MsgBox("Success, " & iWerte & " settings were updated!", MsgBoxStyle.Information, "Update finished.") + Me.InfoLabel.Text = "Settings updated, they are ready to be checked or edited!" + ElseIf Not ErrorN(8) = 1 Then + ErrorN(8) = 2 'error: keine übereinstimmungen gefunden! + End If + AppError() + End If + End Sub + + Private Sub addServer_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles addServer.Click + 'error überprüfen + If Not TabControl2.TabCount < 10 Then + ErrorN(9) = 1 + AppError() + Exit Sub + End If + 'Bnet schlüssel listen + Dim runden As Integer = 1 + Dim TextZeilen As Integer + zedStr = "_" + For Each Me.keyStr In Array.FindAll(key, AddressOf FindBNetKey) + BNetIndex(runden) = Array.FindIndex(key, AddressOf FindKey) + runden += 1 + Next + Array.Resize(BNetIndex, runden) + 'zeilen zählen + For i As Integer = 1 To UBound(BNetIndex) + For Each zeile In info(BNetIndex(i)).Split(Chr(13)) + If zeile <> "NO description available!" Then + TextZeilen += 1 + Else + TextZeilen -= 1 + End If + Next + Next + 'textlines länge anpassen + TextZeilen += runden * 2 - 3 'array länge kompensieren + keine zeile am ende + Dim AktZeile As Integer = textlines.Length + 1 'eine zeile freilassen + Array.Resize(textlines, AktZeile + TextZeilen) + + 'neue bnet werte in array schreiben + Dim BnetNo As Integer = TabControl2.TabCount + 1 + For i As Integer = 1 To UBound(BNetIndex) + Dim infoZeile As String() = info(BNetIndex(i)).Split(Chr(13)) + For Each zeile In infoZeile + If zeile <> "NO description available!" Then + textlines(AktZeile) = "### " & zeile + AktZeile += 1 + Else + AktZeile -= 1 + End If + Next + If wert(BNetIndex(i)) = "1" Or wert(BNetIndex(i)) = "0" Then + textlines(AktZeile) = "bnet" & BnetNo & "_" & schluessel(BNetIndex(i)) & " = " & wert(BNetIndex(i)) + Else + textlines(AktZeile) = "bnet" & BnetNo & "_" & schluessel(BNetIndex(i)) & " = " + End If + AktZeile += 2 + Next + + 'app neustart + Application.Restart() + End Sub + + Private Sub removeServer_click(ByVal sender As Object, ByVal e As System.EventArgs) + Dim temp As Button = CType(sender, Button) + zedStr = Mid(temp.Name, 10) + Dim infoIndex(150), Runs, IRuns, zahler As Integer + + 'bnet key identifizieren + For Each Me.keyStr In Array.FindAll(key, AddressOf FindBNetKey) + Runs += 1 + BNetIndex(Runs) = Array.FindIndex(key, AddressOf FindKey) + Next + + 'infos suchen + For i As Integer = 1 To UBound(BNetIndex) + zahler = (line(BNetIndex(i))) - 1 + 'If zahler > 0 Then + 'If Not (textlines(zahler).StartsWith("#") And textlines(zahler) = "") And _ + 'textlines(zahler - 1).StartsWith("#") And textlines(zahler - 1) = "" Then + ' zahler -= 1 + 'End If + 'End If + + While zahler > 0 + If (textlines(zahler).StartsWith("#") Or textlines(zahler) = "") And IRuns <= 150 Then + IRuns += 1 + infoIndex(IRuns) = zahler + zahler -= 1 + Else + zahler = 0 + End If + End While + Next + + 'keys zurücksetzen + For i As Integer = 1 To UBound(BNetIndex) + If BNetIndex(i) > 0 Then + type(BNetIndex(i)) = 0 + For be As Integer = line(BNetIndex(i)) To UBound(textlines) - 1 + textlines(be) = textlines(be + 1) + Next + For da As Integer = 1 To UBound(line) + If line(da) > line(BNetIndex(i)) Then line(da) -= 1 + Next + For hu As Integer = 1 To UBound(infoIndex) + If infoIndex(hu) > line(BNetIndex(i)) Then infoIndex(hu) -= 1 + Next + line(BNetIndex(i)) = 0 + End If + Next + + 'infos entfernen + For i As Integer = 1 To UBound(infoIndex) + If infoIndex(i) > 0 Then + For be As Integer = infoIndex(i) To UBound(textlines) - 1 + textlines(be) = textlines(be + 1) + Next + For da As Integer = 1 To UBound(line) + If line(da) > infoIndex(i) Then line(da) -= 1 + Next + For ha As Integer = 1 To UBound(infoIndex) + If infoIndex(ha) > infoIndex(i) Then infoIndex(ha) -= 1 + Next + End If + Next + 'array größe setzen + Array.Resize(textlines, textlines.Length - (Runs + IRuns)) + + Application.Restart() + End Sub + + Private Sub TabControl1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles TabControl1.Click + 'standardeigenschaften setzen + Me.CfgPathBox.Visible = False + Me.CfgBrowserBtn.Visible = False + Me.InfoLabel.Top = TabControl1.Top + TabControl1.Height + 1 + Me.Height = TabControl1.Height + 107 + + 'überschrift dem aktuellen tab anpassen + If TabControl1.SelectedIndex = 0 Then + Me.Text = TabBot.Text & " Configuration - " & version + ElseIf TabControl1.SelectedIndex = 1 Then + Me.Text = TabBnet.Text & " Configuration - " & version + ElseIf TabControl1.SelectedIndex = 2 Then + Me.Text = TabAgame.Text & " Configuration - " & version + ElseIf TabControl1.SelectedIndex = 3 Then + Me.Text = Tabdb.Text & " Configuration - " & version + ElseIf TabControl1.SelectedIndex = 4 Then + Me.Text = TabCfgUp.Text & " - " & version + Me.InfoLabel.Text = "Ready to update settings!" + ElseIf TabControl1.SelectedIndex = 5 Then + Me.Text = "Configurator Help" & " - " & version + Me.InfoLabel.Text = "The cfg file path:" & Chr(13) & Chr(13) & "Hint: clear this textbox to use the ghost.cfg located " & _ + "in the application's directory!" + Me.CfgPathBox.Visible = True + Me.CfgBrowserBtn.Visible = True + Me.InfoLabel.Top = TabControl1.Top + TabControl1.Height + 3 + Me.CfgPathBox.Top = TabControl1.Top + TabControl1.Height + 1 + Me.CfgBrowserBtn.Top = TabControl1.Top + TabControl1.Height + 1 + End If + + If TabControl1.SelectedIndex < 4 Then + Me.InfoLabel.Text = "Click at a Textbox or hover over a checkbox to get information about the setting!" + End If + End Sub + + Private Sub CfgBrowserBtn_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles CfgBrowserBtn.Click + OpenACfg.FileName = "" + OpenACfg.InitialDirectory = My.Computer.FileSystem.GetParentPath(Application.ExecutablePath) + If OpenACfg.ShowDialog = Windows.Forms.DialogResult.OK Then + Me.CfgPathBox.Text = OpenACfg.FileName + End If + End Sub + + Private Sub runGhostCB_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles runGhostCB.Click + If runGhostCB.Checked = True And _ + Not My.Computer.FileSystem.FileExists(My.Computer.FileSystem.GetParentPath(pfad) & "\ghost.exe") Then + MsgBox("Ghost.exe can't be found, it won't be launched after closing!" & Chr(13) & _ + "(You may start it manually.)", MsgBoxStyle.Information, "Ghost not found!") + Me.runGhostCB.Checked = False + End If + End Sub + + Private Sub TextBox_click(ByVal sender As Object, ByVal e As System.EventArgs) + Dim TBox As TextBox = CType(sender, TextBox) + InfoLabel.Text = info(CInt(Mid(TBox.Name, 8))) 'zu auslöser passende info setzen(für Textboxen) + If InfoLabel.Height > 55 - HeigthAdd Then 'wenn info länger ist + Me.Height = TabControl1.Height + InfoLabel.Height + 55 + HeigthAdd + Else + Me.Height = TabControl1.Height + 107 + End If + End Sub + + Private Sub Numeric_click(ByVal sender As Object, ByVal e As System.EventArgs) + Dim Num As NumericUpDown = CType(sender, NumericUpDown) + InfoLabel.Text = info(CInt(Mid(Num.Name, 14))) 'zu auslöser passende info setzen(für NumericUpDown) + If InfoLabel.Height > 55 - HeigthAdd Then 'wenn info länger ist + Me.Height = TabControl1.Height + InfoLabel.Height + 55 + HeigthAdd + Else + Me.Height = TabControl1.Height + 107 + End If + End Sub + + Private Sub CheckBox_MouseMove(ByVal sender As Object, ByVal e As System.EventArgs) + Dim CBox As CheckBox = CType(sender, CheckBox) + InfoNum = CInt(Mid(CBox.Name, 9)) + InfoCount = 3 + CBoxInfoTimer.Enabled = True 'info verzögerung aktivieren vor info änderung + End Sub + + Private Sub ColorCheckBox_Click(ByVal sender As Object, ByVal e As System.EventArgs) + Dim temp As CheckBox = CType(sender, CheckBox) + Dim a As Integer = Mid(temp.Name, 10) + If temp.Checked Then + Button(a).Enabled = True + If wert(a).StartsWith("|cFF") And IsHex(Mid(wert(a), 5, 2)) And IsHex(Mid(wert(a), 7, 2)) And _ + IsHex(Mid(wert(a), 9, 2)) Then + Button(a).BackColor = Color.FromArgb(CInt(CHex(False, Mid(wert(a), 5, 2))), _ + CInt(CHex(False, Mid(wert(a), 7, 2))), _ + CInt(CHex(False, Mid(wert(a), 9, 2)))) + End If + Else + Button(a).Enabled = False + Button(a).BackColor = Color.WhiteSmoke + End If + End Sub + + Private Sub CBoxInfo_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles CBoxInfoTimer.Tick + InfoCount -= 1 + If InfoCount = 0 Then + CBoxInfoTimer.Enabled = False + InfoLabel.Text = info(InfoNum) 'zu auslöser passende info setzen(für CheckBoxen) + If InfoLabel.Height > 55 - HeigthAdd Then 'wenn info länger ist + Me.Height = TabControl1.Height + InfoLabel.Height + 55 + HeigthAdd + Else + Me.Height = TabControl1.Height + 107 + End If + End If + End Sub + + Public Sub Any_MouseMove() + CBoxInfoTimer.Enabled = False + End Sub + + Private Sub ButtonFolder_click(ByVal sender As Object, ByVal e As System.EventArgs) + Dim temp As Button = CType(sender, Button) + Dim TNum As Integer = Mid(temp.Name, 7) + If DirBrowser(TNum).ShowDialog() = Windows.Forms.DialogResult.OK Then + If Not DirBrowser(TNum).SelectedPath.EndsWith("\") Then + TextBox(TNum).Text = DirBrowser(TNum).SelectedPath & "\" + Else + TextBox(TNum).Text = DirBrowser(TNum).SelectedPath + End If + End If + End Sub + + Private Sub ButtonColor_click(ByVal sender As Object, ByVal e As System.EventArgs) + Dim temp As Button = CType(sender, Button) + Dim l As Integer = Mid(temp.Name, 7) + If wert(l).StartsWith("|cFF") And IsHex(Mid(wert(l), 5, 2)) And IsHex(Mid(wert(l), 7, 2)) And _ + IsHex(Mid(wert(l), 9, 2)) Then + ColorWin(l).Color = Color.FromArgb(CInt(CHex(False, Mid(wert(l), 5, 2))), CInt(CHex(False, Mid(wert(l), 7, 2))), _ + CInt(CHex(False, Mid(wert(l), 9, 2)))) + End If + If ColorWin(l).ShowDialog = Windows.Forms.DialogResult.OK Then + wert(l) = "|cFF" & CHex(True, ColorWin(l).Color.R) & CHex(True, ColorWin(l).Color.G) & CHex(True, ColorWin(l).Color.B) & _ + Mid(wert(l), 11) + Button(l).BackColor = Color.FromArgb(CInt(CHex(False, Mid(wert(l), 5, 2))), _ + CInt(CHex(False, Mid(wert(l), 7, 2))), _ + CInt(CHex(False, Mid(wert(l), 9, 2)))) + End If + End Sub + + Private Function IsSubfix(ByVal text As String) As Boolean + If text.StartsWith("bot_") Or text.StartsWith("admingame_") Or text.StartsWith("db_") Or text.StartsWith("bnet") Or _ + text.StartsWith("udp_") Or text.StartsWith("tcp_") Or text.StartsWith("lan_") Or text.StartsWith("autohost_") Or _ + text.StartsWith("replay_") Then + Return True + Else + Return False + End If + End Function + + Private Function openCfgBrowse() As Boolean + 'info file not found! + Dim msg As MsgBoxResult = MsgBox("Unable to load the ghost.cfg!" & Chr(13) & Chr(13) & _ + "Click " & Chr(34) & "ok" & Chr(34) & " to browse for the cfg file OR click " & Chr(34) & _ + "abort" & Chr(34) & " to close the application!" & Chr(13) & _ + "(You may move this application into the ghost++ directory.)", MsgBoxStyle.OkCancel, _ + "Cfg not loaded!") + If msg = MsgBoxResult.Ok Then + OpenACfg.InitialDirectory = My.Computer.FileSystem.GetParentPath(Application.ExecutablePath) + If OpenACfg.ShowDialog = Windows.Forms.DialogResult.OK Then + pfad = OpenACfg.FileName + My.Settings.CfgPath = OpenACfg.FileName + Me.CfgPathBox.Text = OpenACfg.FileName + Return False + Else + Return True + End If + Else + Return True + End If + End Function + + Private Function CHex(ByVal way As Boolean, ByVal num As String) As String + Dim temp(1) As String + If way Then 'dezimalzahlen -> hexadezimalzahlen + temp(0) = Math.Floor(num / 16) + temp(1) = num Mod 16 + For i As Integer = 0 To 1 + If temp(i) >= 0 And temp(i) <= 9 Then + 'nichst ändern + ElseIf temp(i) = 10 Then + temp(i) = "A" + ElseIf temp(i) = 11 Then + temp(i) = "B" + ElseIf temp(i) = 12 Then + temp(i) = "C" + ElseIf temp(i) = 13 Then + temp(i) = "D" + ElseIf temp(i) = 14 Then + temp(i) = "E" + ElseIf temp(i) = 15 Then + temp(i) = "F" + End If + Next + num = temp(0) & temp(1) + Else 'hexadezimalzahlen -> dezimalzahlen + temp(0) = Mid(num, 1, 1) + temp(1) = Mid(num, 2, 1) + For i As Integer = 0 To 1 + If UCase(temp(i)) = "A" Then + temp(i) = 10 + ElseIf UCase(temp(i)) = "B" Then + temp(i) = 11 + ElseIf UCase(temp(i)) = "C" Then + temp(i) = 12 + ElseIf UCase(temp(i)) = "D" Then + temp(i) = 13 + ElseIf UCase(temp(i)) = "E" Then + temp(i) = 14 + ElseIf UCase(temp(i)) = "F" Then + temp(i) = 15 + ElseIf temp(i) >= 0 And temp(i) <= 9 Then + 'nichts ändern + End If + Next + num = CInt(temp(0)) * 16 + CInt(temp(1)) + End If + Return num + End Function + + Private Function IsHex(ByVal hex As String) As Boolean + Dim chr() As String = {Mid(hex, 1, 1), Mid(hex, 2, 1)} + Dim isTrue(1) As Integer + For i As Integer = 0 To 1 + If IsNumeric(chr(i)) Then + isTrue(i) = 1 + ElseIf UCase(chr(i)) = "A" Then + isTrue(i) = 1 + ElseIf UCase(chr(i)) = "B" Then + isTrue(i) = 1 + ElseIf UCase(chr(i)) = "C" Then + isTrue(i) = 1 + ElseIf UCase(chr(i)) = "D" Then + isTrue(i) = 1 + ElseIf UCase(chr(i)) = "E" Then + isTrue(i) = 1 + ElseIf UCase(chr(i)) = "F" Then + isTrue(i) = 1 + End If + Next + Return CBool(isTrue(0) * isTrue(1)) + End Function + + Private Function FindBNetKey(ByVal str As String) As Boolean + If Not str = Nothing Then + If str.StartsWith("bnet" & zedStr) Then + Return True + Else + Return False + End If + Else + Return False + End If + End Function + + Private Function FindPasswordKey(ByVal str As String) As Boolean + If str = "bnet" & zed & "_password" Then Return True Else Return False + End Function + + Private Function FindKey(ByVal str As String) As Boolean + If str = keyStr Then Return True Else Return False + End Function + + Private Function IsKeyLoadInGame(ByVal str As String) As Boolean + If str.StartsWith("map_loadingame") Then Return True Else Return False + End Function + + Public Sub AppError() + 'configurator (start) fehler + If ErrorN(0) = 1 Then + MsgBox("Error during the data processing, try to change the cfg file path at restart " & _ + "and respectively replace the ghost.cfg in the application's directory with another one!" _ + , MsgBoxStyle.Critical, "Error #001") + Me.Close() + ElseIf ErrorN(0) = 2 Then + 'wenn keine cfg gefunden wurde & abbrechen + Me.Close() + ElseIf ErrorN(0) = 3 Then + 'anpassen: + MsgBox("There are no setting in the ghost.cfg," & Chr(13) & "make sure that the used cfg file is a ghost++ cfg!" & _ + Chr(13) & Chr(13) & "The cfg file path have been reseted (to prevent bugs).", _ + MsgBoxStyle.Critical, "Error #011") + Me.Close() + ElseIf ErrorN(0) = 9 Then + MsgBox("Unable to write settings to the cfg file, make sure that the ghost.cfg file isn't write protected or " & _ + "in use by another application!" & Chr(13) & Chr(13) & "The settings has been saved to " & Chr(34) & _ + "ghost.cfg.bak" & Chr(34) & " (you have to rename this file to " & Chr(34) & "ghost.cfg" & Chr(34) & _ + ", to use this settings).", MsgBoxStyle.Critical, "Error #010") + ElseIf ErrorN(0) = 10 Then + MsgBox("Unable to write settings to the cfg file, make sure that the ghost.cfg file isn't write protected or " & _ + "in use by another application!", MsgBoxStyle.Critical, "Error #010") + End If + 'bei error(0) restliche meldungen ignorieren + If ErrorN(0) <> 0 Then + Exit Sub + End If + + 'configurator meldungen + If ErrorN(1) = 1 Then + MsgBox("To many settings in the cfg file, maximum is " & UBound(type) & "!", MsgBoxStyle.Exclamation, "Error #002") + End If + If ErrorN(2) = 1 Then + MsgBox("Syntax error in (the ghost.cfg in) following lines:" & Chr(13) & ErrorStr(2) & " a " & Chr(34) & "=" & Chr(34) & _ + " is missing!", MsgBoxStyle.Exclamation, "Error #003") + End If + If ErrorN(3) = 1 Then + MsgBox("Syntax error in (the ghost.cfg in) following lines:" & Chr(13) & ErrorStr(3) & "only 10 bnet servers are " & _ + "supported!", MsgBoxStyle.Exclamation, "Error #004") + End If + If ErrorN(4) = 1 Then + MsgBox("Syntax error in (the ghost.cfg in) following lines:" & Chr(13) & ErrorStr(4) & "only numbers after " & Chr(34) _ + & "bnet" & Chr(34) & " are supported!", MsgBoxStyle.Exclamation, "Error #005") + End If + If ErrorN(6) = 1 Then + MsgBox("Syntax error in (the ghost.cfg in) following lines:" & Chr(13) & ErrorStr(6) & " a " & Chr(34) & "#" & Chr(34) & _ + " is missing!", MsgBoxStyle.Exclamation, "Error #006") + End If + 'Updater fehler + If ErrorN(8) = 1 Then + MsgBox("Could not find any setting in the selected cfg file!", MsgBoxStyle.Exclamation, "Error #008") + Me.InfoLabel.Text = "Error, no settings found, only files named " & Chr(34) & "ghost.cfg" & Chr(34) & " are supported!" + ElseIf ErrorN(8) = 2 Then + MsgBox("No differences found between the old cfg and the new one!", MsgBoxStyle.Exclamation, "Error #009") + Me.InfoLabel.Text = "Error, no differences found between the two files!" + End If + 'add Server fehler + If ErrorN(9) = 1 Then + MsgBox("Could not create more server settings, only 10 servers are supported!", MsgBoxStyle.Exclamation, "Error #015") + End If + Array.Clear(ErrorN, 0, UBound(ErrorN)) + End Sub +End Class diff --git a/ghost configurator/ghost configurator/My Project/Application.Designer.vb b/ghost configurator/ghost configurator/My Project/Application.Designer.vb new file mode 100644 index 00000000..e1702832 --- /dev/null +++ b/ghost configurator/ghost configurator/My Project/Application.Designer.vb @@ -0,0 +1,38 @@ +'------------------------------------------------------------------------------ +' +' Dieser Code wurde von einem Tool generiert. +' Laufzeitversion:2.0.50727.4016 +' +' Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn +' der Code erneut generiert wird. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + + +Namespace My + + 'HINWEIS: Diese Datei wird automatisch generiert. Ändern Sie sie nicht direkt. Zum Ändern + ' oder bei in dieser Datei auftretenden Buildfehlern wechseln Sie zum Projekt-Designer. + ' (Wechseln Sie dazu zu den Projekteigenschaften, oder doppelklicken Sie auf den Knoten "Eigenes Projekt" im + ' Projektmappen-Explorer). Nehmen Sie auf der Registerkarte "Anwendung" entsprechende Änderungen vor. + ' + Partial Friend Class MyApplication + + _ + Public Sub New() + MyBase.New(Global.Microsoft.VisualBasic.ApplicationServices.AuthenticationMode.Windows) + Me.IsSingleInstance = false + Me.EnableVisualStyles = true + Me.SaveMySettingsOnExit = false + Me.ShutDownStyle = Global.Microsoft.VisualBasic.ApplicationServices.ShutdownMode.AfterMainFormCloses + End Sub + + _ + Protected Overrides Sub OnCreateMainForm() + Me.MainForm = Global.ghost_configurator.Form1 + End Sub + End Class +End Namespace diff --git a/ghost configurator/ghost configurator/My Project/Application.myapp b/ghost configurator/ghost configurator/My Project/Application.myapp new file mode 100644 index 00000000..3d33ef63 --- /dev/null +++ b/ghost configurator/ghost configurator/My Project/Application.myapp @@ -0,0 +1,10 @@ + + + true + Form1 + false + 0 + true + 0 + false + \ No newline at end of file diff --git a/ghost configurator/ghost configurator/My Project/AssemblyInfo.vb b/ghost configurator/ghost configurator/My Project/AssemblyInfo.vb new file mode 100644 index 00000000..1ccc3794 --- /dev/null +++ b/ghost configurator/ghost configurator/My Project/AssemblyInfo.vb @@ -0,0 +1,39 @@ +Imports System.Resources + +Imports System +Imports System.Reflection +Imports System.Runtime.InteropServices + +' Allgemeine Informationen über eine Assembly werden über die folgenden +' Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern, +' die mit einer Assembly verknüpft sind. + +' Die Werte der Assemblyattribute überprüfen + + + + + + + + + + +'Die folgende GUID bestimmt die ID der Typbibliothek, wenn dieses Projekt für COM verfügbar gemacht wird + + +' Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten: +' +' Hauptversion +' Nebenversion +' Buildnummer +' Revision +' +' Sie können alle Werte angeben oder die standardmäßigen Build- und Revisionsnummern +' übernehmen, indem Sie "*" eingeben: +' + + + + + \ No newline at end of file diff --git a/ghost configurator/ghost configurator/My Project/Resources.Designer.vb b/ghost configurator/ghost configurator/My Project/Resources.Designer.vb new file mode 100644 index 00000000..f8dd6e05 --- /dev/null +++ b/ghost configurator/ghost configurator/My Project/Resources.Designer.vb @@ -0,0 +1,79 @@ +'------------------------------------------------------------------------------ +' +' Dieser Code wurde von einem Tool generiert. +' Laufzeitversion:2.0.50727.4016 +' +' Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn +' der Code erneut generiert wird. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + +Imports System + +Namespace My.Resources + + 'Diese Klasse wurde von der StronglyTypedResourceBuilder automatisch generiert + '-Klasse über ein Tool wie ResGen oder Visual Studio automatisch generiert. + 'Um einen Member hinzuzufügen oder zu entfernen, bearbeiten Sie die .ResX-Datei und führen dann ResGen + 'mit der /str-Option erneut aus, oder Sie erstellen Ihr VS-Projekt neu. + ''' + ''' Eine stark typisierte Ressourcenklasse zum Suchen von lokalisierten Zeichenfolgen usw. + ''' + _ + Friend Module Resources + + Private resourceMan As Global.System.Resources.ResourceManager + + Private resourceCulture As Global.System.Globalization.CultureInfo + + ''' + ''' Gibt die zwischengespeicherte ResourceManager-Instanz zurück, die von dieser Klasse verwendet wird. + ''' + _ + Friend ReadOnly Property ResourceManager() As Global.System.Resources.ResourceManager + Get + If Object.ReferenceEquals(resourceMan, Nothing) Then + Dim temp As Global.System.Resources.ResourceManager = New Global.System.Resources.ResourceManager("ghost_configurator.Resources", GetType(Resources).Assembly) + resourceMan = temp + End If + Return resourceMan + End Get + End Property + + ''' + ''' Überschreibt die CurrentUICulture-Eigenschaft des aktuellen Threads für alle + ''' Ressourcenzuordnungen, die diese stark typisierte Ressourcenklasse verwenden. + ''' + _ + Friend Property Culture() As Global.System.Globalization.CultureInfo + Get + Return resourceCulture + End Get + Set + resourceCulture = value + End Set + End Property + + ''' + ''' Sucht eine lokalisierte Zeichenfolge, die ähnelt. + ''' + Friend ReadOnly Property AppIcon() As String + Get + Return ResourceManager.GetString("AppIcon", resourceCulture) + End Get + End Property + + Friend ReadOnly Property parametres_3D() As System.Drawing.Icon + Get + Dim obj As Object = ResourceManager.GetObject("parametres_3D", resourceCulture) + Return CType(obj,System.Drawing.Icon) + End Get + End Property + End Module +End Namespace diff --git a/ghost configurator/ghost configurator/My Project/Resources.resx b/ghost configurator/ghost configurator/My Project/Resources.resx new file mode 100644 index 00000000..e94b2945 --- /dev/null +++ b/ghost configurator/ghost configurator/My Project/Resources.resx @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + + + + ..\Resources\parametres 3D.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + \ No newline at end of file diff --git a/ghost configurator/ghost configurator/My Project/Settings.Designer.vb b/ghost configurator/ghost configurator/My Project/Settings.Designer.vb new file mode 100644 index 00000000..dbfe5d11 --- /dev/null +++ b/ghost configurator/ghost configurator/My Project/Settings.Designer.vb @@ -0,0 +1,97 @@ +'------------------------------------------------------------------------------ +' +' Dieser Code wurde von einem Tool generiert. +' Laufzeitversion:2.0.50727.4016 +' +' Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn +' der Code erneut generiert wird. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + + +Namespace My + + _ + Partial Friend NotInheritable Class MySettings + Inherits Global.System.Configuration.ApplicationSettingsBase + + Private Shared defaultInstance As MySettings = CType(Global.System.Configuration.ApplicationSettingsBase.Synchronized(New MySettings),MySettings) + +#Region "Funktion zum automatischen Speichern von My.Settings" +#If _MyType = "WindowsForms" Then + Private Shared addedHandler As Boolean + + Private Shared addedHandlerLockObject As New Object + + _ + Private Shared Sub AutoSaveSettings(ByVal sender As Global.System.Object, ByVal e As Global.System.EventArgs) + If My.Application.SaveMySettingsOnExit Then + My.Settings.Save() + End If + End Sub +#End If +#End Region + + Public Shared ReadOnly Property [Default]() As MySettings + Get + +#If _MyType = "WindowsForms" Then + If Not addedHandler Then + SyncLock addedHandlerLockObject + If Not addedHandler Then + AddHandler My.Application.Shutdown, AddressOf AutoSaveSettings + addedHandler = True + End If + End SyncLock + End If +#End If + Return defaultInstance + End Get + End Property + + _ + Public Property CfgPath() As String + Get + Return CType(Me("CfgPath"),String) + End Get + Set + Me("CfgPath") = value + End Set + End Property + + _ + Public Property Update() As Boolean + Get + Return CType(Me("Update"),Boolean) + End Get + Set + Me("Update") = value + End Set + End Property + End Class +End Namespace + +Namespace My + + _ + Friend Module MySettingsProperty + + _ + Friend ReadOnly Property Settings() As Global.ghost_configurator.My.MySettings + Get + Return Global.ghost_configurator.My.MySettings.Default + End Get + End Property + End Module +End Namespace diff --git a/ghost configurator/ghost configurator/My Project/Settings.settings b/ghost configurator/ghost configurator/My Project/Settings.settings new file mode 100644 index 00000000..fef48623 --- /dev/null +++ b/ghost configurator/ghost configurator/My Project/Settings.settings @@ -0,0 +1,12 @@ + + + + + + + + + True + + + \ No newline at end of file diff --git a/ghost configurator/ghost configurator/My Project/app.manifest b/ghost configurator/ghost configurator/My Project/app.manifest new file mode 100644 index 00000000..39f8b3f5 --- /dev/null +++ b/ghost configurator/ghost configurator/My Project/app.manifest @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ghost configurator/ghost configurator/Resources/parametres 3D.ico b/ghost configurator/ghost configurator/Resources/parametres 3D.ico new file mode 100644 index 0000000000000000000000000000000000000000..1ec98e9bc9114ddd9797fad7b346b572a3cdfad1 GIT binary patch literal 16478 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 literal 0 HcmV?d00001 diff --git a/ghost configurator/ghost configurator/bin/Debug/ghost.cfg b/ghost configurator/ghost configurator/bin/Debug/ghost.cfg new file mode 100644 index 00000000..d0d26554 --- /dev/null +++ b/ghost configurator/ghost configurator/bin/Debug/ghost.cfg @@ -0,0 +1,411 @@ +##################### +# BOT CONFIGURATION # +##################### + +### the log file + +bot_log = ghost.log + +### the language file + +bot_language = language.cfg + +### the path to your local Warcraft III directory +### this path must contain war3.exe, storm.dll, and game.dll +### this path must end in your system's path seperator (i.e. "\" on Windows or "/" on Linux) +### if this path contains War3Patch.mpq the bot will attempt to extract "Scripts\common.j" and "Scripts\blizzard.j" on startup and write them to bot_mapcfgpath (which is defined later in this file) +### common.j and blizzard.j are only required for automatically calculating map_crc, you do not need them if your map config files already contain map_crc + +bot_war3path = C:\Games\Frozen Throne\ + +### the address GHost++ will bind to when hosting games (leave it blank to bind to all available addresses) +### if you don't know what this is just leave it blank + +bot_bindaddress = + +### the port GHost++ will host battle.net games on (this must be different from your admingame_port) + +bot_hostport = 6112 + +### maximum number of games to host at once + +bot_maxgames = 5 + +### command trigger for ingame only (battle.net command triggers are defined later) + +bot_commandtrigger = ! + +### the path to the directory where you keep your map config files (must end in your system's path seperator) +### this directory can also contain common.j and blizzard.j (extracted from War3Patch.mpq) +### common.j and blizzard.j are only required for automatically calculating map_crc, you do not need them if your map config files already contain map_crc + +bot_mapcfgpath = mapcfgs\ + +### the path to the directory where you keep your savegame files (must end in your system's path seperator) + +bot_savegamepath = savegames\ + +### the path to the directory where you keep your map files (must end in your system's path seperator) +### GHost++ doesn't require map files but if it has access to them it can send them to players and automatically calculate most map config values +### GHost++ will search [bot_mappath + map_localpath] for the map file (map_localpath is set in each map's config file) + +bot_mappath = maps\ + +### whether to save replays or not + +bot_savereplays = 0 + +### the path to the directory where you want GHost++ to save replays (must end in your system's path seperator) + +bot_replaypath = replays\ + +### the Warcraft 3 version to save replays as + +replay_war3version = 24 + +### the Warcraft 3 build number to save replays as (this is specific to each Warcraft 3 version) +### patch 1.23: war3version 23, buildnumber 6058 +### patch 1.24: war3version 24, buildnumber 6059 + +replay_buildnumber = 6059 + +### the bot's virtual host name as it appears in the game lobby +### colour codes are defined by the sequence "|cFF" followed by a six character hexadecimal colour in RRGGBB format (e.g. 0000FF for pure blue) +### the virtual host name cannot be longer than 15 characters including the colour code, if you try to go over this limit GHost++ will use the default virtual host name + +bot_virtualhostname = |cFF0080FFGhost + +### whether to hide each player's IP address from other players or not + +bot_hideipaddresses = 0 + +### whether to check for multiple IP address usage or not + +bot_checkmultipleipusage = 1 + +### whether to require spoof checks or not +### disabling spoof checks just turns off automatic spoof checks and requiring players to be spoof checked before starting the game +### spoof checks need to be enabled if you want GHost++ to detect which realm each player came from (use the !check command to see the realm) +### you can always manually spoof check by whispering the bot (and in fact is required before running admin commands) + +bot_spoofchecks = 0 + +### whether to display game refresh messages by default +### this can always be changed for a particular game with the !refresh command + +bot_refreshmessages = 1 + +### whether to automatically lock games when the owner joins + +bot_autolock = 0 + +### whether to automatically save games when a player disconnects +### this can always be changed for a particular game with the !autosave command + +bot_autosave = 0 + +### whether to allow map downloads or not +### set to 0 to disable map downloads +### set to 1 to enable map downloads +### set to 2 to enable conditional map downloads (an admin must start each map download with the !download or !dl command) + +bot_allowdownloads = 1 + +### whether to ping players during map downloads or not +### GHost++ will always stop pinging any players who are downloading the map +### this config value determines whether GHost++ should stop pinging *all* players when at least one player is downloading the map + +bot_pingduringdownloads = 0 + +### the maximum number of players allowed to download the map at the same time + +bot_maxdownloaders = 3 + +### the maximum combined download speed of all players downloading the map (in KB/sec) + +bot_maxdownloadspeed = 100 + +### use LC style pings (divide actual pings by two) + +bot_lcpings = 1 + +### auto kick players with ping higher than this + +bot_autokickping = 400 + +### the ban method +### if bot_banmethod = 1, GHost++ will automatically reject players using a banned name +### if bot_banmethod = 2, GHost++ will automatically reject players using a banned IP address +### if bot_banmethod = 3, GHost++ will automatically reject players using a banned name or IP address +### if bot_banmethod is anything else GHost++ will print a message when a banned player joins but will not automatically reject them + +bot_banmethod = 1 + +### the IP blacklist file + +bot_ipblacklistfile = ipblacklist.txt + +### automatically close the game lobby if a reserved player (or admin) doesn't join it for this many minutes +### games which are set to automatically start when enough players join are exempt from this limit (e.g. autohosted games) + +bot_lobbytimelimit = 10 + +### the game latency +### this can always be changed for a particular game with the !latency command (which enforces a minimum of 50 and a maximum of 500) + +bot_latency = 100 + +### the maximum number of packets a player is allowed to get out of sync by before starting the lag screen +### before version 8.0 GHost++ did not have a lag screen which is the same as setting this to a very high number +### this can always be changed for a particular game with the !synclimit command (which enforces a minimum of 10 and a maximum of 10000) + +bot_synclimit = 50 + +### whether votekicks are allowed or not + +bot_votekickallowed = 1 + +### the percentage of players required to vote yes for a votekick to pass +### the player starting the votekick is assumed to have voted yes and the player the votekick is started against is assumed to have voted no +### the formula for calculating the number of votes needed is votes_needed = ceil( ( num_players - 1 ) * bot_votekickpercentage / 100 ) +### this means it will round UP the number of votes required +### if you set it to 100 it will require 2/3, 3/4, 4/5, 5/6, 6/7, 7/8, 8/9, 9/10, 10/11, and 11/12 votes to pass +### if you set it to 90 it will require 2/3, 3/4, 4/5, 5/6, 6/7, 7/8, 8/9, 9/10, 9/11, and 10/12 votes to pass +### if you set it to 80 it will require 2/3, 3/4, 4/5, 4/6, 5/7, 6/8, 7/9, 8/10, 8/11, and 9/12 votes to pass +### if you set it to 70 it will require 2/3, 3/4, 3/5, 4/6, 5/7, 5/8, 6/9, 7/10, 7/11, and 8/12 votes to pass +### if you set it to 60 it will require 2/3, 2/4, 3/5, 3/6, 4/7, 5/8, 5/9, 6/10, 6/11, and 7/12 votes to pass + +bot_votekickpercentage = 100 + +### the default map config (the ".cfg" will be added automatically if you leave it out) + +bot_defaultmap = wormwar + +### the MOTD file +### the first 8 lines of this file will be displayed when a player joins the game +### if this file doesn't exist a default MOTD will be used + +bot_motdfile = motd.txt + +### the gameloaded file +### the first 8 lines of this file will be displayed when the game finished loading (after the player loading times are displayed) + +bot_gameloadedfile = gameloaded.txt + +### the gameover file +### the first 8 lines of this file will be displayed when the game is over +### this only works when using a stats class - note: at the time of this writing the only stats class is for DotA maps + +bot_gameoverfile = gameover.txt + +### whether to use regular expressions when loading map configs and maps or not + +bot_useregexes = 0 + +### the "TCP no delay" flag +### this controls whether or not your operating system should use the "no delay" algorithm on game sockets +### the algorithm is designed to reduce latency by sending data in small packets as soon as possible rather than waiting to send a single larger packet +### enabling this algorithm requires additional bandwidth because it is a less efficient way of sending data +### however, it may reduce game latencies in some cases + +tcp_nodelay = 1 + +############################ +# ADMIN GAME CONFIGURATION # +############################ + +### whether to create the admin game or not (see readme.txt for more information) + +admingame_create = 0 + +### the port GHost++ will host the admin game on (this must be different from your bot_hostport) + +admingame_port = 6113 + +### the admin game password + +admingame_password = blub + +### the default map config to use in the admin game +### if this value is blank the bot will use a hardcoded map instead +### it's recommended that you use the hardcoded map instead of specifying a different one +### this value exists because the hardcoded map is specific to Warcraft 3 versions and you may wish to use a previous or newer version +### the ".cfg" will be added automatically if you leave it out + +admingame_map = + +##################### +# LAN CONFIGURATION # +##################### + +### the Warcraft 3 version to use when broadcasting LAN games + +lan_war3version = 24 + +### the UDP broadcast target +### if this value is blank the bot will try to broadcast LAN games on the default interface which is chosen by your operating system +### sometimes your operating system will choose the wrong interface when more than one exists +### therefore you can use this value to force the bot to use a specific interface +### for example you may set it to "192.168.1.255" to broadcast LAN games to the 192.168.1.x subnet + +udp_broadcasttarget = + +### the UDP "don't route" flag + +udp_dontroute = 0 + +########################## +# AUTOHOST CONFIGURATION # +########################## + +### this section of the config file is for enabling autohost when the bot starts up without having to issue a command +### you can activate the autohost feature without changing anything here by using the !autohost command + +autohost_maxgames = 0 +autohost_startplayers = 0 +autohost_gamename = +autohost_owner = + +########################## +# DATABASE CONFIGURATION # +########################## + +### database type +### use "sqlite3" for a local SQLite database +### use "mysql" for any MySQL database + +db_type = sqlite3 + +### sqlite3 database configuration +### this is only used if your database type is SQLite + +db_sqlite3_file = ghost.dbs + +### mysql database configuration +### this is only used if your database type is MySQL + +db_mysql_server = localhost +db_mysql_database = ghost +db_mysql_user = YOUR_USERNAME +db_mysql_password = YOUR_PASSWORD +db_mysql_port = 0 + +############################ +# BATTLE.NET CONFIGURATION # +############################ + +### which battle.net server to connect to +### 1.) useast.battle.net +### 2.) uswest.battle.net +### 3.) asia.battle.net +### 4.) europe.battle.net +### note that each banned player is tied to the realm it was created on and the realm is case sensitive +### so if you change your realm from useast.battle.net to USEAST.BATTLE.NET it'll still connect but anyone previously banned will not be counted as banned until you change it back + +bnet_server = useast.battle.net + +### the server alias +### this name will be used to identify the battle.net server in the GHost++ console +### if you leave it blank it will use a short name such as "USEast" for official battle.net servers or it will use the actual server address + +bnet_serveralias = USEast + +### your Warcraft III: Reign of Chaos CD key +### you cannot use the same CD key here that you yourself use to login to battle.net if you plan to login at the same time as your bot + +bnet_cdkeyroc = FFFFFFFFFFFFFFFFFFFFFFFFFF + +### your Warcraft III: The Frozen Throne CD key +### you cannot use the same CD key here that you yourself use to login to battle.net if you plan to login at the same time as your bot + +bnet_cdkeytft = FFFFFFFFFFFFFFFFFFFFFFFFFF + +### your battle.net username +### you cannot use the same username here that you yourself use to login to battle.net if you plan to login at the same time as your bot + +bnet_username = + +### your battle.net password + +bnet_password = + +### the first channel to join upon entering battle.net + +bnet_firstchannel = The Void + +### the root admin on this battle.net server only + +bnet_rootadmin = Rushkiller + +### command trigger for this battle.net server only + +bnet_commandtrigger = ! + +### whether to automatically add your friends list to each game's reserved list + +bnet_holdfriends = 1 + +### whether to automatically add your clan members list to each game's reserved list + +bnet_holdclan = 1 + +### whether to allow anonymous users (non admins) to use public commands such as !stats and !statsdota on this battle.net connection +### if you are having trouble with spammers causing your bot to flood the server you should disable this + +bnet_publiccommands = 1 + +### BNLS server information for Warden handling (see readme.txt for more information) +### you will need to use a valid BNLS server here if you are connecting to an official battle.net realm or you will be disconnected every two minutes + +bnet_bnlsserver = localhost +bnet_bnlsport = 9367 +bnet_bnlswardencookie = 1 + +### you will need to edit this section of the config file if you're connecting to a PVPGN server +### your PVPGN server operator will tell you what to put here + +bnet_custom_war3version = 24 +bnet_custom_exeversion = +bnet_custom_exeversionhash = +bnet_custom_passwordhashtype = + +### +### example configuration for connecting to a second official battle.net server +### + +# bnet2_server = uswest.battle.net +# bnet2_serveralias = USWest +# bnet2_cdkeyroc = FFFFFFFFFFFFFFFFFFFFFFFFFF +# bnet2_cdkeytft = FFFFFFFFFFFFFFFFFFFFFFFFFF +# bnet2_username = +# bnet2_password = +# bnet2_firstchannel = The Void +# bnet2_rootadmin = +# bnet2_commandtrigger = ! +# bnet2_holdfriends = 1 +# bnet2_holdclan = 1 +# bnet2_publiccommands = 1 +# bnet2_bnlsserver = localhost +# bnet2_bnlsport = 9367 +# bnet2_bnlswardencookie = 2 + +### +### example configuration for connecting to a third PVPGN battle.net server +### + +# bnet3_server = server.eurobattle.net +# bnet3_serveralias = EuroBattle +# bnet3_cdkeyroc = FFFFFFFFFFFFFFFFFFFFFFFFFF +# bnet3_cdkeytft = FFFFFFFFFFFFFFFFFFFFFFFFFF +# bnet3_username = +# bnet3_password = +# bnet3_firstchannel = The Void +# bnet3_rootadmin = +# bnet3_commandtrigger = ! +# bnet3_holdfriends = 1 +# bnet3_holdclan = 1 +# bnet3_publiccommands = 1 +# bnet3_custom_war3version = 24 +# bnet3_custom_exeversion = 184 0 22 1 +# bnet3_custom_exeversionhash = 219 152 153 144 +# bnet3_custom_passwordhashtype = pvpgn diff --git a/ghost configurator/ghost configurator/ghost configurator.vbproj b/ghost configurator/ghost configurator/ghost configurator.vbproj new file mode 100644 index 00000000..baa5228a --- /dev/null +++ b/ghost configurator/ghost configurator/ghost configurator.vbproj @@ -0,0 +1,183 @@ + + + + Debug + AnyCPU + 9.0.30729 + 2.0 + {CDE6F876-E220-4495-8552-422354CDED44} + WinExe + ghost_configurator.My.MyApplication + ghost_configurator + ghost dynamic configurator + 512 + WindowsForms + v3.5 + On + Binary + Off + On + Resources\parametres 3D.ico + false + My Project\app.manifest + 145E25121ED2A3CD55019B94B81472B020C62475 + ghost configurator_TemporaryKey.pfx + false + false + LocalIntranet + publish\ + true + Disk + false + Foreground + 7 + Days + false + false + false + en + false + 1 + 1.0.0.%2a + false + true + false + + + true + full + true + true + bin\Debug\ + ghost dynamic configurator.xml + 42016,41999,42017,42018,42019,42032,42036,42020,42021,42022 + + + pdbonly + false + true + true + bin\Release\ + ghost dynamic configurator.xml + 42016,41999,42017,42018,42019,42032,42036,42020,42021,42022 + + + + + + + + + + 3.5 + + + 3.5 + + + 3.5 + + + + + + + + + + + + + + + + + Form + + + Form1.vb + Form + + + + True + Application.myapp + + + True + True + Resources.resx + + + True + Settings.settings + True + + + + + Form1.vb + + + VbMyResourcesResXFileCodeGenerator + Resources.Designer.vb + My.Resources + Designer + + + + + MyApplicationCodeGenerator + Application.Designer.vb + + + SettingsSingleFileGenerator + My + Settings.Designer.vb + + + + + False + .NET Framework Client Profile + false + + + False + .NET Framework 2.0 %28x86%29 + false + + + False + .NET Framework 3.0 %28x86%29 + false + + + False + .NET Framework 3.5 + false + + + False + .NET Framework 3.5 SP1 + true + + + False + Windows Installer 3.1 + true + + + + + + + + + \ No newline at end of file diff --git a/ghost configurator/ghost configurator/ghost configurator.vbproj.user b/ghost configurator/ghost configurator/ghost configurator.vbproj.user new file mode 100644 index 00000000..32588299 --- /dev/null +++ b/ghost configurator/ghost configurator/ghost configurator.vbproj.user @@ -0,0 +1,17 @@ + + + publish\ + + + + + + + + + + + de-DE + false + + \ No newline at end of file diff --git a/ghost dynamic configurator.exe b/ghost dynamic configurator.exe new file mode 100644 index 0000000000000000000000000000000000000000..2babb0882e4d112be81abca866bcc2d5d6993952 GIT binary patch literal 94208 zcmeFa2S8NE^9TMo@PMQFIOJ$@C$>|HA{K0jCHCGsQjVg)!5s*QAlBGRBt}uO#b{!h zn#9DC7^8_@V+=9&XzaZtG0prxv#(qMlbCP$|9=1f?>yh_&d$!x%+Aiv?%Vh1HGCoG z$Z?z#{{Qg@$9;%j`oyy9pI=H)?5W-E$-U=#q}GQHJ&)8Hn3`tRWtogAruYn9Vti(% zF-MnR(3x^Gb!nNpPJIUGGK@)v2oDcc9g%e37dWn`gAf`QGYZp0%gPVg3#|1fX zTweitz7^6sq+{_*+)-K~@QoDXpMJTEC?{d?QE;)-Ij%bUT7Jc>fWplL-2s#yo!XSW0APQS4ZToC>K-H(prAc6dGLB6Y;X?yOolNi?}`o12iHme|8kFwi*8kl8k&MT_`miOrfvwv1|OXdKviAZ6gpTpSn0brKnlWlaBp z4>3<4cao&vzn$S~L|<)7mMMptb0IBtf>UCN0cjHq&Q1z@WCBZ?cBT2H+HYX{Syk^%mG$bOtZtdDNUwEO-;X|8Gp4i^9Wz_!`(Hb{yv}4EC9zD85 zM>k!!Zux7kt$6w6Io{sYeSEx^FP|S3)yT`svstr7hYoH&bNbUELwfzcC|8rnhKY%N z;^Vp{CUzf})^}W5zm%l@{ra}ATSr@&tCwC{bnMs>e}6w`XXlKJ^f_~;&z(Ed-QB%m z!v@EX?at0l^YrwLii$XNV9S})dxj5xj-at}TmKA#fzR_^YHzQkg#I6HTU*VB=nK^Fe%;~ddPUCrg zLV@Yp)l+--eh88K_wRAy#Lly4_Kq1d=%4ZSuha?;YdCX8VXs~tr%pC+*|K{6{Gy;B z->}d+!-w~Vymjj6KHOGz?C87x{uB=hpTR>0e|7Tsx^=4u4I0>^NB5aCXUv>AZRU$p z(OIAE*?#->#Vg-eOq(`w&!?L&UO06A-2TNcO^s>WT&Jrk5%}l7)v7tArNAk*A2GaL zLVV}AQJsel>C_>%xwEsF3I-TwQe9fF_akH*T0ZWpaGqJ}r85k8aZ{ zT(8%T9Mu0CT(Nw{k|mQD%rAcb{kI=HxN+~^ z)w_2u-@0|-`t{Qg?b4;=XHI`!wruW)+txzca?{V7$Tp^r9z6`Mb?MT%)2HWaH0rRh zdVTu5;O3_4-K*XH&)4zkmOIdp~_?;heT@S{D`;OrBIYp}^d_Rf|*K9J+d? zVpaK~&6`)A`sS0bPi~Kk8`!o@Gjx_#TXW-v((>|IWy>Jf%r&cLmzU2eTlQk<;;CCU zZ+iIf_QQua&}DaSe|PKV`RmtCUAc1d(s#$so!$TKsXeu71&?%Mewm~?S* z&dM5BkZKS9ltbeuC!`;1K-;M{q*w9mw3rud=yy3mAuPt0yviPNGixy6uJGW^1 z^zloVF1UH){Eh2pu6%#;;)Nq;&wT#vsok?@6{e+*^z~K4fvj1xa_!pX^XE-pxM0?T z1#=e6pEY;xj2B;=Tw1#D`t{3?AK!WK;QC!y($-4yyHzV^9Xa$?O3L8sULHWlT(e^N z%z1NjXU)o-KQDXk9Mg>HnUhO0KKf|${d-q#-8z5c+G!H);^A{=_8mU--bdTkbnh06 zih~CadgJxiX3u_++#r2sA~9{+q^VO&4ji^(Vw(O-fYf7g~89#06gejBrN+#uGWu;xd^!26hj-RU7Q}Ok#FOR>!c+tep9oxFQ zs~jB_YgWI!ylnQ|ITIHxn7Uxzl-aY2r%cITy=v+Gd)M#XyK)oSzIy8W%U@yapFOh= z23cA<8CWBdT|Ea;PlzEX3iqH;BzKy+_?Vn;|D)Nv`4q^-@kVE&Lvpm z4TyI2oA1B>>gds3)v8r{Ub#Fy+!wzzv1npq@x-{|qWB2~aXIEuuWwv^=k}%RSHJ!4 zyJN7ZZz^^kJn(kevdJx)M}Ypof&EvkST=QX5nRkv{GU9ruweX@DMgnroqzc7CKL{q zu3q`(^5qj3&qK7m`@eWs82d|?z6=r2O*3Z9n2GPqY15_^LoT@1Teq%1dGh#&AMQV5 zqTRW33HpImLq%J*tbbmifRFJ~x_HK{nfWuO<;<8dVd|9J!U-93=S;nO2afkUkp1rB z(X*%bRh-;${Mgo_iDOa4+uM8X+Ep`OoC2AqOo3cQ6DH*5jiUw^e@*UmLU2(fhOlEsVXmlPLMe@!B}a&od(EPv&P$M=7Dd>4Kj-Az8^GRFS# zlV5$JQn`Y$ci!2w`Q5i>&6*0Krca+bb!zdX;{3wG+}X2cJa};b*I$4B`R5;h`sooV z=iyCweuxGl9XrPU1EEmG$49+v*^-G9^XZe91G!RDliqyeHJAj(3tRy-f8qS0Qx&_9 z9NsE$xN6nPrAtdE7EUNCnph063e2drwCv@detHbX1P^fM&Ue?ZoyI_WZz~xR4C90M z*KgQRx?o<>ym^x_DrZbDD4dXGHjQ1laPE^QKmGRGufP8K1 z+PMM5fxl+W@>w%W3i7k_^KrTe6CSaR92d7+{8+r_k8 zxdQXojF(GGN*7OFxM0fIv16uADT3SoEn7y78Wk5e z2A`y)q|}t;p+kozB_*b%rKP5(4jVcQ3xU7iYt^fJ%$=KCke`sBi|yQmQ6qYf9MO0C z_HDoa28;jk(@%G9-TLOfy*uB3|BW@PmmECs$+2Ufojkc8--?Pu6<;5kHFL_oefw_T zzK!7l=B{7AHfZ3$P8~aT?b2mH|9(S;41VMFSMS}u0+U7$V)7NfckWzSRbF=E#&t+U z8>b}L?-L5Llaj_H8{+XzNlr{pABXC5=FG$x9ye}WLPCO0r~5l{Ax2%gbpGobmT%qi z>ej96Kl*Uf;+JM&S~+}Z|J}QH(9qGNhr`3d>es6m7TPeXNfY$K?OT`OPaZrFzSrS4 zSFb8Na`>>o8?NiuuN~08Z~uP12K4VeeAp0!A@Qv@H$HrD6a7x#N4GHg9zD8q|Nf0~ zCKps8)P3^g$;647S;iD&rXj~XZv6NxlPNoHOx%hUWs4TgPfyP<7z{02w){JCVNG=H z>Unq`_*HOw@7}fDyFXgFV!6;3uEoU@W7@WE+ook~yS6>LcZ0XQbLT1s-J^&2g1y^t zed}Lcb?DFmnZ5b*W+f$#8a;YQ`nW{+6R@;>`v;F7--VZxzd!zP|M8={kn85n8>lGM zeemGHq@se%%nUbf~B+6H=*tP4U0|)kDoc{FVLwuk7^zg}(hseSytzNzI>eVZ- z3ZWuoEG{a9y(K1MKRt6oK>_4~m>V{%e`QH2Mn2@~*S{aU)?bR|?(TN;#ucbe_@WE; ze7bYVl2W)_v<0s*ZfsiT7hdStp~JLkQxRjlxoN|_yEoV*b^pg79^i}grZ-+Yc<{jQ zzyAgfe}DS>g86ehbm$Nm7&vD1=(pb7wEv5JM~@t25?)etrfzDLwu5*Ee9gWO9uiIB?+KkxQjgUAc0B?23KioIm?)*UP1g z;nUC-3RK7K?41XpMS2?+c7=X;?F67BcjUtYXO zkZbhl(Qj_rv~S;@BZm(_3ev-m_}>5NN9t=-TweCdg$w7zicf#Pckf$xZ>;;^{Vl)z{3D`;-+ue$)pg|w z@q@zlPNVYLy`n0L9Z+!Lc9rE+!>Y0y%+rM+?^0H-%Pkea{4G9&0`Q_)A7ne*d zOf_Z4XJ;jtvJ=f_)5sAcu!}W+{@k>b6!^oKn3%sKmr_~n#EHGwFhTf@FA_Ue|(BuU$ROzTcwCx;4uX24mFx{PPb`#j#_D zu|wFUbEodzy7cbdbMT-+rHkiXyLtxkIaVL?_u92Hue`GG$dLoo(9b`jB6RZd%L~V* zC8ik0WTdBM88eEDi?Xw_izXJPBqxs^HG05+0X1v>t!*3x4|_k``c1`W*i1Nk=D?ZL z`?r0tVPfI<+qW=>-bAk*J#r|dR;_>lf2}sSUfsHV`}Fvx;`0mVk6yfR?Be;ONSr@+ zc*XLCrHdEby9;B!_4ChIYdnGzYZMXDBr>vTR8;e3&8AE#y!71(1d0fu5mpJ`?=OE{ zS~};8FZRGO{s=$$^AErN`V*W?x2|1#_UM7>c;v{DsVOONk3$9z?$)ha&z?P_TeLus z`FHvYI1L)qjtH-pnljLsG1!znG9?*15>5K|>-y57xflp=T$?t%4u8Ak<(JFK%9br% zf}$>6+D$4NJAGPK(Ztk(e8Z@by;`@58Zx-gl9%VflR*C$FPt@-vN5Z|r{$Qn4BtV62EFjY3$<$1s#~{CHRW@!E)jwnGZT^xqsNYg8H^q=e4sIN?9H2(5F7mT z(?b{}d;(lC=CzQJ5NIPlZt%Rhh2wKm#^sY@Z$7wGiPK^pPpmRPVCjI!-(O13-XO;&s5M{@Z>Q>yL|cL zy?b}zT~QsMvuDr#gY~k|tpf)1D=sd8XGl*UJ8o=pV!|jx(&$s)9C>j68vK|b8ayOK z!-Rq=ojP_XFJD%WXQm}UE_x;%<6_)cLq)|AES)f4W4KA$Kur6`ym|9b>xCCOy#3az zvu2f)loU>zRx)i0);M{2%K*c_k9?v0J`y!E9q@Iwr*QafXEW5vhi_uTOq{ z&5e$t{vbJW6`_tQ^5er3r^lZuOqi;7_R*g(k5$;!^oz@FI6 z8yB&VA%#4$5$)Gsf5Gtl2XbK_;GMVE78a&Y$RC@ZmyY9NsVO5~S~%(3Z}yx!^Tp-w zzQlgl?OPW%y|K=eohgJd>({@!c=3Xq93#4_0CMFR)6-L?O)a>1;pq3@pM)pJY=!MI z1SB`EU;ggmSu_F0qN7{v{p{0u^Ij}2E<|q?V;^BcuGy4<&DeL|UWaW%RKX^swP@(> zM~@!(`-}Vh&m|r165=-K*wmhx8GSP|`lY4dW@wkPrPC|E+WF1bAD{VlA9mX?-E?T* zI)H5}AzJ?6gE!{S!vM*eIyI+c5~j}d@#E80uUc^N{9){0UA}bU+Ldpx#K!IotS-wq z4m*q)y3z}?mvI-z{LxPFJJl+v+(I}4@XBgsS~0@LlEu558vCk zaqX0n3D|O+Hnq5<1UD>l#^+=dP0acB)PC$Uz=qM$BpP!*2oJDIMKJRZgc7RY4k^MX z%zfCEO-o6_QkRy}OD3;bJqNMzi!;m>CqJ%U-Ah2mmhY4j)4aK0FDo;1%%n-#FyJAB zdqM+WfAujo8(&&9b@i%+=(r@r3+5Nhn>&8S^sGt6 z=?mwV;6@B~h6`FPj+W8#K&>(==n%LQd-8PjpQFfhP>Y--}rL4DDQ zZQC>*J+iOL)wQTF?W-?8!p^)*KO#JQ(Zbnzd1lO*J-c_tsKoSIuTJpl@>wulgp>{R zbxs`r_~?;c*c1|Kg@n|cI(h7*qNK@_l4ia*4%_=LPEVgaX>5MJVd@m~*)#jm%TUF4 z7mr=}{%eQ^XEk(4f84W>?L=<ejD@NhzY z5^h%^NR|mAc$hF@{MfW4+(?=?Cw0++l>G7iM+|FcNbIv?``WaWAx)#g4jug9#Fx8q zk4C74Ue3uGxAc`+FV4uHG9`C>?${S+6i%KzJ}WD^Rja1EcD`}p+(Af}pO;a-0)71@ z_8xIpRBrKKNnkIR=iP@6YC3En;=QN={hIXc-K=ZprtM;yRK8^y5fL_j-sI7v`!0QD zYT44Maie?o=-xUyIy~Dr`t=PnClwpM*!S-KFWz%?b&*+uoxfbV5F6m_V`I?KSRG85 zkdv8?+vOf+bIP~he0J!-wg7+ssHpJc$97?gY0;voT=!p3KstPtN+)+Wmx8>3BZo)# z?cJnP$M9xR^_n)NNm=+bZ5s8~TN~QNG@V#zTDg3|@L?~kTro2;Q4j3@08Y4D zw~lh%=Sny^Dx8&0F3#0lT&iI}S=SvCH?&cs`h^8)y}Gy4`0`PadLMQ5_3H}j*Awp^ zVp%(Mt=VXuh`sAnYzgJ$qa>~BX)=Vr+Xxb#ynxK%bSGNuZX3d~L zwVIC~GZGty@P{guE9Q>0lwoOUaqw3S8`k@L?`C+C-aYB~;d6c9rg+|C)W{A)hqP?g ztX5dVn&^%Wv5f^H-aL<88dn#WAwvdq><}9p+j7qAg1`XZw>Hga6j28_ewrHCj?OWU zoRA-1I3X$9IBNZ?%P`(?=M=Xma3ApXjdL^7hg7y+49p=zdbDrfymznm>0^gXn=*EM z&ge#sLL$OL+Q&BS*uI5cuWQ$~+3t_u_+;0cxO@9tLIJsH)5u1R!dkU#+NDc}kXk`4 zTQsU)KX}oCaRQzA_>t45<|QNy$;e0?Jh<1Jn^v6oa{Ie)FZt}#Rmq0_xWkUa4AZ7z znLZ{zKRG`y6(P#%)l0BH@creJXU}|rQ$U9gy|s7Gng)7W)YyI8++2KoylVL1?8ggc zQ*T3J`^5Ozq=Zh%h8~FtJx7o3F=$|yX;aNUYK!}|qwpu$8Pg|s=@Q$oZ;!5>+fORW zTD9`U$t9^Pmlt^Rp6E*KA151nrH}2KV(2p_uJ<<;m}-wyoZNNz;9Ku+Sv+fI2GnlM z9Ea^a#FK2NB|ax7^UC+1;ar$Yy~pFFYi;Qlvve6*w>e>99IHZ~?Z z3#-MHv1x{p!w0|h=4%M~VDMj`+tL^6Oc#c#777Azwz;o zWexSUu&-D$X+la$5*QvnbfC$UiNFRMI~UF!f@lX1Y{GQepn-n&tm$J(_GEZ~!Grtl z*uD*$gb3rYuSKGr{ye%xbg^Z#(eC>loCS zf+rT{j~+E*)W~7|`gKoDNx)7f&Q~DhL-@CM&zqQSJ9la|aYB50`Vd3nzybX_W8dTS zsZ&@F9z3|OtgLj!^2KxKOm5aJ61M>4P|A*n|3tQRtLPzv`tV^%k;XV=8?B9QXIXpZZ_g`@H1uTCJIHE!0Mxof3>(RYSo7Sx&A|hb< zmD%|BLSPkNe7^H0?jGK}uw(n?H#fZjeztw^en5aSSA-4ilV2U){4V68{TZw&I(6uPK8k7E z7O^orPxo$Jv4!~07EsS6ION*@`R-dcF5J0w>Em4=yz%-*Y@e-Ly9UOC2^hDR-+%9I z+IGhG?$vkRe*MrPx>s`e&_S3MZWm4}F5d9knmf0#af)5~8`x|)`PI>P-+Alz-)S$R zynK24_U&7>Y=!%kk&%&^8RNQj#p%#!EOwrY$$x+hxjy^!gDaP@YyHi(58ixj{W|RY zyt;0!Ua#-grSpV>ye*sGfQ@0LaO3*fjT=|*{cJZjnNOTJ-m+!$1`X;J7UZs6x$No{ zAmAVqw)8I?KlV9x;MuO)FGzIk*r9dnR-HO^z(kOkIHp7U_BhLjQ+)q`)#s{$+hXr; zUHi?~drnn+_WFibN?)3f8#lXl?Fb6=uTxta9v1q_lDX&39yovY;JGsgRz221 zcGBMvvCcWi&JQ^)4mF>W6l zjm?%`J$p27-mG4|djEy-1tm`t+s!(1^eD#eRT}0{ZBsrc<0U?xZx=5*!(N3K3836e)!PAxMA0^W4oxx zh%b+QjD12lfnR_52_6!p;^RgR9WrRhkU_nAb#33S4R$JS-@Jf*OWf0ee~62V!}7ea zFeff<#F)5I*w4pp=sB~eVcQUQ?r>K{*wXywn{WO*7AVUe9u}5jNEkX~Fz$(W>e%+! z;r9{tT>ZWR8(g@j3^bgTN{Sy7j~fhw`*!Qv>GQo?FI_y2vn7!ImtTHt)v6UbV$s5R zh@(*o7OceQ&7Bq)5PLQKExvDwwaaBZ_VI9Xq!FCz$^enysTFh74|xIkR`K zw%xk6`gr@Y$&=Fe@7q*^Z8~9vH8!W4H_6*I3fA)fwzwzeGj{ByLP_Wpne@p z7H!+M#z~vBG(-BhRD)sku%Uf7tY3WU)E@X!Y)v2zIe6f+apT7R2@n5?B21J62lmD4 z8%r=;i}Dh17Ied_GrhcM`yGBGDPi!S0iC;aX*+6UU-*_!cCJcF7__9cWY(+#fu9k> zd#0xJ8=Km9+*oL!$I!uD_UzvH)t4VueEl(&mZwi0=-Q=&uWyb21oMAR(@&!g4)W>t zLKA;qj}UE*8fwq1jG^+O?uhWP2Ksu~P8>OGAhr*iSYH8IC>IDS{`wko0wL=H-gc1<2@@f_p$yfJEj324j*9~h}XY0F5)ZToS zF>cq+_1Jxqsr^q&RIBFb%{%+3U2FKb@zqr>E;jrB2=5ybWgJR7GyIEQ zB@QKGy2P17+L6JL#z#nV%-Y2?25GDW2SzOCK=@DTNp_t8w@#z1M1r$)EaU_JAB2z3 zB$j4LuAN=_Hv!DxRi(8km*CGz6HN){&(crDwkF~Cj}q|A339Qt?l01Uj7$%I*rb_G zL^yW2CB2m(y<5_=V~L#J&C*_=!ToX3c{g{F6Vgu{b~}ja--5Z_j`s!leRrY`KO*pV52DeTV4y=m7cRy$PBH>%p1Q}}gK1_xgwS5|S2MNc? zCcRsNKT$$n5$88gOZtyLCSR1`D8BD3;^60r78h#Q?KU2q`Csws3NXv{ZQqH$t42I2 zcTLIdOrZMs?+F_U>CdI%wGye^K)gXBA8(TAfLBc9bCFzx3?cO3L3sZ}5?(iv1GH{< z2SqZ_EGUn0TiM}(rme19X0lP&R)zP*7~;)_R=OrFA|e|{U_Y&;Djp{SOs#ZX<4s9< z@g_ru+!U3nt*&$Xe!!26(6!f@4LLb@v4$=+-mHt)<(Z5~8l}RrnJOCS)Gh|nL48h*d0?1iQ`b%AVQ_XXGm&%j?SEF%uP?yrRkE4?R4=G z<09hGN~S$TOOf%(`TwDMJUj^=P#~2VLpX)9_xDB)lCd-Iy1~Bm@bF7(#r> zI)Vn%4T%t(y+tLYflAdRLO0Ncb3wP6hCEr@3As7CZaTbvDMy!_1|iTc-o7NutHXKY zi%{p^Vyoq%(sj!tUB*B;y7ZRom ziBHNv*T-iVkdx%o=|YkcSZM-IsS{RiQWneSBnrRj@tHzxm=<+TTnOuj5R)M*J-#3= zMC6zB-A(9*ER!KQEuT820B@L)m4Fvf(c7oeG85Btlb~oQ0VjIuv-eSv7=|P(t}@~a z@S3VbvN-B0G^xwY!i$#-QeRtZAws2!iXa8&nsba9c+p7`Q`Go0Q%-JtIx(FIsddx~ z%)Vf(1~avsm>Qp%VgM&$x;$93q;IAirfu+SJ7O~8^I^N0DX>k*7uk$RnBo)3mcw*u z$uQVNW4h4<4p@_@pKE5a$_f{(!>)R~DgT2O~fOt1$uh-Q-v z4RqZ)lg@Q{WNGmN3+Wi*1``wl6^iW;w+t@>3X^FirJ3Us(hZ`G5luZCgRBke2pZ3s zG#qn`R!GoljxiHH0gh$>4KahsB=Un%W-?}oxE2eCFRI0gbSp?n1`8BWs7x@ zt&zZjomkVTMNCJ5X}GtLwjnxnZAKc-Zf2%bVlp0n2P7Gm)i7snP2?`afY%`5!H^`l zolG#0j6Ok+Nya93io~uVB|;d;Sw>S%h^}pnC8ui}Laa3dYkjQTtVolDk*J2SG0rRr zI;0U-iFM}ZtbG$>nuyqO3>%QhWhPZ(7q-WoJ(Qc1XMk^S5)Nwy*Mb~yHBIBp2Ge*5 zEpXplRBY|PrC7qUS1dd=la-vGB~Ng=_*N>Lc^s1gvmdy5I3V)&VlgE%3^}RBBub^? ztxpCMrC>Q2?bg$UmGb0dNR|OF63c{LV)TRvJuml=HS3k^L?%IrKK%u@7!|?JMe(Z; zRmGwaxFpCFDKy*|Gm}|2K0ZBHo+U)fS5a6)?n?|RlA!WL%(WQ&Cd{7(giIkaOdysO zpOadZ4ECg$yB7l#P+{3B>xr|swOO#~%`BL$5SPgg&`c8+0u}NK3?sujMj_uN_%t$L zHtmQOBTSZd(OVu!BpY)n@W_OdvF;HvBqJ`ulp>p59*gS4mqju*;i=F+Xe!faW1TkS zSpQ1)DR~`B>(rP8O@U>>-=$?_(Uc=}56%IIb4ZdQIUcW?ld#PgU*R2$IpHcD!jY8R zcud-DG7x06)irCZLUkPRNH;{l^?*u3X1W;xauRA7 zjpNdYTBJ&hAL39D1REDS`Ej>x}c5QXd8#ikS{GRcdRUxaw z={0Q$h}uz_Q;atu-6SV+Xtya%`t2`43(9j-aBw|G*7F2&oahIDutqmE`8 zBjRsStFRQnFiGd>;PgrY6P1uRw+1{pI=B0>yH?6Gnd{io&B;?#{5c)K3Qb>TR^ zIF{p_eDrrXP8Fsznf$n{c);7?Iw3anLZDD)TTEzPdMZ&3t-|jNbP8sI`aP*CEQ7Ll*uo5Hu zm&`>Vq<;u#jtb0`bU>Tt2nn;KlfVLa&_4pO;b^@x@Qsg=4pZr;QTjN+1JP~|(8GVe zxFafs#}rdtH)s71D0kNXh^tT##7Ou&RTiVR`6s}QPjJzcP_^^U&ibE`J6lYQG~^tx z8L!~{xwU&6CLK-!lb{obcBPZ#dMt=ldIc`$9nLag6h=ppp1?2OqUg@HmmFSF z`0BB-pi=l6ah6r3&=}FXl!G+%gPYon@6HN6Y(r_p3R!7Hih$5L&MT`L9yM3TPYGIe zGDCJ%37U2?qf_9u5k_@0lOz_22(+JA}Q3(zbd@<26 z;{85Wa1i8+iK-E=OR$22JYP(081XhlD>xeCi>XB;w8P*E_P#_&$tx6v_;Dh2g%(jt z$TwW#C?ujB8ajr#nNXZ%#?eaE1chQEp&7wfDATzUcL_2;RlH&@&;rA}y||~olrm~j zq2*qb7NgiHER6jery^l|)j~N&9mYzQ@4Rp*f)4np%(bZU?@GcyOp2?o`h=)VHoXJ#C_LG3s&kdFtRxU&p6>J=0XQpkXa|xcUm^#s)xI>&jYm za~5D`5K~RCYtI-4;Mq`xq9NIs161q4rE@MzxkfpVOo8->FW8W0b{_;7?1guH>I)48 z8X=X+(VKf(gL2BrbZrQmp}~v(S8yJ{hbi$2M>gv9ji~@IvH=Lssi;gJ$)J*5z-IX4 z=ug2*3HCy`7>2-YBH{|PLI0VwJ*%J%W9E;egY9X!5*y<~$+d%lK|8#{+@8o2 zh2t16g1MPH0H#uyJL1QPmXr!}CrYBHq$Ko%BtyU~DM6tyBwrw0TqGzu5XsI2MFlAd zl}JfQFD1dflmuf)vWC&cQW82xk~IMfMY0RgZDBz`9?-4??PfuM5h&qfNlr7sDkC}` zXx%9Z+eNYmC2>KLQSZf)m^)R*K9*!ZN*Z;z8iAlvkXMqDa3)d`mLw%%&QcQgBPF2? zDJjq)l3EXAZ$^~SN2{P8LWq6sp{&(PP}Wo>D8@?_6c{g+a2Z<`sJDaGUF)ld&?;wR zf0+qyg|BWu3`>u34mXdX4MvG)(?@Xd#zAu4*NDd{#WHV&?hOZy)6Kv|tT;q2^feA; zX_8iB944o|9RlR`hs#jYmzHLzhPR`?egsNgjU#0oG`E(TOSf;1D)<^l$%v*4L~OL2 z*BIkinyFam1J<#ERtQ>|DT11=S(sv2c1$tYvzVenjmQ)uhEPvpN+=VUB2Hv0VQdK; zHU?a@5`ua=1O?gj8Ualn4sz#EUg{iHL7`hh+N!Yhs?a$CqR=_ih<*%|V~l4SVvP#z zW0Xqm6ST612x_WpVSr)TX^6oTy7|P&PJ2eEQ0g{DtQip#x{X@bx{70mGTsil4xkcj zqXQ~1b+NF(5Ea_)S|1y8B(P+TtjY+glE5UUyoO%i51X!oGXdD55ME@h})C(yHLmkLZrEbTJHD%+(J zsa+v0w96=5u(V4(BDYH!YIlmgyi{PiW@(opR@p9@;)ZeB}0-D-d+GI##o9%7d zq!Ou3AuY7YC=9T)NfS_I+a;(e&C(9TdX|5rLVwYAS;btcIGWiFSUq$1oMz zzFL19RTEev&XKIjKB|(yusHVrbULbnj(%2#Y6MMgJ$ZQ(>j zoI?ZJw%@5l>UT;jO}D68D##eq7_H8LioOwnnA8mft*mf@n%o>gK!_U{*0bz@3Ij!j zvxwUw>b72Gz=xYk_H3-70F) z+VfI1u(Jhl+a6@}=2-+15oZBW>tVw*l}P5qYOSGKLf>JDJkENhPLCswQ+R!&K-nYjbuJE|vI+woPeYV>WB3C(?35l)(rp zL-opSQK4y?r7ec6&<1JMHc}JVUu=j~Sxr@hK}30JW~a2oL~jN+F@`7&9!fEaZCxf6 zm^ND4XNU@hsO4=~ppu#*3#``178WQkv4CI#X`xw4Qy^~JCP7UkHkEsnw!tBe`m68(}LsZMxSjf_0 zR_O?m4BSXGLBq>p*0?VFH4O&YVsxXiVrr#; z5-`Htg!XWwRS81Fi$VV9gWGO1Km9HkFU!Bn>`Gl0E z{a{wk%jH7KQm$p?-g3E+vXsLn&_8OqTu52UYq4@4RxZhhp}^#Wfywd_1_?pGa{p0A z09lIc`mZ*l4=aIvkbFYQ(mreu{J~$7rL zfmkl2Eaez_XdhM}mJ2CMc>`7sD-g?tl%>2OD~Cm(T+&}C!C)VQt@KA2q$K*4^+y>2 zWGS-KAI35GgO!Nw3n@$c;jA21B9;p&OF70q>cdLJav^0YZ^X)BC06{yM=<_}S@BO8 z#3cR7{8L5%S&HoVk7V>=Wn%k6%F;gk4)}w`S+yS}wm;meeZrtd=vQu^G6Kj_B(@*e z*oFHL9nq9%>ERQV#>q4&O{3v2i=Z_pZ3DJN>8|lm=#^AH1?BpwxEQD5Vj2rX{dA;? z&<9S!Z7iTD!)gfW8H5f@_(xPy3cwPie0=pUqRbaBg^=kg3WNWy8?nmI@YftWsEgg$2SGQW$9(u>g&;Ks(g$S+ubS$i$cptfFSrtfG*9 zH2OJ!sC8=h=!f7|0P^l-`nd#F@hTJU6=g{hRg3-tNB~ZuS!W(lT7JM0z*mCJ2TW68 zT!0@7i5Y~w5FiDwqFn^#7@)6}NQ}XK65Dpzt&_NxBN#*IK_^#rExwkbkdl0@GF~9f zI%ll_buF{zGeRpuZK|2JphcllG~GW%n;+OS7S}Sf8fl>oHOjk}%lcrbHGK7pAcfjh zQ3$&Rf~#+t{v|-b1q`_gK$&T~BxYEUh$Q}$`35jGt&M&~K}|9OWv0C{eocFP1cjv6 zwb9Ae6;8_)DmCCQ;y1U(zw~VUKoMVQjel3dZ`sko!e^kwaG-uMcrra9tWu=(FVkfS zE-iP$G-Nb6Q6>H>z{gZUpE|M48re%8$gAwz5o~O2^l-)$>keiDQddYB)|0;INE&PY z8YJM}ocsmLpd<{+^c%Q`IWPlR3Rc!eJ3bHD0EukCUy*$i0!o@NDU{+Mk|FLAWQ+{* zl|f5oQOK+(G*rfJDr0Nxv1O@4@U}xhMBeS;zfm9;W;L4!n%AlOepedC>3oCLk~tj{=BX%b zOM?29M`NcHUBtvLGrbK$qVs#|AVarULoJp4%cE7+n)pECLKgd=1Q`?NCAO$_D~~?O ztU^@HNeM@;bxDF))p9S7E@!nE+nVxdXdG-a8n#~VE^14zQWV_ErALgAtwGk146#xW z?y`vr3T+^l%i_@V%ZedQD7>S{l&hw~L-duxJfo?Iox%8|!KeY(m?&-haQIkhiU^Ao zhOD17w*3BLY=y#W5ZNH9LeO7S;N3M9YIok9*Tq!(`Hw$bHBmm|jO;JY$ma^+lg`(w z%WmtdJ;YMbXY;il;f3nlV4x`cilWi7LQzOR`elF@A+SPhLVk%tL2NZC&1Hb=F};M= zXswpr3zeqYmd5_TbX2)6Caq9)ZC`ar^nSwNYx5yxMTqdM8p2+NRYO>KQCBF*|B)k9 zmRisHn$zk!YR^!33W@}Hi~-?SQ&F~-_k?mhc~8DhIb=6*>=o^CYUZ5w? zjr5a1g4S7aty0bDa^4G+ym&9ZZsY;J8q(FoI=X;4!k z=#yo%s+e_n`G~+AX=|*Fh&5V6t+0Gzy>h9#I*%}m%0vS^t*)o$WswnjGLd;EGOlVo zV$IjH7rDOLo4h8I$-9)VE(_~jNmy^t@aDbw`jN*(VJ9-qSUdB#@zqY#VW3c`l)6_` zsa~y)?#bc~0`h8`V5W7LO^FR(=6sv-9zrnPQQ9pGxEoI7$Ya~w%YuvH+l zTgUL^Laxjd;*8l(&CHfL3SnnKDi(L`3b9h7x;`dC20HR>;>H)> zz&Hf8<%R`60&#^MIEkjm*EkSjCw z1X)=^<60D&OaSTEA!U3Om*|nKE9BmZ?aA`Ctk)N4_Y`PLf`sy+k|3dyAfe9?B$Nd} zY?qG@B?%JjB!EE+t(2+5_%PG>D%BBYMI}twnB&8U+Gsm!VREmTW`h!28^9mZG>V=K z^kZQmZO|*@EZ~||gSD>K@Ro=TVY;FY6j-;|5jB9Qemyj0RVGocs!S#?7wTW5&e=dD zDjA{HjRmZtEs7e`7&ihr6mz)9map-3R=c6lZ*L&8HrmXbyx7rxv6q<~wFQhWgdy7r z8-mV%H3I7jRblE>Rmhd8!})MiX_cK9?%hB;+;;5o;W{tKFxHGfRAqb%7aw)F%!d7d z6q}GWZhRXRz_Vz`Lat05!AF?ht&-;m(a0h!yuff( zJn~|<>)#>PN&f(Xg;B)9y9C>eiw|h4;e*w@n%Bo{`sI&5;A-1}2|r<>+eqyb{XOd! z=4yRxTrFF7ijLE#lpWu5h->+d4Z6kuzG4Hntn*+MF(kDQ;v2yPq^9JhR9KnRCCfOj9Bj}F?3k2jEpDU#(4aA zH?7ZUbz^mnXm6%|LgZ_(vshv^zDAikl8-d)A?vMSHDX7TK}MQR*uw`gxPAQy#|mSX!D0nrOQV zb6gYCMPhbIf9E!j^!mYHsyBqH>|G(1?_^c=o-aOcGPmHM{s z$FelpAxILT#_bTzH)4<&*!YzR31LpOLn{+RVIj~n5Ud3Z&68WfD8qP`vs&#_r?@aI zuGlibuS{@TpZFP=^a@^uFvjFGq)LPMKqm3#9=5X+LB?O2OFz;resljQi~!tEZ(6$A*on| zXwO=J#F{9TCUy$*B^ZzBx-#*!E6oTpuQo8L1$ad})({y;tO-YE1tL-f_t>0jWKa@U z7M$o2tUzSQ&z_+$GF3ZhOA~(*q$__ z((M?l@j(HMWi0ue7Up=1k+D#yDuidVU&~@~e_7i-_6LQvEYGMAeT-pAf@$qlP4knz zF<>|h)A*hI)0ipD`e=uzTGXU`D|Dsf~5`+FQ!QNcZSFN>OFYm{-K zH(A0d^mi?Lj@bNTH(;$`e~+UoD!9isvE@j{iT1bQD8!zl4pr#L3ikIns-l8>>}t;1 zsDxw4Bs$wpw)9%$%Ig3pu}v z(|rfuZF`x!q5LEaD1r62Fd zH;qa9$$mB6Ozj`qOKj4=)Dmm^vshc~34duN9Twywfmlc^CLJ`}55r z-|}@4*AdOt0iktV_yBxM)1grIi5R3U^d=L1kLfDhoCM^@OzQ!Uhip&>#bqv5e| zX7cfYEF= zj0BZwg@_`whjn>WL)(xls8r-kR7p^&g)fsOgnCC#12YTvr&L_)r;zh$F@ ziXa>Oh!ZasRf!)pRBlz69;(E8c8Dm_F0+YmqYpD4>axZWJW=9L>HY~qm7ym(#ya#2 zDwRV|u}!p28pupL3W|1sAdg~JvRPOLALJ_Q0?N9}-K?K#11ZG^4d)Ft!TGWLWe$W^Q69XmvI<0j;DH z8D_oK2d}kgv`TWY^`JO&NUU36q3ITlgxFNGn!4m_GAy*2rCRMMy;W;gGl*Qx3MO$S z*|7Dj0&BFLRc!qNA0&9aAb7nXK8TNwsrjqDM{lXFDfvu49?LMnXV$d%CcY+W*W_#R zE$w|~D|K*mYvv@G&kQd0kFCeDtUrR`Gd0Lcjx1R8nXoP=KDe^aq;h+o8Eoe>gKd1K zNJ*!F`Plf(;J@^lA|c<_qnPPg`%JOO)@zAC@|j|*RryR2>)Ae2Mqs`zP*@~J_mz3T zJylV6O#gq)0~t(}SP~C^f?≫J0PjDDkIs{{(^24H6gj(w0H6t=|r|_-(OGJHHKl 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 BPn7@w literal 0 HcmV?d00001