Neon Support

This commit is contained in:
bmg 2021-10-24 03:47:39 +13:00
parent d3ddd2ed44
commit b6c6357a75
42 changed files with 870 additions and 3725 deletions

Binary file not shown.

3558
Form1.resx

File diff suppressed because it is too large Load Diff

View File

@ -1,7 +1,7 @@

namespace SignToolsGUI
{
partial class Form1
partial class GUI
{
/// <summary>
/// Required designer variable.
@ -29,7 +29,7 @@ namespace SignToolsGUI
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Form1));
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(GUI));
this.ImagePreview = new System.Windows.Forms.PictureBox();
this.AddImage = new System.Windows.Forms.Button();
this.OpenMap = new System.Windows.Forms.Button();
@ -48,6 +48,10 @@ namespace SignToolsGUI
this.AddSkin = new System.Windows.Forms.Button();
this.Import = new System.Windows.Forms.Button();
this.Export = new System.Windows.Forms.Button();
this.Framenumber = new System.Windows.Forms.MaskedTextBox();
this.framelabel = new System.Windows.Forms.Label();
this.FrameUp = new System.Windows.Forms.Button();
this.Framedown = new System.Windows.Forms.Button();
((System.ComponentModel.ISupportInitialize)(this.ImagePreview)).BeginInit();
this.SuspendLayout();
//
@ -65,7 +69,7 @@ namespace SignToolsGUI
// AddImage
//
this.AddImage.Enabled = false;
this.AddImage.Location = new System.Drawing.Point(674, 85);
this.AddImage.Location = new System.Drawing.Point(685, 85);
this.AddImage.Margin = new System.Windows.Forms.Padding(6);
this.AddImage.Name = "AddImage";
this.AddImage.Size = new System.Drawing.Size(200, 48);
@ -109,7 +113,7 @@ namespace SignToolsGUI
this.Locations.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.Locations.Enabled = false;
this.Locations.FormattingEnabled = true;
this.Locations.Location = new System.Drawing.Point(674, 37);
this.Locations.Location = new System.Drawing.Point(685, 37);
this.Locations.Margin = new System.Windows.Forms.Padding(6);
this.Locations.Name = "Locations";
this.Locations.Size = new System.Drawing.Size(408, 33);
@ -131,7 +135,7 @@ namespace SignToolsGUI
// label2
//
this.label2.AutoSize = true;
this.label2.Location = new System.Drawing.Point(668, 6);
this.label2.Location = new System.Drawing.Point(679, 6);
this.label2.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(155, 25);
@ -170,7 +174,7 @@ namespace SignToolsGUI
// RemoveImage
//
this.RemoveImage.Enabled = false;
this.RemoveImage.Location = new System.Drawing.Point(886, 85);
this.RemoveImage.Location = new System.Drawing.Point(897, 85);
this.RemoveImage.Margin = new System.Windows.Forms.Padding(6);
this.RemoveImage.Name = "RemoveImage";
this.RemoveImage.Size = new System.Drawing.Size(200, 48);
@ -182,7 +186,7 @@ namespace SignToolsGUI
// RemoveSkin
//
this.RemoveSkin.Enabled = false;
this.RemoveSkin.Location = new System.Drawing.Point(1368, 85);
this.RemoveSkin.Location = new System.Drawing.Point(1555, 85);
this.RemoveSkin.Margin = new System.Windows.Forms.Padding(6);
this.RemoveSkin.Name = "RemoveSkin";
this.RemoveSkin.Size = new System.Drawing.Size(200, 48);
@ -194,7 +198,7 @@ namespace SignToolsGUI
// label4
//
this.label4.AutoSize = true;
this.label4.Location = new System.Drawing.Point(1150, 6);
this.label4.Location = new System.Drawing.Point(1337, 6);
this.label4.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0);
this.label4.Name = "label4";
this.label4.Size = new System.Drawing.Size(154, 25);
@ -206,7 +210,7 @@ namespace SignToolsGUI
this.SkinLocations.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.SkinLocations.Enabled = false;
this.SkinLocations.FormattingEnabled = true;
this.SkinLocations.Location = new System.Drawing.Point(1156, 37);
this.SkinLocations.Location = new System.Drawing.Point(1343, 37);
this.SkinLocations.Margin = new System.Windows.Forms.Padding(6);
this.SkinLocations.Name = "SkinLocations";
this.SkinLocations.Size = new System.Drawing.Size(408, 33);
@ -216,7 +220,7 @@ namespace SignToolsGUI
// AddSkin
//
this.AddSkin.Enabled = false;
this.AddSkin.Location = new System.Drawing.Point(1156, 85);
this.AddSkin.Location = new System.Drawing.Point(1343, 85);
this.AddSkin.Margin = new System.Windows.Forms.Padding(6);
this.AddSkin.Name = "AddSkin";
this.AddSkin.Size = new System.Drawing.Size(200, 48);
@ -228,7 +232,7 @@ namespace SignToolsGUI
// Import
//
this.Import.Enabled = false;
this.Import.Location = new System.Drawing.Point(1600, 6);
this.Import.Location = new System.Drawing.Point(1839, 12);
this.Import.Name = "Import";
this.Import.Size = new System.Drawing.Size(245, 64);
this.Import.TabIndex = 17;
@ -239,7 +243,7 @@ namespace SignToolsGUI
// Export
//
this.Export.Enabled = false;
this.Export.Location = new System.Drawing.Point(1600, 76);
this.Export.Location = new System.Drawing.Point(1839, 82);
this.Export.Name = "Export";
this.Export.Size = new System.Drawing.Size(245, 57);
this.Export.TabIndex = 18;
@ -247,11 +251,57 @@ namespace SignToolsGUI
this.Export.UseVisualStyleBackColor = true;
this.Export.Click += new System.EventHandler(this.Export_Click);
//
// Form1
// Framenumber
//
this.Framenumber.Enabled = false;
this.Framenumber.Location = new System.Drawing.Point(1167, 34);
this.Framenumber.Mask = "0";
this.Framenumber.Name = "Framenumber";
this.Framenumber.Size = new System.Drawing.Size(113, 31);
this.Framenumber.TabIndex = 19;
this.Framenumber.Text = "0";
this.Framenumber.TextChanged += new System.EventHandler(this.Framenumber_TextChanged);
//
// framelabel
//
this.framelabel.AutoSize = true;
this.framelabel.Location = new System.Drawing.Point(1162, 6);
this.framelabel.Name = "framelabel";
this.framelabel.Size = new System.Drawing.Size(79, 25);
this.framelabel.TabIndex = 20;
this.framelabel.Text = "Frame:";
//
// FrameUp
//
this.FrameUp.Enabled = false;
this.FrameUp.Location = new System.Drawing.Point(1167, 85);
this.FrameUp.Name = "FrameUp";
this.FrameUp.Size = new System.Drawing.Size(52, 38);
this.FrameUp.TabIndex = 21;
this.FrameUp.Text = "▲";
this.FrameUp.UseVisualStyleBackColor = true;
this.FrameUp.Click += new System.EventHandler(this.FrameUp_Click);
//
// Framedown
//
this.Framedown.Enabled = false;
this.Framedown.Location = new System.Drawing.Point(1228, 85);
this.Framedown.Name = "Framedown";
this.Framedown.Size = new System.Drawing.Size(52, 38);
this.Framedown.TabIndex = 22;
this.Framedown.Text = "▼";
this.Framedown.UseVisualStyleBackColor = true;
this.Framedown.Click += new System.EventHandler(this.Framedown_Click);
//
// GUI
//
this.AutoScaleDimensions = new System.Drawing.SizeF(12F, 25F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(2112, 1233);
this.Controls.Add(this.Framedown);
this.Controls.Add(this.FrameUp);
this.Controls.Add(this.framelabel);
this.Controls.Add(this.Framenumber);
this.Controls.Add(this.Export);
this.Controls.Add(this.Import);
this.Controls.Add(this.RemoveSkin);
@ -274,8 +324,8 @@ namespace SignToolsGUI
this.Margin = new System.Windows.Forms.Padding(6);
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Name = "Form1";
this.Text = "SignToolsGUI 004";
this.Name = "GUI";
this.Text = "SignToolsGUI 005";
((System.ComponentModel.ISupportInitialize)(this.ImagePreview)).EndInit();
this.ResumeLayout(false);
this.PerformLayout();
@ -302,6 +352,10 @@ namespace SignToolsGUI
private System.Windows.Forms.Button AddSkin;
private System.Windows.Forms.Button Import;
private System.Windows.Forms.Button Export;
private System.Windows.Forms.MaskedTextBox Framenumber;
private System.Windows.Forms.Label framelabel;
private System.Windows.Forms.Button FrameUp;
private System.Windows.Forms.Button Framedown;
}
}

View File

