diff --git a/README.md b/README.md index 54c2fa1f0..4e1a39db6 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ The latest release of Stroop can be downloaded from our [Releases Page](https:// * Windows 10 / Windows 8 / Windows 7 / Windows Vista 64-bit or 32-bit * OpenGL 3.0 or greater (requirement for map tab only) * .NET Framework 4.6 (See [.NET Framework System Requirements](https://msdn.microsoft.com/en-us/library/8z6watww(v=vs.110).aspx) for more information) - * Mupen 0.5 rerecording (0.5.1 will not work) + * [Mupen 0.5 rerecording](http://adelikat.tasvideos.org/emulatordownloads/mupen64-rr/Mupen64%20v8%20installer.zip) (0.5.1 will not work) * 64 Marios (Must be super) * Marios must be American (No PAL or JAP just yet) diff --git a/Source/SM64 Diagnostic/Config/Config.xml b/Source/SM64 Diagnostic/Config/Config.xml index 0c9d9460f..0118088e4 100644 --- a/Source/SM64 Diagnostic/Config/Config.xml +++ b/Source/SM64 Diagnostic/Config/Config.xml @@ -21,7 +21,7 @@ 0x164 0x168 0x16C - 0xC8 + 0xD4 240 300 @@ -73,6 +73,9 @@ 0x8033b21c 0x8033b218 0x8033b21a + 0x8033b260 + 0x8033b262 + 0x8033b268 2176 4 0 diff --git a/Source/SM64 Diagnostic/Config/MarioData.xml b/Source/SM64 Diagnostic/Config/MarioData.xml index 639c7d78b..d4c743671 100644 --- a/Source/SM64 Diagnostic/Config/MarioData.xml +++ b/Source/SM64 Diagnostic/Config/MarioData.xml @@ -14,15 +14,14 @@ Yaw (Facing) Yaw (Moving) Yaw (Intended) - Cannon Yaw Pitch Roll Yaw Velocity Flying Pull Back - Interaction Object - Using Object - Stood On Object - Held Object + Interaction Object + Using Object + Stood On Object + Held Object HOLP X HOLP Y HOLP Z diff --git a/Source/SM64 Diagnostic/Config/ObjectAssociations.xml b/Source/SM64 Diagnostic/Config/ObjectAssociations.xml index 700f54b68..af9a9b5dc 100644 --- a/Source/SM64 Diagnostic/Config/ObjectAssociations.xml +++ b/Source/SM64 Diagnostic/Config/ObjectAssociations.xml @@ -177,12 +177,10 @@ - Angular Velocity - + - Angular Velocity @@ -441,12 +439,16 @@ Timer Max + V Speed + Height Min Height Timer Max + V Speed + Height Min Height @@ -827,7 +829,6 @@ - Angular Velocity @@ -860,7 +861,6 @@ - Angular Velocity @@ -1246,7 +1246,7 @@ - Rev Angle + Rev Angle @@ -1435,7 +1435,7 @@ Num Coins - Target Angle + Target Angle Lunging Lunging Timer @@ -1474,10 +1474,10 @@ - + - + @@ -1511,6 +1511,7 @@ Animation Timer Walking Timer Burn Timer + Cannon Yaw Relative Height @@ -1654,7 +1655,7 @@ - Rev Angle + Rev Angle Height Timer Radius Electricity @@ -1793,7 +1794,6 @@ Rolling Timer - Angular Velocity @@ -1809,7 +1809,7 @@ Breaking Num Activators - Angular Velocity + Angular Acceleration? @@ -2047,7 +2047,6 @@ - Angular Velocity @@ -2087,37 +2086,35 @@ Act Shelled - Target Angle + Target Angle Countdown Blinking - Blinking Timer + Blinking Countdown - Act Shelled - Target Angle - Countdown + Waypoint + Target Angle Blinking - Blinking Timer + Blinking Countdown - Act Shelled - Target Angle - Countdown + Waypoint + Target Angle Blinking - Blinking Timer + Blinking Countdown Act Shelled - Target Angle + Target Angle Countdown Blinking - Blinking Timer + Blinking Countdown @@ -2145,7 +2142,7 @@ - Target Angle + Target Angle Wing Flap @@ -2333,7 +2330,7 @@ Ground/Air State Countdown - Target Angle + Target Angle @@ -2456,21 +2453,27 @@ Target Ang Vel Current Ang Vel + Angle Target Ang Vel Current Ang Vel + Angle Timer Max + V Speed + Height Timer Max Direction + V Speed + Height Min Height Max Height @@ -2479,6 +2482,7 @@ Timer Max Target Angle + Angle Displacement Direction Countdown @@ -2487,6 +2491,7 @@ Timer Max Target Angle + Angle Displacement Direction Countdown @@ -2494,6 +2499,7 @@ Timer Max Direction + Angle @@ -2521,18 +2527,17 @@ - + - + - + - Angular Velocity @@ -2635,7 +2640,7 @@ - Rev Angle + Rev Angle Size Size Countdown @@ -2696,7 +2701,7 @@ - Target Angle + Target Angle Lunging diff --git a/Source/SM64 Diagnostic/Config/ObjectData.xml b/Source/SM64 Diagnostic/Config/ObjectData.xml index e553b5a9f..9177bf69a 100644 --- a/Source/SM64 Diagnostic/Config/ObjectData.xml +++ b/Source/SM64 Diagnostic/Config/ObjectData.xml @@ -7,22 +7,26 @@ Y Speed Z Speed H Speed - Yaw (Facing) - Pitch (Facing) - Roll (Facing) - Yaw (Moving) - Pitch (Moving) - Roll (Moving) - Yaw (Rot Speed) - Pitch (Rot Speed) - Roll (Rot Speed) + Yaw (Facing) + Pitch (Facing) + Roll (Facing) + Yaw (Moving) + Pitch (Moving) + Roll (Moving) + Yaw (Rot Speed) + Pitch (Rot Speed) + Roll (Rot Speed) Dist to Mario Act. Dist to Mario Lat. Dist to Mario Angle to Mario + Act. Angle To Mario + Delta Angle To Mario + Mario Angle To Object + Delta Mario Angle To Object Drawing Dist RNG Calls/Frame - Parent Object + Parent Object Behavior Script Graphic/Model Visible diff --git a/Source/SM64 Diagnostic/Config/TrianglesData.xml b/Source/SM64 Diagnostic/Config/TrianglesData.xml index 2d62596de..00e3c1640 100644 --- a/Source/SM64 Diagnostic/Config/TrianglesData.xml +++ b/Source/SM64 Diagnostic/Config/TrianglesData.xml @@ -1,10 +1,12 @@  Classification - SurfaceType + Surface Type Flags Wind Direction - Wall Projection + Wall Projection + X Projection + Z Projection Y Min Y Max X1 @@ -30,6 +32,9 @@ Mario Y Mario Z Closest Vertex + Closest Vertex X + Closest Vertex Y + Closest Vertex Z M. Yaw (Intended) M. Yaw (Facing) Floor Triangle diff --git a/Source/SM64 Diagnostic/Controls/AngleDataContainer.cs b/Source/SM64 Diagnostic/Controls/AngleDataContainer.cs new file mode 100644 index 000000000..3b6b6e25f --- /dev/null +++ b/Source/SM64 Diagnostic/Controls/AngleDataContainer.cs @@ -0,0 +1,270 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace SM64_Diagnostic.Controls +{ + public class AngleDataContainer : IDataContainer + { + Label _nameLabel; + TableLayoutPanel _tablePanel; + TextBox _textBoxValue; + string _specialName; + + static AngleDataContainer _lastSelected; + + public enum AngleViewModeType { Signed, Unsigned, Degrees, Radians }; + + AngleViewModeType _angleViewMode = AngleViewModeType.Unsigned; + bool _angleTruncated = false; + + public AngleDataContainer(string name) + { + _specialName = name; + + this._nameLabel = new Label(); + this._nameLabel.Width = 210; + this._nameLabel.Text = name; + this._nameLabel.Margin = new Padding(3, 3, 3, 3); + + this._textBoxValue = new TextBox(); + this._textBoxValue.ReadOnly = true; + this._textBoxValue.BorderStyle = BorderStyle.None; + this._textBoxValue.TextAlign = HorizontalAlignment.Right; + this._textBoxValue.Width = 200; + this._textBoxValue.Margin = new Padding(6, 3, 6, 3); + this._textBoxValue.ContextMenuStrip = AngleMenu; + this._textBoxValue.MouseEnter += _textBoxValue_MouseEnter; + + this._tablePanel = new TableLayoutPanel(); + this._tablePanel.Size = new Size(230, _nameLabel.Height + 2); + this._tablePanel.CellBorderStyle = TableLayoutPanelCellBorderStyle.Single; + this._tablePanel.RowCount = 1; + this._tablePanel.ColumnCount = 2; + this._tablePanel.RowStyles.Clear(); + this._tablePanel.RowStyles.Add(new RowStyle(SizeType.Absolute, _nameLabel.Height + 3)); + this._tablePanel.ColumnStyles.Clear(); + this._tablePanel.Margin = new Padding(0); + this._tablePanel.Padding = new Padding(0); + this._tablePanel.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 120)); + this._tablePanel.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 110)); + this._tablePanel.Controls.Add(_nameLabel, 0, 0); + this._tablePanel.Controls.Add(this._textBoxValue, 1, 0); + + AngleMenu.ItemClicked += OnMenuStripClick; + AngleDropDownMenu[0].DropDownItemClicked += AngleDropDownMenu_DropDownItemClicked; + AngleDropDownMenu[1].Click += TruncateAngleMenu_ItemClicked; + } + + private void TruncateAngleMenu_ItemClicked(object sender, EventArgs e) + { + if (this != _lastSelected) + return; + + _angleTruncated = !_angleTruncated; + + UpdateAngleValue(); + } + + private void AngleDropDownMenu_DropDownItemClicked(object sender, ToolStripItemClickedEventArgs e) + { + if (this != _lastSelected) + return; + + switch (e.ClickedItem.Text) + { + case "Unsigned (short)": + _angleViewMode = AngleViewModeType.Unsigned; + break; + case "Signed (short)": + _angleViewMode = AngleViewModeType.Signed; + break; + case "Degrees": + _angleViewMode = AngleViewModeType.Degrees; + break; + case "Radians": + _angleViewMode = AngleViewModeType.Radians; + break; + } + + UpdateAngleValue(); + } + + private void OnMenuStripClick(object sender, ToolStripItemClickedEventArgs e) + { + if (this != _lastSelected) + return; + } + + private void _textBoxValue_MouseEnter(object sender, EventArgs e) + { + _lastSelected = this; + (AngleDropDownMenu[0].DropDownItems[0] as ToolStripMenuItem).Checked = (_angleViewMode == AngleViewModeType.Unsigned); + (AngleDropDownMenu[0].DropDownItems[1] as ToolStripMenuItem).Checked = (_angleViewMode == AngleViewModeType.Signed); + (AngleDropDownMenu[0].DropDownItems[2] as ToolStripMenuItem).Checked = (_angleViewMode == AngleViewModeType.Degrees); + (AngleDropDownMenu[0].DropDownItems[3] as ToolStripMenuItem).Checked = (_angleViewMode == AngleViewModeType.Radians); + (AngleDropDownMenu[1] as ToolStripMenuItem).Checked = _angleTruncated; + } + + public Control Control + { + get + { + return _tablePanel; + } + } + + private bool _valueExists = false; + public bool ValueExists + { + get + { + return _valueExists; + } + set + { + _valueExists = value; + UpdateAngleValue(); + } + } + + public string Name + { + get + { + return _nameLabel.Text; + } + set + { + _nameLabel.Text = value; + } + } + + public string SpecialName + { + get + { + return _specialName; + } + set + { + _specialName = value; + } + } + + private double _angleValue; + public double AngleValue + { + get + { + return _angleValue; + } + set + { + _angleValue = value % (Math.PI * 2); + if (_angleValue < 0) + _angleValue += Math.PI * 2; + UpdateAngleValue(); + } + } + + public Color Color + { + get + { + return Control.BackColor; + } + set + { + Control.BackColor = value; + _textBoxValue.BackColor = Color; + } + } + + private static ContextMenuStrip _angleMenu; + public static ContextMenuStrip AngleMenu + { + get + { + if (_angleMenu == null) + { + _angleMenu = new ContextMenuStrip(); + //_angleMenu.Items.Add("Edit"); + //var newItem = new ToolStripMenuItem("View As Hexadecimal"); + //newItem.Name = "HexView"; + //_angleMenu.Items.Add(newItem); + //newItem = new ToolStripMenuItem("Lock Value"); + //newItem.Name = "LockValue"; + //_angleMenu.Items.Add(newItem); + + _angleMenu.Items.Add(AngleDropDownMenu[0]); + _angleMenu.Items.Add(AngleDropDownMenu[1]); + } + return _angleMenu; + } + } + + private static ToolStripMenuItem[] _angleMenuDropDown; + public static ToolStripMenuItem[] AngleDropDownMenu + { + get + { + if (_angleMenuDropDown == null) + { + _angleMenuDropDown = new ToolStripMenuItem[2]; + _angleMenuDropDown[0] = new ToolStripMenuItem("View Angle As"); + _angleMenuDropDown[0].DropDownItems.Add("Unsigned (short)"); + _angleMenuDropDown[0].DropDownItems.Add("Signed (short)"); + _angleMenuDropDown[0].DropDownItems.Add("Degrees"); + _angleMenuDropDown[0].DropDownItems.Add("Radians"); + _angleMenuDropDown[1] = new ToolStripMenuItem("Truncate Angle (by 16)"); + } + return _angleMenuDropDown; + } + } + + public void UpdateAngleValue() + { + if (!ValueExists) + { + _textBoxValue.Text = "(none)"; + return; + } + + var angleValue = _angleValue; + + if (_angleTruncated) + { + double roundFactor = 65536 / (Math.PI * 2) / 16; + angleValue = Math.Floor(_angleValue * roundFactor) / roundFactor; + } + + switch (_angleViewMode) + { + case AngleViewModeType.Degrees: + _textBoxValue.Text = (angleValue / (Math.PI * 2) * 360).ToString(); + break; + + case AngleViewModeType.Radians: + _textBoxValue.Text = angleValue.ToString(); + break; + + case AngleViewModeType.Signed: + _textBoxValue.Text = ((short)(angleValue / (Math.PI * 2) * 65536)).ToString(); + break; + + case AngleViewModeType.Unsigned: + _textBoxValue.Text = ((ushort)(angleValue / (Math.PI * 2) * 65536)).ToString(); + break; + } + } + + public void Update() + { + } + } +} diff --git a/Source/SM64 Diagnostic/Controls/IDataContainer.cs b/Source/SM64 Diagnostic/Controls/IDataContainer.cs index cf8f9ba1e..3aa090c28 100644 --- a/Source/SM64 Diagnostic/Controls/IDataContainer.cs +++ b/Source/SM64 Diagnostic/Controls/IDataContainer.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; @@ -24,6 +25,10 @@ Control Control get; } + Color Color + { + set; + } void Update(); } diff --git a/Source/SM64 Diagnostic/Controls/Map/TriangleMapObject.cs b/Source/SM64 Diagnostic/Controls/Map/TriangleMapObject.cs index 1d44d1e07..c9e2fbe0e 100644 --- a/Source/SM64 Diagnostic/Controls/Map/TriangleMapObject.cs +++ b/Source/SM64 Diagnostic/Controls/Map/TriangleMapObject.cs @@ -34,7 +34,7 @@ public override void DrawOnControl(MapGraphics graphics) GL.MatrixMode(MatrixMode.Modelview); GL.LoadIdentity(); GL.Color4(Color); - GL.Begin(BeginMode.Triangles); + GL.Begin(PrimitiveType.Triangles); GL.Vertex2(P1OnControl.X, P1OnControl.Y); GL.Vertex2(P2OnControl.X, P2OnControl.Y); GL.Vertex2(P3OnControl.X, P3OnControl.Y); diff --git a/Source/SM64 Diagnostic/Controls/NoTearFlowLayoutContainer.cs b/Source/SM64 Diagnostic/Controls/NoTearFlowLayoutContainer.cs new file mode 100644 index 000000000..712985344 --- /dev/null +++ b/Source/SM64 Diagnostic/Controls/NoTearFlowLayoutContainer.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace SM64_Diagnostic.Controls +{ + public class NoTearFlowLayoutPanel : FlowLayoutPanel + { + protected override CreateParams CreateParams + { + get + { + CreateParams cp = base.CreateParams; + cp.ExStyle |= 0x02000000; // Turn on WS_EX_COMPOSITED + return cp; + } + } + } +} diff --git a/Source/SM64 Diagnostic/Controls/ObjectSlot.cs b/Source/SM64 Diagnostic/Controls/ObjectSlot.cs index e04200b42..8070bae82 100644 --- a/Source/SM64 Diagnostic/Controls/ObjectSlot.cs +++ b/Source/SM64 Diagnostic/Controls/ObjectSlot.cs @@ -5,7 +5,7 @@ using System.Threading.Tasks; using System.Windows.Forms; using System.Drawing; -using SM64_Diagnostic.ManagerClasses; +using SM64_Diagnostic.Managers; using SM64_Diagnostic.Utilities; using SM64_Diagnostic.Structs; using SM64_Diagnostic.Controls; @@ -224,14 +224,10 @@ public ObjectSlot(int index, ObjectSlotsManager manager, ObjectSlotManagerGui gu Size = size; Font = new Font(FontFamily.GenericSansSerif, 6); - this.AllowDrop = true; this.MouseDown += OnDrag; this.MouseUp += (s, e) => { MouseState = MouseStateType.None; UpdateColors(); }; this.MouseEnter += (s, e) => { MouseState = MouseStateType.Over; UpdateColors(); }; this.MouseLeave += (s, e) => { MouseState = MouseStateType.None; UpdateColors(); }; - - this.DragEnter += OnDragEnter; - this.DragDrop += OnDrop; this.Cursor = Cursors.Hand; this.DoubleBuffered = true; } @@ -319,48 +315,10 @@ void UpdateColors() private void OnDrag(object sender, MouseEventArgs e) { - OnClick(new EventArgs()); - MouseState = MouseStateType.Down; UpdateColors(); Refresh(); - - // Start the drag and drop but setting the object slot index in Drag and Drop data - var objectAddress = Address; - var dropAction = new DropAction(DropAction.ActionType.Object, objectAddress); - DoDragDrop(dropAction, DragDropEffects.All); } - - private void OnDragEnter(object sender, DragEventArgs e) - { - - // Make sure we have valid Drag and Drop data (it is an index) - if (!e.Data.GetDataPresent(typeof(DropAction))) - { - e.Effect = DragDropEffects.None; - return; - } - - var dropAction = ((DropAction) e.Data.GetData(typeof(DropAction))).Action; - if (dropAction != DropAction.ActionType.Object && dropAction != DropAction.ActionType.Mario) - { - e.Effect = DragDropEffects.None; - return; - } - - e.Effect = DragDropEffects.Move; - } - - private void OnDrop(object sender, DragEventArgs e) - { - // Make sure we have valid Drag and Drop data (it is an index) - if (!e.Data.GetDataPresent(typeof(DropAction))) - return; - - var dropAction = ((DropAction)e.Data.GetData(typeof(DropAction))); - _manager.OnSlotDropAction(dropAction, this); - } - protected override void OnPaint(PaintEventArgs e) { lock (_gfxLock) diff --git a/Source/SM64 Diagnostic/Controls/WatchVariableControl.cs b/Source/SM64 Diagnostic/Controls/WatchVariableControl.cs index db16ad8c5..c3c3b0039 100644 --- a/Source/SM64 Diagnostic/Controls/WatchVariableControl.cs +++ b/Source/SM64 Diagnostic/Controls/WatchVariableControl.cs @@ -9,6 +9,7 @@ using SM64_Diagnostic.Structs; using SM64_Diagnostic.Extensions; using System.Reflection; +using SM64_Diagnostic.Managers; namespace SM64_Diagnostic.Controls { @@ -22,11 +23,12 @@ public class WatchVariableControl : IDataContainer ProcessStream _stream; string _specialName; - public uint OtherOffset; + public List OtherOffsets = new List() { 0 }; bool _changedByUser = true; bool _editMode = false; static Image _lockedImage = new Bitmap(Image.FromStream(Assembly.GetExecutingAssembly().GetManifestResourceStream("SM64_Diagnostic.Resources.lock.png")), new Size(16, 16)); + static Image _someLockedImage = _lockedImage.GetOpaqueImage(0.5f); static WatchVariableControl _lastSelected; @@ -35,7 +37,6 @@ public enum AngleViewModeType { Recommended, Signed, Unsigned, Degrees, Radians AngleViewModeType _angleViewMode = AngleViewModeType.Recommended; Boolean _angleTruncated = false; - private static ContextMenuStrip _menu; public static ContextMenuStrip Menu { @@ -99,6 +100,20 @@ public static ToolStripMenuItem[] AngleDropDownMenu } } + private static List _objectDropDownMenu; + public static List ObjectDropDownMenu + { + get + { + if (_objectDropDownMenu == null) + { + _objectDropDownMenu = new List(); + _objectDropDownMenu.Add(new ToolStripMenuItem("Select Object")); + } + return _objectDropDownMenu; + } + } + static ToolTip _toolTip; public static ToolTip AddressToolTip { @@ -192,29 +207,31 @@ public WatchVariable WatchVariable } } - bool _lastLocked = false; - private bool ShowLockedImage + Image _lastLockedImage = null; + private void ShowLockedImage(bool show, bool transparent = false) { - get - { - return _lastLocked; - } - set - { - if (_lastLocked == value) - return; + Image nextImage = null; + if (show) + nextImage = transparent ? _someLockedImage : _lockedImage; - _lastLocked = value; - _nameLabel.Image = _lastLocked ? _lockedImage : null; - } + if (_lastLockedImage == nextImage) + return; + + _lastLockedImage = nextImage; + _nameLabel.Image = nextImage; } public WatchVariableControl(ProcessStream stream, WatchVariable watchVar, uint otherOffset = 0) + : this(stream, watchVar, new List() { otherOffset }) + { + } + + public WatchVariableControl(ProcessStream stream, WatchVariable watchVar, List otherOffset) { _specialName = watchVar.Name; _watchVar = watchVar; _stream = stream; - OtherOffset = otherOffset; + OtherOffsets = otherOffset; CreateControls(); @@ -222,9 +239,9 @@ public WatchVariableControl(ProcessStream stream, WatchVariable watchVar, uint o Color = watchVar.BackroundColor.Value; } - public WatchVariableLock GetVariableLock() + public WatchVariableLock GetVariableLock(uint offset) { - var lockCriteria = new WatchVariableLock(_stream, _watchVar.GetRamAddress(_stream, OtherOffset, false), new byte[_watchVar.GetByteCount()]); + var lockCriteria = new WatchVariableLock(_stream, _watchVar.GetRamAddress(_stream, offset, false), new byte[_watchVar.ByteCount]); if (!_stream.LockedVariables.ContainsKey(lockCriteria)) return null; @@ -250,8 +267,8 @@ private void CreateControls() else { AddressToolTip.SetToolTip(this._nameLabel, String.Format("0x{1:X8} + 0x{0:X8} = 0x{2:X8} [{4} + 0x{3:X8}]", - _watchVar.GetRamAddress(_stream, 0, false), OtherOffset, _watchVar.GetRamAddress(_stream, OtherOffset), - _watchVar.GetProcessAddress(_stream, OtherOffset), _stream.ProcessName)); + _watchVar.GetRamAddress(_stream, 0, false), OtherOffsets[0], _watchVar.GetRamAddress(_stream, OtherOffsets[0]), + _watchVar.GetProcessAddress(_stream, OtherOffsets[0]), _stream.ProcessName)); } }; @@ -259,7 +276,7 @@ private void CreateControls() { this._checkBoxBool = new CheckBox(); this._checkBoxBool.CheckAlign = ContentAlignment.MiddleRight; - this._checkBoxBool.CheckedChanged += OnModified; + this._checkBoxBool.CheckedChanged += OnEdited; } else { @@ -269,7 +286,7 @@ private void CreateControls() this._textBoxValue.TextAlign = HorizontalAlignment.Right; this._textBoxValue.Width = 200; this._textBoxValue.Margin = new Padding(6, 3, 6, 3); - this._textBoxValue.TextChanged += OnModified; + this._textBoxValue.TextChanged += OnEdited; this._textBoxValue.ContextMenuStrip = _watchVar.IsAngle ? WatchVariableControl.AngleMenu : WatchVariableControl.Menu; this._textBoxValue.KeyDown += OnTextValueKeyDown; this._textBoxValue.MouseEnter += _textBoxValue_MouseEnter; @@ -304,10 +321,10 @@ private void CreateControls() private void _nameLabel_Click(object sender, EventArgs e) { VariableViewerForm varInfo; - var typeDescr = _watchVar.GetTypeString(); + var typeDescr = _watchVar.TypeName; if (_watchVar.Mask.HasValue) { - typeDescr += String.Format(" w/ mask: 0x{0:X" + _watchVar.GetByteCount() * 2 + "}", _watchVar.Mask); + typeDescr += String.Format(" w/ mask: 0x{0:X" + _watchVar.ByteCount * 2 + "}", _watchVar.Mask); } if (!_watchVar.OtherOffset) @@ -319,8 +336,8 @@ private void _nameLabel_Click(object sender, EventArgs e) else { varInfo = new VariableViewerForm(_watchVar.Name, typeDescr, - String.Format("0x{0:X8}", _watchVar.GetRamAddress(_stream, OtherOffset)), - String.Format("0x{0:X8}", _watchVar.GetProcessAddress(_stream, OtherOffset))); + String.Format("0x{0:X8}", _watchVar.GetRamAddress(_stream, OtherOffsets[0])), + String.Format("0x{0:X8}", _watchVar.GetProcessAddress(_stream, OtherOffsets[0]))); } varInfo.ShowDialog(); } @@ -335,11 +352,24 @@ private void _textBoxValue_DoubleClick(object sender, EventArgs e) private void _textBoxValue_MouseEnter(object sender, EventArgs e) { + var lockedStatus = CheckState.Unchecked; + if (OtherOffsets.Any(o => GetIsLocked(o))) + { + if (OtherOffsets.All(o => GetIsLocked(o))) + { + lockedStatus = CheckState.Checked; + } + else + { + lockedStatus = CheckState.Indeterminate; + } + } + _lastSelected = this; if (_watchVar.IsAngle) { (AngleMenu.Items["HexView"] as ToolStripMenuItem).Checked = _watchVar.UseHex; - (AngleMenu.Items["LockValue"] as ToolStripMenuItem).Checked = GetIsLocked(); + (AngleMenu.Items["LockValue"] as ToolStripMenuItem).CheckState = lockedStatus; (AngleDropDownMenu[0].DropDownItems[0] as ToolStripMenuItem).Checked = (_angleViewMode == AngleViewModeType.Recommended); (AngleDropDownMenu[0].DropDownItems[1] as ToolStripMenuItem).Checked = (_angleViewMode == AngleViewModeType.Unsigned); (AngleDropDownMenu[0].DropDownItems[2] as ToolStripMenuItem).Checked = (_angleViewMode == AngleViewModeType.Signed); @@ -350,7 +380,12 @@ private void _textBoxValue_MouseEnter(object sender, EventArgs e) else { (Menu.Items["HexView"] as ToolStripMenuItem).Checked = _watchVar.UseHex; - (Menu.Items["LockValue"] as ToolStripMenuItem).Checked = GetIsLocked(); + (Menu.Items["HexView"] as ToolStripMenuItem).CheckState = lockedStatus; + ObjectDropDownMenu.ForEach(d => Menu.Items.Remove(d)); + if (_watchVar.IsObject) + { + ObjectDropDownMenu.ForEach(d => Menu.Items.Add(d)); + } } } @@ -392,7 +427,7 @@ public void Update() if (_watchVar.Special) return; - ShowLockedImage = GetIsLocked(); + ShowLockedImage(OtherOffsets.Any(o => GetIsLocked(o)), !OtherOffsets.All(o => GetIsLocked(o))); if (_editMode) return; @@ -401,28 +436,65 @@ public void Update() if (_watchVar.IsBool) { - _checkBoxBool.Checked = _watchVar.GetBoolValue(_stream, OtherOffset); - } - else if (_watchVar.IsAngle) - { - _textBoxValue.Text = _watchVar.GetAngleStringValue(_stream, OtherOffset, _angleViewMode, _angleTruncated); + if (OtherOffsets.Any(o => _watchVar.GetBoolValue(_stream, o))) + { + if (OtherOffsets.All(o => _watchVar.GetBoolValue(_stream, o))) + { + _checkBoxBool.CheckState = CheckState.Checked; + } + else + { + _checkBoxBool.CheckState = CheckState.Indeterminate; + } + } + else + { + _checkBoxBool.CheckState = CheckState.Unchecked; + } } else { - _textBoxValue.Text = _watchVar.GetStringValue(_stream, OtherOffset); + bool firstOffset = true; + foreach (var offset in OtherOffsets) + { + string newText = ""; + if (_watchVar.IsAngle) + { + newText = _watchVar.GetAngleStringValue(_stream, offset, _angleViewMode, _angleTruncated); + } + else + { + newText = _watchVar.GetStringValue(_stream, offset); + } + + if (firstOffset) + { + _textBoxValue.Text = newText; + } + else if (_textBoxValue.Text != newText) + { + _textBoxValue.Text = ""; + continue; + } + + firstOffset = false; + } } _changedByUser = true; } - private void OnModified(object sender, EventArgs e) + private void OnEdited(object sender, EventArgs e) { if (!_changedByUser) return; if (_watchVar.IsBool) { - _watchVar.SetBoolValue(_stream, OtherOffset, _checkBoxBool.Checked); + foreach (var offset in OtherOffsets) + { + _watchVar.SetBoolValue(_stream, offset, _checkBoxBool.Checked); + } } } @@ -446,13 +518,26 @@ private void OnMenuStripClick(object sender, ToolStripItemClickedEventArgs e) _textBoxValue.ReadOnly = true; _editMode = false; (e.ClickedItem as ToolStripMenuItem).Checked = !(e.ClickedItem as ToolStripMenuItem).Checked; - if (GetIsLocked()) + if (OtherOffsets.Any(o => GetIsLocked(o))) { - RemoveLock(); + OtherOffsets.ForEach(o => RemoveLock(o)); } else { - LockUpdate(); + OtherOffsets.ForEach(o => LockUpdate(o)); + } + break; + case "Select Object": + if (_watchVar.ByteCount != 4) + return; + + var slotManager = ManagerContext.Current.ObjectSlotManager; + slotManager.SelectedSlotsAddresses.Clear(); + foreach (var otherOffset in OtherOffsets) + { + var objAddress = BitConverter.ToUInt32(_watchVar.GetByteData(_stream, otherOffset), 0); + if (ManagerContext.Current.ObjectSlotManager.ObjectSlots.Count(s => s.Address == objAddress) > 0) + slotManager.SelectedSlotsAddresses.Add(objAddress); } break; } @@ -472,41 +557,44 @@ private void OnTextValueKeyDown(object sender, KeyEventArgs e) // Write new value to RAM byte[] writeBytes; - if (_watchVar.IsAngle) - { - writeBytes = _watchVar.GetBytesFromAngleString(_stream, OtherOffset, _textBoxValue.Text, _angleViewMode); - } - else + foreach (var offset in OtherOffsets) { - writeBytes = _watchVar.GetBytesFromString(_stream, OtherOffset, _textBoxValue.Text); - } - _watchVar.SetBytes(_stream, OtherOffset, writeBytes); + if (_watchVar.IsAngle) + { + writeBytes = _watchVar.GetBytesFromAngleString(_stream, _textBoxValue.Text, _angleViewMode); + } + else + { + writeBytes = _watchVar.GetBytesFromString(_stream, offset, _textBoxValue.Text); + } + _watchVar.SetBytes(_stream, offset, writeBytes); - // Update locked value - if (GetIsLocked()) - LockUpdate(writeBytes); + // Update locked value + if (GetIsLocked(offset)) + LockUpdate(offset, writeBytes); + } _stream.Resume(); } - public bool GetIsLocked() + public bool GetIsLocked(uint offset) { - return GetVariableLock() != null; + return GetVariableLock(offset) != null; } - private void RemoveLock() + private void RemoveLock(uint offset) { - var lockedVar = GetVariableLock(); + var lockedVar = GetVariableLock(offset); if (lockedVar != null) _stream.LockedVariables.Remove(lockedVar); } - private void LockUpdate(byte[] lockedBytes = null) + private void LockUpdate(uint offset, byte[] lockedBytes = null) { if (lockedBytes == null) - lockedBytes = _watchVar.GetByteData(_stream, OtherOffset); + lockedBytes = _watchVar.GetByteData(_stream, offset); - var lockedVar = new WatchVariableLock(_stream, _watchVar.GetRamAddress(_stream, OtherOffset, false), lockedBytes); + var lockedVar = new WatchVariableLock(_stream, _watchVar.GetRamAddress(_stream, offset, false), lockedBytes); _stream.LockedVariables[lockedVar] = lockedVar; } } diff --git a/Source/SM64 Diagnostic/Extensions/IEnumerableExtensions.cs b/Source/SM64 Diagnostic/Extensions/IEnumerableExtensions.cs new file mode 100644 index 000000000..edeb04449 --- /dev/null +++ b/Source/SM64 Diagnostic/Extensions/IEnumerableExtensions.cs @@ -0,0 +1,36 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SM64_Diagnostic.Extensions +{ + public static class IEnumerableExtensions + { + public static int IndexOfMin(this IEnumerable source) where T : IComparable + { + if (source == null) + throw new ArgumentNullException("source"); + + var enumer = source.GetEnumerator(); + + if (!enumer.MoveNext()) + throw new InvalidOperationException("Sequence was empty"); + + T minValue = enumer.Current; + int minIndex = 0; + + for (int index = 1; enumer.MoveNext(); index++) + { + if (enumer.Current.CompareTo(minValue) < 0) + { + minValue = enumer.Current; + minIndex = index; + } + } + + return minIndex; + } + } +} diff --git a/Source/SM64 Diagnostic/Extensions/WatchVariableExtensions.cs b/Source/SM64 Diagnostic/Extensions/WatchVariableExtensions.cs index f6ca06ad3..6312916ea 100644 --- a/Source/SM64 Diagnostic/Extensions/WatchVariableExtensions.cs +++ b/Source/SM64 Diagnostic/Extensions/WatchVariableExtensions.cs @@ -7,6 +7,7 @@ using System.Threading.Tasks; using SM64_Diagnostic.ManagerClasses; using SM64_Diagnostic.Controls; +using SM64_Diagnostic.Managers; namespace SM64_Diagnostic.Extensions { @@ -20,7 +21,7 @@ public static uint GetRamAddress(this WatchVariable watchVar, ProcessStream stre if (watchVar.AbsoluteAddressing) address = LittleEndianessAddressing.AddressFix((uint)(offsetedAddress - stream.ProcessMemoryOffset), - watchVar.GetByteCount()); + watchVar.ByteCount); else address = offsetedAddress; @@ -31,15 +32,14 @@ public static uint GetProcessAddress(this WatchVariable watchVar, ProcessStream { uint address = GetRamAddress(watchVar, stream, offset, false); return (uint)LittleEndianessAddressing.AddressFix( - (int)(address + stream.ProcessMemoryOffset), watchVar.GetByteCount()); + (int)(address + stream.ProcessMemoryOffset), watchVar.ByteCount); } public static byte[] GetByteData(this WatchVariable watchVar, ProcessStream stream, uint offset) { // Get dataBytes - var byteCount = WatchVariable.TypeSize[watchVar.Type]; var dataBytes = stream.ReadRam(watchVar.OtherOffset ? offset + watchVar.Address - : watchVar.Address, byteCount, watchVar.AbsoluteAddressing); + : watchVar.Address, watchVar.ByteCount, watchVar.AbsoluteAddressing); // Make sure offset is a valid pointer if (watchVar.OtherOffset && offset == 0) @@ -51,14 +51,24 @@ public static byte[] GetByteData(this WatchVariable watchVar, ProcessStream stre public static string GetStringValue(this WatchVariable watchVar, ProcessStream stream, uint offset) { // Get dataBytes - var byteCount = WatchVariable.TypeSize[watchVar.Type]; - var dataBytes = stream.ReadRam(watchVar.OtherOffset ? offset + watchVar.Address - : watchVar.Address, byteCount, watchVar.AbsoluteAddressing); + var dataBytes = watchVar.GetByteData(stream, offset); // Make sure offset is a valid pointer - if (watchVar.OtherOffset && offset == 0) + if (dataBytes == null) return "(none)"; + // Parse object type + if (watchVar.IsObject) + { + var objAddress = BitConverter.ToUInt32(dataBytes, 0); + if (objAddress == 0) + return "(none)"; + + var slotName = ManagerContext.Current.ObjectSlotManager.GetSlotNameFromAddress(objAddress); + if (slotName != null) + return "Slot: " + slotName; + } + // Parse floating point if (!watchVar.UseHex && (watchVar.Type == typeof(float) || watchVar.Type == typeof(double))) { @@ -84,7 +94,7 @@ public static string GetStringValue(this WatchVariable watchVar, ProcessStream s // Print hex if (watchVar.UseHex) - return "0x" + dataValue.ToString("X" + byteCount * 2); + return "0x" + dataValue.ToString("X" + watchVar.ByteCount * 2); // Print signed if (watchVar.Type == typeof(Int64)) @@ -99,7 +109,7 @@ public static string GetStringValue(this WatchVariable watchVar, ProcessStream s return dataValue.ToString(); } - public static byte[] GetBytesFromAngleString(this WatchVariable watchVar, ProcessStream stream, uint offset, string value, WatchVariableControl.AngleViewModeType viewMode) + public static byte[] GetBytesFromAngleString(this WatchVariable watchVar, ProcessStream stream, string value, WatchVariableControl.AngleViewModeType viewMode) { if (watchVar.Type != typeof(UInt32) && watchVar.Type != typeof(UInt16) && watchVar.Type != typeof(Int32) && watchVar.Type != typeof(Int16)) @@ -143,22 +153,20 @@ public static byte[] GetBytesFromAngleString(this WatchVariable watchVar, Proces } } - var byteCount = WatchVariable.TypeSize[watchVar.Type]; - return BitConverter.GetBytes(writeValue).Take(byteCount).ToArray(); + return BitConverter.GetBytes(writeValue).Take(watchVar.ByteCount).ToArray(); } public static bool SetAngleStringValue(this WatchVariable watchVar, ProcessStream stream, uint offset, string value, WatchVariableControl.AngleViewModeType viewMode) { - var dataBytes = watchVar.GetBytesFromAngleString(stream, offset, value, viewMode); + var dataBytes = watchVar.GetBytesFromAngleString(stream, value, viewMode); return watchVar.SetBytes(stream, offset, dataBytes); } public static string GetAngleStringValue(this WatchVariable watchVar, ProcessStream stream, uint offset, WatchVariableControl.AngleViewModeType viewMode, bool truncated = false) { // Get dataBytes - var byteCount = WatchVariable.TypeSize[watchVar.Type]; var dataBytes = stream.ReadRam(watchVar.OtherOffset ? offset + watchVar.Address - : watchVar.Address, byteCount, watchVar.AbsoluteAddressing); + : watchVar.Address, watchVar.ByteCount, watchVar.AbsoluteAddressing); // Make sure offset is a valid pointer if (watchVar.OtherOffset && offset == 0) @@ -184,7 +192,7 @@ public static string GetAngleStringValue(this WatchVariable watchVar, ProcessStr // Print hex if (watchVar.UseHex) { - if (viewMode == WatchVariableControl.AngleViewModeType.Recommended && WatchVariable.TypeSize[watchVar.Type] == 4) + if (viewMode == WatchVariableControl.AngleViewModeType.Recommended && watchVar.ByteCount == 4) return "0x" + dataValue.ToString("X8"); else return "0x" + ((UInt16)dataValue).ToString("X4"); @@ -221,9 +229,8 @@ public static string GetAngleStringValue(this WatchVariable watchVar, ProcessStr public static bool GetBoolValue(this WatchVariable watchVar, ProcessStream stream, uint offset) { // Get dataBytes - var byteCount = WatchVariable.TypeSize[watchVar.Type]; var dataBytes = stream.ReadRam(watchVar.OtherOffset ? offset + watchVar.Address - : watchVar.Address, byteCount, watchVar.AbsoluteAddressing); + : watchVar.Address, watchVar.ByteCount, watchVar.AbsoluteAddressing); // Get Uint64 value var intBytes = new byte[8]; @@ -244,9 +251,8 @@ public static bool GetBoolValue(this WatchVariable watchVar, ProcessStream strea public static void SetBoolValue(this WatchVariable watchVar, ProcessStream stream, uint offset, bool value) { // Get dataBytes - var byteCount = WatchVariable.TypeSize[watchVar.Type]; var address = watchVar.OtherOffset ? offset + watchVar.Address : watchVar.Address; - var dataBytes = stream.ReadRam(address, byteCount, watchVar.AbsoluteAddressing); + var dataBytes = stream.ReadRam(address, watchVar.ByteCount, watchVar.AbsoluteAddressing); if (watchVar.InvertBool) value = !value; @@ -269,9 +275,9 @@ public static void SetBoolValue(this WatchVariable watchVar, ProcessStream strea dataValue = value ? 1U : 0U; } - var writeBytes = new byte[byteCount]; + var writeBytes = new byte[watchVar.ByteCount]; var valueBytes = BitConverter.GetBytes(dataValue); - Array.Copy(valueBytes, 0, writeBytes, 0, byteCount); + Array.Copy(valueBytes, 0, writeBytes, 0, watchVar.ByteCount); stream.WriteRam(writeBytes, address, watchVar.AbsoluteAddressing); } @@ -279,13 +285,20 @@ public static void SetBoolValue(this WatchVariable watchVar, ProcessStream strea public static byte[] GetBytesFromString(this WatchVariable watchVar, ProcessStream stream, uint offset, string value) { // Get dataBytes - var byteCount = WatchVariable.TypeSize[watchVar.Type]; var address = watchVar.OtherOffset ? offset + watchVar.Address : watchVar.Address; var dataBytes = new byte[8]; - stream.ReadRam(address, byteCount, watchVar.AbsoluteAddressing).CopyTo(dataBytes, 0); + stream.ReadRam(address, watchVar.ByteCount, watchVar.AbsoluteAddressing).CopyTo(dataBytes, 0); UInt64 oldValue = BitConverter.ToUInt64(dataBytes, 0); UInt64 newValue; + + // Handle object values + uint? objectAddress; + if (watchVar.IsObject && (objectAddress = ManagerContext.Current.ObjectSlotManager.GetSlotAddressFromName(value)).HasValue) + { + newValue = objectAddress.Value; + } + else // Handle hex variable if (ParsingUtilities.IsHex(value)) { @@ -334,9 +347,9 @@ public static byte[] GetBytesFromString(this WatchVariable watchVar, ProcessStre if (watchVar.Mask.HasValue) newValue = (newValue & watchVar.Mask.Value) | ((~watchVar.Mask.Value) & oldValue); - var writeBytes = new byte[byteCount]; + var writeBytes = new byte[watchVar.ByteCount]; var valueBytes = BitConverter.GetBytes(newValue); - Array.Copy(valueBytes, 0, writeBytes, 0, byteCount); + Array.Copy(valueBytes, 0, writeBytes, 0, watchVar.ByteCount); return writeBytes; } @@ -355,20 +368,5 @@ public static bool SetBytes(this WatchVariable watchVar, ProcessStream stream, u return stream.WriteRam(dataBytes, watchVar.OtherOffset ? offset + watchVar.Address : watchVar.Address, watchVar.AbsoluteAddressing); } - - public static int GetByteCount(this WatchVariable watchVar) - { - return WatchVariable.TypeSize[watchVar.Type]; - } - - public static Type GetStringType(string str) - { - return WatchVariable.StringToType[str]; - } - - public static string GetTypeString(this WatchVariable watchVar) - { - return WatchVariable.StringToType.First(t => t.Value == watchVar.Type).Key; - } } } diff --git a/Source/SM64 Diagnostic/LoadingForm.Designer.cs b/Source/SM64 Diagnostic/LoadingForm.Designer.cs index 5f5393d92..6f9805560 100644 --- a/Source/SM64 Diagnostic/LoadingForm.Designer.cs +++ b/Source/SM64 Diagnostic/LoadingForm.Designer.cs @@ -28,6 +28,7 @@ protected override void Dispose(bool disposing) /// private void InitializeComponent() { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(LoadingForm)); this.progressBarLoading = new System.Windows.Forms.ProgressBar(); this.labelLoading = new System.Windows.Forms.Label(); this.labelLoadingStatus = new System.Windows.Forms.Label(); @@ -93,6 +94,7 @@ private void InitializeComponent() this.ClientSize = new System.Drawing.Size(671, 256); this.Controls.Add(this.tableLayoutPanel1); this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); this.Name = "LoadingForm"; this.Text = "LoadingForm"; this.Load += new System.EventHandler(this.LoadingForm_Load); diff --git a/Source/SM64 Diagnostic/LoadingForm.resx b/Source/SM64 Diagnostic/LoadingForm.resx index 1af7de150..2265dfb1f 100644 --- a/Source/SM64 Diagnostic/LoadingForm.resx +++ b/Source/SM64 Diagnostic/LoadingForm.resx @@ -117,4 +117,1671 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + AAABAAUAEBAAAAAAIABoBAAAVgAAACAgAAAAACAAqBAAAL4EAAAwMAAAAAAgAKglAABmFQAAQEAAAAAA + IAAoQgAADjsAAICAAAAAACAAKAgBADZ9AAAoAAAAEAAAACAAAAABACAAAAAAAEAEAAAAAAAAAAAAAAAA + AAAAAAAA////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAAFQAAAEsAAABtAAAAfQAAAH0AAABtAAAASwAA + ABP///8B////Af///wH///8B////Af///wEAAAAlAAAAswAAAPEAAAC7AAAAlQAAAIMAAACDAAAAlQAA + ALsAAADxAAAAswAAACX///8B////Af///wH///8BAAAA3QAAAHcAAAAhAAAATwAAAHEAAABBAAAAawAA + ADUAAABPAAAAIQAAAHcAAADd////Af///wH///8B////AQAAAN0AAADFAAAA9QAAAMEAAACZAAAARQAA + AP8AAABRAAAAwQAAAPUAAADFAAAA2////wH///8B////Af///wEAAADhAAAAfQAAACMAAABN////Af// + /wEAAAD/AAAANQAAAE8AAAAjAAAAfQAAAOH///8B////Af///wH///8BAAAA3wAAAMcAAAD1AAAAwQAA + AHUAAAB1AAAA/wAAAFEAAADBAAAA9QAAAMcAAADf////Af///wH///8B////AQAAAOEAAAB9AAAAIwAA + AE0AAAB/AAAAfwAAAP8AAAA1AAAATwAAACMAAAB9AAAA4f///wH///8B////Af///wEAAADfAAAAxwAA + APUAAAC9AAAAjwAAAIsAAAD/AAAAZwAAAMEAAAD1AAAAxwAAAN////8B////Af///wH///8BAAAA4QAA + AH0AAAANAAAAiwAAAPkAAAD/AAAA/wAAAOkAAACLAAAADQAAAH0AAADh////Af///wH///8B////AQAA + AOEAAAB9AAAADQAAAIsAAADfAAAA/QAAAP0AAADfAAAAiwAAAA0AAAB9AAAA4f///wH///8B////Af// + /wEAAAApAAAAuQAAAPUAAADBAAAAmQAAAIkAAACJAAAAmQAAAMEAAAD1AAAAuQAAACn///8B////Af// + /wH///8B////Af///wEAAAAXAAAATwAAAHEAAAB/AAAAfwAAAHEAAABPAAAAF////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA + //8AAP//AAD//wAA//8oAAAAIAAAAEAAAAABACAAAAAAAIAQAAAAAAAAAAAAAAAAAAAAAAAA////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAACQAAAEUAAAB9AAAAqQAAAM0AAADlAAAA8wAAAP8AAAD/AAAA9QAAAOcAAADNAAAAqwAA + AH0AAABFAAAACf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAALwAAAKEAAADzAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAADzAAAAoQAAADH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAAAwAAAIsAAAD9AAAA/wAAAP8AAADRAAAAkQAAAF8AAAA5AAAAGwAAAAv///8B////AQAA + AAkAAAAbAAAAOQAAAF8AAACRAAAA0QAAAP8AAAD/AAAA/QAAAIsAAAAD////Af///wH///8B////Af// + /wH///8B////Af///wEAAACFAAAA/wAAAPsAAACXAAAAJf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAAJwAAAJMAAAD7AAAA/wAAAIX///8B////Af// + /wH///8B////Af///wH///8B////AQAAAO8AAAD/AAAASf///wEAAAANAAAATQAAAIUAAACxAAAA1QAA + AOsAAAD/////AQAAANUAAADV////AQAAANMAAACxAAAAhQAAAE0AAAAN////AQAAAEkAAAD/AAAA7/// + /wH///8B////Af///wH///8B////Af///wH///8BAAAA7wAAAP8AAABvAAAAqwAAAPcAAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP////8BAAAA/wAAAP////8BAAAA/wAAAP8AAAD/AAAA/wAAAPcAAACrAAAAbwAA + AP8AAADv////Af///wH///8B////Af///wH///8B////Af///wEAAACFAAAA/wAAAP8AAAD/AAAA/wAA + ANsAAACZAAAAaQAAAEEAAAAnAAAAE////wEAAAD/AAAA/////wEAAABDAAAAaQAAAJkAAADbAAAA/wAA + AP8AAAD/AAAA/wAAAIP///8B////Af///wH///8B////Af///wH///8B////AQAAAI8AAAD/AAAA/QAA + AJ8AAAAv////Af///wH///8B////Af///wH///8B////AQAAAP8AAAD/////Af///wH///8B////Af// + /wEAAAAxAAAAnwAAAP0AAAD/AAAAjf///wH///8B////Af///wH///8B////Af///wH///8BAAAA9QAA + AP8AAABT////AQAAAA0AAABNAAAAhQAAALH///8B////Af///wH///8BAAAA/wAAAP////8BAAAA0wAA + ALEAAACFAAAATQAAAA3///8BAAAAUwAAAP8AAAD1////Af///wH///8B////Af///wH///8B////Af// + /wEAAAD1AAAA/wAAAHcAAACpAAAA9wAAAP8AAAD/AAAA/////wEAAADVAAAA1f///wEAAAD/AAAA//// + /wEAAAD/AAAA/wAAAP8AAAD/AAAA9wAAAKsAAAB3AAAA/wAAAPX///8B////Af///wH///8B////Af// + /wH///8B////AQAAAIsAAAD/AAAA/wAAAP8AAAD/AAAA2wAAAJkAAABp////AQAAAP8AAAD/////AQAA + AP8AAAD/////AQAAAEMAAABpAAAAmQAAANsAAAD/AAAA/wAAAP8AAAD/AAAAi////wH///8B////Af// + /wH///8B////Af///wH///8BAAAAjQAAAP8AAAD9AAAAnwAAADH///8B////Af///wH///8BAAAA/wAA + AP////8BAAAA/wAAAP////8B////Af///wH///8B////AQAAADEAAACfAAAA/QAAAP8AAACN////Af// + /wH///8B////Af///wH///8B////Af///wEAAAD1AAAA/wAAAFP///8BAAAADQAAAE0AAACFAAAAsf// + /wEAAAD/AAAA/////wEAAAD/AAAA/////wEAAADTAAAAsQAAAIUAAABNAAAADf///wEAAABTAAAA/wAA + APX///8B////Af///wH///8B////Af///wH///8B////AQAAAPUAAAD/AAAAdwAAAKkAAAD3AAAA/wAA + AP8AAAD/AAAAAwAAAP8AAAD/////AQAAAP8AAAD/AAAADQAAAPsAAAD/AAAA/wAAAP8AAAD3AAAAqwAA + AHcAAAD/AAAA9f///wH///8B////Af///wH///8B////Af///wH///8BAAAAiwAAAP8AAAD/AAAA/wAA + AP8AAADbAAAAmQAAAFkAAAA7AAAA/wAAAP8AAAArAAAA/wAAAP8AAABjAAAAMwAAAGkAAACZAAAA2wAA + AP8AAAD/AAAA/wAAAP8AAACL////Af///wH///8B////Af///wH///8B////Af///wEAAACNAAAA/wAA + AP0AAACfAAAAMf///wEAAAAHAAAAXwAAAOUAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAPsAAACtAAAAWwAA + AAf///8BAAAAMQAAAJ8AAAD9AAAA/wAAAI3///8B////Af///wH///8B////Af///wH///8B////AQAA + APUAAAD/AAAAU////wH///8B////AQAAAMkAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAAyf///wH///8B////AQAAAFMAAAD/AAAA9f///wH///8B////Af///wH///8B////Af// + /wH///8BAAAA9QAAAP8AAABT////Af///wH///8BAAAAywAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAADL////Af///wH///8BAAAAUwAAAP8AAAD1////Af///wH///8B////Af// + /wH///8B////Af///wEAAACPAAAA/wAAAP0AAACfAAAAL////wEAAAAHAAAAWwAAAKcAAADZAAAA9wAA + AP8AAAD/AAAA9wAAANkAAACnAAAAWwAAAAf///8BAAAALwAAAJ8AAAD9AAAA/wAAAI////8B////Af// + /wH///8B////Af///wH///8B////AQAAAAcAAACZAAAA/QAAAP8AAAD/AAAA2wAAAJkAAABpAAAAQQAA + ACcAAAATAAAAEQAAABEAAAATAAAAJwAAAEEAAABpAAAAmQAAANsAAAD/AAAA/wAAAP0AAACZAAAAB/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAA5AAAAqwAAAPcAAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAPcAAACrAAAAOf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAADQAA + AE0AAACFAAAAsQAAANUAAADrAAAA/wAAAP8AAAD/AAAA/wAAAOsAAADVAAAAsQAAAIUAAABNAAAADf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAKAAAADAAAABgAAAAAQAgAAAAAACAJQAAAAAAAAAAAAAAAAAAAAAAAP// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAALAAAAGQAAAC0AAABJAAAAXQAAAGkAAAB9AAAAfwAA + AH8AAAB/AAAAbQAAAF8AAABJAAAALQAAABkAAAAL////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAMAAAA1AAAAdQAAALEAAADVAAAA7wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAPEAAADVAAAAsQAAAHUAAAAzAAAAA/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAtAAAAjQAAAOUAAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA5QAAAIsAAAAv////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAAHQAAAKMAAADzAAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD5AAAA6wAAANsAAAC7AAAApQAAAJcAAACDAAAAfwAAAH8AAACBAAAAkwAAAKMAAAC7AAAA2wAA + AOsAAAD5AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADzAAAApQAAAB3///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAABDAAAA4QAAAP8AAAD/AAAA/wAA + AP8AAADtAAAAqwAAAGcAAAA3AAAAGQAAAAP///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAAAwAAABkAAAA3AAAAaQAAAKsAAADtAAAA/wAAAP8AAAD/AAAA/wAAAOEAAABD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAADEAAADvAAAA/wAA + AP8AAAD7AAAAvwAAAE0AAAAH////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAHAAAATwAAALkAAAD7AAAA/wAA + AP8AAADvAAAAMf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AK8AAAD/AAAA/wAAAOMAAABRAAAAB////wH///8B////AQAAAAMAAAAPAAAAHQAAADkAAABVAAAAZwAA + AH8AAABB////AQAAADkAAAB9AAAAOf///wEAAAAnAAAANwAAAB0AAAAPAAAAA////wH///8B////AQAA + AAUAAABPAAAA4wAAAP8AAAD/AAAAr////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAPUAAAD/AAAA/wAAADv///8B////AQAAAAcAAABBAAAAgQAAALkAAADbAAAA9wAA + AP8AAAD/AAAA/wAAAP8AAAB/////AQAAAOsAAAD/AAAA6////wEAAAB/AAAA/wAAAPcAAADbAAAAuQAA + AIEAAABBAAAABf///wH///8BAAAAOwAAAP8AAAD/AAAA9f///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAPMAAAD/AAAA/wAAAD8AAAA5AAAAmQAAAO8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAB/////AQAAAP8AAAD/AAAA/////wEAAAB/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA7wAAAJkAAAA5AAAAPwAAAP8AAAD/AAAA8////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAK8AAAD/AAAA/wAAAPEAAAD3AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD9AAAA7wAAAOMAAADJAAAAswAAAJ0AAABN////AQAAAP8AAAD/AAAA//// + /wEAAABpAAAA4wAAAO8AAAD9AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD3AAAA8QAAAP8AAAD/AAAAr/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAADEAAADvAAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD1AAAAuQAAAHUAAABBAAAAIQAAAAn///8B////Af///wH///8B////AQAA + AP8AAAD/AAAA/////wH///8BAAAACQAAACEAAABBAAAAdQAAALkAAAD1AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAADtAAAAMf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AD0AAAD1AAAA/wAAAP8AAAD9AAAAyQAAAF0AAAAP////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAP8AAAD/AAAA/////wH///8B////Af///wH///8B////Af///wEAAAAPAAAAXwAA + AMkAAAD9AAAA/wAAAP8AAADzAAAAPf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAL8AAAD/AAAA/wAAAOkAAABdAAAACf///wH///8B////AQAAAAMAAAAPAAAAHf// + /wH///8B////Af///wH///8B////AQAAAP8AAAD/AAAA/////wEAAAAnAAAANwAAAB0AAAAPAAAAA/// + /wH///8B////AQAAAAkAAABdAAAA6QAAAP8AAAD/AAAAv////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAAAwAAAPsAAAD/AAAA/wAAAEf///8B////AQAAAAUAAABBAAAAgQAA + ALkAAADbAAAA9////wH///8B////Af///wH///8B////AQAAAP8AAAD/AAAA/////wEAAAB/AAAA/wAA + APcAAADbAAAAuQAAAIEAAABBAAAABf///wH///8BAAAARwAAAP8AAAD/AAAA+////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAPsAAAD/AAAA/wAAAE8AAAA5AAAAlwAA + AO8AAAD/AAAA/wAAAP8AAAD/AAAA/////wEAAAA5AAAA6wAAAOsAAAA5////AQAAAP8AAAD/AAAA//// + /wEAAAB/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA7wAAAJkAAAA5AAAATwAAAP8AAAD/AAAA+/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAL0AAAD/AAAA/wAA + APMAAAD3AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD9AAAA7////wEAAAB/AAAA/wAAAP8AAAB/////AQAA + AP8AAAD/AAAA/////wEAAABpAAAA4wAAAO8AAAD9AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD3AAAA8wAA + AP8AAAD/AAAAvf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + ADkAAADxAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD1AAAAuQAAAHUAAABBAAAAIf///wEAAAB/AAAA/wAA + AP8AAAB/////AQAAAP8AAAD/AAAA/////wH///8BAAAACQAAACEAAABBAAAAdQAAALkAAAD1AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAADxAAAAOf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAD0AAADzAAAA/wAAAP8AAAD9AAAAyQAAAF8AAAAP////Af///wH///8B////Af// + /wEAAAB/AAAA/wAAAP8AAAB/////AQAAAP8AAAD/AAAA/////wH///8B////Af///wH///8B////Af// + /wEAAAAPAAAAXwAAAMkAAAD9AAAA/wAAAP8AAADzAAAAPf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAL8AAAD/AAAA/wAAAOkAAABdAAAACf///wH///8B////AQAA + AAMAAAAPAAAAHf///wEAAAB/AAAA/wAAAP8AAAB/////AQAAAP8AAAD/AAAA/////wEAAAAnAAAANwAA + AB0AAAAPAAAAA////wH///8B////AQAAAAkAAABdAAAA6QAAAP8AAAD/AAAAv////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAP0AAAD/AAAA/wAAAEf///8B////AQAA + AAUAAABBAAAAgQAAALkAAADbAAAA9////wEAAAB/AAAA/wAAAP8AAACB////AQAAAP8AAAD/AAAA//// + /wEAAAB/AAAA/wAAAPkAAADbAAAAuQAAAIEAAABBAAAABf///wH///8BAAAARwAAAP8AAAD/AAAA/f// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAPsAAAD/AAAA/wAA + AE8AAAA5AAAAlwAAAO8AAAD/AAAA/wAAAP8AAAD/AAAA/////wEAAAB/AAAA/wAAAP8AAAB/////AQAA + AP8AAAD/AAAA/wAAAAkAAACDAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA7wAAAJkAAAA5AAAATwAA + AP8AAAD/AAAA+////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AL0AAAD/AAAA/wAAAPMAAAD3AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD9AAAA2f///wEAAACZAAAA/wAA + AP8AAAB/////AQAAAP8AAAD/AAAA/wAAADMAAABFAAAA3QAAAO8AAAD9AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD3AAAA8wAAAP8AAAD/AAAAvf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAADkAAADxAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD1AAAAuQAAAHUAAABBAAAAFQAA + ABMAAADdAAAA/wAAAP8AAACpAAAANwAAAP8AAAD/AAAA/wAAALEAAAAJAAAACQAAACEAAABBAAAAdQAA + ALkAAAD1AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADxAAAAOf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAD0AAADzAAAA/wAAAP8AAAD9AAAAyQAAAF8AAAAP////Af// + /wEAAAADAAAAMQAAAMMAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADPAAAAbwAA + ACsAAAAD////Af///wEAAAAPAAAAXwAAAMkAAAD9AAAA/wAAAP8AAADzAAAAPf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAL8AAAD/AAAA/wAAAOkAAABdAAAACf// + /wH///8B////AQAAACkAAAC3AAAA9QAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAPMAAAC3AAAAKf///wH///8B////AQAAAAkAAABdAAAA6QAAAP8AAAD/AAAAv/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAP0AAAD/AAAA/wAA + AEf///8B////Af///wH///8BAAAAAwAAAN8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA3////wH///8B////Af///wH///8BAAAARwAA + AP8AAAD/AAAA/f///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AP0AAAD/AAAA/wAAAEf///8B////Af///wH///8BAAAAAwAAAN8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA3////wH///8B////Af// + /wH///8BAAAARwAAAP8AAAD/AAAA/f///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAL8AAAD/AAAA/wAAAOkAAABdAAAACf///wH///8B////AQAAACsAAAC3AAAA8wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAPMAAAC3AAAAK/// + /wH///8B////AQAAAAkAAABdAAAA6QAAAP8AAAD/AAAAv////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAD0AAAD1AAAA/wAAAP8AAAD9AAAAyQAAAF0AAAAP////Af// + /wEAAAADAAAAKwAAAG0AAACnAAAAzwAAAO0AAAD/AAAA/wAAAP8AAAD/AAAA7QAAAM8AAACnAAAAbQAA + ACsAAAAD////Af///wEAAAAPAAAAXQAAAMkAAAD9AAAA/wAAAP8AAAD1AAAAPf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAABRAAAA6wAAAP8AAAD/AAAA/wAA + AP8AAAD1AAAAuQAAAHUAAABBAAAAIQAAAAf///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAABwAAACEAAABBAAAAdQAAALkAAAD1AAAA/wAAAP8AAAD/AAAA/wAAAOsAAABR////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAKQAA + ALEAAAD3AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD9AAAA7wAAAOMAAADJAAAAswAAAJ0AAACZAAAAlwAA + AJkAAACXAAAAnQAAALMAAADJAAAA4wAAAO8AAAD9AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD3AAAAsQAA + ACn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAMAAAA7AAAAmQAAAO8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA7wAA + AJkAAAA7AAAAA////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAcAAABBAAAAgQAAALkAAADbAAAA9wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAPcAAADbAAAAuQAA + AIEAAABBAAAAB////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAMAAAAPAAAAHQAAADsAAABVAAAAZwAAAH8AAAB/AAAAfwAAAIEAAAB/AAAAfwAAAGcAAABVAAAAOwAA + AB0AAAAPAAAAA////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//ygA + AABAAAAAgAAAAAEAIAAAAAAAAEIAAAAAAAAAAAAAAAAAAAAAAAD///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAFQAAAEEAAABnAAAAiwAA + AKcAAAC/AAAA1wAAAN8AAADzAAAA/wAAAP8AAAD/AAAA/wAAAPsAAADfAAAA2wAAAL8AAACnAAAAiwAA + AGsAAABBAAAAFf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAJQAAAGcAAACnAAAA4wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADjAAAApwAAAGcAAAAh////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAABkAAAB3AAAAzwAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AM8AAABzAAAAGf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAHQAA + AJsAAAD3AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAPcAAACfAAAAIf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAAAAFAAAAcwAAAPcAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAPsAAADTAAAApwAA + AIMAAABfAAAAQQAAAC0AAAAhAAAADf///wH///8B////Af///wEAAAAFAAAAIQAAACkAAABBAAAAXwAA + AIMAAACnAAAA0wAAAPsAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAPcAAABzAAAABf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAANAAAAtwAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADHAAAAfwAA + AEEAAAAJ////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAANAAAAQQAAAH8AAADHAAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAALcAAAAN////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAAswAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA5wAA + AHcAAAAd////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AB0AAAB7AAAA4wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAs////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAYQAAAP8AAAD/AAAA/wAA + AP8AAADvAAAAbwAAAAn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAUAAABpAAAA7wAAAP8AAAD/AAAA/wAAAP8AAABh////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AMMAAAD/AAAA/wAAAP8AAADXAAAAIf///wH///8B////Af///wH///8B////Af///wEAAAAlAAAAUQAA + AHcAAACbAAAAtwAAANMAAADfAAAA/wAAAP////8B////AQAAAGkAAAD3AAAA9wAAAGn///8B////AQAA + ALcAAACXAAAAdwAAAFEAAAAl////Af///wH///8B////Af///wH///8B////AQAAACEAAADXAAAA/wAA + AP8AAAD/AAAAw////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAD7AAAA/wAAAP8AAAD/AAAALf///wH///8B////Af///wEAAAA1AAAAdwAA + ALcAAADvAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/////Af///wEAAAD3AAAA/wAA + AP8AAAD3////Af///wEAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAO8AAAC3AAAAdwAAADH///8B////Af// + /wH///8BAAAALQAAAP8AAAD/AAAA/wAAAPv///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAA9wAAAP8AAAD/AAAA/wAAADH///8BAAAAJQAA + AIcAAADjAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA//// + /wH///8BAAAA/wAAAP8AAAD/AAAA/////wH///8BAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA4wAAAIcAAAAl////AQAAADEAAAD/AAAA/wAAAP8AAAD3////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAMMAAAD/AAAA/wAA + AP8AAADXAAAArwAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP////8B////AQAAAP8AAAD/AAAA/wAAAP////8B////AQAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAK8AAADXAAAA/wAAAP8AAAD/AAAAw/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAAABhAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AOcAAAC3AAAAkwAAAG8AAABXAAAAQQAAACkAAAAh////Af///wEAAAD/AAAA/wAAAP8AAAD/////Af// + /wEAAABzAAAAkwAAALcAAADnAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAF3///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAALMAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + ANsAAACTAAAAUQAAABn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAA/wAA + AP8AAAD/AAAA/////wH///8B////Af///wH///8B////AQAAABkAAABRAAAAkwAAANsAAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAK////8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAUAAADHAAAA/wAAAP8AAAD/AAAA/wAA + AP8AAADvAAAAiwAAADH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAP8AAAD/AAAA/wAAAP////8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAAMQAAAI8AAADvAAAA/wAAAP8AAAD/AAAA/wAAAP8AAADDAAAABf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAABvAAAA/wAA + AP8AAAD/AAAA/wAAAPcAAAB/AAAAEf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAD/AAAA/wAAAP8AAAD/////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAAEQAAAH8AAAD3AAAA/wAAAP8AAAD/AAAA/wAA + AG////8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAA2wAAAP8AAAD/AAAA/wAAAN8AAAAt////Af///wH///8B////Af///wH///8B////AQAA + ACUAAABRAAAAc////wH///8B////Af///wH///8B////Af///wH///8BAAAA/wAAAP8AAAD/AAAA//// + /wH///8BAAAAtwAAAJcAAAB3AAAAUQAAACX///8B////Af///wH///8B////Af///wH///8BAAAALQAA + AOMAAAD/AAAA/wAAAP8AAADb////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAABQAAAP8AAAD/AAAA/wAAAP8AAAA9////Af///wH///8B////AQAA + ADEAAAB3AAAAtwAAAO8AAAD/AAAA/wAAAP////8B////Af///wH///8B////Af///wH///8B////AQAA + AP8AAAD/AAAA/wAAAP////8B////AQAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA7wAAALcAAAB3AAAAMf// + /wH///8B////Af///wEAAAA9AAAA/wAAAP8AAAD/AAAA/////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAUAAAD/AAAA/wAAAP8AAAD/AAAARf// + /wEAAAAlAAAAgwAAAOMAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/////Af///wEAAABpAAAA9wAA + APcAAABp////Af///wEAAAD/AAAA/wAAAP8AAAD/////Af///wEAAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAADjAAAAhwAAACX///8BAAAARQAAAP8AAAD/AAAA/wAAAP////8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAA1wAA + AP8AAAD/AAAA/wAAAOcAAACvAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA//// + /wH///8BAAAA9wAAAP8AAAD/AAAA9////wH///8BAAAA/wAAAP8AAAD/AAAA/////wH///8BAAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAArwAAAOcAAAD/AAAA/wAA + AP8AAADX////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAGsAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA5wAAALf///8B////AQAAAP8AAAD/AAAA/wAAAP////8B////AQAAAP8AAAD/AAAA/wAA + AP////8B////AQAAAHMAAACTAAAAtwAAAOcAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAAa////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAFAAAAvwAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA2wAAAJMAAABRAAAAGf///wH///8B////Af///wEAAAD/AAAA/wAAAP8AAAD/////Af// + /wEAAAD/AAAA/wAAAP8AAAD/////Af///wH///8B////Af///wH///8BAAAAGQAAAFEAAACTAAAA2wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAvwAAAAX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAABQAAAMMAAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAO8AAACPAAAAMf///wH///8B////Af///wH///8B////Af///wH///8BAAAA/wAA + AP8AAAD/AAAA/////wH///8BAAAA/wAAAP8AAAD/AAAA/////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAxAAAAjwAAAO8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAMMAAAAF////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AG8AAAD/AAAA/wAAAP8AAAD/AAAA9wAAAH8AAAAR////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAP8AAAD/AAAA/wAAAP////8B////AQAAAP8AAAD/AAAA/wAAAP////8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAARAAAAfwAAAPcAAAD/AAAA/wAA + AP8AAAD/AAAAb////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAADbAAAA/wAAAP8AAAD/AAAA4wAAAC3///8B////Af///wH///8B////Af// + /wH///8BAAAAJQAAAFEAAABz////Af///wEAAAD/AAAA/wAAAP8AAAD/////Af///wEAAAD/AAAA/wAA + AP8AAAD/////Af///wEAAAC3AAAAlwAAAHcAAABRAAAAJf///wH///8B////Af///wH///8B////Af// + /wEAAAAtAAAA4wAAAP8AAAD/AAAA/wAAANv///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAFAAAA/wAAAP8AAAD/AAAA/wAAAD3///8B////Af// + /wH///8BAAAAMQAAAHcAAAC3AAAA7wAAAP8AAAD/AAAA/////wH///8BAAAA/wAAAP8AAAD/AAAA//// + /wH///8BAAAA/wAAAP8AAAD/AAAA/////wH///8BAAAA/wAAAP8AAAD/AAAA/wAAAP8AAADvAAAAtwAA + AHcAAAAx////Af///wH///8B////AQAAAD0AAAD/AAAA/wAAAP8AAAD/////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAABQAAAP8AAAD/AAAA/wAA + AP8AAABF////AQAAACUAAACDAAAA4wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP////8B////AQAA + AP8AAAD/AAAA/wAAAP////8B////AQAAAP8AAAD/AAAA/wAAAP8AAAAF////AQAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAOMAAACHAAAAJf///wEAAABFAAAA/wAAAP8AAAD/AAAA//// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAAADXAAAA/wAAAP8AAAD/AAAA5wAAAK8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/////AQAAAA0AAAD/AAAA/wAAAP8AAAD/////Af///wEAAAD/AAAA/wAAAP8AAAD/AAAAJQAA + AAkAAADvAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAACvAAAA5wAA + AP8AAAD/AAAA/wAAANf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAAawAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAADnAAAAe////wEAAAA9AAAA/wAAAP8AAAD/AAAA/////wEAAAAFAAAA/wAA + AP8AAAD/AAAA/wAAAG////8BAAAANQAAAJMAAAC3AAAA5wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAABr////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAUAAAC/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAADbAAAAkwAAAFEAAAAZ////Af///wH///8BAAAAqwAAAP8AAAD/AAAA/wAA + AP8AAABVAAAAVQAAAP8AAAD/AAAA/wAAAP8AAADvAAAAKf///wH///8B////Af///wEAAAAZAAAAUQAA + AJMAAADbAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAC/AAAABf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAFAAAAwwAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA7wAAAI8AAAAx////Af///wH///8B////Af///wEAAAAJAAAAkwAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAPMAAACDAAAAMf// + /wH///8B////Af///wH///8B////AQAAADEAAACPAAAA7wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAwwAA + AAX///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAAbwAAAP8AAAD/AAAA/wAAAP8AAAD3AAAAfwAAABH///8B////Af///wH///8B////AQAA + ABkAAACHAAAA5wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAADjAAAAhwAAABn///8B////Af///wH///8B////AQAAABEAAAB/AAAA9wAA + AP8AAAD/AAAA/wAAAP8AAABv////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAANsAAAD/AAAA/wAAAP8AAADjAAAALf///wH///8B////Af// + /wH///8B////AQAAAEkAAADvAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADvAAAASf///wH///8B////Af// + /wH///8B////AQAAAC0AAADjAAAA/wAAAP8AAAD/AAAA2////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAD/AAAA/wAAAP8AAAD/AAAAPf// + /wH///8B////Af///wH///8B////AQAAAAUAAADvAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AO////8B////Af///wH///8B////Af///wH///8BAAAAPQAAAP8AAAD/AAAA/wAAAP////8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAA/wAA + AP8AAAD/AAAA/wAAAD3///8B////Af///wH///8B////Af///wEAAAAFAAAA7wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAADv////Af///wH///8B////Af///wH///8B////AQAAAD0AAAD/AAAA/wAA + AP8AAAD/////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAANsAAAD/AAAA/wAAAP8AAADfAAAALf///wH///8B////Af///wH///8B////AQAA + AE0AAADvAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADvAAAATf///wH///8B////Af///wH///8B////AQAA + AC0AAADfAAAA/wAAAP8AAAD/AAAA2////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAABvAAAA/wAAAP8AAAD/AAAA/wAAAPcAAAB/AAAAEf// + /wH///8B////Af///wH///8BAAAAGQAAAIcAAADjAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAOMAAACHAAAAGf///wH///8B////Af// + /wH///8BAAAAEQAAAH8AAAD3AAAA/wAAAP8AAAD/AAAA/wAAAG////8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAABQAAAMcAAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAO8AAACLAAAAMf///wH///8B////Af///wH///8B////AQAAADEAAABvAAAAnwAA + AMcAAADfAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA3wAAAMcAAACfAAAAbwAAADH///8B////Af// + /wH///8B////Af///wEAAAAxAAAAiwAAAO8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAMcAAAAF////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAAAAZAAAAxwAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADbAAAAkwAAAFEAAAAZ////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAZAAAAUQAAAJMAAADbAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AMcAAAAZ////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAkAAACTAAAA+wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAOcAAAC3AAAAjwAAAG8AAABXAAAAQQAAACkAAAAhAAAAIQAAACEAAAAhAAAAIQAA + ACEAAAApAAAAQQAAAFcAAABvAAAAjwAAALcAAADnAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA+wAAAJMAAAAJ////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAADEAAACvAAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAArwAAADH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAACkAAACHAAAA4wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAOMAAACHAAAAKf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAA1AAAAdwAAALcAAADvAAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAO8AAAC3AAAAdwAAADX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAACUAAABRAAAAdwAAAJsAAAC7AAAA0wAAAN8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAN8AAADTAAAAuwAAAJsAAAB3AAAAUQAAACX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAoAAAAgAAAAAABAAABACAAAAAAAAAIAQAAAAAAAAAAAAAAAAAAAAAA////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAxAAAAQQAA + AGEAAACBAAAAgQAAAJ8AAAC/AAAAvwAAAL8AAADPAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAO8AAAC/AAAAvwAAAL8AAACvAAAAgQAAAIEAAABhAAAAQQAAADH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAEQAA + AEEAAABxAAAAjwAAAL8AAADfAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADvAAAAvwAAAI8AAABxAAAAQQAAABH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAADEAAABxAAAArwAAAN8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAN8AAACvAAAAcQAAADH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAhAAAAcQAAAK8AAADvAAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAO8AAACvAAAAYQAAACH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAACEAAABxAAAAzwAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AM8AAABxAAAAIf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAGEAAAC/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAArwAAAGH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAAEQAAAHEAAADfAAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAN8AAACBAAAAEf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AHEAAADvAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAADvAAAAgf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAEEAAADfAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAL8AAAC/AAAAgQAAAIEAAABxAAAAQQAAAEEAAABBAAAAMf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAARAAAAQQAAAEEAAABBAAAAYQAAAIEAAACBAAAAvwAA + AL8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA3wAAAEH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAABEAAACPAAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAADvAAAAvwAAAI8AAABhAAAAQQAAABH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAARAAAAQQAAAGEAAACPAAAAvwAA + AO8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAI8AAAAR////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAhAAAAzwAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA3wAAAJ8AAABhAAAAIf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAADEAAABhAAAAnwAAAN8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AM8AAAAh////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAMQAAAO8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAACvAAAAcQAA + ACH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAACEAAABxAAAArwAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAO8AAAAx////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAABEAAADvAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAL8AAABhAAAAEf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAAEQAAAGEAAADPAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAO8AAAAR////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAzwAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAJ8AAAAh////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAhAAAAnwAA + AO8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAM////8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAIEAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AJ8AAAAh////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAAEQAAAIEAAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAIH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAARAAAA7wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAL8AAAAh////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAACEAAAC/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA7wAA + ABH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAGEAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAACB////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAAMQAAAEEAAABhAAAAgQAAAI8AAAC/AAAAvwAAAL8AAAD/AAAA/wAA + AP8AAAD/////Af///wH///8B////Af///wEAAABRAAAA3wAAAP8AAAD/AAAA3wAAAFH///8B////Af// + /wH///8B////AQAAAIEAAABhAAAAQQAAACH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAACBAAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAYf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAArwAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAAYf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAxAAAAYQAAAIEAAAC/AAAA3wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP////8B////Af///wH///8BAAAAUQAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAFH///8B////Af///wH///8BAAAA/wAAAP8AAAD/AAAA/wAA + AP8AAADfAAAAvwAAAIEAAABhAAAAMf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAABhAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAACv////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAADvAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAI////8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAARAAAAUQAAAI8AAAC/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/////wH///8B////Af///wEAAADfAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA3/// + /wH///8B////Af///wEAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AL8AAACPAAAAUQAAABH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAAACPAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAO////8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAAIf///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AEEAAACPAAAAzwAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/////Af///wH///8B////AQAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/////Af///wH///8B////AQAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAM8AAACPAAAAMf// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAACEAAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAAh////Af// + /wH///8B////Af///wH///8BAAAAQQAAAJ8AAADvAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP////8B////Af///wH///8BAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP////8B////Af///wH///8BAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA7wAAAJ8AAABB////Af///wH///8B////Af// + /wH///8BAAAAIQAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAADfAAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAJ////8B////Af///wEAAAARAAAAgQAAAN8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/////wH///8B////Af// + /wEAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/////wH///8B////Af///wEAAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAADfAAAAgQAAABH///8B////Af///wEAAACfAAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAN////8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAK8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AGEAAAAhAAAAnwAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/////Af///wH///8B////AQAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/////Af///wH///8B////AQAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AJ8AAAAhAAAAYQAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAr////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAYQAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP////8B////Af// + /wH///8BAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP////8B////Af///wH///8BAAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAABh////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAARAAAA7wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAL8AAAC/AAAAnwAA + AIEAAACBAAAAYQAAAEEAAABBAAAAQf///wH///8B////Af///wEAAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/////wH///8B////Af///wEAAADPAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA7wAAABH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAAACBAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADfAAAAvwAA + AIEAAABhAAAAQQAAABH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/////Af///wH///8B////Af// + /wH///8BAAAAEQAAAEEAAABhAAAAgQAAAL8AAADfAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAABx////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAADPAAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAAvwAAAIEAAABRAAAAEf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP////8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAAAARAAAAUQAAAIEAAAC/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAz////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAABEAAADvAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAN8AAACPAAAAUf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAUQAA + AI8AAADfAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAN8AAAAR////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAMQAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA3wAAAI8AAAAx////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAxAAAAjwAAAO8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA7wAAADH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAABEAAADvAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAAvwAAAFH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP////8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAFEAAAC/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA7wAAABH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAnwAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAvwAAAEH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAAABBAAAAvwAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAn/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAACEAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA3wAA + AEH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAQQAAAN8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAIf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAjwAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAJ8AAAAR////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP////8B////Af///wH///8BAAAAgQAAAGEAAABBAAAAIf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAAEQAAAJ8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAACP////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAADfAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAACB////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + ADEAAABhAAAAgQAAAL8AAADPAAAA/////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA//// + /wH///8B////Af///wEAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAN8AAAC/AAAAgQAAAGEAAAAx////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AI8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAN////8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAAr////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAABEAAABRAAAAjwAAAL8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/////Af///wH///8B////AQAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAvwAAAI8AAABRAAAAEf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAK8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAARAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAABB////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAAMQAAAI8AAADPAAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP////8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP////8B////Af///wH///8BAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAAzwAAAI8AAAAx////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAAQQAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAABEAAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAFH///8B////Af///wH///8B////Af///wEAAAAxAAAAnwAA + AO8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA//// + /wH///8B////Af///wH///8BAAAAUQAAAN8AAAD/AAAA/wAAAN8AAABR////Af///wH///8B////Af// + /wEAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/////wH///8B////Af///wEAAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAADvAAAAnwAAAEH///8B////Af///wH///8B////Af///wEAAABRAAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP////8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAv/// + /wH///8B////AQAAABEAAACBAAAA3wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/////Af///wH///8B////AQAAAFEAAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAABR////Af///wH///8B////AQAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/////Af///wH///8B////AQAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAN8AAACBAAAAEf// + /wH///8B////AQAAAL8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAzwAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAnwAAACEAAACfAAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP////8B////Af///wH///8BAAAA3wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAN////8B////Af// + /wH///8BAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP////8B////Af///wH///8BAAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAnwAAACEAAACfAAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAADP////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAACPAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/////wH///8B////Af///wEAAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/////wH///8B////Af///wEAAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/////wH///8B////Af///wEAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAI////8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + ACEAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/////Af///wH///8B////AQAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/////Af// + /wH///8B////AQAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/////Af///wH///8B////AQAA + AM8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAAIf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAI8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAN8AAAC/AAAAgQAAAGH///8B////Af///wH///8BAAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP////8B////Af///wH///8BAAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP////8B////Af///wH///8B////Af///wEAAAARAAAAQQAAAGEAAACBAAAAvwAA + AN8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAI////8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAAEQAAAN8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAC/AAAAgQAAAFEAAAAR////Af// + /wH///8B////Af///wH///8B////Af///wEAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA//// + /wH///8B////Af///wEAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAABEAAABRAAAAgQAAAL8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAADfAAAAEf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAMQAAAO8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA3wAA + AI8AAABR////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/////Af///wH///8B////AQAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAABRAAAAjwAAAN8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA7wAAADH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAxAAAA7wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAADvAAAAjwAAADH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP////8B////Af///wH///8BAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP////8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAADEAAACPAAAA7wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAADvAAAAMf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAEQAAAO8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAC/AAAAUf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/////wH///8B////Af///wEAAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAUQAA + AL8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADvAAAAEf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAACfAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAC/AAAAQf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/////Af///wH///8B////AQAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAEEAAAC/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAACf////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAIQAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADfAAAAQf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP////8B////Af///wH///8BAAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP////8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAABBAAAA3wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAAh////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAACPAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAnwAA + ABH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/////wH///8B////Af///wEAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA//// + /wH///8B////Af///wEAAACBAAAAYQAAAEEAAAAh////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAARAAAAnwAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAI////8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAN8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAI////8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAAMQAAAGEAAACBAAAAvwAAAM8AAAD/////Af// + /wH///8B////AQAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/////Af///wH///8B////AQAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/////Af///wH///8B////AQAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA3wAAAL8AAACBAAAAYQAAADH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAAjwAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA3////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAACv////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAEQAAAFEAAACPAAAAvwAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP////8B////Af///wH///8BAAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP////8B////Af///wH///8BAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP////8B////Af///wH///8BAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAC/AAAAjwAAAFEAAAAR////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAArwAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAABEAAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAEH///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAAAAxAAAAjwAAAM8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA//// + /wH///8B////Af///wEAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/////wH///8B////Af// + /wEAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/////wH///8B////Af///wEAAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADPAAAAjwAA + ADH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAABBAAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP////8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAAEQAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAUf// + /wH///8B////Af///wH///8B////AQAAADEAAACfAAAA7wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/////Af///wH///8B////AQAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/////Af///wH///8B////AQAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/////Af///wH///8B////AQAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAO8AAACfAAAAQf///wH///8B////Af// + /wH///8B////AQAAAFEAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAC/////Af///wH///8BAAAAEQAAAIEAAADfAAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP////8B////Af///wH///8BAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP////8B////Af// + /wH///8BAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAAR////Af///wH///8BAAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA3wAAAIEAAAAR////Af///wH///8BAAAAvwAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAADPAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAACfAAAAIQAAAJ8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/////wH///8B////Af///wEAAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/////wH///8B////Af///wEAAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAEH///8B////AQAAACEAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAACfAAAAIQAAAJ8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAM////8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AI8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/////Af///wH///8BAAAAMQAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/////Af// + /wH///8B////AQAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAUf///wH///8B////AQAA + AL8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAAj////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAAIQAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAI////8B////Af///wEAAABRAAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP////8B////Af///wH///8BAAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAACf////Af///wH///8BAAAAEQAAAL8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAAh////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAAjwAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA3wAA + AL8AAABh////Af///wH///8B////AQAAAJ8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA//// + /wH///8B////AQAAABEAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAAh////Af// + /wH///8B////AQAAABEAAABBAAAAYQAAAIEAAAC/AAAA3wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAAj////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAARAAAA3wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAL8AAACBAAAAUQAAABH///8B////Af///wH///8B////Af///wEAAAARAAAA7wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAQf///wH///8BAAAAQQAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAL////8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAAEQAAAFEAAACBAAAAvwAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAN8AAAAR////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAxAAAA7wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADfAAAAjwAAAFH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAK8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAADPAAAAQQAAAEEAAADPAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AJ////8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AFEAAACPAAAA3wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAADvAAAAMf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAADEAAADvAAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAO8AAACPAAAAMf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAACfAAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAM8AAABB////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAMQAAAI8AAADvAAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAO8AAAAx////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAARAAAA7wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAL8AAABR////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAhAAAArwAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAADPAAAAgQAAAEH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAABRAAAAvwAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAO8AAAAR////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAJ8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAL8AAABB////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAABBAAAAnwAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AO8AAACfAAAAQf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAAQQAAAL8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AJ////8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAhAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AN8AAABB////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAAABhAAAA3wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA3wAAAGH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAEEAAADfAAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAACH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAI8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAACfAAAAEf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAARAAAAvwAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAL8AAAAR////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAABEAAACfAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAAj////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAA3wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAj/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAIQAA + AO8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AO8AAAAh////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAAACPAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADf////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAK////8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAC/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAL////8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAACvAAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP////8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAQf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAEQAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAEEAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAABB////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAARAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAQQAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AK////8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAAAC/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAL////8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAACvAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP////8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AN8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAIH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAACEAAADvAAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADvAAAAIf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAgQAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA3////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAAjwAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAJ8AAAAR////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAACEAAAC/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAAvwAAACH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAAEQAAAJ8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAACP////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAAAAhAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAN8AAABB////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAABhAAAA3wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA3wAAAGH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAEEAAADfAAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAACH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAACfAAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAC/AAAAQf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAAQQAAAJ8AAADvAAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADvAAAAnwAA + AEH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AEEAAAC/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAACf////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAABEAAADvAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAAvwAAAFH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAABBAAAAgQAAAL8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAL8AAACBAAAAQf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAFEAAAC/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA7wAAABH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAADEAAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAN8AAACPAAAAMf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAAAAxAAAAUQAAAIEAAACfAAAAvwAAAL8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAC/AAAAvwAAAJ8AAACBAAAAUQAAADH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAMQAAAI8AAADfAAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAAx////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAGEAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA3wAAAI8AAABR////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAAABRAAAAjwAAAN8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAAYf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + ADEAAADvAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAAvwAAAIEAAABRAAAAEf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAARAAAAUQAAAIEAAAC/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA7wAAADH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAACEAAADPAAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA3wAAAL8AAACBAAAAYQAAAEH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAABBAAAAYQAAAIEAAAC/AAAA3wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAM8AAAAh////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAACBAAAA7wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAAvwAAAL8AAACfAAAAgQAAAIEAAABhAAAAQQAAAEEAAABBAAAAQQAAAEEAAABBAAAAQQAA + AEEAAABBAAAAQQAAAEEAAABBAAAAQQAAAEEAAABhAAAAgQAAAIEAAACfAAAAvwAAAL8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAO8AAACB////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAhAAAAnwAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAACfAAAAIf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAAIQAAAJ8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAACfAAAAIf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAACEAAACBAAAA3wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAN8AAACBAAAAIf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAQQAA + AJ8AAADvAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA7wAAAJ8AAABB////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAABBAAAAjwAAAM8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADPAAAAjwAAAEH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAABEAAABRAAAAjwAAAL8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAvwAAAI8AAABRAAAAEf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAxAAAAYQAAAIEAAAC/AAAA3wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADfAAAAvwAA + AIEAAABhAAAAMf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAADEAAABBAAAAcQAAAIEAAACPAAAAvwAAAL8AAAC/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAL8AAAC/AAAAvwAA + AI8AAACBAAAAcQAAAEEAAAAx////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA + + \ No newline at end of file diff --git a/Source/SM64 Diagnostic/Managers/CameraManager.cs b/Source/SM64 Diagnostic/Managers/CameraManager.cs index 16ce65018..571b7d2c1 100644 --- a/Source/SM64 Diagnostic/Managers/CameraManager.cs +++ b/Source/SM64 Diagnostic/Managers/CameraManager.cs @@ -8,49 +8,13 @@ using SM64_Diagnostic.Utilities; using SM64_Diagnostic.Controls; -namespace SM64_Diagnostic.ManagerClasses +namespace SM64_Diagnostic.Managers { - public class CameraManager + public class CameraManager : DataManager { - List _cameraDataControls; - FlowLayoutPanel _variableTable; - ProcessStream _stream; - - public CameraManager(ProcessStream stream, List cameraData, Control cameraControl, FlowLayoutPanel variableTable) - { - // Register controls on the control (for drag-and-drop) - RegisterControlEvents(cameraControl); - foreach (Control control in cameraControl.Controls) - RegisterControlEvents(control); - - _variableTable = variableTable; - _stream = stream; - - _cameraDataControls = new List(); - foreach (WatchVariable watchVar in cameraData) - { - WatchVariableControl watchControl = new WatchVariableControl(_stream, watchVar, Config.Mario.StructAddress); - variableTable.Controls.Add(watchControl.Control); - _cameraDataControls.Add(watchControl); - } - } - - public void Update(bool updateView) - { - // Update watch variables - foreach (var watchVar in _cameraDataControls) - watchVar.Update(); - - if (!updateView) - return; - } - - private void RegisterControlEvents(Control control) + public CameraManager(ProcessStream stream, List cameraData, NoTearFlowLayoutPanel variableTable) + : base(stream, cameraData, variableTable) { - //control.AllowDrop = true; - //control.DragEnter += DragEnter; - //control.DragDrop += OnDrop; - //control.MouseDown += OnDrag; } } } diff --git a/Source/SM64 Diagnostic/Managers/DataManager.cs b/Source/SM64 Diagnostic/Managers/DataManager.cs index 18d364bca..531b53bb6 100644 --- a/Source/SM64 Diagnostic/Managers/DataManager.cs +++ b/Source/SM64 Diagnostic/Managers/DataManager.cs @@ -8,16 +8,16 @@ using SM64_Diagnostic.Utilities; using SM64_Diagnostic.Controls; -namespace SM64_Diagnostic.ManagerClasses +namespace SM64_Diagnostic.Managers { public class DataManager { protected List _dataControls; - protected FlowLayoutPanel _variableTable; + protected NoTearFlowLayoutPanel _variableTable; protected ProcessStream _stream; - protected List _specialWatchVars; + protected List _specialWatchVars; - public DataManager(ProcessStream stream, List data, FlowLayoutPanel variableTable) + public DataManager(ProcessStream stream, List data, NoTearFlowLayoutPanel variableTable, uint otherOffset = 0) { _variableTable = variableTable; _stream = stream; @@ -46,7 +46,7 @@ public DataManager(ProcessStream stream, List data, FlowLayoutPan continue; } - WatchVariableControl watchControl = new WatchVariableControl(_stream, watchVar, 0); + WatchVariableControl watchControl = new WatchVariableControl(_stream, watchVar, otherOffset); variableTable.Controls.Add(watchControl.Control); _dataControls.Add(watchControl); } @@ -56,14 +56,11 @@ protected virtual void InitializeSpecialVariables() { } - public virtual void Update(bool updateView) + public virtual void Update(bool updateView = false) { // Update watch variables foreach (var watchVar in _dataControls) watchVar.Update(); - - if (!updateView) - return; } } } diff --git a/Source/SM64 Diagnostic/Managers/DisassemblyManager.cs b/Source/SM64 Diagnostic/Managers/DisassemblyManager.cs index 2d20c9996..34698b894 100644 --- a/Source/SM64 Diagnostic/Managers/DisassemblyManager.cs +++ b/Source/SM64 Diagnostic/Managers/DisassemblyManager.cs @@ -8,7 +8,7 @@ using System.Drawing; using SM64_Diagnostic.Structs; -namespace SM64_Diagnostic.ManagerClasses +namespace SM64_Diagnostic.Managers { public class DisassemblyManager { @@ -30,9 +30,6 @@ public DisassemblyManager(Form formContext, RichTextBox disTextBox, MaskedTextBo _goButton = goButton; _formContext = formContext; - RegisterControlEvents(_output); - RegisterControlEvents(_textBoxStartAdd); - goButton.Click += GoButton_Pressed; textBoxStartAdd.TextChanged += (sender, e) => { @@ -42,13 +39,6 @@ public DisassemblyManager(Form formContext, RichTextBox disTextBox, MaskedTextBo _stream.OnStatusChanged += Stream_StatusChanged; } - private void RegisterControlEvents(Control control) - { - control.AllowDrop = true; - control.DragDrop += OnDrop; - control.DragEnter += DragEnter; - } - private void GoButton_Pressed(object sender, EventArgs e) { if (!_addressChanged) @@ -154,43 +144,5 @@ private void DisassemblyLines(int numberOfLines) } _output.Visible = true; } - - private void DragEnter(object sender, DragEventArgs e) - { - // Make sure we have valid Drag and Drop data (it is an index) - if (!e.Data.GetDataPresent(typeof(DropAction))) - { - e.Effect = DragDropEffects.None; - return; - } - - var dropAction = ((DropAction)e.Data.GetData(typeof(DropAction))).Action; - if (dropAction != DropAction.ActionType.Object && dropAction != DropAction.ActionType.Mario) - { - e.Effect = DragDropEffects.None; - return; - } - - e.Effect = DragDropEffects.Move; - } - - private void OnDrop(object sender, DragEventArgs e) - { - // Make sure we have valid Drag and Drop data (it is an index) - if (!e.Data.GetDataPresent(typeof(DropAction))) - return; - - var dropAction = ((DropAction)e.Data.GetData(typeof(DropAction))); - - // Display data address - if (dropAction.Action == DropAction.ActionType.Object) - { - StartShowDisassmbly(dropAction.Address, (int) Config.Mario.StructSize / 4); - } - else if (dropAction.Action == DropAction.ActionType.Mario) - { - StartShowDisassmbly(dropAction.Address, (int) Config.ObjectSlots.StructSize / 4); - } - } } } diff --git a/Source/SM64 Diagnostic/Managers/HackManager.cs b/Source/SM64 Diagnostic/Managers/HackManager.cs index 0d2b82686..e17e3b39f 100644 --- a/Source/SM64 Diagnostic/Managers/HackManager.cs +++ b/Source/SM64 Diagnostic/Managers/HackManager.cs @@ -7,7 +7,7 @@ using System.Windows.Forms; using SM64_Diagnostic.Utilities; -namespace SM64_Diagnostic.ManagerClasses +namespace SM64_Diagnostic.Managers { public class HackManager { diff --git a/Source/SM64 Diagnostic/Managers/HudManager.cs b/Source/SM64 Diagnostic/Managers/HudManager.cs index 040a998b2..c62d465ae 100644 --- a/Source/SM64 Diagnostic/Managers/HudManager.cs +++ b/Source/SM64 Diagnostic/Managers/HudManager.cs @@ -8,29 +8,16 @@ using SM64_Diagnostic.Utilities; using SM64_Diagnostic.Controls; -namespace SM64_Diagnostic.ManagerClasses +namespace SM64_Diagnostic.Managers { - public class HudManager + public class HudManager : DataManager { - List _watchVarControls; Control _tabControl; - FlowLayoutPanel _variableTable; - ProcessStream _stream; - public HudManager(ProcessStream stream, List data, Control tabControl) + public HudManager(ProcessStream stream, List hudData, Control tabControl) + : base(stream, hudData, tabControl.Controls["NoTearFlowLayoutPanelHud"] as NoTearFlowLayoutPanel) { _tabControl = tabControl; - _stream = stream; - - _variableTable = _tabControl.Controls["flowLayoutPanelHud"] as FlowLayoutPanel; - - _watchVarControls = new List(); - foreach (WatchVariable watchVar in data) - { - WatchVariableControl watchControl = new WatchVariableControl(_stream, watchVar, 0); - _variableTable.Controls.Add(watchControl.Control); - _watchVarControls.Add(watchControl); - } (_tabControl.Controls["buttonFillHp"] as Button).Click += buttonFill_Click; (_tabControl.Controls["buttonDie"] as Button).Click += buttonDie_Click; @@ -51,15 +38,5 @@ private void buttonFill_Click(object sender, EventArgs e) { MarioActions.RefillHp(_stream); } - - public virtual void Update(bool updateView) - { - // Update watch variables - foreach (var watchVar in _watchVarControls) - watchVar.Update(); - - if (!updateView) - return; - } } } diff --git a/Source/SM64 Diagnostic/Managers/ManagerContext.cs b/Source/SM64 Diagnostic/Managers/ManagerContext.cs new file mode 100644 index 000000000..c7f155869 --- /dev/null +++ b/Source/SM64 Diagnostic/Managers/ManagerContext.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SM64_Diagnostic.Managers +{ + public class ManagerContext + { + public static ManagerContext Current; + + public CameraManager CameraManager; + public DebugManager DebugManager; + public DisassemblyManager DisassemblyManager; + public HackManager HackManager; + public HudManager HudManager; + public MapManager MapManager; + public MarioManager MarioManager; + public MiscManager MiscManager; + public ObjectManager ObjectManager; + public ObjectSlotsManager ObjectSlotManager; + public OptionsManager OptionsManager; + public ScriptManager ScriptManager; + public TriangleManager TriangleManager; + } +} diff --git a/Source/SM64 Diagnostic/Managers/MapManager.cs b/Source/SM64 Diagnostic/Managers/MapManager.cs index f443d7181..7b2f6ac77 100644 --- a/Source/SM64 Diagnostic/Managers/MapManager.cs +++ b/Source/SM64 Diagnostic/Managers/MapManager.cs @@ -10,8 +10,9 @@ using OpenTK; using OpenTK.Graphics; using OpenTK.Graphics.OpenGL; +using SM64_Diagnostic.ManagerClasses; -namespace SM64_Diagnostic.ManagerClasses +namespace SM64_Diagnostic.Managers { public class MapManager { diff --git a/Source/SM64 Diagnostic/Managers/MarioManager.cs b/Source/SM64 Diagnostic/Managers/MarioManager.cs index a36f25eed..f537008d4 100644 --- a/Source/SM64 Diagnostic/Managers/MarioManager.cs +++ b/Source/SM64 Diagnostic/Managers/MarioManager.cs @@ -9,85 +9,78 @@ using SM64_Diagnostic.Controls; using SM64_Diagnostic.Extensions; -namespace SM64_Diagnostic.ManagerClasses +namespace SM64_Diagnostic.Managers { - public class MarioManager + public class MarioManager : DataManager { - List _marioDataControls; - FlowLayoutPanel _variableTable; - ProcessStream _stream; - DataContainer _deFactoSpeed, _slidingSpeed, _slidingAngle, _fallHeight; MapManager _mapManager; - public MarioManager(ProcessStream stream, List marioData, Control marioControl, FlowLayoutPanel variableTable, MapManager mapManager) + public MarioManager(ProcessStream stream, List marioData, Control marioControl, NoTearFlowLayoutPanel variableTable, MapManager mapManager) + : base(stream, marioData, variableTable, Config.Mario.StructAddress) { - // Register controls on the control (for drag-and-drop) - RegisterControlEvents(marioControl); - foreach (Control control in marioControl.Controls) - RegisterControlEvents(control); - - _variableTable = variableTable; - _stream = stream; _mapManager = mapManager; + } - _marioDataControls = new List(); + protected override void InitializeSpecialVariables() + { + _specialWatchVars = new List() + { + new DataContainer("DeFactoSpeed"), + new DataContainer("SlidingSpeed"), + new AngleDataContainer("SlidingAngle"), + new DataContainer("FallHeight"), + }; + } - _deFactoSpeed = new DataContainer("De Facto Speed"); - _slidingSpeed = new DataContainer("Sliding Speed"); - _slidingAngle = new DataContainer("Sliding Angle"); - _fallHeight = new DataContainer("Fall Height"); + public void ProcessSpecialVars() + { + UInt32 floorTriangle = _stream.GetUInt32(Config.Mario.StructAddress + Config.Mario.FloorTriangleOffset); + var floorY = BitConverter.ToSingle(_stream.ReadRam(Config.Mario.StructAddress + Config.Mario.GroundYOffset, 4), 0); - foreach (WatchVariable watchVar in marioData) + float slidingSpeedX = BitConverter.ToSingle(_stream.ReadRam(Config.Mario.StructAddress + Config.Mario.SlidingSpeedXOffset, 4), 0); + float slidingSpeedZ = BitConverter.ToSingle(_stream.ReadRam(Config.Mario.StructAddress + Config.Mario.SlidingSpeedZOffset, 4), 0); + foreach (var specialVar in _specialWatchVars) { - if (!watchVar.Special) - { - WatchVariableControl watchControl = new WatchVariableControl(_stream, watchVar, Config.Mario.StructAddress); - variableTable.Controls.Add(watchControl.Control); - _marioDataControls.Add(watchControl); - continue; - } - - switch (watchVar.SpecialType) + switch(specialVar.SpecialName) { case "DeFactoSpeed": - _deFactoSpeed.Name = watchVar.Name; - variableTable.Controls.Add(_deFactoSpeed.Control); + if (floorTriangle != 0x00) + { + float hSpeed = _stream.GetSingle(Config.Mario.StructAddress + Config.Mario.HSpeedOffset); + float normY = _stream.GetSingle(floorTriangle + Config.TriangleOffsets.NormY); + (specialVar as DataContainer).Text = Math.Round(hSpeed * normY, 3).ToString(); + } + else + { + (specialVar as DataContainer).Text = "(No Floor)"; + } break; case "SlidingSpeed": - _slidingSpeed.Name = watchVar.Name; - variableTable.Controls.Add(_slidingSpeed.Control); + (specialVar as DataContainer).Text = Math.Round(Math.Sqrt(slidingSpeedX * slidingSpeedX + slidingSpeedZ * slidingSpeedZ), 3).ToString(); break; case "SlidingAngle": - _slidingAngle.Name = watchVar.Name; - //variableTable.Controls.Add(_slidingAngle.Control); + (specialVar as AngleDataContainer).AngleValue = Math.PI / 2 - Math.Atan2(slidingSpeedZ, slidingSpeedX); + (specialVar as AngleDataContainer).ValueExists = (slidingSpeedX != 0) || (slidingSpeedZ != 0); break; case "FallHeight": - _fallHeight.Name = watchVar.Name; - variableTable.Controls.Add(_fallHeight.Control); - break; - - default: - var failedContainer = new DataContainer(watchVar.Name); - failedContainer.Text = "Couldn't Find"; - variableTable.Controls.Add(failedContainer.Control); + (specialVar as DataContainer).Text = (_stream.GetSingle(Config.Mario.StructAddress + Config.Mario.PeakHeightOffset) - floorY).ToString(); break; } } } - public void Update(bool updateView) + public override void Update(bool updateView) { // Get Mario position and rotation float x, y, z, rot; var marioAddress = Config.Mario.StructAddress; - x = BitConverter.ToSingle(_stream.ReadRam(marioAddress + Config.Mario.XOffset, 4), 0); - y = BitConverter.ToSingle(_stream.ReadRam(marioAddress + Config.Mario.YOffset, 4), 0); - z = BitConverter.ToSingle(_stream.ReadRam(marioAddress + Config.Mario.ZOffset, 4), 0); - rot = (float) (((BitConverter.ToUInt32(_stream.ReadRam(marioAddress + Config.Mario.RotationOffset, 4), 0) - >> 16) % 65536) / 65536f * 360f); + x = _stream.GetSingle(marioAddress + Config.Mario.XOffset); + y = _stream.GetSingle(marioAddress + Config.Mario.YOffset); + z = _stream.GetSingle(marioAddress + Config.Mario.ZOffset); + rot = (float) (((_stream.GetUInt32(marioAddress + Config.Mario.RotationOffset) >> 16) % 65536) / 65536f * 360f); // Update Mario map object _mapManager.MarioMapObject.X = x; @@ -98,9 +91,9 @@ public void Update(bool updateView) // Get holp position float holpX, holpY, holpZ; - holpX = BitConverter.ToSingle(_stream.ReadRam(Config.HolpX, 4), 0); - holpY = BitConverter.ToSingle(_stream.ReadRam(Config.HolpY, 4), 0); - holpZ = BitConverter.ToSingle(_stream.ReadRam(Config.HolpZ, 4), 0); + holpX = _stream.GetSingle(Config.HolpX); + holpY = _stream.GetSingle(Config.HolpY); + holpZ = _stream.GetSingle(Config.HolpZ); // Update holp map object position _mapManager.HolpMapObject.X = holpX; @@ -110,24 +103,24 @@ public void Update(bool updateView) // Update camera position and rotation float cameraX, cameraY, cameraZ , cameraRot; - cameraX = BitConverter.ToSingle(_stream.ReadRam(Config.CameraX, 4), 0); - cameraY = BitConverter.ToSingle(_stream.ReadRam(Config.CameraY, 4), 0); - cameraZ = BitConverter.ToSingle(_stream.ReadRam(Config.CameraZ, 4), 0); - cameraRot = (float)(((UInt16)(BitConverter.ToUInt32(_stream.ReadRam(Config.CameraRot, 4), 0))) / 65536f * 360f); + cameraX = _stream.GetSingle(Config.CameraX); + cameraY = _stream.GetSingle(Config.CameraY); + cameraZ = _stream.GetSingle(Config.CameraZ); + cameraRot = (float)(((UInt16)(_stream.GetUInt32(Config.CameraRot)) / 65536f * 360f)); // Update floor triangle - UInt32 floorTriangle = BitConverter.ToUInt32(_stream.ReadRam(Config.Mario.StructAddress + Config.Mario.FloorTriangleOffset, 4), 0); + UInt32 floorTriangle = _stream.GetUInt32(Config.Mario.StructAddress + Config.Mario.FloorTriangleOffset); if (floorTriangle != 0x00) { - Int16 x1 = BitConverter.ToInt16(_stream.ReadRam(floorTriangle + Config.TriangleOffsets.X1, 2), 0); - Int16 y1 = BitConverter.ToInt16(_stream.ReadRam(floorTriangle + Config.TriangleOffsets.Y1, 2), 0); - Int16 z1 = BitConverter.ToInt16(_stream.ReadRam(floorTriangle + Config.TriangleOffsets.Z1, 2), 0); - Int16 x2 = BitConverter.ToInt16(_stream.ReadRam(floorTriangle + Config.TriangleOffsets.X2, 2), 0); - Int16 y2 = BitConverter.ToInt16(_stream.ReadRam(floorTriangle + Config.TriangleOffsets.Y2, 2), 0); - Int16 z2 = BitConverter.ToInt16(_stream.ReadRam(floorTriangle + Config.TriangleOffsets.Z2, 2), 0); - Int16 x3 = BitConverter.ToInt16(_stream.ReadRam(floorTriangle + Config.TriangleOffsets.X3, 2), 0); - Int16 y3 = BitConverter.ToInt16(_stream.ReadRam(floorTriangle + Config.TriangleOffsets.Y3, 2), 0); - Int16 z3 = BitConverter.ToInt16(_stream.ReadRam(floorTriangle + Config.TriangleOffsets.Z3, 2), 0); + Int16 x1 = _stream.GetInt16(floorTriangle + Config.TriangleOffsets.X1); + Int16 y1 = _stream.GetInt16(floorTriangle + Config.TriangleOffsets.Y1); + Int16 z1 = _stream.GetInt16(floorTriangle + Config.TriangleOffsets.Z1); + Int16 x2 = _stream.GetInt16(floorTriangle + Config.TriangleOffsets.X2); + Int16 y2 = _stream.GetInt16(floorTriangle + Config.TriangleOffsets.Y2); + Int16 z2 = _stream.GetInt16(floorTriangle + Config.TriangleOffsets.Z2); + Int16 x3 = _stream.GetInt16(floorTriangle + Config.TriangleOffsets.X3); + Int16 y3 = _stream.GetInt16(floorTriangle + Config.TriangleOffsets.Y3); + Int16 z3 = _stream.GetInt16(floorTriangle + Config.TriangleOffsets.Z3); _mapManager.FloorTriangleMapObject.X1 = x1; _mapManager.FloorTriangleMapObject.Z1 = z1; _mapManager.FloorTriangleMapObject.X2 = x2; @@ -144,78 +137,12 @@ public void Update(bool updateView) _mapManager.CameraMapObject.Z = cameraZ; _mapManager.CameraMapObject.Rotation = cameraRot; - // Update watch variables - foreach (var watchVar in _marioDataControls) - watchVar.Update(); - // We are done if we don't need to update the Mario Manager view if (!updateView) return; - var floorY = BitConverter.ToSingle(_stream.ReadRam(Config.Mario.StructAddress + Config.Mario.GroundYOffset, 4), 0); - - if (floorTriangle != 0x00) - { - float hSpeed = BitConverter.ToSingle(_stream.ReadRam(Config.Mario.StructAddress + Config.Mario.HSpeedOffset, 4), 0); - float normY = BitConverter.ToSingle(_stream.ReadRam(floorTriangle + Config.TriangleOffsets.NormY, 4), 0); - _deFactoSpeed.Text = (hSpeed * normY).ToString(); - } - else - _deFactoSpeed.Text = "(No Floor)"; - - float slidingSpeedX = BitConverter.ToSingle(_stream.ReadRam(Config.Mario.StructAddress + Config.Mario.SlidingSpeedXOffset, 4), 0); - float slidingSpeedZ = BitConverter.ToSingle(_stream.ReadRam(Config.Mario.StructAddress + Config.Mario.SlidingSpeedZOffset, 4), 0); - - _slidingSpeed.Text = ((float)Math.Sqrt(slidingSpeedX * slidingSpeedX + slidingSpeedZ * slidingSpeedZ)).ToString(); - - _fallHeight.Text = (BitConverter.ToSingle(_stream.ReadRam(Config.Mario.StructAddress + Config.Mario.PeakHeightOffset, 4), 0) - floorY).ToString(); - } - - private void RegisterControlEvents(Control control) - { - control.AllowDrop = true; - control.DragEnter += DragEnter; - control.DragDrop += OnDrop; - control.MouseDown += OnDrag; - } - - private void OnDrag(object sender, EventArgs e) - { - // Start the drag and drop but setting the object slot index in Drag and Drop data - var dropAction = new DropAction(DropAction.ActionType.Mario, Config.Mario.StructAddress); - (sender as Control).DoDragDrop(dropAction, DragDropEffects.All); - } - - private void DragEnter(object sender, DragEventArgs e) - { - // Make sure we have valid Drag and Drop data (it is an index) - if (!e.Data.GetDataPresent(typeof(DropAction))) - { - e.Effect = DragDropEffects.None; - return; - } - - var dropAction = ((DropAction)e.Data.GetData(typeof(DropAction))).Action; - if (dropAction != DropAction.ActionType.Object && dropAction != DropAction.ActionType.Mario) - { - e.Effect = DragDropEffects.None; - return; - } - - e.Effect = DragDropEffects.Move; - } - - private void OnDrop(object sender, DragEventArgs e) - { - // Make sure we have valid Drag and Drop data (it is an index) - if (!e.Data.GetDataPresent(typeof(DropAction))) - return; - - var dropAction = ((DropAction)e.Data.GetData(typeof(DropAction))); - if (dropAction.Action != DropAction.ActionType.Object) - return; - - MarioActions.MoveObjectToMario(_stream, dropAction.Address); + base.Update(); + ProcessSpecialVars(); } } } diff --git a/Source/SM64 Diagnostic/Managers/MiscManager.cs b/Source/SM64 Diagnostic/Managers/MiscManager.cs index 5bb6dc0c1..11dbb7493 100644 --- a/Source/SM64 Diagnostic/Managers/MiscManager.cs +++ b/Source/SM64 Diagnostic/Managers/MiscManager.cs @@ -9,67 +9,21 @@ using SM64_Diagnostic.Extensions; using SM64_Diagnostic.Controls; -namespace SM64_Diagnostic.ManagerClasses +namespace SM64_Diagnostic.Managers { - public class MiscManager + public class MiscManager : DataManager { - List _watchVarControls; - FlowLayoutPanel _variableTable; - ProcessStream _stream; - DataContainer _rngIndex, _rngPerFrame, _activeObjCnt; Control _puController; public int ActiveObjectCount = 0; enum PuControl { Home, PuUp, PuDown, PuLeft, PuRight, QpuUp, QpuDown, QpuLeft, QpuRight}; - public MiscManager(ProcessStream stream, List watchVariables, FlowLayoutPanel variableTable, Control puController) + public MiscManager(ProcessStream stream, List watchVariables, NoTearFlowLayoutPanel variableTable, Control puController) + : base(stream, watchVariables, variableTable) { - _variableTable = variableTable; - _stream = stream; _puController = puController; - // Initialize special variables - _rngIndex = new DataContainer("RNG Index"); - _rngPerFrame = new DataContainer("RNG Calls/Frame"); - _activeObjCnt = new DataContainer("Num. Loaded Objs."); - - _watchVarControls = new List(); - foreach (WatchVariable watchVar in watchVariables) - { - if (!watchVar.Special) - { - WatchVariableControl watchControl = new WatchVariableControl(_stream, watchVar, 0); - variableTable.Controls.Add(watchControl.Control); - _watchVarControls.Add(watchControl); - continue; - } - - switch (watchVar.SpecialType) - { - case "RngIndex": - _rngIndex.Name = watchVar.Name; - variableTable.Controls.Add(_rngIndex.Control); - break; - - case "RngCallsPerFrame": - _rngPerFrame.Name = watchVar.Name; - variableTable.Controls.Add(_rngPerFrame.Control); - break; - - case "NumberOfLoadedObjects": - _activeObjCnt.Name = watchVar.Name; - variableTable.Controls.Add(_activeObjCnt.Control); - break; - - default: - var failedContainer = new DataContainer(watchVar.Name); - failedContainer.Text = "Couldn't Find"; - variableTable.Controls.Add(failedContainer.Control); - break; - } - } - // Pu Controller initialize and register click events _puController.Controls["buttonPuConHome"].Click += (sender, e) => PuControl_Click(sender, e, PuControl.Home); _puController.Controls["buttonPuConZnQpu"].Click += (sender, e) => PuControl_Click(sender, e, PuControl.QpuUp); @@ -82,6 +36,16 @@ public MiscManager(ProcessStream stream, List watchVariables, Flo _puController.Controls["buttonPuConXpPu"].Click += (sender, e) => PuControl_Click(sender, e, PuControl.PuRight); } + protected override void InitializeSpecialVariables() + { + _specialWatchVars = new List() + { + new DataContainer("RngIndex"), + new DataContainer("RngCallsPerFrame"), + new DataContainer("NumberOfLoadedObjects") + }; + } + private void PuControl_Click(object sender, EventArgs e, PuControl controlType) { switch(controlType) @@ -116,22 +80,36 @@ private void PuControl_Click(object sender, EventArgs e, PuControl controlType) } } - public void Update(bool updateView) + private void ProcessSpecialVars() { - // Update watch variables - foreach (var watchVar in _watchVarControls) - watchVar.Update(); + foreach (var specialVar in _specialWatchVars) + { + switch(specialVar.SpecialName) + { + case "RngIndex": + int rngIndex = RngIndexer.GetRngIndex(_stream.GetUInt16(Config.RngAddress)); + (specialVar as DataContainer).Text = (rngIndex < 0) ? "N/A [" + (-rngIndex).ToString() + "]" : rngIndex.ToString(); + break; + case "RngCallsPerFrame": + (specialVar as DataContainer).Text = GetRngCallsPerFrame().ToString(); + break; + + case "NumberOfLoadedObjects": + (specialVar as DataContainer).Text = ActiveObjectCount.ToString(); + break; + } + } + } + + public override void Update(bool updateView) + { if (!updateView) return; - // Update the rng index - int rngIndex = RngIndexer.GetRngIndex(BitConverter.ToUInt16(_stream.ReadRam(Config.RngAddress, 2), 0)); - _rngIndex.Text = (rngIndex < 0) ? "N/A [" + (-rngIndex).ToString() + "]" : rngIndex.ToString(); - - _rngPerFrame.Text = GetRngCallsPerFrame().ToString(); + base.Update(); + ProcessSpecialVars(); - _activeObjCnt.Text = ActiveObjectCount.ToString(); _puController.Controls["labelPuConPuValue"].Text = PuUtilities.GetPuPosString(_stream); _puController.Controls["labelPuConQpuValue"].Text = PuUtilities.GetQpuPosString(_stream); } diff --git a/Source/SM64 Diagnostic/Managers/ObjectManager.cs b/Source/SM64 Diagnostic/Managers/ObjectManager.cs index 688d294b9..fd6ba4992 100644 --- a/Source/SM64 Diagnostic/Managers/ObjectManager.cs +++ b/Source/SM64 Diagnostic/Managers/ObjectManager.cs @@ -10,7 +10,7 @@ using SM64_Diagnostic.Controls; using SM64_Diagnostic.Extensions; -namespace SM64_Diagnostic.ManagerClasses +namespace SM64_Diagnostic.Managers { public class ObjectManager : DataManager { @@ -20,10 +20,9 @@ public class ObjectManager : DataManager object _watchVarLocker = new object(); - uint _currentAddress; - int _slotIndex; + string _slotIndex; string _slotPos; - uint _behavior; + string _behavior; bool _unclone = false; #region Fields @@ -48,31 +47,41 @@ public void SetBehaviorWatchVariables(List value, Color color) _dataControls.Add(newWatchVarControl); _objGui.ObjectFlowLayout.Controls.Add(newWatchVarControl.Control); } - _behaviorDataControls.ForEach(w => w.OtherOffset = _currentAddress); + _behaviorDataControls.ForEach(w => w.OtherOffsets = _currentAddresses); } } - public uint? CurrentAddress + List _currentAddresses = new List(); + public List CurrentAddresses { get { - return _currentAddress; + return _currentAddresses; } set { - if (_currentAddress != value) + if (_currentAddresses.SequenceEqual(value)) + return; + + _currentAddresses = value.ToList(); + + if (_currentAddresses.Count > 1) + _objGui.ObjAddressLabelValue.Text = ""; + else if (_currentAddresses.Count > 0) + _objGui.ObjAddressLabelValue.Text = "0x" + _currentAddresses[0].ToString("X8"); + else + _objGui.ObjAddressLabelValue.Text = ""; + + AddressChanged(); + + foreach (WatchVariableControl watchVar in _dataControls) { - _currentAddress = value.HasValue ? value.Value : 0x0000; - _objGui.ObjAddressLabelValue.Text = "0x" + _currentAddress.ToString("X8"); - foreach (WatchVariableControl watchVar in _dataControls) - { - watchVar.OtherOffset = _currentAddress; - } + watchVar.OtherOffsets = _currentAddresses; } } } - public int SlotIndex + public string SlotIndex { get { @@ -83,7 +92,7 @@ public int SlotIndex if (_slotIndex != value) { _slotIndex = value; - _objGui.ObjSlotIndexLabel.Text = _slotIndex.ToString(); + _objGui.ObjSlotIndexLabel.Text = _slotIndex; } } } @@ -104,7 +113,7 @@ public string SlotPos } } - public uint Behavior + public string Behavior { get { @@ -115,7 +124,7 @@ public uint Behavior if (_behavior != value) { _behavior = value; - _objGui.ObjBehaviorLabel.Text = "0x" + _behavior.ToString("X4"); + _objGui.ObjBehaviorLabel.Text = value; } } } @@ -140,7 +149,7 @@ public Color BackColor if (_objGui.ObjectBorderPanel.BackColor != value) { _objGui.ObjectBorderPanel.BackColor = value; - _objGui.ObjectImagePictureBox.BackColor = value.Lighten(0.5); + _objGui.ObjectImagePictureBox.BackColor = value.Lighten(0.7); } } get @@ -166,12 +175,16 @@ public Image Image protected override void InitializeSpecialVariables() { - _specialWatchVars = new List() + _specialWatchVars = new List() { new DataContainer("MarioDistanceToObject"), new DataContainer("MarioLateralDistanceToObject"), new DataContainer("MarioDistanceToObjectHome"), new DataContainer("MarioLateralDistanceToObjectHome"), + new AngleDataContainer("MarioAngleToObject"), + new AngleDataContainer("MarioDeltaAngleToObject"), + new AngleDataContainer("AngleToMario"), + new AngleDataContainer("DeltaAngleToMario"), new DataContainer("ObjectDistanceToHome"), new DataContainer("LateralObjectDistanceToHome"), new DataContainer("RngCallsPerFrame"), @@ -183,11 +196,6 @@ public ObjectManager(ProcessStream stream, ObjectAssociations objAssoc, List> 16) % 65536) / 65536f * 2 * Math.PI); - // Get object position - float objX, objY, objZ; - objX = _stream.GetSingle(_currentAddress + Config.ObjectSlots.ObjectXOffset); - objY = _stream.GetSingle(_currentAddress + Config.ObjectSlots.ObjectYOffset); - objZ = _stream.GetSingle(_currentAddress + Config.ObjectSlots.ObjectZOffset); + bool firstObject = true; - // Get object position - float objHomeX, objHomeY, objHomeZ; - objHomeX = _stream.GetSingle(_currentAddress + Config.ObjectSlots.HomeXOffset); - objHomeY = _stream.GetSingle(_currentAddress + Config.ObjectSlots.HomeYOffset); - objHomeZ = _stream.GetSingle(_currentAddress + Config.ObjectSlots.HomeZOffset); + foreach (var objAddress in _currentAddresses) + { + // Get object position + float objX, objY, objZ, objFacing; + objX = _stream.GetSingle(objAddress + Config.ObjectSlots.ObjectXOffset); + objY = _stream.GetSingle(objAddress + Config.ObjectSlots.ObjectYOffset); + objZ = _stream.GetSingle(objAddress + Config.ObjectSlots.ObjectZOffset); + objFacing = (float)((UInt16)(_stream.GetUInt32(objAddress + Config.ObjectSlots.ObjectRotationOffset)) / 65536f * 2 * Math.PI); - foreach (DataContainer specialVar in _specialWatchVars) - { - switch (specialVar.SpecialName) + double angleToMario = Math.PI / 2 - MoreMath.AngleTo(objX, objZ, mX, mZ); + + // Get object position + float objHomeX, objHomeY, objHomeZ; + objHomeX = _stream.GetSingle(objAddress + Config.ObjectSlots.HomeXOffset); + objHomeY = _stream.GetSingle(objAddress + Config.ObjectSlots.HomeYOffset); + objHomeZ = _stream.GetSingle(objAddress + Config.ObjectSlots.HomeZOffset); + + foreach (IDataContainer specialVar in _specialWatchVars) { - case "MarioDistanceToObject": - specialVar.Text = MoreMath.DistanceTo(mX, mY, mZ, objX, objY, objZ).ToString(); - break; + var newText = ""; + double? newAngle = null; + switch (specialVar.SpecialName) + { + case "MarioDistanceToObject": + newText = Math.Round(MoreMath.DistanceTo(mX, mY, mZ, objX, objY, objZ),3).ToString(); + break; + + case "MarioLateralDistanceToObject": + newText = Math.Round(MoreMath.DistanceTo(mX, mZ, objX, objZ), 3).ToString(); + break; + + case "MarioDistanceToObjectHome": + newText = Math.Round(MoreMath.DistanceTo(mX, mY, mZ, objHomeX, objHomeY, objHomeZ), 3).ToString(); + break; + + case "MarioLateralDistanceToObjectHome": + newText = Math.Round(MoreMath.DistanceTo(mX, mZ, objHomeX, objHomeZ), 3).ToString(); + break; - case "MarioLateralDistanceToObject": - specialVar.Text = MoreMath.DistanceTo(mX, mZ, objX, objZ).ToString(); - break; + case "ObjectDistanceToHome": + newText = Math.Round(MoreMath.DistanceTo(objX, objY, objZ, objHomeX, objHomeY, objHomeZ), 3).ToString(); + break; - case "MarioDistanceToObjectHome": - specialVar.Text = MoreMath.DistanceTo(mX, mY, mZ, objHomeX, objHomeY, objHomeZ).ToString(); - break; + case "LateralObjectDistanceToHome": + newText = Math.Round(MoreMath.DistanceTo(objX, objZ, objHomeX, objHomeZ), 3).ToString(); + break; - case "MarioLateralDistanceToObjectHome": - specialVar.Text = MoreMath.DistanceTo(mX, mZ, objHomeX, objHomeZ).ToString(); - break; + case "MarioAngleToObject": + newAngle = angleToMario + Math.PI; + break; - case "ObjectDistanceToHome": - specialVar.Text = MoreMath.DistanceTo(objX, objY, objZ, objHomeX, objHomeY, objHomeZ).ToString(); - break; + case "MarioDeltaAngleToObject": + newAngle = mFacing - (angleToMario + Math.PI); + break; - case "LateralObjectDistanceToHome": - specialVar.Text = MoreMath.DistanceTo(objX, objZ, objHomeX, objHomeZ).ToString(); - break; + case "AngleToMario": + newAngle = angleToMario; + break; + + case "DeltaAngleToMario": + newAngle = objFacing - angleToMario; + break; + + case "RngCallsPerFrame": + newText = GetNumRngCalls(objAddress).ToString(); + break; + } - case "RngCallsPerFrame": - specialVar.Text = GetNumRngCalls().ToString(); - break; + if (specialVar is AngleDataContainer) + { + var angleContainer = specialVar as AngleDataContainer; + if (firstObject) + { + angleContainer.ValueExists = newAngle.HasValue; + if (newAngle.HasValue) + angleContainer.AngleValue = newAngle.Value; + } + + newAngle %= Math.PI * 2; + if (newAngle < 0) + newAngle += Math.PI * 2; + + // Check when multiple objects have different values + angleContainer.ValueExists &= newAngle == angleContainer.AngleValue; + } + else if (specialVar is DataContainer) + { + var dataContainer = specialVar as DataContainer; + if (firstObject) + dataContainer.Text = newText; + // Check when multiple objects have different values + else if (dataContainer.Text != newText) + dataContainer.Text = ""; + } } + + firstObject = false; } } @@ -301,7 +381,7 @@ public override void Update(bool updateView) uint holdingObj = _stream.GetUInt32(Config.Mario.StructAddress + Config.Mario.HoldingObjectPointerOffset); // Change to unclone if we are already holding the object - if ((holdingObj == _currentAddress) != _unclone) + if ((_currentAddresses.Contains(holdingObj)) != _unclone) { _unclone = !_unclone; @@ -313,7 +393,7 @@ public override void Update(bool updateView) ProcessSpecialVars(); } - private int GetNumRngCalls() + private int GetNumRngCalls(uint objAddress) { var numberOfRngObjs = BitConverter.ToUInt32(_stream.ReadRam(Config.RngRecordingAreaAddress, 4), 0); @@ -323,7 +403,7 @@ private int GetNumRngCalls() { uint rngStructAdd = (uint)(Config.RngRecordingAreaAddress + 0x10 + 0x08 * i); var address = BitConverter.ToUInt32(_stream.ReadRam(rngStructAdd + 0x04, 4), 0); - if (address != _currentAddress) + if (address != objAddress) continue; var preRng = BitConverter.ToUInt16(_stream.ReadRam(rngStructAdd + 0x00, 2), 0); @@ -335,51 +415,5 @@ private int GetNumRngCalls() return numOfCalls; } - - private void RegisterControlEvents(Control control) - { - control.AllowDrop = true; - control.DragEnter += DragEnter; - control.DragDrop += OnDrop; - control.MouseDown += OnDrag; - } - - private void OnDrag(object sender, EventArgs e) - { - if (!CurrentAddress.HasValue) - return; - - // Start the drag and drop but setting the object slot index in Drag and Drop data - var dropAction = new DropAction(DropAction.ActionType.Object, CurrentAddress.Value); - (sender as Control).DoDragDrop(dropAction, DragDropEffects.All); - } - - private void DragEnter(object sender, DragEventArgs e) - { - // Make sure we have valid Drag and Drop data (it is an index) - if (!e.Data.GetDataPresent(typeof(DropAction))) - { - e.Effect = DragDropEffects.None; - return; - } - - var dropAction = ((DropAction)e.Data.GetData(typeof(DropAction))).Action; - if (dropAction != DropAction.ActionType.Object && dropAction != DropAction.ActionType.Mario) - { - e.Effect = DragDropEffects.None; - return; - } - - e.Effect = DragDropEffects.Move; - } - - private void OnDrop(object sender, DragEventArgs e) - { - // Make sure we have valid Drag and Drop data (it is an index) - if (!e.Data.GetDataPresent(typeof(DropAction))) - return; - - var dropAction = ((DropAction)e.Data.GetData(typeof(DropAction))); - } } } diff --git a/Source/SM64 Diagnostic/Managers/ObjectSlotsManager.cs b/Source/SM64 Diagnostic/Managers/ObjectSlotsManager.cs index 7f2283278..236e4b442 100644 --- a/Source/SM64 Diagnostic/Managers/ObjectSlotsManager.cs +++ b/Source/SM64 Diagnostic/Managers/ObjectSlotsManager.cs @@ -7,8 +7,10 @@ using SM64_Diagnostic.Structs; using SM64_Diagnostic.Utilities; using System.Drawing; +using SM64_Diagnostic.Extensions; +using OpenTK.Input; -namespace SM64_Diagnostic.ManagerClasses +namespace SM64_Diagnostic.Managers { public class ObjectSlotsManager { @@ -27,7 +29,7 @@ public class ObjectSlotsManager Dictionary _mapObjects = new Dictionary(); Dictionary _memoryAddressSlotIndex; Dictionary _lastSlotLabel = new Dictionary(); - List _selectedSlotsAddresses = new List(); + public List SelectedSlotsAddresses = new List(); List _toggleMapGroups = new List(); List _toggleMapBehaviors = new List(); @@ -35,7 +37,12 @@ public class ObjectSlotsManager BehaviorCriteria? _lastSelectedBehavior; uint _standingOnObject, _interactingObject, _holdingObject, _usingObject, _closestObject; - int activeObjCnt; + int _activeObjCnt; + bool _selectedUpdated = false; + Image _multiImage = null; + + bool _firstSlotSelect = true; + List _prevSelectedBehaviorCriteria = new List(); public enum SortMethodType {ProcessingOrder, MemoryOrder, DistanceToMario}; public enum MapToggleModeType {Single, ObjectType, ProcessGroup}; @@ -95,10 +102,39 @@ private void OnClick(object sender, EventArgs e) switch (ManagerGui.TabControl.SelectedTab.Text) { default: + var keyboardState = Keyboard.GetState(0); ManagerGui.TabControl.SelectedTab = ManagerGui.TabControl.TabPages["tabPageObjects"]; - _selectedSlotsAddresses.Clear(); - _selectedSlotsAddresses.Add(selectedSlot.Address); - _objManager.CurrentAddress = selectedSlot.Address; + if (keyboardState.IsKeyDown(Key.ShiftLeft) || keyboardState.IsKeyDown(Key.ShiftRight) + && SelectedSlotsAddresses.Count > 0) + { + int minSelect = SelectedSlotsAddresses.Min(s => ObjectSlots.First(o => o.Address == s).Index); + int maxSelect = SelectedSlotsAddresses.Max(s => ObjectSlots.First(o => o.Address == s).Index); + int startRange = Math.Min(minSelect, selectedSlot.Index); + int endRange = Math.Max(maxSelect, selectedSlot.Index); + var selectedObjects = ObjectSlots.Where(o => o.Index >= startRange && o.Index <= endRange + && !SelectedSlotsAddresses.Contains(o.Address)); + SelectedSlotsAddresses.AddRange(selectedObjects.Select(o => o.Address)); + } + else + { + if (!(keyboardState.IsKeyDown(Key.ControlLeft) || keyboardState.IsKeyDown(Key.ControlRight))) + { + SelectedSlotsAddresses.Clear(); + } + if (SelectedSlotsAddresses.Contains(selectedSlot.Address)) + { + if (SelectedSlotsAddresses.Count > 1) + { + SelectedSlotsAddresses.Remove(selectedSlot.Address); + } + } + else + { + SelectedSlotsAddresses.Add(selectedSlot.Address); + } + } + + _objManager.CurrentAddresses = SelectedSlotsAddresses; break; case "Map": @@ -122,6 +158,7 @@ private void OnClick(object sender, EventArgs e) UpdateSelectedObjectSlots(); break; + case MapToggleModeType.ProcessGroup: var group = selectedSlot.ProcessGroup; if (_toggleMapGroups.Contains(group)) @@ -156,6 +193,31 @@ public void UpdateSelectedObjectSlots() } } + public string GetSlotNameFromAddress(uint address) + { + var slot = ObjectSlots.FirstOrDefault(s => s.Address == address); + if (slot == null) + return null; + + return slot.Text; + } + + public uint? GetSlotAddressFromName(string name) + { + name = name.ToLower(); + + if (!name.StartsWith("slot: ")) + return null; + + name = name.Remove(0, "slot: ".Length); + + var slot = ObjectSlots.FirstOrDefault(s => s.Text.ToLower() == name); + if (slot == null) + return null; + + return slot.Address; + } + private List GetProcessedObjects(ObjectGroupsConfig groupConfig, ObjectSlotsConfig slotConfig) { var newObjectSlotData = new ObjectSlotData[slotConfig.MaxSlots]; @@ -222,8 +284,6 @@ private List GetProcessedObjects(ObjectGroupsConfig groupConfig, _stream.ReadRam(currentObject + groupConfig.ProcessNextLinkOffset, 4), 0); } - // Calculate distance to Mario - return newObjectSlotData.ToList(); } @@ -256,15 +316,15 @@ public void Update() marioZ = BitConverter.ToSingle(_stream.ReadRam(Config.Mario.StructAddress + Config.Mario.ZOffset, 4), 0); // Calculate distance to Mario - foreach(var objSlot in newObjectSlotData) - { + foreach (var objSlot in newObjectSlotData) + { // Get object relative-to-maario position float dX, dY, dZ; dX = marioX - BitConverter.ToSingle(_stream.ReadRam(objSlot.Address + Config.ObjectSlots.ObjectXOffset, 4), 0); dY = marioY - BitConverter.ToSingle(_stream.ReadRam(objSlot.Address + Config.ObjectSlots.ObjectYOffset, 4), 0); dZ = marioZ - BitConverter.ToSingle(_stream.ReadRam(objSlot.Address + Config.ObjectSlots.ObjectZOffset, 4), 0); - objSlot.DistanceToMario = (float) Math.Sqrt(dX * dX + dY * dY + dZ * dZ); + objSlot.DistanceToMario = (float)Math.Sqrt(dX * dX + dY * dY + dZ * dZ); // Check if active/loaded objSlot.IsActive = BitConverter.ToUInt16(_stream.ReadRam(objSlot.Address + Config.ObjectSlots.ObjectActiveOffset, 2), 0) != 0x0000; @@ -295,7 +355,7 @@ public void Update() break; } - activeObjCnt = 0; + _activeObjCnt = 0; _standingOnObject = BitConverter.ToUInt32(_stream.ReadRam(Config.Mario.StandingOnObjectPointer, 4), 0); _interactingObject = BitConverter.ToUInt32(_stream.ReadRam(Config.Mario.InteractingObjectPointerOffset + Config.Mario.StructAddress, 4), 0); @@ -305,24 +365,93 @@ public void Update() : s.DistanceToMario).First().Address; // Update slots + BehaviorCriteria? multiBehavior = null; + List selectedBehaviorCriterias = new List(); + bool firstObject = true; for (int i = 0; i < slotConfig.MaxSlots; i++) { - UpdateSlot(newObjectSlotData[i], i); + var behaviorCritera = UpdateSlot(newObjectSlotData[i], i); + if (!SelectedSlotsAddresses.Contains(newObjectSlotData[i].Address)) + continue; + + selectedBehaviorCriterias.Add(behaviorCritera); + + if (multiBehavior.HasValue) + { + multiBehavior = multiBehavior.Value.Generalize(behaviorCritera); + } + else if (firstObject) + { + multiBehavior = behaviorCritera; + firstObject = false; + } + } + _miscManager.ActiveObjectCount = _activeObjCnt; + + if (SelectedSlotsAddresses.Count > 1) + { + if (_selectedUpdated || !selectedBehaviorCriterias.SequenceEqual(_prevSelectedBehaviorCriteria)) + { + if (_lastSelectedBehavior != multiBehavior) + { + if (multiBehavior.HasValue) + { + _objManager.Behavior = String.Format("0x{0}", ((multiBehavior.Value.BehaviorAddress + ObjectAssoc.RamOffset) & 0x00FFFFFF).ToString("X4")); + _objManager.SetBehaviorWatchVariables(ObjectAssoc.GetWatchVariables(multiBehavior.Value), Config.ObjectGroups.VacantSlotColor.Lighten(0.8)); + } + else + { + _objManager.Behavior = ""; + _objManager.SetBehaviorWatchVariables(new List(), Color.White); + } + _lastSelectedBehavior = multiBehavior; + } + + _multiImage?.Dispose(); + var multiBitmap = new Bitmap(256, 256); + int subImageCount = Math.Min(4, selectedBehaviorCriterias.Count); + using (Graphics gfx = Graphics.FromImage(multiBitmap)) + { + Rectangle[] subImagePlaces = + { + new Rectangle(0, 0, 128, 128), + new Rectangle(128, 0, 128, 128), + new Rectangle(0, 128, 128, 128), + new Rectangle(128, 128, 128, 128) + }; + for (int i = 0; i < subImageCount; i++) + { + gfx.DrawImage(ObjectAssoc.GetObjectImage(selectedBehaviorCriterias[i], false), subImagePlaces[i]); + } + } + _multiImage = multiBitmap; + _objManager.Image = _multiImage; + + _objManager.Name = "Multiple Objects Selected"; + _objManager.BackColor = Config.ObjectGroups.VacantSlotColor; + _objManager.SlotIndex = ""; + _objManager.SlotPos = ""; + _prevSelectedBehaviorCriteria = selectedBehaviorCriterias; + } + } + else if (SelectedSlotsAddresses.Count == 0) + { + _objManager.Name = "No Object Selected"; + _firstSlotSelect = true; } - _miscManager.ActiveObjectCount = activeObjCnt; } - private void UpdateSlot(ObjectSlotData objectData, int index) + private BehaviorCriteria UpdateSlot(ObjectSlotData objectData, int index) { var objSlot = ObjectSlots[index]; uint currentAddress = objectData.Address; - + BehaviorCriteria behaviorCriteria; objSlot.IsActive = objectData.IsActive; objSlot.Address = currentAddress; // Update Overlays - objSlot.DrawSelectedOverlay = _selectedSlotsAddresses.Contains(currentAddress); + objSlot.DrawSelectedOverlay = SelectedSlotsAddresses.Contains(currentAddress); objSlot.DrawStandingOnOverlay = Config.ShowOverlays && currentAddress == _standingOnObject; objSlot.DrawInteractingOverlay = Config.ShowOverlays && currentAddress == _interactingObject; objSlot.DrawHoldingOverlay = Config.ShowOverlays && currentAddress == _holdingObject; @@ -330,13 +459,13 @@ private void UpdateSlot(ObjectSlotData objectData, int index) objSlot.DrawClosestOverlay = Config.ShowOverlays && currentAddress == _closestObject; if (objectData.IsActive) - activeObjCnt++; + _activeObjCnt++; - var gfxId = BitConverter.ToUInt32(_stream.ReadRam(currentAddress + Config.ObjectSlots.BehaviorGfxOffset, 4), 0); - var subType = BitConverter.ToInt32(_stream.ReadRam(currentAddress + Config.ObjectSlots.BehaviorSubtypeOffset, 4), 0); - var appearance = BitConverter.ToInt32(_stream.ReadRam(currentAddress + Config.ObjectSlots.BehaviorAppearance, 4), 0); + var gfxId = _stream.GetUInt32(currentAddress + Config.ObjectSlots.BehaviorGfxOffset); + var subType = _stream.GetInt32(currentAddress + Config.ObjectSlots.BehaviorSubtypeOffset); + var appearance = _stream.GetInt32(currentAddress + Config.ObjectSlots.BehaviorAppearance); - var behaviorCriteria = new BehaviorCriteria() + behaviorCriteria = new BehaviorCriteria() { BehaviorAddress = objectData.Behavior, GfxId = gfxId, @@ -364,7 +493,7 @@ private void UpdateSlot(ObjectSlotData objectData, int index) case SlotLabelType.SlotIndex: labelText = String.Format("{0}", (objectData.Address - Config.ObjectSlots.LinkStartAddress) - / Config.ObjectSlots.StructSize); + / Config.ObjectSlots.StructSize + (Config.SlotIndexsFromOne ? 1 : 0)); break; case SlotLabelType.SlotPos: @@ -391,22 +520,23 @@ private void UpdateSlot(ObjectSlotData objectData, int index) ObjectSlots[index].Text = ManagerGui.LockLabelsCheckbox.Checked ? _lastSlotLabel[currentAddress] : labelText; // Update object manager image - if (_selectedSlotsAddresses.Contains(currentAddress)) + if (SelectedSlotsAddresses.Count <= 1 && SelectedSlotsAddresses.Contains(currentAddress)) { var objAssoc = ObjectAssoc.FindObjectAssociation(behaviorCriteria); var newBehavior = objAssoc != null ? objAssoc.BehaviorCriteria : (BehaviorCriteria?)null; - if (_lastSelectedBehavior != newBehavior) + if (_lastSelectedBehavior != newBehavior || _firstSlotSelect) { - _objManager.Behavior = (objectData.Behavior + ObjectAssoc.RamOffset) & 0x00FFFFFF; + _objManager.Behavior = String.Format("0x{0}", ((objectData.Behavior + ObjectAssoc.RamOffset) & 0x00FFFFFF).ToString("X4")); _objManager.Name = ObjectAssoc.GetObjectName(behaviorCriteria); _objManager.SetBehaviorWatchVariables(ObjectAssoc.GetWatchVariables(behaviorCriteria), newColor.Lighten(0.8)); _lastSelectedBehavior = newBehavior; + _firstSlotSelect = false; } _objManager.Image = ObjectSlots[index].ObjectImage; _objManager.BackColor = newColor; int slotPos = objectData.ObjectProcessGroup == VacantGroup ? objectData.VacantSlotIndex.Value : objectData.ProcessIndex; - _objManager.SlotIndex = _memoryAddressSlotIndex[currentAddress] + (Config.SlotIndexsFromOne ? 1 : 0); + _objManager.SlotIndex = (_memoryAddressSlotIndex[currentAddress] + (Config.SlotIndexsFromOne ? 1 : 0)).ToString(); _objManager.SlotPos = (objectData.ObjectProcessGroup == VacantGroup ? "VS " : "") + (slotPos + (Config.SlotIndexsFromOne ? 1 : 0)).ToString(); } @@ -445,29 +575,12 @@ private void UpdateSlot(ObjectSlotData objectData, int index) _mapObjects[currentAddress].Y = BitConverter.ToSingle(_stream.ReadRam(currentAddress + Config.ObjectSlots.ObjectYOffset, 4), 0); _mapObjects[currentAddress].Z = BitConverter.ToSingle(_stream.ReadRam(currentAddress + Config.ObjectSlots.ObjectZOffset, 4), 0); _mapObjects[currentAddress].IsActive = objectData.IsActive; - _mapObjects[currentAddress].Rotation = (float)((UInt16)(BitConverter.ToUInt32( - _stream.ReadRam(currentAddress + Config.ObjectSlots.ObjectRotationOffset, 4), 0)) / 65536f * 360f); + _mapObjects[currentAddress].Rotation = (float)((UInt16)( + _stream.GetUInt32(currentAddress + Config.ObjectSlots.ObjectRotationOffset)) / 65536f * 360f); _mapObjects[currentAddress].UsesRotation = ObjectAssoc.GetObjectMapRotates(behaviorCriteria); } } - } - - public void OnSlotDropAction(DropAction dropAction, ObjectSlot objSlot) - { - switch (dropAction.Action) - { - case DropAction.ActionType.Mario: - // Move mario to object - var objectAddress = objSlot.Address; - MarioActions.MoveMarioToObject(_stream, objectAddress); - break; - - case DropAction.ActionType.Object: - break; - - default: - return; - } + return behaviorCriteria; } } } \ No newline at end of file diff --git a/Source/SM64 Diagnostic/Managers/OptionsManager.cs b/Source/SM64 Diagnostic/Managers/OptionsManager.cs index fe04a7160..1c1a8e25f 100644 --- a/Source/SM64 Diagnostic/Managers/OptionsManager.cs +++ b/Source/SM64 Diagnostic/Managers/OptionsManager.cs @@ -5,7 +5,7 @@ using System.Threading.Tasks; using SM64_Diagnostic.Structs; -namespace SM64_Diagnostic.ManagerClasses +namespace SM64_Diagnostic.Managers { public class OptionsManager { diff --git a/Source/SM64 Diagnostic/Managers/ScriptManager.cs b/Source/SM64 Diagnostic/Managers/ScriptManager.cs index 38bc7f4a6..f00e98da3 100644 --- a/Source/SM64 Diagnostic/Managers/ScriptManager.cs +++ b/Source/SM64 Diagnostic/Managers/ScriptManager.cs @@ -7,7 +7,7 @@ using SM64_Diagnostic.Structs; using System.Windows.Forms; -namespace SM64_Diagnostic.ManagerClasses +namespace SM64_Diagnostic.Managers { public class ScriptManager diff --git a/Source/SM64 Diagnostic/Managers/TriangleManager.cs b/Source/SM64 Diagnostic/Managers/TriangleManager.cs index 5a9b9d649..d7a9d1160 100644 --- a/Source/SM64 Diagnostic/Managers/TriangleManager.cs +++ b/Source/SM64 Diagnostic/Managers/TriangleManager.cs @@ -7,10 +7,11 @@ using SM64_Diagnostic.Structs; using SM64_Diagnostic.Utilities; using SM64_Diagnostic.Controls; +using SM64_Diagnostic.Extensions; -namespace SM64_Diagnostic.ManagerClasses +namespace SM64_Diagnostic.Managers { - class TriangleManager : DataManager + public class TriangleManager : DataManager { MaskedTextBox _addressBox; uint _triangleAddress = 0; @@ -35,7 +36,7 @@ uint TriangleAddress if (dataContainer is WatchVariableControl) { var watchVar = dataContainer as WatchVariableControl; - watchVar.OtherOffset = _triangleAddress; + watchVar.OtherOffsets = new List() { _triangleAddress }; } } @@ -47,17 +48,20 @@ uint TriangleAddress protected override void InitializeSpecialVariables() { - _specialWatchVars = new List() + _specialWatchVars = new List() { new DataContainer("DistanceAboveFloor"), new DataContainer("DistanceBelowCeiling"), new DataContainer("ClosestVertex"), - new DataContainer("UpHillAngle"), - new DataContainer("DownHillAngle"), - new DataContainer("LeftHillAngle"), - new DataContainer("RightHillAngle"), + new DataContainer("ClosestVertexX"), + new DataContainer("ClosestVertexY"), + new DataContainer("ClosestVertexZ"), + new AngleDataContainer("UpHillAngle"), + new AngleDataContainer("DownHillAngle"), + new AngleDataContainer("LeftHillAngle"), + new AngleDataContainer("RightHillAngle"), new DataContainer("Classification"), - new DataContainer("Steepness"), + new AngleDataContainer("Steepness"), new DataContainer("NormalDistAway"), new DataContainer("VerticalDistAway"), new DataContainer("HeightOnSlope") @@ -72,7 +76,7 @@ public enum TriangleMode {Floor, Wall, Ceiling, Other}; /// Manages illumanati /// public TriangleManager(ProcessStream stream, Control tabControl, List triangleWatchVars) - : base(stream, triangleWatchVars, tabControl.Controls["flowLayoutPanelTriangles"] as FlowLayoutPanel) + : base(stream, triangleWatchVars, tabControl.Controls["NoTearFlowLayoutPanelTriangles"] as NoTearFlowLayoutPanel) { _addressBox = tabControl.Controls["maskedTextBoxOtherTriangle"] as MaskedTextBox; _addressBox.LostFocus += AddressBox_LostFocus; @@ -101,84 +105,160 @@ private void checkBoxVertexMisalignment_CheckedChanged(object sender, EventArgs private void ProcessSpecialVars() { var floorY = BitConverter.ToSingle(_stream.ReadRam(Config.Mario.StructAddress + Config.Mario.GroundYOffset, 4), 0); + + // Get Mario position float marioX, marioY, marioZ; - marioX = BitConverter.ToSingle(_stream.ReadRam(Config.Mario.StructAddress + Config.Mario.XOffset, 4), 0); - marioY = BitConverter.ToSingle(_stream.ReadRam(Config.Mario.StructAddress + Config.Mario.YOffset, 4), 0); - marioZ = BitConverter.ToSingle(_stream.ReadRam(Config.Mario.StructAddress + Config.Mario.ZOffset, 4), 0); + marioX = _stream.GetSingle(Config.Mario.StructAddress + Config.Mario.XOffset); + marioY = _stream.GetSingle(Config.Mario.StructAddress + Config.Mario.YOffset); + marioZ = _stream.GetSingle(Config.Mario.StructAddress + Config.Mario.ZOffset); float normX, normY, normZ, normOffset; - normX = BitConverter.ToSingle(_stream.ReadRam(TriangleAddress + Config.TriangleOffsets.NormX, 4), 0); - normY = BitConverter.ToSingle(_stream.ReadRam(TriangleAddress + Config.TriangleOffsets.NormY, 4), 0); - normZ = BitConverter.ToSingle(_stream.ReadRam(TriangleAddress + Config.TriangleOffsets.NormZ, 4), 0); - normOffset = BitConverter.ToSingle(_stream.ReadRam(TriangleAddress + Config.TriangleOffsets.Offset, 4), 0); + normX = _stream.GetSingle(TriangleAddress + Config.TriangleOffsets.NormX); + normY = _stream.GetSingle(TriangleAddress + Config.TriangleOffsets.NormY); + normZ = _stream.GetSingle(TriangleAddress + Config.TriangleOffsets.NormZ); + normOffset = _stream.GetSingle(TriangleAddress + Config.TriangleOffsets.Offset); - var uphillAngle = (Math.Atan2(normZ, normX) / Math.PI + 0.5) / 2 * 65536; + var uphillAngle = Math.PI + Math.Atan2(normX, normZ); if (normX == 0 && normZ == 0) uphillAngle = double.NaN; if (normY < -0.01) - uphillAngle += 32768; - - foreach (DataContainer specialVar in _specialWatchVars) + uphillAngle += Math.PI; + + short v1X, v1Y, v1Z; + short v2X, v2Y, v2Z; + short v3X, v3Y, v3Z; + v1X = _stream.GetInt16(TriangleAddress + Config.TriangleOffsets.X1); + v1Y = _stream.GetInt16(TriangleAddress + Config.TriangleOffsets.Y1); + v1Z = _stream.GetInt16(TriangleAddress + Config.TriangleOffsets.Z1); + v2X = _stream.GetInt16(TriangleAddress + Config.TriangleOffsets.X2); + v2Y = _stream.GetInt16(TriangleAddress + Config.TriangleOffsets.Y2); + v2Z = _stream.GetInt16(TriangleAddress + Config.TriangleOffsets.Z2); + v3X = _stream.GetInt16(TriangleAddress + Config.TriangleOffsets.X3); + v3Y = _stream.GetInt16(TriangleAddress + Config.TriangleOffsets.Y3); + v3Z = _stream.GetInt16(TriangleAddress + Config.TriangleOffsets.Z3); + + var disToV = new double[] + { + Math.Pow(marioX - v1X, 2) + Math.Pow(marioY - v1Y, 2) + Math.Pow(marioZ - v1Z, 2), + Math.Pow(marioX - v2X, 2) + Math.Pow(marioY - v2Y, 2) + Math.Pow(marioZ - v2Z, 2), + Math.Pow(marioX - v3X, 2) + Math.Pow(marioY - v3Y, 2) + Math.Pow(marioZ - v3Z, 2) + }; + + var closestVertex = disToV.IndexOfMin() + 1; + + foreach (IDataContainer specialVar in _specialWatchVars) { switch (specialVar.SpecialName) { case "DistanceAboveFloor": - specialVar.Text = (marioY - floorY).ToString(); + (specialVar as DataContainer).Text = (marioY - floorY).ToString(); break; case "DistanceBelowCeiling": - specialVar.Text = (BitConverter.ToSingle(_stream.ReadRam(Config.Mario.StructAddress + Config.Mario.CeilingYOffset, 4), 0) + (specialVar as DataContainer).Text = (_stream.GetSingle(Config.Mario.StructAddress + Config.Mario.CeilingYOffset) - marioY).ToString(); break; case "ClosestVertex": - specialVar.Text = String.Format("V{0}", MarioActions.GetClosestVertex(_stream, TriangleAddress)); + (specialVar as DataContainer).Text = String.Format("V{0}", closestVertex); goto case "CheckTriangleExists"; - case "UpHillAngle": - specialVar.Text = FixAngle(uphillAngle).ToString(); + case "ClosestVertexX": + short coordX = 0; + switch (closestVertex) + { + case 1: + coordX = v1X; + break; + case 2: + coordX = v2X; + break; + case 3: + coordX = v3X; + break; + } + (specialVar as DataContainer).Text = coordX.ToString(); goto case "CheckTriangleExists"; - case "DownHillAngle": - specialVar.Text = FixAngle(uphillAngle + 32768).ToString(); + case "ClosestVertexY": + short coordY = 0; + switch (closestVertex) + { + case 1: + coordY = v1Y; + break; + case 2: + coordY = v2Y; + break; + case 3: + coordY = v3Y; + break; + } + (specialVar as DataContainer).Text = coordY.ToString(); goto case "CheckTriangleExists"; - case "RightHillAngle": - specialVar.Text = FixAngle(uphillAngle - 16384).ToString(); + case "ClosestVertexZ": + short coordZ = 0; + switch (closestVertex) + { + case 1: + coordZ = v1Z; + break; + case 2: + coordZ = v2Z; + break; + case 3: + coordZ = v3Z; + break; + } + (specialVar as DataContainer).Text = coordZ.ToString(); goto case "CheckTriangleExists"; + case "UpHillAngle": + (specialVar as AngleDataContainer).AngleValue = uphillAngle; + goto case "CheckTriangleExistsAngle"; + case "DownHillAngle": + (specialVar as AngleDataContainer).AngleValue = uphillAngle + Math.PI; + goto case "CheckTriangleExistsAngle"; + case "RightHillAngle": + (specialVar as AngleDataContainer).AngleValue = uphillAngle - Math.PI / 2; + goto case "CheckTriangleExistsAngle"; case "LeftHillAngle": - specialVar.Text = FixAngle(uphillAngle + 16384).ToString(); - goto case "CheckTriangleExists"; + (specialVar as AngleDataContainer).AngleValue = uphillAngle + Math.PI / 2; + goto case "CheckTriangleExistsAngle"; case "Classification": if (normY > 0.01) - specialVar.Text = "Floor"; + (specialVar as DataContainer).Text = "Floor"; else if (normY < -0.01) - specialVar.Text = "Ceiling"; + (specialVar as DataContainer).Text = "Ceiling"; else - specialVar.Text = "Wall"; + (specialVar as DataContainer).Text = "Wall"; goto case "CheckTriangleExists"; case "Steepness": - specialVar.Text = (65536 / (Math.PI * 2) * Math.Acos(normY)).ToString(); - goto case "CheckTriangleExists"; + (specialVar as AngleDataContainer).AngleValue = Math.Acos(normY); + goto case "CheckTriangleExistsAngle"; case "NormalDistAway": - specialVar.Text = (marioX * normX + marioY * normY + marioZ * normZ + normOffset).ToString(); + (specialVar as DataContainer).Text = (marioX * normX + marioY * normY + marioZ * normZ + normOffset).ToString(); goto case "CheckTriangleExists"; case "VerticalDistAway": - specialVar.Text = (marioY + (marioX * normX + marioZ * normZ + normOffset) / normY).ToString(); + (specialVar as DataContainer).Text = (marioY + (marioX * normX + marioZ * normZ + normOffset) / normY).ToString(); goto case "CheckTriangleExists"; case "HeightOnSlope": - specialVar.Text = ((-marioX * normX - marioZ * normZ - normOffset) / normY).ToString(); + (specialVar as DataContainer).Text = ((-marioX * normX - marioZ * normZ - normOffset) / normY).ToString(); goto case "CheckTriangleExists"; // Special case "CheckTriangleExists": if (TriangleAddress == 0x0000) { - specialVar.Text = "(none)"; + (specialVar as DataContainer).Text = "(none)"; break; } break; + case "CheckTriangleExistsAngle": + (specialVar as AngleDataContainer).ValueExists = (TriangleAddress != 0x0000); + break; } } } private double FixAngle(double angle) { + angle = Math.Round(angle); angle %= 65536; if (angle > 32768) angle -= 65536; diff --git a/Source/SM64 Diagnostic/ModifyAddWatchVariableForm.Designer.cs b/Source/SM64 Diagnostic/ModifyAddWatchVariableForm.Designer.cs deleted file mode 100644 index bb66c87d1..000000000 --- a/Source/SM64 Diagnostic/ModifyAddWatchVariableForm.Designer.cs +++ /dev/null @@ -1,193 +0,0 @@ -namespace SM64_Diagnostic -{ - partial class ModifyAddWatchVariableForm - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.components = new System.ComponentModel.Container(); - this.buttonOk = new System.Windows.Forms.Button(); - this.fileSystemWatcher1 = new System.IO.FileSystemWatcher(); - this.textBoxName = new System.Windows.Forms.TextBox(); - this.label1 = new System.Windows.Forms.Label(); - this.labelType = new System.Windows.Forms.Label(); - this.comboBoxType = new System.Windows.Forms.ComboBox(); - this.maskedTextBoxAddress = new System.Windows.Forms.MaskedTextBox(); - this.labelAddress = new System.Windows.Forms.Label(); - this.bindingSource1 = new System.Windows.Forms.BindingSource(this.components); - this.checkBoxAbsolute = new System.Windows.Forms.CheckBox(); - this.buttonCancel = new System.Windows.Forms.Button(); - ((System.ComponentModel.ISupportInitialize)(this.fileSystemWatcher1)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.bindingSource1)).BeginInit(); - this.SuspendLayout(); - // - // buttonOk - // - this.buttonOk.Anchor = System.Windows.Forms.AnchorStyles.Bottom; - this.buttonOk.Location = new System.Drawing.Point(90, 195); - this.buttonOk.Name = "buttonOk"; - this.buttonOk.Size = new System.Drawing.Size(104, 38); - this.buttonOk.TabIndex = 0; - this.buttonOk.Text = "OK"; - this.buttonOk.UseVisualStyleBackColor = true; - this.buttonOk.Click += new System.EventHandler(this.buttonOk_Click); - // - // fileSystemWatcher1 - // - this.fileSystemWatcher1.EnableRaisingEvents = true; - this.fileSystemWatcher1.SynchronizingObject = this; - // - // textBoxName - // - this.textBoxName.Anchor = System.Windows.Forms.AnchorStyles.None; - this.textBoxName.Location = new System.Drawing.Point(164, 50); - this.textBoxName.Name = "textBoxName"; - this.textBoxName.Size = new System.Drawing.Size(211, 26); - this.textBoxName.TabIndex = 1; - // - // label1 - // - this.label1.Anchor = System.Windows.Forms.AnchorStyles.None; - this.label1.AutoSize = true; - this.label1.Location = new System.Drawing.Point(107, 53); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(51, 20); - this.label1.TabIndex = 2; - this.label1.Text = "Name"; - // - // labelType - // - this.labelType.Anchor = System.Windows.Forms.AnchorStyles.None; - this.labelType.AutoSize = true; - this.labelType.Location = new System.Drawing.Point(111, 85); - this.labelType.Name = "labelType"; - this.labelType.Size = new System.Drawing.Size(47, 20); - this.labelType.TabIndex = 3; - this.labelType.Text = "Type:"; - // - // comboBoxType - // - this.comboBoxType.Anchor = System.Windows.Forms.AnchorStyles.None; - this.comboBoxType.FormattingEnabled = true; - this.comboBoxType.Items.AddRange(new object[] { - "char", - "byte", - "int16", - "uint16", - "int32", - "uint32", - "int64", - "uint64"}); - this.comboBoxType.Location = new System.Drawing.Point(164, 82); - this.comboBoxType.Name = "comboBoxType"; - this.comboBoxType.Size = new System.Drawing.Size(125, 28); - this.comboBoxType.TabIndex = 4; - // - // maskedTextBoxAddress - // - this.maskedTextBoxAddress.Anchor = System.Windows.Forms.AnchorStyles.None; - this.maskedTextBoxAddress.Location = new System.Drawing.Point(164, 116); - this.maskedTextBoxAddress.Mask = "\\0xaaAAAAAA"; - this.maskedTextBoxAddress.Name = "maskedTextBoxAddress"; - this.maskedTextBoxAddress.Size = new System.Drawing.Size(125, 26); - this.maskedTextBoxAddress.TabIndex = 6; - // - // labelAddress - // - this.labelAddress.Anchor = System.Windows.Forms.AnchorStyles.None; - this.labelAddress.AutoSize = true; - this.labelAddress.Location = new System.Drawing.Point(86, 119); - this.labelAddress.Name = "labelAddress"; - this.labelAddress.Size = new System.Drawing.Size(72, 20); - this.labelAddress.TabIndex = 7; - this.labelAddress.Text = "Address:"; - // - // checkBoxAbsolute - // - this.checkBoxAbsolute.AutoSize = true; - this.checkBoxAbsolute.Location = new System.Drawing.Point(90, 148); - this.checkBoxAbsolute.Name = "checkBoxAbsolute"; - this.checkBoxAbsolute.Size = new System.Drawing.Size(182, 24); - this.checkBoxAbsolute.TabIndex = 8; - this.checkBoxAbsolute.Text = "Absolute Addressing"; - this.checkBoxAbsolute.UseVisualStyleBackColor = true; - // - // buttonCancel - // - this.buttonCancel.Anchor = System.Windows.Forms.AnchorStyles.Bottom; - this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this.buttonCancel.Location = new System.Drawing.Point(242, 195); - this.buttonCancel.Name = "buttonCancel"; - this.buttonCancel.Size = new System.Drawing.Size(104, 38); - this.buttonCancel.TabIndex = 9; - this.buttonCancel.Text = "Cancel"; - this.buttonCancel.UseVisualStyleBackColor = true; - this.buttonCancel.Click += new System.EventHandler(this.buttonCancel_Click); - // - // ModifyAddWatchVariableForm - // - this.AcceptButton = this.buttonOk; - this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 20F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.CancelButton = this.buttonCancel; - this.ClientSize = new System.Drawing.Size(428, 264); - this.Controls.Add(this.buttonCancel); - this.Controls.Add(this.checkBoxAbsolute); - this.Controls.Add(this.labelAddress); - this.Controls.Add(this.maskedTextBoxAddress); - this.Controls.Add(this.comboBoxType); - this.Controls.Add(this.labelType); - this.Controls.Add(this.label1); - this.Controls.Add(this.textBoxName); - this.Controls.Add(this.buttonOk); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; - this.MaximizeBox = false; - this.MinimizeBox = false; - this.Name = "ModifyAddWatchVariableForm"; - this.ShowIcon = false; - this.Text = "Watch Variable"; - ((System.ComponentModel.ISupportInitialize)(this.fileSystemWatcher1)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.bindingSource1)).EndInit(); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.Button buttonOk; - private System.Windows.Forms.BindingSource bindingSource1; - private System.IO.FileSystemWatcher fileSystemWatcher1; - private System.Windows.Forms.MaskedTextBox maskedTextBoxAddress; - private System.Windows.Forms.ComboBox comboBoxType; - private System.Windows.Forms.Label labelType; - private System.Windows.Forms.Label label1; - private System.Windows.Forms.TextBox textBoxName; - private System.Windows.Forms.Label labelAddress; - private System.Windows.Forms.CheckBox checkBoxAbsolute; - private System.Windows.Forms.Button buttonCancel; - } -} \ No newline at end of file diff --git a/Source/SM64 Diagnostic/ModifyAddWatchVariableForm.cs b/Source/SM64 Diagnostic/ModifyAddWatchVariableForm.cs deleted file mode 100644 index 06f9af16d..000000000 --- a/Source/SM64 Diagnostic/ModifyAddWatchVariableForm.cs +++ /dev/null @@ -1,81 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Windows.Forms; -using SM64_Diagnostic.Utilities; -using SM64_Diagnostic.Structs; -using SM64_Diagnostic.Extensions; - -namespace SM64_Diagnostic -{ - public partial class ModifyAddWatchVariableForm : Form - { - WatchVariable _value = new WatchVariable(); - - public WatchVariable Value - { - get - { - return _value; - } - } - - public ModifyAddWatchVariableForm() - { - InitializeComponent(); - } - - public ModifyAddWatchVariableForm(WatchVariable watchVar) - { - InitializeComponent(); - textBoxName.Text = watchVar.Name; - comboBoxType.SelectedItem = watchVar.Type; - maskedTextBoxAddress.Text = watchVar.Address.ToString(); - checkBoxAbsolute.Checked = watchVar.AbsoluteAddressing; - } - - private void buttonOk_Click(object sender, EventArgs e) - { - // Parse data and close - if (ResultValid()) - { - this.DialogResult = DialogResult.OK; - this.Close(); - } - } - - private bool ResultValid() - { - uint address; - if (comboBoxType.SelectedIndex < 0) - { - MessageBox.Show("Select a value type!"); - return false; - } - else if (ParsingUtilities.TryParseHex(maskedTextBoxAddress.Text, out address)) - { - MessageBox.Show("Enter a valid address!"); - return false; - } - - WatchVariable watchVar = new WatchVariable(); - watchVar.Name = textBoxName.Text; - watchVar.Type = WatchVariableExtensions.GetStringType((string)comboBoxType.SelectedItem); - watchVar.Address = address; - watchVar.AbsoluteAddressing = checkBoxAbsolute.Checked; - _value = watchVar; - - return true; - } - - private void buttonCancel_Click(object sender, EventArgs e) - { - this.Close(); - } - } -} diff --git a/Source/SM64 Diagnostic/ModifyAddWatchVariableForm.resx b/Source/SM64 Diagnostic/ModifyAddWatchVariableForm.resx deleted file mode 100644 index be9529c2d..000000000 --- a/Source/SM64 Diagnostic/ModifyAddWatchVariableForm.resx +++ /dev/null @@ -1,129 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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 - - - 207, 17 - - - True - - - 17, 17 - - \ No newline at end of file diff --git a/Source/SM64 Diagnostic/SM64 Diagnostic.csproj b/Source/SM64 Diagnostic/SM64 Diagnostic.csproj index 05608a8dd..da016bb45 100644 --- a/Source/SM64 Diagnostic/SM64 Diagnostic.csproj +++ b/Source/SM64 Diagnostic/SM64 Diagnostic.csproj @@ -75,6 +75,7 @@ ..\packages\OpenTK.GLControl.1.1.1589.5941\lib\NET40\OpenTK.GLControl.dll True + @@ -86,15 +87,21 @@ + + Component + + Component + + @@ -108,6 +115,7 @@ + @@ -121,12 +129,6 @@ - - Form - - - ModifyAddWatchVariableForm.cs - Component @@ -139,7 +141,6 @@ - @@ -591,9 +592,6 @@ PreserveNewest - - ModifyAddWatchVariableForm.cs - StroopMainForm.cs diff --git a/Source/SM64 Diagnostic/Schemas/ReusableTypes.xsd b/Source/SM64 Diagnostic/Schemas/ReusableTypes.xsd index 8755fbe1b..367996c9b 100644 --- a/Source/SM64 Diagnostic/Schemas/ReusableTypes.xsd +++ b/Source/SM64 Diagnostic/Schemas/ReusableTypes.xsd @@ -65,6 +65,7 @@ + diff --git a/Source/SM64 Diagnostic/StroopMainForm.Designer.cs b/Source/SM64 Diagnostic/StroopMainForm.Designer.cs index 6108c6e8a..c72177d7a 100644 --- a/Source/SM64 Diagnostic/StroopMainForm.Designer.cs +++ b/Source/SM64 Diagnostic/StroopMainForm.Designer.cs @@ -44,7 +44,7 @@ private void InitializeComponent() this.comboBoxMapToggleMode = new System.Windows.Forms.ComboBox(); this.checkBoxObjLockLabels = new System.Windows.Forms.CheckBox(); this.labelSortMethod = new System.Windows.Forms.Label(); - this.flowLayoutPanelObjects = new System.Windows.Forms.FlowLayoutPanel(); + this.NoTearFlowLayoutPanelObjects = new NoTearFlowLayoutPanel(); this.comboBoxSortMethod = new System.Windows.Forms.ComboBox(); this.buttonPauseResume = new System.Windows.Forms.Button(); this.splitContainerMain = new System.Windows.Forms.SplitContainer(); @@ -59,26 +59,26 @@ private void InitializeComponent() this.labelObjSlotPosValue = new System.Windows.Forms.Label(); this.labelObjBhvValue = new System.Windows.Forms.Label(); this.labelObjAdd = new System.Windows.Forms.Label(); - this.flowLayoutPanelObject = new System.Windows.Forms.FlowLayoutPanel(); + this.NoTearFlowLayoutPanelObject = new NoTearFlowLayoutPanel(); this.labelObjSlotInd = new System.Windows.Forms.Label(); this.labelObjSlotPos = new System.Windows.Forms.Label(); this.labelObjBhv = new System.Windows.Forms.Label(); this.panelObjectBorder = new System.Windows.Forms.Panel(); this.labelObjAddValue = new System.Windows.Forms.Label(); this.tabPageMario = new System.Windows.Forms.TabPage(); - this.flowLayoutPanelMario = new System.Windows.Forms.FlowLayoutPanel(); + this.NoTearFlowLayoutPanelMario = new NoTearFlowLayoutPanel(); this.panelMarioBorder = new System.Windows.Forms.Panel(); this.tabPageHud = new System.Windows.Forms.TabPage(); this.buttonStandardHud = new System.Windows.Forms.Button(); this.buttonDie = new System.Windows.Forms.Button(); this.buttonFillHp = new System.Windows.Forms.Button(); - this.flowLayoutPanelHud = new System.Windows.Forms.FlowLayoutPanel(); + this.NoTearFlowLayoutPanelHud = new NoTearFlowLayoutPanel(); this.panelHudBorder = new System.Windows.Forms.Panel(); this.tabPageCamera = new System.Windows.Forms.TabPage(); - this.flowLayoutPanelCamera = new System.Windows.Forms.FlowLayoutPanel(); + this.NoTearFlowLayoutPanelCamera = new NoTearFlowLayoutPanel(); this.panelCameraBorder = new System.Windows.Forms.Panel(); this.tabPageDebug = new System.Windows.Forms.TabPage(); - this.flowLayoutPanelDebugDisplayType = new System.Windows.Forms.FlowLayoutPanel(); + this.NoTearFlowLayoutPanelDebugDisplayType = new NoTearFlowLayoutPanel(); this.radioButtonDbgOff = new System.Windows.Forms.RadioButton(); this.radioButtonDbgObjCnt = new System.Windows.Forms.RadioButton(); this.radioButtonDbgChkInfo = new System.Windows.Forms.RadioButton(); @@ -107,7 +107,7 @@ private void InitializeComponent() this.buttonPuConZpPu = new System.Windows.Forms.Button(); this.buttonPuConZpQpu = new System.Windows.Forms.Button(); this.buttonPuConHome = new System.Windows.Forms.Button(); - this.flowLayoutPanelMisc = new System.Windows.Forms.FlowLayoutPanel(); + this.NoTearFlowLayoutPanelMisc = new NoTearFlowLayoutPanel(); this.panelMiscBorder = new System.Windows.Forms.Panel(); this.tabPageTriangles = new System.Windows.Forms.TabPage(); this.checkBoxVertexMisalignment = new System.Windows.Forms.CheckBox(); @@ -115,7 +115,7 @@ private void InitializeComponent() this.buttonGoToV3 = new System.Windows.Forms.Button(); this.buttonGoToV2 = new System.Windows.Forms.Button(); this.buttonGoToV1 = new System.Windows.Forms.Button(); - this.flowLayoutPanelTriangles = new System.Windows.Forms.FlowLayoutPanel(); + this.NoTearFlowLayoutPanelTriangles = new NoTearFlowLayoutPanel(); this.label4 = new System.Windows.Forms.Label(); this.maskedTextBoxOtherTriangle = new System.Windows.Forms.MaskedTextBox(); this.radioButtonTriOther = new System.Windows.Forms.RadioButton(); @@ -123,7 +123,7 @@ private void InitializeComponent() this.radioButtonTriWall = new System.Windows.Forms.RadioButton(); this.radioButtonTriFloor = new System.Windows.Forms.RadioButton(); this.tabPageStars = new System.Windows.Forms.TabPage(); - this.flowLayoutPanel1 = new System.Windows.Forms.FlowLayoutPanel(); + this.NoTearFlowLayoutPanel1 = new NoTearFlowLayoutPanel(); this.radioButtonFileD = new System.Windows.Forms.RadioButton(); this.radioButtonFileC = new System.Windows.Forms.RadioButton(); this.radioButtonFileB = new System.Windows.Forms.RadioButton(); @@ -193,7 +193,7 @@ private void InitializeComponent() this.tabPageCamera.SuspendLayout(); this.panelCameraBorder.SuspendLayout(); this.tabPageDebug.SuspendLayout(); - this.flowLayoutPanelDebugDisplayType.SuspendLayout(); + this.NoTearFlowLayoutPanelDebugDisplayType.SuspendLayout(); this.panelDebugBorder.SuspendLayout(); this.tabPageMisc.SuspendLayout(); this.groupBoxPuController.SuspendLayout(); @@ -258,7 +258,7 @@ private void InitializeComponent() this.groupBoxObjects.Controls.Add(this.comboBoxMapToggleMode); this.groupBoxObjects.Controls.Add(this.checkBoxObjLockLabels); this.groupBoxObjects.Controls.Add(this.labelSortMethod); - this.groupBoxObjects.Controls.Add(this.flowLayoutPanelObjects); + this.groupBoxObjects.Controls.Add(this.NoTearFlowLayoutPanelObjects); this.groupBoxObjects.Controls.Add(this.comboBoxSortMethod); this.groupBoxObjects.Location = new System.Drawing.Point(2, 2); this.groupBoxObjects.Margin = new System.Windows.Forms.Padding(2); @@ -355,18 +355,18 @@ private void InitializeComponent() this.labelSortMethod.TabIndex = 5; this.labelSortMethod.Text = "Sort Method:"; // - // flowLayoutPanelObjects + // NoTearFlowLayoutPanelObjects // - this.flowLayoutPanelObjects.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + this.NoTearFlowLayoutPanelObjects.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); - this.flowLayoutPanelObjects.AutoScroll = true; - this.flowLayoutPanelObjects.Location = new System.Drawing.Point(4, 65); - this.flowLayoutPanelObjects.Margin = new System.Windows.Forms.Padding(2); - this.flowLayoutPanelObjects.Name = "flowLayoutPanelObjects"; - this.flowLayoutPanelObjects.Size = new System.Drawing.Size(996, 397); - this.flowLayoutPanelObjects.TabIndex = 0; - this.flowLayoutPanelObjects.Resize += new System.EventHandler(this.flowLayoutPanelObjects_Resize); + this.NoTearFlowLayoutPanelObjects.AutoScroll = true; + this.NoTearFlowLayoutPanelObjects.Location = new System.Drawing.Point(4, 65); + this.NoTearFlowLayoutPanelObjects.Margin = new System.Windows.Forms.Padding(2); + this.NoTearFlowLayoutPanelObjects.Name = "NoTearFlowLayoutPanelObjects"; + this.NoTearFlowLayoutPanelObjects.Size = new System.Drawing.Size(996, 397); + this.NoTearFlowLayoutPanelObjects.TabIndex = 0; + this.NoTearFlowLayoutPanelObjects.Resize += new System.EventHandler(this.NoTearFlowLayoutPanelObjects_Resize); // // comboBoxSortMethod // @@ -453,7 +453,7 @@ private void InitializeComponent() this.tabPageObjects.Controls.Add(this.labelObjSlotPosValue); this.tabPageObjects.Controls.Add(this.labelObjBhvValue); this.tabPageObjects.Controls.Add(this.labelObjAdd); - this.tabPageObjects.Controls.Add(this.flowLayoutPanelObject); + this.tabPageObjects.Controls.Add(this.NoTearFlowLayoutPanelObject); this.tabPageObjects.Controls.Add(this.labelObjSlotInd); this.tabPageObjects.Controls.Add(this.labelObjSlotPos); this.tabPageObjects.Controls.Add(this.labelObjBhv); @@ -558,18 +558,18 @@ private void InitializeComponent() this.labelObjAdd.TabIndex = 8; this.labelObjAdd.Text = "Add:"; // - // flowLayoutPanelObject + // NoTearFlowLayoutPanelObject // - this.flowLayoutPanelObject.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + this.NoTearFlowLayoutPanelObject.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); - this.flowLayoutPanelObject.AutoScroll = true; - this.flowLayoutPanelObject.FlowDirection = System.Windows.Forms.FlowDirection.TopDown; - this.flowLayoutPanelObject.Location = new System.Drawing.Point(208, 3); - this.flowLayoutPanelObject.Margin = new System.Windows.Forms.Padding(2); - this.flowLayoutPanelObject.Name = "flowLayoutPanelObject"; - this.flowLayoutPanelObject.Size = new System.Drawing.Size(786, 183); - this.flowLayoutPanelObject.TabIndex = 3; + this.NoTearFlowLayoutPanelObject.AutoScroll = true; + this.NoTearFlowLayoutPanelObject.FlowDirection = System.Windows.Forms.FlowDirection.TopDown; + this.NoTearFlowLayoutPanelObject.Location = new System.Drawing.Point(208, 3); + this.NoTearFlowLayoutPanelObject.Margin = new System.Windows.Forms.Padding(2); + this.NoTearFlowLayoutPanelObject.Name = "NoTearFlowLayoutPanelObject"; + this.NoTearFlowLayoutPanelObject.Size = new System.Drawing.Size(786, 183); + this.NoTearFlowLayoutPanelObject.TabIndex = 3; // // labelObjSlotInd // @@ -622,7 +622,7 @@ private void InitializeComponent() // tabPageMario // this.tabPageMario.BackColor = System.Drawing.Color.Transparent; - this.tabPageMario.Controls.Add(this.flowLayoutPanelMario); + this.tabPageMario.Controls.Add(this.NoTearFlowLayoutPanelMario); this.tabPageMario.Controls.Add(this.panelMarioBorder); this.tabPageMario.Location = new System.Drawing.Point(4, 22); this.tabPageMario.Margin = new System.Windows.Forms.Padding(2); @@ -632,18 +632,18 @@ private void InitializeComponent() this.tabPageMario.TabIndex = 1; this.tabPageMario.Text = "Mario"; // - // flowLayoutPanelMario + // NoTearFlowLayoutPanelMario // - this.flowLayoutPanelMario.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + this.NoTearFlowLayoutPanelMario.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); - this.flowLayoutPanelMario.AutoScroll = true; - this.flowLayoutPanelMario.FlowDirection = System.Windows.Forms.FlowDirection.TopDown; - this.flowLayoutPanelMario.Location = new System.Drawing.Point(65, 6); - this.flowLayoutPanelMario.Margin = new System.Windows.Forms.Padding(2); - this.flowLayoutPanelMario.Name = "flowLayoutPanelMario"; - this.flowLayoutPanelMario.Size = new System.Drawing.Size(929, 180); - this.flowLayoutPanelMario.TabIndex = 1; + this.NoTearFlowLayoutPanelMario.AutoScroll = true; + this.NoTearFlowLayoutPanelMario.FlowDirection = System.Windows.Forms.FlowDirection.TopDown; + this.NoTearFlowLayoutPanelMario.Location = new System.Drawing.Point(65, 6); + this.NoTearFlowLayoutPanelMario.Margin = new System.Windows.Forms.Padding(2); + this.NoTearFlowLayoutPanelMario.Name = "NoTearFlowLayoutPanelMario"; + this.NoTearFlowLayoutPanelMario.Size = new System.Drawing.Size(929, 180); + this.NoTearFlowLayoutPanelMario.TabIndex = 1; // // panelMarioBorder // @@ -659,7 +659,7 @@ private void InitializeComponent() this.tabPageHud.Controls.Add(this.buttonStandardHud); this.tabPageHud.Controls.Add(this.buttonDie); this.tabPageHud.Controls.Add(this.buttonFillHp); - this.tabPageHud.Controls.Add(this.flowLayoutPanelHud); + this.tabPageHud.Controls.Add(this.NoTearFlowLayoutPanelHud); this.tabPageHud.Controls.Add(this.panelHudBorder); this.tabPageHud.Location = new System.Drawing.Point(4, 22); this.tabPageHud.Margin = new System.Windows.Forms.Padding(2); @@ -695,18 +695,18 @@ private void InitializeComponent() this.buttonFillHp.Text = "Fill HP"; this.buttonFillHp.UseVisualStyleBackColor = true; // - // flowLayoutPanelHud + // NoTearFlowLayoutPanelHud // - this.flowLayoutPanelHud.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + this.NoTearFlowLayoutPanelHud.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); - this.flowLayoutPanelHud.AutoScroll = true; - this.flowLayoutPanelHud.FlowDirection = System.Windows.Forms.FlowDirection.TopDown; - this.flowLayoutPanelHud.Location = new System.Drawing.Point(101, 5); - this.flowLayoutPanelHud.Margin = new System.Windows.Forms.Padding(2); - this.flowLayoutPanelHud.Name = "flowLayoutPanelHud"; - this.flowLayoutPanelHud.Size = new System.Drawing.Size(891, 176); - this.flowLayoutPanelHud.TabIndex = 3; + this.NoTearFlowLayoutPanelHud.AutoScroll = true; + this.NoTearFlowLayoutPanelHud.FlowDirection = System.Windows.Forms.FlowDirection.TopDown; + this.NoTearFlowLayoutPanelHud.Location = new System.Drawing.Point(101, 5); + this.NoTearFlowLayoutPanelHud.Margin = new System.Windows.Forms.Padding(2); + this.NoTearFlowLayoutPanelHud.Name = "NoTearFlowLayoutPanelHud"; + this.NoTearFlowLayoutPanelHud.Size = new System.Drawing.Size(891, 176); + this.NoTearFlowLayoutPanelHud.TabIndex = 3; // // panelHudBorder // @@ -719,7 +719,7 @@ private void InitializeComponent() // // tabPageCamera // - this.tabPageCamera.Controls.Add(this.flowLayoutPanelCamera); + this.tabPageCamera.Controls.Add(this.NoTearFlowLayoutPanelCamera); this.tabPageCamera.Controls.Add(this.panelCameraBorder); this.tabPageCamera.Location = new System.Drawing.Point(4, 22); this.tabPageCamera.Margin = new System.Windows.Forms.Padding(2); @@ -728,18 +728,18 @@ private void InitializeComponent() this.tabPageCamera.TabIndex = 7; this.tabPageCamera.Text = "Camera"; // - // flowLayoutPanelCamera + // NoTearFlowLayoutPanelCamera // - this.flowLayoutPanelCamera.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + this.NoTearFlowLayoutPanelCamera.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); - this.flowLayoutPanelCamera.AutoScroll = true; - this.flowLayoutPanelCamera.FlowDirection = System.Windows.Forms.FlowDirection.TopDown; - this.flowLayoutPanelCamera.Location = new System.Drawing.Point(65, 2); - this.flowLayoutPanelCamera.Margin = new System.Windows.Forms.Padding(2); - this.flowLayoutPanelCamera.Name = "flowLayoutPanelCamera"; - this.flowLayoutPanelCamera.Size = new System.Drawing.Size(929, 180); - this.flowLayoutPanelCamera.TabIndex = 3; + this.NoTearFlowLayoutPanelCamera.AutoScroll = true; + this.NoTearFlowLayoutPanelCamera.FlowDirection = System.Windows.Forms.FlowDirection.TopDown; + this.NoTearFlowLayoutPanelCamera.Location = new System.Drawing.Point(65, 2); + this.NoTearFlowLayoutPanelCamera.Margin = new System.Windows.Forms.Padding(2); + this.NoTearFlowLayoutPanelCamera.Name = "NoTearFlowLayoutPanelCamera"; + this.NoTearFlowLayoutPanelCamera.Size = new System.Drawing.Size(929, 180); + this.NoTearFlowLayoutPanelCamera.TabIndex = 3; // // panelCameraBorder // @@ -752,7 +752,7 @@ private void InitializeComponent() // // tabPageDebug // - this.tabPageDebug.Controls.Add(this.flowLayoutPanelDebugDisplayType); + this.tabPageDebug.Controls.Add(this.NoTearFlowLayoutPanelDebugDisplayType); this.tabPageDebug.Controls.Add(this.label2); this.tabPageDebug.Controls.Add(this.panelDebugBorder); this.tabPageDebug.Location = new System.Drawing.Point(4, 22); @@ -762,22 +762,22 @@ private void InitializeComponent() this.tabPageDebug.TabIndex = 8; this.tabPageDebug.Text = "Debug"; // - // flowLayoutPanelDebugDisplayType - // - this.flowLayoutPanelDebugDisplayType.AutoScroll = true; - this.flowLayoutPanelDebugDisplayType.Controls.Add(this.radioButtonDbgOff); - this.flowLayoutPanelDebugDisplayType.Controls.Add(this.radioButtonDbgObjCnt); - this.flowLayoutPanelDebugDisplayType.Controls.Add(this.radioButtonDbgChkInfo); - this.flowLayoutPanelDebugDisplayType.Controls.Add(this.radioButtonDbgMapInfo); - this.flowLayoutPanelDebugDisplayType.Controls.Add(this.radioButtonDbgStgInfo); - this.flowLayoutPanelDebugDisplayType.Controls.Add(this.radioButtonDbgFxInfo); - this.flowLayoutPanelDebugDisplayType.Controls.Add(this.radioButtonDbgEnemyInfo); - this.flowLayoutPanelDebugDisplayType.FlowDirection = System.Windows.Forms.FlowDirection.TopDown; - this.flowLayoutPanelDebugDisplayType.Location = new System.Drawing.Point(71, 23); - this.flowLayoutPanelDebugDisplayType.Name = "flowLayoutPanelDebugDisplayType"; - this.flowLayoutPanelDebugDisplayType.Size = new System.Drawing.Size(167, 177); - this.flowLayoutPanelDebugDisplayType.TabIndex = 11; - this.flowLayoutPanelDebugDisplayType.WrapContents = false; + // NoTearFlowLayoutPanelDebugDisplayType + // + this.NoTearFlowLayoutPanelDebugDisplayType.AutoScroll = true; + this.NoTearFlowLayoutPanelDebugDisplayType.Controls.Add(this.radioButtonDbgOff); + this.NoTearFlowLayoutPanelDebugDisplayType.Controls.Add(this.radioButtonDbgObjCnt); + this.NoTearFlowLayoutPanelDebugDisplayType.Controls.Add(this.radioButtonDbgChkInfo); + this.NoTearFlowLayoutPanelDebugDisplayType.Controls.Add(this.radioButtonDbgMapInfo); + this.NoTearFlowLayoutPanelDebugDisplayType.Controls.Add(this.radioButtonDbgStgInfo); + this.NoTearFlowLayoutPanelDebugDisplayType.Controls.Add(this.radioButtonDbgFxInfo); + this.NoTearFlowLayoutPanelDebugDisplayType.Controls.Add(this.radioButtonDbgEnemyInfo); + this.NoTearFlowLayoutPanelDebugDisplayType.FlowDirection = System.Windows.Forms.FlowDirection.TopDown; + this.NoTearFlowLayoutPanelDebugDisplayType.Location = new System.Drawing.Point(71, 23); + this.NoTearFlowLayoutPanelDebugDisplayType.Name = "NoTearFlowLayoutPanelDebugDisplayType"; + this.NoTearFlowLayoutPanelDebugDisplayType.Size = new System.Drawing.Size(167, 177); + this.NoTearFlowLayoutPanelDebugDisplayType.TabIndex = 11; + this.NoTearFlowLayoutPanelDebugDisplayType.WrapContents = false; // // radioButtonDbgOff // @@ -879,7 +879,7 @@ private void InitializeComponent() // tabPageMisc // this.tabPageMisc.Controls.Add(this.groupBoxPuController); - this.tabPageMisc.Controls.Add(this.flowLayoutPanelMisc); + this.tabPageMisc.Controls.Add(this.NoTearFlowLayoutPanelMisc); this.tabPageMisc.Controls.Add(this.panelMiscBorder); this.tabPageMisc.Location = new System.Drawing.Point(4, 22); this.tabPageMisc.Name = "tabPageMisc"; @@ -1106,18 +1106,18 @@ private void InitializeComponent() this.buttonPuConHome.TabIndex = 1; this.buttonPuConHome.UseVisualStyleBackColor = true; // - // flowLayoutPanelMisc + // NoTearFlowLayoutPanelMisc // - this.flowLayoutPanelMisc.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + this.NoTearFlowLayoutPanelMisc.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); - this.flowLayoutPanelMisc.AutoScroll = true; - this.flowLayoutPanelMisc.FlowDirection = System.Windows.Forms.FlowDirection.TopDown; - this.flowLayoutPanelMisc.Location = new System.Drawing.Point(64, 5); - this.flowLayoutPanelMisc.Margin = new System.Windows.Forms.Padding(2); - this.flowLayoutPanelMisc.Name = "flowLayoutPanelMisc"; - this.flowLayoutPanelMisc.Size = new System.Drawing.Size(702, 180); - this.flowLayoutPanelMisc.TabIndex = 5; + this.NoTearFlowLayoutPanelMisc.AutoScroll = true; + this.NoTearFlowLayoutPanelMisc.FlowDirection = System.Windows.Forms.FlowDirection.TopDown; + this.NoTearFlowLayoutPanelMisc.Location = new System.Drawing.Point(64, 5); + this.NoTearFlowLayoutPanelMisc.Margin = new System.Windows.Forms.Padding(2); + this.NoTearFlowLayoutPanelMisc.Name = "NoTearFlowLayoutPanelMisc"; + this.NoTearFlowLayoutPanelMisc.Size = new System.Drawing.Size(702, 180); + this.NoTearFlowLayoutPanelMisc.TabIndex = 5; // // panelMiscBorder // @@ -1135,7 +1135,7 @@ private void InitializeComponent() this.tabPageTriangles.Controls.Add(this.buttonGoToV3); this.tabPageTriangles.Controls.Add(this.buttonGoToV2); this.tabPageTriangles.Controls.Add(this.buttonGoToV1); - this.tabPageTriangles.Controls.Add(this.flowLayoutPanelTriangles); + this.tabPageTriangles.Controls.Add(this.NoTearFlowLayoutPanelTriangles); this.tabPageTriangles.Controls.Add(this.label4); this.tabPageTriangles.Controls.Add(this.maskedTextBoxOtherTriangle); this.tabPageTriangles.Controls.Add(this.radioButtonTriOther); @@ -1195,18 +1195,18 @@ private void InitializeComponent() this.buttonGoToV1.Text = "Goto V1"; this.buttonGoToV1.UseVisualStyleBackColor = true; // - // flowLayoutPanelTriangles + // NoTearFlowLayoutPanelTriangles // - this.flowLayoutPanelTriangles.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + this.NoTearFlowLayoutPanelTriangles.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); - this.flowLayoutPanelTriangles.AutoScroll = true; - this.flowLayoutPanelTriangles.FlowDirection = System.Windows.Forms.FlowDirection.TopDown; - this.flowLayoutPanelTriangles.Location = new System.Drawing.Point(167, 5); - this.flowLayoutPanelTriangles.Margin = new System.Windows.Forms.Padding(2); - this.flowLayoutPanelTriangles.Name = "flowLayoutPanelTriangles"; - this.flowLayoutPanelTriangles.Size = new System.Drawing.Size(824, 180); - this.flowLayoutPanelTriangles.TabIndex = 7; + this.NoTearFlowLayoutPanelTriangles.AutoScroll = true; + this.NoTearFlowLayoutPanelTriangles.FlowDirection = System.Windows.Forms.FlowDirection.TopDown; + this.NoTearFlowLayoutPanelTriangles.Location = new System.Drawing.Point(167, 5); + this.NoTearFlowLayoutPanelTriangles.Margin = new System.Windows.Forms.Padding(2); + this.NoTearFlowLayoutPanelTriangles.Name = "NoTearFlowLayoutPanelTriangles"; + this.NoTearFlowLayoutPanelTriangles.Size = new System.Drawing.Size(824, 180); + this.NoTearFlowLayoutPanelTriangles.TabIndex = 7; // // label4 // @@ -1270,7 +1270,7 @@ private void InitializeComponent() // // tabPageStars // - this.tabPageStars.Controls.Add(this.flowLayoutPanel1); + this.tabPageStars.Controls.Add(this.NoTearFlowLayoutPanel1); this.tabPageStars.Controls.Add(this.radioButtonFileD); this.tabPageStars.Controls.Add(this.radioButtonFileC); this.tabPageStars.Controls.Add(this.radioButtonFileB); @@ -1282,18 +1282,18 @@ private void InitializeComponent() this.tabPageStars.TabIndex = 10; this.tabPageStars.Text = "Stars"; // - // flowLayoutPanel1 + // NoTearFlowLayoutPanel1 // - this.flowLayoutPanel1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + this.NoTearFlowLayoutPanel1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); - this.flowLayoutPanel1.AutoScroll = true; - this.flowLayoutPanel1.FlowDirection = System.Windows.Forms.FlowDirection.TopDown; - this.flowLayoutPanel1.Location = new System.Drawing.Point(63, 7); - this.flowLayoutPanel1.Name = "flowLayoutPanel1"; - this.flowLayoutPanel1.Size = new System.Drawing.Size(927, 177); - this.flowLayoutPanel1.TabIndex = 4; - this.flowLayoutPanel1.WrapContents = false; + this.NoTearFlowLayoutPanel1.AutoScroll = true; + this.NoTearFlowLayoutPanel1.FlowDirection = System.Windows.Forms.FlowDirection.TopDown; + this.NoTearFlowLayoutPanel1.Location = new System.Drawing.Point(63, 7); + this.NoTearFlowLayoutPanel1.Name = "NoTearFlowLayoutPanel1"; + this.NoTearFlowLayoutPanel1.Size = new System.Drawing.Size(927, 177); + this.NoTearFlowLayoutPanel1.TabIndex = 4; + this.NoTearFlowLayoutPanel1.WrapContents = false; // // radioButtonFileD // @@ -1963,6 +1963,7 @@ private void InitializeComponent() this.Controls.Add(this.buttonPauseResume); this.Controls.Add(this.labelProcessSelect); this.Controls.Add(this.comboBoxProcessSelection); + this.DoubleBuffered = true; this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); this.Margin = new System.Windows.Forms.Padding(2); this.Name = "StroopMainForm"; @@ -1987,8 +1988,8 @@ private void InitializeComponent() this.panelCameraBorder.ResumeLayout(false); this.tabPageDebug.ResumeLayout(false); this.tabPageDebug.PerformLayout(); - this.flowLayoutPanelDebugDisplayType.ResumeLayout(false); - this.flowLayoutPanelDebugDisplayType.PerformLayout(); + this.NoTearFlowLayoutPanelDebugDisplayType.ResumeLayout(false); + this.NoTearFlowLayoutPanelDebugDisplayType.PerformLayout(); this.panelDebugBorder.ResumeLayout(false); this.tabPageMisc.ResumeLayout(false); this.groupBoxPuController.ResumeLayout(false); @@ -2034,7 +2035,7 @@ private void InitializeComponent() private System.Windows.Forms.GroupBox groupBoxObjects; private System.Windows.Forms.ComboBox comboBoxSortMethod; private System.Windows.Forms.Label labelSortMethod; - private System.Windows.Forms.FlowLayoutPanel flowLayoutPanelObjects; + private NoTearFlowLayoutPanel NoTearFlowLayoutPanelObjects; private System.Windows.Forms.Button buttonPauseResume; private System.Windows.Forms.SplitContainer splitContainerMain; private System.Windows.Forms.CheckBox checkBoxObjLockLabels; @@ -2044,7 +2045,7 @@ private void InitializeComponent() private System.Windows.Forms.Label labelObjSlotPosValue; private System.Windows.Forms.Label labelObjBhvValue; private System.Windows.Forms.Label labelObjAdd; - private System.Windows.Forms.FlowLayoutPanel flowLayoutPanelObject; + private NoTearFlowLayoutPanel NoTearFlowLayoutPanelObject; private System.Windows.Forms.Label labelObjSlotInd; private System.Windows.Forms.Label labelObjSlotPos; private System.Windows.Forms.Label labelObjBhv; @@ -2052,7 +2053,7 @@ private void InitializeComponent() private IntPictureBox pictureBoxObject; private System.Windows.Forms.Label labelObjAddValue; private System.Windows.Forms.TabPage tabPageMario; - private System.Windows.Forms.FlowLayoutPanel flowLayoutPanelMario; + private NoTearFlowLayoutPanel NoTearFlowLayoutPanelMario; private System.Windows.Forms.Panel panelMarioBorder; private IntPictureBox pictureBoxMario; private System.Windows.Forms.TabPage tabPageExpressions; @@ -2098,10 +2099,10 @@ private void InitializeComponent() private System.Windows.Forms.CheckBox checkBoxUseRomHack; private System.Windows.Forms.TabPage tabPageHud; private System.Windows.Forms.TabPage tabPageCamera; - private System.Windows.Forms.FlowLayoutPanel flowLayoutPanelHud; + private NoTearFlowLayoutPanel NoTearFlowLayoutPanelHud; private System.Windows.Forms.Panel panelHudBorder; private IntPictureBox pictureBoxHud; - private System.Windows.Forms.FlowLayoutPanel flowLayoutPanelCamera; + private NoTearFlowLayoutPanel NoTearFlowLayoutPanelCamera; private System.Windows.Forms.Panel panelCameraBorder; private IntPictureBox pictureBoxCamera; private System.Windows.Forms.CheckBox checkBoxMapShowCamera; @@ -2118,11 +2119,11 @@ private void InitializeComponent() private System.Windows.Forms.Label label2; private System.Windows.Forms.Panel panelDebugBorder; private IntPictureBox pictureBoxDebug; - private System.Windows.Forms.FlowLayoutPanel flowLayoutPanelMisc; + private NoTearFlowLayoutPanel NoTearFlowLayoutPanelMisc; private System.Windows.Forms.Panel panelMiscBorder; private IntPictureBox pictureBoxMisc; private System.Windows.Forms.TabPage tabPageStars; - private System.Windows.Forms.FlowLayoutPanel flowLayoutPanel1; + private NoTearFlowLayoutPanel NoTearFlowLayoutPanel1; private System.Windows.Forms.RadioButton radioButtonFileD; private System.Windows.Forms.RadioButton radioButtonFileC; private System.Windows.Forms.RadioButton radioButtonFileB; @@ -2157,7 +2158,7 @@ private void InitializeComponent() private Label label4; private MaskedTextBox maskedTextBoxOtherTriangle; private RadioButton radioButtonTriOther; - private FlowLayoutPanel flowLayoutPanelTriangles; + private NoTearFlowLayoutPanel NoTearFlowLayoutPanelTriangles; private Button buttonStandardHud; private Button buttonDie; private Button buttonFillHp; @@ -2165,7 +2166,7 @@ private void InitializeComponent() private Label label5; private CheckedListBox checkedListBoxHacks; private Label labelPureInterpretterRequire; - private FlowLayoutPanel flowLayoutPanelDebugDisplayType; + private NoTearFlowLayoutPanel NoTearFlowLayoutPanelDebugDisplayType; private Button buttonGoToV3; private Button buttonGoToV2; private Button buttonGoToV1; diff --git a/Source/SM64 Diagnostic/StroopMainForm.cs b/Source/SM64 Diagnostic/StroopMainForm.cs index b3854e421..ecbb19c53 100644 --- a/Source/SM64 Diagnostic/StroopMainForm.cs +++ b/Source/SM64 Diagnostic/StroopMainForm.cs @@ -18,7 +18,7 @@ namespace SM64_Diagnostic { public partial class StroopMainForm : Form { - const string _version = "v0.2.6"; + const string _version = "v0.2.7"; ProcessStream _sm64Stream = null; ObjectSlotManagerGui _slotManagerGui = new ObjectSlotManagerGui(); @@ -80,12 +80,16 @@ private void StroopMainForm_Load(object sender, EventArgs e) tabControlMain.TabPages.Remove(tabPageExpressions); #endif + // Create new manager context + var currentContext = new ManagerContext(); + ManagerContext.Current = currentContext; + _sm64Stream = new ProcessStream(); _sm64Stream.OnUpdate += OnUpdate; - _disManager = new DisassemblyManager(this, richTextBoxDissasembly, maskedTextBoxDisStart, _sm64Stream, buttonDisGo); - _scriptManager = new ScriptManager(_sm64Stream, _scriptParser, checkBoxUseRomHack); - _hackManager = new HackManager(_sm64Stream, _romHacks, checkedListBoxHacks); + currentContext.DisassemblyManager = _disManager = new DisassemblyManager(this, richTextBoxDissasembly, maskedTextBoxDisStart, _sm64Stream, buttonDisGo); + currentContext.ScriptManager = _scriptManager = new ScriptManager(_sm64Stream, _scriptParser, checkBoxUseRomHack); + currentContext.HackManager = _hackManager = new HackManager(_sm64Stream, _romHacks, checkedListBoxHacks); // Create map manager MapGui mapGui = new MapGui(); @@ -103,20 +107,20 @@ private void StroopMainForm_Load(object sender, EventArgs e) mapGui.MapShowHolp = checkBoxMapShowHolp; mapGui.MapShowCamera = checkBoxMapShowCamera; mapGui.MapShowFloorTriangle = checkBoxMapShowFloor; - _mapManager = new MapManager(_sm64Stream, _mapAssoc, _objectAssoc, mapGui); + currentContext.MapManager = _mapManager = new MapManager(_sm64Stream, _mapAssoc, _objectAssoc, mapGui); - _marioManager = new MarioManager(_sm64Stream, _marioData, panelMarioBorder, flowLayoutPanelMario, _mapManager); - _hudManager = new HudManager(_sm64Stream, _hudData, tabPageHud); - _miscManager = new MiscManager(_sm64Stream, _miscData, flowLayoutPanelMisc, groupBoxPuController); - _cameraManager = new CameraManager(_sm64Stream, _cameraData, panelCameraBorder, flowLayoutPanelCamera); - _triangleManager = new TriangleManager(_sm64Stream, tabPageTriangles, _triangleData); - _debugManager = new DebugManager(); + currentContext.MarioManager = _marioManager = new MarioManager(_sm64Stream, _marioData, panelMarioBorder, NoTearFlowLayoutPanelMario, _mapManager); + currentContext.HudManager = _hudManager = new HudManager(_sm64Stream, _hudData, tabPageHud); + currentContext.MiscManager = _miscManager = new MiscManager(_sm64Stream, _miscData, NoTearFlowLayoutPanelMisc, groupBoxPuController); + currentContext.CameraManager = _cameraManager = new CameraManager(_sm64Stream, _cameraData, NoTearFlowLayoutPanelCamera); + currentContext.TriangleManager = _triangleManager = new TriangleManager(_sm64Stream, tabPageTriangles, _triangleData); + currentContext.DebugManager = _debugManager = new DebugManager(); // Create object manager var objectGui = new ObjectDataGui() { ObjectBorderPanel = panelObjectBorder, - ObjectFlowLayout = flowLayoutPanelObject, + ObjectFlowLayout = NoTearFlowLayoutPanelObject, ObjectImagePictureBox = pictureBoxObject, ObjAddressLabelValue = labelObjAddValue, ObjAddressLabel = labelObjAdd, @@ -129,21 +133,21 @@ private void StroopMainForm_Load(object sender, EventArgs e) MoveToMarioButton = buttonObjRetrieve, UnloadButton = buttonObjUnload }; - _objectManager = new ObjectManager(_sm64Stream, _objectAssoc, _objectData, objectGui); + currentContext.ObjectManager = _objectManager = new ObjectManager(_sm64Stream, _objectAssoc, _objectData, objectGui); // Create options manager var optionGui = new OptionsGui(); optionGui.CheckBoxStartFromOne = checkBoxStartSlotIndexOne; - _optionsManager = new OptionsManager(optionGui); + currentContext.OptionsManager = _optionsManager = new OptionsManager(optionGui); // Create Object Slots _slotManagerGui.TabControl = tabControlMain; _slotManagerGui.LockLabelsCheckbox = checkBoxObjLockLabels; _slotManagerGui.MapObjectToggleModeComboBox = comboBoxMapToggleMode; - _slotManagerGui.FlowLayoutContainer = flowLayoutPanelObjects; + _slotManagerGui.FlowLayoutContainer = NoTearFlowLayoutPanelObjects; _slotManagerGui.SortMethodComboBox = comboBoxSortMethod; _slotManagerGui.LabelMethodComboBox = comboBoxLabelMethod; - _objectSlotManager = new ObjectSlotsManager(_sm64Stream, _objectAssoc, _objectManager, _slotManagerGui, _mapManager, _miscManager); + currentContext.ObjectSlotManager = _objectSlotManager = new ObjectSlotsManager(_sm64Stream, _objectAssoc, _objectManager, _slotManagerGui, _mapManager, _miscManager); SetupViews(); @@ -278,7 +282,7 @@ private void SetupViews() var watchVar = _miscData[index]; if (watchVar.Special) continue; - var row = _tableOtherData.Rows.Add(watchVar.Name, watchVar.Type.ToString(), "", watchVar.Address); + var row = _tableOtherData.Rows.Add(watchVar.Name, watchVar.TypeName, "", watchVar.Address); _otherDataRowAssoc.Add(index, row); } @@ -307,8 +311,8 @@ private void buttonOtherModify_Click(object sender, EventArgs e) var row = _tableOtherData.Rows[dataGridViewExpressions.SelectedRows[0].Index]; int assoc = _otherDataRowAssoc.FirstOrDefault(v => v.Value == row).Key; - var modifyVar = new ModifyAddWatchVariableForm(_miscData[assoc]); - modifyVar.ShowDialog(); + //var modifyVar = new ModifyAddWatchVariableForm(_miscData[assoc]); + //modifyVar.ShowDialog(); } private void buttonOtherDelete_Click(object sender, EventArgs e) @@ -347,13 +351,13 @@ private void dataGridViewOther_CellMouseDoubleClick(object sender, DataGridViewC var row = _tableOtherData.Rows[dataGridViewExpressions.SelectedRows[0].Index]; int assoc = _otherDataRowAssoc.FirstOrDefault(v => v.Value == row).Key; - var modifyVar = new ModifyAddWatchVariableForm(_miscData[assoc]); - modifyVar.ShowDialog(); + //var modifyVar = new ModifyAddWatchVariableForm(_miscData[assoc]); + //modifyVar.ShowDialog(); } private void buttonOtherAdd_Click(object sender, EventArgs e) { - var modifyVar = new ModifyAddWatchVariableForm(); + /*var modifyVar = new ModifyAddWatchVariableForm(); if(modifyVar.ShowDialog() == DialogResult.OK) { var watchVar = modifyVar.Value; @@ -369,19 +373,19 @@ private void buttonOtherAdd_Click(object sender, EventArgs e) _otherDataRowAssoc.Add(newIndex, row); XmlConfigParser.AddWatchVariableOtherData(watchVar); - } + }*/ } - private async void flowLayoutPanelObjects_Resize(object sender, EventArgs e) + private async void NoTearFlowLayoutPanelObjects_Resize(object sender, EventArgs e) { _resizeTimeLeft = 500; if (_resizing) return; _resizing = true; - flowLayoutPanelObjects.Visible = false; - flowLayoutPanelObject.Visible = false; - flowLayoutPanelMario.Visible = false; + NoTearFlowLayoutPanelObjects.Visible = false; + NoTearFlowLayoutPanelObject.Visible = false; + NoTearFlowLayoutPanelMario.Visible = false; if (_mapManager != null && _mapManager.IsLoaded) _mapManager.Visible = false; await Task.Run(() => @@ -392,9 +396,9 @@ await Task.Run(() => _resizeTimeLeft -= 100; } }); - flowLayoutPanelObjects.Visible = true; - flowLayoutPanelObject.Visible = true; - flowLayoutPanelMario.Visible = true; + NoTearFlowLayoutPanelObjects.Visible = true; + NoTearFlowLayoutPanelObject.Visible = true; + NoTearFlowLayoutPanelMario.Visible = true; if (_mapManager != null && _mapManager.IsLoaded) _mapManager.Visible = true; @@ -508,9 +512,9 @@ await Task.Run(() => } }); - flowLayoutPanelObjects.Visible = false; + NoTearFlowLayoutPanelObjects.Visible = false; _objectSlotManager.ChangeSlotSize(trackBarObjSlotSize.Value); - flowLayoutPanelObjects.Visible = true; + NoTearFlowLayoutPanelObjects.Visible = true; _objSlotResizing = false; } diff --git a/Source/SM64 Diagnostic/Structs/BehaviorCriteria.cs b/Source/SM64 Diagnostic/Structs/BehaviorCriteria.cs index cb86a762f..74e80ef75 100644 --- a/Source/SM64 Diagnostic/Structs/BehaviorCriteria.cs +++ b/Source/SM64 Diagnostic/Structs/BehaviorCriteria.cs @@ -45,6 +45,23 @@ public bool CongruentTo(BehaviorCriteria otherCriteria) return true; } + public BehaviorCriteria? Generalize(BehaviorCriteria otherCriteria) + { + if (otherCriteria.BehaviorAddress != BehaviorAddress) + return null; + + if (GfxId.HasValue && otherCriteria.GfxId.HasValue && GfxId.Value != otherCriteria.GfxId.Value) + return new BehaviorCriteria() { BehaviorAddress = BehaviorAddress}; + + if (SubType.HasValue && otherCriteria.SubType.HasValue && SubType.Value != otherCriteria.SubType.Value) + return new BehaviorCriteria() { BehaviorAddress = BehaviorAddress, GfxId = GfxId}; + + if (Appearance.HasValue && otherCriteria.Appearance.HasValue && Appearance.Value != otherCriteria.Appearance.Value) + return new BehaviorCriteria() { BehaviorAddress = BehaviorAddress, GfxId = GfxId, SubType = SubType }; + + return this; + } + public static bool operator ==(BehaviorCriteria a, BehaviorCriteria b) { return (a.BehaviorAddress == b.BehaviorAddress && a.GfxId == b.GfxId diff --git a/Source/SM64 Diagnostic/Structs/Configurations/HudConfig.cs b/Source/SM64 Diagnostic/Structs/Configurations/HudConfig.cs index d7df8cf13..e5d924f86 100644 --- a/Source/SM64 Diagnostic/Structs/Configurations/HudConfig.cs +++ b/Source/SM64 Diagnostic/Structs/Configurations/HudConfig.cs @@ -12,8 +12,11 @@ public struct HudConfig public uint LiveCountAddress; public uint CoinCountAddress; public uint StarCountAddress; + public uint DisplayLiveCountAddress; + public uint DisplayCoinCountAddress; + public uint DisplayStarCountAddress; public short FullHp; - public short StandardLives; + public sbyte StandardLives; public short StandardCoins; public short StandardStars; } diff --git a/Source/SM64 Diagnostic/Structs/DropAction.cs b/Source/SM64 Diagnostic/Structs/DropAction.cs deleted file mode 100644 index 8505b2aeb..000000000 --- a/Source/SM64 Diagnostic/Structs/DropAction.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace SM64_Diagnostic.Structs -{ - public struct DropAction - { - public enum ActionType { Mario, Object }; - public ActionType Action; - public uint Address; - - public DropAction(ActionType actionType, uint address) - { - Action = actionType; - Address = address; - } - } -} diff --git a/Source/SM64 Diagnostic/Structs/Gui/ObjectDataGui.cs b/Source/SM64 Diagnostic/Structs/Gui/ObjectDataGui.cs index 05d39a772..850ff7ad0 100644 --- a/Source/SM64 Diagnostic/Structs/Gui/ObjectDataGui.cs +++ b/Source/SM64 Diagnostic/Structs/Gui/ObjectDataGui.cs @@ -12,7 +12,7 @@ public struct ObjectDataGui { public Panel ObjectBorderPanel; public IntPictureBox ObjectImagePictureBox; - public FlowLayoutPanel ObjectFlowLayout; + public NoTearFlowLayoutPanel ObjectFlowLayout; public Button CloneButton; public Button UnloadButton; public Button MoveToMarioButton; diff --git a/Source/SM64 Diagnostic/Structs/Gui/ObjectSlotManagerGui.cs b/Source/SM64 Diagnostic/Structs/Gui/ObjectSlotManagerGui.cs index 2fa3277d8..5e0106e8b 100644 --- a/Source/SM64 Diagnostic/Structs/Gui/ObjectSlotManagerGui.cs +++ b/Source/SM64 Diagnostic/Structs/Gui/ObjectSlotManagerGui.cs @@ -23,7 +23,7 @@ public class ObjectSlotManagerGui public ComboBox MapObjectToggleModeComboBox; public ComboBox SortMethodComboBox; public ComboBox LabelMethodComboBox; - public FlowLayoutPanel FlowLayoutContainer; + public NoTearFlowLayoutPanel FlowLayoutContainer; ~ObjectSlotManagerGui() { diff --git a/Source/SM64 Diagnostic/Structs/WatchVariable.cs b/Source/SM64 Diagnostic/Structs/WatchVariable.cs index 14bb102c9..fcc578bad 100644 --- a/Source/SM64 Diagnostic/Structs/WatchVariable.cs +++ b/Source/SM64 Diagnostic/Structs/WatchVariable.cs @@ -7,9 +7,25 @@ namespace SM64_Diagnostic.Structs { - public struct WatchVariable + public class WatchVariable { - public Type Type; + Type _type; + public Type Type + { + get + { + return _type; + } + set + { + if (_type == value) + return; + + _type = value; + _byteCount = TypeSize[_type]; + _typeName = StringToType.First(s => s.Value == _type).Key; + } + } public uint Address; public String Name; public String SpecialType; @@ -17,14 +33,41 @@ public struct WatchVariable public Boolean AbsoluteAddressing; public UInt64? Mask; public bool IsBool; + public bool IsObject; public bool UseHex; public bool OtherOffset; public bool InvertBool; public bool IsAngle; public Color? BackroundColor; + int _byteCount; + public int ByteCount + { + get + { + return _byteCount; + } + } + + string _typeName; + public string TypeName + { + get + { + return _typeName; + } + set + { + if (_typeName == value || !StringToType.ContainsKey(value)) + return; + + _typeName = value; + _type = StringToType[_typeName]; + _byteCount = TypeSize[_type]; + } + } - public static Dictionary TypeSize = new Dictionary() + readonly static Dictionary TypeSize = new Dictionary() { {typeof(byte), 1}, {typeof(sbyte), 1}, @@ -38,7 +81,7 @@ public struct WatchVariable {typeof(double), 4} }; - public static Dictionary StringToType = new Dictionary() + readonly static Dictionary StringToType = new Dictionary() { { "byte", typeof(byte) }, { "sbyte", typeof(sbyte) }, diff --git a/Source/SM64 Diagnostic/Utilities/MarioActions.cs b/Source/SM64 Diagnostic/Utilities/MarioActions.cs index 5653f1231..a8fe59ce7 100644 --- a/Source/SM64 Diagnostic/Utilities/MarioActions.cs +++ b/Source/SM64 Diagnostic/Utilities/MarioActions.cs @@ -9,7 +9,7 @@ namespace SM64_Diagnostic.Utilities { public static class MarioActions { - public static bool MoveMarioToObject(ProcessStream stream, uint objAddress) + public static bool MoveMarioToObjects(ProcessStream stream, List objAddresses) { // Move mario to object var marioAddress = Config.Mario.StructAddress; @@ -18,9 +18,9 @@ public static bool MoveMarioToObject(ProcessStream stream, uint objAddress) // Get object position float x, y, z; - x = BitConverter.ToSingle(stream.ReadRam(objAddress + Config.ObjectSlots.ObjectXOffset, 4), 0); - y = BitConverter.ToSingle(stream.ReadRam(objAddress + Config.ObjectSlots.ObjectYOffset, 4), 0); - z = BitConverter.ToSingle(stream.ReadRam(objAddress + Config.ObjectSlots.ObjectZOffset, 4), 0); + x = objAddresses.Average(obj => BitConverter.ToSingle(stream.ReadRam(obj + Config.ObjectSlots.ObjectXOffset, 4), 0)); + y = objAddresses.Average(obj => BitConverter.ToSingle(stream.ReadRam(obj + Config.ObjectSlots.ObjectYOffset, 4), 0)); + z = objAddresses.Average(obj => BitConverter.ToSingle(stream.ReadRam(obj + Config.ObjectSlots.ObjectZOffset, 4), 0)); // Add offset y += Config.Mario.MoveToObjectYOffset; @@ -36,7 +36,7 @@ public static bool MoveMarioToObject(ProcessStream stream, uint objAddress) return success; } - public static bool MoveObjectToMario(ProcessStream stream, uint objAddress) + public static bool RetreiveObjects(ProcessStream stream, List objAddresses) { // Move object to Mario var marioAddress = Config.Mario.StructAddress; @@ -54,10 +54,12 @@ public static bool MoveObjectToMario(ProcessStream stream, uint objAddress) // Move object to Mario bool success = true; - success &= stream.WriteRam(BitConverter.GetBytes(x), objAddress + Config.ObjectSlots.ObjectXOffset); - success &= stream.WriteRam(BitConverter.GetBytes(y), objAddress + Config.ObjectSlots.ObjectYOffset); - success &= stream.WriteRam(BitConverter.GetBytes(z), objAddress + Config.ObjectSlots.ObjectZOffset); - + foreach (var objAddress in objAddresses) + { + success &= stream.WriteRam(BitConverter.GetBytes(x), objAddress + Config.ObjectSlots.ObjectXOffset); + success &= stream.WriteRam(BitConverter.GetBytes(y), objAddress + Config.ObjectSlots.ObjectYOffset); + success &= stream.WriteRam(BitConverter.GetBytes(z), objAddress + Config.ObjectSlots.ObjectZOffset); + } stream.Resume(); return success; @@ -100,9 +102,14 @@ public static bool UnCloneObject(ProcessStream stream, uint objAddress) return success; } - public static bool UnloadObject(ProcessStream stream, uint address) + public static bool UnloadObject(ProcessStream stream, List addresses) { - return stream.WriteRam(new byte[] { 0x00, 0x00 }, address + Config.ObjectSlots.ObjectActiveOffset); + bool success = true; + foreach (var address in addresses) + { + success &= stream.WriteRam(new byte[] { 0x00, 0x00 }, address + Config.ObjectSlots.ObjectActiveOffset); + } + return success; } public static bool RefillHp(ProcessStream stream) @@ -112,7 +119,7 @@ public static bool RefillHp(ProcessStream stream) public static bool Die(ProcessStream stream) { - return stream.WriteRam(BitConverter.GetBytes((short)0), Config.Hud.HpAddress); + return stream.WriteRam(BitConverter.GetBytes((short)255), Config.Hud.HpAddress); } public static bool StandardHud(ProcessStream stream) @@ -123,6 +130,9 @@ public static bool StandardHud(ProcessStream stream) success &= stream.WriteRam(BitConverter.GetBytes(Config.Hud.StandardCoins), Config.Hud.CoinCountAddress); success &= stream.WriteRam(BitConverter.GetBytes(Config.Hud.StandardLives), Config.Hud.LiveCountAddress); success &= stream.WriteRam(BitConverter.GetBytes(Config.Hud.StandardStars), Config.Hud.StarCountAddress); + success &= stream.WriteRam(BitConverter.GetBytes(Config.Hud.StandardCoins), Config.Hud.DisplayCoinCountAddress); + success &= stream.WriteRam(BitConverter.GetBytes((short)Config.Hud.StandardLives), Config.Hud.DisplayLiveCountAddress); + success &= stream.WriteRam(BitConverter.GetBytes(Config.Hud.StandardStars), Config.Hud.DisplayStarCountAddress); return success; } @@ -224,46 +234,5 @@ public static bool RetrieveTriangle(ProcessStream stream, uint triangleAddress) return success; } - - public static int GetClosestVertex(ProcessStream stream, uint triangleAddress) - { - if (triangleAddress == 0x0000) - return 0; - - // Get Mario position - short marioX, marioY, marioZ; - var marioAddress = Config.Mario.StructAddress; - marioX = (short)BitConverter.ToSingle(stream.ReadRam(marioAddress + Config.Mario.XOffset, 4), 0); - marioY = (short)BitConverter.ToSingle(stream.ReadRam(marioAddress + Config.Mario.YOffset, 4), 0); - marioZ = (short)BitConverter.ToSingle(stream.ReadRam(marioAddress + Config.Mario.ZOffset, 4), 0); - - short v1X, v1Y, v1Z; - short v2X, v2Y, v2Z; - short v3X, v3Y, v3Z; - v1X = BitConverter.ToInt16(stream.ReadRam(triangleAddress + Config.TriangleOffsets.X1, 2), 0); - v1Y = BitConverter.ToInt16(stream.ReadRam(triangleAddress + Config.TriangleOffsets.Y1, 2), 0); - v1Z = BitConverter.ToInt16(stream.ReadRam(triangleAddress + Config.TriangleOffsets.Z1, 2), 0); - v2X = BitConverter.ToInt16(stream.ReadRam(triangleAddress + Config.TriangleOffsets.X2, 2), 0); - v2Y = BitConverter.ToInt16(stream.ReadRam(triangleAddress + Config.TriangleOffsets.Y2, 2), 0); - v2Z = BitConverter.ToInt16(stream.ReadRam(triangleAddress + Config.TriangleOffsets.Z2, 2), 0); - v3X = BitConverter.ToInt16(stream.ReadRam(triangleAddress + Config.TriangleOffsets.X3, 2), 0); - v3Y = BitConverter.ToInt16(stream.ReadRam(triangleAddress + Config.TriangleOffsets.Y3, 2), 0); - v3Z = BitConverter.ToInt16(stream.ReadRam(triangleAddress + Config.TriangleOffsets.Z3, 2), 0); - - double disToV1, disToV2, disToV3; - disToV1 = Math.Pow(marioX - v1X, 2) + Math.Pow(marioY - v1Y, 2) + Math.Pow(marioZ - v1Z, 2); - disToV2 = Math.Pow(marioX - v2X, 2) + Math.Pow(marioY - v2Y, 2) + Math.Pow(marioZ - v2Z, 2); - disToV3 = Math.Pow(marioX - v3X, 2) + Math.Pow(marioY - v3Y, 2) + Math.Pow(marioZ - v3Z, 2); - - double minDis = Math.Min(Math.Min(disToV1, disToV2), disToV3); - if (minDis == disToV1) - return 1; - if (minDis == disToV2) - return 2; - if (minDis == disToV3) - return 3; - - return 0; - } } } diff --git a/Source/SM64 Diagnostic/Utilities/MoreMath.cs b/Source/SM64 Diagnostic/Utilities/MoreMath.cs index b0e25ce76..0143094b4 100644 --- a/Source/SM64 Diagnostic/Utilities/MoreMath.cs +++ b/Source/SM64 Diagnostic/Utilities/MoreMath.cs @@ -11,7 +11,7 @@ public static class MoreMath public static double DistanceTo(float x1, float y1, float z1, float x2, float y2, float z2) { float dx, dy, dz; - dx = x1 - x1; + dx = x1 - x2; dy = y1 - y2; dz = z1 - z2; return Math.Sqrt(dx * dx + dy * dy + dz * dz); @@ -20,9 +20,17 @@ public static double DistanceTo(float x1, float y1, float z1, float x2, float y2 public static double DistanceTo(float x1, float y1, float x2, float y2) { float dx, dy; - dx = x1 - x1; + dx = x1 - x2; dy = y1 - y2; return Math.Sqrt(dx * dx + dy * dy); } + + public static double AngleTo(float xFrom, float yFrom, float xTo, float yTo) + { + float dx, dy; + dx = xTo - xFrom; + dy = yTo - yFrom; + return Math.Atan2(dy, dx); + } } } diff --git a/Source/SM64 Diagnostic/Utilities/XmlConfigParser.cs b/Source/SM64 Diagnostic/Utilities/XmlConfigParser.cs index d51c7003f..20eeff96c 100644 --- a/Source/SM64 Diagnostic/Utilities/XmlConfigParser.cs +++ b/Source/SM64 Diagnostic/Utilities/XmlConfigParser.cs @@ -271,11 +271,20 @@ public static void OpenConfig(string path) case "StarCountAddress": Config.Hud.StarCountAddress = ParsingUtilities.ParseHex(subElement.Value); break; + case "DisplayLiveCountAddress": + Config.Hud.DisplayLiveCountAddress = ParsingUtilities.ParseHex(subElement.Value); + break; + case "DisplayCoinCountAddress": + Config.Hud.DisplayCoinCountAddress = ParsingUtilities.ParseHex(subElement.Value); + break; + case "DisplayStarCountAddress": + Config.Hud.DisplayStarCountAddress = ParsingUtilities.ParseHex(subElement.Value); + break; case "FullHp": Config.Hud.FullHp = short.Parse(subElement.Value); break; case "StandardLives": - Config.Hud.StandardLives = short.Parse(subElement.Value); + Config.Hud.StandardLives = sbyte.Parse(subElement.Value); break; case "StandardCoins": Config.Hud.StandardCoins = short.Parse(subElement.Value); @@ -865,7 +874,9 @@ public static WatchVariable GetWatchVariableFromElement(XElement element) (UInt64?) ParsingUtilities.ParseExtHex(element.Attribute(XName.Get("mask")).Value) : null; watchVar.IsBool = element.Attribute(XName.Get("isBool")) != null ? bool.Parse(element.Attribute(XName.Get("isBool")).Value) : false; - watchVar.Type = WatchVariableExtensions.GetStringType(element.Attribute(XName.Get("type")).Value); + watchVar.IsObject = element.Attribute(XName.Get("isObject")) != null ? + bool.Parse(element.Attribute(XName.Get("isObject")).Value) : false; + watchVar.TypeName = (element.Attribute(XName.Get("type")).Value); watchVar.Address = ParsingUtilities.ParseHex(element.Attribute(XName.Get("address")).Value); watchVar.InvertBool = element.Attribute(XName.Get("invertBool")) != null ? bool.Parse(element.Attribute(XName.Get("invertBool")).Value) : false; diff --git a/Windows Build/Config/Config.xml b/Windows Build/Config/Config.xml index 0c9d9460f..0118088e4 100644 --- a/Windows Build/Config/Config.xml +++ b/Windows Build/Config/Config.xml @@ -21,7 +21,7 @@ 0x164 0x168 0x16C - 0xC8 + 0xD4 240 300 @@ -73,6 +73,9 @@ 0x8033b21c 0x8033b218 0x8033b21a + 0x8033b260 + 0x8033b262 + 0x8033b268 2176 4 0 diff --git a/Windows Build/Config/MarioData.xml b/Windows Build/Config/MarioData.xml index 639c7d78b..d4c743671 100644 --- a/Windows Build/Config/MarioData.xml +++ b/Windows Build/Config/MarioData.xml @@ -14,15 +14,14 @@ Yaw (Facing) Yaw (Moving) Yaw (Intended) - Cannon Yaw Pitch Roll Yaw Velocity Flying Pull Back - Interaction Object - Using Object - Stood On Object - Held Object + Interaction Object + Using Object + Stood On Object + Held Object HOLP X HOLP Y HOLP Z diff --git a/Windows Build/Config/ObjectAssociations.xml b/Windows Build/Config/ObjectAssociations.xml index 700f54b68..af9a9b5dc 100644 --- a/Windows Build/Config/ObjectAssociations.xml +++ b/Windows Build/Config/ObjectAssociations.xml @@ -177,12 +177,10 @@ - Angular Velocity - + - Angular Velocity @@ -441,12 +439,16 @@ Timer Max + V Speed + Height Min Height Timer Max + V Speed + Height Min Height @@ -827,7 +829,6 @@ - Angular Velocity @@ -860,7 +861,6 @@ - Angular Velocity @@ -1246,7 +1246,7 @@ - Rev Angle + Rev Angle @@ -1435,7 +1435,7 @@ Num Coins - Target Angle + Target Angle Lunging Lunging Timer @@ -1474,10 +1474,10 @@ - + - + @@ -1511,6 +1511,7 @@ Animation Timer Walking Timer Burn Timer + Cannon Yaw Relative Height @@ -1654,7 +1655,7 @@ - Rev Angle + Rev Angle Height Timer Radius Electricity @@ -1793,7 +1794,6 @@ Rolling Timer - Angular Velocity @@ -1809,7 +1809,7 @@ Breaking Num Activators - Angular Velocity + Angular Acceleration? @@ -2047,7 +2047,6 @@ - Angular Velocity @@ -2087,37 +2086,35 @@ Act Shelled - Target Angle + Target Angle Countdown Blinking - Blinking Timer + Blinking Countdown - Act Shelled - Target Angle - Countdown + Waypoint + Target Angle Blinking - Blinking Timer + Blinking Countdown - Act Shelled - Target Angle - Countdown + Waypoint + Target Angle Blinking - Blinking Timer + Blinking Countdown Act Shelled - Target Angle + Target Angle Countdown Blinking - Blinking Timer + Blinking Countdown @@ -2145,7 +2142,7 @@ - Target Angle + Target Angle Wing Flap @@ -2333,7 +2330,7 @@ Ground/Air State Countdown - Target Angle + Target Angle @@ -2456,21 +2453,27 @@ Target Ang Vel Current Ang Vel + Angle Target Ang Vel Current Ang Vel + Angle Timer Max + V Speed + Height Timer Max Direction + V Speed + Height Min Height Max Height @@ -2479,6 +2482,7 @@ Timer Max Target Angle + Angle Displacement Direction Countdown @@ -2487,6 +2491,7 @@ Timer Max Target Angle + Angle Displacement Direction Countdown @@ -2494,6 +2499,7 @@ Timer Max Direction + Angle @@ -2521,18 +2527,17 @@ - + - + - + - Angular Velocity @@ -2635,7 +2640,7 @@ - Rev Angle + Rev Angle Size Size Countdown @@ -2696,7 +2701,7 @@ - Target Angle + Target Angle Lunging diff --git a/Windows Build/Config/ObjectData.xml b/Windows Build/Config/ObjectData.xml index e553b5a9f..9177bf69a 100644 --- a/Windows Build/Config/ObjectData.xml +++ b/Windows Build/Config/ObjectData.xml @@ -7,22 +7,26 @@ Y Speed Z Speed H Speed - Yaw (Facing) - Pitch (Facing) - Roll (Facing) - Yaw (Moving) - Pitch (Moving) - Roll (Moving) - Yaw (Rot Speed) - Pitch (Rot Speed) - Roll (Rot Speed) + Yaw (Facing) + Pitch (Facing) + Roll (Facing) + Yaw (Moving) + Pitch (Moving) + Roll (Moving) + Yaw (Rot Speed) + Pitch (Rot Speed) + Roll (Rot Speed) Dist to Mario Act. Dist to Mario Lat. Dist to Mario Angle to Mario + Act. Angle To Mario + Delta Angle To Mario + Mario Angle To Object + Delta Mario Angle To Object Drawing Dist RNG Calls/Frame - Parent Object + Parent Object Behavior Script Graphic/Model Visible diff --git a/Windows Build/Config/TrianglesData.xml b/Windows Build/Config/TrianglesData.xml index 2d62596de..00e3c1640 100644 --- a/Windows Build/Config/TrianglesData.xml +++ b/Windows Build/Config/TrianglesData.xml @@ -1,10 +1,12 @@  Classification - SurfaceType + Surface Type Flags Wind Direction - Wall Projection + Wall Projection + X Projection + Z Projection Y Min Y Max X1 @@ -30,6 +32,9 @@ Mario Y Mario Z Closest Vertex + Closest Vertex X + Closest Vertex Y + Closest Vertex Z M. Yaw (Intended) M. Yaw (Facing) Floor Triangle diff --git a/Windows Build/Stroop.exe b/Windows Build/Stroop.exe index 88e99a4dc..c4d8dcb85 100644 Binary files a/Windows Build/Stroop.exe and b/Windows Build/Stroop.exe differ