diff --git a/HALOCELauncher.sln b/HALOCELauncher.sln new file mode 100644 index 0000000..fd923bd --- /dev/null +++ b/HALOCELauncher.sln @@ -0,0 +1,22 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Express 2013 for Windows Desktop +VisualStudioVersion = 12.0.30723.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "HALOCELauncher", "HALOCELauncher\HALOCELauncher.vbproj", "{5483309A-1BD8-41A4-8394-31A5366207C1}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {5483309A-1BD8-41A4-8394-31A5366207C1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5483309A-1BD8-41A4-8394-31A5366207C1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5483309A-1BD8-41A4-8394-31A5366207C1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5483309A-1BD8-41A4-8394-31A5366207C1}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/HALOCELauncher/App.config b/HALOCELauncher/App.config new file mode 100644 index 0000000..7399590 --- /dev/null +++ b/HALOCELauncher/App.config @@ -0,0 +1,54 @@ + + + + +
+ + + + + + + + + 1 + + + + + + False + + + False + + + False + + + False + + + False + + + False + + + False + + + False + + + 0 + + + + + + 0 + + + + \ No newline at end of file diff --git a/HALOCELauncher/Controls/AnimaTheme.vb b/HALOCELauncher/Controls/AnimaTheme.vb new file mode 100644 index 0000000..6c094c8 --- /dev/null +++ b/HALOCELauncher/Controls/AnimaTheme.vb @@ -0,0 +1,1398 @@ +Imports System.Threading + +Friend Module Helpers + + Private Size As SizeF + + Public Function MiddlePoint(G As Graphics, TargetText As String, TargetFont As Font, Rect As Rectangle) As Point + Size = G.MeasureString(TargetText, TargetFont) + Return New Point(Rect.Width / 2 - Size.Width / 2, Rect.Height / 2 - Size.Height / 2) + End Function + +End Module + +Public Class AnimaExperimentalListView + Inherits Control + + Public Property Columns As String() + + Public Property Items As ListViewItem() + + Public Property ColumnWidth As Integer = 120 + + Public Property SelectedIndex As Integer = -1 + + Public Property SelectedIndexes As New List(Of Integer) + + Public Property Multiselect As Boolean + + Public Property Highlight As Integer = -1 + + Public Property HandleItemsForeColor As Boolean + + Public Property Grid As Boolean + + Public Property ItemSize As Integer = 16 + + Public ReadOnly Property SelectedCount As Integer + Get + Return SelectedIndexes.Count + End Get + End Property + + Public ReadOnly Property FocusedItem As ListViewItem + Get + If IsNothing(SelectedIndexes) Then + Return New ListViewItem + End If + + Return Items(SelectedIndexes(0)) + End Get + End Property + + Public Sub Add(Item As ListViewItem) + Dim ItemsList As List(Of ListViewItem) = Items.ToList + ItemsList.Add(Item) + Items = ItemsList.ToArray + Invalidate() + End Sub + + Public Sub Clear() + Dim ItemsList As List(Of ListViewItem) = Items.ToList + ItemsList.Clear() + Items = ItemsList.ToArray + Invalidate() + End Sub + + Public Sub RemoveItem(ByVal Item As Integer) + Dim ItemsList As List(Of ListViewItem) = Items.ToList + ItemsList.Remove(ItemsList(Item)) + Items = ItemsList.ToArray + Invalidate() + End Sub + + Private BorderIndex As Integer = -1 + + Public Event SelectedIndexChanged(Sender As Object, Index As Integer) + + Sub New() + DoubleBuffered = True + ForeColor = Color.FromArgb(200, 200, 200) + Font = New Font("Segoe UI", 9) + SetStyle(ControlStyles.OptimizedDoubleBuffer Or ControlStyles.AllPaintingInWmPaint, True) + End Sub + + Private Function ReturnForeFromItem(I As Integer, Item As ListViewItem) As SolidBrush + If SelectedIndexes.Contains(I) Then + Return New SolidBrush(Color.FromArgb(10, 10, 10)) + End If + If HandleItemsForeColor Then + Return New SolidBrush(Item.ForeColor) + Else + Return New SolidBrush(ForeColor) + End If + End Function + + Private Function ReturnForeFromSubItem(I As Integer, Item As ListViewItem.ListViewSubItem) As SolidBrush + If SelectedIndexes.Contains(I) Then + Return New SolidBrush(Color.FromArgb(10, 10, 10)) + End If + If HandleItemsForeColor Then + Return New SolidBrush(Item.ForeColor) + Else + Return New SolidBrush(ForeColor) + End If + End Function + + Protected Overrides Sub OnPaint(e As PaintEventArgs) + On Error Resume Next + e.Graphics.Clear(Color.FromArgb(50, 50, 53)) + + Using Background As New SolidBrush(Color.FromArgb(55, 55, 58)) + e.Graphics.FillRectangle(Background, New Rectangle(1, 1, Width - 2, 26)) + End Using + + Using Border As New Pen(Color.FromArgb(42, 42, 45)), Shadow As New Pen(Color.FromArgb(65, 65, 68)) + e.Graphics.DrawRectangle(Border, New Rectangle(0, 0, Width - 1, Height - 1)) + e.Graphics.DrawRectangle(Border, New Rectangle(0, 0, Width - 1, 26)) + e.Graphics.DrawLine(Shadow, 1, 1, Width - 2, 1) + End Using + + If Not IsNothing(Columns) Then + + For I = 0 To Columns.Count - 1 + + If Not I = 0 Then + + Using Separator As New SolidBrush(Color.FromArgb(42, 42, 45)), Shadow As New SolidBrush(Color.FromArgb(65, 65, 68)) + e.Graphics.FillRectangle(Separator, New Rectangle(ColumnWidth * I, 1, 1, 26)) + e.Graphics.FillRectangle(Shadow, New Rectangle(ColumnWidth * I - 1, 1, 1, 25)) + + If Grid AndAlso Not IsNothing(Items) Then + e.Graphics.FillRectangle(Separator, New Rectangle(ColumnWidth * I, 1, 1, 26 + (Items.Count * ItemSize))) + e.Graphics.FillRectangle(Shadow, New Rectangle(ColumnWidth * I - 1, 1, 1, 25 + (Items.Count * ItemSize))) + End If + + End Using + + End If + + Using Fore As New SolidBrush(ForeColor) + e.Graphics.DrawString(Columns(I), Font, Fore, New Point((ColumnWidth * I) + 6, 4)) + End Using + + Next + + End If + + If Not IsNothing(Items) Then + + If Not Highlight = -1 Then + + Using Background As New SolidBrush(Color.FromArgb(66, 66, 69)), Line As New Pen(Color.FromArgb(45, 45, 48)) + e.Graphics.FillRectangle(Background, New Rectangle(1, 26 + Highlight * ItemSize, Width - 2, ItemSize)) + e.Graphics.DrawRectangle(Line, New Rectangle(1, 26 + Highlight * ItemSize, Width - 2, ItemSize)) + End Using + + End If + + Using Selection As New SolidBrush(Color.FromArgb(41, 130, 232)), Line As New Pen(Color.FromArgb(40, 40, 40)) + + If Multiselect AndAlso Not SelectedIndexes.Count = 0 Then + + For Each Selected As Integer In SelectedIndexes + e.Graphics.FillRectangle(Selection, New Rectangle(1, 26 + Selected * ItemSize, Width - 2, ItemSize)) + + If Selected = 0 AndAlso SelectedIndexes.Count = 1 Then + e.Graphics.DrawLine(Line, 1, 26 + ItemSize, Width - 2, 26 + ItemSize) + + ElseIf SelectedIndexes.Count = 1 Then + e.Graphics.DrawLine(Line, 1, 26 + ItemSize + Selected * ItemSize, Width - 2, 26 + ItemSize + Selected * ItemSize) + End If + + Next + + ElseIf Not SelectedIndexes.Count = 0 Then + e.Graphics.FillRectangle(Selection, New Rectangle(1, 26 + SelectedIndex * ItemSize, Width - 2, ItemSize)) + End If + + + End Using + + If SelectedIndexes.Count > 0 Then + BorderIndex = SelectedIndexes.Max + End If + + For I = 0 To Items.Count - 1 + + e.Graphics.DrawString(Items(I).Text, Font, ReturnForeFromItem(I, Items(I)), New Point(6, 26 + I * ItemSize + 2)) + + If Not IsNothing(Items(I).SubItems) Then + + For X = 0 To Items(I).SubItems.Count - 1 + + If Not Items(I).SubItems(X).Text = Items(I).Text Then + e.Graphics.DrawString(Items(I).SubItems(X).Text, Font, ReturnForeFromSubItem(I, Items(I).SubItems(X)), New Rectangle((ColumnWidth * X) + 6, 26 + I * ItemSize + 2, ColumnWidth - 8, 16)) + End If + Next + + End If + + Next + + If SelectedIndexes.Contains(BorderIndex) Then + + Using Line As New Pen(Color.FromArgb(40, 40, 40)) + e.Graphics.DrawLine(Line, 1, 26 + ItemSize + BorderIndex * ItemSize, Width - 2, 26 + ItemSize + BorderIndex * ItemSize) + End Using + + End If + + End If + + MyBase.OnPaint(e) + End Sub + + Protected Overrides Sub OnMouseUp(e As MouseEventArgs) + + Dim Selection As Integer = GetSelectedFromLocation(e.Location) + + If Selection = -1 OrElse Not e.Button = MouseButtons.Left Then + Return + End If + + If Multiselect AndAlso My.Computer.Keyboard.CtrlKeyDown Then + + If Not SelectedIndexes.Contains(Selection) Then + SelectedIndexes.Add(Selection) + Else + SelectedIndexes.Remove(Selection) + End If + + ElseIf Multiselect AndAlso Not My.Computer.Keyboard.CtrlKeyDown Then + SelectedIndexes = New List(Of Integer) From { + Selection + } + + Else + SelectedIndexes = New List(Of Integer) From { + Selection + } + SelectedIndex = Selection + End If + + If Selection = -1 Then + SelectedIndexes = New List(Of Integer) + End If + + Invalidate() + + RaiseEvent SelectedIndexChanged(Me, Selection) + MyBase.OnMouseUp(e) + End Sub + + Private Function GetSelectedFromLocation(P As Point) As Integer + + If Not IsNothing(Items) Then + + For I = 0 To Items.Count - 1 + If New Rectangle(1, 26 + I * ItemSize, Width - 2, ItemSize).Contains(P) Then + Return I + End If + Next + + End If + + Return -1 + + End Function + +End Class + +Public Class AnimaTextBox + Inherits Control + + Private G As Graphics + Private WithEvents T As TextBox + + Private AnimatingT As Thread + Private AnimatingT2 As Thread + + Private RGB() As Integer = {45, 45, 48} + Private RGB1 As Integer = 45 + Private Block As Boolean + + Public Property Dark As Boolean + + Public Property Numeric As Boolean + + Public Shadows Property Text As String + Get + Return T.Text + End Get + Set(value As String) + MyBase.Text = Value + T.Text = Value + Invalidate() + End Set + End Property + + Public Property MaxLength As Integer + Get + Return T.MaxLength + End Get + Set(value As Integer) + T.MaxLength = Value + Invalidate() + End Set + End Property + + Public Property UseSystemPasswordChar As Boolean + Get + Return T.UseSystemPasswordChar + End Get + Set(value As Boolean) + T.UseSystemPasswordChar = Value + Invalidate() + End Set + End Property + + Public Property MultiLine As Boolean + Get + Return T.Multiline + End Get + Set(value As Boolean) + T.Multiline = Value + Size = New Size(T.Width + 2, T.Height + 2) + Invalidate() + End Set + End Property + + Public Shadows Property [ReadOnly] As Boolean + Get + Return T.ReadOnly + End Get + Set(value As Boolean) + T.ReadOnly = Value + Invalidate() + End Set + End Property + + Sub New() + DoubleBuffered = True + + T = New TextBox With { + .BorderStyle = BorderStyle.None, + .ForeColor = Color.FromArgb(200, 200, 200), + .BackColor = Color.FromArgb(55, 55, 58), + .Location = New Point(6, 5), + .Multiline = False} + + Controls.Add(T) + End Sub + + Protected Overrides Sub CreateHandle() + If Dark Then + RGB = {42, 42, 45} + RGB1 = 45 + T.BackColor = Color.FromArgb(45, 45, 48) + Else + RGB = {70, 70, 70} + RGB1 = 70 + T.BackColor = Color.FromArgb(55, 55, 58) + End If + MyBase.CreateHandle() + End Sub + + Protected Overrides Sub OnEnter(e As EventArgs) + T.Select() + MyBase.OnEnter(e) + End Sub + + Protected Overrides Sub OnPaint(e As PaintEventArgs) + + G = e.Graphics + + If Enabled Then + + If Dark Then + G.Clear(Color.FromArgb(45, 45, 48)) + + Using Border As New Pen(Color.FromArgb(RGB(0), RGB(1), RGB(2))) + G.DrawRectangle(Border, New Rectangle(0, 0, Width - 1, Height - 1)) + End Using + + Else + G.Clear(Color.FromArgb(55, 55, 58)) + + Using Shadow As New Pen(Color.FromArgb(42, 42, 45)), Border As New Pen(Color.FromArgb(RGB(0), RGB(1), RGB(2))) + G.DrawRectangle(Border, New Rectangle(1, 1, Width - 3, Height - 3)) + G.DrawRectangle(Shadow, New Rectangle(0, 0, Width - 1, Height - 1)) + End Using + + End If + + Else + + G.Clear(Color.FromArgb(50, 50, 53)) + T.BackColor = Color.FromArgb(50, 50, 53) + + Using Border As New Pen(Color.FromArgb(42, 42, 45)), Shadow As New Pen(Color.FromArgb(66, 66, 69)) + e.Graphics.DrawRectangle(Border, New Rectangle(0, 0, Width - 1, Height - 1)) + e.Graphics.DrawRectangle(Shadow, New Rectangle(1, 1, Width - 3, Height - 3)) + End Using + + End If + + MyBase.OnPaint(e) + + End Sub + + Private Sub TEnter() Handles T.Enter + + If Not Block Then + AnimatingT = New Thread(AddressOf DoAnimation) With { + .IsBackground = True} + AnimatingT.Start() + End If + + End Sub + + Private Sub TKeyPress(sender As Object, e As KeyPressEventArgs) Handles T.KeyPress + + If Numeric Then + + If Asc(e.KeyChar) <> 8 Then + If Asc(e.KeyChar) < 48 Or Asc(e.KeyChar) > 57 Then + e.Handled = True + End If + End If + + End If + + End Sub + + Private Sub TLeave() Handles T.Leave + AnimatingT2 = New Thread(AddressOf UndoAnimation) With { + .IsBackground = True} + AnimatingT2.Start() + End Sub + + Protected Overrides Sub OnResize(e As EventArgs) + If MultiLine Then + T.Size = New Size(Width - 7, Height - 7) : Invalidate() + Else + T.Size = New Size(Width - 8, Height - 15) : Invalidate() + End If + MyBase.OnResize(e) + End Sub + + Private Sub TTextChanged() Handles T.TextChanged + OnTextChanged(EventArgs.Empty) + End Sub + + Private Sub DoAnimation() + + While RGB(2) < 204 AndAlso Not Block + + RGB(1) += 1 + RGB(2) += 2 + + Invalidate() + Thread.Sleep(5) + + End While + + End Sub + + Private Sub UndoAnimation() + + Block = True + + While RGB(2) > RGB1 + + RGB(1) -= 1 + RGB(2) -= 2 + + Invalidate() + Thread.Sleep(5) + + End While + + Block = False + + End Sub + +End Class + +Public Class AnimaProgressBar + Inherits ProgressBar + + Private G As Graphics + + Dim _backColor As Color = Color.FromArgb(35, 35, 38) + Public Overrides Property BackColor As Color + Get + Return _backColor + End Get + Set(ByVal value As Color) + _backColor = value + Invalidate() + End Set + End Property + + Dim _BorderColor As Color = Color.FromArgb(35, 35, 38) + Public Property BorderColors As Color + Get + Return _BorderColor + End Get + Set(ByVal value As Color) + _BorderColor = value + Invalidate() + End Set + End Property + + Sub New() + SetStyle(ControlStyles.UserPaint Or ControlStyles.OptimizedDoubleBuffer Or ControlStyles.AllPaintingInWmPaint, True) + End Sub + + Protected Overrides Sub OnPaint(e As PaintEventArgs) + + G = e.Graphics + + MyBase.OnPaint(e) + + G.Clear(Color.FromArgb(37, 37, 40)) + + Using Border As New Pen(_BorderColor) + G.DrawRectangle(Border, New Rectangle(0, 0, Width - 1, Height - 1)) + End Using + + Using Background As New SolidBrush(_backColor) + G.FillRectangle(Background, New Rectangle(0, 0, Value / Maximum * Width - 1, Height - 1)) + End Using + + End Sub + +End Class + +Public Class AnimaCheckBox + Inherits CheckBox + + Private G As Graphics + + Private AnimatingT As Thread + Private AnimatingT2 As Thread + + Private RGB() As Integer = {36, 36, 39} + + Private Block As Boolean + + Public Property Radio As Boolean + + Public Property Caution As Boolean + + Private Const CheckedIcon As String = "iVBORw0KGgoAAAANSUhEUgAAAAsAAAAKCAMAAABVLlSxAAAASFBMVEUlJSYuLi8oKCmlpaXx8fGioqJoaGjOzs8+Pj/k5OTu7u5LS0zIyMiBgYKFhYXo6OhUVFWVlZW7u7t+fn7h4eE5OTlfX1+YmJn8uq7eAAAAA3RSTlMAAAD6dsTeAAAACXBIWXMAAABIAAAASABGyWs+AAAAO0lEQVQI12NgwAKYWVhhTDYWdkYok4OTixvCYGDiYeEFM/n4BQRZhCDywiz8XCKiDDAOixjcPGFxDCsASakBdDYGvzAAAAAldEVYdGRhdGU6Y3JlYXRlADIwMTYtMTItMTRUMTI6MDM6MjktMDY6MDB4J65tAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE2LTEyLTE0VDEyOjAzOjI5LTA2OjAwCXoW0QAAAABJRU5ErkJggg==" + + Sub New() + DoubleBuffered = True + Font = New Font("Segoe UI", 9) + ForeColor = Color.FromArgb(200, 200, 200) + SetStyle(ControlStyles.UserPaint Or ControlStyles.OptimizedDoubleBuffer Or ControlStyles.AllPaintingInWmPaint, True) + End Sub + + Protected Overrides Sub OnPaint(e As PaintEventArgs) + + G = e.Graphics + G.InterpolationMode = Drawing2D.InterpolationMode.HighQualityBicubic + + G.Clear(BackColor) + + Using Background As New SolidBrush(Color.FromArgb(38, 38, 41)) + G.FillRectangle(Background, New Rectangle(0, 0, 16, 16)) + End Using + + Using Border As New Pen(Color.FromArgb(RGB(0), RGB(1), RGB(2))) + G.DrawRectangle(Border, New Rectangle(0, 0, 16, 16)) + End Using + + Using Fore As New SolidBrush(ForeColor) + G.DrawString(Text, Font, Fore, New Point(22, 0)) + End Using + + If Checked Then + + Using Mark As Image = Image.FromStream(New IO.MemoryStream(Convert.FromBase64String(CheckedIcon))) + G.DrawImage(Mark, New Point(2, 3)) + End Using + + End If + + End Sub + + Protected Overrides Sub OnMouseEnter(e As EventArgs) + + If Not Block Then + AnimatingT = New Thread(AddressOf DoAnimation) With { + .IsBackground = True} + AnimatingT.Start() + End If + + MyBase.OnMouseEnter(e) + End Sub + + Protected Overrides Sub OnMouseLeave(e As EventArgs) + AnimatingT2 = New Thread(AddressOf UndoAnimation) With { + .IsBackground = True} + AnimatingT2.Start() + + MyBase.OnMouseLeave(e) + End Sub + + Protected Overrides Sub OnMouseUp(e As MouseEventArgs) + If Radio Then + For Each C As AnimaCheckBox In Parent.Controls.OfType(Of AnimaCheckBox)() + If C.Radio Then + C.Checked = False + End If + Next + End If + + MyBase.OnMouseUp(e) + End Sub + + Private Sub DoAnimation() + + If Caution Then + + While RGB(2) < 130 AndAlso Not Block + + RGB(1) += 1 + RGB(2) += 1 + + Invalidate() + Thread.Sleep(4) + + End While + + Else + + While RGB(2) < 204 AndAlso Not Block + + RGB(1) += 1 + RGB(2) += 2 + + Invalidate() + Thread.Sleep(4) + + End While + + End If + + End Sub + + Private Sub UndoAnimation() + + Block = True + + If Caution Then + + While RGB(2) > 42 + + RGB(1) -= 1 + RGB(2) -= 1 + + Invalidate() + Thread.Sleep(4) + + End While + + Else + + While RGB(2) > 42 + + RGB(1) -= 1 + RGB(2) -= 2 + + Invalidate() + Thread.Sleep(4) + + End While + + End If + + Block = False + + End Sub + +End Class + +Public Class AnimaHeader + Inherits Control + + Private G As Graphics + + Sub New() + DoubleBuffered = True + Font = New Font("Segoe UI", 9) + Location = New Point(1, 1) + Size = New Size(Width - 2, 36) + ForeColor = Color.FromArgb(200, 200, 200) + End Sub + + Protected Overrides Sub OnPaint(e As PaintEventArgs) + + G = e.Graphics + + Using Background As New SolidBrush(Color.FromArgb(55, 55, 58)) + G.FillRectangle(Background, New Rectangle(0, 0, Width - 1, Height - 1)) + End Using + + Using Line As New Pen(Color.FromArgb(43, 43, 46)) + G.DrawLine(Line, 0, Height - 1, Width - 1, Height - 1) + End Using + + Using Fore As New SolidBrush(ForeColor) + G.DrawString(Text, Font, Fore, New Point(6, 6)) + End Using + + MyBase.OnPaint(e) + End Sub + +End Class + +Public Class AnimaForm + Inherits ContainerControl + + Private G As Graphics + + Sub New() + BackColor = Color.FromArgb(45, 45, 48) + DoubleBuffered = True + Font = New Font("Segoe UI", 9) + Dock = DockStyle.Fill + ForeColor = Color.FromArgb(200, 200, 200) + End Sub + + Protected Overrides Sub OnCreateControl() + ParentForm.FormBorderStyle = FormBorderStyle.None + MyBase.OnCreateControl() + End Sub + + Protected Overrides Sub OnPaint(e As PaintEventArgs) + + G = e.Graphics + + Using Background As New SolidBrush(Color.FromArgb(50, 50, 50)) + G.FillRectangle(Background, New Rectangle(0, 0, Width - 1, 36)) + End Using + + Using Line As New Pen(Color.FromArgb(43, 43, 46)) + G.DrawLine(Line, 0, 36, Width - 1, 36) + End Using + + Using Fore As New SolidBrush(ForeColor) + G.DrawString(Text, Font, Fore, New Point(10, 10)) + End Using + + Using Border As New Pen(Color.FromArgb(35, 35, 38)) + e.Graphics.DrawRectangle(Border, New Rectangle(0, 0, Width - 1, Height - 1)) + End Using + + MyBase.OnPaint(e) + End Sub + + Private Drag As Boolean + Private MousePoint, Temporary As New Point + + Protected Overrides Sub OnMouseDown(e As MouseEventArgs) + + If e.Button = MouseButtons.Left AndAlso e.Y < 36 Then + Drag = True + MousePoint.X = e.X + MousePoint.Y = e.Y + End If + + MyBase.OnMouseDown(e) + End Sub + + Protected Overrides Sub OnMouseUp(e As MouseEventArgs) + If e.Button = MouseButtons.Left Then + Drag = False + End If + + MyBase.OnMouseUp(e) + End Sub + + Protected Overrides Sub OnMouseMove(e As MouseEventArgs) + + If Drag Then + Temporary.X = Parent.Location.X + (e.X - MousePoint.X) + Temporary.Y = Parent.Location.Y + (e.Y - MousePoint.Y) + Parent.Location = Temporary + Temporary = Nothing + End If + + MyBase.OnMouseMove(e) + End Sub +End Class + +Public Class AnimaButton + Inherits Button + + Private G As Graphics + + Private HoverAnim, CHoverAnim, DownAnimationT As Thread + + Private RGB() As Integer = {42, 42, 45} + + Private Loc As New Point() + Private RSize As New Size() + + Private Block As Boolean + + Private Animate As Boolean + + Public Property ImageLocation As Point = New Point(Width / 2 - 7, 6) + + Public Property ImageSize As Size = New Size(14, 14) + + Sub New() + DoubleBuffered = True + Font = New Font("Segoe UI", 9) + ForeColor = Color.FromArgb(200, 200, 200) + SetStyle(ControlStyles.UserPaint Or ControlStyles.AllPaintingInWmPaint Or ControlStyles.OptimizedDoubleBuffer, True) + End Sub + + Protected Overrides Sub OnPaint(e As PaintEventArgs) + + G = e.Graphics + + G.Clear(BackColor) + + Using Background As New SolidBrush(Color.FromArgb(55, 55, 58)) + G.FillRectangle(Background, New Rectangle(0, 0, Width - 1, Height - 1)) + End Using + + If Animate Then + + Using Background As New SolidBrush(Color.FromArgb(66, 66, 69)) + G.FillEllipse(Background, New Rectangle(Loc.X, -30, RSize.Width, 80)) + End Using + + End If + + Using Border As New Pen(Color.FromArgb(RGB(0), RGB(1), RGB(2))) + G.DrawRectangle(Border, New Rectangle(0, 0, Width - 1, Height - 1)) + End Using + + If Not IsNothing(Image) Then + G.DrawImage(Image, New Rectangle(ImageLocation, ImageSize)) + Else + Using Fore As New SolidBrush(ForeColor) + G.DrawString(Text, Font, Fore, MiddlePoint(G, Text, Font, New Rectangle(0, 0, Width - 1, Height - 1))) + End Using + End If + + End Sub + + Protected Overrides Sub OnMouseEnter(e As EventArgs) + + If Not Block Then + HoverAnim = New Thread(AddressOf DoAnimation) With { + .IsBackground = True} + HoverAnim.Start() + End If + + MyBase.OnMouseEnter(e) + End Sub + + Protected Overrides Sub OnMouseLeave(e As EventArgs) + CHoverAnim = New Thread(AddressOf UndoAnimation) With { + .IsBackground = True} + CHoverAnim.Start() + + MyBase.OnMouseLeave(e) + End Sub + + Protected Overrides Sub OnMouseDown(e As MouseEventArgs) + + DownAnimationT = New Thread(Sub() DoBackAnimation(e.Location)) With { + .IsBackground = True} + DownAnimationT.Start() + + MyBase.OnMouseDown(e) + End Sub + + Private Sub DoBackAnimation(P As Point) + + Loc = P + RSize = New Size() + + Animate = True : Invalidate() + + While RSize.Width < Width * 3 + Loc.X -= 1 + RSize.Width += 2 + Thread.Sleep(4) + Invalidate() + End While + + Animate = False : Invalidate() + + End Sub + + Private Sub DoAnimation() + + + While RGB(2) < 204 AndAlso Not Block + + RGB(1) += 1 + RGB(2) += 2 + + Invalidate() + Thread.Sleep(5) + + End While + + End Sub + + Private Sub UndoAnimation() + + Block = True + + While RGB(2) > 45 + + RGB(1) -= 1 + RGB(2) -= 2 + + Invalidate() + Thread.Sleep(5) + + End While + + Block = False + + End Sub + +End Class + +Public Class Renderer + Inherits ToolStripRenderer + + Public Event PaintMenuBackground(sender As Object, e As ToolStripRenderEventArgs) + Public Event PaintMenuBorder(sender As Object, e As ToolStripRenderEventArgs) + Public Event PaintMenuImageMargin(sender As Object, e As ToolStripRenderEventArgs) + Public Event PaintItemCheck(sender As Object, e As ToolStripItemImageRenderEventArgs) + Public Event PaintItemImage(sender As Object, e As ToolStripItemImageRenderEventArgs) + Public Event PaintItemText(sender As Object, e As ToolStripItemTextRenderEventArgs) + Public Event PaintItemBackground(sender As Object, e As ToolStripItemRenderEventArgs) + Public Event PaintItemArrow(sender As Object, e As ToolStripArrowRenderEventArgs) + Public Event PaintSeparator(sender As Object, e As ToolStripSeparatorRenderEventArgs) + + Protected Overrides Sub OnRenderToolStripBackground(e As ToolStripRenderEventArgs) + RaiseEvent PaintMenuBackground(Me, e) + End Sub + + Protected Overrides Sub OnRenderImageMargin(e As ToolStripRenderEventArgs) + RaiseEvent PaintMenuImageMargin(Me, e) + End Sub + + Protected Overrides Sub OnRenderToolStripBorder(e As ToolStripRenderEventArgs) + RaiseEvent PaintMenuBorder(Me, e) + End Sub + + Protected Overrides Sub OnRenderItemCheck(e As ToolStripItemImageRenderEventArgs) + RaiseEvent PaintItemCheck(Me, e) + End Sub + + Protected Overrides Sub OnRenderItemImage(e As ToolStripItemImageRenderEventArgs) + RaiseEvent PaintItemImage(Me, e) + End Sub + + Protected Overrides Sub OnRenderItemText(e As ToolStripItemTextRenderEventArgs) + RaiseEvent PaintItemText(Me, e) + End Sub + + Protected Overrides Sub OnRenderMenuItemBackground(e As ToolStripItemRenderEventArgs) + RaiseEvent PaintItemBackground(Me, e) + End Sub + + Protected Overrides Sub OnRenderArrow(e As ToolStripArrowRenderEventArgs) + RaiseEvent PaintItemArrow(Me, e) + End Sub + + Protected Overrides Sub OnRenderSeparator(e As ToolStripSeparatorRenderEventArgs) + RaiseEvent PaintSeparator(Me, e) + End Sub + +End Class + +Public Class AnimaContextMenuStrip + Inherits ContextMenuStrip + + Private G As Graphics + Private Rect As Rectangle + + Sub New() + Font = New Font("Segoe UI", 9) + ForeColor = Color.FromArgb(200, 200, 200) + Dim Render As New Renderer() + AddHandler Render.PaintMenuBackground, AddressOf Renderer_PaintMenuBackground + AddHandler Render.PaintMenuBorder, AddressOf Renderer_PaintMenuBorder + AddHandler Render.PaintItemImage, AddressOf Renderer_PaintItemImage + AddHandler Render.PaintItemText, AddressOf Renderer_PaintItemText + AddHandler Render.PaintItemBackground, AddressOf Renderer_PaintItemBackground + AddHandler Render.PaintItemArrow, AddressOf Rendered_PaintItemArrow + + Renderer = Render + End Sub + + Private Sub Rendered_PaintItemArrow(sender As Object, e As ToolStripArrowRenderEventArgs) + G = e.Graphics + + Using F As New Font("Marlett", 10), Fore As New SolidBrush(Color.FromArgb(130, 130, 130)) + G.DrawString("4", F, Fore, New Point(e.ArrowRectangle.X, e.ArrowRectangle.Y + 2)) + End Using + + End Sub + + Private Sub Renderer_PaintMenuBackground(sender As Object, e As ToolStripRenderEventArgs) + G = e.Graphics + + G.Clear(Color.FromArgb(55, 55, 58)) + End Sub + + Private Sub Renderer_PaintMenuBorder(sender As Object, e As ToolStripRenderEventArgs) + + G = e.Graphics + + Using Border As New Pen(Color.FromArgb(35, 35, 38)) + G.DrawRectangle(Border, New Rectangle(e.AffectedBounds.X, e.AffectedBounds.Y, e.AffectedBounds.Width - 1, e.AffectedBounds.Height - 1)) + End Using + + End Sub + + Private Sub Renderer_PaintItemImage(sender As Object, e As ToolStripItemImageRenderEventArgs) + + G = e.Graphics + + G.DrawImage(e.Image, New Point(10, 1)) + + End Sub + + Private Sub Renderer_PaintItemText(sender As Object, e As ToolStripItemTextRenderEventArgs) + + G = e.Graphics + + Using Fore As New SolidBrush(e.TextColor) + G.DrawString(e.Text, Font, Fore, New Point(e.TextRectangle.X, e.TextRectangle.Y - 1)) + End Using + + End Sub + + Private Sub Renderer_PaintItemBackground(sender As Object, e As ToolStripItemRenderEventArgs) + + G = e.Graphics + + Rect = e.Item.ContentRectangle + + If e.Item.Selected Then + + Using Background As New SolidBrush(Color.FromArgb(85, 85, 85)) + G.FillRectangle(Background, New Rectangle(Rect.X - 4, Rect.Y - 1, Rect.Width + 4, Rect.Height - 1)) + End Using + + End If + + End Sub + +End Class + +Public Class AnimaStatusBar + Inherits Control + + Private G As Graphics + + Private Body As Color = Color.FromArgb(0, 122, 204) + Private Outline As Color = Color.FromArgb(0, 126, 204) + + Public Property Type As Types + + Public Enum Types As Byte + Basic = 0 + Warning = 1 + Wrong = 2 + Success = 3 + End Enum + + Sub New() + DoubleBuffered = True + End Sub + + Protected Overrides Sub OnPaint(e As PaintEventArgs) + + G = e.Graphics + + Select Case Type + + Case Types.Basic + + Body = Color.FromArgb(0, 122, 204) + Outline = Color.FromArgb(0, 126, 204) + + Case Types.Warning + + Body = Color.FromArgb(210, 143, 75) + Outline = Color.FromArgb(214, 147, 75) + + Case Types.Wrong + + Body = Color.FromArgb(212, 110, 110) + Outline = Color.FromArgb(216, 114, 114) + + Case Else + + Body = Color.FromArgb(45, 193, 90) + Outline = Color.FromArgb(45, 197, 90) + + End Select + + Using Background As New SolidBrush(Body), Line As New Pen(Outline) + G.FillRectangle(Background, New Rectangle(0, 0, Width - 1, Height - 1)) + G.DrawLine(Line, 0, 0, Width - 2, 0) + End Using + + Using Fore As New SolidBrush(Color.FromArgb(255, 255, 255)), Font As New Font("Segoe UI semibold", 8) + G.DrawString(Text, Font, Fore, New Point(4, 2)) + End Using + + MyBase.OnPaint(e) + End Sub + + Protected Overrides Sub OnTextChanged(e As EventArgs) + Invalidate() + MyBase.OnTextChanged(e) + End Sub + +End Class + +Public Class AnimaTabControl + Inherits TabControl + + Private G As Graphics + Private Rect As Rectangle + + Protected Overrides Sub OnControlAdded(e As ControlEventArgs) + e.Control.BackColor = Color.FromArgb(45, 45, 48) + e.Control.ForeColor = Color.FromArgb(200, 200, 200) + e.Control.Font = New Font("Segoe UI", 9) + MyBase.OnControlAdded(e) + End Sub + + Sub New() + DoubleBuffered = True + Font = New Font("Segoe UI", 9) + ForeColor = Color.FromArgb(200, 200, 200) + ItemSize = New Size(18, 18) + SizeMode = TabSizeMode.Fixed + Alignment = TabAlignment.Top + SetStyle(ControlStyles.UserPaint Or ControlStyles.AllPaintingInWmPaint Or ControlStyles.Opaque Or ControlStyles.OptimizedDoubleBuffer, True) + End Sub + + Protected Overrides Sub OnPaint(e As PaintEventArgs) + + G = e.Graphics + + G.Clear(Parent.BackColor) + + For I = 0 To TabPages.Count - 1 + + Rect = GetTabRect(I) + + If SelectedIndex = I Then + + Using Background As New SolidBrush(Color.FromArgb(41, 130, 232)), Border As New Pen(Color.FromArgb(38, 127, 229)) + G.FillRectangle(Background, New Rectangle(Rect.X + 5, Rect.Y + 2, 12, 12)) + G.DrawRectangle(Border, New Rectangle(Rect.X + 5, Rect.Y + 2, 12, 12)) + End Using + + Else + + Using Background As New SolidBrush(Color.FromArgb(70, 70, 73)), Border As New Pen(Color.FromArgb(42, 42, 45)) + G.FillRectangle(Background, New Rectangle(Rect.X + 5, Rect.Y + 2, 12, 12)) + G.DrawRectangle(Border, New Rectangle(Rect.X + 5, Rect.Y + 2, 12, 12)) + End Using + + End If + + Next + + MyBase.OnPaint(e) + End Sub + +End Class + +Public Class AnimaGroupBox + Inherits Control + + Sub New() + DoubleBuffered = True + ForeColor = Color.FromArgb(200, 200, 200) + BackColor = Color.FromArgb(50, 50, 53) + End Sub + + Protected Overrides Sub OnPaint(e As PaintEventArgs) + + e.Graphics.Clear(BackColor) + + Using Border As New Pen(Color.FromArgb(42, 42, 45)), HBackground As New SolidBrush(Color.FromArgb(60, 60, 63)), Shadow As New Pen(Color.FromArgb(66, 66, 69)) + e.Graphics.FillRectangle(HBackground, New Rectangle(1, 0, Width - 2, 26)) + e.Graphics.DrawRectangle(Border, New Rectangle(0, 0, Width - 1, 26)) + e.Graphics.DrawLine(Shadow, 1, 25, Width - 2, 25) + e.Graphics.DrawRectangle(Border, New Rectangle(0, 0, Width - 1, Height - 1)) + End Using + + Using Fore As New SolidBrush(ForeColor) + e.Graphics.DrawString(Text, Font, Fore, New Point(4, 4)) + End Using + + MyBase.OnPaint(e) + + End Sub + +End Class + +Public Class AnimaExperimentalControlBox + Inherits Control + + Public Property TextHeight As Integer = 4 + + Public Property ComboHeight As Integer = 24 + + Public Property Items As String() + + Public Property SelectedIndex As Integer = 0 + + Public Property ItemSize As Integer = 24 + + Public Property SelectedItem As String + + Public Property AnimaGroupBoxContainer As AnimaGroupBox + + Public Property CurrentLocation As Point + + Public Event SelectedIndexChanged() + + Private Open As Boolean + Private ItemsHeight As Integer = 0 + Private Hover As Integer = -1 + + Sub New() + DoubleBuffered = True + Font = New Font("Segoe UI", 9) + ForeColor = Color.FromArgb(200, 200, 200) + End Sub + + Protected Overrides Sub OnPaint(e As PaintEventArgs) + + e.Graphics.Clear(Parent.BackColor) + + If Enabled Then + + If Not IsNothing(Items) Then + ItemsHeight = Items.Count * ItemSize + End If + + If Not DesignMode Then + If Open Then + Height = ItemsHeight + ComboHeight + 5 + Else + Height = ComboHeight + 1 + End If + End If + + Using Background As New SolidBrush(Color.FromArgb(55, 55, 58)), Border As New Pen(Color.FromArgb(42, 42, 45)), Shadow As New Pen(Color.FromArgb(66, 66, 69)) + e.Graphics.FillRectangle(Background, New Rectangle(0, 0, Width - 1, ComboHeight - 1)) + e.Graphics.DrawRectangle(Border, New Rectangle(0, 0, Width - 1, ComboHeight - 1)) + e.Graphics.DrawRectangle(Shadow, New Rectangle(1, 1, Width - 3, ComboHeight - 3)) + End Using + + If IsNothing(Items) Then + SelectedIndex = -1 + + ElseIf Not SelectedIndex = -1 Then + + Using Fore As New SolidBrush(ForeColor) + e.Graphics.DrawString(Items(SelectedIndex), Font, Fore, New Point(4, 4)) + End Using + + End If + + If Open Then + + Using Background As New SolidBrush(Color.FromArgb(60, 60, 63)), Border As New Pen(Color.FromArgb(41, 130, 232)) + e.Graphics.FillRectangle(Background, New Rectangle(1, ComboHeight, Width - 3, ItemsHeight)) + e.Graphics.DrawRectangle(Border, New Rectangle(1, ComboHeight, Width - 3, ItemsHeight)) + End Using + + If Not Hover = -1 Then + + Using Background As New SolidBrush(Color.FromArgb(41, 130, 232)), Border As New Pen(Color.FromArgb(40, 40, 40)) + e.Graphics.FillRectangle(Background, New Rectangle(1, ComboHeight + Hover * ItemSize, Width - 2, ItemSize)) + e.Graphics.DrawLine(Border, 1, ComboHeight + Hover * ItemSize + ItemSize, Width - 2, ComboHeight + Hover * ItemSize + ItemSize) + End Using + + End If + + For I = 0 To Items.Count - 1 + + If Hover = I Then + + Using Fore As New SolidBrush(Color.FromArgb(15, 15, 15)) + e.Graphics.DrawString(Items(I), Font, Fore, New Point(4, ComboHeight + TextHeight + I * ItemSize)) + End Using + + Else + + Using Fore As New SolidBrush(ForeColor) + e.Graphics.DrawString(Items(I), Font, Fore, New Point(4, ComboHeight + TextHeight + I * ItemSize)) + End Using + + End If + + Next + + End If + + Else + Using Background As New SolidBrush(Color.FromArgb(50, 50, 53)), Border As New Pen(Color.FromArgb(42, 42, 45)), Shadow As New Pen(Color.FromArgb(66, 66, 69)) + e.Graphics.FillRectangle(Background, New Rectangle(0, 0, Width - 1, ComboHeight - 1)) + e.Graphics.DrawRectangle(Border, New Rectangle(0, 0, Width - 1, ComboHeight - 1)) + e.Graphics.DrawRectangle(Shadow, New Rectangle(1, 1, Width - 3, ComboHeight - 3)) + End Using + + If Not IsNothing(Items) AndAlso Not SelectedIndex = -1 Then + + Using Fore As New SolidBrush(Color.FromArgb(140, 140, 140)) + e.Graphics.DrawString(Items(SelectedIndex), Font, Fore, New Point(4, 4)) + End Using + + End If + + End If + + MyBase.OnPaint(e) + End Sub + + Protected Overrides Sub OnLostFocus(e As EventArgs) + Open = False : Invalidate() + MyBase.OnLostFocus(e) + End Sub + + Protected Overrides Sub OnMouseDown(e As MouseEventArgs) + + ' If Not Open Then Main.BTab1.SendToBack() : Else : BringToFront() + + If Open AndAlso Not ItemsHeight = 0 Then + + For I = 0 To Items.Count - 1 + + If New Rectangle(0, ComboHeight + I * ItemSize, Width - 1, ItemSize).Contains(e.Location) Then + SelectedIndex = I : Invalidate() + SelectedItem = Items(SelectedIndex) + Exit For + End If + + Next + + End If + + If Not New Rectangle(0, 0, Width - 1, ComboHeight + 4).Contains(e.Location) Then + If Open AndAlso Not SelectedIndex = -1 Then RaiseEvent SelectedIndexChanged() + End If + + Open = Not Open : Invalidate() + Me.Select() + MyBase.OnMouseDown(e) + End Sub + + Protected Overrides Sub OnMouseMove(e As MouseEventArgs) + + If Open AndAlso Not ItemsHeight = 0 Then + + For I = 0 To Items.Count - 1 + + If New Rectangle(0, ComboHeight + I * ItemSize, Width - 1, ItemSize).Contains(e.Location) Then + Hover = I : Invalidate() + Exit For + End If + + Next + + End If + + MyBase.OnMouseMove(e) + End Sub + +End Class \ No newline at end of file diff --git a/HALOCELauncher/Controls/BoosterTheme.vb b/HALOCELauncher/Controls/BoosterTheme.vb new file mode 100644 index 0000000..191e87d --- /dev/null +++ b/HALOCELauncher/Controls/BoosterTheme.vb @@ -0,0 +1,1145 @@ +' // Booster Theme GDI+ +' // 9 Controls +' // Made by AeroRev9 / Naywyn +' // 02/22. + +Option Strict On + +Imports System.Threading +Imports System.Drawing.Text +Imports System.Drawing.Drawing2D +Imports System.ComponentModel + +Friend Module Helpers1 + + Public G As Graphics + Private TargetStringMeasure As SizeF + + Enum MouseState1 As Byte + None = 0 + Over = 1 + Down = 2 + End Enum + + Enum RoundingStyle As Byte + All = 0 + Top = 1 + Bottom = 2 + Left = 3 + Right = 4 + TopRight = 5 + BottomRight = 6 + End Enum + + Public Function ColorFromHex(Hex As String) As Color + Return Color.FromArgb(CInt(Long.Parse(String.Format("FFFFFFFFFF{0}", Hex.Substring(1)), Globalization.NumberStyles.HexNumber))) + End Function + + Public Function MiddlePoint1(TargetText As String, TargetFont As Font, Rect As Rectangle) As Point + TargetStringMeasure = G.MeasureString(TargetText, TargetFont) + Return New Point(CInt(Rect.Width / 2 - TargetStringMeasure.Width / 2), CInt(Rect.Height / 2 - TargetStringMeasure.Height / 2)) + End Function + + Public Function RoundRect1(Rect As Rectangle, Rounding As Integer, Optional Style As RoundingStyle = RoundingStyle.All) As GraphicsPath + + Dim GP As New GraphicsPath() + Dim AW As Integer = Rounding * 2 + + GP.StartFigure() + + If Rounding = 0 Then + GP.AddRectangle(Rect) + GP.CloseAllFigures() + Return GP + End If + + Select Case Style + Case RoundingStyle.All + GP.AddArc(New Rectangle(Rect.X, Rect.Y, AW, AW), -180, 90) + GP.AddArc(New Rectangle(Rect.Width - AW + Rect.X, Rect.Y, AW, AW), -90, 90) + GP.AddArc(New Rectangle(Rect.Width - AW + Rect.X, Rect.Height - AW + Rect.Y, AW, AW), 0, 90) + GP.AddArc(New Rectangle(Rect.X, Rect.Height - AW + Rect.Y, AW, AW), 90, 90) + Case RoundingStyle.Top + GP.AddArc(New Rectangle(Rect.X, Rect.Y, AW, AW), -180, 90) + GP.AddArc(New Rectangle(Rect.Width - AW + Rect.X, Rect.Y, AW, AW), -90, 90) + GP.AddLine(New Point(Rect.X + Rect.Width, Rect.Y + Rect.Height), New Point(Rect.X, Rect.Y + Rect.Height)) + Case RoundingStyle.Bottom + GP.AddLine(New Point(Rect.X, Rect.Y), New Point(Rect.X + Rect.Width, Rect.Y)) + GP.AddArc(New Rectangle(Rect.Width - AW + Rect.X, Rect.Height - AW + Rect.Y, AW, AW), 0, 90) + GP.AddArc(New Rectangle(Rect.X, Rect.Height - AW + Rect.Y, AW, AW), 90, 90) + Case RoundingStyle.Left + GP.AddArc(New Rectangle(Rect.X, Rect.Y, AW, AW), -180, 90) + GP.AddLine(New Point(Rect.X + Rect.Width, Rect.Y), New Point(Rect.X + Rect.Width, Rect.Y + Rect.Height)) + GP.AddArc(New Rectangle(Rect.X, Rect.Height - AW + Rect.Y, AW, AW), 90, 90) + Case RoundingStyle.Right + GP.AddLine(New Point(Rect.X, Rect.Y + Rect.Height), New Point(Rect.X, Rect.Y)) + GP.AddArc(New Rectangle(Rect.Width - AW + Rect.X, Rect.Y, AW, AW), -90, 90) + GP.AddArc(New Rectangle(Rect.Width - AW + Rect.X, Rect.Height - AW + Rect.Y, AW, AW), 0, 90) + Case RoundingStyle.TopRight + GP.AddLine(New Point(Rect.X, Rect.Y + 1), New Point(Rect.X, Rect.Y)) + GP.AddArc(New Rectangle(Rect.Width - AW + Rect.X, Rect.Y, AW, AW), -90, 90) + GP.AddLine(New Point(Rect.X + Rect.Width, Rect.Y + Rect.Height - 1), New Point(Rect.X + Rect.Width, Rect.Y + Rect.Height)) + GP.AddLine(New Point(Rect.X + 1, Rect.Y + Rect.Height), New Point(Rect.X, Rect.Y + Rect.Height)) + Case RoundingStyle.BottomRight + GP.AddLine(New Point(Rect.X, Rect.Y + 1), New Point(Rect.X, Rect.Y)) + GP.AddLine(New Point(Rect.X + Rect.Width - 1, Rect.Y), New Point(Rect.X + Rect.Width, Rect.Y)) + GP.AddArc(New Rectangle(Rect.Width - AW + Rect.X, Rect.Height - AW + Rect.Y, AW, AW), 0, 90) + GP.AddLine(New Point(Rect.X + 1, Rect.Y + Rect.Height), New Point(Rect.X, Rect.Y + Rect.Height)) + End Select + + GP.CloseAllFigures() + + Return GP + + End Function + +End Module + +Public Class BoosterButton + Inherits Button + + Private State As MouseState1 + Private Gradient As LinearGradientBrush + + Sub New() + DoubleBuffered = True + Font = New Font("Segoe UI", 9) + ForeColor = HelpersXylos.ColorFromHex("#B6B6B6") + SetStyle(ControlStyles.UserPaint Or ControlStyles.AllPaintingInWmPaint Or ControlStyles.Opaque Or ControlStyles.OptimizedDoubleBuffer, True) + End Sub + + Protected Overrides Sub OnPaint(e As PaintEventArgs) + + ThemeModule.G = e.Graphics + ThemeModule.G.SmoothingMode = SmoothingMode.HighQuality + ThemeModule.G.TextRenderingHint = TextRenderingHint.ClearTypeGridFit + + MyBase.OnPaint(e) + + ThemeModule.G.Clear(Parent.BackColor) + + If Enabled Then + + Select Case State + Case MouseState1.None + Gradient = New LinearGradientBrush(New Rectangle(0, 0, Width - 1, Height - 1), HelpersXylos.ColorFromHex("#606060"), HelpersXylos.ColorFromHex("#4E4E4E"), LinearGradientMode.Vertical) + + Case MouseState1.Over + Gradient = New LinearGradientBrush(New Rectangle(0, 0, Width - 1, Height - 1), HelpersXylos.ColorFromHex("#6A6A6A"), HelpersXylos.ColorFromHex("#585858"), LinearGradientMode.Vertical) + + Case MouseState1.Down + Gradient = New LinearGradientBrush(New Rectangle(0, 0, Width - 1, Height - 1), HelpersXylos.ColorFromHex("#565656"), HelpersXylos.ColorFromHex("#444444"), LinearGradientMode.Vertical) + + End Select + + ThemeModule.G.FillPath(Gradient, HelpersXylos.RoundRect1(New Rectangle(0, 0, Width - 1, Height - 1), 3)) + + Using Border As New Pen(HelpersXylos.ColorFromHex("#323232")) + ThemeModule.G.DrawPath(Border, HelpersXylos.RoundRect1(New Rectangle(0, 0, Width - 1, Height - 1), 3)) + End Using + + '// Top Line + Select Case State + + Case MouseState1.None + + Using TopLine As New Pen(HelpersXylos.ColorFromHex("#737373")) + ThemeModule.G.DrawLine(TopLine, 4, 1, Width - 4, 1) + End Using + + Case MouseState1.Over + + Using TopLine As New Pen(HelpersXylos.ColorFromHex("#7D7D7D")) + ThemeModule.G.DrawLine(TopLine, 4, 1, Width - 4, 1) + End Using + + Case MouseState1.Down + + Using TopLine As New Pen(HelpersXylos.ColorFromHex("#696969")) + ThemeModule.G.DrawLine(TopLine, 4, 1, Width - 4, 1) + End Using + + End Select + + Using TextBrush As New SolidBrush(HelpersXylos.ColorFromHex("#F5F5F5")), TextFont As New Font("Segoe UI", 9) + ThemeModule.G.DrawString(Text, TextFont, TextBrush, MiddlePoint1(Text, TextFont, New Rectangle(0, 0, Width + 2, Height))) + End Using + + Else + + Gradient = New LinearGradientBrush(New Rectangle(0, 0, Width - 1, Height - 1), HelpersXylos.ColorFromHex("#4C4C4C"), HelpersXylos.ColorFromHex("#3A3A3A"), LinearGradientMode.Vertical) + + ThemeModule.G.FillPath(Gradient, HelpersXylos.RoundRect1(New Rectangle(0, 0, Width - 1, Height - 1), 3)) + + Using Border As New Pen(HelpersXylos.ColorFromHex("#323232")) + ThemeModule.G.DrawPath(Border, HelpersXylos.RoundRect1(New Rectangle(0, 0, Width - 1, Height - 1), 3)) + End Using + + Using TopLine As New Pen(HelpersXylos.ColorFromHex("#5F5F5F")) + ThemeModule.G.DrawLine(TopLine, 4, 1, Width - 4, 1) + End Using + + Using TextBrush As New SolidBrush(HelpersXylos.ColorFromHex("#818181")), TextFont As New Font("Segoe UI", 9) + ThemeModule.G.DrawString(Text, TextFont, TextBrush, MiddlePoint1(Text, TextFont, New Rectangle(0, 0, Width + 2, Height))) + End Using + + End If + + End Sub + + Protected Overrides Sub OnMouseEnter(e As EventArgs) + State = MouseState1.Over : Invalidate() + MyBase.OnMouseEnter(e) + End Sub + + Protected Overrides Sub OnMouseLeave(e As EventArgs) + State = MouseState1.None : Invalidate() + MyBase.OnMouseLeave(e) + End Sub + + Protected Overrides Sub OnMouseDown(e As MouseEventArgs) + State = MouseState1.Down : Invalidate() + MyBase.OnMouseDown(e) + End Sub + + Protected Overrides Sub OnMouseUp(e As MouseEventArgs) + State = MouseState1.Over : Invalidate() + MyBase.OnMouseUp(e) + End Sub + +End Class + +Public Class BoosterHeader + Inherits Control + + Private TextMeasure As SizeF + + Sub New() + ' Me.SetStyle(ControlStyles.DoubleBuffer And ControlStyles.UserPaint And ControlStyles.AllPaintingInWmPaint, True) + + Me.SetStyle(ControlStyles.SupportsTransparentBackColor, True) + Me.SetStyle(ControlStyles.Opaque, True) + Me.UpdateStyles() + Me.BackColor = Color.Transparent + DoubleBuffered = True + Font = New Font("Segoe UI", 10) + ForeColor = HelpersXylos.ColorFromHex("#FFFFFF") + End Sub + + Protected Overrides Sub OnPaint(e As PaintEventArgs) + + ThemeModule.G = e.Graphics + ThemeModule.G.SmoothingMode = SmoothingMode.HighQuality + ThemeModule.G.TextRenderingHint = TextRenderingHint.ClearTypeGridFit + + ThemeModule.G.Clear(Parent.BackColor) + Parent.BackColor = Color.Transparent + Using Line As New Pen(HelpersXylos.ColorFromHex("#423AAA")) + ThemeModule.G.DrawLine(Line, 0, 6, Width - 1, 6) + End Using + + Using TextBrush As New SolidBrush(HelpersXylos.ColorFromHex("#FFFFFF")), TextFont As New Font("Segoe UI", 10), ParentFill As New SolidBrush(Parent.BackColor) + TextMeasure = ThemeModule.G.MeasureString(Text, TextFont) + ThemeModule.G.FillRectangle(ParentFill, New Rectangle(14, -4, CInt(TextMeasure.Width + 8), CInt(TextMeasure.Height + 4))) + ThemeModule.G.DrawString(Text, TextFont, TextBrush, New Point(20, -4)) + End Using + + MyBase.OnPaint(e) + End Sub + + Protected Overrides Sub OnResize(e As EventArgs) + Size = New Size(Width, 14) + MyBase.OnResize(e) + End Sub + +End Class + +Public Class BoosterToolTip + Inherits ToolTip + + Public Sub New() + OwnerDraw = True + BackColor = HelpersXylos.ColorFromHex("#242424") + AddHandler Draw, AddressOf OnDraw + End Sub + + Private Sub OnDraw(sender As Object, e As DrawToolTipEventArgs) + + ThemeModule.G = e.Graphics + ThemeModule.G.SmoothingMode = SmoothingMode.HighQuality + ThemeModule.G.TextRenderingHint = TextRenderingHint.ClearTypeGridFit + + ThemeModule.G.Clear(HelpersXylos.ColorFromHex("#242424")) + + Using Border As New Pen(HelpersXylos.ColorFromHex("#343434")) + ThemeModule.G.DrawRectangle(Border, New Rectangle(e.Bounds.X, e.Bounds.Y, e.Bounds.Width - 1, e.Bounds.Height - 1)) + End Using + + If ToolTipIcon = ToolTipIcon.None Then + + Using TextFont As New Font("Segoe UI", 9), TextBrush As New SolidBrush(HelpersXylos.ColorFromHex("#B6B6B6")) + ThemeModule.G.DrawString(e.ToolTipText, TextFont, TextBrush, New PointF(e.Bounds.X + 4, e.Bounds.Y + 1)) + End Using + + Else + + Select Case ToolTipIcon + + Case ToolTipIcon.Info + + Using TextFont As New Font("Segoe UI", 9, FontStyle.Bold), TextBrush As New SolidBrush(HelpersXylos.ColorFromHex("#7FD88B")) + ThemeModule.G.DrawString("Information", TextFont, TextBrush, New PointF(e.Bounds.X + 4, e.Bounds.Y + 2)) + End Using + + Case ToolTipIcon.Warning + + Using TextFont As New Font("Segoe UI", 9, FontStyle.Bold), TextBrush As New SolidBrush(HelpersXylos.ColorFromHex("#D8C67F")) + ThemeModule.G.DrawString("Warning", TextFont, TextBrush, New PointF(e.Bounds.X + 4, e.Bounds.Y + 2)) + End Using + + Case ToolTipIcon.Error + + Using TextFont As New Font("Segoe UI", 9, FontStyle.Bold), TextBrush As New SolidBrush(HelpersXylos.ColorFromHex("#D87F7F")) + ThemeModule.G.DrawString("Error", TextFont, TextBrush, New PointF(e.Bounds.X + 4, e.Bounds.Y + 2)) + End Using + + End Select + + Using TextFont As New Font("Segoe UI", 9), TextBrush As New SolidBrush(HelpersXylos.ColorFromHex("#B6B6B6")) + ThemeModule.G.DrawString(e.ToolTipText, TextFont, TextBrush, New PointF(e.Bounds.X + 4, e.Bounds.Y + 15)) + End Using + + End If + + End Sub + +End Class + + +Public Class BoosterTextBox + Inherits Control + + Private WithEvents T As TextBox + Private State As MouseState1 + + Public Shadows Property Text As String + Get + Return T.Text + End Get + Set(value As String) + MyBase.Text = value + T.Text = value + Invalidate() + End Set + End Property + + Public Shadows Property Enabled As Boolean + Get + Return T.Enabled + End Get + Set(value As Boolean) + T.Enabled = value + Invalidate() + End Set + End Property + + Public Property UseSystemPasswordChar As Boolean + Get + Return T.UseSystemPasswordChar + End Get + Set(value As Boolean) + T.UseSystemPasswordChar = value + Invalidate() + End Set + End Property + + Public Property MultiLine() As Boolean + Get + Return T.Multiline + End Get + Set(ByVal value As Boolean) + T.Multiline = value + Size = New Size(T.Width + 2, T.Height + 2) + Invalidate() + End Set + End Property + + Public Shadows Property [ReadOnly]() As Boolean + Get + Return T.ReadOnly + End Get + Set(ByVal value As Boolean) + T.ReadOnly = value + Invalidate() + End Set + End Property + + Sub New() + DoubleBuffered = True + + T = New TextBox With { + .BorderStyle = BorderStyle.None, + .BackColor = HelpersXylos.ColorFromHex("#242424"), + .ForeColor = HelpersXylos.ColorFromHex("#B6B6B6"), + .Location = New Point(1, 1), + .Multiline = True} + + Controls.Add(T) + End Sub + + Protected Overrides Sub OnPaint(e As PaintEventArgs) + + ThemeModule.G = e.Graphics + ThemeModule.G.SmoothingMode = SmoothingMode.HighQuality + ThemeModule.G.TextRenderingHint = TextRenderingHint.ClearTypeGridFit + + If Enabled Then + + T.BackColor = HelpersXylos.ColorFromHex("#242424") + + Select Case State + + Case MouseState1.Down + + Using Border As New Pen(HelpersXylos.ColorFromHex("#C8C8C8")) + ThemeModule.G.DrawRectangle(Border, New Rectangle(0, 0, Width - 1, Height - 1)) + End Using + + Case Else + + Using Border As New Pen(HelpersXylos.ColorFromHex("#5C5C5C")) + ThemeModule.G.DrawRectangle(Border, New Rectangle(0, 0, Width - 1, Height - 1)) + End Using + + End Select + + Else + + T.BackColor = HelpersXylos.ColorFromHex("#282828") + + Using Border As New Pen(HelpersXylos.ColorFromHex("#484848")) + ThemeModule.G.DrawRectangle(Border, New Rectangle(0, 0, Width - 1, Height - 1)) + End Using + + End If + + MyBase.OnPaint(e) + + End Sub + + Protected Overrides Sub OnEnter(e As EventArgs) + State = MouseState1.Down : Invalidate() + MyBase.OnEnter(e) + End Sub + + Protected Overrides Sub OnLeave(e As EventArgs) + State = MouseState1.None : Invalidate() + MyBase.OnLeave(e) + End Sub + + Protected Overrides Sub OnResize(e As EventArgs) + If MultiLine Then + T.Size = New Size(Width - 2, Height - 2) : Invalidate() + Else + T.Size = New Size(Width - 2, T.Height) + Size = New Size(Width, T.Height + 2) + End If + MyBase.OnResize(e) + End Sub + + Private Sub TTextChanged() Handles T.TextChanged + MyBase.OnTextChanged(EventArgs.Empty) + End Sub + +End Class + +Public Class BoosterComboBox + Inherits ComboBox + + Private State As MouseState1 + Private Rect As Rectangle + + Private ItemString As String = String.Empty + Private FirstItem As String = String.Empty + + Sub New() + ItemHeight = 20 + DoubleBuffered = True + BackColor = Color.FromArgb(36, 36, 36) + DropDownStyle = ComboBoxStyle.DropDownList + DrawMode = DrawMode.OwnerDrawFixed + SetStyle(ControlStyles.UserPaint Or ControlStyles.AllPaintingInWmPaint Or ControlStyles.Opaque Or ControlStyles.OptimizedDoubleBuffer, True) + End Sub + + Protected Overrides Sub OnPaint(e As PaintEventArgs) + + ThemeModule.G = e.Graphics + ThemeModule.G.SmoothingMode = SmoothingMode.HighQuality + ThemeModule.G.TextRenderingHint = TextRenderingHint.ClearTypeGridFit + + MyBase.OnPaint(e) + + ThemeModule.G.Clear(Parent.BackColor) + + If Enabled Then + + Using Fill As New SolidBrush(HelpersXylos.ColorFromHex("#242424")) + ThemeModule.G.FillRectangle(Fill, New Rectangle(0, 0, Width - 1, Height - 1)) + End Using + + Select Case State + + Case MouseState1.None + + Using Border As New Pen(HelpersXylos.ColorFromHex("#5C5C5C")) + ThemeModule.G.DrawRectangle(Border, New Rectangle(0, 0, Width - 1, Height - 1)) + End Using + + Case MouseState1.Over + + Using Border As New Pen(HelpersXylos.ColorFromHex("#C8C8C8")) + ThemeModule.G.DrawRectangle(Border, New Rectangle(0, 0, Width - 1, Height - 1)) + End Using + + End Select + + Using ArrowFont As New Font("Marlett", 12), ArrowBrush As New SolidBrush(HelpersXylos.ColorFromHex("#909090")) + ThemeModule.G.DrawString("6", ArrowFont, ArrowBrush, New Point(Width - 20, 5)) + End Using + + If Not IsNothing(Items) Then + + Try : FirstItem = GetItemText(Items(0)) : Catch : End Try + + If Not SelectedIndex = -1 Then + + Using TextBrush As New SolidBrush(HelpersXylos.ColorFromHex("#B6B6B6")), TextFont As New Font("Segoe UI", 9) + ThemeModule.G.DrawString(ItemString, TextFont, TextBrush, New Point(4, 4)) + End Using + + Else + + Using TextBrush As New SolidBrush(HelpersXylos.ColorFromHex("#B6B6B6")), TextFont As New Font("Segoe UI", 9) + ThemeModule.G.DrawString(FirstItem, TextFont, TextBrush, New Point(4, 4)) + End Using + + End If + + + End If + + Else + + Using Fill As New SolidBrush(HelpersXylos.ColorFromHex("#282828")), Border As New Pen(HelpersXylos.ColorFromHex("#484848")) + ThemeModule.G.FillRectangle(Fill, New Rectangle(0, 0, Width - 1, Height - 1)) + ThemeModule.G.DrawRectangle(Border, New Rectangle(0, 0, Width - 1, Height - 1)) + End Using + + Using ArrowFont As New Font("Marlett", 12), ArrowBrush As New SolidBrush(HelpersXylos.ColorFromHex("#707070")) + ThemeModule.G.DrawString("6", ArrowFont, ArrowBrush, New Point(Width - 20, 5)) + End Using + + If Not IsNothing(Items) Then + + Try : FirstItem = GetItemText(Items(0)) : Catch : End Try + + Using TextBrush As New SolidBrush(HelpersXylos.ColorFromHex("#818181")), TextFont As New Font("Segoe UI", 9) + ThemeModule.G.DrawString(FirstItem, TextFont, TextBrush, New Point(4, 4)) + End Using + + End If + + End If + + End Sub + + Protected Overrides Sub OnDrawItem(e As DrawItemEventArgs) + + ThemeModule.G = e.Graphics + ThemeModule.G.SmoothingMode = SmoothingMode.HighQuality + ThemeModule.G.TextRenderingHint = TextRenderingHint.ClearTypeGridFit + + Rect = e.Bounds + + Using Back As New SolidBrush(HelpersXylos.ColorFromHex("#242424")) + ThemeModule.G.FillRectangle(Back, New Rectangle(e.Bounds.X - 4, e.Bounds.Y - 1, e.Bounds.Width + 4, e.Bounds.Height - 1)) + End Using + + If Not e.Index = -1 Then + ItemString = GetItemText(Items(e.Index)) + End If + + Using ItemsFont As New Font("Segoe UI", 9), Border As New Pen(HelpersXylos.ColorFromHex("#D0D5D9")) + + If (e.State And DrawItemState.Selected) = DrawItemState.Selected Then + + Using HoverItemBrush As New SolidBrush(HelpersXylos.ColorFromHex("#F5F5F5")) + ThemeModule.G.DrawString(ItemString, New Font("Segoe UI", 9), HoverItemBrush, New Point(Rect.X + 5, Rect.Y + 1)) + End Using + + Else + + Using DefaultItemBrush As New SolidBrush(HelpersXylos.ColorFromHex("#C0C0C0")) + ThemeModule.G.DrawString(ItemString, New Font("Segoe UI", 9), DefaultItemBrush, New Point(Rect.X + 5, Rect.Y + 1)) + End Using + + End If + + End Using + + e.DrawFocusRectangle() + + MyBase.OnDrawItem(e) + + End Sub + + Protected Overrides Sub OnSelectedItemChanged(ByVal e As EventArgs) + Invalidate() + MyBase.OnSelectedItemChanged(e) + End Sub + + Protected Overrides Sub OnSelectedIndexChanged(e As EventArgs) + State = MouseState1.None : Invalidate() + MyBase.OnSelectedIndexChanged(e) + End Sub + + Protected Overrides Sub OnMouseEnter(e As EventArgs) + State = MouseState1.Over : Invalidate() + MyBase.OnMouseEnter(e) + End Sub + + Protected Overrides Sub OnMouseLeave(e As EventArgs) + State = MouseState1.None : Invalidate() + MyBase.OnMouseLeave(e) + End Sub + +End Class + +Public Class BoosterCheckBox + Inherits CheckBox + + Private State As MouseState1 + Private Block As Boolean + + Private CheckThread, UncheckThread As Thread + Private OverFillRect As New Rectangle(1, 1, 14, 14) + + Sub New() + DoubleBuffered = True + Font = New Font("Segoe UI", 9) + SetStyle(ControlStyles.UserPaint Or ControlStyles.AllPaintingInWmPaint Or ControlStyles.Opaque Or ControlStyles.OptimizedDoubleBuffer, True) + End Sub + + Private Sub CheckAnimation() + + Block = True + + Dim X As Integer = 1 + Dim Rectw As Integer = 15 + + While Not OverFillRect.Width = 0 + X += 1 + Rectw -= 1 + OverFillRect = New Rectangle(X, OverFillRect.Y, Rectw, OverFillRect.Height) + Invalidate() + Thread.Sleep(30) + End While + + Block = False + + End Sub + + Private Sub UncheckAnimation() + + Block = True + + Dim X As Integer = 15 + Dim Rectw As Integer = 0 + + While Not OverFillRect.Width = 14 + X -= 1 + Rectw += 1 + OverFillRect = New Rectangle(X, OverFillRect.Y, Rectw, OverFillRect.Height) + Invalidate() + Thread.Sleep(30) + End While + + Block = False + + End Sub + + Protected Overrides Sub OnPaint(e As PaintEventArgs) + ThemeModule.G = e.Graphics + ThemeModule.G.SmoothingMode = SmoothingMode.HighQuality + ThemeModule.G.TextRenderingHint = TextRenderingHint.ClearTypeGridFit + + MyBase.OnPaint(e) + + ThemeModule.G.Clear(Parent.BackColor) + + If Enabled Then + + Using Fill As New SolidBrush(HelpersXylos.ColorFromHex("#242424")), Border As New Pen(HelpersXylos.ColorFromHex("#5C5C5C")) + ThemeModule.G.FillRectangle(Fill, New Rectangle(0, 0, 16, 16)) + ThemeModule.G.DrawRectangle(Border, New Rectangle(0, 0, 16, 16)) + End Using + + Select Case State + + Case MouseState1.None + + Using TextBrush As New SolidBrush(HelpersXylos.ColorFromHex("#B6B6B6")), TextFont As New Font("Segoe UI", 9) + ThemeModule.G.DrawString(Text, TextFont, TextBrush, New Point(25, -1)) + End Using + + Case MouseState1.Over + + Using TextBrush As New SolidBrush(HelpersXylos.ColorFromHex("#F5F5F5")), TextFont As New Font("Segoe UI", 9) + ThemeModule.G.DrawString(Text, TextFont, TextBrush, New Point(25, -1)) + End Using + + End Select + + Using CheckFont As New Font("Marlett", 12), CheckBrush As New SolidBrush(Color.FromArgb(144, 144, 144)) + ThemeModule.G.DrawString("b", CheckFont, CheckBrush, New Point(-2, 1)) + End Using + + Using Fill As New SolidBrush(HelpersXylos.ColorFromHex("#242424")) + ThemeModule.G.SmoothingMode = SmoothingMode.None + ThemeModule.G.FillRectangle(Fill, OverFillRect) + End Using + + Else + + Using Fill As New SolidBrush(HelpersXylos.ColorFromHex("#282828")), Border As New Pen(HelpersXylos.ColorFromHex("#484848")) + ThemeModule.G.FillRectangle(Fill, New Rectangle(0, 0, 16, 16)) + ThemeModule.G.DrawRectangle(Border, New Rectangle(0, 0, 16, 16)) + End Using + + Using TextBrush As New SolidBrush(HelpersXylos.ColorFromHex("#818181")), TextFont As New Font("Segoe UI", 9) + ThemeModule.G.DrawString(Text, TextFont, TextBrush, New Point(25, -1)) + End Using + + Using CheckFont As New Font("Marlett", 12), CheckBrush As New SolidBrush(HelpersXylos.ColorFromHex("#707070")) + ThemeModule.G.DrawString("b", CheckFont, CheckBrush, New Point(-2, 1)) + End Using + + Using Fill As New SolidBrush(HelpersXylos.ColorFromHex("#282828")) + ThemeModule.G.SmoothingMode = SmoothingMode.None + ThemeModule.G.FillRectangle(Fill, OverFillRect) + End Using + + End If + + End Sub + + Protected Overrides Sub OnMouseEnter(e As EventArgs) + State = MouseState1.Over : Invalidate() + MyBase.OnMouseEnter(e) + End Sub + + Protected Overrides Sub OnMouseLeave(e As EventArgs) + State = MouseState1.None : Invalidate() + MyBase.OnMouseLeave(e) + End Sub + + Protected Overrides Sub OnCheckedChanged(e As EventArgs) + + If Checked Then + CheckThread = New Thread(AddressOf CheckAnimation) With { + .IsBackground = True} + CheckThread.Start() + Else + UncheckThread = New Thread(AddressOf UncheckAnimation) With { + .IsBackground = True} + UncheckThread.Start() + End If + + If Not Block Then + MyBase.OnCheckedChanged(e) + End If + + End Sub + +End Class + +Public Class BoosterTabControl + Inherits TabControl + + Private MainRect As Rectangle + Private OverRect As Rectangle + + Private SubOverIndex As Integer = -1 + + Private ReadOnly Property Hovering As Boolean + Get + Return Not OverIndex = -1 + End Get + End Property + + Private Property OverIndex As Integer + Get + Return SubOverIndex + End Get + Set(value As Integer) + SubOverIndex = value + If Not SubOverIndex = -1 Then + OverRect = GetTabRect(OverIndex) + End If + Invalidate() + End Set + End Property + + Sub New() + DoubleBuffered = True + Font = New Font("Segoe UI", 10) + ForeColor = HelpersXylos.ColorFromHex("#78797B") + ItemSize = New Size(40, 170) + SizeMode = TabSizeMode.Fixed + Alignment = TabAlignment.Left + SetStyle(ControlStyles.UserPaint Or ControlStyles.AllPaintingInWmPaint Or ControlStyles.Opaque Or ControlStyles.OptimizedDoubleBuffer, True) + End Sub + + Protected Overrides Sub CreateHandle() + For Each Tab As TabPage In TabPages + Tab.BackColor = HelpersXylos.ColorFromHex("#424242") + Tab.ForeColor = HelpersXylos.ColorFromHex("#B6B6B6") + Tab.Font = New Font("Segoe UI", 9) + Next + MyBase.CreateHandle() + End Sub + + Protected Overrides Sub OnPaint(e As PaintEventArgs) + + ThemeModule.G = e.Graphics + ThemeModule.G.SmoothingMode = SmoothingMode.HighQuality + ThemeModule.G.TextRenderingHint = TextRenderingHint.ClearTypeGridFit + + ThemeModule.G.Clear(HelpersXylos.ColorFromHex("#333333")) + + Using Border As New Pen(HelpersXylos.ColorFromHex("#292929")) + ThemeModule.G.SmoothingMode = SmoothingMode.None + ThemeModule.G.DrawLine(Border, ItemSize.Height + 3, 4, ItemSize.Height + 3, Height - 5) + End Using + + For I As Integer = 0 To TabPages.Count - 1 + + MainRect = GetTabRect(I) + + If SelectedIndex = I Then + + Using Selection As New SolidBrush(HelpersXylos.ColorFromHex("#424242")) + ThemeModule.G.FillRectangle(Selection, New Rectangle(MainRect.X - 6, MainRect.Y + 2, MainRect.Width + 8, MainRect.Height - 1)) + End Using + + Using SelectionLeft As New SolidBrush(HelpersXylos.ColorFromHex("#F63333")) + ThemeModule.G.FillRectangle(SelectionLeft, New Rectangle(MainRect.X - 2, MainRect.Y + 2, 3, MainRect.Height - 1)) + End Using + + Using TextBrush As New SolidBrush(HelpersXylos.ColorFromHex("#F5F5F5")), TextFont As New Font("Segoe UI", 10) + ThemeModule.G.DrawString(TabPages(I).Text, TextFont, TextBrush, New Point(MainRect.X + 25, MainRect.Y + 11)) + End Using + + Else + + Using TextBrush As New SolidBrush(HelpersXylos.ColorFromHex("#C0C0C0")), TextFont As New Font("Segoe UI", 10) + ThemeModule.G.DrawString(TabPages(I).Text, TextFont, TextBrush, New Point(MainRect.X + 25, MainRect.Y + 11)) + End Using + + End If + + If Hovering Then + + Using Selection As New SolidBrush(HelpersXylos.ColorFromHex("#383838")) + ThemeModule.G.FillRectangle(Selection, New Rectangle(OverRect.X - 6, OverRect.Y + 2, OverRect.Width + 8, OverRect.Height - 1)) + End Using + + Using TextBrush As New SolidBrush(HelpersXylos.ColorFromHex("#C0C0C0")), TextFont As New Font("Segoe UI", 10) + ThemeModule.G.DrawString(TabPages(OverIndex).Text, TextFont, TextBrush, New Point(OverRect.X + 25, OverRect.Y + 11)) + End Using + + End If + + Next + + MyBase.OnPaint(e) + + End Sub + + Protected Overrides Sub OnMouseMove(e As MouseEventArgs) + For I As Integer = 0 To TabPages.Count - 1 + If GetTabRect(I).Contains(e.Location) And Not SelectedIndex = I Then + OverIndex = I + Exit For + Else + OverIndex = -1 + End If + Next + MyBase.OnMouseMove(e) + End Sub + + Protected Overrides Sub OnMouseLeave(e As EventArgs) + OverIndex = -1 + MyBase.OnMouseLeave(e) + End Sub + +End Class + +Public Class BoosterRadioButton + Inherits RadioButton + + Private State As MouseState1 + + Private CheckThread, UncheckThread As Thread + Private EllipseRect As New Rectangle(5, 5, 6, 6) + + Sub New() + DoubleBuffered = True + Font = New Font("Segoe UI", 9) + SetStyle(ControlStyles.UserPaint Or ControlStyles.AllPaintingInWmPaint Or ControlStyles.Opaque Or ControlStyles.OptimizedDoubleBuffer, True) + End Sub + + Private Sub CheckAnimation() + + Dim X As Integer = 1 + Dim Y As Integer = 1 + Dim EllipseW As Integer = 14 + Dim EllipseH As Integer = 14 + + While Not EllipseH = 8 + + If X < 4 Then + X += 1 + Y += 1 + End If + + EllipseW -= 1 + EllipseH -= 1 + EllipseRect = New Rectangle(X, Y, EllipseW, EllipseH) + Invalidate() + Thread.Sleep(30) + End While + + End Sub + + Protected Overrides Sub OnPaint(e As PaintEventArgs) + + ThemeModule.G = e.Graphics + ThemeModule.G.SmoothingMode = SmoothingMode.HighQuality + ThemeModule.G.TextRenderingHint = TextRenderingHint.ClearTypeGridFit + + MyBase.OnPaint(e) + + ThemeModule.G.Clear(Parent.BackColor) + + If Enabled Then + + Using Fill As New SolidBrush(HelpersXylos.ColorFromHex("#242424")), Border As New Pen(HelpersXylos.ColorFromHex("#5C5C5C")) + ThemeModule.G.FillEllipse(Fill, New Rectangle(0, 0, 16, 16)) + ThemeModule.G.DrawEllipse(Border, New Rectangle(0, 0, 16, 16)) + End Using + + Select Case State + + Case MouseState1.None + + Using TextBrush As New SolidBrush(HelpersXylos.ColorFromHex("#B6B6B6")), TextFont As New Font("Segoe UI", 9) + ThemeModule.G.DrawString(Text, TextFont, TextBrush, New Point(25, -1)) + End Using + + Case MouseState1.Over + + Using TextBrush As New SolidBrush(HelpersXylos.ColorFromHex("#F5F5F5")), TextFont As New Font("Segoe UI", 9) + ThemeModule.G.DrawString(Text, TextFont, TextBrush, New Point(25, -1)) + End Using + + End Select + + If Checked Then + + Using CheckBrush As New SolidBrush(HelpersXylos.ColorFromHex("#909090")) + ThemeModule.G.FillEllipse(CheckBrush, EllipseRect) + End Using + + End If + + Else + + Using Fill As New SolidBrush(HelpersXylos.ColorFromHex("#282828")), Border As New Pen(HelpersXylos.ColorFromHex("#484848")) + ThemeModule.G.FillEllipse(Fill, New Rectangle(0, 0, 16, 16)) + ThemeModule.G.DrawEllipse(Border, New Rectangle(0, 0, 16, 16)) + End Using + + Using TextBrush As New SolidBrush(HelpersXylos.ColorFromHex("#818181")), TextFont As New Font("Segoe UI", 9) + ThemeModule.G.DrawString(Text, TextFont, TextBrush, New Point(25, -1)) + End Using + + If Checked Then + + Using CheckBrush As New SolidBrush(HelpersXylos.ColorFromHex("#707070")) + ThemeModule.G.FillEllipse(CheckBrush, EllipseRect) + End Using + + End If + + End If + + End Sub + + Protected Overrides Sub OnMouseEnter(e As EventArgs) + State = MouseState1.Over : Invalidate() + MyBase.OnMouseEnter(e) + End Sub + + Protected Overrides Sub OnMouseLeave(e As EventArgs) + State = MouseState1.None : Invalidate() + MyBase.OnMouseLeave(e) + End Sub + + Protected Overrides Sub OnCheckedChanged(e As EventArgs) + + If Checked Then + CheckThread = New Thread(AddressOf CheckAnimation) With { + .IsBackground = True} + CheckThread.Start() + End If + + MyBase.OnCheckedChanged(e) + End Sub + +End Class + +Public Class BoosterNumericUpDown + Inherits NumericUpDown + + Private State As MouseState1 + Public Property AfterValue As String + + Private ValueChangedThread As Thread + Private TextPoint As New Point(2, 2) + Private TextFont As New Font("Segoe UI", 10) + + Sub New() + DoubleBuffered = True + Font = New Font("Segoe UI", 10) + Controls(0).Hide() + Controls(1).Hide() + ForeColor = HelpersXylos.ColorFromHex("#B6B6B6") + SetStyle(ControlStyles.UserPaint Or ControlStyles.AllPaintingInWmPaint Or ControlStyles.Opaque Or ControlStyles.OptimizedDoubleBuffer, True) + End Sub + + Private Sub ValueChangedAnimation() + + Dim TextSize As Integer = 5 + + While Not TextSize = 10 + TextSize += 1 + TextFont = New Font("Segoe UI", TextSize) + Invalidate() + Thread.Sleep(30) + End While + + End Sub + + Protected Overrides Sub OnPaint(e As PaintEventArgs) + + ThemeModule.G = e.Graphics + ThemeModule.G.SmoothingMode = SmoothingMode.HighQuality + ThemeModule.G.TextRenderingHint = TextRenderingHint.ClearTypeGridFit + + ThemeModule.G.Clear(Parent.BackColor) + + MyBase.OnPaint(e) + + If Enabled Then + + Using Fill As New SolidBrush(HelpersXylos.ColorFromHex("#242424")) + ThemeModule.G.FillRectangle(Fill, New Rectangle(0, 0, Width - 1, Height - 1)) + End Using + + Select Case State + + Case MouseState1.None + + Using Border As New Pen(HelpersXylos.ColorFromHex("#5C5C5C")) + ThemeModule.G.DrawRectangle(Border, New Rectangle(0, 0, Width - 1, Height - 1)) + End Using + + Case MouseState1.Over + + Using Border As New Pen(HelpersXylos.ColorFromHex("#C8C8C8")) + ThemeModule.G.DrawRectangle(Border, New Rectangle(0, 0, Width - 1, Height - 1)) + End Using + + End Select + + Using TextBrush As New SolidBrush(HelpersXylos.ColorFromHex("#B6B6B6")) + ThemeModule.G.DrawString(Value & AfterValue, TextFont, TextBrush, TextPoint) + End Using + + Using ArrowFont As New Font("Marlett", 10), ArrowBrush As New SolidBrush(HelpersXylos.ColorFromHex("#909090")) + ThemeModule.G.DrawString("5", ArrowFont, ArrowBrush, New Point(Width - 18, 2)) + ThemeModule.G.DrawString("6", ArrowFont, ArrowBrush, New Point(Width - 18, 10)) + End Using + + Else + + Using Fill As New SolidBrush(HelpersXylos.ColorFromHex("#282828")), Border As New Pen(HelpersXylos.ColorFromHex("#484848")) + ThemeModule.G.FillRectangle(Fill, New Rectangle(0, 0, Width - 1, Height - 1)) + ThemeModule.G.DrawRectangle(Border, New Rectangle(0, 0, Width - 1, Height - 1)) + End Using + + Using TextBrush As New SolidBrush(HelpersXylos.ColorFromHex("#818181")) + ThemeModule.G.DrawString(Value & AfterValue, TextFont, TextBrush, TextPoint) + End Using + + Using ArrowFont As New Font("Marlett", 10), ArrowBrush As New SolidBrush(HelpersXylos.ColorFromHex("#707070")) + ThemeModule.G.DrawString("5", ArrowFont, ArrowBrush, New Point(Width - 18, 2)) + ThemeModule.G.DrawString("6", ArrowFont, ArrowBrush, New Point(Width - 18, 10)) + End Using + + End If + + End Sub + + Protected Overrides Sub OnMouseUp(e As MouseEventArgs) + + If e.X > Width - 16 AndAlso e.Y < 11 Then + + If Not Value + Increment > Maximum Then + Value += Increment + Else + Value = Maximum + End If + + ElseIf e.X > Width - 16 AndAlso e.Y > 13 Then + If Not Value - Increment < Minimum Then + Value -= Increment + Else + Value = Minimum + End If + End If + + Invalidate() + + MyBase.OnMouseUp(e) + End Sub + + Protected Overrides Sub OnMouseEnter(e As EventArgs) + State = MouseState1.Over : Invalidate() + MyBase.OnMouseEnter(e) + End Sub + + Protected Overrides Sub OnMouseLeave(e As EventArgs) + State = MouseState1.None : Invalidate() + MyBase.OnMouseLeave(e) + End Sub + + Protected Overrides Sub OnValueChanged(e As EventArgs) + ValueChangedThread = New Thread(AddressOf ValueChangedAnimation) With { + .IsBackground = True} + ValueChangedThread.Start() + MyBase.OnValueChanged(e) + End Sub + +End Class \ No newline at end of file diff --git a/HALOCELauncher/Controls/Forms/AboutForm.Designer.vb b/HALOCELauncher/Controls/Forms/AboutForm.Designer.vb new file mode 100644 index 0000000..f6f7245 --- /dev/null +++ b/HALOCELauncher/Controls/Forms/AboutForm.Designer.vb @@ -0,0 +1,125 @@ + _ +Partial Class AboutForm + Inherits System.Windows.Forms.Form + + 'Form overrides dispose to clean up the component list. + _ + 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 + + 'Required by the Windows Form Designer + Private components As System.ComponentModel.IContainer + + 'NOTE: The following procedure is required by the Windows Form Designer + 'It can be modified using the Windows Form Designer. + 'Do not modify it using the code editor. + _ + Private Sub InitializeComponent() + Me.components = New System.ComponentModel.Container() + Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(AboutForm)) + Me.GunaButton1 = New Guna.UI.WinForms.GunaButton() + Me.Timer1 = New System.Windows.Forms.Timer(Me.components) + Me.GunaPanel1 = New Guna.UI.WinForms.GunaPanel() + Me.LabelTextLog = New Guna.UI.WinForms.GunaLabel() + Me.GunaControlBox1 = New Guna.UI.WinForms.GunaControlBox() + Me.GunaPanel1.SuspendLayout() + Me.SuspendLayout() + ' + 'GunaButton1 + ' + Me.GunaButton1.AnimationHoverSpeed = 0.07! + Me.GunaButton1.AnimationSpeed = 0.03! + Me.GunaButton1.BaseColor = System.Drawing.Color.FromArgb(CType(CType(100, Byte), Integer), CType(CType(88, Byte), Integer), CType(CType(255, Byte), Integer)) + Me.GunaButton1.BorderColor = System.Drawing.Color.Black + Me.GunaButton1.DialogResult = System.Windows.Forms.DialogResult.None + Me.GunaButton1.Enabled = False + Me.GunaButton1.FocusedColor = System.Drawing.Color.Empty + Me.GunaButton1.Font = New System.Drawing.Font("Impact", 12.0!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte)) + Me.GunaButton1.ForeColor = System.Drawing.Color.White + Me.GunaButton1.Image = CType(resources.GetObject("GunaButton1.Image"), System.Drawing.Image) + Me.GunaButton1.ImageSize = New System.Drawing.Size(30, 30) + Me.GunaButton1.Location = New System.Drawing.Point(-2, 12) + Me.GunaButton1.Name = "GunaButton1" + Me.GunaButton1.OnHoverBaseColor = System.Drawing.Color.FromArgb(CType(CType(151, Byte), Integer), CType(CType(143, Byte), Integer), CType(CType(255, Byte), Integer)) + Me.GunaButton1.OnHoverBorderColor = System.Drawing.Color.Black + Me.GunaButton1.OnHoverForeColor = System.Drawing.Color.White + Me.GunaButton1.OnHoverImage = Nothing + Me.GunaButton1.OnPressedColor = System.Drawing.Color.Black + Me.GunaButton1.Size = New System.Drawing.Size(245, 36) + Me.GunaButton1.TabIndex = 0 + Me.GunaButton1.Text = "HALO CE/PC Launcher" + ' + 'Timer1 + ' + Me.Timer1.Interval = 1 + ' + 'GunaPanel1 + ' + Me.GunaPanel1.Controls.Add(Me.LabelTextLog) + Me.GunaPanel1.Location = New System.Drawing.Point(19, 77) + Me.GunaPanel1.Name = "GunaPanel1" + Me.GunaPanel1.Size = New System.Drawing.Size(432, 175) + Me.GunaPanel1.TabIndex = 1 + ' + 'LabelTextLog + ' + Me.LabelTextLog.Dock = System.Windows.Forms.DockStyle.Fill + Me.LabelTextLog.Font = New System.Drawing.Font("Segoe UI", 9.0!) + Me.LabelTextLog.ForeColor = System.Drawing.Color.White + Me.LabelTextLog.Location = New System.Drawing.Point(0, 0) + Me.LabelTextLog.Name = "LabelTextLog" + Me.LabelTextLog.Size = New System.Drawing.Size(432, 175) + Me.LabelTextLog.TabIndex = 2 + Me.LabelTextLog.Text = "Ego sum Deus ex spatio, tempore, Energy." + Me.LabelTextLog.TextAlign = System.Drawing.ContentAlignment.TopCenter + ' + 'GunaControlBox1 + ' + Me.GunaControlBox1.Anchor = CType((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles) + Me.GunaControlBox1.AnimationHoverSpeed = 0.07! + Me.GunaControlBox1.AnimationSpeed = 0.03! + Me.GunaControlBox1.BackColor = System.Drawing.Color.Transparent + Me.GunaControlBox1.IconColor = System.Drawing.Color.White + Me.GunaControlBox1.IconSize = 15.0! + Me.GunaControlBox1.Location = New System.Drawing.Point(453, 0) + Me.GunaControlBox1.Name = "GunaControlBox1" + Me.GunaControlBox1.OnHoverBackColor = System.Drawing.Color.FromArgb(CType(CType(255, Byte), Integer), CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer)) + Me.GunaControlBox1.OnHoverIconColor = System.Drawing.Color.White + Me.GunaControlBox1.OnPressedColor = System.Drawing.Color.Black + Me.GunaControlBox1.Size = New System.Drawing.Size(31, 24) + Me.GunaControlBox1.TabIndex = 5 + ' + 'AboutForm + ' + Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) + Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font + Me.BackColor = System.Drawing.Color.FromArgb(CType(CType(34, Byte), Integer), CType(CType(34, Byte), Integer), CType(CType(34, Byte), Integer)) + Me.ClientSize = New System.Drawing.Size(483, 267) + Me.Controls.Add(Me.GunaControlBox1) + Me.Controls.Add(Me.GunaPanel1) + Me.Controls.Add(Me.GunaButton1) + Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None + Me.MaximizeBox = False + Me.MinimizeBox = False + Me.Name = "AboutForm" + Me.ShowIcon = False + Me.ShowInTaskbar = False + Me.Text = "AboutForm" + Me.TopMost = True + Me.GunaPanel1.ResumeLayout(False) + Me.ResumeLayout(False) + + End Sub + Friend WithEvents GunaButton1 As Guna.UI.WinForms.GunaButton + Friend WithEvents Timer1 As System.Windows.Forms.Timer + Friend WithEvents GunaPanel1 As Guna.UI.WinForms.GunaPanel + Friend WithEvents LabelTextLog As Guna.UI.WinForms.GunaLabel + Friend WithEvents GunaControlBox1 As Guna.UI.WinForms.GunaControlBox +End Class diff --git a/HALOCELauncher/Controls/Forms/AboutForm.resx b/HALOCELauncher/Controls/Forms/AboutForm.resx new file mode 100644 index 0000000..46ff097 --- /dev/null +++ b/HALOCELauncher/Controls/Forms/AboutForm.resx @@ -0,0 +1,454 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + iVBORw0KGgoAAAANSUhEUgAAAgAAAAIACAYAAAD0eNT6AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADrwAAA68AZW8ckkAAEvLSURBVHhe7d17zCXlfdjxBewsV6+5LZflftvlYiALmIsx + a0LIUgqBYsc4biNcpRJNoprEUWoaN3WRGkckFhW2gjaxYpyqUKu4VlAjaIMbo6igyFZNW1GLStjyP7jy + H1j8gVxLSJ2e72vm9XPmPM/czsycOWe+R3oF+77nMvOZOc/v99x37PChgAIKKKCAAgoooIACCiiggAIK + KKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIK + KKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIK + KKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIK + KKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIK + KKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIK + KKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIK + KKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIK + KKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIK + KKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIK + KKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIK + KKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIK + KKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIK + KKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIK + KKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIK + KKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIK + KKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIK + KKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIK + KKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIK + KKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIK + KKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIK + KKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIK + KKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIK + KKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIK + KKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIK + KKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIK + KKCAAgoooIACCiigQEzg7NkvDwQ/983+/9Ozn4Ozn72SrY3Arrev4QOz//ITXtMr1uYsPFAFFFBAgd4E + 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 + AgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCA + AgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCA + AgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCA + AgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCA + AgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCA + AgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCA + AgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCA + AgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCA + AgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCA + AgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCA + AgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCA + AgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCA + AgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCA + AgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCA + AgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCA + AgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCA + AgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCA + AgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCA + AgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCA + AgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCA + AgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCA + AgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCA + AgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCA + AgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCA + AgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgsC/x/dfqgaUSKkPwAA + AABJRU5ErkJggg== + + + + 17, 17 + + \ No newline at end of file diff --git a/HALOCELauncher/Controls/Forms/AboutForm.vb b/HALOCELauncher/Controls/Forms/AboutForm.vb new file mode 100644 index 0000000..5b0647a --- /dev/null +++ b/HALOCELauncher/Controls/Forms/AboutForm.vb @@ -0,0 +1,81 @@ +Imports HALOCELauncher.Core.Helpers + +Public Class AboutForm + + Private WelcomeMessage As String = "Ego sum Deus ex spatio, tempore, Energy." + + Public Shared ReadOnly _textToDisplay As String = +.Value + + Private _Showing As String = "" + Private _avrchar As Integer = 0 + Private _AwaitTIme As Integer = 0 + Private _MaxAwaitTIme As Integer = 5 + Private ContinueAwait As Boolean = True + + Private Sub AboutForm_Load(sender As Object, e As EventArgs) Handles MyBase.Load + LabelTextLog.Text = WelcomeMessage + Guna.UI.Lib.GraphicsHelper.ShadowForm(Me) + Me.Location = CenterForm(Form1, Me, Me.Location) + EnabledDragger(LabelTextLog) + EnabledDragger(Me) + EnabledDragger(GunaButton1) + _avrchar = 0 + _AwaitTIme = 0 + _MaxAwaitTIme = 100 + ContinueAwait = True + Timer1.Enabled = True + End Sub + + Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick + Try + If _AwaitTIme = _MaxAwaitTIme Then + ContinueAwait = False + If _Showing.Count < _textToDisplay.Count And _Showing.Count > 0 Then + _Showing = _textToDisplay.Substring(0, _Showing.Length + 1) + ElseIf _Showing.Count < _textToDisplay.Count And _Showing.Count = 0 Then + _Showing = _textToDisplay.Substring(0, 1) + ElseIf _Showing.Count < _avrchar Then + _Showing = " " + _Showing + Else + _Showing = "" + End If + LabelTextLog.Text = _Showing + If LabelTextLog.Text = _textToDisplay Then + Timer1.Enabled = False + End If + End If + + If ContinueAwait = True Then + _AwaitTIme += 1 + End If + + Catch ex As Exception + MsgBox(ex.ToString) + End Try + End Sub + + Private Function NumberfitCharsInTextBox(tb As TextBox) As Integer + Dim avgW As Integer = 0 + Dim avgH As Integer = 0 + Dim avg As Size + For i As Integer = 65 To 90 + avg = TextRenderer.MeasureText(CChar(ChrW(i)).ToString(), LabelTextLog.Font) + avgH += avg.Height + avgW += avg.Width + Next + Return CInt((((45 * LabelTextLog.Width) / avgW) * ((45 * LabelTextLog.Height) / avgH))) + End Function + + +End Class \ No newline at end of file diff --git a/HALOCELauncher/Controls/Forms/Home.Designer.vb b/HALOCELauncher/Controls/Forms/Home.Designer.vb new file mode 100644 index 0000000..b44e505 --- /dev/null +++ b/HALOCELauncher/Controls/Forms/Home.Designer.vb @@ -0,0 +1,304 @@ + _ +Partial Class Home + Inherits System.Windows.Forms.Form + + 'Form overrides dispose to clean up the component list. + _ + 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 + + 'Required by the Windows Form Designer + Private components As System.ComponentModel.IContainer + + 'NOTE: The following procedure is required by the Windows Form Designer + 'It can be modified using the Windows Form Designer. + 'Do not modify it using the code editor. + _ + Private Sub InitializeComponent() + Me.GunaPanel1 = New Guna.UI.WinForms.GunaPanel() + Me.Anuncio4 = New Guna.UI.WinForms.GunaPanel() + Me.Anuncio3 = New Guna.UI.WinForms.GunaPanel() + Me.GunaPanel3 = New Guna.UI.WinForms.GunaPanel() + Me.Anuncio3Des = New Guna.UI.WinForms.GunaLabel() + Me.Anuncio3Title = New Guna.UI.WinForms.GunaLabel() + Me.GunaPanel4 = New Guna.UI.WinForms.GunaPanel() + Me.Anuncio3Icon = New Guna.UI.WinForms.GunaPanel() + Me.Anuncio2 = New Guna.UI.WinForms.GunaPanel() + Me.GunaPanel2 = New Guna.UI.WinForms.GunaPanel() + Me.Anuncio2Des = New Guna.UI.WinForms.GunaLabel() + Me.Anuncio2Title = New Guna.UI.WinForms.GunaLabel() + Me.GunaPanel5 = New Guna.UI.WinForms.GunaPanel() + Me.Anuncio2Icon = New Guna.UI.WinForms.GunaPanel() + Me.Anuncio1 = New Guna.UI.WinForms.GunaPanel() + Me.GunaPanel6 = New Guna.UI.WinForms.GunaPanel() + Me.Anuncio1Des = New Guna.UI.WinForms.GunaLabel() + Me.Anuncio1Title = New Guna.UI.WinForms.GunaLabel() + Me.GunaPanel7 = New Guna.UI.WinForms.GunaPanel() + Me.Anuncio1Icon = New Guna.UI.WinForms.GunaPanel() + Me.GunaPanel1.SuspendLayout() + Me.Anuncio3.SuspendLayout() + Me.GunaPanel3.SuspendLayout() + Me.Anuncio2.SuspendLayout() + Me.GunaPanel2.SuspendLayout() + Me.Anuncio1.SuspendLayout() + Me.GunaPanel6.SuspendLayout() + Me.SuspendLayout() + ' + 'GunaPanel1 + ' + Me.GunaPanel1.BackColor = System.Drawing.Color.Transparent + Me.GunaPanel1.Controls.Add(Me.Anuncio4) + Me.GunaPanel1.Controls.Add(Me.Anuncio3) + Me.GunaPanel1.Controls.Add(Me.Anuncio2) + Me.GunaPanel1.Controls.Add(Me.Anuncio1) + Me.GunaPanel1.Dock = System.Windows.Forms.DockStyle.Fill + Me.GunaPanel1.Location = New System.Drawing.Point(0, 0) + Me.GunaPanel1.Name = "GunaPanel1" + Me.GunaPanel1.Size = New System.Drawing.Size(818, 438) + Me.GunaPanel1.TabIndex = 2 + ' + 'Anuncio4 + ' + Me.Anuncio4.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch + Me.Anuncio4.Location = New System.Drawing.Point(609, 26) + Me.Anuncio4.Name = "Anuncio4" + Me.Anuncio4.Size = New System.Drawing.Size(197, 400) + Me.Anuncio4.TabIndex = 3 + ' + 'Anuncio3 + ' + Me.Anuncio3.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch + Me.Anuncio3.Controls.Add(Me.GunaPanel3) + Me.Anuncio3.Controls.Add(Me.Anuncio3Icon) + Me.Anuncio3.Location = New System.Drawing.Point(307, 278) + Me.Anuncio3.Name = "Anuncio3" + Me.Anuncio3.Size = New System.Drawing.Size(279, 148) + Me.Anuncio3.TabIndex = 2 + ' + 'GunaPanel3 + ' + Me.GunaPanel3.Controls.Add(Me.Anuncio3Des) + Me.GunaPanel3.Controls.Add(Me.Anuncio3Title) + Me.GunaPanel3.Controls.Add(Me.GunaPanel4) + Me.GunaPanel3.Dock = System.Windows.Forms.DockStyle.Bottom + Me.GunaPanel3.Location = New System.Drawing.Point(0, 113) + Me.GunaPanel3.Name = "GunaPanel3" + Me.GunaPanel3.Size = New System.Drawing.Size(279, 35) + Me.GunaPanel3.TabIndex = 1 + ' + 'Anuncio3Des + ' + Me.Anuncio3Des.Cursor = System.Windows.Forms.Cursors.Hand + Me.Anuncio3Des.Font = New System.Drawing.Font("Consolas", 8.25!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte)) + Me.Anuncio3Des.ForeColor = System.Drawing.Color.White + Me.Anuncio3Des.Location = New System.Drawing.Point(15, 20) + Me.Anuncio3Des.Name = "Anuncio3Des" + Me.Anuncio3Des.Size = New System.Drawing.Size(231, 125) + Me.Anuncio3Des.TabIndex = 7 + Me.Anuncio3Des.Text = "Des" + Me.Anuncio3Des.Visible = False + ' + 'Anuncio3Title + ' + Me.Anuncio3Title.AutoSize = True + Me.Anuncio3Title.Cursor = System.Windows.Forms.Cursors.Hand + Me.Anuncio3Title.Font = New System.Drawing.Font("Segoe UI", 8.25!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte)) + Me.Anuncio3Title.ForeColor = System.Drawing.Color.White + Me.Anuncio3Title.Location = New System.Drawing.Point(14, 4) + Me.Anuncio3Title.Name = "Anuncio3Title" + Me.Anuncio3Title.Size = New System.Drawing.Size(28, 13) + Me.Anuncio3Title.TabIndex = 6 + Me.Anuncio3Title.Text = "Title" + Me.Anuncio3Title.Visible = False + ' + 'GunaPanel4 + ' + Me.GunaPanel4.Location = New System.Drawing.Point(3, 4) + Me.GunaPanel4.Name = "GunaPanel4" + Me.GunaPanel4.Size = New System.Drawing.Size(5, 28) + Me.GunaPanel4.TabIndex = 0 + ' + 'Anuncio3Icon + ' + Me.Anuncio3Icon.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch + Me.Anuncio3Icon.Location = New System.Drawing.Point(3, 3) + Me.Anuncio3Icon.Name = "Anuncio3Icon" + Me.Anuncio3Icon.Size = New System.Drawing.Size(20, 20) + Me.Anuncio3Icon.TabIndex = 2 + Me.Anuncio3Icon.Visible = False + ' + 'Anuncio2 + ' + Me.Anuncio2.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch + Me.Anuncio2.Controls.Add(Me.GunaPanel2) + Me.Anuncio2.Controls.Add(Me.Anuncio2Icon) + Me.Anuncio2.Location = New System.Drawing.Point(21, 278) + Me.Anuncio2.Name = "Anuncio2" + Me.Anuncio2.Size = New System.Drawing.Size(259, 148) + Me.Anuncio2.TabIndex = 1 + ' + 'GunaPanel2 + ' + Me.GunaPanel2.Controls.Add(Me.Anuncio2Des) + Me.GunaPanel2.Controls.Add(Me.Anuncio2Title) + Me.GunaPanel2.Controls.Add(Me.GunaPanel5) + Me.GunaPanel2.Dock = System.Windows.Forms.DockStyle.Bottom + Me.GunaPanel2.Location = New System.Drawing.Point(0, 113) + Me.GunaPanel2.Name = "GunaPanel2" + Me.GunaPanel2.Size = New System.Drawing.Size(259, 35) + Me.GunaPanel2.TabIndex = 0 + ' + 'Anuncio2Des + ' + Me.Anuncio2Des.Cursor = System.Windows.Forms.Cursors.Hand + Me.Anuncio2Des.Font = New System.Drawing.Font("Consolas", 8.25!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte)) + Me.Anuncio2Des.ForeColor = System.Drawing.Color.White + Me.Anuncio2Des.Location = New System.Drawing.Point(15, 20) + Me.Anuncio2Des.Name = "Anuncio2Des" + Me.Anuncio2Des.Size = New System.Drawing.Size(231, 125) + Me.Anuncio2Des.TabIndex = 5 + Me.Anuncio2Des.Text = "Des" + Me.Anuncio2Des.Visible = False + ' + 'Anuncio2Title + ' + Me.Anuncio2Title.AutoSize = True + Me.Anuncio2Title.Cursor = System.Windows.Forms.Cursors.Hand + Me.Anuncio2Title.Font = New System.Drawing.Font("Segoe UI", 8.25!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte)) + Me.Anuncio2Title.ForeColor = System.Drawing.Color.White + Me.Anuncio2Title.Location = New System.Drawing.Point(14, 4) + Me.Anuncio2Title.Name = "Anuncio2Title" + Me.Anuncio2Title.Size = New System.Drawing.Size(28, 13) + Me.Anuncio2Title.TabIndex = 4 + Me.Anuncio2Title.Text = "Title" + Me.Anuncio2Title.Visible = False + ' + 'GunaPanel5 + ' + Me.GunaPanel5.Location = New System.Drawing.Point(3, 4) + Me.GunaPanel5.Name = "GunaPanel5" + Me.GunaPanel5.Size = New System.Drawing.Size(5, 28) + Me.GunaPanel5.TabIndex = 1 + ' + 'Anuncio2Icon + ' + Me.Anuncio2Icon.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch + Me.Anuncio2Icon.Location = New System.Drawing.Point(3, 3) + Me.Anuncio2Icon.Name = "Anuncio2Icon" + Me.Anuncio2Icon.Size = New System.Drawing.Size(20, 20) + Me.Anuncio2Icon.TabIndex = 3 + Me.Anuncio2Icon.Visible = False + ' + 'Anuncio1 + ' + Me.Anuncio1.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch + Me.Anuncio1.Controls.Add(Me.GunaPanel6) + Me.Anuncio1.Controls.Add(Me.Anuncio1Icon) + Me.Anuncio1.Location = New System.Drawing.Point(21, 26) + Me.Anuncio1.Name = "Anuncio1" + Me.Anuncio1.Size = New System.Drawing.Size(565, 231) + Me.Anuncio1.TabIndex = 0 + ' + 'GunaPanel6 + ' + Me.GunaPanel6.Controls.Add(Me.Anuncio1Des) + Me.GunaPanel6.Controls.Add(Me.Anuncio1Title) + Me.GunaPanel6.Controls.Add(Me.GunaPanel7) + Me.GunaPanel6.Dock = System.Windows.Forms.DockStyle.Bottom + Me.GunaPanel6.Location = New System.Drawing.Point(0, 196) + Me.GunaPanel6.Name = "GunaPanel6" + Me.GunaPanel6.Size = New System.Drawing.Size(565, 35) + Me.GunaPanel6.TabIndex = 4 + ' + 'Anuncio1Des + ' + Me.Anuncio1Des.Cursor = System.Windows.Forms.Cursors.Hand + Me.Anuncio1Des.Font = New System.Drawing.Font("Consolas", 8.25!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte)) + Me.Anuncio1Des.ForeColor = System.Drawing.Color.White + Me.Anuncio1Des.Location = New System.Drawing.Point(15, 20) + Me.Anuncio1Des.Name = "Anuncio1Des" + Me.Anuncio1Des.Size = New System.Drawing.Size(536, 211) + Me.Anuncio1Des.TabIndex = 5 + Me.Anuncio1Des.Text = "Des" + Me.Anuncio1Des.Visible = False + ' + 'Anuncio1Title + ' + Me.Anuncio1Title.AutoSize = True + Me.Anuncio1Title.Cursor = System.Windows.Forms.Cursors.Hand + Me.Anuncio1Title.Font = New System.Drawing.Font("Segoe UI", 8.25!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte)) + Me.Anuncio1Title.ForeColor = System.Drawing.Color.White + Me.Anuncio1Title.Location = New System.Drawing.Point(14, 4) + Me.Anuncio1Title.Name = "Anuncio1Title" + Me.Anuncio1Title.Size = New System.Drawing.Size(28, 13) + Me.Anuncio1Title.TabIndex = 4 + Me.Anuncio1Title.Text = "Title" + Me.Anuncio1Title.Visible = False + ' + 'GunaPanel7 + ' + Me.GunaPanel7.Location = New System.Drawing.Point(3, 4) + Me.GunaPanel7.Name = "GunaPanel7" + Me.GunaPanel7.Size = New System.Drawing.Size(5, 28) + Me.GunaPanel7.TabIndex = 1 + ' + 'Anuncio1Icon + ' + Me.Anuncio1Icon.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch + Me.Anuncio1Icon.Location = New System.Drawing.Point(3, 1) + Me.Anuncio1Icon.Name = "Anuncio1Icon" + Me.Anuncio1Icon.Size = New System.Drawing.Size(20, 20) + Me.Anuncio1Icon.TabIndex = 5 + Me.Anuncio1Icon.Visible = False + ' + 'Home + ' + Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) + Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font + Me.BackColor = System.Drawing.Color.FromArgb(CType(CType(64, Byte), Integer), CType(CType(64, Byte), Integer), CType(CType(64, Byte), Integer)) + Me.ClientSize = New System.Drawing.Size(818, 438) + Me.Controls.Add(Me.GunaPanel1) + Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None + Me.Name = "Home" + Me.Text = "Home" + Me.GunaPanel1.ResumeLayout(False) + Me.Anuncio3.ResumeLayout(False) + Me.GunaPanel3.ResumeLayout(False) + Me.GunaPanel3.PerformLayout() + Me.Anuncio2.ResumeLayout(False) + Me.GunaPanel2.ResumeLayout(False) + Me.GunaPanel2.PerformLayout() + Me.Anuncio1.ResumeLayout(False) + Me.GunaPanel6.ResumeLayout(False) + Me.GunaPanel6.PerformLayout() + Me.ResumeLayout(False) + + End Sub + Friend WithEvents GunaPanel1 As Guna.UI.WinForms.GunaPanel + Friend WithEvents Anuncio1 As Guna.UI.WinForms.GunaPanel + Friend WithEvents Anuncio4 As Guna.UI.WinForms.GunaPanel + Friend WithEvents Anuncio3 As Guna.UI.WinForms.GunaPanel + Friend WithEvents Anuncio2 As Guna.UI.WinForms.GunaPanel + Friend WithEvents GunaPanel2 As Guna.UI.WinForms.GunaPanel + Friend WithEvents GunaPanel3 As Guna.UI.WinForms.GunaPanel + Friend WithEvents GunaPanel4 As Guna.UI.WinForms.GunaPanel + Friend WithEvents GunaPanel5 As Guna.UI.WinForms.GunaPanel + Friend WithEvents Anuncio3Icon As Guna.UI.WinForms.GunaPanel + Friend WithEvents Anuncio2Icon As Guna.UI.WinForms.GunaPanel + Friend WithEvents Anuncio2Title As Guna.UI.WinForms.GunaLabel + Friend WithEvents Anuncio3Des As Guna.UI.WinForms.GunaLabel + Friend WithEvents Anuncio3Title As Guna.UI.WinForms.GunaLabel + Friend WithEvents Anuncio2Des As Guna.UI.WinForms.GunaLabel + Friend WithEvents GunaPanel6 As Guna.UI.WinForms.GunaPanel + Friend WithEvents Anuncio1Des As Guna.UI.WinForms.GunaLabel + Friend WithEvents Anuncio1Title As Guna.UI.WinForms.GunaLabel + Friend WithEvents GunaPanel7 As Guna.UI.WinForms.GunaPanel + Friend WithEvents Anuncio1Icon As Guna.UI.WinForms.GunaPanel +End Class diff --git a/HALOCELauncher/Controls/Forms/Home.resx b/HALOCELauncher/Controls/Forms/Home.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/HALOCELauncher/Controls/Forms/Home.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/HALOCELauncher/Controls/Forms/Home.vb b/HALOCELauncher/Controls/Forms/Home.vb new file mode 100644 index 0000000..5ca8c1b --- /dev/null +++ b/HALOCELauncher/Controls/Forms/Home.vb @@ -0,0 +1,339 @@ +Imports HALOCELauncher.Core.Helpers +Imports HALOCELauncher.Core.Utils +Imports System.Net +Imports System.Text +Imports HALOCELauncher.Core.Utils.LogFuncs + +Public Class Home + + Private Sub Home_Load(sender As Object, e As EventArgs) Handles MyBase.Load + Try : AddHandler Application.ThreadException, AddressOf Application_Exception_Handler _ + : Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException, False) _ + : Catch : End Try + + SetStyle(ControlStyles.SupportsTransparentBackColor, True) + Me.BackColor = Color.Transparent + Me.Refresh() + StartC() + End Sub + + Private Sub Application_Exception_Handler(ByVal sender As Object, ByVal e As System.Threading.ThreadExceptionEventArgs) + Dim ex As Exception = CType(e.Exception, Exception) + WriteLog(ex.Message, InfoType.Exception) + End Sub + +#Region " Parent Dragger " + + Private Dragger As ControlDragger = ControlDragger.Empty + + Private Sub InitializeDrag() + Me.Dragger = New ControlDragger(Me, Form1) + Me.Dragger = New ControlDragger(GunaPanel1, Form1) + For Each Cdrag As Control In GunaPanel1.Controls + Me.Dragger = New ControlDragger(Cdrag, Form1) + Next + Me.Dragger.Enabled = True + End Sub + + Private Sub AlternateDrag() + Dragger.Enabled = Not Dragger.Enabled + End Sub + + Private Sub FinishDrag() + Dragger.Dispose() + End Sub + + Private Sub Drag() Handles MyBase.Shown + Me.InitializeDrag() + End Sub + +#End Region + + Public Overrides Sub Refresh() + If Anuncio1_Image = False Then + Dim Aplyblur1 As New GetBlurBitmap(Me.Anuncio1) + End If + If Anuncio2_Image = False Then + Dim Aplyblur2 As New GetBlurBitmap(Me.Anuncio2) + End If + If Anuncio3_Image = False Then + Dim Aplyblur3 As New GetBlurBitmap(Me.Anuncio3) + End If + If Anuncio4_Image = False Then + Dim Aplyblur4 As New GetBlurBitmap(Me.Anuncio4) + End If + MyBase.Refresh() + End Sub + + Private Sub StartC() + On Error Resume Next + Me.GunaPanel2.BackColor = Color.FromArgb(40, Color.Black) + Me.GunaPanel3.BackColor = Color.FromArgb(40, Color.Black) + Me.GunaPanel4.BackColor = Color.FromArgb(40, Color.White) + Me.GunaPanel5.BackColor = Color.FromArgb(40, Color.White) + DownloadAsync("https://raw.githubusercontent.com/DestroyerDarkNess/Halo-SyncHack/master/LauncherInfo.txt") + End Sub + +#Region "ADS" + + Private Anuncio1_Image As Boolean = False + Private Anuncio2_Image As Boolean = False + Private Anuncio3_Image As Boolean = False + Private Anuncio4_Image As Boolean = False + + Dim xmlData As XDocument = + + + NO Internet Connection! + + + + + + + NO Internet Connection! + + + + + + + NO Internet Connection! + + + + + + + NO Internet Connection! + + + + + + + + Public Sub DownloadAsync(ByVal adress As String) + Dim Client As WebClient = New WebClient() + Client.DownloadStringAsync(New Uri(adress)) + AddHandler Client.DownloadStringCompleted, AddressOf DownloadComplete + End Sub + + Public Sub DownloadComplete(sender As Object, e As DownloadStringCompletedEventArgs) + Try + Dim ClientData As String = e.Result + If Not ClientData = "" Then + ReadXML(ClientData) + End If + Catch ex As Exception + ReadXML(xmlData.ToString) + Anuncio1Title.ForeColor = Color.Red + Anuncio2Title.ForeColor = Color.Red + Anuncio3Title.ForeColor = Color.Red + Dim ExeptionEX As String = ex.Message + Anuncio1Des.Text = ExeptionEX + Anuncio2Des.Text = ExeptionEX + Anuncio3Des.Text = ExeptionEX + Anuncio1Des.Visible = True + Anuncio2Des.Visible = True + Anuncio3Des.Visible = True + End Try + End Sub + + Private Sub ReadXML(ByVal XmlString As String) + On Error Resume Next + Dim element As XDocument = XDocument.Parse(XmlString) + xmlData = element + Dim Str As New StringBuilder + For Each signature As XElement In xmlData.Root.Elements + Dim Anuncement As String = signature.Name.ToString + Dim Title As String = signature..Value + Dim IconDir As String = signature.<Icon>.Value + Dim ImageDir As String = signature.<Image>.Value + Dim Description As String = signature.<Description>.Value + Dim LinkUrl As String = signature.<Link>.Value + If Anuncement = "Anuncio1" Then + + If Not Title = "" Then + Anuncio1Title.Text = Title + Anuncio1Title.Visible = True + End If + If Not ImageDir = "" Then + Anuncio1.BackgroundImage = GetImageDecripted(ImageDir) + Anuncio1_Image = True + End If + If Not IconDir = "" Then + Anuncio1Icon.BackgroundImage = GetImageDecripted(IconDir) + Anuncio1Icon.Visible = True + End If + If Not Description = "" Then + Anuncio1Des.Text = Description + Anuncio1Des.Visible = True + End If + If Not LinkUrl = "" Then + Anuncio1Link = LinkUrl + Anuncio1.Cursor = Cursors.Hand + End If + + ElseIf Anuncement = "Anuncio2" Then + If Not Title = "" Then + Anuncio2Title.Text = Title + Anuncio2Title.Visible = True + End If + If Not ImageDir = "" Then + Anuncio2.BackgroundImage = GetImageDecripted(ImageDir) + Anuncio2_Image = True + End If + If Not IconDir = "" Then + Anuncio2Icon.BackgroundImage = GetImageDecripted(IconDir) + Anuncio2Icon.Visible = True + End If + If Not Description = "" Then + Anuncio2Des.Text = Description + Anuncio2Des.Visible = True + End If + If Not LinkUrl = "" Then + Anuncio2Link = LinkUrl + Anuncio2.Cursor = Cursors.Hand + End If + ElseIf Anuncement = "Anuncio3" Then + If Not Title = "" Then + Anuncio3Title.Text = Title + Anuncio3Title.Visible = True + End If + If Not ImageDir = "" Then + Anuncio3.BackgroundImage = GetImageDecripted(ImageDir) + Anuncio3_Image = True + End If + If Not IconDir = "" Then + Anuncio3Icon.BackgroundImage = GetImageDecripted(IconDir) + Anuncio3Icon.Visible = True + End If + If Not Description = "" Then + Anuncio3Des.Text = Description + Anuncio3Des.Visible = True + End If + If Not LinkUrl = "" Then + Anuncio3Link = LinkUrl + Anuncio3.Cursor = Cursors.Hand + End If + ElseIf Anuncement = "Anuncio4" Then + + End If + + Next + + End Sub + + Private Sub OpenAnuncePanel(ByVal Pads As Control) + Dim Max As Integer = 148 + Dim Min As Integer = 35 + If Pads.Height = Min Then + For i As Integer = 0 To 2 + If Pads.Height = Max Then + Exit For + End If + Pads.Height += 1 + i -= 1 + Next + Else + For i As Integer = 0 To 2 + If Pads.Height = Min Then + Exit For + End If + Pads.Height -= 1 + i -= 1 + Next + End If + End Sub + + Private Sub OpenAnunce1Panel() + Dim Max As Integer = 231 + Dim Min As Integer = 35 + If GunaPanel6.Height = Min Then + For i As Integer = 0 To 2 + If GunaPanel6.Height = Max Then + Exit For + End If + GunaPanel6.Height += 1 + i -= 1 + Next + Else + For i As Integer = 0 To 2 + If GunaPanel6.Height = Min Then + Exit For + End If + GunaPanel6.Height -= 1 + i -= 1 + Next + End If + End Sub + + Private Function GetImageDecripted(ByVal stringBase64 As String) As Image + Dim byteArray = ConvertBase64ToByteArray(stringBase64) + Return convertbytetoimage(byteArray) + End Function + +#End Region + +#Region " Anuncio 1 " + + Private Anuncio1Link As String = String.Empty + + Private Sub Anuncio1_Click(sender As Object, e As EventArgs) Handles Anuncio1.Click + If Not Anuncio1Link = String.Empty Then + Process.Start(Anuncio1Link) + End If + End Sub + + Private Sub Anuncio1Title_Click(sender As Object, e As EventArgs) Handles Anuncio1Title.Click + OpenAnunce1Panel() + End Sub + + Private Sub Anuncio1Des_Click(sender As Object, e As EventArgs) Handles Anuncio1Des.Click + OpenAnunce1Panel() + End Sub + +#End Region + +#Region " Anuncio 2 " + + Private Anuncio2Link As String = String.Empty + + Private Sub Anuncio2_Click(sender As Object, e As EventArgs) Handles Anuncio2.Click + If Not Anuncio2Link = String.Empty Then + Process.Start(Anuncio2Link) + End If + End Sub + + Private Sub Anuncio2Title_Click(sender As Object, e As EventArgs) Handles Anuncio2Title.Click + OpenAnuncePanel(GunaPanel2) + End Sub + + Private Sub Anuncio2Des_Click(sender As Object, e As EventArgs) Handles Anuncio2Des.Click + OpenAnuncePanel(GunaPanel2) + End Sub + +#End Region + +#Region " Anuncio 3 " + + Private Anuncio3Link As String = String.Empty + + Private Sub Anuncio3_Click(sender As Object, e As EventArgs) Handles Anuncio3.Click + If Not Anuncio3Link = String.Empty Then + Process.Start(Anuncio3Link) + End If + End Sub + + Private Sub Anuncio3Title_Click(sender As Object, e As EventArgs) Handles Anuncio3Title.Click + OpenAnuncePanel(GunaPanel3) + End Sub + + Private Sub Anuncio3Des_Click(sender As Object, e As EventArgs) Handles Anuncio3Des.Click + OpenAnuncePanel(GunaPanel3) + End Sub + +#End Region + +End Class \ No newline at end of file diff --git a/HALOCELauncher/Controls/Forms/Modsfrm.Designer.vb b/HALOCELauncher/Controls/Forms/Modsfrm.Designer.vb new file mode 100644 index 0000000..ff42b5d --- /dev/null +++ b/HALOCELauncher/Controls/Forms/Modsfrm.Designer.vb @@ -0,0 +1,55 @@ +<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _ +Partial Class Modsfrm + Inherits System.Windows.Forms.Form + + 'Form overrides dispose to clean up the component list. + <System.Diagnostics.DebuggerNonUserCode()> _ + 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 + + 'Required by the Windows Form Designer + Private components As System.ComponentModel.IContainer + + 'NOTE: The following procedure is required by the Windows Form Designer + 'It can be modified using the Windows Form Designer. + 'Do not modify it using the code editor. + <System.Diagnostics.DebuggerStepThrough()> _ + Private Sub InitializeComponent() + Me.GunaPanel1 = New Guna.UI.WinForms.GunaPanel() + Me.SuspendLayout() + ' + 'GunaPanel1 + ' + Me.GunaPanel1.BackColor = System.Drawing.Color.Transparent + Me.GunaPanel1.Dock = System.Windows.Forms.DockStyle.Fill + Me.GunaPanel1.Location = New System.Drawing.Point(0, 0) + Me.GunaPanel1.Name = "GunaPanel1" + Me.GunaPanel1.Size = New System.Drawing.Size(818, 438) + Me.GunaPanel1.TabIndex = 3 + ' + 'Modsfrm + ' + Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) + Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font + Me.BackColor = System.Drawing.Color.FromArgb(CType(CType(64, Byte), Integer), CType(CType(64, Byte), Integer), CType(CType(64, Byte), Integer)) + Me.ClientSize = New System.Drawing.Size(818, 438) + Me.Controls.Add(Me.GunaPanel1) + Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None + Me.MaximizeBox = False + Me.MinimizeBox = False + Me.Name = "Modsfrm" + Me.ShowIcon = False + Me.ShowInTaskbar = False + Me.Text = "Modsfrm" + Me.ResumeLayout(False) + + End Sub + Friend WithEvents GunaPanel1 As Guna.UI.WinForms.GunaPanel +End Class diff --git a/HALOCELauncher/Controls/Forms/Modsfrm.resx b/HALOCELauncher/Controls/Forms/Modsfrm.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/HALOCELauncher/Controls/Forms/Modsfrm.resx @@ -0,0 +1,120 @@ +<?xml version="1.0" encoding="utf-8"?> +<root> + <!-- + Microsoft ResX Schema + + Version 2.0 + + The primary goals of this format is to allow a simple XML format + that is mostly human readable. The generation and parsing of the + various data types are done through the TypeConverter classes + associated with the data types. + + Example: + + ... ado.net/XML headers & schema ... + <resheader name="resmimetype">text/microsoft-resx</resheader> + <resheader name="version">2.0</resheader> + <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader> + <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader> + <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data> + <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data> + <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64"> + <value>[base64 mime encoded serialized .NET Framework object]</value> + </data> + <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> + <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value> + <comment>This is a comment</comment> + </data> + + There are any number of "resheader" rows that contain simple + name/value pairs. + + Each data row contains a name, and value. The row also contains a + type or mimetype. Type corresponds to a .NET class that support + text/value conversion through the TypeConverter architecture. + Classes that don't support this are serialized and stored with the + mimetype set. + + The mimetype is used for serialized objects, and tells the + ResXResourceReader how to depersist the object. This is currently not + extensible. For a given mimetype the value must be set accordingly: + + Note - application/x-microsoft.net.object.binary.base64 is the format + that the ResXResourceWriter will generate, however the reader can + read any of the formats listed below. + + mimetype: application/x-microsoft.net.object.binary.base64 + value : The object must be serialized with + : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter + : and then encoded with base64 encoding. + + mimetype: application/x-microsoft.net.object.soap.base64 + value : The object must be serialized with + : System.Runtime.Serialization.Formatters.Soap.SoapFormatter + : and then encoded with base64 encoding. + + mimetype: application/x-microsoft.net.object.bytearray.base64 + value : The object must be serialized into a byte array + : using a System.ComponentModel.TypeConverter + : and then encoded with base64 encoding. + --> + <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> + <xsd:import namespace="http://www.w3.org/XML/1998/namespace" /> + <xsd:element name="root" msdata:IsDataSet="true"> + <xsd:complexType> + <xsd:choice maxOccurs="unbounded"> + <xsd:element name="metadata"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" /> + </xsd:sequence> + <xsd:attribute name="name" use="required" type="xsd:string" /> + <xsd:attribute name="type" type="xsd:string" /> + <xsd:attribute name="mimetype" type="xsd:string" /> + <xsd:attribute ref="xml:space" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="assembly"> + <xsd:complexType> + <xsd:attribute name="alias" type="xsd:string" /> + <xsd:attribute name="name" type="xsd:string" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="data"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> + <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" /> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" /> + <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" /> + <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" /> + <xsd:attribute ref="xml:space" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="resheader"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required" /> + </xsd:complexType> + </xsd:element> + </xsd:choice> + </xsd:complexType> + </xsd:element> + </xsd:schema> + <resheader name="resmimetype"> + <value>text/microsoft-resx</value> + </resheader> + <resheader name="version"> + <value>2.0</value> + </resheader> + <resheader name="reader"> + <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> + </resheader> + <resheader name="writer"> + <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> + </resheader> +</root> \ No newline at end of file diff --git a/HALOCELauncher/Controls/Forms/Modsfrm.vb b/HALOCELauncher/Controls/Forms/Modsfrm.vb new file mode 100644 index 0000000..4ec74e1 --- /dev/null +++ b/HALOCELauncher/Controls/Forms/Modsfrm.vb @@ -0,0 +1,6 @@ +Public Class Modsfrm + + Private Sub Modsfrm_Load(sender As Object, e As EventArgs) Handles MyBase.Load + + End Sub +End Class \ No newline at end of file diff --git a/HALOCELauncher/Controls/Forms/Servers.Designer.vb b/HALOCELauncher/Controls/Forms/Servers.Designer.vb new file mode 100644 index 0000000..d7e074a --- /dev/null +++ b/HALOCELauncher/Controls/Forms/Servers.Designer.vb @@ -0,0 +1,605 @@ +<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _ +Partial Class Servers + Inherits System.Windows.Forms.Form + + 'Form overrides dispose to clean up the component list. + <System.Diagnostics.DebuggerNonUserCode()> _ + 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 + + 'Required by the Windows Form Designer + Private components As System.ComponentModel.IContainer + + 'NOTE: The following procedure is required by the Windows Form Designer + 'It can be modified using the Windows Form Designer. + 'Do not modify it using the code editor. + <System.Diagnostics.DebuggerStepThrough()> _ + Private Sub InitializeComponent() + Me.components = New System.ComponentModel.Container() + Me.GunaPanel1 = New Guna.UI.WinForms.GunaPanel() + Me.GunaPanel2 = New Guna.UI.WinForms.GunaPanel() + Me.GunaLabel6 = New Guna.UI.WinForms.GunaLabel() + Me.NameTextbox = New Guna.UI.WinForms.GunaTextBox() + Me.GunaButton1 = New Guna.UI.WinForms.GunaButton() + Me.GunaPanel4 = New Guna.UI.WinForms.GunaPanel() + Me.HeaderInformationLbl = New Guna.UI.WinForms.GunaLabel() + Me.PanelContainer = New Guna.UI.WinForms.GunaPanel() + Me.HeaderInfo = New Guna.UI.WinForms.GunaPanel() + Me.GunaLabel7 = New Guna.UI.WinForms.GunaLabel() + Me.GunaLabel5 = New Guna.UI.WinForms.GunaLabel() + Me.GunaLabel4 = New Guna.UI.WinForms.GunaLabel() + Me.GunaLabel3 = New Guna.UI.WinForms.GunaLabel() + Me.GunaLabel2 = New Guna.UI.WinForms.GunaLabel() + Me.GunaLabel1 = New Guna.UI.WinForms.GunaLabel() + Me.GunaPanel3 = New Guna.UI.WinForms.GunaPanel() + Me.nav_mods = New Guna.UI.WinForms.GunaAdvenceButton() + Me.nav_servers = New Guna.UI.WinForms.GunaAdvenceButton() + Me.nav_home = New Guna.UI.WinForms.GunaAdvenceButton() + Me.MenuStripZ1 = New HALOCELauncher.CustomWindowsForm.MenuStripZ() + Me.FileToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem() + Me.ImportFavoritesListToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem() + Me.ExportFavoritesListToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem() + Me.ViewToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem() + Me.ServersToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem() + Me.AddCustomServerToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem() + Me.AddAllServersToFavoritesToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem() + Me.ToolStripSeparator2 = New System.Windows.Forms.ToolStripSeparator() + Me.ConnectToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem() + Me.RefreshServerListToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem() + Me.ToolStripSeparator1 = New System.Windows.Forms.ToolStripSeparator() + Me.DeleteAllServersToFavoritesToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem() + Me.ToolsToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem() + Me.HelpToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem() + Me.HelpTopicsToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem() + Me.ToolStripSeparator3 = New System.Windows.Forms.ToolStripSeparator() + Me.OpencarnagenetToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem() + Me.HALOFixesToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem() + Me.UnknowncheatsmeToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem() + Me.ToolStripSeparator4 = New System.Windows.Forms.ToolStripSeparator() + Me.AboutToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem() + Me.Timer1 = New System.Windows.Forms.Timer(Me.components) + Me.GunaPanel1.SuspendLayout() + Me.GunaPanel2.SuspendLayout() + Me.GunaPanel4.SuspendLayout() + Me.HeaderInfo.SuspendLayout() + Me.GunaPanel3.SuspendLayout() + Me.MenuStripZ1.SuspendLayout() + Me.SuspendLayout() + ' + 'GunaPanel1 + ' + Me.GunaPanel1.BackColor = System.Drawing.Color.Transparent + Me.GunaPanel1.Controls.Add(Me.GunaPanel2) + Me.GunaPanel1.Dock = System.Windows.Forms.DockStyle.Fill + Me.GunaPanel1.Location = New System.Drawing.Point(0, 0) + Me.GunaPanel1.Name = "GunaPanel1" + Me.GunaPanel1.Size = New System.Drawing.Size(818, 438) + Me.GunaPanel1.TabIndex = 3 + ' + 'GunaPanel2 + ' + Me.GunaPanel2.BackColor = System.Drawing.Color.Transparent + Me.GunaPanel2.Controls.Add(Me.GunaLabel6) + Me.GunaPanel2.Controls.Add(Me.NameTextbox) + Me.GunaPanel2.Controls.Add(Me.GunaButton1) + Me.GunaPanel2.Controls.Add(Me.GunaPanel4) + Me.GunaPanel2.Controls.Add(Me.PanelContainer) + Me.GunaPanel2.Controls.Add(Me.HeaderInfo) + Me.GunaPanel2.Controls.Add(Me.GunaPanel3) + Me.GunaPanel2.Controls.Add(Me.MenuStripZ1) + Me.GunaPanel2.Dock = System.Windows.Forms.DockStyle.Fill + Me.GunaPanel2.Location = New System.Drawing.Point(0, 0) + Me.GunaPanel2.Name = "GunaPanel2" + Me.GunaPanel2.Size = New System.Drawing.Size(818, 438) + Me.GunaPanel2.TabIndex = 4 + ' + 'GunaLabel6 + ' + Me.GunaLabel6.AutoSize = True + Me.GunaLabel6.Font = New System.Drawing.Font("Segoe UI", 9.0!) + Me.GunaLabel6.ForeColor = System.Drawing.Color.White + Me.GunaLabel6.Location = New System.Drawing.Point(366, 35) + Me.GunaLabel6.Name = "GunaLabel6" + Me.GunaLabel6.Size = New System.Drawing.Size(77, 15) + Me.GunaLabel6.TabIndex = 50 + Me.GunaLabel6.Text = "Server Invite :" + ' + 'NameTextbox + ' + Me.NameTextbox.BaseColor = System.Drawing.Color.FromArgb(CType(CType(14, Byte), Integer), CType(CType(14, Byte), Integer), CType(CType(14, Byte), Integer)) + Me.NameTextbox.BorderColor = System.Drawing.Color.FromArgb(CType(CType(66, Byte), Integer), CType(CType(58, Byte), Integer), CType(CType(170, Byte), Integer)) + Me.NameTextbox.BorderSize = 1 + Me.NameTextbox.Cursor = System.Windows.Forms.Cursors.IBeam + Me.NameTextbox.FocusedBaseColor = System.Drawing.Color.FromArgb(CType(CType(14, Byte), Integer), CType(CType(14, Byte), Integer), CType(CType(14, Byte), Integer)) + Me.NameTextbox.FocusedBorderColor = System.Drawing.Color.FromArgb(CType(CType(100, Byte), Integer), CType(CType(88, Byte), Integer), CType(CType(255, Byte), Integer)) + Me.NameTextbox.FocusedForeColor = System.Drawing.Color.White + Me.NameTextbox.Font = New System.Drawing.Font("Segoe UI", 9.0!) + Me.NameTextbox.ForeColor = System.Drawing.Color.White + Me.NameTextbox.Location = New System.Drawing.Point(449, 30) + Me.NameTextbox.Name = "NameTextbox" + Me.NameTextbox.PasswordChar = Global.Microsoft.VisualBasic.ChrW(0) + Me.NameTextbox.Size = New System.Drawing.Size(269, 26) + Me.NameTextbox.TabIndex = 49 + ' + 'GunaButton1 + ' + Me.GunaButton1.AnimationHoverSpeed = 0.07! + Me.GunaButton1.AnimationSpeed = 0.03! + Me.GunaButton1.BaseColor = System.Drawing.Color.FromArgb(CType(CType(100, Byte), Integer), CType(CType(88, Byte), Integer), CType(CType(255, Byte), Integer)) + Me.GunaButton1.BorderColor = System.Drawing.Color.Black + Me.GunaButton1.DialogResult = System.Windows.Forms.DialogResult.None + Me.GunaButton1.FocusedColor = System.Drawing.Color.Empty + Me.GunaButton1.Font = New System.Drawing.Font("Segoe UI", 9.0!) + Me.GunaButton1.ForeColor = System.Drawing.Color.White + Me.GunaButton1.Image = Nothing + Me.GunaButton1.ImageAlign = System.Windows.Forms.HorizontalAlignment.Center + Me.GunaButton1.ImageSize = New System.Drawing.Size(20, 20) + Me.GunaButton1.Location = New System.Drawing.Point(724, 30) + Me.GunaButton1.Name = "GunaButton1" + Me.GunaButton1.OnHoverBaseColor = System.Drawing.Color.FromArgb(CType(CType(151, Byte), Integer), CType(CType(143, Byte), Integer), CType(CType(255, Byte), Integer)) + Me.GunaButton1.OnHoverBorderColor = System.Drawing.Color.Black + Me.GunaButton1.OnHoverForeColor = System.Drawing.Color.White + Me.GunaButton1.OnHoverImage = Nothing + Me.GunaButton1.OnPressedColor = System.Drawing.Color.Black + Me.GunaButton1.Size = New System.Drawing.Size(81, 28) + Me.GunaButton1.TabIndex = 48 + Me.GunaButton1.Text = "Launch" + Me.GunaButton1.TextAlign = System.Windows.Forms.HorizontalAlignment.Center + ' + 'GunaPanel4 + ' + Me.GunaPanel4.Controls.Add(Me.HeaderInformationLbl) + Me.GunaPanel4.Location = New System.Drawing.Point(157, 0) + Me.GunaPanel4.Name = "GunaPanel4" + Me.GunaPanel4.Size = New System.Drawing.Size(648, 24) + Me.GunaPanel4.TabIndex = 8 + ' + 'HeaderInformationLbl + ' + Me.HeaderInformationLbl.AutoSize = True + Me.HeaderInformationLbl.Font = New System.Drawing.Font("Segoe UI", 9.0!) + Me.HeaderInformationLbl.ForeColor = System.Drawing.Color.White + Me.HeaderInformationLbl.Location = New System.Drawing.Point(3, 6) + Me.HeaderInformationLbl.Name = "HeaderInformationLbl" + Me.HeaderInformationLbl.Size = New System.Drawing.Size(0, 15) + Me.HeaderInformationLbl.TabIndex = 0 + ' + 'PanelContainer + ' + Me.PanelContainer.Location = New System.Drawing.Point(12, 96) + Me.PanelContainer.Name = "PanelContainer" + Me.PanelContainer.Size = New System.Drawing.Size(793, 330) + Me.PanelContainer.TabIndex = 7 + ' + 'HeaderInfo + ' + Me.HeaderInfo.Controls.Add(Me.GunaLabel7) + Me.HeaderInfo.Controls.Add(Me.GunaLabel5) + Me.HeaderInfo.Controls.Add(Me.GunaLabel4) + Me.HeaderInfo.Controls.Add(Me.GunaLabel3) + Me.HeaderInfo.Controls.Add(Me.GunaLabel2) + Me.HeaderInfo.Controls.Add(Me.GunaLabel1) + Me.HeaderInfo.Location = New System.Drawing.Point(12, 64) + Me.HeaderInfo.Name = "HeaderInfo" + Me.HeaderInfo.Size = New System.Drawing.Size(793, 26) + Me.HeaderInfo.TabIndex = 5 + ' + 'GunaLabel7 + ' + Me.GunaLabel7.AutoSize = True + Me.GunaLabel7.Font = New System.Drawing.Font("Segoe UI", 9.0!) + Me.GunaLabel7.ForeColor = System.Drawing.Color.White + Me.GunaLabel7.Location = New System.Drawing.Point(652, 6) + Me.GunaLabel7.Name = "GunaLabel7" + Me.GunaLabel7.Size = New System.Drawing.Size(63, 15) + Me.GunaLabel7.TabIndex = 5 + Me.GunaLabel7.Text = "Server Info" + ' + 'GunaLabel5 + ' + Me.GunaLabel5.AutoSize = True + Me.GunaLabel5.Font = New System.Drawing.Font("Segoe UI", 9.0!) + Me.GunaLabel5.ForeColor = System.Drawing.Color.White + Me.GunaLabel5.Location = New System.Drawing.Point(391, 6) + Me.GunaLabel5.Name = "GunaLabel5" + Me.GunaLabel5.Size = New System.Drawing.Size(33, 15) + Me.GunaLabel5.TabIndex = 4 + Me.GunaLabel5.Text = "MAP" + ' + 'GunaLabel4 + ' + Me.GunaLabel4.AutoSize = True + Me.GunaLabel4.Font = New System.Drawing.Font("Segoe UI", 9.0!) + Me.GunaLabel4.ForeColor = System.Drawing.Color.White + Me.GunaLabel4.Location = New System.Drawing.Point(484, 6) + Me.GunaLabel4.Name = "GunaLabel4" + Me.GunaLabel4.Size = New System.Drawing.Size(38, 15) + Me.GunaLabel4.TabIndex = 3 + Me.GunaLabel4.Text = "Mode" + ' + 'GunaLabel3 + ' + Me.GunaLabel3.AutoSize = True + Me.GunaLabel3.Font = New System.Drawing.Font("Segoe UI", 9.0!) + Me.GunaLabel3.ForeColor = System.Drawing.Color.White + Me.GunaLabel3.Location = New System.Drawing.Point(333, 6) + Me.GunaLabel3.Name = "GunaLabel3" + Me.GunaLabel3.Size = New System.Drawing.Size(31, 15) + Me.GunaLabel3.TabIndex = 2 + Me.GunaLabel3.Text = "Ping" + ' + 'GunaLabel2 + ' + Me.GunaLabel2.AutoSize = True + Me.GunaLabel2.Font = New System.Drawing.Font("Segoe UI", 9.0!) + Me.GunaLabel2.ForeColor = System.Drawing.Color.White + Me.GunaLabel2.Location = New System.Drawing.Point(260, 6) + Me.GunaLabel2.Name = "GunaLabel2" + Me.GunaLabel2.Size = New System.Drawing.Size(44, 15) + Me.GunaLabel2.TabIndex = 1 + Me.GunaLabel2.Text = "Players" + ' + 'GunaLabel1 + ' + Me.GunaLabel1.AutoSize = True + Me.GunaLabel1.Font = New System.Drawing.Font("Segoe UI", 9.0!) + Me.GunaLabel1.ForeColor = System.Drawing.Color.White + Me.GunaLabel1.Location = New System.Drawing.Point(3, 6) + Me.GunaLabel1.Name = "GunaLabel1" + Me.GunaLabel1.Size = New System.Drawing.Size(64, 15) + Me.GunaLabel1.TabIndex = 0 + Me.GunaLabel1.Text = "HostName" + ' + 'GunaPanel3 + ' + Me.GunaPanel3.BackColor = System.Drawing.Color.Transparent + Me.GunaPanel3.Controls.Add(Me.nav_mods) + Me.GunaPanel3.Controls.Add(Me.nav_servers) + Me.GunaPanel3.Controls.Add(Me.nav_home) + Me.GunaPanel3.Location = New System.Drawing.Point(12, 30) + Me.GunaPanel3.Name = "GunaPanel3" + Me.GunaPanel3.Size = New System.Drawing.Size(339, 28) + Me.GunaPanel3.TabIndex = 3 + ' + 'nav_mods + ' + Me.nav_mods.Animated = True + Me.nav_mods.AnimationHoverSpeed = 0.07! + Me.nav_mods.AnimationSpeed = 0.03! + Me.nav_mods.BaseColor = System.Drawing.Color.Transparent + Me.nav_mods.BorderColor = System.Drawing.Color.Black + Me.nav_mods.ButtonType = Guna.UI.WinForms.AdvenceButtonType.RadioButton + Me.nav_mods.CheckedBaseColor = System.Drawing.Color.Transparent + Me.nav_mods.CheckedBorderColor = System.Drawing.Color.Black + Me.nav_mods.CheckedForeColor = System.Drawing.Color.White + Me.nav_mods.CheckedImage = Nothing + Me.nav_mods.CheckedLineColor = System.Drawing.Color.MediumSpringGreen + Me.nav_mods.DialogResult = System.Windows.Forms.DialogResult.None + Me.nav_mods.Dock = System.Windows.Forms.DockStyle.Left + Me.nav_mods.FocusedColor = System.Drawing.Color.Empty + Me.nav_mods.Font = New System.Drawing.Font("Segoe UI Semibold", 9.0!) + Me.nav_mods.ForeColor = System.Drawing.Color.FromArgb(CType(CType(127, Byte), Integer), CType(CType(131, Byte), Integer), CType(CType(140, Byte), Integer)) + Me.nav_mods.Image = Nothing + Me.nav_mods.ImageSize = New System.Drawing.Size(20, 20) + Me.nav_mods.LineBottom = 2 + Me.nav_mods.LineColor = System.Drawing.Color.Transparent + Me.nav_mods.Location = New System.Drawing.Point(224, 0) + Me.nav_mods.Name = "nav_mods" + Me.nav_mods.OnHoverBaseColor = System.Drawing.Color.Transparent + Me.nav_mods.OnHoverBorderColor = System.Drawing.Color.Black + Me.nav_mods.OnHoverForeColor = System.Drawing.Color.White + Me.nav_mods.OnHoverImage = Nothing + Me.nav_mods.OnHoverLineColor = System.Drawing.Color.MediumSpringGreen + Me.nav_mods.OnPressedColor = System.Drawing.Color.Black + Me.nav_mods.OnPressedDepth = 0 + Me.nav_mods.Size = New System.Drawing.Size(112, 28) + Me.nav_mods.TabIndex = 2 + Me.nav_mods.Text = "Hosted" + Me.nav_mods.TextAlign = System.Windows.Forms.HorizontalAlignment.Center + Me.nav_mods.Visible = False + ' + 'nav_servers + ' + Me.nav_servers.Animated = True + Me.nav_servers.AnimationHoverSpeed = 0.07! + Me.nav_servers.AnimationSpeed = 0.03! + Me.nav_servers.BaseColor = System.Drawing.Color.Transparent + Me.nav_servers.BorderColor = System.Drawing.Color.Black + Me.nav_servers.ButtonType = Guna.UI.WinForms.AdvenceButtonType.RadioButton + Me.nav_servers.CheckedBaseColor = System.Drawing.Color.Transparent + Me.nav_servers.CheckedBorderColor = System.Drawing.Color.Black + Me.nav_servers.CheckedForeColor = System.Drawing.Color.White + Me.nav_servers.CheckedImage = Nothing + Me.nav_servers.CheckedLineColor = System.Drawing.Color.MediumSpringGreen + Me.nav_servers.DialogResult = System.Windows.Forms.DialogResult.None + Me.nav_servers.Dock = System.Windows.Forms.DockStyle.Left + Me.nav_servers.FocusedColor = System.Drawing.Color.Empty + Me.nav_servers.Font = New System.Drawing.Font("Segoe UI Semibold", 9.0!) + Me.nav_servers.ForeColor = System.Drawing.Color.FromArgb(CType(CType(127, Byte), Integer), CType(CType(131, Byte), Integer), CType(CType(140, Byte), Integer)) + Me.nav_servers.Image = Nothing + Me.nav_servers.ImageSize = New System.Drawing.Size(20, 20) + Me.nav_servers.LineBottom = 2 + Me.nav_servers.LineColor = System.Drawing.Color.Transparent + Me.nav_servers.Location = New System.Drawing.Point(112, 0) + Me.nav_servers.Name = "nav_servers" + Me.nav_servers.OnHoverBaseColor = System.Drawing.Color.Transparent + Me.nav_servers.OnHoverBorderColor = System.Drawing.Color.Black + Me.nav_servers.OnHoverForeColor = System.Drawing.Color.White + Me.nav_servers.OnHoverImage = Nothing + Me.nav_servers.OnHoverLineColor = System.Drawing.Color.MediumSpringGreen + Me.nav_servers.OnPressedColor = System.Drawing.Color.Black + Me.nav_servers.OnPressedDepth = 0 + Me.nav_servers.Size = New System.Drawing.Size(112, 28) + Me.nav_servers.TabIndex = 1 + Me.nav_servers.Text = "Internet" + Me.nav_servers.TextAlign = System.Windows.Forms.HorizontalAlignment.Center + ' + 'nav_home + ' + Me.nav_home.Animated = True + Me.nav_home.AnimationHoverSpeed = 0.07! + Me.nav_home.AnimationSpeed = 0.03! + Me.nav_home.BaseColor = System.Drawing.Color.Transparent + Me.nav_home.BorderColor = System.Drawing.Color.Black + Me.nav_home.ButtonType = Guna.UI.WinForms.AdvenceButtonType.RadioButton + Me.nav_home.Checked = True + Me.nav_home.CheckedBaseColor = System.Drawing.Color.Transparent + Me.nav_home.CheckedBorderColor = System.Drawing.Color.Black + Me.nav_home.CheckedForeColor = System.Drawing.Color.White + Me.nav_home.CheckedImage = Nothing + Me.nav_home.CheckedLineColor = System.Drawing.Color.MediumSpringGreen + Me.nav_home.DialogResult = System.Windows.Forms.DialogResult.None + Me.nav_home.Dock = System.Windows.Forms.DockStyle.Left + Me.nav_home.FocusedColor = System.Drawing.Color.Empty + Me.nav_home.Font = New System.Drawing.Font("Segoe UI Semibold", 9.0!) + Me.nav_home.ForeColor = System.Drawing.Color.FromArgb(CType(CType(127, Byte), Integer), CType(CType(131, Byte), Integer), CType(CType(140, Byte), Integer)) + Me.nav_home.Image = Nothing + Me.nav_home.ImageSize = New System.Drawing.Size(20, 20) + Me.nav_home.LineBottom = 2 + Me.nav_home.LineColor = System.Drawing.Color.Transparent + Me.nav_home.Location = New System.Drawing.Point(0, 0) + Me.nav_home.Name = "nav_home" + Me.nav_home.OnHoverBaseColor = System.Drawing.Color.Transparent + Me.nav_home.OnHoverBorderColor = System.Drawing.Color.Black + Me.nav_home.OnHoverForeColor = System.Drawing.Color.White + Me.nav_home.OnHoverImage = Nothing + Me.nav_home.OnHoverLineColor = System.Drawing.Color.MediumSpringGreen + Me.nav_home.OnPressedColor = System.Drawing.Color.Black + Me.nav_home.OnPressedDepth = 0 + Me.nav_home.Size = New System.Drawing.Size(112, 28) + Me.nav_home.TabIndex = 0 + Me.nav_home.Text = "Favorites" + Me.nav_home.TextAlign = System.Windows.Forms.HorizontalAlignment.Center + ' + 'MenuStripZ1 + ' + Me.MenuStripZ1.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.FileToolStripMenuItem, Me.ViewToolStripMenuItem, Me.ServersToolStripMenuItem, Me.ToolsToolStripMenuItem, Me.HelpToolStripMenuItem}) + Me.MenuStripZ1.Location = New System.Drawing.Point(0, 0) + Me.MenuStripZ1.Name = "MenuStripZ1" + Me.MenuStripZ1.Size = New System.Drawing.Size(818, 24) + Me.MenuStripZ1.TabIndex = 4 + Me.MenuStripZ1.Text = "MenuStripZ1" + ' + 'FileToolStripMenuItem + ' + Me.FileToolStripMenuItem.DropDownItems.AddRange(New System.Windows.Forms.ToolStripItem() {Me.ImportFavoritesListToolStripMenuItem, Me.ExportFavoritesListToolStripMenuItem}) + Me.FileToolStripMenuItem.ForeColor = System.Drawing.Color.White + Me.FileToolStripMenuItem.Name = "FileToolStripMenuItem" + Me.FileToolStripMenuItem.Size = New System.Drawing.Size(37, 20) + Me.FileToolStripMenuItem.Text = "File" + ' + 'ImportFavoritesListToolStripMenuItem + ' + Me.ImportFavoritesListToolStripMenuItem.ForeColor = System.Drawing.Color.White + Me.ImportFavoritesListToolStripMenuItem.Name = "ImportFavoritesListToolStripMenuItem" + Me.ImportFavoritesListToolStripMenuItem.Size = New System.Drawing.Size(181, 22) + Me.ImportFavoritesListToolStripMenuItem.Text = "Import Favorites List" + ' + 'ExportFavoritesListToolStripMenuItem + ' + Me.ExportFavoritesListToolStripMenuItem.ForeColor = System.Drawing.Color.White + Me.ExportFavoritesListToolStripMenuItem.Name = "ExportFavoritesListToolStripMenuItem" + Me.ExportFavoritesListToolStripMenuItem.Size = New System.Drawing.Size(181, 22) + Me.ExportFavoritesListToolStripMenuItem.Text = "Export Favorites List" + ' + 'ViewToolStripMenuItem + ' + Me.ViewToolStripMenuItem.ForeColor = System.Drawing.Color.White + Me.ViewToolStripMenuItem.Name = "ViewToolStripMenuItem" + Me.ViewToolStripMenuItem.Size = New System.Drawing.Size(44, 20) + Me.ViewToolStripMenuItem.Text = "View" + Me.ViewToolStripMenuItem.Visible = False + ' + 'ServersToolStripMenuItem + ' + Me.ServersToolStripMenuItem.DropDownItems.AddRange(New System.Windows.Forms.ToolStripItem() {Me.AddCustomServerToolStripMenuItem, Me.AddAllServersToFavoritesToolStripMenuItem, Me.ToolStripSeparator2, Me.ConnectToolStripMenuItem, Me.RefreshServerListToolStripMenuItem, Me.ToolStripSeparator1, Me.DeleteAllServersToFavoritesToolStripMenuItem}) + Me.ServersToolStripMenuItem.ForeColor = System.Drawing.Color.White + Me.ServersToolStripMenuItem.Name = "ServersToolStripMenuItem" + Me.ServersToolStripMenuItem.Size = New System.Drawing.Size(56, 20) + Me.ServersToolStripMenuItem.Text = "Servers" + ' + 'AddCustomServerToolStripMenuItem + ' + Me.AddCustomServerToolStripMenuItem.ForeColor = System.Drawing.Color.White + Me.AddCustomServerToolStripMenuItem.Name = "AddCustomServerToolStripMenuItem" + Me.AddCustomServerToolStripMenuItem.Size = New System.Drawing.Size(226, 22) + Me.AddCustomServerToolStripMenuItem.Text = "Add Custom Server" + ' + 'AddAllServersToFavoritesToolStripMenuItem + ' + Me.AddAllServersToFavoritesToolStripMenuItem.ForeColor = System.Drawing.Color.White + Me.AddAllServersToFavoritesToolStripMenuItem.Name = "AddAllServersToFavoritesToolStripMenuItem" + Me.AddAllServersToFavoritesToolStripMenuItem.Size = New System.Drawing.Size(226, 22) + Me.AddAllServersToFavoritesToolStripMenuItem.Text = "Add All Servers To favorites" + ' + 'ToolStripSeparator2 + ' + Me.ToolStripSeparator2.Name = "ToolStripSeparator2" + Me.ToolStripSeparator2.Size = New System.Drawing.Size(223, 6) + ' + 'ConnectToolStripMenuItem + ' + Me.ConnectToolStripMenuItem.ForeColor = System.Drawing.Color.White + Me.ConnectToolStripMenuItem.Name = "ConnectToolStripMenuItem" + Me.ConnectToolStripMenuItem.Size = New System.Drawing.Size(226, 22) + Me.ConnectToolStripMenuItem.Text = "Refresh Favorites List" + ' + 'RefreshServerListToolStripMenuItem + ' + Me.RefreshServerListToolStripMenuItem.ForeColor = System.Drawing.Color.White + Me.RefreshServerListToolStripMenuItem.Name = "RefreshServerListToolStripMenuItem" + Me.RefreshServerListToolStripMenuItem.Size = New System.Drawing.Size(226, 22) + Me.RefreshServerListToolStripMenuItem.Text = "Refresh Internet List" + ' + 'ToolStripSeparator1 + ' + Me.ToolStripSeparator1.Name = "ToolStripSeparator1" + Me.ToolStripSeparator1.Size = New System.Drawing.Size(223, 6) + ' + 'DeleteAllServersToFavoritesToolStripMenuItem + ' + Me.DeleteAllServersToFavoritesToolStripMenuItem.ForeColor = System.Drawing.Color.White + Me.DeleteAllServersToFavoritesToolStripMenuItem.Name = "DeleteAllServersToFavoritesToolStripMenuItem" + Me.DeleteAllServersToFavoritesToolStripMenuItem.Size = New System.Drawing.Size(226, 22) + Me.DeleteAllServersToFavoritesToolStripMenuItem.Text = "Delete All Servers to favorites" + ' + 'ToolsToolStripMenuItem + ' + Me.ToolsToolStripMenuItem.ForeColor = System.Drawing.Color.White + Me.ToolsToolStripMenuItem.Name = "ToolsToolStripMenuItem" + Me.ToolsToolStripMenuItem.Size = New System.Drawing.Size(48, 20) + Me.ToolsToolStripMenuItem.Text = "Tools" + Me.ToolsToolStripMenuItem.Visible = False + ' + 'HelpToolStripMenuItem + ' + Me.HelpToolStripMenuItem.DropDownItems.AddRange(New System.Windows.Forms.ToolStripItem() {Me.HelpTopicsToolStripMenuItem, Me.ToolStripSeparator3, Me.OpencarnagenetToolStripMenuItem, Me.HALOFixesToolStripMenuItem, Me.UnknowncheatsmeToolStripMenuItem, Me.ToolStripSeparator4, Me.AboutToolStripMenuItem}) + Me.HelpToolStripMenuItem.ForeColor = System.Drawing.Color.White + Me.HelpToolStripMenuItem.Name = "HelpToolStripMenuItem" + Me.HelpToolStripMenuItem.Size = New System.Drawing.Size(44, 20) + Me.HelpToolStripMenuItem.Text = "Help" + ' + 'HelpTopicsToolStripMenuItem + ' + Me.HelpTopicsToolStripMenuItem.ForeColor = System.Drawing.Color.White + Me.HelpTopicsToolStripMenuItem.Name = "HelpTopicsToolStripMenuItem" + Me.HelpTopicsToolStripMenuItem.Size = New System.Drawing.Size(179, 22) + Me.HelpTopicsToolStripMenuItem.Text = "Help Topics" + ' + 'ToolStripSeparator3 + ' + Me.ToolStripSeparator3.Name = "ToolStripSeparator3" + Me.ToolStripSeparator3.Size = New System.Drawing.Size(176, 6) + ' + 'OpencarnagenetToolStripMenuItem + ' + Me.OpencarnagenetToolStripMenuItem.ForeColor = System.Drawing.Color.White + Me.OpencarnagenetToolStripMenuItem.Name = "OpencarnagenetToolStripMenuItem" + Me.OpencarnagenetToolStripMenuItem.Size = New System.Drawing.Size(179, 22) + Me.OpencarnagenetToolStripMenuItem.Text = "Opencarnage.net" + ' + 'HALOFixesToolStripMenuItem + ' + Me.HALOFixesToolStripMenuItem.ForeColor = System.Drawing.Color.White + Me.HALOFixesToolStripMenuItem.Name = "HALOFixesToolStripMenuItem" + Me.HALOFixesToolStripMenuItem.Size = New System.Drawing.Size(179, 22) + Me.HALOFixesToolStripMenuItem.Text = "HALO Fixes" + ' + 'UnknowncheatsmeToolStripMenuItem + ' + Me.UnknowncheatsmeToolStripMenuItem.ForeColor = System.Drawing.Color.White + Me.UnknowncheatsmeToolStripMenuItem.Name = "UnknowncheatsmeToolStripMenuItem" + Me.UnknowncheatsmeToolStripMenuItem.Size = New System.Drawing.Size(179, 22) + Me.UnknowncheatsmeToolStripMenuItem.Text = "Unknowncheats.me" + ' + 'ToolStripSeparator4 + ' + Me.ToolStripSeparator4.Name = "ToolStripSeparator4" + Me.ToolStripSeparator4.Size = New System.Drawing.Size(176, 6) + ' + 'AboutToolStripMenuItem + ' + Me.AboutToolStripMenuItem.ForeColor = System.Drawing.Color.White + Me.AboutToolStripMenuItem.Name = "AboutToolStripMenuItem" + Me.AboutToolStripMenuItem.Size = New System.Drawing.Size(179, 22) + Me.AboutToolStripMenuItem.Text = "About" + ' + 'Timer1 + ' + Me.Timer1.Enabled = True + Me.Timer1.Interval = 1 + ' + 'Servers + ' + Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) + Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font + Me.BackColor = System.Drawing.Color.FromArgb(CType(CType(64, Byte), Integer), CType(CType(64, Byte), Integer), CType(CType(64, Byte), Integer)) + Me.ClientSize = New System.Drawing.Size(818, 438) + Me.Controls.Add(Me.GunaPanel1) + Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None + Me.MainMenuStrip = Me.MenuStripZ1 + Me.Name = "Servers" + Me.Text = "Servers" + Me.GunaPanel1.ResumeLayout(False) + Me.GunaPanel2.ResumeLayout(False) + Me.GunaPanel2.PerformLayout() + Me.GunaPanel4.ResumeLayout(False) + Me.GunaPanel4.PerformLayout() + Me.HeaderInfo.ResumeLayout(False) + Me.HeaderInfo.PerformLayout() + Me.GunaPanel3.ResumeLayout(False) + Me.MenuStripZ1.ResumeLayout(False) + Me.MenuStripZ1.PerformLayout() + Me.ResumeLayout(False) + + End Sub + Friend WithEvents GunaPanel1 As Guna.UI.WinForms.GunaPanel + Friend WithEvents GunaPanel2 As Guna.UI.WinForms.GunaPanel + Friend WithEvents GunaPanel3 As Guna.UI.WinForms.GunaPanel + Friend WithEvents nav_mods As Guna.UI.WinForms.GunaAdvenceButton + Friend WithEvents nav_servers As Guna.UI.WinForms.GunaAdvenceButton + Friend WithEvents nav_home As Guna.UI.WinForms.GunaAdvenceButton + Friend WithEvents MenuStripZ1 As HALOCELauncher.CustomWindowsForm.MenuStripZ + Friend WithEvents FileToolStripMenuItem As System.Windows.Forms.ToolStripMenuItem + Friend WithEvents ImportFavoritesListToolStripMenuItem As System.Windows.Forms.ToolStripMenuItem + Friend WithEvents ExportFavoritesListToolStripMenuItem As System.Windows.Forms.ToolStripMenuItem + Friend WithEvents ViewToolStripMenuItem As System.Windows.Forms.ToolStripMenuItem + Friend WithEvents ServersToolStripMenuItem As System.Windows.Forms.ToolStripMenuItem + Friend WithEvents HelpToolStripMenuItem As System.Windows.Forms.ToolStripMenuItem + Friend WithEvents ConnectToolStripMenuItem As System.Windows.Forms.ToolStripMenuItem + Friend WithEvents ToolStripSeparator1 As System.Windows.Forms.ToolStripSeparator + Friend WithEvents ToolStripSeparator2 As System.Windows.Forms.ToolStripSeparator + Friend WithEvents HelpTopicsToolStripMenuItem As System.Windows.Forms.ToolStripMenuItem + Friend WithEvents ToolStripSeparator3 As System.Windows.Forms.ToolStripSeparator + Friend WithEvents OpencarnagenetToolStripMenuItem As System.Windows.Forms.ToolStripMenuItem + Friend WithEvents HALOFixesToolStripMenuItem As System.Windows.Forms.ToolStripMenuItem + Friend WithEvents UnknowncheatsmeToolStripMenuItem As System.Windows.Forms.ToolStripMenuItem + Friend WithEvents ToolStripSeparator4 As System.Windows.Forms.ToolStripSeparator + Friend WithEvents AboutToolStripMenuItem As System.Windows.Forms.ToolStripMenuItem + Friend WithEvents ToolsToolStripMenuItem As System.Windows.Forms.ToolStripMenuItem + Friend WithEvents HeaderInfo As Guna.UI.WinForms.GunaPanel + Friend WithEvents GunaLabel4 As Guna.UI.WinForms.GunaLabel + Friend WithEvents GunaLabel3 As Guna.UI.WinForms.GunaLabel + Friend WithEvents GunaLabel2 As Guna.UI.WinForms.GunaLabel + Friend WithEvents GunaLabel1 As Guna.UI.WinForms.GunaLabel + Friend WithEvents PanelContainer As Guna.UI.WinForms.GunaPanel + Friend WithEvents GunaLabel5 As Guna.UI.WinForms.GunaLabel + Friend WithEvents RefreshServerListToolStripMenuItem As System.Windows.Forms.ToolStripMenuItem + Friend WithEvents AddCustomServerToolStripMenuItem As System.Windows.Forms.ToolStripMenuItem + Friend WithEvents GunaLabel7 As Guna.UI.WinForms.GunaLabel + Friend WithEvents GunaPanel4 As Guna.UI.WinForms.GunaPanel + Friend WithEvents HeaderInformationLbl As Guna.UI.WinForms.GunaLabel + Friend WithEvents Timer1 As System.Windows.Forms.Timer + Friend WithEvents AddAllServersToFavoritesToolStripMenuItem As System.Windows.Forms.ToolStripMenuItem + Friend WithEvents DeleteAllServersToFavoritesToolStripMenuItem As System.Windows.Forms.ToolStripMenuItem + Friend WithEvents GunaButton1 As Guna.UI.WinForms.GunaButton + Friend WithEvents GunaLabel6 As Guna.UI.WinForms.GunaLabel + Friend WithEvents NameTextbox As Guna.UI.WinForms.GunaTextBox +End Class diff --git a/HALOCELauncher/Controls/Forms/Servers.resx b/HALOCELauncher/Controls/Forms/Servers.resx new file mode 100644 index 0000000..dac18b0 --- /dev/null +++ b/HALOCELauncher/Controls/Forms/Servers.resx @@ -0,0 +1,126 @@ +<?xml version="1.0" encoding="utf-8"?> +<root> + <!-- + Microsoft ResX Schema + + Version 2.0 + + The primary goals of this format is to allow a simple XML format + that is mostly human readable. The generation and parsing of the + various data types are done through the TypeConverter classes + associated with the data types. + + Example: + + ... ado.net/XML headers & schema ... + <resheader name="resmimetype">text/microsoft-resx</resheader> + <resheader name="version">2.0</resheader> + <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader> + <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader> + <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data> + <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data> + <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64"> + <value>[base64 mime encoded serialized .NET Framework object]</value> + </data> + <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> + <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value> + <comment>This is a comment</comment> + </data> + + There are any number of "resheader" rows that contain simple + name/value pairs. + + Each data row contains a name, and value. The row also contains a + type or mimetype. Type corresponds to a .NET class that support + text/value conversion through the TypeConverter architecture. + Classes that don't support this are serialized and stored with the + mimetype set. + + The mimetype is used for serialized objects, and tells the + ResXResourceReader how to depersist the object. This is currently not + extensible. For a given mimetype the value must be set accordingly: + + Note - application/x-microsoft.net.object.binary.base64 is the format + that the ResXResourceWriter will generate, however the reader can + read any of the formats listed below. + + mimetype: application/x-microsoft.net.object.binary.base64 + value : The object must be serialized with + : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter + : and then encoded with base64 encoding. + + mimetype: application/x-microsoft.net.object.soap.base64 + value : The object must be serialized with + : System.Runtime.Serialization.Formatters.Soap.SoapFormatter + : and then encoded with base64 encoding. + + mimetype: application/x-microsoft.net.object.bytearray.base64 + value : The object must be serialized into a byte array + : using a System.ComponentModel.TypeConverter + : and then encoded with base64 encoding. + --> + <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> + <xsd:import namespace="http://www.w3.org/XML/1998/namespace" /> + <xsd:element name="root" msdata:IsDataSet="true"> + <xsd:complexType> + <xsd:choice maxOccurs="unbounded"> + <xsd:element name="metadata"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" /> + </xsd:sequence> + <xsd:attribute name="name" use="required" type="xsd:string" /> + <xsd:attribute name="type" type="xsd:string" /> + <xsd:attribute name="mimetype" type="xsd:string" /> + <xsd:attribute ref="xml:space" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="assembly"> + <xsd:complexType> + <xsd:attribute name="alias" type="xsd:string" /> + <xsd:attribute name="name" type="xsd:string" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="data"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> + <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" /> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" /> + <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" /> + <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" /> + <xsd:attribute ref="xml:space" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="resheader"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required" /> + </xsd:complexType> + </xsd:element> + </xsd:choice> + </xsd:complexType> + </xsd:element> + </xsd:schema> + <resheader name="resmimetype"> + <value>text/microsoft-resx</value> + </resheader> + <resheader name="version"> + <value>2.0</value> + </resheader> + <resheader name="reader"> + <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> + </resheader> + <resheader name="writer"> + <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> + </resheader> + <metadata name="MenuStripZ1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> + <value>17, 17</value> + </metadata> + <metadata name="Timer1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> + <value>139, 17</value> + </metadata> +</root> \ No newline at end of file diff --git a/HALOCELauncher/Controls/Forms/Servers.vb b/HALOCELauncher/Controls/Forms/Servers.vb new file mode 100644 index 0000000..0b17b93 --- /dev/null +++ b/HALOCELauncher/Controls/Forms/Servers.vb @@ -0,0 +1,217 @@ +Imports HALOCELauncher.Core.Utils +Imports HALOCELauncher.Core.SvManager.SvFormatManager +Imports HALOCELauncher.Core.GameTracker +Imports HALOCELauncher.Core.Helpers +Imports HALOCELauncher.HaloQuery.HaloServerInfo +Imports HALOCELauncher.HaloQuery + +Public Class Servers + + Private FavoritesControl As FavoritiesC = New FavoritiesC + Private InternetControl As InternetC = New InternetC + Public Property LoadA As Boolean = False + + Private Sub Servers_Load(sender As Object, e As EventArgs) Handles MyBase.Load + SetStyle(ControlStyles.SupportsTransparentBackColor, True) + Me.BackColor = Color.Transparent + Me.Refresh() + ' StartAll() + End Sub + + Public Sub UpdateFavoriteTable() + FavoritesControl.UpdateAll() + End Sub + + Public Function CallWriteAllServerTofavorites() As Boolean + InternetControl.WriteAllServerTofavorites() + FavoritesControl.UpdateAll() + End Function + + Public Overrides Sub Refresh() + Dim Aplyblur1 As New GetBlurBitmap(Me.HeaderInfo) + Dim Aplyblur2 As New GetBlurBitmap(Me.GunaPanel4) + MyBase.Refresh() + End Sub + +#Region " Parent Dragger " + + Private Dragger As ControlDragger = ControlDragger.Empty + + Private Sub InitializeDrag() + + Me.Dragger = New ControlDragger(Me, Form1) + Me.Dragger = New ControlDragger(GunaPanel4, Form1) + Me.Dragger = New ControlDragger(GunaPanel2, Form1) + Me.Dragger = New ControlDragger(HeaderInfo, Form1) + + For Each Cdrag As Control In HeaderInfo.Controls + Me.Dragger = New ControlDragger(Cdrag, Form1) + Next + + Me.Dragger.Enabled = True + End Sub + + Private Sub AlternateDrag() + Dragger.Enabled = Not Dragger.Enabled + End Sub + + Private Sub FinishDrag() + Dragger.Dispose() + End Sub + + Private Sub Drag() Handles MyBase.Shown + Me.InitializeDrag() + End Sub + +#End Region + + Public Sub StartAll() + LoadForms() + End Sub + + Private Sub LoadForms() + AddShowForm(FavoritesControl) + AddShowForm(InternetControl) + End Sub + + + Public Sub AddShowForm(ByVal LocalForm As Control) + PanelContainer.Controls.Add(LocalForm) + LocalForm.Location = New Point(0, 0) + End Sub + + Private Sub nav_home_CheckedChanged(sender As Object, e As EventArgs) Handles nav_home.CheckedChanged + If nav_home.Checked Then + FavoritesControl.BringToFront() + FavoritesTap() + End If + End Sub + + Private Sub FavoritesTap() + RefreshServerListToolStripMenuItem.Visible = False + DeleteAllServersToFavoritesToolStripMenuItem.Visible = True + ImportFavoritesListToolStripMenuItem.Enabled = True + AddAllServersToFavoritesToolStripMenuItem.Visible = False + If ExistsXmlServer() = True Then + ExportFavoritesListToolStripMenuItem.Enabled = True + End If + End Sub + + Dim LoadServers As Boolean = False + Private Sub nav_servers_CheckedChanged(sender As Object, e As EventArgs) Handles nav_servers.CheckedChanged + If nav_servers.Checked Then + InternetControl.BringToFront() + ServersTap() + If LoadServers = False Then + InternetControl.StartControls() + LoadServers = True + End If + End If + End Sub + + Private Sub ServersTap() + DeleteAllServersToFavoritesToolStripMenuItem.Visible = False + AddAllServersToFavoritesToolStripMenuItem.Visible = True + RefreshServerListToolStripMenuItem.Visible = True + ImportFavoritesListToolStripMenuItem.Enabled = False + ExportFavoritesListToolStripMenuItem.Enabled = False + End Sub + +#Region " File TapStrip " + + Private Sub ExportFavoritesListToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles ExportFavoritesListToolStripMenuItem.Click + Dim SaveXmlNew As String = save("HALO SERVERS", "Halo Launcher Database (*.xml)|*.xml") + If Not SaveXmlNew = "Error" Then + IO.File.Copy(xml_svlist, SaveXmlNew) + End If + End Sub + + Private Sub ImportFavoritesListToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles ImportFavoritesListToolStripMenuItem.Click + Dim OpenXmlNew As String = open("Halo Launcher Database (*.xml)|*.xml") + If Not OpenXmlNew = "Error" Then + Dim AddNewServers As Boolean = UpdateFromExternal(OpenXmlNew) + If AddNewServers = True Then + UpdateFavoriteTable() + End If + End If + End Sub + +#End Region + +#Region " Server TapStrip " + + Private Sub AddCustomServerToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles AddCustomServerToolStripMenuItem.Click + AddCustomServer.ShowDialog() + End Sub + + Private Sub DeleteAllServersToFavoritesToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles DeleteAllServersToFavoritesToolStripMenuItem.Click + If IO.File.Exists(xml_svlist) = True Then + IO.File.Delete(xml_svlist) + End If + FavoritesControl.UpdateAll() + End Sub + + Private Sub AddAllServersToFavoritesToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles AddAllServersToFavoritesToolStripMenuItem.Click + CallWriteAllServerTofavorites() + End Sub + + Private Sub ConnectToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles ConnectToolStripMenuItem.Click + FavoritesControl.UpdateAll() + End Sub + + Private Sub RefreshServerListToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles RefreshServerListToolStripMenuItem.Click + InternetControl.UpdateAll() + End Sub + +#End Region + +#Region " Help TapStrip " + + Private Sub HelpTopicsToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles HelpTopicsToolStripMenuItem.Click + Process.Start("https://opencarnage.net/index.php?/topic/8139-halo-launcher-for-pc-and-ce-hlpce-realses/") + End Sub + + Private Sub OpencarnagenetToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles OpencarnagenetToolStripMenuItem.Click + Process.Start("https://opencarnage.net/") + End Sub + + Private Sub HALOFixesToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles HALOFixesToolStripMenuItem.Click + Process.Start("https://halo-fixes.forumotion.com/forum") + End Sub + + Private Sub UnknowncheatsmeToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles UnknowncheatsmeToolStripMenuItem.Click + Process.Start("https://www.unknowncheats.me/") + End Sub + + Private Sub AboutToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles AboutToolStripMenuItem.Click + AboutForm.ShowDialog() + End Sub + +#End Region + + + Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick + Dim FavoritesCount As Integer = FavoritesControl.ServerCounter + HeaderInformationLbl.Text = "Favorite Servers: " & FavoritesCount + If UpdateAe = True Then + FavoritesControl.UpdateAll() + UpdateAe = False + End If + End Sub + + Private Sub GunaButton1_Click(sender As Object, e As EventArgs) Handles GunaButton1.Click + If Not NameTextbox.Text = "" Then + Dim IPAdress As String = Core.Utils.Compression.DecompressData(NameTextbox.Text) + Dim TyperGame As Integer = My.Settings.GameDefect + If TyperGame = 0 Then + Dim NewLauncher As New Core.Launcher(My.Settings.GameDirCE) + NewLauncher.Launch(IPAdress) + ElseIf TyperGame = 1 Then + Dim NewLauncher As New Core.Launcher(My.Settings.GameDirPC) + NewLauncher.Launch(IPAdress) + End If + End If + End Sub + + +End Class \ No newline at end of file diff --git a/HALOCELauncher/Controls/Forms/Settingfrm.Designer.vb b/HALOCELauncher/Controls/Forms/Settingfrm.Designer.vb new file mode 100644 index 0000000..c4e73a1 --- /dev/null +++ b/HALOCELauncher/Controls/Forms/Settingfrm.Designer.vb @@ -0,0 +1,655 @@ +<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _ +Partial Class Settingfrm + Inherits System.Windows.Forms.Form + + 'Form overrides dispose to clean up the component list. + <System.Diagnostics.DebuggerNonUserCode()> _ + 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 + + 'Required by the Windows Form Designer + Private components As System.ComponentModel.IContainer + + 'NOTE: The following procedure is required by the Windows Form Designer + 'It can be modified using the Windows Form Designer. + 'Do not modify it using the code editor. + <System.Diagnostics.DebuggerStepThrough()> _ + Private Sub InitializeComponent() + Me.components = New System.ComponentModel.Container() + Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(Settingfrm)) + Me.GunaPanel1 = New Guna.UI.WinForms.GunaPanel() + Me.Panel1 = New System.Windows.Forms.Panel() + Me.GunaButton5 = New Guna.UI.WinForms.GunaButton() + Me.GunaLabel8 = New Guna.UI.WinForms.GunaLabel() + Me.GunaComboBox2 = New Guna.UI.WinForms.GunaComboBox() + Me.GunaPanel6 = New Guna.UI.WinForms.GunaPanel() + Me.GunaLabel7 = New Guna.UI.WinForms.GunaLabel() + Me.GunaButton3 = New Guna.UI.WinForms.GunaButton() + Me.GunaButton2 = New Guna.UI.WinForms.GunaButton() + Me.GunaPanel2 = New Guna.UI.WinForms.GunaPanel() + Me.GunaButton4 = New Guna.UI.WinForms.GunaButton() + Me.PCdirTextBox1 = New Guna.UI.WinForms.GunaTextBox() + Me.GunaLabel6 = New Guna.UI.WinForms.GunaLabel() + Me.GunaLabel5 = New Guna.UI.WinForms.GunaLabel() + Me.GunaComboBox1 = New Guna.UI.WinForms.GunaComboBox() + Me.GunaPanel5 = New Guna.UI.WinForms.GunaPanel() + Me.GunaLabel4 = New Guna.UI.WinForms.GunaLabel() + Me.GunaCheckBox8 = New Guna.UI.WinForms.GunaCheckBox() + Me.GunaCheckBox7 = New Guna.UI.WinForms.GunaCheckBox() + Me.GunaCheckBox6 = New Guna.UI.WinForms.GunaCheckBox() + Me.GunaCheckBox5 = New Guna.UI.WinForms.GunaCheckBox() + Me.GunaCheckBox4 = New Guna.UI.WinForms.GunaCheckBox() + Me.GunaCheckBox3 = New Guna.UI.WinForms.GunaCheckBox() + Me.GunaCheckBox2 = New Guna.UI.WinForms.GunaCheckBox() + Me.GunaCheckBox1 = New Guna.UI.WinForms.GunaCheckBox() + Me.GunaPanel4 = New Guna.UI.WinForms.GunaPanel() + Me.GunaLabel3 = New Guna.UI.WinForms.GunaLabel() + Me.GunaPanel3 = New Guna.UI.WinForms.GunaPanel() + Me.GunaLabel2 = New Guna.UI.WinForms.GunaLabel() + Me.GunaButton1 = New Guna.UI.WinForms.GunaButton() + Me.CEdirTextbox = New Guna.UI.WinForms.GunaTextBox() + Me.GunaLabel1 = New Guna.UI.WinForms.GunaLabel() + Me.Timer1 = New System.Windows.Forms.Timer(Me.components) + Me.BoosterToolTip1 = New HALOCELauncher.BoosterToolTip() + Me.GunaButton6 = New Guna.UI.WinForms.GunaButton() + Me.GunaPanel1.SuspendLayout() + Me.Panel1.SuspendLayout() + Me.GunaPanel6.SuspendLayout() + Me.GunaPanel2.SuspendLayout() + Me.GunaPanel5.SuspendLayout() + Me.GunaPanel4.SuspendLayout() + Me.GunaPanel3.SuspendLayout() + Me.SuspendLayout() + ' + 'GunaPanel1 + ' + Me.GunaPanel1.Controls.Add(Me.Panel1) + Me.GunaPanel1.Controls.Add(Me.GunaPanel2) + Me.GunaPanel1.Dock = System.Windows.Forms.DockStyle.Fill + Me.GunaPanel1.Location = New System.Drawing.Point(0, 0) + Me.GunaPanel1.Name = "GunaPanel1" + Me.GunaPanel1.Size = New System.Drawing.Size(818, 438) + Me.GunaPanel1.TabIndex = 0 + ' + 'Panel1 + ' + Me.Panel1.Controls.Add(Me.GunaButton5) + Me.Panel1.Controls.Add(Me.GunaLabel8) + Me.Panel1.Controls.Add(Me.GunaComboBox2) + Me.Panel1.Controls.Add(Me.GunaPanel6) + Me.Panel1.Controls.Add(Me.GunaButton3) + Me.Panel1.Controls.Add(Me.GunaButton2) + Me.Panel1.Location = New System.Drawing.Point(449, 12) + Me.Panel1.Name = "Panel1" + Me.Panel1.Size = New System.Drawing.Size(357, 414) + Me.Panel1.TabIndex = 49 + ' + 'GunaButton5 + ' + Me.GunaButton5.AnimationHoverSpeed = 0.07! + Me.GunaButton5.AnimationSpeed = 0.03! + Me.GunaButton5.BaseColor = System.Drawing.Color.FromArgb(CType(CType(100, Byte), Integer), CType(CType(88, Byte), Integer), CType(CType(255, Byte), Integer)) + Me.GunaButton5.BorderColor = System.Drawing.Color.Black + Me.GunaButton5.DialogResult = System.Windows.Forms.DialogResult.None + Me.GunaButton5.FocusedColor = System.Drawing.Color.Empty + Me.GunaButton5.Font = New System.Drawing.Font("Segoe UI", 9.0!) + Me.GunaButton5.ForeColor = System.Drawing.Color.White + Me.GunaButton5.Image = Nothing + Me.GunaButton5.ImageAlign = System.Windows.Forms.HorizontalAlignment.Center + Me.GunaButton5.ImageSize = New System.Drawing.Size(20, 20) + Me.GunaButton5.Location = New System.Drawing.Point(3, 84) + Me.GunaButton5.Name = "GunaButton5" + Me.GunaButton5.OnHoverBaseColor = System.Drawing.Color.FromArgb(CType(CType(151, Byte), Integer), CType(CType(143, Byte), Integer), CType(CType(255, Byte), Integer)) + Me.GunaButton5.OnHoverBorderColor = System.Drawing.Color.Black + Me.GunaButton5.OnHoverForeColor = System.Drawing.Color.White + Me.GunaButton5.OnHoverImage = Nothing + Me.GunaButton5.OnPressedColor = System.Drawing.Color.Black + Me.GunaButton5.Size = New System.Drawing.Size(351, 28) + Me.GunaButton5.TabIndex = 63 + Me.GunaButton5.Text = "Reset Settings" + Me.GunaButton5.TextAlign = System.Windows.Forms.HorizontalAlignment.Center + ' + 'GunaLabel8 + ' + Me.GunaLabel8.AutoSize = True + Me.GunaLabel8.BackColor = System.Drawing.Color.Transparent + Me.GunaLabel8.Font = New System.Drawing.Font("Segoe UI", 9.0!) + Me.GunaLabel8.Location = New System.Drawing.Point(38, 176) + Me.GunaLabel8.Name = "GunaLabel8" + Me.GunaLabel8.Size = New System.Drawing.Size(38, 15) + Me.GunaLabel8.TabIndex = 62 + Me.GunaLabel8.Text = "Game" + ' + 'GunaComboBox2 + ' + Me.GunaComboBox2.BackColor = System.Drawing.Color.Transparent + Me.GunaComboBox2.BaseColor = System.Drawing.Color.Transparent + Me.GunaComboBox2.BorderColor = System.Drawing.Color.FromArgb(CType(CType(100, Byte), Integer), CType(CType(88, Byte), Integer), CType(CType(255, Byte), Integer)) + Me.GunaComboBox2.BorderSize = 1 + Me.GunaComboBox2.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawFixed + Me.GunaComboBox2.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList + Me.GunaComboBox2.FocusedColor = System.Drawing.Color.Empty + Me.GunaComboBox2.Font = New System.Drawing.Font("Segoe UI", 10.0!) + Me.GunaComboBox2.ForeColor = System.Drawing.Color.FromArgb(CType(CType(100, Byte), Integer), CType(CType(88, Byte), Integer), CType(CType(255, Byte), Integer)) + Me.GunaComboBox2.FormattingEnabled = True + Me.GunaComboBox2.Items.AddRange(New Object() {"HALO CE", "HALO PC"}) + Me.GunaComboBox2.Location = New System.Drawing.Point(92, 171) + Me.GunaComboBox2.Name = "GunaComboBox2" + Me.GunaComboBox2.OnHoverItemBaseColor = System.Drawing.Color.FromArgb(CType(CType(100, Byte), Integer), CType(CType(88, Byte), Integer), CType(CType(255, Byte), Integer)) + Me.GunaComboBox2.OnHoverItemForeColor = System.Drawing.Color.White + Me.GunaComboBox2.Size = New System.Drawing.Size(141, 26) + Me.GunaComboBox2.StartIndex = 0 + Me.GunaComboBox2.TabIndex = 61 + ' + 'GunaPanel6 + ' + Me.GunaPanel6.Controls.Add(Me.GunaLabel7) + Me.GunaPanel6.Location = New System.Drawing.Point(0, 135) + Me.GunaPanel6.Name = "GunaPanel6" + Me.GunaPanel6.Size = New System.Drawing.Size(357, 26) + Me.GunaPanel6.TabIndex = 59 + ' + 'GunaLabel7 + ' + Me.GunaLabel7.AutoSize = True + Me.GunaLabel7.BackColor = System.Drawing.Color.Transparent + Me.GunaLabel7.Font = New System.Drawing.Font("Segoe UI", 9.0!) + Me.GunaLabel7.Location = New System.Drawing.Point(8, 5) + Me.GunaLabel7.Name = "GunaLabel7" + Me.GunaLabel7.Size = New System.Drawing.Size(78, 15) + Me.GunaLabel7.TabIndex = 3 + Me.GunaLabel7.Text = "Default game" + ' + 'GunaButton3 + ' + Me.GunaButton3.AnimationHoverSpeed = 0.07! + Me.GunaButton3.AnimationSpeed = 0.03! + Me.GunaButton3.BaseColor = System.Drawing.Color.FromArgb(CType(CType(100, Byte), Integer), CType(CType(88, Byte), Integer), CType(CType(255, Byte), Integer)) + Me.GunaButton3.BorderColor = System.Drawing.Color.Black + Me.GunaButton3.DialogResult = System.Windows.Forms.DialogResult.None + Me.GunaButton3.FocusedColor = System.Drawing.Color.Empty + Me.GunaButton3.Font = New System.Drawing.Font("Segoe UI", 9.0!) + Me.GunaButton3.ForeColor = System.Drawing.Color.White + Me.GunaButton3.Image = Nothing + Me.GunaButton3.ImageAlign = System.Windows.Forms.HorizontalAlignment.Center + Me.GunaButton3.ImageSize = New System.Drawing.Size(20, 20) + Me.GunaButton3.Location = New System.Drawing.Point(3, 44) + Me.GunaButton3.Name = "GunaButton3" + Me.GunaButton3.OnHoverBaseColor = System.Drawing.Color.FromArgb(CType(CType(151, Byte), Integer), CType(CType(143, Byte), Integer), CType(CType(255, Byte), Integer)) + Me.GunaButton3.OnHoverBorderColor = System.Drawing.Color.Black + Me.GunaButton3.OnHoverForeColor = System.Drawing.Color.White + Me.GunaButton3.OnHoverImage = Nothing + Me.GunaButton3.OnPressedColor = System.Drawing.Color.Black + Me.GunaButton3.Size = New System.Drawing.Size(351, 28) + Me.GunaButton3.TabIndex = 49 + Me.GunaButton3.Text = "Donate" + Me.GunaButton3.TextAlign = System.Windows.Forms.HorizontalAlignment.Center + ' + 'GunaButton2 + ' + Me.GunaButton2.AnimationHoverSpeed = 0.07! + Me.GunaButton2.AnimationSpeed = 0.03! + Me.GunaButton2.BaseColor = System.Drawing.Color.FromArgb(CType(CType(100, Byte), Integer), CType(CType(88, Byte), Integer), CType(CType(255, Byte), Integer)) + Me.GunaButton2.BorderColor = System.Drawing.Color.Black + Me.GunaButton2.DialogResult = System.Windows.Forms.DialogResult.None + Me.GunaButton2.FocusedColor = System.Drawing.Color.Empty + Me.GunaButton2.Font = New System.Drawing.Font("Segoe UI", 9.0!) + Me.GunaButton2.ForeColor = System.Drawing.Color.White + Me.GunaButton2.Image = Nothing + Me.GunaButton2.ImageAlign = System.Windows.Forms.HorizontalAlignment.Center + Me.GunaButton2.ImageSize = New System.Drawing.Size(20, 20) + Me.GunaButton2.Location = New System.Drawing.Point(3, 5) + Me.GunaButton2.Name = "GunaButton2" + Me.GunaButton2.OnHoverBaseColor = System.Drawing.Color.FromArgb(CType(CType(151, Byte), Integer), CType(CType(143, Byte), Integer), CType(CType(255, Byte), Integer)) + Me.GunaButton2.OnHoverBorderColor = System.Drawing.Color.Black + Me.GunaButton2.OnHoverForeColor = System.Drawing.Color.White + Me.GunaButton2.OnHoverImage = Nothing + Me.GunaButton2.OnPressedColor = System.Drawing.Color.Black + Me.GunaButton2.Size = New System.Drawing.Size(351, 28) + Me.GunaButton2.TabIndex = 48 + Me.GunaButton2.Text = "About" + Me.GunaButton2.TextAlign = System.Windows.Forms.HorizontalAlignment.Center + ' + 'GunaPanel2 + ' + Me.GunaPanel2.BackColor = System.Drawing.Color.Transparent + Me.GunaPanel2.Controls.Add(Me.GunaButton6) + Me.GunaPanel2.Controls.Add(Me.GunaButton4) + Me.GunaPanel2.Controls.Add(Me.PCdirTextBox1) + Me.GunaPanel2.Controls.Add(Me.GunaLabel6) + Me.GunaPanel2.Controls.Add(Me.GunaLabel5) + Me.GunaPanel2.Controls.Add(Me.GunaComboBox1) + Me.GunaPanel2.Controls.Add(Me.GunaPanel5) + Me.GunaPanel2.Controls.Add(Me.GunaCheckBox8) + Me.GunaPanel2.Controls.Add(Me.GunaCheckBox7) + Me.GunaPanel2.Controls.Add(Me.GunaCheckBox6) + Me.GunaPanel2.Controls.Add(Me.GunaCheckBox5) + Me.GunaPanel2.Controls.Add(Me.GunaCheckBox4) + Me.GunaPanel2.Controls.Add(Me.GunaCheckBox3) + Me.GunaPanel2.Controls.Add(Me.GunaCheckBox2) + Me.GunaPanel2.Controls.Add(Me.GunaCheckBox1) + Me.GunaPanel2.Controls.Add(Me.GunaPanel4) + Me.GunaPanel2.Controls.Add(Me.GunaPanel3) + Me.GunaPanel2.Controls.Add(Me.GunaButton1) + Me.GunaPanel2.Controls.Add(Me.CEdirTextbox) + Me.GunaPanel2.Controls.Add(Me.GunaLabel1) + Me.GunaPanel2.Location = New System.Drawing.Point(13, 12) + Me.GunaPanel2.Name = "GunaPanel2" + Me.GunaPanel2.Size = New System.Drawing.Size(430, 414) + Me.GunaPanel2.TabIndex = 48 + ' + 'GunaButton4 + ' + Me.GunaButton4.AnimationHoverSpeed = 0.07! + Me.GunaButton4.AnimationSpeed = 0.03! + Me.GunaButton4.BaseColor = System.Drawing.Color.FromArgb(CType(CType(100, Byte), Integer), CType(CType(88, Byte), Integer), CType(CType(255, Byte), Integer)) + Me.GunaButton4.BorderColor = System.Drawing.Color.Black + Me.GunaButton4.DialogResult = System.Windows.Forms.DialogResult.None + Me.GunaButton4.FocusedColor = System.Drawing.Color.Empty + Me.GunaButton4.Font = New System.Drawing.Font("Segoe UI", 9.0!) + Me.GunaButton4.ForeColor = System.Drawing.Color.White + Me.GunaButton4.Image = Nothing + Me.GunaButton4.ImageAlign = System.Windows.Forms.HorizontalAlignment.Center + Me.GunaButton4.ImageSize = New System.Drawing.Size(20, 20) + Me.GunaButton4.Location = New System.Drawing.Point(353, 167) + Me.GunaButton4.Name = "GunaButton4" + Me.GunaButton4.OnHoverBaseColor = System.Drawing.Color.FromArgb(CType(CType(151, Byte), Integer), CType(CType(143, Byte), Integer), CType(CType(255, Byte), Integer)) + Me.GunaButton4.OnHoverBorderColor = System.Drawing.Color.Black + Me.GunaButton4.OnHoverForeColor = System.Drawing.Color.White + Me.GunaButton4.OnHoverImage = Nothing + Me.GunaButton4.OnPressedColor = System.Drawing.Color.Black + Me.GunaButton4.Size = New System.Drawing.Size(60, 24) + Me.GunaButton4.TabIndex = 63 + Me.GunaButton4.Text = "Select" + Me.GunaButton4.TextAlign = System.Windows.Forms.HorizontalAlignment.Center + ' + 'PCdirTextBox1 + ' + Me.PCdirTextBox1.BaseColor = System.Drawing.Color.FromArgb(CType(CType(14, Byte), Integer), CType(CType(14, Byte), Integer), CType(CType(14, Byte), Integer)) + Me.PCdirTextBox1.BorderColor = System.Drawing.Color.FromArgb(CType(CType(66, Byte), Integer), CType(CType(58, Byte), Integer), CType(CType(170, Byte), Integer)) + Me.PCdirTextBox1.BorderSize = 1 + Me.PCdirTextBox1.Cursor = System.Windows.Forms.Cursors.IBeam + Me.PCdirTextBox1.FocusedBaseColor = System.Drawing.Color.FromArgb(CType(CType(14, Byte), Integer), CType(CType(14, Byte), Integer), CType(CType(14, Byte), Integer)) + Me.PCdirTextBox1.FocusedBorderColor = System.Drawing.Color.FromArgb(CType(CType(100, Byte), Integer), CType(CType(88, Byte), Integer), CType(CType(255, Byte), Integer)) + Me.PCdirTextBox1.FocusedForeColor = System.Drawing.Color.White + Me.PCdirTextBox1.Font = New System.Drawing.Font("Segoe UI", 9.0!) + Me.PCdirTextBox1.ForeColor = System.Drawing.Color.White + Me.PCdirTextBox1.Location = New System.Drawing.Point(11, 135) + Me.PCdirTextBox1.Name = "PCdirTextBox1" + Me.PCdirTextBox1.PasswordChar = Global.Microsoft.VisualBasic.ChrW(0) + Me.PCdirTextBox1.ReadOnly = True + Me.PCdirTextBox1.Size = New System.Drawing.Size(402, 26) + Me.PCdirTextBox1.TabIndex = 62 + ' + 'GunaLabel6 + ' + Me.GunaLabel6.AutoSize = True + Me.GunaLabel6.BackColor = System.Drawing.Color.Transparent + Me.GunaLabel6.Font = New System.Drawing.Font("Segoe UI", 9.0!) + Me.GunaLabel6.Location = New System.Drawing.Point(8, 117) + Me.GunaLabel6.Name = "GunaLabel6" + Me.GunaLabel6.Size = New System.Drawing.Size(101, 15) + Me.GunaLabel6.TabIndex = 61 + Me.GunaLabel6.Text = "Halo PC Directory" + ' + 'GunaLabel5 + ' + Me.GunaLabel5.AutoSize = True + Me.GunaLabel5.BackColor = System.Drawing.Color.Transparent + Me.GunaLabel5.Font = New System.Drawing.Font("Segoe UI", 9.0!) + Me.GunaLabel5.Location = New System.Drawing.Point(27, 245) + Me.GunaLabel5.Name = "GunaLabel5" + Me.GunaLabel5.Size = New System.Drawing.Size(72, 15) + Me.GunaLabel5.TabIndex = 60 + Me.GunaLabel5.Text = "Select Mode" + ' + 'GunaComboBox1 + ' + Me.GunaComboBox1.BackColor = System.Drawing.Color.Transparent + Me.GunaComboBox1.BaseColor = System.Drawing.Color.Transparent + Me.GunaComboBox1.BorderColor = System.Drawing.Color.FromArgb(CType(CType(100, Byte), Integer), CType(CType(88, Byte), Integer), CType(CType(255, Byte), Integer)) + Me.GunaComboBox1.BorderSize = 1 + Me.GunaComboBox1.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawFixed + Me.GunaComboBox1.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList + Me.GunaComboBox1.FocusedColor = System.Drawing.Color.Empty + Me.GunaComboBox1.Font = New System.Drawing.Font("Segoe UI", 10.0!) + Me.GunaComboBox1.ForeColor = System.Drawing.Color.FromArgb(CType(CType(100, Byte), Integer), CType(CType(88, Byte), Integer), CType(CType(255, Byte), Integer)) + Me.GunaComboBox1.FormattingEnabled = True + Me.GunaComboBox1.Items.AddRange(New Object() {"FAKE Full Screen", "Windowed", "Full Screen"}) + Me.GunaComboBox1.Location = New System.Drawing.Point(105, 240) + Me.GunaComboBox1.Name = "GunaComboBox1" + Me.GunaComboBox1.OnHoverItemBaseColor = System.Drawing.Color.FromArgb(CType(CType(100, Byte), Integer), CType(CType(88, Byte), Integer), CType(CType(255, Byte), Integer)) + Me.GunaComboBox1.OnHoverItemForeColor = System.Drawing.Color.White + Me.GunaComboBox1.Size = New System.Drawing.Size(141, 26) + Me.GunaComboBox1.TabIndex = 59 + ' + 'GunaPanel5 + ' + Me.GunaPanel5.Controls.Add(Me.GunaLabel4) + Me.GunaPanel5.Location = New System.Drawing.Point(0, 206) + Me.GunaPanel5.Name = "GunaPanel5" + Me.GunaPanel5.Size = New System.Drawing.Size(430, 26) + Me.GunaPanel5.TabIndex = 58 + ' + 'GunaLabel4 + ' + Me.GunaLabel4.AutoSize = True + Me.GunaLabel4.BackColor = System.Drawing.Color.Transparent + Me.GunaLabel4.Font = New System.Drawing.Font("Segoe UI", 9.0!) + Me.GunaLabel4.Location = New System.Drawing.Point(8, 5) + Me.GunaLabel4.Name = "GunaLabel4" + Me.GunaLabel4.Size = New System.Drawing.Size(117, 15) + Me.GunaLabel4.TabIndex = 3 + Me.GunaLabel4.Text = "Game window mode" + ' + 'GunaCheckBox8 + ' + Me.GunaCheckBox8.BaseColor = System.Drawing.Color.White + Me.GunaCheckBox8.CheckedOffColor = System.Drawing.Color.Gray + Me.GunaCheckBox8.CheckedOnColor = System.Drawing.Color.FromArgb(CType(CType(100, Byte), Integer), CType(CType(88, Byte), Integer), CType(CType(255, Byte), Integer)) + Me.GunaCheckBox8.FillColor = System.Drawing.Color.White + Me.GunaCheckBox8.Location = New System.Drawing.Point(224, 350) + Me.GunaCheckBox8.Name = "GunaCheckBox8" + Me.GunaCheckBox8.Radius = 0 + Me.GunaCheckBox8.Size = New System.Drawing.Size(84, 20) + Me.GunaCheckBox8.TabIndex = 57 + Me.GunaCheckBox8.Text = "Safe Mode" + Me.BoosterToolTip1.SetToolTip(Me.GunaCheckBox8, "Disables as much as possible from the game in case you're experiencing crashes.") + ' + 'GunaCheckBox7 + ' + Me.GunaCheckBox7.BaseColor = System.Drawing.Color.White + Me.GunaCheckBox7.CheckedOffColor = System.Drawing.Color.Gray + Me.GunaCheckBox7.CheckedOnColor = System.Drawing.Color.FromArgb(CType(CType(100, Byte), Integer), CType(CType(88, Byte), Integer), CType(CType(255, Byte), Integer)) + Me.GunaCheckBox7.FillColor = System.Drawing.Color.White + Me.GunaCheckBox7.Location = New System.Drawing.Point(224, 313) + Me.GunaCheckBox7.Name = "GunaCheckBox7" + Me.GunaCheckBox7.Radius = 0 + Me.GunaCheckBox7.Size = New System.Drawing.Size(88, 20) + Me.GunaCheckBox7.TabIndex = 56 + Me.GunaCheckBox7.Text = "No Joystick" + Me.BoosterToolTip1.SetToolTip(Me.GunaCheckBox7, "Disables joystick/gamepads.") + ' + 'GunaCheckBox6 + ' + Me.GunaCheckBox6.BaseColor = System.Drawing.Color.White + Me.GunaCheckBox6.CheckedOffColor = System.Drawing.Color.Gray + Me.GunaCheckBox6.CheckedOnColor = System.Drawing.Color.FromArgb(CType(CType(100, Byte), Integer), CType(CType(88, Byte), Integer), CType(CType(255, Byte), Integer)) + Me.GunaCheckBox6.FillColor = System.Drawing.Color.White + Me.GunaCheckBox6.Location = New System.Drawing.Point(122, 313) + Me.GunaCheckBox6.Name = "GunaCheckBox6" + Me.GunaCheckBox6.Radius = 0 + Me.GunaCheckBox6.Size = New System.Drawing.Size(87, 20) + Me.GunaCheckBox6.TabIndex = 55 + Me.GunaCheckBox6.Text = "No Gamma" + Me.BoosterToolTip1.SetToolTip(Me.GunaCheckBox6, "Disables adjustment of gamma. " & Global.Microsoft.VisualBasic.ChrW(13) & Global.Microsoft.VisualBasic.ChrW(10) & "The in-game gamma slider will not affect the brig" & _ + "htness of the game if this switch is used.") + ' + 'GunaCheckBox5 + ' + Me.GunaCheckBox5.BaseColor = System.Drawing.Color.White + Me.GunaCheckBox5.CheckedOffColor = System.Drawing.Color.Gray + Me.GunaCheckBox5.CheckedOnColor = System.Drawing.Color.FromArgb(CType(CType(100, Byte), Integer), CType(CType(88, Byte), Integer), CType(CType(255, Byte), Integer)) + Me.GunaCheckBox5.FillColor = System.Drawing.Color.White + Me.GunaCheckBox5.Location = New System.Drawing.Point(122, 385) + Me.GunaCheckBox5.Name = "GunaCheckBox5" + Me.GunaCheckBox5.Radius = 0 + Me.GunaCheckBox5.Size = New System.Drawing.Size(76, 20) + Me.GunaCheckBox5.TabIndex = 54 + Me.GunaCheckBox5.Text = "No Video" + Me.BoosterToolTip1.SetToolTip(Me.GunaCheckBox5, resources.GetString("GunaCheckBox5.ToolTip")) + ' + 'GunaCheckBox4 + ' + Me.GunaCheckBox4.BaseColor = System.Drawing.Color.White + Me.GunaCheckBox4.CheckedOffColor = System.Drawing.Color.Gray + Me.GunaCheckBox4.CheckedOnColor = System.Drawing.Color.FromArgb(CType(CType(100, Byte), Integer), CType(CType(88, Byte), Integer), CType(CType(255, Byte), Integer)) + Me.GunaCheckBox4.FillColor = System.Drawing.Color.White + Me.GunaCheckBox4.Location = New System.Drawing.Point(122, 350) + Me.GunaCheckBox4.Name = "GunaCheckBox4" + Me.GunaCheckBox4.Radius = 0 + Me.GunaCheckBox4.Size = New System.Drawing.Size(80, 20) + Me.GunaCheckBox4.TabIndex = 53 + Me.GunaCheckBox4.Text = "No Sound" + Me.BoosterToolTip1.SetToolTip(Me.GunaCheckBox4, "Disables all sound.") + ' + 'GunaCheckBox3 + ' + Me.GunaCheckBox3.BaseColor = System.Drawing.Color.White + Me.GunaCheckBox3.CheckedOffColor = System.Drawing.Color.Gray + Me.GunaCheckBox3.CheckedOnColor = System.Drawing.Color.FromArgb(CType(CType(100, Byte), Integer), CType(CType(88, Byte), Integer), CType(CType(255, Byte), Integer)) + Me.GunaCheckBox3.FillColor = System.Drawing.Color.White + Me.GunaCheckBox3.Location = New System.Drawing.Point(11, 385) + Me.GunaCheckBox3.Name = "GunaCheckBox3" + Me.GunaCheckBox3.Radius = 0 + Me.GunaCheckBox3.Size = New System.Drawing.Size(81, 20) + Me.GunaCheckBox3.TabIndex = 52 + Me.GunaCheckBox3.Text = "Dev Mode" + Me.BoosterToolTip1.SetToolTip(Me.GunaCheckBox3, "Enables developer mode commands (Custom Edition only). " & Global.Microsoft.VisualBasic.ChrW(13) & Global.Microsoft.VisualBasic.ChrW(10) & "This also prevents Inter" & _ + "net gameplay when mods are not used. " & Global.Microsoft.VisualBasic.ChrW(13) & Global.Microsoft.VisualBasic.ChrW(10) & "Most client mods like HAC2 and Chimera en" & _ + "able this mode automatically.") + ' + 'GunaCheckBox2 + ' + Me.GunaCheckBox2.BaseColor = System.Drawing.Color.White + Me.GunaCheckBox2.CheckedOffColor = System.Drawing.Color.Gray + Me.GunaCheckBox2.CheckedOnColor = System.Drawing.Color.FromArgb(CType(CType(100, Byte), Integer), CType(CType(88, Byte), Integer), CType(CType(255, Byte), Integer)) + Me.GunaCheckBox2.FillColor = System.Drawing.Color.White + Me.GunaCheckBox2.Location = New System.Drawing.Point(11, 350) + Me.GunaCheckBox2.Name = "GunaCheckBox2" + Me.GunaCheckBox2.Radius = 0 + Me.GunaCheckBox2.Size = New System.Drawing.Size(87, 20) + Me.GunaCheckBox2.TabIndex = 51 + Me.GunaCheckBox2.Text = "Screenshot" + ' + 'GunaCheckBox1 + ' + Me.GunaCheckBox1.BaseColor = System.Drawing.Color.White + Me.GunaCheckBox1.CheckedOffColor = System.Drawing.Color.Gray + Me.GunaCheckBox1.CheckedOnColor = System.Drawing.Color.FromArgb(CType(CType(100, Byte), Integer), CType(CType(88, Byte), Integer), CType(CType(255, Byte), Integer)) + Me.GunaCheckBox1.FillColor = System.Drawing.Color.White + Me.GunaCheckBox1.Location = New System.Drawing.Point(11, 313) + Me.GunaCheckBox1.Name = "GunaCheckBox1" + Me.GunaCheckBox1.Radius = 0 + Me.GunaCheckBox1.Size = New System.Drawing.Size(71, 20) + Me.GunaCheckBox1.TabIndex = 50 + Me.GunaCheckBox1.Text = "Console" + Me.BoosterToolTip1.SetToolTip(Me.GunaCheckBox1, resources.GetString("GunaCheckBox1.ToolTip")) + ' + 'GunaPanel4 + ' + Me.GunaPanel4.Controls.Add(Me.GunaLabel3) + Me.GunaPanel4.Location = New System.Drawing.Point(0, 281) + Me.GunaPanel4.Name = "GunaPanel4" + Me.GunaPanel4.Size = New System.Drawing.Size(430, 26) + Me.GunaPanel4.TabIndex = 49 + ' + 'GunaLabel3 + ' + Me.GunaLabel3.AutoSize = True + Me.GunaLabel3.BackColor = System.Drawing.Color.Transparent + Me.GunaLabel3.Font = New System.Drawing.Font("Segoe UI", 9.0!) + Me.GunaLabel3.Location = New System.Drawing.Point(8, 5) + Me.GunaLabel3.Name = "GunaLabel3" + Me.GunaLabel3.Size = New System.Drawing.Size(91, 15) + Me.GunaLabel3.TabIndex = 3 + Me.GunaLabel3.Text = "Launch Options" + ' + 'GunaPanel3 + ' + Me.GunaPanel3.Controls.Add(Me.GunaLabel2) + Me.GunaPanel3.Dock = System.Windows.Forms.DockStyle.Top + Me.GunaPanel3.Location = New System.Drawing.Point(0, 0) + Me.GunaPanel3.Name = "GunaPanel3" + Me.GunaPanel3.Size = New System.Drawing.Size(430, 26) + Me.GunaPanel3.TabIndex = 48 + ' + 'GunaLabel2 + ' + Me.GunaLabel2.AutoSize = True + Me.GunaLabel2.BackColor = System.Drawing.Color.Transparent + Me.GunaLabel2.Font = New System.Drawing.Font("Segoe UI", 9.0!) + Me.GunaLabel2.Location = New System.Drawing.Point(8, 5) + Me.GunaLabel2.Name = "GunaLabel2" + Me.GunaLabel2.Size = New System.Drawing.Size(62, 15) + Me.GunaLabel2.TabIndex = 3 + Me.GunaLabel2.Text = "Game Info" + ' + 'GunaButton1 + ' + Me.GunaButton1.AnimationHoverSpeed = 0.07! + Me.GunaButton1.AnimationSpeed = 0.03! + Me.GunaButton1.BaseColor = System.Drawing.Color.FromArgb(CType(CType(100, Byte), Integer), CType(CType(88, Byte), Integer), CType(CType(255, Byte), Integer)) + Me.GunaButton1.BorderColor = System.Drawing.Color.Black + Me.GunaButton1.DialogResult = System.Windows.Forms.DialogResult.None + Me.GunaButton1.FocusedColor = System.Drawing.Color.Empty + Me.GunaButton1.Font = New System.Drawing.Font("Segoe UI", 9.0!) + Me.GunaButton1.ForeColor = System.Drawing.Color.White + Me.GunaButton1.Image = Nothing + Me.GunaButton1.ImageAlign = System.Windows.Forms.HorizontalAlignment.Center + Me.GunaButton1.ImageSize = New System.Drawing.Size(20, 20) + Me.GunaButton1.Location = New System.Drawing.Point(353, 94) + Me.GunaButton1.Name = "GunaButton1" + Me.GunaButton1.OnHoverBaseColor = System.Drawing.Color.FromArgb(CType(CType(151, Byte), Integer), CType(CType(143, Byte), Integer), CType(CType(255, Byte), Integer)) + Me.GunaButton1.OnHoverBorderColor = System.Drawing.Color.Black + Me.GunaButton1.OnHoverForeColor = System.Drawing.Color.White + Me.GunaButton1.OnHoverImage = Nothing + Me.GunaButton1.OnPressedColor = System.Drawing.Color.Black + Me.GunaButton1.Size = New System.Drawing.Size(60, 24) + Me.GunaButton1.TabIndex = 47 + Me.GunaButton1.Text = "Select" + Me.GunaButton1.TextAlign = System.Windows.Forms.HorizontalAlignment.Center + ' + 'CEdirTextbox + ' + Me.CEdirTextbox.BaseColor = System.Drawing.Color.FromArgb(CType(CType(14, Byte), Integer), CType(CType(14, Byte), Integer), CType(CType(14, Byte), Integer)) + Me.CEdirTextbox.BorderColor = System.Drawing.Color.FromArgb(CType(CType(66, Byte), Integer), CType(CType(58, Byte), Integer), CType(CType(170, Byte), Integer)) + Me.CEdirTextbox.BorderSize = 1 + Me.CEdirTextbox.Cursor = System.Windows.Forms.Cursors.IBeam + Me.CEdirTextbox.FocusedBaseColor = System.Drawing.Color.FromArgb(CType(CType(14, Byte), Integer), CType(CType(14, Byte), Integer), CType(CType(14, Byte), Integer)) + Me.CEdirTextbox.FocusedBorderColor = System.Drawing.Color.FromArgb(CType(CType(100, Byte), Integer), CType(CType(88, Byte), Integer), CType(CType(255, Byte), Integer)) + Me.CEdirTextbox.FocusedForeColor = System.Drawing.Color.White + Me.CEdirTextbox.Font = New System.Drawing.Font("Segoe UI", 9.0!) + Me.CEdirTextbox.ForeColor = System.Drawing.Color.White + Me.CEdirTextbox.Location = New System.Drawing.Point(11, 62) + Me.CEdirTextbox.Name = "CEdirTextbox" + Me.CEdirTextbox.PasswordChar = Global.Microsoft.VisualBasic.ChrW(0) + Me.CEdirTextbox.ReadOnly = True + Me.CEdirTextbox.Size = New System.Drawing.Size(402, 26) + Me.CEdirTextbox.TabIndex = 46 + ' + 'GunaLabel1 + ' + Me.GunaLabel1.AutoSize = True + Me.GunaLabel1.BackColor = System.Drawing.Color.Transparent + Me.GunaLabel1.Font = New System.Drawing.Font("Segoe UI", 9.0!) + Me.GunaLabel1.Location = New System.Drawing.Point(8, 40) + Me.GunaLabel1.Name = "GunaLabel1" + Me.GunaLabel1.Size = New System.Drawing.Size(100, 15) + Me.GunaLabel1.TabIndex = 2 + Me.GunaLabel1.Text = "Halo CE Directory" + ' + 'BoosterToolTip1 + ' + Me.BoosterToolTip1.BackColor = System.Drawing.Color.FromArgb(CType(CType(36, Byte), Integer), CType(CType(36, Byte), Integer), CType(CType(36, Byte), Integer)) + Me.BoosterToolTip1.OwnerDraw = True + ' + 'GunaButton6 + ' + Me.GunaButton6.AnimationHoverSpeed = 0.07! + Me.GunaButton6.AnimationSpeed = 0.03! + Me.GunaButton6.BaseColor = System.Drawing.Color.FromArgb(CType(CType(100, Byte), Integer), CType(CType(88, Byte), Integer), CType(CType(255, Byte), Integer)) + Me.GunaButton6.BorderColor = System.Drawing.Color.Black + Me.GunaButton6.DialogResult = System.Windows.Forms.DialogResult.None + Me.GunaButton6.FocusedColor = System.Drawing.Color.Empty + Me.GunaButton6.Font = New System.Drawing.Font("Segoe UI", 9.0!) + Me.GunaButton6.ForeColor = System.Drawing.Color.White + Me.GunaButton6.Image = Nothing + Me.GunaButton6.ImageAlign = System.Windows.Forms.HorizontalAlignment.Center + Me.GunaButton6.ImageSize = New System.Drawing.Size(20, 20) + Me.GunaButton6.Location = New System.Drawing.Point(263, 240) + Me.GunaButton6.Name = "GunaButton6" + Me.GunaButton6.OnHoverBaseColor = System.Drawing.Color.FromArgb(CType(CType(151, Byte), Integer), CType(CType(143, Byte), Integer), CType(CType(255, Byte), Integer)) + Me.GunaButton6.OnHoverBorderColor = System.Drawing.Color.Black + Me.GunaButton6.OnHoverForeColor = System.Drawing.Color.White + Me.GunaButton6.OnHoverImage = Nothing + Me.GunaButton6.OnPressedColor = System.Drawing.Color.Black + Me.GunaButton6.Size = New System.Drawing.Size(108, 26) + Me.GunaButton6.TabIndex = 64 + Me.GunaButton6.Text = "Force FullScreen" + Me.GunaButton6.TextAlign = System.Windows.Forms.HorizontalAlignment.Center + ' + 'Settingfrm + ' + Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) + Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font + Me.BackColor = System.Drawing.Color.FromArgb(CType(CType(64, Byte), Integer), CType(CType(64, Byte), Integer), CType(CType(64, Byte), Integer)) + Me.ClientSize = New System.Drawing.Size(818, 438) + Me.Controls.Add(Me.GunaPanel1) + Me.ForeColor = System.Drawing.Color.White + Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None + Me.MaximizeBox = False + Me.MinimizeBox = False + Me.Name = "Settingfrm" + Me.ShowIcon = False + Me.ShowInTaskbar = False + Me.Text = "Settingfrm" + Me.GunaPanel1.ResumeLayout(False) + Me.Panel1.ResumeLayout(False) + Me.Panel1.PerformLayout() + Me.GunaPanel6.ResumeLayout(False) + Me.GunaPanel6.PerformLayout() + Me.GunaPanel2.ResumeLayout(False) + Me.GunaPanel2.PerformLayout() + Me.GunaPanel5.ResumeLayout(False) + Me.GunaPanel5.PerformLayout() + Me.GunaPanel4.ResumeLayout(False) + Me.GunaPanel4.PerformLayout() + Me.GunaPanel3.ResumeLayout(False) + Me.GunaPanel3.PerformLayout() + Me.ResumeLayout(False) + + End Sub + Friend WithEvents GunaPanel1 As Guna.UI.WinForms.GunaPanel + Friend WithEvents GunaLabel1 As Guna.UI.WinForms.GunaLabel + Friend WithEvents BoosterToolTip1 As HALOCELauncher.BoosterToolTip + Friend WithEvents CEdirTextbox As Guna.UI.WinForms.GunaTextBox + Friend WithEvents GunaButton1 As Guna.UI.WinForms.GunaButton + Friend WithEvents GunaPanel2 As Guna.UI.WinForms.GunaPanel + Friend WithEvents GunaPanel3 As Guna.UI.WinForms.GunaPanel + Friend WithEvents GunaLabel2 As Guna.UI.WinForms.GunaLabel + Friend WithEvents Panel1 As System.Windows.Forms.Panel + Friend WithEvents GunaPanel4 As Guna.UI.WinForms.GunaPanel + Friend WithEvents GunaLabel3 As Guna.UI.WinForms.GunaLabel + Friend WithEvents GunaButton3 As Guna.UI.WinForms.GunaButton + Friend WithEvents GunaButton2 As Guna.UI.WinForms.GunaButton + Friend WithEvents GunaLabel5 As Guna.UI.WinForms.GunaLabel + Friend WithEvents GunaComboBox1 As Guna.UI.WinForms.GunaComboBox + Friend WithEvents GunaPanel5 As Guna.UI.WinForms.GunaPanel + Friend WithEvents GunaLabel4 As Guna.UI.WinForms.GunaLabel + Friend WithEvents GunaCheckBox8 As Guna.UI.WinForms.GunaCheckBox + Friend WithEvents GunaCheckBox7 As Guna.UI.WinForms.GunaCheckBox + Friend WithEvents GunaCheckBox6 As Guna.UI.WinForms.GunaCheckBox + Friend WithEvents GunaCheckBox5 As Guna.UI.WinForms.GunaCheckBox + Friend WithEvents GunaCheckBox4 As Guna.UI.WinForms.GunaCheckBox + Friend WithEvents GunaCheckBox3 As Guna.UI.WinForms.GunaCheckBox + Friend WithEvents GunaCheckBox2 As Guna.UI.WinForms.GunaCheckBox + Friend WithEvents GunaCheckBox1 As Guna.UI.WinForms.GunaCheckBox + Friend WithEvents Timer1 As System.Windows.Forms.Timer + Friend WithEvents GunaButton4 As Guna.UI.WinForms.GunaButton + Friend WithEvents PCdirTextBox1 As Guna.UI.WinForms.GunaTextBox + Friend WithEvents GunaLabel6 As Guna.UI.WinForms.GunaLabel + Friend WithEvents GunaPanel6 As Guna.UI.WinForms.GunaPanel + Friend WithEvents GunaLabel7 As Guna.UI.WinForms.GunaLabel + Friend WithEvents GunaLabel8 As Guna.UI.WinForms.GunaLabel + Friend WithEvents GunaComboBox2 As Guna.UI.WinForms.GunaComboBox + Friend WithEvents GunaButton5 As Guna.UI.WinForms.GunaButton + Friend WithEvents GunaButton6 As Guna.UI.WinForms.GunaButton +End Class diff --git a/HALOCELauncher/Controls/Forms/Settingfrm.resx b/HALOCELauncher/Controls/Forms/Settingfrm.resx new file mode 100644 index 0000000..565bdd7 --- /dev/null +++ b/HALOCELauncher/Controls/Forms/Settingfrm.resx @@ -0,0 +1,138 @@ +<?xml version="1.0" encoding="utf-8"?> +<root> + <!-- + Microsoft ResX Schema + + Version 2.0 + + The primary goals of this format is to allow a simple XML format + that is mostly human readable. The generation and parsing of the + various data types are done through the TypeConverter classes + associated with the data types. + + Example: + + ... ado.net/XML headers & schema ... + <resheader name="resmimetype">text/microsoft-resx</resheader> + <resheader name="version">2.0</resheader> + <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader> + <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader> + <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data> + <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data> + <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64"> + <value>[base64 mime encoded serialized .NET Framework object]</value> + </data> + <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> + <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value> + <comment>This is a comment</comment> + </data> + + There are any number of "resheader" rows that contain simple + name/value pairs. + + Each data row contains a name, and value. The row also contains a + type or mimetype. Type corresponds to a .NET class that support + text/value conversion through the TypeConverter architecture. + Classes that don't support this are serialized and stored with the + mimetype set. + + The mimetype is used for serialized objects, and tells the + ResXResourceReader how to depersist the object. This is currently not + extensible. For a given mimetype the value must be set accordingly: + + Note - application/x-microsoft.net.object.binary.base64 is the format + that the ResXResourceWriter will generate, however the reader can + read any of the formats listed below. + + mimetype: application/x-microsoft.net.object.binary.base64 + value : The object must be serialized with + : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter + : and then encoded with base64 encoding. + + mimetype: application/x-microsoft.net.object.soap.base64 + value : The object must be serialized with + : System.Runtime.Serialization.Formatters.Soap.SoapFormatter + : and then encoded with base64 encoding. + + mimetype: application/x-microsoft.net.object.bytearray.base64 + value : The object must be serialized into a byte array + : using a System.ComponentModel.TypeConverter + : and then encoded with base64 encoding. + --> + <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> + <xsd:import namespace="http://www.w3.org/XML/1998/namespace" /> + <xsd:element name="root" msdata:IsDataSet="true"> + <xsd:complexType> + <xsd:choice maxOccurs="unbounded"> + <xsd:element name="metadata"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" /> + </xsd:sequence> + <xsd:attribute name="name" use="required" type="xsd:string" /> + <xsd:attribute name="type" type="xsd:string" /> + <xsd:attribute name="mimetype" type="xsd:string" /> + <xsd:attribute ref="xml:space" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="assembly"> + <xsd:complexType> + <xsd:attribute name="alias" type="xsd:string" /> + <xsd:attribute name="name" type="xsd:string" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="data"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> + <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" /> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" /> + <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" /> + <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" /> + <xsd:attribute ref="xml:space" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="resheader"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required" /> + </xsd:complexType> + </xsd:element> + </xsd:choice> + </xsd:complexType> + </xsd:element> + </xsd:schema> + <resheader name="resmimetype"> + <value>text/microsoft-resx</value> + </resheader> + <resheader name="version"> + <value>2.0</value> + </resheader> + <resheader name="reader"> + <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> + </resheader> + <resheader name="writer"> + <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> + </resheader> + <metadata name="BoosterToolTip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> + <value>17, 17</value> + </metadata> + <data name="GunaCheckBox5.ToolTip" xml:space="preserve"> + <value>Disables the .bik videos which play at game startup (retail). +This option can also prevent Custom Edition crashes when using the Mesa graphics driver. +The mod Chimera sets this option automatically.</value> + </data> + <data name="GunaCheckBox1.ToolTip" xml:space="preserve"> + <value>Enables the debugging console, which can be opened with the ~ (tilde) key. +This console can be used to enter Halo script commands and is similar to Sapien's console, +though many Sapien-related commands have no effect. + +Note that most client mods like HAC2 and Chimera enable this automatically.</value> + </data> + <metadata name="Timer1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> + <value>158, 17</value> + </metadata> +</root> \ No newline at end of file diff --git a/HALOCELauncher/Controls/Forms/Settingfrm.vb b/HALOCELauncher/Controls/Forms/Settingfrm.vb new file mode 100644 index 0000000..350941f --- /dev/null +++ b/HALOCELauncher/Controls/Forms/Settingfrm.vb @@ -0,0 +1,287 @@ +Imports HALOCELauncher.Core.Utils.LogFuncs +Imports HALOCELauncher.Core.Helpers +Imports HALOCELauncher.Core.Utils + +Public Class Settingfrm + + Private Sub Settingfrm_Load(sender As Object, e As EventArgs) Handles MyBase.Load + Try : AddHandler Application.ThreadException, AddressOf Application_Exception_Handler _ + : Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException, False) _ + : Catch : End Try + SetStyle(ControlStyles.SupportsTransparentBackColor, True) + Me.BackColor = Color.Transparent + Me.Refresh() + StartC() + End Sub + + Public Overrides Sub Refresh() + Dim Aplyblur As New GetBlurBitmap(Me.Panel1) + Dim Aplyblur1 As New GetBlurBitmap(Me.GunaPanel2) + MyBase.Refresh() + End Sub + + Private Sub Application_Exception_Handler(ByVal sender As Object, ByVal e As System.Threading.ThreadExceptionEventArgs) + Dim ex As Exception = CType(e.Exception, Exception) + WriteLog(ex.Message, InfoType.Exception) + End Sub + +#Region " Parent Dragger " + + Private Dragger As ControlDragger = ControlDragger.Empty + + Private Sub InitializeDrag() + Me.Dragger = New ControlDragger(Me, Form1) + Me.Dragger = New ControlDragger(GunaPanel1, Form1) + For Each Cdrag As Control In GunaPanel1.Controls + Me.Dragger = New ControlDragger(Cdrag, Form1) + Next + For Each Cdraga As Control In GunaPanel3.Controls + Me.Dragger = New ControlDragger(Cdraga, Form1) + Next + For Each Cdraga As Control In GunaPanel3.Controls + Me.Dragger = New ControlDragger(Cdraga, Form1) + Next + For Each Cdragb As Control In GunaPanel4.Controls + Me.Dragger = New ControlDragger(Cdragb, Form1) + Next + For Each Cdragc As Control In GunaPanel5.Controls + Me.Dragger = New ControlDragger(Cdragc, Form1) + Next + Me.Dragger.Enabled = True + End Sub + + Private Sub AlternateDrag() + Dragger.Enabled = Not Dragger.Enabled + End Sub + + Private Sub FinishDrag() + Dragger.Dispose() + End Sub + + Private Sub Drag() Handles MyBase.Shown + Me.InitializeDrag() + End Sub + +#End Region + + Private Sub StartC() + GunaPanel1.BackColor = Color.FromArgb(40, Color.Black) + GunaPanel3.BackColor = Color.FromArgb(40, Color.Black) + GunaPanel4.BackColor = Color.FromArgb(40, Color.Black) + GunaPanel5.BackColor = Color.FromArgb(40, Color.Black) + GunaComboBox1.StartIndex = My.Settings.LaunchMode + GunaComboBox2.StartIndex = My.Settings.GameDefect + If My.Settings.GameDirCE = "" Then + CEdirTextbox.Text = GenerateCEDir() + If Not CEdirTextbox.Text = "" Then + SaveCEGamePath(CEdirTextbox.Text) + End If + Else + CEdirTextbox.Text = My.Settings.GameDirCE + End If + If My.Settings.GameDirPC = "" Then + PCdirTextBox1.Text = GeneratePCDir() + If Not PCdirTextBox1.Text = "" Then + SavePCGamePath(PCdirTextBox1.Text) + End If + Else + PCdirTextBox1.Text = My.Settings.GameDirPC + End If + GunaCheckBox1.Checked = My.Settings.ConsoleC + GunaCheckBox2.Checked = My.Settings.ScreenshotC + GunaCheckBox3.Checked = My.Settings.devC + GunaCheckBox4.Checked = My.Settings.SoundC + GunaCheckBox5.Checked = My.Settings.VideoC + GunaCheckBox6.Checked = My.Settings.GammaC + GunaCheckBox7.Checked = My.Settings.JoystickC + GunaCheckBox8.Checked = My.Settings.SafeModeC + End Sub + + Private Sub GunaButton1_Click(sender As Object, e As EventArgs) Handles GunaButton1.Click + Dim OpenGameDir As String = open("Haloce.exe [Executable] (*.exe)|*.exe") + If Not OpenGameDir = "Error" Then + CEdirTextbox.Text = OpenGameDir + SaveCEGamePath(CEdirTextbox.Text) + End If + End Sub + + Private Sub GunaButton4_Click(sender As Object, e As EventArgs) Handles GunaButton4.Click + Dim OpenGameDir As String = open("Halo.exe [Executable] (*.exe)|*.exe") + If Not OpenGameDir = "Error" Then + PCdirTextBox1.Text = OpenGameDir + SavePCGamePath(CEdirTextbox.Text) + End If + End Sub + + Private Function GenerateCEDir() As String + Dim GameDir1 As String = My.Computer.FileSystem.SpecialDirectories.ProgramFiles & "\" & "Microsoft Games\Halo Custom Edition\haloce.exe" + + If IO.File.Exists(GameDir1) = True Then + Return GameDir1 + End If + + Dim RegeditGamedir As String = "HKLM\software\Microsoft\Microsoft Games\Halo CE" + Dim RegeditKey As String = "EXE Path" + + If RegEdit.ExistValue(RegeditGamedir, RegeditKey) = True Then + Dim Data1 As String = RegEdit.GetValue(RegeditGamedir, RegeditKey) + Return Data1 + End If + + Return Nothing + End Function + + Private Function GeneratePCDir() As String + Dim GameDir2 As String = My.Computer.FileSystem.SpecialDirectories.ProgramFiles & "\" & "Microsoft Games\Halo\halo.exe" + If IO.File.Exists(GameDir2) = True Then + Return GameDir2 + End If + + Dim RegeditGamedir2 As String = "HKLM\software\Microsoft\Microsoft Games\Halo" + Dim RegeditKey As String = "EXE Path" + + If RegEdit.ExistValue(RegeditGamedir2, RegeditKey) = True Then + Dim Data2 As String = RegEdit.GetValue(RegeditGamedir2, RegeditKey) + Return Data2 + End If + + Return Nothing + End Function + + Private Sub SaveCEGamePath(ByVal DirA As String) + My.Settings.GameDirCE = DirA + My.Settings.Save() + End Sub + + Private Sub SavePCGamePath(ByVal DirA As String) + My.Settings.GameDirPC = DirA + My.Settings.Save() + End Sub + + Private Sub GunaButton3_Click(sender As Object, e As EventArgs) Handles GunaButton3.Click + System.Diagnostics.Process.Start("https://www.paypal.me/SalvadorKrilewski") + End Sub + + Private Sub GunaButton2_Click(sender As Object, e As EventArgs) Handles GunaButton2.Click + AboutForm.ShowDialog() + End Sub + + Private Sub GunaCheckBox1_CheckedChanged(sender As Object, e As EventArgs) Handles GunaCheckBox1.CheckedChanged + If GunaCheckBox1.Checked = True Then + My.Settings.ConsoleC = True + Else + My.Settings.ConsoleC = False + End If + My.Settings.Save() + End Sub + + Private Sub GunaCheckBox2_CheckedChanged(sender As Object, e As EventArgs) Handles GunaCheckBox2.CheckedChanged + If GunaCheckBox2.Checked = True Then + My.Settings.ScreenshotC = True + Else + My.Settings.ScreenshotC = False + End If + My.Settings.Save() + End Sub + + Private Sub GunaCheckBox3_CheckedChanged(sender As Object, e As EventArgs) Handles GunaCheckBox3.CheckedChanged + 'dev + If GunaCheckBox3.Checked = True Then + My.Settings.devC = True + Else + My.Settings.devC = False + End If + My.Settings.Save() + End Sub + + Private Sub GunaCheckBox6_CheckedChanged(sender As Object, e As EventArgs) Handles GunaCheckBox6.CheckedChanged + 'no gamma + If GunaCheckBox6.Checked = True Then + My.Settings.GammaC = True + Else + My.Settings.GammaC = False + End If + My.Settings.Save() + End Sub + + Private Sub GunaCheckBox4_CheckedChanged(sender As Object, e As EventArgs) Handles GunaCheckBox4.CheckedChanged + ' no sound + If GunaCheckBox4.Checked = True Then + My.Settings.SoundC = True + Else + My.Settings.SoundC = False + End If + My.Settings.Save() + End Sub + + Private Sub GunaCheckBox5_CheckedChanged(sender As Object, e As EventArgs) Handles GunaCheckBox5.CheckedChanged + 'no video + If GunaCheckBox5.Checked = True Then + My.Settings.VideoC = True + Else + My.Settings.VideoC = False + End If + My.Settings.Save() + End Sub + + Private Sub GunaCheckBox7_CheckedChanged(sender As Object, e As EventArgs) Handles GunaCheckBox7.CheckedChanged + ' no joystic + If GunaCheckBox7.Checked = True Then + My.Settings.JoystickC = True + Else + My.Settings.JoystickC = False + End If + My.Settings.Save() + End Sub + + Private Sub GunaCheckBox8_CheckedChanged(sender As Object, e As EventArgs) Handles GunaCheckBox8.CheckedChanged + 'safe mode + If GunaCheckBox8.Checked = True Then + My.Settings.SafeModeC = True + Else + My.Settings.SafeModeC = False + End If + My.Settings.Save() + End Sub + + Private Sub GunaComboBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles GunaComboBox1.SelectedIndexChanged + Dim Slect As Integer = GunaComboBox1.SelectedIndex + Select Case Slect + Case 0 : My.Settings.LaunchMode = Slect : GunaButton6.Visible = True + Case 1 : My.Settings.LaunchMode = Slect : GunaButton6.Visible = True + Case 2 : My.Settings.LaunchMode = Slect : GunaButton6.Visible = False + End Select + My.Settings.Save() + End Sub + + + Private Sub GunaComboBox2_SelectedIndexChanged(sender As Object, e As EventArgs) Handles GunaComboBox2.SelectedIndexChanged + Dim Slect As Integer = GunaComboBox2.SelectedIndex + Select Case Slect + Case 0 : My.Settings.GameDefect = Slect + Case 1 : My.Settings.GameDefect = Slect + End Select + My.Settings.Save() + End Sub + + Private Sub GunaButton5_Click(sender As Object, e As EventArgs) Handles GunaButton5.Click + My.Settings.Reset() + End Sub + + Private Sub GunaButton6_Click(sender As Object, e As EventArgs) Handles GunaButton6.Click + Dim LchangeWindow As New Core.Launcher + Dim procs As Process() = Process.GetProcesses() + + Dim ProcessNameEX As String = IO.Path.GetFileNameWithoutExtension(LchangeWindow.GameProc) + Dim processcount As Integer = procs.Count + For Each proc As Process In procs + + If proc.ProcessName = "haloce" Then + Dim FakeFullSc As Boolean = LchangeWindow.FullScreenEmulation("haloce") + ElseIf proc.ProcessName = "halo" Then + Dim FakeFullSc As Boolean = LchangeWindow.FullScreenEmulation("halo") + End If + Next + End Sub + +End Class \ No newline at end of file diff --git a/HALOCELauncher/Controls/HelpersXylos.vb b/HALOCELauncher/Controls/HelpersXylos.vb new file mode 100644 index 0000000..55a6c77 --- /dev/null +++ b/HALOCELauncher/Controls/HelpersXylos.vb @@ -0,0 +1,1131 @@ +Friend Module HelpersXylos + + Enum RoundingStyle As Byte + All = 0 + Top = 1 + Bottom = 2 + Left = 3 + Right = 4 + TopRight = 5 + BottomRight = 6 + End Enum + + Public Sub CenterString(G As Graphics, T As String, F As Font, C As Color, R As Rectangle) + Dim TS As SizeF = G.MeasureString(T, F) + + Using B As New SolidBrush(C) + G.DrawString(T, F, B, New Point(R.Width / 2 - (TS.Width / 2), R.Height / 2 - (TS.Height / 2))) + End Using + End Sub + + Public Function ColorFromHex(Hex As String) As Color + Return Color.FromArgb(Long.Parse(String.Format("FFFFFFFFFF{0}", Hex.Substring(1)), Globalization.NumberStyles.HexNumber)) + End Function + + Public Function FullRectangle(S As Size, Subtract As Boolean) As Rectangle + + If Subtract Then + Return New Rectangle(0, 0, S.Width - 1, S.Height - 1) + Else + Return New Rectangle(0, 0, S.Width, S.Height) + End If + + End Function + + Public Function RoundRect1(ByVal Rect As Rectangle, ByVal Rounding As Integer, Optional ByVal Style As RoundingStyle = RoundingStyle.All) As Drawing2D.GraphicsPath + + Dim GP As New Drawing2D.GraphicsPath() + Dim AW As Integer = Rounding * 2 + + GP.StartFigure() + + If Rounding = 0 Then + GP.AddRectangle(Rect) + GP.CloseAllFigures() + Return GP + End If + + Select Case Style + Case RoundingStyle.All + GP.AddArc(New Rectangle(Rect.X, Rect.Y, AW, AW), -180, 90) + GP.AddArc(New Rectangle(Rect.Width - AW + Rect.X, Rect.Y, AW, AW), -90, 90) + GP.AddArc(New Rectangle(Rect.Width - AW + Rect.X, Rect.Height - AW + Rect.Y, AW, AW), 0, 90) + GP.AddArc(New Rectangle(Rect.X, Rect.Height - AW + Rect.Y, AW, AW), 90, 90) + Case RoundingStyle.Top + GP.AddArc(New Rectangle(Rect.X, Rect.Y, AW, AW), -180, 90) + GP.AddArc(New Rectangle(Rect.Width - AW + Rect.X, Rect.Y, AW, AW), -90, 90) + GP.AddLine(New Point(Rect.X + Rect.Width, Rect.Y + Rect.Height), New Point(Rect.X, Rect.Y + Rect.Height)) + Case RoundingStyle.Bottom + GP.AddLine(New Point(Rect.X, Rect.Y), New Point(Rect.X + Rect.Width, Rect.Y)) + GP.AddArc(New Rectangle(Rect.Width - AW + Rect.X, Rect.Height - AW + Rect.Y, AW, AW), 0, 90) + GP.AddArc(New Rectangle(Rect.X, Rect.Height - AW + Rect.Y, AW, AW), 90, 90) + Case RoundingStyle.Left + GP.AddArc(New Rectangle(Rect.X, Rect.Y, AW, AW), -180, 90) + GP.AddLine(New Point(Rect.X + Rect.Width, Rect.Y), New Point(Rect.X + Rect.Width, Rect.Y + Rect.Height)) + GP.AddArc(New Rectangle(Rect.X, Rect.Height - AW + Rect.Y, AW, AW), 90, 90) + Case RoundingStyle.Right + GP.AddLine(New Point(Rect.X, Rect.Y + Rect.Height), New Point(Rect.X, Rect.Y)) + GP.AddArc(New Rectangle(Rect.Width - AW + Rect.X, Rect.Y, AW, AW), -90, 90) + GP.AddArc(New Rectangle(Rect.Width - AW + Rect.X, Rect.Height - AW + Rect.Y, AW, AW), 0, 90) + Case RoundingStyle.TopRight + GP.AddLine(New Point(Rect.X, Rect.Y + 1), New Point(Rect.X, Rect.Y)) + GP.AddArc(New Rectangle(Rect.Width - AW + Rect.X, Rect.Y, AW, AW), -90, 90) + GP.AddLine(New Point(Rect.X + Rect.Width, Rect.Y + Rect.Height - 1), New Point(Rect.X + Rect.Width, Rect.Y + Rect.Height)) + GP.AddLine(New Point(Rect.X + 1, Rect.Y + Rect.Height), New Point(Rect.X, Rect.Y + Rect.Height)) + Case RoundingStyle.BottomRight + GP.AddLine(New Point(Rect.X, Rect.Y + 1), New Point(Rect.X, Rect.Y)) + GP.AddLine(New Point(Rect.X + Rect.Width - 1, Rect.Y), New Point(Rect.X + Rect.Width, Rect.Y)) + GP.AddArc(New Rectangle(Rect.Width - AW + Rect.X, Rect.Height - AW + Rect.Y, AW, AW), 0, 90) + GP.AddLine(New Point(Rect.X + 1, Rect.Y + Rect.Height), New Point(Rect.X, Rect.Y + Rect.Height)) + End Select + + GP.CloseAllFigures() + + Return GP + + End Function + +End Module + +Public Class XylosTabControl + Inherits TabControl + + Private G As Graphics + Private Rect As Rectangle + Private _OverIndex As Integer = -1 + + Public Property FirstHeaderBorder As Boolean + + Private Property OverIndex As Integer + Get + Return _OverIndex + End Get + Set(value As Integer) + _OverIndex = value + Invalidate() + End Set + End Property + + Sub New() + DoubleBuffered = True + Alignment = TabAlignment.Left + SizeMode = TabSizeMode.Fixed + ItemSize = New Size(40, 180) + End Sub + + Protected Overrides Sub OnCreateControl() + MyBase.OnCreateControl() + SetStyle(ControlStyles.UserPaint, True) + End Sub + + Protected Overrides Sub OnControlAdded(e As ControlEventArgs) + MyBase.OnControlAdded(e) + e.Control.BackColor = Color.White + e.Control.ForeColor = HelpersXylos.ColorFromHex("#7C858E") + e.Control.Font = New Font("Segoe UI", 9) + End Sub + + Protected Overrides Sub OnPaint(e As PaintEventArgs) + G = e.Graphics + G.SmoothingMode = Drawing2D.SmoothingMode.HighQuality + G.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit + + MyBase.OnPaint(e) + + G.Clear(HelpersXylos.ColorFromHex("#FFFFFF")) + + For I As Integer = 0 To TabPages.Count - 1 + + Rect = GetTabRect(I) + + If String.IsNullOrEmpty(TabPages(I).Tag) Then + + If SelectedIndex = I Then + + Using Background As New SolidBrush(HelpersXylos.ColorFromHex("#3375ED")), TextColor As New SolidBrush(HelpersXylos.ColorFromHex("#BECCD9")), TextFont As New Font("Segoe UI semibold", 9) + G.FillRectangle(Background, New Rectangle(Rect.X - 5, Rect.Y + 1, Rect.Width + 7, Rect.Height)) + G.DrawString(TabPages(I).Text, TextFont, TextColor, New Point(Rect.X + 50 + (ItemSize.Height - 180), Rect.Y + 12)) + End Using + + Else + + Using TextColor As New SolidBrush(HelpersXylos.ColorFromHex("#919BA6")), TextFont As New Font("Segoe UI semibold", 9) + G.DrawString(TabPages(I).Text, TextFont, TextColor, New Point(Rect.X + 50 + (ItemSize.Height - 180), Rect.Y + 12)) + End Using + + End If + + If Not OverIndex = -1 And Not SelectedIndex = OverIndex Then + + Using Background As New SolidBrush(HelpersXylos.ColorFromHex("#2F3338")), TextColor As New SolidBrush(HelpersXylos.ColorFromHex("#919BA6")), TextFont As New Font("Segoe UI semibold", 9) + G.FillRectangle(Background, New Rectangle(GetTabRect(OverIndex).X - 5, GetTabRect(OverIndex).Y + 1, GetTabRect(OverIndex).Width + 7, GetTabRect(OverIndex).Height)) + G.DrawString(TabPages(OverIndex).Text, TextFont, TextColor, New Point(GetTabRect(OverIndex).X + 50 + (ItemSize.Height - 180), GetTabRect(OverIndex).Y + 12)) + End Using + + If Not IsNothing(ImageList) Then + If Not TabPages(OverIndex).ImageIndex < 0 Then + G.DrawImage(ImageList.Images(TabPages(OverIndex).ImageIndex), New Rectangle(GetTabRect(OverIndex).X + 25 + (ItemSize.Height - 180), GetTabRect(OverIndex).Y + ((GetTabRect(OverIndex).Height / 2) - 9), 16, 16)) + End If + End If + + End If + + + If Not IsNothing(ImageList) Then + If Not TabPages(I).ImageIndex < 0 Then + G.DrawImage(ImageList.Images(TabPages(I).ImageIndex), New Rectangle(Rect.X + 25 + (ItemSize.Height - 180), Rect.Y + ((Rect.Height / 2) - 9), 16, 16)) + End If + End If + + Else + + Using TextColor As New SolidBrush(HelpersXylos.ColorFromHex("#6A7279")), TextFont As New Font("Segoe UI", 7, FontStyle.Bold), Border As New Pen(HelpersXylos.ColorFromHex("#2B2F33")) + + If FirstHeaderBorder Then + G.DrawLine(Border, New Point(Rect.X - 5, Rect.Y + 1), New Point(Rect.Width + 7, Rect.Y + 1)) + Else + If Not I = 0 Then + G.DrawLine(Border, New Point(Rect.X - 5, Rect.Y + 1), New Point(Rect.Width + 7, Rect.Y + 1)) + End If + End If + + G.DrawString(TabPages(I).Text.ToUpper, TextFont, TextColor, New Point(Rect.X + 25 + (ItemSize.Height - 180), Rect.Y + 16)) + + End Using + + End If + + Next + + End Sub + + Protected Overrides Sub OnSelecting(e As TabControlCancelEventArgs) + MyBase.OnSelecting(e) + + If Not IsNothing(e.TabPage) Then + If Not String.IsNullOrEmpty(e.TabPage.Tag) Then + e.Cancel = True + Else + OverIndex = -1 + End If + End If + + End Sub + + Protected Overrides Sub OnMouseMove(e As MouseEventArgs) + MyBase.OnMouseMove(e) + + For I As Integer = 0 To TabPages.Count - 1 + If GetTabRect(I).Contains(e.Location) And Not SelectedIndex = I And String.IsNullOrEmpty(TabPages(I).Tag) Then + OverIndex = I + Exit For + Else + OverIndex = -1 + End If + Next + + End Sub + + Protected Overrides Sub OnMouseLeave(e As EventArgs) + MyBase.OnMouseLeave(e) + OverIndex = -1 + End Sub + +End Class + +Public Class XylosCheckBox + Inherits Control + + Public Event CheckedChanged(sender As Object, e As EventArgs) + + Private _Checked As Boolean + Private _EnabledCalc As Boolean + Private G As Graphics + + Private B64Enabled As String = "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAA00lEQVQ4T6WTwQ2CMBSG30/07Ci6gY7gxZoIiYADuAIrsIDpQQ/cHMERZBOuXHimDSWALYL01EO/L//724JmLszk6S+BCOIExFsmL50sEH4kAZxVciYuJgnacD16Plpgg8tFtYMILntQdSXiZ3aXqa1UF/yUsoDw4wKglQaZZPa4RW3JEKzO4RjEbyJaN1BL8gvWgsMp3ADeq0lRJ2FimLZNYWpmFbudUJdolXTLyG2wTmDODUiccEfgSDIIfwmMxAMStS+XHPZn7l/z6Ifk+nSzBR8zi2d9JmVXSgAAAABJRU5ErkJggg==" + Private B64Disabled As String = "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAA1UlEQVQ4T6WTzQ2CQBCF56EnLpaiXvUAJBRgB2oFtkALdEAJnoVEMIGzdEIFjNkFN4DLn+xpD/N9efMWQAsPFvL0lyBMUg8MiwzyZwuiJAuI6CyTMxezBC24EuSTBTp4xaaN6JWdqKQbge6udfB1pfbBjrMvEMZZAdCm3ilw7eO1KRmCxRyiOH0TsFUQs5KMwVLweKY7ALFKUZUTECD6qdquCxM7i9jNhLJEraQ5xZzrYJngO9crGYBbAm2SEfhHoCQGeeK+Ls1Ld+fuM0/+kPp+usWCD10idEOGa4QuAAAAAElFTkSuQmCC" + + Public Property Checked As Boolean + Get + Return _Checked + End Get + Set(value As Boolean) + _Checked = value + Invalidate() + End Set + End Property + + Public Shadows Property Enabled As Boolean + Get + Return EnabledCalc + End Get + Set(value As Boolean) + _EnabledCalc = value + + If Enabled Then + Cursor = Cursors.Hand + Else + Cursor = Cursors.Default + End If + + Invalidate() + End Set + End Property + + + Public Property EnabledCalc As Boolean + Get + Return _EnabledCalc + End Get + Set(value As Boolean) + Enabled = value + Invalidate() + End Set + End Property + + Sub New() + DoubleBuffered = True + Enabled = True + End Sub + + Protected Overrides Sub OnPaint(e As PaintEventArgs) + G = e.Graphics + G.SmoothingMode = Drawing2D.SmoothingMode.HighQuality + G.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit + + MyBase.OnPaint(e) + + G.Clear(BackColor) + + If Enabled Then + + Using Background As New SolidBrush(HelpersXylos.ColorFromHex("#F3F4F7")), Border As New Pen(HelpersXylos.ColorFromHex("#D0D5D9")), TextColor As New SolidBrush(HelpersXylos.ColorFromHex("#7C858E")), TextFont As New Font("Segoe UI", 9) + G.FillPath(Background, HelpersXylos.RoundRect1(New Rectangle(0, 0, 16, 16), 3)) + G.DrawPath(Border, HelpersXylos.RoundRect1(New Rectangle(0, 0, 16, 16), 3)) + G.DrawString(Text, TextFont, TextColor, New Point(25, 0)) + End Using + + If Checked Then + + Using I As Image = Image.FromStream(New IO.MemoryStream(Convert.FromBase64String(B64Enabled))) + G.DrawImage(I, New Rectangle(3, 3, 11, 11)) + End Using + + End If + + Else + + Using Background As New SolidBrush(HelpersXylos.ColorFromHex("#F5F5F8")), Border As New Pen(HelpersXylos.ColorFromHex("#E1E1E2")), TextColor As New SolidBrush(HelpersXylos.ColorFromHex("#D0D3D7")), TextFont As New Font("Segoe UI", 9) + G.FillPath(Background, HelpersXylos.RoundRect1(New Rectangle(0, 0, 16, 16), 3)) + G.DrawPath(Border, HelpersXylos.RoundRect1(New Rectangle(0, 0, 16, 16), 3)) + G.DrawString(Text, TextFont, TextColor, New Point(25, 0)) + End Using + + If Checked Then + + Using I As Image = Image.FromStream(New IO.MemoryStream(Convert.FromBase64String(B64Disabled))) + G.DrawImage(I, New Rectangle(3, 3, 11, 11)) + End Using + + End If + + End If + + End Sub + + Protected Overrides Sub OnMouseUp(e As MouseEventArgs) + MyBase.OnMouseUp(e) + + If Enabled Then + Checked = Not Checked + RaiseEvent CheckedChanged(Me, e) + End If + + End Sub + + Protected Overrides Sub OnResize(e As EventArgs) + MyBase.OnResize(e) + Size = New Size(Width, 18) + End Sub + +End Class + +Public Class XylosRadioButton + Inherits Control + + Public Event CheckedChanged(sender As Object, e As EventArgs) + + Private _Checked As Boolean + Private _EnabledCalc As Boolean + Private G As Graphics + + Public Property Checked As Boolean + Get + Return _Checked + End Get + Set(value As Boolean) + _Checked = value + Invalidate() + End Set + End Property + + Public Shadows Property Enabled As Boolean + Get + Return EnabledCalc + End Get + Set(value As Boolean) + _EnabledCalc = value + + If Enabled Then + Cursor = Cursors.Hand + Else + Cursor = Cursors.Default + End If + + Invalidate() + End Set + End Property + + Public Property EnabledCalc As Boolean + Get + Return _EnabledCalc + End Get + Set(value As Boolean) + Enabled = value + Invalidate() + End Set + End Property + + Sub New() + DoubleBuffered = True + Enabled = True + End Sub + + Protected Overrides Sub OnPaint(e As PaintEventArgs) + G = e.Graphics + G.SmoothingMode = Drawing2D.SmoothingMode.HighQuality + G.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit + + MyBase.OnPaint(e) + + G.Clear(Color.White) + + If Enabled Then + + Using Background As New SolidBrush(HelpersXylos.ColorFromHex("#F3F4F7")), Border As New Pen(HelpersXylos.ColorFromHex("#D0D5D9")), TextColor As New SolidBrush(HelpersXylos.ColorFromHex("#7C858E")), TextFont As New Font("Segoe UI", 9) + G.FillEllipse(Background, New Rectangle(0, 0, 16, 16)) + G.DrawEllipse(Border, New Rectangle(0, 0, 16, 16)) + G.DrawString(Text, TextFont, TextColor, New Point(25, 0)) + End Using + + If Checked Then + + Using Background As New SolidBrush(HelpersXylos.ColorFromHex("#575C62")) + G.FillEllipse(Background, New Rectangle(4, 4, 8, 8)) + End Using + + End If + + Else + + Using Background As New SolidBrush(HelpersXylos.ColorFromHex("#F5F5F8")), Border As New Pen(HelpersXylos.ColorFromHex("#E1E1E2")), TextColor As New SolidBrush(HelpersXylos.ColorFromHex("#D0D3D7")), TextFont As New Font("Segoe UI", 9) + G.FillEllipse(Background, New Rectangle(0, 0, 16, 16)) + G.DrawEllipse(Border, New Rectangle(0, 0, 16, 16)) + G.DrawString(Text, TextFont, TextColor, New Point(25, 0)) + End Using + + If Checked Then + + Using Background As New SolidBrush(HelpersXylos.ColorFromHex("#BCC1C6")) + G.FillEllipse(Background, New Rectangle(4, 4, 8, 8)) + End Using + + End If + + End If + + End Sub + + Protected Overrides Sub OnMouseUp(e As MouseEventArgs) + MyBase.OnMouseUp(e) + + If Enabled Then + + For Each C As Control In Parent.Controls + If TypeOf C Is XylosRadioButton Then + DirectCast(C, XylosRadioButton).Checked = False + End If + Next + + Checked = Not Checked + RaiseEvent CheckedChanged(Me, e) + End If + + End Sub + + Protected Overrides Sub OnResize(e As EventArgs) + MyBase.OnResize(e) + Size = New Size(Width, 18) + End Sub + +End Class + +Public Class XylosNotice + Inherits TextBox + + Private G As Graphics + Private B64 As String = "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABL0lEQVQ4T5VT0VGDQBB9e2cBdGBSgTIDEr9MCw7pI0kFtgB9yFiC+KWMmREqMOnAAuDWOfAiudzhyA/svtvH7Xu7BOv5eH2atVKtwbwk0LWGGVyDqLzoRB7e3u/HJTQOdm+PGYjWNuk4ZkIW36RbkzsS7KqiBnB1Usw49DHh8oQEXMfJKhwgAM4/Mw7RIp0NeLG3ScCcR4vVhnTPnVCf9rUZeImTdKnz71VREnBnn5FKzMnX95jA2V6vLufkBQFESTq0WBXsEla7owmcoC6QJMKW2oCUePY5M0lAjK0iBAQ8TBGc2/d7+uvnM/AQNF4Rp4bpiGkRfTb2Gigx12+XzQb3D9JfBGaQzHWm7HS000RJ2i/av5fJjPDZMplErwl1GxDpMTbL1YC5lCwze52/AQFekh7wKBpGAAAAAElFTkSuQmCC" + + Sub New() + DoubleBuffered = True + Enabled = False + [ReadOnly] = True + BorderStyle = BorderStyle.None + Multiline = True + Cursor = Cursors.Default + End Sub + + Protected Overrides Sub OnCreateControl() + MyBase.OnCreateControl() + SetStyle(ControlStyles.UserPaint, True) + End Sub + + Protected Overrides Sub OnPaint(e As PaintEventArgs) + G = e.Graphics + G.SmoothingMode = Drawing2D.SmoothingMode.HighQuality + G.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit + + MyBase.OnPaint(e) + + G.Clear(Color.White) + + Using Background As New SolidBrush(HelpersXylos.ColorFromHex("#FFFDE8")), MainBorder As New Pen(HelpersXylos.ColorFromHex("#F2F3F7")), TextColor As New SolidBrush(HelpersXylos.ColorFromHex("#B9B595")), TextFont As New Font("Segoe UI", 9) + G.FillPath(Background, HelpersXylos.RoundRect1(HelpersXylos.FullRectangle(Size, True), 3)) + G.DrawPath(MainBorder, HelpersXylos.RoundRect1(HelpersXylos.FullRectangle(Size, True), 3)) + G.DrawString(Text, TextFont, TextColor, New Point(30, 6)) + End Using + + Using I As Image = Image.FromStream(New IO.MemoryStream(Convert.FromBase64String(B64))) + G.DrawImage(I, New Rectangle(8, Height / 2 - 8, 16, 16)) + End Using + + End Sub + + Protected Overrides Sub OnMouseUp(e As MouseEventArgs) + MyBase.OnMouseUp(e) + + End Sub + +End Class + + +Public Class XylosTextBox + Inherits Control + + Enum MouseState As Byte + None = 0 + Over = 1 + Down = 2 + End Enum + + Private WithEvents TB As New TextBox + Private G As Graphics + Private State As MouseState + Private IsDown As Boolean + + Private _EnabledCalc As Boolean + Private _allowpassword As Boolean = False + Private _maxChars As Integer = 32767 + Private _textAlignment As HorizontalAlignment + Private _multiLine As Boolean = False + Private _readOnly As Boolean = False + + Public Shadows Property Enabled As Boolean + Get + Return EnabledCalc + End Get + Set(value As Boolean) + TB.Enabled = value + _EnabledCalc = value + Invalidate() + End Set + End Property + + Public Property EnabledCalc As Boolean + Get + Return _EnabledCalc + End Get + Set(value As Boolean) + Enabled = value + Invalidate() + End Set + End Property + + Public Shadows Property UseSystemPasswordChar() As Boolean + Get + Return _allowpassword + End Get + Set(ByVal value As Boolean) + TB.UseSystemPasswordChar = UseSystemPasswordChar + _allowpassword = value + Invalidate() + End Set + End Property + + Public Shadows Property MaxLength() As Integer + Get + Return _maxChars + End Get + Set(ByVal value As Integer) + _maxChars = value + TB.MaxLength = MaxLength + Invalidate() + End Set + End Property + + Public Shadows Property TextAlign() As HorizontalAlignment + Get + Return _textAlignment + End Get + Set(ByVal value As HorizontalAlignment) + _textAlignment = value + Invalidate() + End Set + End Property + + Public Shadows Property MultiLine() As Boolean + Get + Return _multiLine + End Get + Set(ByVal value As Boolean) + _multiLine = value + TB.Multiline = value + OnResize(EventArgs.Empty) + Invalidate() + End Set + End Property + + Public Shadows Property [ReadOnly]() As Boolean + Get + Return _readOnly + End Get + Set(ByVal value As Boolean) + _readOnly = value + If TB IsNot Nothing Then + TB.ReadOnly = value + End If + End Set + End Property + + Protected Overrides Sub OnTextChanged(ByVal e As EventArgs) + MyBase.OnTextChanged(e) + Invalidate() + End Sub + + Protected Overrides Sub OnBackColorChanged(ByVal e As EventArgs) + MyBase.OnBackColorChanged(e) + Invalidate() + End Sub + + Protected Overrides Sub OnForeColorChanged(ByVal e As EventArgs) + MyBase.OnForeColorChanged(e) + TB.ForeColor = ForeColor + Invalidate() + End Sub + + Protected Overrides Sub OnFontChanged(ByVal e As EventArgs) + MyBase.OnFontChanged(e) + TB.Font = Font + End Sub + + Protected Overrides Sub OnGotFocus(ByVal e As EventArgs) + MyBase.OnGotFocus(e) + TB.Focus() + End Sub + + Private Sub TextChangeTb() Handles TB.TextChanged + Text = TB.Text + End Sub + + Private Sub TextChng() Handles MyBase.TextChanged + TB.Text = Text + End Sub + + Public Sub NewTextBox() + With TB + .Text = String.Empty + .BackColor = Color.White + .ForeColor = HelpersXylos.ColorFromHex("#7C858E") + .TextAlign = HorizontalAlignment.Left + .BorderStyle = BorderStyle.None + .Location = New Point(3, 3) + .Font = New Font("Segoe UI", 9) + .Size = New Size(Width - 3, Height - 3) + .UseSystemPasswordChar = UseSystemPasswordChar + End With + End Sub + + Sub New() + MyBase.New() + NewTextBox() + Controls.Add(TB) + SetStyle(ControlStyles.UserPaint Or ControlStyles.SupportsTransparentBackColor, True) + DoubleBuffered = True + TextAlign = HorizontalAlignment.Left + ForeColor = HelpersXylos.ColorFromHex("#7C858E") + Font = New Font("Segoe UI", 9) + Size = New Size(130, 29) + Enabled = True + End Sub + + Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs) + + G = e.Graphics + G.SmoothingMode = Drawing2D.SmoothingMode.HighQuality + G.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit + + MyBase.OnPaint(e) + + G.Clear(Color.White) + + If Enabled Then + + TB.ForeColor = HelpersXylos.ColorFromHex("#7C858E") + + If State = MouseState.Down Then + + Using Border As New Pen(HelpersXylos.ColorFromHex("#78B7E6")) + G.DrawPath(Border, HelpersXylos.RoundRect1(HelpersXylos.FullRectangle(Size, True), 12)) + End Using + + Else + + Using Border As New Pen(HelpersXylos.ColorFromHex("#D0D5D9")) + G.DrawPath(Border, HelpersXylos.RoundRect1(HelpersXylos.FullRectangle(Size, True), 12)) + End Using + + End If + + Else + + TB.ForeColor = HelpersXylos.ColorFromHex("#7C858E") + + Using Border As New Pen(HelpersXylos.ColorFromHex("#E1E1E2")) + G.DrawPath(Border, HelpersXylos.RoundRect1(HelpersXylos.FullRectangle(Size, True), 12)) + End Using + + End If + + TB.TextAlign = TextAlign + TB.UseSystemPasswordChar = UseSystemPasswordChar + + End Sub + + Protected Overrides Sub OnResize(e As EventArgs) + MyBase.OnResize(e) + If Not MultiLine Then + Dim tbheight As Integer = TB.Height + TB.Location = New Point(10, CType(((Height / 2) - (tbheight / 2) - 0), Integer)) + TB.Size = New Size(Width - 20, tbheight) + Else + TB.Location = New Point(10, 10) + TB.Size = New Size(Width - 20, Height - 20) + End If + End Sub + + Protected Overrides Sub OnEnter(e As EventArgs) + MyBase.OnEnter(e) + State = MouseState.Down : Invalidate() + End Sub + + Protected Overrides Sub OnLeave(e As EventArgs) + MyBase.OnLeave(e) + State = MouseState.None : Invalidate() + End Sub + +End Class + +Public Class XylosProgressBar + Inherits Control + +#Region " Drawing " + + Private _Val As Integer = 0 + Private _Min As Integer = 0 + Private _Max As Integer = 100 + + Public Property Stripes As Color = Color.DarkGreen + Public Property BackgroundColor As Color = Color.Green + + + Public Property Value As Integer + Get + Return _Val + End Get + Set(value As Integer) + _Val = value + Invalidate() + End Set + End Property + + Public Property Minimum As Integer + Get + Return _Min + End Get + Set(value As Integer) + _Min = value + Invalidate() + End Set + End Property + + Public Property Maximum As Integer + Get + Return _Max + End Get + Set(value As Integer) + _Max = value + Invalidate() + End Set + End Property + + Sub New() + DoubleBuffered = True + Maximum = 100 + Minimum = 0 + Value = 0 + End Sub + + Protected Overrides Sub OnPaint(e As PaintEventArgs) + + Dim G As Graphics = e.Graphics + G.SmoothingMode = Drawing2D.SmoothingMode.HighQuality + G.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit + + MyBase.OnPaint(e) + + G.Clear(Color.White) + + Using Border As New Pen(HelpersXylos.ColorFromHex("#D0D5D9")) + G.DrawPath(Border, HelpersXylos.RoundRect1(HelpersXylos.FullRectangle(Size, True), 6)) + End Using + + If Not Value = 0 Then + + Using Background As New Drawing2D.HatchBrush(Drawing2D.HatchStyle.LightUpwardDiagonal, Stripes, BackgroundColor) + G.FillPath(Background, HelpersXylos.RoundRect1(New Rectangle(0, 0, Value / Maximum * Width - 1, Height - 1), 6)) + End Using + + End If + + + End Sub + +#End Region + +End Class + +Public Class XylosCombobox + Inherits ComboBox + + Private G As Graphics + Private Rect As Rectangle + Private _EnabledCalc As Boolean + + Public Shadows Property Enabled As Boolean + Get + Return EnabledCalc + End Get + Set(value As Boolean) + _EnabledCalc = value + Invalidate() + End Set + End Property + + Public Property EnabledCalc As Boolean + Get + Return _EnabledCalc + End Get + Set(value As Boolean) + MyBase.Enabled = value + Enabled = value + Invalidate() + End Set + End Property + + Sub New() + DoubleBuffered = True + DropDownStyle = ComboBoxStyle.DropDownList + Cursor = Cursors.Hand + Enabled = True + DrawMode = DrawMode.OwnerDrawFixed + ItemHeight = 20 + End Sub + + Protected Overrides Sub OnCreateControl() + MyBase.OnCreateControl() + SetStyle(ControlStyles.UserPaint, True) + End Sub + + Protected Overrides Sub OnPaint(e As PaintEventArgs) + G = e.Graphics + G.SmoothingMode = Drawing2D.SmoothingMode.HighQuality + G.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit + + MyBase.OnPaint(e) + + G.Clear(Color.White) + + If Enabled Then + + Using Border As New Pen(HelpersXylos.ColorFromHex("#D0D5D9")), TriangleColor As New SolidBrush(HelpersXylos.ColorFromHex("#7C858E")), TriangleFont As New Font("Marlett", 13) + G.DrawPath(Border, HelpersXylos.RoundRect1(HelpersXylos.FullRectangle(Size, True), 6)) + G.DrawString("6", TriangleFont, TriangleColor, New Point(Width - 22, 3)) + End Using + + Else + + Using Border As New Pen(HelpersXylos.ColorFromHex("#E1E1E2")), TriangleColor As New SolidBrush(HelpersXylos.ColorFromHex("#D0D3D7")), TriangleFont As New Font("Marlett", 13) + G.DrawPath(Border, HelpersXylos.RoundRect1(HelpersXylos.FullRectangle(Size, True), 6)) + G.DrawString("6", TriangleFont, TriangleColor, New Point(Width - 22, 3)) + End Using + + End If + + If Not IsNothing(Items) Then + + Using ItemsFont As New Font("Segoe UI", 9), ItemsColor As New SolidBrush(HelpersXylos.ColorFromHex("#7C858E")) + + If Enabled Then + + If Not SelectedIndex = -1 Then + G.DrawString(GetItemText(Items(SelectedIndex)), ItemsFont, ItemsColor, New Point(7, 4)) + Else + Try + G.DrawString(GetItemText(Items(0)), ItemsFont, ItemsColor, New Point(7, 4)) + Catch + End Try + End If + + Else + + Using DisabledItemsColor As New SolidBrush(HelpersXylos.ColorFromHex("#D0D3D7")) + + If Not SelectedIndex = -1 Then + G.DrawString(GetItemText(Items(SelectedIndex)), ItemsFont, DisabledItemsColor, New Point(7, 4)) + Else + G.DrawString(GetItemText(Items(0)), ItemsFont, DisabledItemsColor, New Point(7, 4)) + End If + + End Using + + End If + + End Using + + End If + + End Sub + + Protected Overrides Sub OnDrawItem(e As DrawItemEventArgs) + MyBase.OnDrawItem(e) + G = e.Graphics + G.SmoothingMode = Drawing2D.SmoothingMode.HighQuality + G.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit + + If Enabled Then + e.DrawBackground() + Rect = e.Bounds + + Try + + Using ItemsFont As New Font("Segoe UI", 9), Border As New Pen(HelpersXylos.ColorFromHex("#D0D5D9")) + + If (e.State And DrawItemState.Selected) = DrawItemState.Selected Then + + Using ItemsColor As New SolidBrush(Color.White), Itembackground As New SolidBrush(HelpersXylos.ColorFromHex("#78B7E6")) + G.FillRectangle(Itembackground, Rect) + G.DrawString(GetItemText(Items(e.Index)), New Font("Segoe UI", 9), Brushes.White, New Point(Rect.X + 5, Rect.Y + 1)) + End Using + + Else + Using ItemsColor As New SolidBrush(HelpersXylos.ColorFromHex("#7C858E")) + G.FillRectangle(Brushes.White, Rect) + G.DrawString(GetItemText(Items(e.Index)), New Font("Segoe UI", 9), ItemsColor, New Point(Rect.X + 5, Rect.Y + 1)) + End Using + + End If + + End Using + + Catch + End Try + + End If + + End Sub + + Protected Overrides Sub OnSelectedItemChanged(ByVal e As EventArgs) + MyBase.OnSelectedItemChanged(e) + Invalidate() + End Sub + +End Class + +Public Class XylosSeparator + Inherits Control + + Private G As Graphics + + Sub New() + DoubleBuffered = True + End Sub + + Protected Overrides Sub OnPaint(e As PaintEventArgs) + G = e.Graphics + G.SmoothingMode = Drawing2D.SmoothingMode.HighQuality + G.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit + + MyBase.OnPaint(e) + + Using C As New Pen(HelpersXylos.ColorFromHex("#EBEBEC")) + G.DrawLine(C, New Point(0, 0), New Point(Width, 0)) + End Using + + End Sub + + Protected Overrides Sub OnResize(e As EventArgs) + MyBase.OnResize(e) + Size = New Size(Width, 2) + End Sub + +End Class + +Public Class XylosButton + Inherits Control + + Enum MouseState As Byte + None = 0 + Over = 1 + Down = 2 + End Enum + + Private G As Graphics + Private State As MouseState + + Private _EnabledCalc As Boolean + + Public Shadows Event Click(sender As Object, e As EventArgs) + + Sub New() + DoubleBuffered = True + Enabled = True + End Sub + + Public Shadows Property Enabled As Boolean + Get + Return EnabledCalc + End Get + Set(value As Boolean) + _EnabledCalc = value + Invalidate() + End Set + End Property + + Public Property EnabledCalc As Boolean + Get + Return _EnabledCalc + End Get + Set(value As Boolean) + Enabled = value + Invalidate() + End Set + End Property + + Private _BackColorA As Color = Color.White + Public Property BackColorA As Color + Get + Return _BackColorA + End Get + Set(value As Color) + _BackColorA = value + Invalidate() + End Set + End Property + + + + Protected Overrides Sub OnPaint(e As PaintEventArgs) + + G = e.Graphics + G.SmoothingMode = Drawing2D.SmoothingMode.HighSpeed + G.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit + + MyBase.OnPaint(e) + + If Enabled Then + + Select Case State + + Case MouseState.Over + + Using Background As New SolidBrush(HelpersXylos.ColorFromHex("#FDFDFD")) + G.FillPath(Background, HelpersXylos.RoundRect1(HelpersXylos.FullRectangle(Size, True), 3)) + End Using + + Case MouseState.Down + + Using Background As New SolidBrush(HelpersXylos.ColorFromHex("#F0F0F0")) + G.FillPath(Background, HelpersXylos.RoundRect1(HelpersXylos.FullRectangle(Size, True), 3)) + End Using + + Case Else + + Using Background As New SolidBrush(_BackColorA) 'HelpersXylos.ColorFromHex("#F6F6F6") + G.FillPath(Background, HelpersXylos.RoundRect1(HelpersXylos.FullRectangle(Size, True), 3)) + End Using + + End Select + + Using ButtonFont As New Font("Segoe UI", 9), Border As New Pen(HelpersXylos.ColorFromHex("#C3C3C3")) + G.DrawPath(Border, HelpersXylos.RoundRect1(HelpersXylos.FullRectangle(Size, True), 3)) + HelpersXylos.CenterString(G, Text, ButtonFont, HelpersXylos.ColorFromHex("#7C858E"), HelpersXylos.FullRectangle(Size, False)) + End Using + + Else + + Using Background As New SolidBrush(_BackColorA), Border As New Pen(Color.White), ButtonFont As New Font("Segoe UI", 9) + G.FillPath(Background, HelpersXylos.RoundRect1(HelpersXylos.FullRectangle(Size, True), 3)) + G.DrawPath(Border, HelpersXylos.RoundRect1(HelpersXylos.FullRectangle(Size, True), 3)) + HelpersXylos.CenterString(G, Text, ButtonFont, HelpersXylos.ColorFromHex("#D0D3D7"), HelpersXylos.FullRectangle(Size, False)) + End Using + + End If + + End Sub + + Protected Overrides Sub OnMouseEnter(e As EventArgs) + MyBase.OnMouseEnter(e) + State = MouseState.Over : Invalidate() + End Sub + + Protected Overrides Sub OnMouseLeave(e As EventArgs) + MyBase.OnMouseLeave(e) + State = MouseState.None : Invalidate() + End Sub + + Protected Overrides Sub OnMouseUp(e As MouseEventArgs) + MyBase.OnMouseUp(e) + + If Enabled Then + RaiseEvent Click(Me, e) + End If + + State = MouseState.Over : Invalidate() + End Sub + + Protected Overrides Sub OnMouseDown(e As MouseEventArgs) + MyBase.OnMouseDown(e) + State = MouseState.Down : Invalidate() + End Sub + +End Class \ No newline at end of file diff --git a/HALOCELauncher/Controls/MenuStripZControl.vb b/HALOCELauncher/Controls/MenuStripZControl.vb new file mode 100644 index 0000000..ee64c0f --- /dev/null +++ b/HALOCELauncher/Controls/MenuStripZControl.vb @@ -0,0 +1,94 @@ +Imports System +Imports System.Collections.Generic +Imports System.Linq +Imports System.Text +Imports System.Drawing +Imports System.Drawing.Drawing2D +Imports System.Windows.Forms + +Namespace CustomWindowsForm + Public Class MenuStripZ + Inherits MenuStrip + + Public Sub New() + Me.Renderer = New MyMenuRenderer() + End Sub + End Class + + Public Class MyMenuRenderer + Inherits ToolStripRenderer + + Protected Overrides Sub OnRenderMenuItemBackground(ByVal e As ToolStripItemRenderEventArgs) + MyBase.OnRenderMenuItemBackground(e) + + If e.Item.Enabled Then + + If e.Item.IsOnDropDown = False AndAlso e.Item.Selected Then + Dim rect = New Rectangle(0, 0, e.Item.Width - 1, e.Item.Height - 1) + Dim rect2 = New Rectangle(0, 0, e.Item.Width - 1, e.Item.Height - 1) + e.Graphics.FillRectangle(New SolidBrush(Color.FromArgb(60, 60, 60)), rect) + e.Graphics.DrawRectangle(New Pen(New SolidBrush(Color.Black)), rect2) + e.Item.ForeColor = Color.White + Else + e.Item.ForeColor = Color.White + End If + + If e.Item.IsOnDropDown AndAlso e.Item.Selected Then + Dim rect = New Rectangle(0, 0, e.Item.Width - 1, e.Item.Height - 1) + e.Graphics.FillRectangle(New SolidBrush(Color.FromArgb(60, 60, 60)), rect) + e.Graphics.DrawRectangle(New Pen(New SolidBrush(Color.Black)), rect) + e.Item.ForeColor = Color.White + End If + + If (TryCast(e.Item, ToolStripMenuItem)).DropDown.Visible AndAlso e.Item.IsOnDropDown = False Then + Dim rect = New Rectangle(0, 0, e.Item.Width - 1, e.Item.Height - 1) + Dim rect2 = New Rectangle(0, 0, e.Item.Width - 1, e.Item.Height - 1) + e.Graphics.FillRectangle(New SolidBrush(Color.FromArgb(20, 20, 20)), rect) + e.Graphics.DrawRectangle(New Pen(New SolidBrush(Color.Black)), rect2) + e.Item.ForeColor = Color.White + End If + End If + End Sub + + Protected Overrides Sub OnRenderSeparator(ByVal e As ToolStripSeparatorRenderEventArgs) + MyBase.OnRenderSeparator(e) + Dim DarkLine = New SolidBrush(Color.FromArgb(30, 30, 30)) + Dim rect = New Rectangle(30, 3, e.Item.Width - 30, 1) + e.Graphics.FillRectangle(DarkLine, rect) + End Sub + + Protected Overrides Sub OnRenderItemCheck(ByVal e As ToolStripItemImageRenderEventArgs) + MyBase.OnRenderItemCheck(e) + + If e.Item.Selected Then + Dim rect = New Rectangle(4, 2, 18, 18) + Dim rect2 = New Rectangle(5, 3, 16, 16) + Dim b As SolidBrush = New SolidBrush(Color.Black) + Dim b2 As SolidBrush = New SolidBrush(Color.FromArgb(220, 220, 220)) + e.Graphics.FillRectangle(b, rect) + e.Graphics.FillRectangle(b2, rect2) + e.Graphics.DrawImage(e.Image, New Point(5, 3)) + Else + Dim rect = New Rectangle(4, 2, 18, 18) + Dim rect2 = New Rectangle(5, 3, 16, 16) + Dim b As SolidBrush = New SolidBrush(Color.White) + Dim b2 As SolidBrush = New SolidBrush(Color.FromArgb(255, 80, 90, 90)) + e.Graphics.FillRectangle(b, rect) + e.Graphics.FillRectangle(b2, rect2) + e.Graphics.DrawImage(e.Image, New Point(5, 3)) + End If + End Sub + + Protected Overrides Sub OnRenderImageMargin(ByVal e As ToolStripRenderEventArgs) + MyBase.OnRenderImageMargin(e) + Dim rect = New Rectangle(0, 0, e.ToolStrip.Width, e.ToolStrip.Height) + e.Graphics.FillRectangle(New SolidBrush(Color.FromArgb(36, 36, 36)), rect) + Dim DarkLine = New SolidBrush(Color.FromArgb(36, 36, 36)) + Dim rect3 = New Rectangle(0, 0, 26, e.AffectedBounds.Height) + e.Graphics.FillRectangle(DarkLine, rect3) + e.Graphics.DrawLine(New Pen(New SolidBrush(Color.FromArgb(36, 36, 36))), 28, 0, 28, e.AffectedBounds.Height) + Dim rect2 = New Rectangle(0, 0, e.ToolStrip.Width - 1, e.ToolStrip.Height - 1) + e.Graphics.DrawRectangle(New Pen(New SolidBrush(Color.Black)), rect2) + End Sub + End Class +End Namespace diff --git a/HALOCELauncher/Controls/PanelFX/PanelFX.vb b/HALOCELauncher/Controls/PanelFX/PanelFX.vb new file mode 100644 index 0000000..d107477 --- /dev/null +++ b/HALOCELauncher/Controls/PanelFX/PanelFX.vb @@ -0,0 +1,114 @@ +Imports HALOCELauncher.Types +Imports System.ComponentModel +Imports System.Security.Permissions +Imports HALOCELauncher.Win32FX + +<DisplayName("MyControl")> +<Description("A extended control.")> +<DesignTimeVisible(True)> +<DesignerCategory("UserControl")> +<ToolboxBitmap(GetType(UserControl))> +<ToolboxItemFilter("System.Windows.Forms", ToolboxItemFilterType.Require)> +<PermissionSet(SecurityAction.Demand, Name:="FullTrust")> +Public Class PanelFX : Inherits Panel : Implements IBufferedControl + + ''' ---------------------------------------------------------------------------------------------------- + ''' <summary> + ''' Gets the required creation parameters when the control handle is created. + ''' <para></para> + ''' The information returned by the <see cref="CreateParams"/> property is used to pass information about the + ''' initial state and appearance of this control, at the time an instance of this class is being created. + ''' </summary> + ''' ---------------------------------------------------------------------------------------------------- + ''' <value> + ''' The creation parameters. + ''' </value> + ''' ---------------------------------------------------------------------------------------------------- + <Browsable(False)> + <EditorBrowsable(EditorBrowsableState.Advanced)> + <Description("The required creation parameters when the control handle is created.")> + Protected Overrides ReadOnly Property CreateParams As CreateParams Implements IBufferedControl.CreateParams + Get + If (Me.preventFlickeringB) Then + Dim cp As CreateParams = MyBase.CreateParams + cp.ExStyle = (cp.ExStyle Or CInt(WindowStylesEx.WS_EX_COMPOSITED)) + Return cp + Else + Return MyBase.CreateParams + End If + End Get + End Property + + ''' ---------------------------------------------------------------------------------------------------- + ''' <summary> + ''' Gets or sets a value indicating whether this control should redraw its surface using a secondary buffer + ''' to reduce or prevent flicker. + ''' </summary> + ''' ---------------------------------------------------------------------------------------------------- + ''' <value> + ''' <see langword="True"/> if the surface of the control should be drawn using double buffering; + ''' otherwise, <see langword="False"/>. + ''' </value> + ''' ---------------------------------------------------------------------------------------------------- + <Browsable(True)> + <EditorBrowsable(EditorBrowsableState.Always)> + <DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)> + <Localizable(True)> + <Category("Behavior")> + <Description("Indicates whether this control should redraw its surface using a secondary buffer to reduce or prevent flicker.")> + <DefaultValue(GetType(Boolean), "False")> + Public Overridable Shadows Property DoubleBuffered As Boolean Implements IBufferedControl.DoubleBuffered + Get + Return MyBase.DoubleBuffered + End Get + Set(ByVal value As Boolean) + Me.SetStyle(ControlStyles.DoubleBuffer, value) + MyBase.DoubleBuffered = value + End Set + End Property + + ''' ---------------------------------------------------------------------------------------------------- + ''' <summary> + ''' Gets or sets a value that indicates whether the control should avoid unwanted flickering effects. + ''' <para></para> + ''' If <see langword="True"/>, this will avoid any flickering effect on the control, however, + ''' it will also have a negative impact by slowing down the responsiveness of the control about to 30% slower. + ''' <para></para> + ''' This negative impact doesn't affect to the performance of the application itself, + ''' just to the performance of this control. + ''' </summary> + ''' ---------------------------------------------------------------------------------------------------- + ''' <value> + ''' A value that indicates whether the control should avoid unwanted flickering effects. + ''' </value> + ''' ---------------------------------------------------------------------------------------------------- + <Browsable(True)> + <EditorBrowsable(EditorBrowsableState.Always)> + <DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)> + <Localizable(False)> + <Category("Behavior")> + <Description("Indicates whether the control should avoid unwanted flickering effects. If True, this will avoid any flickering effect on the control, however, it will also have a negative impact by slowing down the responsiveness of the control about to 30% slower.")> + <DefaultValue(GetType(Boolean), "False")> + Public Overridable Property PreventFlickering As Boolean Implements IBufferedControl.PreventFlickering + Get + Return Me.preventFlickeringB + End Get + Set(ByVal value As Boolean) + Me.preventFlickeringB = value + End Set + End Property + ''' ---------------------------------------------------------------------------------------------------- + ''' <summary> + ''' ( Backing Field ) + ''' A value that indicates whether the control should avoid unwanted flickering effects. + ''' </summary> + ''' ---------------------------------------------------------------------------------------------------- + Private preventFlickeringB As Boolean + + Public Sub New() + MyBase.SuspendLayout() + + MyBase.ResumeLayout(performLayout:=False) + End Sub + +End Class \ No newline at end of file diff --git a/HALOCELauncher/Controls/ServerTap/AddCustomServer.Designer.vb b/HALOCELauncher/Controls/ServerTap/AddCustomServer.Designer.vb new file mode 100644 index 0000000..dc90725 --- /dev/null +++ b/HALOCELauncher/Controls/ServerTap/AddCustomServer.Designer.vb @@ -0,0 +1,137 @@ +<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _ +Partial Class AddCustomServer + Inherits System.Windows.Forms.Form + + 'Form overrides dispose to clean up the component list. + <System.Diagnostics.DebuggerNonUserCode()> _ + 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 + + 'Required by the Windows Form Designer + Private components As System.ComponentModel.IContainer + + 'NOTE: The following procedure is required by the Windows Form Designer + 'It can be modified using the Windows Form Designer. + 'Do not modify it using the code editor. + <System.Diagnostics.DebuggerStepThrough()> _ + Private Sub InitializeComponent() + Me.GunaLabel1 = New Guna.UI.WinForms.GunaLabel() + Me.GunaButton1 = New Guna.UI.WinForms.GunaButton() + Me.GunaButton2 = New Guna.UI.WinForms.GunaButton() + Me.NameTextbox = New Guna.UI.WinForms.GunaTextBox() + Me.SuspendLayout() + ' + 'GunaLabel1 + ' + Me.GunaLabel1.AutoSize = True + Me.GunaLabel1.Font = New System.Drawing.Font("Consolas", 9.0!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte)) + Me.GunaLabel1.ForeColor = System.Drawing.Color.White + Me.GunaLabel1.Location = New System.Drawing.Point(12, 19) + Me.GunaLabel1.Name = "GunaLabel1" + Me.GunaLabel1.Size = New System.Drawing.Size(210, 14) + Me.GunaLabel1.TabIndex = 1 + Me.GunaLabel1.Text = "Enter New Server HOST:PORT..." + ' + 'GunaButton1 + ' + Me.GunaButton1.AnimationHoverSpeed = 0.07! + Me.GunaButton1.AnimationSpeed = 0.03! + Me.GunaButton1.BaseColor = System.Drawing.Color.FromArgb(CType(CType(100, Byte), Integer), CType(CType(88, Byte), Integer), CType(CType(255, Byte), Integer)) + Me.GunaButton1.BorderColor = System.Drawing.Color.Black + Me.GunaButton1.DialogResult = System.Windows.Forms.DialogResult.None + Me.GunaButton1.FocusedColor = System.Drawing.Color.Empty + Me.GunaButton1.Font = New System.Drawing.Font("Segoe UI", 9.0!) + Me.GunaButton1.ForeColor = System.Drawing.Color.White + Me.GunaButton1.Image = Nothing + Me.GunaButton1.ImageAlign = System.Windows.Forms.HorizontalAlignment.Center + Me.GunaButton1.ImageSize = New System.Drawing.Size(20, 20) + Me.GunaButton1.Location = New System.Drawing.Point(76, 102) + Me.GunaButton1.Name = "GunaButton1" + Me.GunaButton1.OnHoverBaseColor = System.Drawing.Color.FromArgb(CType(CType(151, Byte), Integer), CType(CType(143, Byte), Integer), CType(CType(255, Byte), Integer)) + Me.GunaButton1.OnHoverBorderColor = System.Drawing.Color.Black + Me.GunaButton1.OnHoverForeColor = System.Drawing.Color.White + Me.GunaButton1.OnHoverImage = Nothing + Me.GunaButton1.OnPressedColor = System.Drawing.Color.Black + Me.GunaButton1.Size = New System.Drawing.Size(60, 24) + Me.GunaButton1.TabIndex = 2 + Me.GunaButton1.Text = "OK" + Me.GunaButton1.TextAlign = System.Windows.Forms.HorizontalAlignment.Center + ' + 'GunaButton2 + ' + Me.GunaButton2.AnimationHoverSpeed = 0.07! + Me.GunaButton2.AnimationSpeed = 0.03! + Me.GunaButton2.BaseColor = System.Drawing.Color.FromArgb(CType(CType(100, Byte), Integer), CType(CType(88, Byte), Integer), CType(CType(255, Byte), Integer)) + Me.GunaButton2.BorderColor = System.Drawing.Color.Black + Me.GunaButton2.DialogResult = System.Windows.Forms.DialogResult.None + Me.GunaButton2.FocusedColor = System.Drawing.Color.Empty + Me.GunaButton2.Font = New System.Drawing.Font("Segoe UI", 9.0!) + Me.GunaButton2.ForeColor = System.Drawing.Color.White + Me.GunaButton2.Image = Nothing + Me.GunaButton2.ImageAlign = System.Windows.Forms.HorizontalAlignment.Center + Me.GunaButton2.ImageSize = New System.Drawing.Size(20, 20) + Me.GunaButton2.Location = New System.Drawing.Point(162, 102) + Me.GunaButton2.Name = "GunaButton2" + Me.GunaButton2.OnHoverBaseColor = System.Drawing.Color.FromArgb(CType(CType(151, Byte), Integer), CType(CType(143, Byte), Integer), CType(CType(255, Byte), Integer)) + Me.GunaButton2.OnHoverBorderColor = System.Drawing.Color.Black + Me.GunaButton2.OnHoverForeColor = System.Drawing.Color.White + Me.GunaButton2.OnHoverImage = Nothing + Me.GunaButton2.OnPressedColor = System.Drawing.Color.Black + Me.GunaButton2.Size = New System.Drawing.Size(60, 24) + Me.GunaButton2.TabIndex = 3 + Me.GunaButton2.Text = "Cancel" + Me.GunaButton2.TextAlign = System.Windows.Forms.HorizontalAlignment.Center + ' + 'NameTextbox + ' + Me.NameTextbox.BaseColor = System.Drawing.Color.FromArgb(CType(CType(14, Byte), Integer), CType(CType(14, Byte), Integer), CType(CType(14, Byte), Integer)) + Me.NameTextbox.BorderColor = System.Drawing.Color.FromArgb(CType(CType(66, Byte), Integer), CType(CType(58, Byte), Integer), CType(CType(170, Byte), Integer)) + Me.NameTextbox.BorderSize = 1 + Me.NameTextbox.Cursor = System.Windows.Forms.Cursors.IBeam + Me.NameTextbox.FocusedBaseColor = System.Drawing.Color.FromArgb(CType(CType(14, Byte), Integer), CType(CType(14, Byte), Integer), CType(CType(14, Byte), Integer)) + Me.NameTextbox.FocusedBorderColor = System.Drawing.Color.FromArgb(CType(CType(100, Byte), Integer), CType(CType(88, Byte), Integer), CType(CType(255, Byte), Integer)) + Me.NameTextbox.FocusedForeColor = System.Drawing.Color.White + Me.NameTextbox.Font = New System.Drawing.Font("Segoe UI", 9.0!) + Me.NameTextbox.ForeColor = System.Drawing.Color.White + Me.NameTextbox.Location = New System.Drawing.Point(39, 49) + Me.NameTextbox.MaxLength = 30 + Me.NameTextbox.Name = "NameTextbox" + Me.NameTextbox.PasswordChar = Global.Microsoft.VisualBasic.ChrW(0) + Me.NameTextbox.Size = New System.Drawing.Size(238, 26) + Me.NameTextbox.TabIndex = 45 + Me.NameTextbox.TextAlign = System.Windows.Forms.HorizontalAlignment.Center + ' + 'AddCustomServer + ' + Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) + Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font + Me.BackColor = System.Drawing.Color.FromArgb(CType(CType(34, Byte), Integer), CType(CType(34, Byte), Integer), CType(CType(34, Byte), Integer)) + Me.ClientSize = New System.Drawing.Size(319, 138) + Me.Controls.Add(Me.NameTextbox) + Me.Controls.Add(Me.GunaButton2) + Me.Controls.Add(Me.GunaButton1) + Me.Controls.Add(Me.GunaLabel1) + Me.MaximizeBox = False + Me.MinimizeBox = False + Me.Name = "AddCustomServer" + Me.Opacity = 0.9R + Me.ShowIcon = False + Me.ShowInTaskbar = False + Me.Text = "Add Server" + Me.TopMost = True + Me.ResumeLayout(False) + Me.PerformLayout() + + End Sub + Friend WithEvents GunaLabel1 As Guna.UI.WinForms.GunaLabel + Friend WithEvents GunaButton1 As Guna.UI.WinForms.GunaButton + Friend WithEvents GunaButton2 As Guna.UI.WinForms.GunaButton + Friend WithEvents NameTextbox As Guna.UI.WinForms.GunaTextBox +End Class diff --git a/HALOCELauncher/Controls/ServerTap/AddCustomServer.resx b/HALOCELauncher/Controls/ServerTap/AddCustomServer.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/HALOCELauncher/Controls/ServerTap/AddCustomServer.resx @@ -0,0 +1,120 @@ +<?xml version="1.0" encoding="utf-8"?> +<root> + <!-- + Microsoft ResX Schema + + Version 2.0 + + The primary goals of this format is to allow a simple XML format + that is mostly human readable. The generation and parsing of the + various data types are done through the TypeConverter classes + associated with the data types. + + Example: + + ... ado.net/XML headers & schema ... + <resheader name="resmimetype">text/microsoft-resx</resheader> + <resheader name="version">2.0</resheader> + <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader> + <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader> + <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data> + <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data> + <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64"> + <value>[base64 mime encoded serialized .NET Framework object]</value> + </data> + <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> + <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value> + <comment>This is a comment</comment> + </data> + + There are any number of "resheader" rows that contain simple + name/value pairs. + + Each data row contains a name, and value. The row also contains a + type or mimetype. Type corresponds to a .NET class that support + text/value conversion through the TypeConverter architecture. + Classes that don't support this are serialized and stored with the + mimetype set. + + The mimetype is used for serialized objects, and tells the + ResXResourceReader how to depersist the object. This is currently not + extensible. For a given mimetype the value must be set accordingly: + + Note - application/x-microsoft.net.object.binary.base64 is the format + that the ResXResourceWriter will generate, however the reader can + read any of the formats listed below. + + mimetype: application/x-microsoft.net.object.binary.base64 + value : The object must be serialized with + : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter + : and then encoded with base64 encoding. + + mimetype: application/x-microsoft.net.object.soap.base64 + value : The object must be serialized with + : System.Runtime.Serialization.Formatters.Soap.SoapFormatter + : and then encoded with base64 encoding. + + mimetype: application/x-microsoft.net.object.bytearray.base64 + value : The object must be serialized into a byte array + : using a System.ComponentModel.TypeConverter + : and then encoded with base64 encoding. + --> + <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> + <xsd:import namespace="http://www.w3.org/XML/1998/namespace" /> + <xsd:element name="root" msdata:IsDataSet="true"> + <xsd:complexType> + <xsd:choice maxOccurs="unbounded"> + <xsd:element name="metadata"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" /> + </xsd:sequence> + <xsd:attribute name="name" use="required" type="xsd:string" /> + <xsd:attribute name="type" type="xsd:string" /> + <xsd:attribute name="mimetype" type="xsd:string" /> + <xsd:attribute ref="xml:space" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="assembly"> + <xsd:complexType> + <xsd:attribute name="alias" type="xsd:string" /> + <xsd:attribute name="name" type="xsd:string" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="data"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> + <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" /> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" /> + <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" /> + <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" /> + <xsd:attribute ref="xml:space" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="resheader"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required" /> + </xsd:complexType> + </xsd:element> + </xsd:choice> + </xsd:complexType> + </xsd:element> + </xsd:schema> + <resheader name="resmimetype"> + <value>text/microsoft-resx</value> + </resheader> + <resheader name="version"> + <value>2.0</value> + </resheader> + <resheader name="reader"> + <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> + </resheader> + <resheader name="writer"> + <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> + </resheader> +</root> \ No newline at end of file diff --git a/HALOCELauncher/Controls/ServerTap/AddCustomServer.vb b/HALOCELauncher/Controls/ServerTap/AddCustomServer.vb new file mode 100644 index 0000000..831c110 --- /dev/null +++ b/HALOCELauncher/Controls/ServerTap/AddCustomServer.vb @@ -0,0 +1,58 @@ +Imports HALOCELauncher.Core.GameTracker +Imports HALOCELauncher.HaloQuery +Imports HALOCELauncher.Core.SvManager.SvFormatManager +Imports HALOCELauncher.Core.Helpers + +Public Class AddCustomServer + + Private Sub AddCustomServer_Load(sender As Object, e As EventArgs) Handles MyBase.Load + Me.Location = CenterForm(Form1, Me, Me.Location) + If Not My.Computer.Clipboard.ContainsImage() = True Then + NameTextbox.Text = My.Computer.Clipboard.GetText() + End If + End Sub + + Private Sub GunaButton1_Click(sender As Object, e As EventArgs) Handles GunaButton1.Click + If Not NameTextbox.Text = "" Then + Dim SvTemList As New List(Of ServerType) + Dim sv_tem As ServerType = GetCorrectFormat(NameTextbox.Text) + + If CheckDuplicateServerFromXML(sv_tem) = False Then + + SvTemList.Add(sv_tem) + Dim ProcesingXML As Boolean = WritteXmlServers(SvTemList) + If ProcesingXML = True Then + UpdateEx() + End If + + End If + Me.Close() + End If + End Sub + + Private Sub UpdateEx() + Servers.UpdateFavoriteTable() + End Sub + + Private Function GetCorrectFormat(ByVal IpAdd As String) As ServerType + Dim sv_tem As New ServerType + Try + Dim GetINFO As New HaloServerInfo({IpAdd}) + sv_tem.Name = GetINFO.Hostname + sv_tem.Players = GetINFO.PlayersCount & "/" & GetINFO.MaxPlayers + sv_tem.Map = GetINFO.MapName + Catch ex As Exception + sv_tem.Name = "Query Error" + sv_tem.Map = "Query Error" + sv_tem.Players = "-/-" + sv_tem.IPAdress = IpAdd + Return sv_tem + End Try + Return Nothing + End Function + + Private Sub GunaButton2_Click(sender As Object, e As EventArgs) Handles GunaButton2.Click + Me.Close() + End Sub + +End Class \ No newline at end of file diff --git a/HALOCELauncher/Controls/ServerTap/FavoritiesC.Designer.vb b/HALOCELauncher/Controls/ServerTap/FavoritiesC.Designer.vb new file mode 100644 index 0000000..00bf383 --- /dev/null +++ b/HALOCELauncher/Controls/ServerTap/FavoritiesC.Designer.vb @@ -0,0 +1,169 @@ +<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _ +Partial Class FavoritiesC + Inherits System.Windows.Forms.UserControl + + 'UserControl overrides dispose to clean up the component list. + <System.Diagnostics.DebuggerNonUserCode()> _ + 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 + + 'Required by the Windows Form Designer + Private components As System.ComponentModel.IContainer + + 'NOTE: The following procedure is required by the Windows Form Designer + 'It can be modified using the Windows Form Designer. + 'Do not modify it using the code editor. + <System.Diagnostics.DebuggerStepThrough()> _ + Private Sub InitializeComponent() + Me.components = New System.ComponentModel.Container() + Me.GunaPanel6 = New Guna.UI.WinForms.GunaPanel() + Me.Panel1 = New System.Windows.Forms.Panel() + Me.LabelTextLog = New Guna.UI.WinForms.GunaLabel() + Me.ListView1 = New HALOCELauncher.TransparentListView() + Me.ColumnHeader1 = CType(New System.Windows.Forms.ColumnHeader(), System.Windows.Forms.ColumnHeader) + Me.ColumnHeader2 = CType(New System.Windows.Forms.ColumnHeader(), System.Windows.Forms.ColumnHeader) + Me.GunaVScrollBar1 = New Guna.UI.WinForms.GunaVScrollBar() + Me.PanelContainer = New HALOCELauncher.PanelFX() + Me.AnimaContextMenuStrip1 = New HALOCELauncher.AnimaContextMenuStrip() + Me.RefreshSeverListToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem() + Me.Timer1 = New System.Windows.Forms.Timer(Me.components) + Me.GunaPanel6.SuspendLayout() + Me.Panel1.SuspendLayout() + Me.AnimaContextMenuStrip1.SuspendLayout() + Me.SuspendLayout() + ' + 'GunaPanel6 + ' + Me.GunaPanel6.Controls.Add(Me.Panel1) + Me.GunaPanel6.Controls.Add(Me.GunaVScrollBar1) + Me.GunaPanel6.Controls.Add(Me.PanelContainer) + Me.GunaPanel6.Dock = System.Windows.Forms.DockStyle.Fill + Me.GunaPanel6.Location = New System.Drawing.Point(0, 0) + Me.GunaPanel6.Name = "GunaPanel6" + Me.GunaPanel6.Size = New System.Drawing.Size(785, 330) + Me.GunaPanel6.TabIndex = 8 + ' + 'Panel1 + ' + Me.Panel1.Controls.Add(Me.LabelTextLog) + Me.Panel1.Controls.Add(Me.ListView1) + Me.Panel1.Dock = System.Windows.Forms.DockStyle.Right + Me.Panel1.Location = New System.Drawing.Point(594, 0) + Me.Panel1.Name = "Panel1" + Me.Panel1.Size = New System.Drawing.Size(191, 330) + Me.Panel1.TabIndex = 36 + ' + 'LabelTextLog + ' + Me.LabelTextLog.BackColor = System.Drawing.Color.Transparent + Me.LabelTextLog.Font = New System.Drawing.Font("Segoe UI", 9.0!) + Me.LabelTextLog.ForeColor = System.Drawing.Color.White + Me.LabelTextLog.Location = New System.Drawing.Point(-3, 117) + Me.LabelTextLog.Name = "LabelTextLog" + Me.LabelTextLog.Size = New System.Drawing.Size(191, 213) + Me.LabelTextLog.TabIndex = 12 + ' + 'ListView1 + ' + Me.ListView1.BorderStyle = System.Windows.Forms.BorderStyle.None + Me.ListView1.Columns.AddRange(New System.Windows.Forms.ColumnHeader() {Me.ColumnHeader1, Me.ColumnHeader2}) + Me.ListView1.ErrorTextColor = System.Drawing.Color.White + Me.ListView1.Font = New System.Drawing.Font("Calibri", 11.0!) + Me.ListView1.ForeColor = System.Drawing.Color.White + Me.ListView1.HighlightColor = System.Drawing.Color.Empty + Me.ListView1.Location = New System.Drawing.Point(0, 0) + Me.ListView1.Name = "ListView1" + Me.ListView1.OwnerDraw = True + Me.ListView1.RedrawInterval = 300 + Me.ListView1.RedrawOnMouseMove = False + Me.ListView1.Size = New System.Drawing.Size(188, 114) + Me.ListView1.TabIndex = 11 + Me.ListView1.UseCompatibleStateImageBehavior = False + Me.ListView1.View = System.Windows.Forms.View.Details + ' + 'ColumnHeader1 + ' + Me.ColumnHeader1.Text = "Player" + Me.ColumnHeader1.Width = 115 + ' + 'ColumnHeader2 + ' + Me.ColumnHeader2.Text = "Score" + Me.ColumnHeader2.Width = 53 + ' + 'GunaVScrollBar1 + ' + Me.GunaVScrollBar1.LargeChange = 10 + Me.GunaVScrollBar1.Location = New System.Drawing.Point(584, 0) + Me.GunaVScrollBar1.Maximum = 100 + Me.GunaVScrollBar1.Name = "GunaVScrollBar1" + Me.GunaVScrollBar1.Radius = 0 + Me.GunaVScrollBar1.ScrollIdleColor = System.Drawing.Color.Transparent + Me.GunaVScrollBar1.Size = New System.Drawing.Size(8, 330) + Me.GunaVScrollBar1.TabIndex = 33 + Me.GunaVScrollBar1.ThumbColor = System.Drawing.Color.White + Me.GunaVScrollBar1.ThumbHoverColor = System.Drawing.Color.Gray + Me.GunaVScrollBar1.ThumbPressedColor = System.Drawing.Color.Gray + ' + 'PanelContainer + ' + Me.PanelContainer.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink + Me.PanelContainer.ContextMenuStrip = Me.AnimaContextMenuStrip1 + Me.PanelContainer.Dock = System.Windows.Forms.DockStyle.Left + Me.PanelContainer.Location = New System.Drawing.Point(0, 0) + Me.PanelContainer.Name = "PanelContainer" + Me.PanelContainer.Size = New System.Drawing.Size(607, 330) + Me.PanelContainer.TabIndex = 34 + ' + 'AnimaContextMenuStrip1 + ' + Me.AnimaContextMenuStrip1.Font = New System.Drawing.Font("Segoe UI", 9.0!) + Me.AnimaContextMenuStrip1.ForeColor = System.Drawing.Color.FromArgb(CType(CType(200, Byte), Integer), CType(CType(200, Byte), Integer), CType(CType(200, Byte), Integer)) + Me.AnimaContextMenuStrip1.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.RefreshSeverListToolStripMenuItem}) + Me.AnimaContextMenuStrip1.Name = "AnimaContextMenuStrip1" + Me.AnimaContextMenuStrip1.Size = New System.Drawing.Size(166, 26) + ' + 'RefreshSeverListToolStripMenuItem + ' + Me.RefreshSeverListToolStripMenuItem.Name = "RefreshSeverListToolStripMenuItem" + Me.RefreshSeverListToolStripMenuItem.Size = New System.Drawing.Size(165, 22) + Me.RefreshSeverListToolStripMenuItem.Text = "Refresh Sever List" + ' + 'Timer1 + ' + Me.Timer1.Interval = 1 + ' + 'FavoritiesC + ' + Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) + Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font + Me.BackColor = System.Drawing.Color.FromArgb(CType(CType(64, Byte), Integer), CType(CType(64, Byte), Integer), CType(CType(64, Byte), Integer)) + Me.Controls.Add(Me.GunaPanel6) + Me.Name = "FavoritiesC" + Me.Size = New System.Drawing.Size(785, 330) + Me.GunaPanel6.ResumeLayout(False) + Me.Panel1.ResumeLayout(False) + Me.AnimaContextMenuStrip1.ResumeLayout(False) + Me.ResumeLayout(False) + + End Sub + Friend WithEvents GunaPanel6 As Guna.UI.WinForms.GunaPanel + Friend WithEvents GunaVScrollBar1 As Guna.UI.WinForms.GunaVScrollBar + Friend WithEvents PanelContainer As HALOCELauncher.PanelFX + Friend WithEvents Panel1 As System.Windows.Forms.Panel + Friend WithEvents LabelTextLog As Guna.UI.WinForms.GunaLabel + Friend WithEvents ListView1 As HALOCELauncher.TransparentListView + Friend WithEvents ColumnHeader1 As System.Windows.Forms.ColumnHeader + Friend WithEvents ColumnHeader2 As System.Windows.Forms.ColumnHeader + Friend WithEvents Timer1 As System.Windows.Forms.Timer + Friend WithEvents AnimaContextMenuStrip1 As HALOCELauncher.AnimaContextMenuStrip + Friend WithEvents RefreshSeverListToolStripMenuItem As System.Windows.Forms.ToolStripMenuItem + +End Class diff --git a/HALOCELauncher/Controls/ServerTap/FavoritiesC.resx b/HALOCELauncher/Controls/ServerTap/FavoritiesC.resx new file mode 100644 index 0000000..b5a8b23 --- /dev/null +++ b/HALOCELauncher/Controls/ServerTap/FavoritiesC.resx @@ -0,0 +1,126 @@ +<?xml version="1.0" encoding="utf-8"?> +<root> + <!-- + Microsoft ResX Schema + + Version 2.0 + + The primary goals of this format is to allow a simple XML format + that is mostly human readable. The generation and parsing of the + various data types are done through the TypeConverter classes + associated with the data types. + + Example: + + ... ado.net/XML headers & schema ... + <resheader name="resmimetype">text/microsoft-resx</resheader> + <resheader name="version">2.0</resheader> + <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader> + <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader> + <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data> + <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data> + <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64"> + <value>[base64 mime encoded serialized .NET Framework object]</value> + </data> + <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> + <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value> + <comment>This is a comment</comment> + </data> + + There are any number of "resheader" rows that contain simple + name/value pairs. + + Each data row contains a name, and value. The row also contains a + type or mimetype. Type corresponds to a .NET class that support + text/value conversion through the TypeConverter architecture. + Classes that don't support this are serialized and stored with the + mimetype set. + + The mimetype is used for serialized objects, and tells the + ResXResourceReader how to depersist the object. This is currently not + extensible. For a given mimetype the value must be set accordingly: + + Note - application/x-microsoft.net.object.binary.base64 is the format + that the ResXResourceWriter will generate, however the reader can + read any of the formats listed below. + + mimetype: application/x-microsoft.net.object.binary.base64 + value : The object must be serialized with + : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter + : and then encoded with base64 encoding. + + mimetype: application/x-microsoft.net.object.soap.base64 + value : The object must be serialized with + : System.Runtime.Serialization.Formatters.Soap.SoapFormatter + : and then encoded with base64 encoding. + + mimetype: application/x-microsoft.net.object.bytearray.base64 + value : The object must be serialized into a byte array + : using a System.ComponentModel.TypeConverter + : and then encoded with base64 encoding. + --> + <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> + <xsd:import namespace="http://www.w3.org/XML/1998/namespace" /> + <xsd:element name="root" msdata:IsDataSet="true"> + <xsd:complexType> + <xsd:choice maxOccurs="unbounded"> + <xsd:element name="metadata"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" /> + </xsd:sequence> + <xsd:attribute name="name" use="required" type="xsd:string" /> + <xsd:attribute name="type" type="xsd:string" /> + <xsd:attribute name="mimetype" type="xsd:string" /> + <xsd:attribute ref="xml:space" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="assembly"> + <xsd:complexType> + <xsd:attribute name="alias" type="xsd:string" /> + <xsd:attribute name="name" type="xsd:string" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="data"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> + <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" /> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" /> + <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" /> + <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" /> + <xsd:attribute ref="xml:space" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="resheader"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required" /> + </xsd:complexType> + </xsd:element> + </xsd:choice> + </xsd:complexType> + </xsd:element> + </xsd:schema> + <resheader name="resmimetype"> + <value>text/microsoft-resx</value> + </resheader> + <resheader name="version"> + <value>2.0</value> + </resheader> + <resheader name="reader"> + <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> + </resheader> + <resheader name="writer"> + <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> + </resheader> + <metadata name="AnimaContextMenuStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> + <value>106, 17</value> + </metadata> + <metadata name="Timer1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> + <value>17, 17</value> + </metadata> +</root> \ No newline at end of file diff --git a/HALOCELauncher/Controls/ServerTap/FavoritiesC.vb b/HALOCELauncher/Controls/ServerTap/FavoritiesC.vb new file mode 100644 index 0000000..94efd08 --- /dev/null +++ b/HALOCELauncher/Controls/ServerTap/FavoritiesC.vb @@ -0,0 +1,317 @@ +Imports HALOCELauncher.Core.GameTracker +Imports HALOCELauncher.Core.SvManager.SvFormatManager +Imports HALOCELauncher.Core.Utils.LogFuncs +Imports HALOCELauncher.HaloQuery + +Public Class FavoritiesC + + Public ReadOnly Property ServerCounter As Integer + Get + Return PanelContainer.Controls.Count + End Get + End Property + + Private Sub FavoritiesC_Load(sender As Object, e As EventArgs) Handles Me.Load + Try : AddHandler Application.ThreadException, AddressOf Application_Exception_Handler _ + : Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException, False) _ + : Catch : End Try + + Me.BackColor = Color.FromArgb(40, Color.Black) + ShowLoading(True) + StartControls() + End Sub + + Private Sub Application_Exception_Handler(ByVal sender As Object, ByVal e As System.Threading.ThreadExceptionEventArgs) + Dim ex As Exception = CType(e.Exception, Exception) + WriteLog(ex.Message, InfoType.Exception) + ClearAll() + End Sub + + Public Sub ClearAll() + CurrentPage = 1 + ContinueListing = True + PanelContainer.Controls.Clear() + ShowLoading(True) + ItemID = 0 + ItemsCount = 0 + Local_X = 0 + Local_Y = 2 + End Sub + + Private Sub ShowLoading(ByVal ShowL As Boolean) + If ShowL = True Then + Dim ControlLoader As New LoadingC + ControlLoader.BackColor = Color.Transparent + PanelContainer.Controls.Add(ControlLoader) + Dim PointX As Integer = (PanelContainer.Width / 2) - (ControlLoader.Width - 90) + Dim PointY As Integer = (PanelContainer.Height / 2) - (ControlLoader.Height - 20) + ControlLoader.Location = New Point(PointX, PointY) + Else + For Each childControl In PanelContainer.Controls + If TypeOf childControl Is LoadingC Then + PanelContainer.Controls.Remove(childControl) + Exit Sub + End If + Next + End If + End Sub + + Public Sub UpdateAll() + ClearAll() + If ExistsXmlServer() = True Then + ServerStartListing() + End If + End Sub + + Private Sub StartControls() + ScroolBar() + If ExistsXmlServer() = True Then + ServerStartListing() + End If + End Sub + + Dim CurrentPage As Integer = 1 + Dim ContinueListing As Boolean = True + + Private Sub ServerStartListing() + Dim tsk As New Task(ServerLister, TaskCreationOptions.LongRunning) + tsk.Start() + End Sub + + Dim ServerLister As New Action( + Sub() + If ContinueListing = True Then + ContinueListing = False + ServerListerSub() + End If + End Sub) + + Private Sub ServerListerSub() + On Error Resume Next + + Dim ResultDic As List(Of ServerType) = ReadXmlServers() + + For Each Result As ServerType In ResultDic + + Me.BeginInvoke(Sub() + ListServers(Result) + End Sub) + CurrentPage += 1 + Next + ContinueListing = True + Me.BeginInvoke(Sub() + RedrawList() + End Sub) + + ShowLoading(False) + End Sub + + Dim ItemID As Integer = 0 + + Dim ItemsCount As Integer = 0 + Dim Local_X As Integer = 0 + Dim Local_Y As Integer = 2 + + Private Sub ListServers(ByVal ServerInfoEx As ServerType) + + Dim NewItem As New sv_control + NewItem.Isfavorites = True + NewItem.Name = ItemID + NewItem.IPAdress = ServerInfoEx.IPAdress + NewItem.Namesv = ServerInfoEx.Name + NewItem.Players = ServerInfoEx.Players + NewItem.Map = ServerInfoEx.Map + PanelContainer.Controls.Add(NewItem) + + For Each ControlAdd As Control In NewItem.Controls + AddHandler ControlAdd.Click, AddressOf UserControl11_Click + Next + + NewItem.Location = New Point(Local_X, Local_Y) + ItemID += 1 + ItemsCount += 1 + + If ItemsCount = 1 Then + Local_X = 0 + Local_Y += 30 + ItemsCount = 0 + End If + + End Sub + + Private Sub RedrawList() + ItemID = 0 + ItemsCount = 0 + Local_X = 0 + Local_Y = 2 + + If CurrentPage > 2 Then + If ContinueListing = True Then + Dim LocalListEx As New List(Of sv_control) + LocalListEx.Clear() + For Each childControl In PanelContainer.Controls + If TypeOf childControl Is sv_control Then + LocalListEx.Add(childControl) + End If + Next + PanelContainer.Controls.Clear() + For Each svC As sv_control In LocalListEx + PanelContainer.Controls.Add(svC) + svC.Location = New Point(Local_X, Local_Y) + ItemID += 1 + ItemsCount += 1 + If ItemsCount = 1 Then + Local_X = 0 + Local_Y += 30 + ItemsCount = 0 + End If + Next + End If + End If + End Sub + +#Region " Scrollbar " + + Dim vScrollHelperMain As Guna.UI.Lib.ScrollBar.PanelScrollHelper + + Private Sub ScroolBar() + vScrollHelperMain = New Guna.UI.Lib.ScrollBar.PanelScrollHelper(PanelContainer, GunaVScrollBar1, False) + vScrollHelperMain.UpdateScrollBar() + End Sub + + Private Sub PanelContainer_Resize(sender As Object, e As EventArgs) + If vScrollHelperMain IsNot Nothing Then vScrollHelperMain.UpdateScrollBar() + End Sub + +#End Region + +#Region " SvPropertiesLoad " + + Dim _textToDisplay As String = String.Empty + + Private Sub UserControl11_Click(sender As Object, e As EventArgs) + _textToDisplay = String.Empty + LabelTextLog.Text = "" + ListView1.Items.Clear() + For Each childControl In PanelContainer.Controls + If TypeOf childControl Is sv_control Then + Dim GetBackgroung As Boolean = childControl.IsSelectedSv() + If GetBackgroung = True Then + + Try + Dim GetINFO As New HaloServerInfo({childControl.IPAdress.ToString}) + + For i As Integer = 0 To 2 + If GetINFO.Ready = True Then + Exit For + End If + i -= 1 + Next + + childControl.Players = GetINFO.PlayersCount & "/" & GetINFO.MaxPlayers + childControl.Map = GetINFO.MapName + childControl.UpdateSpecial() + _textToDisplay += "----Team Info " & vbNewLine + _textToDisplay += " Red : " & GetINFO.RedTeamInfo.Score.ToString & " Blue : " & GetINFO.BlueTeamInfo.Score.ToString & vbNewLine + + _textToDisplay += "----Server Info " & vbNewLine + _textToDisplay += " Version : " & GetINFO.GameVersion.ToString & vbNewLine & " Mode : " & GetINFO.Gamemode.ToString & vbNewLine + _textToDisplay += " Classic : " & GetINFO.GameClassic.ToString & " Type : " & GetINFO.GameType.ToString & vbNewLine + _textToDisplay += " Dedicated : " & CBool(GetINFO.Dedicated).ToString & vbNewLine + _textToDisplay += " Variant : " & GetINFO.GameVariant & vbNewLine + _textToDisplay += " Query ID : " & GetINFO.QueryID.ToString & " SAPP : " & GetINFO.SAPPC.ToString & vbNewLine + _textToDisplay += " Next [Map] : " & GetINFO.NextMap.ToString & vbNewLine & " [Mode] : " & GetINFO.NextMode.ToString & vbNewLine + + StartInfoProperties() + + ' Dim LineCount As String() = _textToDisplay.Split(vbNewLine) + + ' For Each LineEx As String In LineCount + ' ListBox1.Items.Add(LineEx) + ' Next + + Dim x As Integer = 0 + + For Each PlayerA As Player In GetINFO.PlayersList + ListView1.Items.Add(PlayerA.Name) + ListView1.Items(x).SubItems.Add(PlayerA.Score) + ListView1.Items(x).ForeColor = PlayerA.Team.TeamColor + x += 1 + Next + Catch ex As Exception + _textToDisplay += "Query Error, Please try later!" & vbNewLine + _textToDisplay += "" & vbNewLine + _textToDisplay += ex.Message + StartInfoProperties() + End Try + + End If + End If + Next + End Sub + + + Private _Showing As String = "" + Private _avrchar As Integer = 0 + Private _AwaitTIme As Integer = 0 + Private _MaxAwaitTIme As Integer = 0 + Private ContinueAwait As Boolean = True + + Private Sub StartInfoProperties() + _avrchar = 0 + _AwaitTIme = 0 + _MaxAwaitTIme = 100 + ContinueAwait = True + Timer1.Enabled = True + End Sub + + Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick + Try + If _AwaitTIme = _MaxAwaitTIme Then + ContinueAwait = False + If _Showing.Count < _textToDisplay.Count And _Showing.Count > 0 Then + _Showing = _textToDisplay.Substring(0, _Showing.Length + 1) + ElseIf _Showing.Count < _textToDisplay.Count And _Showing.Count = 0 Then + _Showing = _textToDisplay.Substring(0, 1) + ElseIf _Showing.Count < _avrchar Then + _Showing = " " + _Showing + Else + _Showing = "" + End If + LabelTextLog.Text = _Showing + If LabelTextLog.Text = _textToDisplay Then + Timer1.Enabled = False + End If + End If + + If ContinueAwait = True Then + _AwaitTIme += 1 + End If + + Catch ex As Exception + MsgBox(ex.ToString) + End Try + End Sub + + Private Function NumberfitCharsInTextBox(tb As TextBox) As Integer + Dim avgW As Integer = 0 + Dim avgH As Integer = 0 + Dim avg As Size + For i As Integer = 65 To 90 + avg = TextRenderer.MeasureText(CChar(ChrW(i)).ToString(), LabelTextLog.Font) + avgH += avg.Height + avgW += avg.Width + Next + Return CInt((((45 * LabelTextLog.Width) / avgW) * ((45 * LabelTextLog.Height) / avgH))) + End Function + +#End Region + + + + + Private Sub RefreshSeverListToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles RefreshSeverListToolStripMenuItem.Click + Me.UpdateAll() + End Sub + +End Class diff --git a/HALOCELauncher/Controls/ServerTap/InternetC.Designer.vb b/HALOCELauncher/Controls/ServerTap/InternetC.Designer.vb new file mode 100644 index 0000000..7e33dd5 --- /dev/null +++ b/HALOCELauncher/Controls/ServerTap/InternetC.Designer.vb @@ -0,0 +1,171 @@ +<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _ +Partial Class InternetC + Inherits System.Windows.Forms.UserControl + + 'UserControl overrides dispose to clean up the component list. + <System.Diagnostics.DebuggerNonUserCode()> _ + 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 + + 'Required by the Windows Form Designer + Private components As System.ComponentModel.IContainer + + 'NOTE: The following procedure is required by the Windows Form Designer + 'It can be modified using the Windows Form Designer. + 'Do not modify it using the code editor. + <System.Diagnostics.DebuggerStepThrough()> _ + Private Sub InitializeComponent() + Me.components = New System.ComponentModel.Container() + Me.GunaVScrollBar1 = New Guna.UI.WinForms.GunaVScrollBar() + Me.GunaPanel6 = New Guna.UI.WinForms.GunaPanel() + Me.Panel1 = New System.Windows.Forms.Panel() + Me.LabelTextLog = New Guna.UI.WinForms.GunaLabel() + Me.ListView1 = New HALOCELauncher.TransparentListView() + Me.ColumnHeader1 = CType(New System.Windows.Forms.ColumnHeader(), System.Windows.Forms.ColumnHeader) + Me.ColumnHeader2 = CType(New System.Windows.Forms.ColumnHeader(), System.Windows.Forms.ColumnHeader) + Me.PanelContainer = New HALOCELauncher.PanelFX() + Me.AnimaContextMenuStrip1 = New HALOCELauncher.AnimaContextMenuStrip() + Me.RefreshSeverListToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem() + Me.Timer1 = New System.Windows.Forms.Timer(Me.components) + Me.GunaPanel6.SuspendLayout() + Me.Panel1.SuspendLayout() + Me.AnimaContextMenuStrip1.SuspendLayout() + Me.SuspendLayout() + ' + 'GunaVScrollBar1 + ' + Me.GunaVScrollBar1.LargeChange = 10 + Me.GunaVScrollBar1.Location = New System.Drawing.Point(584, 0) + Me.GunaVScrollBar1.Maximum = 100 + Me.GunaVScrollBar1.Name = "GunaVScrollBar1" + Me.GunaVScrollBar1.Radius = 0 + Me.GunaVScrollBar1.ScrollIdleColor = System.Drawing.Color.Transparent + Me.GunaVScrollBar1.Size = New System.Drawing.Size(8, 330) + Me.GunaVScrollBar1.TabIndex = 33 + Me.GunaVScrollBar1.ThumbColor = System.Drawing.Color.White + Me.GunaVScrollBar1.ThumbHoverColor = System.Drawing.Color.Gray + Me.GunaVScrollBar1.ThumbPressedColor = System.Drawing.Color.Gray + ' + 'GunaPanel6 + ' + Me.GunaPanel6.Controls.Add(Me.Panel1) + Me.GunaPanel6.Controls.Add(Me.GunaVScrollBar1) + Me.GunaPanel6.Controls.Add(Me.PanelContainer) + Me.GunaPanel6.Dock = System.Windows.Forms.DockStyle.Fill + Me.GunaPanel6.Location = New System.Drawing.Point(0, 0) + Me.GunaPanel6.Name = "GunaPanel6" + Me.GunaPanel6.Size = New System.Drawing.Size(785, 330) + Me.GunaPanel6.TabIndex = 9 + ' + 'Panel1 + ' + Me.Panel1.Controls.Add(Me.LabelTextLog) + Me.Panel1.Controls.Add(Me.ListView1) + Me.Panel1.Dock = System.Windows.Forms.DockStyle.Right + Me.Panel1.Location = New System.Drawing.Point(594, 0) + Me.Panel1.Name = "Panel1" + Me.Panel1.Size = New System.Drawing.Size(191, 330) + Me.Panel1.TabIndex = 35 + ' + 'LabelTextLog + ' + Me.LabelTextLog.BackColor = System.Drawing.Color.Transparent + Me.LabelTextLog.Font = New System.Drawing.Font("Segoe UI", 9.0!) + Me.LabelTextLog.ForeColor = System.Drawing.Color.White + Me.LabelTextLog.Location = New System.Drawing.Point(-3, 117) + Me.LabelTextLog.Name = "LabelTextLog" + Me.LabelTextLog.Size = New System.Drawing.Size(191, 213) + Me.LabelTextLog.TabIndex = 12 + ' + 'ListView1 + ' + Me.ListView1.BorderStyle = System.Windows.Forms.BorderStyle.None + Me.ListView1.Columns.AddRange(New System.Windows.Forms.ColumnHeader() {Me.ColumnHeader1, Me.ColumnHeader2}) + Me.ListView1.ErrorTextColor = System.Drawing.Color.White + Me.ListView1.Font = New System.Drawing.Font("Calibri", 11.0!) + Me.ListView1.ForeColor = System.Drawing.Color.White + Me.ListView1.HighlightColor = System.Drawing.Color.Empty + Me.ListView1.Location = New System.Drawing.Point(0, 0) + Me.ListView1.Name = "ListView1" + Me.ListView1.OwnerDraw = True + Me.ListView1.RedrawInterval = 300 + Me.ListView1.RedrawOnMouseMove = False + Me.ListView1.Size = New System.Drawing.Size(188, 114) + Me.ListView1.TabIndex = 11 + Me.ListView1.UseCompatibleStateImageBehavior = False + Me.ListView1.View = System.Windows.Forms.View.Details + ' + 'ColumnHeader1 + ' + Me.ColumnHeader1.Text = "Player" + Me.ColumnHeader1.Width = 115 + ' + 'ColumnHeader2 + ' + Me.ColumnHeader2.Text = "Score" + Me.ColumnHeader2.Width = 53 + ' + 'PanelContainer + ' + Me.PanelContainer.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink + Me.PanelContainer.BackColor = System.Drawing.Color.Transparent + Me.PanelContainer.ContextMenuStrip = Me.AnimaContextMenuStrip1 + Me.PanelContainer.Dock = System.Windows.Forms.DockStyle.Left + Me.PanelContainer.Location = New System.Drawing.Point(0, 0) + Me.PanelContainer.Name = "PanelContainer" + Me.PanelContainer.Size = New System.Drawing.Size(607, 330) + Me.PanelContainer.TabIndex = 34 + ' + 'AnimaContextMenuStrip1 + ' + Me.AnimaContextMenuStrip1.Font = New System.Drawing.Font("Segoe UI", 9.0!) + Me.AnimaContextMenuStrip1.ForeColor = System.Drawing.Color.FromArgb(CType(CType(200, Byte), Integer), CType(CType(200, Byte), Integer), CType(CType(200, Byte), Integer)) + Me.AnimaContextMenuStrip1.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.RefreshSeverListToolStripMenuItem}) + Me.AnimaContextMenuStrip1.Name = "AnimaContextMenuStrip1" + Me.AnimaContextMenuStrip1.Size = New System.Drawing.Size(166, 26) + ' + 'RefreshSeverListToolStripMenuItem + ' + Me.RefreshSeverListToolStripMenuItem.Name = "RefreshSeverListToolStripMenuItem" + Me.RefreshSeverListToolStripMenuItem.Size = New System.Drawing.Size(165, 22) + Me.RefreshSeverListToolStripMenuItem.Text = "Refresh Sever List" + ' + 'Timer1 + ' + Me.Timer1.Interval = 1 + ' + 'InternetC + ' + Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) + Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font + Me.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink + Me.BackColor = System.Drawing.Color.Gray + Me.Controls.Add(Me.GunaPanel6) + Me.Name = "InternetC" + Me.Size = New System.Drawing.Size(785, 330) + Me.GunaPanel6.ResumeLayout(False) + Me.Panel1.ResumeLayout(False) + Me.AnimaContextMenuStrip1.ResumeLayout(False) + Me.ResumeLayout(False) + + End Sub + Friend WithEvents GunaVScrollBar1 As Guna.UI.WinForms.GunaVScrollBar + Friend WithEvents PanelContainer As HALOCELauncher.PanelFX + Friend WithEvents GunaPanel6 As Guna.UI.WinForms.GunaPanel + Friend WithEvents Panel1 As System.Windows.Forms.Panel + Friend WithEvents ListView1 As HALOCELauncher.TransparentListView + Friend WithEvents ColumnHeader1 As System.Windows.Forms.ColumnHeader + Friend WithEvents ColumnHeader2 As System.Windows.Forms.ColumnHeader + Friend WithEvents LabelTextLog As Guna.UI.WinForms.GunaLabel + Friend WithEvents Timer1 As System.Windows.Forms.Timer + Friend WithEvents AnimaContextMenuStrip1 As HALOCELauncher.AnimaContextMenuStrip + Friend WithEvents RefreshSeverListToolStripMenuItem As System.Windows.Forms.ToolStripMenuItem + +End Class diff --git a/HALOCELauncher/Controls/ServerTap/InternetC.resx b/HALOCELauncher/Controls/ServerTap/InternetC.resx new file mode 100644 index 0000000..724fcc1 --- /dev/null +++ b/HALOCELauncher/Controls/ServerTap/InternetC.resx @@ -0,0 +1,126 @@ +<?xml version="1.0" encoding="utf-8"?> +<root> + <!-- + Microsoft ResX Schema + + Version 2.0 + + The primary goals of this format is to allow a simple XML format + that is mostly human readable. The generation and parsing of the + various data types are done through the TypeConverter classes + associated with the data types. + + Example: + + ... ado.net/XML headers & schema ... + <resheader name="resmimetype">text/microsoft-resx</resheader> + <resheader name="version">2.0</resheader> + <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader> + <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader> + <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data> + <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data> + <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64"> + <value>[base64 mime encoded serialized .NET Framework object]</value> + </data> + <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> + <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value> + <comment>This is a comment</comment> + </data> + + There are any number of "resheader" rows that contain simple + name/value pairs. + + Each data row contains a name, and value. The row also contains a + type or mimetype. Type corresponds to a .NET class that support + text/value conversion through the TypeConverter architecture. + Classes that don't support this are serialized and stored with the + mimetype set. + + The mimetype is used for serialized objects, and tells the + ResXResourceReader how to depersist the object. This is currently not + extensible. For a given mimetype the value must be set accordingly: + + Note - application/x-microsoft.net.object.binary.base64 is the format + that the ResXResourceWriter will generate, however the reader can + read any of the formats listed below. + + mimetype: application/x-microsoft.net.object.binary.base64 + value : The object must be serialized with + : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter + : and then encoded with base64 encoding. + + mimetype: application/x-microsoft.net.object.soap.base64 + value : The object must be serialized with + : System.Runtime.Serialization.Formatters.Soap.SoapFormatter + : and then encoded with base64 encoding. + + mimetype: application/x-microsoft.net.object.bytearray.base64 + value : The object must be serialized into a byte array + : using a System.ComponentModel.TypeConverter + : and then encoded with base64 encoding. + --> + <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> + <xsd:import namespace="http://www.w3.org/XML/1998/namespace" /> + <xsd:element name="root" msdata:IsDataSet="true"> + <xsd:complexType> + <xsd:choice maxOccurs="unbounded"> + <xsd:element name="metadata"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" /> + </xsd:sequence> + <xsd:attribute name="name" use="required" type="xsd:string" /> + <xsd:attribute name="type" type="xsd:string" /> + <xsd:attribute name="mimetype" type="xsd:string" /> + <xsd:attribute ref="xml:space" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="assembly"> + <xsd:complexType> + <xsd:attribute name="alias" type="xsd:string" /> + <xsd:attribute name="name" type="xsd:string" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="data"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> + <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" /> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" /> + <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" /> + <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" /> + <xsd:attribute ref="xml:space" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="resheader"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required" /> + </xsd:complexType> + </xsd:element> + </xsd:choice> + </xsd:complexType> + </xsd:element> + </xsd:schema> + <resheader name="resmimetype"> + <value>text/microsoft-resx</value> + </resheader> + <resheader name="version"> + <value>2.0</value> + </resheader> + <resheader name="reader"> + <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> + </resheader> + <resheader name="writer"> + <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> + </resheader> + <metadata name="AnimaContextMenuStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> + <value>105, 20</value> + </metadata> + <metadata name="Timer1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> + <value>17, 17</value> + </metadata> +</root> \ No newline at end of file diff --git a/HALOCELauncher/Controls/ServerTap/InternetC.vb b/HALOCELauncher/Controls/ServerTap/InternetC.vb new file mode 100644 index 0000000..c20b7d4 --- /dev/null +++ b/HALOCELauncher/Controls/ServerTap/InternetC.vb @@ -0,0 +1,355 @@ +Imports HALOCELauncher.Core.GameTracker +Imports HALOCELauncher.Core.Utils.LogFuncs +Imports HALOCELauncher.HaloQuery +Imports HALOCELauncher.Core.SvManager.SvFormatManager + +Public Class InternetC + + Public ReadOnly Property ServerCounter As Integer + Get + Return PanelContainer.Controls.Count + End Get + End Property + + Private Sub InternetC_Load(sender As Object, e As EventArgs) Handles Me.Load + + Try : AddHandler Application.ThreadException, AddressOf Application_Exception_Handler _ + : Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException, False) _ + : Catch : End Try + + Me.BackColor = Color.FromArgb(40, Color.Black) + + ShowLoading(True) + End Sub + + Private Sub ShowLoading(ByVal ShowL As Boolean) + If ShowL = True Then + Dim ControlLoader As New LoadingC + ControlLoader.BackColor = Color.Transparent + PanelContainer.Controls.Add(ControlLoader) + Dim PointX As Integer = (PanelContainer.Width / 2) - (ControlLoader.Width - 90) + Dim PointY As Integer = (PanelContainer.Height / 2) - (ControlLoader.Height - 20) + ControlLoader.Location = New Point(PointX, PointY) + Else + For Each childControl In PanelContainer.Controls + If TypeOf childControl Is LoadingC Then + PanelContainer.Controls.Remove(childControl) + Exit Sub + End If + Next + End If + End Sub + + Private Sub Application_Exception_Handler(ByVal sender As Object, ByVal e As System.Threading.ThreadExceptionEventArgs) + Dim ex As Exception = CType(e.Exception, Exception) + WriteLog(ex.Message, InfoType.Exception) + ClearAll() + End Sub + + Public Sub ClearAll() + PanelContainer.Controls.Clear() + CurrentPage = 1 + ContinueListing = True + ShowLoading(True) + ItemID = 0 + ItemsCount = 0 + Local_X = 0 + Local_Y = 2 + End Sub + + Public Sub UpdateAll() + ClearAll() + ServerStartListing() + End Sub + + Public Sub StartControls() + ScroolBar() + ServerStartListing() + End Sub + + Dim CurrentPage As Integer = 1 + Dim ContinueListing As Boolean = True + + Private Sub ServerStartListing() + Dim tsk As New Task(ServerLister, TaskCreationOptions.LongRunning) + tsk.Start() + End Sub + + Dim ServerLister As New Action( + Sub() + For I As Integer = 0 To 50 + + Next + If ContinueListing = True Then + ContinueListing = False + ServerListerSub() + End If + End Sub) + + Private Sub ServerListerSub() + On Error Resume Next + + Dim EstartC As New GTAPI + Dim ResultDic As List(Of ServerType) = EstartC.GetServerList(GenerateUrl(CurrentPage)) + + For Each Result As ServerType In ResultDic + + Me.BeginInvoke(Sub() + ListServers(Result) + End Sub) + CurrentPage += 1 + Next + + ContinueListing = True + + Me.BeginInvoke(Sub() + RedrawList() + End Sub) + + ShowLoading(False) + End Sub + + Private Function GenerateUrl(ByVal Page As Integer) As String + If Page = 1 Then + Return "https://www.gametracker.com/search/halo/#search" + Else + Return "https://www.gametracker.com/search/halo/?searchpge=" & Page.ToString & "#search" + End If + End Function + + Dim ItemID As Integer = 0 + + Dim ItemsCount As Integer = 0 + Dim Local_X As Integer = 0 + Dim Local_Y As Integer = 2 + + Private Sub ListServers(ByVal ServerInfoEx As ServerType) + + Dim NewItem As New sv_control + NewItem.Isfavorites = False + NewItem.Name = ItemID + NewItem.IPAdress = ServerInfoEx.IPAdress + NewItem.Namesv = ServerInfoEx.Name + NewItem.Players = ServerInfoEx.Players + NewItem.Map = ServerInfoEx.Map + PanelContainer.Controls.Add(NewItem) + + For Each ControlAdd As Control In NewItem.Controls + AddHandler ControlAdd.Click, AddressOf UserControl11_Click + Next + + + NewItem.Location = New Point(Local_X, Local_Y) + + ItemID += 1 + ItemsCount += 1 + If ItemsCount = 1 Then + Local_X = 0 + Local_Y += 30 + ItemsCount = 0 + End If + + End Sub + + Private Sub RedrawList() + ItemID = 0 + ItemsCount = 0 + Local_X = 0 + Local_Y = 2 + + If CurrentPage > 2 Then + If ContinueListing = True Then + Dim LocalListEx As New List(Of sv_control) + LocalListEx.Clear() + For Each childControl In PanelContainer.Controls + If TypeOf childControl Is sv_control Then + LocalListEx.Add(childControl) + End If + Next + PanelContainer.Controls.Clear() + For Each svC As sv_control In LocalListEx + PanelContainer.Controls.Add(svC) + svC.Location = New Point(Local_X, Local_Y) + ItemID += 1 + ItemsCount += 1 + If ItemsCount = 1 Then + Local_X = 0 + Local_Y += 30 + ItemsCount = 0 + End If + Next + End If + End If + End Sub + + +#Region " Scrollbar " + + Dim vScrollHelperMain As Guna.UI.Lib.ScrollBar.PanelScrollHelper + + Private Sub ScroolBar() + vScrollHelperMain = New Guna.UI.Lib.ScrollBar.PanelScrollHelper(PanelContainer, GunaVScrollBar1, False) + vScrollHelperMain.UpdateScrollBar() + End Sub + + Private Sub PanelContainer_Resize(sender As Object, e As EventArgs) + If vScrollHelperMain IsNot Nothing Then vScrollHelperMain.UpdateScrollBar() + End Sub + +#End Region + + Private Sub GunaVScrollBar1_Scroll(sender As Object, e As ScrollEventArgs) Handles GunaVScrollBar1.Scroll + Dim CurrentValue As Integer = GunaVScrollBar1.Value + Dim CurrentMax As Integer = GunaVScrollBar1.Maximum + Dim Porcentage As Integer = (CurrentValue * 100) / CurrentMax + If Porcentage > 90 Then + ServerStartListing() + End If + End Sub + + Dim _textToDisplay As String = String.Empty + + Private Sub UserControl11_Click(sender As Object, e As EventArgs) + _textToDisplay = String.Empty + LabelTextLog.Text = "" + ListView1.Items.Clear() + For Each childControl In PanelContainer.Controls + If TypeOf childControl Is sv_control Then + Dim GetBackgroung As Boolean = childControl.IsSelectedSv() + If GetBackgroung = True Then + + Try + Dim GetINFO As New HaloServerInfo({childControl.IPAdress.ToString}) + + For i As Integer = 0 To 2 + If GetINFO.Ready = True Then + Exit For + End If + i -= 1 + Next + + childControl.Players = GetINFO.PlayersCount & "/" & GetINFO.MaxPlayers + childControl.Map = GetINFO.MapName + childControl.UpdateSpecial() + + _textToDisplay += "----Team Score " & vbNewLine + _textToDisplay += " Red : " & GetINFO.RedTeamInfo.Score.ToString & " Blue : " & GetINFO.BlueTeamInfo.Score.ToString & vbNewLine + + _textToDisplay += "----Server Info " & vbNewLine + _textToDisplay += " Version : " & GetINFO.GameVersion.ToString & vbNewLine & " Mode : " & GetINFO.Gamemode.ToString & vbNewLine + _textToDisplay += " Classic : " & GetINFO.GameClassic.ToString & " Type : " & GetINFO.GameType.ToString & vbNewLine + _textToDisplay += " Dedicated : " & CBool(GetINFO.Dedicated).ToString & vbNewLine + _textToDisplay += " Variant : " & GetINFO.GameVariant & vbNewLine + _textToDisplay += " Query ID : " & GetINFO.QueryID.ToString & " SAPP : " & GetINFO.SAPPC.ToString & vbNewLine + _textToDisplay += " Next [Map] : " & GetINFO.NextMap.ToString & vbNewLine & " [Mode] : " & GetINFO.NextMode.ToString & vbNewLine + + StartInfoProperties() + + ' Dim LineCount As String() = _textToDisplay.Split(vbNewLine) + + ' For Each LineEx As String In LineCount + ' ListBox1.Items.Add(LineEx) + ' Next + + Dim x As Integer = 0 + + For Each PlayerA As Player In GetINFO.PlayersList + ListView1.Items.Add(PlayerA.Name) + ListView1.Items(x).SubItems.Add(PlayerA.Score) + ListView1.Items(x).ForeColor = PlayerA.Team.TeamColor + x += 1 + Next + Catch ex As Exception + _textToDisplay += "Query Error, Please try later!" & vbNewLine + _textToDisplay += "" & vbNewLine + _textToDisplay += ex.Message + StartInfoProperties() + End Try + + End If + End If + Next + End Sub + + + Private _Showing As String = "" + Private _avrchar As Integer = 0 + Private _AwaitTIme As Integer = 0 + Private _MaxAwaitTIme As Integer = 0 + Private ContinueAwait As Boolean = True + + Private Sub StartInfoProperties() + _avrchar = 0 + _AwaitTIme = 0 + _MaxAwaitTIme = 100 + ContinueAwait = True + Timer1.Enabled = True + End Sub + + Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick + Try + If _AwaitTIme = _MaxAwaitTIme Then + ContinueAwait = False + If _Showing.Count < _textToDisplay.Count And _Showing.Count > 0 Then + _Showing = _textToDisplay.Substring(0, _Showing.Length + 1) + ElseIf _Showing.Count < _textToDisplay.Count And _Showing.Count = 0 Then + _Showing = _textToDisplay.Substring(0, 1) + ElseIf _Showing.Count < _avrchar Then + _Showing = " " + _Showing + Else + _Showing = "" + End If + LabelTextLog.Text = _Showing + If LabelTextLog.Text = _textToDisplay Then + Timer1.Enabled = False + End If + End If + + If ContinueAwait = True Then + _AwaitTIme += 1 + End If + + Catch ex As Exception + MsgBox(ex.ToString) + End Try + End Sub + + Private Function NumberfitCharsInTextBox(tb As TextBox) As Integer + Dim avgW As Integer = 0 + Dim avgH As Integer = 0 + Dim avg As Size + For i As Integer = 65 To 90 + avg = TextRenderer.MeasureText(CChar(ChrW(i)).ToString(), LabelTextLog.Font) + avgH += avg.Height + avgW += avg.Width + Next + Return CInt((((45 * LabelTextLog.Width) / avgW) * ((45 * LabelTextLog.Height) / avgH))) + End Function + +#Region " Write all to favorites " + + Public Function WriteAllServerTofavorites() As Boolean + Dim SvTemList As New List(Of ServerType) + SvTemList.Clear() + For Each childControl In PanelContainer.Controls + If TypeOf childControl Is sv_control Then + Dim sv_tem As New ServerType With {.Name = childControl.Namesv, .IPAdress = childControl.IPAdress, .Players = childControl.Players, .Map = childControl.Map} + If CheckDuplicateServerFromXML(sv_tem) = False Then + SvTemList.Add(sv_tem) + End If + End If + Next + Dim ProcesingXML As Boolean = WritteXmlServers(SvTemList) + If ProcesingXML = True Then + Servers.UpdateFavoriteTable() + End If + Return ProcesingXML + End Function + + +#End Region + + Private Sub RefreshSeverListToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles RefreshSeverListToolStripMenuItem.Click + UpdateAll() + End Sub +End Class diff --git a/HALOCELauncher/Controls/ServerTap/LoadingC.Designer.vb b/HALOCELauncher/Controls/ServerTap/LoadingC.Designer.vb new file mode 100644 index 0000000..24d0fdb --- /dev/null +++ b/HALOCELauncher/Controls/ServerTap/LoadingC.Designer.vb @@ -0,0 +1,95 @@ +<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _ +Partial Class LoadingC + Inherits System.Windows.Forms.UserControl + + 'UserControl overrides dispose to clean up the component list. + <System.Diagnostics.DebuggerNonUserCode()> _ + 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 + + 'Required by the Windows Form Designer + Private components As System.ComponentModel.IContainer + + 'NOTE: The following procedure is required by the Windows Form Designer + 'It can be modified using the Windows Form Designer. + 'Do not modify it using the code editor. + <System.Diagnostics.DebuggerStepThrough()> _ + Private Sub InitializeComponent() + Me.components = New System.ComponentModel.Container() + Me.GunaPanel1 = New Guna.UI.WinForms.GunaPanel() + Me.Panel1 = New System.Windows.Forms.Panel() + Me.Progress = New System.Windows.Forms.Panel() + Me.Timer1 = New System.Windows.Forms.Timer(Me.components) + Me.AnimaProgressBar1 = New HALOCELauncher.AnimaProgressBar() + Me.GunaPanel1.SuspendLayout() + Me.Panel1.SuspendLayout() + Me.SuspendLayout() + ' + 'GunaPanel1 + ' + Me.GunaPanel1.BackColor = System.Drawing.Color.Transparent + Me.GunaPanel1.Controls.Add(Me.Panel1) + Me.GunaPanel1.Controls.Add(Me.AnimaProgressBar1) + Me.GunaPanel1.Dock = System.Windows.Forms.DockStyle.Fill + Me.GunaPanel1.Location = New System.Drawing.Point(0, 0) + Me.GunaPanel1.Name = "GunaPanel1" + Me.GunaPanel1.Size = New System.Drawing.Size(263, 67) + Me.GunaPanel1.TabIndex = 0 + ' + 'Panel1 + ' + Me.Panel1.BackColor = System.Drawing.Color.Transparent + Me.Panel1.Controls.Add(Me.Progress) + Me.Panel1.Location = New System.Drawing.Point(26, 25) + Me.Panel1.Name = "Panel1" + Me.Panel1.Size = New System.Drawing.Size(206, 15) + Me.Panel1.TabIndex = 1 + ' + 'Progress + ' + Me.Progress.Location = New System.Drawing.Point(0, 0) + Me.Progress.Name = "Progress" + Me.Progress.Size = New System.Drawing.Size(11, 14) + Me.Progress.TabIndex = 0 + ' + 'Timer1 + ' + Me.Timer1.Enabled = True + Me.Timer1.Interval = 1 + ' + 'AnimaProgressBar1 + ' + Me.AnimaProgressBar1.BorderColors = System.Drawing.Color.SpringGreen + Me.AnimaProgressBar1.Location = New System.Drawing.Point(25, 23) + Me.AnimaProgressBar1.Name = "AnimaProgressBar1" + Me.AnimaProgressBar1.Size = New System.Drawing.Size(208, 18) + Me.AnimaProgressBar1.Style = System.Windows.Forms.ProgressBarStyle.Continuous + Me.AnimaProgressBar1.TabIndex = 0 + ' + 'LoadingC + ' + Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) + Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font + Me.BackColor = System.Drawing.Color.FromArgb(CType(CType(64, Byte), Integer), CType(CType(64, Byte), Integer), CType(CType(64, Byte), Integer)) + Me.Controls.Add(Me.GunaPanel1) + Me.Name = "LoadingC" + Me.Size = New System.Drawing.Size(263, 67) + Me.GunaPanel1.ResumeLayout(False) + Me.Panel1.ResumeLayout(False) + Me.ResumeLayout(False) + + End Sub + Friend WithEvents GunaPanel1 As Guna.UI.WinForms.GunaPanel + Friend WithEvents Panel1 As System.Windows.Forms.Panel + Friend WithEvents Progress As System.Windows.Forms.Panel + Friend WithEvents AnimaProgressBar1 As HALOCELauncher.AnimaProgressBar + Friend WithEvents Timer1 As System.Windows.Forms.Timer + +End Class diff --git a/HALOCELauncher/Controls/ServerTap/LoadingC.resx b/HALOCELauncher/Controls/ServerTap/LoadingC.resx new file mode 100644 index 0000000..d0d99f4 --- /dev/null +++ b/HALOCELauncher/Controls/ServerTap/LoadingC.resx @@ -0,0 +1,123 @@ +<?xml version="1.0" encoding="utf-8"?> +<root> + <!-- + Microsoft ResX Schema + + Version 2.0 + + The primary goals of this format is to allow a simple XML format + that is mostly human readable. The generation and parsing of the + various data types are done through the TypeConverter classes + associated with the data types. + + Example: + + ... ado.net/XML headers & schema ... + <resheader name="resmimetype">text/microsoft-resx</resheader> + <resheader name="version">2.0</resheader> + <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader> + <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader> + <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data> + <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data> + <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64"> + <value>[base64 mime encoded serialized .NET Framework object]</value> + </data> + <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> + <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value> + <comment>This is a comment</comment> + </data> + + There are any number of "resheader" rows that contain simple + name/value pairs. + + Each data row contains a name, and value. The row also contains a + type or mimetype. Type corresponds to a .NET class that support + text/value conversion through the TypeConverter architecture. + Classes that don't support this are serialized and stored with the + mimetype set. + + The mimetype is used for serialized objects, and tells the + ResXResourceReader how to depersist the object. This is currently not + extensible. For a given mimetype the value must be set accordingly: + + Note - application/x-microsoft.net.object.binary.base64 is the format + that the ResXResourceWriter will generate, however the reader can + read any of the formats listed below. + + mimetype: application/x-microsoft.net.object.binary.base64 + value : The object must be serialized with + : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter + : and then encoded with base64 encoding. + + mimetype: application/x-microsoft.net.object.soap.base64 + value : The object must be serialized with + : System.Runtime.Serialization.Formatters.Soap.SoapFormatter + : and then encoded with base64 encoding. + + mimetype: application/x-microsoft.net.object.bytearray.base64 + value : The object must be serialized into a byte array + : using a System.ComponentModel.TypeConverter + : and then encoded with base64 encoding. + --> + <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> + <xsd:import namespace="http://www.w3.org/XML/1998/namespace" /> + <xsd:element name="root" msdata:IsDataSet="true"> + <xsd:complexType> + <xsd:choice maxOccurs="unbounded"> + <xsd:element name="metadata"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" /> + </xsd:sequence> + <xsd:attribute name="name" use="required" type="xsd:string" /> + <xsd:attribute name="type" type="xsd:string" /> + <xsd:attribute name="mimetype" type="xsd:string" /> + <xsd:attribute ref="xml:space" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="assembly"> + <xsd:complexType> + <xsd:attribute name="alias" type="xsd:string" /> + <xsd:attribute name="name" type="xsd:string" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="data"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> + <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" /> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" /> + <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" /> + <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" /> + <xsd:attribute ref="xml:space" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="resheader"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required" /> + </xsd:complexType> + </xsd:element> + </xsd:choice> + </xsd:complexType> + </xsd:element> + </xsd:schema> + <resheader name="resmimetype"> + <value>text/microsoft-resx</value> + </resheader> + <resheader name="version"> + <value>2.0</value> + </resheader> + <resheader name="reader"> + <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> + </resheader> + <resheader name="writer"> + <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> + </resheader> + <metadata name="Timer1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> + <value>17, 17</value> + </metadata> +</root> \ No newline at end of file diff --git a/HALOCELauncher/Controls/ServerTap/LoadingC.vb b/HALOCELauncher/Controls/ServerTap/LoadingC.vb new file mode 100644 index 0000000..179bb0f --- /dev/null +++ b/HALOCELauncher/Controls/ServerTap/LoadingC.vb @@ -0,0 +1,40 @@ +Public Class LoadingC + + Dim Retorn As Boolean = False + Dim Xmove As Integer = 0 + Dim Pcolor As Integer = 0 + Dim ColorRetorn As Boolean = False + + Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick + + If ColorRetorn = False Then + Pcolor += 1 + Progress.BackColor = Color.FromArgb(Pcolor, Pcolor, Pcolor) + If Pcolor = 255 Then + ColorRetorn = True + End If + ElseIf ColorRetorn = True Then + Pcolor -= 1 + Progress.BackColor = Color.FromArgb(Pcolor, Pcolor, Pcolor) + If Pcolor = 0 Then + ColorRetorn = False + End If + End If + + If Retorn = False Then + Xmove += 1 + Progress.Location = New Point(Xmove, 0) + If Xmove = 195 Then + Retorn = True + End If + ElseIf Retorn = True Then + Xmove -= 1 + Progress.Location = New Point(Xmove, 0) + If Xmove = 0 Then + Retorn = False + End If + End If + + End Sub + +End Class diff --git a/HALOCELauncher/Controls/ServerTap/sv_control.Designer.vb b/HALOCELauncher/Controls/ServerTap/sv_control.Designer.vb new file mode 100644 index 0000000..8164573 --- /dev/null +++ b/HALOCELauncher/Controls/ServerTap/sv_control.Designer.vb @@ -0,0 +1,278 @@ +<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _ +Partial Class sv_control + Inherits System.Windows.Forms.UserControl + + 'UserControl overrides dispose to clean up the component list. + <System.Diagnostics.DebuggerNonUserCode()> _ + 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 + + 'Required by the Windows Form Designer + Private components As System.ComponentModel.IContainer + + 'NOTE: The following procedure is required by the Windows Form Designer + 'It can be modified using the Windows Form Designer. + 'Do not modify it using the code editor. + <System.Diagnostics.DebuggerStepThrough()> _ + Private Sub InitializeComponent() + Me.components = New System.ComponentModel.Container() + Me.GunaElipse1 = New Guna.UI.WinForms.GunaElipse(Me.components) + Me.HostNamelbl = New Guna.UI.WinForms.GunaLabel() + Me.AnimaContextMenuStrip1 = New HALOCELauncher.AnimaContextMenuStrip() + Me.ConnectToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem() + Me.ConnectWithHALOPCToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem() + Me.ToolStripSeparator1 = New System.Windows.Forms.ToolStripSeparator() + Me.AddToFavoritesToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem() + Me.AddAllServersToFavoritesToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem() + Me.DeleteServerToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem() + Me.RefreshServerToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem() + Me.ToolStripSeparator2 = New System.Windows.Forms.ToolStripSeparator() + Me.CopyServerInfoToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem() + Me.CreateAndCopyServerInviteToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem() + Me.GunaElipse2 = New Guna.UI.WinForms.GunaElipse(Me.components) + Me.Playerslbl = New Guna.UI.WinForms.GunaLabel() + Me.GunaElipse3 = New Guna.UI.WinForms.GunaElipse(Me.components) + Me.Pinglbl = New Guna.UI.WinForms.GunaLabel() + Me.GunaElipse4 = New Guna.UI.WinForms.GunaElipse(Me.components) + Me.Modelbl = New Guna.UI.WinForms.GunaLabel() + Me.Maplbl = New Guna.UI.WinForms.GunaLabel() + Me.GunaButton1 = New Guna.UI.WinForms.GunaButton() + Me.BackgroundWorker1 = New System.ComponentModel.BackgroundWorker() + Me.AnimaContextMenuStrip1.SuspendLayout() + Me.SuspendLayout() + ' + 'GunaElipse1 + ' + Me.GunaElipse1.TargetControl = Me.HostNamelbl + ' + 'HostNamelbl + ' + Me.HostNamelbl.AutoSize = True + Me.HostNamelbl.BackColor = System.Drawing.Color.Transparent + Me.HostNamelbl.ContextMenuStrip = Me.AnimaContextMenuStrip1 + Me.HostNamelbl.Font = New System.Drawing.Font("Segoe UI", 9.0!) + Me.HostNamelbl.ForeColor = System.Drawing.Color.White + Me.HostNamelbl.Location = New System.Drawing.Point(3, 5) + Me.HostNamelbl.Name = "HostNamelbl" + Me.HostNamelbl.Size = New System.Drawing.Size(64, 15) + Me.HostNamelbl.TabIndex = 1 + Me.HostNamelbl.Text = "HostName" + ' + 'AnimaContextMenuStrip1 + ' + Me.AnimaContextMenuStrip1.BackColor = System.Drawing.Color.White + Me.AnimaContextMenuStrip1.Font = New System.Drawing.Font("Segoe UI", 9.0!) + Me.AnimaContextMenuStrip1.ForeColor = System.Drawing.Color.FromArgb(CType(CType(200, Byte), Integer), CType(CType(200, Byte), Integer), CType(CType(200, Byte), Integer)) + Me.AnimaContextMenuStrip1.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.ConnectToolStripMenuItem, Me.ConnectWithHALOPCToolStripMenuItem, Me.ToolStripSeparator1, Me.AddToFavoritesToolStripMenuItem, Me.AddAllServersToFavoritesToolStripMenuItem, Me.DeleteServerToolStripMenuItem, Me.RefreshServerToolStripMenuItem, Me.ToolStripSeparator2, Me.CopyServerInfoToolStripMenuItem, Me.CreateAndCopyServerInviteToolStripMenuItem}) + Me.AnimaContextMenuStrip1.Name = "AnimaContextMenuStrip1" + Me.AnimaContextMenuStrip1.Size = New System.Drawing.Size(233, 192) + ' + 'ConnectToolStripMenuItem + ' + Me.ConnectToolStripMenuItem.ForeColor = System.Drawing.Color.White + Me.ConnectToolStripMenuItem.Name = "ConnectToolStripMenuItem" + Me.ConnectToolStripMenuItem.Size = New System.Drawing.Size(232, 22) + Me.ConnectToolStripMenuItem.Text = "Connect with HALO CE" + ' + 'ConnectWithHALOPCToolStripMenuItem + ' + Me.ConnectWithHALOPCToolStripMenuItem.ForeColor = System.Drawing.Color.White + Me.ConnectWithHALOPCToolStripMenuItem.Name = "ConnectWithHALOPCToolStripMenuItem" + Me.ConnectWithHALOPCToolStripMenuItem.Size = New System.Drawing.Size(232, 22) + Me.ConnectWithHALOPCToolStripMenuItem.Text = "Connect with HALO PC" + ' + 'ToolStripSeparator1 + ' + Me.ToolStripSeparator1.Name = "ToolStripSeparator1" + Me.ToolStripSeparator1.Size = New System.Drawing.Size(229, 6) + ' + 'AddToFavoritesToolStripMenuItem + ' + Me.AddToFavoritesToolStripMenuItem.ForeColor = System.Drawing.Color.White + Me.AddToFavoritesToolStripMenuItem.Name = "AddToFavoritesToolStripMenuItem" + Me.AddToFavoritesToolStripMenuItem.Size = New System.Drawing.Size(232, 22) + Me.AddToFavoritesToolStripMenuItem.Text = "Add to Favorites" + ' + 'AddAllServersToFavoritesToolStripMenuItem + ' + Me.AddAllServersToFavoritesToolStripMenuItem.ForeColor = System.Drawing.Color.White + Me.AddAllServersToFavoritesToolStripMenuItem.Name = "AddAllServersToFavoritesToolStripMenuItem" + Me.AddAllServersToFavoritesToolStripMenuItem.Size = New System.Drawing.Size(232, 22) + Me.AddAllServersToFavoritesToolStripMenuItem.Text = "Add All Servers To favorites" + ' + 'DeleteServerToolStripMenuItem + ' + Me.DeleteServerToolStripMenuItem.ForeColor = System.Drawing.Color.White + Me.DeleteServerToolStripMenuItem.Name = "DeleteServerToolStripMenuItem" + Me.DeleteServerToolStripMenuItem.Size = New System.Drawing.Size(232, 22) + Me.DeleteServerToolStripMenuItem.Text = "Delete Server" + ' + 'RefreshServerToolStripMenuItem + ' + Me.RefreshServerToolStripMenuItem.ForeColor = System.Drawing.Color.White + Me.RefreshServerToolStripMenuItem.Name = "RefreshServerToolStripMenuItem" + Me.RefreshServerToolStripMenuItem.Size = New System.Drawing.Size(232, 22) + Me.RefreshServerToolStripMenuItem.Text = "Refresh server" + ' + 'ToolStripSeparator2 + ' + Me.ToolStripSeparator2.Name = "ToolStripSeparator2" + Me.ToolStripSeparator2.Size = New System.Drawing.Size(229, 6) + ' + 'CopyServerInfoToolStripMenuItem + ' + Me.CopyServerInfoToolStripMenuItem.ForeColor = System.Drawing.Color.White + Me.CopyServerInfoToolStripMenuItem.Name = "CopyServerInfoToolStripMenuItem" + Me.CopyServerInfoToolStripMenuItem.Size = New System.Drawing.Size(232, 22) + Me.CopyServerInfoToolStripMenuItem.Text = "Copy server Info" + ' + 'CreateAndCopyServerInviteToolStripMenuItem + ' + Me.CreateAndCopyServerInviteToolStripMenuItem.ForeColor = System.Drawing.Color.White + Me.CreateAndCopyServerInviteToolStripMenuItem.Name = "CreateAndCopyServerInviteToolStripMenuItem" + Me.CreateAndCopyServerInviteToolStripMenuItem.Size = New System.Drawing.Size(232, 22) + Me.CreateAndCopyServerInviteToolStripMenuItem.Text = "Create and Copy Server Invite " + ' + 'GunaElipse2 + ' + Me.GunaElipse2.TargetControl = Me.Playerslbl + ' + 'Playerslbl + ' + Me.Playerslbl.AutoSize = True + Me.Playerslbl.BackColor = System.Drawing.Color.Transparent + Me.Playerslbl.ContextMenuStrip = Me.AnimaContextMenuStrip1 + Me.Playerslbl.Font = New System.Drawing.Font("Segoe UI", 9.0!) + Me.Playerslbl.ForeColor = System.Drawing.Color.White + Me.Playerslbl.Location = New System.Drawing.Point(267, 5) + Me.Playerslbl.Name = "Playerslbl" + Me.Playerslbl.Size = New System.Drawing.Size(44, 15) + Me.Playerslbl.TabIndex = 2 + Me.Playerslbl.Text = "Players" + ' + 'GunaElipse3 + ' + Me.GunaElipse3.TargetControl = Me.Pinglbl + ' + 'Pinglbl + ' + Me.Pinglbl.AutoSize = True + Me.Pinglbl.BackColor = System.Drawing.Color.Transparent + Me.Pinglbl.ContextMenuStrip = Me.AnimaContextMenuStrip1 + Me.Pinglbl.Font = New System.Drawing.Font("Segoe UI", 9.0!) + Me.Pinglbl.ForeColor = System.Drawing.Color.White + Me.Pinglbl.Location = New System.Drawing.Point(336, 5) + Me.Pinglbl.Name = "Pinglbl" + Me.Pinglbl.Size = New System.Drawing.Size(29, 15) + Me.Pinglbl.TabIndex = 3 + Me.Pinglbl.Text = "0ms" + ' + 'GunaElipse4 + ' + Me.GunaElipse4.TargetControl = Me.Modelbl + ' + 'Modelbl + ' + Me.Modelbl.AutoSize = True + Me.Modelbl.BackColor = System.Drawing.Color.Transparent + Me.Modelbl.ContextMenuStrip = Me.AnimaContextMenuStrip1 + Me.Modelbl.Font = New System.Drawing.Font("Segoe UI", 9.0!) + Me.Modelbl.ForeColor = System.Drawing.Color.White + Me.Modelbl.Location = New System.Drawing.Point(497, 5) + Me.Modelbl.Name = "Modelbl" + Me.Modelbl.Size = New System.Drawing.Size(38, 15) + Me.Modelbl.TabIndex = 4 + Me.Modelbl.Text = "Mode" + ' + 'Maplbl + ' + Me.Maplbl.AutoSize = True + Me.Maplbl.BackColor = System.Drawing.Color.Transparent + Me.Maplbl.ContextMenuStrip = Me.AnimaContextMenuStrip1 + Me.Maplbl.Font = New System.Drawing.Font("Segoe UI", 9.0!) + Me.Maplbl.ForeColor = System.Drawing.Color.White + Me.Maplbl.Location = New System.Drawing.Point(396, 5) + Me.Maplbl.Name = "Maplbl" + Me.Maplbl.Size = New System.Drawing.Size(33, 15) + Me.Maplbl.TabIndex = 5 + Me.Maplbl.Text = "MAP" + ' + 'GunaButton1 + ' + Me.GunaButton1.AnimationHoverSpeed = 0.07! + Me.GunaButton1.AnimationSpeed = 0.03! + Me.GunaButton1.BackColor = System.Drawing.Color.Transparent + Me.GunaButton1.BaseColor = System.Drawing.Color.Transparent + Me.GunaButton1.BorderColor = System.Drawing.Color.Transparent + Me.GunaButton1.BorderSize = 1 + Me.GunaButton1.ContextMenuStrip = Me.AnimaContextMenuStrip1 + Me.GunaButton1.DialogResult = System.Windows.Forms.DialogResult.None + Me.GunaButton1.Dock = System.Windows.Forms.DockStyle.Fill + Me.GunaButton1.FocusedColor = System.Drawing.Color.Empty + Me.GunaButton1.Font = New System.Drawing.Font("Segoe UI", 9.0!) + Me.GunaButton1.ForeColor = System.Drawing.Color.White + Me.GunaButton1.Image = Nothing + Me.GunaButton1.ImageSize = New System.Drawing.Size(20, 20) + Me.GunaButton1.Location = New System.Drawing.Point(0, 0) + Me.GunaButton1.Name = "GunaButton1" + Me.GunaButton1.OnHoverBaseColor = System.Drawing.Color.Transparent + Me.GunaButton1.OnHoverBorderColor = System.Drawing.Color.SpringGreen + Me.GunaButton1.OnHoverForeColor = System.Drawing.Color.White + Me.GunaButton1.OnHoverImage = Nothing + Me.GunaButton1.OnPressedColor = System.Drawing.Color.Black + Me.GunaButton1.Radius = 1 + Me.GunaButton1.Size = New System.Drawing.Size(578, 25) + Me.GunaButton1.TabIndex = 0 + ' + 'BackgroundWorker1 + ' + ' + 'sv_control + ' + Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) + Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font + Me.BackColor = System.Drawing.Color.FromArgb(CType(CType(64, Byte), Integer), CType(CType(64, Byte), Integer), CType(CType(64, Byte), Integer)) + Me.Controls.Add(Me.Maplbl) + Me.Controls.Add(Me.Modelbl) + Me.Controls.Add(Me.Pinglbl) + Me.Controls.Add(Me.Playerslbl) + Me.Controls.Add(Me.HostNamelbl) + Me.Controls.Add(Me.GunaButton1) + Me.Name = "sv_control" + Me.Size = New System.Drawing.Size(578, 25) + Me.AnimaContextMenuStrip1.ResumeLayout(False) + Me.ResumeLayout(False) + Me.PerformLayout() + + End Sub + Friend WithEvents GunaButton1 As Guna.UI.WinForms.GunaButton + Friend WithEvents HostNamelbl As Guna.UI.WinForms.GunaLabel + Friend WithEvents Playerslbl As Guna.UI.WinForms.GunaLabel + Friend WithEvents Pinglbl As Guna.UI.WinForms.GunaLabel + Friend WithEvents Modelbl As Guna.UI.WinForms.GunaLabel + Friend WithEvents GunaElipse1 As Guna.UI.WinForms.GunaElipse + Friend WithEvents GunaElipse2 As Guna.UI.WinForms.GunaElipse + Friend WithEvents GunaElipse3 As Guna.UI.WinForms.GunaElipse + Friend WithEvents GunaElipse4 As Guna.UI.WinForms.GunaElipse + Friend WithEvents Maplbl As Guna.UI.WinForms.GunaLabel + Friend WithEvents AnimaContextMenuStrip1 As HALOCELauncher.AnimaContextMenuStrip + Friend WithEvents ConnectToolStripMenuItem As System.Windows.Forms.ToolStripMenuItem + Friend WithEvents ToolStripSeparator1 As System.Windows.Forms.ToolStripSeparator + Friend WithEvents AddToFavoritesToolStripMenuItem As System.Windows.Forms.ToolStripMenuItem + Friend WithEvents DeleteServerToolStripMenuItem As System.Windows.Forms.ToolStripMenuItem + Friend WithEvents RefreshServerToolStripMenuItem As System.Windows.Forms.ToolStripMenuItem + Friend WithEvents ToolStripSeparator2 As System.Windows.Forms.ToolStripSeparator + Friend WithEvents CopyServerInfoToolStripMenuItem As System.Windows.Forms.ToolStripMenuItem + Friend WithEvents AddAllServersToFavoritesToolStripMenuItem As System.Windows.Forms.ToolStripMenuItem + Friend WithEvents CreateAndCopyServerInviteToolStripMenuItem As System.Windows.Forms.ToolStripMenuItem + Friend WithEvents ConnectWithHALOPCToolStripMenuItem As System.Windows.Forms.ToolStripMenuItem + Friend WithEvents BackgroundWorker1 As System.ComponentModel.BackgroundWorker + +End Class diff --git a/HALOCELauncher/Controls/ServerTap/sv_control.resx b/HALOCELauncher/Controls/ServerTap/sv_control.resx new file mode 100644 index 0000000..5dd2997 --- /dev/null +++ b/HALOCELauncher/Controls/ServerTap/sv_control.resx @@ -0,0 +1,138 @@ +<?xml version="1.0" encoding="utf-8"?> +<root> + <!-- + Microsoft ResX Schema + + Version 2.0 + + The primary goals of this format is to allow a simple XML format + that is mostly human readable. The generation and parsing of the + various data types are done through the TypeConverter classes + associated with the data types. + + Example: + + ... ado.net/XML headers & schema ... + <resheader name="resmimetype">text/microsoft-resx</resheader> + <resheader name="version">2.0</resheader> + <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader> + <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader> + <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data> + <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data> + <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64"> + <value>[base64 mime encoded serialized .NET Framework object]</value> + </data> + <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> + <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value> + <comment>This is a comment</comment> + </data> + + There are any number of "resheader" rows that contain simple + name/value pairs. + + Each data row contains a name, and value. The row also contains a + type or mimetype. Type corresponds to a .NET class that support + text/value conversion through the TypeConverter architecture. + Classes that don't support this are serialized and stored with the + mimetype set. + + The mimetype is used for serialized objects, and tells the + ResXResourceReader how to depersist the object. This is currently not + extensible. For a given mimetype the value must be set accordingly: + + Note - application/x-microsoft.net.object.binary.base64 is the format + that the ResXResourceWriter will generate, however the reader can + read any of the formats listed below. + + mimetype: application/x-microsoft.net.object.binary.base64 + value : The object must be serialized with + : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter + : and then encoded with base64 encoding. + + mimetype: application/x-microsoft.net.object.soap.base64 + value : The object must be serialized with + : System.Runtime.Serialization.Formatters.Soap.SoapFormatter + : and then encoded with base64 encoding. + + mimetype: application/x-microsoft.net.object.bytearray.base64 + value : The object must be serialized into a byte array + : using a System.ComponentModel.TypeConverter + : and then encoded with base64 encoding. + --> + <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> + <xsd:import namespace="http://www.w3.org/XML/1998/namespace" /> + <xsd:element name="root" msdata:IsDataSet="true"> + <xsd:complexType> + <xsd:choice maxOccurs="unbounded"> + <xsd:element name="metadata"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" /> + </xsd:sequence> + <xsd:attribute name="name" use="required" type="xsd:string" /> + <xsd:attribute name="type" type="xsd:string" /> + <xsd:attribute name="mimetype" type="xsd:string" /> + <xsd:attribute ref="xml:space" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="assembly"> + <xsd:complexType> + <xsd:attribute name="alias" type="xsd:string" /> + <xsd:attribute name="name" type="xsd:string" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="data"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> + <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" /> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" /> + <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" /> + <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" /> + <xsd:attribute ref="xml:space" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="resheader"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required" /> + </xsd:complexType> + </xsd:element> + </xsd:choice> + </xsd:complexType> + </xsd:element> + </xsd:schema> + <resheader name="resmimetype"> + <value>text/microsoft-resx</value> + </resheader> + <resheader name="version"> + <value>2.0</value> + </resheader> + <resheader name="reader"> + <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> + </resheader> + <resheader name="writer"> + <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> + </resheader> + <metadata name="GunaElipse1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> + <value>17, 17</value> + </metadata> + <metadata name="AnimaContextMenuStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> + <value>489, 17</value> + </metadata> + <metadata name="GunaElipse2.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> + <value>135, 17</value> + </metadata> + <metadata name="GunaElipse3.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> + <value>253, 17</value> + </metadata> + <metadata name="GunaElipse4.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> + <value>371, 17</value> + </metadata> + <metadata name="BackgroundWorker1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> + <value>681, 17</value> + </metadata> +</root> \ No newline at end of file diff --git a/HALOCELauncher/Controls/ServerTap/sv_control.vb b/HALOCELauncher/Controls/ServerTap/sv_control.vb new file mode 100644 index 0000000..98e3cf9 --- /dev/null +++ b/HALOCELauncher/Controls/ServerTap/sv_control.vb @@ -0,0 +1,316 @@ +Imports HALOCELauncher.HaloQuery +Imports HALOCELauncher.Core.SvManager.SvFormatManager +Imports HALOCELauncher.Core.GameTracker + +Public Class sv_control + +#Region " Properties " + + Private _Namesv As String = Nothing + Private _IPAdress As String = Nothing + Private _Map As String = Nothing + Private _ListID As Integer = Nothing + Private _Players As String = Nothing + + Public Property Players As String + Get + Return _Players + End Get + Set(value As String) + _Players = value + End Set + End Property + + Public Property Map As String + Get + Return _Map + End Get + Set(value As String) + _Map = value + End Set + End Property + + Public Property Namesv As String + Get + Return _Namesv + End Get + Set(value As String) + _Namesv = value + End Set + End Property + + Public Property IPAdress As String + Get + Return _IPAdress + End Get + Set(value As String) + _IPAdress = value + End Set + End Property + + Public Property ListID As Integer + Get + Return _ListID + End Get + Set(value As Integer) + _ListID = value + End Set + End Property + + Private Sub UpdateValues() + HostNamelbl.Text = _Namesv + Playerslbl.Text = _Players + Maplbl.Text = _Map + Try + If Not IPAdress = Nothing Then + Dim GetINFO As New HaloServerInfo({IPAdress}) + Maplbl.Text = GetINFO.MapName + Playerslbl.Text = GetINFO.PlayersCount & "/" & GetINFO.MaxPlayers + Modelbl.Text = GetINFO.GameType + End If + Catch ex As Exception + Modelbl.Text = "CTF" + End Try + End Sub + + Public Function IsSelectedSv() As Boolean + If Me.BackColor = Color.Transparent Then + Return False + Else + Return True + End If + End Function + + Public Function IsSelected() As Boolean + Return IsMauseInControl + End Function + + Private _Isfavorites As Boolean = False + Public Property Isfavorites As Boolean + Get + Return _Isfavorites + End Get + Set(value As Boolean) + _Isfavorites = value + End Set + End Property + + Public Sub UpdateSpecial() + Playerslbl.Text = _Players + Maplbl.Text = _Map + End Sub + +#End Region + + Private Sub UpdateEx() + If _Isfavorites = True Then + 'Servers.UpdateFavoriteTable() + UpdateAe = True + End If + End Sub + + Private Sub sv_control_Load(sender As Object, e As EventArgs) Handles Me.Load + Me.BackColor = Color.Transparent + Pinglbl.Text = "" + If _Isfavorites = True Then + Me.AnimaContextMenuStrip1.Items.Item(2).Visible = False + Me.AnimaContextMenuStrip1.Items.Item(3).Visible = False + Else + Me.AnimaContextMenuStrip1.Items.Item(2).Visible = True + Me.AnimaContextMenuStrip1.Items.Item(3).Visible = False + End If + Me.UpdateValues() + HandlesSub() + BackgroundWorker1.RunWorkerAsync() + End Sub + + Private Sub HandlesSub() + + AddHandler HostNamelbl.MouseHover, AddressOf HandleHover + AddHandler HostNamelbl.MouseLeave, AddressOf HandleLeave + AddHandler HostNamelbl.Click, AddressOf GunaButton1_Click + AddHandler HostNamelbl.MouseDoubleClick, AddressOf HandleDoubleClick + + AddHandler Playerslbl.MouseHover, AddressOf HandleHover + AddHandler Playerslbl.MouseLeave, AddressOf HandleLeave + AddHandler Playerslbl.Click, AddressOf GunaButton1_Click + AddHandler Playerslbl.MouseDoubleClick, AddressOf HandleDoubleClick + + AddHandler Modelbl.MouseHover, AddressOf HandleHover + AddHandler Modelbl.MouseLeave, AddressOf HandleLeave + AddHandler Modelbl.Click, AddressOf GunaButton1_Click + AddHandler Modelbl.MouseDoubleClick, AddressOf HandleDoubleClick + + AddHandler Maplbl.MouseHover, AddressOf HandleHover + AddHandler Maplbl.MouseLeave, AddressOf HandleLeave + AddHandler Maplbl.Click, AddressOf GunaButton1_Click + AddHandler Maplbl.MouseDoubleClick, AddressOf HandleDoubleClick + + AddHandler Pinglbl.MouseHover, AddressOf HandleHover + AddHandler Pinglbl.MouseLeave, AddressOf HandleLeave + AddHandler Pinglbl.Click, AddressOf GunaButton1_Click + AddHandler Pinglbl.MouseDoubleClick, AddressOf HandleDoubleClick + + End Sub + + Private IsMauseInControl As Boolean = False + Private Sub HandleHover(sender As Object, e As EventArgs) + Me.BackColor = GunaButton1.OnHoverBaseColor + Me.GunaButton1.BorderColor = Color.SpringGreen + IsMauseInControl = True + End Sub + + Private Sub HandleLeave(sender As Object, e As EventArgs) + Me.GunaButton1.BorderColor = Color.Transparent + Me.BackColor = GunaButton1.OnHoverBaseColor + IsMauseInControl = False + End Sub + + Private Sub HandleDoubleClick(sender As Object, e As EventArgs) + ConnectServer(My.Settings.GameDefect) + End Sub + + Private Sub GunaButton1_MouseDoubleClick(sender As Object, e As MouseEventArgs) Handles GunaButton1.MouseDoubleClick + ConnectServer(My.Settings.GameDefect) + End Sub + + Private Sub GunaButton1_MouseHover(sender As Object, e As EventArgs) Handles GunaButton1.MouseHover + ' IsMauseInControl = True + Me.BackColor = GunaButton1.OnHoverBaseColor + End Sub + + Private Sub GunaButton1_MouseLeave(sender As Object, e As EventArgs) Handles GunaButton1.MouseLeave + Me.BackColor = Color.Transparent + End Sub + + Private Sub GunaButton1_Click(sender As Object, e As EventArgs) Handles GunaButton1.Click + ' Servers.GetAllInfo(_IPAdress) + Me.BackColor = Color.FromArgb(40, Color.Black) + End Sub + + + Private Sub ConnectServer(ByVal TypeGame As Integer) + If TypeGame = 0 Then + If My.Settings.GameDirCE = "" Then + Else + Dim NewLauncher As New Core.Launcher(My.Settings.GameDirCE) + NewLauncher.Launch(IPAdress) + End If + ElseIf TypeGame = 1 Then + If My.Settings.GameDirCE = "" Then + Else + Dim NewLauncher As New Core.Launcher(My.Settings.GameDirPC) + NewLauncher.Launch(IPAdress) + End If + End If + End Sub + + Private WithEvents TimerMonitorCheck As New Timer With {.Enabled = True, .Interval = 1} + + Private Sub TimerMonitorCheck_Tick(sender As Object, e As EventArgs) + If IsMauseInControl = True Then + GunaButton1.BorderColor = Color.SpringGreen + Else + GunaButton1.BorderColor = Color.Transparent + End If + If My.Settings.GameDirCE = "" Then + Me.AnimaContextMenuStrip1.Items.Item(0).Visible = False + End If + If My.Settings.GameDirPC = "" Then + Me.AnimaContextMenuStrip1.Items.Item(1).Visible = False + End If + If IsMauseInControl = True Then + If Continues = True Then + BackgroundWorker1.RunWorkerAsync() + Continues = False + End If + + Pinglbl.Text = pingms + End If + + End Sub + +#Region " TapStrip " + + Private Sub ConnectToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles ConnectToolStripMenuItem.Click + ConnectServer(0) + End Sub + + Private Sub ConnectWithHALOPCToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles ConnectWithHALOPCToolStripMenuItem.Click + ConnectServer(1) + End Sub + + Private Sub AddToFavoritesToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles AddToFavoritesToolStripMenuItem.Click + Dim SvTemList As New List(Of ServerType) + Dim sv_tem As New ServerType With {.Name = _Namesv, .IPAdress = _IPAdress, .Players = _Players, .Map = _Map} + + If CheckDuplicateServerFromXML(sv_tem) = False Then + + SvTemList.Add(sv_tem) + Dim ProcesingXML As Boolean = WritteXmlServers(SvTemList) + If ProcesingXML = True Then + UpdateEx() + End If + + End If + + End Sub + + Private Sub DeleteServerToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles DeleteServerToolStripMenuItem.Click + Dim sv_tem As New ServerType With {.Name = _Namesv, .IPAdress = _IPAdress, .Players = _Players, .Map = _Map} + Dim ProcesingXML As Boolean = DeleteServerFromXML(sv_tem) + If ProcesingXML = True Then + UpdateEx() + End If + End Sub + + Private Sub RefreshServerToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles RefreshServerToolStripMenuItem.Click + UpdateValues() + ' Dim sv_tem As New ServerType With {.Name = _Namesv, .IPAdress = _IPAdress, .Players = _Players, .Map = _Map} + ' Servers.GetAllInfo(_IPAdress) + End Sub + + Private Sub CopyServerInfoToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles CopyServerInfoToolStripMenuItem.Click + Dim HeaderString As String = "Halo Launcher for CE and PC!" & vbNewLine & "By EternalSoft" & vbNewLine + Dim sv_Info_Cop As String = "Hostname : " & _Namesv & vbNewLine & "Ip Adress : " & _IPAdress & vbNewLine & "Players: " & _Players & vbNewLine & "Server Map : " & _Map + Clipboard.SetText(HeaderString & sv_Info_Cop) + End Sub + + +#End Region + + Private Sub CreateAndCopyServerInviteToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles CreateAndCopyServerInviteToolStripMenuItem.Click + Clipboard.SetText(Core.Utils.Compression.CompressedData(_IPAdress)) + End Sub + + Private Sub AddAllServersToFavoritesToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles AddAllServersToFavoritesToolStripMenuItem.Click + Servers.CallWriteAllServerTofavorites() + End Sub + + +#Region " PingMSAsync " + + Public pingms As String = String.Empty + Public Continues As Boolean = False + + Private Sub BackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork + On Error Resume Next + pingms = Medidorping(_IPAdress) + Continues = True + End Sub + + Private Function Medidorping(ByVal ip As String) As String + Dim sw As New Stopwatch + If My.Computer.Network.IsAvailable() Then + sw.Start() + My.Computer.Network.Ping(ip) + sw.Stop() + Medidorping = sw.ElapsedMilliseconds & " ms" + Else + Medidorping = "Error" + End If + End Function + +#End Region + +End Class diff --git a/HALOCELauncher/Controls/ThemeModule.vb b/HALOCELauncher/Controls/ThemeModule.vb new file mode 100644 index 0000000..ac08432 --- /dev/null +++ b/HALOCELauncher/Controls/ThemeModule.vb @@ -0,0 +1,41 @@ +Imports System.Drawing.Drawing2D + +Module ThemeModule + + Friend G As Graphics + + Sub New() + TextBitmap = New Bitmap(1, 1) + TextGraphics = Graphics.FromImage(TextBitmap) + End Sub + + Private TextBitmap As Bitmap + Private TextGraphics As Graphics + + Friend Function MeasureString(text As String, font As Font) As SizeF + Return TextGraphics.MeasureString(text, font) + End Function + + Friend Function MeasureString(text As String, font As Font, width As Integer) As SizeF + Return TextGraphics.MeasureString(text, font, width, StringFormat.GenericTypographic) + End Function + + Private CreateRoundPath As GraphicsPath + Private CreateRoundRectangle As Rectangle + + Friend Function CreateRound(ByVal x As Integer, ByVal y As Integer, ByVal width As Integer, ByVal height As Integer, ByVal slope As Integer) As GraphicsPath + CreateRoundRectangle = New Rectangle(x, y, width, height) + Return CreateRound(CreateRoundRectangle, slope) + End Function + + Friend Function CreateRound(ByVal r As Rectangle, ByVal slope As Integer) As GraphicsPath + CreateRoundPath = New GraphicsPath(FillMode.Winding) + CreateRoundPath.AddArc(r.X, r.Y, slope, slope, 180.0F, 90.0F) + CreateRoundPath.AddArc(r.Right - slope, r.Y, slope, slope, 270.0F, 90.0F) + CreateRoundPath.AddArc(r.Right - slope, r.Bottom - slope, slope, slope, 0.0F, 90.0F) + CreateRoundPath.AddArc(r.X, r.Bottom - slope, slope, slope, 90.0F, 90.0F) + CreateRoundPath.CloseFigure() + Return CreateRoundPath + End Function + +End Module \ No newline at end of file diff --git a/HALOCELauncher/Controls/TransparentListView.vb b/HALOCELauncher/Controls/TransparentListView.vb new file mode 100644 index 0000000..99ab127 --- /dev/null +++ b/HALOCELauncher/Controls/TransparentListView.vb @@ -0,0 +1,371 @@ +Imports System.Drawing +Imports System.Windows.Forms + +'******************************************************************************** +'* Created by Predrag Gruevski (obi1kenobi) * +'* Originally published on VBForums * +'* 02.01.2010 * +'* Feel free to use this code for any use you see fit, * +'* just please do not alter this info box and credit me for the code. * +'******************************************************************************** + +Public Class TransparentListView + Inherits ListView + +#Region " Consts " + + Const CLR_NONE As Integer = -1 + Const LVM_FIRST As Integer = &H1000 + Const LVM_GETBKCOLOR As Integer = LVM_FIRST + 0 + Const LVM_SETBKCOLOR As Integer = LVM_FIRST + 1 + Const WM_HSCROLL As Integer = &H114 + Const WM_VSCROLL As Integer = &H115 + Const SBM_SETSCROLLINFO As Integer = &HE9 + +#End Region + +#Region " APIs " + + Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer + +#End Region + +#Region " Variables " + + Private WithEvents tmr As New Timer + Private stp As New Stopwatch + Private _redrawOnMouseMove As Boolean + Private _interval As Integer = 300 + Private _highlightColor As Color + Private _errorColor As Color + Private itemHeight As Integer + +#End Region + +#Region " Constructors " + + ''' <summary> + ''' Creates a new TransparentListView object. + ''' </summary> + ''' <remarks></remarks> + Public Sub New() + Me.OwnerDraw = True + Me.DoubleBuffered = True + Me.Font = New Font("Calibri", 11, FontStyle.Regular, GraphicsUnit.Point) + tmr.Interval = _interval + End Sub + +#End Region + +#Region " Properties " + + ''' <summary> + ''' The color to use when a certain ListViewItem has unresolved issues. + ''' </summary> + Public Property ErrorTextColor() As Color + Get + Return _errorColor + End Get + Set(ByVal value As Color) + _errorColor = value + End Set + End Property + + ''' <summary> + ''' The color to use when highlighting an item. + ''' </summary> + Public Property HighlightColor() As Color + Get + Return _highlightColor + End Get + Set(ByVal value As Color) + _highlightColor = value + End Set + End Property + + ''' <summary> + ''' The intervals at which to redraw the control when scrolling. Higher values are reccomended for less powerful CPUs. + ''' Decrease this value if experiencing choppy redraws during scrolling. Values below 5-6ms may result in extreme CPU use. + ''' </summary> + Public Property RedrawInterval() As Integer + Get + Return _interval + End Get + Set(ByVal value As Integer) + If value <= 0 Then + _interval = 15 '15ms should result in appx. 60 refreshes per second (60Hz) - only when required + tmr.Interval = 15 + Else + _interval = value + tmr.Interval = value + End If + End Set + End Property + + ''' <summary> + ''' True if the control should be redrawn when the mouse is moved, otherwise False. + ''' </summary> + ''' <remarks>There have been some issues with the Set method, so it's temporarily disabled and has no effect.</remarks> + Public Property RedrawOnMouseMove() As Boolean + Get + Return _redrawOnMouseMove + End Get + Set(ByVal value As Boolean) + '_redrawOnMouseMove = value + End Set + End Property + +#End Region + +#Region " Methods " + +#Region " Overriden Methods " + + Protected Overrides Sub OnMouseWheel(ByVal e As System.Windows.Forms.MouseEventArgs) + MyBase.OnMouseWheel(e) + OnListViewScrolled(EventArgs.Empty) + End Sub + + Protected Overrides Sub OnMouseUp(ByVal e As System.Windows.Forms.MouseEventArgs) + If Me.Items.Count > 0 Then + Dim clickedItem As ListViewItem = Me.GetItemAt(5, e.Y) + If (clickedItem IsNot Nothing) Then + clickedItem.Selected = True + clickedItem.Focused = True + 'Else + 'Dim bnd As Integer = Me.Items.Count - 1 + 'For i As Integer = 0 To bnd + ' clickedItem = Me.Items(bnd) + ' If clickedItem.Bounds.Contains(5, e.Y) Then + ' clickedItem.Selected = True + ' clickedItem.Focused = True + ' Exit For + 'End If + ' Next + End If + End If + MyBase.OnMouseUp(e) + End Sub + + Protected Overrides Sub OnResize(ByVal e As System.EventArgs) + Me.Refresh() + MyBase.OnResize(e) + End Sub + + <DebuggerStepThrough()> _ + Protected Overrides Sub OnDrawItem(ByVal e As System.Windows.Forms.DrawListViewItemEventArgs) + + If Not (e.State And ListViewItemStates.Selected) = 0 OrElse e.Item.Selected Then + Using br As New Drawing.SolidBrush(_highlightColor) + + 'Using br As New Drawing2D.LinearGradientBrush(e.Bounds, Color.FromArgb(200, Color.LightSkyBlue.R, Color.LightSkyBlue.B, Color.LightSkyBlue.G), Color.FromArgb(230, Color.Yellow.R, Color.Yellow.B, Color.Yellow.G), Drawing2D.LinearGradientMode.Vertical) + ' Draw the background for a selected item. + e.Graphics.FillRectangle(br, e.Bounds) + 'e.DrawFocusRectangle() 'Disabled focus rectangle since it was off-center + End Using + 'Else + ' Draw the background for an unselected item. + End If + + 'Dim sf As New StringFormat() + 'Dim index As Integer + 'Dim clr As Color + ' + ' index = SmallImageList.Images.IndexOfKey(e.Item.ImageKey) + ' e.Graphics.DrawImage(SmallImageList.Images.Item(index), New Rectangle(e.Bounds.X + 2, e.Bounds.Y + 2, 16, 16)) + ' Using br As New SolidBrush(clr) + ' e.Graphics.DrawString(e.Item.Text, Me.Font, br, New Rectangle(e.Bounds.X + SmallImageList.ImageSize.Width + 4, e.Bounds.Y, e.Bounds.Width - SmallImageList.ImageSize.Width - 4, e.Bounds.Height), sf) + ' End Using + + 'If Not DirectCast(e.Item.Tag, Users.FileData).FileExists Then + 'Using br2 As New Drawing.SolidBrush(Color.FromArgb(100, 255, 0, 0)) + ' e.Graphics.FillRectangle(br2, e.Bounds) + ' End Using + 'End If + + ' Draw the item text for views other than the Details view. + If Not Me.View = View.Details Then + e.DrawText() + End If + MyBase.OnDrawItem(e) + End Sub + + '<DebuggerStepThrough()> _ + Protected Overrides Sub OnDrawSubItem(ByVal e As System.Windows.Forms.DrawListViewSubItemEventArgs) + 'Dim flags As TextFormatFlags = TextFormatFlags.Left + + Dim sf As New StringFormat() + Dim clr As Color + Dim index As Integer + + Try + + sf.LineAlignment = StringAlignment.Far + ' Store the column text alignment, letting it default + ' to Left if it has not been set to Center or Right. + Select Case e.Header.TextAlign + Case HorizontalAlignment.Center + sf.Alignment = StringAlignment.Center + Case HorizontalAlignment.Right + sf.Alignment = StringAlignment.Far + End Select + + e.Graphics.SmoothingMode = Drawing2D.SmoothingMode.AntiAlias + + If e.Item.ForeColor <> _errorColor Then + clr = Me.ForeColor + Else + clr = _errorColor + End If + + 'Dim lv As ListViewItem = e.Item + 'Dim tmp As String + ' + ' For Each t As ListViewItem.ListViewSubItem In e.Item.SubItems + ' tmp = t.Text + ' Next + + Using br As New SolidBrush(clr) + If e.Item.Text = e.SubItem.Text Then + If SmallImageList IsNot Nothing Then + index = SmallImageList.Images.IndexOfKey(e.Item.ImageKey) + If index <> -1 Then + e.Graphics.DrawImage(SmallImageList.Images.Item(index), New Rectangle(e.Bounds.X + 2, e.Bounds.Y + 2, 16, 16)) + e.Graphics.DrawString(e.Item.Text, Me.Font, br, New Rectangle(e.Bounds.X + SmallImageList.ImageSize.Width + 4, e.Bounds.Y, e.Bounds.Width - SmallImageList.ImageSize.Width - 4, e.Bounds.Height), sf) + Else + e.Graphics.DrawString(e.Item.Text, Me.Font, br, New Rectangle(e.Bounds.X + 4, e.Bounds.Y, e.Bounds.Width - 4, e.Bounds.Height), sf) + End If + Else + e.Graphics.DrawString(e.Item.Text, Me.Font, br, New Rectangle(e.Bounds.X + 4, e.Bounds.Y, e.Bounds.Width - 4, e.Bounds.Height), sf) + End If + Else + 'e.DrawText() + e.Graphics.DrawString(e.SubItem.Text, Me.Font, br, e.Bounds, sf) + End If + End Using + + 'e.DrawText(flags) + + Finally + sf.Dispose() + End Try + + 'MyBase.OnDrawSubItem(e) + End Sub + + <DebuggerStepThrough()> _ + Protected Overrides Sub OnDrawColumnHeader(ByVal e As System.Windows.Forms.DrawListViewColumnHeaderEventArgs) + Dim sf As New StringFormat() + Try + + ' Store the column text alignment, letting it default + ' to Left if it has not been set to Center or Right. + sf.LineAlignment = StringAlignment.Center + Select Case e.Header.TextAlign + Case HorizontalAlignment.Center + sf.Alignment = StringAlignment.Center + Case HorizontalAlignment.Right + sf.Alignment = StringAlignment.Far + End Select + + ' Draw the standard header background. + e.DrawBackground() + + ' Draw the header text. + Dim headerFont As New Font("Microsoft Sans Serif", 8, FontStyle.Regular) + Try + e.Graphics.DrawString(e.Header.Text, headerFont, _ + Brushes.Black, e.Bounds, sf) + Finally + headerFont.Dispose() + End Try + + Finally + sf.Dispose() + End Try + + 'MyBase.OnDrawColumnHeader(e) + End Sub + + Protected Overrides Sub OnMouseMove(ByVal e As System.Windows.Forms.MouseEventArgs) + If _redrawOnMouseMove Then + Dim item As ListViewItem = Me.GetItemAt(e.X, e.Y) + If item IsNot Nothing Then 'AndAlso item.Tag Is Nothing Then + Me.Invalidate(item.Bounds) + 'item.Tag = "tagged" + End If + End If + MyBase.OnMouseMove(e) + End Sub + + Protected Overrides Sub OnInvalidated(ByVal e As System.Windows.Forms.InvalidateEventArgs) + 'Related to the use of Tag and RedrawOnMouseMove properties. + + 'For Each item As ListViewItem In Me.Items + 'If item Is Nothing Then Return + 'item.Tag = Nothing + 'Next + MyBase.OnInvalidated(e) + End Sub + + Protected Overrides Sub OnColumnWidthChanged(ByVal e As System.Windows.Forms.ColumnWidthChangedEventArgs) + Me.Invalidate() + MyBase.OnColumnWidthChanged(e) + End Sub + + Protected Overrides Sub OnHandleCreated(ByVal e As System.EventArgs) + MyBase.OnHandleCreated(e) + SendMessage(Me.Handle.ToInt32, LVM_SETBKCOLOR, 0, CLR_NONE) + End Sub + + <DebuggerStepThrough()> _ + Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message) + Select Case m.Msg + Case WM_VSCROLL + OnListViewScrolled(EventArgs.Empty) + Case WM_HSCROLL + OnListViewScrolled(EventArgs.Empty) + Case SBM_SETSCROLLINFO + OnListViewScrolled(EventArgs.Empty) + End Select + MyBase.WndProc(m) + End Sub + +#End Region + +#Region " Custom Methods " + + Protected Overridable Sub OnListViewScrolled(ByVal e As EventArgs) + If stp.IsRunning Then + If stp.ElapsedMilliseconds > _interval Then + stp = Stopwatch.StartNew + Me.Invalidate() + End If + Else + stp.Start() + End If + tmr.Stop() + tmr.Start() + RaiseEvent ListViewScrolled(Me, e) + End Sub + +#End Region + +#End Region + +#Region " Event Handlers " + + Private Sub tmr_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles tmr.Tick + Me.Invalidate() + tmr.Enabled = False + End Sub + +#End Region + +#Region " Events " + + Public Event ListViewScrolled(ByVal sender As Object, ByVal e As EventArgs) + +#End Region + +End Class diff --git a/HALOCELauncher/Core/AntiFlicker/IBufferedControl.vb b/HALOCELauncher/Core/AntiFlicker/IBufferedControl.vb new file mode 100644 index 0000000..3ea3a00 --- /dev/null +++ b/HALOCELauncher/Core/AntiFlicker/IBufferedControl.vb @@ -0,0 +1,147 @@ +' *********************************************************************** +' Author : Elektro +' Modified : 20-March-2017 +' *********************************************************************** + +#Region " Public Members Summary " + +#Region " Properties " + +' CreateParams As CreateParams +' DoubleBuffered As Boolean +' PreventFlickering As Boolean + +#End Region + +#End Region + +#Region " Option Statements " + +Option Strict On +Option Explicit On +Option Infer Off + +#End Region + +#Region " Imports " + +Imports System.ComponentModel +Imports System.Windows.Forms + +#End Region + +#Region " IBufferedControl " + +Namespace Types + + ''' ---------------------------------------------------------------------------------------------------- + ''' <summary> + ''' Provides simple double buffering (anti flickering) functionality for a Windows Forms <see cref="Control"/>, + ''' such for example a <see cref="TextBox"/>. + ''' </summary> + ''' ---------------------------------------------------------------------------------------------------- + Public Interface IBufferedControl + + ''' ---------------------------------------------------------------------------------------------------- + ''' <summary> + ''' Gets the required creation parameters when the control handle is created. + ''' </summary> + ''' ---------------------------------------------------------------------------------------------------- + ''' <value> + ''' The creation parameters. + ''' </value> + ''' ---------------------------------------------------------------------------------------------------- + <Browsable(False)> + <EditorBrowsable(EditorBrowsableState.Advanced)> + ReadOnly Property CreateParams As CreateParams + ' Implementation Exmple: + ' + ' Protected Overrides ReadOnly Property CreateParams As CreateParams Implements IBufferedControl.CreateParams + ' Get + ' If (Me.preventFlickeringB) Then + ' Dim cp As CreateParams = MyBase.CreateParams + ' cp.ExStyle = (cp.ExStyle Or CInt(WindowStylesEx.WS_EX_COMPOSITED)) + ' Return cp + ' Else + ' Return MyBase.CreateParams + ' End If + ' End Get + ' End Property + + ''' ---------------------------------------------------------------------------------------------------- + ''' <summary> + ''' Gets or sets a value indicating whether this control should redraw its surface using a secondary buffer + ''' to reduce or prevent flicker. + ''' </summary> + ''' ---------------------------------------------------------------------------------------------------- + ''' <value> + ''' <see langword="True"/> if the surface of the control should be drawn using double buffering; + ''' otherwise, <see langword="False"/>. + ''' </value> + ''' ---------------------------------------------------------------------------------------------------- + <Browsable(True)> + <EditorBrowsable(EditorBrowsableState.Always)> + <DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)> + <Localizable(True)> + <Category("Behavior")> + <Description("Indicates whether this control should redraw its surface using a secondary buffer to reduce or prevent flicker.")> + <DefaultValue(GetType(Boolean), "True")> + Property DoubleBuffered As Boolean + ' Implementation Exmple: + ' + ' Public Overridable Shadows Property DoubleBuffered As Boolean Implements IBufferedControl.DoubleBuffered + ' Get + ' Return MyBase.DoubleBuffered + ' End Get + ' Set(ByVal value As Boolean) + ' Me.SetStyle(ControlStyles.DoubleBuffer, value) + ' MyBase.DoubleBuffered = value + ' End Set + ' End Property + + ''' ---------------------------------------------------------------------------------------------------- + ''' <summary> + ''' Gets or sets a value that indicates whether the control should avoid unwanted flickering effects. + ''' <para></para> + ''' If <see langword="True"/>, this will avoid any flickering effect on the control, however, + ''' it will also have a negative impact by slowing down the responsiveness of the control about to 30% slower. + ''' <para></para> + ''' This negative impact doesn't affect to the performance of the application itself, + ''' just to the performance of this control. + ''' </summary> + ''' ---------------------------------------------------------------------------------------------------- + ''' <value> + ''' A value that indicates whether the control should avoid unwanted flickering effects. + ''' </value> + ''' ---------------------------------------------------------------------------------------------------- + <Browsable(True)> + <EditorBrowsable(EditorBrowsableState.Always)> + <DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)> + <Localizable(True)> + <Category("Behavior")> + <Description("Indicates whether the control should avoid unwanted flickering effects. If True, this will avoid any flickering effect on the control, however, it will also have a negative impact by slowing down the responsiveness of the control about to 30% slower.")> + <DefaultValue(GetType(Boolean), "False")> + Property PreventFlickering As Boolean + ' Implementation Exmple: + ' + ' Public Overridable Property PreventFlickering As Boolean Implements IBufferedControl.PreventFlickering + ' Get + ' Return Me.preventFlickeringB + ' End Get + ' Set(ByVal value As Boolean) + ' Me.preventFlickeringB = value + ' End Set + ' End Property + ' ''' ---------------------------------------------------------------------------------------------------- + ' ''' <summary> + ' ''' ( Backing Field ) + ' ''' A value that indicates whether the control should avoid unwanted flickering effects. + ' ''' </summary> + ' ''' ---------------------------------------------------------------------------------------------------- + ' Private preventFlickeringB As Boolean + + End Interface + +End Namespace + +#End Region \ No newline at end of file diff --git a/HALOCELauncher/Core/AntiFlicker/Win32FX.vb b/HALOCELauncher/Core/AntiFlicker/Win32FX.vb new file mode 100644 index 0000000..23b59f1 --- /dev/null +++ b/HALOCELauncher/Core/AntiFlicker/Win32FX.vb @@ -0,0 +1,151 @@ +Public Class Win32FX + + <Flags()> _ + Public Enum WindowStylesEx As UInteger + ''' <summary>Specifies a window that accepts drag-drop files.</summary> + WS_EX_ACCEPTFILES = &H10 + + ''' <summary>Forces a top-level window onto the taskbar when the window is visible.</summary> + WS_EX_APPWINDOW = &H40000 + + ''' <summary>Specifies a window that has a border with a sunken edge.</summary> + WS_EX_CLIENTEDGE = &H200 + + ''' <summary> + ''' Specifies a window that paints all descendants in bottom-to-top painting order using double-buffering. + ''' This cannot be used if the window has a class style of either CS_OWNDC or CS_CLASSDC. This style is not supported in Windows 2000. + ''' </summary> + ''' <remarks> + ''' With WS_EX_COMPOSITED set, all descendants of a window get bottom-to-top painting order using double-buffering. + ''' Bottom-to-top painting order allows a descendent window to have translucency (alpha) and transparency (color-key) effects, + ''' but only if the descendent window also has the WS_EX_TRANSPARENT bit set. + ''' Double-buffering allows the window and its descendents to be painted without flicker. + ''' </remarks> + WS_EX_COMPOSITED = &H2000000 + + ''' <summary> + ''' Specifies a window that includes a question mark in the title bar. When the user clicks the question mark, + ''' the cursor changes to a question mark with a pointer. If the user then clicks a child window, the child receives a WM_HELP message. + ''' The child window should pass the message to the parent window procedure, which should call the WinHelp function using the HELP_WM_HELP command. + ''' The Help application displays a pop-up window that typically contains help for the child window. + ''' WS_EX_CONTEXTHELP cannot be used with the WS_MAXIMIZEBOX or WS_MINIMIZEBOX styles. + ''' </summary> + WS_EX_CONTEXTHELP = &H400 + + ''' <summary> + ''' Specifies a window which contains child windows that should take part in dialog box navigation. + ''' If this style is specified, the dialog manager recurses into children of this window when performing navigation operations + ''' such as handling the TAB key, an arrow key, or a keyboard mnemonic. + ''' </summary> + WS_EX_CONTROLPARENT = &H10000 + + ''' <summary>Specifies a window that has a double border.</summary> + WS_EX_DLGMODALFRAME = &H1 + + ''' <summary> + ''' Specifies a window that is a layered window. + ''' This cannot be used for child windows or if the window has a class style of either CS_OWNDC or CS_CLASSDC. + ''' </summary> + WS_EX_LAYERED = &H80000 + + ''' <summary> + ''' Specifies a window with the horizontal origin on the right edge. Increasing horizontal values advance to the left. + ''' The shell language must support reading-order alignment for this to take effect. + ''' </summary> + WS_EX_LAYOUTRTL = &H400000 + + ''' <summary>Specifies a window that has generic left-aligned properties. This is the default.</summary> + WS_EX_LEFT = &H0 + + ''' <summary> + ''' Specifies a window with the vertical scroll bar (if present) to the left of the client area. + ''' The shell language must support reading-order alignment for this to take effect. + ''' </summary> + WS_EX_LEFTSCROLLBAR = &H4000 + + ''' <summary> + ''' Specifies a window that displays text using left-to-right reading-order properties. This is the default. + ''' </summary> + WS_EX_LTRREADING = &H0 + + ''' <summary> + ''' Specifies a multiple-document interface (MDI) child window. + ''' </summary> + WS_EX_MDICHILD = &H40 + + ''' <summary> + ''' Specifies a top-level window created with this style does not become the foreground window when the user clicks it. + ''' The system does not bring this window to the foreground when the user minimizes or closes the foreground window. + ''' The window does not appear on the taskbar by default. To force the window to appear on the taskbar, use the WS_EX_APPWINDOW style. + ''' To activate the window, use the SetActiveWindow or SetForegroundWindow function. + ''' </summary> + WS_EX_NOACTIVATE = &H8000000 + + ''' <summary> + ''' Specifies a window which does not pass its window layout to its child windows. + ''' </summary> + WS_EX_NOINHERITLAYOUT = &H100000 + + ''' <summary> + ''' Specifies that a child window created with this style does not send the WM_PARENTNOTIFY message to its parent window when it is created or destroyed. + ''' </summary> + WS_EX_NOPARENTNOTIFY = &H4 + + ''' <summary> + ''' The window does not render to a redirection surface. + ''' This is for windows that do not have visible content or that use mechanisms other than surfaces to provide their visual. + ''' </summary> + WS_EX_NOREDIRECTIONBITMAP = &H200000 + + ''' <summary>Specifies an overlapped window.</summary> + WS_EX_OVERLAPPEDWINDOW = WS_EX_WINDOWEDGE Or WS_EX_CLIENTEDGE + + ''' <summary>Specifies a palette window, which is a modeless dialog box that presents an array of commands.</summary> + WS_EX_PALETTEWINDOW = WS_EX_WINDOWEDGE Or WS_EX_TOOLWINDOW Or WS_EX_TOPMOST + + ''' <summary> + ''' Specifies a window that has generic "right-aligned" properties. This depends on the window class. + ''' The shell language must support reading-order alignment for this to take effect. + ''' Using the WS_EX_RIGHT style has the same effect as using the SS_RIGHT (static), ES_RIGHT (edit), and BS_RIGHT/BS_RIGHTBUTTON (button) control styles. + ''' </summary> + WS_EX_RIGHT = &H1000 + + ''' <summary>Specifies a window with the vertical scroll bar (if present) to the right of the client area. This is the default.</summary> + WS_EX_RIGHTSCROLLBAR = &H0 + + ''' <summary> + ''' Specifies a window that displays text using right-to-left reading-order properties. + ''' The shell language must support reading-order alignment for this to take effect. + ''' </summary> + WS_EX_RTLREADING = &H2000 + + ''' <summary>Specifies a window with a three-dimensional border style intended to be used for items that do not accept user input.</summary> + WS_EX_STATICEDGE = &H20000 + + ''' <summary> + ''' Specifies a window that is intended to be used as a floating toolbar. + ''' A tool window has a title bar that is shorter than a normal title bar, and the window title is drawn using a smaller font. + ''' A tool window does not appear in the taskbar or in the dialog that appears when the user presses ALT+TAB. + ''' If a tool window has a system menu, its icon is not displayed on the title bar. + ''' However, you can display the system menu by right-clicking or by typing ALT+SPACE. + ''' </summary> + WS_EX_TOOLWINDOW = &H80 + + ''' <summary> + ''' Specifies a window that should be placed above all non-topmost windows and should stay above them, even when the window is deactivated. + ''' To add or remove this style, use the SetWindowPos function. + ''' </summary> + WS_EX_TOPMOST = &H8 + + ''' <summary> + ''' Specifies a window that should not be painted until siblings beneath the window (that were created by the same thread) have been painted. + ''' The window appears transparent because the bits of underlying sibling windows have already been painted. + ''' To achieve transparency without these restrictions, use the SetWindowRgn function. + ''' </summary> + WS_EX_TRANSPARENT = &H20 + + ''' <summary>Specifies a window that has a border with a raised edge.</summary> + WS_EX_WINDOWEDGE = &H100 + End Enum + +End Class diff --git a/HALOCELauncher/Core/FakeFullScreen/SetWindowState.vb b/HALOCELauncher/Core/FakeFullScreen/SetWindowState.vb new file mode 100644 index 0000000..9daedc9 --- /dev/null +++ b/HALOCELauncher/Core/FakeFullScreen/SetWindowState.vb @@ -0,0 +1,304 @@ +' *********************************************************************** +' Author : Elektro +' Last Modified On : 10-02-2014 +' *********************************************************************** +' <copyright file="SetWindowState.vb" company="Elektro Studios"> +' Copyright (c) Elektro Studios. All rights reserved. +' </copyright> +' *********************************************************************** + +#Region " Usage Examples " + +'Dim HWND As IntPtr = Process.GetProcessesByName("devenv").First.MainWindowHandle +' +'SetWindowState.SetWindowState(HWND, SetWindowState.WindowState.Hide) +'SetWindowState.SetWindowState("devenv", SetWindowState.WindowState.Restore, Recursivity:=False) + +#End Region + +#Region " Imports " + +Imports System.Runtime.InteropServices + +#End Region + +''' <summary> +''' Sets the state of a window. +''' </summary> +Public NotInheritable Class SetWindowState + +#Region " P/Invoke " + + ''' <summary> + ''' Platform Invocation methods (P/Invoke), access unmanaged code. + ''' This class does not suppress stack walks for unmanaged code permission. + ''' <see cref="System.Security.SuppressUnmanagedCodeSecurityAttribute"/> must not be applied to this class. + ''' This class is for methods that can be used anywhere because a stack walk will be performed. + ''' MSDN Documentation: http://msdn.microsoft.com/en-us/library/ms182161.aspx + ''' </summary> + Protected NotInheritable Class NativeMethods + +#Region " Methods " + + ''' <summary> + ''' Retrieves a handle to the top-level window whose class name and window name match the specified strings. + ''' This function does not search child windows. + ''' This function does not perform a case-sensitive search. + ''' To search child windows, beginning with a specified child window, use the FindWindowEx function. + ''' MSDN Documentation: http://msdn.microsoft.com/en-us/library/windows/desktop/ms633499%28v=vs.85%29.aspx + ''' </summary> + ''' <param name="lpClassName">The class name. + ''' If this parameter is NULL, it finds any window whose title matches the lpWindowName parameter.</param> + ''' <param name="lpWindowName">The window name (the window's title). + ''' If this parameter is NULL, all window names match.</param> + ''' <returns>If the function succeeds, the return value is a handle to the window that has the specified class name and window name. + ''' If the function fails, the return value is NULL.</returns> + <DllImport("user32.dll", SetLastError:=False, CharSet:=CharSet.Auto, BestFitMapping:=False)> + Friend Shared Function FindWindow( + ByVal lpClassName As String, + ByVal lpWindowName As String + ) As IntPtr + End Function + + ''' <summary> + ''' Retrieves a handle to a window whose class name and window name match the specified strings. + ''' The function searches child windows, beginning with the one following the specified child window. + ''' This function does not perform a case-sensitive search. + ''' MSDN Documentation: http://msdn.microsoft.com/en-us/library/windows/desktop/ms633500%28v=vs.85%29.aspx + ''' </summary> + ''' <param name="hwndParent"> + ''' A handle to the parent window whose child windows are to be searched. + ''' If hwndParent is NULL, the function uses the desktop window as the parent window. + ''' The function searches among windows that are child windows of the desktop. + ''' </param> + ''' <param name="hwndChildAfter"> + ''' A handle to a child window. + ''' The search begins with the next child window in the Z order. + ''' The child window must be a direct child window of hwndParent, not just a descendant window. + ''' If hwndChildAfter is NULL, the search begins with the first child window of hwndParent. + ''' </param> + ''' <param name="strClassName"> + ''' The window class name. + ''' </param> + ''' <param name="strWindowName"> + ''' The window name (the window's title). + ''' If this parameter is NULL, all window names match. + ''' </param> + ''' <returns> + ''' If the function succeeds, the return value is a handle to the window that has the specified class and window names. + ''' If the function fails, the return value is NULL. + ''' </returns> + <DllImport("User32.dll", SetLastError:=False, CharSet:=CharSet.Auto, BestFitMapping:=False)> + Friend Shared Function FindWindowEx( + ByVal hwndParent As IntPtr, + ByVal hwndChildAfter As IntPtr, + ByVal strClassName As String, + ByVal strWindowName As String + ) As IntPtr + End Function + + ''' <summary> + ''' Retrieves the identifier of the thread that created the specified window + ''' and, optionally, the identifier of the process that created the window. + ''' MSDN Documentation: http://msdn.microsoft.com/en-us/library/windows/desktop/ms633522%28v=vs.85%29.aspx + ''' </summary> + ''' <param name="hWnd">A handle to the window.</param> + ''' <param name="ProcessId"> + ''' A pointer to a variable that receives the process identifier. + ''' If this parameter is not NULL, GetWindowThreadProcessId copies the identifier of the process to the variable; + ''' otherwise, it does not. + ''' </param> + ''' <returns>The identifier of the thread that created the window.</returns> + <DllImport("user32.dll")> + Friend Shared Function GetWindowThreadProcessId( + ByVal hWnd As IntPtr, + ByRef ProcessId As Integer + ) As Integer + End Function + + ''' <summary> + ''' Sets the specified window's show state. + ''' MSDN Documentation: http://msdn.microsoft.com/en-us/library/windows/desktop/ms633548%28v=vs.85%29.aspx + ''' </summary> + ''' <param name="hwnd">A handle to the window.</param> + ''' <param name="nCmdShow">Controls how the window is to be shown.</param> + ''' <returns><c>true</c> if the function succeeds, <c>false</c> otherwise.</returns> + <DllImport("User32", SetLastError:=False)> + Friend Shared Function ShowWindow( + ByVal hwnd As IntPtr, + ByVal nCmdShow As WindowState + ) As Boolean + End Function + +#End Region + + End Class + +#End Region + +#Region " Enumerations " + + ''' <summary> + ''' Controls how the window is to be shown. + ''' MSDN Documentation: http://msdn.microsoft.com/en-us/library/windows/desktop/ms633548%28v=vs.85%29.aspx + ''' </summary> + Friend Enum WindowState As Integer + + ''' <summary> + ''' Hides the window and activates another window. + ''' </summary> + Hide = 0I + + ''' <summary> + ''' Activates and displays a window. + ''' If the window is minimized or maximized, the system restores it to its original size and position. + ''' An application should specify this flag when displaying the window for the first time. + ''' </summary> + Normal = 1I + + ''' <summary> + ''' Activates the window and displays it as a minimized window. + ''' </summary> + ShowMinimized = 2I + + ''' <summary> + ''' Maximizes the specified window. + ''' </summary> + Maximize = 3I + + ''' <summary> + ''' Activates the window and displays it as a maximized window. + ''' </summary> + ShowMaximized = Maximize + + ''' <summary> + ''' Displays a window in its most recent size and position. + ''' This value is similar to <see cref="WindowState.Normal"/>, except the window is not actived. + ''' </summary> + ShowNoActivate = 4I + + ''' <summary> + ''' Activates the window and displays it in its current size and position. + ''' </summary> + Show = 5I + + ''' <summary> + ''' Minimizes the specified window and activates the next top-level window in the Z order. + ''' </summary> + Minimize = 6I + + ''' <summary> + ''' Displays the window as a minimized window. + ''' This value is similar to <see cref="WindowState.ShowMinimized"/>, except the window is not activated. + ''' </summary> + ShowMinNoActive = 7I + + ''' <summary> + ''' Displays the window in its current size and position. + ''' This value is similar to <see cref="WindowState.Show"/>, except the window is not activated. + ''' </summary> + ShowNA = 8I + + ''' <summary> + ''' Activates and displays the window. + ''' If the window is minimized or maximized, the system restores it to its original size and position. + ''' An application should specify this flag when restoring a minimized window. + ''' </summary> + Restore = 9I + + ''' <summary> + ''' Sets the show state based on the SW_* value specified in the STARTUPINFO structure + ''' passed to the CreateProcess function by the program that started the application. + ''' </summary> + ShowDefault = 10I + + ''' <summary> + ''' <b>Windows 2000/XP:</b> + ''' Minimizes a window, even if the thread that owns the window is not responding. + ''' This flag should only be used when minimizing windows from a different thread. + ''' </summary> + ForceMinimize = 11I + + End Enum + +#End Region + +#Region " Public Methods " + + ''' <summary> + ''' Set the state of a window by an HWND. + ''' </summary> + ''' <param name="WindowHandle">A handle to the window.</param> + ''' <param name="WindowState">The state of the window.</param> + ''' <returns><c>true</c> if the function succeeds, <c>false</c> otherwise.</returns> + Friend Shared Function SetWindowState(ByVal WindowHandle As IntPtr, + ByVal WindowState As WindowState) As Boolean + + Return NativeMethods.ShowWindow(WindowHandle, WindowState) + + End Function + + ''' <summary> + ''' Set the state of a window by a process name. + ''' </summary> + ''' <param name="ProcessName">The name of the process.</param> + ''' <param name="WindowState">The state of the window.</param> + ''' <param name="Recursivity">If set to <c>false</c>, only the first process instance will be processed.</param> + Friend Shared Sub SetWindowState(ByVal ProcessName As String, + ByVal WindowState As WindowState, + Optional ByVal Recursivity As Boolean = False) + + If ProcessName.EndsWith(".exe", StringComparison.OrdinalIgnoreCase) Then + ProcessName = ProcessName.Remove(ProcessName.Length - ".exe".Length) + End If + + Dim pHandle As IntPtr = IntPtr.Zero + Dim pID As Integer = 0I + + Dim Processes As Process() = Process.GetProcessesByName(ProcessName) + + ' If any process matching the name is found then... + If Processes.Count = 0 Then + Exit Sub + End If + + For Each p As Process In Processes + + ' If Window is visible then... + If p.MainWindowHandle <> IntPtr.Zero Then + SetWindowState(p.MainWindowHandle, WindowState) + + Else ' Window is hidden + + ' Check all open windows (not only the process we are looking), + ' begining from the child of the desktop, phandle = IntPtr.Zero initialy. + While pID <> p.Id ' Check all windows. + + ' Get child handle of window who's handle is "pHandle". + pHandle = NativeMethods.FindWindowEx(IntPtr.Zero, pHandle, Nothing, Nothing) + + ' Get ProcessId from "pHandle". + NativeMethods.GetWindowThreadProcessId(pHandle, pID) + + ' If the ProcessId matches the "pID" then... + If pID = p.Id Then + + NativeMethods.ShowWindow(pHandle, WindowState) + + If Not Recursivity Then + Exit For + End If + + End If + + End While + + End If + + Next p + + End Sub + +#End Region + +End Class \ No newline at end of file diff --git a/HALOCELauncher/Core/FakeFullScreen/SetWindowStyle.vb b/HALOCELauncher/Core/FakeFullScreen/SetWindowStyle.vb new file mode 100644 index 0000000..cbba315 --- /dev/null +++ b/HALOCELauncher/Core/FakeFullScreen/SetWindowStyle.vb @@ -0,0 +1,319 @@ +' *********************************************************************** +' Author : Destroyer +' Last Modified On : 29-09-2020 +' *********************************************************************** +' <copyright file="SetWindowStyle.vb" company="Elektro Studios"> +' Copyright (c) All rights reserved. +' </copyright> +' *********************************************************************** + +#Region " Usage Examples " + +'Dim HWND As IntPtr = Process.GetProcessesByName("devenv").First.MainWindowHandle +' +'SetWindowState.SetWindowStyle(HWND, SetWindowStyle.WindowStyles.WS_BORDER) +'SetWindowState.SetWindowStyle("devenv", SetWindowStyle.WindowStyles.WS_BORDER, Recursivity:=False) + +#End Region + +#Region " Imports " + +Imports System.Runtime.InteropServices + +#End Region + +''' <summary> +''' Sets the style of a window. +''' </summary> +Public NotInheritable Class SetWindowStyle + +#Region " P/Invoke " + + ''' <summary> + ''' Platform Invocation methods (P/Invoke), access unmanaged code. + ''' This class does not suppress stack walks for unmanaged code permission. + ''' <see cref="System.Security.SuppressUnmanagedCodeSecurityAttribute"/> must not be applied to this class. + ''' This class is for methods that can be used anywhere because a stack walk will be performed. + ''' MSDN Documentation: http://msdn.microsoft.com/en-us/library/ms182161.aspx + ''' </summary> + Protected NotInheritable Class NativeMethods + +#Region " Methods " + + ''' <summary> + ''' Retrieves a handle to the top-level window whose class name and window name match the specified strings. + ''' This function does not search child windows. + ''' This function does not perform a case-sensitive search. + ''' To search child windows, beginning with a specified child window, use the FindWindowEx function. + ''' MSDN Documentation: http://msdn.microsoft.com/en-us/library/windows/desktop/ms633499%28v=vs.85%29.aspx + ''' </summary> + ''' <param name="lpClassName">The class name. + ''' If this parameter is NULL, it finds any window whose title matches the lpWindowName parameter.</param> + ''' <param name="lpWindowName">The window name (the window's title). + ''' If this parameter is NULL, all window names match.</param> + ''' <returns>If the function succeeds, the return value is a handle to the window that has the specified class name and window name. + ''' If the function fails, the return value is NULL.</returns> + <DllImport("user32.dll", SetLastError:=False, CharSet:=CharSet.Auto, BestFitMapping:=False)> + Friend Shared Function FindWindow( + ByVal lpClassName As String, + ByVal lpWindowName As String + ) As IntPtr + End Function + + ''' <summary> + ''' Retrieves a handle to a window whose class name and window name match the specified strings. + ''' The function searches child windows, beginning with the one following the specified child window. + ''' This function does not perform a case-sensitive search. + ''' MSDN Documentation: http://msdn.microsoft.com/en-us/library/windows/desktop/ms633500%28v=vs.85%29.aspx + ''' </summary> + ''' <param name="hwndParent"> + ''' A handle to the parent window whose child windows are to be searched. + ''' If hwndParent is NULL, the function uses the desktop window as the parent window. + ''' The function searches among windows that are child windows of the desktop. + ''' </param> + ''' <param name="hwndChildAfter"> + ''' A handle to a child window. + ''' The search begins with the next child window in the Z order. + ''' The child window must be a direct child window of hwndParent, not just a descendant window. + ''' If hwndChildAfter is NULL, the search begins with the first child window of hwndParent. + ''' </param> + ''' <param name="strClassName"> + ''' The window class name. + ''' </param> + ''' <param name="strWindowName"> + ''' The window name (the window's title). + ''' If this parameter is NULL, all window names match. + ''' </param> + ''' <returns> + ''' If the function succeeds, the return value is a handle to the window that has the specified class and window names. + ''' If the function fails, the return value is NULL. + ''' </returns> + <DllImport("User32.dll", SetLastError:=False, CharSet:=CharSet.Auto, BestFitMapping:=False)> + Friend Shared Function FindWindowEx( + ByVal hwndParent As IntPtr, + ByVal hwndChildAfter As IntPtr, + ByVal strClassName As String, + ByVal strWindowName As String + ) As IntPtr + End Function + + ''' <summary> + ''' Retrieves the identifier of the thread that created the specified window + ''' and, optionally, the identifier of the process that created the window. + ''' MSDN Documentation: http://msdn.microsoft.com/en-us/library/windows/desktop/ms633522%28v=vs.85%29.aspx + ''' </summary> + ''' <param name="hWnd">A handle to the window.</param> + ''' <param name="ProcessId"> + ''' A pointer to a variable that receives the process identifier. + ''' If this parameter is not NULL, GetWindowThreadProcessId copies the identifier of the process to the variable; + ''' otherwise, it does not. + ''' </param> + ''' <returns>The identifier of the thread that created the window.</returns> + <DllImport("user32.dll")> + Friend Shared Function GetWindowThreadProcessId( + ByVal hWnd As IntPtr, + ByRef ProcessId As Integer + ) As Integer + End Function + + <System.Runtime.InteropServices.DllImport("user32.dll", EntryPoint:="SetWindowLong")> _ + Friend Shared Function SetWindowLong32(ByVal hWnd As IntPtr, <MarshalAs(UnmanagedType.I4)> nIndex As WindowLongFlags, ByVal dwNewLong As Integer) As Integer + End Function + + <System.Runtime.InteropServices.DllImport("user32.dll", EntryPoint:="SetWindowLongPtr")> _ + Friend Shared Function SetWindowLongPtr64(ByVal hWnd As IntPtr, <MarshalAs(UnmanagedType.I4)> nIndex As WindowLongFlags, ByVal dwNewLong As IntPtr) As IntPtr + End Function + + Friend Shared Function SetWindowLongPtr(ByVal hWnd As IntPtr, nIndex As WindowLongFlags, ByVal dwNewLong As IntPtr) As IntPtr + If IntPtr.Size = 8 Then + Return SetWindowLongPtr64(hWnd, nIndex, dwNewLong) + Else + Return New IntPtr(SetWindowLong32(hWnd, nIndex, dwNewLong.ToInt32)) + End If + End Function + +#End Region + + End Class + +#End Region + +#Region " Enumerations " + + Public Enum WindowLongFlags As Integer + GWL_EXSTYLE = -20 + GWLP_HINSTANCE = -6 + GWLP_HWNDPARENT = -8 + GWL_ID = -12 + GWL_STYLE = -16 + GWL_USERDATA = -21 + GWL_WNDPROC = -4 + DWLP_USER = &H8 + DWLP_MSGRESULT = &H0 + DWLP_DLGPROC = &H4 + End Enum + + <FlagsAttribute()> _ + Public Enum WindowStyles As Long + + Todo1 = 2 + Todo2 = 2048 + Todo3 = 32768 + + WS_OVERLAPPED = 0 + WS_POPUP = 2147483648 + WS_CHILD = 1073741824 + WS_MINIMIZE = 536870912 + WS_VISIBLE = 268435456 + WS_DISABLED = 134217728 + WS_CLIPSIBLINGS = 67108864 + WS_CLIPCHILDREN = 33554432 + WS_MAXIMIZE = 16777216 + WS_BORDER = 8388608 + WS_DLGFRAME = 4194304 + WS_VSCROLL = 2097152 + WS_HSCROLL = 1048576 + WS_SYSMENU = 524288 + WS_THICKFRAME = 262144 + WS_GROUP = 131072 + WS_TABSTOP = 65536 + + WS_MINIMIZEBOX = 131072 + WS_MAXIMIZEBOX = 65536 + + WS_CAPTION = WS_BORDER Or WS_DLGFRAME + WS_TILED = WS_OVERLAPPED + WS_ICONIC = WS_MINIMIZE + WS_SIZEBOX = WS_THICKFRAME + WS_TILEDWINDOW = WS_OVERLAPPEDWINDOW + + WS_OVERLAPPEDWINDOW = WS_OVERLAPPED Or WS_CAPTION Or WS_SYSMENU Or _ + WS_THICKFRAME Or WS_MINIMIZEBOX Or WS_MAXIMIZEBOX + WS_POPUPWINDOW = WS_POPUP Or WS_BORDER Or WS_SYSMENU + WS_CHILDWINDOW = WS_CHILD + + WS_EX_DLGMODALFRAME = 1 + WS_EX_NOPARENTNOTIFY = 4 + WS_EX_TOPMOST = 8 + WS_EX_ACCEPTFILES = 16 + WS_EX_TRANSPARENT = 32 + + '#If (WINVER >= 400) Then + WS_EX_MDICHILD = 64 + WS_EX_TOOLWINDOW = 128 + WS_EX_WINDOWEDGE = 256 + WS_EX_CLIENTEDGE = 512 + WS_EX_CONTEXTHELP = 1024 + + WS_EX_RIGHT = 4096 + WS_EX_LEFT = 0 + WS_EX_RTLREADING = 8192 + WS_EX_LTRREADING = 0 + WS_EX_LEFTSCROLLBAR = 16384 + WS_EX_RIGHTSCROLLBAR = 0 + + WS_EX_CONTROLPARENT = 65536 + WS_EX_STATICEDGE = 131072 + WS_EX_APPWINDOW = 262144 + + WS_EX_OVERLAPPEDWINDOW = WS_EX_WINDOWEDGE Or WS_EX_CLIENTEDGE + WS_EX_PALETTEWINDOW = WS_EX_WINDOWEDGE Or WS_EX_TOOLWINDOW Or WS_EX_TOPMOST + '#End If + + '#If (WIN32WINNT >= 500) Then + WS_EX_LAYERED = 524288 + '#End If + + '#If (WINVER >= 500) Then + WS_EX_NOINHERITLAYOUT = 1048576 ' Disable inheritence of mirroring by children + WS_EX_LAYOUTRTL = 4194304 ' Right to left mirroring + '#End If + + '#If (WIN32WINNT >= 500) Then + WS_EX_COMPOSITED = 33554432 + WS_EX_NOACTIVATE = 67108864 + '#End If + + End Enum + +#End Region + +#Region " Public Methods " + + ''' <summary> + ''' Set the state of a window by an HWND. + ''' </summary> + ''' <param name="WindowHandle">A handle to the window.</param> + ''' <param name="WindowStyle">The Style of the window.</param> + ''' <returns><c>true</c> if the function succeeds, <c>false</c> otherwise.</returns> + Friend Shared Function SetWindowStyle(ByVal WindowHandle As IntPtr, + ByVal WindowStyle As WindowStyles) As Boolean + + Return NativeMethods.SetWindowLongPtr(WindowHandle, WindowLongFlags.GWL_STYLE, WindowStyle) + + End Function + + ''' <summary> + ''' Set the state of a window by a process name. + ''' </summary> + ''' <param name="ProcessName">The name of the process.</param> + ''' <param name="WindowStyle">The Style of the window.</param> + ''' <param name="Recursivity">If set to <c>false</c>, only the first process instance will be processed.</param> + Friend Shared Sub SetWindowStyle(ByVal ProcessName As String, + ByVal WindowStyle As WindowStyles, + Optional ByVal Recursivity As Boolean = False) + + If ProcessName.EndsWith(".exe", StringComparison.OrdinalIgnoreCase) Then + ProcessName = ProcessName.Remove(ProcessName.Length - ".exe".Length) + End If + + Dim pHandle As IntPtr = IntPtr.Zero + Dim pID As Integer = 0I + + Dim Processes As Process() = Process.GetProcessesByName(ProcessName) + + ' If any process matching the name is found then... + If Processes.Count = 0 Then + Exit Sub + End If + + For Each p As Process In Processes + + ' If Window is visible then... + If p.MainWindowHandle <> IntPtr.Zero Then + SetWindowStyle(p.MainWindowHandle, WindowStyle) + + Else ' Window is hidden + + ' Check all open windows (not only the process we are looking), + ' begining from the child of the desktop, phandle = IntPtr.Zero initialy. + While pID <> p.Id ' Check all windows. + + ' Get child handle of window who's handle is "pHandle". + pHandle = NativeMethods.FindWindowEx(IntPtr.Zero, pHandle, Nothing, Nothing) + + ' Get ProcessId from "pHandle". + NativeMethods.GetWindowThreadProcessId(pHandle, pID) + + ' If the ProcessId matches the "pID" then... + If pID = p.Id Then + + NativeMethods.SetWindowLongPtr(pHandle, WindowLongFlags.GWL_STYLE, WindowStyle) + + If Not Recursivity Then + Exit For + End If + + End If + + End While + + End If + + Next p + + End Sub + +#End Region + +End Class diff --git a/HALOCELauncher/Core/Font/CustomFont.vb b/HALOCELauncher/Core/Font/CustomFont.vb new file mode 100644 index 0000000..470258f --- /dev/null +++ b/HALOCELauncher/Core/Font/CustomFont.vb @@ -0,0 +1,83 @@ +#Region " Use Custom Text-Font " + +' [ Use Custom Text-Font ] +' +' Instructions : +' 1. Add a .TTF font to the resources +' 2. Add the class +' 3. Use it +' +' Examples: +' Label1.Font = New Font(GameFont.Font, 10.0!) +' Label1.Text = "This is your custom font !!" + +'Dim MyFont As New CustomFont(My.Resources.kakakaka) + +'Private Sub Main_Disposed(sender As Object, e As System.EventArgs) Handles Me.Disposed +' MyFont.Dispose() +'End Sub + +' CustomFont.vb +#Region " CustomFont Class " + +Imports System.Drawing +Imports System.Drawing.Text +Imports System.Runtime.InteropServices + +''' <summary> +''' Represents a custom font not installed on the user's system. +''' </summary> +Public NotInheritable Class CustomFont + Implements IDisposable + + Private fontCollection As New PrivateFontCollection() + Private fontPtr As IntPtr + +#Region "Constructor" + ''' <summary> + ''' Creates a new custom font using the specified font data. + ''' </summary> + ''' <param name="fontData">The font data representing the font.</param> + Public Sub New(ByVal fontData() As Byte) + 'Create a pointer to the font data and copy the + 'font data into the location in memory pointed to + fontPtr = Marshal.AllocHGlobal(fontData.Length) + Marshal.Copy(fontData, 0, fontPtr, fontData.Length) + + 'Add the font to the shared collection of fonts: + fontCollection.AddMemoryFont(fontPtr, fontData.Length) + End Sub +#End Region + +#Region "Destructor" + 'Free the font in unmanaged memory, dispose of + 'the font collection and suppress finalization + Public Sub Dispose() Implements IDisposable.Dispose + Marshal.FreeHGlobal(fontPtr) + fontCollection.Dispose() + + GC.SuppressFinalize(Me) + End Sub + + 'Free the font in unmanaged memory + Protected Overrides Sub Finalize() + Marshal.FreeHGlobal(fontPtr) + End Sub +#End Region + +#Region "Properties" + ''' <summary> + ''' Gets the font family of the custom font. + ''' </summary> + Public ReadOnly Property Font() As FontFamily + Get + Return fontCollection.Families(0) + End Get + End Property +#End Region + +End Class + +#End Region + +#End Region \ No newline at end of file diff --git a/HALOCELauncher/Core/GameTracker/GTAPI.vb b/HALOCELauncher/Core/GameTracker/GTAPI.vb new file mode 100644 index 0000000..0765102 --- /dev/null +++ b/HALOCELauncher/Core/GameTracker/GTAPI.vb @@ -0,0 +1,182 @@ +Imports System.Net +Imports System.IO +Imports HtmlAgilityPack +Imports System.Text.RegularExpressions + + +Namespace Core.GameTracker + + Public Class ServerType + Private _Name As String = Nothing + Private _IPAdress As String = Nothing + Private _Map As String = Nothing + Private _ListID As Integer = Nothing + Private _Players As String = Nothing + + Public Property Players As String + Get + Return _Players + End Get + Set(value As String) + _Players = value + End Set + End Property + + Public Property Map As String + Get + Return _Map + End Get + Set(value As String) + _Map = value + End Set + End Property + + Public Property Name As String + Get + Return _Name + End Get + Set(value As String) + _Name = value + End Set + End Property + + Public Property IPAdress As String + Get + Return _IPAdress + End Get + Set(value As String) + _IPAdress = value + End Set + End Property + + Public Property ListID As Integer + Get + Return _ListID + End Get + Set(value As Integer) + _ListID = value + End Set + End Property + + End Class + + Public Class GTAPI + + Public Sub New() + + End Sub + + Private HeaderTable As String = String.Empty + + Public Function GetServerList(Optional ByVal GameUrl As String = "https://www.gametracker.com/search/halo/#search") As List(Of ServerType) + On Error Resume Next + Dim ResultA As New List(Of ServerType) + Dim HtmlDocumentString As String = GetHTMLPage(GameUrl) + Dim htmldocEX As New HtmlAgilityPack.HtmlDocument + + + If Not HtmlDocumentString = String.Empty Then + + htmldocEX.LoadHtml(HtmlDocumentString) + + For Each row As HtmlNode In htmldocEX.DocumentNode.SelectNodes("//table[@class='table_lst table_lst_srs']") + Dim cells As HtmlNodeCollection = row.SelectNodes(".//tr") + + For i As Integer = 0 To cells.Count - 1 + + If i = 0 Then + 'Header Table + HeaderTable = TableFilter(cells(i).InnerText) + 'MsgBox(HeaderTable) + Else + + Dim ServerInfostr As String = TableFilter(cells(i).InnerText, True) + Dim ServerReaderInfo As String() = ServerInfostr.Split("|") + Dim LocalServer As New ServerType + LocalServer.ListID = Num(ServerReaderInfo(0)) + LocalServer.Name = ServerReaderInfo(1) + LocalServer.Players = ServerReaderInfo(2) + LocalServer.IPAdress = ServerReaderInfo(3) + LocalServer.Map = ServerReaderInfo(4) + If Not LocalServer.IPAdress = "Players" Then + ResultA.Add(LocalServer) + End If + + End If + + Next + + Next + + Return ResultA + + End If + 'Return Nothing + End Function + +#Region " Methods " + + Private Function GetHTMLPage(ByVal Url As String) As String + System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12 + Dim cookieJar As CookieContainer = New CookieContainer() + Dim request As HttpWebRequest = CType(WebRequest.Create(Url), HttpWebRequest) + request.UseDefaultCredentials = True + request.Proxy.Credentials = System.Net.CredentialCache.DefaultCredentials + request.CookieContainer = cookieJar + request.Accept = "text/html, application/xhtml+xml, */*" + request.Referer = "https://www.gametracker.com/" + request.Headers.Add("Accept-Language", "en-GB") + request.UserAgent = "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0)" + request.Host = "www.gametracker.com" + Dim response As HttpWebResponse = CType(request.GetResponse(), HttpWebResponse) + Dim htmlString As String = String.Empty + + Using reader = New StreamReader(response.GetResponseStream()) + htmlString = reader.ReadToEnd() + End Using + + Return htmlString + End Function + + Private Function TableFilter(ByVal subjectString As String, Optional Separator As Boolean = False) As String + Dim SubjetFilter As String = subjectString.Replace("|", "") + Dim FilterString As String = Regex.Replace(SubjetFilter, "^\s+$[\r\n]*", "", RegexOptions.Multiline) + Dim ResultStr As String = String.Empty + Dim reader = New StringReader(FilterString) + While True + Dim line = reader.ReadLine() + If line Is Nothing Then + Exit While + Else + If Separator = True Then + ResultStr += RemoveWhitespace(line) & "|" + Else + ResultStr += RemoveWhitespace(line) & " " + End If + End If + End While + Return ResultStr + End Function + + Private Function Num(ByVal value As String) As Integer + Dim returnVal As String = String.Empty + Dim collection As MatchCollection = Regex.Matches(value, "\d+") + For Each m As Match In collection + returnVal += m.ToString() + Next + Return Convert.ToInt32(returnVal) + End Function + + Private Function RemoveWhitespace(fullString As String) As String + Return New String(fullString.Where(Function(x) Not Char.IsWhiteSpace(x)).ToArray()) + End Function + +#End Region + + + End Class + + + +End Namespace + diff --git a/HALOCELauncher/Core/HaloQuery/HaloServer.vb b/HALOCELauncher/Core/HaloQuery/HaloServer.vb new file mode 100644 index 0000000..04f5381 --- /dev/null +++ b/HALOCELauncher/Core/HaloQuery/HaloServer.vb @@ -0,0 +1,42 @@ +Imports System.Collections.Generic +Imports System.Text +Imports System.Net.Sockets + +Namespace HaloQuery + Public Class HaloServer + Private socket As Socket = New Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp) With { + .ReceiveTimeout = 1000 + } + Public ServerHost As String + Public ServerPort As Integer + + Public Sub New(ByVal host As String, ByVal port As Integer) + Me.ServerHost = host + Me.ServerPort = port + End Sub + + Public Function GetRawResponse() As String + socket.Connect(Me.ServerHost, Me.ServerPort) + Dim buffer As Byte() = Encoding.[Default].GetBytes("\status\") + Dim received As Integer = 0 + socket.Send(buffer) + buffer = New Byte(4095) {} + received = socket.Receive(buffer) + socket.Close() + Return Encoding.[Default].GetString(buffer, 0, received) + End Function + + Public Function GetDictionaryResponse(Optional ByVal rawResponse As String = Nothing) As Dictionary(Of String, String) + If rawResponse Is Nothing Then rawResponse = Me.GetRawResponse() + Dim dataPart As String() = rawResponse.Split("\"c) + Dim parsedResponse As Dictionary(Of String, String) = New Dictionary(Of String, String)() + + For i As Integer = 1 To dataPart.Length - 1 Step 2 + parsedResponse.Add(dataPart(i), dataPart(i + 1)) + Next + + Return parsedResponse + End Function + + End Class +End Namespace diff --git a/HALOCELauncher/Core/HaloQuery/HaloServerInfo.vb b/HALOCELauncher/Core/HaloQuery/HaloServerInfo.vb new file mode 100644 index 0000000..2933b7f --- /dev/null +++ b/HALOCELauncher/Core/HaloQuery/HaloServerInfo.vb @@ -0,0 +1,506 @@ +Imports HALOCELauncher.HaloQuery +Imports System.Text.RegularExpressions + +Namespace HaloQuery + + + + Public Class Player + Private _ID As Integer = Nothing + Private _Score As Integer = Nothing + Private _Name As String = Nothing + Private _Ping As Integer = Nothing + Private _Team As New Team + Public Sub New() + + End Sub + Public Property ID As Integer + Get + Return _ID + End Get + Set(value As Integer) + _ID = value + End Set + End Property + + Public Property Score As Integer + Get + Return _Score + End Get + Set(value As Integer) + _Score = value + End Set + End Property + + Public Property Ping As Integer + Get + Return _Ping + End Get + Set(value As Integer) + _Ping = value + End Set + End Property + + Public Property Name As String + Get + Return _Name + End Get + Set(value As String) + _Name = value + End Set + End Property + + Public Property Team As Team + Get + Return _Team + End Get + Set(value As Team) + _Team = value + End Set + End Property + + End Class + + Public Class Team + Private _ID As Integer = Nothing + Private _Score As Integer = Nothing + Private _TeamColor As Color = Color.White + + Public Property ID As Integer + Get + Return _ID + End Get + Set(value As Integer) + _ID = value + End Set + End Property + + Public Property Score As Integer + Get + Return _Score + End Get + Set(value As Integer) + _Score = value + End Set + End Property + + Public Property TeamColor As Color + Get + Return _TeamColor + End Get + Set(value As Color) + _TeamColor = value + End Set + End Property + End Class + + Public Class HaloServerInfo + +#Region " Properties " + + Private _Ready As Boolean = False + Public ReadOnly Property Ready As Boolean + Get + Return _Ready + End Get + End Property + + Public ReadOnly Property PlayersList As List(Of Player) + Get + Return GetPlayerList() + End Get + End Property + + Public ReadOnly Property RedTeamInfo As Team + Get + Return GameTeam.Red + End Get + End Property + + Public ReadOnly Property BlueTeamInfo As Team + Get + Return GameTeam.Blue + End Get + End Property + + Private _Hostname As String = String.Empty + Public ReadOnly Property Hostname As String + Get + Return _Hostname + End Get + End Property + + Private _GameVer As String = String.Empty + Public ReadOnly Property GameVersion As String + Get + Return _GameVer + End Get + End Property + + Private _HostPort As Integer = Nothing + Public ReadOnly Property HostPort As Integer + Get + Return _HostPort + End Get + End Property + + Private _MaxPlayers As Integer = Nothing + Public ReadOnly Property MaxPlayers As Integer + Get + Return _MaxPlayers + End Get + End Property + + Private _Password As Boolean = False + Public ReadOnly Property Password As Boolean + Get + Return _Password + End Get + End Property + + Private _MapName As String = String.Empty + Public ReadOnly Property MapName As String + Get + Return _MapName + End Get + End Property + + Private _Dedicated As Integer = Nothing + Public ReadOnly Property Dedicated As Integer + Get + Return _Dedicated + End Get + End Property + + Private _Gamemode As String = String.Empty + Public ReadOnly Property Gamemode As String + Get + Return _Gamemode + End Get + End Property + + Private _GameClassic As Integer = Nothing + Public ReadOnly Property GameClassic As Integer + Get + Return _GameClassic + End Get + End Property + + Private _NumbPlayers As Integer = Nothing + Public ReadOnly Property PlayersCount As Integer + Get + Return _NumbPlayers + End Get + End Property + + Private _GameType As String = String.Empty + Public ReadOnly Property GameType As String + Get + Return _GameType + End Get + End Property + + Private _TeamPlay As Integer = Nothing + Public ReadOnly Property TeamPlay As Integer + Get + Return _TeamPlay + End Get + End Property + + Private _GameVariant As String = String.Empty + Public ReadOnly Property GameVariant As String + Get + Return _GameVariant + End Get + End Property + + Private _FragLimit As Integer = Nothing + Public ReadOnly Property FragLimit As Integer + Get + Return _FragLimit + End Get + End Property + + Private _PlayerFlags As String = String.Empty + Public ReadOnly Property PlayerFlags As String + Get + Return _PlayerFlags + End Get + End Property + + Private _GameFlags As String = String.Empty + Public ReadOnly Property GameFlags As String + Get + Return _GameFlags + End Get + End Property + + Private _Final As String = String.Empty + Public ReadOnly Property Final As String + Get + Return _Final + End Get + End Property + + Private _QueryID As String = String.Empty + Public ReadOnly Property QueryID As String + Get + Return _QueryID + End Get + End Property + + Private _SAPPC As String = String.Empty + Public ReadOnly Property SAPPC As String + Get + Return _SAPPC + End Get + End Property + + Private _SAPPFlags As String = String.Empty + Public ReadOnly Property SAPPFlags As String + Get + Return _SAPPFlags + End Get + End Property + + Private _NextMap As String = String.Empty + Public ReadOnly Property NextMap As String + Get + Return _NextMap + End Get + End Property + + Private _NextMode As String = String.Empty + Public ReadOnly Property NextMode As String + Get + Return _NextMode + End Get + End Property + +#End Region + +#Region " Structures " + +#Region " PlayerStructure " + + Public Structure Players + Public Shared Player1 As New Player + Public Shared Player2 As New Player + Public Shared Player3 As New Player + Public Shared Player4 As New Player + Public Shared Player5 As New Player + Public Shared Player6 As New Player + Public Shared Player7 As New Player + Public Shared Player8 As New Player + Public Shared Player9 As New Player + Public Shared Player10 As New Player + Public Shared Player11 As New Player + Public Shared Player12 As New Player + Public Shared Player13 As New Player + Public Shared Player14 As New Player + Public Shared Player15 As New Player + Public Shared Player16 As New Player + End Structure + +#End Region + +#Region " TeamStructure " + + Private Structure GameTeam + Public Shared Red As New Team With {.ID = 0, .TeamColor = Color.Red} + Public Shared Blue As New Team With {.ID = 1, .TeamColor = Color.Blue} + End Structure + +#End Region + +#End Region + + Public Sub New(ByVal argsEx As String()) + _Ready = False + Dim ServerInfo As Boolean = GetServerInfo(argsEx) + _Ready = True + End Sub + + Public Function GetServerInfo(ByVal Argumentos As String()) As Boolean + ' Try + Dim server = GetHaloServerFromArgs(Argumentos) + + For Each record In server.GetDictionaryResponse() + Select Case record.Key + 'Players ID / NAME / SCORE / PING + ' + '--------Name And ID + Case "player_0" : Players.Player1.Name = record.Value : Players.Player1.ID = 0 + Case "player_1" : Players.Player2.Name = record.Value : Players.Player2.ID = 1 + Case "player_2" : Players.Player3.Name = record.Value : Players.Player3.ID = 2 + Case "player_3" : Players.Player4.Name = record.Value : Players.Player4.ID = 3 + Case "player_4" : Players.Player5.Name = record.Value : Players.Player5.ID = 4 + Case "player_5" : Players.Player6.Name = record.Value : Players.Player6.ID = 5 + Case "player_6" : Players.Player7.Name = record.Value : Players.Player7.ID = 6 + Case "player_7" : Players.Player8.Name = record.Value : Players.Player8.ID = 7 + Case "player_8" : Players.Player9.Name = record.Value : Players.Player9.ID = 8 + Case "player_9" : Players.Player10.Name = record.Value : Players.Player10.ID = 9 + Case "player_10" : Players.Player11.Name = record.Value : Players.Player11.ID = 10 + Case "player_11" : Players.Player12.Name = record.Value : Players.Player12.ID = 11 + Case "player_12" : Players.Player13.Name = record.Value : Players.Player13.ID = 12 + Case "player_13" : Players.Player14.Name = record.Value : Players.Player14.ID = 13 + Case "player_14" : Players.Player15.Name = record.Value : Players.Player15.ID = 14 + Case "player_15" : Players.Player16.Name = record.Value : Players.Player16.ID = 15 + ' + '--------Score + Case "score_0" : Players.Player1.Score = Num(record.Value) + Case "score_1" : Players.Player2.Score = Num(record.Value) + Case "score_2" : Players.Player3.Score = Num(record.Value) + Case "score_3" : Players.Player4.Score = Num(record.Value) + Case "score_4" : Players.Player5.Score = Num(record.Value) + Case "score_5" : Players.Player6.Score = Num(record.Value) + Case "score_6" : Players.Player7.Score = Num(record.Value) + Case "score_7" : Players.Player8.Score = Num(record.Value) + Case "score_8" : Players.Player9.Score = Num(record.Value) + Case "score_9" : Players.Player10.Score = Num(record.Value) + Case "score_10" : Players.Player11.Score = Num(record.Value) + Case "score_11" : Players.Player12.Score = Num(record.Value) + Case "score_12" : Players.Player13.Score = Num(record.Value) + Case "score_13" : Players.Player14.Score = Num(record.Value) + Case "score_14" : Players.Player15.Score = Num(record.Value) + Case "score_15" : Players.Player16.Score = Num(record.Value) + ' + '--------Ping + Case "ping_0" : Players.Player1.Ping = record.Value + Case "ping_1" : Players.Player2.Ping = record.Value + Case "ping_2" : Players.Player3.Ping = record.Value + Case "ping_3" : Players.Player4.Ping = record.Value + Case "ping_4" : Players.Player5.Ping = record.Value + Case "ping_5" : Players.Player6.Ping = record.Value + Case "ping_6" : Players.Player7.Ping = record.Value + Case "ping_7" : Players.Player8.Ping = record.Value + Case "ping_8" : Players.Player9.Ping = record.Value + Case "ping_9" : Players.Player10.Ping = record.Value + Case "ping_10" : Players.Player11.Ping = record.Value + Case "ping_11" : Players.Player12.Ping = record.Value + Case "ping_12" : Players.Player13.Ping = record.Value + Case "ping_13" : Players.Player14.Ping = record.Value + Case "ping_14" : Players.Player15.Ping = record.Value + Case "ping_15" : Players.Player16.Ping = record.Value + ' + '--------Team + Case "team_0" : If record.Value = GameTeam.Red.ID Then : Players.Player1.Team = GameTeam.Red : Else : Players.Player1.Team = GameTeam.Blue : End If + Case "team_1" : If record.Value = GameTeam.Red.ID Then : Players.Player2.Team = GameTeam.Red : Else : Players.Player2.Team = GameTeam.Blue : End If + Case "team_2" : If record.Value = GameTeam.Red.ID Then : Players.Player3.Team = GameTeam.Red : Else : Players.Player3.Team = GameTeam.Blue : End If + Case "team_3" : If record.Value = GameTeam.Red.ID Then : Players.Player4.Team = GameTeam.Red : Else : Players.Player4.Team = GameTeam.Blue : End If + Case "team_4" : If record.Value = GameTeam.Red.ID Then : Players.Player5.Team = GameTeam.Red : Else : Players.Player5.Team = GameTeam.Blue : End If + Case "team_5" : If record.Value = GameTeam.Red.ID Then : Players.Player6.Team = GameTeam.Red : Else : Players.Player6.Team = GameTeam.Blue : End If + Case "team_6" : If record.Value = GameTeam.Red.ID Then : Players.Player7.Team = GameTeam.Red : Else : Players.Player7.Team = GameTeam.Blue : End If + Case "team_7" : If record.Value = GameTeam.Red.ID Then : Players.Player8.Team = GameTeam.Red : Else : Players.Player8.Team = GameTeam.Blue : End If + Case "team_8" : If record.Value = GameTeam.Red.ID Then : Players.Player9.Team = GameTeam.Red : Else : Players.Player9.Team = GameTeam.Blue : End If + Case "team_9" : If record.Value = GameTeam.Red.ID Then : Players.Player10.Team = GameTeam.Red : Else : Players.Player10.Team = GameTeam.Blue : End If + Case "team_10" : If record.Value = GameTeam.Red.ID Then : Players.Player11.Team = GameTeam.Red : Else : Players.Player11.Team = GameTeam.Blue : End If + Case "team_11" : If record.Value = GameTeam.Red.ID Then : Players.Player12.Team = GameTeam.Red : Else : Players.Player12.Team = GameTeam.Blue : End If + Case "team_12" : If record.Value = GameTeam.Red.ID Then : Players.Player13.Team = GameTeam.Red : Else : Players.Player13.Team = GameTeam.Blue : End If + Case "team_13" : If record.Value = GameTeam.Red.ID Then : Players.Player14.Team = GameTeam.Red : Else : Players.Player14.Team = GameTeam.Blue : End If + Case "team_14" : If record.Value = GameTeam.Red.ID Then : Players.Player15.Team = GameTeam.Red : Else : Players.Player15.Team = GameTeam.Blue : End If + Case "team_15" : If record.Value = GameTeam.Red.ID Then : Players.Player16.Team = GameTeam.Red : Else : Players.Player16.Team = GameTeam.Blue : End If + ' + ' + 'Team ID and Score + Case "team_t0" : If record.Value = "Red" Then : GameTeam.Red.ID = 0 : GameTeam.Blue.ID = 1 : End If + Case "team_t1" : If record.Value = "Blue" Then : GameTeam.Blue.ID = 1 : GameTeam.Red.ID = 0 : End If + Case "score_t0" : If GameTeam.Red.ID = 0 Then : GameTeam.Red.Score = record.Value : Else : GameTeam.Blue.Score = record.Value : End If + Case "score_t1" : If GameTeam.Blue.ID = 1 Then : GameTeam.Blue.Score = record.Value : Else : GameTeam.Red.Score = record.Value : End If + ' + Case "hostname" : If record.Value = "" Then : _Hostname = "Erro to get" : Else : _Hostname = record.Value.ToString : End If + Case "gamever" : _GameVer = record.Value + Case "hostport" : _HostPort = Num(record.Value) + Case "maxplayers" : _MaxPlayers = Val(record.Value) + Case "password" : _Password = CBool(record.Value) + Case "mapname" : _MapName = record.Value + Case "dedicated" : _Dedicated = record.Value + Case "gamemode" : _Gamemode = record.Value + Case "game_classic" : _GameClassic = record.Value + Case "numplayers" : _NumbPlayers = Val(record.Value) + Case "gametype" : _GameType = record.Value + Case "teamplay" : _TeamPlay = Val(record.Value) + Case "gamevariant" : _GameVariant = record.Value + Case "fraglimit" : _FragLimit = Val(record.Value) + Case "player_flags" : _PlayerFlags = record.Value + Case "game_flags" : _GameFlags = record.Value + Case "final" : _Final = record.Value + Case "queryid" : _QueryID = record.Value + Case "sapp" : _SAPPC = record.Value + Case "sapp_flags" : _SAPPFlags = record.Value + Case "nextmap" : _NextMap = record.Value + Case "nextmode" : _NextMode = record.Value + + End Select + Next + + Return True + ' Catch ex As Exception + ' Throw New Exception(ex.Message) + 'End Try + Return False + End Function + +#Region " Methods " + + Private Function Num(ByVal value As String) As Integer + If value = "" Then + Return 8080 + Else + Dim returnVal As String = String.Empty + Dim collection As MatchCollection = Regex.Matches(value, "\d+") + For Each m As Match In collection + returnVal += m.ToString() + Next + Return Convert.ToInt32(returnVal) + End If + End Function + + Private Function GetHaloServerFromArgs(ByVal args As String()) As HaloServer + Dim serverArgs = args + Dim host As String + Dim port As Integer + If args.Length = 1 Then serverArgs = args(0).Split(":"c) + + If serverArgs.Length = 0 OrElse serverArgs.Length > 2 Then + ' TextBox1.Text += "haloq (host[:port] | host [port])" & vbNewLine + MsgBox("error") + End If + + host = serverArgs(0) + + If serverArgs.Length = 1 Then + port = 2302 + Else + port = Integer.Parse(serverArgs(1)) + End If + + Return New HaloServer(host, port) + End Function + + Private Function GetPlayerList() As List(Of Player) + Dim PlayerList As New List(Of Player) + PlayerList.Add(Players.Player1) + PlayerList.Add(Players.Player2) + PlayerList.Add(Players.Player3) + PlayerList.Add(Players.Player4) + PlayerList.Add(Players.Player5) + PlayerList.Add(Players.Player6) + PlayerList.Add(Players.Player7) + PlayerList.Add(Players.Player8) + PlayerList.Add(Players.Player9) + PlayerList.Add(Players.Player10) + PlayerList.Add(Players.Player11) + PlayerList.Add(Players.Player12) + PlayerList.Add(Players.Player13) + PlayerList.Add(Players.Player14) + PlayerList.Add(Players.Player15) + PlayerList.Add(Players.Player16) + Return PlayerList + End Function + +#End Region + + End Class +End Namespace + diff --git a/HALOCELauncher/Core/Helpers.vb b/HALOCELauncher/Core/Helpers.vb new file mode 100644 index 0000000..5b8a052 --- /dev/null +++ b/HALOCELauncher/Core/Helpers.vb @@ -0,0 +1,130 @@ +Imports System.IO +Imports System.Security.Principal + + +Namespace Core + + Public Class Helpers + + Public Shared ReadOnly Property IsAdministrator As Boolean + Get + Return New WindowsPrincipal(WindowsIdentity.GetCurrent()).IsInRole(WindowsBuiltInRole.Administrator) + End Get + End Property + + Public Shared Sub RUNAdmin(ByVal Appdir As String) + Dim startInfo = New ProcessStartInfo(Appdir) + startInfo.RedirectStandardOutput = True + startInfo.RedirectStandardError = True + startInfo.UseShellExecute = False + startInfo.Verb = "runas" + Process.Start(startInfo) + End + End Sub + + Public Shared Sub EnabledDragger(ByVal ControlEx As Control) + Dim NewDragControl As New Guna.UI.WinForms.GunaDragControl + NewDragControl.TargetControl = ControlEx + End Sub + + Public Shared Function SecondtoMilli(ByVal second As Integer) As Integer + Return (second * 1000) + End Function + + Public Shared Function GetRandomNum(Optional ByVal minimum As Integer = 0, Optional ByVal Maximum As Integer = 0) As Integer + Dim random As New Random() + If Maximum = 0 Then + Return random.Next() + Else + Return random.Next(minimum, Maximum) + End If + End Function + + Public Shared Function CompareImages(ByVal img1 As Bitmap, ByVal img2 As Bitmap) As Boolean + Dim i As Integer + Dim j As Integer + + For i = 0 To img1.Width - 1 + For j = 0 To img2.Height - 1 + If img1.GetPixel(i, j) <> img2.GetPixel(i, j) Then + Return False + End If + Next + Next + Return True + End Function + + Public Shared Function open(Optional Custom_Filter As String = "Executables (*.exe)|*.exe") As String + Using openFileDialog As OpenFileDialog = New OpenFileDialog() + Dim openFileDialog2 As OpenFileDialog = openFileDialog + openFileDialog2.AddExtension = True + openFileDialog2.AutoUpgradeEnabled = True + openFileDialog2.CheckPathExists = True + openFileDialog2.Title = "Selec File" + openFileDialog2.Filter = Custom_Filter + openFileDialog2.FileName = "" + openFileDialog2.RestoreDirectory = True + If openFileDialog.ShowDialog() = DialogResult.OK Then + Return openFileDialog.FileName + End If + End Using + Return "Error" + End Function + + Public Shared Function save(Optional Custom_Filename As String = " ", Optional Custom_Filter As String = "Executables (*.exe)|*.exe") As String + Using saveFileDialog As SaveFileDialog = New SaveFileDialog() + Dim saveFileDialog2 As SaveFileDialog = saveFileDialog + saveFileDialog2.AddExtension = True + saveFileDialog2.AutoUpgradeEnabled = True + saveFileDialog2.CheckPathExists = True + saveFileDialog2.FileName = Custom_Filename + saveFileDialog2.Filter = Custom_Filter + saveFileDialog2.FilterIndex = 2 + saveFileDialog2.RestoreDirectory = True + saveFileDialog2.Title = "Select a file destination to save" + If saveFileDialog.ShowDialog() = DialogResult.OK Then + Return saveFileDialog.FileName + End If + End Using + Return "Error" + End Function + +#Region " Base64 Functions " + + Public Shared Function ConvertImageToBase64String(ByVal ImageL As Image) As String + Using ms As New MemoryStream() + ImageL.Save(ms, System.Drawing.Imaging.ImageFormat.Png) 'We load the image from first PictureBox in the MemoryStream + Dim obyte = ms.ToArray() 'We tranform it to byte array.. + + Return Convert.ToBase64String(obyte) 'We then convert the byte array to base 64 string. + End Using + End Function + + Public Shared Function ConvertBase64ToByteArray(base64 As String) As Byte() + Return Convert.FromBase64String(base64) 'Convert the base64 back to byte array. + End Function + + 'Here's the part of your code (which works) + Public Shared Function convertbytetoimage(ByVal BA As Byte()) + Dim ms As MemoryStream = New MemoryStream(BA) + Dim image = System.Drawing.Image.FromStream(ms) + Return image + End Function + +#End Region + +#Region " CenterForm function " + + Public Shared Function CenterForm(ByVal ParentForm As Form, ByVal Form_to_Center As Form, ByVal Form_Location As Point) As Point + Dim FormLocation As New Point + FormLocation.X = (ParentForm.Left + (ParentForm.Width - Form_to_Center.Width) / 2) ' set the X coordinates. + FormLocation.Y = (ParentForm.Top + (ParentForm.Height - Form_to_Center.Height) / 2) ' set the Y coordinates. + Return FormLocation ' return the Location to the Form it was called from. + End Function + +#End Region + + End Class + +End Namespace + diff --git a/HALOCELauncher/Core/Launcher.vb b/HALOCELauncher/Core/Launcher.vb new file mode 100644 index 0000000..bc1277a --- /dev/null +++ b/HALOCELauncher/Core/Launcher.vb @@ -0,0 +1,161 @@ +Imports System.Runtime.InteropServices + +Namespace Core + + Public Class Launcher + + Private Timer1 As New System.Windows.Forms.Timer With {.Interval = 100} + Public GameProc As String = String.Empty + Public GameDir As String = String.Empty + + Public Sub New(Optional ByVal GameDirEx As String = Nothing) + If GameDirEx = Nothing Then + If My.Settings.GameDefect = 0 Then + GameDirEx = My.Settings.GameDirCE + ElseIf My.Settings.GameDefect = 1 Then + GameDirEx = My.Settings.GameDirPC + End If + Else + GameDir = GameDirEx + End If + GameProc = IO.Path.GetFileName(GameDir) + AddHandler Timer1.Tick, AddressOf Timer1_Tick + End Sub + + Public Sub Launch(ByVal IpAdress As String, Optional ByVal Password As String = "") + Dim Larguments As String = String.Empty + Dim Arguments As String = GetArguments() + If My.Settings.LaunchMode = 0 Then Larguments = " -window " + Larguments += " -connect " & IpAdress & " " + If Not Password = "" Then + Larguments += Arguments & " -password " & Password + Else + Larguments += Arguments + End If + + If IO.File.Exists(GameDir) = True Then + Dim p As New Process + p.StartInfo.WorkingDirectory = (IO.Path.GetDirectoryName(GameDir)) + p.StartInfo.FileName = IO.Path.GetFileName(GameDir) + p.StartInfo.Arguments = Larguments + p.Start() + p.WaitForInputIdle() + If My.Settings.LaunchMode = 0 Then Timer1.Enabled = True + End If + End Sub + + + Dim ProcC As Integer = 0 + Dim Procede As Boolean = False + Private Sub Timer1_Tick(sender As Object, e As EventArgs) + Dim procs As Process() = Process.GetProcesses() + + Dim ProcessNameEX As String = IO.Path.GetFileNameWithoutExtension(GameProc) + Dim processcount As Integer = procs.Count + For Each proc As Process In procs + + If proc.ProcessName = ProcessNameEX Then + Dim placement = GetPlacement(proc.MainWindowHandle) + If placement.showCmd.ToString = "Normal" Then + Dim FakeFullSc As Boolean = FullScreenEmulation(GameProc) + Procede = True + End If + If Procede = True Then + If placement.showCmd.ToString = "Maximized" Then + Dim FakeFullSc As Boolean = FullScreenEmulation(GameProc) + Timer1.Enabled = False + End If + End If + End If + Next + End Sub + + Public Function FullScreenEmulation(ByVal ProcessName As String) As Boolean + Try + If ProcessName.EndsWith(".exe", StringComparison.OrdinalIgnoreCase) Then ProcessName = ProcessName.Remove(ProcessName.Length - ".exe".Length) + Dim HWND As IntPtr = Process.GetProcessesByName(ProcessName).First.MainWindowHandle + For i As Integer = 0 To 2 + SetWindowStyle.SetWindowStyle(HWND, SetWindowStyle.WindowStyles.WS_BORDER) + SetWindowState.SetWindowState(HWND, SetWindowState.WindowState.Maximize) + Next + BringMainWindowToFront(ProcessName) + Return True + Catch ex As Exception + Return False + End Try + End Function + + Public Function GetArguments() As String + Dim Arguments As String = String.Empty + If My.Settings.LaunchMode = 1 Then Arguments += " -window " + If My.Settings.ConsoleC = True Then Arguments += " -console " + If My.Settings.ScreenshotC = True Then Arguments += " -screenshot " + If My.Settings.devC = True Then Arguments += " -devmode " + If My.Settings.SoundC = True Then Arguments += " -nosound " + If My.Settings.VideoC = True Then Arguments += " -novideo " + If My.Settings.GammaC = True Then Arguments += " -nogamma " + If My.Settings.JoystickC = True Then Arguments += " -nojoystick " + If My.Settings.SafeModeC = True Then Arguments += " -safemode " + Return Arguments + End Function + +#Region " Set Focus " + + <System.Runtime.InteropServices.DllImport("user32.dll")> + Private Shared Function SetForegroundWindow(ByVal hwnd As IntPtr) As Integer + End Function + + Dim FisrsFocus As Boolean = False + + Public Sub BringMainWindowToFront(ByVal processName As String) + If FisrsFocus = False Then + Dim bProcess As Process = Process.GetProcessesByName(processName).FirstOrDefault() + + If bProcess IsNot Nothing Then + SetForegroundWindow(bProcess.MainWindowHandle) + End If + FisrsFocus = True + End If + End Sub + +#End Region + + +#Region " Check FakeFullscreen " + + Private Shared Function GetPlacement(ByVal hwnd As IntPtr) As WINDOWPLACEMENT + Dim placement As WINDOWPLACEMENT = New WINDOWPLACEMENT() + placement.length = Marshal.SizeOf(placement) + GetWindowPlacement(hwnd, placement) + Return placement + End Function + + <DllImport("user32.dll", SetLastError:=True)> + Friend Shared Function GetWindowPlacement(ByVal hWnd As IntPtr, ByRef lpwndpl As WINDOWPLACEMENT) As Boolean + End Function + + <Serializable> + <StructLayout(LayoutKind.Sequential)> + Friend Structure WINDOWPLACEMENT + Public length As Integer + Public flags As Integer + Public showCmd As ShowWindowCommands + Public ptMinPosition As System.Drawing.Point + Public ptMaxPosition As System.Drawing.Point + Public rcNormalPosition As System.Drawing.Rectangle + End Structure + + Friend Enum ShowWindowCommands As Integer + Hide = 0 + Normal = 1 + Minimized = 2 + Maximized = 3 + End Enum + +#End Region + + End Class + +End Namespace + + diff --git a/HALOCELauncher/Core/SvManager/SvFormatManager.vb b/HALOCELauncher/Core/SvManager/SvFormatManager.vb new file mode 100644 index 0000000..0545e9e --- /dev/null +++ b/HALOCELauncher/Core/SvManager/SvFormatManager.vb @@ -0,0 +1,254 @@ +Imports HALOCELauncher.Core.Utils +Imports HALOCELauncher.Core.GameTracker + +Namespace Core.SvManager + + Public Class SvFormatManager + + Private Shared xmlfile As String = "HALOSV_List.xml" + + Public Shared UpdateAe As Boolean = False + + Public Shared Server_Config As String = <a><![CDATA[<?xml version="1.0" encoding="Windows-1252"?> + <!--HALO Launcher Server Database--> + <ServerDatabase> + %Heart% + </ServerDatabase>]]></a>.Value + + Public Shared Server_Estructure As String = + <a><![CDATA[<server%Number%> + <Name>%sv_name%</Name> + <IpAddr>%sv_ip%</IpAddr> + <Players>%sv_player%</Players> + <Map>%sv_map%</Map> + </server%Number%>]]></a>.Value + + Public Shared Property xml_svlist As String + Get + Return xmlfile + End Get + Set(value As String) + xmlfile = value + End Set + End Property + + Public Shared Function ExistsXmlServer() As Boolean + Return IO.File.Exists(xmlfile) + End Function + + Public Shared Function ReadXmlServers() As List(Of ServerType) + Dim localsv As New List(Of ServerType) + + Dim xmlData As XDocument = XDocument.Parse(IO.File.ReadAllText(xmlfile)) + + For Each signature As XElement In xmlData.Root.Elements + Dim Lmsv As New ServerType + Dim Hostname As String = signature.<Name>.Value + Dim IpAddr As String = signature.<IpAddr>.Value + Dim Players As String = signature.<Players>.Value + Dim Mapsv As String = signature.<Map>.Value + Lmsv.Name = Hostname + Lmsv.IPAdress = IpAddr + Lmsv.Players = Players + Lmsv.Map = Mapsv + + localsv.Add(Lmsv) + Next + + Return localsv + + End Function + + Public Shared Function UpdateFromExternal(ByVal ExternalFile As String) + Try + + Dim ReadExternalServers As New List(Of ServerType) + + Dim xmlData As XDocument = XDocument.Parse(IO.File.ReadAllText(ExternalFile)) + + For Each signature As XElement In xmlData.Root.Elements + Dim Lmsv As New ServerType + Dim Hostname As String = signature.<Name>.Value + Dim IpAddr As String = signature.<IpAddr>.Value + Dim Players As String = signature.<Players>.Value + Dim Mapsv As String = signature.<Map>.Value + Lmsv.Name = Hostname + Lmsv.IPAdress = IpAddr + Lmsv.Players = Players + Lmsv.Map = Mapsv + + ReadExternalServers.Add(Lmsv) + Next + + Dim localsv As New List(Of ServerType) + + If ExistsXmlServer() = True Then + localsv.AddRange(ReadXmlServers) + End If + + localsv.AddRange(ReadExternalServers) + + localsv.Distinct() + + Dim ResultHeart As String = Server_Config + Dim FinalEstructure As String = String.Empty + + Dim sv_Counter As Integer = 0 + + For Each Sv_Temp As ServerType In localsv + + Dim Estructuresv As String = Server_Estructure + Estructuresv = Replace(Estructuresv, "%Number%", sv_Counter) + Estructuresv = Replace(Estructuresv, "%sv_name%", Sv_Temp.Name) + Estructuresv = Replace(Estructuresv, "%sv_ip%", Sv_Temp.IPAdress) + Estructuresv = Replace(Estructuresv, "%sv_player%", Sv_Temp.Players) + Estructuresv = Replace(Estructuresv, "%sv_map%", Sv_Temp.Map) + FinalEstructure += Estructuresv & vbNewLine + sv_Counter += 1 + Next + + ResultHeart = Replace(ResultHeart, "%Heart%", FinalEstructure) + + If IO.File.Exists(xmlfile) Then + IO.File.Delete(xmlfile) + End If + + IO.File.WriteAllText(xmlfile, ResultHeart) + + + Return True + Catch ex As Exception + Return False + End Try + End Function + + + + + Public Shared Function WritteXmlServers(ByVal Sv_TempEx As List(Of ServerType)) As Boolean + Try + + Dim localsv As New List(Of ServerType) + + If ExistsXmlServer() = True Then + localsv.AddRange(ReadXmlServers) + End If + + localsv.AddRange(Sv_TempEx) + + Dim ResultHeart As String = Server_Config + Dim FinalEstructure As String = String.Empty + + Dim sv_Counter As Integer = 0 + + For Each Sv_Temp As ServerType In localsv + + Dim Estructuresv As String = Server_Estructure + Estructuresv = Replace(Estructuresv, "%Number%", sv_Counter) + Estructuresv = Replace(Estructuresv, "%sv_name%", Sv_Temp.Name) + Estructuresv = Replace(Estructuresv, "%sv_ip%", Sv_Temp.IPAdress) + Estructuresv = Replace(Estructuresv, "%sv_player%", Sv_Temp.Players) + Estructuresv = Replace(Estructuresv, "%sv_map%", Sv_Temp.Map) + FinalEstructure += Estructuresv & vbNewLine + sv_Counter += 1 + Next + + ResultHeart = Replace(ResultHeart, "%Heart%", FinalEstructure) + + If IO.File.Exists(xmlfile) Then + IO.File.Delete(xmlfile) + End If + + IO.File.WriteAllText(xmlfile, ResultHeart) + + Return True + Catch ex As Exception + Return False + End Try + End Function + + Public Shared Function DeleteServerFromXML(ByVal Sv_TempEx As ServerType) As Boolean + Try + + Dim FilterProc As New List(Of ServerType) + + Dim localsv As New List(Of ServerType) + + If ExistsXmlServer() = True Then + localsv.AddRange(ReadXmlServers) + End If + + + For Each Sv_Filter As ServerType In localsv + + If Not Sv_Filter.IPAdress = Sv_TempEx.IPAdress Then + + FilterProc.Add(Sv_Filter) + + End If + + Next + + + + Dim ResultHeart As String = Server_Config + Dim FinalEstructure As String = String.Empty + + Dim sv_Counter As Integer = 0 + + For Each Sv_Temp As ServerType In FilterProc + + Dim Estructuresv As String = Server_Estructure + Estructuresv = Replace(Estructuresv, "%Number%", sv_Counter) + Estructuresv = Replace(Estructuresv, "%sv_name%", Sv_Temp.Name) + Estructuresv = Replace(Estructuresv, "%sv_ip%", Sv_Temp.IPAdress) + Estructuresv = Replace(Estructuresv, "%sv_player%", Sv_Temp.Players) + Estructuresv = Replace(Estructuresv, "%sv_map%", Sv_Temp.Map) + FinalEstructure += Estructuresv & vbNewLine + sv_Counter += 1 + Next + + ResultHeart = Replace(ResultHeart, "%Heart%", FinalEstructure) + + If IO.File.Exists(xmlfile) Then + IO.File.Delete(xmlfile) + End If + + IO.File.WriteAllText(xmlfile, ResultHeart) + + Return True + Catch ex As Exception + Return False + End Try + End Function + + Public Shared Function CheckDuplicateServerFromXML(ByVal Sv_TempEx As ServerType) As Boolean + Try + + Dim localsv As New List(Of ServerType) + + If ExistsXmlServer() = True Then + localsv.AddRange(ReadXmlServers) + End If + + For Each Sv_Filter As ServerType In localsv + + If Sv_Filter.IPAdress = Sv_TempEx.IPAdress Then + + Return True + + End If + + Next + + Return False + Catch ex As Exception + Return False + End Try + End Function + + + End Class + +End Namespace + diff --git a/HALOCELauncher/Core/Time/TimeMeasurer.vb b/HALOCELauncher/Core/Time/TimeMeasurer.vb new file mode 100644 index 0000000..126ead2 --- /dev/null +++ b/HALOCELauncher/Core/Time/TimeMeasurer.vb @@ -0,0 +1,420 @@ +' *********************************************************************** +' Author : Elektro +' Last Modified On : 10-02-2014 +' *********************************************************************** +' <copyright file="TimeMeasurer.vb" company="Elektro Studios"> +' Copyright (c) Elektro Studios. All rights reserved. +' </copyright> +' *********************************************************************** + +#Region " Usage Examples " + +'Public Class TimeMeasurer_Test +' +' ''' <summary> +' ''' The <see cref="TimeMeasurer"/> instance that measure time intervals. +' ''' </summary> +' Private WithEvents Clock As New TimeMeasurer With {.UpdateInterval = 100} +' +' Private ctrl_ElapsedTime As Control ' Control used to display the time elapsed interval. +' Private ctrl_RemainingTime As Control ' Control used to display the time remaining interval. +' +' Private Shadows Sub Load() Handles MyBase.Load +' +' ctrl_ElapsedTime = LabelElapsed +' ctrl_RemainingTime = LabelRemaining +' +' Me.Clock.Start(60000) ' Measure 1 minute +' +' ' Or... +' ' Me.Clock.Stop() ' Stop temporally the time interval measurement. +' ' Me.Clock.Resume() ' Resume a previouslly stopped time interval measurement. +' ' Dim ClockState As TimeMeasurer.TimeMeasurerState = Me.Clock.State ' Get the state. +' +' End Sub +' +' ''' <summary> +' ''' Handles the ElapsedTimeUpdated event of the Clock instance. +' ''' </summary> +' ''' <param name="sender">The source of the event.</param> +' ''' <param name="e">The <see cref="TimeMeasurer.TimeMeasureEventArgs"/> instance containing the event data.</param> +' Private Sub Clock_ElapsedTimeUpdated(ByVal sender As Object, ByVal e As TimeMeasurer.TimeMeasureEventArgs) _ +' Handles Clock.ElapsedTimeUpdated +' +' ' Measure H:M:S:MS +' ctrl_ElapsedTime.Text = String.Format("{0:00}:{1:00}:{2:00}:{3:000}", +' e.Hour, e.Minute, e.Second, e.Millisecond) +' +' ' Measure H:M:S +' ctrl_ElapsedTime.Text = String.Format("{0:00}:{1:00}:{2:00}", +' e.Hour, e.Minute, e.Second) +' +' End Sub +' +' ''' <summary> +' ''' Handles the RemainingTimeUpdated event of the Clock instance. +' ''' </summary> +' ''' <param name="sender">The source of the event.</param> +' ''' <param name="e">The <see cref="TimeMeasurer.TimeMeasureEventArgs"/> instance containing the event data.</param> +' Private Sub Clock_RemainingTimeUpdated(ByVal sender As Object, ByVal e As TimeMeasurer.TimeMeasureEventArgs) _ +' Handles Clock.RemainingTimeUpdated +' +' ' Measure H:M:S:MS +' ctrl_RemainingTime.Text = String.Format("{0:00}:{1:00}:{2:00}:{3:000}", +' e.Hour, e.Minute, e.Second, e.Millisecond) +' +' ' Measure H:M:S +' ctrl_RemainingTime.Text = String.Format("{0:00}:{1:00}:{2:00}", +' e.Hour, e.Minute, e.Second + 1) +' +' End Sub +' +' ''' <summary> +' ''' Handles the ElapsedTimeFinished event of the Clock instance. +' ''' </summary> +' ''' <param name="sender">The source of the event.</param> +' ''' <param name="e">The <see cref="TimeMeasurer.TimeMeasureEventArgs"/> instance containing the event data.</param> +' Private Sub Clock_ElapsedTimeFinished(ByVal sender As Object, ByVal e As TimeMeasurer.TimeMeasureEventArgs) _ +' Handles Clock.ElapsedTimeFinished +' +' ' Measure H:M:S:MS +' ctrl_ElapsedTime.Text = String.Format("{0:00}:{1:00}:{2:00}:{3:000}", +' e.Hour, e.Minute, e.Second, e.Millisecond) +' +' ' Measure H:M:S +' ctrl_ElapsedTime.Text = String.Format("{0:00}:{1:00}:{2:00}", +' e.Hour, e.Minute, e.Second) +' +' End Sub +' +' ''' <summary> +' ''' Handles the RemainingTimeFinished event of the Clock instance. +' ''' </summary> +' ''' <param name="sender">The source of the event.</param> +' ''' <param name="e">The <see cref="TimeMeasurer.TimeMeasureEventArgs"/> instance containing the event data.</param> +' Private Sub Clock_RemainingTimeFinished(ByVal sender As Object, ByVal e As TimeMeasurer.TimeMeasureEventArgs) _ +' Handles Clock.RemainingTimeFinished +' +' ' Measure H:M:S:MS +' ctrl_RemainingTime.Text = String.Format("{0:00}:{1:00}:{2:00}:{3:000}", +' e.Hour, e.Minute, e.Second, e.Millisecond) +' +' ' Measure H:M:S +' ctrl_RemainingTime.Text = String.Format("{0:00}:{1:00}:{2:00}", +' e.Hour, e.Minute, e.Second) +' +' End Sub +' +'End Class + +#End Region + +#Region " Option Statements " + +Option Strict On +Option Explicit On +Option Infer Off + +#End Region + +#Region " Imports " + +Imports System.ComponentModel + +#End Region + +''' <summary> +''' Measure a time interval. +''' This can be used as a chronometer or countdown timer. +''' </summary> +Public NotInheritable Class TimeMeasurer + +#Region " Objects " + + ''' <summary> + ''' <see cref="Stopwatch"/> instance to retrieve the elapsed time. + ''' </summary> + Private TimeElapsed As Stopwatch + + ''' <summary> + ''' <see cref="TimeSpan"/> instance to retrieve the remaining time. + ''' </summary> + Private TimeRemaining As TimeSpan + + ''' <summary> + ''' <see cref="Timer"/> instance that updates the elapsed and remaining times and raises the events. + ''' </summary> + Private WithEvents MeasureTimer As Timer + + ''' <summary> + ''' Indicates wheter the <see cref="TimeMeasurer"/> instance has finished to measure intervals. + ''' </summary> + Private IsFinished As Boolean + +#End Region + +#Region " Properties " + + ''' <summary> + ''' Gets the current state of this <see cref="TimeMeasurer"/> instance. + ''' </summary> + ''' <value>The update interval.</value> + Public ReadOnly Property State As TimeMeasurerState + Get + If Me.IsFinished Then + Return TimeMeasurerState.Finished + + ElseIf (Me.TimeElapsed Is Nothing) OrElse Not (Me.TimeElapsed.IsRunning) Then + Return TimeMeasurerState.Stopped + + Else + Return TimeMeasurerState.Running + + End If + End Get + End Property + + ''' <summary> + ''' Gets or sets the update interval. + ''' </summary> + ''' <value>The update interval.</value> + Public Property UpdateInterval As Integer + Get + Return Me._UpdateInterval + End Get + Set(ByVal value As Integer) + Me._UpdateInterval = value + If Me.MeasureTimer IsNot Nothing Then + Me.MeasureTimer.Interval = value + End If + End Set + End Property + ''' <summary> + ''' The update interval + ''' </summary> + Private _UpdateInterval As Integer = 100I + +#End Region + +#Region " Enumerations " + + ''' <summary> + ''' Specifies the current state of a <see cref="TimeMeasurer"/> instance. + ''' </summary> + <Description("Enum used as return value of 'State' property.")> + Public Enum TimeMeasurerState As Integer + + ''' <summary> + ''' The <see cref="TimeMeasurer"/> instance is running and measuring time intervals. + ''' </summary> + Running = 0I + + ''' <summary> + ''' The <see cref="TimeMeasurer"/> instance is temporally stopped, waiting to resume. + ''' </summary> + Stopped = 1I + + ''' <summary> + ''' The <see cref="TimeMeasurer"/> instance has finished to measure the time intervals. + ''' </summary> + Finished = 2I + + End Enum + +#End Region + +#Region " Events " + + ''' <summary> + ''' Occurs when the elapsed time updates. + ''' </summary> + Public Event ElapsedTimeUpdated(ByVal sender As Object, ByVal e As TimeMeasureEventArgs) + + ''' <summary> + ''' Occurs when the remaining time updates. + ''' </summary> + Public Event RemainingTimeUpdated(ByVal sender As Object, ByVal e As TimeMeasureEventArgs) + + ''' <summary> + ''' Occurs when the elapsed time finishes. + ''' </summary> + Public Event ElapsedTimeFinished(ByVal sender As Object, ByVal e As TimeMeasureEventArgs) + + ''' <summary> + ''' Occurs when the elapsed time finishes. + ''' </summary> + Public Event RemainingTimeFinished(ByVal sender As Object, ByVal e As TimeMeasureEventArgs) + + ''' <summary> + ''' Contains the <see cref="TimeMeasureEventArgs"/> arguments. + ''' </summary> + Public Class TimeMeasureEventArgs : Inherits EventArgs + + ''' <summary> + ''' Gets or sets the hour. + ''' </summary> + ''' <value>The hour.</value> + Public Property Hour As Double + + ''' <summary> + ''' Gets or sets the minute. + ''' </summary> + ''' <value>The minute.</value> + Public Property Minute As Double + + ''' <summary> + ''' Gets or sets the Second. + ''' </summary> + ''' <value>The Second.</value> + Public Property Second As Double + + ''' <summary> + ''' Gets or sets the Millisecond. + ''' </summary> + ''' <value>The Millisecond.</value> + Public Property Millisecond As Double + + End Class + +#End Region + +#Region " Public Methods " + + ''' <summary> + ''' Starts the time interval measurement from zero. + ''' </summary> + ''' <param name="Milliseconds">Indicates the time interval to measure, in milliseconds.</param> + Public Sub Start(ByVal Milliseconds As Double) + + If Milliseconds > (TimeSpan.MaxValue.TotalMilliseconds - 1001.0R) Then + Throw New ArgumentOutOfRangeException("Milliseconds", + String.Format("The value can't be greater than {0}", + CStr(TimeSpan.MaxValue.TotalMilliseconds - 1001.0R))) + End If + + Me.TimeElapsed = New Stopwatch + Me.TimeRemaining = TimeSpan.FromMilliseconds(Milliseconds) + Me.MeasureTimer = New Timer With + { + .Tag = Milliseconds, + .Interval = Me.UpdateInterval, + .Enabled = True + } + + Me.TimeElapsed.Start() + Me.MeasureTimer.Start() + + End Sub + + ''' <summary> + ''' Stops the time interval measurement. + ''' </summary> + Public Sub [Stop]() + + If (Me.MeasureTimer Is Nothing) OrElse Not (Me.TimeElapsed.IsRunning) Then + Throw New Exception("TimeMeasurer is not running.") + + Else + Me.MeasureTimer.Stop() + Me.TimeElapsed.Stop() + + End If + + End Sub + + ''' <summary> + ''' Resumes the time interval measurement. + ''' </summary> + Public Sub [Resume]() + + If (Me.MeasureTimer Is Nothing) OrElse (Me.TimeElapsed.IsRunning) Then + Throw New Exception("TimeMeasurer is not stopped.") + + Else + Me.MeasureTimer.Start() + Me.TimeElapsed.Start() + + End If + + End Sub + +#End Region + +#Region " Private Methods " + + ''' <summary> + ''' Stops Time intervals and resets the elapsed and remaining time to zero. + ''' </summary> + Private Sub Reset() + + Me.MeasureTimer.Stop() + Me.TimeElapsed.Reset() + + End Sub + +#End Region + +#Region " Event Handlers " + + ''' <summary> + ''' Handles the Tick event of the MeasureTimer control. + ''' </summary> + ''' <param name="sender">The source of the event.</param> + ''' <param name="e">The <see cref="EventArgs"/> instance containing the event data.</param> + Private Sub MeasureTimer_Tick(ByVal sender As Object, ByVal e As EventArgs) _ + Handles MeasureTimer.Tick + + Dim TimeDifference As TimeSpan = (Me.TimeRemaining - Me.TimeElapsed.Elapsed) + Dim ElapsedArgs As New TimeMeasureEventArgs + Dim RemainingArgs As New TimeMeasureEventArgs + + If (TimeDifference.TotalMilliseconds <= 0.0R) _ + OrElse (Me.TimeElapsed.ElapsedMilliseconds > DirectCast(Me.MeasureTimer.Tag, Double)) Then + + Dim TotalTime As TimeSpan = TimeSpan.FromMilliseconds(DirectCast(Me.MeasureTimer.Tag, Double)) + + With ElapsedArgs + .Hour = TotalTime.Hours + .Minute = TotalTime.Minutes + .Second = TotalTime.Seconds + .Millisecond = TotalTime.Milliseconds + End With + + With RemainingArgs + .Hour = 0.0R + .Minute = 0.0R + .Second = 0.0R + .Millisecond = 0.0R + End With + + Me.Reset() + Me.IsFinished = True + RaiseEvent ElapsedTimeFinished(Me.TimeElapsed, ElapsedArgs) + RaiseEvent RemainingTimeFinished(TimeDifference, RemainingArgs) + + Else + + With ElapsedArgs + .Hour = TimeElapsed.Elapsed.Hours + .Minute = TimeElapsed.Elapsed.Minutes + .Second = TimeElapsed.Elapsed.Seconds + .Millisecond = TimeElapsed.Elapsed.Milliseconds + End With + + With RemainingArgs + .Hour = Math.Floor(TimeDifference.TotalHours) Mod TimeSpan.MaxValue.TotalMilliseconds + .Minute = Math.Floor(TimeDifference.TotalMinutes) Mod 60.0R + .Second = Math.Floor(TimeDifference.TotalSeconds) Mod 60.0R + .Millisecond = Math.Floor(TimeDifference.TotalMilliseconds Mod 1000.0R) + End With + + RaiseEvent ElapsedTimeUpdated(Me.TimeElapsed, ElapsedArgs) + RaiseEvent RemainingTimeUpdated(TimeDifference, RemainingArgs) + + End If + + End Sub + +#End Region + +End Class \ No newline at end of file diff --git a/HALOCELauncher/Core/Utils/BlurEffect.vb b/HALOCELauncher/Core/Utils/BlurEffect.vb new file mode 100644 index 0000000..5f4f938 --- /dev/null +++ b/HALOCELauncher/Core/Utils/BlurEffect.vb @@ -0,0 +1,64 @@ +Imports System.Runtime.InteropServices + +Namespace Core.Utils + + Public Class BlurEffect + + <DllImport("gdi32")> _ + Public Shared Function CreateEllipticRgn(ByVal X1 As Integer, ByVal Y1 As Integer, ByVal witdth As Integer, ByVal Height As Integer) As Integer + End Function + + <DllImport("dwmapi.dll")> _ + Private Shared Sub DwmEnableBlurBehindWindow(ByVal hwnd As IntPtr, ByRef blurBehind As DWM_BLURBEHIND) + End Sub + + Public Structure DwmBlurbehind + Public DwFlags As Integer + Public FEnable As Boolean + Public HRgnBlur As IntPtr + Public FTransitionOnMaximized As Boolean + End Structure + + <StructLayout(LayoutKind.Sequential)> _ + Structure DWM_BLURBEHIND + Public dwFlags As DWM_BB + Public fEnable As Boolean + Public hRgnBlur As IntPtr + Public fTransitionOnMaximized As Boolean + End Structure + + Enum DWM_BB + Enable = 1 + BlurRegion = 2 + TransitionMaximized = 4 + End Enum + + Private ControlA As Control = Nothing + + Public Sub New(ByVal ApliControl As Control) + ControlA = ApliControl + Dim HandleControl As IntPtr = ApliControl.Handle + If Not HandleControl = IntPtr.Zero Then + Dim hr = CreateEllipticRgn(0, 0, ApliControl.Width, ApliControl.Height) + Dim dbb = New DWM_BLURBEHIND With { + .FEnable = True, + .DwFlags = 1, + .HRgnBlur = hr, + .FTransitionOnMaximized = False + } + + DwmEnableBlurBehindWindow(ApliControl.Handle, dbb) + ' AddHandler ApliControl.Paint, AddressOf Paint_Arg + Else + MsgBox("Handle Error = " & HandleControl.ToString) + End If + End Sub + + Private Sub Paint_Arg(ByVal sender As Object, ByVal args As System.Windows.Forms.PaintEventArgs) + args.Graphics.FillRectangle(New SolidBrush(Color.Black), New Rectangle(0, 0, ControlA.Width, ControlA.Height)) + End Sub + + End Class + +End Namespace + diff --git a/HALOCELauncher/Core/Utils/Compression.vb b/HALOCELauncher/Core/Utils/Compression.vb new file mode 100644 index 0000000..dcefd47 --- /dev/null +++ b/HALOCELauncher/Core/Utils/Compression.vb @@ -0,0 +1,43 @@ +Imports System.IO +Imports System.IO.Compression +Imports System.Text + +Namespace Core.Utils + Public Class Compression + + Public Shared Function CompressedData(ByVal Text As String) As String + + Dim Buffer As Byte() = System.Text.Encoding.Unicode.GetBytes(Text) + Dim mStream As New MemoryStream() + Using GZipStream As New IO.Compression.GZipStream(mStream, IO.Compression.CompressionMode.Compress, True) + GZipStream.Write(Buffer, 0, Buffer.Length) + End Using + mStream.Position = 0 + Dim outStream As New MemoryStream() + Dim Compressed As Byte() = New Byte(mStream.Length - 1) {} + mStream.Read(Compressed, 0, Compressed.Length) + Dim GZipBuffer As Byte() = New Byte(Compressed.Length + 3) {} + System.Buffer.BlockCopy(Compressed, 0, GZipBuffer, 4, Compressed.Length) + System.Buffer.BlockCopy(BitConverter.GetBytes(Buffer.Length), 0, GZipBuffer, 0, 4) + Return Convert.ToBase64String(GZipBuffer) + + End Function + + Public Shared Function DecompressData(ByVal CompressedText As String) As String + Dim GZipBuffer As Byte() = Convert.FromBase64String(CompressedText) + + Using mStream As New MemoryStream() + Dim msgLength As Integer = BitConverter.ToInt32(GZipBuffer, 0) + mStream.Write(GZipBuffer, 4, GZipBuffer.Length - 4) + Dim Buffer As Byte() = New Byte(msgLength - 1) {} + mStream.Position = 0 + Using GZipStream As New System.IO.Compression.GZipStream(mStream, IO.Compression.CompressionMode.Decompress) + GZipStream.Read(Buffer, 0, Buffer.Length) + End Using + Return System.Text.Encoding.Unicode.GetString(Buffer, 0, Buffer.Length) + End Using + End Function + + End Class +End Namespace + diff --git a/HALOCELauncher/Core/Utils/ControlDragger.vb b/HALOCELauncher/Core/Utils/ControlDragger.vb new file mode 100644 index 0000000..4d9b619 --- /dev/null +++ b/HALOCELauncher/Core/Utils/ControlDragger.vb @@ -0,0 +1,380 @@ +' *********************************************************************** +' Author : Elektro +' Last Modified On : 11-10-2014 +' *********************************************************************** +' <copyright file="ControlDragger.vb" company="Elektro Studios"> +' Copyright (c) Elektro Studios. All rights reserved. +' </copyright> +' *********************************************************************** + +#Region " Usage Examples " + +'Public Class Form1 +' +' Private Dragger As ControlDragger = ControlDragger.Empty +' +' Private Sub InitializeDrag() +' Me.Dragger = New ControlDragger(Button1) +' Me.Dragger.Cursor = Cursors.SizeAll +' Me.Dragger.Enabled = True +' End Sub +' +' Private Sub AlternateDrag() +' Dragger.Enabled = Not Dragger.Enabled +' End Sub +' +' Private Sub FinishDrag() +' Dragger.Dispose() +' End Sub +' +' Private Sub Test() Handles MyBase.Shown +' Me.InitializeDrag() +' End Sub +' +'End Class + +#End Region + +#Region " Imports " + +Imports System.ComponentModel + +#End Region + +#Region " Control Dragger " + +''' <summary> +''' Enable or disable drag at runtime on a <see cref="Control"/>. +''' </summary> +Friend NotInheritable Class ControlDragger : Implements IDisposable + +#Region " Properties " + + ''' <summary> + ''' Gets the associated <see cref="Control"/> used to perform draggable operations. + ''' </summary> + ''' <value>The control.</value> + <EditorBrowsable(EditorBrowsableState.Always)> + <Description("The associated Control used to perform draggable operations.")> + Friend ReadOnly Property Control As Control + Get + Return Me._ctrl + End Get + End Property + ''' <summary> + ''' The associated <see cref="Control"/> used to perform draggable operations. + ''' </summary> + Private WithEvents _ctrl As Control = Nothing + Private WithEvents _ctrl2 As Control = Nothing + + ''' <summary> + ''' Represents a <see cref="T:ControlDragger"/> instance that is <c>Nothing</c>. + ''' </summary> + ''' <value><c>Nothing</c></value> + <EditorBrowsable(EditorBrowsableState.Always)> + <Description("Represents a ControlDragger instance that is Nothing.")> + Public Shared ReadOnly Property Empty As ControlDragger + Get + Return Nothing + End Get + End Property + + ''' <summary> + ''' Gets or sets a value indicating whether drag is enabled on the associated <see cref="Control"/>. + ''' </summary> + ''' <value><c>true</c> if drag is enabled; otherwise, <c>false</c>.</value> + <EditorBrowsable(EditorBrowsableState.Always)> + <Description("A value indicating whether drag is enabled on the associated control.")> + Friend Property Enabled As Boolean = True + + ''' <summary> + ''' Gets or sets the <see cref="Cursor"/> used to drag the associated <see cref="Control"/>. + ''' </summary> + ''' <value>The <see cref="Cursor"/>.</value> + <EditorBrowsable(EditorBrowsableState.Always)> + <Description("The Cursor used to drag the associated Control")> + Friend Property Cursor As Cursor = Cursors.Default + + ''' <summary> + ''' A <see cref="T:ControlDragger"/> instance instance containing the draggable information of the associated <see cref="Control"/>. + ''' </summary> + ''' <value>The draggable information.</value> + <EditorBrowsable(EditorBrowsableState.Never)> + <Description("A ControlDragger instance instance containing the draggable information of the associated Control.")> + Private Property DragInfo As ControlDragger = ControlDragger.Empty + + ''' <summary> + ''' Gets or sets the initial mouse coordinates, normally <see cref="Control.MousePosition"/>. + ''' </summary> + ''' <value>The initial mouse coordinates.</value> + <EditorBrowsable(EditorBrowsableState.Never)> + <Description("The initial mouse coordinates, normally 'Control.MousePosition'")> + Private Property InitialMouseCoords As Point = Point.Empty + + ''' <summary> + ''' Gets or sets the initial <see cref="Control"/> location, normally <see cref="Control.Location"/>. + ''' </summary> + ''' <value>The initial location.</value> + <EditorBrowsable(EditorBrowsableState.Never)> + <Description("The initial Control location, normally 'Control.Location'")> + Private Property InitialLocation As Point = Point.Empty + + ''' <summary> + ''' Gets or sets the old control's cursor to restore it after dragging. + ''' </summary> + ''' <value>The old control's cursor.</value> + <EditorBrowsable(EditorBrowsableState.Never)> + <Description("The old control's cursor to restore it after dragging.")> + Private Property oldCursor As Cursor = Nothing + +#End Region + +#Region " Constructors " + + ''' <summary> + ''' Prevents a default instance of the <see cref="ControlDragger"/> class from being created. + ''' </summary> + Private Sub New() + End Sub + + ''' <summary> + ''' Initializes a new instance of the <see cref="ControlDragger"/> class. + ''' </summary> + ''' <param name="ctrl">The <see cref="Control"/> used to perform draggable operations.</param> + Public Sub New(ByVal ctrl As Control, Optional ByVal ctrlParent As Control = Nothing) + Me._ctrl = ctrl + Me._ctrl2 = ctrlParent + End Sub + + ''' <summary> + ''' Initializes a new instance of the <see cref="ControlDragger"/> class. + ''' </summary> + ''' <param name="mouseCoordinates">The current mouse coordinates.</param> + ''' <param name="location">The current location.</param> + Private Sub New(ByVal mouseCoordinates As Point, ByVal location As Point) + + Me.InitialMouseCoords = mouseCoordinates + Me.InitialLocation = location + + End Sub + +#End Region + +#Region " Private Methods " + + ''' <summary> + ''' Return the new location. + ''' </summary> + ''' <param name="mouseCoordinates">The current mouse coordinates.</param> + ''' <returns>The new location.</returns> + Private Function GetNewLocation(ByVal mouseCoordinates As Point) As Point + + Return New Point(InitialLocation.X + (mouseCoordinates.X - InitialMouseCoords.X), + InitialLocation.Y + (mouseCoordinates.Y - InitialMouseCoords.Y)) + + End Function + +#End Region + +#Region " Hidden Methods " + + ''' <summary> + ''' Serves as a hash function for a particular type. + ''' </summary> + <EditorBrowsable(EditorBrowsableState.Never)> + Public Shadows Sub GetHashCode() + End Sub + + ''' <summary> + ''' Gets the System.Type of the current instance. + ''' </summary> + ''' <returns>The exact runtime type of the current instance.</returns> + <EditorBrowsable(EditorBrowsableState.Never)> + Public Shadows Function [GetType]() + Return Me.GetType + End Function + + ''' <summary> + ''' Determines whether the specified System.Object instances are considered equal. + ''' </summary> + <EditorBrowsable(EditorBrowsableState.Never)> + Public Shadows Sub Equals() + End Sub + + ''' <summary> + ''' Determines whether the specified System.Object instances are the same instance. + ''' </summary> + <EditorBrowsable(EditorBrowsableState.Never)> + Private Shadows Sub ReferenceEquals() + End Sub + + ''' <summary> + ''' Returns a String that represents the current object. + ''' </summary> + <EditorBrowsable(EditorBrowsableState.Never)> + Public Shadows Sub ToString() + End Sub + +#End Region + +#Region " Event Handlers " + + ''' <summary> + ''' Handles the MouseEnter event of the control. + ''' </summary> + ''' <param name="sender">The source of the event.</param> + ''' <param name="e">The <see cref="EventArgs"/> instance containing the event data.</param> + Private Sub ctrl_MouseEnter(ByVal sender As Object, ByVal e As EventArgs) _ + Handles _ctrl.MouseEnter + + Me.oldCursor = Me._ctrl.Cursor + + If Me.Enabled Then + + Me._ctrl.Cursor = Me.Cursor + ' Me._ctrl.BringToFront() + + End If + + End Sub + + ''' <summary> + ''' Handles the MouseLeave event of the control. + ''' </summary> + ''' <param name="sender">The source of the event.</param> + ''' <param name="e">The <see cref="EventArgs"/> instance containing the event data.</param> + Private Sub ctrl_MouseLeave(ByVal sender As Object, ByVal e As EventArgs) _ + Handles _ctrl.MouseLeave + + Me._ctrl.Cursor = Me.oldCursor + + End Sub + + ''' <summary> + ''' Handles the MouseDown event of the control. + ''' </summary> + ''' <param name="sender">The source of the event.</param> + ''' <param name="e">The <see cref="MouseEventArgs"/> instance containing the event data.</param> + Private Sub ctrl_MouseDown(ByVal sender As Object, ByVal e As MouseEventArgs) _ + Handles _ctrl.MouseDown + + If Me.Enabled Then + If _ctrl2 IsNot Nothing Then + Me.DragInfo = New ControlDragger(Control.MousePosition, Me._ctrl2.Location) + Else + Me.DragInfo = New ControlDragger(Control.MousePosition, Me._ctrl.Location) + End If + End If + + End Sub + + ''' <summary> + ''' Handles the MouseMove event of the control. + ''' </summary> + ''' <param name="sender">The source of the event.</param> + ''' <param name="e">The <see cref="MouseEventArgs"/> instance containing the event data.</param> + Private Sub ctrl_MouseMove(ByVal sender As Object, ByVal e As MouseEventArgs) _ + Handles _ctrl.MouseMove + + If Me.Enabled AndAlso (Me.DragInfo IsNot ControlDragger.Empty) Then + If _ctrl2 IsNot Nothing Then + Me._ctrl2.Location = New Point(Me.DragInfo.GetNewLocation(Control.MousePosition)) + Else + Me._ctrl.Location = New Point(Me.DragInfo.GetNewLocation(Control.MousePosition)) + End If + End If + + End Sub + + ''' <summary> + ''' Handles the MouseUp event of the control. + ''' </summary> + ''' <param name="sender">The source of the event.</param> + ''' <param name="e">The <see cref="MouseEventArgs"/> instance containing the event data.</param> + Private Sub ctrl_MouseUp(ByVal sender As Object, ByVal e As MouseEventArgs) _ + Handles _ctrl.MouseUp + + Me.DragInfo = ControlDragger.Empty + + End Sub + +#End Region + +#Region " IDisposable " + + ''' <summary> + ''' To detect redundant calls when disposing. + ''' </summary> + Private IsDisposed As Boolean = False + + ''' <summary> + ''' Prevent calls to methods after disposing. + ''' </summary> + ''' <exception cref="System.ObjectDisposedException"></exception> + Private Sub DisposedCheck() + + If Me.IsDisposed Then + Throw New ObjectDisposedException(Me.GetType().FullName) + End If + + End Sub + + ''' <summary> + ''' Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + ''' </summary> + Public Sub Dispose() Implements IDisposable.Dispose + Dispose(True) + GC.SuppressFinalize(Me) + End Sub + + ''' <summary> + ''' Releases unmanaged and - optionally - managed resources. + ''' </summary> + ''' <param name="IsDisposing"> + ''' <c>true</c> to release both managed and unmanaged resources; + ''' <c>false</c> to release only unmanaged resources. + ''' </param> + Protected Sub Dispose(ByVal IsDisposing As Boolean) + + If Not Me.IsDisposed Then + + If IsDisposing Then + + With Me._ctrl + + If Not .IsDisposed AndAlso Not .Disposing Then + + RemoveHandler .MouseEnter, AddressOf ctrl_MouseEnter + RemoveHandler .MouseLeave, AddressOf ctrl_MouseLeave + RemoveHandler .MouseDown, AddressOf ctrl_MouseDown + RemoveHandler .MouseMove, AddressOf ctrl_MouseMove + RemoveHandler .MouseUp, AddressOf ctrl_MouseUp + + End If + + End With ' Me._ctrl + + With Me + + .Enabled = False + .DragInfo = ControlDragger.Empty + .InitialMouseCoords = Point.Empty + .InitialLocation = Point.Empty + .oldCursor = Nothing + ._ctrl = Nothing + + End With ' Me + + End If ' IsDisposing + + End If ' Not Me.IsDisposed + + Me.IsDisposed = True + + End Sub + +#End Region + +End Class + +#End Region \ No newline at end of file diff --git a/HALOCELauncher/Core/Utils/FileDirSearcher.vb b/HALOCELauncher/Core/Utils/FileDirSearcher.vb new file mode 100644 index 0000000..9bf08ee --- /dev/null +++ b/HALOCELauncher/Core/Utils/FileDirSearcher.vb @@ -0,0 +1,972 @@ + + +#Region " Usage Examples " + +'Dim files As List(Of FileInfo) = FileDirSearcher.GetFiles("C:\Windows\System32", SearchOption.AllDirectories).ToList +'Dim files As List(Of String) = FileDirSearcher.GetFilePaths("C:\Windows\System32", SearchOption.AllDirectories).ToList + +'Dim dirs As List(Of DirectoryInfo) = FileDirSearcher.GetDirs("C:\Windows\System32", SearchOption.AllDirectories).ToList +'Dim dirs As List(Of String) = FileDirSearcher.GetDirPaths("C:\Windows\System32", SearchOption.AllDirectories).ToList + +'Dim files As IEnumerable(Of FileInfo) = FileDirSearcher.GetFiles(dirPath:="C:\Windows\System32", +' searchOption:=SearchOption.TopDirectoryOnly, +' fileNamePatterns:={"*"}, +' fileExtPatterns:={"*.dll", "*.exe"}, +' ignoreCase:=True, +' throwOnError:=True) + +'Dim dirs As IEnumerable(Of DirectoryInfo) = FileDirSearcher.GetDirs(dirPath:="C:\Windows\System32", +' searchOption:=SearchOption.TopDirectoryOnly, +' dirPathPatterns:={"*"}, +' dirNamePatterns:={"*Microsoft*"}, +' ignoreCase:=True, +' throwOnError:=True) + +#End Region + +#Region " Option Statements " + +Option Explicit On +Option Strict On +Option Infer Off + +#End Region + +#Region " Imports " + +Imports System.IO +Imports System.Collections.Concurrent +Imports System.Threading.Tasks + +#End Region + +#Region " File Dir Searcher " + +''' <summary> +''' Searchs for files and directories. +''' </summary> +Public NotInheritable Class FileDirSearcher + +#Region " Public Methods " + + ''' <summary> + ''' Gets the files those matches the criteria inside the specified directory and/or sub-directories. + ''' </summary> + ''' <param name="dirPath">The root directory path to search for files.</param> + ''' <param name="searchOption">The searching mode.</param> + ''' <param name="fileNamePatterns">The file name pattern(s) to match.</param> + ''' <param name="fileExtPatterns">The file extension pattern(s) to match.</param> + ''' <param name="ignoreCase">If <c>True</c>, ignores the comparing case of <paramref name="fileNamePatterns"/> and <paramref name="fileExtPatterns"/> patterns.</param> + ''' <param name="throwOnError">Determines whether exceptions will be thrown, like access denied to file or directory.</param> + ''' <returns>An <see cref="IEnumerable(Of FileInfo)"/> instance containing the files information.</returns> + ''' <exception cref="System.ArgumentException">dirPath or searchOption</exception> + Public Shared Function GetFiles(ByVal dirPath As String, + ByVal searchOption As SearchOption, + Optional ByVal fileNamePatterns As IEnumerable(Of String) = Nothing, + Optional ByVal fileExtPatterns As IEnumerable(Of String) = Nothing, + Optional ByVal ignoreCase As Boolean = True, + Optional ByVal throwOnError As Boolean = False) As IEnumerable(Of FileInfo) + + ' Analyze and fix path problems. + ' eg. 'C:' -> 'C:\' + AnalyzePath(dirPath) + + If Not Directory.Exists(dirPath) Then + Throw New ArgumentException(String.Format("Directory doesn't exists: '{0}'", dirPath), "dirPath") + + ElseIf (searchOption <> searchOption.TopDirectoryOnly) AndAlso (searchOption <> searchOption.AllDirectories) Then + Throw New ArgumentException(String.Format("Value of '{0}' is not valid enumeration value.", CStr(searchOption)), "searchOption") + + Else ' Get and return the files. + Dim queue As New ConcurrentQueue(Of FileInfo) + CollectFiles(queue, dirPath, searchOption, fileNamePatterns, fileExtPatterns, ignoreCase, throwOnError) + Return queue.AsEnumerable + + End If + + End Function + + ''' <summary> + ''' Gets the filepaths those matches the criteria inside the specified directory and/or sub-directories. + ''' </summary> + ''' <param name="dirPath">The root directory path to search for files.</param> + ''' <param name="searchOption">The searching mode.</param> + ''' <param name="fileNamePatterns">The file name pattern(s) to match.</param> + ''' <param name="fileExtPatterns">The file extension pattern(s) to match.</param> + ''' <param name="ignoreCase">If <c>True</c>, ignores the comparing case of <paramref name="fileNamePatterns"/> and <paramref name="fileExtPatterns"/> patterns.</param> + ''' <param name="throwOnError">Determines whether exceptions will be thrown, like access denied to file or directory.</param> + ''' <returns>An <see cref="IEnumerable(Of String)"/> instance containing the filepaths.</returns> + ''' <exception cref="System.ArgumentException">dirPath or searchOption</exception> + Public Shared Function GetFilePaths(ByVal dirPath As String, + ByVal searchOption As SearchOption, + Optional ByVal fileNamePatterns As IEnumerable(Of String) = Nothing, + Optional ByVal fileExtPatterns As IEnumerable(Of String) = Nothing, + Optional ByVal ignoreCase As Boolean = True, + Optional ByVal throwOnError As Boolean = False) As IEnumerable(Of String) + + ' Analyze and fix path problems. + ' eg. 'C:' -> 'C:\' + AnalyzePath(dirPath) + + If Not Directory.Exists(dirPath) Then + Throw New ArgumentException(String.Format("Directory doesn't exists: '{0}'", dirPath), "dirPath") + + ElseIf (searchOption <> searchOption.TopDirectoryOnly) AndAlso (searchOption <> searchOption.AllDirectories) Then + Throw New ArgumentException(String.Format("Value of '{0}' is not valid enumeration value.", CStr(searchOption)), "searchOption") + + Else ' Get and return the filepaths. + Dim queue As New ConcurrentQueue(Of String) + CollectFilePaths(queue, dirPath, searchOption, fileNamePatterns, fileExtPatterns, ignoreCase, throwOnError) + Return queue.AsEnumerable + + End If + + End Function + + ''' <summary> + ''' Gets the directories those matches the criteria inside the specified directory and/or sub-directories. + ''' </summary> + ''' <param name="dirPath">The root directory path to search for directories.</param> + ''' <param name="searchOption">The searching mode.</param> + ''' <param name="dirPathPatterns">The directory path pattern(s) to match.</param> + ''' <param name="dirNamePatterns">The directory name pattern(s) to match.</param> + ''' <param name="ignoreCase">If <c>True</c>, ignores the comparing case of <paramref name="dirPathPatterns"/> and <paramref name="dirNamePatterns"/> patterns.</param> + ''' <param name="throwOnError">Determines whether exceptions will be thrown, like access denied to directory.</param> + ''' <returns>An <see cref="IEnumerable(Of DirectoryInfo)"/> instance containing the dirrectories information.</returns> + ''' <exception cref="System.ArgumentException">dirPath or searchOption</exception> + Public Shared Function GetDirs(ByVal dirPath As String, + ByVal searchOption As SearchOption, + Optional ByVal dirPathPatterns As IEnumerable(Of String) = Nothing, + Optional ByVal dirNamePatterns As IEnumerable(Of String) = Nothing, + Optional ByVal ignoreCase As Boolean = True, + Optional ByVal throwOnError As Boolean = False) As IEnumerable(Of DirectoryInfo) + + ' Analyze and fix path problems. + ' eg. 'C:' -> 'C:\' + AnalyzePath(dirPath) + + If Not Directory.Exists(dirPath) Then + Throw New ArgumentException(String.Format("Directory doesn't exists: '{0}'", dirPath), "dirPath") + + ElseIf (searchOption <> searchOption.TopDirectoryOnly) AndAlso (searchOption <> searchOption.AllDirectories) Then + Throw New ArgumentException(String.Format("Value of '{0}' is not valid enumeration value.", CStr(searchOption)), "searchOption") + + Else ' Get and return the files. + Dim queue As New ConcurrentQueue(Of DirectoryInfo) + CollectDirs(queue, dirPath, searchOption, dirPathPatterns, dirNamePatterns, ignoreCase, throwOnError) + Return queue.AsEnumerable + + End If + + End Function + + ''' <summary> + ''' Gets the filepaths those matches the criteria inside the specified directory and/or sub-directories. + ''' </summary> + ''' <param name="dirPath">The root directory path to search for directories.</param> + ''' <param name="searchOption">The searching mode.</param> + ''' <param name="dirPathPatterns">The directory path pattern(s) to match.</param> + ''' <param name="dirNamePatterns">The directory name pattern(s) to match.</param> + ''' <param name="ignoreCase">If <c>True</c>, ignores the comparing case of <paramref name="dirPathPatterns"/> and <paramref name="dirNamePatterns"/> patterns.</param> + ''' <param name="throwOnError">Determines whether exceptions will be thrown, like access denied to directory.</param> + ''' <returns>An <see cref="IEnumerable(Of String)"/> instance containing the directory paths.</returns> + ''' <exception cref="System.ArgumentException">dirPath or searchOption</exception> + Public Shared Function GetDirPaths(ByVal dirPath As String, + ByVal searchOption As SearchOption, + Optional ByVal dirPathPatterns As IEnumerable(Of String) = Nothing, + Optional ByVal dirNamePatterns As IEnumerable(Of String) = Nothing, + Optional ByVal ignoreCase As Boolean = True, + Optional ByVal throwOnError As Boolean = False) As IEnumerable(Of String) + + ' Analyze and fix path problems. + ' eg. 'C:' -> 'C:\' + AnalyzePath(dirPath) + + If Not Directory.Exists(dirPath) Then + Throw New ArgumentException(String.Format("Directory doesn't exists: '{0}'", dirPath), "dirPath") + + ElseIf (searchOption <> searchOption.TopDirectoryOnly) AndAlso (searchOption <> searchOption.AllDirectories) Then + Throw New ArgumentException(String.Format("Value of '{0}' is not valid enumeration value.", CStr(searchOption)), "searchOption") + + Else ' Get and return the filepaths. + Dim queue As New ConcurrentQueue(Of String) + CollectDirPaths(queue, dirPath, searchOption, dirPathPatterns, dirNamePatterns, ignoreCase, throwOnError) + Return queue.AsEnumerable + + End If + + End Function + +#End Region + +#Region " Private Methods " + + ''' <summary> + ''' Analyzes a directory path and perform specific changes on it. + ''' </summary> + ''' <param name="dirPath">The directory path.</param> + ''' <exception cref="System.ArgumentNullException">dirPath;Value is null, empty, or white-spaced.</exception> + Private Shared Sub AnalyzePath(ByRef dirPath As String) + + If String.IsNullOrEmpty(dirPath) OrElse String.IsNullOrWhiteSpace(dirPath) Then + Throw New ArgumentNullException("dirPath", "Value is null, empty, or white-spaced.") + + Else + ' Trim unwanted characters. + dirPath = dirPath.TrimStart({" "c}).TrimEnd({" "c}) + + If Path.IsPathRooted(dirPath) Then + ' The root paths contained on the returned FileInfo objects will start with the same string-case as this root path. + ' So just for a little visual improvement, I'll treat this root path as a Drive-Letter and I convert it to UpperCase. + dirPath = Char.ToUpper(dirPath.First) & dirPath.Substring(1) + End If + + If Not dirPath.EndsWith("\"c) Then + ' Possibly its a drive letter without backslash ('C:') or else just a normal path without backslash ('C\Dir'). + ' In any case, fix the ending backslash. + dirPath = dirPath.Insert(dirPath.Length, "\"c) + End If + + End If + + End Sub + + ''' <summary> + ''' Collects the files those matches the criteria inside the specified directory and/or sub-directories. + ''' </summary> + ''' <param name="queue">The <see cref="ConcurrentQueue(Of FileInfo)"/> instance to enqueue new files.</param> + ''' <param name="dirPath">The root directory path to search for files.</param> + ''' <param name="searchOption">The searching mode.</param> + ''' <param name="fileNamePatterns">The file name pattern(s) to match.</param> + ''' <param name="fileExtPatterns">The file extension pattern(s) to match.</param> + ''' <param name="ignoreCase">If <c>True</c>, ignores the comparing case of <paramref name="fileNamePatterns"/> and <paramref name="fileExtPatterns"/> patterns.</param> + ''' <param name="throwOnError">Determines whether exceptions will be thrown, like access denied to file or directory.</param> + Private Shared Sub CollectFiles(ByVal queue As ConcurrentQueue(Of FileInfo), + ByVal dirPath As String, + ByVal searchOption As SearchOption, + ByVal fileNamePatterns As IEnumerable(Of String), + ByVal fileExtPatterns As IEnumerable(Of String), + ByVal ignoreCase As Boolean, + ByVal throwOnError As Boolean) + + ' Initialize a DirectoryInfo. + Dim dirInfo As DirectoryInfo = Nothing + + ' Initialize a FileInfo collection. + Dim fileInfoCol As IEnumerable(Of FileInfo) = Nothing + + Try ' Set up a new DirectoryInfo instance using the passed directory path. + dirInfo = New DirectoryInfo(dirPath) + + Catch ex As ArgumentNullException + If throwOnError Then + Throw + End If + + Catch ex As ArgumentException + If throwOnError Then + Throw + End If + + Catch ex As Security.SecurityException + If throwOnError Then + Throw + End If + + Catch ex As PathTooLongException + If throwOnError Then + Throw + End If + + End Try + + Try ' Get the top files of the current directory. + + If fileExtPatterns IsNot Nothing Then + ' Decrease time execution by searching for files that has extension. + fileInfoCol = dirInfo.GetFiles("*.*", searchOption.TopDirectoryOnly) + Else + ' Search for all files. + fileInfoCol = dirInfo.GetFiles("*", searchOption.TopDirectoryOnly) + End If + + Catch ex As UnauthorizedAccessException + If throwOnError Then + Throw + End If + + Catch ex As DirectoryNotFoundException + If throwOnError Then + Throw + End If + + Catch ex As Exception + If throwOnError Then + Throw + End If + + End Try + + ' If the fileInfoCol collection is not empty then... + If fileInfoCol IsNot Nothing Then + + ' Iterate the files. + For Each fInfo As FileInfo In fileInfoCol + + ' Flag to determine whether a filename pattern is matched. + Dim flagNamePattern As Boolean = False + + ' Flag to determine whether a file extension pattern is matched. + Dim flagExtPattern As Boolean = False + + ' If filename patterns collection is not empty then... + If fileNamePatterns IsNot Nothing Then + + ' Iterate the filename pattern(s). + For Each fileNamePattern As String In fileNamePatterns + + ' Match the filename pattern on the current filename. + + ' Supress consecuent conditionals if pattern its an asterisk. + If fileNamePattern.Equals("*", StringComparison.OrdinalIgnoreCase) Then + flagNamePattern = True ' Activate the filename flag. + Exit For + + ElseIf ignoreCase Then ' Compare filename with ignoring case rules. + If fInfo.Name.ToLower Like fileNamePattern.ToLower Then + flagNamePattern = True ' Activate the filename flag. + Exit For + End If + + Else ' Compare filename without ignoring case rules. + If fInfo.Name Like fileNamePattern Then + flagNamePattern = True ' Activate the filename flag. + Exit For + End If + + End If ' ignoreCase + + Next fileNamePattern + + Else ' filename patterns collection is empty. + flagNamePattern = True ' Activate the filename flag. + + End If ' fileNamePatterns IsNot Nothing + + ' If file extension patterns collection is not empty then... + If fileExtPatterns IsNot Nothing Then + + ' Iterate the file extension pattern(s). + For Each fileExtPattern As String In fileExtPatterns + + ' Match the file extension pattern on the current file extension. + + ' Supress consecuent conditionals if pattern its an asterisk. + If fileExtPattern.Equals("*", StringComparison.OrdinalIgnoreCase) Then + flagExtPattern = True ' Activate the file extension flag. + Exit For + + ElseIf ignoreCase Then ' Compare filename with ignoring case rules. + If fInfo.Extension.ToLower Like fileExtPattern.ToLower Then + flagExtPattern = True ' Activate the file extension flag. + Exit For + End If + + Else ' Compare filename without ignoring case rules. + If fInfo.Extension Like fileExtPattern Then + flagExtPattern = True ' Activate the file extension flag. + Exit For + End If + + End If + + Next fileExtPattern + + Else ' file extension patterns collection is empty. + flagExtPattern = True ' Activate the file extension flag. + + End If ' fileExtPatterns IsNot Nothing + + ' If fileName and also fileExtension patterns are matched then... + If flagNamePattern AndAlso flagExtPattern Then + queue.Enqueue(fInfo) ' Enqueue this FileInfo object. + End If + + Next fInfo + + End If ' fileInfoCol IsNot Nothing + + ' If searchOption is recursive then... + If searchOption = searchOption.AllDirectories Then + + Try + ' Try next iterations. + Task.WaitAll(dirInfo.GetDirectories. + Select(Function(dir As DirectoryInfo) + Return Task.Factory.StartNew(Sub() + CollectFiles(queue, + dir.FullName, searchOption.AllDirectories, + fileNamePatterns, fileExtPatterns, + ignoreCase, throwOnError) + End Sub) + End Function).ToArray) + + Catch ex As UnauthorizedAccessException + If throwOnError Then + Throw + End If + + Catch ex As DirectoryNotFoundException + If throwOnError Then + Throw + End If + + Catch ex As Exception + If throwOnError Then + Throw + End If + + End Try + + End If ' searchOption = searchOption.AllDirectories + + End Sub + + ''' <summary> + ''' Collects the filepaths those matches the criteria inside the specified directory and/or sub-directories. + ''' </summary> + ''' <param name="queue">The <see cref="ConcurrentQueue(Of String)"/> instance to enqueue new filepaths.</param> + ''' <param name="dirPath">The root directory path to search for files.</param> + ''' <param name="searchOption">The searching mode.</param> + ''' <param name="fileNamePatterns">The file name pattern(s) to match.</param> + ''' <param name="fileExtPatterns">The file extension pattern(s) to match.</param> + ''' <param name="ignoreCase">If <c>True</c>, ignores the comparing case of <paramref name="fileNamePatterns"/> and <paramref name="fileExtPatterns"/> patterns.</param> + ''' <param name="throwOnError">Determines whether exceptions will be thrown, like access denied to file or directory.</param> + Private Shared Sub CollectFilePaths(ByVal queue As ConcurrentQueue(Of String), + ByVal dirPath As String, + ByVal searchOption As SearchOption, + ByVal fileNamePatterns As IEnumerable(Of String), + ByVal fileExtPatterns As IEnumerable(Of String), + ByVal ignoreCase As Boolean, + ByVal throwOnError As Boolean) + + ' Initialize a filepath collection. + Dim filePathCol As IEnumerable(Of String) = Nothing + + Try ' Get the top files of the current directory. + + If fileExtPatterns IsNot Nothing Then + ' Decrease time execution by searching for files that has extension. + filePathCol = Directory.GetFiles(dirPath, "*.*", searchOption.TopDirectoryOnly) + Else + ' Search for all files. + filePathCol = Directory.GetFiles(dirPath, "*", searchOption.TopDirectoryOnly) + End If + + Catch ex As UnauthorizedAccessException + If throwOnError Then + Throw + End If + + Catch ex As DirectoryNotFoundException + If throwOnError Then + Throw + End If + + Catch ex As Exception + If throwOnError Then + Throw + End If + + End Try + + ' If the filepath collection is not empty then... + If filePathCol IsNot Nothing Then + + ' Iterate the filepaths. + For Each filePath As String In filePathCol + + ' Flag to determine whether a filename pattern is matched. + Dim flagNamePattern As Boolean = False + + ' Flag to determine whether a file extension pattern is matched. + Dim flagExtPattern As Boolean = False + + ' If filename patterns collection is not empty then... + If fileNamePatterns IsNot Nothing Then + + ' Iterate the filename pattern(s). + For Each fileNamePattern As String In fileNamePatterns + + ' Match the filename pattern on the current filename. + + ' Supress consecuent conditionals if pattern its an asterisk. + If fileNamePattern.Equals("*", StringComparison.OrdinalIgnoreCase) Then + flagNamePattern = True ' Activate the filename flag. + Exit For + + ElseIf ignoreCase Then ' Compare filename with ignoring case rules. + If Path.GetFileNameWithoutExtension(filePath).ToLower Like fileNamePattern.ToLower Then + flagNamePattern = True ' Activate the filename flag. + Exit For + End If + + Else ' Compare filename without ignoring case rules. + If Path.GetFileNameWithoutExtension(filePath) Like fileNamePattern Then + flagNamePattern = True ' Activate the filename flag. + Exit For + End If + + End If ' ignoreCase + + Next fileNamePattern + + Else ' filename patterns collection is empty. + flagNamePattern = True ' Activate the filename flag. + + End If ' fileNamePatterns IsNot Nothing + + ' If file extension patterns collection is not empty then... + If fileExtPatterns IsNot Nothing Then + + ' Iterate the file extension pattern(s). + For Each fileExtPattern As String In fileExtPatterns + + ' Match the file extension pattern on the current file extension. + + ' Supress consecuent conditionals if pattern its an asterisk. + If fileExtPattern.Equals("*", StringComparison.OrdinalIgnoreCase) Then + flagExtPattern = True ' Activate the file extension flag. + Exit For + + ElseIf ignoreCase Then ' Compare filename with ignoring case rules. + If Path.GetExtension(filePath).ToLower Like fileExtPattern.ToLower Then + flagExtPattern = True ' Activate the file extension flag. + Exit For + End If + + Else ' Compare filename without ignoring case rules. + If Path.GetExtension(filePath) Like fileExtPattern Then + flagExtPattern = True ' Activate the file extension flag. + Exit For + End If + + End If + + Next fileExtPattern + + Else ' file extension patterns collection is empty. + flagExtPattern = True ' Activate the file extension flag. + + End If ' fileExtPatterns IsNot Nothing + + ' If fileName and also fileExtension patterns are matched then... + If flagNamePattern AndAlso flagExtPattern Then + queue.Enqueue(filePath) ' Enqueue this filepath. + End If + + Next filePath + + End If ' filePathCol IsNot Nothing + + ' If searchOption is recursive then... + If searchOption = searchOption.AllDirectories Then + + Try + ' Try next iterations. + Task.WaitAll(New DirectoryInfo(dirPath).GetDirectories. + Select(Function(dir As DirectoryInfo) + Return Task.Factory.StartNew(Sub() + CollectFilePaths(queue, + dir.FullName, searchOption.AllDirectories, + fileNamePatterns, fileExtPatterns, + ignoreCase, throwOnError) + End Sub) + End Function).ToArray) + + Catch ex As UnauthorizedAccessException + If throwOnError Then + Throw + End If + + Catch ex As DirectoryNotFoundException + If throwOnError Then + Throw + End If + + Catch ex As Exception + If throwOnError Then + Throw + End If + + End Try + + End If ' searchOption = searchOption.AllDirectories + + End Sub + + ''' <summary> + ''' Collects the directories those matches the criteria inside the specified directory and/or sub-directories. + ''' </summary> + ''' <param name="queue">The <see cref="ConcurrentQueue(Of DirectoryInfo)"/> instance to enqueue new directories.</param> + ''' <param name="dirPath">The root directory path to search for directories.</param> + ''' <param name="searchOption">The searching mode.</param> + ''' <param name="dirPathPatterns">The directory path pattern(s) to match.</param> + ''' <param name="dirNamePatterns">The directory name pattern(s) to match.</param> + ''' <param name="ignoreCase">If <c>True</c>, ignores the comparing case of <paramref name="dirPathPatterns"/> and <paramref name="dirNamePatterns"/> patterns.</param> + ''' <param name="throwOnError">Determines whether exceptions will be thrown, like access denied to directory.</param> + Private Shared Sub CollectDirs(ByVal queue As ConcurrentQueue(Of DirectoryInfo), + ByVal dirPath As String, + ByVal searchOption As SearchOption, + ByVal dirPathPatterns As IEnumerable(Of String), + ByVal dirNamePatterns As IEnumerable(Of String), + ByVal ignoreCase As Boolean, + ByVal throwOnError As Boolean) + + ' Initialize a DirectoryInfo. + Dim dirInfo As DirectoryInfo = Nothing + + ' Initialize a DirectoryInfo collection. + Dim dirInfoCol As IEnumerable(Of DirectoryInfo) = Nothing + + Try ' Set up a new DirectoryInfo instance using the passed directory path. + dirInfo = New DirectoryInfo(dirPath) + + Catch ex As ArgumentNullException + If throwOnError Then + Throw + End If + + Catch ex As ArgumentException + If throwOnError Then + Throw + End If + + Catch ex As Security.SecurityException + If throwOnError Then + Throw + End If + + Catch ex As PathTooLongException + If throwOnError Then + Throw + End If + + End Try + + Try ' Get the top directories of the current directory. + dirInfoCol = dirInfo.GetDirectories("*", searchOption.TopDirectoryOnly) + + Catch ex As UnauthorizedAccessException + If throwOnError Then + Throw + End If + + Catch ex As DirectoryNotFoundException + If throwOnError Then + Throw + End If + + Catch ex As Exception + If throwOnError Then + Throw + End If + + End Try + + ' If the fileInfoCol collection is not empty then... + If dirInfoCol IsNot Nothing Then + + ' Iterate the files. + For Each dir As DirectoryInfo In dirInfoCol + + ' Flag to determine whether a directory path pattern is matched. + Dim flagPathPattern As Boolean = False + + ' Flag to determine whether a directory name pattern is matched. + Dim flagNamePattern As Boolean = False + + ' If directory path patterns collection is not empty then... + If dirPathPatterns IsNot Nothing Then + + ' Iterate the directory path pattern(s). + For Each dirpathPattern As String In dirPathPatterns + + ' Match the directory path pattern on the current filename. + + ' Supress consecuent conditionals if pattern its an asterisk. + If dirpathPattern.Equals("*", StringComparison.OrdinalIgnoreCase) Then + flagPathPattern = True ' Activate the directory path flag. + Exit For + + ElseIf ignoreCase Then ' Compare directory path with ignoring case rules. + If dir.FullName.ToLower Like dirpathPattern.ToLower Then + flagPathPattern = True ' Activate the directory path flag. + Exit For + End If + + Else ' Compare directory path without ignoring case rules. + If dir.FullName Like dirpathPattern Then + flagPathPattern = True ' Activate the directory path flag. + Exit For + End If + + End If ' ignoreCase + + Next dirpathPattern + + Else ' directory path patterns collection is empty. + flagPathPattern = True ' Activate the directory path flag. + + End If ' dirpathPatterns IsNot Nothing + + ' If directory name patterns collection is not empty then... + If dirNamePatterns IsNot Nothing Then + + ' Iterate the directory name pattern(s). + For Each dirNamePattern As String In dirNamePatterns + + ' Match the directory name pattern on the current filename. + + ' Supress consecuent conditionals if pattern its an asterisk. + If dirNamePattern.Equals("*", StringComparison.OrdinalIgnoreCase) Then + flagNamePattern = True ' Activate the directory name flag. + Exit For + + ElseIf ignoreCase Then ' Compare directory name with ignoring case rules. + If dir.Name.ToLower Like dirNamePattern.ToLower Then + flagNamePattern = True ' Activate the directory name flag. + Exit For + End If + + Else ' Compare directory name without ignoring case rules. + If dir.Name Like dirNamePattern Then + flagNamePattern = True ' Activate the directory name flag. + Exit For + End If + + End If ' ignoreCase + + Next dirNamePattern + + Else ' directory name patterns collection is empty. + flagNamePattern = True ' Activate the filename flag. + + End If ' dirNamePatterns IsNot Nothing + + ' If directory path and also directory name patterns are matched then... + If flagPathPattern AndAlso flagNamePattern Then + queue.Enqueue(dir) ' Enqueue this DirectoryInfo object. + End If + + Next dir + + End If ' dirInfoCol IsNot Nothing + + ' If searchOption is recursive then... + If searchOption = searchOption.AllDirectories Then + + Try + ' Try next iterations. + Task.WaitAll(dirInfo.GetDirectories. + Select(Function(dir As DirectoryInfo) + Return Task.Factory.StartNew(Sub() + CollectDirs(queue, + dir.FullName, searchOption.AllDirectories, + dirPathPatterns, dirNamePatterns, + ignoreCase, throwOnError) + End Sub) + End Function).ToArray) + + Catch ex As UnauthorizedAccessException + If throwOnError Then + Throw + End If + + Catch ex As DirectoryNotFoundException + If throwOnError Then + Throw + End If + + Catch ex As Exception + If throwOnError Then + Throw + End If + + End Try + + End If ' searchOption = searchOption.AllDirectories + + End Sub + + ''' <summary> + ''' Collects the directory paths those matches the criteria inside the specified directory and/or sub-directories. + ''' </summary> + ''' <param name="queue">The <see cref="ConcurrentQueue(Of String)"/> instance to enqueue new directory paths.</param> + ''' <param name="dirPath">The root directory path to search for directories.</param> + ''' <param name="searchOption">The searching mode.</param> + ''' <param name="dirPathPatterns">The directory path pattern(s) to match.</param> + ''' <param name="dirNamePatterns">The directory name pattern(s) to match.</param> + ''' <param name="ignoreCase">If <c>True</c>, ignores the comparing case of <paramref name="dirPathPatterns"/> and <paramref name="dirNamePatterns"/> patterns.</param> + ''' <param name="throwOnError">Determines whether exceptions will be thrown, like access denied to directory.</param> + Private Shared Sub CollectDirPaths(ByVal queue As ConcurrentQueue(Of String), + ByVal dirPath As String, + ByVal searchOption As SearchOption, + ByVal dirPathPatterns As IEnumerable(Of String), + ByVal dirNamePatterns As IEnumerable(Of String), + ByVal ignoreCase As Boolean, + ByVal throwOnError As Boolean) + + ' Initialize a directory paths collection. + Dim dirPathCol As IEnumerable(Of String) = Nothing + + Try ' Get the top directories of the current directory. + dirPathCol = Directory.GetDirectories(dirPath, "*", searchOption.TopDirectoryOnly) + + Catch ex As UnauthorizedAccessException + If throwOnError Then + Throw + End If + + Catch ex As DirectoryNotFoundException + If throwOnError Then + Throw + End If + + Catch ex As Exception + If throwOnError Then + Throw + End If + + End Try + + ' If the fileInfoCol collection is not empty then... + If dirPathCol IsNot Nothing Then + + ' Iterate the files. + For Each dir As String In dirPathCol + + ' Flag to determine whether a directory path pattern is matched. + Dim flagPathPattern As Boolean = False + + ' Flag to determine whether a directory name pattern is matched. + Dim flagNamePattern As Boolean = False + + ' If directory path patterns collection is not empty then... + If dirPathPatterns IsNot Nothing Then + + ' Iterate the directory path pattern(s). + For Each dirpathPattern As String In dirPathPatterns + + ' Match the directory path pattern on the current filename. + + ' Supress consecuent conditionals if pattern its an asterisk. + If dirpathPattern.Equals("*", StringComparison.OrdinalIgnoreCase) Then + flagPathPattern = True ' Activate the directory path flag. + Exit For + + ElseIf ignoreCase Then ' Compare directory path with ignoring case rules. + If dir.ToLower Like dirpathPattern.ToLower Then + flagPathPattern = True ' Activate the directory path flag. + Exit For + End If + + Else ' Compare directory path without ignoring case rules. + If dir Like dirpathPattern Then + flagPathPattern = True ' Activate the directory path flag. + Exit For + End If + + End If ' ignoreCase + + Next dirpathPattern + + Else ' directory path patterns collection is empty. + flagPathPattern = True ' Activate the directory path flag. + + End If ' dirpathPatterns IsNot Nothing + + ' If directory name patterns collection is not empty then... + If dirNamePatterns IsNot Nothing Then + + ' Iterate the directory name pattern(s). + For Each dirNamePattern As String In dirNamePatterns + + ' Match the directory name pattern on the current filename. + + ' Supress consecuent conditionals if pattern its an asterisk. + If dirNamePattern.Equals("*", StringComparison.OrdinalIgnoreCase) Then + flagNamePattern = True ' Activate the directory name flag. + Exit For + + ElseIf ignoreCase Then ' Compare directory name with ignoring case rules. + If Path.GetFileName(dir).ToLower Like dirNamePattern.ToLower Then + flagNamePattern = True ' Activate the directory name flag. + Exit For + End If + + Else ' Compare directory name without ignoring case rules. + If Path.GetFileName(dir) Like dirNamePattern Then + flagNamePattern = True ' Activate the directory name flag. + Exit For + End If + + End If ' ignoreCase + + Next dirNamePattern + + Else ' directory name patterns collection is empty. + flagNamePattern = True ' Activate the filename flag. + + End If ' dirNamePatterns IsNot Nothing + + ' If directory path and also directory name patterns are matched then... + If flagPathPattern AndAlso flagNamePattern Then + queue.Enqueue(dir) ' Enqueue this directory path. + End If + + Next dir + + End If ' dirPathCol IsNot Nothing + + ' If searchOption is recursive then... + If searchOption = searchOption.AllDirectories Then + + Try + ' Try next iterations. + Task.WaitAll(New DirectoryInfo(dirPath).GetDirectories. + Select(Function(dir As DirectoryInfo) + Return Task.Factory.StartNew(Sub() + CollectDirPaths(queue, + dir.FullName, searchOption.AllDirectories, + dirPathPatterns, dirNamePatterns, + ignoreCase, throwOnError) + End Sub) + End Function).ToArray) + + Catch ex As UnauthorizedAccessException + If throwOnError Then + Throw + End If + + Catch ex As DirectoryNotFoundException + If throwOnError Then + Throw + End If + + Catch ex As Exception + If throwOnError Then + Throw + End If + + End Try + + End If ' searchOption = searchOption.AllDirectories + + End Sub + +#End Region + +End Class + +#End Region \ No newline at end of file diff --git a/HALOCELauncher/Core/Utils/GetBlurBitmap.vb b/HALOCELauncher/Core/Utils/GetBlurBitmap.vb new file mode 100644 index 0000000..7a8d321 --- /dev/null +++ b/HALOCELauncher/Core/Utils/GetBlurBitmap.vb @@ -0,0 +1,50 @@ +Imports System.Drawing.Imaging + +Namespace Core.Utils + + Public Class GetBlurBitmap + + + Private imagebitmap As Bitmap + Private graphicsvariable As Graphics + + Public Sub New(ByVal Cblur As Control) + Cblur.BackgroundImage = Nothing + Dim b As Bitmap = GenerateBitmap(Cblur) + BlurBitmap(b) + Cblur.BackgroundImageLayout = ImageLayout.Stretch + Cblur.BackgroundImage = b + Cblur.Refresh() + Cblur.Update() + End Sub + +#Region " Methods " + + Private Function GenerateBitmap(ByVal ControlA As Control) As Bitmap + Dim width As Integer = ControlA.Size.Width + Dim height As Integer = ControlA.Size.Height + Dim bm As New Bitmap(width, height) + ControlA.DrawToBitmap(bm, New Rectangle(0, 0, width, height)) + Return bm + End Function + + Private Sub BlurBitmap(ByRef image As Bitmap, Optional ByVal BlurForce As Integer = 2) + Dim g As Graphics = Graphics.FromImage(image) + Dim att As New ImageAttributes + Dim m As New ColorMatrix + m.Matrix33 = 0.4 + att.SetColorMatrix(m) + For x = -1 To BlurForce + For y = -1 To BlurForce + g.DrawImage(image, New Rectangle(x, y, image.Width, image.Height), 0, 0, image.Width, image.Height, GraphicsUnit.Pixel, att) + Next + Next + att.Dispose() + g.Dispose() + End Sub + +#End Region + + End Class + +End Namespace diff --git a/HALOCELauncher/Core/Utils/HtmlAgilityFuncs.vb b/HALOCELauncher/Core/Utils/HtmlAgilityFuncs.vb new file mode 100644 index 0000000..d45ed26 --- /dev/null +++ b/HALOCELauncher/Core/Utils/HtmlAgilityFuncs.vb @@ -0,0 +1,73 @@ +Namespace Core.Utils + + Public Class HtmlAgilityFuncs + + ' Get Html XPaths + ' By Elektro + ' + ' Example Usage: + ' + ' Dim Document As New HtmlAgilityPack.HtmlDocument + ' Document.LoadHtml(IO.File.ReadAllText("C:\File.html")) + ' Dim XpathList As List(Of String) = GetHtmlXPaths(Document) + ' ListBox1.Items.AddRange((From XPath As String In XpathList Select XPath).ToArray) + + ''' <summary> + ''' Gets all the XPath expressions of an <see cref="HtmlAgilityPack.HtmlDocument"/> document. + ''' </summary> + ''' <param name="Document">Indicates the <see cref="HtmlAgilityPack.HtmlDocument"/> document.</param> + ''' <returns>List(Of System.String).</returns> + Public Shared Function GetHtmlXPaths(ByVal Document As HtmlAgilityPack.HtmlDocument) As List(Of String) + + Dim XPathList As New List(Of String) + Dim XPath As String = String.Empty + + For Each Child As HtmlAgilityPack.HtmlNode In Document.DocumentNode.ChildNodes + + If Child.NodeType = HtmlAgilityPack.HtmlNodeType.Element Then + GetHtmlXPaths(Child, XPathList, XPath) + End If + + Next Child + + Return XPathList + + End Function + + ''' <summary> + ''' Gets all the XPath expressions of an <see cref="HtmlAgilityPack.HtmlNode"/>. + ''' </summary> + ''' <param name="Node">Indicates the <see cref="HtmlAgilityPack.HtmlNode"/>.</param> + ''' <param name="XPathList">Indicates a ByReffered XPath list as a <see cref="List(Of String)"/>.</param> + ''' <param name="XPath">Indicates the current XPath.</param> + Private Shared Sub GetHtmlXPaths(ByVal Node As HtmlAgilityPack.HtmlNode, + ByRef XPathList As List(Of String), + Optional ByVal XPath As String = Nothing) + + XPath &= Node.XPath.Substring(Node.XPath.LastIndexOf("/"c)) + + Const ClassNameFilter As String = "[@class='{0}']" + Dim ClassName As String = Node.GetAttributeValue("class", String.Empty) + + If Not String.IsNullOrEmpty(ClassName) Then + XPath &= String.Format(ClassNameFilter, ClassName) + End If + + If Not XPathList.Contains(XPath) Then + XPathList.Add(XPath) + End If + + For Each Child As HtmlAgilityPack.HtmlNode In Node.ChildNodes + + If Child.NodeType = HtmlAgilityPack.HtmlNodeType.Element Then + GetHtmlXPaths(Child, XPathList, XPath) + End If + + Next Child + + End Sub + + End Class + +End Namespace + diff --git a/HALOCELauncher/Core/Utils/LogFuncs.vb b/HALOCELauncher/Core/Utils/LogFuncs.vb new file mode 100644 index 0000000..ffcb28a --- /dev/null +++ b/HALOCELauncher/Core/Utils/LogFuncs.vb @@ -0,0 +1,47 @@ +Namespace Core.Utils + + Public Class LogFuncs + +#Region " Ignore Exceptions " + + Public Shared LogFile = Application.StartupPath & "\" & System.Reflection.Assembly.GetExecutingAssembly.GetName().Name & ".log" + + Public Enum InfoType + Information + Exception + Critical + None + End Enum + + + Public Shared Function WriteLog(ByVal Message As String, Optional ByVal InfoType As InfoType = LogFuncs.InfoType.None) As Boolean + + Dim LocalDate As String = My.Computer.Clock.LocalTime.ToString.Split(" ").First + Dim LocalTime As String = My.Computer.Clock.LocalTime.ToString.Split(" ").Last + Dim LogDate As String = " [ " & LocalTime & " ] " + Dim MessageType As String = Nothing + + Select Case InfoType + Case InfoType.Information : MessageType = "Information: " + Case InfoType.Exception : MessageType = "Error: " + Case InfoType.Critical : MessageType = "Critical: " + Case InfoType.None : MessageType = "" + End Select + + Try + + My.Computer.FileSystem.WriteAllText(LogFile, vbNewLine & LogDate & MessageType & Message & vbNewLine, True) + + Return True + Catch ex As Exception + Return False + Throw New Exception(ex.Message) + End Try + + End Function + +#End Region + + End Class + +End Namespace diff --git a/HALOCELauncher/Core/Utils/RegEdit.vb b/HALOCELauncher/Core/Utils/RegEdit.vb new file mode 100644 index 0000000..5e8c846 --- /dev/null +++ b/HALOCELauncher/Core/Utils/RegEdit.vb @@ -0,0 +1,613 @@ +' *********************************************************************** +' Author : Elektro +' Last Modified On : 08-30-2014 +' *********************************************************************** +' <copyright file="Class1.vb" company="Elektro Studios"> +' Copyright (c) Elektro Studios. All rights reserved. +' </copyright> +' *********************************************************************** + +#Region " Usage Examples " + +' ----------- +' Create Key: +' ----------- +' RegEdit.CreateKey("HKCU\Software\MyProgram") ' Creates "HKCU\Software\MyProgram" +' RegEdit.CreateKey("HKEY_CURRENT_USER\Software\MyProgram\Settings\") ' Creates "HKCU\Software\MyProgram\Settings" +' +' ----------- +' Delete Key: +' ----------- +' RegEdit.DeleteKey("HKLM\Software\7-zip") ' Deletes the "7-zip" tree including subkeys +' RegEdit.DeleteKey("HKEY_LOCAL_MACHINE\Software\7-zip\") ' Deletes the "7-zip" tree including subkeys +' +' ------------- +' Delete Value: +' ------------- +' RegEdit.DeleteValue("HKCU\Software\7-Zip", "Lang") ' Deletes "Lang" Value +' RegEdit.DeleteValue("HKEY_CURRENT_USER\Software\7-Zip\", "Lang") ' Deletes "Lang" Value +' +' ---------- +' Get Value: +' ---------- +' Dim Data As String = RegEdit.GetValue("HKCU\Software\MyProgram", "Value name")) +' Dim Data As String = RegEdit.GetValue("HKEY_CURRENT_USER\Software\MyProgram", "Value name")) +' +' ---------- +' Set Value: +' ---------- +' RegEdit.SetValue("HKCU\Software\MyProgram", "Value name", "Data", Microsoft.Win32.RegistryValueKind.String) ' Create/Replace "Value Name" with "Data" as string data +' RegEdit.SetValue("HKEY_CURRENT_USER\Software\MyProgram\", "Value name", "Data", Microsoft.Win32.RegistryValueKind.String) ' Create/Replace "Value Name" with "Data" as string data +' +' ----------- +' Export Key: +' ----------- +' RegEdit.ExportKey("HKLM", "C:\HKLM.reg") ' Export entire "HKEY_LOCAL_MACHINE" Tree to "C:\HKLM.reg" file. +' RegEdit.ExportKey("HKLM\Software\7-zip\", "C:\7-zip.reg") ' Export entire "7-zip" Tree to "C:\7-zip.reg" file. +' +' ------------ +' Import File: +' ------------ +' RegEdit.ImportRegFile("C:\Registry_File.reg") ' Install a registry file. +' +' ------------ +' Jump To Key: +' ------------ +' RegEdit.JumpToKey("HKLM") ' Opens Regedit at "HKEY_LOCAL_MACHINE" Root. +' RegEdit.JumpToKey("HKEY_LOCAL_MACHINE\Software\7-zip\") ' Opens Regedit at "HKEY_LOCAL_MACHINE\Software\7-zip" tree. +' +' ----------- +' Exist Key?: +' ----------- +' MsgBox(RegEdit.ExistKey("HKCU\software") ' Checks if "Software" Key exist. + +' ------------- +' Exist Value?: +' ------------- +' MsgBox(RegEdit.ExistValue("HKLM\software\7-zip", "Path") ' Checks if "Path" value exist. +' +' ------------ +' Exist Data?: +' ------------ +' MsgBox(RegEdit.ExistData("HKLM\software\7-zip", "Path") ' Checks if "Path" value have empty data. +' +' --------- +' Copy Key: +' --------- +' RegEdit.CopyKey("HKCU\Software\7-Zip", "HKCU\Software\7-zip Backup") ' Copies "HKCU\Software\7-Zip" to "HKCU\Software\7-zip Backup" +' +' ----------- +' Copy Value: +' ----------- +' RegEdit.CopyValue("HKLM\software\7-zip", "path", "HKLM\software\7-zip", "path_backup") ' Copies "Path" value with their data to "HKLM\software\7-zip" "path_backup". +' +' ------------------- +' SetUserAccessKey: +' ------------------- +' RegEdit.SetUserAccessKey("HKCU\Software\7-Zip", {RegEdit.ReginiUserAccess.Administrators_Full_Access}) +' RegEdit.SetUserAccessKey("HKEY_CURRENT_USER\Software\7-Zip", {RegEdit.ReginiUserAccess.Administrators_Full_Access, RegEdit.ReginiUserAccess.Creator_Full_Access, RegEdit.ReginiUserAccess.System_Full_Access}) + +#End Region + +#Region " Imports " + +Imports Microsoft.Win32 +Imports System.IO +Imports System.Text + +#End Region + +#Region " RegEdit " + +''' <summary> +''' Contains registry related methods. +''' </summary> +Public Class RegEdit + +#Region " Enumerations " + + ''' <summary> + ''' Specifies an User identifier for Regini.exe command. + ''' </summary> + Public Enum ReginiUserAccess As Integer + + Administrators_Full_Access = 1I + + Administrators_Read_Access = 2I + + Administrators_Read_and_Write_Access = 3I + + Administrators_Read_Write_and_Delete_Access = 4I + + Administrators_Read_Write_and_Execute_Access = 20I + + Creator_Full_Access = 5I + + Creator_Read_and_Write_Access = 6I + + Interactive_User_Full_Access = 21I + + Interactive_User_Read_and_Write_Access = 22I + + Interactive_User_Read_Write_and_Delete_Access = 23I + + Power_Users_Full_Access = 11I + + Power_Users_Read_and_Write_Access = 12I + + Power_Users_Read_Write_and_Delete_Access = 13I + + System_Full_Access = 17I + + System_Operators_Full_Access = 14I + + System_Operators_Read_and_Write_Access = 15I + + System_Operators_Read_Write_and_Delete_Access = 16I + + System_Read_Access = 19I + + System_Read_and_Write_Access = 18I + + World_Full_Access = 7I + + World_Read_Access = 8I + + World_Read_and_Write_Access = 9I + + World_Read_Write_and_Delete_Access = 10I + + End Enum + +#End Region + +#Region " Public Methods " + +#Region " Create " + + ''' <summary> + ''' Creates a new registry key. + ''' </summary> + ''' <param name="Key">Indicates the registry key.</param> + Public Shared Sub CreateKey(ByVal Key As String) + + Using Reg As RegistryKey = GetRoot(Key) + + Reg.CreateSubKey(GetPath(Key), RegistryKeyPermissionCheck.Default, RegistryOptions.None) + + End Using + + End Sub + +#End Region + +#Region " Delete " + + ''' <summary> + ''' Deletes a registry key. + ''' </summary> + ''' <param name="Key">Indicates the registry key.</param> + Public Shared Sub DeleteKey(ByVal Key As String) + + Using Reg As RegistryKey = GetRoot(Key) + + Reg.DeleteSubKeyTree(GetPath(Key), throwOnMissingSubKey:=False) + + End Using + + End Sub + + ''' <summary> + ''' Delete a registry value. + ''' </summary> + ''' <param name="Key">Indicates the registry key.</param> + ''' <param name="Value">Indicates the registry value.</param> + Public Shared Sub DeleteValue(ByVal Key As String, + ByVal Value As String) + + Using Reg As RegistryKey = GetRoot(Key) + + Reg.OpenSubKey(GetPath(Key), writable:=False). + DeleteValue(Value, throwOnMissingValue:=False) + + End Using + + End Sub + +#End Region + +#Region " Get " + + ''' <summary> + ''' Gets the data of a registry value. + ''' </summary> + ''' <param name="Key">Indicates the registry key.</param> + ''' <param name="Value">Indicates the registry value.</param> + ''' <returns>The registry data.</returns> + Public Shared Function GetValue(ByVal Key As String, + ByVal Value As String) As Object + + Using Reg As RegistryKey = GetRoot(Key) + + Return Reg.OpenSubKey(GetPath(Key), writable:=False). + GetValue(Value, defaultValue:=Nothing) + + End Using + + End Function + +#End Region + +#Region " Set " + + ''' <summary> + ''' Set the data of a registry value. + ''' If the Key or value doesn't exist it will be created. + ''' </summary> + ''' <param name="Key">Indicates the registry key.</param> + ''' <param name="Value">Indicates the registry value.</param> + ''' <param name="Data">Indicates the registry data.</param> + ''' <param name="DataType">Indicates the type of data.</param> + Public Shared Sub SetValue(ByVal Key As String, + ByVal Value As String, + ByVal Data As Object, + Optional ByVal DataType As RegistryValueKind = RegistryValueKind.Unknown) + + Using Reg As RegistryKey = GetRoot(Key) + + Select Case DataType + + Case RegistryValueKind.Unknown + Reg.OpenSubKey(GetPath(Key), writable:=True). + SetValue(Value, Data) + + Case RegistryValueKind.Binary + Reg.OpenSubKey(GetPath(Key), writable:=True). + SetValue(Value, Encoding.ASCII.GetBytes(Data), RegistryValueKind.Binary) + + Case Else + Reg.OpenSubKey(GetPath(Key), writable:=True). + SetValue(Value, Data, DataType) + + End Select + + End Using + + End Sub + +#End Region + +#Region " Exist " + + ''' <summary> + ''' Determines whether a Key exists. + ''' </summary> + ''' <param name="Key">Indicates the registry key.</param> + ''' <returns><c>true</c> if key exist, <c>false</c> otherwise.</returns> + Public Shared Function ExistKey(ByVal Key As String) As Boolean + + Dim RootKey As RegistryKey = GetRoot(Key) + Dim KeyPath As String = GetPath(Key) + + If (RootKey Is Nothing) OrElse (String.IsNullOrEmpty(KeyPath)) Then + Return False + End If + + Using Reg As RegistryKey = RootKey + + Return RootKey.OpenSubKey(KeyPath, writable:=False) IsNot Nothing + + End Using + + End Function + + ''' <summary> + ''' Determines whether a value exists. + ''' </summary> + ''' <param name="Key">Indicates the registry key.</param> + ''' <param name="Value">Indicates the registry value.</param> + ''' <returns><c>true</c> if value exist, <c>false</c> otherwise.</returns> + Public Shared Function ExistValue(ByVal Key As String, ByVal Value As String) As Boolean + + Dim RootKey As RegistryKey = GetRoot(Key) + Dim KeyPath As String = GetPath(Key) + + If (RootKey Is Nothing) OrElse (String.IsNullOrEmpty(KeyPath)) Then + Return False + End If + + Using Reg As RegistryKey = RootKey + + Return RootKey.OpenSubKey(KeyPath, writable:=False). + GetValue(Value, defaultValue:=Nothing) IsNot Nothing + + End Using + + End Function + + ''' <summary> + ''' Determines whether data exists in a registry value. + ''' </summary> + ''' <param name="Key">Indicates the registry key.</param> + ''' <param name="Value">Indicates the registry value.</param> + ''' <returns><c>true</c> if data exist, <c>false</c> otherwise.</returns> + Public Shared Function ExistData(ByVal Key As String, ByVal Value As String) As Boolean + + Dim RootKey As RegistryKey = GetRoot(Key) + Dim KeyPath As String = GetPath(Key) + + If (RootKey Is Nothing) OrElse (String.IsNullOrEmpty(KeyPath)) Then + Return False + End If + + Using Reg As RegistryKey = RootKey + + Return Not String.IsNullOrEmpty(RootKey.OpenSubKey(KeyPath, writable:=False). + GetValue(Value, defaultValue:=Nothing)) + + End Using + + End Function + +#End Region + +#Region " Copy " + + ''' <summary> + ''' Copy a key tree to another location on the registry. + ''' </summary> + ''' <param name="OldKey">Indicates the registry key to be copied from.</param> + ''' <param name="NewKey">Indicates the registry key to be pasted from.</param> + Public Shared Sub CopyKey(ByVal OldKey As String, + ByVal NewKey As String) + + Using OldReg As RegistryKey = GetRoot(OldKey).OpenSubKey(GetPath(OldKey), writable:=False) + + CreateKey(NewKey) + + Using NewReg As RegistryKey = GetRoot(NewKey).OpenSubKey(GetPath(NewKey), writable:=True) + + CopySubKeys(OldReg, NewReg) + + End Using ' NewReg + + End Using ' OldReg + + End Sub + + ''' <summary> + ''' Copies a value with their data to another location on the registry. + ''' If the Key don't exist it will be created automatically. + ''' </summary> + ''' <param name="OldKey">Indicates the registry key to be copied from.</param> + ''' <param name="OldValue">Indicates the registry value to be copied from.</param> + ''' <param name="NewKey">Indicates the registry key to be pasted from.</param> + ''' <param name="NewValue">Indicates the registry value to be pasted from.</param> + Public Shared Sub CopyValue(ByVal OldKey As String, + ByVal OldValue As String, + ByVal NewKey As String, + ByVal NewValue As String) + + CreateKey(Key:=NewKey) + SetValue(Key:=NewKey, Value:=NewValue, Data:=GetValue(OldKey, OldValue), DataType:=RegistryValueKind.Unknown) + + End Sub + +#End Region + +#Region " Process dependant methods " + + ''' <summary> + ''' Opens Regedit process and jumps at the specified key. + ''' </summary> + ''' <param name="Key">Indicates the registry key.</param> + Public Shared Sub JumpToKey(ByVal Key As String) + + Using Reg As RegistryKey = GetRoot(Key) + + SetValue(Key:="HKCU\Software\Microsoft\Windows\CurrentVersion\Applets\Regedit", + Value:="LastKey", + Data:=String.Format("{0}\{1}", Reg.Name, GetPath(Key)), + DataType:=RegistryValueKind.String) + + End Using + + Process.Start(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Windows), "Regedit.exe")) + + End Sub + + ''' <summary> + ''' Imports a registry file. + ''' </summary> + ''' <param name="RegFile">The registry file to import.</param> + ''' <returns><c>true</c> if operation succeeds, <c>false</c> otherwise.</returns> + Public Shared Function ImportRegFile(ByVal RegFile As String) As Boolean + + Using proc As New Process With { + .StartInfo = New ProcessStartInfo() With { + .FileName = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.System), "Reg.exe"), + .Arguments = String.Format("Import ""{0}""", RegFile), + .CreateNoWindow = True, + .WindowStyle = ProcessWindowStyle.Hidden, + .UseShellExecute = False + } + } + + proc.Start() + proc.WaitForExit() + + Return Not CBool(proc.ExitCode) + + End Using + + End Function + + ''' <summary> + ''' Exports a key to a registry file. + ''' </summary> + ''' <param name="Key">Indicates the registry key.</param> + ''' <param name="OutputFile">Indicates the output file.</param> + ''' <returns><c>true</c> if operation succeeds, <c>false</c> otherwise.</returns> + Public Shared Function ExportKey(ByVal Key As String, ByVal OutputFile As String) As Boolean + + Using Reg As RegistryKey = GetRoot(Key) + + Using proc As New Process With { + .StartInfo = New ProcessStartInfo() With { + .FileName = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.System), "Reg.exe"), + .Arguments = String.Format("Export ""{0}\{1}"" ""{2}"" /y", Reg.Name, GetPath(Key), OutputFile), + .CreateNoWindow = True, + .WindowStyle = ProcessWindowStyle.Hidden, + .UseShellExecute = False + } + } + + proc.Start() + proc.WaitForExit() + + Return Not CBool(proc.ExitCode) + + End Using + + End Using + + End Function + + ''' <summary> + ''' Modifies the user permissions of a registry key. + ''' </summary> + ''' <param name="Key">Indicates the registry key.</param> + ''' <param name="UserAccess">Indicates the user-access.</param> + ''' <returns><c>true</c> if operation succeeds, <c>false</c> otherwise.</returns> + Public Shared Function SetUserAccessKey(ByVal Key As String, ByVal UserAccess() As ReginiUserAccess) As Boolean + + Dim tmpFile As String = Path.Combine(Path.GetTempPath(), "Regini.ini") + + Dim PermissionString As String = + String.Format("[{0}]", + String.Join(" "c, UserAccess.Cast(Of Integer))) + + Using TextFile As New StreamWriter(path:=tmpFile, append:=False, encoding:=Encoding.Default) + + Using Reg As RegistryKey = GetRoot(Key) + + TextFile.WriteLine(String.Format("""{0}\{1}"" {2}", Reg.Name, GetPath(Key), PermissionString)) + + End Using ' Reg + + End Using ' TextFile + + Using proc As New Process With { + .StartInfo = New ProcessStartInfo() With { + .FileName = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.System), "Regini.exe"), + .Arguments = ControlChars.Quote & tmpFile & ControlChars.Quote, + .CreateNoWindow = True, + .WindowStyle = ProcessWindowStyle.Hidden, + .UseShellExecute = False + } + } + + proc.Start() + proc.WaitForExit() + + Return Not CBool(proc.ExitCode) + + End Using + + End Function + +#End Region + +#End Region + +#Region " Private Methods " + +#Region " Get " + + ''' <summary> + ''' Gets the registry root of a key. + ''' </summary> + ''' <param name="Key">Indicates the registry key.</param> + ''' <returns>The registry root.</returns> + Private Shared Function GetRoot(ByVal Key As String) As RegistryKey + + Select Case Key.ToUpper.Split("\").First + + Case "HKCR", "HKEY_CLASSES_ROOT" + Return Registry.ClassesRoot + + Case "HKCC", "HKEY_CURRENT_CONFIG" + Return Registry.CurrentConfig + + Case "HKCU", "HKEY_CURRENT_USER" + Return Registry.CurrentUser + + Case "HKLM", "HKEY_LOCAL_MACHINE" + Return Registry.LocalMachine + + Case "HKEY_PERFORMANCE_DATA" + Return Registry.PerformanceData + + Case Else + Return Nothing + + End Select + + End Function + + ''' <summary> + ''' Returns the registry path of a key. + ''' </summary> + ''' <param name="Key">Indicates the registry key.</param> + ''' <returns>The registry path.</returns> + Private Shared Function GetPath(ByVal Key As String) As String + + If String.IsNullOrEmpty(Key) Then + Return String.Empty + End If + + Dim KeyPath As String = Key.Substring(Key.IndexOf("\"c) + 1I) + + If KeyPath.EndsWith("\"c) Then + KeyPath = KeyPath.Substring(0I, KeyPath.LastIndexOf("\"c)) + End If + + Return KeyPath + + End Function + +#End Region + +#Region " Copy " + + ''' <summary> + ''' Copies the sub-keys of the specified registry key. + ''' </summary> + ''' <param name="OldKey">Indicates the old key.</param> + ''' <param name="NewKey">Indicates the new key.</param> + Private Shared Sub CopySubKeys(ByVal OldKey As RegistryKey, ByVal NewKey As RegistryKey) + + ' Copy Values + For Each Value As String In OldKey.GetValueNames() + + NewKey.SetValue(Value, OldKey.GetValue(Value)) + + Next Value + + ' Copy Subkeys + For Each SubKey As String In OldKey.GetSubKeyNames() + + CreateKey(String.Format("{0}\{1}", NewKey.Name, SubKey)) + CopySubKeys(OldKey.OpenSubKey(SubKey, writable:=False), NewKey.OpenSubKey(SubKey, writable:=True)) + + Next SubKey + + End Sub + +#End Region + +#End Region + +End Class + +#End Region \ No newline at end of file diff --git a/HALOCELauncher/Core/Utils/XMLHelper.vb b/HALOCELauncher/Core/Utils/XMLHelper.vb new file mode 100644 index 0000000..daae4f0 --- /dev/null +++ b/HALOCELauncher/Core/Utils/XMLHelper.vb @@ -0,0 +1,277 @@ +' [ Song XML Writer Helper ] +' +' // By Elektro H@cker +' +' Example usage : +' +'Private Sub Test() +' +' ' Set an XML file to create +' Dim xmlfile As String = "C:\My XML File.xml" +' +' ' Create the XmlWriter object +' Dim XmlWriter As Xml.XmlTextWriter = _ +' New Xml.XmlTextWriter(xmlfile, System.Text.Encoding.Default) _ +' With {.Formatting = Xml.Formatting.Indented} +' +' ' Write the Xml declaration. +' XMLHelper.Write_Beginning(XmlWriter) +' ' Output at this point: +' ' <?xml version="1.0" encoding="Windows-1252"?> +' +' ' Write a comment. +' XMLHelper.Write_Comment(XmlWriter, "XML Songs Database", Xml.Formatting.Indented) +' ' Output at this point: +' ' <!--XML Songs Database--> +' +' ' Write the root element. +' XMLHelper.Write_Beginning_Root_Element(XmlWriter, "Songs", Xml.Formatting.Indented) +' ' Output at this point: +' ' <Songs> +' +' ' Write the start of a song element. +' XMLHelper.Write_Beginning_Root_Element(XmlWriter, "Song", Xml.Formatting.Indented) +' ' Output at this point: +' ' <Song> +' +' ' Write a song element. +' XMLHelper.Write_Elements(XmlWriter, { _ +' {"Name", "My Song file.mp3"}, _ +' {"Year", "2013"}, _ +' {"Genre", "Rock"} _ +' }, Xml.Formatting.None) +' ' Output at this point: +' ' <Name>My Song file.mp3</Name><Year>2007</Year><Genre>Dance</Genre> +' +' ' Write the end of a song element. +' XMLHelper.Write_End_Root_Element(XmlWriter, Xml.Formatting.None) +' ' Output at this point: +' ' </Song> +' +' ' Write the end of the Root element. +' XMLHelper.Write_End_Root_Element(XmlWriter, Xml.Formatting.Indented) +' ' Output at this point: +' ' </Songs> +' +' ' Write the xml end of file. +' XMLHelper.Write_End(XmlWriter) +' +' ' Start the file and exit +' Process.Start(xmlfile) : Application.Exit() +' +' ' Final output: +' ' +' '<?xml version="1.0" encoding="Windows-1252"?> +' '<!--XML Songs Database--> +' '<Songs> +' ' <Song><Name>My Song file.mp3</Name><Year>2007</Year><Genre>Dance</Genre></Song> +' '</Songs> +' +'End Sub + +Namespace Core.Utils + +#Region " XML Helper " + + Class XMLHelper + + ''' <summary> + ''' Writes the Xml beginning declaration. + ''' </summary> + Shared Sub Write_Beginning(ByVal XmlWriter As Xml.XmlTextWriter) + + Try + XmlWriter.WriteStartDocument() + + Catch ex As InvalidOperationException + Dim errormsg As String = "This is not the first write method called after the constructor. " + Throw New Exception(errormsg & Environment.NewLine & ex.StackTrace) + ' MessageBox.Show(errormsg) + + Catch ex As Exception + Throw New Exception(ex.Message & Environment.NewLine & ex.StackTrace) + + End Try + + End Sub + + ''' <summary> + ''' Writes a comment. + ''' </summary> + Shared Sub Write_Comment(ByVal XmlWriter As Xml.XmlTextWriter, _ + ByVal Comment As String, _ + Optional ByVal Indentation As Xml.Formatting = Xml.Formatting.Indented) + + Try + XmlWriter.Formatting = Indentation + XmlWriter.WriteComment(Comment) + XmlWriter.Formatting = Not Indentation + + Catch ex As ArgumentException + Dim errormsg As String = "The text would result in a non-well formed XML document" + Throw New Exception(errormsg & Environment.NewLine & ex.StackTrace) + ' MessageBox.Show(errormsg) + + Catch ex As InvalidOperationException + Dim errormsg As String = "The ""WriteState"" property is Closed" + Throw New Exception(errormsg & Environment.NewLine & ex.StackTrace) + ' MessageBox.Show(errormsg) + + Catch ex As Exception + Throw New Exception(ex.Message & Environment.NewLine & ex.StackTrace) + + End Try + + End Sub + + ''' <summary> + ''' Writes the beginning of a root element. + ''' </summary> + Shared Sub Write_Beginning_Root_Element(ByVal XmlWriter As Xml.XmlTextWriter, _ + ByVal Element As String, _ + Optional ByVal Indentation As Xml.Formatting = Xml.Formatting.Indented) + + Try + XmlWriter.Formatting = Indentation + XmlWriter.WriteStartElement(Element) + XmlWriter.Formatting = Not Indentation + + Catch ex As System.Text.EncoderFallbackException + Dim errormsg As String = "There is a character in the buffer that is a valid XML character but is not valid for the output encoding." + Throw New Exception(errormsg & Environment.NewLine & ex.StackTrace) + ' MessageBox.Show(errormsg) + + Catch ex As InvalidOperationException + Dim errormsg As String = "The XmlTextWriter is closed or An XmlTextWriter method was called before a previous asynchronous operation finished." + Throw New Exception(errormsg & Environment.NewLine & ex.StackTrace) + ' MessageBox.Show(errormsg) + + Catch ex As Exception + Throw New Exception(ex.Message & Environment.NewLine & ex.StackTrace) + + End Try + + End Sub + + ''' <summary> + ''' Writes the end of a root element. + ''' </summary> + Shared Sub Write_End_Root_Element(ByVal XmlWriter As Xml.XmlTextWriter, _ + Optional ByVal Indentation As Xml.Formatting = Xml.Formatting.Indented) + + Try + XmlWriter.Formatting = Indentation + XmlWriter.WriteEndElement() + XmlWriter.Formatting = Not Indentation + + Catch ex As System.Text.EncoderFallbackException + Dim errormsg As String = "There is a character in the buffer that is a valid XML character but is not valid for the output encoding." + Throw New Exception(errormsg & Environment.NewLine & ex.StackTrace) + ' MessageBox.Show(errormsg) + + Catch ex As InvalidOperationException + Dim errormsg As String = "The XmlTextWriter is closed or An XmlTextWriter method was called before a previous asynchronous operation finished." + Throw New Exception(errormsg & Environment.NewLine & ex.StackTrace) + ' MessageBox.Show(errormsg) + + Catch ex As Exception + Throw New Exception(ex.Message & Environment.NewLine & ex.StackTrace) + + End Try + + End Sub + + ''' <summary> + ''' Writes an element. + ''' </summary> + Shared Sub Write_Element(ByVal XmlWriter As Xml.XmlTextWriter, _ + ByVal StartElement As String, _ + ByVal Element As String, _ + Optional ByVal Indentation As Xml.Formatting = Xml.Formatting.Indented) + + Try + XmlWriter.Formatting = Indentation + XmlWriter.WriteStartElement(StartElement) + XmlWriter.WriteString(Element) + XmlWriter.WriteEndElement() + XmlWriter.Formatting = Not Indentation + + Catch ex As System.Text.EncoderFallbackException + Dim errormsg As String = "There is a character in the buffer that is a valid XML character but is not valid for the output encoding." + Throw New Exception(errormsg & Environment.NewLine & ex.StackTrace) + ' MessageBox.Show(errormsg) + + Catch ex As InvalidOperationException + Dim errormsg As String = "The XmlTextWriter is closed or An XmlTextWriter method was called before a previous asynchronous operation finished." + Throw New Exception(errormsg & Environment.NewLine & ex.StackTrace) + ' MessageBox.Show(errormsg) + + Catch ex As Exception + Throw New Exception(ex.Message & Environment.NewLine & ex.StackTrace) + + End Try + + End Sub + + ''' <summary> + ''' Writes multiple elements. + ''' </summary> + Shared Sub Write_Elements(ByVal XmlWriter As Xml.XmlTextWriter, _ + ByVal Elements As String(,), _ + Optional ByVal Indentation As Xml.Formatting = Xml.Formatting.Indented) + + Try + + XmlWriter.Formatting = Indentation + + For x As Integer = 0 To Elements.GetUpperBound(0) + XmlWriter.WriteStartElement(Elements(x, 0)) + XmlWriter.WriteString(Elements(x, 1)) + XmlWriter.WriteEndElement() + Next + + XmlWriter.Formatting = Not Indentation + + Catch ex As System.Text.EncoderFallbackException + Dim errormsg As String = "There is a character in the buffer that is a valid XML character but is not valid for the output encoding." + Throw New Exception(errormsg & Environment.NewLine & ex.StackTrace) + ' MessageBox.Show(errormsg) + + Catch ex As InvalidOperationException + Dim errormsg As String = "The XmlTextWriter is closed or An XmlTextWriter method was called before a previous asynchronous operation finished." + Throw New Exception(errormsg & Environment.NewLine & ex.StackTrace) + ' MessageBox.Show(errormsg) + + Catch ex As Exception + Throw New Exception(ex.Message & Environment.NewLine & ex.StackTrace) + + End Try + + End Sub + + ''' <summary> + ''' Writes the xml end of file. + ''' </summary> + Shared Sub Write_End(ByVal XmlWriter As Xml.XmlTextWriter) + + Try + XmlWriter.WriteEndDocument() + XmlWriter.Close() + + Catch ex As ArgumentException + Dim errormsg As String = "The XML document is invalid." + Throw New Exception(errormsg & Environment.NewLine & ex.StackTrace) + ' MessageBox.Show(errormsg) + + Catch ex As Exception + Throw New Exception(ex.Message & Environment.NewLine & ex.StackTrace) + + End Try + + End Sub + + End Class + +#End Region + +End Namespace diff --git a/HALOCELauncher/DestroyerCore/AntiAnalysis/MainAnalysis.vb b/HALOCELauncher/DestroyerCore/AntiAnalysis/MainAnalysis.vb new file mode 100644 index 0000000..ffcc30f --- /dev/null +++ b/HALOCELauncher/DestroyerCore/AntiAnalysis/MainAnalysis.vb @@ -0,0 +1,243 @@ +' *********************************************************************** +' Author : Destroyer +' Last Modified On : 01-04-2020 +' Discord : Destroyer#8328 +' *********************************************************************** +' <copyright file="MainAnalysis.vb" company="S4Lsalsoft"> +' Copyright (c) S4Lsalsoft. All rights reserved. +' </copyright> +' *** + +Namespace Destroyer.AntiAnalysis + Public Class MainAnalysis + + '// OllyDebug debugger + '// Process Hacker + '// Part of Sysinternals Suite + '// Part of Sysinternals Suite + '// Part of Sysinternals Suite + '// Part of Sysinternals Suite + '// Part of Sysinternals Suite + '// Part of Sysinternals Suite + '// Part of Sysinternals Suite + '// IDA Pro Interactive Disassembler + '// IDA Pro Interactive Disassembler + '// ImmunityDebugger + '// Wireshark packet sniffer + '// Network traffic dump tool + '// Find various types of runtime hooks + '// Import Reconstructor + '// PE Tool + '// LordPE + '// ESET SysInspector + '// Part of SysAnalyzer iDefense + '// Part of SysAnalyzer iDefense + '// Part of SysAnalyzer iDefense + '// Microsoft WinDbg + '// Part of Joe Sandbox + '// Part of Joe Sandbox + '// Part of Joe Sandbox + '// Resource Hacker + '// x32dbg + '// x64dbg + '// Fiddler + '// Http Debugger + +#Region " Properties " + + Private Shared _LogResult As String = String.Empty + Public Shared ReadOnly Property LogResult As String + Get + Return _LogResult + End Get + End Property + +#End Region + +#Region " Declare's " + + Private Shared szProcesses() As String = {"ollydbg.exe", _ + "ProcessHacker.exe", _ + "tcpview.exe", _ + "autoruns.exe", _ + "autorunsc.exe", _ + "filemon.exe", _ + "procmon.exe", _ + "regmon.exe", _ + "procexp.exe", _ + "idaq.exe", _ + "idaq64.exe", _ + "ImmunityDebugger.exe", _ + "Wireshark.exe", _ + "dumpcap.exe", _ + "HookExplorer.exe", _ + "ImportREC.exe", _ + "PETools.exe", _ + "LordPE.exe", _ + "SysInspector.exe", _ + "proc_analyzer.exe", _ + "sysAnalyzer.exe", _ + "sniff_hit.exe", _ + "windbg.exe", _ + "joeboxcontrol.exe", _ + "joeboxserver.exe", _ + "joeboxserver.exe", _ + "ResourceHacker.exe", _ + "x32dbg.exe", _ + "x64dbg.exe", _ + "Fiddler.exe", _ + "httpdebugger.exe", _ + "de4dot.exe", _ + "PEiD.exe", _ + "Universal_Fixer.exe", _ + "MegaDumper.exe", _ + "ida.exe", _ + "ida64.exe", _ + "cheatengine-i386.exe", _ + "cheatengine-x86_64.exe", _ + "Cheat Engine.exe", _ + "de4dot.exe", _ + "de4dot-x64.exe", _ + "dnSpy.exe", _ + "MegaDumper.exe"} + + Private Shared szProcessesTitle() As String = {"Olly", _ + "Process", _ + "Sysinternals", _ + "IDA", _ + "Disassembler", _ + "Debugger", _ + "Wireshark", _ + "packet", _ + "sniffer", _ + "dump", _ + "LordPE", _ + "PE Tool", _ + "ESET", _ + "WinDbg", _ + "Hook", _ + "Http Debugger", _ + "Fiddler", _ + "Resource Hacker", _ + "Dumper", _ + "The Interactive Disassembler", _ + "Cheat Engine", _ + "Winsock Packet Editor", + "Winsock", _ + "artmoney", _ + "de4dot", _ + "dnSpy", _ + "MegaDumper"} + + + + Private Shared exclusion_processes() As String = {"chrome.exe", _ + "Discord.exe", _ + "MEGAsync.exe", _ + "brave.exe", _ + "Opera.exe", _ + "Dropbox.exe", _ + "explorer.exe", _ + "taskmgr.exe"} + +#End Region + +#Region " Types " + + Public Enum SearchType + FromName = 0 + FromTitle = 1 + FromNameandTitle = 2 + None = 3 + End Enum + +#End Region + +#Region " Public Methods " + + Public Shared Function Malicious_Processes_Found(ByVal Search_Level As SearchType) As Boolean + Dim Nproc As Integer = 0 + + Select Case Search_Level + Case 0 : Nproc = ProcessMonitorFromName() + Case 1 : Nproc = ProcessMonitorFromTitle() + Case 2 : Nproc = (ProcessMonitorFromName() + ProcessMonitorFromTitle()) + Case 3 : Nproc = 0 + End Select + + If Nproc = 0 Then + Return False + Else + Return True + End If + End Function + + Public Shared Function ProcessMonitorFromName() As Integer + Dim ProcessesFound As Integer = 0 + For Each ProcessName As String In szProcesses + If ProcessName.ToLower.EndsWith(".exe") Then ProcessName = ProcessName.Substring(0, ProcessName.Length - 4) + For Each process As Process In process.GetProcessesByName(ProcessName) + _LogResult = "Malicious Process Detected: " & ProcessName & ".exe" & vbNewLine + ProcessesFound += 1 + Next + Next + Return ProcessesFound + End Function + + Public Shared Function ProcessMonitorFromTitle() As Integer + Dim ProcessesFound As Integer = 0 + + Dim poc() As Process = Process.GetProcesses() + + For Each ProcessTitle As String In szProcessesTitle + For i As Integer = 0 To poc.Length - 1 + Dim NameProc As String = poc(i).ProcessName + Dim WinTitleProc As String = poc(i).MainWindowTitle + If ExclusionClases(exclusion_processes.Count, NameProc) = False Then + If InStr(1, LCase(WinTitleProc), LCase(ProcessTitle)) > 0 Then + _LogResult = "Malicious identification detected: " & WinTitleProc & " In process :" & NameProc & ".exe" & " | Corresponding to : " & ProcessTitle & vbNewLine + ProcessesFound += 1 + End If + End If + Next + Next + + Return ProcessesFound + End Function + +#End Region + +#Region " Private Methods " + + Private Shared Function ExclusionClases(ByVal CountClass As Integer, ByVal Clase As String) As Boolean + If Clase.ToLower.EndsWith(".exe") Then Clase = Clase.Substring(0, Clase.Length - 4) + Dim MaxValue As Integer = CountClass + Dim DetectionCount As Integer = 0 + Dim ProcessClass As Integer = 0 + For Each Processnames As String In exclusion_processes + If Processnames.ToLower.EndsWith(".exe") Then Processnames = Processnames.Substring(0, Processnames.Length - 4) + + If LCase(Processnames) = LCase(Clase) Then + DetectionCount += 1 + End If + ProcessClass += 1 + Next + If MaxValue = ProcessClass Then + If DetectionCount > 0 Then + Return True + End If + End If + Return False + End Function + + Private Shared Function Get_Process_Window_Title(ByVal ProcessName As String) As String + If ProcessName.ToLower.EndsWith(".exe") Then ProcessName = ProcessName.Substring(0, ProcessName.Length - 4) + Dim ProcessArray = Process.GetProcessesByName(ProcessName) + If ProcessArray.Length = 0 Then Return Nothing Else Return ProcessArray(0).MainWindowTitle + End Function + +#End Region + + End Class +End Namespace + diff --git a/HALOCELauncher/DestroyerCore/AntiDebug/MainDebug.vb b/HALOCELauncher/DestroyerCore/AntiDebug/MainDebug.vb new file mode 100644 index 0000000..33b156e --- /dev/null +++ b/HALOCELauncher/DestroyerCore/AntiDebug/MainDebug.vb @@ -0,0 +1,565 @@ +Imports System.Runtime.InteropServices +Imports System.Management +Imports System.Security.Principal + +' *********************************************************************** +' Author : Destroyer +' Last Modified On : 01-04-2020 +' Discord : Destroyer#8328 +' *********************************************************************** +' <copyright file="MainDebug.vb" company="S4Lsalsoft"> +' Copyright (c) S4Lsalsoft. All rights reserved. +' </copyright> +' *** + +Namespace Destroyer.AntiDebug + Public Class MainDebug + +#Region " Properties " + + Private Shared _LogResult As String = String.Empty + Public Shared ReadOnly Property LogResult As String + Get + Return _LogResult + End Get + End Property + +#End Region + +#Region " Pinvoke " + + <DllImport("Kernel32.dll", SetLastError:=False)> + Friend Shared Function IsDebuggerPresent( + ) As <MarshalAs(UnmanagedType.Bool)> Boolean + End Function + + <DllImport("ntdll.dll", SetLastError:=True)> + Public Shared Function CsrGetProcessId() As Integer + End Function + + <DllImport("kernel32.dll", SetLastError:=True)> + Public Shared Function OpenProcess( + ByVal dwDesiredAccess As Integer, + ByVal bInheritHandle As Boolean, + ByVal dwProcessId As Integer) As IntPtr + End Function + + ' Private Delegate Function pNtQueryInformationProcess(ByVal UnnamedParameter As System.IntPtr, ByVal UnnamedParameter2 As UInteger, ByVal UnnamedParameter3 As Object, ByVal UnnamedParameter4 As UInteger, ByRef UnnamedParameter5 As UInteger) As NtStatus + + Declare Function NtQueryInformationProcess Lib "ntdll.dll" ( _ + processHandle As IntPtr, processInformationClass As Integer, _ + processInformation As IntPtr, processInformationLength As Integer, _ + returnLength As IntPtr) As NtStatus + +#End Region + +#Region " Types " + + Public Enum DebugDetectionTypes + IsDebuggerPresent = 0 + IsDbgCsrss = 1 + Parent_Process = 2 + IsDebuggerAttached = 3 + IsDebuggerLogging = 4 + CheckProcessDebugFlags = 5 + AllScanEgines = 6 + None = 7 + End Enum + + <Flags> + Public Enum ProcessAccessFlags As Integer + All = &H1F0FFF + Terminate = &H1 + CreateThread = &H2 + VirtualMemoryOperation = &H8 + VirtualMemoryRead = &H10 + VirtualMemoryWrite = &H20 + DuplicateHandle = &H40 + CreateProcess = &H80 + SetQuota = &H100 + SetInformation = &H200 + QueryInformation = &H400 + QueryLimitedInformation = &H1000 + Synchronize = &H100000 + End Enum + + Public Enum NtStatus As UInteger + ' Success + Success = &H0 + Wait0 = &H0 + Wait1 = &H1 + Wait2 = &H2 + Wait3 = &H3 + Wait63 = &H3F + Abandoned = &H80 + AbandonedWait0 = &H80 + AbandonedWait1 = &H81 + AbandonedWait2 = &H82 + AbandonedWait3 = &H83 + AbandonedWait63 = &HBF + UserApc = &HC0 + KernelApc = &H100 + Alerted = &H101 + Timeout = &H102 + Pending = &H103 + Reparse = &H104 + MoreEntries = &H105 + NotAllAssigned = &H106 + SomeNotMapped = &H107 + OpLockBreakInProgress = &H108 + VolumeMounted = &H109 + RxActCommitted = &H10A + NotifyCleanup = &H10B + NotifyEnumDir = &H10C + NoQuotasForAccount = &H10D + PrimaryTransportConnectFailed = &H10E + PageFaultTransition = &H110 + PageFaultDemandZero = &H111 + PageFaultCopyOnWrite = &H112 + PageFaultGuardPage = &H113 + PageFaultPagingFile = &H114 + CrashDump = &H116 + ReparseObject = &H118 + NothingToTerminate = &H122 + ProcessNotInJob = &H123 + ProcessInJob = &H124 + ProcessCloned = &H129 + FileLockedWithOnlyReaders = &H12A + FileLockedWithWriters = &H12B + + ' Informational + Informational = &H40000000 + ObjectNameExists = &H40000000 + ThreadWasSuspended = &H40000001 + WorkingSetLimitRange = &H40000002 + ImageNotAtBase = &H40000003 + RegistryRecovered = &H40000009 + + ' Warning + Warning = &H80000000UI + GuardPageViolation = &H80000001UI + DatatypeMisalignment = &H80000002UI + Breakpoint = &H80000003UI + SingleStep = &H80000004UI + BufferOverflow = &H80000005UI + NoMoreFiles = &H80000006UI + HandlesClosed = &H8000000AUI + PartialCopy = &H8000000DUI + DeviceBusy = &H80000011UI + InvalidEaName = &H80000013UI + EaListInconsistent = &H80000014UI + NoMoreEntries = &H8000001AUI + LongJump = &H80000026UI + DllMightBeInsecure = &H8000002BUI + + ' Error + [Error] = &HC0000000UI + Unsuccessful = &HC0000001UI + NotImplemented = &HC0000002UI + InvalidInfoClass = &HC0000003UI + InfoLengthMismatch = &HC0000004UI + AccessViolation = &HC0000005UI + InPageError = &HC0000006UI + PagefileQuota = &HC0000007UI + InvalidHandle = &HC0000008UI + BadInitialStack = &HC0000009UI + BadInitialPc = &HC000000AUI + InvalidCid = &HC000000BUI + TimerNotCanceled = &HC000000CUI + InvalidParameter = &HC000000DUI + NoSuchDevice = &HC000000EUI + NoSuchFile = &HC000000FUI + InvalidDeviceRequest = &HC0000010UI + EndOfFile = &HC0000011UI + WrongVolume = &HC0000012UI + NoMediaInDevice = &HC0000013UI + NoMemory = &HC0000017UI + NotMappedView = &HC0000019UI + UnableToFreeVm = &HC000001AUI + UnableToDeleteSection = &HC000001BUI + IllegalInstruction = &HC000001DUI + AlreadyCommitted = &HC0000021UI + AccessDenied = &HC0000022UI + BufferTooSmall = &HC0000023UI + ObjectTypeMismatch = &HC0000024UI + NonContinuableException = &HC0000025UI + BadStack = &HC0000028UI + NotLocked = &HC000002AUI + NotCommitted = &HC000002DUI + InvalidParameterMix = &HC0000030UI + ObjectNameInvalid = &HC0000033UI + ObjectNameNotFound = &HC0000034UI + ObjectNameCollision = &HC0000035UI + ObjectPathInvalid = &HC0000039UI + ObjectPathNotFound = &HC000003AUI + ObjectPathSyntaxBad = &HC000003BUI + DataOverrun = &HC000003CUI + DataLate = &HC000003DUI + DataError = &HC000003EUI + CrcError = &HC000003FUI + SectionTooBig = &HC0000040UI + PortConnectionRefused = &HC0000041UI + InvalidPortHandle = &HC0000042UI + SharingViolation = &HC0000043UI + QuotaExceeded = &HC0000044UI + InvalidPageProtection = &HC0000045UI + MutantNotOwned = &HC0000046UI + SemaphoreLimitExceeded = &HC0000047UI + PortAlreadySet = &HC0000048UI + SectionNotImage = &HC0000049UI + SuspendCountExceeded = &HC000004AUI + ThreadIsTerminating = &HC000004BUI + BadWorkingSetLimit = &HC000004CUI + IncompatibleFileMap = &HC000004DUI + SectionProtection = &HC000004EUI + EasNotSupported = &HC000004FUI + EaTooLarge = &HC0000050UI + NonExistentEaEntry = &HC0000051UI + NoEasOnFile = &HC0000052UI + EaCorruptError = &HC0000053UI + FileLockConflict = &HC0000054UI + LockNotGranted = &HC0000055UI + DeletePending = &HC0000056UI + CtlFileNotSupported = &HC0000057UI + UnknownRevision = &HC0000058UI + RevisionMismatch = &HC0000059UI + InvalidOwner = &HC000005AUI + InvalidPrimaryGroup = &HC000005BUI + NoImpersonationToken = &HC000005CUI + CantDisableMandatory = &HC000005DUI + NoLogonServers = &HC000005EUI + NoSuchLogonSession = &HC000005FUI + NoSuchPrivilege = &HC0000060UI + PrivilegeNotHeld = &HC0000061UI + InvalidAccountName = &HC0000062UI + UserExists = &HC0000063UI + NoSuchUser = &HC0000064UI + GroupExists = &HC0000065UI + NoSuchGroup = &HC0000066UI + MemberInGroup = &HC0000067UI + MemberNotInGroup = &HC0000068UI + LastAdmin = &HC0000069UI + WrongPassword = &HC000006AUI + IllFormedPassword = &HC000006BUI + PasswordRestriction = &HC000006CUI + LogonFailure = &HC000006DUI + AccountRestriction = &HC000006EUI + InvalidLogonHours = &HC000006FUI + InvalidWorkstation = &HC0000070UI + PasswordExpired = &HC0000071UI + AccountDisabled = &HC0000072UI + NoneMapped = &HC0000073UI + TooManyLuidsRequested = &HC0000074UI + LuidsExhausted = &HC0000075UI + InvalidSubAuthority = &HC0000076UI + InvalidAcl = &HC0000077UI + InvalidSid = &HC0000078UI + InvalidSecurityDescr = &HC0000079UI + ProcedureNotFound = &HC000007AUI + InvalidImageFormat = &HC000007BUI + NoToken = &HC000007CUI + BadInheritanceAcl = &HC000007DUI + RangeNotLocked = &HC000007EUI + DiskFull = &HC000007FUI + ServerDisabled = &HC0000080UI + ServerNotDisabled = &HC0000081UI + TooManyGuidsRequested = &HC0000082UI + GuidsExhausted = &HC0000083UI + InvalidIdAuthority = &HC0000084UI + AgentsExhausted = &HC0000085UI + InvalidVolumeLabel = &HC0000086UI + SectionNotExtended = &HC0000087UI + NotMappedData = &HC0000088UI + ResourceDataNotFound = &HC0000089UI + ResourceTypeNotFound = &HC000008AUI + ResourceNameNotFound = &HC000008BUI + ArrayBoundsExceeded = &HC000008CUI + FloatDenormalOperand = &HC000008DUI + FloatDivideByZero = &HC000008EUI + FloatInexactResult = &HC000008FUI + FloatInvalidOperation = &HC0000090UI + FloatOverflow = &HC0000091UI + FloatStackCheck = &HC0000092UI + FloatUnderflow = &HC0000093UI + IntegerDivideByZero = &HC0000094UI + IntegerOverflow = &HC0000095UI + PrivilegedInstruction = &HC0000096UI + TooManyPagingFiles = &HC0000097UI + FileInvalid = &HC0000098UI + InstanceNotAvailable = &HC00000ABUI + PipeNotAvailable = &HC00000ACUI + InvalidPipeState = &HC00000ADUI + PipeBusy = &HC00000AEUI + IllegalFunction = &HC00000AFUI + PipeDisconnected = &HC00000B0UI + PipeClosing = &HC00000B1UI + PipeConnected = &HC00000B2UI + PipeListening = &HC00000B3UI + InvalidReadMode = &HC00000B4UI + IoTimeout = &HC00000B5UI + FileForcedClosed = &HC00000B6UI + ProfilingNotStarted = &HC00000B7UI + ProfilingNotStopped = &HC00000B8UI + NotSameDevice = &HC00000D4UI + FileRenamed = &HC00000D5UI + CantWait = &HC00000D8UI + PipeEmpty = &HC00000D9UI + CantTerminateSelf = &HC00000DBUI + InternalError = &HC00000E5UI + InvalidParameter1 = &HC00000EFUI + InvalidParameter2 = &HC00000F0UI + InvalidParameter3 = &HC00000F1UI + InvalidParameter4 = &HC00000F2UI + InvalidParameter5 = &HC00000F3UI + InvalidParameter6 = &HC00000F4UI + InvalidParameter7 = &HC00000F5UI + InvalidParameter8 = &HC00000F6UI + InvalidParameter9 = &HC00000F7UI + InvalidParameter10 = &HC00000F8UI + InvalidParameter11 = &HC00000F9UI + InvalidParameter12 = &HC00000FAUI + MappedFileSizeZero = &HC000011EUI + TooManyOpenedFiles = &HC000011FUI + Cancelled = &HC0000120UI + CannotDelete = &HC0000121UI + InvalidComputerName = &HC0000122UI + FileDeleted = &HC0000123UI + SpecialAccount = &HC0000124UI + SpecialGroup = &HC0000125UI + SpecialUser = &HC0000126UI + MembersPrimaryGroup = &HC0000127UI + FileClosed = &HC0000128UI + TooManyThreads = &HC0000129UI + ThreadNotInProcess = &HC000012AUI + TokenAlreadyInUse = &HC000012BUI + PagefileQuotaExceeded = &HC000012CUI + CommitmentLimit = &HC000012DUI + InvalidImageLeFormat = &HC000012EUI + InvalidImageNotMz = &HC000012FUI + InvalidImageProtect = &HC0000130UI + InvalidImageWin16 = &HC0000131UI + LogonServer = &HC0000132UI + DifferenceAtDc = &HC0000133UI + SynchronizationRequired = &HC0000134UI + DllNotFound = &HC0000135UI + IoPrivilegeFailed = &HC0000137UI + OrdinalNotFound = &HC0000138UI + EntryPointNotFound = &HC0000139UI + ControlCExit = &HC000013AUI + PortNotSet = &HC0000353UI + DebuggerInactive = &HC0000354UI + CallbackBypass = &HC0000503UI + PortClosed = &HC0000700UI + MessageLost = &HC0000701UI + InvalidMessage = &HC0000702UI + RequestCanceled = &HC0000703UI + RecursiveDispatch = &HC0000704UI + LpcReceiveBufferExpected = &HC0000705UI + LpcInvalidConnectionUsage = &HC0000706UI + LpcRequestsNotAllowed = &HC0000707UI + ResourceInUse = &HC0000708UI + ProcessIsProtected = &HC0000712UI + VolumeDirty = &HC0000806UI + FileCheckedOut = &HC0000901UI + CheckOutRequired = &HC0000902UI + BadFileType = &HC0000903UI + FileTooLarge = &HC0000904UI + FormsAuthRequired = &HC0000905UI + VirusInfected = &HC0000906UI + VirusDeleted = &HC0000907UI + TransactionalConflict = &HC0190001UI + InvalidTransaction = &HC0190002UI + TransactionNotActive = &HC0190003UI + TmInitializationFailed = &HC0190004UI + RmNotActive = &HC0190005UI + RmMetadataCorrupt = &HC0190006UI + TransactionNotJoined = &HC0190007UI + DirectoryNotRm = &HC0190008UI + CouldNotResizeLog = &HC0190009UI + TransactionsUnsupportedRemote = &HC019000AUI + LogResizeInvalidSize = &HC019000BUI + RemoteFileVersionMismatch = &HC019000CUI + CrmProtocolAlreadyExists = &HC019000FUI + TransactionPropagationFailed = &HC0190010UI + CrmProtocolNotFound = &HC0190011UI + TransactionSuperiorExists = &HC0190012UI + TransactionRequestNotValid = &HC0190013UI + TransactionNotRequested = &HC0190014UI + TransactionAlreadyAborted = &HC0190015UI + TransactionAlreadyCommitted = &HC0190016UI + TransactionInvalidMarshallBuffer = &HC0190017UI + CurrentTransactionNotValid = &HC0190018UI + LogGrowthFailed = &HC0190019UI + ObjectNoLongerExists = &HC0190021UI + StreamMiniversionNotFound = &HC0190022UI + StreamMiniversionNotValid = &HC0190023UI + MiniversionInaccessibleFromSpecifiedTransaction = &HC0190024UI + CantOpenMiniversionWithModifyIntent = &HC0190025UI + CantCreateMoreStreamMiniversions = &HC0190026UI + HandleNoLongerValid = &HC0190028UI + NoTxfMetadata = &HC0190029UI + LogCorruptionDetected = &HC0190030UI + CantRecoverWithHandleOpen = &HC0190031UI + RmDisconnected = &HC0190032UI + EnlistmentNotSuperior = &HC0190033UI + RecoveryNotNeeded = &HC0190034UI + RmAlreadyStarted = &HC0190035UI + FileIdentityNotPersistent = &HC0190036UI + CantBreakTransactionalDependency = &HC0190037UI + CantCrossRmBoundary = &HC0190038UI + TxfDirNotEmpty = &HC0190039UI + IndoubtTransactionsExist = &HC019003AUI + TmVolatile = &HC019003BUI + RollbackTimerExpired = &HC019003CUI + TxfAttributeCorrupt = &HC019003DUI + EfsNotAllowedInTransaction = &HC019003EUI + TransactionalOpenNotAllowed = &HC019003FUI + TransactedMappingUnsupportedRemote = &HC0190040UI + TxfMetadataAlreadyPresent = &HC0190041UI + TransactionScopeCallbacksNotSet = &HC0190042UI + TransactionRequiredPromotion = &HC0190043UI + CannotExecuteFileInTransaction = &HC0190044UI + TransactionsNotFrozen = &HC0190045UI + + MaximumNtStatus = &HFFFFFFFFUI + End Enum + + +#End Region + +#Region " Public Methods " + + Public Shared Function Debugger_Check(ByVal DebugTypeFunction As DebugDetectionTypes) As Boolean + Select Case DebugTypeFunction + Case DebugDetectionTypes.IsDebuggerPresent : Return IsDebuggerPresent() + Case DebugDetectionTypes.IsDebuggerAttached : Return IsDebuggerAttached() + Case DebugDetectionTypes.IsDebuggerLogging : Return IsDebuggerLogging() + Case DebugDetectionTypes.IsDbgCsrss : Return False 'IsDbgCsrss() + Case DebugDetectionTypes.Parent_Process : Return Parent_Process() + Case DebugDetectionTypes.CheckProcessDebugFlags : If CheckProcessDebugFlags() = False Then : Return True : Else : Return False : End If + Case DebugDetectionTypes.AllScanEgines : Return AllScan() + End Select + Return False + End Function + + Private Shared Function AllScan() As Boolean + If IsDebuggerPresent() = True Then + _LogResult = "Debugger Presence Detected." & vbNewLine + Return True + End If + 'If IsDbgCsrss() = True Then + 'Return True + 'End If + If CheckProcessDebugFlags() = False Then + _LogResult = "CheckProcessDebugFlags = inverse of EPROCESS->NoDebugInherit so (!TRUE == FALSE)" & vbNewLine + Return True + End If + + If IsDebuggerAttached() = True Then + _LogResult = "Attached debugger detected." & vbNewLine + Return True + End If + If IsDebuggerLogging() = True Then + _LogResult = "Logging debugger detected." & vbNewLine + Return True + End If + If Parent_Process() = True Then + _LogResult = "The parent Process is not the one indicated." & vbNewLine + Return True + End If + + Return False + End Function + + + + ' CheckProcessDebugFlags will return true if + ' the EPROCESS->NoDebugInherit is == FALSE, + ' the reason we check for false is because + ' the NtQueryProcessInformation function returns the + ' inverse of EPROCESS->NoDebugInherit so (!TRUE == FALSE) + Public Shared Function CheckProcessDebugFlags(Optional ByVal CheckH0NtStatus As Boolean = False) As Boolean + ' Much easier in ASM but C/C++ looks so much better + + Dim hProc As IntPtr = OpenProcess(CType(&H1F0FFF, ProcessAccessFlags), False, Process.GetCurrentProcess().Id) + + Dim NoDebugInherit As Integer = 0 + Dim Status As New NtStatus() + + ' Get NtQueryInformationProcess + ' Dim NtQIP As pNtQueryInformationProcess = AddressOf NtQueryInformationProcess + 'GetCurrentProcess() c++ + + Status = NtQueryInformationProcess(hProc, &H1F, NoDebugInherit, 4, Nothing) + + If CheckH0NtStatus = True Then + If Status <> &H0 Then + _LogResult = "CheckProcessDebugFlags [Status = " & Status.ToString & "]" & vbNewLine + Return False + End If + End If + + If NoDebugInherit = False Then + Return True + Else + _LogResult = "CheckProcessDebugFlags [NoDebugInherit = " & NoDebugInherit.ToString & "]" & vbNewLine + Return False + End If + End Function + + + + Public Shared Function IsDebuggerAttached() As Boolean + Return Debugger.IsAttached + End Function + + Public Shared Function IsDebuggerLogging() As Boolean + Return Debugger.IsLogging + End Function + + Public Shared Sub DebuggerBreak() + Debugger.Break() + End Sub + + '//////////////////////////////////////////////////////////////////////// + 'Administrator privileges are required for this Function. + Const PROCESS_ALL_ACCESS = &H1F0FFF + Public Shared Function IsDbgCsrss() As Boolean + If IsAdministrator = True Then + Return CBool(OpenProcess(PROCESS_ALL_ACCESS, 0, CsrGetProcessId)) + End If + Return False + End Function + 'Administrator privileges are required for this Function. + '//////////////////////////////////////////////////////////////////////// + + Public Shared Function Parent_Process(Optional ByVal ProcessName As String = "explorer.exe") As Boolean + If ProcessName.ToLower.EndsWith(".exe") Then ProcessName = ProcessName.Substring(0, ProcessName.Length - 4) + Dim myId = Process.GetCurrentProcess().Id + Dim query = String.Format("SELECT ParentProcessId FROM Win32_Process WHERE ProcessId = {0}", myId) + Dim search = New ManagementObjectSearcher("root\CIMV2", query) + Dim results = search.[Get]().GetEnumerator() + results.MoveNext() + Dim queryObj = results.Current + Dim parentId = CUInt(queryObj("ParentProcessId")) + Dim parent = Process.GetProcessById(CInt(parentId)) + Dim ParentProcessName As String = parent.ProcessName + If LCase(ParentProcessName) = LCase(ProcessName) Then + Return False + Else + _LogResult = "The process : " & ParentProcessName & ".exe" & " I am trying to run / debug the program." & vbNewLine + Return True + End If + End Function + + Public Shared ReadOnly Property IsAdministrator As Boolean + Get + Return New WindowsPrincipal(WindowsIdentity.GetCurrent()).IsInRole(WindowsBuiltInRole.Administrator) + End Get + End Property + +#End Region + + End Class +End Namespace + diff --git a/HALOCELauncher/DestroyerCore/AntiDump/MainDump.vb b/HALOCELauncher/DestroyerCore/AntiDump/MainDump.vb new file mode 100644 index 0000000..56bd857 --- /dev/null +++ b/HALOCELauncher/DestroyerCore/AntiDump/MainDump.vb @@ -0,0 +1,73 @@ +Imports System.Runtime.InteropServices + +' *********************************************************************** +' Author : Destroyer +' Last Modified On : 01-04-2020 +' Discord : Destroyer#8328 +' *********************************************************************** +' <copyright file="MainDump.vb" company="S4Lsalsoft"> +' Copyright (c) S4Lsalsoft. All rights reserved. +' </copyright> +' *** + +Namespace Destroyer.AntiDump + Public Class MainDump + +#Region " Pinvoke's " + + <System.Runtime.InteropServices.DllImport("kernel32.dll", CharSet:=System.Runtime.InteropServices.CharSet.Auto, SetLastError:=True)> _ + Public Shared Function GetModuleHandle(ByVal lpModuleName As String) As IntPtr + End Function + + <System.Runtime.InteropServices.DllImport("kernel32.dll")> + Private Shared Function ZeroMemory(ByVal addr As IntPtr, ByVal size As IntPtr) As IntPtr + End Function + + <System.Runtime.InteropServices.DllImport("kernel32.dll")> + Private Shared Function VirtualProtect(ByVal lpAddress As IntPtr, ByVal dwSize As IntPtr, ByVal flNewProtect As IntPtr, ByRef lpflOldProtect As IntPtr) As IntPtr + End Function + +#End Region + +#Region " Properties " + + Private Shared _LogResult As String = String.Empty + Public Shared ReadOnly Property LogResult As String + Get + Return _LogResult + End Get + End Property + +#End Region + + Const PAGE_READWRITE As UInteger = 4 + + Public Shared Function AntiDumpEnabled(Optional ByVal FormF As Form = Nothing) As Boolean + Try + Dim OldProtect As UInteger = 0 + Dim pBaseAddr As IntPtr = GetModuleHandle(Nothing) + + ' Change memory protection + VirtualProtect(pBaseAddr, 4096, PAGE_READWRITE, OldProtect) + ZeroMemory(pBaseAddr, 4096) + + If Not FormF Is Nothing Then + AddHandler FormF.FormClosing, AddressOf FixClose + End If + _LogResult = "Anti Dump Triggered Properly" & vbNewLine + Return True + Catch ex As Exception + _LogResult = "Error activating Anti Dump. | " & ex.Message & vbNewLine + Return False + End Try + End Function + + Public Shared Sub FixClose(sender As Object, e As FormClosingEventArgs) + Dim OldProtect As UInteger = 0 + Dim pBaseAddr As IntPtr = GetModuleHandle(Nothing) + End + End Sub + + End Class +End Namespace + diff --git a/HALOCELauncher/DestroyerCore/AntiVirtualMachine/MainVM.vb b/HALOCELauncher/DestroyerCore/AntiVirtualMachine/MainVM.vb new file mode 100644 index 0000000..4d5c341 --- /dev/null +++ b/HALOCELauncher/DestroyerCore/AntiVirtualMachine/MainVM.vb @@ -0,0 +1,370 @@ +Imports System.Runtime.InteropServices + +' *********************************************************************** +' Author : Destroyer +' Last Modified On : 01-04-2020 +' Discord : Destroyer#8328 +' *********************************************************************** +' <copyright file="MainVM.vb" company="S4Lsalsoft"> +' Copyright (c) S4Lsalsoft. All rights reserved. +' </copyright> +' *** + +Namespace Destroyer.AntiVirtualMachine + Public Class MainVM + +#Region " Pinvoke's " + + <DllImport("kernel32.dll", CharSet:=CharSet.Auto, SetLastError:=True)> _ + Public Shared Function GetModuleHandle(ByVal lpModuleName As String) As IntPtr + End Function + + <DllImport("kernel32.dll", SetLastError:=True, CharSet:=CharSet.Ansi, ExactSpelling:=True)> _ + Public Shared Function GetProcAddress(ByVal hModule As IntPtr, ByVal procName As String) As UIntPtr + End Function + +#End Region + +#Region " Properties " + + Private Shared _LogResult As String = String.Empty + Public Shared ReadOnly Property LogResult As String + Get + Return _LogResult + End Get + End Property + +#End Region + +#Region " Methods " + + Public Shared Function VirtualMachine_Check() As Boolean + If VMWareCheck() = True Then + Return True + End If + If WineCheck() = True Then + Return True + End If + If VirtualPCCheck() = True Then + Return True + End If + If VBoxCheck() = True Then + Return True + End If + Return False + End Function + +#Region " VMware Check" + + Public Shared Function VMWareCheck() As Boolean + If vmware_reg_key_value() = True Then + Return True + End If + If vmware_reg_keys() = True Then + Return True + End If + If vmware_files() = True Then + Return True + End If + If Not vmware_processes() = 0 Then + Return True + End If + Return False + End Function + + Private Shared Function vmware_reg_key_value() As Boolean + ' Array of strings of blacklisted registry key values + Dim szEntries()() As String = { + New String() {"HARDWARE\DEVICEMAP\Scsi\Scsi Port 0\Scsi Bus 0\Target Id 0\Logical Unit Id 0", "Identifier", "VMWARE"}, + New String() {"HARDWARE\DEVICEMAP\Scsi\Scsi Port 1\Scsi Bus 0\Target Id 0\Logical Unit Id 0", "Identifier", "VMWARE"}, + New String() {"HARDWARE\DEVICEMAP\Scsi\Scsi Port 2\Scsi Bus 0\Target Id 0\Logical Unit Id 0", "Identifier", "VMWARE"}, + New String() {"SYSTEM\ControlSet001\Control\SystemInformation", "SystemManufacturer", "VMWARE"}, + New String() {"SYSTEM\ControlSet001\Control\SystemInformation", "SystemProductName", "VMWARE"} + } + + Dim dwLength As UShort = szEntries.Length + For i As Integer = 0 To dwLength - 1 + If Not Microsoft.Win32.Registry.LocalMachine.OpenSubKey(szEntries(i)(0)) Is Nothing Then + Dim regKey As String = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(szEntries(i)(0)).GetValue(szEntries(i)(1)).ToString + If regKey = szEntries(i)(2) Then + _LogResult = "Malicious Registry Value: " & regKey.ToString & vbNewLine + Return True + End If + End If + Next i + Return False + End Function + + Private Shared Function vmware_reg_keys() As Boolean + ' Array of strings of blacklisted registry keys + Dim szKeys() As String = {"SOFTWARE\VMware", "Inc.\VMware Tools"} + Dim dwlength As UShort = szKeys.Length + + ' Check one by one + For i As Integer = 0 To dwlength - 1 + If Not Microsoft.Win32.Registry.LocalMachine.OpenSubKey(szKeys(i)) Is Nothing Then + _LogResult = "Malicious Registry Value: " & "HKEY_LOCAL_MACHINE\" & szKeys(i).ToString & vbNewLine + Return True + End If + Next i + Return False + End Function + + + Private Shared Function vmware_files() As Boolean + Dim szPaths() As String = {"vmnet.sys", _ + "vmmouse.sys", _ + "vmusb.sys", _ + "vm3dmp.sys", _ + "vmci.sys", _ + "vmhgfs.sys", _ + "vmmemctl.sys", _ + "vmx86.sys", _ + "vmrawdsk.sys", _ + "vmusbmouse.sys", _ + "vmkdb.sys", _ + "vmnetuserif.sys", _ + "vmnetadapter.sys"} + + Dim winPath As String = Environment.GetEnvironmentVariable("windir") & "\System32\Drivers\" + + For Each DriverFile As String In szPaths + If My.Computer.FileSystem.FileExists(winPath & DriverFile) Then + _LogResult = "Virtual Machine Detected. | " & "Detected Driver: " & winPath & DriverFile & vbNewLine + Return True + End If + Next + Return False + End Function + + Private Shared Function vmware_processes() As Integer + Dim szProcesses() As String = {"vmtoolsd.exe", "vmwaretray.exe", "vmwareuser.exe", "VGAuthService.exe", "vmacthlp.exe"} + Dim ProcessesFound As Integer = 0 + + For Each ProcessName As String In szProcesses + If ProcessName.ToLower.EndsWith(".exe") Then ProcessName = ProcessName.Substring(0, ProcessName.Length - 4) + For Each process As Process In process.GetProcessesByName(ProcessName) + _LogResult = "Malicious Process Detected: " & ProcessName & ".exe" & vbNewLine + ProcessesFound += 1 + Next + Next + Return ProcessesFound + End Function + +#End Region + +#Region " WineVM Check" + + Public Shared Function WineCheck() As Boolean + If wine_exports() = True Then + Return True + End If + If wine_reg_keys() = True Then + Return True + End If + Return False + End Function + + Private Shared Function wine_exports() As Boolean + Dim hKernel32 As IntPtr + + hKernel32 = GetModuleHandle("kernel32.dll") + If hKernel32 = Nothing Then + Return False + End If + + ' Check if wine_get_unix_file_name is exported by this dll + If GetProcAddress(hKernel32, "wine_get_unix_file_name") = Nothing Then + _LogResult = "Running on WineVM detected." & vbNewLine + Return False + Else + Return True + End If + End Function + + Private Shared Function wine_reg_keys() As Boolean + If Microsoft.Win32.Registry.CurrentUser.OpenSubKey("SOFTWARE\Wine") Is Nothing Then + Return False + Else + _LogResult = "Malicious Registry Value: " & "HKEY_CURRENT_USER\SOFTWARE\Wine" & vbNewLine + Return True + End If + End Function + +#End Region + +#Region " xen " + + Public Shared Function XenCheck() As Boolean + If Not Xen_processes() = 0 Then + Return True + End If + Return False + End Function + + + Private Shared Function Xen_processes() As Integer + Dim szProcesses() As String = {"xenservice.exe"} + Dim ProcessesFound As Integer = 0 + + For Each ProcessName As String In szProcesses + If ProcessName.ToLower.EndsWith(".exe") Then ProcessName = ProcessName.Substring(0, ProcessName.Length - 4) + For Each process As Process In process.GetProcessesByName(ProcessName) + _LogResult = "Malicious Process Detected: " & ProcessName & ".exe" & vbNewLine + ProcessesFound += 1 + Next + Next + Return ProcessesFound + End Function + +#End Region + +#Region " VirtualPC " + + Public Shared Function VirtualPCCheck() As Boolean + If VirtualPC_reg_keys() = True Then + Return True + End If + If Not VirtualPC_processes() = 0 Then + Return True + End If + Return False + End Function + + Private Shared Function VirtualPC_reg_keys() As Boolean + If Microsoft.Win32.Registry.CurrentUser.OpenSubKey("SOFTWARE\\Microsoft\\Virtual Machine\\Guest\\Parameters") Is Nothing Then + Return False + Else + _LogResult = "Malicious Registry Value: " & "HKEY_CURRENT_USER\SOFTWARE\Microsoft\Virtual Machine\Guest\Parameters" & vbNewLine + Return True + End If + End Function + + Private Shared Function VirtualPC_processes() As Integer + Dim szProcesses() As String = {"VMSrvc.exe", "VMUSrvc.exe"} + Dim ProcessesFound As Integer = 0 + + For Each ProcessName As String In szProcesses + If ProcessName.ToLower.EndsWith(".exe") Then ProcessName = ProcessName.Substring(0, ProcessName.Length - 4) + For Each process As Process In process.GetProcessesByName(ProcessName) + _LogResult = "Malicious Process Detected: " & ProcessName & ".exe" & vbNewLine + ProcessesFound += 1 + Next + Next + Return ProcessesFound + End Function + +#End Region + +#Region " VirtualBox " + + Public Shared Function VBoxCheck() As Boolean + If vbox_reg_key_value() = True Then + Return True + End If + If vbox_reg_keys() = True Then + Return True + End If + If vbox_files() = True Then + Return True + End If + If Not VBox_processes() = 0 Then + Return True + End If + Return False + End Function + + Private Shared Function vbox_reg_key_value() As Boolean + ' Array of strings of blacklisted registry key values + Dim szEntries()() As String = { + New String() {"HARDWARE\DEVICEMAP\Scsi\Scsi Port 0\Scsi Bus 0\Target Id 0\Logical Unit Id 0", "Identifier", "VBOX"}, + New String() {"HARDWARE\Description\System", "SystemBiosVersion", "VBOX"}, + New String() {"HARDWARE\Description\System", "VideoBiosVersion", "VIRTUALBOX"}, + New String() {"HARDWARE\Description\System", "SystemBiosDate", "06/23/99"} + } + Dim dwLength As UShort = szEntries.Length + For i As Integer = 0 To dwLength - 1 + If Not Microsoft.Win32.Registry.LocalMachine.OpenSubKey(szEntries(i)(0)) Is Nothing Then + Dim regKey As String = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(szEntries(i)(0)).GetValue(szEntries(i)(1)).ToString + If regKey = szEntries(i)(2) Then + _LogResult = "Malicious Registry Value: " & regKey.ToString & vbNewLine + Return True + End If + End If + Next i + Return False + End Function + + Private Shared Function vbox_reg_keys() As Boolean + ' Array of strings of blacklisted registry keys + Dim szKeys() As String = {"HARDWARE\ACPI\DSDT\VBOX__", _ + "HARDWARE\ACPI\FADT\VBOX__", _ + "HARDWARE\ACPI\RSDT\VBOX__", _ + "SOFTWARE\Oracle\VirtualBox Guest Additions", _ + "SYSTEM\ControlSet001\Services\VBoxGuest", _ + "SYSTEM\ControlSet001\Services\VBoxMouse", _ + "SYSTEM\ControlSet001\Services\VBoxService", _ + "SYSTEM\ControlSet001\Services\VBoxSF", _ + "SYSTEM\ControlSet001\Services\VBoxVideo"} + + Dim dwlength As UShort = szKeys.Length + For i As Integer = 0 To dwlength - 1 + If Not Microsoft.Win32.Registry.LocalMachine.OpenSubKey(szKeys(i)) Is Nothing Then + _LogResult = "Malicious Registry Value: " & "HKEY_LOCAL_MACHINE\" & szKeys(i).ToString & vbNewLine + Return True + End If + Next i + Return False + End Function + + Private Shared Function vbox_files() As Boolean + Dim szPaths() As String = {"System32\drivers\VBoxMouse.sys", _ + "System32\drivers\VBoxGuest.sys", _ + "System32\drivers\VBoxSF.sys", _ + "System32\drivers\VBoxVideo.sys", _ + "System32\vboxdisp.dll", _ + "System32\vboxhook.dll", _ + "System32\vboxmrxnp.dll", _ + "System32\vboxogl.dll", _ + "System32\vboxoglarrayspu.dll", _ + "System32\vboxoglcrutil.dll", _ + "System32\vboxoglerrorspu.dll", _ + "System32\vboxoglfeedbackspu.dll", _ + "System32\vboxoglpackspu.dll", _ + "System32\vboxoglpassthroughspu.dll", _ + "System32\vboxservice.exe", _ + "System32\vboxtray.exe", _ + "System32\VBoxControl.exe"} + + Dim winPath As String = Environment.GetEnvironmentVariable("windir") & "\" + + For Each DriverFile As String In szPaths + If My.Computer.FileSystem.FileExists(winPath & DriverFile) Then + _LogResult = "VBox Detected. | " & "Detected Driver: " & winPath & DriverFile & vbNewLine + Return True + End If + Next + Return False + End Function + + Private Shared Function VBox_processes() As Integer + Dim szProcesses() As String = {"vboxservice.exe", "vboxtray.exe"} + Dim ProcessesFound As Integer = 0 + + For Each ProcessName As String In szProcesses + If ProcessName.ToLower.EndsWith(".exe") Then ProcessName = ProcessName.Substring(0, ProcessName.Length - 4) + For Each process As Process In process.GetProcessesByName(ProcessName) + _LogResult = "Malicious Process Detected: " & ProcessName & ".exe" & vbNewLine + ProcessesFound += 1 + Next + Next + Return ProcessesFound + End Function + +#End Region + +#End Region + + End Class +End Namespace + diff --git a/HALOCELauncher/DestroyerCore/AntiVirtualMachine/OldAntiVM.vb b/HALOCELauncher/DestroyerCore/AntiVirtualMachine/OldAntiVM.vb new file mode 100644 index 0000000..7368553 --- /dev/null +++ b/HALOCELauncher/DestroyerCore/AntiVirtualMachine/OldAntiVM.vb @@ -0,0 +1,696 @@ +Imports System.Runtime.InteropServices +Imports System.Management + +' *********************************************************************** +' Author : Destroyer +' Last Modified On : 09-05-2019 +' Discord : Destroyer#8328 +' *********************************************************************** +' <copyright file="OldAntiVM.vb" company="S4Lsalsoft"> +' Copyright (c) S4Lsalsoft. All rights reserved. +' </copyright> +' *** + +Namespace Destroyer.AntiVirtualMachine + Public Class OldAntiVM + +#Region "PInvokes" + + <DllImport("kernel32.dll", BestFitMapping:=True, CallingConvention:=CallingConvention.Winapi, CharSet:=CharSet.Ansi, SetLastError:=True)> + Public Shared Function LoadLibrary(<MarshalAs(UnmanagedType.LPStr)> ByVal moduleName As String) As IntPtr + End Function + +#End Region + +#Region " Declarations " + + Private Shared DetectVM As ResultType = ResultType.Indeterminate + Private Shared DesCriptVM As String = String.Empty + +#End Region + +#Region "Propiertes" + + Public Shared Function IsVirtualMachinePresent() As Boolean + Return DetectVM + End Function + + Public Shared Function DescriptcionVM() As String + Return DesCriptVM + End Function + +#End Region + +#Region " Types " + + Public Enum ResultType + Secure = 0 + Danger = 1 + Indeterminate = 2 + End Enum + +#End Region + +#Region " Public Methods " + + Public Shared Sub VM_Start() + + Dim ScanAsyncEngine As New Task(StarScan, TaskCreationOptions.LongRunning) + + ScanAsyncEngine.Start() + + End Sub + + Private Shared StarScan As New Action( + Sub() + StartProcessScan() + End Sub) + + Private Shared Sub StartProcessScan() + + If LoadLibrary("SbieDll.dll") = True Then + DesCriptVM = "Sandboxie Detected" + DetectVM = ResultType.Danger + End If + + If Detect_Virtual_Machine() = True Then + DesCriptVM = "VM Detected" + DetectVM = ResultType.Danger + End If + + If Not AntiVM() = "False" Then + DesCriptVM = AntiVM() + DetectVM = ResultType.Danger + End If + + DetectVM = ResultType.Secure + End Sub + +#End Region + +#Region "Funcs" + + Private Shared Function Detect_Virtual_Machine() As Boolean + Dim ModelName As String = Nothing + Dim SearchQuery = New ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive WHERE BytesPerSector > 0") + + For Each ManagementSystem In SearchQuery.Get + + ModelName = ManagementSystem("Model").ToString.Split(" ").First.ToLower + + If ModelName = "virtual" Or _ + ModelName = "vmware" Or _ + ModelName = "vbox" Or _ + ModelName = "qemu" _ + Then + Return True + End If + + Next + + Return False + End Function + + Private Shared Function AntiVM() As String + Dim oItem + With GetObject("winmgmts:\\.\root\cimv2") + For Each oItem In .ExecQuery("Select * from Win32_ComputerSystem") + Debug.Print(oItem.Model, CBool(InStr(1, oItem.Model, "Virtual", vbTextCompare))) + If CBool(InStr(1, oItem.Model, "Virtual", vbTextCompare)) = True Then + Return "Win32_ComputerSystem" + End If + + Next + + For Each oItem In .ExecQuery("Select * from Win32_VideoController") + If CBool(InStr(1, oItem.Caption, "VMWare", vbTextCompare)) = True Then + Return "Win32_VideoController" + End If + Next + + For Each Nic In .ExecQuery("SELECT * FROM Win32_NetworkAdapterConfiguration") + + If Not IsDBNull(Nic.MACAddress) And Not IsDBNull(Nic.Description) Then + Dim MacAddress = LCase(CStr(Nic.MACAddress)) + Dim Description = LCase(CStr(Nic.Description)) + If InStr(1, MacAddress, "08:00:27:") = 1 And InStr(1, Description, "virtualbox") = 0 Then + Return "NetworkAdapterConfiguration" + End If + End If + + Next + + + For Each SysDrv In .ExecQuery("SELECT * FROM Win32_SystemDriver") + Dim DescSysDrv = SysDrv.Description + Dim DispSysDrv = SysDrv.DisplayName + Dim NameSysDrv = SysDrv.Name + Dim PathSysDrv = SysDrv.PathName + If Not IsDBNull(DescSysDrv) Then + If DescSysDrv = "VirtualBox Guest Driver" Or DescSysDrv = "VirtualBox Guest Mouse Service" Or DescSysDrv = "VirtualBox Shared Folders" Or DescSysDrv = "VBoxVideo" Then + 'test + Return "Win32_SystemDriver ==> SysDrv.Description ==> " & DescSysDrv + End If + End If + + If Not IsDBNull(DispSysDrv) Then + If DispSysDrv = "VirtualBox Guest Driver" Or DispSysDrv = "VirtualBox Guest Mouse Service" Or DispSysDrv = "VirtualBox Shared Folders" Or DispSysDrv = "VBoxVideo" Then + 'test + Return "Win32_SystemDriver ==> SysDrv.DisplayName ==> " & DispSysDrv + End If + End If + + If Not IsDBNull(NameSysDrv) Then + If NameSysDrv = "VBoxGuest" Or NameSysDrv = "VBoxMouse" Or NameSysDrv = "VBoxSF" Or NameSysDrv = "VBoxVideo" Then + 'test + Return "Win32_SystemDriver ==> SysDrv.Name ==> " & NameSysDrv + End If + End If + + If Not IsDBNull(PathSysDrv) Then + Dim PathSysDrv_l = LCase(PathSysDrv) + If InStr(1, PathSysDrv_l, "vboxguest.sys") > 0 Or InStr(1, PathSysDrv_l, "vboxmouse.sys") > 0 Or InStr(1, PathSysDrv_l, "vboxsf.sys") > 0 Or InStr(1, PathSysDrv_l, "vboxvideo.sys") > 0 Then + 'test + Return "Win32_SystemDriver ==> SysDrv.PathName ==> " & PathSysDrv + End If + End If + Next + + For Each EvtLogX In .ExecQuery("SELECT * FROM Win32_NTEventlogFile") + If Not IsDBNull(EvtLogX) Then + Dim FileNameEvtX = CStr(EvtLogX.FileName) + Dim FileNameEvtX_l = LCase(FileNameEvtX) + If FileNameEvtX_l = "sysevent" Or FileNameEvtX_l = "system" Then + Dim SourcesEvtX = EvtLogX.Sources + For Each SourceEvtX In SourcesEvtX + Dim SourceEvtX_l = LCase(CStr(SourceEvtX)) + If SourceEvtX_l = "vboxvideo" Then + 'test + Return "Win32_NTEventlogFile ==> EvtLogX.Sources ==> " & SourceEvtX + End If + Next + End If + End If + Next + + + For Each Bios In .ExecQuery("SELECT * FROM Win32_BIOS") + If Not IsDBNull(Bios) Then + If Not IsDBNull(Bios.Manufacturer) Then + Dim ManufacturerBios = LCase(CStr(Bios.Manufacturer)) + If InStr(1, ManufacturerBios, "innotek gmbh") > 0 Then + 'test + Return "Win32_BIOS ==> Bios.Manufacturer ==> " & Bios.Manufacturer + End If + End If + If Not IsDBNull(Bios.SMBIOSBIOSVersion) Then + Dim SMBIOSBIOSVersionBios = LCase(CStr(Bios.SMBIOSBIOSVersion)) + If InStr(1, SMBIOSBIOSVersionBios, "virtualbox") > 0 Then + + Return "Win32_BIOS ==> Bios.SMBIOSBIOSVersion ==> " & Bios.SMBIOSBIOSVersion + End If + End If + If Not IsDBNull(Bios.Version) Then + Dim VersionBios = LCase(CStr(Bios.Version)) + If InStr(1, VersionBios, "vbox - 1") > 0 Then + 'test + Return "Win32_BIOS ==> Bios.Version ==> " & Bios.Version + End If + End If + End If + Next + + For Each DiskDrive In .ExecQuery("SELECT * FROM Win32_DiskDrive") + If Not IsDBNull(DiskDrive) Then + If Not IsDBNull(DiskDrive.Model) Then + Dim ModelDskDrv = LCase(DiskDrive.Model) + If ModelDskDrv = "vbox harddisk" Then + 'test + Return "Win32_DiskDrive ==> DiskDrive.Model ==> " & DiskDrive.Model + End If + End If + If Not IsDBNull(DiskDrive.PNPDeviceID) Then + Dim PNPDeviceIDDskDrv = LCase(DiskDrive.PNPDeviceID) + If InStr(1, PNPDeviceIDDskDrv, "diskvbox") > 0 Then + 'test + Return "Win32_DiskDrive ==> DiskDrive.PNPDeviceID ==> " & DiskDrive.PNPDeviceID + End If + End If + End If + Next + + For Each Startup In .ExecQuery("SELECT * FROM Win32_StartupCommand") + If Not IsDBNull(Startup) Then + If Not IsDBNull(Startup.Caption) Then + Dim CaptionStartup = LCase(CStr(Startup.Caption)) + If CaptionStartup = "vboxtray" Then + 'test + Return "Win32_StartupCommand ==> Startup.Caption ==> " & Startup.Caption + End If + End If + If Not IsDBNull(Startup.Command) Then + Dim CommandStartup = LCase(CStr(Startup.Command)) + If InStr(1, CommandStartup, "vboxtray.exe") > 0 Then + 'test + Return "Win32_StartupCommand ==> Startup.Command ==> " & Startup.Command + End If + End If + If Not IsDBNull(Startup.Description) Then + Dim DescStartup = LCase(CStr(Startup.Description)) + If DescStartup = "vboxtray" Then + + Return "Win32_StartupCommand ==> Startup.Description ==> " & Startup.Description + End If + End If + End If + Next + + For Each ComputerSystem In .ExecQuery("SELECT * FROM Win32_ComputerSystem") + If Not IsDBNull(ComputerSystem) Then + If Not IsDBNull(ComputerSystem.Manufacturer) Then + Dim ManufacturerComputerSystem = LCase(CStr(ComputerSystem.Manufacturer)) + If ManufacturerComputerSystem = "innotek gmbh" Then + 'test + Return "Win32_ComputerSystem ==> ComputerSystem.Manufacturer ==> " & ComputerSystem.Manufacturer + End If + End If + If Not IsDBNull(ComputerSystem.Model) Then + Dim ModelComputerSystem = LCase(CStr(ComputerSystem.Model)) + If ModelComputerSystem = "virtualbox" Then + + Return "Win32_ComputerSystem ==> ComputerSystem.Model ==> " & ComputerSystem.Model + End If + End If + If Not IsDBNull(ComputerSystem.OEMStringArray) Then + Dim OEMStringArrayComputerSystem = ComputerSystem.OEMStringArray + For Each OEM In OEMStringArrayComputerSystem + Dim OEM_l = LCase(OEM) + If InStr(1, OEM_l, "vboxver_") > 0 Or InStr(1, OEM_l, "vboxrev_") > 0 Then + 'test + Return "Win32_ComputerSystem ==> ComputerSystem.OEMStringArray ==> " & OEM + End If + Next + End If + End If + Next + + + For Each Service In .ExecQuery("SELECT * FROM Win32_Service") + If Not IsDBNull(Service) Then + If Not IsDBNull(Service.Caption) Then + Dim CaptionService = LCase(CStr(Service.Caption)) + If CaptionService = "virtualbox guest additions service" Then + 'test + Return "Win32_Service ==> Service.Caption ==> " & Service.Caption + End If + End If + If Not IsDBNull(Service.DisplayName) Then + Dim DisplayNameService = LCase(CStr(Service.DisplayName)) + If DisplayNameService = "virtualbox guest additions service" Then + 'test + Return "Win32_Service ==> Service.DisplayName ==> " & Service.DisplayName + End If + End If + If Not IsDBNull(Service.Name) Then + Dim NameService = LCase(CStr(Service.Name)) + If NameService = "vboxservice" Then + 'test + Return "Win32_Service ==> Service.Name ==> " & Service.Name + End If + End If + If Not IsDBNull(Service.PathName) Then + Dim PathNameService = LCase(CStr(Service.PathName)) + If InStr(1, PathNameService, "vboxservice.exe") > 0 Then + 'test + Return "Win32_Service ==> Service.PathName ==> " & Service.PathName + End If + End If + End If + Next + + + For Each LogicalDisk In .ExecQuery("SELECT * FROM Win32_LogicalDisk") + If Not IsDBNull(LogicalDisk) Then + If Not IsDBNull(LogicalDisk.DriveType) Then + If LogicalDisk.DriveType = 3 Then + If Not IsDBNull(LogicalDisk.VolumeSerialNumber) Then + Dim VolumeSerialNumberLogicalDisk = LCase(LogicalDisk.VolumeSerialNumber) + If VolumeSerialNumberLogicalDisk = "fceae0a3" Then + 'test + Return "Win32_LogicalDisk ==> LogicalDisk.VolumeSerialNumber ==> " & LogicalDisk.VolumeSerialNumber + End If + End If + ElseIf LogicalDisk.DriveType = 5 Then + If Not IsDBNull(LogicalDisk.VolumeName) Then + Dim VolumeNameLogicalDisk = LCase(LogicalDisk.VolumeName) + 'Volume name should be "VBOXADDITIONS_4." + If InStr(1, VolumeNameLogicalDisk, "vboxadditions") > 0 Then + + Return "Win32_LogicalDisk ==> LogicalDisk.VolumeName ==> " & LogicalDisk.VolumeName + End If + End If + End If + End If + End If + Next + + '////////////////////////////////////////////////////////////////////////// + + + For Each LocalProgramGroup In .ExecQuery("SELECT * FROM Win32_LogicalProgramGroup") + If Not IsDBNull(LocalProgramGroup) Then + Dim NameLocalProgramGroup = LCase(LocalProgramGroup.Name) + If InStr(1, NameLocalProgramGroup, "oracle vm virtualbox guest additions") > 0 Then + 'test + Return "Win32_LogicalProgramGroup ==> LocalProgramGroup.Name ==> " & LocalProgramGroup.Name + End If + End If + Next + + + + 'Win32_NetworkAdapter aka NIC + For Each NIC_x In .ExecQuery("SELECT * FROM Win32_NetworkAdapter") + If Not IsDBNull(NIC_x.MACAddress) And Not IsDBNull(NIC_x.Description) Then + Dim MacAddress_x = LCase(CStr(NIC_x.MACAddress)) + Dim Description_x = LCase(CStr(NIC_x.Description)) + 'We want to detect the VirtualBox guest, not the host + If InStr(1, MacAddress_x, "08:00:27:") = 1 And InStr(1, Description_x, "virtualbox") = 0 Then + 'test + Return "Wow: Win32_NetworkAdapter ==> NIC.MacAddress: " & NIC_x.MACAddress + End If + End If + Next + + + 'Win32_Process aka process + For Each Process In .ExecQuery("SELECT * FROM Win32_Process") + If Not IsDBNull(Process) Then + If Not IsDBNull(Process.Description) Then + Dim DescProcess = LCase(Process.Description) + If DescProcess = "vboxservice.exe" Or DescProcess = "vboxtray.exe" Then + 'test + Return "Win32_Process ==> Process.Description ==> " & Process.Description + End If + End If + If Not IsDBNull(Process.Name) Then + Dim NameProcess = LCase(Process.Name) + If NameProcess = "vboxservice.exe" Or NameProcess = "vboxtray.exe" Then + ''test "Win32_Process ==> Process.Name ==> " & Process.Name + Return True + End If + End If + If Not IsDBNull(Process.CommandLine) Then + Dim CmdProcess = LCase(Process.CommandLine) + If InStr(1, CmdProcess, "vboxservice.exe") > 0 Or InStr(1, CmdProcess, "vboxtray.exe") > 0 Then + 'test + Return "Win32_Service ==> Process.CommandLine ==> " & Process.CommandLine + End If + End If + If Not IsDBNull(Process.ExecutablePath) Then + Dim ExePathProcess = LCase(Process.ExecutablePath) + If InStr(1, ExePathProcess, "vboxservice.exe") > 0 Or InStr(1, ExePathProcess, "vboxtray.exe") > 0 Then + ''test + Return "Win32_Service ==> Process.ExecutablePath ==> " & Process.ExecutablePath + End If + End If + End If + Next + + 'Win32_BaseBoard aka BaseBoard + + For Each BaseBoard In .ExecQuery("SELECT * FROM Win32_BaseBoard") + If Not IsDBNull(BaseBoard) Then + If Not IsDBNull(BaseBoard.Manufacturer) Then + Dim ManufacturerBaseBoard = LCase(BaseBoard.Manufacturer) + If ManufacturerBaseBoard = "oracle corporation" Then + ''test + Return "Win32_BaseBoard ==> BaseBoard.Manufacturer ==> " & BaseBoard.Manufacturer + End If + End If + If Not IsDBNull(BaseBoard.Product) Then + Dim ProductBaseBoard = LCase(BaseBoard.Product) + If ProductBaseBoard = "virtualbox" Then + ''test + Return "Win32_BaseBoard ==> BaseBoard.Product ==> " & BaseBoard.Product + End If + End If + End If + Next + + 'Win32_SystemEnclosure aka SystemEnclosure + + For Each SystemEnclosure In .ExecQuery("SELECT * FROM Win32_SystemEnclosure") + If Not IsDBNull(SystemEnclosure) Then + If Not IsDBNull(SystemEnclosure.Manufacturer) Then + Dim ManufacturerSystemEnclosure = LCase(SystemEnclosure.Manufacturer) + If ManufacturerSystemEnclosure = "oracle corporation" Then + 'test + Return "Win32_SystemEnclosure ==> SystemEnclosure.Manufacturer ==> " & SystemEnclosure.Manufacturer + End If + End If + End If + Next + + 'Win32_CDROMDrive aka cdrom + For Each CDRom In .ExecQuery("SELECT * FROM Win32_CDROMDrive") + If Not IsDBNull(CDRom) Then + If Not IsDBNull(CDRom.Name) Then + Dim NameCDRom = LCase(CDRom.Name) + If NameCDRom = "vbox cd-rom" Then + 'test + Return "Win32_CDROMDrive ==> CDRom.Name ==> " & CDRom.Name + End If + End If + If Not IsDBNull(CDRom.VolumeName) Then + Dim VolumeNameCDRom = LCase(CDRom.VolumeName) + 'Volume name should be "VBOXADDITIONS_4." + If InStr(1, VolumeNameCDRom, "vboxadditions") > 0 Then + 'test + Return "Win32_CDROMDrive ==> CDRom.VolumeName ==> " & CDRom.VolumeName + End If + End If + If Not IsDBNull(CDRom.DeviceID) Then + Dim DeviceIDCDRom = LCase(CDRom.DeviceID) + If InStr(1, DeviceIDCDRom, "cdromvbox") > 0 Then + 'test + Return "Win32_CDROMDrive ==> CDRom.DeviceID ==> " & CDRom.DeviceID + End If + End If + If Not IsDBNull(CDRom.PNPDeviceID) Then + Dim PNPDeviceIDCDRom = LCase(CDRom.PNPDeviceID) + If InStr(1, PNPDeviceIDCDRom, "cdromvbox") > 0 Then + + Return "Win32_CDROMDrive ==> CDRom.PNPDeviceID ==> " & CDRom.PNPDeviceID + End If + End If + End If + Next + + + 'WIN32_NetworkClient aka netclient + For Each NetClient In .ExecQuery("SELECT * FROM WIN32_NetworkClient") + If Not IsDBNull(NetClient) Then + If Not IsDBNull(NetClient.Description) Then + Dim DescNetClient = LCase(NetClient.Description) + If DescNetClient = "vboxsf" Then + 'test + Return "WIN32_NetworkClient ==> NetClient.Description ==> " & NetClient.Description + End If + End If + If Not IsDBNull(NetClient.Manufacturer) Then + Dim ManufacturerNetClient = LCase(NetClient.Manufacturer) + If ManufacturerNetClient = "oracle corporation" Then + 'test + Return "WIN32_NetworkClient ==> NetClient.Manufacturer ==> " & NetClient.Manufacturer + End If + End If + If Not IsDBNull(NetClient.Name) Then + Dim NameNetClient = LCase(NetClient.Name) + If NameNetClient = "virtualbox shared folders" Then + 'test + Return "WIN32_NetworkClient ==> NetClient.Name ==> " & NetClient.Name + End If + End If + End If + Next + + 'Win32_ComputerSystemProduct aka csproduct + + For Each CSProduct In .ExecQuery("SELECT * FROM Win32_ComputerSystemProduct") + If Not IsDBNull(CSProduct) Then + If Not IsDBNull(CSProduct.Name) Then + Dim NameCSProduct = LCase(CSProduct.Name) + If NameCSProduct = "virtualbox" Then + 'test + Return "Win32_ComputerSystemProduct ==> CSProduct.Name ==> " & CSProduct.Name + End If + End If + If Not IsDBNull(CSProduct.Vendor) Then + Dim VendorCSProduct = LCase(CSProduct.Vendor) + If VendorCSProduct = "innotek gmbh" Then + 'test + Return "Win32_ComputerSystemProduct ==> CSProduct.Vendor ==> " & CSProduct.Vendor + End If + End If + End If + Next + + 'Win32_VideoController + + For Each VideoController In .ExecQuery("SELECT * FROM Win32_VideoController") + If Not IsDBNull(VideoController) Then + If Not IsDBNull(VideoController.Name) Then + Dim NameVideoController = LCase(VideoController.Name) + If NameVideoController = "virtualbox graphics adapter" Then + 'test + Return "Win32_VideoController ==> VideoController.Name ==> " & VideoController.Name + End If + End If + If Not IsDBNull(VideoController.Description) Then + Dim DescVideoController = LCase(VideoController.Description) + If DescVideoController = "virtualbox graphics adapter" Then + 'test + Return "Win32_VideoController ==> VideoController.Description ==> " & VideoController.Description + End If + End If + If Not IsDBNull(VideoController.Caption) Then + Dim CaptionVideoController = LCase(VideoController.Caption) + If CaptionVideoController = "virtualbox graphics adapter" Then + 'test + Return "Win32_VideoController ==> VideoController.Caption ==> " & VideoController.Caption + End If + End If + If Not IsDBNull(VideoController.VideoProcessor) Then + Dim VideoProcessorVideoController = LCase(VideoController.VideoProcessor) + If VideoProcessorVideoController = "vbox" Then + + Return "Win32_VideoController ==> VideoController.VideoProcessor ==> " & VideoController.VideoProcessor + End If + End If + If Not IsDBNull(VideoController.InstalledDisplayDrivers) Then + Dim InstalledDisplayDriversVideoController = LCase(VideoController.InstalledDisplayDrivers) + If InstalledDisplayDriversVideoController = "vboxdisp.sys" Then + 'test + Return "Win32_VideoController ==> VideoController.InstalledDisplayDrivers ==> " & VideoController.InstalledDisplayDrivers + End If + End If + If Not IsDBNull(VideoController.InfSection) Then + Dim InfSectionVideoController = LCase(VideoController.InfSection) + If InfSectionVideoController = "vboxvideo" Then + 'test + Return "Win32_VideoController ==> VideoController.InfSection ==> " & VideoController.InfSection + End If + End If + If Not IsDBNull(VideoController.AdapterCompatibility) Then + Dim AdapterCompatibilityVideoController = LCase(VideoController.AdapterCompatibility) + If AdapterCompatibilityVideoController = "oracle corporation" Then + 'test + Return "Win32_VideoController ==> VideoController.AdapterCompatibility ==> " & VideoController.AdapterCompatibility + End If + End If + End If + Next + + + 'Win32_PnPEntity + + For Each PnPEntity In .ExecQuery("SELECT * FROM Win32_PnPEntity") + If Not IsDBNull(PnPEntity) Then + If Not IsDBNull(PnPEntity.Name) Then + Dim NamePnPEntity = LCase(PnPEntity.Name) + If NamePnPEntity = "virtualbox device" Or NamePnPEntity = "vbox harddisk" Or NamePnPEntity = "vbox cd-rom" Or NamePnPEntity = "virtualbox graphics adapter" Then + 'test + Return "Win32_PnPEntity ==> PnPEntity.Name ==> " & PnPEntity.Name + End If + End If + If Not IsDBNull(PnPEntity.Caption) Then + Dim CaptionPnPEntity = LCase(PnPEntity.Caption) + If CaptionPnPEntity = "virtualbox device" Or CaptionPnPEntity = "vbox harddisk" Or CaptionPnPEntity = "vbox cd-rom" Or CaptionPnPEntity = "virtualbox graphics adapter" Then + 'test + Return "Win32_PnPEntity ==> PnPEntity.Caption ==> " & PnPEntity.Caption + End If + End If + If Not IsDBNull(PnPEntity.Description) Then + Dim DescPnPEntity = LCase(PnPEntity.Description) + If DescPnPEntity = "virtualbox device" Or DescPnPEntity = "virtualbox graphics adapter" Then + + Return "Win32_PnPEntity ==> PnPEntity.Description ==> " & PnPEntity.Description + End If + End If + If Not IsDBNull(PnPEntity.Service) Then + Dim SrvPnPEntity = LCase(PnPEntity.Service) + If SrvPnPEntity = "vboxguest" Or SrvPnPEntity = "vboxvideo" Then + + Return "Win32_PnPEntity ==> PnPEntity.Service ==> " & PnPEntity.Service + End If + End If + If Not IsDBNull(PnPEntity.DeviceID) Then + Dim DeviceIDPnPEntity = LCase(PnPEntity.DeviceID) + If InStr(1, DeviceIDPnPEntity, "diskvbox_") > 0 Or InStr(1, DeviceIDPnPEntity, "cdromvbox_") > 0 Then + 'test + Return "Win32_PnPEntity ==> PnPEntity.DeviceID ==> " & PnPEntity.DeviceID + End If + End If + If Not IsDBNull(PnPEntity.PNPDeviceID) Then + Dim PNPDeviceIDPnPEntity = LCase(PnPEntity.PNPDeviceID) + If InStr(1, PNPDeviceIDPnPEntity, "diskvbox_") > 0 Or InStr(1, PNPDeviceIDPnPEntity, "cdromvbox_") > 0 Then + 'test + Return "Win32_PnPEntity ==> PnPEntity.PNPDeviceID ==> " & PnPEntity.PNPDeviceID + End If + End If + End If + Next + + 'Win32_NetworkConnection aka NetUse + + For Each NetUse In .ExecQuery("SELECT * FROM Win32_NetworkConnection") + If Not IsDBNull(NetUse) Then + If Not IsDBNull(NetUse.Name) Then + Dim NameNetUse = LCase(NetUse.Name) + If InStr(1, NameNetUse, "vboxsvr") > 0 Then + 'test + Return "Win32_NetworkConnection ==> NetUse.Name ==> " & NetUse.Name + End If + End If + If Not IsDBNull(NetUse.Description) Then + Dim DescNetUse = LCase(NetUse.Description) + If InStr(1, DescNetUse, "virtualbox shared folders") > 0 Then + 'test + Return "Win32_NetworkConnection ==> NetUse.Description ==> " & NetUse.Description + End If + End If + If Not IsDBNull(NetUse.ProviderName) Then + Dim PrvNameNetUse = LCase(NetUse.ProviderName) + If PrvNameNetUse = "virtualbox shared folders" Then + 'test + Return "Win32_NetworkConnection ==> NetUse.ProviderName ==> " & NetUse.ProviderName + End If + End If + + If Not IsDBNull(NetUse.RemoteName) Then + Dim RemoteNameNetUse = LCase(NetUse.RemoteName) + If InStr(1, RemoteNameNetUse, "vboxsvr") > 0 Then + 'test + Return "Win32_NetworkConnection ==> NetUse.RemoteName ==> " & NetUse.RemoteName + End If + End If + If Not IsDBNull(NetUse.RemotePath) Then + Dim RemotePathNetUse = LCase(NetUse.RemotePath) + If InStr(1, RemotePathNetUse, "vboxsvr") > 0 Then + 'test + Return "Win32_NetworkConnection ==> NetUse.RemotePath ==> " & NetUse.RemotePath + End If + End If + End If + Next + + End With + Return "False" + End Function + +#End Region + + End Class +End Namespace + diff --git a/HALOCELauncher/DestroyerCore/DestroyerProtect.vb b/HALOCELauncher/DestroyerCore/DestroyerProtect.vb new file mode 100644 index 0000000..2487802 --- /dev/null +++ b/HALOCELauncher/DestroyerCore/DestroyerProtect.vb @@ -0,0 +1,239 @@ +Imports System.ComponentModel +Imports HALOCELauncher.Destroyer.AntiDebug +Imports HALOCELauncher.Destroyer.AntiAnalysis +Imports HALOCELauncher.Destroyer.AntiVirtualMachine +Imports HALOCELauncher.Destroyer.AntiDump + +Namespace Destroyer.Protect + Public Class DestroyerProtect + +#Region " Properties " + + Private Shared _Process_scanner As ResultType = ResultType.Indeterminate + Public Shared ReadOnly Property Process_scanner As ResultType + Get + Return _Process_scanner + End Get + End Property + + Private Shared _Debugers_scanner As ResultType = ResultType.Indeterminate + Public Shared ReadOnly Property Debugers_scanner As ResultType + Get + Return _Debugers_scanner + End Get + End Property + + Private Shared _VM_scanner As ResultType = ResultType.Indeterminate + Public Shared ReadOnly Property VM_scanner As ResultType + Get + Return _VM_scanner + End Get + End Property + + Private Shared _LogResult As String = String.Empty + Public Shared ReadOnly Property LogResult As String + Get + Return _LogResult + End Get + End Property + + Private Shared _DetectDescription As String = String.Empty + Public Shared ReadOnly Property DetectDescription As String + Get + Return _DetectDescription + End Get + End Property + +#End Region + +#Region " Types " + + Public Enum ResultType + Secure = 0 + Danger = 1 + Indeterminate = 2 + IError = 3 + End Enum + + Public Enum VMScanType + By_Directory_Known = 0 + By_Generalized_Name = 1 + None = 2 + End Enum + +#End Region + +#Region " Methods " + + Private Shared Pscan As MainAnalysis.SearchType + Private Shared Dscan As MainDebug.DebugDetectionTypes + Private Shared VMscan As VMScanType + Private Shared tmrFormMonitor As System.Windows.Forms.Timer = New System.Windows.Forms.Timer() + + Public Shared Sub Start(ByVal ProcessScan As MainAnalysis.SearchType, ByVal DebugScan As MainDebug.DebugDetectionTypes, _ + ByVal VMScanType As VMScanType, Optional EnableAntiDump As Boolean = False, Optional MainForm As Form = Nothing) + Execution_Start() + _Process_scanner = ResultType.Indeterminate + _Debugers_scanner = ResultType.Indeterminate + _VM_scanner = ResultType.Indeterminate + Pscan = ProcessScan + Dscan = DebugScan + VMscan = VMScanType + If EnableAntiDump = True Then + MainDump.AntiDumpEnabled(MainForm) + _LogResult += MainDump.LogResult & vbNewLine + End If + AddHandler tmrFormMonitor.Tick, New System.EventHandler(AddressOf tmrFormMonitor_Tick) + tmrFormMonitor.Interval = 100 + tmrFormMonitor.Enabled = True + Dim t = New System.Threading.Thread(New System.Threading.ThreadStart(AddressOf StartAnalisys)) + t.Start() + End Sub + + Private Shared Sub tmrFormMonitor_Tick(ByVal sender As Object, ByVal e As EventArgs) + If VMscan = VMScanType.By_Generalized_Name Then + Dim VMDetection As OldAntiVM.ResultType = OldAntiVM.IsVirtualMachinePresent + Dim VMDescription As String = OldAntiVM.DescriptcionVM + + If VMDetection = OldAntiVM.ResultType.Danger Then + _VM_scanner = ResultType.Danger + _DetectDescription += "Virtual Machine Detected : " & VMDescription & vbNewLine + Execution_End() + tmrFormMonitor.Enabled = False + ElseIf VMDetection = OldAntiVM.ResultType.Secure Then + _VM_scanner = ResultType.Secure + Execution_End() + tmrFormMonitor.Enabled = False + End If + End If + End Sub + + Private Shared Sub StartAnalisys() + + If Not Pscan = MainAnalysis.SearchType.None Then + If MainAnalysis.Malicious_Processes_Found(Pscan) = True Then + _Process_scanner = ResultType.Danger + _DetectDescription += MainAnalysis.LogResult & vbNewLine + Else + _Process_scanner = ResultType.Secure + End If + End If + + If Not Dscan = MainDebug.DebugDetectionTypes.None Then + + If MainDebug.Debugger_Check(Dscan) = True Then + _Debugers_scanner = ResultType.Danger + _DetectDescription += MainDebug.LogResult & vbNewLine + Else + _Debugers_scanner = ResultType.Secure + End If + + End If + + If Not VMscan = VMScanType.None Then + If VMscan = VMScanType.By_Directory_Known Then + If MainVM.VirtualMachine_Check() = True Then + _VM_scanner = ResultType.Danger + _DetectDescription += MainVM.LogResult & vbNewLine + Else + _VM_scanner = ResultType.Secure + End If + Execution_End() + ElseIf VMscan = VMScanType.By_Generalized_Name Then + OldAntiVM.VM_Start() + End If + End If + + End Sub + + Private Shared PscanMonitor As MainAnalysis.SearchType + Private Shared DscanMonitor As MainDebug.DebugDetectionTypes + + Public Shared Sub MonitorAsync(ByVal ProcessMonitoreScan As MainAnalysis.SearchType, ByVal DebugMonitoreScan As MainDebug.DebugDetectionTypes, Optional VmScanAsyncro As VMScanType = VMScanType.None) + _Process_scanner = ResultType.Indeterminate + _Debugers_scanner = ResultType.Indeterminate + PscanMonitor = ProcessMonitoreScan + DscanMonitor = DebugMonitoreScan + If Not VmScanAsyncro = VMScanType.None Then + VMscan = VmScanAsyncro + AddHandler tmrFormMonitor.Tick, New System.EventHandler(AddressOf tmrFormMonitor_Tick) + tmrFormMonitor.Interval = 100 + tmrFormMonitor.Enabled = True + End If + Dim EngineThread As New Task(ProcessAsyncMonitoring, TaskCreationOptions.LongRunning) + EngineThread.Start() + Execution_Start() + End Sub + + Private Shared ProcessAsyncMonitoring As New Action( + Sub() + Do While True + + If Not PscanMonitor = MainAnalysis.SearchType.None Then + If MainAnalysis.Malicious_Processes_Found(PscanMonitor) = True Then + _DetectDescription += MainAnalysis.LogResult & vbNewLine + _Process_scanner = ResultType.Danger + Execution_End() + End If + End If + + If Not DscanMonitor = MainDebug.DebugDetectionTypes.None Then + If MainDebug.Debugger_Check(DscanMonitor) = True Then + _DetectDescription += MainDebug.LogResult & vbNewLine + _Debugers_scanner = ResultType.Danger + Execution_End() + End If + End If + + If Not VMscan = VMScanType.None Then + If VMscan = VMScanType.By_Directory_Known Then + If MainVM.VirtualMachine_Check() = True Then + _DetectDescription += MainVM.LogResult & vbNewLine + _VM_scanner = ResultType.Danger + Else + _VM_scanner = ResultType.Secure + End If + Execution_End() + ElseIf VMscan = VMScanType.By_Generalized_Name Then + OldAntiVM.VM_Start() + End If + End If + + Loop + End Sub) + +#End Region + +#Region " Execution Time " + + ' [ Code Execution Time ] + ' + ' Examples : + ' Execution_Start() : Threading.Thread.Sleep(500) : Execution_End() + + Private Shared Execution_Watcher As New Stopwatch + + Private Shared Sub Execution_Start() + If Execution_Watcher.IsRunning Then Execution_Watcher.Restart() + Execution_Watcher.Start() + End Sub + + Private Shared Sub Execution_End() + If Execution_Watcher.IsRunning Then + _LogResult += vbNewLine + _LogResult += " +Elapsed Time: " & Execution_Watcher.Elapsed.Hours & "h" & _ + ":" & Execution_Watcher.Elapsed.Minutes & "m" & _ + ":" & Execution_Watcher.Elapsed.Seconds & "s" & _ + ":" & Execution_Watcher.Elapsed.Milliseconds & "ms" & vbNewLine & vbNewLine + Execution_Watcher.Reset() + Else + + + End If + End Sub + +#End Region + + End Class +End Namespace + diff --git a/HALOCELauncher/DestroyerCore/DirAnalysis/MainDirScan.vb b/HALOCELauncher/DestroyerCore/DirAnalysis/MainDirScan.vb new file mode 100644 index 0000000..e963206 --- /dev/null +++ b/HALOCELauncher/DestroyerCore/DirAnalysis/MainDirScan.vb @@ -0,0 +1,65 @@ +Imports System.IO + +Namespace Destroyer + + Public Class MainDirScan + +#Region " Properties " + + Private Shared _LogResult As String = String.Empty + Public Shared ReadOnly Property LogResult As String + Get + Return _LogResult + End Get + End Property + +#End Region + +#Region " Declare's " + + Dim MaliciusFolderName() As String = {"de4dot", _ + "dnSpy"} + + Public ReadOnly Property ResultDirScan As Boolean + Get + Return MaliciousDir() + End Get + End Property + +#End Region + +#Region " Methods " + + Public Function MaliciousDir() As Boolean + Dim DirRoaming As List(Of String) = GetFolders(GetAppDataPath()) + + For Each FolderPth As String In DirRoaming + Dim FolderN As String = LCase(System.IO.Path.GetFileName(FolderPth)) + For Each FolderMname As String In MaliciusFolderName + If CheckString(FolderN, LCase(FolderMname)) = True Then + _LogResult = "Malicious path detected: " & FolderPth & vbNewLine + Return True + End If + Next + Next + + Return False + End Function + + Private Function CheckString(ByVal Foldername As String, ByVal FolderIdent As String) + Return Foldername.Contains(FolderIdent) + End Function + + Private Function GetFolders(ByVal DirP As String) As List(Of String) + Return FileDirSearcher.GetDirPaths(DirP, SearchOption.TopDirectoryOnly).ToList + End Function + + Private Function GetAppDataPath() As String + Return Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + End Function + +#End Region + + End Class + +End Namespace diff --git a/HALOCELauncher/DestroyerCore/Exploits.vb b/HALOCELauncher/DestroyerCore/Exploits.vb new file mode 100644 index 0000000..5a11628 --- /dev/null +++ b/HALOCELauncher/DestroyerCore/Exploits.vb @@ -0,0 +1,43 @@ +Imports System.Runtime.InteropServices + +' *********************************************************************** +' Author : Destroyer +' Last Modified On : 10-09-2020 +' Discord : Destroyer#8328 +' *********************************************************************** +' <copyright file="Exploits.vb" company="S4Lsalsoft"> +' Copyright (c) S4Lsalsoft. All rights reserved. +' </copyright> +' *** + +Namespace Destroyer + + Public Class Exploits + +#Region " Pinvoke's " + + <DllImport("kernel32.dll")> _ + Public Shared Sub OutputDebugString(ByVal lpOutputString As String) + End Sub + +#End Region + + Public Shared Sub OllyOldExploit() + Dim tsk As New Task(ServerLister, TaskCreationOptions.LongRunning) + tsk.Start() + End Sub + + Private Shared ServerLister As New Action( + Sub() + Dim TEXT As String = "%s%s%s%s%s%s%s%s%s%s%s%s%s" + For i As Integer = 0 To 2 + OutputDebugString(String.Format(TEXT)) + i -= 1 + Next + End Sub) + + + End Class + +End Namespace + diff --git a/HALOCELauncher/DestroyerCore/Utils.vb b/HALOCELauncher/DestroyerCore/Utils.vb new file mode 100644 index 0000000..b5a502e --- /dev/null +++ b/HALOCELauncher/DestroyerCore/Utils.vb @@ -0,0 +1,215 @@ +Imports System.Threading +Imports System.IO +Imports System.Text + +Namespace Destroyer + Public Class Utils + +#Region " Auto-Delete " + + ''' ---------------------------------------------------------------------------------------------------- + ''' <summary> + ''' Deletes the self application executable file. + ''' </summary> + ''' ---------------------------------------------------------------------------------------------------- + Public Shared Sub DeleteSelfApplication(Optional ByVal Secons As Integer = 0) + DeleteSelfApplication(TimeSpan.FromMilliseconds(Secons)) + End Sub + + ''' ---------------------------------------------------------------------------------------------------- + ''' <summary> + ''' Deletes the self application executable file. + ''' </summary> + ''' ---------------------------------------------------------------------------------------------------- + ''' <param name="delay"> + ''' A delay interval to wait (asynchronously) before proceeding to automatic deletion. + ''' </param> + ''' ---------------------------------------------------------------------------------------------------- + Private Shared Async Sub DeleteSelfApplication(ByVal delay As TimeSpan) + + If (delay.TotalMilliseconds > 0.0R) Then + Dim t As New Task(Sub() Thread.Sleep(delay)) + t.Start() + Await t + End If + + Dim script As String = <a> +@Echo OFF + +Set "exeName=%~nx1" +Set "exePath=%~f1" + +:KillProcessAndDeleteExe +(TaskKill.exe /F /IM "%exeName%")1>NUL 2>&1 +If NOT Exist "%exePath%" (GoTo :SelfDelete) +(DEL /Q /F "%exePath%") || (GoTo :KillProcessAndDeleteExe) + +:SelfDelete +(DEL /Q /F "%~f0") +</a>.Value + + Dim tmpFile As New FileInfo(Path.Combine(Path.GetTempPath, Path.GetTempFileName)) + tmpFile.MoveTo(Path.Combine(tmpFile.DirectoryName, tmpFile.Name & ".cmd")) + tmpFile.Refresh() + File.WriteAllText(tmpFile.FullName, script, Encoding.Default) + + Using p As New Process() + With p.StartInfo + .FileName = tmpFile.FullName + .Arguments = String.Format(" ""{0}"" ", Application.ExecutablePath) + .WindowStyle = ProcessWindowStyle.Hidden + .CreateNoWindow = True + End With + p.Start() + p.WaitForExit(0) + End Using + + Environment.Exit(0) + + End Sub + +#End Region + +#Region " CMD Messages " + + ''' <summary> + ''' Execute CMD with message And Config Console Size. + ''' </summary> + Public Shared Sub CmdMessage(ByVal Msg As String, Optional ByVal ConsoleSize As Size = Nothing) + If ConsoleSize = Nothing Then + ConsoleSize = New Size(70, 9) + End If + Dim startInfo As New ProcessStartInfo + startInfo.FileName = "cmd.exe" + startInfo.Arguments = "/c MODE CON cols=" & ConsoleSize.Width & " lines=" & ConsoleSize.Height & " & echo " & Msg & " & pause" + Process.Start(startInfo) + End Sub + +#End Region + +#Region " Create Report " + + Public Shared Sub GenerateReport(ByVal Content As String, ByVal EncryptReport As Boolean, Optional ByVal PasswordCrypt As String = "Destroyer") + If My.Computer.FileSystem.FileExists("Generic_Report.txt") = True Then + My.Computer.FileSystem.DeleteFile("Generic_Report.txt") + End If + If EncryptReport = True Then + Dim NewContent As String = Encrypt(Content, PasswordCrypt) + File.WriteAllText("Generic_Report.txt", NewContent) + Else + File.WriteAllText("Generic_Report.txt", Content) + End If + End Sub + +#End Region + +#Region " Text Encriptation " + + ''' <summary> + ''' Encrypt text using AES Algorithm + ''' </summary> + ''' <param name="text">Text to encrypt</param> + ''' <param name="password">Password with which to encrypt</param> + ''' <returns>Returns encrypted text</returns> + ''' <remarks></remarks> + Public Shared Function Encrypt(ByVal text As String, ByVal password As String) As String + Dim AES As New System.Security.Cryptography.RijndaelManaged + Dim Hash_AES As New System.Security.Cryptography.MD5CryptoServiceProvider + Dim encrypted As String = "" + Dim hash(31) As Byte + Dim temp As Byte() = Hash_AES.ComputeHash(System.Text.ASCIIEncoding.ASCII.GetBytes(password)) + Array.Copy(temp, 0, hash, 0, 16) + Array.Copy(temp, 0, hash, 15, 16) + AES.Key = hash + AES.Mode = Security.Cryptography.CipherMode.ECB + Dim DESEncrypter As System.Security.Cryptography.ICryptoTransform = AES.CreateEncryptor + Dim Buffer As Byte() = System.Text.ASCIIEncoding.ASCII.GetBytes(text) + encrypted = Convert.ToBase64String(DESEncrypter.TransformFinalBlock(Buffer, 0, Buffer.Length)) + Return encrypted + End Function + + ''' <summary> + ''' Decrypt text using AES Algorithm + ''' </summary> + ''' <param name="text">Text to decrypt</param> + ''' <param name="password">Password with which to decrypt</param> + ''' <returns>Returns decrypted text</returns> + ''' <remarks></remarks> + Public Shared Function Decrypt(ByVal text As String, ByVal password As String) As String + Dim AES As New System.Security.Cryptography.RijndaelManaged + Dim Hash_AES As New System.Security.Cryptography.MD5CryptoServiceProvider + Dim decrypted As String = "" + Dim hash(31) As Byte + Dim temp As Byte() = Hash_AES.ComputeHash(System.Text.ASCIIEncoding.ASCII.GetBytes(password)) + Array.Copy(temp, 0, hash, 0, 16) + Array.Copy(temp, 0, hash, 15, 16) + AES.Key = hash + AES.Mode = Security.Cryptography.CipherMode.ECB + Dim DESDecrypter As System.Security.Cryptography.ICryptoTransform = AES.CreateDecryptor + Dim Buffer As Byte() = Convert.FromBase64String(text) + decrypted = System.Text.ASCIIEncoding.ASCII.GetString(DESDecrypter.TransformFinalBlock(Buffer, 0, Buffer.Length)) + Return decrypted + End Function + +#End Region + +#Region " Process Toolkit " + +#Region " Get Process Handle Function " + + ' [ Get Process Handle Function ] + ' + ' // By Elektro H@cker + ' + ' Examples : + ' MsgBox(Get_Process_Handle("cmd")) + ' MsgBox(Get_Process_Handle("cmd.exe")) + + Private Function Get_Process_Handle(ByVal ProcessName As String) As IntPtr + If ProcessName.ToLower.EndsWith(".exe") Then ProcessName = ProcessName.Substring(0, ProcessName.Length - 4) + Dim ProcessArray = Process.GetProcessesByName(ProcessName) + If ProcessArray.Length = 0 Then Return Nothing Else Return ProcessArray(0).MainWindowHandle + End Function + +#End Region + +#Region " Get Process Window Title Function " + + ' [ Get Process Window Title Function ] + ' + ' // By Elektro H@cker + ' + ' Examples : + ' MsgBox(Get_Process_Window_Title("cmd")) + ' MsgBox(Get_Process_Window_Title("cmd.exe")) + + Private Function Get_Process_Window_Title(ByVal ProcessName As String) As String + If ProcessName.ToLower.EndsWith(".exe") Then ProcessName = ProcessName.Substring(0, ProcessName.Length - 4) + Dim ProcessArray = Process.GetProcessesByName(ProcessName) + If ProcessArray.Length = 0 Then Return Nothing Else Return ProcessArray(0).MainWindowTitle + End Function + +#End Region + +#Region " Get Process PID Function " + + ' [ Get Process PID Function ] + ' + ' // By Elektro H@cker + ' + ' Examples : + ' MsgBox(Get_Process_PID("cmd")) + ' MsgBox(Get_Process_PID("cmd.exe")) + + Private Function Get_Process_PID(ByVal ProcessName As String) As IntPtr + If ProcessName.ToLower.EndsWith(".exe") Then ProcessName = ProcessName.Substring(0, ProcessName.Length - 4) + Dim ProcessArray = Process.GetProcessesByName(ProcessName) + If ProcessArray.Length = 0 Then Return Nothing Else Return ProcessArray(0).Id + End Function + +#End Region + +#End Region + + End Class +End Namespace diff --git a/HALOCELauncher/Form1.Designer.vb b/HALOCELauncher/Form1.Designer.vb new file mode 100644 index 0000000..90b38c2 --- /dev/null +++ b/HALOCELauncher/Form1.Designer.vb @@ -0,0 +1,409 @@ +<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _ +Partial Class Form1 + Inherits System.Windows.Forms.Form + + 'Form overrides dispose to clean up the component list. + <System.Diagnostics.DebuggerNonUserCode()> _ + 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 + + 'Required by the Windows Form Designer + Private components As System.ComponentModel.IContainer + + 'NOTE: The following procedure is required by the Windows Form Designer + 'It can be modified using the Windows Form Designer. + 'Do not modify it using the code editor. + <System.Diagnostics.DebuggerStepThrough()> _ + Private Sub InitializeComponent() + Me.components = New System.ComponentModel.Container() + Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(Form1)) + Me.MonitorTimer1 = New System.Windows.Forms.Timer(Me.components) + Me.PanelFX1 = New HALOCELauncher.PanelFX() + Me.GunaControlBox2 = New Guna.UI.WinForms.GunaControlBox() + Me.GunaButton1 = New Guna.UI.WinForms.GunaButton() + Me.GunaVSeparator1 = New Guna.UI.WinForms.GunaVSeparator() + Me.GunaPictureBox2 = New Guna.UI.WinForms.GunaPictureBox() + Me.GunaCirclePictureBox1 = New Guna.UI.WinForms.GunaCirclePictureBox() + Me.GunaControlBox1 = New Guna.UI.WinForms.GunaControlBox() + Me.PanelContainer = New Guna.UI.WinForms.GunaPanel() + Me.GunaPanel2 = New Guna.UI.WinForms.GunaPanel() + Me.nav_settings = New Guna.UI.WinForms.GunaAdvenceButton() + Me.nav_tools = New Guna.UI.WinForms.GunaAdvenceButton() + Me.nav_mods = New Guna.UI.WinForms.GunaAdvenceButton() + Me.nav_servers = New Guna.UI.WinForms.GunaAdvenceButton() + Me.nav_home = New Guna.UI.WinForms.GunaAdvenceButton() + Me.PanelFX1.SuspendLayout() + CType(Me.GunaPictureBox2, System.ComponentModel.ISupportInitialize).BeginInit() + CType(Me.GunaCirclePictureBox1, System.ComponentModel.ISupportInitialize).BeginInit() + Me.GunaPanel2.SuspendLayout() + Me.SuspendLayout() + ' + 'MonitorTimer1 + ' + ' + 'PanelFX1 + ' + Me.PanelFX1.BackColor = System.Drawing.Color.FromArgb(CType(CType(25, Byte), Integer), CType(CType(25, Byte), Integer), CType(CType(25, Byte), Integer)) + Me.PanelFX1.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch + Me.PanelFX1.Controls.Add(Me.GunaControlBox2) + Me.PanelFX1.Controls.Add(Me.GunaButton1) + Me.PanelFX1.Controls.Add(Me.GunaVSeparator1) + Me.PanelFX1.Controls.Add(Me.GunaPictureBox2) + Me.PanelFX1.Controls.Add(Me.GunaCirclePictureBox1) + Me.PanelFX1.Controls.Add(Me.GunaControlBox1) + Me.PanelFX1.Controls.Add(Me.PanelContainer) + Me.PanelFX1.Controls.Add(Me.GunaPanel2) + Me.PanelFX1.Dock = System.Windows.Forms.DockStyle.Fill + Me.PanelFX1.Location = New System.Drawing.Point(0, 0) + Me.PanelFX1.Name = "PanelFX1" + Me.PanelFX1.Size = New System.Drawing.Size(842, 495) + Me.PanelFX1.TabIndex = 0 + ' + 'GunaControlBox2 + ' + Me.GunaControlBox2.Anchor = CType((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles) + Me.GunaControlBox2.AnimationHoverSpeed = 0.07! + Me.GunaControlBox2.AnimationSpeed = 0.03! + Me.GunaControlBox2.BackColor = System.Drawing.Color.Transparent + Me.GunaControlBox2.ControlBoxType = Guna.UI.WinForms.FormControlBoxType.MinimizeBox + Me.GunaControlBox2.IconColor = System.Drawing.Color.White + Me.GunaControlBox2.IconSize = 15.0! + Me.GunaControlBox2.Location = New System.Drawing.Point(774, 0) + Me.GunaControlBox2.Name = "GunaControlBox2" + Me.GunaControlBox2.OnHoverBackColor = System.Drawing.Color.SpringGreen + Me.GunaControlBox2.OnHoverIconColor = System.Drawing.Color.White + Me.GunaControlBox2.OnPressedColor = System.Drawing.Color.Black + Me.GunaControlBox2.Size = New System.Drawing.Size(31, 24) + Me.GunaControlBox2.TabIndex = 10 + ' + 'GunaButton1 + ' + Me.GunaButton1.Animated = True + Me.GunaButton1.AnimationHoverSpeed = 0.07! + Me.GunaButton1.AnimationSpeed = 0.03! + Me.GunaButton1.BackColor = System.Drawing.Color.Transparent + Me.GunaButton1.BaseColor = System.Drawing.Color.FromArgb(CType(CType(44, Byte), Integer), CType(CType(50, Byte), Integer), CType(CType(68, Byte), Integer)) + Me.GunaButton1.BorderColor = System.Drawing.Color.White + Me.GunaButton1.BorderSize = 1 + Me.GunaButton1.DialogResult = System.Windows.Forms.DialogResult.None + Me.GunaButton1.FocusedColor = System.Drawing.Color.Empty + Me.GunaButton1.Font = New System.Drawing.Font("Segoe UI", 9.0!) + Me.GunaButton1.ForeColor = System.Drawing.Color.White + Me.GunaButton1.Image = Nothing + Me.GunaButton1.ImageSize = New System.Drawing.Size(20, 20) + Me.GunaButton1.Location = New System.Drawing.Point(597, 11) + Me.GunaButton1.Name = "GunaButton1" + Me.GunaButton1.OnHoverBaseColor = System.Drawing.Color.FromArgb(CType(CType(253, Byte), Integer), CType(CType(87, Byte), Integer), CType(CType(124, Byte), Integer)) + Me.GunaButton1.OnHoverBorderColor = System.Drawing.Color.FromArgb(CType(CType(253, Byte), Integer), CType(CType(87, Byte), Integer), CType(CType(124, Byte), Integer)) + Me.GunaButton1.OnHoverForeColor = System.Drawing.Color.White + Me.GunaButton1.OnHoverImage = Nothing + Me.GunaButton1.OnPressedColor = System.Drawing.Color.Black + Me.GunaButton1.Radius = 15 + Me.GunaButton1.Size = New System.Drawing.Size(86, 28) + Me.GunaButton1.TabIndex = 9 + Me.GunaButton1.Text = "Upgrade" + Me.GunaButton1.TextAlign = System.Windows.Forms.HorizontalAlignment.Center + Me.GunaButton1.Visible = False + ' + 'GunaVSeparator1 + ' + Me.GunaVSeparator1.BackColor = System.Drawing.Color.Transparent + Me.GunaVSeparator1.BackgroundImageLayout = System.Windows.Forms.ImageLayout.None + Me.GunaVSeparator1.LineColor = System.Drawing.Color.SpringGreen + Me.GunaVSeparator1.Location = New System.Drawing.Point(689, 9) + Me.GunaVSeparator1.Name = "GunaVSeparator1" + Me.GunaVSeparator1.Size = New System.Drawing.Size(10, 32) + Me.GunaVSeparator1.TabIndex = 8 + Me.GunaVSeparator1.Visible = False + ' + 'GunaPictureBox2 + ' + Me.GunaPictureBox2.BackColor = System.Drawing.Color.Transparent + Me.GunaPictureBox2.BaseColor = System.Drawing.Color.White + Me.GunaPictureBox2.Image = CType(resources.GetObject("GunaPictureBox2.Image"), System.Drawing.Image) + Me.GunaPictureBox2.Location = New System.Drawing.Point(743, 20) + Me.GunaPictureBox2.Name = "GunaPictureBox2" + Me.GunaPictureBox2.Size = New System.Drawing.Size(12, 12) + Me.GunaPictureBox2.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize + Me.GunaPictureBox2.TabIndex = 7 + Me.GunaPictureBox2.TabStop = False + Me.GunaPictureBox2.Visible = False + ' + 'GunaCirclePictureBox1 + ' + Me.GunaCirclePictureBox1.BackColor = System.Drawing.Color.Transparent + Me.GunaCirclePictureBox1.BaseColor = System.Drawing.Color.White + Me.GunaCirclePictureBox1.Image = CType(resources.GetObject("GunaCirclePictureBox1.Image"), System.Drawing.Image) + Me.GunaCirclePictureBox1.Location = New System.Drawing.Point(705, 9) + Me.GunaCirclePictureBox1.Name = "GunaCirclePictureBox1" + Me.GunaCirclePictureBox1.Size = New System.Drawing.Size(32, 32) + Me.GunaCirclePictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage + Me.GunaCirclePictureBox1.TabIndex = 6 + Me.GunaCirclePictureBox1.TabStop = False + Me.GunaCirclePictureBox1.UseTransfarantBackground = False + Me.GunaCirclePictureBox1.Visible = False + ' + 'GunaControlBox1 + ' + Me.GunaControlBox1.Anchor = CType((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles) + Me.GunaControlBox1.AnimationHoverSpeed = 0.07! + Me.GunaControlBox1.AnimationSpeed = 0.03! + Me.GunaControlBox1.BackColor = System.Drawing.Color.Transparent + Me.GunaControlBox1.IconColor = System.Drawing.Color.White + Me.GunaControlBox1.IconSize = 15.0! + Me.GunaControlBox1.Location = New System.Drawing.Point(811, 0) + Me.GunaControlBox1.Name = "GunaControlBox1" + Me.GunaControlBox1.OnHoverBackColor = System.Drawing.Color.FromArgb(CType(CType(255, Byte), Integer), CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer)) + Me.GunaControlBox1.OnHoverIconColor = System.Drawing.Color.White + Me.GunaControlBox1.OnPressedColor = System.Drawing.Color.Black + Me.GunaControlBox1.Size = New System.Drawing.Size(31, 24) + Me.GunaControlBox1.TabIndex = 4 + ' + 'PanelContainer + ' + Me.PanelContainer.BackColor = System.Drawing.Color.Transparent + Me.PanelContainer.Location = New System.Drawing.Point(12, 45) + Me.PanelContainer.Name = "PanelContainer" + Me.PanelContainer.Size = New System.Drawing.Size(818, 438) + Me.PanelContainer.TabIndex = 3 + ' + 'GunaPanel2 + ' + Me.GunaPanel2.BackColor = System.Drawing.Color.Transparent + Me.GunaPanel2.Controls.Add(Me.nav_settings) + Me.GunaPanel2.Controls.Add(Me.nav_tools) + Me.GunaPanel2.Controls.Add(Me.nav_mods) + Me.GunaPanel2.Controls.Add(Me.nav_servers) + Me.GunaPanel2.Controls.Add(Me.nav_home) + Me.GunaPanel2.Location = New System.Drawing.Point(11, 11) + Me.GunaPanel2.Name = "GunaPanel2" + Me.GunaPanel2.Size = New System.Drawing.Size(568, 28) + Me.GunaPanel2.TabIndex = 2 + ' + 'nav_settings + ' + Me.nav_settings.Animated = True + Me.nav_settings.AnimationHoverSpeed = 0.07! + Me.nav_settings.AnimationSpeed = 0.03! + Me.nav_settings.BaseColor = System.Drawing.Color.Transparent + Me.nav_settings.BorderColor = System.Drawing.Color.Black + Me.nav_settings.ButtonType = Guna.UI.WinForms.AdvenceButtonType.RadioButton + Me.nav_settings.CheckedBaseColor = System.Drawing.Color.Transparent + Me.nav_settings.CheckedBorderColor = System.Drawing.Color.Black + Me.nav_settings.CheckedForeColor = System.Drawing.Color.White + Me.nav_settings.CheckedImage = Nothing + Me.nav_settings.CheckedLineColor = System.Drawing.Color.MediumSpringGreen + Me.nav_settings.DialogResult = System.Windows.Forms.DialogResult.None + Me.nav_settings.Dock = System.Windows.Forms.DockStyle.Left + Me.nav_settings.FocusedColor = System.Drawing.Color.Empty + Me.nav_settings.Font = New System.Drawing.Font("Segoe UI Semibold", 9.0!) + Me.nav_settings.ForeColor = System.Drawing.Color.White + Me.nav_settings.Image = Nothing + Me.nav_settings.ImageSize = New System.Drawing.Size(20, 20) + Me.nav_settings.LineBottom = 2 + Me.nav_settings.LineColor = System.Drawing.Color.Transparent + Me.nav_settings.Location = New System.Drawing.Point(448, 0) + Me.nav_settings.Name = "nav_settings" + Me.nav_settings.OnHoverBaseColor = System.Drawing.Color.Transparent + Me.nav_settings.OnHoverBorderColor = System.Drawing.Color.Black + Me.nav_settings.OnHoverForeColor = System.Drawing.Color.White + Me.nav_settings.OnHoverImage = Nothing + Me.nav_settings.OnHoverLineColor = System.Drawing.Color.MediumSpringGreen + Me.nav_settings.OnPressedColor = System.Drawing.Color.Black + Me.nav_settings.OnPressedDepth = 0 + Me.nav_settings.Size = New System.Drawing.Size(112, 28) + Me.nav_settings.TabIndex = 3 + Me.nav_settings.Text = "Settings" + Me.nav_settings.TextAlign = System.Windows.Forms.HorizontalAlignment.Center + ' + 'nav_tools + ' + Me.nav_tools.Animated = True + Me.nav_tools.AnimationHoverSpeed = 0.07! + Me.nav_tools.AnimationSpeed = 0.03! + Me.nav_tools.BaseColor = System.Drawing.Color.Transparent + Me.nav_tools.BorderColor = System.Drawing.Color.Black + Me.nav_tools.ButtonType = Guna.UI.WinForms.AdvenceButtonType.RadioButton + Me.nav_tools.CheckedBaseColor = System.Drawing.Color.Transparent + Me.nav_tools.CheckedBorderColor = System.Drawing.Color.Black + Me.nav_tools.CheckedForeColor = System.Drawing.Color.White + Me.nav_tools.CheckedImage = Nothing + Me.nav_tools.CheckedLineColor = System.Drawing.Color.MediumSpringGreen + Me.nav_tools.DialogResult = System.Windows.Forms.DialogResult.None + Me.nav_tools.Dock = System.Windows.Forms.DockStyle.Left + Me.nav_tools.FocusedColor = System.Drawing.Color.Empty + Me.nav_tools.Font = New System.Drawing.Font("Segoe UI Semibold", 9.0!) + Me.nav_tools.ForeColor = System.Drawing.Color.White + Me.nav_tools.Image = Nothing + Me.nav_tools.ImageSize = New System.Drawing.Size(20, 20) + Me.nav_tools.LineBottom = 2 + Me.nav_tools.LineColor = System.Drawing.Color.Transparent + Me.nav_tools.Location = New System.Drawing.Point(336, 0) + Me.nav_tools.Name = "nav_tools" + Me.nav_tools.OnHoverBaseColor = System.Drawing.Color.Transparent + Me.nav_tools.OnHoverBorderColor = System.Drawing.Color.Black + Me.nav_tools.OnHoverForeColor = System.Drawing.Color.White + Me.nav_tools.OnHoverImage = Nothing + Me.nav_tools.OnHoverLineColor = System.Drawing.Color.MediumSpringGreen + Me.nav_tools.OnPressedColor = System.Drawing.Color.Black + Me.nav_tools.OnPressedDepth = 0 + Me.nav_tools.Size = New System.Drawing.Size(112, 28) + Me.nav_tools.TabIndex = 4 + Me.nav_tools.Text = "Tools" + Me.nav_tools.TextAlign = System.Windows.Forms.HorizontalAlignment.Center + Me.nav_tools.Visible = False + ' + 'nav_mods + ' + Me.nav_mods.Animated = True + Me.nav_mods.AnimationHoverSpeed = 0.07! + Me.nav_mods.AnimationSpeed = 0.03! + Me.nav_mods.BaseColor = System.Drawing.Color.Transparent + Me.nav_mods.BorderColor = System.Drawing.Color.Black + Me.nav_mods.ButtonType = Guna.UI.WinForms.AdvenceButtonType.RadioButton + Me.nav_mods.CheckedBaseColor = System.Drawing.Color.Transparent + Me.nav_mods.CheckedBorderColor = System.Drawing.Color.Black + Me.nav_mods.CheckedForeColor = System.Drawing.Color.White + Me.nav_mods.CheckedImage = Nothing + Me.nav_mods.CheckedLineColor = System.Drawing.Color.MediumSpringGreen + Me.nav_mods.DialogResult = System.Windows.Forms.DialogResult.None + Me.nav_mods.Dock = System.Windows.Forms.DockStyle.Left + Me.nav_mods.FocusedColor = System.Drawing.Color.Empty + Me.nav_mods.Font = New System.Drawing.Font("Segoe UI Semibold", 9.0!) + Me.nav_mods.ForeColor = System.Drawing.Color.White + Me.nav_mods.Image = Nothing + Me.nav_mods.ImageSize = New System.Drawing.Size(20, 20) + Me.nav_mods.LineBottom = 2 + Me.nav_mods.LineColor = System.Drawing.Color.Transparent + Me.nav_mods.Location = New System.Drawing.Point(224, 0) + Me.nav_mods.Name = "nav_mods" + Me.nav_mods.OnHoverBaseColor = System.Drawing.Color.Transparent + Me.nav_mods.OnHoverBorderColor = System.Drawing.Color.Black + Me.nav_mods.OnHoverForeColor = System.Drawing.Color.White + Me.nav_mods.OnHoverImage = Nothing + Me.nav_mods.OnHoverLineColor = System.Drawing.Color.MediumSpringGreen + Me.nav_mods.OnPressedColor = System.Drawing.Color.Black + Me.nav_mods.OnPressedDepth = 0 + Me.nav_mods.Size = New System.Drawing.Size(112, 28) + Me.nav_mods.TabIndex = 2 + Me.nav_mods.Text = "Mods" + Me.nav_mods.TextAlign = System.Windows.Forms.HorizontalAlignment.Center + Me.nav_mods.Visible = False + ' + 'nav_servers + ' + Me.nav_servers.Animated = True + Me.nav_servers.AnimationHoverSpeed = 0.07! + Me.nav_servers.AnimationSpeed = 0.03! + Me.nav_servers.BaseColor = System.Drawing.Color.Transparent + Me.nav_servers.BorderColor = System.Drawing.Color.Black + Me.nav_servers.ButtonType = Guna.UI.WinForms.AdvenceButtonType.RadioButton + Me.nav_servers.CheckedBaseColor = System.Drawing.Color.Transparent + Me.nav_servers.CheckedBorderColor = System.Drawing.Color.Black + Me.nav_servers.CheckedForeColor = System.Drawing.Color.White + Me.nav_servers.CheckedImage = Nothing + Me.nav_servers.CheckedLineColor = System.Drawing.Color.MediumSpringGreen + Me.nav_servers.DialogResult = System.Windows.Forms.DialogResult.None + Me.nav_servers.Dock = System.Windows.Forms.DockStyle.Left + Me.nav_servers.FocusedColor = System.Drawing.Color.Empty + Me.nav_servers.Font = New System.Drawing.Font("Segoe UI Semibold", 9.0!) + Me.nav_servers.ForeColor = System.Drawing.Color.White + Me.nav_servers.Image = Nothing + Me.nav_servers.ImageSize = New System.Drawing.Size(20, 20) + Me.nav_servers.LineBottom = 2 + Me.nav_servers.LineColor = System.Drawing.Color.Transparent + Me.nav_servers.Location = New System.Drawing.Point(112, 0) + Me.nav_servers.Name = "nav_servers" + Me.nav_servers.OnHoverBaseColor = System.Drawing.Color.Transparent + Me.nav_servers.OnHoverBorderColor = System.Drawing.Color.Black + Me.nav_servers.OnHoverForeColor = System.Drawing.Color.White + Me.nav_servers.OnHoverImage = Nothing + Me.nav_servers.OnHoverLineColor = System.Drawing.Color.MediumSpringGreen + Me.nav_servers.OnPressedColor = System.Drawing.Color.Black + Me.nav_servers.OnPressedDepth = 0 + Me.nav_servers.Size = New System.Drawing.Size(112, 28) + Me.nav_servers.TabIndex = 1 + Me.nav_servers.Text = "Servers" + Me.nav_servers.TextAlign = System.Windows.Forms.HorizontalAlignment.Center + ' + 'nav_home + ' + Me.nav_home.Animated = True + Me.nav_home.AnimationHoverSpeed = 0.07! + Me.nav_home.AnimationSpeed = 0.03! + Me.nav_home.BaseColor = System.Drawing.Color.Transparent + Me.nav_home.BorderColor = System.Drawing.Color.Black + Me.nav_home.ButtonType = Guna.UI.WinForms.AdvenceButtonType.RadioButton + Me.nav_home.Checked = True + Me.nav_home.CheckedBaseColor = System.Drawing.Color.Transparent + Me.nav_home.CheckedBorderColor = System.Drawing.Color.Black + Me.nav_home.CheckedForeColor = System.Drawing.Color.White + Me.nav_home.CheckedImage = Nothing + Me.nav_home.CheckedLineColor = System.Drawing.Color.MediumSpringGreen + Me.nav_home.DialogResult = System.Windows.Forms.DialogResult.None + Me.nav_home.Dock = System.Windows.Forms.DockStyle.Left + Me.nav_home.FocusedColor = System.Drawing.Color.Empty + Me.nav_home.Font = New System.Drawing.Font("Segoe UI Semibold", 9.0!) + Me.nav_home.ForeColor = System.Drawing.Color.White + Me.nav_home.Image = Nothing + Me.nav_home.ImageSize = New System.Drawing.Size(20, 20) + Me.nav_home.LineBottom = 2 + Me.nav_home.LineColor = System.Drawing.Color.Transparent + Me.nav_home.Location = New System.Drawing.Point(0, 0) + Me.nav_home.Name = "nav_home" + Me.nav_home.OnHoverBaseColor = System.Drawing.Color.Transparent + Me.nav_home.OnHoverBorderColor = System.Drawing.Color.Black + Me.nav_home.OnHoverForeColor = System.Drawing.Color.White + Me.nav_home.OnHoverImage = Nothing + Me.nav_home.OnHoverLineColor = System.Drawing.Color.MediumSpringGreen + Me.nav_home.OnPressedColor = System.Drawing.Color.Black + Me.nav_home.OnPressedDepth = 0 + Me.nav_home.Size = New System.Drawing.Size(112, 28) + Me.nav_home.TabIndex = 0 + Me.nav_home.Text = "Home" + Me.nav_home.TextAlign = System.Windows.Forms.HorizontalAlignment.Center + ' + 'Form1 + ' + Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) + Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font + Me.BackColor = System.Drawing.Color.FromArgb(CType(CType(14, Byte), Integer), CType(CType(14, Byte), Integer), CType(CType(14, Byte), Integer)) + Me.ClientSize = New System.Drawing.Size(842, 495) + Me.Controls.Add(Me.PanelFX1) + Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None + Me.Icon = CType(resources.GetObject("$this.Icon"), System.Drawing.Icon) + Me.Name = "Form1" + Me.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen + Me.Text = "HLPCE" + Me.PanelFX1.ResumeLayout(False) + Me.PanelFX1.PerformLayout() + CType(Me.GunaPictureBox2, System.ComponentModel.ISupportInitialize).EndInit() + CType(Me.GunaCirclePictureBox1, System.ComponentModel.ISupportInitialize).EndInit() + Me.GunaPanel2.ResumeLayout(False) + Me.ResumeLayout(False) + + End Sub + Friend WithEvents PanelFX1 As HALOCELauncher.PanelFX + Friend WithEvents GunaPanel2 As Guna.UI.WinForms.GunaPanel + Friend WithEvents nav_home As Guna.UI.WinForms.GunaAdvenceButton + Friend WithEvents nav_servers As Guna.UI.WinForms.GunaAdvenceButton + Friend WithEvents nav_tools As Guna.UI.WinForms.GunaAdvenceButton + Friend WithEvents nav_settings As Guna.UI.WinForms.GunaAdvenceButton + Friend WithEvents nav_mods As Guna.UI.WinForms.GunaAdvenceButton + Friend WithEvents GunaControlBox1 As Guna.UI.WinForms.GunaControlBox + Friend WithEvents PanelContainer As Guna.UI.WinForms.GunaPanel + Friend WithEvents GunaButton1 As Guna.UI.WinForms.GunaButton + Friend WithEvents GunaVSeparator1 As Guna.UI.WinForms.GunaVSeparator + Friend WithEvents GunaPictureBox2 As Guna.UI.WinForms.GunaPictureBox + Friend WithEvents GunaCirclePictureBox1 As Guna.UI.WinForms.GunaCirclePictureBox + Friend WithEvents GunaControlBox2 As Guna.UI.WinForms.GunaControlBox + Friend WithEvents MonitorTimer1 As System.Windows.Forms.Timer + +End Class diff --git a/HALOCELauncher/Form1.resx b/HALOCELauncher/Form1.resx new file mode 100644 index 0000000..f4b7d25 --- /dev/null +++ b/HALOCELauncher/Form1.resx @@ -0,0 +1,3048 @@ +<?xml version="1.0" encoding="utf-8"?> +<root> + <!-- + Microsoft ResX Schema + + Version 2.0 + + The primary goals of this format is to allow a simple XML format + that is mostly human readable. The generation and parsing of the + various data types are done through the TypeConverter classes + associated with the data types. + + Example: + + ... ado.net/XML headers & schema ... + <resheader name="resmimetype">text/microsoft-resx</resheader> + <resheader name="version">2.0</resheader> + <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader> + <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader> + <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data> + <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data> + <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64"> + <value>[base64 mime encoded serialized .NET Framework object]</value> + </data> + <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> + <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value> + <comment>This is a comment</comment> + </data> + + There are any number of "resheader" rows that contain simple + name/value pairs. + + Each data row contains a name, and value. The row also contains a + type or mimetype. Type corresponds to a .NET class that support + text/value conversion through the TypeConverter architecture. + Classes that don't support this are serialized and stored with the + mimetype set. + + The mimetype is used for serialized objects, and tells the + ResXResourceReader how to depersist the object. This is currently not + extensible. For a given mimetype the value must be set accordingly: + + Note - application/x-microsoft.net.object.binary.base64 is the format + that the ResXResourceWriter will generate, however the reader can + read any of the formats listed below. + + mimetype: application/x-microsoft.net.object.binary.base64 + value : The object must be serialized with + : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter + : and then encoded with base64 encoding. + + mimetype: application/x-microsoft.net.object.soap.base64 + value : The object must be serialized with + : System.Runtime.Serialization.Formatters.Soap.SoapFormatter + : and then encoded with base64 encoding. + + mimetype: application/x-microsoft.net.object.bytearray.base64 + value : The object must be serialized into a byte array + : using a System.ComponentModel.TypeConverter + : and then encoded with base64 encoding. + --> + <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> + <xsd:import namespace="http://www.w3.org/XML/1998/namespace" /> + <xsd:element name="root" msdata:IsDataSet="true"> + <xsd:complexType> + <xsd:choice maxOccurs="unbounded"> + <xsd:element name="metadata"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" /> + </xsd:sequence> + <xsd:attribute name="name" use="required" type="xsd:string" /> + <xsd:attribute name="type" type="xsd:string" /> + <xsd:attribute name="mimetype" type="xsd:string" /> + <xsd:attribute ref="xml:space" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="assembly"> + <xsd:complexType> + <xsd:attribute name="alias" type="xsd:string" /> + <xsd:attribute name="name" type="xsd:string" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="data"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> + <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" /> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" /> + <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" /> + <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" /> + <xsd:attribute ref="xml:space" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="resheader"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required" /> + </xsd:complexType> + </xsd:element> + </xsd:choice> + </xsd:complexType> + </xsd:element> + </xsd:schema> + <resheader name="resmimetype"> + <value>text/microsoft-resx</value> + </resheader> + <resheader name="version"> + <value>2.0</value> + </resheader> + <resheader name="reader"> + <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> + </resheader> + <resheader name="writer"> + <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> + </resheader> + <metadata name="MonitorTimer1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> + <value>17, 17</value> + </metadata> + <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> + <data name="GunaPictureBox2.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> + <value> + iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAYAAABWdVznAAAABGdBTUEAALGPC/xhBQAAAIdJREFUKFNj + YBi84OrVqyo3btyQQnfhhQsXpC9fvqyMIg4VfHTlypWbyJpAbJAYUMMjFMP+///PdOnSpQVAif9A/OD8 + +fMKIAxig8RAciA1KLbs37+fBSi5AqrpGpC+DmUvB8lhDUw0m/4DnTMfw2R0nUiaZgDZjERFE8gJq1at + YiZKMdUVAQD3inz7KhBCGwAAAABJRU5ErkJggg== +</value> + </data> + <data name="GunaCirclePictureBox1.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> + <value> + /9j/4AAQSkZJRgABAQEAAAAAAAD/2wBDAAUEBAQEAwUEBAQGBQUGCA0ICAcHCBALDAkNExAUExIQEhIU + Fx0ZFBYcFhISGiMaHB4fISEhFBkkJyQgJh0gISD/2wBDAQUGBggHCA8ICA8gFRIVICAgICAgICAgICAg + ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICD/wgARCAH0AfQDAREAAhEBAxEB/8QA + HQAAAgIDAQEBAAAAAAAAAAAAAAEEBQIDBgcICf/EABoBAQADAQEBAAAAAAAAAAAAAAABAgMEBQb/2gAM + AwEAAhADEAAAAPo7IGs1QxAAABgIYDWBKsFkqABpieBxv8306KS8OJjWnZEx7RAvTfCfF9cxlVFlAvna + 5a7Ij3icvTrU7LXPIBjAAGAWMAqB2IYVFmVSEYGswggGCwAAqwAYCBYVBQ5TPT5dp08deNsTrlFmpMSI + mdFq3TPZE5RO2J1I1zGk31tomvpmV/Vr4+qbY2cxmA7CpgABYDqAsAGI21IRiI1ROEQpsAADBUBZgqAI + DVCih8t5dVdW/OWlTG1KTW6ZaJrNi1pWYF6w5q6zbU1wmKO+eUTYVtiXlbdzFPcr495rnmMAAYBYwCos + AAZtqQhCEajCCEs4EgBqgACwIgVjxzLTw2OimlHssa3qdMspifTSPatFphDmL+l41o1IgzHaY7yVqW2e + iYt6a0V8p9Lq1erzn2ia+57c7GMLAKixgAAMAN9SEIxEEtcNdWMgawqAMFgSuR49nfwrPo5G9tsINq6J + i9pqIg3pY1skuY4Ho5cidW0Ca4yvs9O5w6eC6ObYXdL1KukcxKi/YY7e06c/uuvOhgMAsAABgEHLfUhC + EIQjE1wxgLEhUWaoCwr5Llp81U6IUzEtXVKJemo3Qv6a1lqRbR02esSY5/TKh1x2QjSEXOenpuHTxeuN + LfO1pe4ppX2iTE1d8+lw6bnO/wBV9fn9ZNAAsKmA7AAABkipAIRiAhClhVrgTYVBrAEGsfHePTxN2uUe + 1UnenCUKabotrmIc16TPWLMS63h3yotc4s11Sl527THp1zXnNMb2mkKa9VlvomOS2w7jm6rPK/pfRzfQ + +3PkqwAAAysQwACVUhAYgYgIBGBhBRJMAAeDY6/Nlta69LCttkW2rQ70g2pqNUJCdRKiZSZlbdVjtwnT + yxJpVaUzifQOTrVnIbc246LHe2prU3zhWp2GG8uLXdK/TPbw3doaoAAMLABgCZVYBCEIQgEkQGJrggEV + lLfDefTzO2cqJ2VttWiaV1RWPZLrffWQ1TGMxiSodxz9NPenPbYU18g9I5+ybnPGdGHMXyzmOox3xWkR + OVV1na3z09b35fcunnQ1QAk4sDtUABEuoEIBCEAgADGWEMIB875a/OF7qWyG+t4F6ylp9NL/AB6J9dME + RLRrmtXfOtvlptTos9ZtL8hvzVV8taPTuXt57TOdW/Gbc0G1LKt5tb5xMWadbz9HRY69zfH3js4rywVL + HUwkBJgAEqpAIQgEIAAACzCqtpb4Uy6KTSsa0SItCmN615nv2HP03+O0ut9RU3jEiWrU7YxrZ5IoNcNK + KrTGvmnS57uJ1zEWaV9qQ5jos9tcRui3XY7T6WvVfbOjm9R253YxgMBgAxmdSAQCEAgAAAB2eJc+vyy2 + q9M4tqy63a3Y83Z0uO/T463VbTqzrrMC1ostFo1XpW3z5nXKm0x5fflhzSHNJcXs630TDK62eia21NdK + trTWRE3/AD7WSPcb8/tXZy5SyAIEgYCAY6kAhCAQCAAGAHx3z9HkWqHNNdplVt2eHZ2vH19Bnpb1tf1T + EYxaMnGWelddq0FnI6V4nbDlN+WrvjhNUXFNNaNcxiQ7UkVnXaJlL5Q6Dn3uqW9enL6A7uKRaABgAAAA + FQAgEIBAMQWOoMIn89ct+e1rqmJlb9Fj0eh8nZ1nPvZUvNibdFhauUyh2jfrnXVtCspJedXcbvhR689Z + fCZF59bzq3hTnX2zh2pviYVqTaXhXp0XPtd5be8683s/Ty2NoYAAAAwEFQAgEAgAAAYHnud/iCdYN6Yl + pTXvOTt77m6b7DWbS8iJnSsb1laV2WruvUtEWGgq4nmGnFnP60q9Mpp0Gd9cIFop9MqfXCttliqIrrVu + M9On59vRd+b6T257ealgMQ6iwABmNTEAgAQAAAAz5sy1+a72gWpIWvMd/QuPv7Tm3v8AHSyicotsTaXp + L1ptvGy9d1q6DWaJirpehrpTJiSlTG2InVmslXTWr0y4zo56a+NPpjGtS1yvbU0tkfZfRx3k1B2FTsBA + MBBUCABAAgAAGB8aU08btOuUitupw6/ReLt6PDfoMtLWa7onNawvnL0rJ0rKvQmIsTlaMpqiFE1ldNUT + lDKs5Q1wrrRUTHM6U4nbHk9uarvjOicToMtfqro4/R7ZhkFgAAAAY1AAAgAAAAGI/PbPbmNIxJ1NPRuP + 0Ow5ui6w2u6WuJibNdkpUpulZetZt8srRric5rrickYJ1p0RbCs41aq2xhpmsa9aas8XtTy3fDk9+QLf + PTRFfrbTH1HTHIVjAAqAsAFUgAAEAAADA1Vn81501ya3Vc3X6lxds3O9tnpexNzatjasm0SbJdozRuvW + TamSN1q5TGMW1pIR876K201trrbVEYWYzTTatPrl89aV4ro5M4WlL0mmf2hOXpGuRUWFRYVOwAAMKgAA + AEAAMBkKs/mzbRkquvrHn+l0uWuEThLE7M6JW2sspWFqy7U22gRoreRam+a64lkal41Lxc9NVZ00tiKa + u9d+uNBavzrrXjujlxmt9ltxm3N94Xy7S1GAVMLCBIADCoAAABDAAADnKW/PG90nqOfq9b4PQcPOurm5 + vbHYi+z3uKz6Hnt6PDqL1ur5b1cU4TOaMkaK6a4nGsx6Xi530UtHpbAaDSu3fHhc5+fOvCi35tM1ucta + jTD9DtuffMA6iwAAAAMKgAAAAAAAK+unCUv8M61xT6twel3nN0cTtnw3Th0uW0mJoNcaPXDbDr8en1DH + p9hvl0tspExsmuUxsmNVL6q21xbRW0elo2d4ud9NZxkaUjXz82pbwX0OOt0w12rf823tO/P9Lb86gSYA + AAAAYVAAAAIYAMxT89+V7/ke+Xl/d5MiunuXmercUtxekXETcVtWWmivWqtXmt+aHfO8y6PVufp9gZ9V + fOTapKTNNiCJIYJ0RaJneFnpHpbRVotFdanklp8T9DzsLUm0m3w0+zezi6vSjAAABgAAa6gAAAAAAZV5 + 7fLvmfT81py+Ven4V7j0+6eb6RDCYlLcvNpN1ravJXrwe2Eqk3VNexy09ZivUzWTZvRImmuWCM5JMOts + alWY1LpEOIrJeH618l7/ADd6LnG/cTT7A6+aagAYhhBSYDBOqsMBAMQAMAOW5u7554Po6Gebx31/nfQO + Tv8AXeHryizhCm3Ca1qujDn9ea+2xy5u2isscte5w39PpHWTWbdvVxRxdNPKdIr9MbaGyJsqzJhJi3pV + stOdqmJ+denDgezhtKWmUt9Y783rOmYADAYgGAgNdTAAAAAAA4fh9byDj9njbZeO+x877R5vp97z7S6T + oW5W+nAdOPU65eX35dfTzdRTSXy+lXzGusez8nR6VbOxtGFZpaT59G3mnTlyHRywr4ZysKXyqwl6Tlb3 + PK0Olvlns5+W6eSfnNzS33j1clhMAAAwGIBgBrqBiGIYgABnBcHr+XcfqcJenknq+D9C+b6vRZWtM5ys + rrKC19eku1JOmXR3y5ym2nG3Fzbvcres3xu9MqDDfy/Hq4LS3LdHNUa5T6X6XHbuK1sdM+NvXz7bm+mO + e02l/k7s5aDo5ZdJ9JpP2h08uyQMAGAAAABrqAAYCAEiGB5v5vteac/oea7OU7PF934e65zveVTr1r06 + LIK+dp2zLsmTjjRTZ3sq29B355814Hn6vLXRR6KHXGHfDrYr6LTWoz0tqxf3x4KXbsJ9b/IndyVO3PNp + Pvd8/p/TJDCDkAAAASIM11AgGIAAYDPHvL97gM+7kNIptvK9Y597/O99KytQsztWLadVpxm2U1i52j5W + hY628x2vTzYUnk89Z18uAnpu+zzPku8dT0clLzdnvPD3y8tuz15I80ubU5+l/kbv4Y985tZ+ztMfSL0Y + BByQwAJEABiqxAQCAAGAzxrzPd8/x7+V0ih6PI9e5um4z06OVlasy9cpiJNiY32jGivprTY7w879Bpl1 + nVzQstabOZG2VVGlXe3G6Zcwr2N8vN8uv2nldNrhutS1mnmkW+XO7h03r7ty931N1+bJvmDEAwAAAyEM + 3mJhDAUMQEAAB5pw+t5xzehwc2oejy/WOfpsKadBFrq0TLVFtcy0yZprRTZ61lL6K36bTK+1x01tW52m + 74RtFPz9deRLVcxIijynp9MJ985Nq+Jp+dO7hta3+lPN9v0zp8zrfQ8sGAAAAAwCQSoACEYGFWMsYIAO + dx6vLuL0+Dz28w7fN9e5Oyfnrbr3cxYTO9Eq0bZjOaxK25/LWvi8pPUaY3GmOqECmk22c7bGBaafn2r6 + 3kqWVs5JuRstTO9fmma+Q9XN7Xx+j2/L6PrPo+F0PZ54AAAAMBikDJMAAAAEYmEMJY1Yp8n4PU8dz6/P + +ji9T5OuTXS6re9sspSkTbRJtRFZnfla9G6Fyi81zl2zU1wrElEma5WrETprOqs7SSjNXC9NUx8p6Uts + +n2/Hplr9v6PiWPRxAAADGIAGEgkwAAAAAABGBW56fPHH6fiOmPpPH22dNLyL3VlkWE1mWiXauuXMZa6 + YvILm9bKabDXMJSajcjBOuJyVUN81ziNctds62Y+T7z9A8/b1Ura+d/6Hj79MAAAYAA5IcCQSYAAAAAD + EAAcnlb4e5+/u+Xrv6a3Fb3CbWVlMT7xNtnXreb49WE16FHY6Zdp18FPz9StWqz1tGci0YpxhrrLRtiq + MZrGvnwJ5/l6Xr059DbK16OS07fNEAAMACQOBIACTAAAAAGIYhgcRlb4w5vR6vm6bmmlxW93N75FvMTr + 1kXpyeW3jlt+J2w7auXt+WvW686izmuyYwrezvlqi2RhE6akEU1WroZ+Lr+i17Oq0xkxS+9HyMrUAAYx + SYAAAMRJgAAAEgIMQDA4HK3xjz+j2nL1ZRa2rfpKadKi5vGya65nkK6+baV5fXOHanrfL09irz94pY07 + ik+jbcljem6Y0UnCsoxmIprnLnVecrt18dPQ6YWu/DZdfAAADAJA4ASYgGSIAAAAADAYpEPMMr/IvN6P + Tc/TshYVt0+e13DVavP2bVqO88Vtz8p0ckymnV8/ZbU1C8X7Sr03Tl2ol2oVmPS2dqZ2rCVxnLyCz0fP + p6C7bbPpu7yHaoAAMYpMAAAAZIgAABIgDABDGeYZX+Qufu3U0yi97jra011oLRHlAsrrxEtXdWzIF87e + m7h00T6Hlr2k5YVWlomIxicrUxvk5z445q9fWq7XOvPZ9PFnpkAAAMBhIAAGAEiAEgIADAAABnkeV/kf + HszpppmsuL3uPRbZ3sqzX3tXSmp2xeatoV5LbCRW93npTaU7bG/TVikmthFvS4rKtGy+Wu+VIjh7V1zb + 3fTO96eHPTIAAAYxDkDAQwAZvgSBwAGIYpECTFDz3O3xfh27a6Vl8pEW6nm7MITYvU6Tossq7XWfRfVv + bzTpb8setufzvSkeaVl8somg0y9v5Ojo7Uma89XaObmOL1y9h6+L1e+JIAAADIUmAwAAABkiAAAAxBIG + ECRCFWfzrx6d9Ns4mJbObTbJPXc/X1+HVp3116TndprtzETZVhxbdXOUyyc9BNay2Eqt/QMr9rFKjXHU + nRanK74fSvb5/RIYAAAMByAGAAMQDJMMRgAAOQKDCRAkz4P59+PrsqzV7Y2ee1vnv6Zw917W9bO1xra3 + 0nq9+WPF48XzmtTTSkiIdIsMc/MtefBPoOdp7LhdadjWaTXLd2cf0/ty5jgwAAGA5ADAYgGAEmCAYBIg + AAwCQB8z46fO+XTurak2xyT0OO/Zc3b6HhtXrVFpupvfXdBak2YjRdRUrTOsQYjw/bL1CqJS3G6Y9PXT + dNOH6eb3Lt4vXJzxGOAAAMBhJgMAAAAkwAAAGABIAAA8e5uj4zlJi9JrlNre5y2vcunuObq6Wt6yLcnp + Sg1ytInUdhlp0FZvlJhzVq+RdPP1WdoiMJi1hlfOL0c/1n1ckyIQgqcmADHIgSYxGQgGAEiAMBSIOQAA + AAB5LydXyXTbm+nng2ptTb5aXGXT0WHT6FjtcRbn5ny7pw1Jyh12G/WViaZWz5LTLjtcoNstyb3PQtSq + 35vc7096258QMQgwGAwkwGMYhgAwJEAACRACQAAAAeW8fV8zc3byHZy83tz74tPrafnteYdXouG3Uxad + M1stkK1fRSZqvH656NM+avhUXzhXzss9L6mkDTLp4t9Sb8vR7c6EIVRJgMBjkxgMAGAASIABIAAAAAYh + nmPJ1fNnH30+2XnfdwbotOra2y2s89+ux37Wut5CxmukhrckmrmnIa4x9MeW35cqzkm+x3rtMuxw39Xy + 29r9TyLK2aEKGI4EmMY5AxgMBgCWhm6AASAgSYgGAAB5ty9PzZw+lDvSq25/Puzk3xayzvaZ9PccvV1U + adFCdMYwq5nl7V5TTHj+jlzmtZfPGszK6I6bn6vTOff0LTL1n1fG2oBGJhDKosYxhJjGMYAAwGboEgAA + AGIYjIQHnnN0fM3B6kW1LSrg+rn4Ps4rCt+jw6e05um6jToa36FXllq2a8XvhXXzpteeLakG0ba3nY9P + acvZ2mU+kItr07/1PIs75IDExgwGMY5AxjGADGAG6BJwUgYAAAAwA4bn3+WPP9TTMWEK5PJdXNxPZwzK + 36XDqtc9bimkqs1l66LVpNcI2uFPbOImfl0XuHZ1nNv1VLd/FbQnWp0nbw9f2+ehGMMYOQMYxyBmQDAY + DADdAkwEAwGIAAYHJY6/J3m+xsRJRXxatupNcuW6eSBpjsJdbiN8WJa5pW6UnZ7XfN3XeG/S537Grq1c + 6zfGus2GuXdev4sy+YYGNDsBjGOTGMYAMYwA2jAAEAwGIYABRZX+QvL9oN6sBePMwprlF6rXOvvlGtWm + 359M1ZMprPpvd8/Xa0np6W66i8mu9F1VknZnaRak3p5ux9XyJNq4GNGVgMY5MYxgMYwGAG8QCGADEMAA + AI1Z+NPH9zRMpAlLaZa0xk116qsxbI1q6rVkVvLi91nboaz1tYs0WKtpCTExa2n5s7RttnL6+brfT8rb + NVVnYGQSYxmQDGAwGMDYMQwABgAAAAB8beN7cKL6ZjRKTXQm2Ca2UG1UYGmWcTYRa8pe2q6OK3M1sVZh + ZxGittNLzqxttXO1NWlOA6+Xzb1PM9xV9XzsxhLIBjMgGMBgMDYAwABiGAAAAB8reP7PKV2izAnBYXwT + oMZgidExtJ1bW8TbVm5Vt4iztWYi3Vh0tW1vcxG2Yk2zoL0+b/T4PMe7k2kmY+iop9FZTYRLkxjGMYwA + YwA2DEMAGAAAAMBHz35frefc/ZoloRAtOpLizS0ayQmdC2rNzEWqLBEhNtNLG1dVbRazlEzprOnLxjs5 + vm31POjXgRsTINlk5X7Rzr6LSwMDIYxgMYAM2AMQxDAAADICDMeKy8t8705HH6OqLYoq5qlslpMTggmZ + cTPiLqIuKxMs3JsppY2hGUNcJKuyafMfo8HkHocYYq7JttNkMlcrOzmv3VhMuJBjGMYwGAwNgAMAAAAZ + rR5NMeGzPilrQYn0bh7vQPP9PFfVEaDXM5Q2m1Mitp5d1rZzEpG+VhasuY2G1XUZorLZ/KfqeZxHVz4g + b1szSrstMlG0kHVzH0jnHsOdgYxjGMLCpjMxiGAAAFHMfO9o8DTz8XxNaNEvW/O9LtOP0XFoxrhiIxi0 + mVnS1xFbW1bFE61dqJEpCN01FdZ4x1cvz/6fnwbUxGblmAgmAkTEo2m5Pt6v0Nk6SshkBkEiTqLA21IY + AAFfMfOlo+ZpmvXFca2UtcsYfRPj+vMy6lF4xHMTWZRNmtdViymtnMSETETppuMZiJNfKuvj8O7uOh1y + DEzNi2QAOwA1REiYlG4krbJj2+KfUGM7oljsBgMDZUAACPme0fMMzBm2AAqVK1lC3zv9BeN6+2NpC1bM + wYiHJQ3LW8aWtYsrVsIrNUlWrNmnOXr432cfkvbxwr0yEBsTmlgAxiCx1EkrgTltspB7DOf1hlM2JYDG + AzOoCRLKr41mPn218pYjHUWFRauVZ7Dn6fW/N9GzptKmNKedTHloi9nWLdpYxWZMSlSa2ivzD6vlcH18 + yRmZAM2pytKqBjGZGKuayNiuKY6M7WvERk7FfU7Z/Z+GmI4OSMgP/8QAPhAAAgEDAwMCBAIIBQIHAQAA + AQIDAAQRBRIhEyIxBkEUIzJRQGEHEBUwM0JQcSAkNFKBQ5EWJTZTYnKhY//aAAgBAQABDAH9RH4Yv7KM + 1qOq72NvAx26lfATzQxpGyHVJemi9ijeL+ffd3WylwuQDmuo3A3YqRd2f9yZSbDnjqY2k7cHDx8VEWib + MdXKq8bGIVbEyW+3ySm2Qbfq6okH/wDRbuSJ0worR/VrXl3AHOwwaismsd44UhhlTkfhsfhD4rV7lLXT + Hd3Kx6lq73hEQiCwyp0mxKSHj2EZGFqcFVDSHtUDP1EHrKp2E0JPHs/R68eVHeEKPsLZraY/o5BYHBzg + qG6BI+m0wLph4q9TEm9V7VbtXNOM119sgdTh4denje3mvImdtJ9VxdqTur0l8jqGMLhc8Z8j8LiiPwLO + FGScCbV9KtkeS61KCIa16h/beqczNFZPdWcI2abGUlzFIx6qPJIWjOOk60sxX7bWxs9lLD/pPwT0wvbN + ylw8ZWRWG+86MqrKg2VIrhQy1LjpGWLkWN50bgKw3RmIRXG+NtyBSYpI25BUqmM0M7c55hUfVIvNvIVu + Hil7qZCsAnhkG7RfVcunL3DqQabq9u6xQmUbhyMjx+GI/fZxV1dW1lAbi9nSCK/9cWBVvg4ZJ2vb251a + TrS7emzRR8DtPynH1cqiSKMtUls6vuzmkbK7DV2v07aUbxjzU0XS7QaUurZHIhlMiGPG51nYdmdwaQBy + V+leJD7VDIGijjJ5YqmD4psZUNxWw7ljPmfC3SqKlzhZR5L9a3Eorcbe4zw8Vhq3SsJdNuV3x6H6nMLx + JeMTaqysoZCGX8Nj955rXfWPQu20vQI0u728vervu768l1K+G6ZjvbFMdoCqeGb/AJoj/irNWltpIiO7 + LGA9Jvml4/iPp2VG2+4ljK0B8PcMD51C23rgimHcOaWV4pVZW7rlww60ajb1QfND6hSSkFaEPVtHdORd + Pwje0cnz17s1E4OoSzEZDIfhVTOTbNtg/KXIUJ7j+HFJWmXfThYTLvj9J6/0500q7Pyvw+Kx+69b6++k + 6cllattueqkFv0XiO6Q/zORuDkeCtSPn3yeWfG7mXqA8eNPu3tr5Wkz055/mFxgSu3845pJ9l5uzg3Pe + Dx3xzda0NszYeaJZVYqMPKCCAfMb9rRt4xQPtSPnArSZeyWHHF0gz3CoeOn90dlgl/3WfSOoJYv4FsyQ + bDw8sIKRuPpVtsNujVbxskkqZqZn6EckWdnp7VhrGjJc/wDV/EEfuLu6t7CylvLp9kOsXTalfNq143zz + J3kE7nODz5okk0EY0E2eMU7KEzwWW6KvQuCyAEc7ju3jxL/Eq2k6mInPLEKolzgyxNvyjAnNpJ8m9ieN + Lm0ktZSjEOp5QGvFK3I9qtZjFCCau8SSbzQHz8e8bI6RZ8hXhvDMvDfx4Emwd8QMlvPAw3GfOY28C33N + BHN7SjZsjA7PQc722r3Fi57VO4Z/E4/x/pC1jpW0Gjxd7zS7Q298lC78/SgwRgUnLYAzTMijFM2Thead + nDcECulDIrHfscI6HkfqYZzVuxWSJqJKgxcVGQ0KzqpNG0hvbELJ/EdJrRjbzjKGEHwcVIrAnIxSqSAw + rT4erYbON1xbuobapzJ23O6hJ8xU8VY3izIbaaNXqNolt3CElJurazC5hYVdwhmjWPiOV/h9Icr2sMzz + Q7E6labe/D621xtrS7tL2xEyePxOP8Oo3kWn6bPeTtiO+vmu72a/uDmQDqHqyfSO5vsM+w8Z2KQPI+5q + Qt4HAWDfmhb5aui3j26NGFsmlTbEfu5Ofzs5uZY/AtJFSdrWTtN/gO3UTtkg2W+9W6kSAyt0f57ZSJuk + RtpoDZWMqn6Ibn4q2F0o3zazZC2ljuYG32u7kE11HSUdI7G6ysI7tMBXmIgHAalZGt0xk1dXBmVI93Fs + +Q8m9krTxukLrWhXdzpGowW11/ofxeP1/pF1kfJ0SE0FM75P0u+MbqGWx7VvAHitxdvOFx4ApbYyn84r + BcfRRs0VcjFfCqy9pr4LtPO1ntcp9OyR4ueVFPDikVdxO3vk7LOKXdvS4m66lJMPQL27sg5WeHZtkQ5i + uJC5+IPLWtz8Zovw7sDLbzG0mEsYKyNNbzW01rcZ6MtpImcYet/5VbSL1tjcJn5cikc2j4bnlJmKzqBV + opeErSuIdsaNzJJNJpEtuAjxaTem+0m3uX+v93j9/isVeXUVjZTXcxAS/uH1LULi6lfuRsSbvFMkjTBo + 8NR+SOeWd81CjE5xUMPdz5tbXjxSW8h9hS2y/wA43U9uM7l4LxPuyM5x7EU9srrz5ktjtIGCYtP3MHY4 + LxAO8ROxhvQBG7akIcd1bykh3DIkVUkZMkrYTqvYVNSn5zpnmN1/uJd8m3H1grcee2QEj+7N4l9hjH2M + y9QLN72EiIqKfO5e1SvNtMf2tB3dnpMmPS3hPjFYrFYrFYrFYrFYrFY/A/pEvuho8VonmMgoVfzIGiJy + aR3ydrbWErEfMw1Rx724Ti1tQo7qgteo24rxDCD4HEdvn8qFv7Yo21G3IJ4NG1z5WhZ+4Tu+D3fTgO0c + aqYjG2+8gYyFOlg3AyzPkGg2Ds80/OKcZakO3De83IVqiP3plIzs7knGR1kGFb5iiT3zm1FZxEhqB+3Z + 5WFj9NCVWYMvhXzp8DocT6LclbKdM4dMGNWH4z15e9f1RJD7TP58V12PB7gvOcUilz44srUcZqK0BHCV + HbBQFAqKMcDxUSjb9PPT/wCzRUYuOK6R966GfvUluDkGrm1Royyjc9/HHCm6KMIlzCwd1zip4+C4p/8A + dRXOfeucLUffGN3BkRQ/ZnDZ270OGdcq0ifTGmElHt4tj71I5Oxc5qLtwK6oQkCocm3FQlGXZ5Fgerap + e52mLG0Y8finkWGGSZ/pubg3upXF9O+XkU7s5o52io07Gq0g3EZ8WcHbkiooeaC+OKjTLfak9s0P7Vsz + xWMZoR/7uaCbeKkA8eKki57fFzb7yNqg1eWe0vG3noF4BuqW2wxrbtP5LAGiHvUFucHupYNrYkHE9ttD + bOVA2b0IpchHXzUg6aBR5HGKHC7qQAPk1HN2fnCzY2rwfRkMT9ZHNWmTZIG+r8V601L9l+krqRD83AWO + nyvGOR5qBeeasYveoF/KoxxSrmkHdStzSmv+cBRwfasewrHFMgfyKKDk00Jy2e6rq2JO8DNS2IQthcVN + bDncK+Cy+CMG2s+hN3DYnwC7B3hV+CmaAZAw1k6ZVlzTWROeM0bRlOcU8ZJrpDy3Czec42qPP52yd2T4 + UiXKp2r6JvlTVpLWX+JZ/wAW5H8v4r9KFw3/AJdbZ7ZOPegW5GeFFWw7xVoOMCofyqMUgX35oKKTO40g + zzS5PO4V455pcZx9NfnRzu8VsNMnH3qW3qW0LeBmpLM8gpmv2eki9ycx2Hy+mcGl0xUB7xTWjMn1YdrG + QEg801tkcIQz2vVQirm2kiba0fd9JOV7nDE5NbW/tUEe3ulPYkpkOciOo7mS0vbXUoeH05xNCLgePxX6 + SLxbn1d0UqTyKH3xS+asY+Qato8IKhFRUvitlKKT/wDShx9QoL9/GAfp8GHHimyGziu1vHnp/lRh/Kng + /KmtSxPvQtsHxXw/2HPQ4xjgQ8AU9u2PvUtrn25ls5PK4q5snkTeAKuLLnd4qeDY3Hg8HgUh6gMZqEFR + +dq4KHjcvo6d5fTsW/x+Jx96124+N13Ub3OR9hQ5eo1LPWnW3hjSrhai8YNRjgCo1pUzxQSlQ0qflwPu + aVR+QrZu/sYlz+Rhy2fFLFIp+9c/7SC238jTxjg/ytF74ro+9dPFbcZrbTLUsKbcrwWt12twc39jtRsL + irxMUVG4igxQh9uTDiW4T7WUmLgoa9DPv0Sf/b+JmOy2menfcztilGFJpBxurTrXqyZ9oYgiDFL5qLFI + uDxUfI4pOBQFIvvQHHiuaViPIxSsccYNeDzQoH78Ufy4opkeKCJ5AwXXBxnd+o+K4Ne36iM10tzAAVqs + KiIba1VRHOwHhuLjio1xdsH8WiEXASrdsX6/b0Um30zG/wCKvJOlp11J4rOUQ196jGXCVp1uI4K9sVvC + jc3AOrW0Cc95i1ZZe8yiKrS+QoDyaS5TA2+ElHvUZB8UB7UENFM4plH2oJ/NQ5rj/g+a9u6v7U33HNbj + TE/q3VkbfzqLG/mtSkB3VqDbrraa295FORvLCtPIM+40hzKz16ThMPpGwVvxWvkD0xqeTivYCk8k1pNv + 1Z9xqNNqYqRti5q/1PLsq5NPdyXD93aI7ieFso1QanLkIJGDWevyQs3VO+rP1DbSKM76trtZVBjORbSh + x+Yx5oLgec0fyrbW3jFYx5plPsaVWHnFHNNyMHijRFbSPH6gK98UWCxHFalNiFzV9KHlLCpG780xqz7I + 3fNaXaS393FaQrloIVtrWK3T6fxFzfWln/qJgp1zXtHn9N6jF8Su9gyKQ/mMdprQrfZDvIo8JWpzP3wb + wKS0kf8AkNQaVnlwBUujr5HNT6RcpylOZ4X715juTvG1itWWtTWz5WWQx2mvgETBuy01KKZUO4UkwZRS + nmiaBFHmsViiuecUV4rZkUy4Fbec0R7/AKvepTxWrP8AKZR5uXBlrOdtPnZmgpTSyf5v0baMoaXUpR+J + LBFLt9N3q7Sai5nUGL1G7SSdMfQ/PFRjLqtadDttkFSduOM1JA0sx3Cre0CvnJNYVKnvre3B3uqFtVtW + yOcSz2Vx2lxmezwd0B3iNWEo4xVvviGf5dIvdkaQ1Y3RdHpH8EGmb3BoPSyVuzWff2/tX51ximFGjR+4 + onFTPhK12UjkcVO+6Wou5th8wRiY7f5ZT1rwIg49O2H7O0C2g/n/ABGots0q5NXciOxBGx72Lr2Mkx+s + 4zWlw9a8TNQLtUVKOfGSkfuRW2rhp7iXoQybEt7C1iJKRCRuhvjBVVxfWSEHMFSQyW7ZjJxFLFMNsq1F + DskEincunIqyoStWHy0NJJhAa6mRSt/3Vxn82nUHFC5Q+9dVfZufiMceaNx+YoTZ4LV1F+9bucUKbxU5 + +UQa1yfkq1SeePGSrBhQOxH2rgekNK/ausDd/BtkeOLpMd34nXJMWQhrUY+/kVKCqtD7e5PtoFvuYykV + GMCimaxgU8iJExd9ofVIYXbd4XW7p5GS0t95m17VuoyrL0qsLz1D+z7q+6kLQLf2OppmNfhp5YTFJuA4 + guTGa0+8U48VaTZGDyEfI44rPP55xTP9jWoal0Fbpt33PqO7ibB3MYfVF3/1HxX/AIqmIU+//imffjCk + L6mXHfxS+orZiTu21beoo28nc9pOtxa9RK3Z81ej5DVrEheVu7knnmtvy4jTksiMtehNL+A0DrOvf+J1 + vmZAKvFzcopFXKt8x6IrQ7fp2aMajX/ihGPFSpiP7me1nZDzTaX1C4atIsooGKbcjULWeyv5o5YilQTX + Thopp36Hp308dYurnykYilMstjcj/MyWjIDVo7Ry1pU25eahTjNCPjOKPb/a5l7POKvpQc9M83cBUbUB + qaFh/wBMis3C9qrtG65BwQxodbpcLy8ty/MvfSXEiNmvTesTR3TQvJSkNgg1eY+GatQP+ckNeZNuKyei + uDxDGpngQuCtjEsGm28S+PxOsf66rnl5H976UxwybagXrX6JVnGEiRRSeaVKMQxkipE42ipLLLbhXQ46 + e2lS5h+QkaTR/s7SZQfiNGiL2kAsdOS30wpANT0xrho5fhDHO1kbq3jzb7J5dIeC6wVxWlwbZNtW0XYO + K2YWrllVTWoX4Rin1Ga+fJqbVJVyE5JvNRk8YFQPf/8Aswy1BdQocXVqYKt7a3nT6VZX0i1dOI61D0+o + /gqaW2mtbkEb430d+vpkLnBq8/0z1d83T5o535U1Gv8ACSvTOmpqetxxyfTGnTjWPOR+J1mTF9NVydsH + 53zgqV99Ns3XXUicYMYxUYzikWhH8ujDTQMPpox8+1BHWssecVtaonkT+aml3/MZcNOvWl3NzVlCM7qt + hhKkOB4rUnba2KktJp3bC8S2ErtiNae0tLY4kcbhqWkQMMrLIbXXfT8gEaSYZIrPau3Y6S6UYFN3pB21 + YXi3MWVoxdReDWqWHUUgENWioyWoTGI9U7LRz7TNm5fNS9sxFR5EH/y/Rvbb9Wu5/wCX8VrDZ1Kb7ao3 + K48W0KyXDzsM1YOG1+c1GOahqIV7UI8+1GLA5FNBG3tRgQ18MmTnmtg44p0O8cU64TjGcBRuzzaDFW4z + 4qZqnXc4r4SJ2zClXdq800nxs01nFpmmaVBpkzQJHNKDbRzia7haeLVdbk13S7K0S0ggh0dtXgeaTT8v + Wh6vb6hAPPUaDoam7J9Nt4qSEPMwPFWcKxRYFa+4i0uZmondNUn8Z280gZiqYr0ZpL6VoWJ12z/vsfvN + bBTVJK1Ib491ae56ssJrS8ftNnNRe1RmoyOOaU+wNL9qz2kV/wAUOSMUF8eKOApxRb707bm/LhsVb+RU + PC+eJTR5WgzqO19tTTTZ/wB9FRu3iPY8+gaBezEPv0yeT0xqkR2WRs7gaVYR6LYOki9W7uLa4s9ae/s7 + VxBb3Ed4FkXFQLyKdMv96jXtr1k+NGcCovr3mifmNXpjQH+Kjv51DiFxJHnwf32K21trbWP3HqK3zOj1 + 091sxesuupABdtWT/wCcjOOI25qBjnuNRtjFRkba3c0W53ZrOaXJHIwVPOPY8VI/dRYCk81AvIoccCpO + aX3pE9qkiJbgVJCwOcFg8QcHcu6vhoQxfGwm2iZMb9xWAsnTGQtvZm1k7PoReKCCh4r1tNi0WKkHkVo9 + l8fq8UDHEf7Re1jW101Qq6Ld3F3CTcgb/wAFittbax/h1m3M+msVGWmhC2q/e+6cVvLKRzCxiuUcclT/ + AMUjHNRsx96hbspfPnBA/lPgfT+Sj3zx96k4OalI37qY5NRLUA7OKydozTDg1txzikFAZ4qaEjwKkt9w + 3DKHZIPqXcEiU+Rilhx4oRA8kUsYrbXtXraTdexpmvoBPv6d0lrTSZb2RcT29oT3cmtJiEdsfw2KxW2s + VisZBB8anb9CRozxWsL/AJSQk9sG9QgYCh/9jhGq3J88VFnbzSHikzyKTjx4HjxR8fcXBwhJ8FmlLeyx + J7+ajX3qLgVnzmg1EUtL96yMfaih80I8Zrp88eAp8UBxWOabPvRPaTXqmbq69j20HRPirT4l1Uq8Q+Cj + ixio4WVBngWgxF+KxW2ruyivIDFLXqrSb/T9Olk6XVgjYvcQ7hSscbs0nP1VERzmoiMYNLyoWl5xSUDw + abg+avH6jCP+XCqNopF5FIuV4pF9vfFBM8e2fao84rxRHZWMHPtxWOaCCjjFDzTGriUQ2zyk9skbalrb + hea0m0S2tUhTx09zRqRQiBkqJNkePxvqWJJ/TF/DJ9OGURnPNs56MW47qiK7fPNsR3ck1F/+rnxSUinZ + 2nnHFXMiohOefjAzynPMWr20k/wwnXrQT735q17s81DFH0xuYZlUb+KUcHFSKckiofpzWO79RH2rYPah + waFGvfmmPOK9TXgttLkQcnS9Ke06TyAdS1jZQOKRcNUEeWyfH431ZM8HpLUXT6oWU9CM+Ic9IluFRm3B + sUkoJUVbtlSqVHnFKOBSHH9w+AQTzqEvYRV3JLbT9VRlNSh+M+fHxJ6e1x7v/JXjYu7K7zxUU+41K4z5 + pJT/AGDFDyagIxSjPPvyD+rj9Xg5rfTHkUSBk1fk6l6jhtQxeNola6U1boD3ngRrlsDyoCrtHj8b6yeN + PR2odU7aTm/PvSSOsJBw1bukmN4qGccVABvOGOYuRj2Vu3Hv1o0GC2C82RxV9Oix85NXrhUkkYbKW5jP + hqlXZOk8B2TWOrB40c9pTWEhj3SPsq69WRx56FpNdufUWvS7ela28CadfXM3ZLjdb/TQf2zRyfGKNZ/U + fFEmkB5Y+NUuxbQ499MQRRy3jY3wIxes7Y9lWicbz+P9ef8Ao285xVvjaD7rs27n8IuI3EmN8ToNiouF + ik4DnkC4RO3+ZNTyjzKrNGmq20KdQ/X+1Nx7gQ97dnDSVqVxkLEGzXf1WccVGzkFieLR0EAKmut1Y8S8 + iG5h8rgDpPOhKsMWVrHaxhouajbFCTb4pJSaY0Wrd4rd5rz4qWQKuPFajOLpJJ2OBDZq8YJ4EMWyN6gh + eVuaAAGB+P8AXvHo26NeHUCuq2EDHtjuHlPUflbedaeaY/wXUUJdyMGk4efpWp+UKdolHV2Yp7uSRSyZ + CyTeeCwZd7GUYxDGu3Mh2oLY7j1foCyxSsZDsFjh8dRyBeQmKZzEO3RJi079Ne2xcPbyMm3et0NgZuKF + 2hJQk1HNxQk3A+1E+9E54pnCgCt2K1G7ZYpwTxpaR3EiW4Hb0Sn0mo4/l7PNIgjXaP6B+kP/ANITVB2S + ZOab5fzNuKRsRxrVrIxJ7ttAGSAsHVait7eMAnvo9GR+vKeZ4pCoPRKosMi9zw7nj01mHepamsPnsR3l + tNL2rtt2RG3IgErJmaaGT500pEhtra5OJ0j+XqEBe3YIu1rJD1DE3C29/HE2yaLpTQ36PCkiMBV9qDQu + h3qBpesmWF9+GaOXjzXV2tmi2fprtBywq+uti7icVczdZny+1NLmf9rM4U7IUd4xxUaCNMeT/QPWcCz+ + kr7fUcgMKj3uXzNEqdyEbGJk5pPlg7jlYmCW6hhh4rjDnJ21LdxLP0z1Nsl5fnlFdkTXNh+bC4K+ooj/ + ANUx1bX3UbfFMr18XdCJ12irbUYZLhFuE2D9m2k6nY/a1hbxRuquoSawd4JOmwak08iJg60YQ8bZJItL + d4V7rjtI39MCSurLp2rgxfwLK7LRihMNvJovzjNTXYf86mbrb3YZF/L1VlVB2ei0zpfV8r/Qru0S/sLi + xk+kRG3nkhnHczbvJqU72aU8APk7QtCZmB4q2ikbLh++0s1/izlyHh2R4SMYa0tnjyIFr9nWrHptCm2D + 0pYXe9406Rn9Parar8i6fFx+07T/AFlmXW31qIRbIbyWjqloxxcSuaGq2CfwL0rS64PMs0Lomv6SXPzl + SSXUY+ofhgXikvAsiLt3GWZ/hztKuujy7sEZWrd+o57e28v0MvQhBai6OcbuySZYo5ZUGadHihRLcdST + RbRLTSoY08f0IV60sv2d6tvUVNqp9Kcc3DZ3YPaC2e1qiy/DnttpwJlSFBttnKn6+V3MvC7my0E21O5Y + mimU57Htt8TDmklW4iXwa6O4t2VHpcGFCxLUmlWhiCmNafT7NVwIYzUmhWFwD/lEFRel9Oi5ePJbTLYK + 5RVWtXskiv0mD9lpp00tnK681bwN8CiA7Jbq4jhsxLn5ulrKOSSzyOq9Ppir656RaNODodt+0NVjjQYp + EVI1RfH9D/StZ/I06/Aod0cQIqKPfullPDduQlLLtGwRkmxCRSb5n+ZYHfPuJe4EBxkrEqvd46YjzW7Y + 6+FC6gY+D3C21WHp4JqLU13YyBS348h1WnmDd28YEltj6q6yD6KPs2M1cjMB24Bvrj44fC7Ns9pNbx6Z + BAgwq3CRozP2s0kl9Mr556SQSJFFRk/yxjp36qHqN2+irP8AyBvjt/ov6Qk62g28NZaGV46LbUEatgFv + mcUgTO5vqgxI7HfiradQ3A6cVtNCwj6bnqJakIWMhUXVoCMZ+XcCVflbtpuJp0jEyuTXxkixNMZz1ra+ + uHwzsTUd7uklZSdkR4yeY1dREXzmlmKAFTuXU7zCvtBD3V2yn4zbumnuoAbQQ/wby9ikjJVsVaS/Cxx3 + YxgXTvJIpwGnuEitugPOmQvca1FaDEi2tslrbpFH4/onroH9n2n21G1GBJH5fB+pqNL5xUb8dIZJ6mCk + SmItalxeRhI2d4Zmz9SKCYukGVe2+02Sfe6qUFxplxEpcZdehcHBIq3V5tyfSYoSlqjou+tkttoyTJKC + IlZLHfuLreXi21uADuGrM/xsQ+L3ERC9hu7pxXWMEL5+i3bYZHc8oJHRmJUyzy7EUMK65FtEhr0TpW7b + qEy4f+i+twTpdvUoUjDLua8txDdE7MIwCMaUnwOaiiMjdziGO3P+YHTyxTDxnv6S2jXjxRdJIVq2ZJbg + yyP13Ej3iOUfpoLIBEt2lYPFaRZl6qYaLT0iD/LJorHAyqUII2pZyxsN6zXNxZROI3+TJN+0LOUWzbHW + UveQrmo7jYjRoWSpm3kQhspYqiYmlJNJsj08zBvms7nA3AVounC5eJ5UBGjQLDZdq4H9F9bb/wBiRbfE + gOw4AFTQ9aPY1XMZiuXjPNQLvdQG21LKuRGncIZlSM5wzWr2sNr1mh3tp5uIYRc3SiSSINbwy437sxtK + FHcLaCHEsp8odrnqAgXN0jyCBtqxG3e4BWSY5urhEtJ7edCzSzg28UDGrX5nVi5jnmkd5Gl92l46mMUh + zt7cGXYsXyxinnO1IYlJawskL9e6O5NNtxBBvxtrT1K2EW7z/RfWY/8AI0+0i7T4JpNobqHO7WtOkurl + biMc7DExWQEUu0n7BGWIspjG+Auva/c0PXaP4q85qJ3ECXdy52wSxJELcd9B3+ETuU0JAr9BeWk2zBXT + bibUYbfUYlnixBdXD7HjyWqR3lVd5xTmSGXtkOQv0OaJLSYI3V1BEW3cUsklyVXJ22NiBOkjVp8IucO6 + /KiXLJF7Rfwl/o3rEA+nc1Lu+3MKcdx4cIqMWzt1Ww3BriJ6DbW81HKervPNRPslUt9UMhmnXMgEbX7y + KLZMBettEaHhUn6oiklNTSmO36vV+ZNdIrBVGE64YbpEDlpg7lW5ViY7dwTTTgys5oyFvJpZPGB3QWrS + MTJnbZWSq4baAtjaG5KyFOnDEkUIOwDcqFIDz32L9S0U5/wH+herEL+mZ6bcOPJTJGWY033wSrY8lKvt + KjPzLc4PMEvIqOcs+WqC6Ef5BL4NdK/bUupDr7x3AamHK7HIqe93tJ3HpwzmVWDPtSM9pYSAVLLviUhg + jyOGDLRyG45Mdu0j9xwIbfngVb2q7d/kwWpeVMncY41jU58Wyb267eGIOB5rSZdrvA3H+A/0L1KoPpi9 + zRKA4qNQrVIeTggCTOB71jGe1s3VokxywAMljKPo5HzIiQ3FJclW4RWLXbugVQBUU+0jkKRcYyu6uuoG + FavicDpL46j+xpYnkVMeIbYA428x22X4xVtZM5+nFWlqAnaM0i9MYfAEafFynz8N/YcLgzZ9slXBU91v + Os8Qb+b9R/oWsxmXQr1F8twxrxUWGX+VhIwD4AxTDce9cEp4++3zipbONuNtHT7YtgIak0wBCULZ+Aue + fl8fDTReUoWsje60tmQO81FbRpzjNKnd2rUcBY1a2HYO0ExWqdPaDWyJEGHxUUL3ffIOnD7bIxtTO1S1 + Rjav5jjNQSNDJvWo5UlTKn9R/oVwnVs546lx7gAgdoAOKXABCgUCN3J5x3cMKZFjPf20VLDPY1OmO7bm + n+srtasL9RznLZ8rRjyc78AqM4ydyqM8g1tOQFXNRwHHjm2tiwD7XJhg6SsVj2Um89p7aS3B5n76wz+9 + EAKFHhss6IK/Oh/2oYAqCVoXyKjmSRcqc/0M8qRV5AI7yVXJV2x2jOKB47nDUVJft7qU7e0MKB57sb2D + k8EipN+forJmP8wURjO4PvoxL5xTRHPgVs+kcioYDnc3NR23IfGRHFj5sOGqKNs/wlVRB0+EJNJH780k + XUYbOAFwPyfheagHYZT5xj8qUZrGMnzRLeBzWp+srHRH6UJ+Ku7z9Imv3E++z6VlH6T9YQa+nwl1tg1H + +ge1axFGmq3YRDgqfPOCnd8zGMAHg1u+/BDI2AHzW7JPjGz/AOwBjwO1yBjCbSOMbuVbICAt5wUjwNvm + oLP6UO7ItlRivdtWBuXEO1lVydzFkIRQM5qKFm5Y1wgwKY0fnyCMfSBzj22880PetS1TT9Jt/iNQuVhG + ues9Q1TdBZZsbMUKjleKRZYnZJNA/SRKClrr8e9Le+sbz/R3sFx/QPU8HR1yT7P58V/8fdk/KgNp27Sa + IwC6klow5He+8snGCrGggCYQstBGHeFyFhbO4rio4MLgAmoYvmYMLYSLu2rFihBtUDDOYxtxhe3H+3tC + Q/zS1nwBXv5qTEalvJghaMZf6uP+VT7+fUPrm1sd9no+y7urm4uL26e6u52nnrNKCaG2uPY1Z3c9ncpP + bSGGX0n6j/b9g3WQJe/jJ7yytEZ7q7hhXWP0m6TabotKjN/Naa9eeoRPeX23q5yhH6mx4NP28NxW4eEA + wqjGdu2hyuawf5lpQWY9xpI8nO2kiZdgUMKjhXZscYSOID/aaGVJ3ZFK2TtwSY4wjbj3tnAyTQDHk8V4 + H5Kvf1DXii8VtC9xcOsaep/WUmqZstKZ4LIYA4/WBig3t75oVhq9PavcaJq0V5EcrbXMF5aR3VrIJIfx + EjxxIZJpFjTVP0h+ntO3JBKb+bV/0la1fo8FkiWEUkrysWlkaRnfivSv8K9WlTivb7U2aHB58MqkYK5A + /sRQUecnP9jWM+1QRYAyNgSP78iMDGQaADccrQT5uxs0gMXGMgEHkeFAHheaxu8/T+ZrUNUsNHsvjNRm + 6a+oPU196gn+Z8iz/UBQA/UfuPK8+KAoUP71pOvapo0paxuig0P15YagUttRT4K5/C6nq+maNbdfU7tI + F1f9Kj90eiWOK1LW9V1iTfqN9LP+rNGh3Nu9vTMLLo81wfCc/lXk+KPH9sGsY/tn7GgQ3jwoPmkTJIYc + KpBxmkU/8LjI5ClcbMEZofbbwAcUOM8UPv74J805VELyMqR6167toN0GjKLuW7vLu/ujdXtw8836hQ/w + bOc5wcyLzu3UsgYcUG/LFDxn2VyK9O+u5tNhSy1KJ7q107XdH1b/AEF+kjfgby9stOtzcX93FbRa9+lF + Bvt/T0GTd3t1f3TXV7cyXE2f8DeKfshxVla/B6Ta2g87aKH3rGPzBxwR4P37hR/70mP+IvyXNRIccmkU + Fl9wqFf5qHn2NJ3f/EqAB45ByeKfNT3lvaJ1725jt4tV/SDaQ7otItvin1LWNT1ds6hdtMP1gfuMHO5P + KTBuCNrbh4yBQ8c0pFLJtOVbn0566ubLZaavuubWOSOaFJonDx/vSQqF3YKvqf8ASasLPZem9rtd3t5q + E5uL66kuZc/4l5krT7b47XLS2P0u3UlJxSrmiuRyM06KPyL+DxW7863H2FRhGcnGKXdjtqJiy4ZaXleP + KxktyeEKpwOKDUvcMVqGu6VpWVvL1VfUPX12+5NKgFul1eXV9OZ7y5kuJf1+ax+6KAjmulH/ALaUmN8A + 9gkYUGB8jlfyavSvrKXRf8nehp7C0ura+tUurOZZof3YGTX6R/UOpy63NofW6Vj+4j8E16a417PupJYV + /KxFJyqtUoDDkVMSj8GmFfy5qJRiggC5pD2lqVyXokhBg0hLRgE1Ixh06Scdzal6r1u9mltviuhD9z/i + AryKFe36h/iHn9TDPBqCRiSh5oKNnijw2BS16N1W9stfgggl+SfJH+P/xAA/EAABAgIHBAgEBQMEAwEA + AAABAAIRQQMQEiExUWEgIkJxMDJAUoGRodETULHBBCMzU2JykuFDgqLSFFTC8f/aAAgBAQANPwHtIMHu + BhHQGXNB0fy8I85phiLLAu9DBD1UkLiB9UVmgsljDL/CEtFiKmGMCoFrqI55r4NmIkYzHy3C4wJ5IYUT + TPPUrGzBaozGCFQwOabeW5o3tjMLIqR9030X+FKqSGSh+oDfDVO6rhdHnkUeIXhHL5TR4guv8lGDGcUE + 3rUtI688skeKaEiL0boFHOrUId1G+6RULvZHEaJ9xCc2IXXHimVk+YRf8N7TdfI+KwLe65UojREm6kzH + P5P/ACOKhidxjfdNPgFnC+rSrVYeSCxhmKsR/IT8VHdP2TpVAffBEWSn3HQoGy5WIkIT8V1Xj6KmbfBN + d8X8M79p/sVTC5x4DlqjeCPkjf1KZ/6VB7lEw+I66jZ/Q1d0SQnXiCqMwcDPIqITS0g6JjoRzC67COLN + SKF8VSSyMwjVFPb5FdUwTk0gwTgfNOxTJpysuAHdOapf0HmR7vyP8Vi8cDFw0QMAP5PzXoNjVYPs33Ju + 66GBQIB01QxyKa/+5pEQmG1ROmNFxMlHMVO2KRtyfaDoSMUCU+5QsxPCYIRMPFHddoVG9cJ1F6EKS7hT + dykGvyGibacVT30P4dp/RZKKmTsaJqNybcsKrO6ciJIHhWawts69EeUwuGkZg4bEU/H3qDTHnFEXRQJD + wr8Pqi217pm+eapG2IeKpGf8h8hpj8SkGgwHmuI5rKsZVaoYNPFyOxgVGaH5bxlDBD9OmF92RzClfEKM + /ugowULN+aZiyYRKcb1eQHX2k3eGYHNR80XWhyMk6F3ihvEKifhGOIzUe30TYlUpjFCs47OtccKnQPIi + apIWHcLnZaRTusPvoUbo905FG5h+ydulrs8lSnd0MwqAQpWtxc3vDX6r8Tv0btZtqBi2zIqlEKRg4HzH + 3VmwdYIZ5ISVHDq+SpD5L8cbFFSRwpMjl2/9Wn/+Qss1IBZV5I7I9UbisEMENxwGMJeIVxtzOqdwniTj + CM2nulO3aTXVNhAmeXsjdz0VJvMf+27NMxhVTCB0dIoXp1xqpRAIQic05tt44mEG57eRRZvc59to2xVI + 4uiZptRWVRzqlWJLVBBfROwDsHIkw/jU8WXtPEE7BEQim4KaaPyyMslnmgntvQFyGKBKtCBTmFkO9fNN + eYcu207t7RoTsK9a5IbOi5LCDrorC7iQlGNgalBvnqjh7IVRTxULxmE65wyK6rvdBYIoTTB6qipbZObU + 1ofZOJvRHbKJoG1mh0AyTb4d5DrNzQEQCvop1tuiuSBRxCKJuTN2o1CEU+nFFzbxeXbKNpefBUr3P81p + sHoYVZqa4SphFBYlZI3WkcEW+ScvpsSgj1jknM3WxjdNM3T4drpvyWeNWfTnJZrJaLJazRx0UbW6MNUf + TIwWBhsjqtzq1QRZuHXJF4cPEdrNp0Om1qNeiCzqGbUZQXeE1CIICCw8V9UJ1iWEUO7gVRPEdQqRoPa/ + w1C2j8cen9Khs/WrLYOKkRWELxU7hOCYSwadrpKd0EBWOiFRr0vWvQC9HJdYGtvqqQSkgvi3eXamscfR + OJMNvPs7bkSiibkx93JRIT3uPamUL3f8SobWSyCOXSaLToQs02+qzEoGKLLXme1fAcI1isLCDbqso3KP + koVCs9hKcgDHyVI4BUTAwdpMpp1C4CjfdaQRRqOUq9MEMChLNNUwuOGSNwOdR2R0UKwqUXckwWWdpbeU + 44zCZiRXCpxj1djRpWtRRi0hDeHtWemmjVG9Ng0BOFt51PabCCYN7XVY7Q61J7Kb33lG5ZwWVR+qDvRR + 2h0RFblQj4j9b7gm3A6dpeYnkEcCnMskVDDYKkAs0HR3cwqLfdR/iXWXU0e4D1vBTozgeW0djPVDJaLX + FDWK1UeqFOuKKcoL8RvdqsJoiUAiUdjRZFOxjJW4sJFzhoVYbR7zrUGgxDRHAKjZdSZPkqK7+rVDoD1n + YkrktQFkAsT+XD1WqzGITpJwjsC9Q3ocKbRiHavhrBEIlDZKzRN7aS9Q7tm/wUYmjc2PqmCLqah3i9/t + oi3eFUNvksi2Czxb5o5I5LRA+Ks45qCjUcU90TyCaIDtTWAIp1yG1rs6puG0MSs1peVMYQWTwn4G4xWL + qDhdyyWRxFUcoKAhzUFaqKoKIN8T2u0oKjw5oG49DrXmjsRUL02NllHR9bKJRaSXP3nRVqNIwOslwmAZ + L8M3CjoxuHCAdjgqIRezGIWBBxiqS8/1VHSqCigEBLElUxtv7XFBOEVaI51y6MqGGxMHBaXKlPNnNM7j + rPiqXfpHAXclatEf/icPI7IqgHNYpjtdI2CFwRBERyQdfsGs1Z7J2dKypaFEXhGWWwTVHfOTc0zjcIxQ + mLo9rZvCpoVoGrKuVQ6bRZ7cFkqf0b20rh1Cmox9a9az2doT3Yu5yURcsu2ycMQv3W/dCGC1qNQ2eKsd + AdtovTn45BNqHbn0ZinBAX6Ir6VfXYCDl3DcSo9gLcFTAPMKgh69uNEWx5qIhHJElFHJDaOITb7kwbrv + 3B77Q6IPtOyuTBBBFDtxZAcyhBo5IYIKEkcYbJyQuPOqjNoO1TheBmsyv7WrWLish0Mk5UpsMjjD5Fd9 + U2eaknXknhU/dfVY+Cm8D6J0nYuR4GpuA90TEqS1qbJNdZJQ6wCjiceijZYfFCEAhUO3xZH+6oQ+qfG7 + Mo3HVDwh7qEzCPNPuDi69/LJSOJCbcN27ymo8QWuSmc1CIbNBsABjFCFo4wT5SdqiyyHE4H7pr95hyR8 + VltwRN0aj8htt+qCDYNVFvOTb46J9w5KRM9IIdUWYjkjNO6t5ioxxRuMMOSA8QnwAyaNU1wi5owKc7GR + CZAOygi2B0MkwXu72sVkcSNEYFtLRi7xCozIxuqyq1XqgIOOWZTfy4gXHIorP5DR0duOoTiE0EpwvgnD + zKcPIJyAxZJNELIWa5VOkrlSnfchc2RgnCSCogRaIjZ0Kxo2ni9lRmd12qpDB0Dc4FSq1TJKzFQvhmnH + dd3h8jp6M0fmqJxo3DUGCMkAIITWYU52Qi7Agk0imnXQgoAQhgibrNyHDSiKGLqNGTmGI0XI1uuMLwVH + GSxG9AePumG0N2MUeq0oiBCjZOYcgbBKIgGHuqlMSNJoNyh8kpoUzdY4nzWJ0XCF6ozjigYmJu5rN007 + wWVQUY80SoiNyOKw6q0FQki3qmSo8Ezfa/TVUguATzvE4ge6tbsJNzVI4WeSDYxk1AfJAXMJQF+qCClF + DBrBEqN7Th5p6Jlih4wULROSzWOycF3oRVE6DGQ4U38u+cExlwM706y2jaJCZTRfpqqNgaIJjg+0qbCG + WvyU032QO6VCJJnVIKcLvVCQT8XYnwyU7ZiQUBec0/6KKuh/IzKkCmgFHCGIQF5RFqyUIPa0z5IgNHJW + A9z9TiFeDoFg3OAVPgZBsU5t7h3VSwboGpoh8lFIY+SjghKvSoXljLvNHrOGDeWaZhamM09ogTPRB9mP + sgLTeSZDFDGRATTEOkrrXugb4cKc23RvI6t3smb7Q3nenN/LyggQ6GKIshmTVRt+CCMtFl7pgjR/JviK + OCcas0MSZoZrGDYi0pWyN1Mb1oQATXbp+iY4EF0DHwki+y0kK1c4D0VILMCIQ1UbEJxQhB8eKQRDHuaZ + OjiFQi1vYRhLmi68aJuEJoB0BlCaff4IC1ErrEfJ/iXrvLPJAo3JunqiIBo+6DbrRiXHlJfiDuMMN3/C + LhEDq80zF0k/GJlknX/FJiAoG1fcU25gtb0P4mfigOuBxSNypLy84qyWtvuOnonY6IwB5q1joi2ChDwQ + HUOJ0CyUPk3xQpIXwVm+VWSOAWIaVcGMjj4SVM74TKMYMZ7lBhLXZ6RVI7eyI0V27orMbNJfavRdEBpv + AzHimOL4OFzgZxzTsHqEBIhWoQQTRC6rWSZ1Rrmm3uiofJhSBZ5KN4KPqu6a8UBaL44hWJi4BMaH84SR + G42Ce+zjhL6KgcXPnEaIRgDhfihhoUHg2clC4ILCqZKJnx1Omhd8mDmlCSCmEVlJCqeuibdF2AQHomut + QjhmhIST+tfgr4CaYLLgJ5FG+rJaIyCiGwhcOax0XCop14+TWanVZJ0ipwWt1WqE1CaIhVjXqpoSWaOC + bi7v6KQCFwQUx8lNEUcMkKslko9Zclqblosis6yZKUVJZwipRTTffgm5H6qQm5Ny2Jj5K5hHohdXqjg4 + SR4uFDNAyvXlCr1QTVoijcmmG9dBOmStJrLhCGJqxOwZfJIK2QdL6vqhwZVTvxX8lmhgRJYXyRWU1qpA + CSKBvaUbzHFZHqrIps637M6NmDeZX7Ybb9Sm8EqUae3yI0hgHLCBQmFkvRcowQ5rKSMsQhosoI4QQzXe + 0V3ILR1x1UJG5ZnYxKCyqPVbi5/ILJp/MfzNbDFrmmBCw/8ALo8f9wWP5bwfkFI0OFei9ULoe69KvVQv + E1KC1UMX4FTEcEO9NC7kEMNVlsTrFxpv9Oj/AOxT8Xv2mGLXsVB+oBxfyHbW4l7wILv9Wj/ymOsiyICF + eq81rsDvTRxWEHIeizms1ovpscIX1TG2nPeYBqwfS4Op/ZvQ4UjO81Ugi1w7SOJxgEJUOH9yd3b3+aM3 + GNW7saorVZ1xrzWZ2frVwM4nn+Imm9T8O36uzO0Nk4sdew+Cdda/03H7dmkD1ncgv3qf/qu6Tujw2Aqa + ku8KhsDOv6o5zRWG228ueYAIf67v0xy7yPE/7ZdBptNua8ddg+67h3XeR7EJ0joL/wBqm+zU7F7zE7ba + MF3M3mrMV901aIrVCeS1WlQr71I6AX71Lus8sSpUeDB/t6T67ImLisBS8dH7hPFprhgR0zREk4ALA/jH + 4f7AjxUjo7YTqQF3IXqNWiPqptyQqmhUEZbH7TN9/kF+5TbzvLBd6kMewn02Dl1qLkn4Ob0tFwMut/1d + F8JyignDo25pvDQbkfHFHsgu2PxDwykYcD0H/8QAKhABAAICAgIABgMBAQEBAQAAAQARITFBUWFxECCB + kaHBMECx0eHw8VD/2gAIAQEAAT8Q+Kn9W5v50vEW3+P3nqjuGyXDkeTy9meV8Cvy1lhdm/LHoM27KrND + uDC2dtQ+K61yeBzEbbDGTxUbL1aqnseoh1L1Tdcnklbqpvw7E6qV6Ml3312o1VIRWcNwdTXznpgC6GXg + R4SOz0zbdjcTaPMPAPMNhF13IXpMjBpW0mYPwPgMP6LCfwn8F/ClraIF9Dex9RheynRwVZ/FKDnlRj1B + Zy6i3zrCvQl/Qi+scRRda8lVCapcw8JhNpQcea88ymYiz7JIbzTzY6gNgAOX1+jOfU35vHp3HerDdcWo + ishsFOq1DoIqZXDAG8mVuol1eK4DKrEi4fAHcIDN1YSOoVMcaCxdtZqBQKBYqxIJVn858zb4D/QS1ic9 + weL0dotZOrz5U7YRDlB3disvFxcNbStTelZXeFxPq7grhLYrCW1plQyom9L86srhHmZ8gZtauXRqK5D5 + D9R3IVv92eHSTBavoabjfTLs34HY7IlB284qG8w06vESBxdKQ0F/Lp5iRFeEziFSrO4/1bi/weeSLM8V + yLN1Q+zEY+yuqWq8qxGjoRu7XcP6r/AHzoFsGiuavQ7fBCc+qej33C01WEA+hzD6+3P/AOJSXe3nkjni + L6Ix+ceyoRsjrwbi2klUKhVeAybTzCLVrYNJOFoXTmoTUBWe8HhyQ/OGRse0whZFcMQC9rPf/Jmuir7y + gLEEQeHT4zLcOtXjJQ+rjTRo2vcHH/hHr3Upxv8Amh1aN0NBdqurjqT06XrXYwXMsuw35Swkosb3j3bh + AejYWJ8h/Hf8DCfMfKCqMrEw7zq97oIJVmXodQqwEzTgeXuA4arYhN8x3WWGpWfDqWgRiQGIKP12HQmG + Z/E2FYthWcbTC1L+aYNRurQuq49IWnZ9Fd1muYY5XGDT5PMQgOENZNPuUyQtrr2f6eJRUfRwx2UvYuvv + jjTEdhw/UlF1uUeCxSqkGe4VJAWsF2+MQ+VCnImz6UQKF2EUxSt16mF3lCrmY5v0fIxV/b9fv9RKsfkP + nv4EP4UR+UfIR4d029Snl0S1TQb4tqbT1GQuBh0HQS7xvtBw+mMEFDsOpvtPUOM8iW3C1439Iqiylq91 + 536YN6IBMhyB5Ir3sQcDv6Q5mWFHoj8xXujuw/xL3s3oX4V8kH9CfWWZjQ9MGDeorS0a8RQ2zN+YZmLz + 6RzMfVc+h7fen6y2fXJ1Uuwo/LHc76ayKWvyDGVbqXZRD/Z+rFPc1Xbg3WYl9l9B/oh6YQ3pTvPGvuSz + WtWwc/X+C/lP4sxPgJ89sv8AmUdSqNVjgYb75qMIWt73ljE4SxZX9n+QNaoMQB9Bpv2sSEMpHOOGUIwB + dUYSCj/MCNXYMPHSe5r0XiCtA15zKXiXPs5y5lph2hkbLIOBRwsrm3PmvtNtD5G4J1jiFGzd395RS5cd + i7mKZS+Om/CSv12PBqin2jrSUbTuYmlZ7K/VTJsS8Lea8yr8OQpe2uzcOQLS1ZC6H4lhii8B1+RDn4gN + ZVQfiBdqVWzP/Llsf1KWDS7T7fKf06jFfJXwOuj9fde8mM65b2qim9mOz57lCN1t4gaEvUsRys7noP3L + LB70QDiOUDAupryhdcHplUYHvhhZc2RMnNieLq45rWihh3V/aJcL7CharemMqHbHY9WfUltNaX4L111B + jGUXh9OnuA3EpK/U+xeoVlufTlr71EdldhoLfcaQWhfuSoNiu/BK3WAgHk7sIeWLFtGw7Dk7JmMUewVz + 7hdW3gztvDcFEVQN1gRGiWaN0DXjMqwih0PqGA+iR8Nw+Q/psJ8llaW/yXYev64rqPUU2DtgRs4w6ICs + o9dv/kW5vEjg6JZv7EpGstrEZK25dUJ6g1bdNCJ1SVruIxVhzFS6k8Dlik1YpL5LjjFGKeh9qxJK700M + LsMDpauIh13C4dINhyEZsGCudH2KpgNpZY0vC9yjttxoWwum9PcovvZ7IFOkrHcKpQPrhHwTfGRK9aes + PtdnhjS6WtSwOU2CGm4qldiOD0OnuYyJQc10+tRHzNHk0feYUEoPgxcFKiWVWpYuDbS1by0x9mrlc68F + wsncT+2kfgdMq9bJfo0wePj1LoqBiIuUwIUbqkStRpf0QFk9L/WIUET7ELbJ1e5gsCNOFn4hexBdcnuW + 91Pshy7kUDhPXcpWW1asloKiwcvSc2YjEqbXWtoYXIWgrQpivTycMFypSmBySuve9eX0NZHSahNr6LzN + fUH3JbDYbyDP2mTGdws4HP4WSsopUvoPjNJ1FytRO/TW6ZQUKF8mZaueEv8Ap/hjWsUfXzEeyCjmbHlc + 9MOLY9HZhmw6o8TYeD8wxM2qX5nDREeER68RqEIQ+FfCpUCen8p8MiMJzXnymj6sQtft/Y+miXQU4Aaq + N1a4oyPT1DgRlNZqUUW1eUF2vRWoqK1RThGW5V3pgQ4dIvXqJbReSPQ8WM/chkeojJfZ1/kzLou9Pv1H + +F1Pjqn1CCZywbmGEzZy4GJhDjnpevHEoDoLtHHqNw5OevMo9W6DgffTxDIGLOHxfmFBmOG0fPZF5npd + lYZRRbhFxfqVaK8wAzfns+0BqnDoeL0zxz87Eh1RhU6eZTW7pXcQ8ugp/sbYuj6kvCgVbov84hxWKxky + YHpZfy+O9K+E+RyT5f1/jr5amHF57wJ1Wq4/+ZrnfEyhoxW5Tzgw7EwWdjMprzy6PUKkhwqlogYcGIGs + DVLFQ+QuVxU9QhSAaRmWtS2L5ESL2X4Nf7I74Wgc5aUxfm6mfjWZaOexxBvq9tadPPcW1eR/aM6zdynW + f1+5UDpftFegWmC8mTghFdHPnuW9ukbbss/cEK5/IoEOh2PkMfUTD8YROYtUerhi2GuoJA7NiBGj7OGm + GWkGYIXa9jKjUTBZkkThYDfcCpXwr4nyB89TP8GhnCE2o2Gr1cR24KpzCuisSu5QEp9SrVcWgMzg9Q5E + Ox1QOLpHEFr/AEltkouJS0zs8xtygfxA0FDWVw3lBEqp+/8AYJPZlc+nmf8A5U2JjFBTPhA2DhoSthQi + DNdYjpo4teOBJel0uGe4Q1znGNxdxf6Y5+iy+xgO6hAcwepSiii7v/ZdtlsYoblde5hxRjUSMsoHuclf + C8IU9ftFX48f1H5iVd/SELNuUTyxGtFrQsEFp049yqrNgXFVc2TuUghwvglWbdFzMuUvMgMwab3xiaZ2 + /ME6GN31DHAV5qPeDThJn0CxpgRdlcu5l0vbaF0AvKb1v+iLrgohtv8ADEdWtEuhTsTqJxdCmm76PMz+ + gIULaeYIsNlq+rgLyOXmOcrQ3AtFBCU3azwrfuHeZy3FevFMfXKq55gXDHFHU1eMcHuIB0w+DRHStLGh + X92VQ/sHwah6Pbv9iJReXll4qLW7FPTBYpt34JZ16qI0jBCrpUOjW4K4xqAZNdRKVdjCd6OGBlPAI6oU + G7dsfKF43EN+DjmMXbbe8kPZY8lLtQbA5iYB1YjFhtj2dkFRAvKNS1OHXQ8xHLLguFfH6zuLMEXK2nl0 + Rvlx2JQXLSz6zEJ4WIVUcad1HRdHZSRA5SFmEtRnDFbHyY26l/gS4Aoc2oPcKrZWSreCWPjnxUuLH6wJ + f5JxD5qh8CvlZx858T83jRlmmCtS/h/jc0Bt5dwUwwa8sepVbb5YQAyJcWNhBCroEBls6ICgYaZpMO/U + NyU9alF1ZxkzFTQy8MyqOPXcBzTSwNxUGr7dMNYUu47brm8Im1vTBYwYFaFG0DhyQ6Ka2SnheT3EQvVl + gIZrdPqNxLZCbPT48S9+4NC9iR7jSkrcOiovByHD1G9M6TIIlUzkF1NpoWaBEs7C55eJYu0A5OvUtVCM + 1PHqHqV/ZqPGs+u7ULVsCWMrGiGk8uCW0YD9s5KxXwkWJuUoLimrYKDOURYKyqqHr7nUDAPSojRY2l2I + MsHxmACusDv7pFVu31MZSuolW/XUYtQg17teoCXjpxxBLYVumJZQxqWFNPMA5R35hGtmrlZzcLzL/wCT + FWAbOYdllRVIui7l3WzBYJRbohaCnjtPJUajXPdRhnn4Hy1/QPhSm2DLL5LV300Ecq5ovOphDoh6WGSD + BU4j3KeLqV0N9xHDaPEB5xTZWahRtsHHcorFGalDBsqCLbDV3UtvXj3COtulziUuaDh3GrY+kykClLm3 + mgzuw0WICm1Yxkm8GvUFhRV6IXUzcTh2kFMmPzOhQPcaVGx5e4IqnoXyfWVxM3aVo8eIrvmvDKfAXXg5 + IbixGhlTUO7UGnpIvGH20QK/rnwwpeF7pNQsSTelqzsRlyXqIFMctzUYDUHXzcABdPLBB4FtLgw7O+oB + W7T4QU0ccwy5rvzCgBm3nMsbWmFzMVYSincb1rH1KO0LPvBpzWhhvGhzLuskrdkrdIwxsnTvdxwWNxF/ + Mv6JEUXTUstslKgx/sLI3p8kSaFHypjn7NwU+i5ghne1Un1IOTA/Ulkuk77sIQr+1oJtEF4qAO5FsG9J + SRdJBamUuFBGK3WiLS9V8xHlvpgiagcF9H5zFdz7wD6yzNt9SKK2qE5MKx4lDV5LnfXtdYghWr29RBcr + 3uyMo2vqWrEacPcoOi75oz4hZmwahdgxWu3ctRTlnxF1PP2nErDFBswwpBBVs+vpArKgMjC7l0yw78Ax + LbnqixAVFcQ9kDzGiUo1/qmz5vvE/q9/KyV1+lWVEo/BGMyHmgy6HHEoUluA7YruxW6CWigACp/77i2k + GHT97hOBEU9a6lh9OGfCFDLkafeJfBOXUp20piqK619ZfLZAJWR0gryRrRl4gwVpSscR7jvVVAWiythU + Kt2xCWU7hR3ZCLu6gCtZTmKlkOviZkHDKfy0zFejglrGKQ8B/wCJxYuR7VERkspnKk6Cv7NBxocr6EIK + CVfHRBArExshFvH6UzJQBMkcvuaL00zGA9zZ6vMiQnO+QlNfUo0l1OV0uSEDu781cp9mmy0/aKRzAOOF + ysqu0phrPSzmCHrEoX9I4RWMTOuTM7mwCxm1a73EoMGgihjnfuYm1+Ydm94llE37xLX3uZFop9kcOxLz + iNq6xASOVTThaO5v7v192/Lf9RraBTwEVT0K+t9RDW2vYuyPHwte2KTzUdnCG/LKlNpeIcPachB2M6uo + 5tB5gI84EF+kNC/ag/iW9tKvepg5sTFy+LMei4C1vwmXkhc5Ubvw+iV9YTDYNi8n/alRock02dkqUu6v + MqLW7jXY0/eXW2LfeWJbqJvAjsvcKlhMxdytuCoQHQkyKzPlDHpLV1p4uKwMoheK7vVwrt6X8EJSnzV8 + 8fLj+XPdNwvtxNSxp3BtH0BBR+jDS/ZKELLhgDIBKbhTAXM+h6z940OgIr1vVaeB3Neg5L7XUAS2pRm+ + vcoEoc7CMQPsRjk98j3C5AV8cFlXFA7gLBuxh+1xBMrhriUSrcR7vpKDQorWfXM0rYuHAuFiw49qYtp6 + oQor3F7KxvO1L9D3HeTV3ruAzmd6gPkcxbZaSmGLFdQ0GgpLiNFp9ukAdNm9vC/p/YIF9msgONj9dOZa + 71xB3xie6glKbCWbmXiyeu8rxHMIFpZi80P/ANXGs6TMepg2V8/a24j2ymilOX+UaKOXhgTOtxZFiOOS + 0kYxoNkoDlKxN3BMCUPDKfcKCzF/suLzuI3q/QmhR14/XmB61csd3AS7/FZ4/wA1G/02Qyu168+ZV3rS + jL5OyWOwmG68+phoW6lDGzUK6JVz0O0yzguU9EODFq/UYSil+aIB8p/Sz8Lqv/rBtcVv8nWbW+sTFRd3 + V2yrFAudtU3fEU+WpdVXBiXKreNITDI+AIzyMNL6MV/WT2Gx0Mu/dhw0LahWgirqQc0HSEVWgaEpEgXW + KdcTFtIycHHEqyi5fVsGu4ZXG9McFhN1dNbgcUypYlWhHatlIImazIXKdGF+NwYGLFgy82t9RWyxih1o + hc4bxjg3mgpfAmcQk6iIZEdJCbemGlbLtgVC2MRsrgSPC4ogFRfmy0xxbJ9K+B8h8e/4D+F3To/6wFpd + A+iPbFWMXlrYDdUCAK9tT70sLMKw4Oa1N/5Z8Qvd4PKVllQa44DzK7lVT8CEX5IzbzyuGi+sLxtpqtSM + YwK/kl+42kY9MKemWvlXUoOtVO0dXBUh9OoijHqMjYL2zfZgqUD2j9SCXLzP/BDJtQkpJSbTUhPKA0bb + hg4gpW0tKuAdf8PZDTuKUOUq0Pq4aWGdwEA2HxCUSs5Aagmej5D+qQk3kOKy9kH8heFW26huutExjzzL + 8NMZdEvVnjVlxW9Kdy0WnWTmAlEDF6YZWqea3LFvTwLjVtrStdzAmkJcRwShZf1k6qUnGjFbWFL7ZJnl + lNI45+7D4IL8ZiGSl1KdkRgR9e5iX8tw8+aHbx0nSGxjW4+ShiAdXgiY8wrb7RXmjWG5YUzHFKVx5htJ + ej1ArbM+G/kP5gzFE7kr0QQraLZXcmy6tphVpvO2pZcfLKTnf8gW+cXAbtLhwQIHVz1O2G9k0xpo4SoD + lVOMHmUwwMLuoS0gWVaslZvY3ENWuoRQQrtowslav5wFAhZi+xL3KqbRUB71G+55/wA4Ft00zESsfRYC + WMFvbHfIqm50xbG5KfzNGAikqKo1Tb9SmJTemXyrTbHrSQD3mQr8cRYqpkSlbWcnhof5AC2gqBU6P+v4 + nyH8C5Ur+AhHPhL9EigTApjr8aD1UJarD88yxhh5lbQZxC0RbB1m05ZQvnUKoLXuLlLUavUNBV/jCrBX + uHbCFTydxXTAaohZfBbRMQvOEwNtA4lYlagSXYwOoD7XF8Q2KyhUbkZGQ0bvP3vARG0zI+qGCPTg3gfB + Gq8PO3LXC5juG0OjZ4lXURErbLW4RYvxcXd8Sl07B3Ab85i8LmbPbMa04Tj+dEYZVLfCpXykrq0+SLwh + XsrmApLpjKVsBTW98kx3ZwkE8LbXmDZt4g7cZ35hQVEL8a0RV6VBeqhzIsXLkNNw0JevzGEO031Cm2sa + hQ8065hpOlfqFOSgTxUuWHA6YCdWKaCsiCEswzWxgKRcoxPn08S1lusuCUwoXA9j4i0xW2uI3Kq+CVL5 + 1mFM9zLwzsrh3qX6LcaGQyg6CENjVdB6/pUSsZYvUr5P/wBVLIHlbL9ZW5m3UYijF0jsYWx0LJlrK5i0 + dT8EdWLCtajv/wDYdMsGsHXJKJqnkmdidVMb9xmBWIV7VgXUq0zW8cxbMLUHprfawHV1ct5CNtLdz8OY + JaV6wTyGWQyEPMp6LkpKS2CdqAuSQ3ExeyKCNYjC3RQp0XKvKMnOUPNx9YCMgj6VD+tSJjDLKBVhSRyy + BtcQpdg4bqVkLGfeh9iUbQDk8xe7KsXCQ9tRWsJclY5TslCsKeYuhaUwGBRK3VUuoPOAsaOF6lMFDh7j + bv6zDag4rmUJr7dy9YLuYfD+J0csOGi8TVpF3a9PLLljDxOCJQ7EyBuVzbnrUAGlDm5qWiOFxqQibFAt + Q0jrgH0lMTgl3E/mv+OpWMHgn1r2R0mwvUHhxLKaSdNbZz7dIrEobVhTVQXJTHiWrZ3G3t02YjBTCGR7 + it1viVJzoqIqdNx9aMjuBp1gfcEwiedRdEhcbgtJanSMytuksXsnEDBpdyq3e8RmmqzLo7szGzY7JhYz + 2RiieZmgZ1DcbyVWkKeCb9cvC6XvU1A3llR6lAvG0YU2ufmIf1rcwr6Mn0sl422jzFo20NAILRZdRNlq + uyGhbXG/ELq9BvGk+oojFjKOdVBL7vM0Fl3L76O81EtMwfbHcINEpTAVYZuBxCXAu4ytxDoUzIaWR+tv + 3Bq7MazKK4OyAONH+QWFr3csTxMsGqCBftxMprexE0CQNCWBAQpdRAQFwlnmzvl/cr4V5h1cGC/aYLjp + LLSKoWCnVXg9VEZy2e6CdBGWBoFYl7iQtxr3HuvNY8TXXKbOBqWV80nuI6tkxratsHwnIxLaLTV34/kl + BWis3GCxrmDd4LE1oNQNXHMVji9HkgFfoM2d1WJfKVFAk7haWmAw1DZmXq1UOjCgwOL9ZVmwQBjEuwoc + zung8/4Q/qt4i/q7Sgj4gKK6kFkVj6/UWdlFqrLPV4Fz29QtGQWqzC2bq6uAD/4I1zounctbZqXv7kYh + cMCxBaPdcEJqqY7JFwIARkBghac6tolHaevvOZZkLVOAAU7LylTFbzLita3iIinbUTTwHEeVRbqGnXO5 + Ua+0r1fzTNbx01D0pE+oYDpaYJ3s2ylllwfMfMf0mOrc599cQmhnaTu8zBsrQLwh/wBYiIg6gXx9Jvu7 + C58QYLkATMUrset/deiENKxp1wv3Hq8xct2sRiJupbfd0UdxDcUE3GNC5eqgZqhdWfoxKF0XI2V+4ynQ + vWbC7rm5W+KFLuIGh3Ct19GL5K7tJc22w9CFi4HLCSreYlSlfmWnLmC83W/Ext3KexGyJmX0Ut9S11gz + bjUPJm5ViJdeCFU2MVxLrr+CH8YP4z5dfwV8T4HwtbgBW6QMs0G1a56nQ2oZbLRJlQFrd9jqFqzNeR6Y + 6l4A1FpA5s2omXODkO1yeJSKkiFDviPRmZYDlxPN9srY2zAF5eSWEmWZLXnaGiiPSlFvdhTBSNdo8eLx + 5jBA6flumIORStf+oaLck0NhfpJQPIE5S7BE5UwY8adjHZH7pziaVGuN1WbeJYZGlyePEsIVdaWMdthF + UODWJ6TUtDaoVcAR5rlhv2wDJoi+WyhSU2sGUyMuYpbPc297f5O/5j5vpH8Mlt0A1m11AXDLFvP/AGUe + Khc1N/4uMJ7cMq+uky+C8TA6K0UcjgXCxjg6VQIqEOdXGvB6Ie9OAN/ip7MZZXoJgDh3C99K4hbQGN0E + PS4FNIxQ2I+yCHRktlGOv1F2HMN53DqovNFAyHHuWkXm42r/ANGOxg2OS4VylFZu2oG3gp07maRE0W74 + +kNSmxa7hd3cOuVsQO5We3klBcL1fLFr8N9r4qHrqteVWffUHARSXl+Tgg08nLaMxzUfBWC1wTIFm/5R + Mf0D4v8AgIOiWRKVcXqiE0sV8x36rBgW5CVWmSxwbnD0UT0eIrjGF8B0H+sCuraQPQp5e3UJrBGUxy+e + 2A5hmlyhFnmr7uKrBq8ieLItSmbbbDd1A6fDKeAO3dHB4qIHqx+kTW9MCgwaVtnb3NyAJxd+O7lPLywH + IbcxLSUCbNrB2vxGx63BsLOH6jktr9lKYMhY0rkJbo1ZadMwqaKztcv9X2cPF99xRbBBvI5Sbd+fWrf2 + CX9R1EK6k7P69fLXz7nNeEYfvTF2HlhFMlxb+BDB0K3LVEuaRUU2vf0j2Yma+IvXHNMLu9XK5hHajyHV + 8TEpw1TXmXucN1i4k0I3T/seBXGmEzrQCbRRw5NRecC0pIQ1jlq/yYt3DTYQF19i0H3csOo5cCWthwfx + 2RmtEK1HIH8Bp6gjNJUIvV7CJXvTgFlhDsnIOG7yy20SbqP+VmVzU4jbzn3EZI84FGjxlzCjg3jFKp66 + 5gf0AqF//wAKxppgK5g8Z6PYgK2iRXPpGOWEE0vcalTtgV38lAWlD6Vzk1TmD1ZTBC9klmqi88O+pYPY + 3bUt5iAvluDnjKrgliUF3Cjh+sMEMllWa1Uvt7BnXJCeMi4SvxbVnXD7hwB7qrzKIuOVtLbUBheTMHV6 + 7GYQ6E1RWLIQHY74cA9YmLlg77vshYH7lL5vvClU07g3/qIXNqb2A9xsWpJ5FT3TUJmhAfA+Y+U+XP8A + PXxrj92G1MrlSqKCgXy4CVtmrW2Fwr3dmMApNOo/4R3WbFwelT0YJvBoCZzS9o6ckWVVGtoHb3E9aRaM + vKKNj3TLqtSxpYzdhouDZiO9QLW68XA1I1BS9nFEe30HI6T6VcVU9fFW5eqldEK5jZ+8CbAowBNn0qM2 + 48im/d1Dd1mjpWV5bjhKpjuq5H1MrAKjGNC9RA29071cHxHzb+U+J8T+ifLGl6xCalqia9x6/wB8o5gA + VVlQAyA8S3tiNsArDYODh9I/pq12ePHbDbIKtXBw/aCIdVH/ADCHzvOz0eYNRaxXHtlQF3uixqCNgIq2 + ovTwFRoUo5YHJ9SWNhtt0Su+nt6L135I/Kay1fDKY7DJjs8ymk2ANb9rgVhEF1bjOnaeGoSagKqMDNDF + u0swe4iR3Ac3txGK7jskqXKfvcWvDRcD1txLBkagdYNqy18h8p8D4H9hbl3XSAHUbFaQ5lfLYoBz+ozQ + a5dy4L+XupVVdmsQ8M1VOdrXjzNI0Px4VoPzMhaLfbOgbXFksmSXQ2Vh5ZVNLv55pxDuePPfUXc+9jRj + RfcpixJMyrtb47jHKbo5ZG+zvxF0MkLouvFMt50w5u84maJQainNvFcU3LRsO4CyFbGCgCRLDWQ+lxbi + 7wusnXDZNuRdegA7bXEUyM+6q+9Sw6hyDRciI6EMZWrmKBnqK8fKfIQ+JCHzH9GnzArfpLbyCWMZ8RZo + mjk7fUqOm3DKpSHlxGNsZtW/fqC5lXbArt59RnotsyvzWVmstp4DTXK+W4CHNsL6rQ11KoI3lL2L3n8Q + YTHATSDRXLBl14X0e5Q6ssEOTwrteJazwzy8DvOL1Ea0s1FN1yavk3BnAhbtG6TOTF6uMyYtiSPH5NZl + z9vRYBFcimc8z2NEFr/9hXXnHFMpSHD0RzzDdxU9tqWCO9wOLf8A7cuuvyuoFM1g+Yh8SHyHxPkZv5Mf + xhYITGXZotd+Yb2GQWmXce/S0indMK/St0eZh/hDgLeaW5h+3woActC1j4KSLGaA0Hds4sH8/wCAcx62 + 0QzTNeIJ5zyCzWl1Xgi6AILiI0nqA5yXdK5EMj1xEMQ4EAGCznmuoeyR3JY00OwSk1pz3YFWNbZTa1gs + hQ+nnzCm56pwBOibD3KlUWBi15s9koN6zlGV5Oip3/TSCam6+BLqzp5YLDF09K+8YpqRKtweiHLDVW4Y + Find+Uh8CHxP4g+J/JUd1YCxs1FukqrWFTFdUf6wfdyNoUa+sV1RpNMC2qn7JS3FZLtLLOqhGML0B9Ic + luCgT0DTyx184B1MG05YE5vAjVtdg64g62COkqUls0HMW74ODXdeniW5NhxUYY3Z3L9RXJQlnjjxCWc5 + nBYTkMc6TS7Cjn1F60k00P0/cbjWkuubY9/WO6jOjV3gIOBnV7PEYmfdE36K9Qxc8wV75eDAfTHQ61KB + GgfI/A+B8SHyH9Ujh7eRPvXA4Sm9JAF1D8Vdm/AevUTAGz/IjZqEerUue2JauTnH/YS0wmQCJ19ZU8jR + Rbo/+MxdfwqVTJ8CHSJXkUOT8ZiSjDuSLy9HDqKDp5sDRTZZZGxpXN0LRNjgyc5lbiqZnFq+TOo4cSMK + pydWYmUdQNmiMNl2rreY1ZaczR5i7IOYg3y8O66jY6QLCBw11KK6q629DFPGgaZLj11Teuz+IfA+B/Uz + 8lRtWH3lF7jS3z9I3M22FN9SgNaC1vP+Ru0AqecS9tyt8U/UMWy91sf/ACCVa5XmJICuKuR06O4lmws1 + Au3rEqrgqND0hyPWwUdD2RmUrexSX9vM3UHoSftMSynrltrYbw07WzLq3I+pYFG31RADcXL1osdvcEPH + sEIcqHet7DuUxvVujdxfzDDf/wAIKU5v09znMx/26fzD5D4H9avkLOJT2JO1PS0vmClbt4MxzGoHOYDx + H1v09yoCmhPxcpBbddPWalKVZs2EEQeN8QcKKbNh5mRYa5vNvriXm4ZeivL1BA2bLdm5atUzvH3lhend + uTqosui7p5hUa5vK9wnQ2MiKa+XRidHxso+8ve4a5CNWKJyU7lGMjrEcPHbLGsRKwKIFcWBScgkGDQPU + /OIf0H+A+Xb/ACYvRcOIpjZbp2dS625/D6kDlSWhdIy/1b6H/IoWUUhv0xMil4C0ZiBDmngP/IQU1W7Y + NClCulxOwW2bmGiFgSWsvID71LxxFbwxuvdGHHaxs1tMsw6NjrQLjjhbEY/MtVuqSbSNyrVTJ+WAwXrb + VEIC7rXB9pwP5hqUlUKA6lXthiCByLViLLthlt+hIat38RD4nwIQ+B8CHx1/B3/Cav3/AGoLOUdM42BL + MvGGoAvetKwtCt7g+5iy6ex9LhhlorYG3b0ylAt1pLFNRQAndaJQDt8A+/1F6ahobuOre5Bbi0SRaIOZ + R2dFbqPohMUC5UQpoEQffUyeC4VhY/rrKH2Ok9w+3VtrwBoxCRXZ2c4YL59yrO2MSqeXthaLp7NcBARo + ag0h+MlXe1YuDRYjKx5St/mKjoUGtBkNkXGHLqBD5z4HyEP6QO3ROrQEsKyYcCc8MNK9fVU9TQRoK16s + AKAaxpmCM0/Rri4argugJ67hDFZwq0r1Cm3/AAVLMYKRovevtMs4WsCqe7jgXdkvxZfKc1DZD5i4SztF + qPPxhHplfDUXG/Hh9S3cXybP79wcRBv0W17WEFF2CLgfUt9hInWdgczDmBoiGVrcxr1eA0QALoBmLml5 + v29+pUpalChTrER0bfJR5y1QvuhVQ+3TufvAfEhD4HxPif08KGXG+Jc3Baggs4PZOyZC27/Uaq0DFs1+ + 4q25ora/5NQPZU/VsiFqU5w+j3Kgo2eVW7vbFYsC+N4IdYeQUeiNKujGne6gy3gf9Ya2yZTr6wBBRdBW + +ixcJt2fOnGdsfVuYM9eIB36HKnuoQvUMhuUtk70soo60GAhVmW/488H1YZRgPuwCWjefCPKu0IdOb+N + HlnQbar49eiVNd5igecPFmkeGD/xEa953+lwdruviQh8D4HxPhX8x8W6a3xA0JdvFg88SqrZeMQLRHsZ + juzbHUHV4UoFsUR2cAYHQzL7OGbJYn1x+B1LBlAUb+XuMpg7K2oie8/33ELf0KnSfuUrLWsbPgNwKYw0 + uOhmglLbHqO4VAK6qb8QjYaqySixAPUbFST/AGJNbY/4E2HbZO3j0ENKfTzKA5Igfsc/6ItbM630cB0G + JRmV1MrogOyYj0wOlEKR/Z4YJ6kNcOviHyH8B/EfEIZQbkAHVwd/c3C2obVrLColULcDKKDXmA8PnT1D + a5K85fR4IYaupVswiDtlLbIEBaB3zHcj1VW+Zlsvw0eu4uccgDkjVtU2sCW9UWNqdvcpEsqin2XAMGKR + avxEYAN2OPMKrcFPA9cSyBDQbh91mYVvCXitr/8AeaUWho7RhXgAu1lP8u4mdlbgDAoMVFlvE3Oe49q0 + 4mcHUGNxZRJxH2QFi/8AI8PxIfwH8o+MtGR7Y/8AXZ/nSAw6l15epFr2veYxtvBMe2N6vMqQauOVeWqO + GBFN+hwwYlaxW07YIOvvFjVONoWhY44v2QpaBqDYAEhQS8kGqNkPcIdkvKAhcDa7WTR94cg+PZBuVrGY + +5NvBKtVKWJWRTfl1HCtVleo6LTR562xSpm7brPCfCXqI4hpxC4Lo8+Ig25RNevcdah8fX99XA8VDe/E + dxUIQ+aofwnwvVe9fgHLLQvX9Ij3rNL0HEGMqBRRSGnnpjLlNnD1G3EHKtp3ENbw5l2m75Y47t8uGUcU + uVcIbatcmlikYfWWhGCL/wDKly5ApyIGg4ze43zwk7iylDWHjub3LS8ublYj7GVKfqh09jUUVAqVph+1 + cEb3tX39jaPtMCv1ro6Gh4Iy4VgD41NpXfymkp6ZdPROSDVIihmuMDhHhldIV762dYZXJXp95IiYcP8A + DXzHwMUl1L+jbBeO/wBkmhHk/QdHg+C5cWLKtuo7xlYfLGt/9hg6rjuFKsPGSNLSHuyYWNvow9+/UzKi + 23HD4mFMGSnCFqwAxK9z9xQYNR5qWaUMY1IAuBpd5ZlSu3CpNfd3cVKUaYWYaA12xgbmt/2fpBFuKw/U + J89b/FRiBFq6h8EA4uHwuEPLUbSJ3q5nEfQMPMK7fV4mFqJKHTBFhqRD0xh+Pu+6RBtr2rSQ+Q+OPmfQ + xcBbV0EA4dmXfnt9sUxNrn9OCO5Mvwv42qIOzlQF1mf5BTRbqXHEVVLc7ESULR4gtzbOQzCC02eyCavU + ATri0F4c0mezHEe3WRKlKr4Ew5a69ywGr7DEritmqlMn1lP8PrUfd2qq+zRELLuj1wfQhbNHwB2hFwqm + bhUJU4+FTBowobD7zB6+l0pxN+5x5CouFE17rNO+54gtTt1npOHw/GvmPiQDAwQC3v3c/DiHxfiDtbjM + ERQ9WEB10GacptTE6RBZUyaYOGRabzCFo3mAU1dx26Zh4Kt1EeVZqNBrGmDiZNxLTWL5lKYbDV91THxe + Un93JfeX7Fau18sIHxNHmFS9MVS+IJuNMFwj8KKlYmAiW1A6kqNCyTMslDxBxhczzp7JWsy3m812QgTQ + /P8A/8QALREAAgIBBAEDBAICAgMAAAAAAAECESEDEDFBEiBAUQQwMlATYSJxFLGBofD/2gAIAQIBAT8A + 9zKdZIpt22fxq7PwWFujlYKFaHnDI2M5WSqEs2meTjyRmrd/rZukJO7ZH+h2iNdbePaKE6wdX6JPBB7I + rFFZdEZvhoTTWP1Wauiu2hpy5EmuBX2hoQvlbVapkbWBUL+yUU1gTtZ2WzHlWhU8MSatIjL5F7tfbbSG + 3QqhlsV9mTKE0Ndkdk7MNbUhbNZbFt/YsoVXQqTo5RJOk0QlWH+l8lVt0jMsJUv/AGYjwLLsQiVJpmLy + ZrblEGLgpNC+Cq2aLpqyJijqhDFzY+aJLJpyxT/Ryy6Rlu7/APv6EUJHCFRKHkqIrFCKxREqnaE2iI8Z + 9EyL2oknTaE0J5aHyyVNEXTIu1f6GTpWW7pCWy9FFbIa7Qvgi1wz/JZTFJNC2djRHGNnastVQqi3Exd7 + Sq2hXyzTayv0P5S/0JXx6FYuBUW90PjbuhTcWxVJWi2IZN07ExcbSVZTHYmpKmRZzKhYsT8XaIPyV+/k + 6RFPg4wcLZZ2RaPIstlreStJjWLIX0J9GOSXFlqVFeLo05Wqe1KslcpiQ7TyRjTbH0iZovFe/wCXYqSF + tQtvIc38nmzzaeTzFJFiZ0LloSp2jElZF9MXFEl4ytDSkqZTTtCa2fFn9kiOUTdZMu2yDaVog1JX72cv + FNkcLZUlk52dDZKeaG0eQpdCkuHspNEZHn0eTqzHQrXGyuia7FwMVGVsvjZYdE08vaGE0aXHvZ5lRlPA + smHyUlwcLJKXwhzdUW9s7JibE2Jtciu+SDVXZHitlvH4HtH4Zxg72fyMdoVZNOVKhe8jltkUJLrZk5On + R5N9lt5Y2XuhCWyI2+SLRFi3eHgTey+GPrZUMoliQ75IL3knSbFhJIVbMlKibGxva9krERT7Eq2WyZ5E + ZKtryNl/BGW627o6HEaV5NHN2LK93qZSWy2ZNkmPeyIiO9IpbWKbIyFMc7R55s80hTQpoUhbLaXBTWWQ + pZI2+fdtXNi3lwTJemIr+RC9LTKfRlCbRbHLaxMiyLXzstn8IqiNJ0yPu45bYtmTeKJMl6Y4OuRGCtlt + Rkr1K0K+yMqIzExbz5s0+L90+LIWlu8GpJdDJbJCV4PFiTEhC2pFFNH+0XszHpxQiJA62eEyabjZopqC + 91LEWRVLecvkk7yMooStYEqEhLZCtC2W9FD2svZVtEliqIC4HxglxZL8DTtR91P8RbP5Jybe1Cg2eFdC + XyJIpiEKJWyT5F6WWxnHAmJ2hEObJNEOLFxYuKJ8D4I8e61MRe+rKlS2WWQ0+2KCjweKfI9Jcj0e0OLW + yF6K2d9CsdjrvZ7oQqSwWadpZFwIm8pEul7pzUeRyUlSO9taTcqW0ErTHND1GLUaI6q7FTWBwT5Hpoyn + TEy9rEP0NFDRTuxiInQiCdCEWnqf6INSk37ltJWzycm2zQq72kSfLEReC/naKbWDwl8CUlwiOp0x00Sp + seHYm6EyyxMv0sa2rvZ20QWSCOMkn4q0RtK2QXjGvc6uIMimiEvGS21XUdlvGqtibkhIjaE0+Rpp2hyv + A9roTEWWWtr6LOt0tkaazaEY4Hl5Z4eTr3X1DqNCtCy7Ea7zXpjCTWCOhi2xaUUf8duPkOMo5YnaHFMk + qLL9Fu8EYN9n8b6PBng65KZTXRT7FhbM0UI7YqTZBNK37r6jMhiFwaruTHshEZtCm3hlpqx69xpCzFtj + pZQmSVqhkUVQ7RafIiEiMl8mORUWhRiuBxTRKKStbOqNL8RYVnDY+2cY91r/AJsZCNuh0o2SzbGdiEIT + FKhajPNtVZKS4SLFNtVtFHVkqoQoshop5YtLTiOEOmODu0xCFJrJ5Jqhj4NP8ULgfbZFW0vd67/yZXRB + NEpJ6drZlCWBWKxFtFtivZ0YyLJElwPPIrfBHGWKUnwKE3yOEu4lLhEvlib4YhOne0uCGIojwh5dGneX + 7vVzJnY20qMrTWzEIWRISQoI8EYG6JPBZEiSFQrXBBLLmadJUjTdypmtNEoRlG2O4y8WPDI7IkJYFwMh + x7vUVSaOyXFksRoe6EXgTEzyLez2iRwiQhcFtMjJdEWnyzDbtjmkkkNxkqsd3kjshZkkS4oQ9TNJEZKS + te7141KyhV4scaW637s5I3WRemK2e0WONkoOLtEZWslotbU79EMy21JeMLHNo+km5Xfu9aNq0NYOWkcr + 0o5xstmYvePG7XaFgixkoJ5Wy/vdC20cyb21ZuTpDVn0sag37zUXi6ZH8iSTbfoXAhX6JbpbrZbJ4L9S + 20eGzUk26TH+NFNKzQxF+8lBSWR6bjLI1h16FwfCELd79bpdbLZ5XqQtr8IWLOTlpFGmvGKXvdX8Rcsf + Y9kZER2ZkXlV7RFFVyOrwJUiSdMXor0LbnBqtt0KxGlDydv32pwO8tDr0oW0mRVqjSqOGammo5XBFtWK + T4eybMC2z6kI+Wx82JKrIxbdIilFV77U4OI71uhNcbVeCK6R4NciyqY7WDyYk33Q/Fcsi3eGIRmh+hbd + 0OjIrSo0Y5t/dXspkuTPAx3yPbIk1wU+SKyaau2Yqh1wTTuhJrg8WV3si6PJjZYtkPgWDnkilRGLboik + lS9/qcI6srlocUsIafJS5aOHwJCvgUUuRJidYG84PIw1SJEXapkh8Wy8FqqE7Re62WRJ5s8eyKxSIQUV + +gmSyqFnFnbZJKh0nQ27wW0LBa6ZYm0qE3yL4E7pIk1VEXTtkn2NfAiMU2NOOyZ/oR3Ql2NNLBGDfBCF + fodRYTHFkKpsWeNpcjiRg2rYoR4bP4G8pn8EhwceSvhi5yikOqZXZb2dPralODTMrAqFsv6I45ILFsX6 + KStNDdrAhYwVWWeKJNLDJTvCO7ItvhibvkTk+GONcoUYvhj05Hgz+OXweD+D+KdcCg+xRwxJXkZE6QhE + bk6OF+kXwPsiY7Q8ZRJYbY9o/wBEZEWKaa2UDwSQ6Mrhjm/k/uyEnTQ5K7H8iVIk1eBEFeTTi3lfdXt0 + PEqHhsk6whZyys3ZO2qSJcLG6FaFJojqs/lHM80eezIJr/IeW3RRVKtkLHBFeMa/S6zqmfkkxJNttC2l + aRKA4tOtuOCLXJBK6ZSJRS4GjC53RCPSKyyMHeR5weIlZBLF/pvqOjSk+GK+lu12Vyx8Ma2SfJGawmWi + VJWN2+dqZFEe3RbjhFeTQ+kjFpIinZVtmny3+m+p6I2nyQncasWVtaSHaWR2nwPnOyutklwZ7P6OURVu + mV4vJwmzx+SK7J28I7oSSyTlTpM0VUb/AE31PCFzkg6dog7VjwhJ8skm3glbdJkqbpFdbrjbl2yKfQou + 2yVLJFLgrNbK28kYpttkp4pCu7ZDEa9S/QfU/jsr4NHVULiy7VoykNNrklnKHV0h1W/QuSMW7aIrhkaT + wKmjppHRV8DqOSeq2qR3QqFx+m+o/EW+jqU/ForA1ihjSV4KfL3QkKNPDKaRFCVKhUholOsIlNvsb6FR + 02aUvKF/pvqPw9OlrtYZiStFKiUWzwaVCgxwFDGTwS2UVW8ppcEpt8jkyxbSeKPpZqnF/ptf8HtzstoT + cRasayYfA4oUEsjRV9CTeSry9pTSZLUfyeTobHs9m8kJOLtEJqatfpdXMGLjdW0LHG8dRoWtJdkdd3TP + 5YfItSL7HqIeqSm3g6LpDnkz36Or2TNLVcHZGSkk1+knmDQvVhbdXslgTrFCsztY79T43izS1XBkZqSt + fo3lM7aFsqr0KjgvFNCbE9m8F/aQhYPp4ajdrgUUuSUMWv0U1U3sv6+xxyWW2W/scvahIhCUnUUaP0ij + nUz/ANbptZR4qXA01yv0Guqm91svgddCf2kvnd4QlS24WTR+mlqZeEQhGCqK9SJxSyveor5Z9TGpX6F7 + Cu99D6XiWov/AB6F6VTVMacXT91TXJgvb6vhelem/QlnIvVCEpukjR0Fp5fP2+VTHD49ss8FLtnHHp+q + dyS+716FvpfSymrlj/shCMFUV9nPpaUhxfslfQklyX69R+U2/UvQt+hbrLpIh9LKWZOjT0YafC9irXB4 + qQ7Tp/fSP6+xN+MWxbZ9PXo5FvCEp/iiH0j51GQhGCqK9ivQ0pLI04un92KtWL7P1ONN7rZbL1dDNL6e + HipPJxj2qW9XF319j//EACwRAAICAQQBAwQDAQADAQAAAAABAhEhAxAxQRIEIEAiUFFhEzAycRQjgUL/ + 2gAIAQMBAT8A+TGLZwsFqhZ5YhMaFjksw0LHA+MEeNvKx8VR4WhxaX22CvAopZHS5YqHxbF/08qwJlWs + HGGLHAqFxZHskJ/kZaR1RLT7Rn7VfRCkqQio8NGBOjoa6ZgTaySpqzNH7RCVFJO0ZpreK7ZHDaZlcEoq + StEo1x9nWcIjBvkWVSHSMMSTWWODFxRLo6GqwZE7VCfWyIvFD2roeGO3ku1YsMjhtGpprlfZYwcnSIxU + MoVvk6xvDKaZmsGLFy0LDJq0PaT7ReydFWiXAmLLbOqI4Q+KFimLKNWDX1L7HBZtmUqoz2y2hvZ2Qk4u + yT7O7E6dkhfUqY42hi/D3RAkhC4ZFpSUWJYpjWLFwkRTTaGlXBKPi6+woivYk9sUKRdo7sZF9PZp3hmH + hkoOJ1siLpKydXe0afJTTsX1KxJtNbQeEyVI1lhP7DBVkbSFYhFrekxJ7xwzjAspMcFJDTi6ZSHaEuzT + SlGiUWlge2nK8MjVYJJxpolE4iSyhx84tWSi4un89LNGEsCzli24WzFEUDxZ4niyqGQeWJ06J12hxxa2 + jadMrxTE/JWjVjTtbW08Cd5PJpCqiUrwf6WSC7RrJcr58FWTl5LFbOFsiMGyOkl0eCPBNH8Y4WuBwY4F + IfCY3apmYuiSrKJfkg/KFMi/F2XFppji1tB5o6ZpslhkMracU5UNU2vmpW0hLFHZT6OCyKIwzkjEURJH + ijxKHBPA4C003bHBJ0K+GOms7OjTdYJc0RaHbFUhDfYqollWQpY21I5TNWrx83T7YqrI00KxfsSbeCEF + 2RirsSXupDSKJx/RNLLFh0Me0uLIlVwP8rbmO0SP4FTHdGos/NjiNDZbEJWacK5EkhIW62wWJn6ZLglF + 8E44tDvneOUNJPB1aH20JYZwh9IiWRytpOsfNVdj2isGnEghC9zf4GL9bLHJSaPC1klpUzxYoWsEYMUM + 5JadLAk1aYk6Y8KtuFYqQngRrPKr5kN0RNNYIi26KH+tnut1TwUhwP4yMPFnhijxdHgOA4DTKJCIIu8I + 1baH8uA9kQIkRb9DMbO62w1umJrbGyowY6GhpUSi+ls72iu2J2TXkh/LWEPZGkuyJH2YGLbJYsoprksT + EJpF2hMvay0YGiUUTjss4ZEiTxJ18tcbLLIo040hEdrwXWS7LW7bLoTZ5YLiUhXsixexc52eSeytCy0Q + dOjV/wBP5S2QjShmxCEWN52Re7Q0jlY2oQmWyNPZFex8EbJ8D5FiWSCd0LEjUzJ/KXOyIrKRCNIW3kqF + JVbLxgsVbX2WJibLvG2RZWy/Yq4YkhbUVtPiiKJ7wqxc2Tf1P5UedomhHN7z1qwh6jk8nlIjqZoWquxN + PjaSe1iLE7yWuhNLkdCoWOBCLXe7GI1RjIcWQwm/lQhKeIoelODuS2iaMajnafDVi0haSHpReaJaDrDG + pRw0KTsjNmJK0ODR4jEtlgWyYnksTE8bvfUed1iBP6Ul8lZdENBQhg9Qn4bRy6Iqkk9qxwIX6GkuWYG4 + tU2T0KzEimmadoVNDQ0JdFDiJexCF7XwajyLLojTG02TflJv5OgvLUijxaVGpFOLT20Fct1tlYQscDY6 + eBxccpkZKSyKObQlSHkSKoaGjxdFbUikvY3vNpJksvG2UhypfK9FG9S/wcqyUbT29OsXuhJjmo5Y/UJu + kiWtOR/O4umzT1VPA407RGQqawV7VC+STUawea7QpxLQq2wx7I1XiltyjNJom+l8r0GItif0sfG2lHxg + kLZCaHBS5J6Kq0ODVpoj6dqVsa8ZIh9SyOJBux8IsvZISdZJRbWCUGuhqfCRU+BQnWEVKsim7tiflyJk + TVdS34OXfyvRY03/ANE8JErpsivKVCpYQtrEJ7eKfY9HN2PRjdtGnS7MJ5KVWjhDYmRsjFLJglqqOEj+ + TUfCIvU7Qm+0SbR5O8jipD03FiImr/oYukSdJv5fo1/6xDXTFp+Oq0xC3uhNCFRSRgkkJVhCVLaXJEh+ + C1FU2OqHGKVj14RYtaD4ZciM+mThWVtzgZDk1Hc2S5oXBPivl+lxpKjSVrJPHBd6rELj2WJtCkzzdFsR + FXyJDJUQW3m+xNpLwVs156jn9SNROMPJI0FKVts05Si2kYlFTiRl5QyTLdbQJZkyXLYreCfPy/Su9JGm + 0sGpyQzJvZbsoorBQkJUJUtmSIDMdojCLQ06pskpRzFHSpC0ZSd2R05QyU4oluv8ti5tjI6CUE2ycHB0 + /l+inhov6qJieb2W9CWKKowngarIhIWz2iMkRlSITTVMquDJbXRau2OSkqHu8QbEaUPOaRDRUsyPXaUd + NpRfy/TT8NTJGbcmyTpNi5ER9i/KOx7IjxQlWz5yVnBwWMargiyOo+GWuhtl7PfVxChHptPxWeWJpYPX + SbnXy1h2aE/JWSrwZG0siI+17x/QlW7K/A0IYymLbr3avSNCKStohmbY6t0erpy+ZCbg7RHXjODp5Fba + sQhbfvZ7wxkTLLp5GzA3s62VbZ3Q9kRg9WdDpYRF1bR5OjWl5ybXzYcoRG6REW2Nm0udo2eNcGE6e0nR + KcrwRbrI3bojwMTxvb9j39PGMdK0OnkvB6jV8Y0vnR5IdIjdZELbGzKIDlTs10tSODR1HJ+M+SSHFIQ0 + hX0O9lVe54Wyy6IWoUSxhEmoq2Sk5Nt/OhyQ/wBCwtkxexERurbFqReEyaVpoSUlZ4Ls8H0iOk3lmppx + WUSKFXYvZgm1dLbSV5G1Q+bPUz//ACvnw5NPgVULjOy3u1WzdKzVlSSEn5NkW8tmm144E0KafAp9USk5 + YY0UOKEVu3tnhEW48E3lGpNQVkm5Nt/PhyL8I8nSRGbeWJraxvbyGyuyKSVs8LeTKeTT4JKraIPyWB80 + NZwVkoqt2MxyIUlWSU6dsnNzdv7BA01m2NJZE0lRCV3Ym2rI0fqtkhJdiSeWeK4ZTQ0022Qi7sknJNIg + qwX+RlqhVJY3Y2IZpJSbJzjHlk5uT+wweSDVUS5RVXYqXJGkqYmky28I+vlIWqliSI6mk+WRUZLAoRJa + Lr6WNyXKE3jBi6aHSeB0K1gstxkmkOtmxRGSd8Go84f2NYdkaWWXY85YpW6Qptogm3dkIERfsSVcD/jg + 7cSM9OWIs+pZq/8AgnCTTG0uByT5HCDVpj8VhMdjlWKMJOhZRIWXezJPxTY/sieLET7FZHOGacrdJEeG + KkKSrIrJVJUeLg2KTXY/USV0xep1Muz+Wb5Z/J0z+RcJDmyeXbIrAsMbbdEbrO03WCcqX2WHDFTSTIq7 + bHV4FKsJGlSdtkGnlM/+iE2hSRKm7HBVZ4IVIbe3ONpPmJFPZZd7YGTdv7LoJSbTMxbRdKlsqRp5eWQm + RkmrE0KnyNdE20rR5OuSM5NWJvbN1vOVK2KXZKXZGkrLG1RN0nX2b0yuTNWGLR1srIusCfSIvpCqhXeS + 1VMlpurR4PFkLeBLAqyhMb7ZJpUkYkm2X4psji2zrI3iy3RqYik/s3pv9MfHBOFO90Qq8EaoXBmsGIie + bG2Xm0L9GE7JYyWpKkWroU6whu8I012zFWW+DShato9Q7n9m9N/tnTJryVMknFtEavkbSeCEkiFRV0Qt + LLL7M0NuzoSayYWCTWWxywkyPaY7dst1ZGx4WByxSNPTazIfFInmTfxF8L03+9nRqaTnTQl44YqItLoh + awxX2LGDN2YtiLdUOVKibdsk3JZHcT9mWy65Fc3Rp6KjliHhN/Z/TY1N1wa2la8k9ovNidMi+KE80LjJ + ZY3WTyPJcMbpNFtu9ljg09BydsjBReEKuRtvkdN0asfGbX2b0+NTdbanp01cTMXQmac0haibtHmuTzT4 + HNOyMk0LKbsb2Rp6LlyQ0kuCKxZxl7xV2z1cOJr7No4mvaieipcj0JJ4RTi8ik0fyOqFIUlR5pKkzz6W + 0NKUlaIaKj0VbwVtl8HC2XBKKknFonBwk0/suniSfsXslpxayh6EL4H6VVaP/G1H0fwyi8oWhJ9i9O1l + showjmhFFVyYMvrZHONmjV01NUyUXF0/siw0xVS3QvY/xR+y+is3Y0hJH/wS9liwIW7Rq6SmiUXF019k + hTin7I17ORVdplKrKK6EqEf82524WRC3ZYzXcEqfI1+xYdP7FoZ017FsiqK252RhGC17UcK9rGSkoq5M + 1PUuWIY3aTVMyhNfYPSu4VvQtlfe3GPdey/Z+kIxs3td8GprqGFlkpObtv3NJ8iu6fzbS5YrfCPR/wCG + hexC3XtVNFd+39LZu+zV9S3ag/6WsYItNWvk4XJbfCEm+WJJdbej5kLdexC9vVr3WSkoq2zV1nPC4969 + jSeS2uV8ZtFSFFL2I9LGoti+A2XtP1MY4jklOU3cn/aimuC1dP4TaXJliVce/Tj4xURC3Wy2ZwvdY2kr + bJepjH/KsnqTny/gIw+SnHgTTVr++n0JJcf0aS8ppbLZexCrsdXa2tJGS9pTjD/TJ+q6giUpTdyftXwK + ayhNPj+1Z/pR6ZfWdoRYse1PNe7U9RNycVg5z7l/Yt1vPFNf0f/Z +</value> + </data> + <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> + <value> + 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 + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN6SdAHeknQN3pJ0IN6SdDLeknQ63pJ0ON6SdCreknQW + 3pJ0Bt6SdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN6SdAHeknQJ + 3pJ0HN6SdDHeknRF3pJ0Wt6SdGXeknRi3pJ0Ud6SdDzeknQp3pJ0Et6SdATeknQAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAN6SdADeknQG3pJ0GN6SdCzeknRA3pJ0Vd6SdGreknR/3pJ0j96SdIjeknR1 + 3pJ0YN6SdEzeknQ23pJ0I96SdA7eknQCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN6SdADeknQE3pJ0FN6SdCfeknQ9 + 3pJ0U96SdGXeknR73pJ0j9+QdaXpbZDG44N/td6SdJreknSH3pJ0cd6SdFzeknRI3pJ0Mt6SdB3eknQK + 3pJ0AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAADeknQC3pJ0Dt6SdCLeknQ33pJ0Td6SdGDeknR23pJ0it6SdJ7meIe99zy06/8jx/79KsL5 + 8Fag2N+Od6zeknSU3pJ0gd6SdGveknRW3pJ0Qd6SdC3eknQY3pJ0CN6SdAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeknQC3pJ0C96SdB7eknQy3pJ0R96SdFzeknRy + 3pJ0ht6SdJrjgoC39Eiq4/8lxP7/I8b//yPG//8jxv//I8b/+y+89utllc3fj3an3pJ0kd6SdHzeknRn + 3pJ0U96SdD/eknQq3pJ0FN6SdAXeknQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeknQB + 3pJ0B96SdBneknQv3pJ0Qt6SdFfeknRs3pJ0gN6SdJXfjXes8Fag2P0rv/r/JMT//yTE//8kxP//JMT/ + /yTE//8kxP//JMT//yTE//g7s+3ndYnB3pJ0oN6SdIveknR23pJ0Y96SdE3eknQ43pJ0JN6SdA/eknQC + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAADeknQA3pJ0Bd6SdBXeknQq3pJ0Pt6SdFTeknRo3pJ0fN6SdJLfj3an + 7GSVzvwwuvb/JMP//yTD//8kw///JMP//yTD//8kw///JMP//yTD//8kw///JMP//yTD//8lwv71Rqvl + 5H6Cud6SdJzeknSI3pJ0ct6SdF/eknRJ3pJ0NN6SdB/eknQM3pJ0AgAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3pJ0A96SdA/eknQj + 3pJ0ON6SdE7eknRi3pJ0d96SdI3eknSg53OKwvg7su7/JcH//yXB//8lwf//JcH//yXB//8lwf//JcH/ + /im+/P8lwf//JcH//yXB//8lwf//JcH//yXB//8lwf/9Kr778VOh2+CLea7eknSW3pJ0g96SdG3eknRY + 3pJ0Q96SdC/eknQb3pJ0Cd6SdAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAA3pJ0At6SdA7eknQf3pJ0Nd6SdEneknRe3pJ0c96SdIneknSb5H6CuvVGqeb/Jr// + /yXA//8lwP//JcD//yXA//8lwP//JcD//iq9/PJPo97hiXuz6G+Mxvk5s/D/JsD//yXA//8lwP//JcD/ + /yXA//8lwP//JcD//C+5+O1hltHfjnep3pJ0k96SdH7eknRp3pJ0Vd6SdEHeknQq3pJ0Ft6SdAbeknQA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3pJ0Ad6SdAneknQZ3pJ0Md6SdETeknRY + 3pJ0bd6SdIPeknSX4Yp6sPFTn9v+K7v7/ya+//8mvv//Jr7//ya+//8mvv//Jr7//ya+//ZEqujlfIO7 + 3pJ0nd6SdIveknST3453qO1hltD8MLj4/ya+//8mvv//Jr7//ya+//8mvv//Jr7//ya+//k5svHpcIzF + 3pJ0ot6SdI3eknR53pJ0Zd6SdE/eknQ73pJ0Jd6SdBHeknQDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + 3pJ0AN6SdAbeknQW3pJ0Ld6SdEDeknRV3pJ0a96SdH7eknST3413qu1gltL8L7f5/ye9//8nvf//J73/ + /ye9//8nvf//J73//ye9//k7sO/ocYrE3pJ0od6SdI3eknR43pJ0aN6SdG7eknSB3pJ0l+CLea3xVJ7b + /Sy5+/8nvf//J73//ye9//8nvf//J73//ye9//8ovf/3Q6rp5XqEvN6SdJ/eknSJ3pJ0dd6SdGDeknRK + 3pJ0Nt6SdCHeknQN3pJ0At6SdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3pJ0AN6SdAPeknQR3pJ0Jd6SdDreknRP3pJ0Zd6SdHneknSO + 3pJ0o+lvi8b6OLDx/yi7//8nu///J7v//ye7//8nu///J7v//ye7//wxtfftYpTQ3452qN6SdJLeknR9 + 3pJ0a96SdG7eknR63pJ0dt6SdGreknRz3pJ0h96SdJ3kgIC49Uem5f8ou/7/J7v//ye7//8nu///J7v/ + /ye7//8nu//+K7n880+h3+GIe7HeknSa3pJ0hN6SdG/eknRa3pJ0Rt6SdDHeknQd3pJ0Cd6SdAEAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3pJ0AN6SdALeknQP + 3pJ0I96SdDbeknRM3pJ0YN6SdHXeknSK3pJ0nuV7g7z3Qqnr/yi6//8ouv//KLr//yi6//8ouv//KLr/ + /yi6//0utvrxVpza4Ix4rt6SdJbeknSB3pJ0bt6SdGjeknR53pJ0kN6SdKTeknSb3pJ0hd6SdG/eknRo + 3pJ0d96SdIveknSh53aHwfg+rO3/Kbr+/yi6//8ouv//KLr//yi6//8ouv//KLr//S+2+u9dl9XgjHis + 3pJ0lN6SdIDeknRr3pJ0V96SdELeknQs3pJ0Gd6SdAfeknQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAN6SdAHeknQK3pJ0HN6SdDHeknRI3pJ0Wt6SdG/eknSE3pJ0meGHe7LzT6Dh + /i22/P8puP//Kbj//ym4//8puP//Kbj//ym4//8quP71SqPl44F/t96SdJveknSH3pJ0c96SdGfeknRx + 3pJ0ht6SdJzlfIK890On6u9cl9bfj3ap3pJ0kd6SdHzeknRp3pJ0at6SdH3eknSQ3492putoj8z7NbH2 + /ym4//8puP//Kbj//ym4//8puP//Kbj//ym4//o4r/Pqa43J3pF0pN6SdI/eknR83pJ0Zt6SdFHeknQ9 + 3pJ0J96SdBLeknQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN6SdADeknQH3pJ0GN6SdC3eknRD + 3pJ0Vt6SdGzeknSB3pJ0leCMeKzvW5fW/S+z+v8pt///Kbf//ym3//8pt///Kbf//ym3//8qt/74P6nt + 5niFv96SdJ/eknSK3pJ0dt6SdGXeknRq3pJ0f96SdJXhinmu8Vaa3P4stf3/Kbf//ym3//o5rfLocojE + 3pJ0oN6SdIreknR03pJ0Zd6SdGveknSA3pJ0ld+Nd6vvWpjX/TCz+f8pt///Kbf//ym3//8pt///Kbf/ + /ym3//8pt//4QKjt53eFwd6SdKDeknSL3pJ0eN6SdGHeknRM3pJ0N96SdCPeknQP3pJ0AwAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAN6SdADeknQE3pJ0E96SdCfeknQ83pJ0Ud6SdGfeknR73pJ0j96SdKbrao3L+zit8/8qtv//Krb/ + /yq2//8qtv//Krb//yq2//8qtv/7Nq7162qOy9+QdabeknSQ3pJ0e96SdGjeknRk3pJ0dt6SdIveknSi + 6m6LyPs3rfT/KrX//yq1//8qtf//KrX//yq1//4stP30TZ/i4Yh7st6SdJfeknSB3pJ0bN6SdGTeknRw + 3pJ0ht6SdJrjhH2180+f4v4stf7/Krb//yq2//8qtv//Krb//yq2//8qtv/+LbT99Eyg4+KEfbbeknSb + 3pJ0hd6SdHHeknRc3pJ0SN6SdDTeknQe3pJ0C96SdAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN6SdADeknQD3pJ0D96SdCXeknQ53pJ0Td6SdGLeknR3 + 3pJ0jN6SdKHndoXB+EGm7f8rtP//K7T//yu0//8rtP//K7T//yu0//8rtP/9MrD5712V1N+Od6veknSV + 3pJ0gN6SdGveknRh3pJ0bt6SdIXeknSa44J+t/ZHouj/K7T//yu0//8rtP//K7T//yu0//8rtP//K7T/ + /yu0//8rtP/9Mq/57WSQ0N+PdqbeknSQ3pJ0ed6SdGXeknRk3pJ0dN6SdIreknSf5XyCvfdEpOn/LLT+ + /yu0//8rtP//K7T//yu0//8rtP//K7T//S+x+/BZl9nhinmv3pJ0lt6SdIHeknRt3pJ0Wt6SdEPeknQv + 3pJ0G96SdAjeknQBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeknQB + 3pJ0C96SdB/eknQz3pJ0Sd6SdF7eknRx3pJ0ht6SdJrjg3229Eyf5P4tsf3/K7P//yuz//8rs///K7P/ + /yuz//8rs//+LbL+81Gc4OKFfLTeknSZ3pJ0hd6SdHHeknRh3pJ0Zt6SdHveknSR35B1qe9dlNb9Ma/6 + /yuz//8rs///K7P//yuz//8rs///K7P//yuz//8rs///K7P//yuz//8rs///K7L/+EGl7OV8gr3eknSc + 3pJ0ht6SdHDeknRg3pJ0aN6SdHreknSO3pF1pOpuisj6Oqrz/yuz//8rs///K7P//yuz//8rs///K7P/ + /yuz//s3rPbsZo/O3pF1pt6SdJLeknR93pJ0aN6SdFTeknQ93pJ0Kd6SdBTeknQF3pJ0AAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAADeknQB3pJ0CN6SdBreknQv3pJ0RN6SdFneknRt3pJ0hN6SdJbhiXmv + 8ViW2v4wr/z/LLH//yyx//8ssf//LLH//yyx//8ssf//LbH+90ai6eV9gbzeknSd3pJ0id6SdHTeknRi + 3pJ0Yd6SdHXeknSK3pJ0oOh0hsP6Pafx/yyx//8ssf//LLH//yyx//8ssf//LLH//i6w/vZHoen8N6v2 + /yyx//8ssf//LLH//yyx//8ssf//LLH//i6w/fFWmNzhinmv3pJ0ld6SdH/eknRp3pJ0Xt6SdGneknR/ + 3pJ0kt+PdqnuYZHT/DWs9/8ssf//LLH//yyx//8ssf//LLH//yyx//8ssf/5Pqbw6HKHxd6RdKLeknSN + 3pJ0ed6SdGPeknRO3pJ0Ot6SdCXeknQS3pJ0A96SdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeknQA3pJ0Bt6SdBXeknQp + 3pJ0Pt6SdFPeknRo3pJ0ft6SdJHfkHWn7GaOz/w3qfb/LLD//yyw//8ssP//LLD//yyw//8ssP//LLD/ + +jyn8ulvicjekXWj3pJ0j96SdHneknRl3pJ0Xd6SdGreknSB3pJ0l+GIerL0UJvh/i+u/f8ssP//LLD/ + /yyw//8ssP//LLD//yyw//s5qPXpb4nI3pF1pOGIerHzUprf/y6v/v8ssP//LLD//yyw//8ssP//LLD/ + /yyw//s5qPXqbYrJ3pJ0o96SdIzeknR23pJ0Yt6SdF7eknRv3pJ0hd6SdJjhh3qy8lWY3v4vrv3/LLD/ + /yyw//8ssP//LLD//yyw//8ssP/+Lq/+9kmf5+SBfrneknSc3pJ0iN6SdHLeknRe3pJ0Sd6SdDbeknQf + 3pJ0Dd6SdAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAADeknQA3pJ0BN6SdBDeknQm3pJ0O96SdE/eknRk3pJ0ed6SdI3ekXWj6HKGxfk+pPH/La7/ + /y2u//8trv//La7//y2u//8trv//La7//Dep9+5jkNHekXWn3pJ0k96SdH7eknRp3pJ0W96SdGXeknR5 + 3pJ0j9+PdabsZo3P/TSq+f8trv//La7//y2u//8trv//La7//y2u//4xrPzxWZXa4I13rN6SdJPeknR/ + 3pJ0iN6SdJ3meYPA+UGj7/8trv//La7//y2u//8trv//La7//y2u//8trv/2SJ/p5IB+ud6SdJreknSF + 3pJ0b96SdF3eknRg3pJ0c96SdIneknSc5IB+ufZKnub+L63+/y2u//8trv//La7//y2u//8trv//La7/ + /jCt/fJWl93ih3qy3pJ0mN6SdIPeknRw3pJ0W96SdEXeknQy3pJ0G96SdAneknQBAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3pJ0At6SdAzeknQh3pJ0Nd6SdEreknRg + 3pJ0c96SdIjeknSd5IB+uvZJnej+L6z+/y6t//8urf//Lq3//y6t//8urf//Lq3//jGr/PJWltzhiXmx + 3pJ0mN6SdIPeknRv3pJ0Xd6SdFzeknRw3pJ0ht6SdJ7lfn+7+ESg7f8urf//Lq3//y6t//8urf//Lq3/ + /y6t//8urf/3RaDr5XyAvN6SdJzeknSG3pJ0cN6SdFveknRk3pJ0e96SdJPfj3ao7mGQ0/00qvr/Lq3/ + /y6t//8urf//Lq3//y6t//8urf/9NKr6712S1t+PdqneknSS3pJ0fN6SdGbeknRa3pJ0ZN6SdHjeknSN + 3pF0o+hzhsT5QKPw/y6t//8urf//Lq3//y6t//8urf//Lq3//y6t//w3qPfuYo/S3491qd6SdJTeknR+ + 3pJ0at6SdFXeknQ/3pJ0Kt6SdBbeknQG3pJ0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + 3pJ0Ad6SdAneknQc3pJ0Md6SdEXeknRb3pJ0b96SdITeknSa4od6svJUlt7+Mar9/y6r//8uq///Lqv/ + /y6r//8uq///Lqv//jCq/fVLm+bjgn243pJ0nN6SdIfeknRy3pJ0Xt6SdFjeknRo3pJ0ft6SdJXgi3iu + 8VeU3f4xqv3/Lqv//y6r//8uq///Lqv//y6r//8uq//8OKb37GiLzd6SdKTeknSO3pJ0eN6SdGHeknRL + 3pJ0Nt6SdEDeknRX3pJ0bd6SdILeknSY4oZ7tPVNmuX+MKr+/y6r//8uq///Lqv//y6r//8uq///Lqv/ + +j2j8+hzhcTeknSg3pJ0it6SdHTeknRg3pJ0WN6SdGjeknR83pJ0kN6RdafsZ4zO+zml9f8uq///Lqv/ + /y6r//8uq///Lqv//y6r//8uq//6PKP06m+IyN+QdaTeknSQ3pJ0et6SdGXeknRQ3pJ0PN6SdCfeknQU + 3pJ0BN6SdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3pJ0AN6SdAbeknQY3pJ0K96SdEDeknRU3pJ0at6SdH/eknSU + 35B1qe5hjtT8N6X4/y+q//8vqv//L6r//y+q//8vqv//L6r//y+q//lBoPDodYTD3pF0ot6SdIzeknR4 + 3pJ0Yt6SdFbeknRg3pJ0dd6SdIzeknSi6m6Hyfs8o/T/L6r//y+q//8vqv//L6r//y+q//8vqv/+Man+ + 81OX4eGIebHeknSX3pJ0gN6SdGveknRU3pJ0Pt6SdCjeknQX3pJ0Ht6SdDXeknRJ3pJ0X96SdHXeknSL + 3pF0o+lxhsb7PKP0/y+q//8vqv//L6r//y+q//8vqv//L6r//jGp/fRQmOLhiHmy3pJ0l96SdIPeknRq + 3pJ0Wd6SdFreknRu3pJ0gt6SdJbhiniw8FuS2v4zqPv/L6r//y+q//8vqv//L6r//y+q//8vqv//MKn+ + 90ed6+V9f7zeknSe3pJ0id6SdHTeknRg3pJ0Td6SdDfeknQh3pJ0D96SdAIAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3pJ0AN6SdATeknQT + 3pJ0J96SdD7eknRR3pJ0Zd6SdHreknSP35B1pepuh8r6PqH0/zCp//8wqf//MKn//zCp//8wqf//MKn/ + /zCp//s7ovXraonM3pF1pd6SdJDeknR93pJ0Z96SdFbeknRZ3pJ0b96SdITeknSa5IF9uPZMmuf/MKn/ + /zCp//8wqf//MKn//zCp//8wqf//MKj/+UKf8OZ5gb/eknSe3pJ0iN6SdHLeknRc3pJ0Rt6SdC/eknQi + 3pJ0Kd6SdDDeknQt3pJ0JN6SdCbeknQ63pJ0UN6SdGjeknR93pJ0k9+OdqrwXJHY/TSm+/8wqf//MKn/ + /zCp//8wqf//MKn//zCp//03pfntZozR3492p96SdJDeknR53pJ0ZN6SdFbeknRd3pJ0ct6SdIbeknSa + 4oV7tfRQl+P+Mqf9/zCp//8wqf//MKn//zCp//8wqf//MKn//jGo/vRSluLihXu03pJ0mt6SdIXeknRy + 3pJ0XN6SdEjeknQz3pJ0Hd6SdAreknQBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAN6SdALeknQO3pJ0It6SdDjeknRL3pJ0Yd6SdHbeknSK3pJ0nuZ7gL73R5vr + /zGm/v8wp///MKf//zCn//8wp///MKf//zCn//01pfvwXZDY4It4rt6SdJXeknSB3pJ0bd6SdFneknRU + 3pJ0Zd6SdHveknSR3491qu9gjdT9NqT6/zCn//8wp///MKf//zCn//8wp///MKf//TWk++5ijdPfjnap + 3pJ0kd6SdHveknRl3pJ0T96SdDjeknQi3pJ0Ht6SdDjeknRP3pJ0Wd6SdFbeknRF3pJ0Kt6SdBreknQu + 3pJ0Rd6SdFneknRv3pJ0ht6SdJzlfn6890ib6/8wp///MKf//zCn//8wp///MKf//zCn//8wp//4RZzt + 5Xx/vd6SdJzeknSH3pJ0ct6SdFveknRU3pJ0Yd6SdHbeknSM3pJ0oOd5gb/4RZzt/zCn//8wp///MKf/ + /zCn//8wp///MKf//zCn//03o/nwXo/X3452rN6SdJXeknSA3pJ0bN6SdFbeknRB3pJ0LN6SdBjeknQH + 3pJ0AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN6SdALeknQK3pJ0Ht6SdDLeknRH + 3pJ0Xd6SdHLeknSF3pJ0nOOEe7b0UpXi/zKl/v8xpv//Mab//zGm//8xpv//Mab//zGm//40pP30UpXi + 4oZ6td6SdJneknSF3pJ0cN6SdFzeknRR3pJ0Xt6SdHTeknSK3pJ0oOh2gsL6QJ7y/zGm//8xpv//Mab/ + /zGm//8xpv//Mab//zKl/vVOl+XihXu13pJ0md6SdIPeknRs3pJ0V96SdEDeknQq3pJ0FN6SdA/eknQy + 3pJ0VN6SdHTeknSE3pJ0f96SdGXeknRD3pJ0H96SdA7eknQe3pJ0NN6SdEreknRh3pJ0ed6SdI3eknSk + 62uIzPw7oPb/Mab//zGm//8xpv//Mab//zGm//8xpv/+M6T98liR3eGKeLDeknSV3pJ0f96SdGneknRV + 3pJ0VN6SdGbeknR63pJ0kN6SdKTqbobJ+j+f8/8xpv//Mab//zGm//8xpv//Mab//zGm//8xpv/7PKD1 + 62qIzd+QdafeknSR3pJ0fN6SdGfeknRS3pJ0Pt6SdCreknQU3pJ0Bd6SdAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAN6SdADeknQH3pJ0Gt6SdC3eknRC3pJ0V96SdGveknSA3pJ0luCOdqzwXo7X/Tih+v8ypP//MqT/ + /zKk//8ypP//MqT//zKk//8ypP/3SJns5nmAv96SdKHeknSL3pJ0dt6SdGHeknRQ3pJ0Vt6SdGreknSB + 3pJ0mOGJeLD0U5Ti/jSj/f8ypP//MqT//zKk//8ypP//MqT//zKk//s+nvTqcIXI3pJ0ot6SdIzeknR1 + 3pJ0X96SdEneknQz3pJ0HN6SdAneknQE3pJ0H96SdETeknRp3pJ0j+CTe67eknWg3pJ0fd6SdFfeknQy + 3pJ0Dt6SdAPeknQR3pJ0J96SdD/eknRV3pJ0at6SdIDeknSW4Yl5sfJWkuD+M6P+/zKk//8ypP//MqT/ + /zKk//8ypP//MqT/+z2e9epvhcneknSi3pJ0jN6SdHbeknRg3pJ0UN6SdFfeknRs3pJ0f96SdJXgjHet + 72GM1f04ofr/MqT//zKk//8ypP//MqT//zKk//8ypP//MqT/+Eaa7ed4gcHeknSf3pJ0i96SdHbeknRi + 3pJ0Tt6SdDjeknQk3pJ0EN6SdAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeknQE3pJ0Ft6SdCneknQ/3pJ0VN6SdGfeknR8 + 3pJ0kd+PdafsaofN+zyd9v8yo///MqP//zKj//8yo///MqP//zKj//8yo//6QJzy6m+Fyd6SdKPeknSP + 3pJ0et6SdGbeknRS3pJ0Ud6SdGTeknR53pJ0j9+QdabtZ4nR/Dqf+f8yo///MqP//zKj//8yo///MqP/ + /zKj//42ofvxW4/a3492q96SdJPeknR93pJ0Z96SdFDeknQ63pJ0JN6SdA/eknQC3pJ0AN6SdBHeknQ2 + 3pJ0Wt6SdH7fknak9qXH6eeZk8LeknSQ3pJ0bN6SdEneknQk3pJ0BN6SdADeknQH3pJ0G96SdC/eknRF + 3pJ0W96SdHHeknSJ3pJ0neZ7f7/5RZru/zKi//8yo///MqP//zKj//8yo///MqP//zKi//ZMlunkgXy5 + 3pJ0m96SdIXeknRv3pJ0WN6SdE7eknRb3pJ0cd6SdITeknSY4Yl5svNWkd7+NaH8/zKj//8yo///MqP/ + /zKj//8yo///MqP//zOi/vVQlOXkgXy53pJ0m96SdIneknRz3pJ0Xt6SdEreknQ03pJ0H96SdAveknQB + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + 3pJ0BN6SdBzeknQ53pJ0Tt6SdGLeknR43pJ0jN6SdKDnd4HC+EaY7v8zof//M6H//zOh//8zof//M6H/ + /zOh//8zof/9OZ757mOL1OCNdqveknSU3pJ0f96SdGveknRW3pJ0Td6SdFreknRw3pJ0iN6SdJzlfn68 + +EiX7P8zof//M6H//zOh//8zof//M6H//zOh//8zof/4SZfs5X59u96SdJzeknSG3pJ0cN6SdFneknRE + 3pJ0Ld6SdBfeknQF3pJ0AAAAAADeknQF3pJ0JN6SdEneknRv3pJ0lOmbmcf/rOH++KfM7t+TdqfeknSC + 3pJ0XN6SdDfeknQS3pJ0AQAAAADeknQC3pJ0Dd6SdCLeknQ33pJ0T96SdGXeknR73pJ0kN+PdqjuZIrT + /Tie+v8zof//M6H//zOh//8zof//M6H//zOh//04n/rvYIzX3491qd6SdJLeknR83pJ0Zt6SdFHeknRP + 3pJ0X96SdHTeknSK3pJ0neV9fr32TJXp/zOh//8zof//M6H//zOh//8zof//M6H//zOh//03n/vxW47b + 4It3r96SdJbeknSD3pJ0bd6SdFjeknRD3pJ0LN6SdA3eknQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN6SdADeknQV3pJ0ON6SdFneknR03pJ0h96SdJzkgXy6 + 9U+T5v80n/7/M6D//zOg//8zoP//M6D//zOg//8zoP/+N5788leP3+GKeLHeknSY3pJ0g96SdG7eknRZ + 3pJ0TN6SdFTeknRo3pJ0f96SdJXhi3ev8VuN3P41n/3/M6D//zOg//8zoP//M6D//zOg//8zoP/8PJv3 + 62yGzN6RdKTeknSN3pJ0eN6SdGHeknRL3pJ0Nd6SdB/eknQK3pJ0AQAAAAAAAAAA3pJ0Ad6SdBTeknQ6 + 3pJ0Xt6SdIPfk3ep+qnP8/+s3///rN//7J2hzt6SdJXeknRx3pJ0Td6SdCreknQHAAAAAAAAAAAAAAAA + 3pJ0BN6SdBTeknQr3pJ0QN6SdFbeknRs3pJ0gt6SdJnihnmz9VCS5f41n/7/M6D//zOg//8zoP//M6D/ + /zOg//8zoP/6Qpnz6HWBxd6SdKHeknSK3pJ0dN6SdF7eknRM3pJ0Ud6SdGTeknR43pJ0jt6SdKHpdILG + +USY8P80n///M6D//zOg//8zoP//M6D//zOg//8zoP/8O5z47WiI0N+OdqreknSS3pJ0ft6SdGfeknRJ + 3pJ0Jt6SdAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + 3pJ0A96SdCPeknRM3pJ0ct6SdJTgi3ev8VuN3P04nPv/NJ7//zSe//80nv//NJ7//zSe//80nv//NZ7/ + 9k6T6OV+fbveknSe3pJ0it6SdHTeknRf3pJ0TN6SdEzeknRf3pJ0d96SdIzeknSi6nGDyPtAmfX/NJ7/ + /zSe//80nv//NJ7//zSe//80nv//NZ7+81eO3+GIeLPeknSW3pJ0gd6SdGreknRV3pJ0Pt6SdCjeknQS + 3pJ0A96SdAAAAAAAAAAAAAAAAADeknQI3pJ0Kd6SdE7eknRz3pJ0mO6fptL/rd3//63d//+t3f/7qtH1 + 4JN6rd6SdIfeknRh3pJ0PN6SdBfeknQBAAAAAAAAAAAAAAAA3pJ0Ad6SdAneknQc3pJ0M96SdEjeknRg + 3pJ0dd6SdIvekXSh6XOCxvtBmfT/NJ7//zSe//80nv//NJ7//zSe//80nv/+Np399FOQ4uGIeLLeknSX + 3pJ0gd6SdGveknRV3pJ0Sd6SdFXeknRp3pJ0ft6SdJTfjnap7WeI0fw8m/j/NJ7//zSe//80nv//NJ7/ + /zSe//80nv//NJ7/+USX8Oh1gcXeknSh3pJ0hN6SdGDeknQ43pJ0EAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeknQF3pJ0Kd6SdFPeknR+3pJ0qPtAmPX/NZ3/ + /zWd//81nf//NZ3//zWd//81nf//NZz/+UWV8Oh2gMTeknSi3pJ0jN6SdHjeknRk3pJ0T96SdEneknRY + 3pJ0bt6SdITeknSa44N7ufZOkuj/NZz//zWd//81nf//NZ3//zWd//81nf//NZ3/+UaV7+d6fsHeknSe + 3pJ0id6SdHPeknRc3pJ0Rd6SdC/eknQZ3pJ0B96SdAAAAAAAAAAAAAAAAAAAAAAA3pJ0At6SdBveknQ+ + 3pJ0Y96SdIjilX+y/KvS+P+u2///rtv//67b//+u2//woazZ3pJ0mt6SdHXeknRR3pJ0LN6SdAreknQA + AAAAAAAAAAAAAAAAAAAAAN6SdALeknQO3pJ0JN6SdDzeknRQ3pJ0Zt6SdHzeknST3452q/Bfitj9OZv7 + /zWd//81nf//NZ3//zWd//81nf//NZ3//Tua+e1ohtHfj3Wn3pJ0kN6SdHreknRj3pJ0Tt6SdEneknRZ + 3pJ0bt6SdILeknSX4Ix3rvFcjNv9OZv7/zWd//81nf//NZ3//zWd//81nf//NZ3//zWc/+xphs/eknSS + 3pJ0ad6SdD3eknQUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAN6SdAXeknQp3pJ0U96SdH7eknSp/TuZ+v81m///NZv//zWb//81m///NZv//D6Y+O1phtDfj3Wo + 3pJ0kt6SdH3eknRo3pJ0VN6SdEfeknRQ3pJ0Z96SdHveknSR35B1qO9iiNX9O5n6/zWb//81m///NZv/ + /zWb//81m///NZv//TqZ+u5kh9Xfj3Wp3pJ0kd6SdHveknRl3pJ0UN6SdDneknQi3pJ0Dd6SdAEAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAADeknQL3pJ0L96SdFTeknR53pJ0nPKjsd3/rtn//67Z//+u2f//rtn/ + /67Z//2s0/rjloK13pJ0it6SdGbeknRB3pJ0HN6SdAIAAAAAAAAAAAAAAAAAAAAAAAAAAN6SdADeknQG + 3pJ0F96SdCzeknRD3pJ0Wd6SdG/eknSG3pJ0m+WAfLr3TJLq/zWb//81m///NZv//zWb//81m///NZv/ + /zab//hJk+3lfny93pJ0nN6SdIfeknRx3pJ0Wt6SdEneknRL3pJ0Xd6SdHTeknSH3pJ0nOSCe7n1UZDm + /zab/v81m///NZv//zWb//81m///NZv/72OI1N6SdJPeknRp3pJ0Pd6SdBQAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3pJ0Bd6SdCneknRT3pJ0ft6SdKn9PJj6 + /zaa//82mv//Npr//jqY/PFeitrgjXau3pJ0lt6SdILeknRs3pJ0V96SdEfeknRJ3pJ0Xd6SdHPeknSK + 3pJ0ouh3f8P6RZPy/zaa//82mv//Npr//zaa//82mv//Npr//zeZ/vVRj+Xih3m03pJ0md6SdITeknRs + 3pJ0Vt6SdEDeknQq3pJ0Ft6SdAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3pJ0A96SdB/eknRE + 3pJ0aN6SdI7kl4a6/q7T/P+v1v//r9b//6/W//+v1v//r9b//6/W//SltuPeknSg3pJ0e96SdFbeknQx + 3pJ0Dt6SdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeknQB3pJ0Ct6SdB7eknQ03pJ0St6SdGHeknR3 + 3pJ0jd6SdKPrboPM+0CW9v82mv//Npr//zaa//82mv//Npr//zaa//44mf3yWord4Yp3r96SdJXeknR/ + 3pJ0ad6SdFPeknRF3pJ0Tt6SdGHeknR43pJ0i96SdKDnen7C+UiS7/82mv//Npr//zaa//82mv/vZIfU + 3pJ0k96SdGneknQ93pJ0FAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAADeknQF3pJ0Kd6SdFPeknR+3pJ0qf08lvr/N5j//zeY//83mP/2T4/o3pJ0ot6SdIjeknRy + 3pJ0Xd6SdEneknRE3pJ0Vt6SdGveknSB3pJ0luGJeLH0Vovh/jiY/f83mP//N5j//zeY//83mP//N5j/ + /zeY//tClPXpc4HH3pF0ot6SdIveknR13pJ0YN6SdEreknQy3pJ0Hd6SdAjeknQBAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAADeknQP3pJ0NN6SdFreknR93pJ1ovanuef/r9T//6/U//+v1P//r9T/ + /6/U//+v1P//r9T//q7S/eaZi77eknSP3pJ0a96SdEfeknQh3pJ0AwAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAA3pJ0A96SdBHeknQn3pJ0Pd6SdFPeknRq3pJ0gN6SdJbhiXiw8lmL3/44mP7/N5j/ + /zeY//83mP//N5j//zeY//83mP/7QpT16nCCyt6SdKLeknSM3pJ0dt6SdGDeknRL3pJ0RN6SdFTeknRn + 3pJ0fd6SdJPlfny+/zeY//83mP//N5j//zeY/+9khtTeknST3pJ0ad6SdD3eknQUAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN6SdAXeknQp3pJ0U96SdH7eknSp + /TyV+v83l///N5f//zeX//ZQjefeknSd3pJ0c96SdFDeknRB3pJ0Td6SdGPeknR53pJ0kd+QdaftaoPQ + /D6U+f83l///N5f//zeX//83l///N5f//zeX//47lfzwX4jZ3451q96SdJPeknR93pJ0Z96SdFHeknQ7 + 3pJ0Jt6SdA/eknQCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3pJ0BN6SdCPeknRI + 3pJ0bd6SdJLom5LG/6/R/v+w0v//sNL//7DS//+w0v//sNL//7DS//+w0v//sNL/+Km97N6SdabeknSA + 3pJ0W96SdDbeknQT3pJ0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3pJ0AN6SdAbeknQZ + 3pJ0Lt6SdEXeknRb3pJ0cd6SdIjeknSf5nx8v/lJkO//N5f//zeX//83l///N5f//zeX//83l///N5f/ + 9k+O6eSBerneknSb3pJ0hd6SdG7eknRZ3pJ0Rd6SdEXeknRh3pJ0iOV+fLz/N5f//zeX//83l///N5f/ + 72SG1N6SdJPeknRp3pJ0Pd6SdBQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAA3pJ0Bd6SdCneknRT3pJ0ft6SdKn9PZP6/ziV//84lf//OJX/9lCM596SdJ3eknRz + 3pJ0T96SdFreknRw3pJ0ht6SdJzlf3u9+EyO7f84lf//OJX//ziV//84lf//OJX//ziV//84lf/3TY7r + 5X97vN6SdJveknSG3pJ0cN6SdFreknRD3pJ0Ld6SdBbeknQG3pJ0AAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAN6SdADeknQT3pJ0ON6SdFzeknSB3pJ1pvmrv/D/sND//7DQ//+w0P//sND/ + /7DQ//+w0P//sND//7DQ//+w0P//sM/+6p2Wyt6SdJTeknRw3pJ0TN6SdCbeknQGAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN6SdAHeknQM3pJ0Id6SdDjeknRO3pJ0Zt6SdHreknSQ + 3491qO5nhNL9PZP6/ziV//84lf//OJX//ziV//84lf//OJX//T2U++9ihdffj3Wq3pJ0kt6SdHzeknRm + 3pJ0Ut6SdF7eknSI5X57vP84lf//OJX//ziV//84lf/vZIXU3pJ0k96SdGneknQ93pJ0FAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeknQF3pJ0Kd6SdFPeknR+ + 3pJ0qf0+kvr/OJT//ziU//84lP/2UYvn3pJ0nd6SdHPeknRi3pJ0ft6SdJXhi3av8l2H3P47k/3/OJT/ + /ziU//84lP//OJT//ziU//84lP/8QpH27G2Bzd6SdKTeknSO3pJ0d96SdGLeknRL3pJ0Nd6SdB7eknQK + 3pJ0AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3pJ0B96SdCjeknRN + 3pJ0ct6SdJftoJzP/7HN//+xzf//sc3//7HN//+xzf//sc3//7HN//+xzf//sc3//7HN//+xzf/7rcH0 + 4JR4rd6SdIXeknRf3pJ0O96SdBbeknQBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAN6SdADeknQE3pJ0E96SdCveknRB3pJ0Vt6SdGzeknSC3pJ0meKHeLT1VIrk/jqT/v84lP//OJT/ + /ziU//84lP//OJT//ziU//pFj/Pod37E3pF0od6SdIveknRx3pJ0Yt6SdIjlf3u8/ziU//84lP//OJT/ + /ziU/+9lhNTeknST3pJ0ad6SdD3eknQUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAN6SdAXeknQp3pJ0U96SdH7eknSp/T6R+v85kv//OZL//zmS//ZRiufeknSd + 3pJ0c96SdHPeknSa6nN/yPtEj/T/OZL//zmS//85kv//OZL//zmS//85kv//OpL+81mI4OGJd7HeknSX + 3pJ0gd6SdGzeknRV3pJ0QN6SdCneknQV3pJ0A96SdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAN6SdAHeknQZ3pJ0Pd6SdGLeknSG4ZV7r/uuwvb/scv//7HL//+xy///scv/ + /7HL//+xy///scv//7HL//+xy///scv//7HL//+xy//voqDV3pJ0md6SdHTeknRP3pJ0LN6SdAkAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeknQB3pJ0Ct6SdBzeknQy + 3pJ0SN6SdF/eknR33pJ0i96SdKHpdH7G+0WO9P85kv//OZL//zmS//85kv//OZL//zmS//47kv30Vojj + 4Yt3r96SdIfeknRp3pJ0iOV/e7z/OZL//zmS//85kv//OZL/72WD1N6SdJPeknRp3pJ0Pd6SdBQAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3pJ0Bd6SdCneknRT + 3pJ0ft6SdKn9P4/6/zqR//86kf//OpH/9lKJ596SdJ3eknR03pJ0d96SdKL5Sozv/zqR//86kf//OpH/ + /zqR//86kf//OpH//zqR//86kf/5Sozw6Hd9xd6RdKTeknSN3pJ0ed6SdGTeknRP3pJ0O96SdCjeknQS + 3pJ0BN6SdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeknQA3pJ0Ct6SdC3eknRS + 3pJ0eN6SdJzxpaXb/7LI//+yyP//ssj//7LI//+yyP//ssj//7LI//+yyP//ssj//7LI//+yyP//ssj/ + /7LI//2wwvniln603pJ0it6SdGXeknQ/3pJ0G96SdAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAA3pJ0AN6SdAPeknQT3pJ0Jt6SdDveknRR3pJ0Zd6SdHreknSP3pF0pOpzfsn6Ro30 + /zqR//86kf//OpH//zqR//86kf//OpH//zqR//86kf/pdH7F3pJ0jd6SdGveknSI5X96vP86kf//OpH/ + /zqR//86kf/vZYPU3pJ0k96SdGneknQ93pJ0FAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAADeknQF3pJ0Kd6SdFPeknR+3pJ0qf1Ajvr/Oo///zqP//86j//2Uojn + 3pJ0nd6SdHTeknR33pJ0ovlLiu//Oo///zqP//86j///Oo///zqP//86j///Oo///zqP//86j//+PI/+ + 9lKI6OSCebreknSd3pJ0iN6SdHTeknRf3pJ0S96SdDXeknQh3pJ0Dd6SdAIAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAN6SdALeknQe3pJ0Q96SdGbeknSL45eAt/6xw/v/ssb//7LG//+yxv/+ssX+ + +ay38P+yxv//ssb//7LG//+yxv/4rLbv/7LG//+yxv//ssb//7LG//Omp+DeknSd3pJ0ed6SdFTeknQx + 3pJ0DQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN6SdAHeknQO3pJ0IN6SdDbeknRL + 3pJ0X96SdHXeknSJ3pJ0neWAer33UYjp/zuP/v86j///Oo///zqP//86j///Oo///zqP//86j///Oo// + /zqP/+l1fcXeknSN3pJ0a96SdIjlf3q8/zqP//86j///Oo///zqP/+9mgtTeknST3pJ0ad6SdD3eknQU + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN6SdAXeknQp + 3pJ0U96SdH7eknSp/UCN+v87jv//O47//zuO//ZTh+feknSd3pJ0dN6SdHfeknSi+UuJ7/87jv//O47/ + /zuO//0/jfv8RIz2/zuO//87jv//O47//zuO//87jv//O47//j2N/fJchN/iiHey3pJ0md6SdIbeknRw + 3pJ0W96SdEfeknQx3pJ0Hd6SdAveknQBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3pJ0Dt6SdDLeknRY + 3pJ0fd6SdKH1qazk/7PE//+zxP//s8T//7PE//WprebypqXf/7PE//+zxP//s8T//7PE/+ebisj+ssL9 + /7PE//+zxP//s8T//rLC/eWZhbzeknSP3pJ0a96SdEXeknQf3pJ0AwAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAN6SdAHeknQK3pJ0G96SdDHeknRH3pJ0Wt6SdHHeknSF3pJ0meKHd7XzW4Th/j2O/f87jv//O47/ + /zuO//87jv//O47//zuO//1Ajfv/O47//zuO//87jv//O47/6XV9xd6SdI3eknRr3pJ0iOV/erz/O47/ + /zuO//87jv//O47/72aB1N6SdJPeknRp3pJ0Pd6SdBQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3pJ0Bd6SdCneknRT3pJ0ft6SdKn9QYv6/zyN//88jf//PI3/ + 9lOG596SdJ3eknR03pJ0d96SdKL5TIjv/zyN//88jf//PI3/+kiJ8+GLdrbxYILa/j+M/P88jf//PI3/ + /zyN//88jf//PI3//zyN//xCi/jvZoDW35B1qt6SdJTeknR/3pJ0a96SdFbeknRC3pJ0Ld6SdBjeknQH + 3pJ0AQAAAAAAAAAAAAAAAN6SdAPeknQi3pJ0Rt6SdGveknSP55uJwv6zwP3/s8L//7PC//+zwv/+sr/8 + 5JiBu/OnpN7/s8L//7PC//+zwv//s8L/4JR5tPOop+H/s8L//7PC//+zwv//s8L/96uu6t6SdKPeknR9 + 3pJ0Wd6SdDbeknQR3pJ0AAAAAAAAAAAAAAAAAN6SdADeknQG3pJ0Ft6SdCveknRB3pJ0Vd6SdGveknR+ + 3pJ0k9+PdavvZ4DU/UKL+P88jf//PI3//zyN//88jf//PI3//zyN//1Bi/rvZoHW7Gx/0f88jf//PI3/ + /zyN//88jf/pdXzF3pJ0jd6SdGveknSI5X95vP88jf//PI3//zyN//88jf/vZoDU3pJ0k96SdGneknQ9 + 3pJ0FAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeknQF + 3pJ0Kd6SdFPeknR+3pJ0qf1Bivr/PIv//zyL//88i//2VIXn3pJ0nd6SdHTeknR33pJ0ovlMh+//PIv/ + /zyL//88i//6SIjz3pJ0pd6SdJvjhne29FeE5P4+i/3/PIv//zyL//88i///PIv//zyL//88i//7R4j1 + 63B9zN+QdKbeknSQ3pJ0e96SdGjeknRS3pJ0Pt6SdCreknQV3pJ0Bd6SdADeknQA3pJ0Et6SdDfeknRb + 3pJ0gd6SdaX5rbHu/7S///+0v///tL///7S///GmoNzeknSl86ej3v+0v///tL///7S///+0v//glHiw + 4pZ9tP2yu/r/tL///7S///+0v///tL/+6p6Px96SdJTeknRw3pJ0St6SdCXeknQFAAAAAN6SdADeknQE + 3pJ0Et6SdCfeknQ83pJ0UN6SdGfeknR63pJ0j9+RdKbqc3zJ+0iI9P88i///PIv//zyL//88i///PIv/ + /zyL//4/i/3zW4Pf4ol2st6SdJ/rb33L/zyL//88i///PIv//zyL/+l1fMXeknSN3pJ0a96SdIjlf3m8 + /zyL//88i///PIv//zyL/+9ngNTeknST3pJ0ad6SdD3eknQUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN6SdAXeknQp3pJ0U96SdH7eknSp/UKI+v89iv//PYr/ + /z2K//ZUhOfeknSd3pJ0dN6SdHfeknSi+U2G7/89iv//PYr//z2K//pJh/PeknSl3pJ0gd6SdIzeknSg + 53x6wPhQhe3/PYr//z2K//89iv//PYr//z2K//89iv//PYr/+E+F7Od8esHeknSg3pJ0jN6SdHbeknRi + 3pJ0Tt6SdDneknQj3pJ0Dd6SdAfeknQn3pJ0TN6SdHDeknSV66CRzP+0vf//tb3//7W9//+1vf/8sbb3 + 4ZV7sN6SdJzzp6He/7W9//+1vf//tb3//7W9/+CUeLDeknSc8KSb1/+1vf//tb3//7W9//+1vf/6r7Hy + 35N2qd6SdILeknRd3pJ0Od6SdBXeknQB3pJ0CN6SdCHeknQ23pJ0St6SdGHeknR03pJ0id6SdJ/lf3m9 + 91GF6/8+iv7/PYr//z2K//89iv//PYr//z2K//89iv/3UYXr5n55vt6SdJ7eknSK3pJ0kOtwfcv/PYr/ + /z2K//89iv//PYr/6XV7xd6SdI3eknRr3pJ0iOWAebz/PYr//z2K//89iv//PYr/72d/1N6SdJPeknRp + 3pJ0Pd6SdBQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + 3pJ0Bd6SdCneknRT3pJ0ft6SdKn9Qof6/z2I//89iP//PYj/9lSD596SdJ3eknR03pJ0d96SdKL5TYTv + /z2I//89iP//PYj/+kmF896SdKXeknR63pJ0Z96SdHreknSQ3pJ0pOpze8j6SoXz/z6I//89iP//PYj/ + /z2I//89iP//PYj//z6I/vVYguXkg3i53pJ0nN6SdIneknRz3pJ0Xt6SdEfeknQs3pJ0G96SdD3eknRi + 3pJ0heCUea37sbL1/7W7//+1u///tbv//7W7/+2ilNHeknSX3pJ0mfOooN7/tbv//7W7//+1u///tbv/ + 4JR4sN6SdI7glHit+7Cy9P+1u///tbv//7W7//+1u//uo5bS3pJ0mN6SdHPeknRQ3pJ0Kt6SdAreknQf + 3pJ0Qt6SdFzeknRw3pJ0hd6SdJrjhne081uB4v4/iP7/PYj//z2I//89iP//PYj//z2I//8+iP/6SoXy + 6nR7yN6SdKPeknSO3pJ0ed6SdG3eknSP63B8y/89iP//PYj//z2I//89iP/pdnvF3pJ0jd6SdGveknSI + 5YB4vP89iP//PYj//z2I//89iP/vZ37U3pJ0k96SdGneknQ93pJ0FAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeknQF3pJ0Kd6SdFPeknR+3pJ0qf1Dhvr/Pof/ + /z6H//8+h//2VYLn3pJ0nd6SdHTeknR33pJ0ovlOg+//Pof//z6H//8+h//6SoTz3pJ0pd6SdHneknRT + 3pJ0Vt6SdGzeknR/3pJ0leCNdazuaX3U/USG+f8+h///Pof//z6H//8+h///Pof//z6H//1ChvvxYX/b + 4Ix1sN6SdJfeknSC3pJ0Zt6SdEbeknQw3pJ0UN6SdHXeknSb76WY1/+2uf//trn//7a5//+2uf/6sK7x + 35N2qN6SdIbeknSZ86if3v+2uf//trn//7a5//+2uf/glHiw3pJ0h96SdJbroJDL/7W4//+2uf//trn/ + /7a5//yysvfhlXqy3pJ0iN6SdGPeknQ+3pJ0HN6SdDDeknRY3pJ0fN6SdJTfj3Wq72Z91v1Ehfn/Pof/ + /z6H//8+h///Pof//z6H//8+h//9Q4b67mh+1OCOdareknSU3pJ0f96SdGreknRW3pJ0Zd6SdI/rcHzL + /z6H//8+h///Pof//z6H/+l2esXeknSN3pJ0a96SdIjlgHi8/z6H//8+h///Pof//z6H/+9oftTeknST + 3pJ0ad6SdD3eknQUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAN6SdAXeknQp3pJ0U96SdH7eknSp/USE+v8/hf//P4X//z+F//ZWgefeknSd3pJ0dN6SdHfeknSi + +U+C7/8/hf//P4X//z+F//pLg/PeknSl3pJ0ed6SdE/eknQ23pJ0Rd6SdFreknRw3pJ0g96SdJfhi3ax + 8mB/3f5Chfz/P4X//z+F//8/hf//P4X//z+F//8/hf/8RYT57Wx80t+QdKTeknR+3pJ0Vd6SdEXeknRm + 3pJ0i+KWfLT9tLP7/7a2//+2tv//trb//7W1/umeisbeknSR3pJ0eN6SdJnzqJ3e/7a2//+2tv//trb/ + /7a2/+CUeLDeknSD3pJ0gN6SdKX4rqjt/7a2//+2tv//trb//7a2//KonN3eknSc3pJ0eN6SdFXeknQw + 3pJ0Nt6SdGDeknSK4od2uPtKg/T/P4X//z+F//8/hf//P4X//z+F//8/hf/+QoX8815/3+GKdrHeknSY + 3pJ0g96SdG7eknRZ3pJ0Rd6SdD/eknRk3pJ0j+txe8v/P4X//z+F//8/hf//P4X/6XZ6xd6SdI3eknRr + 3pJ0iOWAeLz/P4X//z+F//8/hf//P4X/72h91N6SdJPeknRp3pJ0Pd6SdBQAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3pJ0Bd6SdCneknRT3pJ0ft6SdKn9RIP6 + /z+E//8/hP//P4T/9laA596SdJ3eknR03pJ0d96SdKL5T4Hv/z+E//8/hP//P4T/+kuC896SdKXeknR5 + 3pJ0T96SdCbeknQh3pJ0N96SdEveknRf3pJ0dN6SdIneknSc5YF3uvVXf+b/QIT//z+E//8/hP//P4T/ + /z+E//8/hP/5T4Hv35B0pt6SdH7eknRW3pJ0Vt6SdHreknSg9Kqe4f+3tP//t7T//7e0//+3tP/2raPo + 3pJ1o96SdH/eknRx3pJ0mfOpnN7/t7T//7e0//+3tP//t7T/4JR4sN6SdIPeknRv3pJ0keechcH+trP+ + /7e0//+3tP//t7T//rWx/OSZf7reknSN3pJ0aN6SdEPeknQ13pJ0Wt6SdIHfkHSn+FCB7f8/hP//P4T/ + /z+E//8/hP//QIT/91SA6uWAeLzeknSe3pJ0id6SdHTeknRf3pJ0St6SdDXeknQj3pJ0Ot6SdGTeknSP + 63F6y/8/hP//P4T//z+E//8/hP/pdnnF3pJ0jd6SdGveknSI5YB3vP8/hP//P4T//z+E//8/hP/vaHzU + 3pJ0k96SdGneknQ93pJ0FAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAADeknQF3pJ0Kd6SdFPeknR+3pJ0qf1Fgfr/QIL//0CC//9Agv/2Vn7n3pJ0nd6SdHTeknR3 + 3pJ0ovlPgO//QIL//0CC//9Agv/6S4Dz3pJ0pd6SdHneknRP3pJ0JN6SdAbeknQS3pJ0JN6SdDneknRP + 3pJ0Y96SdHfeknSM3pJ0oOd7eML4UYDu/0CC//9Agv//QIL//0GC/ud8eMLeknSR3pJ0a96SdFDeknRr + 3pJ0j+abg7/+trD9/7ex//+3sf//t7H//raw/eSZgLveknSN3pJ0ad6SdG7eknSZ86ma3v+3sf//t7H/ + /7ex//+3sf/glHiw3pJ0g96SdGLeknR63pJ0oPSrnuP/t7H//7ex//+3sf//t7H/9q2g596SdKHeknR9 + 3pJ0Wt6SdDneknRI3pJ0bN6SdI/mfXjA/kKC/f9Agv//QIL/+k2A8el2ecbeknSi3pJ0jt6SdHjeknRj + 3pJ0T96SdDreknQl3pJ0EN6SdBHeknQ63pJ0ZN6SdI/rcXrL/0CC//9Agv//QIL//0CC/+l2ecXeknSN + 3pJ0a96SdIjlgHe8/0CC//9Agv//QIL//0CC/+9pe9TeknST3pJ0ad6SdD3eknQUAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN6SdAXeknQp3pJ0U96SdH7eknSp + /UWA+v9Bgf//QYH//0GB//ZXfefeknSd3pJ0dN6SdHfeknSi+VB+7/9Bgf//QYH//0GB//pMf/PeknSl + 3pJ0ed6SdE/eknQk3pJ0A96SdADeknQF3pJ0Ft6SdCveknQ/3pJ0U96SdGjeknR83pJ0kd+QdKfscHrO + +0qA9v9Bgf/1WX3m3pJ0oN6SdH3eknRZ3pJ0Wt6SdH/eknSj+K+i7P+4r///uK///7iv//+4r//zqpnf + 3pJ0nd6SdHneknRX3pJ0bt6SdJnzqpne/7iv//+4r///uK///7iv/+CUd7DeknSD3pJ0W96SdGbeknSL + 45h9tv22rPv/uK///7iv//+4r//+t67+6J6Gxd6SdJPeknRt3pJ0SN6SdDfeknRX3pJ0e96SdKH0W33j + /UeA+e5retPgjnWq3pJ0k96SdH7eknRp3pJ0VN6SdD/eknQr3pJ0Fd6SdAXeknQA3pJ0EN6SdDreknRk + 3pJ0j+txecv/QYH//0GB//9Bgf//QYH/6Xd4xd6SdI3eknRr3pJ0iOWAd7z/QYH//0GB//9Bgf//QYH/ + 72l61N6SdJPeknRp3pJ0Pd6SdBQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAA3pJ0Bd6SdCneknRT3pJ0ft6SdKn9Rn/6/0GA//9BgP//QYD/9ld8596SdJ3eknR0 + 3pJ0d96SdKL5UH3v/0GA//9BgP//QYD/+kx+896SdKXeknR53pJ0T96SdCTeknQDAAAAAAAAAADeknQB + 3pJ0B96SdBneknQt3pJ0Qt6SdFfeknRt3pJ0gN6SdJXfj3Sr72h61uOFdrjeknSL3pJ0Z96SdFHeknRv + 3pJ0lOqgicn/uK3//7it//+4rf//uK3//LWo+OKWerLeknSI3pJ0ZN6SdEveknRu3pJ0mfOql97/uK3/ + /7it//+4rf//uK3/4JR3sN6SdIPeknRZ3pJ0Ud6SdHbeknSa8KeU2f+4rf//uK3//7it//+4rf/5saLw + 35N2qN6SdILeknRd3pJ0Ot6SdEPeknRn3pJ0i+GLdbDhi3Ww3pJ0mN6SdIPeknRu3pJ0Wd6SdETeknQv + 3pJ0Gt6SdAjeknQAAAAAAAAAAADeknQQ3pJ0Ot6SdGTeknSP63F5y/9BgP//QYD//0GA//9BgP/pd3jF + 3pJ0jd6SdGveknSI5YB3vP9BgP//QYD//0GA//9BgP/vaXrU3pJ0k96SdGneknQ93pJ0FAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeknQF3pJ0Kd6SdFPeknR+ + 3pJ0qf1Hffr/Qn7//0J+//9Cfv/2WHvn3pJ0nd6SdHTeknR33pJ0ovlRfO//Qn7//0J+//9Cfv/6TXzz + 3pJ0pd6SdHneknRP3pJ0JN6SdAMAAAAAAAAAAAAAAAAAAAAA3pJ0Ad6SdAveknQe3pJ0M96SdEneknRb + 3pJ0cd6SdIXeknSZ3pJ0ld6SdHfeknRV3pJ0YN6SdITglHer+rOj8v+5q///uav//7mr//+5q//vpZDV + 3pJ0mt6SdHTeknRP3pJ0Rd6SdG7eknSZ86qW3v+5q///uav//7mr//+5q//glHew3pJ0g96SdFjeknRB + 3pJ0Yt6SdIfhlXiw+7Wl9v+5q///uav//7mr//+5q//so4vO3pJ0l96SdHPeknRN3pJ0Nd6SdFHeknRy + 3pJ0it6SdIjeknR03pJ0Xt6SdEneknQ13pJ0IN6SdAzeknQCAAAAAAAAAAAAAAAAAAAAAN6SdBDeknQ6 + 3pJ0ZN6SdI/rcnjL/0J+//9Cfv//Qn7//0J+/+l3d8XeknSN3pJ0a96SdIjlgXa8/0J+//9Cfv//Qn7/ + /0J+/+9qedTeknST3pJ0ad6SdD3eknQUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAN6SdAXeknQp3pJ0U96SdH7eknSp/Ud8+v9Cff//Qn3//0J9//ZYeufeknSd + 3pJ0dN6SdHfeknSi+VF77/9Cff//Qn3//0J9//pNe/PeknSl3pJ0ed6SdE/eknQk3pJ0AwAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAN6SdALeknQP3pJ0It6SdDbeknRL3pJ0YN6SdG/eknRt3pJ0Wt6SdFPeknR1 + 3pJ0mO+mjtX/uaj//7mo//+5qP//uaj/+rSh89+TdqneknSE3pJ0YN6SdDzeknRD3pJ0bt6SdJnzqpXe + /7mo//+5qP//uaj//7mo/+CUd7DeknSD3pJ0WN6SdDbeknRO3pJ0ct6SdJbsoorO/7mo//+5qP//uaj/ + /7mo//y1o/fhlXiw3pJ0ht6SdGLeknQ+3pJ0N96SdFDeknRg3pJ0X96SdE7eknQ53pJ0JN6SdBDeknQD + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3pJ0EN6SdDreknRk3pJ0j+tyd8v/Qn3//0J9//9Cff//Qn3/ + 6Xd3xd6SdI3eknRr3pJ0iOWBdrz/Qn3//0J9//9Cff//Qn3/72p41N6SdJPeknRp3pJ0Pd6SdBQAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3pJ0Bd6SdCneknRT + 3pJ0ft6SdKn9SHv6/0N7//9De///Q3v/9ll5596SdJ3eknR03pJ0d96SdKL5Unrv/0N7//9De///Q3v/ + +k56896SdKXeknR53pJ0T96SdCTeknQDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN6SdADeknQE + 3pJ0Et6SdCfeknQ73pJ0Rd6SdEXeknRG3pJ0Zd6SdIrhlnmx/bej+v+6pv//uqb//7qm//+6pv7qoYfK + 3pJ0lN6SdG/eknRK3pJ0K96SdEPeknRu3pJ0mfOrk97/uqb//7qm//+6pv//uqb/4JR3sN6SdIPeknRY + 3pJ0MN6SdDjeknRd3pJ0gt+Tdaj5s53v/7qm//+6pv//uqb//7qm//GokNneknSb3pJ0eN6SdFLeknQv + 3pJ0LN6SdDfeknQ23pJ0Kd6SdBXeknQF3pJ0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeknQQ + 3pJ0Ot6SdGTeknSP63J3y/9De///Q3v//0N7//9De//pd3bF3pJ0jd6SdGveknSI5YF2vP9De///Q3v/ + /0N7//9De//vanjU3pJ0k96SdGneknQ93pJ0FAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAADeknQF3pJ0Kd6SdFPeknR+3pJ0qf1Jefr/RHr//0R6//9Eev/2WXjn + 3pJ0nd6SdHTeknR33pJ0ovlTee//RHr//0R6//9Eev/6T3nz3pJ0pd6SdHneknRP3pJ0JN6SdAMAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeknQA3pJ0Bt6SdBPeknQd3pJ0Md6SdFXeknR4 + 3pJ0nvOrkuD/uqT//7qk//+6pP//uqT/97GZ6t6SdaTeknR/3pJ0W96SdDXeknQf3pJ0Q96SdG7eknSZ + 86uS3v+6pP//uqT//7qk//+6pP/glHew3pJ0g96SdFjeknQu3pJ0JN6SdEjeknRt3pJ0keiegsP+uqP+ + /7qk//+6pP//uqT//bii++OZfLjeknSL3pJ0Z96SdEPeknQg3pJ0D96SdA3eknQG3pJ0AAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN6SdBDeknQ63pJ0ZN6SdI/rc3bL/0R6//9Eev//RHr/ + /0R6/+l4dsXeknSN3pJ0a96SdIjlgXW8/0R6//9Eev//RHr//0R6/+9rd9TeknST3pJ0ad6SdD3eknQU + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN6SdAXeknQp + 3pJ0U96SdH7eknSp/Ul4+v9EeP//RHj//0R4//ZZd+feknSd3pJ0dN6SdHfeknSi+VN37/9EeP//RHj/ + /0R4//pPePPeknSl3pJ0ed6SdE/eknQk3pJ0AwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAA3pJ0A96SdB/eknRE3pJ0ad6SdI3lm368/rmg/P+7ov//u6L//7ui//66of7mm3++ + 3pJ0j96SdGreknRF3pJ0Id6SdBreknRD3pJ0bt6SdJnzq5De/7ui//+7ov//u6L//7ui/+CUd7DeknSD + 3pJ0WN6SdC7eknQU3pJ0M96SdFjeknR83pJ0ofavleb/u6L//7ui//+7ov//u6L/9a6T5N6SdKDeknR9 + 3pJ0WN6SdDLeknQO3pJ0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + 3pJ0EN6SdDreknRk3pJ0j+tzdsv/RHj//0R4//9EeP//RHj/6Xh1xd6SdI3eknRr3pJ0iOWBdbz/RHj/ + /0R4//9EeP//RHj/72t21N6SdJPeknRp3pJ0Pd6SdBQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3pJ0Bd6SdCneknRT3pJ0ft6SdKn9Snb6/0V3//9Fd///RXf/ + 9lp2596SdJ3eknR03pJ0d96SdKL5U3bv/0V3//9Fd///RXf/+lB2896SdKXeknR53pJ0T96SdCTeknQD + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN6SdADeknQQ3pJ0Nd6SdFjeknR+ + 3pJ0ovexlOr/u5///7uf//+7n///u5//862Q4d6SdJ7eknR63pJ0VN6SdDDeknQT3pJ0H96SdETeknRu + 3pJ0mfOsj97/u5///7uf//+7n///u5//4JR3sN6SdIPeknRY3pJ0MN6SdBPeknQe3pJ0Qt6SdGfeknSM + 5Jl8uP66nfz/u5///7uf//+7n//+u57+556Aw96SdJDeknRr3pJ0R96SdCLeknQEAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeknQQ3pJ0Ot6SdGTeknSP63N1y/9Fd///RXf/ + /0V3//9Fd//peHXF3pJ0jd6SdGveknSI5YF1vP9Fd///RXf//0V3//9Fd//va3XU3pJ0k96SdGneknQ9 + 3pJ0FAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeknQF + 3pJ0Kd6SdFPeknR+3pJ0qf1Kdfr/RnX//0Z1//9Gdf/2W3Xn3pJ0nd6SdHTeknR33pJ0ovlUde//RnX/ + /0Z1//9Gdf/6UHXz3pJ0pd6SdHneknRP3pJ0JN6SdAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAA3pJ0Bd6SdCTeknRK3pJ0bd6SdJLpoIHF/7yd//+8nf//vJ3//7yd//25mvrjmHq2 + 3pJ0id6SdGXeknRA3pJ0It6SdCneknQ/3pJ0Vd6SdHHeknSZ86yN3v+8nf//vJ3//7yd//+8nf/glHaw + 3pJ0hN6SdGLeknRJ3pJ0M96SdCDeknQv3pJ0U96SdHfeknSc8quN3f+8nf//vJ3//7yd//+8nf/4s5Tt + 35N1pd6SdIDeknRc3pJ0ON6SdBLeknQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAN6SdBDeknQ63pJ0ZN6SdI/rc3XL/0Z1//9Gdf//RnX//0Z1/+l4dMXeknSN3pJ0a96SdIjlgXS8 + /0Z1//9Gdf//RnX//0Z1/+9sddTeknST3pJ0ad6SdD3eknQUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN6SdAXeknQp3pJ0U96SdH7eknSp/Ut0+v9GdP//RnT/ + /0Z0//ZbdOfeknSd3pJ0dN6SdHfeknSi+VR07/9GdP//RnT//0Z0//pRdPPeknSl3pJ0ed6SdE/eknQk + 3pJ0AwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN6SdAHeknQV3pJ0ON6SdF/eknSD + 35R2q/q1lPH/vJr//7ya//+8mv//vJr/76iI1t6SdJveknR23pJ0Ud6SdDHeknQ53pJ0Tt6SdGTeknR5 + 3pJ0kN+Tdab1r47k/7ya//+8mv//vJr//7ya/+Sae7veknSZ3pJ0hN6SdG7eknRZ3pJ0Q96SdC/eknQ+ + 3pJ0Y96SdInhlnew/LiX9/+8mv//vJr//7ya//+8mv/ro4PN3pJ0lt6SdHHeknRL3pJ0Jt6SdAcAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3pJ0EN6SdDreknRk3pJ0j+tzdMv/RnT/ + /0Z0//9GdP//RnT/6Xh0xd6SdI3eknRr3pJ0iOWCdLz/RnT//0Z0//9GdP//RnT/72x01N6SdJPeknRp + 3pJ0Pd6SdBQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + 3pJ0Bd6SdCneknRT3pJ0ft6SdKn9S3P6/0dy//9Hcv//R3L/9ltz596SdJ3eknR03pJ0d96SdKL5VXPv + /0dy//9Hcv//R3L/+lFz896SdKXeknR53pJ0T96SdCTeknQDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAA3pJ0B96SdCveknRP3pJ0c96SdJbtpoXR/72Y//+9mP//vZj//72Y//u4lPbglHar + 3pJ0hd6SdGHeknRC3pJ0R96SdFveknRy3pJ0ht6SdJ3kmnu797OP6/+9mP7/vZj//72Y//+9mP//vZj/ + /bqW+e+ohtXfk3Wp3pJ0kt6SdHzeknRn3pJ0UN6SdD/eknRP3pJ0c96SdJfupoXS/72Y//+9mP//vZj/ + /72Y//u4k/XglHar3pJ0hd6SdGHeknQ93pJ0F96SdAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAADeknQQ3pJ0Ot6SdGTeknSP63Rzy/9Hcv//R3L//0dy//9Hcv/peXPF3pJ0jd6SdGveknSI + 5YJ0vP9Hcv//R3L//0dy//9Hcv/vbHPU3pJ0k96SdGneknQ93pJ0FAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeknQF3pJ0Kd6SdFPeknR+3pJ0qf1Mcfr/SHH/ + /0hx//9Icf/2XHLn3pJ0nd6SdHTeknR33pJ0ovlWce//SHH//0hx//9Icf/6UnHz3pJ0pd6SdHneknRP + 3pJ0JN6SdAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN6SdAHeknQZ3pJ0P96SdGPeknSJ + 4JV3sPy6k/n/vZb//72W//+9lv//vZb+66OCy96SdJbeknRx3pJ0UN6SdFXeknRr3pJ0gd6SdJfhlXev + 8qyI3f68lf3/vZb//72W//+9lv//vZb//72W//+9lv//vZb//72W//q3kPLpoH/F3pJ0od6SdIveknR2 + 3pJ0YN6SdE3eknRe3pJ0g9+Tdan6tpDx/72W//+9lv//vZb//72W//CphtjeknSb3pJ0dt6SdFHeknQs + 3pJ0CgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN6SdBDeknQ63pJ0ZN6SdI/rdHPL + /0hx//9Icf//SHH//0hx/+l5c8XeknSN3pJ0a96SdIjlgnO8/0hx//9Icf//SHH//0hx/+9sctTeknST + 3pJ0ad6SdD3eknQUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAN6SdAXeknQp3pJ0U96SdH7eknSp/Uxw+v9Ib///SG///0hv//ZccefeknSd3pJ0dN6SdHfeknSi + +VZw7/9Ib///SG///0hv//pScPPeknSl3pJ0ed6SdE/eknQk3pJ0AwAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAADeknQA3pJ0C96SdC3eknRT3pJ0d96SdJzxrIbc/76U//++lP//vpT//76U//i1je7fk3Wm + 3pJ0gN6SdGHeknRj3pJ0eN6SdI7eknSl66OAy/u5kPX/vpT//76U//++lP//vpT//76U//++lP//vpT/ + /76U//++lP//vpT//76U//69k/71sInk4ph4td6SdJneknSD3pJ0bt6SdFzeknRu3pJ0kumhfsf/vpP+ + /76U//++lP//vpT//buR+uKYeLTeknSJ3pJ0Zt6SdELeknQd3pJ0AgAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAA3pJ0EN6SdDreknRk3pJ0j+t0csv/SG///0hv//9Ib///SG//6Xlyxd6SdI3eknRr + 3pJ0iOWCc7z/SG///0hv//9Ib///SG//721y1N6SdJPeknRp3pJ0Pd6SdBQAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3pJ0Bd6SdCneknRT3pJ0ft6SdKn9TW76 + /0lu//9Jbv//SW7/9l1w596SdJ3eknR03pJ0d96SdKL5V2/v/0lu//9Jbv//SW7/+lNv896SdKXeknR5 + 3pJ0T96SdCTeknQDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN6SdALeknQf3pJ0Q96SdGjeknSM + 5Jt6uv69kPz/v5H//7+R//+/kf//vpH+5p17wN6SdJDeknRv3pJ0ct6SdIneknSd5px7vfe1iuv/v5H/ + /7+R//+/kf//v5H//7+R//+/kf//v5H/+7mN9P69kPz/v5H//7+R//+/kf//v5H//7+R//+/kf/9vZD7 + 76mD1eCUdaveknST3pJ0fd6SdGzeknR+3pN0o/aziuj/v5H//7+R//+/kf//v5H/9LCH4t6SdKHeknR7 + 3pJ0Vd6SdDHeknQN3pJ0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeknQQ3pJ0Ot6SdGTeknSP + 63Vyy/9Jbv//SW7//0lu//9Jbv/peXLF3pJ0jd6SdGveknSI5YJzvP9Jbv//SW7//0lu//9Jbv/vbXHU + 3pJ0k96SdGneknQ93pJ0FAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAADeknQF3pJ0Kd6SdFPeknR+3pJ0qf1Obfr/Smz//0ps//9KbP/2XW7n3pJ0nd6SdHTeknR3 + 3pJ0ovlXbu//Smz//0ps//9KbP/6VG3z3pJ0pd6SdHneknRP3pJ0JN6SdAMAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAADeknQA3pJ0D96SdDTeknRX3pJ0fN6SdKD1sofm/7+P//+/j///v4///7+P//Wxh+XeknSf + 3pJ0f96SdIHeknSV4JV2r/GshNz+vo78/7+P//+/j///v4///7+P//+/j///v4///b2O+++ogtTglHWs + 5Zx6vfe0iev/v4///7+P//+/j///v4///7+P//+/j///v4//+riL8eigfMTeknSh3pJ0i96SdHreknSO + 5Zx6vP6+jv3/v4///7+P//+/j//+vo795p16vt6SdI/eknRp3pJ0Rd6SdCHeknQEAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAN6SdBDeknQ63pJ0ZN6SdI/rdXHL/0ps//9KbP//Smz//0ps/+l6ccXeknSN + 3pJ0a96SdIjlgnK8/0ps//9KbP//Smz//0ps/+9tcNTeknST3pJ0ad6SdD3eknQUAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN6SdAXeknQp3pJ0U96SdH7eknSp + /U5r+v9Ka///Smv//0pr//ZebefeknSd3pJ0dN6SdHfeknSi+Vht7/9Ka///Smv//0pr//pUbPPeknSl + 3pJ0ed6SdE/eknQk3pJ0AwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN6SdAXeknQi3pJ0Sd6SdG3eknSS + 6J97w//Ajf//wI3//8CN///Ajf/9vYz645l4uN6SdI7eknSR35N1puukfs38u4r3/8CN///Ajf//wI3/ + /8CN///Ajf//wI3//r+M/vWxheTimHe03pJ0md6SdIXeknSO3pJ0peujfsr7uor1/8CN///Ajf//wI3/ + /8CN///Ajf//wI3//7+N/vWyhebjmXi33pJ0mt6SdIreknSe8q6E3//Ajf//wI3//8CN///Ajf/3tYfr + 35N0pN6SdIDeknRb3pJ0Nt6SdBHeknQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3pJ0EN6SdDreknRk + 3pJ0j+t1cMv/Smv//0pr//9Ka///Smv/6Xpxxd6SdI3eknRr3pJ0iOWCcrz/Smv//0pr//9Ka///Smv/ + 725v1N6SdJPeknRp3pJ0Pd6SdBQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAA3pJ0Bd6SdCneknRT3pJ0ft6SdKn9T2r6/0tp//9Laf//S2n/9l5s596SdJ3eknR0 + 3pJ0d96SdKL5WGvv/0tp//9Laf//S2n/+lVr896SdKXeknR53pJ0T96SdCTeknQDAAAAAAAAAAAAAAAA + AAAAAAAAAADeknQA3pJ0Fd6SdDjeknRd3pJ0gd+Tdaj5t4bu/8CL///Ai///wIv//8CL//GsgdreknSe + 3pJ0nuWbeLz3tYXs/8CK/v/Ai///wIv//8CL///Ai///wIv//8CL//q5h/LooHvE3pJ0od6SdIveknR1 + 3pJ0Yd6SdGveknSA3pJ0luCVdq/xrYHc/r+K/P/Ai///wIv//8CL///Ai///wIv//8CL//29ifrvqoDW + 35N1qd6SdJjil3ez/b2J+f/Ai///wIv//8CL///Aiv7qonzJ3pJ0lN6SdG/eknRK3pJ0Jt6SdAYAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAADeknQQ3pJ0Ot6SdGTeknSP63Vwy/9Laf//S2n//0tp//9Laf/penDF + 3pJ0jd6SdGveknSI5YNyvP9Laf//S2n//0tp//9Laf/vbm/U3pJ0k96SdGneknQ93pJ0FAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeknQF3pJ0Kd6SdFPeknR+ + 3pJ0qf1Pafr/S2j//0to//9LaP/2Xmvn3pJ0nd6SdHTeknR33pJ0ovlZau//S2j//0to//9LaP/6VWrz + 3pJ0pd6SdHneknRP3pJ0JN6SdAMAAAAAAAAAAAAAAAAAAAAAAAAAAN6SdAbeknQo3pJ0Tt6SdHPeknSW + 7KZ9z//BiP//wYj//8GI///BiP/8vYb34JR1sOGWdrDyroDe/sCI/f/BiP//wYj//8GI///BiP//wYj/ + /8GI//2+h/nuqX7U35N0qN6SdJHeknR83pJ0Zt6SdFDeknQ83pJ0R96SdFveknRy3pJ0ht6SdJ3km3i6 + 97WD6v/BiP7/wYj//8GI///BiP//wYj//8GI///BiP/6uoXz6aF6xt6SdKjuqX7U/8GI///BiP//wYj/ + /8GI//q6hfPglHWq3pJ0hd6SdGHeknQ73pJ0Fd6SdAEAAAAAAAAAAAAAAAAAAAAAAAAAAN6SdBDeknQ6 + 3pJ0ZN6SdI/rdm/L/0to//9LaP//S2j//0to/+l6cMXeknSN3pJ0a96SdIjlg3G8/0to//9LaP//S2j/ + /0to/+9ubtTeknST3pJ0ad6SdD3eknQUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAN6SdAXeknQp3pJ0U96SdH7eknSp/VBn+v9MZv//TGb//0xm//ZfaufeknSd + 3pJ0dN6SdHfeknSi+Vlp7/9MZv//TGb//0xm//pWaPPeknSl3pJ0ed6SdE/eknQk3pJ0AwAAAAAAAAAA + AAAAAAAAAADeknQB3pJ0F96SdD3eknRh3pJ0huCUda78vIT2/8GG///Bhv//wYb//8GG/+ynfNLrpXvN + +7yE9v/Bhv//wYb//8GG///Bhv//wYb//8GG///Bhv71soDl45h3td6SdJneknSE3pJ0bt6SdFjeknRC + 3pJ0LN6SdBneknQi3pJ0Od6SdE3eknRk3pJ0eN6SdI/fk3Sk66R7y/u8hPb/wYb//8GG///Bhv//wYb/ + /8GG///Bhv/+wIb+9bOA5eSad7/6uoP0/8GG///Bhv//wYb//8GG/+6pfdTeknSZ3pJ0c96SdE/eknQr + 3pJ0CgAAAAAAAAAAAAAAAAAAAAAAAAAA3pJ0EN6SdDreknRk3pJ0j+t2b8v/TGb//0xm//9MZv//TGb/ + 6Xpvxd6SdI3eknRr3pJ0iOWDcbz/TGb//0xm//9MZv//TGb/729t1N6SdJPeknRp3pJ0Pd6SdBQAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3pJ0Bd6SdCneknRT + 3pJ0ft6SdKn9UWb6/01l//9NZf//TWX/9mBp596SdJ3eknR03pJ0d96SdKL5Wmjv/01l//9NZf//TWX/ + +lZn896SdKXeknR53pJ0T96SdCTeknQDAAAAAAAAAAAAAAAA3pJ0AN6SdAreknQs3pJ0Ut6SdHbeknSb + 8a192v/Cg///woP//8KD///Cg//9v4L5+LiA7v/Cg///woP//8KD///Cg///woP//8KD///Cg//5uoHw + 56B5wt6SdKDeknSK3pJ0dd6SdF7eknRJ3pJ0M96SdB3eknQJ3pJ0Ad6SdATeknQU3pJ0Kd6SdD/eknRU + 3pJ0at6SdIDeknSV4JV1rfGufdv+wIP8/8KD///Cg///woP//8KD///Cg///woP//cCD+/e3gO3/woP/ + /8KD///Cg///woP//b6C+eKYdrPeknSJ3pJ0Zt6SdEDeknQb3pJ0AQAAAAAAAAAAAAAAAAAAAADeknQQ + 3pJ0Ot6SdGTeknSP63Zuy/9NZf//TWX//01l//9NZf/pe2/F3pJ0jd6SdGveknSI5YNxvP9NZf//TWX/ + /01l//9NZf/vb2zU3pJ0k96SdGneknQ93pJ0FAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAADeknQF3pJ0Kd6SdFPeknR+3pJ0qf1RZfr/TWT//01k//9NZP/2YGjn + 3pJ0nd6SdHTeknR33pJ0ovlaZ+//TWT//01k//9NZP/6V2bz3pJ0pd6SdHneknRP3pJ0JN6SdAMAAAAA + AAAAAAAAAADeknQC3pJ0Hd6SdEHeknRm3pJ0iuOadrb9wID6/8KB///Cgf//woH//8KB///Cgf//woH/ + /8KB///Cgf//woH//8KB///Cgf/9v4D67ql709+UdareknSS3pJ0fN6SdGbeknRR3pJ0O96SdCfeknQY + 3pJ0EN6SdA7eknQO3pJ0Dt6SdA7eknQU3pJ0H96SdDLeknRF3pJ0Xd6SdHHeknSI3pJ0nOWcd7z3tn7q + /8KB///Cgf//woH//8KB///Cgf//woH//8KB///Cgf//woH//8KB///Cgf//woH/8rB8396SdJ7eknR4 + 3pJ0U96SdC/eknQM3pJ0AAAAAAAAAAAAAAAAAN6SdBDeknQ63pJ0ZN6SdI/rdm3L/01k//9NZP//TWT/ + /01k/+l7b8XeknSN3pJ0a96SdIjlg3C8/01k//9NZP//TWT//01k/+9vbNTeknST3pJ0ad6SdD3eknQU + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN6SdAXeknQp + 3pJ0U96SdH7eknSp/VJj+v9OYv//TmL//05i//ZhZ+feknSd3pJ0dN6SdHfeknSi+Vtm7/9OYv//TmL/ + /05i//pXZfPeknSl3pJ0ed6SdE/eknQk3pJ0AwAAAAAAAAAA3pJ0AN6SdA7eknQz3pJ0V96SdHveknSf + 9bR75f/Df///w3///8N////Df///w3///8N////Df///w3///8N////Df//+wn/99LN84+KYdbTeknSY + 3pJ0g96SdG3eknRY3pJ0SN6SdD3eknQ53pJ0ON6SdDjeknQ43pJ0ON6SdDjeknQ43pJ0ON6SdDjeknQ4 + 3pJ0ON6SdDreknRC3pJ0UN6SdGLeknR53pJ0jd6SdKTqpHjJ+71+9f/Df///w3///8N////Df///w3// + /8N////Df///w3///8N////Df//+wn/95Zx2vN6SdI7eknRp3pJ0Rd6SdCDeknQDAAAAAAAAAAAAAAAA + 3pJ0EN6SdDreknRk3pJ0j+t3bcv/TmL//05i//9OYv//TmL/6Xtuxd6SdI3eknRr3pJ0iOWDcLz/TmL/ + /05i//9OYv//TmL/73Br1N6SdJPeknRp3pJ0Pd6SdBQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3pJ0Bd6SdCneknRT3pJ0ft6SdKn9U2L6/09h//9PYf//T2H/ + 9mFm596SdJ3eknR03pJ0d96SdKL5W2Tv/09h//9PYf//T2H/+lhj896SdKXeknR53pJ0T96SdCTeknQD + AAAAAAAAAADeknQE3pJ0IN6SdEbeknRr3pJ0keaedr//w3z+/8N9///Dff//w33//8N9///Dff//w33/ + /8N9///Dff//w33/+bt78eihd8PeknSg3pJ0i96SdHjeknRr3pJ0ZN6SdGLeknRi3pJ0Yt6SdGLeknRi + 3pJ0Yt6SdGLeknRi3pJ0Yt6SdGLeknRi3pJ0Yt6SdGLeknRi3pJ0Yt6SdGLeknRi3pJ0Y96SdGfeknRx + 3pJ0gd6SdJbglnWu8a552/7CfPz/w33//8N9///Dff//w33//8N9///Dff//w33//8N9///Dff/2tnro + 3pN0o96SdH7eknRZ3pJ0M96SdBDeknQAAAAAAAAAAADeknQQ3pJ0Ot6SdGTeknSP63dsy/9PYf//T2H/ + /09h//9PYf/pe27F3pJ0jd6SdGveknSI5YNwvP9PYf//T2H//09h//9PYf/vcGrU3pJ0k96SdGneknQ9 + 3pJ0FAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeknQF + 3pJ0Kd6SdFPeknR+3pJ0qf1TYfr/T1///09f//9PX//2YWXn3pJ0nd6SdHTeknR33pJ0ovlcY+//T1// + /09f//9PX//6WGLz3pJ0pd6SdHneknRP3pJ0JN6SdAMAAAAA3pJ0AN6SdBPeknQ43pJ0XN6SdIDfk3Sm + +Ll57f/Eev//xHr//8R6///Eev//xHr//8R6///Eev//xHr//cB6+e6qd9Pek3Sp3pJ0mt6SdJHeknSO + 3pJ0jt6SdI7eknSO3pJ0jt6SdI7eknSO3pJ0jt6SdI7eknSO3pJ0jt6SdI7eknSO3pJ0jt6SdI7eknSO + 3pJ0jt6SdI7eknSO3pJ0jt6SdI7eknSO3pJ0jt6SdI7eknSO3pJ0j96SdJTeknSh5Jt1uva3een/w3r+ + /8R6///Eev//xHr//8R6///Eev//xHr//8R6///Eev7po3bH3pJ0kt6SdG7eknRK3pJ0Jt6SdAUAAAAA + AAAAAN6SdBDeknQ63pJ0ZN6SdI/rd2zL/09f//9PX///T1///09f/+l7bcXeknSN3pJ0a96SdIjlg3C8 + /09f//9PX///T1///09f/+9watTeknST3pJ0ad6SdD3eknQUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN6SdAXeknQp3pJ0U96SdH7eknSp/VRf+v9QXv//UF7/ + /1Be//ZiZOfeknSd3pJ0dN6SdHfeknSi+Vxi7/9QXv//UF7//1Be//pZYfPeknSl3pJ0ed6SdE/eknQk + 3pJ0AwAAAADeknQG3pJ0Jt6SdEveknRx3pJ0luumdcv/xHj+/8R4///EeP//xHj//8R4///EeP//xHj/ + /8R4//u/ePbtqXbU6qV1yeqldcjqpXXI6qV1yOqldcjqpXXI6qV1yOqldcjqpXXI6qV1yOqldcjqpXXI + 6qV1yOqldcjqpXXI6qV1yOqldcjqpXXI6qV1yOqldcjqpXXI6qV1yOqldcjqpXXI6qV1yOqldcjqpXXI + 6qV1yOqldcjqpXXI6qV1yOqldcjqpXXI6qV1y/Ozd+T/xHj+/8R4///EeP//xHj//8R4///EeP//xHj/ + /8R4//q8d/Hfk3So3pJ0hN6SdF7eknQ53pJ0FN6SdAEAAAAA3pJ0EN6SdDreknRk3pJ0j+t3a8v/UF7/ + /1Be//9QXv//UF7/6Xxtxd6SdI3eknRr3pJ0iOWEb7z/UF7//1Be//9QXv//UF7/73Fp1N6SdJPeknRp + 3pJ0Pd6SdBQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + 3pJ0Bd6SdCneknRT3pJ0ft6SdKn9VF76/1Bc//9QXP//UFz/9mJj596SdJ3eknR03pJ0d96SdKL5XWHv + /1Bc//9QXP//UFz/+lpg896SdKXeknR53pJ0T96SdCTeknQD3pJ0Ad6SdBbeknQ83pJ0YN6SdIXglHSr + +7919v/Fdv//xXb//8V2///Fdv//xXb//8V2///Fdv//xXb//8V2///Fdv//xXb//8V2///Fdv//xXb/ + /8V2///Fdv//xXb//8V2///Fdv//xXb//8V2///Fdv//xXb//8V2///Fdv//xXb//8V2///Fdv//xXb/ + /8V2///Fdv//xXb//8V2///Fdv//xXb//8V2///Fdv//xXb//8V2///Fdv//xXb//8V2///Fdv//xXb/ + /8V2///Fdv//xXb//8V2///Fdv//xXb//8V2///Fdv//xXb//8V2/+2qddLeknSX3pJ0ct6SdE/eknQr + 3pJ0CAAAAADeknQQ3pJ0Ot6SdGTeknSP63hqy/9QXP//UFz//1Bc//9QXP/pfGzF3pJ0jd6SdGveknSI + 5YRvvP9QXP//UFz//1Bc//9QXP/vcWjU3pJ0k96SdGneknQ93pJ0FAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeknQF3pJ0Kd6SdFPeknR+3pJ0qf1VXPr/UVv/ + /1Fb//9RW//2Y2Ln3pJ0nd6SdHTeknR33pJ0ovldYO//UVv//1Fb//9RW//6Wl7z3pJ0pd6SdHneknRP + 3pJ0JN6SdAPeknQJ3pJ0K96SdFDeknR03pJ0mu+tdNb/xnT//8Z0///GdP//xnT//8Z0///GdP//xnT/ + /8Z0///GdP//xnT//8Z0///GdP//xnT//8Z0///GdP//xnT//8Z0///GdP//xnT//8Z0///GdP//xnT/ + /8Z0///GdP//xnT//8Z0///GdP//xnT//8Z0///GdP//xnT//8Z0///GdP//xnT//8Z0///GdP//xnT/ + /8Z0///GdP//xnT//8Z0///GdP//xnT//8Z0///GdP//xnT//8Z0///GdP//xnT//8Z0///GdP//xnT/ + /8Z0///GdP//xnT//MFz9+GXdLDeknSJ3pJ0Y96SdD7eknQZ3pJ0Ad6SdBDeknQ63pJ0ZN6SdI/reGrL + /1Fb//9RW///UVv//1Fb/+l8bMXeknSN3pJ0a96SdIjlhG+8/1Fb//9RW///UVv//1Fb/+9xZ9TeknST + 3pJ0ad6SdD3eknQUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAN6SdAXeknQp3pJ0U96SdH7eknSp/VZb+v9SWv//Ulr//1Ja//ZjYefeknSd3pJ0dN6SdHfeknSi + +V5e7/9SWf//Uln//1JZ//pbXfPeknSl3pJ0ed6SdE/eknQk3pJ0BN6SdBveknRA3pJ0Zd6SdIrjmXO1 + /cNx+f/Gcf//xnH//8Zx///Gcf//xnH//8Zx///Gcf//xnH//8Zx///Gcf//xnH//8Zx///Gcf//xnH/ + /8Zx///Gcf//xnH//8Zx///Gcf//xnH//8Zx///Gcf//xnH//8Zx///Gcf//xnH//8Zx///Gcf//xnH/ + /8Zx///Gcf//xnH//8Zx///Gcf//xnH//8Zx///Gcf//xnH//8Zx///Gcf//xnH//8Zx///Gcf//xnH/ + /8Zx///Gcf//xnH//8Zx///Gcf//xnH//8Zx///Gcf//xnH//8Zx///Gcf//xnH/8rFy3d6SdJzeknR3 + 3pJ0Ut6SdC7eknQJ3pJ0EN6SdDreknRk3pJ0j+t4acv/Uln//1JZ//9SWf//Uln/6Xxrxd6SdI3eknRr + 3pJ0iOWEbrz/Ulr//1Ja//9SWv//Ulr/73Jn1N6SdJPeknRp3pJ0Pd6SdBQAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3pJ0Bd6SdCneknRT3pJ0ft6SdKn9Vlr6 + /1JY//9SWP//Ulj/9mRg596SdJ3eknR03pJ0d96SdKL5Xl3v/1JY//9SWP//Ulj/+ltc896SdKXeknR5 + 3pJ0T96SdCneknQQ3pJ0J96SdFDeknR53pJ0nvO0ceH/x2///8dv///Hb///x2///8dv///Hb///x2// + /8dv///Hb///x2///8dv///Hb///x2///8dv///Hb///x2///8dv///Hb///x2///8dv///Hb///x2// + /8dv///Hb///x2///8dv///Hb///x2///8dv///Hb///x2///8dv///Hb///x2///8dv///Hb///x2// + /8dv///Hb///x2///8dv///Hb///x2///8dv///Hb///x2///8dv///Hb///x2///8dv///Hb///x2// + /8dv///Hb///x2///8dv///Hb//+xG/85JtzuN6SdIzeknRk3pJ0PN6SdBXeknQa3pJ0O96SdGTeknSP + 63hpy/9SWP//Ulj//1JY//9SWP/pfWvF3pJ0jd6SdGveknSI5YRuvP9SWP//Ulj//1JY//9SWP/vcmbU + 3pJ0k96SdGneknQ93pJ0FAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAADeknQF3pJ0Kd6SdFPeknR+3pJ0qf1XWPr/U1f//1NX//9TV//2ZF/n3pJ0nd6SdHTeknR3 + 3pJ0ovlfXO//U1f//1NX//9TV//6XFvz3pJ0pd6SdHzeknRf3pJ0SN6SdDPeknQt3pJ0Ut6SdHzeknSj + 6aRyxuqlccjqpXHI6qVxyOqlccjqpXHI6qVxyOqlccjqpXHI6qVxyOqlccjqpXHI6qVxyOqlccjqpXHI + 6qVxyOqlccjqpXHI6qVxyOqlccjqpXHI6qVxyOqlccjqpXHI6qVxyOqlccjqpXHI6qVxyOqlccjqpXHI + 6qVxyOqlccjqpXHI6qVxyOqlccjqpXHI6qVxyOqlccjqpXHI6qVxyOqlccjqpXHI6qVxyOqlccjqpXHI + 6qVxyOqlccjqpXHI6qVxyOqlccjqpXHI6qVxyOqlccjqpXHI6qVxyOqlccjqpXHI6qVxyOqlccjkm3O4 + 3pJ0kN6SdGfeknQ+3pJ0K96SdD3eknRT3pJ0bN6SdJDreWjL/1NX//9TV///U1f//1NX/+l9asXeknSN + 3pJ0a96SdIjlhG68/1NX//9TV///U1f//1NX/+9yZdTeknST3pJ0ad6SdD3eknQUAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN6SdAXeknQp3pJ0U96SdH7eknSp + /VdX+v9UVf//VFX//1RV//ZlXefeknSd3pJ0dN6SdHfeknSi+V9b7/9UVf//VFX//1RV//xZWPfiinC2 + 3pJ0mN6SdILeknRs3pJ0Vt6SdEDeknRH3pJ0ad6SdIPeknSN3pJ0jt6SdI7eknSO3pJ0jt6SdI7eknSO + 3pJ0jt6SdI7eknSO3pJ0jt6SdI7eknSO3pJ0jt6SdI7eknSO3pJ0jt6SdI7eknSO3pJ0jt6SdI7eknSO + 3pJ0jt6SdI7eknSO3pJ0jt6SdI7eknSO3pJ0jt6SdI7eknSO3pJ0jt6SdI7eknSO3pJ0jt6SdI7eknSO + 3pJ0jt6SdI7eknSO3pJ0jt6SdI7eknSO3pJ0jt6SdI7eknSO3pJ0jt6SdI7eknSO3pJ0jt6SdI7eknSO + 3pJ0jt6SdI7eknSO3pJ0jt6SdI7eknSO3pJ0jt6SdIveknR43pJ0WN6SdD3eknRM3pJ0Yd6SdHfeknSN + 3pJ0pPBwY9j/VFX//1RV//9UVf//VFX/6X1qxd6SdI3eknRr3pJ0iOWEbbz/VFX//1RV//9UVf//VFX/ + 73Jk1N6SdJPeknRp3pJ0Pd6SdBQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAA3pJ0Bd6SdCneknRT3pJ0ft6SdKn9WFb6/1RU//9UVP//VFT/9mVc596SdJ3eknR0 + 3pJ0d96SdKL5YFrv/1RU//9UVP//VFT//1RU//1YVfrudGTT35Bzqd6SdJHeknR73pJ0Zd6SdE/eknRN + 3pJ0W96SdGLeknRi3pJ0Yt6SdGLeknRi3pJ0Yt6SdGLeknRi3pJ0Yt6SdGLeknRi3pJ0Yt6SdGLeknRi + 3pJ0Yt6SdGLeknRi3pJ0Yt6SdGLeknRi3pJ0Yt6SdGLeknRi3pJ0Yt6SdGLeknRj3pJ0Z96SdGveknRr + 3pJ0a96SdGveknRr3pJ0ad6SdGTeknRi3pJ0Yt6SdGLeknRi3pJ0Yt6SdGLeknRi3pJ0Yt6SdGLeknRi + 3pJ0Yt6SdGLeknRi3pJ0Yt6SdGLeknRi3pJ0Yt6SdGLeknRi3pJ0Yt6SdGLeknRi3pJ0Yt6SdGLeknRi + 3pJ0YN6SdFTeknRK3pJ0Wd6SdHDeknSH3pJ0nOSGbrr3Y1vq/1RU//9UVP//VFT//1RU//9UVP/pfWnF + 3pJ0jd6SdGveknSI5YVtvP9UVP//VFT//1RU//9UVP/vc2TU3pJ0k96SdGneknQ93pJ0FAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeknQF3pJ0Kd6SdFPeknR+ + 3pJ0qf1ZVPr/VVL//1VS//9VUv/2Zlvn3pJ0nd6SdHTeknR33pJ0ovlgWe//VVL//1VS//9VUv//VVL/ + /1VS//9VUv/5YFnv5oNrwN6SdJ7eknSI3pJ0ct6SdFzeknRJ3pJ0Pt6SdDneknQ43pJ0ON6SdDjeknQ4 + 3pJ0ON6SdDjeknQ43pJ0ON6SdDjeknQ43pJ0ON6SdDjeknQ43pJ0ON6SdDjeknQ43pJ0ON6SdDjeknQ4 + 3pJ0ON6SdDjeknQ43pJ0P96SdFjeknR23pJ0ht6SdIfeknSH3pJ0h96SdIfeknSA3pJ0aN6SdEreknQ6 + 3pJ0ON6SdDjeknQ43pJ0ON6SdDjeknQ43pJ0ON6SdDjeknQ43pJ0ON6SdDjeknQ43pJ0ON6SdDjeknQ4 + 3pJ0ON6SdDjeknQ43pJ0ON6SdDjeknQ43pJ0ON6SdDveknRE3pJ0Ut6SdGbeknR83pJ0k9+Qc6vwcGHY + /VhU+/9VUv//VVL//1VS//9VUv//VVL//1VS/+l9acXeknSN3pJ0a96SdIjlhW28/1VS//9VUv//VVL/ + /1VS/+9zY9TeknST3pJ0ad6SdD3eknQUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAN6SdAXeknQp3pJ0U96SdH7eknSp/VlT+v9VUf//VVH//1VR//ZmWufeknSd + 3pJ0c96SdHPeknSa6nxoyPtdVfT/VVH//1VR//9VUf//VVH//1VR//9VUf/+V1H+82xd4OGMcLHeknSX + 3pJ0gN6SdGreknRU3pJ0Pt6SdCjeknQa3pJ0EN6SdA7eknQO3pJ0Dt6SdA7eknQO3pJ0Dt6SdA7eknQO + 3pJ0Dt6SdA7eknQO3pJ0Dt6SdA7eknQO3pJ0Dt6SdA7eknQO3pJ0Dt6SdBveknRC3pJ0at6SdJLii3Cz + 5IZtuuSGbbrkhm265IZtut6RdKPeknR/3pJ0Vt6SdC3eknQQ3pJ0Dt6SdA7eknQO3pJ0Dt6SdA7eknQO + 3pJ0Dt6SdA7eknQO3pJ0Dt6SdA7eknQO3pJ0Dt6SdA7eknQO3pJ0Dt6SdA7eknQO3pJ0Fd6SdCDeknQy + 3pJ0SN6SdF/eknR33pJ0i96SdKHpfmjG+15V9P9VUf//VVH//1VR//9VUf//VVH//1VR//5XUf30aVzj + 4Y1xr96SdIfeknRp3pJ0iOWFbLz/VVH//1VR//9VUf//VVH/73Ni1N6SdJPeknRp3pJ0Pd6SdBQAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3pJ0Bd6SdCneknRT + 3pJ0ft6SdKn9WlH6/1ZP//9WT///Vk//9mZZ596SdJ3eknRz3pJ0Yt6SdH7eknSV4Y1xr/JuXtz+V1D9 + /1ZP//9WT///Vk///1ZP//9WT///Vk///FxT9ux5Zc3eknSk3pJ0jt6SdHfeknRi3pJ0S96SdDXeknQe + 3pJ0Ct6SdAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAADeknQA3pJ0GN6SdEPeknRu3pJ0mfNtXd7/Vk///1ZP//9WT///Vk//4I9ysN6SdIPeknRY + 3pJ0Lt6SdAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAADeknQA3pJ0BN6SdBPeknQr3pJ0Qd6SdFbeknRs3pJ0gt6SdJnii3C09Wlb5P5XUP7/Vk// + /1ZP//9WT///Vk///1ZP//9WT//6X1Tz6H9pxd6SdKHeknSL3pJ0cd6SdGLeknSI5YVsvP9WT///Vk// + /1ZP//9WT//vdGHU3pJ0k96SdGneknQ93pJ0FAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAADeknQF3pJ0Kd6SdFPeknR+3pJ0qf1aUPr/V07//1dO//9XTv/2Z1jn + 3pJ0nd6SdHPeknRP3pJ0Wt6SdHDeknSG3pJ0nOWFbL34Y1bt/1dO//9XTv//V07//1dO//9XTv//V07/ + /1dO//dlVuvlhmy83pJ0m96SdIbeknRw3pJ0Wt6SdEPeknQt3pJ0Ft6SdAbeknQAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN6SdADeknQY3pJ0Q96SdG7eknSZ + 821c3v9XTv//V07//1dO//9XTv/gj3Kw3pJ0g96SdFjeknQu3pJ0BwAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3pJ0Ad6SdAzeknQh3pJ0ON6SdE7eknRm + 3pJ0et6SdJDfkHOo7nZh0v1aUPr/V07//1dO//9XTv//V07//1dO//9XTv/9WlD773Ng19+Qc6reknSS + 3pJ0fN6SdGbeknRS3pJ0Xt6SdIjlhWy8/1dO//9XTv//V07//1dO/+90YdTeknST3pJ0ad6SdD3eknQU + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN6SdAXeknQp + 3pJ0U96SdH7eknSp/VtP+v9XTP//V0z//1dM//ZnV+feknSd3pJ0c96SdFDeknRB3pJ0Td6SdGPeknR5 + 3pJ0kd+Qc6fteGPQ/VxQ+f9XTP//V0z//1dM//9XTP//V0z//1dM//5aTvzwcV7Z349yq96SdJPeknR9 + 3pJ0Z96SdFHeknQ73pJ0Jt6SdA/eknQCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAA3pJ0AN6SdBjeknRD3pJ0bt6SdJnzblve/1dM//9XTP//V0z//1dM/+CPcrDeknSD + 3pJ0WN6SdC7eknQHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + 3pJ0AN6SdAbeknQZ3pJ0Lt6SdEXeknRb3pJ0cd6SdIjeknSf5oRqv/ljVO//V03//1dM//9XTP//V0z/ + /1dM//9XTP//V03/9mdX6eSHbbneknSb3pJ0hd6SdG7eknRZ3pJ0Rd6SdEXeknRh3pJ0iOWFa7z/V0z/ + /1dM//9XTP//V0z/73Rg1N6SdJPeknRp3pJ0Pd6SdBQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3pJ0Bd6SdCneknRT3pJ0ft6SdKn9W036/1hL//9YS///WEv/ + 9mhW6N6SdKLeknSI3pJ0ct6SdF3eknRJ3pJ0RN6SdFbeknRr3pJ0gd6SdJfhjHCy9GxZ4v5ZS/3/WEv/ + /1hL//9YS///WEv//1hL//9YS//7X1D16X5mx96RdKLeknSL3pJ0dd6SdGDeknRK3pJ0Mt6SdB3eknQI + 3pJ0AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeknQA3pJ0GN6SdEPeknRu + 3pJ0mfNuWt7/WEv//1hL//9YS///WEv/4I9ysN6SdIPeknRY3pJ0Lt6SdAcAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN6SdAPeknQT3pJ0J96SdD3eknRT3pJ0at6SdIDeknSW + 4YxwsPJuWt/+WUv+/1hL//9YS///WEv//1hL//9YS///WEv/+19Q9ep8ZcreknSi3pJ0jN6SdHbeknRg + 3pJ0S96SdETeknRU3pJ0Z96SdH3eknST5YVrvv9YS///WEv//1hL//9YS//vdV/U3pJ0k96SdGneknQ9 + 3pJ0FAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeknQF + 3pJ0Kd6SdFPeknR+3pJ0qf1cTPr/WUn//1lJ//9ZSf/+W0v88XJc2uCPca7eknSW3pJ0gt6SdGzeknRX + 3pJ0R96SdEneknRd3pJ0dN6SdIreknSi6IFnw/piUPL/WUn//1lJ//9ZSf//WUn//1lJ//9ZSf//WUr+ + 9WpW5eKLb7TeknSZ3pJ0hN6SdGzeknRW3pJ0QN6SdCreknQW3pJ0BAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAN6SdADeknQY3pJ0Q96SdG7eknSZ825a3v9ZSf//WUn//1lJ//9ZSf/gj3Kw + 3pJ0g96SdFjeknQu3pJ0BwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN6SdAHeknQK + 3pJ0Ht6SdDXeknRM3pJ0Yd6SdHfeknSN3pJ0o+t7Y8z7X072/1lJ//9ZSf//WUn//1lJ//9ZSf//WUn/ + /lpK/fJvWt3hjXGv3pJ0lt6SdH/eknRp3pJ0U96SdEXeknRO3pJ0Yd6SdHjeknSL3pJ0oOeDaML5ZFLv + /1lJ//9ZSf//WUn//1lJ/+91XtTeknST3pJ0ad6SdD3eknQUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN6SdAXeknQp3pJ0U96SdH7eknSp/V1L+v9ZSP//WUj/ + /1lI//9ZSP//WUj//F5M+O15YNDfkHKo3pJ0kt6SdH3eknRo3pJ0VN6SdEfeknRQ3pJ0Z96SdHveknSS + 35FzqO90Xdb9XEv6/1lI//9ZSP//WUj//1lI//9ZSP//WUj//VxK+u52XtXfkHKp3pJ0kd6SdHveknRl + 3pJ0UN6SdDneknQi3pJ0Dd6SdAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3pJ0AN6SdBjeknRD + 3pJ0bt6SdJnzb1ne/1lI//9ZSP//WUj//1lI/+CPcbDeknSD3pJ0WN6SdC7eknQHAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAN6SdADeknQG3pJ0F96SdCzeknRD3pJ0Wd6SdHHeknSG3pJ0m+WHa7r3Z1Pq + /1lI//9ZSP//WUj//1lI//9ZSP//WUj//1lI//hlUe3lhmq93pJ0nN6SdIfeknRx3pJ0Wt6SdEneknRL + 3pJ0Xd6SdHTeknSH3pJ0nOSIbLn1alXm/1pI/v9ZSP//WUj//1lI//9ZSP//WUj/73Ve1N6SdJPeknRp + 3pJ0Pd6SdBQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + 3pJ0Bd6SdCneknRT3pJ0ft6SdKj7YUz1/1pG//9aRv//Wkb//1pG//9aRv//Wkb//1pH//lkTvDogWbE + 3pJ0ot6SdIzeknR43pJ0ZN6SdE/eknRJ3pJ0WN6SdG7eknSE3pJ0muOJbLn2aVPo/1pH//9aRv//Wkb/ + /1pG//9aRv//Wkb//1pG//llT+/nhGjB3pJ0nt6SdIneknRz3pJ0XN6SdEXeknQv3pJ0Gt6SdAjeknQA + AAAAAAAAAAAAAAAAAAAAAAAAAADeknQA3pJ0GN6SdEPeknRu3pJ0mfNvWN7/Wkb//1pG//9aRv//Wkb/ + 4I9xsN6SdIPeknRY3pJ0Lt6SdAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeknQC3pJ0Dt6SdCTeknQ8 + 3pJ0UN6SdGbeknR83pJ0k9+Qcqvwc1vY/V1J+/9aRv//Wkb//1pG//9aRv//Wkb//1pG//1eSvnteWDR + 35Bzp96SdJDeknR63pJ0Y96SdE7eknRJ3pJ0Wd6SdG7eknSC3pJ0l+CPca7xcVnb/V1J+/9aRv//Wkb/ + /1pG//9aRv//Wkb//1pG//9aR//seWDP3pJ0kt6SdGneknQ93pJ0FAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeknQD3pJ0I96SdEzeknRy3pJ0lOCOca/xcVjc + /V1H+/9aRf//WkX//1pF//9aRf//WkX//1pF//9bRf/2alLo5Ydqu96SdJ7eknSK3pJ0dN6SdF/eknRM + 3pJ0TN6SdF/eknR33pJ0jN6SdKLqfmPI+2FL9f9aRf//WkX//1pF//9aRf//WkX//1pF//9bRf7zb1bg + 4Yxvs96SdJfeknSB3pJ0at6SdFXeknRA3pJ0KN6SdBLeknQD3pJ0AAAAAAAAAAAAAAAAAN6SdADeknQY + 3pJ0Q96SdG7eknSZ829X3v9aRf//WkX//1pF//9aRf/gj3Gw3pJ0g96SdFjeknQu3pJ0BwAAAAAAAAAA + AAAAAAAAAADeknQB3pJ0Cd6SdBzeknQz3pJ0SN6SdGDeknR13pJ0i96SdKHpgGTG+2JL9P9aRf//WkX/ + /1pF//9aRf//WkX//1pF//5bRv30bVTi4Yxvst6SdJfeknSB3pJ0a96SdFXeknRJ3pJ0Vd6SdGneknR+ + 3pJ0lN+QcqnteV7R/F9J+P9aRf//WkX//1pF//9aRf//WkX//1pF//9bRf/5ZE3w6IFlxd6SdKHeknSE + 3pJ0YN6SdDjeknQQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAN6SdADeknQV3pJ0ON6SdFneknR03pJ0h96SdJzkiGu69WtS5v9bRP7/W0P//1tD//9bQ///W0P/ + /1tD//9bQ//+XUX88nBW3+GNcLHeknSY3pJ0g96SdG7eknRZ3pJ0TN6SdFTeknRo3pJ0f96SdJXhjnCv + 8XJY3P5cRf3/W0P//1tD//9bQ///W0P//1tD//9bQ//8YEj363xgzN6SdKTeknSN3pJ0ed6SdGLeknRL + 3pJ0Nd6SdB/eknQK3pJ0AQAAAAAAAAAA3pJ0AN6SdBjeknRD3pJ0bt6SdJnzcFbe/1tD//9bQ///W0P/ + /1tD/+CPcbDeknSD3pJ0WN6SdC7eknQHAAAAAAAAAAAAAAAA3pJ0BN6SdBTeknQr3pJ0QN6SdFbeknRs + 3pJ0gt6SdJnii26z9WxS5f5cRP7/W0P//1tD//9bQ///W0P//1tD//9bQ//6Y0vz6IFlxd6SdKHeknSK + 3pJ0dN6SdF7eknRM3pJ0Ud6SdGTeknR43pJ0jt6SdKHpgGTG+WVM8P9bRP//W0P//1tD//9bQ///W0P/ + /1tD//9bQ//8YEj47Xle0N+QcqreknSS3pJ0ft6SdGfeknRJ3pJ0Jt6SdAYAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN6SdATeknQc3pJ0Od6SdE7eknRi + 3pJ0eN6SdIzeknSg54NmwvhnTO7/XEL//1xC//9cQv//XEL//1xC//9cQv//XEL//WBG+e53W9Tgj3Gr + 3pJ0lN6SdH/eknRr3pJ0Vt6SdE3eknRa3pJ0cN6SdIjeknSc5YdpvPhoTez/XEL//1xC//9cQv//XEL/ + /1xC//9cQv//XEL/+GhN7OWHabveknSe3pJ0ht6SdHDeknRZ3pJ0RN6SdC3eknQX3pJ0Bd6SdADeknQA + 3pJ0GN6SdEPeknRu3pJ0mfNwVd7/XEL//1xC//9cQv//XEL/4I9xsN6SdIPeknRY3pJ0Lt6SdAcAAAAA + 3pJ0At6SdA3eknQi3pJ0N96SdE/eknRl3pJ0e96SdJDfkHKo7nhc0/1fRfr/XEL//1xC//9cQv//XEL/ + /1xC//9cQv/9X0X673Za19+Rc6neknSS3pJ0fN6SdGbeknRR3pJ0T96SdF/eknR03pJ0it6SdJ3lhmm9 + 9mpP6f9cQv//XEL//1xC//9cQv//XEL//1xC//9cQv/9X0X78XNX2+COca/eknSW3pJ0g96SdG3eknRY + 3pJ0Q96SdCzeknQN3pJ0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAN6SdATeknQW3pJ0Kd6SdD/eknRU3pJ0Z96SdHzeknSR35Bzp+x8X837Ykb2 + /1xA//9cQP//XED//1xA//9cQP//XED//1xA//pkSPLqf2HJ3pJ0o96SdI/eknR63pJ0Zt6SdFLeknRR + 3pJ0ZN6SdHneknSP35Fzpu16XdH8YET5/1xA//9cQP//XED//1xA//9cQP//XED//V9D+/F0VtrfkHKr + 3pJ0k96SdH3eknRn3pJ0UN6SdDreknQk3pJ0D96SdALeknQY3pJ0Q96SdG7eknSZ83FU3v9cQP//XED/ + /1xA//9cQP/gj3Gw3pJ0g96SdFjeknQu3pJ0B96SdAfeknQb3pJ0L96SdEXeknRb3pJ0cd6SdIneknSd + 5oVnv/lnSu7/XEH//1xA//9cQP//XED//1xA//9cQP//XEH/9mpO6eSIa7neknSb3pJ0hd6SdG/eknRY + 3pJ0Tt6SdFveknRx3pJ0hN6SdJjhjW+y83FU3v5eQvz/XED//1xA//9cQP//XED//1xA//9cQP//XUH+ + 9W1R5eSIa7neknSb3pJ0id6SdHPeknRe3pJ0St6SdDTeknQf3pJ0C96SdAEAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN6SdADeknQH + 3pJ0Gt6SdC3eknRC3pJ0V96SdGveknSA3pJ0luCPcqzwdVjX/WBC+v9dP///XT///10///9dP///XT// + /10///9dP//3aUvs5oRmv96SdKHeknSL3pJ0dt6SdGHeknRQ3pJ0Vt6SdGreknSB3pJ0mOGNb7D0b1Hi + /l5A/f9dP///XT///10///9dP///XT///10///tkRvTqf2HI3pJ0ot6SdIzeknR13pJ0X96SdEneknQz + 3pJ0HN6SdBveknRD3pJ0bt6SdJnzcVPe/10///9dP///XT///10//+CPcbDeknSD3pJ0WN6SdC7eknQV + 3pJ0J96SdD/eknRV3pJ0at6SdIDeknSW4Y1vsfJxU+D+XkD+/10///9dP///XT///10///9dP///XT// + +2NF9ep/YcreknSi3pJ0jN6SdHbeknRg3pJ0UN6SdFfeknRs3pJ0f96SdJXgj3Gt73dZ1f1gQvr/XT// + /10///9dP///XT///10///9dP///XT//+GhL7eeEZsHeknSf3pJ0i96SdHbeknRi3pJ0Tt6SdDjeknQk + 3pJ0EN6SdAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeknQC3pJ0Ct6SdB7eknQy3pJ0R96SdF3eknRy + 3pJ0hd6SdJzjimy29G9Q4v9fPv7/Xj3//149//9ePf//Xj3//149//9ePf/+Xz/99HBQ4uKMbbXeknSZ + 3pJ0hd6SdHDeknRc3pJ0Ud6SdF7eknR03pJ0it6SdKDog2TD+mZG8v9ePf//Xj3//149//9ePf//Xj3/ + /149//9fPv71bk7l4otttd6SdJneknSD3pJ0bN6SdFfeknRA3pJ0LN6SdEPeknRu3pJ0mfNyUt7/Xj3/ + /149//9ePf//Xj3/4I9xsN6SdIPeknRY3pJ0Md6SdDTeknRK3pJ0Yd6SdHneknSN3pJ0pOt9Xsz8ZEP2 + /149//9ePf//Xj3//149//9ePf//Xj3//l8//fJzVN3hjm+w3pJ0ld6SdH/eknRp3pJ0Vd6SdFTeknRm + 3pJ0et6SdJDeknSk6n9gyfplRfP/Xj3//149//9ePf//Xj3//149//9ePf//Xj3/+2RE9et9Xs3fkXOn + 3pJ0kd6SdHzeknRn3pJ0Ut6SdD7eknQq3pJ0FN6SdAXeknQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAA3pJ0At6SdA7eknQi3pJ0ON6SdEveknRh3pJ0dt6SdIreknSe5oZnvvdqSuv/Xz3+ + /148//9ePP//Xjz//148//9ePP//Xjz//WE/+/B2VtjgjnCu3pJ0ld6SdIHeknRt3pJ0Wd6SdFTeknRl + 3pJ0e96SdJHfkXOq73hY1P1hP/r/Xjz//148//9ePP//Xjz//148//9ePP/9YT/77nlZ09+QcqneknSR + 3pJ0e96SdGXeknRP3pJ0SN6SdG7eknSZ83JR3v9ePP//Xjz//148//9ePP/gj3Gw3pJ0g96SdFneknRG + 3pJ0Wd6SdG/eknSG3pJ0nOWIabz3a0nr/148//9ePP//Xjz//148//9ePP//Xjz//148//hpSO3lhmi9 + 3pJ0nN6SdIfeknRy3pJ0W96SdFTeknRh3pJ0dt6SdIzeknSg54Vlv/hpSO3/Xjz//148//9ePP//Xjz/ + /148//9ePP//Xjz//WJA+fB2VtffkHKs3pJ0ld6SdIDeknRs3pJ0Vt6SdEHeknQs3pJ0GN6SdAfeknQB + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3pJ0AN6SdATeknQT + 3pJ0J96SdD7eknRR3pJ0Zd6SdHreknSP35Fzpep/X8r6ZkP0/187//9fO///Xzv//187//9fO///Xzv/ + /187//tlQfXrfl3M3pFzpd6SdJDeknR93pJ0Z96SdFbeknRZ3pJ0b96SdITeknSa5IlquPZtS+f/Xzv/ + /187//9fO///Xzv//187//9fO///Xzv/+WhF8OaFZb/eknSe3pJ0iN6SdHLeknRd3pJ0bt6SdJnzclDe + /187//9fO///Xzv//187/+CPcbDeknSD3pJ0Xt6SdGjeknR93pJ0k9+QcqrwdlTY/WE9+/9fO///Xzv/ + /187//9fO///Xzv//187//1jP/nte1rR35Byp96SdJDeknR53pJ0ZN6SdFbeknRd3pJ0ct6SdIbeknSa + 4oxttfRwTuP+YDz9/187//9fO///Xzv//187//9fO///Xzv//mA8/vRxT+Lii2y03pJ0mt6SdIXeknRy + 3pJ0XN6SdEjeknQz3pJ0Hd6SdAreknQBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN6SdADeknQG3pJ0GN6SdCveknRA3pJ0VN6SdGreknR/ + 3pJ0lN+Rc6nueVfU/GQ++P9gOf//YDn//2A5//9gOf//YDn//2A5//9gOf/5aUTw6INjw96SdKLeknSM + 3pJ0eN6SdGLeknRW3pJ0YN6SdHXeknSM3pJ0ouqAX8n7ZkH0/2A5//9gOf//YDn//2A5//9gOf//YDn/ + /mA6/vNyTuHhjW6x3pJ0l96SdIHeknR13pJ0mfNzT97/YDn//2A5//9gOf//YDn/4I9xsN6SdIPeknR2 + 3pJ0i96Sc6PpgWDG+2dB9P9gOf//YDn//2A5//9gOf//YDn//2A5//5hOv30cE3i4Y1ust6SdJfeknSD + 3pJ0at6SdFneknRa3pJ0bt6SdILeknSW4Y5vsPB2U9r+Yjz7/2A5//9gOf//YDn//2A5//9gOf//YDn/ + /2A6/vdsSOvlh2i83pJ0nt6SdIneknR03pJ0YN6SdE3eknQ33pJ0Id6SdA/eknQCAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAADeknQB3pJ0Cd6SdBzeknQx3pJ0Rd6SdFveknRv3pJ0hN6SdJrijW2y8nNP3v5hOf3/YDj/ + /2A4//9gOP//YDj//2A4//9gOP/+YTn99W5J5uOKarjeknSc3pJ0h96SdHLeknRe3pJ0WN6SdGjeknR+ + 3pJ0leCOcK7xdFHd/mE5/f9gOP//YDj//2A4//9gOP//YDj//2A4//xlPvfsfVvN3pJ0pN6SdI7eknSZ + 83NP3v9gOP//YDj//2A4//9gOP/gj3Gw3pJ0jN6SdJjijG209W9K5f5hOf7/YDj//2A4//9gOP//YDj/ + /2A4//9gOP/6aEHz6INixN6SdKHeknSK3pJ0dN6SdGDeknRY3pJ0aN6SdHzeknSQ3pJzp+x9Ws77Zj/1 + /2A4//9gOP//YDj//2A4//9gOP//YDj//2A4//pnQPTqgF/I35FzpN6SdJDeknR63pJ0Zd6SdFDeknQ8 + 3pJ0J96SdBTeknQE3pJ0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3pJ0At6SdAzeknQh + 3pJ0Nd6SdEreknRg3pJ0c96SdIjeknSd5IlpuvZuR+j+Yjf+/2E2//9hNv//YTb//2E2//9hNv//YTb/ + /mM4/PJ1T9zhjW6x3pJ0mN6SdIPeknRv3pJ0Xd6SdFzeknRw3pJ0ht6SdJ7liGi7+GxE7f9hN///YTb/ + /2E2//9hNv//YTb//2E2//9hNv/3bEXr5YhnvN6SdKTzdE7e/2E2//9hNv//YTb//2E2/+CPcLHfkHKp + 7npW0/1kOvr/YTb//2E2//9hNv//YTb//2E2//9hNv/9ZDr673hU1t+RcqneknSS3pJ0fN6SdGbeknRa + 3pJ0ZN6SdHjeknSN3pJ0o+iDYcT5akHw/2E2//9hNv//YTb//2E2//9hNv//YTb//2E2//xlPPfue1fS + 35Fzqd6SdJTeknR+3pJ0at6SdFXeknQ/3pJ0Kt6SdBbeknQG3pJ0AAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3pJ0AN6SdATeknQQ3pJ0Jt6SdDveknRP3pJ0ZN6SdHneknSN + 3pJzo+iDYMX5akDx/2E1//9hNf//YTX//2E1//9hNf//YTX//2E1//xmO/fue1bR3pFzp96SdJPeknR+ + 3pJ0ad6SdFveknRl3pJ0ed6SdI/fkXKm7H1Zz/1lOfn/YTX//2E1//9hNf//YTX//2E1//9hNf/+Yzf8 + 8XdQ2vNzS+H/YTX//2E1//9hNf//YTX/6IRiyPlrQe//YTX//2E1//9hNf//YTX//2E1//9hNf//YTX/ + 9m5G6eSJabneknSa3pJ0hd6SdG/eknRd3pJ0YN6SdHPeknSJ3pJ0nOSKabn2cEfm/mI2/v9hNf//YTX/ + /2E1//9hNf//YTX//2E1//5jN/3ydU7d4o1tst6SdJjeknSD3pJ0cN6SdFveknRF3pJ0Mt6SdBveknQJ + 3pJ0AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAN6SdADeknQG3pJ0Fd6SdCneknQ+3pJ0U96SdGjeknR+3pJ0kd+Rc6fsfVjP/Gc69v9iM///YjP/ + /2Iz//9iM///YjP//2Iz//9iM//6aT3y6YFdyN6Sc6PeknSP3pJ0ed6SdGXeknRd3pJ0at6SdIHeknSX + 4Y1usvRzSuH+YzX9/2Iz//9iM///YjP//2Iz//9iM///YjP//2I0/v9iM///YjP//2Iz//9iM///YjT+ + /2Iz//9iM///YjP//2Iz//9iM///YjP/+2g79eqAXMneknSk3pJ0jN6SdHbeknRi3pJ0Xt6SdG/eknSF + 3pJ0mOGNbbLydU3e/mM1/f9iM///YjP//2Iz//9iM///YjP//2Iz//5jNP72cEbn5Ippud6SdJzeknSI + 3pJ0ct6SdF7eknRJ3pJ0Nt6SdB/eknQN3pJ0AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeknQB3pJ0CN6SdBreknQv + 3pJ0RN6SdFneknRt3pJ0hN6SdJbhjm6v8XdP2v5lNPz/YzL//2My//9jMv//YzL//2My//9jMv//YzL+ + 929D6eWIZrzeknSd3pJ0id6SdHTeknRi3pJ0Yd6SdHXeknSK3pJ0oOiEYMP6az3x/2My//9jMv//YzL/ + /2My//9jMv//YzL//2My//9jMv//YzL//2My//9jMv//YzL//2My//9jMv//YzL//mQz/fJ2Td3hjm+v + 3pJ0ld6SdIDeknRq3pJ0Xt6SdGneknR/3pJ0kt+RcqnufFTT/Gc49/9jMv//YzL//2My//9jMv//YzL/ + /2My//9jMv/5az7w6INgxd6SdKLeknSN3pJ0ed6SdGPeknRO3pJ0Ot6SdCXeknQS3pJ0A96SdAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3pJ0Ad6SdAveknQf3pJ0M96SdEneknRe3pJ0cd6SdIbeknSa + 44tqtvRyRuT+ZDL9/2Mx//9jMf//YzH//2Mx//9jMf//YzH//mQy/vN0SeDijGu03pJ0md6SdIXeknRx + 3pJ0Yd6SdGbeknR73pJ0kd+Rc6nvelLW/WY1+v9jMf//YzH//2Mx//9jMf//YzH//2Mx//9jMf//YzH/ + /2Mx//9jMf//YzH//2Mx//htP+zliGW93pJ0nd6SdIfeknRw3pJ0Yd6SdGjeknR63pJ0jt6Rc6TqglzI + +mo68/9jMf//YzH//2Mx//9jMf//YzH//2Mx//9jMf/7aDj27H5Xzt6Sc6beknSS3pJ0fd6SdGjeknRU + 3pJ0Pd6SdCneknQU3pJ0Bd6SdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + 3pJ0AN6SdAPeknQP3pJ0Jd6SdDneknRN3pJ0Yt6SdHfeknSM3pJ0oeeFYcH4bj7t/2Qv//9kL///ZC// + /2Qv//9kL///ZC///2Qv//1nNPnve1HU35Bxq96SdJXeknSA3pJ0a96SdGHeknRu3pJ0hd6SdJrji2m3 + 9nFC6P9kL///ZC///2Qv//9kL///ZC///2Qv//9kL///ZC///2Qv//1nNPntfVXQ35Fypt6SdJDeknR5 + 3pJ0Zd6SdGTeknR03pJ0it6SdJ/liGW9929A6f9kMP7/ZC///2Qv//9kL///ZC///2Qv//9kL//9ZjL7 + 8HhO2eGPb6/eknSW3pJ0gd6SdG3eknRa3pJ0Q96SdC/eknQb3pJ0CN6SdAEAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN6SdADeknQE3pJ0E96SdCfeknQ8 + 3pJ0Ud6SdGfeknR73pJ0j96SdKbrgFnL+2s38/9lLv//ZS7//2Uu//9lLv//ZS7//2Uu//9lLv/7ajb1 + 64BZy9+RcqbeknSQ3pJ0e96SdGjeknRk3pJ0dt6SdIveknSi6oJcyPtqN/T/ZS7//2Uu//9lLv//ZS7/ + /2Uu//5mL/30dEbi4Y1tst6SdJfeknSB3pJ0bN6SdGTeknRw3pJ0ht6SdJrjjGq183VG4v5mL/7/ZS7/ + /2Uu//9lLv//ZS7//2Uu//9lLv/+Zi/99HNF4+KMa7beknSb3pJ0hd6SdHHeknRc3pJ0SN6SdDTeknQe + 3pJ0C96SdAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAADeknQA3pJ0B96SdBjeknQt3pJ0Q96SdFbeknRs3pJ0gd6SdJXgj3Cs + 73pO1v1oMPr/ZSz//2Us//9lLP//ZSz//2Us//9lLP//ZSz++G877eaHYr/eknSf3pJ0it6SdHbeknRl + 3pJ0at6SdH/eknSV4Y5urvF4S9z+Zi79/2Us//9lLP/6bDfy6IRexN6SdKDeknSK3pJ0dN6SdGXeknRr + 3pJ0gN6SdJXfkHGr73pO1/1oMfn/ZSz//2Us//9lLP//ZSz//2Us//9lLP//ZSz/+G887eeGYcHeknSg + 3pJ0i96SdHjeknRh3pJ0TN6SdDfeknQj3pJ0D96SdAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + 3pJ0Ad6SdAreknQc3pJ0Md6SdEjeknRa3pJ0b96SdITeknSZ4Y5tsvN2ReH+aC38/2Yr//9mK///Ziv/ + /2Yr//9mK///Ziv//2cr/vV0QuXji2i33pJ0m96SdIfeknRz3pJ0Z96SdHHeknSG3pJ0nOWJZbz3cT3q + 73tO1t+RcqreknSR3pJ0fN6SdGneknRq3pJ0fd6SdJDfkXKm64BXzPtrM/b/Ziv//2Yr//9mK///Ziv/ + /2Yr//9mK///Ziv/+mw18+qCWcneknSk3pJ0j96SdHzeknRm3pJ0Ud6SdD3eknQn3pJ0Et6SdAQAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3pJ0AN6SdALeknQP3pJ0I96SdDbeknRM + 3pJ0YN6SdHXeknSK3pJ0nuWIZLz3cTzr/2cp//9nKf//Zyn//2cp//9nKf//Zyn//2cp//1pLfrxeUna + 4JBwrt6SdJbeknSB3pJ0bt6SdGjeknR53pJ0kN6SdKTeknSb3pJ0hd6SdHHeknRo3pJ0d96SdIveknSh + 54ZgwfhwOe3/Zyr+/2cp//9nKf//Zyn//2cp//9nKf//Zyn//Wku+u98TtXgj3Cs3pJ0lN6SdIDeknRr + 3pJ0V96SdELeknQs3pJ0Gd6SdAfeknQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAN6SdADeknQD3pJ0Ed6SdCXeknQ63pJ0T96SdGXeknR53pJ0jt6SdKPphFvG + +m408f9nKP//Zyj//2co//9nKP//Zyj//2co//9nKP/8ay/37X9S0N+RcajeknSS3pJ0fd6SdGveknRu + 3pJ0et6SdHbeknRq3pJ0c96SdIfeknSd5ItnuPV0PuX/Zyj+/2co//9nKP//Zyj//2co//9nKP//Zyj/ + /mkq/PN3RN/hjmyx3pJ0mt6SdITeknRv3pJ0Wt6SdEbeknQx3pJ0Hd6SdAneknQBAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeknQA + 3pJ0Bt6SdBbeknQt3pJ0QN6SdFXeknRr3pJ0ft6SdJPfkHGq7X5Q0vxrLPn/aCb//2gm//9oJv//aCb/ + /2gm//9oJv//aCb/+XA07+iFXMTeknSh3pJ0jd6SdHjeknRo3pJ0bt6SdIHeknSX4I9vrfF6R9v9air7 + /2gm//9oJv//aCb//2gm//9oJv//aCb//2gn//dzOunliWO83pJ0n96SdIneknR13pJ0YN6SdEreknQ2 + 3pJ0Id6SdA3eknQC3pJ0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3pJ0Ad6SdAneknQZ3pJ0Md6SdETeknRY + 3pJ0bd6SdIPeknSX4Y9usPF6Rtv+aij7/2gl//9oJf//aCX//2gl//9oJf//aCX//2kl//Z0OujlimS7 + 3pJ0nd6SdIveknST35FxqO1/UND8bCz4/2gl//9oJf//aCX//2gl//9oJf//aCX//2kl//lwMvHphVvF + 3pJ0ot6SdI3eknR53pJ0Zd6SdE/eknQ73pJ0Jd6SdBHeknQDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAN6SdALeknQO3pJ0H96SdDXeknRJ3pJ0Xt6SdHPeknSJ3pJ0m+SKZbr1dTzm + /2kk//9pI///aSP//2kj//9pI///aSP//2kj//5rJ/zyeULe4Y9ts+iFWsb5cDHw/2kk//9pI///aSP/ + /2kj//9pI///aSP//2kj//xsKvjtf1DR35Bxqd6SdJPeknR+3pJ0ad6SdFXeknRB3pJ0Kt6SdBbeknQG + 3pJ0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeknQD + 3pJ0D96SdCPeknQ43pJ0Tt6SdGLeknR33pJ0jd6SdKDnhlzC+HEy7v9qIv//aiL//2oi//9qIv//aiL/ + /2oi//9qIv/+ayX8/2oi//9qIv//aiL//2oi//9qIv//aiL//2oi//1sJvvxe0Tb4I9vrt6SdJbeknSD + 3pJ0bd6SdFjeknRD3pJ0L96SdBveknQJ3pJ0AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeknQA3pJ0Bd6SdBXeknQq3pJ0Pt6SdFTeknRo + 3pJ0fN6SdJLfkXKn7IFRzvxuKfb/aiD//2og//9qIP//aiD//2og//9qIP//aiD//2og//9qIP//aiD/ + /2og//9rIf71djrl5Itlud6SdJzeknSI3pJ0ct6SdF/eknRJ3pJ0NN6SdB/eknQM3pJ0AgAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAA3pJ0Ad6SdAfeknQZ3pJ0L96SdELeknRX3pJ0bN6SdIDeknSV35BwrPB9Rtj9bST6 + /2sf//9rH///ax///2sf//9rH///ax///2sf//9rH//4czHt54hdwd6SdKDeknSL3pJ0dt6SdGPeknRN + 3pJ0ON6SdCTeknQP3pJ0AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN6SdALeknQL + 3pJ0Ht6SdDLeknRH3pJ0XN6SdHLeknSG3pJ0muOMaLf0eDvj/2wf/v9sHf//bB3//2wd//9sHf/7cCf2 + 64JRzd+RcqfeknSR3pJ0fN6SdGfeknRT3pJ0P96SdCreknQU3pJ0Bd6SdAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeknQC3pJ0Dt6SdCLeknQ33pJ0Td6SdGDeknR2 + 3pJ0it6SdJ7miWC993Uw6/9sHf79biL58H5F2N+QcKzeknSU3pJ0gd6SdGveknRW3pJ0Qd6SdC3eknQY + 3pJ0CN6SdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAADeknQA3pJ0BN6SdBTeknQn3pJ0Pd6SdFPeknRl3pJ0e96SdI/fkXKl6YZXxuONaLXeknSa + 3pJ0h96SdHHeknRc3pJ0SN6SdDLeknQd3pJ0Ct6SdAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3pJ0AN6SdAbeknQY + 3pJ0LN6SdEDeknRV3pJ0at6SdH/eknSP3pJ0id6SdHXeknRg3pJ0TN6SdDbeknQj3pJ0Dt6SdAIAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN6SdAHeknQJ3pJ0HN6SdDHeknRF3pJ0Wt6SdGXeknRi + 3pJ0Ud6SdDzeknQp3pJ0Et6SdATeknQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAADeknQB3pJ0Dd6SdCDeknQy3pJ0Ot6SdDjeknQq3pJ0Ft6SdAbeknQAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeknQA3pJ0A96SdAzeknQQ + 3pJ0D96SdAfeknQBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAP/////////wH///////////////////4Af//////////////////4AB//// + //////////////4AAP/////////////////4AAA/////////////////8AAAD////////////////8AA + AAP///////////////8AAAAB///////////////8AAAAAH//////////////+AAAAAAf//////////// + /+AAAAAAB/////////////+AAAAAAAP////////////+AAAAAAAAf///////////+AAAAAAAAD////// + /////+AAAAAAAAAP///////////AAAAAAAAAB///////////AAAAAAAAAAH//////////AAAAAAAAAAA + f/////////AAAAAAAAAAAB/////////gAAAAAAAAAAAH////////gAAAAAAAAAAAAf///////gAAAAAA + AAAAAAD///////gAAAAAAAAAAAAAP//////wAAAAAAAAAAAAAA//////wAAAAAAAAAAAAAAD/////wAA + AAAAAAAAAAAAAf////wAAAAAAAAAAAAAAAB////4AAAAAAAAAAAAAAAAH///4AAAAAAAAAAAAAAAAAf/ + /4AAAAAAAAAAAAAAAAAD//8AAAAAAAAAAAAAAAAAAP/+AAAAAAAAgAEAAAAAAAB//AAAAAAAAQABgAAA + AAAAf/wAAAAAAAcAAOAAAAAAAH/8AAAAAAAeAABwAAAAAAB//AAAAAAAfgAAfAAAAAAAf/wAAAAAAPwA + AD8AAAAAAH/8AAAAAAP8AAA/wAAAAAB//AAAAAAH+AAAH+AAAAAAf/wAAAAAH/AAAB/4AAAAAH/8AAAA + AH/wAAAP/AAAAAB//AAAAAD/4AAAD/8AAAAAf/wAAAAAf8AAAAf+AAAAAH/8AAAAAD/AAAAH/AAAAAB/ + /AAAAAAPwAAAA/AAAAAAf/wAAAAAA4AAAAHAAAAAAH/8AAAAAAAAAAABAAAAAAB//AAAAAAAAAAAAAAA + AAAAf/wAAAAAAAAAAAAAAAAAAH/8AAAAAAAAAAAAAAAAAAB//AAAAAAAAAAAAAAAAAAAf/wAAAAAAAAA + AAAAAAAAAH/8AAAAAAAAAAAAAAAAAAB//AAAAAAAAAAAAAAAAAAAf/wAAAMAAAAAAAAAAMAAAH/8AAAD + wAAAAAAAAAPAAAB//AAAA+AAAAAAAAAHwAAAf/wAAAP4AAAAAAAAH8AAAH/8AAAD/gAAAAAAAH/AAAB/ + /AAAA/+AAAAAAAH/wAAAf/wAAAP/AAAAAAAB/8AAAH/8AAAD/wAAAAAAAP/AAAB//AAAA/4AAAAAAAD/ + wAAAf/wAAAP+AAAAAAAAf8AAAH/8AAAD/AAAAAAAAH/AAAB//AAAA/gAAAAAAAA/wAAAf/wAAAP4AAAA + AAAAH8AAAH/8AAAD8AAAAAAAAB/AAAB//AAAA/AAAAAAAAAPwAAAf/wAAAPgAAAAAAAAD8AAAH/8AAAD + 4AAAAAAAAAfAAAB//AAAA8AAAAAAAAAHwAAAf/wAAAOAAAAAAAAAA8AAAH/8AAADgAAAAAAAAAHAAAB/ + /AAAAwAAAAAAAAABwAAAf/wAAAMAAAAAAAAAAMAAAH/8AAACAAAAAAAAAADAAAB//AAAAgAAAAAAAAAA + QAAAf/wAAAAAAAAAAAAAAEAAAH/8AAAAAAAAAAAAAAAAAAB//AAAAAAAAAAAAAAAAAAAf/wAAAAAAAAA + AAAAAAAAAH/8AAAAAAAAAAAAAAAAAAB//AAAAAAAAAAAAAAAAAAAf/wAAAAAAAAAAAAAAAAAAH/8AAAA + AAAAAAAAAAAAAAB//AAAAAAAAAAAAAAAAAAAf/wAAAAAf/8AAf/8AAAAAH/8AAAAAB//AAH/+AAAAAB/ + /AAAAAAP/wAB/+AAAAAAf/wAAAAAA/8AAf/AAAAAAH/8AAAAAAH/AAH/AAAAAAB//AAAAAAAfwAB/AAA + AAAAf/wAAAAAAB8AAfgAAAAAAH/8AAAAAAAHAAHgAAAAAAB//AAAAAAAAwABwAAAAAAAf/4AAAAAAAAA + AQAAAAAAAH//AAAAAAAAAAAAAAAAAAD//4AAAAAAAAAAAAAAAAAB///gAAAAAAAAAAAAAAAAB///8AAA + AAAAAAAAAAAAAB////wAAAAAAAAAAAAAAAB/////AAAAAAAAAAAAAAAA/////8AAAAAAAAAAAAAAA/// + ///gAAAAAAAAAAAAAA//////+AAAAAAAAAAAAAA///////4AAAAAAAAAAAAAf///////gAAAAAAAAAAA + Af///////8AAAAAAAAAAAAf////////wAAAAAAAAAAAf/////////AAAAAAAAAAAf/////////8AAAAA + AAAAAf//////////gAAAAAAAAAP//////////+AAAAAAAAAP///////////4AAAAAAAAH/////////// + /gAAAAAAAH////////////+AAAAAAAH/////////////4AAAAAAH//////////////AAAAAAH/////// + ///////8AAAAAH///////////////wAAAAD////////////////AAAAD////////////////4AAAD/// + //////////////gAAD/////////////////+AAB//////////////////4AB///////////////////A + B///////////////////8B//////////KAAAAEAAAACAAAAAAQAgAAAAAAAAQAAAEwsAABMLAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + 3pJ0AN6SdAzeknQi3pJ0Ht6SdAfeknQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAADeknQA3pJ0CN6SdCTeknRN3pJ0c96SdGzeknRE3pJ0HN6SdAQAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAADeknQE3pJ0HN6SdETeknRu4Ip6mfFQpdXtXpvI3pF1jt6SdGTeknQ6 + 3pJ0FN6SdAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN6SdALeknQV3pJ0Ot6SdGTekXWO7l6ayfwsvvj/I8X/ + /yPF//o1uPDpbo663pJ0g96SdFveknQx3pJ0Dt6SdAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3pJ0Ad6SdA7eknQx3pJ0W96SdITpbY66 + +jW28P8lwv//JcL//ybB/v8lwv//JcL//yXC//dArublfISr3pJ0e96SdFDeknQn3pJ0Cd6SdAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeknQA3pJ0Cd6SdCjeknRR + 3pJ0e+V8g6z3Qazn/ya///8mv///Jr//90Ct5+V6ha7qa4+8+jW18v8mv///Jr///ii+/fNNo9rhh3ue + 3pJ0cd6SdEjeknQf3pJ0BQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN6SdADeknQF + 3pJ0H96SdEjeknRy4Yd7nvNNotv+Kbv9/ye8//8nvP/6NrLx6m2Nu96SdIXeknRy3pJ0dN+QdZDuXpjL + /S+3+P8nvP//J7z//S64+e9bmc7fj3aS3pJ0Z96SdD3eknQX3pJ0AwAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAN6SdAPeknQX3pJ0P96SdGjfj3aT71uYzv0vtfr/KLn//yi5//0wtPjuX5bJ35B1kN6SdHLeknSB + 6HOItuSAgKjeknR53pJ0deGJepzyUZ/Y/iu3/f8ouf//KLn/+zaw8+tqjr/eknSH3pJ0X96SdDXeknQQ + 3pJ0AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAA3pJ0Ad6SdBDeknQ03pJ0X96SdInraY7A+zau9P8qtv//Krb//i21/fJSndfhinma + 3pJ0c96SdHTih3ug9Uuh3/8qtv/+LbT88FmY0d+PdpLeknRv3pJ0euR/gKj2RqTk/yq2//8qtv//Krb/ + +ECo6+Z4hLHeknR+3pJ0VN6SdCveknQL3pJ0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAADeknQA3pJ0C96SdCzeknRV3pJ0fuZ4hLL4QKbr/yuz//8rs///K7P/ + 9kii4+SAf6feknR63pJ0a96RdIvtYpHI/TKv+f8rs///K7P//yuz//8rs//6Oary6HKIuN6SdIDeknRq + 3pJ0g+hzh7b5Panu/yuz//8rs///LLP+9Eyf3+OEfaPeknR13pJ0S96SdCLeknQG3pJ0AAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN6SdADeknQH3pJ0It6SdEveknR144R8pPVMneD/LbD+ + /yyx//8ssf/5Pqbu6HSGtt6SdIHeknRn3pJ0fOZ6gq/5QKXs/yyw//8ssP/+L6/88VeX1fVKn+H/LLD/ + /yyw//8tsP/1TJ3g4oZ7oN6SdHLeknRq3pF0jOxlj8X8Nqv2/yyx//8ssf/+MK778ViW0+CNd5feknRr + 3pJ0Qd6SdBveknQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN6SdAPeknQb3pJ0Q96SdGvgjHeX + 8VmU0/4yq/v/La7//y2u//w3qPbsZ43E3pJ0i96SdGjeknRu4Ix3mPJUl9j+L63+/y2u//8trv/3RKHp + 5H9/qt6SdHfeknSB6XGHuvs6pvP/La7//y2u//00qvnuYo/J3pF0jN6SdGfeknRu4I13lvFZldP+Mqv7 + /y2u//8trv/8N6j27WaNxd6RdIzeknRi3pJ0ON6SdBPeknQBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3pJ0At6SdBPeknQ4 + 3pJ0Yt6RdIztZozG/Dil9v8vq///L6v//jOo+/Bak9LgjXeW3pJ0bN6SdGPeknSF62yJwPw4pfb/L6v/ + /y+r//w3pvfsaIvD3pJ0h96SdFveknQw3pJ0Ot6SdGbfjnaT8VqT0/4yqfz/L6v//y+r//lBoO3meoGw + 3pJ0e96SdGHeknR144R8o/ROmd//MKr+/y+r//8vq//5QKHu6HSEt96SdILeknRY3pJ0L96SdA3eknQA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeknQA + 3pJ0Dd6SdC/eknRZ3pJ0guh0hLf5QZ/v/zCo//8wqP//Maf+9FCX3uKFe6LeknR13pJ0Xd6SdHXjgnyn + 90ma5v8wqP//MKj//zGn/vNTltvhinia3pJ0a96SdD/eknQq3pJ0QN6SdDveknQp3pJ0S96SdHbkgH6p + 90ec6P8wqP//MKj//jKn/vNVlNngi3eZ3pJ0bd6SdF/eknR+5nqBsfhFner/MKj//zCo//8wp//2S5nk + 5IB9qd6SdHneknRP3pJ0Jd6SdAjeknQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAN6SdADeknQJ3pJ0Jt6SdE/eknR55IB9qfZMl+T/MqX//zGl//8xpf/4Rpvq5nqAsN6SdH3eknRc + 3pJ0Z9+PdZLwXo7Q/jWj/P8xpf//MaX/+UKd7ud5gbLeknR83pJ0UN6SdCPeknQS3pJ0Td+Sdo3eknSA + 3pJ0O96SdA/eknQu3pJ0W96SdIfsaojC/Dqh9/8xpf//MaX//Dug9utsh8HeknSG3pJ0YN6SdGLeknSI + 622HwPs9n/P/MaX//zGl//40o/3yV5LY4Yp4m96SdG/eknRG3pJ0Hd6SdAUAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAN6SdAHeknQb3pJ0Rt6SdHDhinic8leQ2P41of3/MqL//zKi//s/nPPqboa+ + 3pJ0h96SdGHeknRb3pJ0gOh1grf6QJvy/zKi//8yov/9OJ/67mKLy96RdY3eknRg3pJ0NN6SdA7eknQC + 3pJ0Ld6SdHfxobTU6ZuZut6SdGXeknQc3pJ0At6SdBbeknQ+3pJ0bOGLeJrzVZHa/zSh/v8yov//MqL/ + 90qW5+SBfKjeknR13pJ0WN6SdGnfj3WS72CMzf04n/n/MqL//zKi//05nvjuY4rL35B1kN6SdGbeknQ7 + 3pJ0Ed6SdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeknQP3pJ0VN+QdZDuY4nL/Tqc+f80n///NJ// + /Tqc+e9iis3fj3WS3pJ0Z96SdFTeknRw4oh5n/VSkeD/NJ///zSf//80n//1T5Li4oZ6ot6SdHHeknRE + 3pJ0Gt6SdAMAAAAA3pJ0Ed6SdFbjloWl/qza/PqpzvDfknaO3pJ0Rd6SdAgAAAAA3pJ0Bt6SdCTeknRP + 3pJ0fOZ6f7H5RJfu/zSf//80n//+N5388F6L0d+PdZLeknRm3pJ0Vd6SdHHhiHie81aQ2v42nv3/NJ// + /zSf//pBmfLqcYO83pJ0g96SdELeknQFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3pJ0F96SdGnwYIrQ + /zWc//81nP/+N5v981eO2uGJeJ3eknRw3pJ0U96SdGHekXSL7WeHyf07mfn/NZz//zWc//tBl/Ppc4K6 + 3pJ0gd6SdFbeknQp3pJ0CN6SdAAAAAAA3pJ0A96SdDfeknSA9aa74f+u2v//rtr/7p+kyd6SdG7eknQl + 3pJ0AAAAAADeknQA3pJ0Dt6SdDTeknRg3pF0je5kiMr9Opr6/zWc//81nP/6Qpby6HWAuN6SdIDeknRZ + 3pJ0V96SdHrlf3yr902S5v81nP//NZz//zWc/+d4f7LeknRT3pJ0CgAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAN6SdBfeknRp8V+J0f82mf/9PZb45IB7rd6SdHreknRU3pJ0VN6SdHrmfHyw+UiS7P82mf//Npn/ + /jmY/PFeidPfj3WT3pJ0Z96SdDneknQS3pJ0AQAAAAAAAAAAAAAAAN6SdBneknRh55qPtP+v1f7/r9X/ + /6/V//ytzfjglHua3pJ0Tt6SdA0AAAAAAAAAAAAAAADeknQD3pJ0Gt6SdETeknRw4oZ5ofVSjuH/N5n/ + /zaZ//83mf/1U43g4od4oN6SdHDeknRP3pJ0XN6SdITqcILA/zaZ//82mf/od3+z3pJ0U96SdAoAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAADeknQX3pJ0afFfh9H/N5b/+0OS896SdIjeknRP3pJ0auCMdpnyWonY + /jmV/f83lv//N5b/90yP6OSBe6reknR23pJ0St6SdB/eknQEAAAAAAAAAAAAAAAAAAAAAN6SdAbeknRA + 3pJ0ivmqv+3/sNH//7DR//+w0f//sNH/8qSr196SdHjeknQv3pJ0AQAAAAAAAAAAAAAAAN6SdADeknQI + 3pJ0KN6SdFXeknSC6XSAuftDkvP/N5b//zeW//09lPnuZ4TJ3pF0jN6SdGDeknRV4od4ov83lv//N5b/ + 6Hd+s96SdFPeknQKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3pJ0F96SdGnxYIXR/zmT//tEj/PeknSI + 3pJ0e+tvgMD8QZD2/zmT//85k//8QJH37G2Bw96SdIjeknRb3pJ0L96SdAveknQAAAAAAAAAAAAAAAAA + AAAAAN6SdADeknQi3pJ0auyfmcP/scz//7HM//+xzP//scz//7HM//6wyfzkl4Oo3pJ0V96SdBMAAAAA + AAAAAAAAAAAAAAAAAAAAAN6SdAHeknQS3pJ0Od6SdGXfj3WU8WCG0v48kvz/OZP//zmT//lJje3mfXuv + 3pJ0ceKHeKL/OZP//zmT/+h3fbPeknRT3pJ0CgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN6SdBfeknRp + 8WGE0f86kP/7RY3z3pJ0id6SdIz8Qo73/zqQ//86kP//OpD//j6P+/FghNPgjXaX3pJ0bN6SdEPeknQb + 3pJ0BAAAAAAAAAAAAAAAAAAAAADeknQL3pJ0St+TeJb8r771/7LH//2xw/v/ssf//7LH//2xw/v/ssf/ + 9qmv496SdIHeknQ43pJ0BAAAAAAAAAAAAAAAAAAAAADeknQE3pJ0G96SdEPeknRt4Ix2mfFfhNX+PY/8 + /zqQ//86kP//OpD/9VOI4t6SdHzih3ii/zqQ//86kP/oeHyz3pJ0U96SdAoAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAADeknQX3pJ0afFhgtH/O43/+0eK896SdIneknSM/EOL9/87jf/2Uofm+0SL9f87jf//O43/ + /EOL9u1rf8bekXSN3pJ0Y96SdDreknQU3pJ0AgAAAADeknQB3pJ0Kt6SdHTwpJ/R/7PD//+zwv7wpJ/X + /7PD//+zw//wpJ7W/7PD//+zwv7onIu23pJ0Yt6SdBveknQAAAAAAN6SdALeknQT3pJ0ON6SdGPekXSN + 7Wt/x/xDi/f/O43//zuN//tGi/P7R4ry/zuN//VUhuLeknR84od3ov87jf//O43/6Hh8s96SdFPeknQK + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3pJ0F96SdGnxYoHR/z2K//tIiPPeknSJ3pJ0jPxEiPf/PYr/ + 72aAzN+OdZjwY4HQ/UGJ+v89iv//PYr/+kuH8Ol2e7neknSE3pJ0Wt6SdDLeknQN3pJ0EN6SdFTiln2i + /bO7+/+0vv/1qqjg6p6Pv/+0vv//tL7/4JR5rPuwtvT/tL7/+a6x7t6SdYzeknRB3pJ0B96SdAzeknQu + 3pJ0WN6SdILoeHu3+UuG7/89iv//PYr//UGJ+u9lgM7fj3Wb9lOE5f89iv/1VYTi3pJ0fOKHd6L/PYr/ + /z2K/+h5e7PeknRT3pJ0CgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN6SdBfeknRp8WN/0f8+iP/7SYXz + 3pJ0id6SdIz8RYb3/z6H/+9nfszeknRr3pJ0c+KIdqD0W4Hc/j+H/v8+h///Pof/91OC5uWBeKzeknR7 + 3pJ0SN6SdDbeknR+9Kqj3v+1uv/+tLf845d/puqfjrv/tbr//7W6/9+Tdp3roJDA/7W6//+1uv/soZLF + 3pJ0a96SdCTeknQ63pJ0d+SDd6j2VYLk/z6H//8+h//+P4f+9FuB3OKJdp/eknRy3pJ0fPZUguX/Pof/ + 9VaC4t6SdHzih3ai/z6I//8+iP/oeXqz3pJ0U96SdAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeknQX + 3pJ0afFkfdH/P4X/+0qC896SdIneknSM/EeD9/8/hf/vZ33M3pJ0ZN6SdDDeknRT3pJ0e+WAeK33U4Hn + /z+F//8/hf/+QYT963J6w96SdGreknRf5puDsP+2tP7/trX/8aea1N6SdH7qn4y7/7a1//+2tf/fk3aZ + 3pJ0ifivqOv/trX//LOu9uCUeJfeknRM3pJ0Sd+OdZv8RoP4/z+F//8/hf/3UoHo5X94rt6SdHzeknRS + 3pJ0ON6SdHr2VYDl/z+F//VXgOLeknR84oh2ov8/hf//P4X/6Hl5s96SdFPeknQKAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAA3pJ0F96SdGnxZHzR/0CC//tLgPPeknSJ3pJ0jPxIgPf/QIL/72h7zN6SdGTeknQU + 3pJ0D96SdDLeknRb3pJ0hOl3ebr6TYDw/UaB+eGLdZzeknRc3pJ0h/ivo+r/t7D//LSr9uCUeJjeknRn + 6qCKu/+3sP//t7D/35N2md6SdGfmm4Sx/7ew/v+3sP/xp5bT3pJ0dt6SdEDeknRz8GZ80PtLgPLqdHm9 + 3pJ0ht6SdFzeknQy3pJ0D96SdCXeknR69lZ+5f9Agv/1WH7i3pJ0fOKIdqL/QIL//0CC/+h6eLPeknRT + 3pJ0CgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN6SdBfeknRp8WV60f9Cf//7TH3z3pJ0id6SdIz8SX73 + /0J//+9peczeknRk3pJ0FAAAAADeknQC3pJ0FN6SdDreknRk3pF0jeWCdq/eknRv3pJ0aeuhib//uKz/ + /7is/+2jjcbeknRs3pJ0W+qgiLv/uKz//7is/9+TdpneknRR3pJ0fvSsmt//uKz//rep++OYfKPeknRW + 3pJ0TN+QdI7fkHSR3pJ0Zt6SdDzeknQW3pJ0AgAAAADeknQl3pJ0evZXfOX/Qn//9Vl84t6SdHziiHWi + /0J///9Cf//oenez3pJ0U96SdAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeknQX3pJ0afFmeNH/Q3z/ + +017896SdIneknSM/Ep79/9DfP/vaXjM3pJ0ZN6SdBQAAAAAAAAAAAAAAADeknQE3pJ0G96SdEPeknRZ + 3pJ0Vt+TdZL7taHz/7qn//mzn+/eknSM3pJ0RN6SdFjqoYe7/7qn//+6p//fk3aZ3pJ0Rd6SdFXjl3uj + /ril+/+6p//1rZfg3pJ0f96SdD7eknRF3pJ0Q96SdB7eknQFAAAAAAAAAAAAAAAA3pJ0Jd6SdHr2WHrl + /0N8//VaeuLeknR84oh1ov9DfP//Q3z/6Hp2s96SdFPeknQKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + 3pJ0F96SdGnxZnfR/0R5//tOePPeknSJ3pJ0jPxLePf/RHn/72p2zN6SdGTeknQUAAAAAAAAAAAAAAAA + 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 + /8KC///Cgv/9v4H5/8KC///Cgv//wYL+87F+2+GWdZzeknRt3pJ0Qt6SdB7eknQK3pJ0Dd6SdCfeknRN + 3pJ0eeWcd6v3t3/o/8KC///Cgv//woL+/cCB+v/Cgv/+wYL95Z13rt6SdF3eknQW3pJ0AAAAAADeknQl + 3pJ0evZfaeX/TWT/9WFp4t6SdHziiXKi/01k//9NZP/ofW+z3pJ0U96SdAoAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAADeknQX3pJ0afFsatH/TmH/+1dk896SdIneknSM/FRj9/9OYf/vb2rM3pJ0ZN6SdBQAAAAA + 3pJ0Dd6SdE/hlnWb/L99+P/Dfv//w37//8N+///Dfv/5unzs5p53sN6SdIDeknRj3pJ0Ut6SdE3eknRN + 3pJ0Td6SdE3eknRN3pJ0Tt6SdFbeknRp3pJ0ieuleMH8vn31/8N+///Dfv//w37//8N+//e4e+jeknSG + 3pJ0PN6SdAUAAAAA3pJ0Jd6SdHr2YGbl/05h//ViZ+LeknR84olyov9OYf//TmH/6H5us96SdFPeknQK + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3pJ0F96SdGnxbWjR/09f//tYYfPeknSJ3pJ0jPxVYff/T1// + 73BpzN6SdGTeknQU3pJ0Ad6SdC/eknR58rF31//Eef//xHn//8R5//7Def3xr3fa5Zx1teWddavlnXWr + 5Z11q+WddavlnXWr5Z11q+WddavlnXWr5Z11q+WddavlnXWr5Z11q+WddavlnXWt5p51u/W1eOb/xHn/ + /8R5///Eef//xHn/6qR2vN6SdGbeknQe3pJ0AN6SdCXeknR69mFk5f9PX//1Y2Xi3pJ0fOKKcaL/T1// + /09f/+h+brPeknRT3pJ0CgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN6SdBfeknRp8W1m0f9RXP/7WV/z + 3pJ0id6SdIz8V173/1Fc/+9wZ8zeknRk3pJ0FN6SdBPeknRY5Jt0qP7Edf3/xXX//8V1///Fdf//xXX/ + /8V1///Fdf//xXX//8V1///Fdf//xXX//8V1///Fdf//xXX//8V1///Fdf//xXX//8V1///Fdf//xXX/ + /8V1///Fdf//xXX//8V1///Fdf//xXX//8V1//q+dPLfk3SR3pJ0R96SdAjeknQl3pJ0evZiYuX/UVz/ + 9WRj4t6SdHziinGi/1Fc//9RXP/of22z3pJ0U96SdAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeknQX + 3pJ0afFuZdH/Uln/+1pc896SdIneknSM/Fhb9/9SWf/vcWbM3pJ0ZN6SdBjeknQ03pJ0gfa4ceT/xnD/ + /8Zw///GcP//xnD//8Zw///GcP//xnD//8Zw///GcP//xnD//8Zw///GcP//xnD//8Zw///GcP//xnD/ + /8Zw///GcP//xnD//8Zw///GcP//xnD//8Zw///GcP//xnD//8Zw///GcP//xnD/7qxyy96SdG/eknQi + 3pJ0KN6SdHr2Y2Dl/1JZ//VlYeLeknR84opxov9SWf//Uln/6H9ss96SdFPeknQKAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAA3pJ0F96SdGnxb2PR/1NW//tbWvPeknSJ3pJ0jPxZWPf/U1b/8HBj0d6SdH7eknRP + 3pJ0Qt6SdIPlnXOq5Z1zq+Wdc6vlnXOr5Z1zq+Wdc6vlnXOr5Z1zq+Wdc6vlnXOr5Z1zq+Wdc6vlnXOr + 5Z1zq+Wdc6vlnXOr5Z1zq+Wdc6vlnXOr5Z1zq+Wdc6vlnXOr5Z1zq+Wdc6vlnXOr5Z1zq+Wdc6vlnXOr + 5Z1zq+Oac6beknRy3pJ0Pd6SdFreknSL92Jd6P9TVv/1ZV7i3pJ0fOKKcKL/U1b//1NW/+h/a7PeknRT + 3pJ0CgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN6SdBfeknRp8XBh0f9VU//7XVfz3pJ0id6SdIz8Wlb3 + /1VT//9VU/7za1/a4Y1xmt6SdGveknRT3pJ0T96SdE3eknRN3pJ0Td6SdE3eknRN3pJ0Td6SdE3eknRN + 3pJ0Td6SdE3eknRN3pJ0V96SdHPeknR53pJ0ed6SdG3eknRS3pJ0Td6SdE3eknRN3pJ0Td6SdE3eknRN + 3pJ0Td6SdE3eknRN3pJ0Td6SdE3eknRQ3pJ0Vd6SdHbkh26q92Na5/9VU///VVP/9WZc4t6SdHziinCi + /1VT//9VU//ogGqz3pJ0U96SdAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeknQX3pJ0afFwYNH/VlD/ + +15V896SdIjeknR763pmwPxbU/b/VlD//1ZQ//xbU/fseWXD3pJ0h96SdFveknQw3pJ0Et6SdAfeknQH + 3pJ0B96SdAfeknQH3pJ0B96SdAfeknQH3pJ0EN6SdFflhWyv9Gpc3fRqXN3fkXOV3pJ0Qt6SdAneknQH + 3pJ0B96SdAfeknQH3pJ0B96SdAfeknQH3pJ0CN6SdBjeknQ63pJ0Zd+Qc5TxcF/S/lhR/P9WUP//VlD/ + +WFX7eaDbK/eknRx4opvov9WUP//VlD/6IBps96SdFPeknQKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + 3pJ0F96SdGnxcV7R/1dN//tfUvPeknSI3pJ0T96SdGrgjnKZ8m1c2P5YTv7/V03//1dN//dlVujkh2yq + 3pJ0dt6SdEreknQf3pJ0BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN6SdAzeknRY6nxmu/9XTf//V03/ + 35Bzmd6SdEPeknQEAAAAAAAAAAAAAAAAAAAAAAAAAADeknQA3pJ0CN6SdCjeknRV3pJ0gul/Z7n7X1Lz + /1dN//9XTf/9W1D57nZiyd6RdIzeknRg3pJ0VeKLb6L/V03//1dN/+iAaLPeknRT3pJ0CgAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAN6SdBfeknRp8XJc0f9YSv/9XU345Idsrd6SdHreknRU3pJ0VN6SdHrmhGqw + +WNS7P9YSv//WEr//lpL/PFxXNPfkHKT3pJ0Z96SdDneknQS3pJ0AQAAAAAAAAAAAAAAAAAAAADeknQM + 3pJ0WOp9Zbv/WEr//1hK/9+Qc5neknRD3pJ0BAAAAAAAAAAAAAAAAAAAAADeknQD3pJ0Gt6SdETeknRw + 4otvofVqVuH/WUr//1hK//9ZSv/1alfg4otvoN6SdHDeknRP3pJ0XN6SdITqfWTA/1hK//9YSv/ogWez + 3pJ0U96SdAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeknQX3pJ0afBzXND/Wkf//1pH//5bSP3zb1fa + 4Y1wnd6SdHDeknRT3pJ0Yd6SdIvtd1/J/V1K+f9aR///Wkf/+2FN8+l/ZbreknSC3pJ0Vt6SdCneknQJ + 3pJ0AAAAAAAAAAAA3pJ0DN6SdFjqfWO7/1pH//9aR//fkHOZ3pJ0Q96SdAQAAAAAAAAAAN6SdADeknQO + 3pJ0NN6SdGDekXON7ndeyv1dSvr/Wkf//1pH//phTfLogGa43pJ0gN6SdFneknRX3pJ0euWHa6v3aFLm + /1pH//9aR///Wkf/54Jost6SdFPeknQKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3pJ0D96SdFTfkXOQ + 7nZdy/1fSPn/W0T//1tE//1eR/nvdlvN35Fzkt6SdGfeknRU3pJ0cOKMb5/1bFTg/1tE//9bRP//W0T/ + 9WtS4uKLbqLeknRx3pJ0Rd6SdBreknQDAAAAAN6SdAzeknRY6n5iu/9bRP//W0T/35Bymd6SdEPeknQE + AAAAAN6SdAbeknQk3pJ0T96SdHzmhGix+WVM7v9bRP//W0T//l1G/PBzWtHfkHOS3pJ0Zt6SdFXeknRx + 4YxvnvNvVdr+XEX9/1tE//9bRP/6Ykvy6n5jvN6SdIPeknRC3pJ0BQAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAN6SdAHeknQb3pJ0Rt6SdHDhjXCc8nFV2P5eQ/3/XEH//1xB//tjSPPqfmG+3pJ0h96SdGHeknRb + 3pJ0gOiBZLf6ZEjy/1xB//9cQf/9X0T67ndazN6Rc43eknRg3pJ0NN6SdA7eknQN3pJ0WOp+Ybv/XEH/ + /1xB/9+QcpneknRD3pJ0Bd6SdBbeknQ+3pJ0bOGOcJrzcFPa/11C/v9cQf//XEH/92lO5+SJa6jeknR1 + 3pJ0WN6SdGnfkHKS73ZZzf1fRPn/XEH//1xB//1gRfjud1zL35FzkN6SdGbeknQ73pJ0Ed6SdAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3pJ0AN6SdAneknQm3pJ0T96SdHnkiGqp9mxN5P9ePv//XT7/ + /10+//hpSurmhWew3pJ0fd6SdFzeknRn35FzkvB1V9D+X0D8/10+//9dPv/5Z0fu54Vmst6SdHzeknRQ + 3pJ0Kd6SdFjqf2C7/10+//9dPv/fkHKZ3pJ0RN6SdC/eknRb3pJ0h+x9XsL8YkP3/10+//9dPv/8YkT2 + 631fwd6SdIbeknRg3pJ0Yt6SdIjrfl/A+2RF8/9dPv//XT7//l9A/fJyVNjhjnCb3pJ0b96SdEbeknQd + 3pJ0BQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3pJ0AN6SdA3eknQv + 3pJ0Wd6SdILogmO3+WdF7/9fO///Xzv//188/vRvTd7ii22i3pJ0dd6SdF7eknR144lrp/drSub/Xzv/ + /187//9fPP7zcU/b4Y5vmt6SdGzeknRg6n9fu/9fO///Xzv/35Bymd6SdFneknR25IlpqfdrSOj/Xzv/ + /187//5fPP7zclHZ4I5wmd6SdG3eknRf3pJ0fuaFZrH4akfq/187//9fO///Xzz/9m1L5OSJaqneknR5 + 3pJ0T96SdCXeknQI3pJ0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAA3pJ0At6SdBPeknQ43pJ0Yt6SdIztfFrG/GQ+9v9gOP//YDj//mI7+/B2UtLgkHGW + 3pJ0bN6SdGPeknSF635dwPxlPvb/YDj//2A4//xkPffsfVvD3pJ0iuqAXrv/YDj//2A4/9+QcpzfkHKT + 8XZS0/5iOvz/YDj//2A4//lpRO3mhmaw3pJ0e96SdGHeknR144tso/RwS9//YDn+/2A4//9gOP/5aUPu + 6INit96SdILeknRY3pJ0L96SdA3eknQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3pJ0A96SdBveknRD3pJ0a+CPcZfxdlHT + /mM4+/9hNv//YTb//GY89ux9WcTeknSL3pJ0aN6SdG7gj3CY8nRO2P5iN/7/YTb//2E2//dsROnuelXP + /2E2//9hNv/pgl/E+2c98/9hNv//YTb//WQ6+e57V8neknSM3pJ0Z96SdG7gj3GW8XdQ0/5jOPv/YTb/ + /2E2//xmPPbtfVnF3pJ0jN6SdGLeknQ43pJ0E96SdAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeknQA + 3pJ0B96SdCLeknRL3pJ0deOLa6T1cUfg/2Mz/v9iM///YjP/+Ws+7uiEYLbeknSB3pJ0Z96SdHzmh2Wv + +Ws/7P9iM///YjP//2Mz//9iM///YjP//2Mz//9iM///YzP/9XFH4OKMbaDeknRz3pJ0at6SdIzsfVfF + /Gc59v9iM///YjP//mQ1+/F3T9Pgj3GX3pJ0a96SdEHeknQb3pJ0BAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAADeknQA3pJ0C96SdCzeknRV3pJ0fuaGY7L4bT7r/2Qw//9kMP//ZDD/ + 9nFD4+SKaKfeknR63pJ0a96SdIvtfFXI/Wc0+f9kMP//ZDD//2Qw//9kMP/6ajny6INfuN6SdIHeknRq + 3pJ0g+iEX7b5bDvu/2Qw//9kMP//ZDH+9HJG3+OMa6PeknR13pJ0S96SdCLeknQG3pJ0AAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeknQB3pJ0EN6SdDTeknRf + 3pJ0ieuAWcD7ajX0/2Ut//9lLf/+Zi/98ndI1+GPbpreknRz3pJ0dOKNbKD1c0Tf/2Ut//5mL/zweU3R + 35Fykt6SdG/eknR65IpnqPZxQOT/ZS3//2Ut//9lLf/4bjzr5odisd6SdH7eknRU3pJ0K96SdAveknQA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAADeknQD3pJ0F96SdD/eknRo35Fyk+97Ts79aS76/2Yq//9mKv/9ai/47n1Qyd+Rc5DeknRy + 3pJ0geiFXrbkimeo3pJ0et6SdHXhjm6c8nhG2P5oLP3/Zir//2Yq//tsM/PrgVi/3pJ0h96SdF/eknQ1 + 3pJ0EN6SdAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN6SdADeknQF3pJ0H96SdEjeknRy4Y5snvN2Q9v+aCj9 + /2cn//9nJ//6bjLx6oNZu96SdIXeknRy3pJ0dN+Rc5DufU7L/Wss+P9nJ///Zyf//Wos+e98Tc7fkXKS + 3pJ0Z96SdD3eknQX3pJ0AwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN6SdADeknQJ + 3pJ0KN6SdFHeknR75YlkrPdzOOf/aST//2kk//9pJP/3czfn5YliruqEV7z6by/y/2kk//9pJP/+aib9 + 83hB2uGObJ7eknRx3pJ0SN6SdB/eknQFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAN6SdAHeknQO3pJ0Md6SdFveknSE6YRYuvpwLvD/aiH//2oh//9qIv7/aiH/ + /2oh//9qIf/3dDbm5Ypjq96SdHveknRQ3pJ0J96SdAneknQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN6SdALeknQV3pJ0Ot6SdGTeknOO + 7oBMyfxuJfj/ax7//2se//pxLPDphVi63pJ0g96SdFveknQx3pJ0Dt6SdAEAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAN6SdATeknQc3pJ0RN6SdG7gj26Z8XxA1e2AS8jeknOO3pJ0ZN6SdDreknQU3pJ0AgAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3pJ0AN6SdAjeknQk3pJ0Td6SdHPeknRs3pJ0RN6SdBzeknQE + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3pJ0AN6SdAzeknQi + 3pJ0Ht6SdAfeknQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAD////4H////////+AP////////wAP///////8AAP///////AAAP//////wAAAf/////8AA + AAf/////gAAAAf////4AAAAAf///+AAAAAAf///gAAAAAA///8AAAAAAA///AAAAAAAA//wAAAAAAAA/ + 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 + AAAAAAAAAAAAAAAAAAAAAAAAAADeknQC3pJ0Gd6SdEngjXeD71yUyP0zrvj/LLL/+zir8uxnj7rekXV7 + 3pJ0d+puibL7Oarx/yyy//w0rfb9MK/6/yyy//hApenmeYOk3pJ0c9+Od4PvXZXH/TOu+P8ssv/7OKvz + 7GaOvN+QdXjeknQ/3pJ0E96SdAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3pJ0Ad6SdBDeknQ93pJ0c+trirf7Oqbx/y2u//0zq/rwXJTK + 4Ix4ht6SdG3jhHyW9Uud3/8urf7+L63+81Ca2OGHeo7kf3+b9kef4/8trv/+MKz88lSX0+CLeIreknRs + 4oZ7kfNSmdX+MK39/y6u//lBourodYSq3pJ0at6SdDPeknQL3pJ0AAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN6SdADeknQL3pJ0Md6SdGjnd4Ko+ESe6P8vqv/+Man9 + 9FGY2OKGe5PeknRp3492fu9gj8b9NKf6/y+q//lAoeznd4Oo3pJ0Zd6SdDPeknQ73pJ0b+tsibf7OqTz + /y+q//w5pPXra4m43pF0dt6SdGzlfn+f9kic4v8wqv7/MKr+9Uya3+SAfpveknRe3pJ0Kd6SdAfeknQA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeknQA3pJ0Bt6SdCbeknRb44J8mPVPltv+MqX9 + /zGm/vdIm+XmeoCj3pJ0a96SdG3ndoKp+UKd7P8xpv/9NqP572COxd+PdnzeknRA3pJ0J96SdGDeknRW + 3pJ0JN6SdErhiniJ8laT0v4zpfz/Mab+90qZ4+SAfZzeknRo3pJ0culxhbD5QZ7t/zGm//41pPvyWJHR + 4Yl4i96SdFHeknQe3pJ0BN6SdAAAAAAAAAAAAAAAAAAAAAAAAAAAAN6SdADeknQb3pJ0TuCNd4bxW47O + /Teg+v8yov/6QJzw6m+FtN6RdHTeknRh4Yl4jPNVkdf+NKH9/zOi//ZNluDjg3uW3pJ0V96SdB/eknQI + 3pJ0S+ucn7jlmIyh3pJ0Od6SdAfeknQp3pJ0YeZ7gKT4RZnq/zKi//03oPvwXo3K3491gd6SdF/fj3V9 + 7WWKwfw7nvb/MqL//Due9u5kisLekXV83pJ0RN6SdBPeknQAAAAAAAAAAAAAAAAAAAAAAN6SdA3eknRl + 7GmGvvw9mvX/NJ7//Dyb9u5jisTfkHV+3pJ0W96RdXbsaYa9/Dya9v80nv/7QJnx6nGDst6SdGzeknQx + 3pJ0Cd6SdADeknQj4JR6hPuq0PL3psPk3pJ1cd6SdBbeknQA3pJ0Dt6SdDvekXR47WaIwPw7m/f/NJ7/ + +kKY8Ol0ga/eknRt3pJ0XuCMd4nxWo7Q/Tid+v80nv/6Q5jv6XSBr96SdFPeknQFAAAAAAAAAAAAAAAA + AAAAAN6SdBHeknR3+0CW9P43mv3yWYzT4Yl4jd6SdF3eknRk5X58oPdLkeX/Npr//jmZ+/Fci8/gjXaE + 3pJ0SN6SdBXeknQBAAAAAN6SdAneknRY8KGqyv+u2P//rtf+6pyXs96SdEbeknQEAAAAAN6SdAPeknQc + 3pJ0UuKHeZD0U4/a/jea/v83mv70U47b4oZ5kt6SdF7eknRi5IJ7mfVRkN7/Npv/9k6R496SdGLeknQH + AAAAAAAAAAAAAAAAAAAAAN6SdBHeknR3+0KT9PxAk/beknR/3pJ0Vt+OdYTxXYjP/juV+/83l//3TI/m + 5X58oN6SdF7eknQl3pJ0Bd6SdAAAAAAA3pJ0Ad6SdC3iloCU/a7L+f+w0f//sNH/+qvD79+Td37eknQf + 3pJ0AAAAAADeknQA3pJ0CN6SdC7eknRp6HV/rvpFku//N5f//T6U+O5nhMLekXR43pJ0VeGJeJX/N5f/ + 9k+O496SdGLeknQHAAAAAAAAAAAAAAAAAAAAAN6SdBHeknR3+0OP9PxBkPbeknSB53p8qPtEj/L/OZP/ + /zqS/u1og8jeknR+3pJ0RN6SdBDeknQAAAAAAAAAAADeknQA3pJ0EN6SdGT0p63Z/7HL//+xy///scv/ + /7HL/+6hnsTeknRS3pJ0CAAAAAAAAAAAAAAAAN6SdAHeknQW3pJ0TN+QdYfxXobU/zmT//85k//5Sozq + 44V4leGJd5P/OZP/9lCL496SdGLeknQHAAAAAAAAAAAAAAAAAAAAAN6SdBHeknR3+0WM9PxDjPbeknSD + 72SCxv87j//9QI35/zuP//xDjPbuaIDB3491fd6SdEXeknQW3pJ0AgAAAADeknQC3pJ0O+aah6P+ssP9 + +6678/6yw/z7r7z1/bHB+vywvvfhlXuM3pJ0Kt6SdAAAAAAA3pJ0Ad6SdBXeknRF3491fe5ogMP8Qoz3 + /zuP//4+jvz/O4//6XV9rOGJd5T/O4//9lGI496SdGLeknQHAAAAAAAAAAAAAAAAAAAAAN6SdBHeknR3 + +0aI9PxFifbeknSD72WAxv88i//sbX7B7miAxPxDiff/PYv/+kqH7up0fLLeknRw3pJ0Ot6SdA7eknQX + 3pJ0cfesreX/tL//65+SxP6zvPv5rrLt8aWf0v+0v//yp6HT3pJ0YN6SdA3eknQN3pJ0N96SdG7pdXux + +kqH7v88i//8RIn27Wp/wvJegtX/PIv/6XZ8rOGJdpT/PIv/9lOF496SdGLeknQHAAAAAAAAAAAAAAAA + AAAAAN6SdBHeknR3+0iF9PxGhfbeknSD72Z+xv8+h//sbny43pJ0YOCMdovyX4DR/kKG+/8+h//3UoLl + 5n54pN6SdFreknRK66COtf+1uP/4rqrn35N2mf60tvv5r63t4JR4mfyysvT+tLb85ZmBnd6SdDfeknRL + 5YF4n/ZUguP/Pof//kGG+/JfgNHgjHaK3pJ0aPJff9H/Pof/6XZ6rOGJdpT/Pof/9lSC496SdGLeknQH + AAAAAAAAAAAAAAAAAAAAAN6SdBHeknR3+0mB9PxIgvbeknSD72d8xv9Ag//sb3q43pJ0Pd6SdCneknRe + 5IN3mvVYf93/QYP+9lV/496SdHDflHeA+rKp8P+2sv7mm4Wm35N1iP61sPv5sKjt3pJ0fe2ikb7/t7P/ + 9q2h4N6SdG3eknRP7HB7uv9Bg/72V3/f5IJ3nN6SdF7eknQp3pJ0UPJgfdH/QIP/6Xd5rOGJdpT/QIP/ + 9lV/496SdGLeknQHAAAAAAAAAAAAAAAAAAAAAN6SdBHeknR3+0t+9PxJfvbeknSD72h6xv9Bf//scHm4 + 3pJ0Ot6SdAHeknQM3pJ0M96SdGroe3iq5YJ3nt6SdGTvpZDF/7is//Ssm9zeknRp35N1hP63qvv5sqPt + 3pJ0cN6SdXn5saPt/7is/uiehq7eknRM3pF0deZ+d6jeknRs3pJ0Nd6SdAzeknQD3pJ0T/Jhe9H/QX// + 6Xd4rOGKdZT/QX//9lZ8496SdGLeknQHAAAAAAAAAAAAAAAAAAAAAN6SdBHeknR3+0x69PxLe/beknSD + 72h4xv9De//scHe43pJ0Ot6SdAAAAAAA3pJ0Ad6SdBHeknQ83pJ0UeGWeY/9t6P4/bek+uOYfJbeknQ+ + 35N1hP64pPv5s57t3pJ0bt6SdEbonoSu/7mm/vmzne3ek3V63pJ0Od6SdDjeknQT3pJ0AQAAAADeknQD + 3pJ0T/JieNH/Q3v/6Xh2rOGKdZT/Q3v/9lh5496SdGLeknQHAAAAAAAAAAAAAAAAAAAAAN6SdBHeknR3 + +0539PxMd/beknSD72l2xv9Fd//scXW43pJ0Ot6SdAAAAAAAAAAAAAAAAADeknQO3pJ0YfOskNT/u6D/ + 8amNzN6SdFreknQn35N1hP65nvv5tJnt3pJ0bt6SdCTeknRs9rCU4P+7oP/tpYi/3pJ0T96SdAcAAAAA + AAAAAAAAAADeknQD3pJ0T/JjdtH/RXf/6Xl1rOGKdJT/RXf/9ll3496SdGLeknQHAAAAAAAAAAAAAAAA + AAAAAN6SdBHeknR3+0909PxOdPbeknSD72p0xv9GdP/scnS43pJ0Ot6SdAAAAAAAAAAAAN6SdAHeknQ4 + 5Zt8n/67mfz7uJb04JV3h96SdELeknRm551+rP68mf38uJb05Jl6m96SdFreknRG5Jp8nf67mfz8uJb0 + 4JV3iN6SdCfeknQAAAAAAAAAAADeknQD3pJ0T/JkdNH/RnT/6Xl0rOGKdJT/RnT/9lp0496SdGLeknQH + AAAAAAAAAAAAAAAAAAAAAN6SdBHeknR3+1Fw9PxPcPbeknSD72tyxv9Ib//sc3K43pJ0Ot6SdAAAAAAA + 3pJ0AN6SdBTeknRv9rOL4v++lP/spYK73pJ0a+KXd5D0r4jZ/r2T/v++lP7/vpT//ryS+/Crhc3glHWD + 3pJ0cPKtiNL/vpT/8ayGz96SdF3eknQLAAAAAAAAAADeknQD3pJ0T/JlcdH/SG//6XpzrOGKdJT/SHD/ + 9ltx496SdGLeknQHAAAAAAAAAAAAAAAAAAAAAN6SdBHeknR3+1Jt9PxRbPbeknSD72xwxv9KbP/sc3C4 + 3pJ0Ot6SdAAAAAAA3pJ0BN6SdEPponyx/7+O/vm3ievfk3WU7qh/wvy8jPf/v47/+7mL8eqjfrTtp4HB + /LyM9/+/jv/7uYrx6qN9tOGWdpv8vIz3/b2N++SaeJneknQy3pJ0AQAAAADeknQD3pJ0T/Jmb9H/Smz/ + 6XpxrOGLc5T/Smz/9l1u496SdGLeknQHAAAAAAAAAAAAAAAAAAAAAN6SdBHeknR3+1Rp9PxSafbeknSD + 721uxv9MaP/sdG+43pJ0Ot6SdADeknQA3pJ0Ht6SdHv6uYTu/8CI/u6ofc35uITr/8GI//6/h/vwrIDL + 4JV1g96SdEjeknRT4pd3kPOwgtj/wIj+/8CI/va0guLxrH/W/8GI//Wygd3eknRo3pJ0EgAAAADeknQD + 3pJ0T/JnbdH/TGj/6XtwrOGLc5T/S2j/9l5r496SdGLeknQHAAAAAAAAAAAAAAAAAAAAAN6SdBHeknR3 + +1Vm9PxUZfbeknSD725sxv9NZP/sdW243pJ0Ot6SdADeknQH3pJ0Ue6pesH/woL//sGB/f/Cgf7/woH+ + 9rV/4OOad5neknRc3pJ0MN6SdBbeknQZ3pJ0ON6SdGbnn3in+Ll/6v/Cgf/+wYH8/8KB/v/Cgf7noHep + 3pJ0P96SdAPeknQD3pJ0T/JoatH/TWT/6XtvrOGLcpT/TWT/9l9o496SdGLeknQHAAAAAAAAAAAAAAAA + AAAAAN6SdBHeknR3+1di9PxVYvbeknSD729pxv9PYP/sdWu43pJ0Ot6SdAHeknQp4ZZ0i/y/evX/xHv/ + /8R7//q9e/Hpo3e83pJ0j96SdH3eknR43pJ0eN6SdHjeknR43pJ0eN6SdHjeknR/35N0le2oeMf8v3v3 + /8R7///Ee//4unrp35N0dt6SdBreknQD3pJ0T/JpaNH/T2D/6XxtrOGLcpT/T2D/9mBl496SdGLeknQH + AAAAAAAAAAAAAAAAAAAAAN6SdBHeknR3+1hf9PxXXvbeknSD729nxv9RXP/sdmq43pJ0Ot6SdAveknRe + 8rB10P/Fdf//xXX//8V1//zBdff8wHX0/MB19PzAdfT8wHX0/MB19PzAdfT8wHX0/MB19PzAdfT8wHX0 + /MB19PzAdfT9wnX5/8V1///Fdf//xXX/7Kd0ut6SdEzeknQI3pJ0T/JqZtH/UVz/6XxsrOGLcpT/UVz/ + 9mJi496SdGLeknQHAAAAAAAAAAAAAAAAAAAAAN6SdBHeknR3+1pb9PxYW/beknSD73Blxv9SWP/sd2i5 + 3pJ0Qd6SdC7imHOV+r9w8fzBcPT8wXD0/MFw9PzBcPT8wXD0/MFw9PzBcPT8wXD0/MFw9PzBcPT8wXD0 + /MFw9PzBcPT8wXD0/MFw9PzBcPT8wXD0/MFw9PzBcPT8wXD097pw6N+TdIDeknQj3pJ0U/JrY9H/Ulj/ + 6X1rrOGLcZT/Ulj/9mNf496SdGLeknQHAAAAAAAAAAAAAAAAAAAAAN6SdBHeknR3+1tY9PxaV/beknSD + 73Fjxv9UVP/1Zl3d4Yxxjd6SdFfeknRr3pJ0eN6SdHjeknR43pJ0eN6SdHjeknR43pJ0eN6SdHjeknR4 + 3pJ0fd6SdIPeknSC3pJ0e96SdHjeknR43pJ0eN6SdHjeknR43pJ0eN6SdHjeknR43pJ0eN6SdGTeknRd + 5IdumvlgWur/VFT/6X5qrOGMcZT/VFT/9mRc496SdGLeknQHAAAAAAAAAAAAAAAAAAAAAN6SdBHeknR3 + +11V9PxbVPbeknSB54JrqPtdVfL/VlD//FtU9ex4ZLzeknR03pJ0Qd6SdB7eknQS3pJ0Et6SdBLeknQS + 3pJ0Et6SdBLeknQi3pF0e+9zYcfseGTA3pJ0aN6SdBreknQS3pJ0Et6SdBLeknQS3pJ0Et6SdBPeknQj + 3pJ0Sd+Rc3/wcmDK/VlS+v9WUP/5YVjq44lvleGMcJP/VlD/9mVa496SdGLeknQHAAAAAAAAAAAAAAAA + AAAAAN6SdBHeknR3+15R9PxdUPbeknR/3pJ0Vt+PcoTxb13P/llO+/9XTP/3ZVXm5YVroN6SdF7eknQl + 3pJ0Bd6SdAAAAAAAAAAAAAAAAADeknQZ35FzhP5aTvv5YlPt3pJ0bt6SdA0AAAAAAAAAAAAAAADeknQA + 3pJ0CN6SdC7eknRp6IBnrvpgUu//V0z//VxQ+O52YsLeknR43pJ0VeGMcJX/V0z/9mdX496SdGLeknQH + AAAAAAAAAAAAAAAAAAAAAN6SdBHeknR3+19O9P5aSf3yb1nT4Yxvjd6SdF3eknRk5YVroPdmU+X/WUn/ + /ltK+/FxWs/gj3GE3pJ0SN6SdBXeknQBAAAAAAAAAADeknQZ35FzhP5bSvv5Y1Dt3pJ0bt6SdA0AAAAA + AAAAAN6SdAPeknQc3pJ0UuKLb5D0bFba/lpJ/v9aSf70a1fb4opukt6SdF7eknRi5IhsmfVqVd7/WUn/ + 9mhU496SdGLeknQHAAAAAAAAAAAAAAAAAAAAAN6SdA3eknRl7HpgvvxgSvX/W0X//F9I9u53XMTfkXN+ + 3pJ0W96Rc3bsemC9/F9J9v9bRf/7Ykvx6n9js96SdGzeknQy3pJ0Cd6SdADeknQZ35FzhP5dR/v5ZE3t + 3pJ0bt6SdA3eknQA3pJ0Dt6SdDveknR47XlewPxfSPf/W0X/+mJM8OmAZa/eknRt3pJ0XuCOcYnxcljQ + /V1H+v9bRf/6Y0zv6YBlr96SdFPeknQFAAAAAAAAAAAAAAAAAAAAAN6SdADeknQb3pJ0TuCPcYbxc1fO + /V9E+v9cQf/6ZEjw6n9htN6Rc3TeknRh4Y1vjPNvU9f+XUL9/11B//ZsT+DjimyW3pJ0V96SdB/eknQb + 35FzhP5fQ/v5Zkrt3pJ0bt6SdBLeknQp3pJ0YeaFZ6T4Z0vq/1xB//1fQ/vwdVjK35Bygd6SdF/fkHJ9 + 7XlcwfxhRfb/XEH//GFG9u54XMLekXN83pJ0RN6SdBPeknQAAAAAAAAAAAAAAAAAAAAAAAAAAADeknQA + 3pJ0Bt6SdCbeknRb44lrmPVuT9v+Xz79/149/vdrSuXmhmaj3pJ0a96SdG3ng2Wp+WdH7P9ePf/9YUD5 + 73hXxd+QcnzeknRH35FzhP5gP/v5Z0ft3pJ0b96SdE3hjnCJ8nNS0v5gPvz/Xj3+92tL4+SIapzeknRo + 3pJ0cumBYbD5Z0bt/149//5gP/vyc1TR4Y1vi96SdFHeknQe3pJ0BN6SdAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAN6SdADeknQL3pJ0Md6SdGjnhGSo+GpG6P9gOf/+YTr99HFN2OKMbZPeknRp + 35Byfu94V8b9Yjz6/2A5//lpQ+znhGOo35FzkP5iO/v5aUPt3pJ0h+t/Xbf7ZT/z/2A5//xlP/Xrfl24 + 3pJzdt6SdGzliGif9m1I4v9gOv7/YDr+9W5L3+SJaZveknRe3pJ0Kd6SdAfeknQAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3pJ0Ad6SdBDeknQ93pJ0c+t/XLf7aD3x + /2E1//1kOPrweFLK4I9wht6SdG3ji2uW9W9I3/9iNv7+Yjb+83NL3P5jN/z7Zz3z9m5F4/9hNf/+Yzf8 + 8nRO0+CPcIreknRs4oxskfN0TNX+Yzb9/2I1//lrQurohGKq3pJ0at6SdDPeknQL3pJ0AAAAAAAAAAAA + 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 + +rx2696TdFfeknQV7nJpr/tZYPHgjXKP/1Bd/+WFb4PeknQFAAAAAAAAAADeknQL6nppnf1XWfneknSK + /lVY++l8aqDeknQ36KJzpPW2cdX1tnHV9bZx1fW2cdX1tnHV9bZx1fW2cdX1tnHV9bZx1fW2cdX1tnHV + 9bZx1fW2cdX1tnHV5Z1zlN6SdDjudGa0+1tb8eCNco//U1f/5YVug96SdAUAAAAAAAAAAN6SdAvqe2ed + /VlU+d6SdIb5YFjr/FpU9u13ZLDeknRh3pJ0N96SdCreknQq3pJ0Kt6SdCreknRD6IBpnuaDa5beknQ7 + 3pJ0Kt6SdCreknQq3pJ0Kt6SdDvekXRo73Jhu/1ZU/n2Zlvf4I5xjP9VUf/lhm2D3pJ0BQAAAAAAAAAA + 3pJ0C+p8ZZ39W0364I5xf9+Rc2vwcV7A/lpN+vhlVOPmhWqK3pJ0Md6SdAUAAAAAAAAAAN6SdDL2Z1bd + 821azN6SdCMAAAAAAAAAAN6SdAfeknQ56IFnlvliUur9XE/37nVhtd6SdGbjiW2P/1hM/+WGbIPeknQF + AAAAAAAAAADeknQJ5YZqh/thTPD8X0n17nddtd6SdGvkiGyG92hS3v5cR/zycVfH4I9xZd6SdBreknQB + 3pJ0MvZpUt3zblbM3pJ0I96SdALeknQg4YxvcPRuVdH+W0f99WtV1eKLb33fkHJw8HRav/1eSPn6Y07r + 4oxvct6SdAQAAAAAAAAAAN6SdADeknQa35ByYPB1Wb79YEP4+mVI7OqAYaDeknRt63xgqPtiRvP7Y0bx + 6n5go96SdEPeknQ69mtO3fNwU8zeknQv3pJ0Te16XLD8YUT1+mRI7emAZJ3eknRu7Hxdq/tjRvH8YkX1 + 7nhcs96SdFbeknQU3pJ0AAAAAAAAAAAAAAAAAAAAAADeknQD3pJ0J+KMbXXzcU/Q/mA7/fdsSN/lh2eP + 4I9xe/JyUcv+YTz89m5J2+OKa4b2bUnd83JPzeWHZ434a0bj/mE9+vB1VcDfkXN354RjmPhqReb+YTz7 + 8nNSx+COcGreknQg3pJ0AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3pJ0CN6SdDbmh2aL + 921F4P5jNvzzc0rP4Y1tg+aGZZX4a0Hm/WQ3+ftnO/P7aDzw/mM2/PduRd7kimmM44tpivVxRtj+YzX9 + 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 + wAMAAPAPAAD8PwAA +</value> + </data> +</root> \ No newline at end of file diff --git a/HALOCELauncher/Form1.vb b/HALOCELauncher/Form1.vb new file mode 100644 index 0000000..f70c552 --- /dev/null +++ b/HALOCELauncher/Form1.vb @@ -0,0 +1,338 @@ +Imports HALOCELauncher.HaloQuery +Imports HALOCELauncher.HaloQuery.HaloServerInfo +Imports HALOCELauncher.Core.Helpers +Imports System.Runtime.InteropServices +Imports HALOCELauncher.Core.Utils +Imports System.Drawing.Imaging +Imports System.Net +Imports System.IO +Imports HALOCELauncher.Core.GameTracker +Imports HALOCELauncher.Core.Utils.LogFuncs +Imports HALOCELauncher.Destroyer.Protect + + +<Assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)> + +Public Class Form1 + + Private HomeControl As Form = New Home With {.TopLevel = False} + Private ServerControl As Servers = New Servers With {.TopLevel = False} + Private ModsControl As Form = New Modsfrm With {.TopLevel = False} + Private SettingsControl As Form = New Settingfrm With {.TopLevel = False} + + Private ImageDir As String = IO.Path.GetDirectoryName(Application.ExecutablePath) & "\" & "Background" + + Private Sub Form1_Shown(sender As Object, e As EventArgs) Handles MyBase.Shown + + End Sub + + Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load + + Try : AddHandler Application.ThreadException, AddressOf Application_Exception_Handler _ + : Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException, False) _ + : Catch : End Try + + Guna.UI.Lib.GraphicsHelper.ShadowForm(Me) + + If IsAdministrator = True Then + StartMonitorig() + Else + MsgBox("Please open with administrator rights!") + End + End If + + StartControls() + End Sub + + Private Sub Application_Exception_Handler(ByVal sender As Object, ByVal e As System.Threading.ThreadExceptionEventArgs) + Dim ex As Exception = CType(e.Exception, Exception) + WriteLog(ex.Message, InfoType.Exception) + End Sub + + Private Sub StartControls() + EnabledDragger(PanelFX1) + EnabledDragger(GunaPanel2) + FontTheme(0) + If IO.Directory.Exists(ImageDir) = False Then + IO.Directory.CreateDirectory(ImageDir) + End If + BackG() + LoadForms() + End Sub + +#Region " Load Forms " + + Private Sub LoadForms() + AddShowForm(HomeControl) + AddShowForm(ServerControl) + AddShowForm(ModsControl) + AddShowForm(SettingsControl) + End Sub + + Public Sub AddShowForm(ByVal LocalForm As Form) + PanelContainer.Controls.Add(LocalForm) + LocalForm.Show() + End Sub + + Private Sub nav_home_CheckedChanged(sender As Object, e As EventArgs) Handles nav_home.CheckedChanged + If nav_home.Checked Then + HomeControl.BringToFront() + End If + End Sub + + Dim LoadForm As Boolean = False + + Private Sub nav_servers_CheckedChanged(sender As Object, e As EventArgs) Handles nav_servers.CheckedChanged + If nav_servers.Checked Then + ServerControl.BringToFront() + If LoadForm = False Then + ServerControl.StartAll() + LoadForm = True + End If + End If + End Sub + + + Private Sub nav_mods_CheckedChanged(sender As Object, e As EventArgs) Handles nav_mods.CheckedChanged + If nav_mods.Checked Then + ModsControl.BringToFront() + End If + End Sub + + Private Sub nav_settings_CheckedChanged(sender As Object, e As EventArgs) Handles nav_settings.CheckedChanged + If nav_settings.Checked Then + SettingsControl.BringToFront() + End If + End Sub + +#End Region + +#Region " BackgroudF " + + Private Function GenerateListImage() As List(Of Image) + On Error Resume Next + Dim LocalImages As New List(Of Image) + Dim ImageFiles As IEnumerable(Of FileInfo) = FileDirSearcher.GetFiles(dirPath:=ImageDir, + searchOption:=SearchOption.TopDirectoryOnly, + fileNamePatterns:={"*"}, + fileExtPatterns:={"*.bmp", "*.jpeg", "*.jpg", "*.png"}) + For Each ImageFil As FileInfo In ImageFiles + LocalImages.Add(Image.FromFile(ImageFil.FullName)) + Next + Return LocalImages + End Function + + Private Sub BackG() + On Error Resume Next + Dim BackgroundImageList As List(Of Image) = GenerateListImage() + + ' BackgroundImageList.Add(My.Resources.b1) + ' BackgroundImageList.Add(My.Resources._1790160475_preview_HaloCollectionCover) + + If Not BackgroundImageList.Count = 0 Then + Dim ImageSelect As Integer = GetRandomNum(0, BackgroundImageList.Count) + Dim ImageSelected As Bitmap = BackgroundImageList(ImageSelect) + If PanelFX1.BackgroundImage Is Nothing Then + PanelFX1.BackgroundImage = ImageSelected + Else + Dim OldBitMap As Bitmap = New Bitmap(PanelFX1.BackgroundImage) + If Not CompareImages(ImageSelected, OldBitMap) = True Then + PanelFX1.BackgroundImage = ImageSelected + UpdateAllBlur() + End If + End If + End If + + End Sub + + Public Sub UpdateAllBlur() + HomeControl.Refresh() + ServerControl.Refresh() + ModsControl.Refresh() + SettingsControl.Refresh() + End Sub + + ''' <summary> + ''' The <see cref="TimeMeasurer"/> instance that measure time intervals. + ''' </summary> + Private WithEvents Clock As New TimeMeasurer With {.UpdateInterval = 100} + Private SecondToChangeImage As Integer = 30 + + Private Shadows Sub Load() Handles MyBase.Load + + Me.Clock.Start(SecondtoMilli(SecondToChangeImage)) ' Measure 1 minute + + End Sub + + Private Sub Clock_RemainingTimeFinished(ByVal sender As Object, ByVal e As TimeMeasurer.TimeMeasureEventArgs) _ + Handles Clock.RemainingTimeFinished + + If IsGameOpen() = False Then + BackG() + End If + + Me.Clock.Start(SecondtoMilli(SecondToChangeImage)) ' Measure 1 minute + + End Sub + + Private Function IsGameOpen() As Boolean + Dim pName As String = IO.Path.GetFileNameWithoutExtension(My.Settings.GameDirCE) + Dim psList() As Process + Try + psList = Process.GetProcesses() + + For Each p As Process In psList + If (pName = p.ProcessName) Then + Return True + End If + Next p + Return False + Catch ex As Exception + Return False + End Try + End Function + +#End Region + +#Region " Font Aply " + + Dim HaloFont As New CustomFont(My.Resources.Halo) + Dim HaloFont_Outline As New CustomFont(My.Resources.Halo_Outline) + + Private Sub Main_Disposed(sender As Object, e As System.EventArgs) Handles MyBase.Disposed + HaloFont.Dispose() + HaloFont_Outline.Dispose() + End Sub + + Private Sub FontTheme(ByVal FontType As Integer) + If FontType = 0 Then + + ElseIf FontType = 1 Then + nav_home.Font = New Font(HaloFont.Font, 16.0!) + nav_servers.Font = New Font(HaloFont.Font, 16.0!) + nav_mods.Font = New Font(HaloFont.Font, 16.0!) + nav_settings.Font = New Font(HaloFont.Font, 16.0!) + nav_tools.Font = New Font(HaloFont.Font, 16.0!) + ElseIf FontType = 2 Then + nav_home.Font = New Font(HaloFont_Outline.Font, 16.0!) + nav_servers.Font = New Font(HaloFont_Outline.Font, 16.0!) + nav_mods.Font = New Font(HaloFont_Outline.Font, 16.0!) + nav_settings.Font = New Font(HaloFont_Outline.Font, 16.0!) + nav_tools.Font = New Font(HaloFont_Outline.Font, 16.0!) + End If + My.Settings.FontType = FontType + My.Settings.Save() + End Sub + +#End Region + + Private Sub GunaButton1_Click(sender As Object, e As EventArgs) Handles GunaButton1.Click + Dim OpenFileDialog1 As New OpenFileDialog + Dim result As DialogResult = OpenFileDialog1.ShowDialog() + + ' Test result. + If result = Windows.Forms.DialogResult.OK Then + Dim ImageDir As String = OpenFileDialog1.FileName + Dim imageAAAA = Image.FromFile(ImageDir) + Dim base64String As String = ConvertImageToBase64String(imageAAAA) 'Using Functions To Make the code tidier + IO.File.WriteAllText("iMAGE.TXT", base64String) + Dim byteArray = ConvertBase64ToByteArray(base64String) 'Using Functions To Make the code tidier + Dim imageDDD = convertbytetoimage(byteArray) 'Using Functions To Make the code tidier + ' PictureBox1.Image = imageDDD 'since we're using a small windows form app, we'll set back the image to a second picture box. + End If + + + End Sub + +#Region " Monitor Mode " + + + Public Structure ResultScan + Shared ProcessResult As String = String.Empty + Shared DebuggersResult As String = String.Empty + Shared VMResult As String = String.Empty + Shared Finish As Boolean = False + End Structure + + Dim Enabling As Integer = 0 + + Private Sub StartMonitorig() + Destroyer.Exploits.OllyOldExploit() + ResultScan.ProcessResult = String.Empty + ResultScan.DebuggersResult = String.Empty + ResultScan.VMResult = String.Empty + ResultScan.Finish = False + + DestroyerProtect.MonitorAsync(Destroyer.AntiAnalysis.MainAnalysis.SearchType.FromNameandTitle, _ + Destroyer.AntiDebug.MainDebug.DebugDetectionTypes.AllScanEgines, _ + DestroyerProtect.VMScanType.By_Directory_Known) + MonitorTimer1.Enabled = True + End Sub + + Private Sub MonitorTimer1_Tick(sender As Object, e As EventArgs) Handles MonitorTimer1.Tick + Dim Finispscan As DestroyerProtect.ResultType = DestroyerProtect.Process_scanner + Dim FinisDbugscan As DestroyerProtect.ResultType = DestroyerProtect.Debugers_scanner + Dim VMscanner As DestroyerProtect.ResultType = DestroyerProtect.VM_scanner + Dim Mdirs As New Destroyer.MainDirScan + + If Finispscan = DestroyerProtect.ResultType.Danger Then + ResultScan.ProcessResult = "[DANGER] Malicious Process has been Detected" + ElseIf Finispscan = DestroyerProtect.ResultType.Secure Then + ResultScan.ProcessResult = "[SECURE] Malicious Process Not Detected" + End If + + If FinisDbugscan = DestroyerProtect.ResultType.Danger Then + ResultScan.DebuggersResult = "[DANGER] Debuggers Detected" + ElseIf FinisDbugscan = DestroyerProtect.ResultType.Secure Then + ResultScan.DebuggersResult = "[SECURE] Debuggers not Detected" + End If + + If VMscanner = DestroyerProtect.ResultType.Danger Then + ResultScan.VMResult = "[DANGER] Virutal Machines Have Been Detected" + ElseIf Finispscan = DestroyerProtect.ResultType.Secure Then + ResultScan.VMResult = "[SECURE] No Virtual Machines Found" + End If + + If Not ResultScan.ProcessResult = String.Empty Then + Ending() + ResultScan.Finish = True + MonitorTimer1.Enabled = False + End If + + If Not ResultScan.DebuggersResult = String.Empty Then + Ending() + ResultScan.Finish = True + MonitorTimer1.Enabled = False + End If + + If Mdirs.MaliciousDir() = True Then + Ending() + ResultScan.Finish = True + MonitorTimer1.Enabled = False + End If + + If Not ResultScan.VMResult = String.Empty Then + Ending() + ResultScan.Finish = True + MonitorTimer1.Enabled = False + End If + + If Enabling = 100 Then + 'Destroyer.AntiDump.MainDump.AntiDumpEnabled(Me) + End If + + Enabling += 1 + End Sub + + Private Sub Ending() + End + End Sub + +#End Region + + Private Sub GunaControlBox1_Click(sender As Object, e As EventArgs) Handles GunaControlBox1.Click + End + End Sub +End Class + + diff --git a/HALOCELauncher/HALOCELauncher.vbproj b/HALOCELauncher/HALOCELauncher.vbproj new file mode 100644 index 0000000..a96d473 --- /dev/null +++ b/HALOCELauncher/HALOCELauncher.vbproj @@ -0,0 +1,298 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" /> + <PropertyGroup> + <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> + <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> + <ProjectGuid>{5483309A-1BD8-41A4-8394-31A5366207C1}</ProjectGuid> + <OutputType>WinExe</OutputType> + <StartupObject>HALOCELauncher.My.MyApplication</StartupObject> + <RootNamespace>HALOCELauncher</RootNamespace> + <AssemblyName>HALOCELauncher</AssemblyName> + <FileAlignment>512</FileAlignment> + <MyType>WindowsForms</MyType> + <TargetFrameworkVersion>v4.5</TargetFrameworkVersion> + </PropertyGroup> + <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> + <PlatformTarget>AnyCPU</PlatformTarget> + <DebugSymbols>true</DebugSymbols> + <DebugType>full</DebugType> + <DefineDebug>true</DefineDebug> + <DefineTrace>true</DefineTrace> + <OutputPath>bin\Debug\</OutputPath> + <DocumentationFile>HALOCELauncher.xml</DocumentationFile> + <NoWarn>42016,41999,42017,42018,42019,42032,42036,42020,42021,42022</NoWarn> + </PropertyGroup> + <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> + <PlatformTarget>AnyCPU</PlatformTarget> + <DebugType>pdbonly</DebugType> + <DefineDebug>false</DefineDebug> + <DefineTrace>true</DefineTrace> + <Optimize>true</Optimize> + <OutputPath>bin\Release\</OutputPath> + <DocumentationFile>HALOCELauncher.xml</DocumentationFile> + <NoWarn>42016,41999,42017,42018,42019,42032,42036,42020,42021,42022</NoWarn> + </PropertyGroup> + <PropertyGroup> + <OptionExplicit>On</OptionExplicit> + </PropertyGroup> + <PropertyGroup> + <OptionCompare>Binary</OptionCompare> + </PropertyGroup> + <PropertyGroup> + <OptionStrict>Off</OptionStrict> + </PropertyGroup> + <PropertyGroup> + <OptionInfer>On</OptionInfer> + </PropertyGroup> + <PropertyGroup> + <ApplicationIcon>image.ico</ApplicationIcon> + </PropertyGroup> + <PropertyGroup> + <ApplicationManifest>My Project\app.manifest</ApplicationManifest> + </PropertyGroup> + <ItemGroup> + <Reference Include="Guna.UI"> + <HintPath>..\..\..\..\Visual Studio 2012\Projects\Guna Examples\Guna\Guna.UI.dll</HintPath> + </Reference> + <Reference Include="HtmlAgilityPack"> + <HintPath>..\..\Xylon\Xylon\bin\Debug\HtmlAgilityPack.dll</HintPath> + </Reference> + <Reference Include="System" /> + <Reference Include="System.Data" /> + <Reference Include="System.Deployment" /> + <Reference Include="System.Drawing" /> + <Reference Include="System.Management" /> + <Reference Include="System.Windows.Forms" /> + <Reference Include="System.Xml" /> + <Reference Include="System.Core" /> + <Reference Include="System.Xml.Linq" /> + <Reference Include="System.Data.DataSetExtensions" /> + </ItemGroup> + <ItemGroup> + <Import Include="Microsoft.VisualBasic" /> + <Import Include="System" /> + <Import Include="System.Collections" /> + <Import Include="System.Collections.Generic" /> + <Import Include="System.Data" /> + <Import Include="System.Drawing" /> + <Import Include="System.Diagnostics" /> + <Import Include="System.Windows.Forms" /> + <Import Include="System.Linq" /> + <Import Include="System.Xml.Linq" /> + <Import Include="System.Threading.Tasks" /> + </ItemGroup> + <ItemGroup> + <Compile Include="Controls\AnimaTheme.vb"> + <SubType>Component</SubType> + </Compile> + <Compile Include="Controls\BoosterTheme.vb"> + <SubType>Component</SubType> + </Compile> + <Compile Include="Controls\Forms\AboutForm.Designer.vb"> + <DependentUpon>AboutForm.vb</DependentUpon> + </Compile> + <Compile Include="Controls\Forms\AboutForm.vb"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Controls\Forms\Home.Designer.vb"> + <DependentUpon>Home.vb</DependentUpon> + </Compile> + <Compile Include="Controls\Forms\Home.vb"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Controls\Forms\Modsfrm.Designer.vb"> + <DependentUpon>Modsfrm.vb</DependentUpon> + </Compile> + <Compile Include="Controls\Forms\Modsfrm.vb"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Controls\Forms\Servers.Designer.vb"> + <DependentUpon>Servers.vb</DependentUpon> + </Compile> + <Compile Include="Controls\Forms\Servers.vb"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Controls\Forms\Settingfrm.Designer.vb"> + <DependentUpon>Settingfrm.vb</DependentUpon> + </Compile> + <Compile Include="Controls\Forms\Settingfrm.vb"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Controls\HelpersXylos.vb"> + <SubType>Component</SubType> + </Compile> + <Compile Include="Controls\MenuStripZControl.vb"> + <SubType>Component</SubType> + </Compile> + <Compile Include="Controls\PanelFX\PanelFX.vb"> + <SubType>UserControl</SubType> + </Compile> + <Compile Include="Controls\ServerTap\AddCustomServer.Designer.vb"> + <DependentUpon>AddCustomServer.vb</DependentUpon> + </Compile> + <Compile Include="Controls\ServerTap\AddCustomServer.vb"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Controls\ServerTap\FavoritiesC.Designer.vb"> + <DependentUpon>FavoritiesC.vb</DependentUpon> + </Compile> + <Compile Include="Controls\ServerTap\FavoritiesC.vb"> + <SubType>UserControl</SubType> + </Compile> + <Compile Include="Controls\ServerTap\InternetC.Designer.vb"> + <DependentUpon>InternetC.vb</DependentUpon> + </Compile> + <Compile Include="Controls\ServerTap\InternetC.vb"> + <SubType>UserControl</SubType> + </Compile> + <Compile Include="Controls\ServerTap\LoadingC.Designer.vb"> + <DependentUpon>LoadingC.vb</DependentUpon> + </Compile> + <Compile Include="Controls\ServerTap\LoadingC.vb"> + <SubType>UserControl</SubType> + </Compile> + <Compile Include="Controls\ServerTap\sv_control.Designer.vb"> + <DependentUpon>sv_control.vb</DependentUpon> + </Compile> + <Compile Include="Controls\ServerTap\sv_control.vb"> + <SubType>UserControl</SubType> + </Compile> + <Compile Include="Controls\ThemeModule.vb" /> + <Compile Include="Controls\TransparentListView.vb"> + <SubType>Component</SubType> + </Compile> + <Compile Include="Core\AntiFlicker\IBufferedControl.vb" /> + <Compile Include="Core\AntiFlicker\Win32FX.vb" /> + <Compile Include="Core\FakeFullScreen\SetWindowState.vb" /> + <Compile Include="Core\FakeFullScreen\SetWindowStyle.vb" /> + <Compile Include="Core\Launcher.vb" /> + <Compile Include="Core\SvManager\SvFormatManager.vb" /> + <Compile Include="Core\Font\CustomFont.vb" /> + <Compile Include="Core\GameTracker\GTAPI.vb" /> + <Compile Include="Core\Utils\FileDirSearcher.vb" /> + <Compile Include="Core\Utils\HtmlAgilityFuncs.vb" /> + <Compile Include="Core\HaloQuery\HaloServer.vb" /> + <Compile Include="Core\HaloQuery\HaloServerInfo.vb" /> + <Compile Include="Core\Helpers.vb" /> + <Compile Include="Core\Time\TimeMeasurer.vb" /> + <Compile Include="Core\Utils\BlurEffect.vb" /> + <Compile Include="Core\Utils\Compression.vb" /> + <Compile Include="Core\Utils\ControlDragger.vb" /> + <Compile Include="Core\Utils\GetBlurBitmap.vb" /> + <Compile Include="Core\Utils\LogFuncs.vb" /> + <Compile Include="Core\Utils\RegEdit.vb" /> + <Compile Include="Core\Utils\XMLHelper.vb" /> + <Compile Include="DestroyerCore\AntiAnalysis\MainAnalysis.vb" /> + <Compile Include="DestroyerCore\AntiDebug\MainDebug.vb" /> + <Compile Include="DestroyerCore\AntiDump\MainDump.vb" /> + <Compile Include="DestroyerCore\AntiVirtualMachine\MainVM.vb" /> + <Compile Include="DestroyerCore\AntiVirtualMachine\OldAntiVM.vb" /> + <Compile Include="DestroyerCore\DestroyerProtect.vb" /> + <Compile Include="DestroyerCore\DirAnalysis\MainDirScan.vb" /> + <Compile Include="DestroyerCore\Exploits.vb" /> + <Compile Include="DestroyerCore\Utils.vb" /> + <Compile Include="Form1.vb"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Form1.Designer.vb"> + <DependentUpon>Form1.vb</DependentUpon> + <SubType>Form</SubType> + </Compile> + <Compile Include="My Project\AssemblyInfo.vb" /> + <Compile Include="My Project\Application.Designer.vb"> + <AutoGen>True</AutoGen> + <DependentUpon>Application.myapp</DependentUpon> + </Compile> + <Compile Include="My Project\Resources.Designer.vb"> + <AutoGen>True</AutoGen> + <DesignTime>True</DesignTime> + <DependentUpon>Resources.resx</DependentUpon> + </Compile> + <Compile Include="My Project\Settings.Designer.vb"> + <AutoGen>True</AutoGen> + <DependentUpon>Settings.settings</DependentUpon> + <DesignTimeSharedInput>True</DesignTimeSharedInput> + </Compile> + </ItemGroup> + <ItemGroup> + <EmbeddedResource Include="Controls\Forms\AboutForm.resx"> + <DependentUpon>AboutForm.vb</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Controls\Forms\Home.resx"> + <DependentUpon>Home.vb</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Controls\Forms\Modsfrm.resx"> + <DependentUpon>Modsfrm.vb</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Controls\Forms\Servers.resx"> + <DependentUpon>Servers.vb</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Controls\Forms\Settingfrm.resx"> + <DependentUpon>Settingfrm.vb</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Controls\ServerTap\AddCustomServer.resx"> + <DependentUpon>AddCustomServer.vb</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Controls\ServerTap\FavoritiesC.resx"> + <DependentUpon>FavoritiesC.vb</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Controls\ServerTap\InternetC.resx"> + <DependentUpon>InternetC.vb</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Controls\ServerTap\LoadingC.resx"> + <DependentUpon>LoadingC.vb</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Controls\ServerTap\sv_control.resx"> + <DependentUpon>sv_control.vb</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Form1.resx"> + <DependentUpon>Form1.vb</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="My Project\Resources.resx"> + <Generator>VbMyResourcesResXFileCodeGenerator</Generator> + <LastGenOutput>Resources.Designer.vb</LastGenOutput> + <CustomToolNamespace>My.Resources</CustomToolNamespace> + <SubType>Designer</SubType> + </EmbeddedResource> + </ItemGroup> + <ItemGroup> + <None Include="My Project\app.manifest" /> + <None Include="My Project\Application.myapp"> + <Generator>MyApplicationCodeGenerator</Generator> + <LastGenOutput>Application.Designer.vb</LastGenOutput> + </None> + <None Include="My Project\Settings.settings"> + <Generator>SettingsSingleFileGenerator</Generator> + <CustomToolNamespace>My</CustomToolNamespace> + <LastGenOutput>Settings.Designer.vb</LastGenOutput> + </None> + <None Include="App.config" /> + </ItemGroup> + <ItemGroup> + <None Include="Resources\Halo Outline.ttf" /> + <None Include="Resources\Halo.ttf" /> + <None Include="Resources\thumb-1920-900258.jpg" /> + </ItemGroup> + <ItemGroup> + <None Include="Resources\1790160475_preview_HaloCollectionCover.png" /> + </ItemGroup> + <ItemGroup> + <None Include="Resources\b1.jpg" /> + </ItemGroup> + <ItemGroup> + <None Include="Resources\images.jpg" /> + </ItemGroup> + <ItemGroup> + <Content Include="image.ico" /> + </ItemGroup> + <ItemGroup /> + <Import Project="$(MSBuildToolsPath)\Microsoft.VisualBasic.targets" /> + <!-- To modify your build process, add your task inside one of the targets below and uncomment it. + Other similar extension points exist, see Microsoft.Common.targets. + <Target Name="BeforeBuild"> + </Target> + <Target Name="AfterBuild"> + </Target> + --> +</Project> \ No newline at end of file diff --git a/HALOCELauncher/My Project/Application.Designer.vb b/HALOCELauncher/My Project/Application.Designer.vb new file mode 100644 index 0000000..52be257 --- /dev/null +++ b/HALOCELauncher/My Project/Application.Designer.vb @@ -0,0 +1,38 @@ +'------------------------------------------------------------------------------ +' <auto-generated> +' This code was generated by a tool. +' Runtime Version:4.0.30319.42000 +' +' Changes to this file may cause incorrect behavior and will be lost if +' the code is regenerated. +' </auto-generated> +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + + +Namespace My + + 'NOTE: This file is auto-generated; do not modify it directly. To make changes, + ' or if you encounter build errors in this file, go to the Project Designer + ' (go to Project Properties or double-click the My Project node in + ' Solution Explorer), and make changes on the Application tab. + ' + Partial Friend Class MyApplication + + <Global.System.Diagnostics.DebuggerStepThroughAttribute()> _ + Public Sub New() + MyBase.New(Global.Microsoft.VisualBasic.ApplicationServices.AuthenticationMode.Windows) + Me.IsSingleInstance = false + Me.EnableVisualStyles = true + Me.SaveMySettingsOnExit = true + Me.ShutDownStyle = Global.Microsoft.VisualBasic.ApplicationServices.ShutdownMode.AfterMainFormCloses + End Sub + + <Global.System.Diagnostics.DebuggerStepThroughAttribute()> _ + Protected Overrides Sub OnCreateMainForm() + Me.MainForm = Global.HALOCELauncher.Form1 + End Sub + End Class +End Namespace diff --git a/HALOCELauncher/My Project/Application.myapp b/HALOCELauncher/My Project/Application.myapp new file mode 100644 index 0000000..0f12f32 --- /dev/null +++ b/HALOCELauncher/My Project/Application.myapp @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8"?> +<MyApplicationData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> + <MySubMain>true</MySubMain> + <MainForm>Form1</MainForm> + <SingleInstance>false</SingleInstance> + <ShutdownMode>0</ShutdownMode> + <EnableVisualStyles>true</EnableVisualStyles> + <AuthenticationMode>0</AuthenticationMode> + <SaveMySettingsOnExit>true</SaveMySettingsOnExit> +</MyApplicationData> \ No newline at end of file diff --git a/HALOCELauncher/My Project/AssemblyInfo.vb b/HALOCELauncher/My Project/AssemblyInfo.vb new file mode 100644 index 0000000..033fc51 --- /dev/null +++ b/HALOCELauncher/My Project/AssemblyInfo.vb @@ -0,0 +1,35 @@ +Imports System +Imports System.Reflection +Imports System.Runtime.InteropServices + +' General Information about an assembly is controlled through the following +' set of attributes. Change these attribute values to modify the information +' associated with an assembly. + +' Review the values of the assembly attributes + +<Assembly: AssemblyTitle("HALOCELauncher")> +<Assembly: AssemblyDescription("Launcher For HALO CE and PC")> +<Assembly: AssemblyCompany("EternalSoftware")> +<Assembly: AssemblyProduct("HALOCELauncher")> +<Assembly: AssemblyCopyright("Copyright © 2020")> +<Assembly: AssemblyTrademark("")> + +<Assembly: ComVisible(False)> + +'The following GUID is for the ID of the typelib if this project is exposed to COM +<Assembly: Guid("f487a665-87cc-4a74-9d10-66497fc8395f")> + +' Version information for an assembly consists of the following four values: +' +' Major Version +' Minor Version +' Build Number +' Revision +' +' You can specify all the values or you can default the Build and Revision Numbers +' by using the '*' as shown below: +' <Assembly: AssemblyVersion("1.0.*")> + +<Assembly: AssemblyVersion("1.0.3.0")> +<Assembly: AssemblyFileVersion("1.0.3.0")> diff --git a/HALOCELauncher/My Project/Resources.Designer.vb b/HALOCELauncher/My Project/Resources.Designer.vb new file mode 100644 index 0000000..3b38ed8 --- /dev/null +++ b/HALOCELauncher/My Project/Resources.Designer.vb @@ -0,0 +1,83 @@ +'------------------------------------------------------------------------------ +' <auto-generated> +' This code was generated by a tool. +' Runtime Version:4.0.30319.42000 +' +' Changes to this file may cause incorrect behavior and will be lost if +' the code is regenerated. +' </auto-generated> +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + +Imports System + +Namespace My.Resources + + 'This class was auto-generated by the StronglyTypedResourceBuilder + 'class via a tool like ResGen or Visual Studio. + 'To add or remove a member, edit your .ResX file then rerun ResGen + 'with the /str option, or rebuild your VS project. + '''<summary> + ''' A strongly-typed resource class, for looking up localized strings, etc. + '''</summary> + <Global.System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0"), _ + Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _ + Global.System.Runtime.CompilerServices.CompilerGeneratedAttribute(), _ + Global.Microsoft.VisualBasic.HideModuleNameAttribute()> _ + Friend Module Resources + + Private resourceMan As Global.System.Resources.ResourceManager + + Private resourceCulture As Global.System.Globalization.CultureInfo + + '''<summary> + ''' Returns the cached ResourceManager instance used by this class. + '''</summary> + <Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _ + 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("HALOCELauncher.Resources", GetType(Resources).Assembly) + resourceMan = temp + End If + Return resourceMan + End Get + End Property + + '''<summary> + ''' Overrides the current thread's CurrentUICulture property for all + ''' resource lookups using this strongly typed resource class. + '''</summary> + <Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _ + Friend Property Culture() As Global.System.Globalization.CultureInfo + Get + Return resourceCulture + End Get + Set + resourceCulture = value + End Set + End Property + + '''<summary> + ''' Looks up a localized resource of type System.Byte[]. + '''</summary> + Friend ReadOnly Property Halo() As Byte() + Get + Dim obj As Object = ResourceManager.GetObject("Halo", resourceCulture) + Return CType(obj,Byte()) + End Get + End Property + + '''<summary> + ''' Looks up a localized resource of type System.Byte[]. + '''</summary> + Friend ReadOnly Property Halo_Outline() As Byte() + Get + Dim obj As Object = ResourceManager.GetObject("Halo_Outline", resourceCulture) + Return CType(obj,Byte()) + End Get + End Property + End Module +End Namespace diff --git a/HALOCELauncher/My Project/Resources.resx b/HALOCELauncher/My Project/Resources.resx new file mode 100644 index 0000000..7693211 --- /dev/null +++ b/HALOCELauncher/My Project/Resources.resx @@ -0,0 +1,127 @@ +<?xml version="1.0" encoding="utf-8"?> +<root> + <!-- + Microsoft ResX Schema + + Version 2.0 + + The primary goals of this format is to allow a simple XML format + that is mostly human readable. The generation and parsing of the + various data types are done through the TypeConverter classes + associated with the data types. + + Example: + + ... ado.net/XML headers & schema ... + <resheader name="resmimetype">text/microsoft-resx</resheader> + <resheader name="version">2.0</resheader> + <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader> + <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader> + <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data> + <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data> + <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64"> + <value>[base64 mime encoded serialized .NET Framework object]</value> + </data> + <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> + <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value> + <comment>This is a comment</comment> + </data> + + There are any number of "resheader" rows that contain simple + name/value pairs. + + Each data row contains a name, and value. The row also contains a + type or mimetype. Type corresponds to a .NET class that support + text/value conversion through the TypeConverter architecture. + Classes that don't support this are serialized and stored with the + mimetype set. + + The mimetype is used for serialized objects, and tells the + ResXResourceReader how to depersist the object. This is currently not + extensible. For a given mimetype the value must be set accordingly: + + Note - application/x-microsoft.net.object.binary.base64 is the format + that the ResXResourceWriter will generate, however the reader can + read any of the formats listed below. + + mimetype: application/x-microsoft.net.object.binary.base64 + value : The object must be serialized with + : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter + : and then encoded with base64 encoding. + + mimetype: application/x-microsoft.net.object.soap.base64 + value : The object must be serialized with + : System.Runtime.Serialization.Formatters.Soap.SoapFormatter + : and then encoded with base64 encoding. + + mimetype: application/x-microsoft.net.object.bytearray.base64 + value : The object must be serialized into a byte array + : using a System.ComponentModel.TypeConverter + : and then encoded with base64 encoding. + --> + <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> + <xsd:import namespace="http://www.w3.org/XML/1998/namespace" /> + <xsd:element name="root" msdata:IsDataSet="true"> + <xsd:complexType> + <xsd:choice maxOccurs="unbounded"> + <xsd:element name="metadata"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" /> + </xsd:sequence> + <xsd:attribute name="name" use="required" type="xsd:string" /> + <xsd:attribute name="type" type="xsd:string" /> + <xsd:attribute name="mimetype" type="xsd:string" /> + <xsd:attribute ref="xml:space" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="assembly"> + <xsd:complexType> + <xsd:attribute name="alias" type="xsd:string" /> + <xsd:attribute name="name" type="xsd:string" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="data"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> + <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" /> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" /> + <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" /> + <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" /> + <xsd:attribute ref="xml:space" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="resheader"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required" /> + </xsd:complexType> + </xsd:element> + </xsd:choice> + </xsd:complexType> + </xsd:element> + </xsd:schema> + <resheader name="resmimetype"> + <value>text/microsoft-resx</value> + </resheader> + <resheader name="version"> + <value>2.0</value> + </resheader> + <resheader name="reader"> + <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> + </resheader> + <resheader name="writer"> + <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> + </resheader> + <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> + <data name="Halo" type="System.Resources.ResXFileRef, System.Windows.Forms"> + <value>..\Resources\Halo.ttf;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> + </data> + <data name="Halo_Outline" type="System.Resources.ResXFileRef, System.Windows.Forms"> + <value>..\Resources\Halo Outline.ttf;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> + </data> +</root> \ No newline at end of file diff --git a/HALOCELauncher/My Project/Settings.Designer.vb b/HALOCELauncher/My Project/Settings.Designer.vb new file mode 100644 index 0000000..d8686a5 --- /dev/null +++ b/HALOCELauncher/My Project/Settings.Designer.vb @@ -0,0 +1,229 @@ +'------------------------------------------------------------------------------ +' <auto-generated> +' This code was generated by a tool. +' Runtime Version:4.0.30319.42000 +' +' Changes to this file may cause incorrect behavior and will be lost if +' the code is regenerated. +' </auto-generated> +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + + +Namespace My + + <Global.System.Runtime.CompilerServices.CompilerGeneratedAttribute(), _ + Global.System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "12.0.0.0"), _ + Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _ + 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 "My.Settings Auto-Save Functionality" +#If _MyType = "WindowsForms" Then + Private Shared addedHandler As Boolean + + Private Shared addedHandlerLockObject As New Object + + <Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _ + 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 + + <Global.System.Configuration.UserScopedSettingAttribute(), _ + Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _ + Global.System.Configuration.DefaultSettingValueAttribute("1")> _ + Public Property FontType() As String + Get + Return CType(Me("FontType"),String) + End Get + Set + Me("FontType") = value + End Set + End Property + + <Global.System.Configuration.UserScopedSettingAttribute(), _ + Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _ + Global.System.Configuration.DefaultSettingValueAttribute("")> _ + Public Property GameDirCE() As String + Get + Return CType(Me("GameDirCE"), String) + End Get + Set(value As String) + Me("GameDirCE") = value + End Set + End Property + + <Global.System.Configuration.UserScopedSettingAttribute(), _ + Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _ + Global.System.Configuration.DefaultSettingValueAttribute("False")> _ + Public Property ConsoleC() As Boolean + Get + Return CType(Me("ConsoleC"), Boolean) + End Get + Set(value As Boolean) + Me("ConsoleC") = value + End Set + End Property + + <Global.System.Configuration.UserScopedSettingAttribute(), _ + Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _ + Global.System.Configuration.DefaultSettingValueAttribute("False")> _ + Public Property ScreenshotC() As Boolean + Get + Return CType(Me("ScreenshotC"), Boolean) + End Get + Set(value As Boolean) + Me("ScreenshotC") = value + End Set + End Property + + <Global.System.Configuration.UserScopedSettingAttribute(), _ + Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _ + Global.System.Configuration.DefaultSettingValueAttribute("False")> _ + Public Property devC() As Boolean + Get + Return CType(Me("devC"), Boolean) + End Get + Set(value As Boolean) + Me("devC") = value + End Set + End Property + + <Global.System.Configuration.UserScopedSettingAttribute(), _ + Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _ + Global.System.Configuration.DefaultSettingValueAttribute("False")> _ + Public Property GammaC() As Boolean + Get + Return CType(Me("GammaC"), Boolean) + End Get + Set(value As Boolean) + Me("GammaC") = value + End Set + End Property + + <Global.System.Configuration.UserScopedSettingAttribute(), _ + Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _ + Global.System.Configuration.DefaultSettingValueAttribute("False")> _ + Public Property SoundC() As Boolean + Get + Return CType(Me("SoundC"), Boolean) + End Get + Set(value As Boolean) + Me("SoundC") = value + End Set + End Property + + <Global.System.Configuration.UserScopedSettingAttribute(), _ + Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _ + Global.System.Configuration.DefaultSettingValueAttribute("False")> _ + Public Property VideoC() As Boolean + Get + Return CType(Me("VideoC"), Boolean) + End Get + Set(value As Boolean) + Me("VideoC") = value + End Set + End Property + + <Global.System.Configuration.UserScopedSettingAttribute(), _ + Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _ + Global.System.Configuration.DefaultSettingValueAttribute("False")> _ + Public Property JoystickC() As Boolean + Get + Return CType(Me("JoystickC"), Boolean) + End Get + Set(value As Boolean) + Me("JoystickC") = value + End Set + End Property + + <Global.System.Configuration.UserScopedSettingAttribute(), _ + Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _ + Global.System.Configuration.DefaultSettingValueAttribute("False")> _ + Public Property SafeModeC() As Boolean + Get + Return CType(Me("SafeModeC"), Boolean) + End Get + Set(value As Boolean) + Me("SafeModeC") = value + End Set + End Property + + <Global.System.Configuration.UserScopedSettingAttribute(), _ + Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _ + Global.System.Configuration.DefaultSettingValueAttribute("0")> _ + Public Property LaunchMode() As Integer + Get + Return CType(Me("LaunchMode"), Integer) + End Get + Set(value As Integer) + Me("LaunchMode") = value + End Set + End Property + + <Global.System.Configuration.UserScopedSettingAttribute(), _ + Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _ + Global.System.Configuration.DefaultSettingValueAttribute("")> _ + Public Property GameDirPC() As String + Get + Return CType(Me("GameDirPC"), String) + End Get + Set(value As String) + Me("GameDirPC") = value + End Set + End Property + + <Global.System.Configuration.UserScopedSettingAttribute(), _ + Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _ + Global.System.Configuration.DefaultSettingValueAttribute("0")> _ + Public Property GameDefect() As Integer + Get + Return CType(Me("GameDefect"), Integer) + End Get + Set(value As Integer) + Me("GameDefect") = value + End Set + End Property + End Class +End Namespace + +Namespace My + + <Global.Microsoft.VisualBasic.HideModuleNameAttribute(), _ + Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _ + Global.System.Runtime.CompilerServices.CompilerGeneratedAttribute()> _ + Friend Module MySettingsProperty + + <Global.System.ComponentModel.Design.HelpKeywordAttribute("My.Settings")> _ + Friend ReadOnly Property Settings() As Global.HALOCELauncher.My.MySettings + Get + Return Global.HALOCELauncher.My.MySettings.Default + End Get + End Property + End Module +End Namespace diff --git a/HALOCELauncher/My Project/Settings.settings b/HALOCELauncher/My Project/Settings.settings new file mode 100644 index 0000000..bea5050 --- /dev/null +++ b/HALOCELauncher/My Project/Settings.settings @@ -0,0 +1,45 @@ +<?xml version='1.0' encoding='utf-8'?> +<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="My" GeneratedClassName="MySettings" UseMySettingsClassName="true"> + <Profiles /> + <Settings> + <Setting Name="FontType" Type="System.String" Scope="User"> + <Value Profile="(Default)">1</Value> + </Setting> + <Setting Name="GameDirCE" Type="System.String" Scope="User"> + <Value Profile="(Default)" /> + </Setting> + <Setting Name="ConsoleC" Type="System.Boolean" Scope="User"> + <Value Profile="(Default)">False</Value> + </Setting> + <Setting Name="ScreenshotC" Type="System.Boolean" Scope="User"> + <Value Profile="(Default)">False</Value> + </Setting> + <Setting Name="devC" Type="System.Boolean" Scope="User"> + <Value Profile="(Default)">False</Value> + </Setting> + <Setting Name="GammaC" Type="System.Boolean" Scope="User"> + <Value Profile="(Default)">False</Value> + </Setting> + <Setting Name="SoundC" Type="System.Boolean" Scope="User"> + <Value Profile="(Default)">False</Value> + </Setting> + <Setting Name="VideoC" Type="System.Boolean" Scope="User"> + <Value Profile="(Default)">False</Value> + </Setting> + <Setting Name="JoystickC" Type="System.Boolean" Scope="User"> + <Value Profile="(Default)">False</Value> + </Setting> + <Setting Name="SafeModeC" Type="System.Boolean" Scope="User"> + <Value Profile="(Default)">False</Value> + </Setting> + <Setting Name="LaunchMode" Type="System.Int32" Scope="User"> + <Value Profile="(Default)">0</Value> + </Setting> + <Setting Name="GameDirPC" Type="System.String" Scope="User"> + <Value Profile="(Default)" /> + </Setting> + <Setting Name="GameDefect" Type="System.Int32" Scope="User"> + <Value Profile="(Default)">0</Value> + </Setting> + </Settings> +</SettingsFile> \ No newline at end of file diff --git a/HALOCELauncher/My Project/app.manifest b/HALOCELauncher/My Project/app.manifest new file mode 100644 index 0000000..b2aba98 --- /dev/null +++ b/HALOCELauncher/My Project/app.manifest @@ -0,0 +1,58 @@ +<?xml version="1.0" encoding="utf-8"?> +<asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> + <assemblyIdentity version="1.0.0.0" name="MyApplication.app"/> + <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2"> + <security> + <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3"> + <!-- UAC Manifest Options + If you want to change the Windows User Account Control level replace the + requestedExecutionLevel node with one of the following. + + <requestedExecutionLevel level="asInvoker" uiAccess="false" /> + <requestedExecutionLevel level="requireAdministrator" uiAccess="false" /> + <requestedExecutionLevel level="highestAvailable" uiAccess="false" /> + + Specifying requestedExecutionLevel node will disable file and registry virtualization. + If you want to utilize File and Registry Virtualization for backward + compatibility then delete the requestedExecutionLevel node. + --> + <requestedExecutionLevel level="requireAdministrator" uiAccess="false" /> + </requestedPrivileges> + </security> + </trustInfo> + + <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1"> + <application> + <!-- A list of all Windows versions that this application is designed to work with. + Windows will automatically select the most compatible environment.--> + + <!-- If your application is designed to work with Windows Vista, uncomment the following supportedOS node--> + <!--<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"></supportedOS>--> + + <!-- If your application is designed to work with Windows 7, uncomment the following supportedOS node--> + <!--<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>--> + + <!-- If your application is designed to work with Windows 8, uncomment the following supportedOS node--> + <!--<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"></supportedOS>--> + + <!-- If your application is designed to work with Windows 8.1, uncomment the following supportedOS node--> + <!--<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>--> + + </application> + </compatibility> + + <!-- Enable themes for Windows common controls and dialogs (Windows XP and later) --> + <!-- <dependency> + <dependentAssembly> + <assemblyIdentity + type="win32" + name="Microsoft.Windows.Common-Controls" + version="6.0.0.0" + processorArchitecture="*" + publicKeyToken="6595b64144ccf1df" + language="*" + /> + </dependentAssembly> + </dependency>--> + +</asmv1:assembly> diff --git a/HALOCELauncher/Resources/1790160475_preview_HaloCollectionCover.png b/HALOCELauncher/Resources/1790160475_preview_HaloCollectionCover.png new file mode 100644 index 0000000..48c85d4 Binary files /dev/null and b/HALOCELauncher/Resources/1790160475_preview_HaloCollectionCover.png differ diff --git a/HALOCELauncher/Resources/Halo Outline.ttf b/HALOCELauncher/Resources/Halo Outline.ttf new file mode 100644 index 0000000..9c04dc7 Binary files /dev/null and b/HALOCELauncher/Resources/Halo Outline.ttf differ diff --git a/HALOCELauncher/Resources/Halo.ttf b/HALOCELauncher/Resources/Halo.ttf new file mode 100644 index 0000000..a61d13a Binary files /dev/null and b/HALOCELauncher/Resources/Halo.ttf differ diff --git a/HALOCELauncher/Resources/b1.jpg b/HALOCELauncher/Resources/b1.jpg new file mode 100644 index 0000000..611a949 Binary files /dev/null and b/HALOCELauncher/Resources/b1.jpg differ diff --git a/HALOCELauncher/Resources/images.jpg b/HALOCELauncher/Resources/images.jpg new file mode 100644 index 0000000..e730258 Binary files /dev/null and b/HALOCELauncher/Resources/images.jpg differ diff --git a/HALOCELauncher/Resources/thumb-1920-900258.jpg b/HALOCELauncher/Resources/thumb-1920-900258.jpg new file mode 100644 index 0000000..1f15772 Binary files /dev/null and b/HALOCELauncher/Resources/thumb-1920-900258.jpg differ diff --git a/HALOCELauncher/image.ico b/HALOCELauncher/image.ico new file mode 100644 index 0000000..566372b Binary files /dev/null and b/HALOCELauncher/image.ico differ