@ -5,23 +5,26 @@ using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.IO.Compression;
using System.Linq;
using System.Net;
using System.Text;
using System.Windows.Forms;
using System.Xml.Linq;
namespace SignToolsGUI
{
public partial class Form1 : Form
public partial class GUI : Form
{
WorldSerialization worldSerialization = new WorldSerialization();
uint Version;
Dictionary<string, byte[]> SerializedImageData = new Dictionary<string, byte[]>();
Dictionary<string, byte[]> ModdedSerializedImageData = new Dictionary<string, byte[]>();
byte[] Frames = new byte[5];
int SupportedFrames = 0;
Dictionary<string, List<byte[]>> SerializedImageData = new Dictionary<string, List<byte[]>>();
Dictionary<string, List<byte[]>> ModdedSerializedImageData = new Dictionary<string, List<byte[]>>();
Dictionary<string, uint> SerializedSkinData = new Dictionary<string, uint>();
Dictionary<string, uint> ModdedSerializedSkinData = new Dictionary<string, uint>();
uint[] signids = { 1447270506, 4057957010, 120534793, 58270319, 4290170446, 3188315846, 3215377795, 1960724311, 3159642196, 3725754530, 1957158128, 637495597, 1283107100, 4006597758, 3715545584, 3479792512, 3618197174, 550204242 };
uint[] Neons = { 708840119, 3591916872, 3919686896, 2628005754, 3168507223 };
uint[] skinnableids = { 1844023509, 177343599, 3994459244, 4196580066, 3110378351, 2206646561, 2931042549, 159326486, 2245774897, 1560881570, 3647679950, 170207918, 202293038, 1343928398, 43442943, 201071098, 1418678061, 2662124780, 2057881102, 2335812770, 2905007296 };
private Dictionary<string, SignSize> _signSizes = new Dictionary<string, SignSize>
{
@ -43,6 +46,11 @@ namespace SignToolsGUI
{"4057957010", new SignSize(256, 128)},
{"550204242", new SignSize(128, 256)},
{"1283107100", new SignSize(256, 128)},
{"708840119", new SignSize(250, 250)},
{"3168507223", new SignSize(250, 250)},
{"3591916872", new SignSize(215, 125)},
{"2628005754", new SignSize(215, 125)},
{"3919686896", new SignSize(125, 125)},
};
private Dictionary<string, string> _Names = new Dictionary<string, string>
{
@ -85,7 +93,14 @@ namespace SignToolsGUI
{"2057881102","Barricade.Concrete" },
{"2335812770","Barricade.Sandbags" },
{"2905007296","Waterpurifier" },
{"708840119", "sign.neon.xl.animated" },
{"3591916872","sign.neon.125x215.animated"},
{"3919686896","sign.neon.125x125"},
{"2628005754","sign.neon.125x215"},
{"3168507223","sign.neon.xl"},
};
public String Blanked = "iVBORw0KGgoAAAANSUhEUgAAANcAAAB9CAYAAAAx+vY9AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAB/SURBVHhe7cGBAAAAAMOg+VNf4QBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8aqR4AAFsKyZjAAAAAElFTkSuQmCC";
private class SignSize
{
public int Width;
@ -96,7 +111,7 @@ namespace SignToolsGUI
Height = height;
}
}
public Form1()
public GUI()
{
InitializeComponent();
}
@ -114,6 +129,7 @@ namespace SignToolsGUI
void XMLDecode(string SerialData)
{
string[] DataParse = SerialData.Split(new string[] { "<position>" }, StringSplitOptions.None);
foreach (string xmldata in DataParse)
{
@ -122,8 +138,22 @@ namespace SignToolsGUI
string y = xmldata.Split(new string[] { "</y><z>" }, StringSplitOptions.None)[0].Replace("<x>" + x + "</x><y>", "");
string z = xmldata.Split(new string[] { "</z></position>" }, StringSplitOptions.None)[0].Replace("<x>" + x + "</x><y>" + y + "</y><z>", "");
string texture = xmldata.Split(new string[] { "<texture>" }, StringSplitOptions.None)[1].Replace("</texture>", "").Replace("</SerializedImageData>", "");
byte[] ImageData = Convert.FromBase64String(texture);
SerializedImageData.Add("(" + x + ", " + y + ", " + z + ")", ImageData);
if(texture.Length < 50)
{
continue;
}
string[] imageFrames = texture.Split(new string[] { "<frame>" }, StringSplitOptions.None);
List<byte[]> ImageData = new List<byte[]>();
foreach (string imageframe in imageFrames)
{
if(imageframe != "")
ImageData.Add(Convert.FromBase64String(imageframe.Replace("<frame>", "")));
}
try
{
SerializedImageData.Add("(" + x + ", " + y + ", " + z + ")", ImageData);
}
catch { }
}
}
void XMLDecodeSkin(string SerialData)
@ -144,22 +174,31 @@ namespace SignToolsGUI
{
string XMLData = @"<? xml version=""1.0""?><SerializedImageData>";
string SerialData = "";
foreach (KeyValuePair<string, byte[]> _sign in ModdedSerializedImageData)
foreach (KeyValuePair<string, List<byte[]>> _sign in ModdedSerializedImageData)
{
if (_sign.Value.Length != 0)
string[] xmlbreakdown = _sign.Key.Replace("(", "").Replace(" ", "").Replace(")", "").Split(',');
SerialData += "<position>" +
"<x>" + xmlbreakdown[0] + "</x>" +
"<y>" + xmlbreakdown[1] + "</y>" +
"<z>" + xmlbreakdown[2] + "</z>" +
"</position>" +
"<texture>";
for (int ids = 0; ids < _sign.Value.Count; ids++)
{
string[] xmlbreakdown = _sign.Key.Replace("(", "").Replace(" ", "").Replace(")", "").Split(',');
SerialData += ("<position>" +
"<x>" + xmlbreakdown[0] + "</x>" +
"<y>" + xmlbreakdown[1] + "</y>" +
"<z>" + xmlbreakdown[2] + "</z>" +
"</position>" +
"<texture>" +
Convert.ToBase64String(_sign.Value) +
"</texture>");
try
{
SerialData += Convert.ToBase64String(_sign.Value[ids]) + "<frame>";
}
catch
{
SerialData += Blanked + "<frame>";
}
}
SerialData += "</texture>";
}
XMLData = XMLData + SerialData + "</SerializedImageData>";
return XMLData;
@ -197,7 +236,7 @@ namespace SignToolsGUI
private bool isSign(PrefabData sign)
{
//Checks prefab has a valid sign id
return (signids.Contains(sign.id));
return (signids.Contains(sign.id) || Neons.Contains(sign.id));
}
private bool isSkinnable(PrefabData entity)
@ -240,6 +279,9 @@ namespace SignToolsGUI
RemoveSkin.Enabled = false;
Export.Enabled = false;
Import.Enabled = false;
Framenumber.Enabled = false;
FrameUp.Enabled = false;
Framedown.Enabled = false;
OpenFileDialog openFileDialog1 = new OpenFileDialog
{
@ -295,7 +337,8 @@ namespace SignToolsGUI
}
else
{
ModdedSerializedImageData.Add(location, new byte[0]);
List<byte[]> blank = new List<byte[]>();
ModdedSerializedImageData.Add(location, blank);
}
}
else if (isSkinnable(prefabdata))
@ -334,24 +377,26 @@ namespace SignToolsGUI
ModdedSerializedSkinData.Clear();
return;
}
SaveMap.Enabled = true;
Locations.Enabled = true;
AddImage.Enabled = true;
ImagePreview.Enabled = true;
SignType.Enabled = true;
RemoveImage.Enabled = true;
SkinLocations.Enabled = true;
AddSkin.Enabled = true;
RemoveSkin.Enabled = true;
Export.Enabled = true;
Import.Enabled = true;
}
catch
{
MessageBox.Show("Failed to open map");
DisableButtons();
return;
}
SaveMap.Enabled = true;
Locations.Enabled = true;
AddImage.Enabled = true;
ImagePreview.Enabled = true;
SignType.Enabled = true;
RemoveImage.Enabled = true;
SkinLocations.Enabled = true;
AddSkin.Enabled = true;
RemoveSkin.Enabled = true;
Export.Enabled = true;
Import.Enabled = true;
FrameUp.Enabled = true;
Framedown.Enabled = true;
}
}
@ -359,14 +404,38 @@ namespace SignToolsGUI
{
string[] selected = Locations.GetItemText(Locations.SelectedItem).Split(')');
SignType.Text = selected[1].Replace(" ", "");
if (SignType.Text == "3591916872")
{
SupportedFrames = 2;
Framenumber.Text = "0";
Framenumber.Enabled = true;
FrameUp.Enabled = true;
Framedown.Enabled = true;
}
else if (SignType.Text == "708840119")
{
SupportedFrames = 4;
Framenumber.Text = "0";
Framenumber.Enabled = true;
FrameUp.Enabled = true;
Framedown.Enabled = true;
}
else
{
SupportedFrames = 0;
Framenumber.Text = "0";
Framenumber.Enabled = false;
FrameUp.Enabled = false;
Framedown.Enabled = false;
}
name.Text = _Names[SignType.Text];
Size size = new Size(_signSizes[SignType.Text].Width, _signSizes[SignType.Text].Height);
ImagePreview.Size = size;
if (ModdedSerializedImageData.ContainsKey(selected[0] + ")"))
{
if (ModdedSerializedImageData[selected[0] + ")"].Length != 0)
if (ModdedSerializedImageData[selected[0] + ")"].Count != 0)
{
ImagePreview.Image = ByteToImage(ModdedSerializedImageData[selected[0] + ")"]);
ImagePreview.Image = ByteToImage(ModdedSerializedImageData[selected[0] + ")"][int.Parse(Framenumber.Text)]);
}
else
{
@ -376,6 +445,10 @@ namespace SignToolsGUI
}
private void Selection2(object sender, EventArgs e)
{
Framenumber.Enabled = false;
FrameUp.Enabled = false;
Framedown.Enabled = false;
Framenumber.Text = "0";
string[] selected = SkinLocations.GetItemText(SkinLocations.SelectedItem).Split(')');
SignType.Text = selected[1].Replace(" ", "");
name.Text = _Names[SignType.Text];
@ -439,6 +512,49 @@ namespace SignToolsGUI
return null;
}
public static void CopyTo(Stream src, Stream dest)
{
byte[] bytes = new byte[4096];
int cnt;
while ((cnt = src.Read(bytes, 0, bytes.Length)) != 0)
{
dest.Write(bytes, 0, cnt);
}
}
public static byte[] Zip(string str)
{
var bytes = Encoding.UTF8.GetBytes(str);
using (var msi = new MemoryStream(bytes))
using (var mso = new MemoryStream())
{
using (var gs = new GZipStream(mso, CompressionMode.Compress))
{
CopyTo(msi, gs);
}
return mso.ToArray();
}
}
public static string Unzip(byte[] bytes)
{
using (var msi = new MemoryStream(bytes))
using (var mso = new MemoryStream())
{
using (var gs = new GZipStream(msi, CompressionMode.Decompress))
{
//gs.CopyTo(mso);
CopyTo(gs, mso);
}
return Encoding.UTF8.GetString(mso.ToArray());
}
}
public static Bitmap ByteToImage(byte[] blob)
{
@ -472,11 +588,28 @@ namespace SignToolsGUI
{
byte[] NewImage = ImageResize(File.ReadAllBytes(openFileDialog1.FileName), ImagePreview.Width, ImagePreview.Height);
string test = Convert.ToBase64String(NewImage);
string[] selected = Locations.GetItemText(Locations.SelectedItem).Split(')');
if (ModdedSerializedImageData.ContainsKey(selected[0] + ")"))
{
ModdedSerializedImageData[selected[0] + ")"] = NewImage;
ImagePreview.Image = ByteToImage(ModdedSerializedImageData[selected[0] + ")"]);
try
{
ModdedSerializedImageData[selected[0] + ")"][int.Parse(Framenumber.Text)] = NewImage;
ImagePreview.Image = ByteToImage(ModdedSerializedImageData[selected[0] + ")"][int.Parse(Framenumber.Text)]);
}
catch
{
while(ModdedSerializedImageData[selected[0] + ")"].Count < SupportedFrames+1)
{
ModdedSerializedImageData[selected[0] + ")"].Add(Convert.FromBase64String(Blanked));
}
try
{
ModdedSerializedImageData[selected[0] + ")"][int.Parse(Framenumber.Text)] = NewImage;
ImagePreview.Image = ByteToImage(ModdedSerializedImageData[selected[0] + ")"][int.Parse(Framenumber.Text)]);
}
catch { }
}
}
}
}
@ -526,7 +659,7 @@ namespace SignToolsGUI
private void RemoveImage_Click(object sender, EventArgs e)
{
string[] selected = Locations.GetItemText(Locations.SelectedItem).Split(')');
ModdedSerializedImageData[selected[0] + ")"] = new byte[0];
ModdedSerializedImageData[selected[0] + ")"][int.Parse(Framenumber.Text)] = new byte[0];
ImagePreview.Image = null;
}
@ -616,35 +749,16 @@ namespace SignToolsGUI
{
SaveFileDialog saveFileDialog1 = new SaveFileDialog();
saveFileDialog1.Title = "Export Settings File";
saveFileDialog1.DefaultExt = "json";
saveFileDialog1.Filter = "json files (*.json)|*.json|All files (*.*)|*.*";
saveFileDialog1.DefaultExt = "st";
saveFileDialog1.Filter = "SignTool (*.st)|*.st|All files (*.*)|*.*";
saveFileDialog1.FilterIndex = 1;
saveFileDialog1.RestoreDirectory = true;
if (saveFileDialog1.ShowDialog() == DialogResult.OK)
{
string Settings = "";
if (ModdedSerializedImageData.Count != 0)
{
Settings += "<ModdedSerializedImageData>";
foreach (KeyValuePair<string, byte[]> data in ModdedSerializedImageData)
{
Settings += "<sign><pos>" + data.Key + "</pos>" + "<data>" + Convert.ToBase64String(data.Value) + "</data></sign>";
}
Settings += "</ModdedSerializedImageData>";
}
if (ModdedSerializedSkinData.Count != 0)
{
Settings += "<ModdedSerializedSkinData>";
foreach (KeyValuePair<string, uint> data in ModdedSerializedSkinData)
{
Settings += "<skin><pos>" + data.Key + "</pos>" + "<data>" + Base64Encode(data.Value.ToString()) + "</data></skin>";
}
Settings += "</ModdedSerializedSkinData>";
}
File.WriteAllText(saveFileDialog1.FileName, Settings);
MessageBox.Show("Saved");
string XMLData = XMLEncode() + XMLEncodeSkin();
File.WriteAllBytes(saveFileDialog1.FileName, Zip(XMLData));
MessageBox.Show("Saved Settings","Save");
}
}
private void Import_Click(object sender, EventArgs e)
@ -656,8 +770,8 @@ namespace SignToolsGUI
CheckFileExists = true,
CheckPathExists = true,
DefaultExt = "json",
Filter = "json files (*.json)|*.json|All files (*.*)|*.*",
DefaultExt = "st",
Filter = "SignTool (*.st)|*.st|All files (*.*)|*.*",
FilterIndex = 1,
RestoreDirectory = true,
@ -667,34 +781,11 @@ namespace SignToolsGUI
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
string Settings = File.ReadAllText(openFileDialog1.FileName);
try
{
string[] ModdedSerializedSkinData = Settings.Split(new string[] { "<ModdedSerializedSkinData>" }, StringSplitOptions.None)[1].Split(new string[] { "</ModdedSerializedSkinData>" }, StringSplitOptions.None);
if (ModdedSerializedSkinData != null)
{
int missingskins = LoadSettings(ModdedSerializedSkinData[0], false);
if (missingskins != 0)
{
MessageBox.Show("Missing " + missingskins.ToString() + " Skins");
}
}
}
catch { }
try
{
string[] ModdedSerializedImageData = Settings.Split(new string[] { "<ModdedSerializedImageData>" }, StringSplitOptions.None)[1].Split(new string[] { "</ModdedSerializedImageData>" }, StringSplitOptions.None);
if (ModdedSerializedImageData != null)
{
int missingsigns = LoadSettings(ModdedSerializedImageData[0]);
if (missingsigns != 0)
{
MessageBox.Show("Missing " + missingsigns.ToString() + " Signs");
}
}
}
catch { }
string Settings = Unzip(File.ReadAllBytes(openFileDialog1.FileName));
string[] S = Settings.Split(new string[] { "</SerializedImageData>" }, StringSplitOptions.None);
MessageBox.Show("Missing " + LoadSettings(S[0], true).ToString() + " Painted signs");
MessageBox.Show("Missing " + LoadSettings(S[1], false).ToString() + " Skined items");
Selection(null, null);
}
}
private int LoadSettings(string settings, bool sign = true)
@ -702,29 +793,44 @@ namespace SignToolsGUI
int missing = 0;
if (sign)
{
Dictionary<string, byte[]> ImportedSigns = new Dictionary<string, byte[]>();
string[] SignInfo = settings.Split(new string[] { "<sign>" }, StringSplitOptions.None);
if (SignInfo.Length != 0)
{
Dictionary<string, List<byte[]>> ImportedSigns = new Dictionary<string, List<byte[]>>();
for (int i = 1; i < SignInfo.Length; i++)
string[] DataParse = settings.Split(new string[] { "<position>" }, StringSplitOptions.None);
foreach (string xmldata in DataParse)
{
if (xmldata.Contains("xml version")) continue;
string x = xmldata.Split(new string[] { "</x><y>" }, StringSplitOptions.None)[0].Replace("<x>", "");
string y = xmldata.Split(new string[] { "</y><z>" }, StringSplitOptions.None)[0].Replace("<x>" + x + "</x><y>", "");
string z = xmldata.Split(new string[] { "</z></position>" }, StringSplitOptions.None)[0].Replace("<x>" + x + "</x><y>" + y + "</y><z>", "");
string texture = xmldata.Split(new string[] { "<texture>" }, StringSplitOptions.None)[1].Replace("</texture>", "").Replace("</SerializedImageData>", "");
if (texture.Length < 50)
{
string[] pos = SignInfo[i].Split(new string[] { "<pos>" }, StringSplitOptions.None)[1].Split(new string[] { "</pos>" }, StringSplitOptions.None);
string[] data = SignInfo[i].Split(new string[] { "<data>" }, StringSplitOptions.None)[1].Split(new string[] { "</data>" }, StringSplitOptions.None);
ImportedSigns.Add(pos[0], Convert.FromBase64String(data[0]));
continue;
}
if (ImportedSigns.Count != 0)
string[] imageFrames = texture.Split(new string[] { "<frame>" }, StringSplitOptions.None);
List<byte[]> ImageData = new List<byte[]>();
foreach (string imageframe in imageFrames)
{
foreach (KeyValuePair<string, byte[]> importsign in ImportedSigns)
if (imageframe != "")
ImageData.Add(Convert.FromBase64String(imageframe.Replace("<frame>", "")));
}
try
{
ImportedSigns.Add("(" + x + ", " + y + ", " + z + ")", ImageData);
}
catch { }
}
if (ImportedSigns.Count != 0)
{
foreach (KeyValuePair<string, List<byte[]>> importsign in ImportedSigns)
{
if (ModdedSerializedImageData.ContainsKey(importsign.Key))
{
if (ModdedSerializedImageData.ContainsKey(importsign.Key))
{
ModdedSerializedImageData[importsign.Key] = importsign.Value;
}
else
{
missing++;
}
ModdedSerializedImageData[importsign.Key] = importsign.Value;
}
else
{
missing++;
}
}
}
@ -732,33 +838,71 @@ namespace SignToolsGUI
else
{
Dictionary<string, uint> ImportedSkins = new Dictionary<string, uint>();
string[] SkinInfo = settings.Split(new string[] { "<skin>" }, StringSplitOptions.None);
if (SkinInfo.Length != 0)
string[] DataParse = settings.Split(new string[] { "<position>" }, StringSplitOptions.None);
foreach (string xmldata in DataParse)
{
for (int i = 1; i < SkinInfo.Length; i++)
{
if (xmldata.Contains("xml version")) continue;
string x = xmldata.Split(new string[] { "</x><y>" }, StringSplitOptions.None)[0].Replace("<x>", "");
string y = xmldata.Split(new string[] { "</y><z>" }, StringSplitOptions.None)[0].Replace("<x>" + x + "</x><y>", "");
string z = xmldata.Split(new string[] { "</z></position>" }, StringSplitOptions.None)[0].Replace("<x>" + x + "</x><y>" + y + "</y><z>", "");
string skin = xmldata.Split(new string[] { "<skin>" }, StringSplitOptions.None)[1].Replace("</skin>", "").Replace("</SerializedSkinData>", "");
ImportedSkins.Add("(" + x + ", " + y + ", " + z + ")", uint.Parse(skin));
}
string[] pos = SkinInfo[i].Split(new string[] { "<pos>" }, StringSplitOptions.None)[1].Split(new string[] { "</pos>" }, StringSplitOptions.None);
string[] data = SkinInfo[i].Split(new string[] { "<data>" }, StringSplitOptions.None)[1].Split(new string[] { "</data>" }, StringSplitOptions.None);
ImportedSkins.Add(pos[0], uint.Parse(Base64Decode(data[0])));
}
if (ImportedSkins.Count != 0)
if (ImportedSkins.Count != 0)
{
foreach (KeyValuePair<string, uint> importskin in ImportedSkins)
{
foreach(KeyValuePair<string,uint> importskin in ImportedSkins)
if (ModdedSerializedSkinData.ContainsKey(importskin.Key))
{
if (ModdedSerializedSkinData.ContainsKey(importskin.Key))
{
ModdedSerializedSkinData[importskin.Key] = importskin.Value;
}
else
{
missing++;
}
ModdedSerializedSkinData[importskin.Key] = importskin.Value;
}
else
{
missing++;
}
}
}
}
return missing;
}
private void Framenumber_TextChanged(object sender, EventArgs e)
{
int box_int = 0; Int32.TryParse(Framenumber.Text, out box_int);
if (box_int > SupportedFrames && Framenumber.Text != "") { Framenumber.Text = SupportedFrames.ToString(); }
else if (box_int < 0 && Framenumber.Text != "") { Framenumber.Text = "0"; }
string[] selected = Locations.GetItemText(Locations.SelectedItem).Split(')');
if (ModdedSerializedImageData.ContainsKey(selected[0] + ")"))
{
if (ModdedSerializedImageData[selected[0] + ")"].Count != 0)
{
try
{
ImagePreview.Image = ByteToImage(ModdedSerializedImageData[selected[0] + ")"][int.Parse(Framenumber.Text)]);
}
catch
{
ImagePreview.Image = ByteToImage(Convert.FromBase64String(Blanked));
}
}
else
{
ImagePreview.Image = null;
}
}
}
private void FrameUp_Click(object sender, EventArgs e)
{
Framenumber.Text = (int.Parse(Framenumber.Text) + 1).ToString();
}
private void Framedown_Click(object sender, EventArgs e)
{
Framenumber.Text = (int.Parse(Framenumber.Text) - 1).ToString();
}
}
}

479
GUI.resx Normal file
View File

@ -0,0 +1,479 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAABAAIAICAAAAEAIACoEAAAJgAAAEBAAAABACAAKEIAAM4QAAAoAAAAIAAAAEAAAAABACAAAAAAAAAQ
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAATn6IH057hh9MdoAfP1JZHzpZWh9Le4AfU3mAH09YYB87OT0fTlVdH4eWpB9veowfZnKDH05w
dh9FaWwfRWhrH0Zsch9Sd3sfU3h9H1eAhh9JcncfT3J1H1J2eR9HaGofR2dqH1V3ex9UdHsfUnF6H1N6
fR9YgIIfW3l7H159fh9Me4XgTn2F4ElzfOA3RU/gPVNY4EhxeOBQeYHgVWlz4FFYY+BRYmrgW3yE4F97
iOBhfYrgTXd94EdvdOBKbXLgSGlv4E1wdeBQcnjgT3R64EtyeOBVd3zgU3N24E1wdOBRc3fgVHd84FR4
fuBUdnzgV3p/4FR5fuBYe3/gWHt+4E16g/9PfYX/TXh+/z1UYP8/UVn/TnZ+/1F9hf9ZgIj/XX2K/1B3
ff9PeH3/TXd8/1B3fP9MdHn/SXR6/0tvdv9LbXT/TW90/090ef9OcXf/T3N5/1R5ff9Tdnr/UXR7/1Z5
fv9RdHn/U3d9/1h8gf9ae4H/UXV7/1F1e/9RdXn/UX2F/098g/9PfIL/SnJ5/0BbZP9OeoD/T3uB/1J+
hP9Nen//TXt//1B8gf9Qen3/TXZ4/0p0eP9KcnX/UHR3/0xwdf9Td3z/VHh9/1J3ff9Tdnz/VXp+/1d8
gf9TeH3/WHyA/1d8gv9We4H/VnyC/1Z9hP9Ve4D/UXV7/1J3e/9Uf4P/UHt//096fv9XfoT/UnyC/056
f/9Oen//TXuA/015fv9PfH//UX2A/1d+gv9SfoH/Tnh7/052ev9Pdnr/TnV3/1J3fP9UeoD/UHd8/1J5
fv9VfIH/VXp//1Z6fv9Uen3/UHZ7/1J3fP9VdXv/UHR4/0hubv9Sd3r/VHh9/1F8f/9We3//UnyA/1V+
gv9SfID/Unt//1J3ev9Sb3P/T3yA/1F9gf9Td3z/T3J3/1V8gv9ZfoT/Vnp7/1N+fv9Lc3X/T3R5/1N5
f/9PeH7/UHh+/1B3fP9QaH3/WmqJ/1Zigv9eaor/WWKI/1pehv9Scnf/Tnp5/1N+f/9UfYH/T3qB/0Vx
eP9Ec3r/U36D/1J7gP9UfoL/W3h7/2V2eP9RfYL/UHh7/1F3e/9Qdnv/V4KI/1iBhv9YkZL/RJOU/1+Q
kf9geoH/VoCE/1WChf9XgoX/U4GC/19qjP91Zan/dWWp/3xrqv9zY6r/c2Kn/2J0iP9PfHz/U3+C/1R7
fv9Vgof/Tnd9/011fP9XgIX/XIOI/1yEiv9ffID/Ynp//1R9gv9CVl7/PFBV/090d/9Zh4n/WISH/4OG
hv+Fh4b/iZCO/1uDhv9WhIf/WIWI/1iEhv9UgoT/YXmE/3Z4mf9yd5n/dHqY/3B4l/9td5f/ZHyM/1eC
hf9eiI3/ZIiN/1yKjv9aiY3/WYeK/1qAhP9chIn/ZI6U/2eOlf9pj5b/aI+V/0JYXP8tOz7/LTk6/0tn
Z/9Yg4b/V3N5/05lbv9Wf4T/WYaK/1uHi/9ahor/WoeK/1uHi/9ch4z/YIyQ/2SPk/9kjpP/ZpCU/3CV
mP9/mZn/jZyZ/56hmv+tpZn/iZuY/3GNjf9mi4v/V3N1/yo4Ov82TlD/VXd6/1h6f/9BVln/Vm5z/1du
c/8pLi7/SVhZ/2KFi/9njpT/Y4KJ/2yUnP9egYf/V3N4/3GVm/9bdX3/VW1z/4Kbnf90iYv/VGxv/3KE
gv94hYP/gnx0/6yWh//OsJv/zq+Y/86tlv/Mrpn/vqWS/76olv+zoI7/jX5y/0lIQ/83Oz7/UVZW/0A5
M/8qKiv/KCsq/y0wLv9NUk//VV9g/3WBgf8qMjP/anRy/3p5dP9fW1X/r6ab/0FCQP8vLS3/hndt/2td
VP9IPzn/d2hd/66Xhf9GPTf/XFBH/7qfjP/UtZ3/07Sc/+HIsf/hx6//4MWu/+HHr//Ksp7/al5U/1VM
Rv9vY1n/n4x8/4d3av9iV03/XVRL/2tgV/86NTH/Z11U/25qY/96bmT/hndq/3dqXv/QvKn/TU1J/1lV
VP9oXlX/ZltR/5qIef90aF3/intt/3tuYv+0opD/nI19/+LKsv/hybD/8OHN//Dhzf/w4s7/3tG+/15Y
Uf9tZ1//0MOy/5KJfv+nnI//5NXC/2xlXf9iXFX/hn50/1tWT/9DPzr/xLio/9/Rv/+kmo7/eHFo//Hi
z/+lnZH/NjQ0/zw5Nf9QTEb/VlFK/0pGQP9JRUD/eHFo//Dgzf/h1ML/7uDM/+/gy//14sr/9eHK//fj
y//GtqP/X1hQ/+fUvv/Swq7/2Max/+DNtv/44sn/va2Z/25kWP/JuKP/zbum/9bEr//t2cP/va+e/4mA
dP9iW1L/59W//+XSvf+Bdmr/q5yL/+rYwf+bjn//oJOD/8m5pv93b2X/8d/I//bjzf/148z/9eTN/+/T
tP/v0rP/79Kz/+PHqf9yZFX/VUxC/1pQRf/GrZT/sJuF/+vNrf/uz67/6sut/+vRvP/q08H/69K9/+nQ
vP+ci37/X1JG/0lAN/9TSkL/mYd1//DTs//w07P/79O0//DUtv/y1rf/3MOo/2pfU//jyq7/8Na4//DW
uf/w17r/6cak/+nFo//oxKH/6MSi/9+8m/+2mHz/xaSG/9Cujv+Yf2j/4r2a/+bAnP/mv5z/5cOo/+LK
vf/izMT/4cvB/+PJuf/kw6n/2bid/76jjv/NsJn/58Wo/+fFp//oxaP/6MWj/+nGpP/jw6H/oox1/96/
n//ryqj/68qp/+vLqv/kvJr/5Lya/+K9n//gwK3/4b2j/+S5lP/juJT/4beW/+K5mf/gtZP/37SQ/9+0
kP/gtZL/4LaV/+C9pv/gxrn/38W4/9/Ar//gwrL/4sOy/+HFtf/gwrD/38O1/+C/qP/ivZ3/4ryY/+O9
mf/lvpr/5b6a/+W/m//lwJz/5sGd/963mf/duKD/2r6x/9rEvf/ctpz/3K6J/9yzlv/bt6D/27il/9q1
nv/asZb/2rCT/9uylv/bsJD/2q+P/9y0m//bs5n/27GU/9y1nP/ctp7/3Lab/921mv/ev6//3cO4/928
qv/euaD/37WT/+C2lv/guJr/4beT/+G3k//huJT/2b2z4NbAueDVyMfg2cO74NmsieDYqILg2bGY4Nm6
rODXtaTg17Oi4NeynuDXsZvg16+W4Neuk+DWrpPg17Kd4Ne4qeDXtaTg1rWl4Na3qODWtaTg17Kc4Nmw
luDbuKfg27qp4Nq0neDasJPg27OX4Ny7qODcuaLg3bSU4N2yjuDYxcMf08bHH9bO0B/cvq0f16d+H9em
fR/Zs5sf2b62H9W3qh/UtaYf1rKhH9exnR/WrpQf1a2TH9WtlR/VsZsf2LquH9a6rx/Uvbcf1MC+H9O/
vR/Tu7Uf1bCeH9ewmx/ZtqUf2LKaH9ewmB/YsJUf2rmnH9rAuB/bt6Qf3LCOHwAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////////////////////////////wAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////KAAAAEAAAACAAAAAAQAgAAAA
AAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
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
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABRgoseUH2JHk58
hx5OeYMeTXiDHkt4gx5BVFweOElRHjxeYh5Ha20eTH2FHlCCiB5VgoQeTnmAHlFweR5RU1weSEhOHkJC
SR47Q0YeUF1kHqetvB6PlqYeWF5qHmp3ix5zg5YeSEtWHlBqcB5SfYMeSG91HkVoax5DYmUeQWVqHkp3
fh5KcHceTHBzHlN6fB5bh4seTnZ7HluBhh5di5MeTHyCHkFgZR5PdHkeUnV5HlJ4ex5PcnUeUHV4HkJf
YR5CYGMeTW50Hk90eR5Mam0eXH2AHld4gR5TcHweU3V9HlJ6ex5Yf4IeWoCDHlV+gB5OcnEeYHZ3Hmt9
fB5QdnYeTX2G4U18huFNfYbhUHyG4Ux5g+FMeIPhPkpR4ThFTOE5VFjhNUtK4Ud1fOFLfIThT3uC4VZy
e+FXaHHhTVBY4T8/ROFAQUjhQ0dN4VNjbeF7lKDhco2Z4WN4huFwf5PhcoGW4V9ygOFQdHnhS3V64UVr
ceFEZWfhRmlr4UptcuFJb3bhQWFm4U1wdOFZfYLhU3R64Uttc+FUdnzhVn6G4Ut6f+FGaG3hUHR54VR1
eOFXeHzhT3J24Ulsb+FHaGvhSGps4U1scOFWen7hWHt/4VZ6feFPbnfhVHJ74VF0eeFPdnrhVnt/4Vh9
geFXf4PhVHl84V99gOFgfoDhVX2A4Ut7hP9Le4T/TXyE/1B/hf9NfYT/SHF7/ysxPv81P0n/PlNc/0JS
V/9EaG7/SXZ+/0t4gf9QeoP/VXV+/1hpdf9ga3v/WWJv/1FaY/9ScXn/SG1y/0huc/9Qd4D/YH2L/2SB
kP9afoj/TnyB/0x5gP9IdXr/SXF1/0ptcv9Pb3X/Smpw/0VlaP9JbG//T3F3/05wdf9Qcnb/UHN6/0pv
d/9HcHb/UHZ7/1uAhv9aeH3/W3Z3/05vcv9NcHT/VXl//1N1e/9YeH3/UnV5/1F4fP9ZgIb/WHuD/1R3
fP9TeH7/W36E/1d4fv9Sdnz/VXh//1V4ff9ZgIP/V32B/1N5fP9LeYL/S3eA/057hP9SgYX/UYCD/0p0
e/8vN0r/OUdY/z1QWv9IWWP/UXV9/016g/9Oe4P/VYCH/1mDif9fg47/coaZ/2iBkf9SdX3/Unl+/1V7
fv9Pd3r/S3d8/016f/9QfH7/UHt//1J3ff9Ib3X/SXR5/0x5gf9JcXn/UHF4/0ttdP9KbXP/TG1w/0Zl
af9OdHn/VXuA/09vdf9GZGz/RWdt/090ef9Td3z/UHZ6/1J1ef9TdXj/UXN4/1F0e/9XfYP/W36C/1J2
ev9Fam7/Sm90/1F4ff9Rd3r/XH+C/2eFiv9Wc3n/S211/09xdv9SdXn/VHl8/1J1eP9LbW//UXyF/056
g/9OfIT/T32F/1KAhv9QfYL/Q2Jq/0drdP8yOUD/PU9U/1N+g/9QfIP/TXqC/1J/hv9Xgoj/UHuD/1d/
iP9TfYT/TXh7/0x4fP9RfIP/U3uA/053fP9KcHP/T3V5/0x0eP9McnX/SXN3/0tzdv9Jdnv/Rmty/0ts
c/9GaXH/S253/1R2fP9PcXf/S3Bz/1F6gP9Rdnz/UXV7/1N6f/9SeH3/U3l9/1d/g/9XfH7/T3J3/1J2
f/9NcXj/T3R4/1V4ev9Udnr/UHN4/1R2fP9cgIT/WX6D/1uAhP9Ze3//VnqA/1R6gP9Uen3/T3J3/09y
e/9RdXv/VHp9/1B8hf9Tf4f/UHyD/098hP9Qfof/TnqC/0x2fP9Icnv/KTA//0VbZP9VgYf/THqA/0x5
fv9SfoT/W4WL/1B9g/9QfYT/TXl//0x4e/9Kd3z/THqA/1J8gP9QfIH/T3l8/0xvcv9KcXT/TXd4/0t2
e/9LdHj/R25y/0xxc/9Rcnb/THJ4/01wdv9Rdnv/U3d7/1J1eP9LbnT/THB2/1V6fv9ZgIf/T3J4/0tv
dP9Wen3/XX6C/1N5f/9TeoD/T3R4/1R5ff9dgIX/Wn2D/1mAhv9agIb/U3N5/05xd/9UfoL/V4CE/1d+
g/9Ve3//Vn2B/051ff9Ib3v/THB0/1J5fP9OeoL/Un6F/1J9gv9LeYD/TXqB/099gv9RfYL/THd9/zxT
Xv9IbHX/THd8/017gf9LeH//TnqA/1F9hP9PfIP/THV6/016ff9QfoH/T32C/1B9gv9SfIL/UHt+/099
f/9Pe33/S3V5/0p2fP9JcXT/SW9z/0pwdP9Xe33/VHd5/0pwdP9Mb3T/THJ5/1x/hP9bf4P/Wn6E/1N6
gf9VdX3/UnJ4/05ydf9XfID/W3+C/1l+gv9VfID/U3d8/1V5fP9bfYD/WX2B/1p/hf9Rd4D/UXh+/1h+
g/9cgYb/Wn+F/1R7hP9Ue4P/V4CF/1J6fv9Sdnn/Wnt//1R3ef9XfH//VH+B/1eBh/9RfYL/THd7/013
ev9Pe4D/TnqA/1N7gf9VgIT/UH6E/098g/9OfIP/Tnl//014fv9MeoH/T36D/015ff9OeX7/Tnp+/09+
gv9QfoD/Tnp+/1J4fP9Ze3//VYOF/1B+gf9Ne3//S3R3/011ef9QeXz/U3l//010eP9KcHL/SnFz/1Z5
fv9UeH7/UHd+/1mBh/9QeH7/TXF2/1N2ff9Xf4P/VX2B/1qDh/9dhIr/VHZ8/1l2fP9dgIf/XICF/1V9
gv9PdX3/T3F6/1R9hf9YgYf/V3qB/1N0e/9ZfIT/VXt//090eP9Mb3L/UXJ2/1h3e/9Ud3z/U3d8/1N8
gP9UgIT/UX6B/096ff9Penz/T3uB/11/hv9mgYj/VIGF/057f/9NeHv/TXp+/1B+gf9Pen7/T3yC/017
gv9Oe4H/THV6/015fP9PfoL/UH+C/1B9gf9ag4f/X4OH/1F9gP9SgIT/UHt+/053ef9OeXz/T3p8/093
fP9NdXn/UXx9/1J7ff9TeX3/UHZ7/1F0ev9We4L/U3p//052ev9PeH3/V36E/1R7fv9ReoD/U3yE/1F1
e/9VeH3/VHuB/1F2e/9SeHv/UXd7/09zeP9PdXr/S25y/05wdP9Tc3r/WXd9/0FpZP84X1j/Rmts/053
ev9Te37/U3Z8/1J2fP9TfoH/Un+D/1Z9gf9cd3z/UXyA/09+g/9WgYb/W4OH/1R/g/9RfYH/U3l9/054
e/9QfH//TXZ7/0hpbv9Lc3j/UH6C/1B9gv9QfID/Un+B/1R2ev9Vd3v/VHd7/093ev9Qen//U3V7/1l2
fP9VgIX/UXZ5/0xsbf9OdHb/VHl7/0tqa/9JbnP/S3N6/053fP9ReH3/TnN6/0txd/9Kcnr/THN6/1F1
e/9QcHf/SXB2/0twdP9MbG7/UnZ5/1Fxdv9QbXT/SmVo/1Fvc/9beoD/XnV9/05hZf9gbHr/WWR1/0tn
aP9OeXf/RG5q/0t0c/9Se33/VH1+/1R9gv9TfYP/UHl7/096ff9UfH//XX+C/1J6f/9RfYD/T3p+/1B6
ff9Pen7/T3h9/1d6f/9TfYH/U3+C/1NxdP9eYmL/UG5y/097fv9RfID/UHt//1N/g/9Ven//VHh9/0Zj
Z/9Nc3j/UXqA/1h/h/9lh5D/VH2D/2l6ev9vgHv/ZYeE/2uOi/9Xd3T/TGtu/050e/9Qdnv/Vn6C/1d8
hP9Sf4L/UHuA/1B7g/9Qe3//UnyB/1B8f/9UbXr/UlCI/2Rll/9pa5b/ZmGZ/1VSgf9hXJX/cGqh/2Zf
of9PTo7/W1Kd/1hOnP9Wa3P/V4OF/1eDhP9VgoP/VoGD/1SAgf9VfoD/V4GG/1B6fv9LdXz/SHB4/0dz
ef9FdHr/T3l//1OAhf9SfYD/UHl9/1J9f/9XgIP/Un+C/1B8gP9ec3b/eXd3/1p6f/9TgYb/UX+E/1J/
hP9Wgob/UoCE/0dmbP9CV1//UXl//1J9hP9kipP/YoiO/1J7gP9JiY7/HpWa/xuKj/8ahoz/F5Sa/0l+
hP9eanP/WG11/1V9gv9Yf4T/U4CE/1J+gv9Tf4H/VIKE/1SDhf9Rf4H/V3N8/1NJof9gUqz/aVuq/2ZY
qv9fUqv/a1yq/3Rlqv9wYqr/V0uq/3Vlqv97bKn/anGD/1N+gv9WgYT/UH6B/1J+gf9SfoH/Unx//1B3
ef9PfIb/UoCH/053fv8zZ3L/J2l1/0x2f/9Vgoj/VIGG/1J+hP9SeX7/V36C/1N+g/9TfoP/YnR3/3Z1
df9Wdnv/VYGF/1B7gP9PeHv/UG9x/1N8gP9SeX7/VoCE/1WDhv9RfYH/U4GF/1SBhP9SfID/ZIeJ/2+n
pP9DjpD/Ro+Q/4etp/99jY3/bYaP/2OHj/9Vgob/UoGE/1aEh/9YhYj/XoSI/1mBhP9UgoT/U4OF/1d4
e/97cpX/gXCr/49+qf98bKn/iHip/5iHqv98bKn/f2+p/4l4qf94aKn/bFyq/3Jqkv9Xen7/SXVz/0dy
cf9WhIf/VoKF/1iAg/9Xe33/UX2D/1R/hP9Qd3z/PFtk/zpdaP9QdXz/U3yC/1N7gP9XfYL/V32B/1t/
hP9VfoP/Unp+/2RxdP91dHT/VXV6/1J8gf9Qe37/P1db/z1GTv9IY2n/W4GF/1iAg/9Vg4X/WoiK/1mJ
iv9Zioz/U36C/4WFhP/Pt6v/oqSc/52hmv/Otqn/nZSQ/1Z9gP9Yhoj/V4WI/1WDh/9Yhon/WYaI/2CG
iv9ZhYf/VIOG/1SChP9VeHz/dXSK/3Njqf+JeKj/c2Sn/3Znpv+Mfab/e2ym/3lrpP96bKT/fG+j/29k
of98c5n/XnV9/1J+gf9SeHv/V4CD/1eChP9afoL/W294/1aDhf9Xhon/WIaJ/1eBhP9VgIP/Vn+E/1iB
h/9chor/YomO/2OJjv9ii5D/YImP/1yDif9gd33/aHuA/1qAiP9Ygon/VnyC/0ZeZv89SFj/MjxF/yg1
N/9AV1z/V4OG/1uJjP9di43/W4qN/1eEh/9ncnb/gXl7/3hxdv9zbW//e4WG/2+Dhv9VfYH/VYKE/1WE
hv9WhIb/W4aK/1eDhv9SgoL/VIOD/1SDhf9UgIP/WHt//2F5gf9wgI//cYOO/26CjP9ofYr/Z4CM/2eB
i/9ngYn/ZYCI/2WCiv9kg4r/ZYSK/12Dif9bhor/XoeM/2GLkP9kjpT/ZpGX/2yYnv9bi47/XYuO/1uK
jv9aiIv/WYSH/12KjP9YhIf/W4SI/1uCiP9fiI//ZY2U/2qQl/9oj5b/ZYyT/2aNlP9ki5L/ZY6U/2WM
kf9bgIX/JCww/w0QEf8NEBD/GSEh/0ZgYf9Kamn/TnNz/1V/gv9bio3/W3N4/0ZLVv9ATV//N0RQ/053
ev9Xhon/VoSH/1aFiP9XhYf/V4WH/1iGif9XhIf/V4WI/1qHif9WhIf/V4WI/1qGif9YhIf/V4WI/1aF
iP9XhYj/WIWI/1eEiv9Yhov/XImM/2GPk/9jkJX/Y5CW/2aRmP9smJ7/bZec/3edo/9/oKT/iqOm/5mk
ov+ipp//XomN/2GLjv9biYz/WouN/1uJjP9ZiIr/WXyA/1pyeP9eiIz/XIuP/12Ij/9mjpX/aZCV/2qQ
lv9vlJr/b5Oa/22Vm/9ulZr/TmZq/yQtL/9RbnP/Tmhs/xMYGP8tMC3/P01L/0lnZ/9UfX7/W4qM/12J
jv9We4D/WHqA/1d6gf9ZhYr/WIaK/1mGiv9Zhov/XYaL/12Hi/9chov/XIeK/1qHif9ch4v/WoWK/1uE
if9chor/XYiO/2GOk/9kj5T/aJOZ/2iUmf9vmZ7/cJme/3Gaof9znKP/c5mf/3qZnf+GnZ//k52Z/6Gd
l/+sn5X/tJ6P/7ygjv/Do47/x6SP/2mRlv9ijpL/X4iN/12Ijf9biIz/U4KE/1qFif9Xc3j/PFNV/zdO
UP9MbXD/XomM/16Mj/9ch4r/YImP/2WMk/9lh4z/Xnh7/1Zsbv9lg4j/bpOa/1pyeP8iKCn/Jigo/0dQ
T/9QaGn/X4aL/1qAh/9iio//XYSK/1p3f/9gfYT/Zo6V/2OPlv9kjpT/YomP/2KDif9qkZf/Z4+W/2iS
l/9qkZj/Y3uL/2iEjv9wl5//c5uj/3OcpP9znKL/eqGn/3mfpP9ymJ7/dZab/2iGiv9gfYH/YXl9/32I
hP+wmYv/v6KR/8Wlkv/JqZX/zK2Y/8+xm//Rs53/0rSc/9GznP+0rZ//nqef/5agmv9ifn7/aIeI/2qN
j/9ki4//OU5Q/wECAv8DBAT/BwkJ/yc1Nv9TcnT/UGpq/1Z5ev9NbXD/GyMk/yMsLP9cd3z/aIaP/2WA
hv9VY2b/KCws/x0eHv9HUE//U2Rn/2yMk/9ri5P/dZuh/3Oaof9tj5X/dpad/3uhqP9znKT/cZqh/1Zt
c/8lLS//ZoeM/3abof9ylp7/c5Sb/z9JUP82QET/X3h8/4qeoP+WoJ//mZuW/15mZf8xPD7/QExO/319
dv9udW//bHZw/5GOhP+cin3/alpQ/5iGeP/UuqT/1rqk/9O3of/Qs53/za+X/8yslP/LqpP/yaeS/8ur
lv/CppL/oI+A/7iklP++rJv/uKuc/5SJff9wZl3/bGpm/zY7Ov8ICQn/Fxwe/0RNWv9sh43/Ljs8/wkI
CP8PDw7/GyAk/ycrM/8QExP/LTc4/y44N/8bHx7/W3N0/zZAQv9EUlb/b4qS/3mdpP9lgYb/HiUm/yYv
Mf9lf4P/epib/3+Wl/9PV1f/ERER/4GGgf+jo5z/p6Ga/2RlYv8JCQn/EA4O/w8QEP9+cGj/zLCf/6iR
g/8aFxX/GBUT/w4NDP9fVEz/vqeU/8eumf++pJH/NS8q/wMDA/8QDw7/dWRY/8mpk//LqpX/y6qV/8qp
k//Lq5T/zq2W/9Cwm//Orpn/zq2W/9CvmP/Qr5j/0K+Y/9Gwmf/Sspr/zq+a/7eikf9udW7/V1dS/xEQ
EP86O0f/mYyI/yUiH/9VSkP/m4Z3/ywmIv8BAQL/GxcV/yYjH/8VGBf/JSMh/5yShv8uLCn/DA4O/4WD
fv+1raX/UlFO/wsLC/8ZGRj/JSUk/6SVif/Ns6H/dWde/xoXFv+0no7/1bik/8Cunv9VUk3/FxYW/1tX
WP83MzL/JyMg/7qhkP+YhHb/FxUT/5uHd/95aV3/FxUT/5mEdP/bu6L/m4d2/xIQD/96al7/cGFW/yEe
G/+kjn7/2ryk/9m8o//ZvKP/2Lyj/9q9pf/cv6f/3L+m/9y+pP/au6L/2bqh/9m6of/YuaH/2Lqi/9e6
o//WuaP/xayY/6SPfv8iHhz/SkE8/7adiv8eGhj/d2Za/9m4oP+kjHz/HBgW/zw1L/+qlIL/Lyol/yMf
HP+4oZH/OTMv/wYGBv9TSkT/zbWj/0M7Nv8wNTX/hIWA/0Q9Of9NQz3/0LSf/39vY/8aGBb/uKGO/9m9
pv+7rZz/TVRS/xYWFv9gXl7/fXRv/y0oJf+Id2r/rpiH/xsZF/+kj37/1rmi/01EPf9ZT0b/38Kq/4x7
bf8eGxn/wKiU/9zAqP9wZFn/TkY+/9a8pP/fxKr/3sSq/97Eqv/fw6r/59O9/+fSvP/n0bv/59G7/+bR
u//m0Lr/5c+5/+bQuv/m0Lv/vaqY/2dcUv8eGhj/CgoJ/4+Cdv/JtaH/Hxwa/3xwZf/lzLb/5My2/4p+
cv8cGhj/uqaU/5eIev8kIR7/vqub/0lCPf8vLCn/JCEf/5eJfP8zLyr/WVlU/8/AsP/EsaH/PDgz/5qL
ff+ShXj/GBYU/7upl//mzrf/0cGu/4KCe/8UFBT/SUlJ/4eBfP9WT0j/amFY/8Kwn/8qJyP/bWJZ/+jS
u/+Lf3L/QTw3/9G9qf+EeGz/IyAd/8m2o//n0br/0r+r/1hSSv+9rJn/5tC4/+POtv/jzbX/48y0/+rb
x//q28b/6tvH/+rbx//q28f/6tvH/+rbx//r3Mf/pJqN/yEfHf8DAwP/Kykm/4qCd//j1cH/1si2/ycl
Iv9vaGD/7d3J/+3dyP/WyLb/MC4q/2tkXP+2qpv/KCYk/8W4qP9fWlL/Pjs3/1JNSP8iIB7/ERAP/5CH
fP/w38v/797K/6acj/+De3L/opiM/xYVE/+4rZ7/79/L/+nbyP/NxLX/RUM//yEhIf9xbm3/SkZC/yAe
HP8rKSX/CwoK/yIgHf/Huqn/ioJ2/xcWFf8vLCn/GBYV/xsaGP/Iu6r/7NvH/+vaxf/Mv67/2sy5/+rZ
xf/p2MP/6NfC/+jXwv/159T/9efU//Xn1P/159T/9OfU//Tm0//26NX/2M28/y0qJ/8kIiD/lY6D/93R
wf/159T/9ejU/+vezP9FQj3/XVhR//Pl0v/15tP/9+jV/5KJf/8dHBr/fndv/yclIv/Euar/i4N5/y4r
Kf+yqJz/LSso/x8dG//Fuqv/9+nW//Xn1P/y5NH/6dzL/7etoP8WFRT/sqic//nq1//159T/+OnX/7Op
nf8VFBT/JCQk/w8PDv8vLSr/bWhh/25oYf8iIB7/Pjs3/yQjIP8eHRv/Y15Y/15aU/8aGRf/w7mr//jr
2P/26Nb/9+rY//bq1//16db/9enW//Xp1v/16db/9uXQ//bm0P/25dD/9uXQ//bl0P/25c//+ujT/7Gm
l/8REA//opeJ//vp0//45tD/9eTO//Xkzv/35c//vK+e/6uekP/25M7/9uTO//flz//p2cP/YVtS/xAQ
D/8aGRf/ybup/8u9q/9yamD/5tbB/9HCr//DtKL/8uDK//Xkzv/15M7/8+HM//nn0f/Iuqn/GRcW/6SZ
jP/56NL/9eTP//fm0P/k1cL/U09N/wgICP9APDf/1se0//fm0f/359L/p52P/xoZF/8iIB3/uq6e//fn
0v/NwK//IB8d/66jlf/46NP/9eXQ//bm0f/25tH/9ubR//Xm0f/25tL/9ubS//PexP/z3cT/893D//Pd
wv/03cL/9N3C//bgxf+yopD/EhEP/5CEdv/y3MH/+eHF/8i2of+NgnT/7Na8//Tdwv/13cL/89vA//Lb
v//z2r//9NzA/+HLsv+OgHD/l4h4/+rTuf/y2r//7ta8//Lawf/z3MP/9NzD//Dawv/z3ML/t6eU/1ZQ
SP9oX1b/cWhe/xIRD/+KfnD/893C//Tew//03sP/8NnA/9XBrP+wn43/zrul//Xew//z3cP/897E//Hc
w//Dsp7/wrGd//PexP/14Mb/2siy/ykmI/+QhXf/9uHH//Pexf/z3sb/89/G//Pfx//z38f/8+DH//Pg
yP/x17r/8da5//DWuP/w1rj/8NW3//DVt//x1rj/4Mer/0pDOv8SEA//Z11S/52Mev9hV03/Kycj/9i/
pP/u0bP/38Sp/+zPsf/v0rT/79Kz/+/Ss//w0rP/8dO0//HUtf/u0rf/7dK4/+3SuP/t0rj/7dK5/+zS
uv/s0r3/7tbA/5yNgv8YFxb/CgkI/wQEA/8AAAD/HhwZ/11USv91al3/fHFj/9S9o//z17n/89i5//LW
uP/w1bf/8NW4//DWuf/w1rn/89m7//PZvP/x17r/8ti7/+TMsv83My3/cGZa//Lavf/x2Lv/8di8//HZ
vP/x2b3/8dm+//Havv/x2r7/7tCw/+3Pr//tz67/7c6u/+3Nrf/tza3/7c2t/+7Orf/Nspf/V0xB/w8N
DP8EBAT/BQUE/1dMQf/kxaX/t5+H/zcxK/+kj3n/7cyq/+vKqP/qyqj/68mo/+vJqP/ryqr/6M68/+XP
w//izsX/483A/+fNvP/ozbv/6M67/+nNuf/gybn/xrCf/7Ochf+ahnH/dWZX/0Y9Nf8bGBb/BwcG/xgV
E/+4oYr/79Cv/+zNrP/szaz/7c6t/+3Orv/tzq//7c+v/+3PsP/uz7D/7tCw/+/Rsf/pza7/SkI6/09H
Pv/qz7D/79Kz/+/Ss//v0rT/79O1/+/Utv/v1Lb/79S2/+vKqP/qyaf/6sim/+rIpf/px6X/6cel/+nH
pP/pxqP/68ek/+G/nv+0mYD/j3ll/56GcP/VtJb/7Mak/76hhv8fHBj/e2pZ/+nFov/nw5//58Of/+fD
n//nwp7/58Kf/+fHrP/lzcD/4tLM/97S0f/fz8r/4svD/+LKvv/gyLz/4si3/+fIsP/pyKr/68in/+nG
pP/gv6D/x6yV/6uUg/+1nIb/4sGj/+nHpv/oxqX/6cal/+nHpf/pyKX/6cil/+nIpv/qyKf/6smn/+rJ
p//ryqj/7Mup/3RlVv9HPzf/48Sl/+zMq//szKv/7Mys/+zNrf/sza3/7M2t/+3Orv/ow6H/6MKg/+jC
oP/nwZ//58Ge/+fBnv/mwJ3/5sCf/+bAn//mwJz/6MGc/+nBnP/owZz/5r+b/+W+mv/jvJj/upt//8yq
iv/lvZn/5LyY/+S8mP/kvJj/5LyY/+S8l//kvJj/5Lya/+XApP/ky77/4dDL/+PKwv/hzcb/3c3H/97I
wP/gw7H/4cCp/+LAp//jwKX/5MCi/+bCpf/nxaz/5sWv/+XCqP/lwqX/5MOr/+XDqv/lwqT/5sKg/+bC
oP/mwqD/58Kg/+fDoP/nw6D/58Sh/+jFov/StJX/wKWJ/+bFo//oxqT/6Mek/+nHpP/pyKX/6sim/+rI
pv/qyaf/5r6c/+a+m//lvpv/5L6b/+O9nP/jvZ7/4r6i/+HAq//hwKv/5LuZ/+S5lf/juJX/47iV/+O4
lf/juJT/47iU/+W6lf/juZT/4beS/+G2kv/htpL/4baS/+C2kv/gtpL/4reT/+G2kv/gtpL/4rud/+LC
rv/hwrD/4srA/+DOyf/gzcj/38jB/9/Dtv/fwbL/38Gx/9++q//gv6v/4MKv/9/Et//fwrH/4MCq/+DC
r//gw7P/4MCt/+K/pf/jv6D/5L6d/+S+mf/kvpn/5L6a/+S/mv/kv5r/5sCc/+fBnf/lwJ3/5sGe/+bB
nv/mwZ//58Kf/+bDoP/mw6D/58Sh/+O7mP/ju5j/47qY/+K6mv/hu53/4Lyl/97AsP/dxLr/38K1/+C3
lf/gtI//37SP/9+0j//gtJD/37SS/9+2lv/ft5r/37WY/96zkv/espD/3rKO/96yjf/eso3/3rKN/9+0
lP/ftJT/3rKN/96zj//ftpn/37ic/+C/rP/gx73/4MGu/+DFuP/gw7b/4L6q/+DDtv/ex8H/3sK0/+DB
r//gx7z/4Ma6/9/Br//gxLj/3sa9/93Duf/ewbL/372m/+G8oP/hu5r/4bqW/+G6lf/iu5f/4rqW/+K7
lv/ju5b/47yX/+O8l//kvZj/5L2Z/+S+mf/kvpn/5L+a/+W/m//guJX/4LeW/+C3mP/fuJ3/3bql/9u+
r//bwrr/3Ma//97Bsf/eso//3bCL/92wjP/es5T/3LSY/9y1mf/cuaL/3b6w/9y7q//ctqD/27Oa/9ux
lP/bsJD/27CP/9yvj//csZP/3bKV/9ywj//bror/26+M/9yyk//dspX/3beg/9yxkP/csZD/3LKR/9yw
jf/dtZj/38Gx/9/Asv/euJ//37um/9++qv/ft53/37+s/9/Fuf/eysX/3cfA/92/sf/dvKn/3bul/966
of/gt5j/4baV/+C3lf/htpP/4riX/+K4l//huJX/4riV/+K4lf/iuJX/47mV/+O6lv/ju5b/3baZ/922
m//ctp7/27mn/9m+s//Xwr3/1sPA/9rFwf/duaL/262I/9qsiP/brIn/3LKV/9q1n//ZtZ//2bil/9u3
o//btqH/2rek/9m1ov/Zs5v/2bGX/9iwmP/ZsZf/2rOa/9qymf/aspf/2q6R/9msjP/ZrpD/2rCV/9q0
nf/Zspr/2a+U/9mvkf/aro7/2q2M/9qujv/br5D/2q6M/9qui//br43/262K/9uui//cspT/38G0/97K
xP/dw7j/3b+y/929rf/dva3/3rqj/92zkf/eso3/37OQ/9+3nP/euaD/37aY/+C1kv/gtZD/37WQ/9+1
kf/gtpL/4LaS/9q6rP/Yu7D/17yx/9e/uP/Uw8H/1MfI/9bKy//bxLz/2q2N/9iphP/YqYT/2KmD/9mr
iP/atqL/2Lmr/9m4qf/ZtKH/1rOg/9izof/Ys6H/17Kd/9exm//XsZ3/1q+X/9iwmP/Yr5b/2K+U/9iv
k//XrpL/166U/9ixmf/YtqP/17mr/9e3qv/Yt6j/17Ke/9eynv/XtKP/17Sj/9ayn//Xsp3/17Gb/9iv
lv/ZrZD/2a2O/9qvkf/ct6P/3b+z/9y+sP/btqD/27Wd/9y1nv/bspT/26+M/9yxkP/dtp3/3Lyq/9y7
qv/dtpz/3bOU/92yj//dso3/3bON/96zjv/Ywbrh2MTA4dbDwOHTxMPh0sjI4djPz+Hczszh27ij4deo
geHYqIDh16iA4denf+HYqYbh2rmr4drAueHXuKvh1rWm4dW3qeHWtabh1bKh4dWxn+HXsZ/h2LOg4dav
meHXrpbh166V4dauk+HWrZPh1a2U4dauleHVrpfh17Ke4di5reHXuq/h1rir4da3qeHVuK7h1buy4dW+
uOHTvLbh07u04dS7tOHUubDh1bWm4dexnuHXrZXh166V4dm2peHbvrPh2bSe4dmzmuHZs5vh2LCX4div
k+HZsJPh2rOY4du4o+Hcv7Ph2r6y4dq8r+HbuKTh3LKT4dywjeHdsIzh2MO/HtvIxR7WxsUe0cbIHtLJ
yh7b09Qe3sjBHtqsjB7YqH4e16d+HtanfR7Wpnwe16mGHtu9sR7bxcAe17uxHtS3qx7Wuawe1bisHtS0
ph7VsqIe2LKiHtm0oh7Wr5ke1q6VHtaulB7VrZMe1a2UHtWulh7Vrpce1K+XHtaznh7Yuq4e2LuwHtW5
rR7Wu7Ee1by4HtS9uB7VwL0e1MC9HtS/ux7TwLwe07+8HtS5sB7VtKce1rGfHtWvnB7XsJ4e2riqHtmy
nh7Zspoe2LSeHtWxmx7XsZke17CVHtawkx7ZsZce27qoHtq+sh7awbke2r2yHtu0nh7csJIe3LCPHgAA
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
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
/////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAD/////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////w==
</value>
</data>
</root>

View File

@ -1,6 +1,9 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Security.Cryptography;
using System.Threading.Tasks;
using System.Windows.Forms;
@ -14,9 +17,28 @@ namespace SignToolsGUI
[STAThread]
static void Main()
{
WriteResourceToFile("SignToolsGUI.System.Buffers.dll", "System.Buffers.dll");
WriteResourceToFile("SignToolsGUI.UnityEngine.CoreModule.dll", "UnityEngine.CoreModule.dll");
WriteResourceToFile("SignToolsGUI.UnityEngine.SharedInternalsModule.dll", "UnityEngine.SharedInternalsModule.dl");
WriteResourceToFile("SignToolsGUI.LZ4pn.dll", "LZ4pn.dll");
WriteResourceToFile("SignToolsGUI.LZ4.dll", "LZ4.dll");
WriteResourceToFile("SignToolsGUI.Facepunch.System.exe", "Facepunch.System.exe");
WriteResourceToFile("SignToolsGUI.Rust.Data.dll", "Rust.Data.dll");
WriteResourceToFile("SignToolsGUI.Rust.World.dll", "Rust.World.dll");
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
Application.Run(new GUI());
}
public static void WriteResourceToFile(string resourceName, string fileName)
{
using (var resource = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName))
{
using (var file = new FileStream(fileName, FileMode.Create, FileAccess.Write))
{
resource.CopyTo(file);
}
}
}
}
}

View File

@ -32,15 +32,21 @@
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup>
<ApplicationIcon>st_1WN_icon.ico</ApplicationIcon>
</PropertyGroup>
<ItemGroup>
<Reference Include="LZ4">
<HintPath>..\..\..\..\..\rust\RustServerFiles\RustDedicated_Data\Managed\LZ4.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="Rust.Data">
<HintPath>..\..\..\Desktop\Rust.Data.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="Rust.World">
<HintPath>..\..\..\Desktop\Rust.World.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
@ -55,19 +61,20 @@
<Reference Include="System.Xml" />
<Reference Include="UnityEngine.CoreModule">
<HintPath>..\..\..\..\..\rust\RustServerFiles\RustDedicated_Data\Managed\UnityEngine.CoreModule.dll</HintPath>
<Private>False</Private>
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="Form1.cs">
<Compile Include="GUI.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="Form1.Designer.cs">
<DependentUpon>Form1.cs</DependentUpon>
<Compile Include="GUI.Designer.cs">
<DependentUpon>GUI.cs</DependentUpon>
</Compile>
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<EmbeddedResource Include="Form1.resx">
<DependentUpon>Form1.cs</DependentUpon>
<EmbeddedResource Include="GUI.resx">
<DependentUpon>GUI.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
@ -91,5 +98,17 @@
<ItemGroup>
<None Include="App.config" />
</ItemGroup>
<ItemGroup>
<Content Include="blue_aB3_icon.ico" />
<Content Include="st_1WN_icon.ico" />
<EmbeddedResource Include="Facepunch.System.exe" />
<EmbeddedResource Include="Rust.Data.dll" />
<EmbeddedResource Include="Rust.World.dll" />
<EmbeddedResource Include="LZ4.dll" />
<EmbeddedResource Include="LZ4pn.dll" />
<EmbeddedResource Include="System.Buffers.dll" />
<EmbeddedResource Include="UnityEngine.CoreModule.dll" />
<EmbeddedResource Include="UnityEngine.SharedInternalsModule.dll" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>

Binary file not shown.

View File

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7" />
</startup>
</configuration>

Binary file not shown.

BIN
dlls/Facepunch.System.exe Normal file

Binary file not shown.

BIN
dlls/LZ4.dll Normal file

Binary file not shown.

BIN
dlls/LZ4pn.dll Normal file

Binary file not shown.

BIN
dlls/Rust.Data.dll Normal file

Binary file not shown.

BIN
dlls/Rust.World.dll Normal file

Binary file not shown.

BIN
dlls/System.Buffers.dll Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -1 +1 @@
a85020bbc6fc54e0c3d3cdb7ff9cc161770abe5b
d23d861640ecf548e61fab27f8934d5de9570cc3

View File

@ -1,19 +1,10 @@
C:\Users\bmg\source\repos\SignToolsGUI\bin\Release\SignToolsGUI.exe.config
C:\Users\bmg\source\repos\SignToolsGUI\bin\Release\SignToolsGUI.exe
C:\Users\bmg\source\repos\SignToolsGUI\bin\Release\SignToolsGUI.pdb
C:\Users\bmg\source\repos\SignToolsGUI\bin\Release\LZ4.dll
C:\Users\bmg\source\repos\SignToolsGUI\bin\Release\Rust.Data.dll
C:\Users\bmg\source\repos\SignToolsGUI\bin\Release\Rust.World.dll
C:\Users\bmg\source\repos\SignToolsGUI\bin\Release\UnityEngine.CoreModule.dll
C:\Users\bmg\source\repos\SignToolsGUI\bin\Release\LZ4pn.dll
C:\Users\bmg\source\repos\SignToolsGUI\bin\Release\Facepunch.System.exe
C:\Users\bmg\source\repos\SignToolsGUI\bin\Release\System.Buffers.dll
C:\Users\bmg\source\repos\SignToolsGUI\bin\Release\UnityEngine.SharedInternalsModule.dll
C:\Users\bmg\source\repos\SignToolsGUI\obj\Release\SignToolsGUI.Form1.resources
C:\Users\bmg\source\repos\SignToolsGUI\obj\Release\SignToolsGUI.Properties.Resources.resources
C:\Users\bmg\source\repos\SignToolsGUI\obj\Release\SignToolsGUI.csproj.GenerateResource.cache
C:\Users\bmg\source\repos\SignToolsGUI\obj\Release\SignToolsGUI.csproj.CoreCompileInputs.cache
C:\Users\bmg\source\repos\SignToolsGUI\obj\Release\SignToolsGUI.csproj.CopyComplete
C:\Users\bmg\source\repos\SignToolsGUI\obj\Release\SignToolsGUI.exe
C:\Users\bmg\source\repos\SignToolsGUI\obj\Release\SignToolsGUI.pdb
C:\Users\bmg\source\repos\SignToolsGUI\obj\Release\SignToolsGUI.csprojAssemblyReference.cache
C:\Users\bmg\source\repos\SignToolsGUI\obj\Release\SignToolsGUI.GUI.resources

Binary file not shown.

Binary file not shown.

BIN
st_1WN_icon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB