diff --git a/.gitignore b/.gitignore index dc89255..a799e08 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,6 @@ MCSong/bin/ MCSong/obj/ FROSTEDBUTTS/ *.suo +/.vs/ProjectSettings.json +/.vs +/packages diff --git a/Interop.NATUPNPLib.dll b/Interop.NATUPNPLib.dll new file mode 100644 index 0000000..6cb7126 Binary files /dev/null and b/Interop.NATUPNPLib.dll differ diff --git a/MCSong.sln b/MCSong.sln index 2e96c9e..75f8f55 100644 --- a/MCSong.sln +++ b/MCSong.sln @@ -1,22 +1,40 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Express 2012 for Windows Desktop +# Visual Studio 2013 +VisualStudioVersion = 12.0.31101.0 +MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MCSong_", "MCSong\MCSong_.csproj", "{12597DB0-7C34-4DE1-88EA-9250FF3372EB}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Starter", "MCSong\Starter.csproj", "{63DCBB31-92CD-4464-A86C-A7E51A5FE9FE}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Debug|Mixed Platforms = Debug|Mixed Platforms Debug|x86 = Debug|x86 + Release|Any CPU = Release|Any CPU + Release|Mixed Platforms = Release|Mixed Platforms Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution + {12597DB0-7C34-4DE1-88EA-9250FF3372EB}.Debug|Any CPU.ActiveCfg = Debug|x86 + {12597DB0-7C34-4DE1-88EA-9250FF3372EB}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 + {12597DB0-7C34-4DE1-88EA-9250FF3372EB}.Debug|Mixed Platforms.Build.0 = Debug|x86 {12597DB0-7C34-4DE1-88EA-9250FF3372EB}.Debug|x86.ActiveCfg = Debug|x86 {12597DB0-7C34-4DE1-88EA-9250FF3372EB}.Debug|x86.Build.0 = Debug|x86 + {12597DB0-7C34-4DE1-88EA-9250FF3372EB}.Release|Any CPU.ActiveCfg = Release|x86 + {12597DB0-7C34-4DE1-88EA-9250FF3372EB}.Release|Mixed Platforms.ActiveCfg = Release|x86 + {12597DB0-7C34-4DE1-88EA-9250FF3372EB}.Release|Mixed Platforms.Build.0 = Release|x86 {12597DB0-7C34-4DE1-88EA-9250FF3372EB}.Release|x86.ActiveCfg = Release|x86 {12597DB0-7C34-4DE1-88EA-9250FF3372EB}.Release|x86.Build.0 = Release|x86 + {63DCBB31-92CD-4464-A86C-A7E51A5FE9FE}.Debug|Any CPU.ActiveCfg = Debug|x86 + {63DCBB31-92CD-4464-A86C-A7E51A5FE9FE}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 + {63DCBB31-92CD-4464-A86C-A7E51A5FE9FE}.Debug|Mixed Platforms.Build.0 = Debug|x86 {63DCBB31-92CD-4464-A86C-A7E51A5FE9FE}.Debug|x86.ActiveCfg = Debug|x86 {63DCBB31-92CD-4464-A86C-A7E51A5FE9FE}.Debug|x86.Build.0 = Debug|x86 + {63DCBB31-92CD-4464-A86C-A7E51A5FE9FE}.Release|Any CPU.ActiveCfg = Release|x86 + {63DCBB31-92CD-4464-A86C-A7E51A5FE9FE}.Release|Mixed Platforms.ActiveCfg = Release|x86 + {63DCBB31-92CD-4464-A86C-A7E51A5FE9FE}.Release|Mixed Platforms.Build.0 = Release|x86 {63DCBB31-92CD-4464-A86C-A7E51A5FE9FE}.Release|x86.ActiveCfg = Release|x86 {63DCBB31-92CD-4464-A86C-A7E51A5FE9FE}.Release|x86.Build.0 = Release|x86 EndGlobalSection diff --git a/MCSong/Block.cs b/MCSong/Block.cs index 97d52fd..9d15142 100644 --- a/MCSong/Block.cs +++ b/MCSong/Block.cs @@ -246,6 +246,24 @@ public class Block public const byte snake = (byte)251; public const byte snaketail = (byte)252; + // CPE Blocks + public const byte cobbleslab = (byte)50; + public const byte rope = (byte)51; + public const byte sandstone = (byte)52; + public const byte snow = (byte)53; + public const byte cpefire = (byte)54; + public const byte lightpink = (byte)55; + public const byte forestgreen = (byte)56; + public const byte brown = (byte)57; + public const byte deepblue = (byte)58; + public const byte turquoise = (byte)59; + public const byte ice = (byte)60; + public const byte ceramic = (byte)61; + public const byte cpemagma = (byte)62; + public const byte pillar = (byte)63; + public const byte crate = (byte)64; + public const byte stonebrick = (byte)65; + public static List BlockList = new List(); public class Blocks { @@ -462,7 +480,7 @@ public static void SetBlocks() { string[] lines = File.ReadAllLines("properties/block.properties"); - if (lines.Length == 0) ; + if (lines.Length == 0) { } else if (lines[0] == "#Version 2") { string[] colon = new string[] { " : " }; @@ -597,6 +615,9 @@ public static bool Walkthrough(byte type) case mushroom: case redmushroom: case shrub: + //CPE + case rope: + case cpefire: return true; } return false; @@ -709,7 +730,7 @@ public static bool Placable(byte type) return false; } - if (type > 49) { return false; } + if (type > 65) { return false; } return true; } @@ -849,6 +870,12 @@ public static bool LavaKill(byte type) case Block.mushroom: case Block.redmushroom: case Block.bookcase: + //CPE + case Block.lightpink: + case Block.brown: + case Block.deepblue: + case Block.turquoise: + case Block.crate: return true; } return false; @@ -881,6 +908,7 @@ public static bool LightPass(byte type) case Block.mushroom: case Block.redmushroom: case Block.shrub: + case Block.rope: return true; default: @@ -1049,6 +1077,23 @@ public static bool mb(byte type) case Block.deathwater: case flagbase: + //CPE + case Block.cobbleslab: + case Block.rope: + case Block.sandstone: + case Block.snow: + case Block.cpefire: + case Block.lightpink: + case Block.forestgreen: + case Block.brown: + case Block.deepblue: + case Block.turquoise: + case Block.ice: + case Block.ceramic: + case Block.cpemagma: + case Block.pillar: + case Block.crate: + case Block.stonebrick: return false; default: @@ -1056,6 +1101,17 @@ public static bool mb(byte type) } } + public static bool Extended(byte b) + { + return (b >= (byte)50 && b <= (byte)65); + } + + public static byte SupportLevel(byte b) + { + if (b >= (byte)50 && b <= (byte)65) return (byte)1; + else return (byte)0; + } + public static string Name(byte type) { switch (type) @@ -1111,6 +1167,24 @@ public static string Name(byte type) case 48: return "mossy_cobblestone"; case 49: return "obsidian"; + //CPE + case 50: return "cobblestone_slab"; + case 51: return "rope"; + case 52: return "sandstone"; + case 53: return "snow"; + case 54: return "cpefire"; + case 55: return "lightpink"; + case 56: return "forestgreen"; + case 57: return "brown"; + case 58: return "deepblue"; + case 59: return "turquoise"; + case 60: return "ice"; + case 61: return "ceramic"; + case 62: return "cpemagma"; + case 63: return "pillar"; + case 64: return "crate"; + case 65: return "stonebrick"; + case 70: return "flagbase"; case 100: return "op_glass"; case 101: return "opsidian"; //TODO Add command or just use bind? @@ -1337,6 +1411,24 @@ public static byte Byte(string type) case "mossy_cobblestone": return 48; case "obsidian": return 49; + //CPE + case "cobblestone_slab": return 50; + case "rope": return 51; + case "sandstone": return 52; + case "snow": return 53; + case "cpefire": return 54; + case "lightpink": return 55; + case "forestgreen": return 56; + case "brown": return 57; + case "deepblue": return 58; + case "turquoise": return 59; + case "ice": return 60; + case "ceramic": return 61; + case "cpemagma": return 62; + case "pillar": return 63; + case "crate": return 64; + case "stonebrick": return 65; + case "op_glass": return 100; case "opsidian": return 101; //TODO Add command or just use bind? case "op_brick": return 102; //TODO @@ -1536,6 +1628,30 @@ public static byte Byte(string type) } } + public static byte Fallback(byte b) + { + switch (b) + { + case cobbleslab: return staircasestep; + case rope: return mushroom; + case sandstone: return sand; + case snow: return air; + case cpefire: return fire; + case lightpink: return pink; + case forestgreen: return green; + case brown: return dirt; + case deepblue: return blue; + case turquoise: return cyan; + case ice: return glass; + case ceramic: return iron; + case cpemagma: return obsidian; + case pillar: return white; + case crate: return wood; + case stonebrick: return stone; + default: return b; + } + } + public static byte Convert(byte b) { switch (b) @@ -1705,7 +1821,7 @@ public static byte Convert(byte b) case fishlavashark: return obsidian; default: - if (b < 50) return b; else return 22; + if (b <= 65) return b; else return 22; } } public static byte SaveConvert(byte b) diff --git a/MCSong/ChatBuffer.cs b/MCSong/ChatBuffer.cs new file mode 100644 index 0000000..3d48cfa --- /dev/null +++ b/MCSong/ChatBuffer.cs @@ -0,0 +1,58 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace MCSong +{ + public class ChatBuffer + { + public ChatBuffer() + { + this.buffer = new List(); + this.currentIndex = 0; + } + + private List buffer;// [0:"Oldest", 1:"Older", 2:"Newer", 3:"Newest"] + private int currentIndex; + + public void addEntry(string s) + { + buffer.Add(s); + currentIndex = buffer.Count - 1; + } + + public string up() + { + if (buffer.Count <= 0) { return ""; } + string temp = ""; + if (currentIndex >= 0) + { + temp = buffer.ElementAt(currentIndex); + } + if (currentIndex > 0) + { + currentIndex--; + } + return temp; + } + + public string down() + { + if (currentIndex < (buffer.Count-1)) + { + currentIndex++; + return buffer.ElementAt(currentIndex); + } + return ""; + } + + public void clear() + { + this.buffer.Clear(); + this.currentIndex = 0; + } + } +} diff --git a/MCSong/Commands/CmdAbort.cs b/MCSong/Commands/CmdAbort.cs index 1ca70a9..2036fe3 100644 --- a/MCSong/Commands/CmdAbort.cs +++ b/MCSong/Commands/CmdAbort.cs @@ -19,8 +19,9 @@ namespace MCSong public class CmdAbort : Command { public override string name { get { return "abort"; } } - public override string shortcut { get { return "a"; } } - public override string type { get { return "build"; } } + public override string[] aliases { get { return new string[] { "a" }; } } + public override CommandType type { get { return CommandType.Building; } } + public override bool consoleUsable { get { return false; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.Builder; } } public CmdAbort() { } diff --git a/MCSong/Commands/CmdAbout.cs b/MCSong/Commands/CmdAbout.cs index 937044f..92482d9 100644 --- a/MCSong/Commands/CmdAbout.cs +++ b/MCSong/Commands/CmdAbout.cs @@ -23,8 +23,9 @@ namespace MCSong public class CmdAbout : Command { public override string name { get { return "about"; } } - public override string shortcut { get { return "b"; } } - public override string type { get { return "information"; } } + public override string[] aliases { get { return new string[] { "b" }; } } + public override CommandType type { get { return CommandType.Information; } } + public override bool consoleUsable { get { return false; } } public override bool museumUsable { get { return false; } } public override LevelPermission defaultRank { get { return LevelPermission.Guest; } } public CmdAbout() { } @@ -53,24 +54,14 @@ public void AboutBlockchange(Player p, ushort x, ushort y, ushort z, byte type) message = p.level.foundInfo(x, y, z); if (message != "") Player.SendMessage(p, "Physics information: &a" + message); - DataTable Blocks = MySQL.fillData("SELECT * FROM `Block" + p.level.name + "` WHERE X=" + (int)x + " AND Y=" + (int)y + " AND Z=" + (int)z); - string Username, TimePerformed, BlockUsed; bool Deleted, foundOne = false; - for (int i = 0; i < Blocks.Rows.Count; i++) + SQLiteHelper.SQLResult blockQuery = SQLiteHelper.ExecuteQuery($@"SELECT username,when,x,y,z,type,deleted FROM Blocks{p.level.name} WHERE x = {x} AND y = {y} AND z = {z};"); + for (int i = 0; i < blockQuery.rowsAffected; i++) { foundOne = true; - Username = Blocks.Rows[i]["Username"].ToString(); - TimePerformed = DateTime.Parse(Blocks.Rows[i]["TimePerformed"].ToString()).ToString("yyyy-MM-dd HH:mm:ss"); - BlockUsed = Block.Name((byte)Blocks.Rows[i]["Type"]).ToString(); - Deleted = (bool)Blocks.Rows[i]["Deleted"]; - - if (!Deleted) - Player.SendMessage(p, "&3Created by " + Server.FindColor(Username.Trim()) + Username.Trim() + Server.DefaultColor + ", using &3" + BlockUsed); - else - Player.SendMessage(p, "&4Destroyed by " + Server.FindColor(Username.Trim()) + Username.Trim() + Server.DefaultColor + ", using &3" + BlockUsed); - Player.SendMessage(p, "Date and time modified: &2" + TimePerformed); + Player.SendMessage(p, (blockQuery[i]["deleted"].ToLower() == "true" ? "&3Created by " : "&4Deleted by ") + $"{Server.FindColor(blockQuery[i]["username"])}{blockQuery[i]["username"]}{Server.DefaultColor}, using &3{Block.Name(byte.Parse(blockQuery[i]["type"]))}"); } List inCache = p.level.blockCache.FindAll(bP => bP.x == x && bP.y == y && bP.z == z); @@ -93,7 +84,7 @@ public void AboutBlockchange(Player p, ushort x, ushort y, ushort z, byte type) if (!foundOne) Player.SendMessage(p, "This block has not been modified since the map was cleared."); - Blocks.Dispose(); + //Blocks.Dispose(); GC.Collect(); GC.WaitForPendingFinalizers(); diff --git a/MCSong/Commands/CmdAdminChat.cs b/MCSong/Commands/CmdAdminChat.cs new file mode 100644 index 0000000..ec4d554 --- /dev/null +++ b/MCSong/Commands/CmdAdminChat.cs @@ -0,0 +1,25 @@ +using System; + +namespace MCSong +{ + public class CmdAdminChat : Command + { + public override string name { get { return "adminchat"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Other; } } + public override bool consoleUsable { get { return false; } } + public override bool museumUsable { get { return true; } } + public override LevelPermission defaultRank { get { return LevelPermission.Admin; } } + + public override void Use(Player p, string message) + { + p.adminchat = !p.adminchat; + if (p.adminchat) Player.SendMessage(p, "All messages will now be sent to Admins only"); + else Player.SendMessage(p, "Admin chat turned off"); + } + public override void Help(Player p) + { + Player.SendMessage(p, "/adminchat - Makes all messages sent go to Admins by default"); + } + } +} \ No newline at end of file diff --git a/MCSong/Commands/CmdAfk.cs b/MCSong/Commands/CmdAfk.cs index b46deff..796293e 100644 --- a/MCSong/Commands/CmdAfk.cs +++ b/MCSong/Commands/CmdAfk.cs @@ -21,8 +21,9 @@ namespace MCSong class CmdAfk : Command { public override string name { get { return "afk"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "information"; } } + public override string[] aliases { get { return new string[] { }; } } + public override CommandType type { get { return CommandType.Information; } } + public override bool consoleUsable { get { return false; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.Guest; } } public CmdAfk() { } @@ -43,7 +44,7 @@ public override void Use(Player p, string message) message = ""; } Player.GlobalMessage("-" + p.color + p.name + Server.DefaultColor + "- is AFK " + message); - IRCBot.Say(p.name + " is AFK " + message); + //IRCBot.Say(p.name + " is AFK " + message); return; } @@ -51,7 +52,7 @@ public override void Use(Player p, string message) { Server.afkset.Remove(p.name); Player.GlobalMessage("-" + p.color + p.name + Server.DefaultColor + "- is no longer AFK"); - IRCBot.Say(p.name + " is no longer AFK"); + //IRCBot.Say(p.name + " is no longer AFK"); return; } } diff --git a/MCSong/Commands/CmdAgree.cs b/MCSong/Commands/CmdAgree.cs new file mode 100644 index 0000000..fb76cf4 --- /dev/null +++ b/MCSong/Commands/CmdAgree.cs @@ -0,0 +1,33 @@ +using System; + +namespace MCSong +{ + class CmdAgree : Command + { + public override string name { get { return "agree"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Other; } } + public override bool consoleUsable { get { return false; } } + public override bool museumUsable { get { return true; } } + public override LevelPermission defaultRank { get { return LevelPermission.Banned; } } + public override void Use(Player p, string message) + { + switch (p.agreestring) + { + case "gcrules": + Server.gcAgreed.Add(p.name); + Player.SendMessage(p, "You agreed to the Global Chat rules."); + Server.s.Log(p.name + " agreed to the Global Chat rules."); + break; + default: + Player.SendMessage(p, "You have nothing to agree to at this time."); + break; + } + p.agreestring = ""; + } + public override void Help(Player p) + { + Player.SendMessage(p, "/agree - Agree to a set of rules"); + } + } +} diff --git a/MCSong/Commands/CmdAliases.cs b/MCSong/Commands/CmdAliases.cs new file mode 100644 index 0000000..f825a51 --- /dev/null +++ b/MCSong/Commands/CmdAliases.cs @@ -0,0 +1,120 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MCSong +{ + public class CmdAliases : Command + { + public override string name { get { return "aliases"; } } + public override string[] aliases { get { return new string[] { "shortcuts", "shortcut", "alias", "short" }; } } + public override CommandType type { get { return CommandType.Information; } } + public override bool consoleUsable { get { return true; } } + public override bool museumUsable { get { return true; } } + public override LevelPermission defaultRank { get { return LevelPermission.Banned; } } + + public override void Use(Player p, string message) + { + if (String.IsNullOrWhiteSpace(message)) + { + Help(p); + return; + } + switch (message.ToLower()) + { + case "build": + Player.SendMessage(p, "Building command aliases:"); + foreach (Command c in Command.all.commands) + { + if (c.type == CommandType.Building && c.aliases.Length > 0 && !String.IsNullOrWhiteSpace(c.aliases[0])) + { + string al = ""; + foreach (string a in c.aliases) + { + al += ", " + a; + } + Player.SendMessage(p, "/" + c.name + " - " + al.Remove(0, 2)); + } + } + break; + case "info": + Player.SendMessage(p, "Information command aliases:"); + foreach (Command c in Command.all.commands) + { + if (c.type == CommandType.Information && c.aliases.Length > 0 && !String.IsNullOrWhiteSpace(c.aliases[0])) + { + string al = ""; + foreach (string a in c.aliases) + { + al += ", " + a; + } + Player.SendMessage(p, "/" + c.name + " - " + al.Remove(0, 2)); + } + } + break; + case "mod": + Player.SendMessage(p, "Moderation command aliases:"); + foreach (Command c in Command.all.commands) + { + if (c.type == CommandType.Moderation && c.aliases.Length > 0 && !String.IsNullOrWhiteSpace(c.aliases[0])) + { + string al = ""; + foreach (string a in c.aliases) + { + al += ", " + a; + } + Player.SendMessage(p, "/" + c.name + " - " + al.Remove(0, 2)); + } + } + break; + case "other": + Player.SendMessage(p, "Other command aliases:"); + foreach (Command c in Command.all.commands) + { + if (c.type == CommandType.Other && c.aliases.Length > 0 && !String.IsNullOrWhiteSpace(c.aliases[0])) + { + string al = ""; + foreach (string a in c.aliases) + { + al += ", " + a; + } + Player.SendMessage(p, "/" + c.name + " - " + al.Remove(0, 2)); + } + } + break; + default: + Command cmd = Command.all.Find(message.ToLower()); + if (cmd == null) + { + Player.SendMessage(p, "Command not found!"); + } + else + { + if (cmd.aliases.Length > 0 && !String.IsNullOrWhiteSpace(cmd.aliases[0])) + { + string al = ""; + foreach (string a in cmd.aliases) + { + al += ", " + a; + } + Player.SendMessage(p, "Aliases for /" + cmd.name + " - " + al.Remove(0, 2)); + } + else + { + Player.SendMessage(p, "No aliases found for /" + cmd.name); + } + } + break; + } + } + + public override void Help(Player p) + { + Player.SendMessage(p, "/aliases [build/info/mod/other] - Displays aliases for commands of a certain type"); + Player.SendMessage(p, "/aliases [command] - Displays aliases for a specific command"); + } + + } +} diff --git a/MCSong/Commands/CmdAward.cs b/MCSong/Commands/CmdAward.cs index 268aed2..3db4d27 100644 --- a/MCSong/Commands/CmdAward.cs +++ b/MCSong/Commands/CmdAward.cs @@ -20,8 +20,9 @@ namespace MCSong public class CmdAward : Command { public override string name { get { return "award"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "other"; } } + public override string[] aliases { get { return new string[] { }; } } + public override CommandType type { get { return CommandType.Other; } } + public override bool consoleUsable { get { return true; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.Operator; } } public CmdAward() { } diff --git a/MCSong/Commands/CmdAwardMod.cs b/MCSong/Commands/CmdAwardMod.cs index b33d1b4..8e92df4 100644 --- a/MCSong/Commands/CmdAwardMod.cs +++ b/MCSong/Commands/CmdAwardMod.cs @@ -20,8 +20,9 @@ namespace MCSong public class CmdAwardMod : Command { public override string name { get { return "awardmod"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "other"; } } + public override string[] aliases { get { return new string[] { }; } } + public override CommandType type { get { return CommandType.Other; } } + public override bool consoleUsable { get { return true; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.Admin; } } public CmdAwardMod() { } diff --git a/MCSong/Commands/CmdAwards.cs b/MCSong/Commands/CmdAwards.cs index 4571080..5757bd2 100644 --- a/MCSong/Commands/CmdAwards.cs +++ b/MCSong/Commands/CmdAwards.cs @@ -20,8 +20,9 @@ namespace MCSong public class CmdAwards : Command { public override string name { get { return "awards"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "other"; } } + public override string[] aliases { get { return new string[] { }; } } + public override CommandType type { get { return CommandType.Other; } } + public override bool consoleUsable { get { return true; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.Banned; } } diff --git a/MCSong/Commands/CmdBan.cs b/MCSong/Commands/CmdBan.cs index f12018f..e3f73b8 100644 --- a/MCSong/Commands/CmdBan.cs +++ b/MCSong/Commands/CmdBan.cs @@ -19,8 +19,9 @@ namespace MCSong public class CmdBan : Command { public override string name { get { return "ban"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "mod"; } } + public override string[] aliases { get { return new string[] { }; } } + public override CommandType type { get { return CommandType.Moderation; } } + public override bool consoleUsable { get { return true; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.Operator; } } public CmdBan() { } @@ -106,7 +107,7 @@ public override void Use(Player p, string message) } Group.findPerm(LevelPermission.Banned).playerList.Save(); - IRCBot.Say(message + " was banned."); + //IRCBot.Say(message + " was banned."); Server.s.Log("BANNED: " + message.ToLower()); if (totalBan == true) diff --git a/MCSong/Commands/CmdBanip.cs b/MCSong/Commands/CmdBanip.cs index a1c7419..d73e01c 100644 --- a/MCSong/Commands/CmdBanip.cs +++ b/MCSong/Commands/CmdBanip.cs @@ -15,16 +15,15 @@ permissions and limitations under the License. using System; using System.IO; using System.Data; -//using MySql.Data.MySqlClient; -//using MySql.Data.Types; namespace MCSong { public class CmdBanip : Command { public override string name { get { return "banip"; } } - public override string shortcut { get { return "bi"; } } - public override string type { get { return "mod"; } } + public override string[] aliases { get { return new string[] { "bi" }; } } + public override CommandType type { get { return CommandType.Moderation; } } + public override bool consoleUsable { get { return true; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.Operator; } } public CmdBanip() { } @@ -38,31 +37,20 @@ public override void Use(Player p, string message) Player who = Player.Find(message); if (who == null) { - DataTable ip; - int tryCounter = 0; - rerun: try + try { - ip = MySQL.fillData("SELECT IP FROM Players WHERE Name = '" + message + "'"); + message = SQLiteHelper.ExecuteQuery($@"SELECT ip FROM Players WHERE name = '{message}' LIMIT 1;")[0]["ip"]; } - catch (Exception e) + catch { - tryCounter++; - if (tryCounter < 10) - goto rerun; - else - { - Server.ErrorLog(e); - return; - } + Player.SendMessage(p, "Unable to find an IP address for that user."); + return; } - if (ip.Rows.Count > 0) - message = ip.Rows[0]["IP"].ToString(); - else + if (string.IsNullOrEmpty(message)) { Player.SendMessage(p, "Unable to find an IP address for that user."); return; } - ip.Dispose(); } else { @@ -79,28 +67,28 @@ public override void Use(Player p, string message) if (message.Equals("127.0.0.1")) { Player.SendMessage(p, "You can't ip-ban the server!"); return; } if (message.IndexOf('.') == -1) { Player.SendMessage(p, "Invalid IP!"); return; } if (message.Split('.').Length != 4) { Player.SendMessage(p, "Invalid IP!"); return; } - if (p != null) { if (p.ip == message) { Player.SendMessage(p, "You can't ip-ban yourself.!"); return; } } + if (p != null) { if (p.ip == message) { Player.SendMessage(p, "You can't ip-ban yourself!"); return; } } if (Server.bannedIP.Contains(message)) { Player.SendMessage(p, message + " is already ip-banned."); return; } Player.GlobalMessage(message + " got &8ip-banned!"); if (p != null) { - IRCBot.Say("IP-BANNED: " + message.ToLower() + " by " + p.name); + //IRCBot.Say("IP-BANNED: " + message.ToLower() + " by " + p.name); } else { - IRCBot.Say("IP-BANNED: " + message.ToLower() + " by console"); + //IRCBot.Say("IP-BANNED: " + message.ToLower() + " by console"); } Server.bannedIP.Add(message); Server.bannedIP.Save("banned-ip.txt", false); Server.s.Log("IP-BANNED: " + message.ToLower()); - /* + foreach (Player pl in Player.players) { if (message == pl.ip) { pl.Kick("Kicked by ipban"); } - }*/ + } } public override void Help(Player p) { - Player.SendMessage(p, "/banip - Bans an ip. Also accepts a player name when you use @ before the name."); + Player.SendMessage(p, "/banip - Bans an ip. Also accepts a player name when you use @ before the name."); } } } \ No newline at end of file diff --git a/MCSong/Commands/CmdBind.cs b/MCSong/Commands/CmdBind.cs index 8ef2283..6386534 100644 --- a/MCSong/Commands/CmdBind.cs +++ b/MCSong/Commands/CmdBind.cs @@ -19,8 +19,9 @@ namespace MCSong public class CmdBind : Command { public override string name { get { return "bind"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "build"; } } + public override string[] aliases { get { return new string[] { }; } } + public override CommandType type { get { return CommandType.Building; } } + public override bool consoleUsable { get { return false; } } public override bool museumUsable { get { return false; } } public override LevelPermission defaultRank { get { return LevelPermission.AdvBuilder; } } public CmdBind() { } diff --git a/MCSong/Commands/CmdBlockSet.cs b/MCSong/Commands/CmdBlockSet.cs index 382ab58..b320159 100644 --- a/MCSong/Commands/CmdBlockSet.cs +++ b/MCSong/Commands/CmdBlockSet.cs @@ -19,8 +19,9 @@ namespace MCSong public class CmdBlockSet : Command { public override string name { get { return "blockset"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "mod"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Moderation; } } + public override bool consoleUsable { get { return true; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.Operator; } } public CmdBlockSet() { } diff --git a/MCSong/Commands/CmdBlocks.cs b/MCSong/Commands/CmdBlocks.cs index 44249fe..ecc0022 100644 --- a/MCSong/Commands/CmdBlocks.cs +++ b/MCSong/Commands/CmdBlocks.cs @@ -19,8 +19,9 @@ namespace MCSong public class CmdBlocks : Command { public override string name { get { return "blocks"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "information"; } } + public override string[] aliases { get { return new string[] { "bl", "materials" }; } } + public override CommandType type { get { return CommandType.Information; } } + public override bool consoleUsable { get { return true; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.Guest; } } public CmdBlocks() { } diff --git a/MCSong/Commands/CmdBotAI.cs b/MCSong/Commands/CmdBotAI.cs index 0fa4480..56b6d53 100644 --- a/MCSong/Commands/CmdBotAI.cs +++ b/MCSong/Commands/CmdBotAI.cs @@ -6,8 +6,9 @@ namespace MCSong public class CmdBotAI : Command { public override string name { get { return "botai"; } } - public override string shortcut { get { return "bai"; } } - public override string type { get { return "other"; } } + public override string[] aliases { get { return new string[] { "bai" }; } } + public override CommandType type { get { return CommandType.Other; } } + public override bool consoleUsable { get { return false; } } public override bool museumUsable { get { return false; } } public override LevelPermission defaultRank { get { return LevelPermission.AdvBuilder; } } public CmdBotAI() { } diff --git a/MCSong/Commands/CmdBotAdd.cs b/MCSong/Commands/CmdBotAdd.cs index e644928..1eb3f45 100644 --- a/MCSong/Commands/CmdBotAdd.cs +++ b/MCSong/Commands/CmdBotAdd.cs @@ -20,8 +20,9 @@ namespace MCSong public class CmdBotAdd : Command { public override string name { get { return "botadd"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "mod"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Moderation; } } + public override bool consoleUsable { get { return false; } } public override bool museumUsable { get { return false; } } public override LevelPermission defaultRank { get { return LevelPermission.Admin; } } public CmdBotAdd() { } diff --git a/MCSong/Commands/CmdBotRemove.cs b/MCSong/Commands/CmdBotRemove.cs index f937208..5cc99ce 100644 --- a/MCSong/Commands/CmdBotRemove.cs +++ b/MCSong/Commands/CmdBotRemove.cs @@ -20,8 +20,9 @@ namespace MCSong public class CmdBotRemove : Command { public override string name { get { return "botremove"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "mod"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Moderation; } } + public override bool consoleUsable { get { return false; } } public override bool museumUsable { get { return false; } } public override LevelPermission defaultRank { get { return LevelPermission.Admin; } } public string[,] botlist; diff --git a/MCSong/Commands/CmdBotSet.cs b/MCSong/Commands/CmdBotSet.cs index c623e56..138507c 100644 --- a/MCSong/Commands/CmdBotSet.cs +++ b/MCSong/Commands/CmdBotSet.cs @@ -6,8 +6,9 @@ namespace MCSong public class CmdBotSet : Command { public override string name { get { return "botset"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "other"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Other; } } + public override bool consoleUsable { get { return true; } } public override bool museumUsable { get { return false; } } public override LevelPermission defaultRank { get { return LevelPermission.AdvBuilder; } } public CmdBotSet() { } diff --git a/MCSong/Commands/CmdBotSummon.cs b/MCSong/Commands/CmdBotSummon.cs index b225be9..49a9a8c 100644 --- a/MCSong/Commands/CmdBotSummon.cs +++ b/MCSong/Commands/CmdBotSummon.cs @@ -20,8 +20,9 @@ namespace MCSong public class CmdBotSummon : Command { public override string name { get { return "botsummon"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "mod"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Moderation; } } + public override bool consoleUsable { get { return false; } } public override bool museumUsable { get { return false; } } public override LevelPermission defaultRank { get { return LevelPermission.Admin; } } public CmdBotSummon() { } diff --git a/MCSong/Commands/CmdBots.cs b/MCSong/Commands/CmdBots.cs index 95ce672..56c9a7d 100644 --- a/MCSong/Commands/CmdBots.cs +++ b/MCSong/Commands/CmdBots.cs @@ -6,8 +6,9 @@ namespace MCSong public class CmdBots : Command { public override string name { get { return "bots"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "other"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Other; } } + public override bool consoleUsable { get { return true; } } public override bool museumUsable { get { return false; } } public override LevelPermission defaultRank { get { return LevelPermission.Builder; } } public CmdBots() { } diff --git a/MCSong/Commands/CmdClearBlockChanges.cs b/MCSong/Commands/CmdClearBlockChanges.cs index e7b7991..1434b3e 100644 --- a/MCSong/Commands/CmdClearBlockChanges.cs +++ b/MCSong/Commands/CmdClearBlockChanges.cs @@ -8,8 +8,9 @@ namespace MCSong public class CmdClearBlockChanges : Command { public override string name { get { return "clearblockchanges"; } } - public override string shortcut { get { return "cbc"; } } - public override string type { get { return "mod"; } } + public override string[] aliases { get { return new string[] { "cbc" }; } } + public override CommandType type { get { return CommandType.Moderation; } } + public override bool consoleUsable { get { return true; } } public override bool museumUsable { get { return false; } } public override LevelPermission defaultRank { get { return LevelPermission.Admin; } } public CmdClearBlockChanges() { } @@ -18,9 +19,11 @@ public override void Use(Player p, string message) { Level l = Level.Find(message); if (l == null && message != "") { Player.SendMessage(p, "Could not find level."); return; } - if (l == null) l = p.level; + if (l == null && p != null) l = p.level; + if (l == null && p == null) { Player.SendMessage(p, "Could not find level."); return; } - MySQL.executeQuery("TRUNCATE TABLE `Block" + l.name + "`"); + int rowsAffected = SQLiteHelper.ExecuteQuery($@"DELETE FROM Blocks{l.name}").rowsAffected; + Server.s.Debug($"Deleted {rowsAffected} rows from Blocks{l.name}"); Player.SendMessage(p, "Cleared &cALL" + Server.DefaultColor + " recorded block changes in: &d" + l.name); } public override void Help(Player p) diff --git a/MCSong/Commands/CmdClearchat.cs b/MCSong/Commands/CmdClearchat.cs index 83e8b34..277b797 100644 --- a/MCSong/Commands/CmdClearchat.cs +++ b/MCSong/Commands/CmdClearchat.cs @@ -5,8 +5,9 @@ namespace MCSong class CmdClearchat : Command { public override string name { get { return "clearchat"; } } - public override string shortcut { get { return "cc"; } } - public override string type { get { return "other"; } } + public override string[] aliases { get { return new string[] { "cc" }; } } + public override CommandType type { get { return CommandType.Other; } } + public override bool consoleUsable { get { return true; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.Banned; } } public CmdClearchat() { } @@ -20,7 +21,11 @@ public override void Use(Player p, string message) case "player": if (p == null) { - if (!Server.console) MCSong.Gui.Window.thisWindow.txtLog.Clear(); + if (!Server.console) + { + MCSong.Gui.Window.thisWindow.txtLog.Clear(); + MCSong.Gui.Window.clearChatBuffer(); + } else Console.Clear(); } else @@ -38,7 +43,11 @@ public override void Use(Player p, string message) Clear(pl); if (p == null) { - if (!Server.console) MCSong.Gui.Window.thisWindow.txtLog.Clear(); + if (!Server.console) + { + MCSong.Gui.Window.thisWindow.txtLog.Clear(); + MCSong.Gui.Window.clearChatBuffer(); + } else Console.Clear(); } Server.s.Log("Server chat has been cleared by " + ((p == null) ? "Console" : p.color + p.name)); diff --git a/MCSong/Commands/CmdClick.cs b/MCSong/Commands/CmdClick.cs index d6ffb23..fbcd4a0 100644 --- a/MCSong/Commands/CmdClick.cs +++ b/MCSong/Commands/CmdClick.cs @@ -19,8 +19,9 @@ namespace MCSong public class CmdClick : Command { public override string name { get { return "click"; } } - public override string shortcut { get { return "x"; } } - public override string type { get { return "build"; } } + public override string[] aliases { get { return new string[] { "x" }; } } + public override CommandType type { get { return CommandType.Building; } } + public override bool consoleUsable { get { return false; } } public override bool museumUsable { get { return false; } } public override LevelPermission defaultRank { get { return LevelPermission.Guest; } } public CmdClick() { } diff --git a/MCSong/Commands/CmdClickdistance.cs b/MCSong/Commands/CmdClickdistance.cs new file mode 100644 index 0000000..a0fe05f --- /dev/null +++ b/MCSong/Commands/CmdClickdistance.cs @@ -0,0 +1,44 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MCSong +{ + class CmdClickdistance : Command + { + public override string name { get { return "clickdistance"; } } + public override string[] aliases { get { return new string[] { }; } } + public override CommandType type { get { return CommandType.Moderation; } } + public override bool consoleUsable { get { return true; } } + public override bool museumUsable { get { return true; } } + public override LevelPermission defaultRank { get { return LevelPermission.Operator; } } + + public override void Use(Player p, string message) + { + string[] args = message.Split(' '); + if (args.Length != 2) { Help(p); return; } + Player who = Player.Find(args[0]); + if (who == null) { who = p; args[1] = args[0]; } + if (!who.extensions.Contains(Extension.ClickDistance)) { Player.SendMessage(p, ((who == p) ? "Your" : who.color + who.name + Server.DefaultColor + "'s") + " client does not support click distance. See &2/cpe " + Server.DefaultColor + "for more information."); return; } + double d; + try { d = Double.Parse(args[1]); } + catch { Player.SendMessage(p, "Click distance is invalid."); return; } + short c = ((short)(d * 32)); + who.SendClickDistance(c); + if (who == p) + { + Player.SendMessage(p, "Your click distance was set to " + d + " blocks."); + return; + } + Player.SendMessage(p, who.color + who.name + Server.DefaultColor + "'s click distance was set to " + d + " blocks."); + Player.SendMessage(who, p.color + p.name + Server.DefaultColor + " set your click distance to " + d + " blocks."); + } + + public override void Help(Player p) + { + Player.SendMessage(p, "/clickdistance [player] - Sets a player's click distance"); + } + } +} diff --git a/MCSong/Commands/CmdClones.cs b/MCSong/Commands/CmdClones.cs index 0ff3765..ca53ff1 100644 --- a/MCSong/Commands/CmdClones.cs +++ b/MCSong/Commands/CmdClones.cs @@ -1,8 +1,6 @@ using System; using System.Collections.Generic; using System.Text; -//using MySql.Data.MySqlClient; -//using MySql.Data.Types; using System.Data; namespace MCSong @@ -11,56 +9,62 @@ class CmdClones : Command { public override string name { get { return "clones"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "information"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Information; } } + public override bool consoleUsable { get { return true; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.AdvBuilder; } } public CmdClones() { } public override void Use(Player p, string message) { - if (message == "") message = p.name; + if (message == "") + { + if (p == null) + { + Help(p); + return; + } + message = p.name; + } string originalName = message.ToLower(); Player who = Player.Find(message); if (who == null) { - Player.SendMessage(p, "Could not find player. Searching Player DB."); - - DataTable FindIP = MySQL.fillData("SELECT IP FROM Players WHERE Name='" + message + "'"); + Player.SendMessage(p, "Could not find player. Searching database."); - if (FindIP.Rows.Count == 0) { Player.SendMessage(p, "Could not find any player by the name entered."); FindIP.Dispose(); return; } - - message = FindIP.Rows[0]["IP"].ToString(); - FindIP.Dispose(); + SQLiteHelper.SQLResult ipQuery = SQLiteHelper.ExecuteQuery($@"SELECT ip FROM Players WHERE name = '{message}';"); + if (ipQuery.rowsAffected <= 0) + { + Player.SendMessage(p, "Could not find any player by the name entered."); + return; + } + else + message = ipQuery[0]["ip"]; } else { message = who.ip; } - DataTable Clones = MySQL.fillData("SELECT Name FROM Players WHERE IP='" + message + "'"); - - if (Clones.Rows.Count == 0) { Player.SendMessage(p, "Could not find any record of the player entered."); return; } - - List foundPeople = new List(); - for (int i = 0; i < Clones.Rows.Count; ++i) + SQLiteHelper.SQLResult nameQuery = SQLiteHelper.ExecuteQuery($@"SELECT name FROM Players WHERE ip = '{message}';"); + List foundNames = new List(); + for (int i = 0; i < nameQuery.rowsAffected; i++) + foundNames.Add(nameQuery[i]["name"]); + if (foundNames.Count <= 1) + Player.SendMessage(p, $"{originalName} has no clones."); + else { - if (!foundPeople.Contains(Clones.Rows[i]["Name"].ToString().ToLower())) - foundPeople.Add(Clones.Rows[i]["Name"].ToString().ToLower()); + Player.SendMessage(p, "These people have the same IP address:"); + Player.SendMessage(p, string.Join(", ", foundNames.ToArray())); } - - Clones.Dispose(); - if (foundPeople.Count <= 1) { Player.SendMessage(p, originalName + " has no clones."); return; } - - Player.SendMessage(p, "These people have the same IP address:"); - Player.SendMessage(p, string.Join(", ", foundPeople.ToArray())); } public override void Help(Player p) { - Player.SendMessage(p, "/clones - Finds everyone with the same IP has "); + Player.SendMessage(p, "/clones - Finds everyone with the same IP as "); } } } diff --git a/MCSong/Commands/CmdCmdBind.cs b/MCSong/Commands/CmdCmdBind.cs index 20fc483..5cda720 100644 --- a/MCSong/Commands/CmdCmdBind.cs +++ b/MCSong/Commands/CmdCmdBind.cs @@ -5,8 +5,9 @@ namespace MCSong public class CmdCmdBind : Command { public override string name { get { return "cmdbind"; } } - public override string shortcut { get { return "cb"; } } - public override string type { get { return "build"; } } + public override string[] aliases { get { return new string[] { "cb" }; } } + public override CommandType type { get { return CommandType.Building; } } + public override bool consoleUsable { get { return false; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.Builder; } } public CmdCmdBind() { } diff --git a/MCSong/Commands/CmdCmdCreate.cs b/MCSong/Commands/CmdCmdCreate.cs index a3724c1..71eebc6 100644 --- a/MCSong/Commands/CmdCmdCreate.cs +++ b/MCSong/Commands/CmdCmdCreate.cs @@ -22,8 +22,9 @@ namespace MCSong public class CmdCmdCreate : Command { public override string name { get { return "cmdcreate"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "other"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Other; } } + public override bool consoleUsable { get { return true; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.Admin; } } public CmdCmdCreate() { } diff --git a/MCSong/Commands/CmdCmdLoad.cs b/MCSong/Commands/CmdCmdLoad.cs index d59c874..7036412 100644 --- a/MCSong/Commands/CmdCmdLoad.cs +++ b/MCSong/Commands/CmdCmdLoad.cs @@ -24,8 +24,9 @@ namespace MCSong class CmdCmdLoad : Command { public override string name { get { return "cmdload"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "other"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Other; } } + public override bool consoleUsable { get { return true; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.Nobody; } } public CmdCmdLoad() { } diff --git a/MCSong/Commands/CmdCmdSet.cs b/MCSong/Commands/CmdCmdSet.cs index d838822..27d0509 100644 --- a/MCSong/Commands/CmdCmdSet.cs +++ b/MCSong/Commands/CmdCmdSet.cs @@ -19,8 +19,9 @@ namespace MCSong public class CmdCmdSet : Command { public override string name { get { return "cmdset"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "mod"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Moderation; } } + public override bool consoleUsable { get { return true; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.Admin; } } public CmdCmdSet() { } diff --git a/MCSong/Commands/CmdCmdUnload.cs b/MCSong/Commands/CmdCmdUnload.cs index 1786480..6bdd00e 100644 --- a/MCSong/Commands/CmdCmdUnload.cs +++ b/MCSong/Commands/CmdCmdUnload.cs @@ -23,8 +23,9 @@ namespace MCSong class CmdCmdUnload : Command { public override string name { get { return "cmdunload"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "other"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Other; } } + public override bool consoleUsable { get { return true; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.Nobody; } } public CmdCmdUnload() { } diff --git a/MCSong/Commands/CmdColor.cs b/MCSong/Commands/CmdColor.cs index 2d68d37..862be3c 100644 --- a/MCSong/Commands/CmdColor.cs +++ b/MCSong/Commands/CmdColor.cs @@ -13,16 +13,15 @@ software distributed under the License is distributed on an "AS IS" permissions and limitations under the License. */ using System; -//using MySql.Data.MySqlClient; -//using MySql.Data.Types; namespace MCSong { public class CmdColor : Command { public override string name { get { return "color"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "other"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Other; } } + public override bool consoleUsable { get { return true; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.Operator; } } public CmdColor() { } @@ -37,10 +36,10 @@ public override void Use(Player p, string message) if (who == null) { Player.SendMessage(p, "There is no player \"" + message.Substring(0, pos) + "\"!"); return; } if (message.Substring(pos + 1) == "del") { - MySQL.executeQuery("UPDATE Players SET color = '' WHERE name = '" + who.name + "'"); Player.GlobalChat(who, who.color + "*" + Name(who.name) + " color reverted to " + who.group.color + "their group's default" + Server.DefaultColor + ".", false); - who.color = who.group.color; + SQLiteHelper.ExecuteQuery($@"UPDATE Players SET color = NULL WHERE name = '{who.name}'"); + who.color = who.group.color; Player.GlobalDie(who, false); Player.GlobalSpawn(who, who.pos[0], who.pos[1], who.pos[2], who.rot[0], who.rot[1], false); who.SetPrefix(); @@ -54,11 +53,10 @@ public override void Use(Player p, string message) //Player.GlobalChat(who, p.color + "*" + p.name + "&e changed " + who.color + Name(who.name) + // " color to " + color + // c.Name(color) + "&e.", false); - MySQL.executeQuery("UPDATE Players SET color = '" + c.Name(color) + "' WHERE name = '" + who.name + "'"); - Player.GlobalChat(who, who.color + "*" + Name(who.name) + " color changed to " + color + c.Name(color) + Server.DefaultColor + ".", false); who.color = color; + SQLiteHelper.ExecuteQuery($@"UPDATE Players SET color = '{color}' WHERE name = '{who.name}'"); Player.GlobalDie(who, false); Player.GlobalSpawn(who, who.pos[0], who.pos[1], who.pos[2], who.rot[0], who.rot[1], false); who.SetPrefix(); @@ -66,13 +64,14 @@ public override void Use(Player p, string message) } else { + if (p == null) { Help(p); return; } if (message == "del") { - MySQL.executeQuery("UPDATE Players SET color = '' WHERE name = '" + p.name + "'"); - Player.GlobalChat(p, p.color + "*" + Name(p.name) + " color reverted to " + p.group.color + "their group's default" + Server.DefaultColor + ".", false); - p.color = p.group.color; + //p.color = "group"; + SQLiteHelper.ExecuteQuery($@"UPDATE Players SET color = NULL WHERE name = '{p.name}'"); + p.color = p.group.color; Player.GlobalDie(p, false); Player.GlobalSpawn(p, p.pos[0], p.pos[1], p.pos[2], p.rot[0], p.rot[1], false); p.SetPrefix(); @@ -83,11 +82,10 @@ public override void Use(Player p, string message) else if (color == p.color) { Player.SendMessage(p, "You already have that color."); } else { - MySQL.executeQuery("UPDATE Players SET color = '" + c.Name(color) + "' WHERE name = '" + p.name + "'"); - Player.GlobalChat(p, p.color + "*" + Name(p.name) + " color changed to " + color + c.Name(color) + Server.DefaultColor + ".", false); p.color = color; + SQLiteHelper.ExecuteQuery($@"UPDATE Players SET color = '{color}' WHERE name = '{p.name}'"); Player.GlobalDie(p, false); Player.GlobalSpawn(p, p.pos[0], p.pos[1], p.pos[2], p.rot[0], p.rot[1], false); p.SetPrefix(); diff --git a/MCSong/Commands/CmdCompile.cs b/MCSong/Commands/CmdCompile.cs index 48b86ec..e1072d8 100644 --- a/MCSong/Commands/CmdCompile.cs +++ b/MCSong/Commands/CmdCompile.cs @@ -22,8 +22,9 @@ namespace MCSong public class CmdCompile : Command { public override string name { get { return "compile"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "other"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Other; } } + public override bool consoleUsable { get { return true; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.Admin; } } public CmdCompile() { } diff --git a/MCSong/Commands/CmdCopy.cs b/MCSong/Commands/CmdCopy.cs index cdfe7b4..192fd34 100644 --- a/MCSong/Commands/CmdCopy.cs +++ b/MCSong/Commands/CmdCopy.cs @@ -7,8 +7,9 @@ namespace MCSong public class CmdCopy : Command { public override string name { get { return "copy"; } } - public override string shortcut { get { return "c"; } } - public override string type { get { return "build"; } } + public override string[] aliases { get { return new string[] { "c" }; } } + public override CommandType type { get { return CommandType.Building; } } + public override bool consoleUsable { get { return false; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.AdvBuilder; } } public int allowoffset = 0; diff --git a/MCSong/Commands/CmdCrashServer.cs b/MCSong/Commands/CmdCrashServer.cs index 89c3a51..9a63c69 100644 --- a/MCSong/Commands/CmdCrashServer.cs +++ b/MCSong/Commands/CmdCrashServer.cs @@ -8,8 +8,9 @@ namespace MCSong public class CmdCrashServer : Command { public override string name { get { return "crashserver"; } } - public override string shortcut { get { return "crash"; } } - public override string type { get { return "mod"; } } + public override string[] aliases { get { return new string[] { "crash" }; } } + public override CommandType type { get { return CommandType.Moderation; } } + public override bool consoleUsable { get { return false; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.Banned; } } public CmdCrashServer() { } diff --git a/MCSong/Commands/CmdCtf.cs b/MCSong/Commands/CmdCtf.cs index ad59ce4..a617da2 100644 --- a/MCSong/Commands/CmdCtf.cs +++ b/MCSong/Commands/CmdCtf.cs @@ -8,8 +8,9 @@ namespace MCSong public class CmdCTF : Command { public override string name { get { return "ctf"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "other"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Other; } } + public override bool consoleUsable { get { return false; } } public override bool museumUsable { get { return false; } } public CmdCTF() { } public override LevelPermission defaultRank { get { return LevelPermission.Admin; } } diff --git a/MCSong/Commands/CmdCuboid.cs b/MCSong/Commands/CmdCuboid.cs index d8c59e0..42bf2d2 100644 --- a/MCSong/Commands/CmdCuboid.cs +++ b/MCSong/Commands/CmdCuboid.cs @@ -20,8 +20,9 @@ namespace MCSong public class CmdCuboid : Command { public override string name { get { return "cuboid"; } } - public override string shortcut { get { return "z"; } } - public override string type { get { return "build"; } } + public override string[] aliases { get { return new string[] { "z", "blb", "box" }; } } + public override CommandType type { get { return CommandType.Building; } } + public override bool consoleUsable { get { return false; } } public override bool museumUsable { get { return false; } } public override LevelPermission defaultRank { get { return LevelPermission.Builder; } } public CmdCuboid() { } diff --git a/MCSong/Commands/CmdDelete.cs b/MCSong/Commands/CmdDelete.cs index de47a9c..f485f09 100644 --- a/MCSong/Commands/CmdDelete.cs +++ b/MCSong/Commands/CmdDelete.cs @@ -6,8 +6,9 @@ namespace MCSong public class CmdDelete : Command { public override string name { get { return "delete"; } } - public override string shortcut { get { return "d"; } } - public override string type { get { return "build"; } } + public override string[] aliases { get { return new string[] { "d" }; } } + public override CommandType type { get { return CommandType.Building; } } + public override bool consoleUsable { get { return false; } } public override bool museumUsable { get { return false; } } public override LevelPermission defaultRank { get { return LevelPermission.AdvBuilder; } } public CmdDelete() { } diff --git a/MCSong/Commands/CmdDeleteLvl.cs b/MCSong/Commands/CmdDeleteLvl.cs index c52f9c1..eefad86 100644 --- a/MCSong/Commands/CmdDeleteLvl.cs +++ b/MCSong/Commands/CmdDeleteLvl.cs @@ -2,16 +2,15 @@ using System.IO; using System.Data; using System.Collections.Generic; -//using MySql.Data.MySqlClient; -//using MySql.Data.Types; namespace MCSong { public class CmdDeleteLvl : Command { public override string name { get { return "deletelvl"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "mod"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Moderation; } } + public override bool consoleUsable { get { return true; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.Admin; } } public CmdDeleteLvl() { } @@ -48,7 +47,10 @@ public override void Use(Player p, string message) try { File.Delete("levels/level properties/" + message); } catch { } - MySQL.executeQuery("DROP TABLE `Block" + message + "`, `Portals" + message + "`, `Messages" + message + "`, `Zone" + message + "`"); + SQLiteHelper.ExecuteQuery($@"DROP TABLE IF EXISTS Blocks{message}"); + SQLiteHelper.ExecuteQuery($@"DROP TABLE IF EXISTS Portals{message}"); + SQLiteHelper.ExecuteQuery($@"DROP TABLE IF EXISTS Messages{message}"); + SQLiteHelper.ExecuteQuery($@"DROP TABLE IF EXISTS Zones{message}"); Player.GlobalMessage("Level " + message + " was deleted."); } diff --git a/MCSong/Commands/CmdDemote.cs b/MCSong/Commands/CmdDemote.cs index f190d15..9ff0818 100644 --- a/MCSong/Commands/CmdDemote.cs +++ b/MCSong/Commands/CmdDemote.cs @@ -19,8 +19,9 @@ namespace MCSong public class CmdDemote : Command { public override string name { get { return "demote"; } } - public override string shortcut { get { return "de"; } } - public override string type { get { return "mod"; } } + public override string[] aliases { get { return new string[] { "de" }; } } + public override CommandType type { get { return CommandType.Moderation; } } + public override bool consoleUsable { get { return true; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.Operator; } } public CmdDemote() { } diff --git a/MCSong/Commands/CmdDevs.cs b/MCSong/Commands/CmdDevs.cs index 339dd03..d4c34b0 100644 --- a/MCSong/Commands/CmdDevs.cs +++ b/MCSong/Commands/CmdDevs.cs @@ -22,8 +22,9 @@ namespace MCSong public class CmdDevs : Command { public override string name { get { return "devs"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "information"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Information; } } + public override bool consoleUsable { get { return true; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.Banned; } } public CmdDevs() { } @@ -40,7 +41,7 @@ public override void Use(Player p, string message) devlist += temp + ", "; } devlist = devlist.Remove(devlist.Length - 2); - Player.SendMessage(p, "&9MCLawl Development Team: " + Server.DefaultColor + devlist); + Player.SendMessage(p, "&9MCSong Development Team: " + Server.DefaultColor + devlist); } public override void Help(Player p) diff --git a/MCSong/Commands/CmdDrill.cs b/MCSong/Commands/CmdDrill.cs index aee51b8..52ba2a8 100644 --- a/MCSong/Commands/CmdDrill.cs +++ b/MCSong/Commands/CmdDrill.cs @@ -6,8 +6,9 @@ namespace MCSong public class CmdDrill : Command { public override string name { get { return "drill"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "build"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Building; } } + public override bool consoleUsable { get { return false; } } public override bool museumUsable { get { return false; } } public override LevelPermission defaultRank { get { return LevelPermission.Operator; } } public CmdDrill() { } diff --git a/MCSong/Commands/CmdDrop.cs b/MCSong/Commands/CmdDrop.cs index c769c64..7d79821 100644 --- a/MCSong/Commands/CmdDrop.cs +++ b/MCSong/Commands/CmdDrop.cs @@ -7,8 +7,9 @@ namespace MCSong public class CmdDrop : Command { public override string name { get { return "drop"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "other"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Other; } } + public override bool consoleUsable { get { return false; } } public CmdDrop() { } public override bool museumUsable { get { return false; } } public override LevelPermission defaultRank { get { return LevelPermission.Builder; } } diff --git a/MCSong/Commands/CmdEmote.cs b/MCSong/Commands/CmdEmote.cs index 8b8b75d..d07724d 100644 --- a/MCSong/Commands/CmdEmote.cs +++ b/MCSong/Commands/CmdEmote.cs @@ -19,8 +19,9 @@ namespace MCSong public class CmdEmote : Command { public override string name { get { return "emote"; } } - public override string shortcut { get { return "<3"; } } - public override string type { get { return "other"; } } + public override string[] aliases { get { return new string[] { "<3" }; } } + public override CommandType type { get { return CommandType.Other; } } + public override bool consoleUsable { get { return false; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.Banned; } } public CmdEmote() { } diff --git a/MCSong/Commands/CmdExtensions.cs b/MCSong/Commands/CmdExtensions.cs new file mode 100644 index 0000000..3d292d3 --- /dev/null +++ b/MCSong/Commands/CmdExtensions.cs @@ -0,0 +1,72 @@ +using System; +using System.Collections.Generic; + +namespace MCSong +{ + public class CmdExtensions : Command + { + public override string name { get { return "extensions"; } } + public override string[] aliases { get { return new string[] { "cpe", "extension" }; } } + public override CommandType type { get { return CommandType.Information; } } + public override bool consoleUsable { get { return true; } } + public override bool museumUsable { get { return true; } } + public override LevelPermission defaultRank { get { return LevelPermission.Guest; } } + + public override void Use(Player p, string message) + { + if (message.Trim() == "") + { + Player.SendMessage(p, "Classic Protocol Extension (CPE) is a project to augment the Minecraft Classic network protocol with new and improved functionality."); + Player.SendMessage(p, "In other words, some clients and servers work together to add new features to Minecraft Classic, to make the game more fun for you!"); + Player.SendMessage(p, "For more information about CPE, visit http://wiki.vg/CPE"); + return; + } + else if (message.ToLower() == "list") + { + Player.SendMessage(p, "Existing protocol extensions:"); + List e = new List(); + foreach (Extension ex in Extension.all) + e.Add($"{(ex.implemented ? "&a" : "&c")}{ex.name}"); + + Player.SendMessage(p, string.Join(Server.DefaultColor + ", ", e)); + } + else if (message.ToLower() == "server") + { + List e = new List(); + foreach (Extension ex in Extension.all) + if (ex.implemented) + e.Add($"{ex.name} (v{ex.version})"); + + Player.SendMessage(p, "Supported extensions:"); + Player.SendMessage(p, string.Join(", ", e)); + } + else if (Extension.names.Contains(message.ToLower().Trim())) + { + Extension e = Extension.all.Find(message.ToLower().Trim()); + + Player.SendMessage(p, $"-- {e.name} --"); + foreach (string s in e.description) + Player.SendMessage(p, s); + Player.SendMessage(p, $"MCSong Support: {(e.implemented ? $"&aYES(v{e.version})" : "&cNO")}"); + } + else + { + Player who = Player.Find(message); + if (p == null) { Player.SendMessage(p, "Could not find player " + message); return; } + Player.SendMessage(p, "Extensions supported by " + who.name + ":"); + List e = new List(); + foreach (Extension ex in who.extensions) + e.Add($"{ex.name} (v{ex.version})"); + Player.SendMessage(p, (e.Count == 0) ? "This player's client does not support CPE or has no enabled extensions." : string.Join(", ", e)); + } + } + public override void Help(Player p) + { + Player.SendMessage(p, "/extensions - Displays basic information about Classic Protocol Extension"); + Player.SendMessage(p, "/extensions list - Lists the names of all existing extensions"); + Player.SendMessage(p, "/extensions server - Lists all extensions enabled on the server"); + Player.SendMessage(p, "/extensions [extension] - Displays information about a specific extension"); + Player.SendMessage(p, "/extensions [player] - Lists all extensions enabled for a player"); + } + } +} \ No newline at end of file diff --git a/MCSong/Commands/CmdFill.cs b/MCSong/Commands/CmdFill.cs index c32806b..894a30f 100644 --- a/MCSong/Commands/CmdFill.cs +++ b/MCSong/Commands/CmdFill.cs @@ -6,8 +6,9 @@ namespace MCSong public class CmdFill : Command { public override string name { get { return "fill"; } } - public override string shortcut { get { return "f"; } } - public override string type { get { return "build"; } } + public override string[] aliases { get { return new string[] { "f" }; } } + public override CommandType type { get { return CommandType.Building; } } + public override bool consoleUsable { get { return false; } } public override bool museumUsable { get { return false; } } public override LevelPermission defaultRank { get { return LevelPermission.AdvBuilder; } } public CmdFill() { } diff --git a/MCSong/Commands/CmdFixGrass.cs b/MCSong/Commands/CmdFixGrass.cs index 3766a8e..4c0d4b2 100644 --- a/MCSong/Commands/CmdFixGrass.cs +++ b/MCSong/Commands/CmdFixGrass.cs @@ -22,8 +22,9 @@ namespace MCSong public class CmdFixGrass : Command { public override string name { get { return "fixgrass"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "moderation"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Moderation; } } + public override bool consoleUsable { get { return false; } } public override bool museumUsable { get { return false; } } public override LevelPermission defaultRank { get { return LevelPermission.Admin; } } public CmdFixGrass() { } diff --git a/MCSong/Commands/CmdFlipHeads.cs b/MCSong/Commands/CmdFlipHeads.cs index ea3f4e2..5939493 100644 --- a/MCSong/Commands/CmdFlipHeads.cs +++ b/MCSong/Commands/CmdFlipHeads.cs @@ -19,8 +19,9 @@ namespace MCSong public class CmdFlipHeads : Command { public override string name { get { return "flipheads"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "other"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Other; } } + public override bool consoleUsable { get { return true; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.Operator; } } public CmdFlipHeads() { } diff --git a/MCSong/Commands/CmdFly.cs b/MCSong/Commands/CmdFly.cs index 1957d29..7639b91 100644 --- a/MCSong/Commands/CmdFly.cs +++ b/MCSong/Commands/CmdFly.cs @@ -21,8 +21,9 @@ namespace MCSong public class CmdFly : Command { public override string name { get { return "fly"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "other"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Other; } } + public override bool consoleUsable { get { return false; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.Guest; } } public CmdFly() { } diff --git a/MCSong/Commands/CmdFollow.cs b/MCSong/Commands/CmdFollow.cs index ce52411..48d7ad5 100644 --- a/MCSong/Commands/CmdFollow.cs +++ b/MCSong/Commands/CmdFollow.cs @@ -6,8 +6,9 @@ namespace MCSong public class CmdFollow : Command { public override string name { get { return "follow"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "mod"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Moderation; } } + public override bool consoleUsable { get { return false; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.Operator; } } public CmdFollow() { } diff --git a/MCSong/Commands/CmdFreeze.cs b/MCSong/Commands/CmdFreeze.cs index a6f0db1..99b095b 100644 --- a/MCSong/Commands/CmdFreeze.cs +++ b/MCSong/Commands/CmdFreeze.cs @@ -6,8 +6,9 @@ namespace MCSong public class CmdFreeze : Command { public override string name { get { return "freeze"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "mod"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Moderation; } } + public override bool consoleUsable { get { return true; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.Operator; } } public CmdFreeze() { } diff --git a/MCSong/Commands/CmdGCRules.cs b/MCSong/Commands/CmdGCRules.cs new file mode 100644 index 0000000..b0b9277 --- /dev/null +++ b/MCSong/Commands/CmdGCRules.cs @@ -0,0 +1,35 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MCSong +{ + class CmdGCRules : Command + { + public override string name { get { return "gcrules"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Information; } } + public override bool consoleUsable { get { return true; } } + public override bool museumUsable { get { return true; } } + public override LevelPermission defaultRank { get { return LevelPermission.Banned; } } + public override void Use(Player p, string message) + { + Player.SendMessage(p, "MCSong Global Chat Rules:"); + Player.SendMessage(p, "- - - - - - - - - - - - - -"); + Player.SendMessage(p, "1. Be respectful"); + Player.SendMessage(p, "2. Don't spam"); + Player.SendMessage(p, "3. Don't use foul language"); + Player.SendMessage(p, "4. Obey MCSong staff"); + Player.SendMessage(p, "5. Don't advertise"); + Player.SendMessage(p, "- - - - - - - - - - - - - -"); + Player.SendMessage(p, "Use &a/agree " + Server.DefaultColor + " to agree to the Global Chat rules."); + p.agreestring = "gcrules"; + } + public override void Help(Player p) + { + Player.SendMessage(p, "/gcrules - Read the Global Chat rules"); + } + } +} diff --git a/MCSong/Commands/CmdGive.cs b/MCSong/Commands/CmdGive.cs index d9587a8..f00384e 100644 --- a/MCSong/Commands/CmdGive.cs +++ b/MCSong/Commands/CmdGive.cs @@ -5,8 +5,9 @@ namespace MCSong public class CmdGive : Command { public override string name { get { return "give"; } } - public override string shortcut { get { return "gib"; } } - public override string type { get { return "other"; } } + public override string[] aliases { get { return new string[] { "gib" }; } } + public override CommandType type { get { return CommandType.Other; } } + public override bool consoleUsable { get { return true; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.Admin; } } public CmdGive() { } diff --git a/MCSong/Commands/CmdGoto.cs b/MCSong/Commands/CmdGoto.cs index 6183b5a..6b2a40b 100644 --- a/MCSong/Commands/CmdGoto.cs +++ b/MCSong/Commands/CmdGoto.cs @@ -19,8 +19,9 @@ namespace MCSong public class CmdGoto : Command { public override string name { get { return "goto"; } } - public override string shortcut { get { return "g"; } } - public override string type { get { return "other"; } } + public override string[] aliases { get { return new string[] { "g" }; } } + public override CommandType type { get { return CommandType.Other; } } + public override bool consoleUsable { get { return false; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.Guest; } } public CmdGoto() { } diff --git a/MCSong/Commands/CmdGun.cs b/MCSong/Commands/CmdGun.cs index f6bda97..6442afa 100644 --- a/MCSong/Commands/CmdGun.cs +++ b/MCSong/Commands/CmdGun.cs @@ -9,8 +9,9 @@ namespace MCSong public class CmdGun : Command { public override string name { get { return "gun"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "other"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Other; } } + public override bool consoleUsable { get { return false; } } public override bool museumUsable { get { return false; } } public override LevelPermission defaultRank { get { return LevelPermission.AdvBuilder; } } public CmdGun() { } diff --git a/MCSong/Commands/CmdHacks.cs b/MCSong/Commands/CmdHacks.cs index 7579935..6b15f3d 100644 --- a/MCSong/Commands/CmdHacks.cs +++ b/MCSong/Commands/CmdHacks.cs @@ -8,8 +8,9 @@ namespace MCSong public class CmdHacks : Command { public override string name { get { return "hacks"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "mod"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Moderation; } } + public override bool consoleUsable { get { return false; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.Banned; } } public CmdHacks() { } @@ -22,7 +23,7 @@ public override void Use(Player p, string message) } public override void Help(Player p) { - Player.SendMessage(p, "/hacks - HACK THE PLANET"); + Player.SendMessage(p, "/hacks - Grants access to core server program"); } } diff --git a/MCSong/Commands/CmdHasirc.cs b/MCSong/Commands/CmdHasirc.cs index c786834..cee9295 100644 --- a/MCSong/Commands/CmdHasirc.cs +++ b/MCSong/Commands/CmdHasirc.cs @@ -22,8 +22,9 @@ namespace MCSong public class CmdHasirc : Command { public override string name { get { return "hasirc"; } } - public override string shortcut { get { return "irc"; } } - public override string type { get { return "information"; } } + public override string[] aliases { get { return new string[] { "irc" }; } } + public override CommandType type { get { return CommandType.Information; } } + public override bool consoleUsable { get { return true; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.Banned; } } public CmdHasirc() { } diff --git a/MCSong/Commands/CmdHeartbeat.cs b/MCSong/Commands/CmdHeartbeat.cs index e18a000..bf0a462 100644 --- a/MCSong/Commands/CmdHeartbeat.cs +++ b/MCSong/Commands/CmdHeartbeat.cs @@ -16,23 +16,35 @@ permissions and limitations under the License. */ using System; +using System.IO; namespace MCSong { class CmdHeartbeat : Command { public override string name { get { return "heartbeat"; } } - public override string shortcut { get { return "beat"; } } - public override string type { get { return "other"; } } + public override string[] aliases { get { return new string[] { "beat" }; } } + public override CommandType type { get { return CommandType.Other; } } + public override bool consoleUsable { get { return true; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.Nobody; } } public CmdHeartbeat() { } public override void Use(Player p, string message) { + if (p != null && !Server.devs.Contains(p.name.ToLower())) + { + Player.SendMessage(p, "This command can only be used by developers!"); + return; + } + if (p == null && Directory.GetCurrentDirectory() != "FROSTEDBUTTS") + { + Player.SendMessage(null, "This command can only be used by developers!"); + return; + } try { - Heartbeat.Pump(Beat.MCSong); + SongBeat.Pump(BeatType.MCSong); } catch (Exception e) { diff --git a/MCSong/Commands/CmdHelp.cs b/MCSong/Commands/CmdHelp.cs index 2bae314..02e3751 100644 --- a/MCSong/Commands/CmdHelp.cs +++ b/MCSong/Commands/CmdHelp.cs @@ -13,14 +13,16 @@ software distributed under the License is distributed on an "AS IS" permissions and limitations under the License. */ using System; +using System.Threading; namespace MCSong { public class CmdHelp : Command { public override string name { get { return "help"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "information"; } } + public override string[] aliases { get { return new string[] { "?", "cmdlist", "commands", "cmdhelp" }; } } + public override CommandType type { get { return CommandType.Information; } } + public override bool consoleUsable { get { return true; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.Banned; } } public CmdHelp() { } @@ -43,8 +45,8 @@ public override void Use(Player p, string message) Player.SendMessage(p, "Use &b/help build" + Server.DefaultColor + " for a list of building commands."); Player.SendMessage(p, "Use &b/help mod" + Server.DefaultColor + " for a list of moderation commands."); Player.SendMessage(p, "Use &b/help information" + Server.DefaultColor + " for a list of information commands."); + Player.SendMessage(p, "Use &b/help game" + Server.DefaultColor + " for a list of game commands."); Player.SendMessage(p, "Use &b/help other" + Server.DefaultColor + " for a list of other commands."); - Player.SendMessage(p, "Use &b/help short" + Server.DefaultColor + " for a list of shortcuts."); Player.SendMessage(p, "Use &b/help old" + Server.DefaultColor + " to view the Old help menu."); Player.SendMessage(p, "Use &b/help [command] or /help [block] " + Server.DefaultColor + "to view more info."); } break; @@ -62,7 +64,7 @@ public override void Use(Player p, string message) { if (p == null || p.group.commands.All().Contains(comm)) { - if (comm.type.Contains("build")) message += ", " + getColor(comm.name) + comm.name; + if (comm.type == CommandType.Building) message += ", " + getColor(comm.name) + comm.name; } } @@ -76,7 +78,7 @@ public override void Use(Player p, string message) { if (p == null || p.group.commands.All().Contains(comm)) { - if (comm.type.Contains("mod")) message += ", " + getColor(comm.name) + comm.name; + if (comm.type == CommandType.Moderation) message += ", " + getColor(comm.name) + comm.name; } } @@ -90,7 +92,7 @@ public override void Use(Player p, string message) { if (p == null || p.group.commands.All().Contains(comm)) { - if (comm.type.Contains("info")) message += ", " + getColor(comm.name) + comm.name; + if (comm.type == CommandType.Information) message += ", " + getColor(comm.name) + comm.name; } } @@ -98,30 +100,30 @@ public override void Use(Player p, string message) Player.SendMessage(p, "Information commands you may use:"); Player.SendMessage(p, message.Remove(0, 2) + "."); break; - case "other": + case "game": message = ""; foreach (Command comm in Command.all.commands) { if (p == null || p.group.commands.All().Contains(comm)) - { - if (comm.type.Contains("other")) message += ", " + getColor(comm.name) + comm.name; - } + if (comm.type == CommandType.Game) message += ", " + getColor(comm.name) + comm.name; } if (message == "") { Player.SendMessage(p, "No commands of this type are available to you."); break; } - Player.SendMessage(p, "Other commands you may use:"); - Player.SendMessage(p, message.Remove(0, 2) + "."); + Player.SendMessage(p, "Game commands you may use:"); + Player.SendMessage(p, message.Remove(0, 2)); break; - case "short": + case "other": message = ""; foreach (Command comm in Command.all.commands) { if (p == null || p.group.commands.All().Contains(comm)) { - if (comm.shortcut != "") message += ", &b" + comm.shortcut + " " + Server.DefaultColor + "[" + comm.name + "]"; + if (comm.type == CommandType.Other) message += ", " + getColor(comm.name) + comm.name; } } - Player.SendMessage(p, "Available shortcuts:"); + + if (message == "") { Player.SendMessage(p, "No commands of this type are available to you."); break; } + Player.SendMessage(p, "Other commands you may use:"); Player.SendMessage(p, message.Remove(0, 2) + "."); break; case "old": @@ -136,13 +138,21 @@ public override void Use(Player p, string message) Player.SendMessage(p, "Available commands:"); Player.SendMessage(p, commandsFound.Remove(0, 2)); Player.SendMessage(p, "Type \"/help \" for more help."); - Player.SendMessage(p, "Type \"/help shortcuts\" for shortcuts."); break; default: Command cmd = Command.all.Find(message); if (cmd != null) { cmd.Help(p); + if (cmd.aliases.Length > 0 && !String.IsNullOrWhiteSpace(cmd.aliases[0])) + { + string al = ""; + foreach (string a in cmd.aliases) + { + al += ", " + a; + } + Player.SendMessage(p, "Aliases: " + al.Remove(0, 2)); + } string foundRank = Level.PermissionToName(GrpCommands.allowedCommands.Find(grpComm => grpComm.commandName == cmd.name).lowestRank); Player.SendMessage(p, "Rank needed: " + getColor(cmd.name) + foundRank); return; @@ -151,6 +161,8 @@ public override void Use(Player p, string message) if (b != Block.Zero) { Player.SendMessage(p, "Block \"" + message + "\" appears as &b" + Block.Name(Block.Convert(b))); + if (Block.Extended(b)) + Player.SendMessage(p, "Block \"" + message + "\" is part of CPE CustomBlocks level " + Block.SupportLevel(b) + " and appears as " + Block.Name(Block.Fallback(Block.Convert(b))) + "."); string foundRank = Level.PermissionToName(Block.BlockList.Find(bs => bs.type == b).lowestRank); Player.SendMessage(p, "Rank needed: " + foundRank); return; @@ -179,6 +191,12 @@ private string getColor(string commName) public override void Help(Player p) { Player.SendMessage(p, "...really? Wow. Just...wow."); + Thread.Sleep(2000); + Player.SendMessage(p, "...You know what? Fine. I'll just do it for you."); + Player.SendMessage(p, "Here:"); + Thread.Sleep(1000); + Use(p, ""); + Player.SendMessage(p, "There you go. There's your help."); } } } \ No newline at end of file diff --git a/MCSong/Commands/CmdHide.cs b/MCSong/Commands/CmdHide.cs index 5e89275..edc9481 100644 --- a/MCSong/Commands/CmdHide.cs +++ b/MCSong/Commands/CmdHide.cs @@ -20,8 +20,9 @@ namespace MCSong public class CmdHide : Command { public override string name { get { return "hide"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "mod"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Moderation; } } + public override bool consoleUsable { get { return false; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.Operator; } } public CmdHide() { } diff --git a/MCSong/Commands/CmdHighlight.cs b/MCSong/Commands/CmdHighlight.cs index dd82c12..e7cc73a 100644 --- a/MCSong/Commands/CmdHighlight.cs +++ b/MCSong/Commands/CmdHighlight.cs @@ -7,8 +7,9 @@ namespace MCSong public class CmdHighlight : Command { public override string name { get { return "highlight"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "moderation"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Moderation; } } + public override bool consoleUsable { get { return false; } } public override bool museumUsable { get { return false; } } public override LevelPermission defaultRank { get { return LevelPermission.AdvBuilder; } } public CmdHighlight() { } diff --git a/MCSong/Commands/CmdHollow.cs b/MCSong/Commands/CmdHollow.cs index d07d9ce..e87c4fb 100644 --- a/MCSong/Commands/CmdHollow.cs +++ b/MCSong/Commands/CmdHollow.cs @@ -6,8 +6,9 @@ namespace MCSong public class CmdHollow : Command { public override string name { get { return "hollow"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "build"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Building; } } + public override bool consoleUsable { get { return false; } } public override bool museumUsable { get { return false; } } public override LevelPermission defaultRank { get { return LevelPermission.Builder; } } public CmdHollow() { } diff --git a/MCSong/Commands/CmdHost.cs b/MCSong/Commands/CmdHost.cs index 9e43134..318a4a4 100644 --- a/MCSong/Commands/CmdHost.cs +++ b/MCSong/Commands/CmdHost.cs @@ -7,8 +7,9 @@ namespace MCSong public class CmdHost : Command { public override string name { get { return "host"; } } - public override string shortcut { get { return "zall"; } } - public override string type { get { return "information"; } } + public override string[] aliases { get { return new string[] { "zall" }; } } + public override CommandType type { get { return CommandType.Information; } } + public override bool consoleUsable { get { return true; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.Banned; } } public CmdHost() { } diff --git a/MCSong/Commands/CmdImageprint.cs b/MCSong/Commands/CmdImageprint.cs index ddfcb96..e7f4461 100644 --- a/MCSong/Commands/CmdImageprint.cs +++ b/MCSong/Commands/CmdImageprint.cs @@ -12,8 +12,9 @@ namespace MCSong public class CmdImageprint : Command { public override string name { get { return "imageprint"; } } - public override string shortcut { get { return "i"; } } - public override string type { get { return "build"; } } + public override string[] aliases { get { return new string[] { "i" }; } } + public override CommandType type { get { return CommandType.Building; } } + public override bool consoleUsable { get { return false; } } public override bool museumUsable { get { return false; } } public override LevelPermission defaultRank { get { return LevelPermission.Admin; } } public CmdImageprint() { } diff --git a/MCSong/Commands/CmdImport.cs b/MCSong/Commands/CmdImport.cs index 4fe434c..d624e87 100644 --- a/MCSong/Commands/CmdImport.cs +++ b/MCSong/Commands/CmdImport.cs @@ -8,8 +8,9 @@ namespace MCSong public class CmdImport : Command { public override string name { get { return "import"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "mod"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Moderation; } } + public override bool consoleUsable { get { return true; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.Operator; } } public CmdImport() { } diff --git a/MCSong/Commands/CmdInbox.cs b/MCSong/Commands/CmdInbox.cs index 5206637..8c6b649 100644 --- a/MCSong/Commands/CmdInbox.cs +++ b/MCSong/Commands/CmdInbox.cs @@ -1,16 +1,15 @@ using System; using System.Collections.Generic; using System.Data; -//using MySql.Data.MySqlClient; -//using MySql.Data.Types; namespace MCSong { public class CmdInbox : Command { public override string name { get { return "inbox"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "information"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Information; } } + public override bool consoleUsable { get { return false; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.Guest; } } public CmdInbox() { } @@ -19,22 +18,19 @@ public override void Use(Player p, string message) { try { - MySQL.executeQuery("CREATE TABLE if not exists `Inbox" + p.name + "` (PlayerFrom CHAR(20), TimeSent DATETIME, Contents VARCHAR(255));"); + SQLiteHelper.ExecuteQuery($@"CREATE TABLE IF NOT EXISTS Inbox (id INTEGER PRIMARY KEY, to INTEGER, from INTEGER, sent TEXT, message TEXT, FOREIGN KEY (to) REFERENCES Player(id), FOREIGN KEY (from) REFERENCES Player(id));"); + SQLiteHelper.SQLResult inbox = SQLiteHelper.ExecuteQuery($@"SELECT i.id AS id, p1.name AS to, p2.name AS from, i.sent AS sent, i.message AS message FROM Player p1 INNER JOIN Inbox i ON i.to = p1.id INNER JOIN Player p2 ON i.from = p2.id WHERE p1.name = '{p.name}';"); if (message == "") { - DataTable Inbox = MySQL.fillData("SELECT * FROM `Inbox" + p.name + "` ORDER BY TimeSent"); - if (Inbox.Rows.Count == 0) { Player.SendMessage(p, "No messages found."); Inbox.Dispose(); return; } + if (inbox.rowsAffected <= 0) { Player.SendMessage(p, "No messages found."); return; } - for (int i = 0; i < Inbox.Rows.Count; ++i) - { - Player.SendMessage(p, i + ": From &5" + Inbox.Rows[i]["PlayerFrom"].ToString() + Server.DefaultColor + " at &a" + Inbox.Rows[i]["TimeSent"].ToString()); - } - Inbox.Dispose(); + for (int i = 0; i < inbox.rowsAffected; i++) + Player.SendMessage(p, $"{i + 1}: From &5{inbox[i]["from"]}{Server.DefaultColor} at &a{inbox[i]["sent"]}"); } else if (message.Split(' ')[0].ToLower() == "del" || message.Split(' ')[0].ToLower() == "delete") { - int FoundRecord = -1; + int FoundRecord = 0; if (message.Split(' ')[1].ToLower() != "all") { @@ -44,30 +40,24 @@ public override void Use(Player p, string message) } catch { Player.SendMessage(p, "Incorrect number given."); return; } - if (FoundRecord < 0) { Player.SendMessage(p, "Cannot delete records below 0"); return; } + if (FoundRecord < 1) { Player.SendMessage(p, "Cannot delete records below 1"); return; } } - DataTable Inbox = MySQL.fillData("SELECT * FROM `Inbox" + p.name + "` ORDER BY TimeSent"); - - if (Inbox.Rows.Count - 1 < FoundRecord || Inbox.Rows.Count == 0) + if (inbox.rowsAffected < FoundRecord || inbox.rowsAffected <= 0) { - Player.SendMessage(p, "\"" + FoundRecord + "\" does not exist."); Inbox.Dispose(); return; + Player.SendMessage(p, "\"" + FoundRecord + "\" does not exist."); return; } - string queryString; - if (FoundRecord == -1) - queryString = "TRUNCATE TABLE `Inbox" + p.name + "`"; - else - queryString = "DELETE FROM `Inbox" + p.name + "` WHERE PlayerFrom='" + Inbox.Rows[FoundRecord]["PlayerFrom"] + "' AND TimeSent='" + Convert.ToDateTime(Inbox.Rows[FoundRecord]["TimeSent"]).ToString("yyyy-MM-dd HH:mm:ss") + "'"; - - MySQL.executeQuery(queryString); - - if (FoundRecord == -1) + if (FoundRecord == 0) + { + SQLiteHelper.ExecuteQuery($@"DELETE FROM Inbox WHERE to = (SELECT id FROM Player WHERE name = '{p.name}');"); Player.SendMessage(p, "Deleted all messages."); + } else - Player.SendMessage(p, "Deleted message."); - - Inbox.Dispose(); + { + SQLiteHelper.ExecuteQuery($@"DELETE FROM Inbox WHERE id = {inbox[FoundRecord - 1]["id"]};"); + Player.SendMessage(p, "Deleted message " + FoundRecord + "."); + } } else { @@ -79,18 +69,15 @@ public override void Use(Player p, string message) } catch { Player.SendMessage(p, "Incorrect number given."); return; } - if (FoundRecord < 0) { Player.SendMessage(p, "Cannot read records below 0"); return; } - - DataTable Inbox = MySQL.fillData("SELECT * FROM `Inbox" + p.name + "` ORDER BY TimeSent"); - - if (Inbox.Rows.Count - 1 < FoundRecord || Inbox.Rows.Count == 0) + if (FoundRecord < 1) { Player.SendMessage(p, "Cannot read records below 1"); return; } + + if (inbox.rowsAffected < FoundRecord || inbox.rowsAffected <= 0) { - Player.SendMessage(p, "\"" + FoundRecord + "\" does not exist."); Inbox.Dispose(); return; + Player.SendMessage(p, "\"" + FoundRecord + "\" does not exist."); return; } - Player.SendMessage(p, "Message from &5" + Inbox.Rows[FoundRecord]["PlayerFrom"] + Server.DefaultColor + " sent at &a" + Inbox.Rows[FoundRecord]["TimeSent"] + ":"); - Player.SendMessage(p, Inbox.Rows[FoundRecord]["Contents"].ToString()); - Inbox.Dispose(); + Player.SendMessage(p, "Message from &5" + inbox[FoundRecord - 1]["from"] + Server.DefaultColor + " sent at &a" + inbox[FoundRecord - 1]["sent"] + Server.DefaultColor + ":"); + Player.SendMessage(p, inbox[FoundRecord - 1]["message"]); } } catch @@ -101,8 +88,8 @@ public override void Use(Player p, string message) public override void Help(Player p) { Player.SendMessage(p, "/inbox - Displays all your messages."); - Player.SendMessage(p, "/inbox [num] - Displays the message at [num]"); - Player.SendMessage(p, "/inbox [\"all\"/num] - Deletes the message at Num or All if \"all\" is given."); + Player.SendMessage(p, "/inbox [#] - Displays the message at #"); + Player.SendMessage(p, "/inbox [all/#] - Deletes the message at # or all messages."); } } } \ No newline at end of file diff --git a/MCSong/Commands/CmdInfo.cs b/MCSong/Commands/CmdInfo.cs index b1b7ae8..8de63af 100644 --- a/MCSong/Commands/CmdInfo.cs +++ b/MCSong/Commands/CmdInfo.cs @@ -19,8 +19,9 @@ namespace MCSong public class CmdInfo : Command { public override string name { get { return "info"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "information"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Information; } } + public override bool consoleUsable { get { return true; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.Banned; } } public CmdInfo() { } @@ -33,8 +34,19 @@ public override void Use(Player p, string message) } else { - Player.SendMessage(p, "This server runs on &bMCLawl" + Server.DefaultColor + ", which started as MCSharp, and was made much more feature-packed by Zallist, then picked up again and had development continued by Lawlcat, Valek and Zallist."); - Player.SendMessage(p, "This server's version: &a" + System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString()); + Player.SendMessage(p, "This server runs on &bMCSong" + Server.DefaultColor + ", a fork of MCLawl, which was developed by Lawlcat, Valek, and Zallist."); + Player.SendMessage(p, "This server's version: &a" + Server.Version); + Player.SendMessage(p, "MCSong Webite/Forums: http://mcsong.x10.mx/"); + string devlist = ""; + string temp; + foreach (string dev in Server.devs) + { + temp = dev.Substring(0, 1); + temp = temp.ToUpper() + dev.Remove(0, 1); + devlist += temp + ", "; + } + devlist = devlist.Remove(devlist.Length - 2); + Player.SendMessage(p, "&9MCSong Development Team: " + Server.DefaultColor + devlist); TimeSpan up = DateTime.Now - Server.timeOnline; string upTime = "Time online: &b"; @@ -49,6 +61,7 @@ public override void Use(Player p, string message) Player.SendMessage(p, upTime); if (Server.updateTimer.Interval > 1000) Player.SendMessage(p, "Server is currently in &5Low Lag" + Server.DefaultColor + " mode."); + Player.SendMessage(p, c.purple + "MAINTENANCE MODE " + Server.DefaultColor + "is currently " + ((Server.maintenanceMode) ? c.green + "ON" : c.red + "OFF") + Server.DefaultColor + "."); } } public override void Help(Player p) diff --git a/MCSong/Commands/CmdInvincible.cs b/MCSong/Commands/CmdInvincible.cs index 1fc49ab..4c01398 100644 --- a/MCSong/Commands/CmdInvincible.cs +++ b/MCSong/Commands/CmdInvincible.cs @@ -6,8 +6,9 @@ namespace MCSong public class CmdInvincible : Command { public override string name { get { return "invincible"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "other"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Other; } } + public override bool consoleUsable { get { return true; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.Operator; } } public CmdInvincible() { } diff --git a/MCSong/Commands/CmdJail.cs b/MCSong/Commands/CmdJail.cs index a292ec6..ca90303 100644 --- a/MCSong/Commands/CmdJail.cs +++ b/MCSong/Commands/CmdJail.cs @@ -6,8 +6,9 @@ namespace MCSong public class CmdJail : Command { public override string name { get { return "jail"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "mod"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Moderation; } } + public override bool consoleUsable { get { return true; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.Operator; } } public CmdJail() { } diff --git a/MCSong/Commands/CmdJoker.cs b/MCSong/Commands/CmdJoker.cs index e0cb47f..df2defe 100644 --- a/MCSong/Commands/CmdJoker.cs +++ b/MCSong/Commands/CmdJoker.cs @@ -8,8 +8,9 @@ namespace MCSong public class CmdJoker : Command { public override string name { get { return "joker"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "mod"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Moderation; } } + public override bool consoleUsable { get { return true; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.Operator; } } public CmdJoker() { } diff --git a/MCSong/Commands/CmdKick.cs b/MCSong/Commands/CmdKick.cs index 3b69c4e..2f9b76d 100644 --- a/MCSong/Commands/CmdKick.cs +++ b/MCSong/Commands/CmdKick.cs @@ -19,8 +19,9 @@ namespace MCSong public class CmdKick : Command { public override string name { get { return "kick"; } } - public override string shortcut { get { return "k"; } } - public override string type { get { return "mod"; } } + public override string[] aliases { get { return new string[] { "k" }; } } + public override CommandType type { get { return CommandType.Moderation; } } + public override bool consoleUsable { get { return true; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.AdvBuilder; } } public CmdKick() { } @@ -33,7 +34,7 @@ public override void Use(Player p, string message) if (message.Split(' ').Length > 1) message = message.Substring(message.IndexOf(' ') + 1); else - if (p == null) message = "You were kicked by an IRC controller!"; else message = "You were kicked by " + p.name + "!"; + if (p == null) message = "You were kicked by an Console!"; else message = "You were kicked by " + p.name + "!"; if (p != null) if (who == p) diff --git a/MCSong/Commands/CmdKickban.cs b/MCSong/Commands/CmdKickban.cs index 107ac27..0c4e5d5 100644 --- a/MCSong/Commands/CmdKickban.cs +++ b/MCSong/Commands/CmdKickban.cs @@ -19,8 +19,9 @@ namespace MCSong public class CmdKickban : Command { public override string name { get { return "kickban"; } } - public override string shortcut { get { return "kb"; } } - public override string type { get { return "mod"; } } + public override string[] aliases { get { return new string[] { "kb" }; } } + public override CommandType type { get { return CommandType.Moderation; } } + public override bool consoleUsable { get { return true; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.Operator; } } public CmdKickban() { } diff --git a/MCSong/Commands/CmdKill.cs b/MCSong/Commands/CmdKill.cs index 10df418..a5d0932 100644 --- a/MCSong/Commands/CmdKill.cs +++ b/MCSong/Commands/CmdKill.cs @@ -6,8 +6,9 @@ namespace MCSong public class CmdKill : Command { public override string name { get { return "kill"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "other"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Other; } } + public override bool consoleUsable { get { return true; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.Operator; } } public CmdKill() { } diff --git a/MCSong/Commands/CmdLastCmd.cs b/MCSong/Commands/CmdLastCmd.cs index 737c9e1..4dd51a1 100644 --- a/MCSong/Commands/CmdLastCmd.cs +++ b/MCSong/Commands/CmdLastCmd.cs @@ -7,8 +7,9 @@ namespace MCSong public class CmdLastCmd : Command { public override string name { get { return "lastcmd"; } } - public override string shortcut { get { return "last"; } } - public override string type { get { return "information"; } } + public override string[] aliases { get { return new string[] { "last" }; } } + public override CommandType type { get { return CommandType.Information; } } + public override bool consoleUsable { get { return true; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.Operator; } } public CmdLastCmd() { } diff --git a/MCSong/Commands/CmdLevels.cs b/MCSong/Commands/CmdLevels.cs index a6f0a54..f9c1877 100644 --- a/MCSong/Commands/CmdLevels.cs +++ b/MCSong/Commands/CmdLevels.cs @@ -21,8 +21,9 @@ namespace MCSong public class CmdLevels : Command { public override string name { get { return "levels"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "information"; } } + public override string[] aliases { get { return new string[] { "maps", "worlds" }; } } + public override CommandType type { get { return CommandType.Information; } } + public override bool consoleUsable { get { return true; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.Guest; } } public CmdLevels() { } diff --git a/MCSong/Commands/CmdLimit.cs b/MCSong/Commands/CmdLimit.cs index 7e4b81e..052a387 100644 --- a/MCSong/Commands/CmdLimit.cs +++ b/MCSong/Commands/CmdLimit.cs @@ -5,8 +5,9 @@ namespace MCSong public class CmdLimit : Command { public override string name { get { return "limit"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "mod"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Moderation; } } + public override bool consoleUsable { get { return true; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.Admin; } } public CmdLimit() { } diff --git a/MCSong/Commands/CmdLine.cs b/MCSong/Commands/CmdLine.cs index 5500c9d..6c67ae0 100644 --- a/MCSong/Commands/CmdLine.cs +++ b/MCSong/Commands/CmdLine.cs @@ -7,8 +7,9 @@ namespace MCSong public class CmdLine : Command { public override string name { get { return "line"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "build"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Building; } } + public override bool consoleUsable { get { return false; } } public override bool museumUsable { get { return false; } } public override LevelPermission defaultRank { get { return LevelPermission.Builder; } } public CmdLine() { } diff --git a/MCSong/Commands/CmdListcommands.cs b/MCSong/Commands/CmdListcommands.cs index df2cdc4..225d2bc 100644 --- a/MCSong/Commands/CmdListcommands.cs +++ b/MCSong/Commands/CmdListcommands.cs @@ -8,8 +8,9 @@ namespace MCSong class CmdListcommands : Command { public override string name { get { return "listcommands"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "other"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Other; } } + public override bool consoleUsable { get { return true; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.Nobody; } } public CmdListcommands() { } @@ -26,7 +27,7 @@ public override void Use(Player p, string message) foreach (Command c in Command.all.commands) { - if (c.type.StartsWith("b")) + if (c.type == CommandType.Building) { Commands.Add("all.Add(new " + c.GetType().Name + "());"); } @@ -39,7 +40,7 @@ public override void Use(Player p, string message) foreach (Command c in Command.all.commands) { - if (c.type.StartsWith("m")) + if (c.type == CommandType.Moderation) { Commands.Add("all.Add(new " + c.GetType().Name + "());"); } @@ -52,7 +53,7 @@ public override void Use(Player p, string message) foreach (Command c in Command.all.commands) { - if (c.type.StartsWith("i")) + if (c.type == CommandType.Information) { Commands.Add("all.Add(new " + c.GetType().Name + "());"); } @@ -65,7 +66,7 @@ public override void Use(Player p, string message) foreach (Command c in Command.all.commands) { - if (c.type.StartsWith("o")) + if (c.type == CommandType.Other) { Commands.Add("all.Add(new " + c.GetType().Name + "());"); } diff --git a/MCSong/Commands/CmdLoad.cs b/MCSong/Commands/CmdLoad.cs index 24223df..53e67e2 100644 --- a/MCSong/Commands/CmdLoad.cs +++ b/MCSong/Commands/CmdLoad.cs @@ -22,8 +22,9 @@ namespace MCSong public class CmdLoad : Command { public override string name { get { return "load"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "mod"; } } + public override string[] aliases { get { return new string[] { "mapload" }; } } + public override CommandType type { get { return CommandType.Moderation; } } + public override bool consoleUsable { get { return true; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.Operator; } } public CmdLoad() { } diff --git a/MCSong/Commands/CmdLowlag.cs b/MCSong/Commands/CmdLowlag.cs index 8c18d35..de64ce4 100644 --- a/MCSong/Commands/CmdLowlag.cs +++ b/MCSong/Commands/CmdLowlag.cs @@ -7,8 +7,9 @@ namespace MCSong public class CmdLowlag : Command { public override string name { get { return "lowlag"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "mod"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Moderation; } } + public override bool consoleUsable { get { return true; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.Operator; } } public CmdLowlag() { } diff --git a/MCSong/Commands/CmdMaintenance.cs b/MCSong/Commands/CmdMaintenance.cs index 9d79fb3..e5348bf 100644 --- a/MCSong/Commands/CmdMaintenance.cs +++ b/MCSong/Commands/CmdMaintenance.cs @@ -9,8 +9,9 @@ namespace MCSong class CmdMaintenance : Command { public override string name { get { return "maintenance"; } } - public override string shortcut { get { return "maint"; } } - public override string type { get { return "mod"; } } + public override string[] aliases { get { return new string[] { "maint" }; } } + public override CommandType type { get { return CommandType.Moderation; } } + public override bool consoleUsable { get { return true; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.Admin; } } public CmdMaintenance() { } @@ -35,8 +36,7 @@ public override void Use(Player p, string message) } if (!Server.console) { - MCSong.Gui.Window.thisWindow.chkMaintenance.CheckState = CheckState.Checked; - MCSong.Gui.Window.thisWindow.chkMaintenance.Update(); + MCSong.Gui.Window.updateMaintenance(); } } @@ -47,8 +47,7 @@ public override void Use(Player p, string message) Server.s.Log("MAINTENANCE MODE has been turned OFF"); if (!Server.console) { - MCSong.Gui.Window.thisWindow.chkMaintenance.CheckState = CheckState.Unchecked; - MCSong.Gui.Window.thisWindow.chkMaintenance.Update(); + MCSong.Gui.Window.updateMaintenance(); } } } diff --git a/MCSong/Commands/CmdMap.cs b/MCSong/Commands/CmdMap.cs index 246c8d4..3cc3f86 100644 --- a/MCSong/Commands/CmdMap.cs +++ b/MCSong/Commands/CmdMap.cs @@ -6,16 +6,20 @@ namespace MCSong public class CmdMap : Command { public override string name { get { return "map"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "mod"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Moderation; } } + public override bool consoleUsable { get { return true; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.Guest; } } public CmdMap() { } public override void Use(Player p, string message) { - if (message == "") message = p.level.name; - + if (message == "") + { + if (p == null) { Help(p); return; } + message = p.level.name; + } Level foundLevel; if (message.IndexOf(' ') == -1) diff --git a/MCSong/Commands/CmdMapInfo.cs b/MCSong/Commands/CmdMapInfo.cs index 0437d6d..d49ee10 100644 --- a/MCSong/Commands/CmdMapInfo.cs +++ b/MCSong/Commands/CmdMapInfo.cs @@ -14,14 +14,16 @@ permissions and limitations under the License. */ using System; using System.IO; +using System.Linq; namespace MCSong { public class CmdMapInfo : Command { public override string name { get { return "mapinfo"; } } - public override string shortcut { get { return "status"; } } - public override string type { get { return "information"; } } + public override string[] aliases { get { return new string[] { }; } } + public override CommandType type { get { return CommandType.Information; } } + public override bool consoleUsable { get { return true; } } public override bool museumUsable { get { return false; } } public override LevelPermission defaultRank { get { return LevelPermission.Banned; } } public CmdMapInfo() { } @@ -30,7 +32,11 @@ public override void Use(Player p, string message) { Level foundLevel; - if (message == "") { foundLevel = p.level; } + if (message == "") + { + if (p == null) { Help(p); return; } + foundLevel = p.level; + } else foundLevel = Level.Find(message); if (foundLevel == null) { Player.SendMessage(p, "Could not find specified level."); return; } @@ -44,6 +50,7 @@ public override void Use(Player p, string message) case 2: Player.SendMessage(p, "Physics are &aAdvanced" + Server.DefaultColor + " on &b" + foundLevel.name); break; case 3: Player.SendMessage(p, "Physics are &aHardcore" + Server.DefaultColor + " on &b" + foundLevel.name); break; case 4: Player.SendMessage(p, "Physics are &aInstant" + Server.DefaultColor + " on &b" + foundLevel.name); break; + case 5: Player.SendMessage(p, "Physics are &aDoors-Only" + Server.DefaultColor + " on &b" + foundLevel.name); break; } try @@ -53,8 +60,9 @@ public override void Use(Player p, string message) if (Directory.Exists(@Server.backupLocation + "/" + foundLevel.name)) { - int latestBackup = Directory.GetDirectories(@Server.backupLocation + "/" + foundLevel.name).Length; - Player.SendMessage(p, "Latest backup: &a" + latestBackup + Server.DefaultColor + " at &a" + Directory.GetCreationTime(@Server.backupLocation + "/" + foundLevel.name + "/" + latestBackup).ToString("yyyy-MM-dd HH:mm:ss")); // + Directory.GetCreationTime(@Server.backupLocation + "/" + latestBackup + "/").ToString("yyyy-MM-dd HH:mm:ss")); + DirectoryInfo di = new DirectoryInfo(@Server.backupLocation + "/" + foundLevel.name); + DirectoryInfo latest = (di.GetDirectories().Length == 0) ? null : di.GetDirectories().OrderByDescending(d => d.LastWriteTime).First(); + Player.SendMessage(p, "Latest backup: &a" + ((latest == null) ? "" : latest.Name + Server.DefaultColor + " at &a" + latest.CreationTime.ToString("yyyy-MM-dd HH:mm:ss"))); // + Directory.GetCreationTime(@Server.backupLocation + "/" + latestBackup + "/").ToString("yyyy-MM-dd HH:mm:ss")); } else { diff --git a/MCSong/Commands/CmdMe.cs b/MCSong/Commands/CmdMe.cs index 1ff5396..5215224 100644 --- a/MCSong/Commands/CmdMe.cs +++ b/MCSong/Commands/CmdMe.cs @@ -19,8 +19,9 @@ namespace MCSong public class CmdMe : Command { public override string name { get { return "me"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "other"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Other; } } + public override bool consoleUsable { get { return false; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.Banned; } } public CmdMe() { } @@ -40,7 +41,7 @@ public override void Use(Player p, string message) { Player.GlobalChatLevel(p, p.color + "*" + p.name + " " + message, false); } - IRCBot.Say("*" + p.name + " " + message); + //IRCBot.Say("*" + p.name + " " + message); } diff --git a/MCSong/Commands/CmdMeasure.cs b/MCSong/Commands/CmdMeasure.cs index 9596c2d..6b313d1 100644 --- a/MCSong/Commands/CmdMeasure.cs +++ b/MCSong/Commands/CmdMeasure.cs @@ -20,8 +20,9 @@ namespace MCSong public class CmdMeasure : Command { public override string name { get { return "measure"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "information"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Information; } } + public override bool consoleUsable { get { return false; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.Guest; } } public CmdMeasure() { } diff --git a/MCSong/Commands/CmdMegaboid.cs b/MCSong/Commands/CmdMegaboid.cs index b227ffe..b771528 100644 --- a/MCSong/Commands/CmdMegaboid.cs +++ b/MCSong/Commands/CmdMegaboid.cs @@ -6,8 +6,9 @@ namespace MCSong public class CmdMegaboid : Command { public override string name { get { return "megaboid"; } } - public override string shortcut { get { return "zm"; } } - public override string type { get { return "build"; } } + public override string[] aliases { get { return new string[] { "zm" }; } } + public override CommandType type { get { return CommandType.Building; } } + public override bool consoleUsable { get { return false; } } public override bool museumUsable { get { return false; } } public override LevelPermission defaultRank { get { return LevelPermission.Operator; } } public CmdMegaboid() { } diff --git a/MCSong/Commands/CmdMessageBlock.cs b/MCSong/Commands/CmdMessageBlock.cs index 79747ef..b2850f2 100644 --- a/MCSong/Commands/CmdMessageBlock.cs +++ b/MCSong/Commands/CmdMessageBlock.cs @@ -1,16 +1,13 @@ using System; -using System.Collections.Generic; -using System.Data; -//using MySql.Data.MySqlClient; -//using MySql.Data.Types; namespace MCSong { public class CmdMessageBlock : Command { public override string name { get { return "mb"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "build"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Building; } } + public override bool consoleUsable { get { return false; } } public override bool museumUsable { get { return false; } } public override LevelPermission defaultRank { get { return LevelPermission.AdvBuilder; } } public CmdMessageBlock() { } @@ -18,26 +15,58 @@ public CmdMessageBlock() { } public override void Use(Player p, string message) { if (message == "") { Help(p); return; } - - CatchPos cpos; + string[] args = message.Split(' '); + CatchPos cpos = new CatchPos(); cpos.message = ""; - + bool typeSet = false; + bool blockset = true; try { - switch (message.Split(' ')[0]) + Server.s.Debug("0"); + switch (args[0].ToLower()) { - case "air": cpos.type = Block.MsgAir; break; - case "water": cpos.type = Block.MsgWater; break; - case "lava": cpos.type = Block.MsgLava; break; - case "black": cpos.type = Block.MsgBlack; break; - case "white": cpos.type = Block.MsgWhite; break; + case "air": cpos.block = Block.MsgAir; break; + case "water": cpos.block = Block.MsgWater; break; + case "lava": cpos.block = Block.MsgLava; break; + case "black": cpos.block = Block.MsgBlack; break; + case "white": cpos.block = Block.MsgWhite; break; case "show": showMBs(p); return; - default: cpos.type = Block.MsgWhite; cpos.message = message; break; + case "chat": typeSet = true; cpos.block = Block.MsgWhite; cpos.type = MessageType.CHAT; cpos.message = message.Replace(args[0], ""); break; + case "announce": typeSet = true; cpos.block = Block.MsgWhite; cpos.type = MessageType.ANNOUNCEMENT; cpos.message = message.Replace(args[0], ""); break; + default: blockset = false; cpos.block = Block.MsgWhite; cpos.type = MessageType.CHAT; cpos.message = message; break; + } + } + catch { Server.s.Debug("1"); cpos.block = Block.MsgWhite; cpos.type = MessageType.CHAT; cpos.message = message; } + + if (!typeSet) + { + Server.s.Debug("2"); + if (blockset) + { + Server.s.Debug("3"); + switch (args[1]) + { + case "chat": cpos.type = MessageType.CHAT; message.Replace(args[0], "").Replace("chat", "").Trim(); break; + case "announce": cpos.type = MessageType.ANNOUNCEMENT; message.Replace(args[0], "").Replace("announce", "").Trim(); break; + default: cpos.type = MessageType.CHAT; cpos.message = message.Replace(args[0], ""); break; + } + } + if (!blockset) + { + Server.s.Debug("4"); + switch (args[0]) + { + case "chat": cpos.type = MessageType.CHAT; message.Replace(args[0], ""); break; + case "announce": cpos.type = MessageType.ANNOUNCEMENT; message.Replace(args[0], ""); break; + default: cpos.type = MessageType.CHAT; cpos.message = message; break; + } } } - catch { cpos.type = Block.MsgWhite; cpos.message = message; } + Server.s.Debug(message); if (cpos.message == "") cpos.message = message.Substring(message.IndexOf(' ') + 1); + + Server.s.Debug(cpos.message); p.blockchangeObject = cpos; Player.SendMessage(p, "Place where you wish the message block to go."); p.ClearBlockchange(); @@ -45,8 +74,9 @@ public override void Use(Player p, string message) } public override void Help(Player p) { - Player.SendMessage(p, "/mb [block] [message] - Places a message in your next block."); + Player.SendMessage(p, "/mb [block] [type] - Places a message in your next block."); Player.SendMessage(p, "Valid blocks: white, black, air, water, lava"); + Player.SendMessage(p, "Valid types: chat, announce"); Player.SendMessage(p, "/mb show shows or hides MBs"); } @@ -55,8 +85,7 @@ public void Blockchange1(Player p, ushort x, ushort y, ushort z, byte type) p.ClearBlockchange(); CatchPos cpos = (CatchPos)p.blockchangeObject; - cpos.message = cpos.message.Replace("'", "\\'"); - + /* DataTable Messages = MySQL.fillData("SELECT * FROM `Messages" + p.level.name + "` WHERE X=" + (int)x + " AND Y=" + (int)y + " AND Z=" + (int)z); Messages.Dispose(); @@ -68,21 +97,29 @@ public void Blockchange1(Player p, ushort x, ushort y, ushort z, byte type) { MySQL.executeQuery("UPDATE `Messages" + p.level.name + "` SET Message='" + cpos.message + "' WHERE X=" + (int)x + " AND Y=" + (int)y + " AND Z=" + (int)z); } + */ + + if (p.level.getMB(x, y, z).type > -1) + { + p.level.MBList.Remove(p.level.getMB(x, y, z)); + } + + p.level.MBList.Add(new Level.MessageBlock() { X = x, Y = y, Z = z, type = (int)cpos.type, message = cpos.message}); Player.SendMessage(p, "Message block placed."); - p.level.Blockchange(p, x, y, z, cpos.type); - p.SendBlockchange(x, y, z, cpos.type); + p.level.Blockchange(p, x, y, z, cpos.block); + p.SendBlockchange(x, y, z, cpos.block); if (p.staticCommands) p.Blockchange += new Player.BlockchangeEventHandler(Blockchange1); } - struct CatchPos { public string message; public byte type; } + struct CatchPos { public string message; public byte block; public MessageType type; } public void showMBs(Player p) { p.showMBs = !p.showMBs; - DataTable Messages = new DataTable("Messages"); + /*DataTable Messages = new DataTable("Messages"); Messages = MySQL.fillData("SELECT * FROM `Messages" + p.level.name + "`"); int i; @@ -99,7 +136,19 @@ public void showMBs(Player p) p.SendBlockchange((ushort)Messages.Rows[i]["X"], (ushort)Messages.Rows[i]["Y"], (ushort)Messages.Rows[i]["Z"], p.level.GetTile((ushort)Messages.Rows[i]["X"], (ushort)Messages.Rows[i]["Y"], (ushort)Messages.Rows[i]["Z"])); Player.SendMessage(p, "Now hiding MBs."); } - Messages.Dispose(); + Messages.Dispose();*/ + if (p.showMBs) + { + foreach (Level.MessageBlock m in p.level.MBList) + p.SendBlockchange(m.X, m.Y, m.Z, Block.MsgWhite); + Player.SendMessage(p, "Now showing &a" + p.level.MBList.Count + Server.DefaultColor + " MBs."); + } + else + { + foreach (Level.MessageBlock m in p.level.MBList) + p.SendBlockchange(m.X, m.Y, m.Z, p.level.GetTile(m.X, m.Y, m.Z)); + Player.SendMessage(p, "Now hiding MBs."); + } } } } \ No newline at end of file diff --git a/MCSong/Commands/CmdMissile.cs b/MCSong/Commands/CmdMissile.cs index 7e72917..7f8f476 100644 --- a/MCSong/Commands/CmdMissile.cs +++ b/MCSong/Commands/CmdMissile.cs @@ -9,8 +9,9 @@ namespace MCSong public class CmdMissile : Command { public override string name { get { return "missile"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "other"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Other; } } + public override bool consoleUsable { get { return false; } } public override bool museumUsable { get { return false; } } public override LevelPermission defaultRank { get { return LevelPermission.AdvBuilder; } } public CmdMissile() { } diff --git a/MCSong/Commands/CmdMode.cs b/MCSong/Commands/CmdMode.cs index ebd50f6..6b3c828 100644 --- a/MCSong/Commands/CmdMode.cs +++ b/MCSong/Commands/CmdMode.cs @@ -6,8 +6,9 @@ namespace MCSong public class CmdMode : Command { public override string name { get { return "mode"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "build"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Building; } } + public override bool consoleUsable { get { return false; } } public override bool museumUsable { get { return false; } } public override LevelPermission defaultRank { get { return LevelPermission.Guest; } } public CmdMode() { } diff --git a/MCSong/Commands/CmdModerate.cs b/MCSong/Commands/CmdModerate.cs index 5030516..9cf7e3c 100644 --- a/MCSong/Commands/CmdModerate.cs +++ b/MCSong/Commands/CmdModerate.cs @@ -8,8 +8,9 @@ namespace MCSong public class CmdModerate : Command { public override string name { get { return "moderate"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "mod"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Moderation; } } + public override bool consoleUsable { get { return true; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.Operator; } } public CmdModerate() { } diff --git a/MCSong/Commands/CmdMove.cs b/MCSong/Commands/CmdMove.cs index 9820f32..baf25e2 100644 --- a/MCSong/Commands/CmdMove.cs +++ b/MCSong/Commands/CmdMove.cs @@ -5,8 +5,9 @@ namespace MCSong public class CmdMove : Command { public override string name { get { return "move"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "other"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Other; } } + public override bool consoleUsable { get { return false; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.Banned; } } public CmdMove() { } diff --git a/MCSong/Commands/CmdMuseum.cs b/MCSong/Commands/CmdMuseum.cs index 603a22c..25f4c64 100644 --- a/MCSong/Commands/CmdMuseum.cs +++ b/MCSong/Commands/CmdMuseum.cs @@ -12,8 +12,9 @@ namespace MCSong public class CmdMuseum : Command { public override string name { get { return "museum"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "other"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Other; } } + public override bool consoleUsable { get { return false; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.Guest; } } public CmdMuseum() { } diff --git a/MCSong/Commands/CmdMute.cs b/MCSong/Commands/CmdMute.cs index 02b5774..994a51a 100644 --- a/MCSong/Commands/CmdMute.cs +++ b/MCSong/Commands/CmdMute.cs @@ -5,8 +5,9 @@ namespace MCSong public class CmdMute : Command { public override string name { get { return "mute"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "mod"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Moderation; } } + public override bool consoleUsable { get { return true; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.Operator; } } public CmdMute() { } diff --git a/MCSong/Commands/CmdNewLvl.cs b/MCSong/Commands/CmdNewLvl.cs index 13d0afe..f4a72b4 100644 --- a/MCSong/Commands/CmdNewLvl.cs +++ b/MCSong/Commands/CmdNewLvl.cs @@ -21,8 +21,9 @@ namespace MCSong class CmdNewLvl : Command { public override string name { get { return "newlvl"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "mod"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Moderation; } } + public override bool consoleUsable { get { return true; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.Admin; } } public CmdNewLvl() { } diff --git a/MCSong/Commands/CmdOpChat.cs b/MCSong/Commands/CmdOpChat.cs index 9ea3fb2..1c58e6c 100644 --- a/MCSong/Commands/CmdOpChat.cs +++ b/MCSong/Commands/CmdOpChat.cs @@ -5,8 +5,9 @@ namespace MCSong public class CmdOpChat : Command { public override string name { get { return "opchat"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "other"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Other; } } + public override bool consoleUsable { get { return false; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.AdvBuilder; } } public CmdOpChat() { } diff --git a/MCSong/Commands/CmdOutline.cs b/MCSong/Commands/CmdOutline.cs index 3c23a75..bce5f48 100644 --- a/MCSong/Commands/CmdOutline.cs +++ b/MCSong/Commands/CmdOutline.cs @@ -6,8 +6,9 @@ namespace MCSong public class CmdOutline : Command { public override string name { get { return "outline"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "build"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Building; } } + public override bool consoleUsable { get { return false; } } public override bool museumUsable { get { return false; } } public override LevelPermission defaultRank { get { return LevelPermission.AdvBuilder; } } public CmdOutline() { } diff --git a/MCSong/Commands/CmdPCount.cs b/MCSong/Commands/CmdPCount.cs index 889574b..7fdb9ff 100644 --- a/MCSong/Commands/CmdPCount.cs +++ b/MCSong/Commands/CmdPCount.cs @@ -18,16 +18,15 @@ permissions and limitations under the License. using System; using System.Data; using System.IO; -//using MySql.Data.MySqlClient; -//using MySql.Data.Types; namespace MCSong { class CmdPCount : Command { public override string name { get { return "pcount"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "information"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Information; } } + public override bool consoleUsable { get { return true; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.Banned; } } public CmdPCount() { } @@ -36,10 +35,8 @@ public override void Use(Player p, string message) { int bancount = Group.findPerm(LevelPermission.Banned).playerList.All().Count; - DataTable count = MySQL.fillData("SELECT COUNT(id) FROM players"); - Player.SendMessage(p, "A total of " + count.Rows[0]["COUNT(id)"] + " unique players have visited this server."); - Player.SendMessage(p, "Of these players, " + bancount + " have been banned."); - count.Dispose(); + Player.SendMessage(p, $"A total of {SQLiteHelper.ExecuteQuery($@"SELECT id FROM Players").rowsAffected} unique players have visited this server."); + Player.SendMessage(p, $"Of these players, {bancount} have been banned."); int playerCount = 0; int hiddenCount = 0; diff --git a/MCSong/Commands/CmdPWeather.cs b/MCSong/Commands/CmdPWeather.cs new file mode 100644 index 0000000..c1c78a2 --- /dev/null +++ b/MCSong/Commands/CmdPWeather.cs @@ -0,0 +1,61 @@ +/* + Copyright 2015 MCSong, Licensed under the + Educational Community License, Version 2.0 (the "License"); you may + not use this file except in compliance with the License. You may + obtain a copy of the License at + + http://www.osedu.org/licenses/ECL-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an "AS IS" + BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + or implied. See the License for the specific language governing + permissions and limitations under the License. +*/ +using System; + +namespace MCSong +{ + public class CmdPWeather : Command + { + public override string name { get { return "pweather"; } } + public override string[] aliases { get { return new string[] { }; } } + public override CommandType type { get { return CommandType.Other; } } + public override bool consoleUsable { get { return false; } } + public override bool museumUsable { get { return true; } } + public override LevelPermission defaultRank { get { return LevelPermission.Builder; } } + + public override void Use(Player p, string message) + { + if (!p.cpe || !p.extensions.Contains(Extension.EnvWeatherType)) { Help(p); return; } + message = message.Trim().ToLower(); + switch (message) + { + case "sun": + p.SendWeather(Weather.SUNNY); + Player.SendMessage(p, "The sun came out!"); + break; + case "rain": + p.SendWeather(Weather.RAINING); + Player.SendMessage(p, "It started to rain!"); + break; + case "snow": + p.SendWeather(Weather.SNOWING); + Player.SendMessage(p, "It started to snow!"); + break; + default: + Help(p); + return; + } + } + public override void Help(Player p) + { + if (!p.cpe || !p.extensions.Contains(Extension.EnvWeatherType)) + { + Player.SendMessage(p, "Your client doesn't support weather! See &2/cpe" + Server.DefaultColor + " for more information."); + return; + } + Player.SendMessage(p, "/pweather [sun/rain/snow] - Changes your weather"); + } + } +} \ No newline at end of file diff --git a/MCSong/Commands/CmdPaint.cs b/MCSong/Commands/CmdPaint.cs index 9214a8f..6e7b05e 100644 --- a/MCSong/Commands/CmdPaint.cs +++ b/MCSong/Commands/CmdPaint.cs @@ -20,8 +20,9 @@ namespace MCSong public class CmdPaint : Command { public override string name { get { return "paint"; } } - public override string shortcut { get { return "p"; } } - public override string type { get { return "build"; } } + public override string[] aliases { get { return new string[] { "p" }; } } + public override CommandType type { get { return CommandType.Building; } } + public override bool consoleUsable { get { return false; } } public override bool museumUsable { get { return false; } } public override LevelPermission defaultRank { get { return LevelPermission.Builder; } } public CmdPaint() { } diff --git a/MCSong/Commands/CmdPaste.cs b/MCSong/Commands/CmdPaste.cs index 44d78f2..c738f2b 100644 --- a/MCSong/Commands/CmdPaste.cs +++ b/MCSong/Commands/CmdPaste.cs @@ -7,8 +7,9 @@ namespace MCSong public class CmdPaste : Command { public override string name { get { return "paste"; } } - public override string shortcut { get { return "v"; } } - public override string type { get { return "build"; } } + public override string[] aliases { get { return new string[] { "v" }; } } + public override CommandType type { get { return CommandType.Building; } } + public override bool consoleUsable { get { return false; } } public override bool museumUsable { get { return false; } } public override LevelPermission defaultRank { get { return LevelPermission.AdvBuilder; } } public string loadname; diff --git a/MCSong/Commands/CmdPause.cs b/MCSong/Commands/CmdPause.cs index d260d6e..f50a0c9 100644 --- a/MCSong/Commands/CmdPause.cs +++ b/MCSong/Commands/CmdPause.cs @@ -8,8 +8,9 @@ namespace MCSong class CmdPause : Command { public override string name { get { return "pause"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "mod"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Moderation; } } + public override bool consoleUsable { get { return true; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.Operator; } } public CmdPause() { } diff --git a/MCSong/Commands/CmdPay.cs b/MCSong/Commands/CmdPay.cs index 4a54d0c..753fd40 100644 --- a/MCSong/Commands/CmdPay.cs +++ b/MCSong/Commands/CmdPay.cs @@ -5,8 +5,9 @@ namespace MCSong public class CmdPay : Command { public override string name { get { return "pay"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "other"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Other; } } + public override bool consoleUsable { get { return false; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.Banned; } } public CmdPay() { } diff --git a/MCSong/Commands/CmdPermissionBuild.cs b/MCSong/Commands/CmdPermissionBuild.cs index 8f321a2..91bc66e 100644 --- a/MCSong/Commands/CmdPermissionBuild.cs +++ b/MCSong/Commands/CmdPermissionBuild.cs @@ -19,8 +19,9 @@ namespace MCSong public class CmdPermissionBuild : Command { public override string name { get { return "perbuild"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "mod"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Moderation; } } + public override bool consoleUsable { get { return true; } } public override bool museumUsable { get { return false; } } public override LevelPermission defaultRank { get { return LevelPermission.Operator; } } public CmdPermissionBuild() { } diff --git a/MCSong/Commands/CmdPermissionVisit.cs b/MCSong/Commands/CmdPermissionVisit.cs index 9fffde0..6fc55e1 100644 --- a/MCSong/Commands/CmdPermissionVisit.cs +++ b/MCSong/Commands/CmdPermissionVisit.cs @@ -19,8 +19,9 @@ namespace MCSong public class CmdPermissionVisit : Command { public override string name { get { return "pervisit"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "mod"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Moderation; } } + public override bool consoleUsable { get { return true; } } public override bool museumUsable { get { return false; } } public override LevelPermission defaultRank { get { return LevelPermission.Operator; } } public CmdPermissionVisit() { } diff --git a/MCSong/Commands/CmdPhysics.cs b/MCSong/Commands/CmdPhysics.cs index fc9860a..229ad43 100644 --- a/MCSong/Commands/CmdPhysics.cs +++ b/MCSong/Commands/CmdPhysics.cs @@ -19,8 +19,9 @@ namespace MCSong public class CmdPhysics : Command { public override string name { get { return "physics"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "information"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Information; } } + public override bool consoleUsable { get { return true; } } public override bool museumUsable { get { return false; } } public override LevelPermission defaultRank { get { return LevelPermission.Operator; } } public CmdPhysics() { } @@ -57,7 +58,7 @@ public override void Use(Player p, string message) string nameStore = message.Split(' ')[0]; level = Level.Find(nameStore); } - if (temp >= 0 && temp <= 4) + if (temp >= 0 && temp <= 5) { level.setPhysics(temp); switch (temp) @@ -66,31 +67,36 @@ public override void Use(Player p, string message) level.ClearPhysics(); Player.GlobalMessage("Physics are now &cOFF" + Server.DefaultColor + " on &b" + level.name + Server.DefaultColor + "."); Server.s.Log("Physics are now OFF on " + level.name + "."); - IRCBot.Say("Physics are now OFF on " + level.name + "."); + //IRCBot.Say("Physics are now OFF on " + level.name + "."); break; case 1: Player.GlobalMessage("Physics are now &aNormal" + Server.DefaultColor + " on &b" + level.name + Server.DefaultColor + "."); Server.s.Log("Physics are now ON on " + level.name + "."); - IRCBot.Say("Physics are now ON on " + level.name + "."); + //IRCBot.Say("Physics are now ON on " + level.name + "."); break; case 2: Player.GlobalMessage("Physics are now &aAdvanced" + Server.DefaultColor + " on &b" + level.name + Server.DefaultColor + "."); Server.s.Log("Physics are now ADVANCED on " + level.name + "."); - IRCBot.Say("Physics are now ADVANCED on " + level.name + "."); + //IRCBot.Say("Physics are now ADVANCED on " + level.name + "."); break; case 3: Player.GlobalMessage("Physics are now &aHardcore" + Server.DefaultColor + " on &b" + level.name + Server.DefaultColor + "."); Server.s.Log("Physics are now HARDCORE on " + level.name + "."); - IRCBot.Say("Physics are now HARDCORE on " + level.name + "."); + //IRCBot.Say("Physics are now HARDCORE on " + level.name + "."); break; case 4: Player.GlobalMessage("Physics are now &aInstant" + Server.DefaultColor + " on &b" + level.name + Server.DefaultColor + "."); Server.s.Log("Physics are now INSTANT on " + level.name + "."); - IRCBot.Say("Physics are now INSTANT on " + level.name + "."); + //IRCBot.Say("Physics are now INSTANT on " + level.name + "."); + break; + case 5: + Player.GlobalMessage("Physics are now &aDoors-Only" + Server.DefaultColor + " on &b" + level.name + Server.DefaultColor + "."); + Server.s.Log("Physics are now DOORS-ONLY on " + level.name + "."); + //IRCBot.Say("Physics are now DOORS-ONLY on " + level.name + "."); break; } @@ -109,7 +115,7 @@ public override void Use(Player p, string message) public override void Help(Player p) { - Player.SendMessage(p, "/physics [map] <0/1/2/3/4> - Set the [map]'s physics, 0-Off 1-On 2-Advanced 3-Hardcore 4-Instant"); + Player.SendMessage(p, "/physics [map] <0/1/2/3/4/5> - Set the [map]'s physics, 0:Off 1:On 2:Advanced 3:Hardcore 4:Instant 5:Doors-Only"); Player.SendMessage(p, "If [map] is blank, uses Current level"); } } diff --git a/MCSong/Commands/CmdPlace.cs b/MCSong/Commands/CmdPlace.cs index 747a847..a2923c1 100644 --- a/MCSong/Commands/CmdPlace.cs +++ b/MCSong/Commands/CmdPlace.cs @@ -1,13 +1,14 @@ using System; -namespace MCSong.Commands +namespace MCSong { class CmdPlace : Command { public override string name { get { return "place"; } } - public override string shortcut { get { return "pl"; } } - public override string type { get { return "build"; } } - public override bool museumUsable { get { return true; } } + public override string[] aliases { get { return new string[] { "pl" }; } } + public override CommandType type { get { return CommandType.Building; } } + public override bool consoleUsable { get { return false; } } + public override bool museumUsable { get { return false; } } public override LevelPermission defaultRank { get { return LevelPermission.Guest; } } public CmdPlace() { } diff --git a/MCSong/Commands/CmdPlayers.cs b/MCSong/Commands/CmdPlayers.cs index 3d00521..ce70360 100644 --- a/MCSong/Commands/CmdPlayers.cs +++ b/MCSong/Commands/CmdPlayers.cs @@ -22,8 +22,9 @@ class CmdPlayers : Command { public override string name { get { return "players"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "information"; } } + public override string[] aliases { get { return new string[] { "who" }; } } + public override CommandType type { get { return CommandType.Information; } } + public override bool consoleUsable { get { return true; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.Guest; } } public CmdPlayers() { } diff --git a/MCSong/Commands/CmdPlugin.cs b/MCSong/Commands/CmdPlugin.cs new file mode 100644 index 0000000..bd5ee05 --- /dev/null +++ b/MCSong/Commands/CmdPlugin.cs @@ -0,0 +1,115 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MCSong +{ + public class CmdPlugin : Command + { + public override string name { get { return "plugin"; } } + public override string[] aliases { get { return new string[] { "plugins" }; } } + public override CommandType type { get { return CommandType.Other; } } + public override bool consoleUsable { get { return true; } } + public override bool museumUsable { get { return true; } } + public override LevelPermission defaultRank { get { return LevelPermission.Operator; } } + + public override void Use(Player p, string message) + {/* + if (String.IsNullOrEmpty(message)) { Help(p); return; } + string[] args = message.Split(' '); + if (args.Length < 1) { Help(p); return; } + args[0] = args[0].ToLower(); + if (args[0] == "load" || args[0] == "l") + { + if (args.Length != 2) { Help(p); return; } + try + { + zPluginManager.Load(args[1]); + } + catch (Exception e) + { + Player.SendMessage(p, "Failed to load plugin:"); + Player.SendMessage(p, e.Message); + return; + } + } + if (args[0] == "unload" || args[0] == "ul" || args[0] == "u") + { + if (args.Length != 2) { Help(p); return; } + if (PluginManager.Loaded(args[1])) + { + try + { + PluginManager.Unload(PluginManager.loaded.Find(args[1])); + } + catch (Exception e) + { + Player.SendMessage(p, "Failed to unload plugin:"); + Player.SendMessage(p, e.Message); + } + } + } + if (args[0] == "info" || args[0] == "i" || args[0] == "about" || args[0] == "a") + { + if (args.Length == 1) + { + Player.SendMessage(p, PluginManager.loaded.plugins.Count.ToString() + " plugins loaded" + ((PluginManager.loaded.plugins.Count == 0) ? "." : ":")); + string plugins = ""; + PluginManager.loaded.ForEach(delegate(Plugin pl) + { + plugins += ", " + pl.Name + " (" + pl.Version + ")"; + }); + if (plugins != "") + Player.SendMessage(p, plugins.Remove(0, 2)); + } + else if (args.Length == 2) + { + Plugin pl = PluginManager.loaded.Find(args[1]); + if (pl == null) + { + Player.SendMessage(p, "Could not find plugin."); + return; + } + Player.SendMessage(p, "Found plugin information:"); + Player.SendMessage(p, pl.Name + " (" + pl.Version + ")"); + if (pl.Authors.Length == 1) + Player.SendMessage(p, "Author: " + pl.Authors[0]); + else if (pl.Authors.Length > 1) + { + string authors = ""; + for (int i = 0; i < pl.Authors.Length; i++) + { + authors += ", " + pl.Authors[i]; + } + Player.SendMessage(p, "Authors: " + authors.Remove(0, 2)); + } + if (!String.IsNullOrEmpty(pl.Description)) Player.SendMessage(p, "Description: " + pl.Description); + } + else { Help(p); return; } + } + if (args[0] == "create" || args[0] == "n" || args[0] == "new") + { + if (args.Length != 2) { Help(p); return; } + if (!System.CodeDom.Compiler.CodeGenerator.IsValidLanguageIndependentIdentifier(args[1])) + { + Player.SendMessage(p, args[1] + " is not a valid class name!"); return; + } + if (!Directory.Exists("extra/plugins/source/" + args[1] + "/")) { Directory.CreateDirectory("extra/plugins/source/" + args[1] + "/"); } + if (File.Exists("")) { Player.SendMessage(p, args[1] + ".cs already exists! Delete it before generating another one."); return; } + File.WriteAllText("extra/plugins/source/" + args[1] + "/" + args[1] + ".cs", PluginManager.Skeleton(args[1])); + Player.SendMessage(p, "New skeleton plugin saved to extra/plugins/source/" + args[1] + "/"); + } + */} + + public override void Help(Player p) + { + Player.SendMessage(p, "/plugin info [plugin] - Displays plugin information"); + Player.SendMessage(p, "/plugin load - Loads a plugin"); + Player.SendMessage(p, "/plugin unload - Unloads a plugin"); + Player.SendMessage(p, "/plugin create - Creates a skeleton plugin class"); + } + } +} diff --git a/MCSong/Commands/CmdPortal.cs b/MCSong/Commands/CmdPortal.cs index 317d59d..376d917 100644 --- a/MCSong/Commands/CmdPortal.cs +++ b/MCSong/Commands/CmdPortal.cs @@ -10,8 +10,9 @@ namespace MCSong public class CmdPortal : Command { public override string name { get { return "portal"; } } - public override string shortcut { get { return "o"; } } - public override string type { get { return "build"; } } + public override string[] aliases { get { return new string[] { "o" }; } } + public override CommandType type { get { return CommandType.Building; } } + public override bool consoleUsable { get { return false; } } public override bool museumUsable { get { return false; } } public override LevelPermission defaultRank { get { return LevelPermission.AdvBuilder; } } public CmdPortal() { } @@ -101,18 +102,24 @@ public void ExitChange(Player p, ushort x, ushort y, ushort z, byte type) foreach (portPos pos in bp.port) { - DataTable Portals = MySQL.fillData("SELECT * FROM `Portals" + pos.portMapName + "` WHERE EntryX=" + (int)pos.x + " AND EntryY=" + (int)pos.y + " AND EntryZ=" + (int)pos.z); - Portals.Dispose(); + SQLiteHelper.SQLResult portalQuery = SQLiteHelper.ExecuteQuery( + $@"SELECT entryx, entryy, entryz, exitmap, exitx, exity, exitz " + + $@"FROM Portals{pos.portMapName} " + + $@"WHERE entryx = {pos.x} AND entryy {pos.y} AND entryz = {pos.z};"); - if (Portals.Rows.Count == 0) + if (portalQuery.rowsAffected <= 0) { - MySQL.executeQuery("INSERT INTO `Portals" + pos.portMapName + "` (EntryX, EntryY, EntryZ, ExitMap, ExitX, ExitY, ExitZ) VALUES (" + (int)pos.x + ", " + (int)pos.y + ", " + (int)pos.z + ", '" + p.level.name + "', " + (int)x + ", " + (int)y + ", " + (int)z + ")"); + SQLiteHelper.ExecuteQuery( + $@"INSERT INTO Portals{pos.portMapName} (entryx, entryy, entryz, exitmap, exitx, exity, exitz) " + + $@"VALUES ({pos.x}, {pos.y}, {pos.z}, '{p.level.name}', {x}, {y}, {z});"); } else { - MySQL.executeQuery("UPDATE `Portals" + pos.portMapName + "` SET ExitMap='" + p.level.name + "', ExitX=" + (int)x + ", ExitY=" + (int)y + ", ExitZ=" + (int)z + " WHERE EntryX=" + (int)pos.x + " AND EntryY=" + (int)pos.y + " AND EntryZ=" + (int)pos.z); + SQLiteHelper.ExecuteQuery( + $@"UPDATE Portals{pos.portMapName} " + + $@"SET exitmap = '{p.level.name}', exitx = {x}, exity = {y}, exitz = {z} " + + $@"WHERE entryx = {pos.x} AND entryy = {pos.y} AND entryz = {pos.z};"); } - //DB if (pos.portMapName == p.level.name) p.SendBlockchange(pos.x, pos.y, pos.z, bp.type); } @@ -129,35 +136,15 @@ public void showPortals(Player p) { p.showPortals = !p.showPortals; - DataTable Portals = MySQL.fillData("SELECT * FROM `Portals" + p.level.name + "`"); + SQLiteHelper.SQLResult portalQuery = SQLiteHelper.ExecuteQuery($@"SELECT entryx, entryy, entryz, exitmap, exitx, exity, exitz FROM Portals{p.level.name};"); - int i; - - if (p.showPortals) - { - for (i = 0; i < Portals.Rows.Count; i++) - { - if (Portals.Rows[i]["ExitMap"].ToString() == p.level.name) - p.SendBlockchange((ushort)Portals.Rows[i]["ExitX"], (ushort)Portals.Rows[i]["ExitY"], (ushort)Portals.Rows[i]["ExitZ"], Block.orange_portal); - p.SendBlockchange((ushort)Portals.Rows[i]["EntryX"], (ushort)Portals.Rows[i]["EntryY"], (ushort)Portals.Rows[i]["EntryZ"], Block.blue_portal); - } - - Player.SendMessage(p, "Now showing &a" + i.ToString() + Server.DefaultColor + " portals."); - } - else + foreach (var row in portalQuery) { - for (i = 0; i < Portals.Rows.Count; i++) - { - if (Portals.Rows[i]["ExitMap"].ToString() == p.level.name) - p.SendBlockchange((ushort)Portals.Rows[i]["ExitX"], (ushort)Portals.Rows[i]["ExitY"], (ushort)Portals.Rows[i]["ExitZ"], Block.air); - - p.SendBlockchange((ushort)Portals.Rows[i]["EntryX"], (ushort)Portals.Rows[i]["EntryY"], (ushort)Portals.Rows[i]["EntryZ"], p.level.GetTile((ushort)Portals.Rows[i]["EntryX"], (ushort)Portals.Rows[i]["EntryY"], (ushort)Portals.Rows[i]["EntryZ"])); - } - - Player.SendMessage(p, "Now hiding portals."); + if (row["exitmap"].Equals(p.level.name)) + p.SendBlockchange(ushort.Parse(row["exitx"]), ushort.Parse(row["exity"]), ushort.Parse(row["exitz"]), p.showPortals ? Block.orange_portal : Block.air); + p.SendBlockchange(ushort.Parse(row["entryx"]), ushort.Parse(row["entryy"]), ushort.Parse(row["entryz"]), p.showPortals ? Block.blue_portal : p.level.GetTile(ushort.Parse(row["entryx"]), ushort.Parse(row["entryy"]), ushort.Parse(row["entryz"]))); } - - Portals.Dispose(); + Player.SendMessage(p, $"Now {(p.showPortals ? $"showing &a{portalQuery.rowsAffected}{Server.DefaultColor}" : "hiding")} portals."); } } } \ No newline at end of file diff --git a/MCSong/Commands/CmdPossess.cs b/MCSong/Commands/CmdPossess.cs index 0200f63..e41a528 100644 --- a/MCSong/Commands/CmdPossess.cs +++ b/MCSong/Commands/CmdPossess.cs @@ -22,8 +22,9 @@ namespace MCSong public class CmdPossess : Command { public override string name { get { return "possess"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "mod"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Moderation; } } + public override bool consoleUsable { get { return false; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.Admin; } } public CmdPossess() { } diff --git a/MCSong/Commands/CmdPromote.cs b/MCSong/Commands/CmdPromote.cs index 8c8f984..8c9bccb 100644 --- a/MCSong/Commands/CmdPromote.cs +++ b/MCSong/Commands/CmdPromote.cs @@ -19,8 +19,9 @@ namespace MCSong public class CmdPromote : Command { public override string name { get { return "promote"; } } - public override string shortcut { get { return "pr"; } } - public override string type { get { return "mod"; } } + public override string[] aliases { get { return new string[] { "pr" }; } } + public override CommandType type { get { return CommandType.Moderation; } } + public override bool consoleUsable { get { return true; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.Operator; } } public CmdPromote() { } diff --git a/MCSong/Commands/CmdRainbow.cs b/MCSong/Commands/CmdRainbow.cs index cbb718a..9ec2405 100644 --- a/MCSong/Commands/CmdRainbow.cs +++ b/MCSong/Commands/CmdRainbow.cs @@ -20,8 +20,9 @@ namespace MCSong public class CmdRainbow : Command { public override string name { get { return "rainbow"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "other"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Building; } } + public override bool consoleUsable { get { return false; } } public override bool museumUsable { get { return false; } } public override LevelPermission defaultRank { get { return LevelPermission.AdvBuilder; } } public CmdRainbow() { } diff --git a/MCSong/Commands/CmdRedo.cs b/MCSong/Commands/CmdRedo.cs index 23bcb67..d356841 100644 --- a/MCSong/Commands/CmdRedo.cs +++ b/MCSong/Commands/CmdRedo.cs @@ -6,8 +6,9 @@ namespace MCSong public class CmdRedo : Command { public override string name { get { return "redo"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "build"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Building; } } + public override bool consoleUsable { get { return false; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.Guest; } } public CmdRedo() { } diff --git a/MCSong/Commands/CmdRenameLvl.cs b/MCSong/Commands/CmdRenameLvl.cs index 274ce7e..a699ceb 100644 --- a/MCSong/Commands/CmdRenameLvl.cs +++ b/MCSong/Commands/CmdRenameLvl.cs @@ -10,8 +10,9 @@ namespace MCSong public class CmdRenameLvl : Command { public override string name { get { return "renamelvl"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "mod"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Moderation; } } + public override bool consoleUsable { get { return true; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.Admin; } } public CmdRenameLvl() { } @@ -41,11 +42,10 @@ public override void Use(Player p, string message) } catch { } - MySQL.executeQuery("RENAME TABLE `Block" + foundLevel.name.ToLower() + "` TO `Block" + newName.ToLower() + - "`, `Portals" + foundLevel.name.ToLower() + "` TO `Portals" + newName.ToLower() + - "`, `Messages" + foundLevel.name.ToLower() + "` TO Messages" + newName.ToLower() + - ", `Zone" + foundLevel.name.ToLower() + "` TO `Zone" + newName.ToLower() + "`"); - + SQLiteHelper.ExecuteQuery($@"ALTER TABLE Blocks{foundLevel.name} RENAME TO Blocks{newName};"); + SQLiteHelper.ExecuteQuery($@"ALTER TABLE Portals{foundLevel.name} RENAME TO Portals{newName};"); + SQLiteHelper.ExecuteQuery($@"ALTER TABLE Messages{foundLevel.name} RENAME TO Messages{newName};"); + SQLiteHelper.ExecuteQuery($@"ALTER TABLE Zones{foundLevel.name} RENAME TO Zones{newName};"); Player.GlobalMessage("Renamed " + foundLevel.name + " to " + newName); } catch (Exception e) { Player.SendMessage(p, "Error when renaming."); Server.ErrorLog(e); } diff --git a/MCSong/Commands/CmdRepeat.cs b/MCSong/Commands/CmdRepeat.cs index fd31f8d..5ef423f 100644 --- a/MCSong/Commands/CmdRepeat.cs +++ b/MCSong/Commands/CmdRepeat.cs @@ -5,8 +5,9 @@ namespace MCSong public class CmdRepeat : Command { public override string name { get { return "repeat"; } } - public override string shortcut { get { return "m"; } } - public override string type { get { return "other"; } } + public override string[] aliases { get { return new string[] { "m" }; } } + public override CommandType type { get { return CommandType.Other; } } + public override bool consoleUsable { get { return false; } } public override bool museumUsable { get { return false; } } public override LevelPermission defaultRank { get { return LevelPermission.Guest; } } public CmdRepeat() { } diff --git a/MCSong/Commands/CmdReplace.cs b/MCSong/Commands/CmdReplace.cs index 30e7726..daedcca 100644 --- a/MCSong/Commands/CmdReplace.cs +++ b/MCSong/Commands/CmdReplace.cs @@ -20,8 +20,9 @@ namespace MCSong public class CmdReplace : Command { public override string name { get { return "replace"; } } - public override string shortcut { get { return "r"; } } - public override string type { get { return "build"; } } + public override string[] aliases { get { return new string[] { "r" }; } } + public override CommandType type { get { return CommandType.Building; } } + public override bool consoleUsable { get { return false; } } public override bool museumUsable { get { return false; } } public override LevelPermission defaultRank { get { return LevelPermission.AdvBuilder; } } public CmdReplace() { } diff --git a/MCSong/Commands/CmdReplaceAll.cs b/MCSong/Commands/CmdReplaceAll.cs index 6899828..fc3a8bf 100644 --- a/MCSong/Commands/CmdReplaceAll.cs +++ b/MCSong/Commands/CmdReplaceAll.cs @@ -21,8 +21,9 @@ namespace MCSong class CmdReplaceAll : Command { public override string name { get { return "replaceall"; } } - public override string shortcut { get { return "ra"; } } - public override string type { get { return "build"; } } + public override string[] aliases { get { return new string[] { "ra" }; } } + public override CommandType type { get { return CommandType.Building; } } + public override bool consoleUsable { get { return false; } } public override bool museumUsable { get { return false; } } public override LevelPermission defaultRank { get { return LevelPermission.Admin; } } public CmdReplaceAll() { } diff --git a/MCSong/Commands/CmdReplaceNot.cs b/MCSong/Commands/CmdReplaceNot.cs index 207cf7f..3747491 100644 --- a/MCSong/Commands/CmdReplaceNot.cs +++ b/MCSong/Commands/CmdReplaceNot.cs @@ -20,8 +20,9 @@ namespace MCSong public class CmdReplaceNot : Command { public override string name { get { return "replacenot"; } } - public override string shortcut { get { return "rn"; } } - public override string type { get { return "build"; } } + public override string[] aliases { get { return new string[] { "rn" }; } } + public override CommandType type { get { return CommandType.Building; } } + public override bool consoleUsable { get { return false; } } public override bool museumUsable { get { return false; } } public override LevelPermission defaultRank { get { return LevelPermission.AdvBuilder; } } public CmdReplaceNot() { } diff --git a/MCSong/Commands/CmdResetBot.cs b/MCSong/Commands/CmdResetBot.cs index 8a9dee8..bded619 100644 --- a/MCSong/Commands/CmdResetBot.cs +++ b/MCSong/Commands/CmdResetBot.cs @@ -21,19 +21,30 @@ namespace MCSong class CmdResetBot : Command { public override string name { get { return "resetbot"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "mod"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Moderation; } } + public override bool consoleUsable { get { return true; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.Operator; } } public CmdResetBot() { } public override void Use(Player p, string message) { - IRCBot.Reset(); + if (message.ToLower() == "global") + { + Player.SendMessage(p, "Reloading the Global Chat bot..."); + //GlobalBot.Reset(); + Player.SendMessage(p, "Global Chat bot was reloaded."); + return; + } + Player.SendMessage(p, "Reloading the IRCBot..."); + //IRCBot.Reset(); + Player.SendMessage(p, "IRCBot was reloaded."); } public override void Help(Player p) { Player.SendMessage(p, "/resetbot - reloads the IRCBot. FOR EMERGENCIES ONLY!"); + Player.SendMessage(p, "/resetbot global - reloads the Global Chat bot."); } } } diff --git a/MCSong/Commands/CmdRestartPhysics.cs b/MCSong/Commands/CmdRestartPhysics.cs index eed7d61..8dc1e72 100644 --- a/MCSong/Commands/CmdRestartPhysics.cs +++ b/MCSong/Commands/CmdRestartPhysics.cs @@ -6,8 +6,9 @@ namespace MCSong public class CmdRestartPhysics : Command { public override string name { get { return "restartphysics"; } } - public override string shortcut { get { return "rp"; } } - public override string type { get { return "build"; } } + public override string[] aliases { get { return new string[] { "rp" }; } } + public override CommandType type { get { return CommandType.Building; } } + public override bool consoleUsable { get { return false; } } public override bool museumUsable { get { return false; } } public override LevelPermission defaultRank { get { return LevelPermission.AdvBuilder; } } public CmdRestartPhysics() { } diff --git a/MCSong/Commands/CmdRestore.cs b/MCSong/Commands/CmdRestore.cs index 3595273..edf53a6 100644 --- a/MCSong/Commands/CmdRestore.cs +++ b/MCSong/Commands/CmdRestore.cs @@ -23,8 +23,9 @@ namespace MCSong class CmdRestore : Command { public override string name { get { return "restore"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "mod"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Moderation; } } + public override bool consoleUsable { get { return false; } } public override bool museumUsable { get { return false; } } public override LevelPermission defaultRank { get { return LevelPermission.Operator; } } public CmdRestore() { } diff --git a/MCSong/Commands/CmdRetrieve.cs b/MCSong/Commands/CmdRetrieve.cs index ddba7b6..768d95b 100644 --- a/MCSong/Commands/CmdRetrieve.cs +++ b/MCSong/Commands/CmdRetrieve.cs @@ -9,8 +9,9 @@ namespace MCSong public class CmdRetrieve : Command { public override string name { get { return "retrieve"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "build"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Building; } } + public override bool consoleUsable { get { return false; } } public override bool museumUsable { get { return false; } } public override LevelPermission defaultRank { get { return LevelPermission.AdvBuilder; } } public List list = new List(); diff --git a/MCSong/Commands/CmdReveal.cs b/MCSong/Commands/CmdReveal.cs index 6464a8c..a3e9c6a 100644 --- a/MCSong/Commands/CmdReveal.cs +++ b/MCSong/Commands/CmdReveal.cs @@ -6,8 +6,9 @@ namespace MCSong public class CmdReveal : Command { public override string name { get { return "reveal"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "mod"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Moderation; } } + public override bool consoleUsable { get { return false; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.AdvBuilder; } } public CmdReveal() { } diff --git a/MCSong/Commands/CmdRide.cs b/MCSong/Commands/CmdRide.cs index 5ab6d89..c54e514 100644 --- a/MCSong/Commands/CmdRide.cs +++ b/MCSong/Commands/CmdRide.cs @@ -21,8 +21,9 @@ namespace MCSong public class CmdRide : Command { public override string name { get { return "ride"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "other"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Other; } } + public override bool consoleUsable { get { return false; } } public override bool museumUsable { get { return false; } } public override LevelPermission defaultRank { get { return LevelPermission.Guest; } } public CmdRide() { } diff --git a/MCSong/Commands/CmdRoll.cs b/MCSong/Commands/CmdRoll.cs index 00fcf1c..4a8f1bb 100644 --- a/MCSong/Commands/CmdRoll.cs +++ b/MCSong/Commands/CmdRoll.cs @@ -19,8 +19,9 @@ namespace MCSong public class CmdRoll : Command { public override string name { get { return "roll"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "other"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Other; } } + public override bool consoleUsable { get { return true; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.Operator; } } public CmdRoll() { } @@ -33,6 +34,7 @@ public override void Use(Player p, string message) try { max = int.Parse(message.Split(' ')[1]); } catch { max = 7; } + if (p == null) { Player.GlobalMessage(Server.DefaultColor + "Console [&a" + Server.ZallState + Server.DefaultColor + "] rolled a &a" + rand.Next(Math.Min(min, max), Math.Max(min, max) + 1).ToString() + Server.DefaultColor + " (" + Math.Min(min, max) + "|" + Math.Max(min, max) + ")"); return; } Player.GlobalMessage(p.color + p.name + Server.DefaultColor + " rolled a &a" + rand.Next(Math.Min(min, max), Math.Max(min, max) + 1).ToString() + Server.DefaultColor + " (" + Math.Min(min, max) + "|" + Math.Max(min, max) + ")"); } public override void Help(Player p) diff --git a/MCSong/Commands/CmdRules.cs b/MCSong/Commands/CmdRules.cs index 839c920..c7d890b 100644 --- a/MCSong/Commands/CmdRules.cs +++ b/MCSong/Commands/CmdRules.cs @@ -22,8 +22,9 @@ namespace MCSong class CmdRules : Command { public override string name { get { return "rules"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "information"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Information; } } + public override bool consoleUsable { get { return true; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.Banned; } } public CmdRules() { } diff --git a/MCSong/Commands/CmdSave.cs b/MCSong/Commands/CmdSave.cs index 92bdd1d..993f91d 100644 --- a/MCSong/Commands/CmdSave.cs +++ b/MCSong/Commands/CmdSave.cs @@ -21,8 +21,9 @@ namespace MCSong public class CmdSave : Command { public override string name { get { return "save"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "mod"; } } + public override string[] aliases { get { return new string[] { "mapsave" }; } } + public override CommandType type { get { return CommandType.Moderation; } } + public override bool consoleUsable { get { return false; } } public override bool museumUsable { get { return false; } } public override LevelPermission defaultRank { get { return LevelPermission.Operator; } } public CmdSave() { } @@ -95,7 +96,7 @@ public override void Use(Player p, string message) public override void Help(Player p) { Player.SendMessage(p, "/save - Saves the level you are currently in"); - Player.SendMessage(p, "/save all - Saves all loaded levels."); + Player.SendMessage(p, "/save all - Saves support loaded levels."); Player.SendMessage(p, "/save - Saves the specified map."); Player.SendMessage(p, "/save - Backups the map with a given restore name"); } diff --git a/MCSong/Commands/CmdSay.cs b/MCSong/Commands/CmdSay.cs index 2999da2..a8e399d 100644 --- a/MCSong/Commands/CmdSay.cs +++ b/MCSong/Commands/CmdSay.cs @@ -21,8 +21,9 @@ namespace MCSong class CmdSay : Command { public override string name { get { return "say"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "other"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Other; } } + public override bool consoleUsable { get { return true; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.Operator; } } public CmdSay() { } @@ -33,7 +34,7 @@ public override void Use(Player p, string message) message = message.Replace("%", "&"); // Alow colors in global messages Player.GlobalChat(p, message, false); message = message.Replace("&", ""); // converts the MC color codes to IRC. Doesn't seem to work with multiple colors - IRCBot.Say(message); + //IRCBot.Say(message); } public override void Help(Player p) { diff --git a/MCSong/Commands/CmdSend.cs b/MCSong/Commands/CmdSend.cs index 82d2073..f8fc6b6 100644 --- a/MCSong/Commands/CmdSend.cs +++ b/MCSong/Commands/CmdSend.cs @@ -9,8 +9,9 @@ namespace MCSong public class CmdSend : Command { public override string name { get { return "send"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "other"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Other; } } + public override bool consoleUsable { get { return true; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.Builder; } } public CmdSend() { } @@ -20,20 +21,24 @@ public override void Use(Player p, string message) if (message == "" || message.IndexOf(' ') == -1) { Help(p); return; } Player who = Player.Find(message.Split(' ')[0]); - + string whoFrom; string whoTo; if (who != null) whoTo = who.name; else whoTo = message.Split(' ')[0]; + if (p != null) whoFrom = p.name; + else whoFrom = "Console"; message = message.Substring(message.IndexOf(' ') + 1); - //DB - MySQL.executeQuery("CREATE TABLE if not exists `Inbox" + whoTo + "` (PlayerFrom CHAR(20), TimeSent DATETIME, Contents VARCHAR(255));"); - MySQL.executeQuery("INSERT INTO `Inbox" + whoTo + "` (PlayerFrom, TimeSent, Contents) VALUES ('" + p.name + "', '" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "', '" + message.Replace("'", "\\'") + "')"); - //DB + SQLiteHelper.ExecuteQuery($@"CREATE TABLE IF NOT EXISTS Inbox (id INTEGER PRIMARY KEY, " + + $@"to INTEGER, from INTEGER, sent TEXT, message TEXT, " + + $@"FOREIGN KEY (to) REFERENCES Player(id), FOREIGN KEY (from) REFERENCES Player(id));"); + + SQLiteHelper.ExecuteQuery($@"INSERT INTO Inbox (to, from, sent, message) VALUES " + + $@"((SELECT id FROM Players WHERE name = '{whoTo}'), {p.userID}, {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}, {message})"); Player.SendMessage(p, "Message sent to &5" + whoTo + "."); - if (who != null) who.SendMessage("Message recieved from &5" + p.name + Server.DefaultColor + "."); + if (who != null) who.SendMessage("Message recieved from &5" + whoFrom + Server.DefaultColor + "."); } public override void Help(Player p) { diff --git a/MCSong/Commands/CmdServerReport.cs b/MCSong/Commands/CmdServerReport.cs index 7956830..3b4f941 100644 --- a/MCSong/Commands/CmdServerReport.cs +++ b/MCSong/Commands/CmdServerReport.cs @@ -24,8 +24,9 @@ namespace MCSong public class CmdServerReport : Command { public override string name { get { return "serverreport"; } } - public override string shortcut { get { return "sr"; } } - public override string type { get { return "information"; } } + public override string[] aliases { get { return new string[] { "sr" }; } } + public override CommandType type { get { return CommandType.Information; } } + public override bool consoleUsable { get { return true; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.Admin; } } public CmdServerReport() { } diff --git a/MCSong/Commands/CmdSetRank.cs b/MCSong/Commands/CmdSetRank.cs index e64f9d6..b34e26c 100644 --- a/MCSong/Commands/CmdSetRank.cs +++ b/MCSong/Commands/CmdSetRank.cs @@ -19,8 +19,9 @@ namespace MCSong public class CmdSetRank : Command { public override string name { get { return "setrank"; } } - public override string shortcut { get { return "rank"; } } - public override string type { get { return "mod"; } } + public override string[] aliases { get { return new string[] { "rank" }; } } + public override CommandType type { get { return CommandType.Moderation; } } + public override bool consoleUsable { get { return true; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.Operator; } } public CmdSetRank() { } diff --git a/MCSong/Commands/CmdSetspawn.cs b/MCSong/Commands/CmdSetspawn.cs index fb36c61..c29f2cc 100644 --- a/MCSong/Commands/CmdSetspawn.cs +++ b/MCSong/Commands/CmdSetspawn.cs @@ -20,8 +20,9 @@ namespace MCSong public class CmdSetspawn : Command { public override string name { get { return "setspawn"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "mod"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Moderation; } } + public override bool consoleUsable { get { return false; } } public override bool museumUsable { get { return false; } } public override LevelPermission defaultRank { get { return LevelPermission.Operator; } } public CmdSetspawn() { } diff --git a/MCSong/Commands/CmdShutdown.cs b/MCSong/Commands/CmdShutdown.cs new file mode 100644 index 0000000..7443d36 --- /dev/null +++ b/MCSong/Commands/CmdShutdown.cs @@ -0,0 +1,74 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading; + +namespace MCSong +{ + public class CmdShutdown : Command + { + public override string name { get { return "shutdown"; } } + public override string[] aliases { get { return new string[] { "sd", "close", "stop", "exit" }; } } + public override CommandType type { get { return CommandType.Moderation; } } + public override bool consoleUsable { get { return true; } } + public override bool museumUsable { get { return true; } } + public override LevelPermission defaultRank { get { return LevelPermission.Nobody; } } + + private Thread th; + private int seconds = 10; + private int temp = 10; + public override void Use(Player p, string message) + { + if (message.ToLower().Trim() == "cancel") + { + Server.cancelShutdown = true; + return; + } + if (Server.shuttingDown) + { + Player.SendMessage(p, "Server is already shutting down."); + return; + } + Server.cancelShutdown = false; + Server.shuttingDown = true; + try { seconds = Convert.ToInt32(message); } + catch { seconds = 10; } + + if (seconds < 0 || seconds > 120) + seconds = 10; + temp = seconds; + Server.s.Log("Shutdown initiated by " + ((p == null) ? "Console" : p.name)); + th = new Thread(new ThreadStart(shutdown)); + th.Start(); + } + public override void Help(Player p) + { + Player.SendMessage(p, "/shutdown [seconds] - Shuts down the server with a countdown"); + Player.SendMessage(p, "/shutdown cancel - Cancels a server shutdown"); + Player.SendMessage(p, "[seconds] must be between 0 and 120, and will default to 10"); + } + private void shutdown() + { + while (seconds > 0) + { + if (Server.cancelShutdown) + { + Server.s.Log("SERVER SHUTDOWN CANCELLED"); + Player.GlobalMessage("SERVER SHUTDOWN CANCELLED"); + Server.shuttingDown = false; + th.Abort(); + return; + } + if (seconds == temp || seconds == 120 || seconds == 90 || seconds == 60 || seconds == 45 || seconds == 30 || seconds <= 15) + { + Server.s.Log("SERVER SHUTDOWN IN " + seconds + " SECONDS"); + Player.GlobalMessage("SERVER SHUTDOWN IN " + seconds + " SECONDS"); + } + Thread.Sleep(1000); + seconds--; + } + MCSong_.Gui.Program.ExitProgram(false); + } + } +} \ No newline at end of file diff --git a/MCSong/Commands/CmdSlap.cs b/MCSong/Commands/CmdSlap.cs index 5ab61d3..5af14da 100644 --- a/MCSong/Commands/CmdSlap.cs +++ b/MCSong/Commands/CmdSlap.cs @@ -19,8 +19,9 @@ namespace MCSong public class CmdSlap : Command { public override string name { get { return "slap"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "other"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Other; } } + public override bool consoleUsable { get { return true; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.AdvBuilder; } } public CmdSlap() { } diff --git a/MCSong/Commands/CmdSpawn.cs b/MCSong/Commands/CmdSpawn.cs index d281014..6bf4a0f 100644 --- a/MCSong/Commands/CmdSpawn.cs +++ b/MCSong/Commands/CmdSpawn.cs @@ -19,8 +19,9 @@ namespace MCSong public class CmdSpawn : Command { public override string name { get { return "spawn"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "other"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Other; } } + public override bool consoleUsable { get { return false; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.Banned; } } public CmdSpawn() { } diff --git a/MCSong/Commands/CmdSpheroid.cs b/MCSong/Commands/CmdSpheroid.cs index 457b223..0b53bb1 100644 --- a/MCSong/Commands/CmdSpheroid.cs +++ b/MCSong/Commands/CmdSpheroid.cs @@ -6,8 +6,9 @@ namespace MCSong public class CmdSpheroid : Command { public override string name { get { return "spheroid"; } } - public override string shortcut { get { return "e"; } } - public override string type { get { return "build"; } } + public override string[] aliases { get { return new string[] { "e", "sphere" }; } } + public override CommandType type { get { return CommandType.Building; } } + public override bool consoleUsable { get { return false; } } public override bool museumUsable { get { return false; } } public override LevelPermission defaultRank { get { return LevelPermission.Builder; } } public CmdSpheroid() { } diff --git a/MCSong/Commands/CmdSpin.cs b/MCSong/Commands/CmdSpin.cs index 2b3659d..ed50f2c 100644 --- a/MCSong/Commands/CmdSpin.cs +++ b/MCSong/Commands/CmdSpin.cs @@ -6,8 +6,9 @@ namespace MCSong public class CmdSpin : Command { public override string name { get { return "spin"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "build"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Building; } } + public override bool consoleUsable { get { return false; } } public override bool museumUsable { get { return false; } } public override LevelPermission defaultRank { get { return LevelPermission.AdvBuilder; } } public CmdSpin() { } diff --git a/MCSong/Commands/CmdStairs.cs b/MCSong/Commands/CmdStairs.cs index 38c707f..c23d7d9 100644 --- a/MCSong/Commands/CmdStairs.cs +++ b/MCSong/Commands/CmdStairs.cs @@ -20,8 +20,9 @@ namespace MCSong public class CmdStairs : Command { public override string name { get { return "stairs"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "build"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Building; } } + public override bool consoleUsable { get { return false; } } public override bool museumUsable { get { return false; } } public override LevelPermission defaultRank { get { return LevelPermission.AdvBuilder; } } public CmdStairs() { } diff --git a/MCSong/Commands/CmdStatic.cs b/MCSong/Commands/CmdStatic.cs index 45273cf..114d52a 100644 --- a/MCSong/Commands/CmdStatic.cs +++ b/MCSong/Commands/CmdStatic.cs @@ -20,8 +20,9 @@ namespace MCSong public class CmdStatic : Command { public override string name { get { return "static"; } } - public override string shortcut { get { return "t"; } } - public override string type { get { return "build"; } } + public override string[] aliases { get { return new string[] { "t" }; } } + public override CommandType type { get { return CommandType.Building; } } + public override bool consoleUsable { get { return false; } } public override bool museumUsable { get { return false; } } public override LevelPermission defaultRank { get { return LevelPermission.AdvBuilder; } } public CmdStatic() { } diff --git a/MCSong/Commands/CmdStatus.cs b/MCSong/Commands/CmdStatus.cs new file mode 100644 index 0000000..639cd8f --- /dev/null +++ b/MCSong/Commands/CmdStatus.cs @@ -0,0 +1,81 @@ +using System; + +namespace MCSong +{ + class CmdStatus : Command + { + public override string name { get { return "status"; } } + public override string[] aliases { get { return new string[] { "stat" }; } } + public override CommandType type { get { return CommandType.Information; } } + public override bool consoleUsable { get { return false; } } + public override bool museumUsable { get { return true; } } + public override LevelPermission defaultRank { get { return LevelPermission.Guest; } } + + public override void Use(Player p, string message) + { + if (!p.extensions.Contains(Extension.MessageTypes)) { Help(p); return; } + string[] args = message.ToLower().Split(' '); + if (args.Length < 2) { Help(p); return; } + string custom = ""; + string type = ""; + switch (args[1]) + { + case "custom": + if (args.Length < 3) { Help(p); return; } + custom = message.Substring(message.IndexOf(' ', message.IndexOf(args[2]) - 1)); + type = args[1]; + break; + case "compass": + case "default": + case "game": + case "motd": + case "block": + case "clear": + type = args[1]; + break; + default: + type = "default"; + break; + } + int i = 0; + try + { + i = int.Parse(args[0]); + if (i < 1 || 1 > 3) { Help(p); return; } + } + catch { Help(p); return; } + switch (i) + { + case 1: + p.status1 = type; + p.status1c = (type == "custom") ? custom : ""; + break; + case 2: + p.status2 = type; + p.status2c = (type == "custom") ? custom : ""; + break; + case 3: + p.status3 = type; + p.status3c = (type == "custom") ? custom : ""; + break; + } + p.UpdateStatusMessages(); + Player.SendMessage(p, "Your status message was changed to " + type + ((type == "custom") ? ": " + custom + "." : ".")); + } + + public override void Help(Player p) + { + if (p.extensions.Contains(Extension.MessageTypes)) + { + Player.SendMessage(p, "/status <1/2/3> [type] - Sets one of your status messages to a server preset"); + Player.SendMessage(p, "/status <1/2/3> custom - Sets one of your status messages to a custom message"); + Player.SendMessage(p, "Valid types: compass, game, motd, block, default, clear"); + } + else + { + Player.SendMessage(p, "This command requires the MessageTypes extension."); + Player.SendMessage(p, "See /cpe for more information."); + } + } + } +} diff --git a/MCSong/Commands/CmdStore.cs b/MCSong/Commands/CmdStore.cs index 01cb34e..0ba4a9f 100644 --- a/MCSong/Commands/CmdStore.cs +++ b/MCSong/Commands/CmdStore.cs @@ -9,8 +9,9 @@ namespace MCSong public class CmdStore : Command { public override string name { get { return "store"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "build"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Building; } } + public override bool consoleUsable { get { return false; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.AdvBuilder; } } public List list = new List(); diff --git a/MCSong/Commands/CmdSummon.cs b/MCSong/Commands/CmdSummon.cs index 09352d3..cabb321 100644 --- a/MCSong/Commands/CmdSummon.cs +++ b/MCSong/Commands/CmdSummon.cs @@ -20,8 +20,9 @@ namespace MCSong public class CmdSummon : Command { public override string name { get { return "summon"; } } - public override string shortcut { get { return "s"; } } - public override string type { get { return "other"; } } + public override string[] aliases { get { return new string[] { "s" }; } } + public override CommandType type { get { return CommandType.Other; } } + public override bool consoleUsable { get { return false; } } public override bool museumUsable { get { return false; } } public override LevelPermission defaultRank { get { return LevelPermission.AdvBuilder; } } public CmdSummon() { } @@ -51,7 +52,7 @@ public override void Use(Player p, string message) public override void Help(Player p) { Player.SendMessage(p, "/summon - Summons a player to your position."); - Player.SendMessage(p, "/summon all - Summons all players in the map"); + Player.SendMessage(p, "/summon support - Summons all players in the map"); } } } \ No newline at end of file diff --git a/MCSong/Commands/CmdTColor.cs b/MCSong/Commands/CmdTColor.cs index c92b234..c882826 100644 --- a/MCSong/Commands/CmdTColor.cs +++ b/MCSong/Commands/CmdTColor.cs @@ -22,8 +22,9 @@ namespace MCSong public class CmdTColor : Command { public override string name { get { return "tcolor"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "other"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Other; } } + public override bool consoleUsable { get { return true; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.Admin; } } public CmdTColor() { } @@ -42,7 +43,7 @@ public override void Use(Player p, string message) { who.titlecolor = ""; Player.GlobalChat(who, who.color + who.name + Server.DefaultColor + " had their title color removed.", false); - MySQL.executeQuery("UPDATE Players SET title_color = '' WHERE Name = '" + who.name + "'"); + SQLiteHelper.ExecuteQuery($@"UPDATE Players SET tcolor = '' WHERE id = {who.userID};"); who.SetPrefix(); return; } @@ -53,9 +54,9 @@ public override void Use(Player p, string message) else if (color == who.titlecolor) { Player.SendMessage(p, who.name + " already has that title color."); return; } else { - MySQL.executeQuery("UPDATE Players SET title_color = '" + c.Name(color) + "' WHERE Name = '" + who.name + "'"); Player.GlobalChat(who, who.color + who.name + Server.DefaultColor + " had their title color changed to " + color + c.Name(color) + Server.DefaultColor + ".", false); who.titlecolor = color; + SQLiteHelper.ExecuteQuery($@"UPDATE Players SET tcolor = '{color}' WHERE id = {who.userID};"); who.SetPrefix(); } } diff --git a/MCSong/Commands/CmdTake.cs b/MCSong/Commands/CmdTake.cs index 919234b..ba69d09 100644 --- a/MCSong/Commands/CmdTake.cs +++ b/MCSong/Commands/CmdTake.cs @@ -5,8 +5,9 @@ namespace MCSong public class CmdTake : Command { public override string name { get { return "take"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "other"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Other; } } + public override bool consoleUsable { get { return true; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.Admin; } } public CmdTake() { } diff --git a/MCSong/Commands/CmdTeam.cs b/MCSong/Commands/CmdTeam.cs index 0219b2e..f07a9fe 100644 --- a/MCSong/Commands/CmdTeam.cs +++ b/MCSong/Commands/CmdTeam.cs @@ -8,8 +8,9 @@ namespace MCSong public class CmdTeam : Command { public override string name { get { return "team"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "other"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Other; } } + public override bool consoleUsable { get { return false; } } public CmdTeam() { } public override bool museumUsable { get { return false; } } public override LevelPermission defaultRank { get { return LevelPermission.Builder; } } diff --git a/MCSong/Commands/CmdTempBan.cs b/MCSong/Commands/CmdTempBan.cs index 4e980f2..c7c92e6 100644 --- a/MCSong/Commands/CmdTempBan.cs +++ b/MCSong/Commands/CmdTempBan.cs @@ -20,8 +20,9 @@ namespace MCSong public class CmdTempBan : Command { public override string name { get { return "tempban"; } } - public override string shortcut { get { return "tb"; } } - public override string type { get { return "moderation"; } } + public override string[] aliases { get { return new string[] { "tb" }; } } + public override CommandType type { get { return CommandType.Moderation; } } + public override bool consoleUsable { get { return true; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.Builder; } } public CmdTempBan() { } diff --git a/MCSong/Commands/CmdText.cs b/MCSong/Commands/CmdText.cs index e719178..766f60a 100644 --- a/MCSong/Commands/CmdText.cs +++ b/MCSong/Commands/CmdText.cs @@ -9,8 +9,9 @@ namespace MCSong public class CmdText : Command { public override string name { get { return "text"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "other"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Other; } } + public override bool consoleUsable { get { return true; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.AdvBuilder; } } public CmdText() { } diff --git a/MCSong/Commands/CmdTime.cs b/MCSong/Commands/CmdTime.cs index d4dfab2..f66cf69 100644 --- a/MCSong/Commands/CmdTime.cs +++ b/MCSong/Commands/CmdTime.cs @@ -19,8 +19,9 @@ namespace MCSong public class CmdTime : Command { public override string name { get { return "time"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "information"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Information; } } + public override bool consoleUsable { get { return true; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.Banned; } } public CmdTime() { } diff --git a/MCSong/Commands/CmdTimer.cs b/MCSong/Commands/CmdTimer.cs index 180c7ba..5608c5f 100644 --- a/MCSong/Commands/CmdTimer.cs +++ b/MCSong/Commands/CmdTimer.cs @@ -7,8 +7,9 @@ namespace MCSong public class CmdTimer : Command { public override string name { get { return "timer"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "other"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Other; } } + public override bool consoleUsable { get { return false; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.Operator; } } public CmdTimer() { } diff --git a/MCSong/Commands/CmdTitle.cs b/MCSong/Commands/CmdTitle.cs index 392712f..ffd0164 100644 --- a/MCSong/Commands/CmdTitle.cs +++ b/MCSong/Commands/CmdTitle.cs @@ -5,8 +5,9 @@ namespace MCSong public class CmdTitle : Command { public override string name { get { return "title"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "other"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Other; } } + public override bool consoleUsable { get { return true; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.Admin; } } public CmdTitle() { } @@ -18,8 +19,7 @@ public override void Use(Player p, string message) int pos = message.IndexOf(' '); Player who = Player.Find(message.Split(' ')[0]); if (who == null) { Player.SendMessage(p, "Could not find player."); return; } - - string query; + string newTitle = ""; if (message.Split(' ').Length > 1) newTitle = message.Substring(pos + 1); else @@ -27,8 +27,7 @@ public override void Use(Player p, string message) who.title = ""; who.SetPrefix(); Player.GlobalChat(null, who.color + who.name + Server.DefaultColor + " had their title removed.", false); - query = "UPDATE Players SET Title = '' WHERE Name = '" + who.name + "'"; - MySQL.executeQuery(query); + SQLiteHelper.ExecuteQuery($@"UPDATE Players SET title = '' WHERE id = {who.userID};"); return; } @@ -36,9 +35,6 @@ public override void Use(Player p, string message) { newTitle = newTitle.ToString().Trim().Replace("[", ""); newTitle = newTitle.Replace("]", ""); - /* if (newTitle[0].ToString() != "[") newTitle = "[" + newTitle; - if (newTitle.Trim()[newTitle.Trim().Length - 1].ToString() != "]") newTitle = newTitle.Trim() + "]"; - if (newTitle[newTitle.Length - 1].ToString() != " ") newTitle = newTitle + " "; */ } if (newTitle.Length > 17) { Player.SendMessage(p, "Title must be under 17 letters."); return; } @@ -49,18 +45,11 @@ public override void Use(Player p, string message) if (newTitle != "") Player.GlobalChat(null, who.color + who.name + Server.DefaultColor + " was given the title of &b[" + newTitle + "]", false); - else Player.GlobalChat(null, who.color + who.prefix + who.name + Server.DefaultColor + " had their title removed.", false); - - if (newTitle == "") - { - query = "UPDATE Players SET Title = '' WHERE Name = '" + who.name + "'"; - } else - { - query = "UPDATE Players SET Title = '" + newTitle.Replace("'", "\'") + "' WHERE Name = '" + who.name + "'"; - } - MySQL.executeQuery(query); + Player.GlobalChat(null, who.color + who.prefix + who.name + Server.DefaultColor + " had their title removed.", false); + who.title = newTitle; + SQLiteHelper.ExecuteQuery($@"UPDATE Players SET title = '{SQLiteHelper.EscapeQuotes(newTitle)}' WHERE id = {who.userID};"); who.SetPrefix(); } public override void Help(Player p) diff --git a/MCSong/Commands/CmdTnt.cs b/MCSong/Commands/CmdTnt.cs index 37454c8..78eae3c 100644 --- a/MCSong/Commands/CmdTnt.cs +++ b/MCSong/Commands/CmdTnt.cs @@ -6,8 +6,9 @@ namespace MCSong public class CmdTnt : Command { public override string name { get { return "tnt"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "other"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Other; } } + public override bool consoleUsable { get { return false; } } public override bool museumUsable { get { return false; } } public override LevelPermission defaultRank { get { return LevelPermission.Builder; } } public CmdTnt() { } diff --git a/MCSong/Commands/CmdTp.cs b/MCSong/Commands/CmdTp.cs index 1063ee8..334fea1 100644 --- a/MCSong/Commands/CmdTp.cs +++ b/MCSong/Commands/CmdTp.cs @@ -20,8 +20,9 @@ namespace MCSong public class CmdTp : Command { public override string name { get { return "tp"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "other"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Other; } } + public override bool consoleUsable { get { return false; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.Builder; } } public CmdTp() { } diff --git a/MCSong/Commands/CmdTpZone.cs b/MCSong/Commands/CmdTpZone.cs index 802a8b2..1d3176a 100644 --- a/MCSong/Commands/CmdTpZone.cs +++ b/MCSong/Commands/CmdTpZone.cs @@ -8,8 +8,9 @@ namespace MCSong public class CmdTpZone : Command { public override string name { get { return "tpzone"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "other"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Other; } } + public override bool consoleUsable { get { return false; } } public override bool museumUsable { get { return false; } } public override LevelPermission defaultRank { get { return LevelPermission.Builder; } } public CmdTpZone() { } diff --git a/MCSong/Commands/CmdTree.cs b/MCSong/Commands/CmdTree.cs index e809639..57e09b3 100644 --- a/MCSong/Commands/CmdTree.cs +++ b/MCSong/Commands/CmdTree.cs @@ -6,8 +6,9 @@ namespace MCSong public class CmdTree : Command { public override string name { get { return "tree"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "build"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Building; } } + public override bool consoleUsable { get { return false; } } public override bool museumUsable { get { return false; } } public override LevelPermission defaultRank { get { return LevelPermission.Builder; } } public CmdTree() { } diff --git a/MCSong/Commands/CmdTrust.cs b/MCSong/Commands/CmdTrust.cs index c63ae9c..874d75f 100644 --- a/MCSong/Commands/CmdTrust.cs +++ b/MCSong/Commands/CmdTrust.cs @@ -19,8 +19,9 @@ namespace MCSong public class CmdTrust : Command { public override string name { get { return "trust"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "moderation"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Moderation; } } + public override bool consoleUsable { get { return true; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.Operator; } } public CmdTrust() { } diff --git a/MCSong/Commands/CmdUnban.cs b/MCSong/Commands/CmdUnban.cs index e84aab3..4ebd593 100644 --- a/MCSong/Commands/CmdUnban.cs +++ b/MCSong/Commands/CmdUnban.cs @@ -19,8 +19,9 @@ namespace MCSong public class CmdUnban : Command { public override string name { get { return "unban"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "mod"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Moderation; } } + public override bool consoleUsable { get { return true; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.Operator; } } public CmdUnban() { } diff --git a/MCSong/Commands/CmdUnbanip.cs b/MCSong/Commands/CmdUnbanip.cs index cff4bd7..471795b 100644 --- a/MCSong/Commands/CmdUnbanip.cs +++ b/MCSong/Commands/CmdUnbanip.cs @@ -25,8 +25,9 @@ public class CmdUnbanip : Command Regex regex = new Regex(@"^([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(\." + "([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}$"); public override string name { get { return "unbanip"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "mod"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Moderation; } } + public override bool consoleUsable { get { return true; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.Operator; } } public CmdUnbanip() { } @@ -40,36 +41,13 @@ public override void Use(Player p, string message) Player who = Player.Find(message); if (who == null) { - DataTable ip; - int tryCounter = 0; - rerun: try - { - ip = MySQL.fillData("SELECT IP FROM Players WHERE Name = '" + message + "'"); - } - catch (Exception e) - { - tryCounter++; - if (tryCounter < 10) - { - goto rerun; - } - else - { - Server.ErrorLog(e); - Player.SendMessage(p, "There was a database error fetching the IP address. It has been logged."); - return; - } - } - if (ip.Rows.Count > 0) - { - message = ip.Rows[0]["IP"].ToString(); - } - else + SQLiteHelper.SQLResult foundIP = SQLiteHelper.ExecuteQuery($@"SELECT ip FROM Players WHERE name = '{message}';"); + if (foundIP.rowsAffected <= 0) { Player.SendMessage(p, "Unable to find an IP address for that user."); return; } - ip.Dispose(); + message = foundIP[0]["ip"]; } else { diff --git a/MCSong/Commands/CmdUndo.cs b/MCSong/Commands/CmdUndo.cs index 339b272..53024ad 100644 --- a/MCSong/Commands/CmdUndo.cs +++ b/MCSong/Commands/CmdUndo.cs @@ -7,8 +7,9 @@ namespace MCSong public class CmdUndo : Command { public override string name { get { return "undo"; } } - public override string shortcut { get { return "u"; } } - public override string type { get { return "build"; } } + public override string[] aliases { get { return new string[] { "u" }; } } + public override CommandType type { get { return CommandType.Building; } } + public override bool consoleUsable { get { return false; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.Guest; } } public CmdUndo() { } diff --git a/MCSong/Commands/CmdUnload.cs b/MCSong/Commands/CmdUnload.cs index 74d626c..f5ee01d 100644 --- a/MCSong/Commands/CmdUnload.cs +++ b/MCSong/Commands/CmdUnload.cs @@ -21,8 +21,9 @@ namespace MCSong public class CmdUnload : Command { public override string name { get { return "unload"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "mod"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Moderation; } } + public override bool consoleUsable { get { return true; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.Operator; } } public CmdUnload() { } @@ -63,7 +64,7 @@ public override void Use(Player p, string message) } public override void Help(Player p) { - Player.SendMessage(p, "/unload [level] - Unloads a level."); + Player.SendMessage(p, "/unload - Unloads a level."); Player.SendMessage(p, "/unload empty - Unloads an empty level."); } } diff --git a/MCSong/Commands/CmdUnloaded.cs b/MCSong/Commands/CmdUnloaded.cs index 8b3094f..7dd5d55 100644 --- a/MCSong/Commands/CmdUnloaded.cs +++ b/MCSong/Commands/CmdUnloaded.cs @@ -7,8 +7,9 @@ namespace MCSong public class CmdUnloaded : Command { public override string name { get { return "unloaded"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "information"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Information; } } + public override bool consoleUsable { get { return true; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.Guest; } } public CmdUnloaded() { } diff --git a/MCSong/Commands/CmdUpdate.cs b/MCSong/Commands/CmdUpdate.cs index 9b04f88..a96cdc2 100644 --- a/MCSong/Commands/CmdUpdate.cs +++ b/MCSong/Commands/CmdUpdate.cs @@ -21,16 +21,16 @@ namespace MCSong public class CmdUpdate : Command { public override string name { get { return "update"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "information"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Information; } } + public override bool consoleUsable { get { return true; } } public override bool museumUsable { get { return true; } } - public override LevelPermission defaultRank { get { return LevelPermission.AdvBuilder; } } + public override LevelPermission defaultRank { get { return LevelPermission.Operator; } } public CmdUpdate() { } public override void Use(Player p, string message) { - if (p == null || p.group.Permission > LevelPermission.AdvBuilder) MCLawl_.Gui.Program.UpdateCheck(false, p); - else Player.SendMessage(p, "Ask an Operator to do it!"); + MCSong_.Gui.Program.UpdateCheck(false, p); } public override void Help(Player p) { diff --git a/MCSong/Commands/CmdView.cs b/MCSong/Commands/CmdView.cs index 1e81457..f087cf9 100644 --- a/MCSong/Commands/CmdView.cs +++ b/MCSong/Commands/CmdView.cs @@ -9,8 +9,9 @@ namespace MCSong public class CmdView : Command { public override string name { get { return "view"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "other"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Other; } } + public override bool consoleUsable { get { return true; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.Banned; } } public CmdView() { } diff --git a/MCSong/Commands/CmdViewRanks.cs b/MCSong/Commands/CmdViewRanks.cs index a24c60e..b3cb422 100644 --- a/MCSong/Commands/CmdViewRanks.cs +++ b/MCSong/Commands/CmdViewRanks.cs @@ -21,8 +21,9 @@ namespace MCSong public class CmdViewRanks : Command { public override string name { get { return "viewranks"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "information"; } } + public override string[] aliases { get { return new string[] { "showranks", "vr" }; } } + public override CommandType type { get { return CommandType.Information; } } + public override bool consoleUsable { get { return true; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.Guest; } } public CmdViewRanks() { } diff --git a/MCSong/Commands/CmdVoice.cs b/MCSong/Commands/CmdVoice.cs index 5f7f73e..053f81f 100644 --- a/MCSong/Commands/CmdVoice.cs +++ b/MCSong/Commands/CmdVoice.cs @@ -8,8 +8,9 @@ namespace MCSong public class CmdVoice : Command { public override string name { get { return "voice"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "mod"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Moderation; } } + public override bool consoleUsable { get { return true; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.Operator; } } public CmdVoice() { } diff --git a/MCSong/Commands/CmdWeather.cs b/MCSong/Commands/CmdWeather.cs new file mode 100644 index 0000000..9f2323d --- /dev/null +++ b/MCSong/Commands/CmdWeather.cs @@ -0,0 +1,83 @@ +/* + Copyright 2015 MCSong, Licensed under the + Educational Community License, Version 2.0 (the "License"); you may + not use this file except in compliance with the License. You may + obtain a copy of the License at + + http://www.osedu.org/licenses/ECL-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an "AS IS" + BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + or implied. See the License for the specific language governing + permissions and limitations under the License. +*/ +using System; + +namespace MCSong +{ + public class CmdWeather : Command + { + public override string name { get { return "weather"; } } + public override string[] aliases { get { return new string[] { }; } } + public override CommandType type { get { return CommandType.Other; } } + public override bool consoleUsable { get { return false; } } + public override bool museumUsable { get { return true; } } + public override LevelPermission defaultRank { get { return LevelPermission.Operator; } } + + public override void Use(Player p, string message) + { + message = message.Trim().ToLower(); + switch (message) + { + case "sun": + if (p.level.weather == Weather.SUNNY) + { + Player.SendMessage(p, "It's already sunny!"); + return; + } + p.level.weather = Weather.SUNNY; + TellWeather(p.level, "The sun came out!"); + break; + case "rain": + if (p.level.weather == Weather.RAINING) + { + Player.SendMessage(p, "It's already raining!"); + return; + } + p.level.weather = Weather.RAINING; + TellWeather(p.level, "It started to rain!"); + break; + case "snow": + if (p.level.weather == Weather.SNOWING) + { + Player.SendMessage(p, "It's already snowing!"); + return; + } + p.level.weather = Weather.SNOWING; + TellWeather(p.level, "It started to snow!"); + break; + default: + Help(p); + return; + } + p.level.players.ForEach(delegate (Player pl) + { + pl.SendWeather(p.level.weather); + }); + } + public override void Help(Player p) + { + Player.SendMessage(p, "/weather [sun/rain/snow] - Sets the weather on your map"); + } + + private void TellWeather(Level l, string message) + { + l.players.ForEach(delegate (Player p) + { + if (p.cpe && p.extensions.Contains(Extension.EnvWeatherType)) + Player.SendMessage(p, message); + }); + } + } +} \ No newline at end of file diff --git a/MCSong/Commands/CmdWhere.cs b/MCSong/Commands/CmdWhere.cs new file mode 100644 index 0000000..5d4d5eb --- /dev/null +++ b/MCSong/Commands/CmdWhere.cs @@ -0,0 +1,31 @@ +using System; + +namespace MCSong +{ + class CmdWhere : Command + { + public override string[] aliases { get { return new string[] { }; } } + + public override bool consoleUsable { get { return false; } } + + public override LevelPermission defaultRank { get { return LevelPermission.Guest; } } + + public override bool museumUsable { get { return true; } } + + public override string name { get { return "where"; } } + + public override CommandType type { get { return CommandType.Information; } } + + public override void Help(Player p) + { + Player.SendMessage(p, "/where - Tells you your current position"); + } + + public override void Use(Player p, string message) + { + Player.SendMessage(p, "Level: " + p.level.name); + Player.SendMessage(p, "Coordinates: " + Math.Truncate((double)p.pos[0] / 32) + ", " + Math.Truncate((double)p.pos[1] / 32) + ", " + Math.Truncate((double)p.pos[2]/32)); + Player.SendMessage(p, "Rotation: " + p.rot[0] + ", " + p.rot[1]); + } + } +} diff --git a/MCSong/Commands/CmdWhisper.cs b/MCSong/Commands/CmdWhisper.cs index 26dc6a3..491c7df 100644 --- a/MCSong/Commands/CmdWhisper.cs +++ b/MCSong/Commands/CmdWhisper.cs @@ -5,8 +5,9 @@ namespace MCSong public class CmdWhisper : Command { public override string name { get { return "whisper"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "other"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Other; } } + public override bool consoleUsable { get { return false; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.Guest; } } public CmdWhisper() { } diff --git a/MCSong/Commands/CmdWhitelist.cs b/MCSong/Commands/CmdWhitelist.cs index 3715a30..6ba499c 100644 --- a/MCSong/Commands/CmdWhitelist.cs +++ b/MCSong/Commands/CmdWhitelist.cs @@ -22,8 +22,9 @@ namespace MCSong public class CmdWhitelist : Command { public override string name { get { return "whitelist"; } } - public override string shortcut { get { return "w"; } } - public override string type { get { return "mod"; } } + public override string[] aliases { get { return new string[] { "w" }; } } + public override CommandType type { get { return CommandType.Moderation; } } + public override bool consoleUsable { get { return true; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.Operator; } } public CmdWhitelist() { } diff --git a/MCSong/Commands/CmdWhoip.cs b/MCSong/Commands/CmdWhoip.cs index 3b41526..cb1620e 100644 --- a/MCSong/Commands/CmdWhoip.cs +++ b/MCSong/Commands/CmdWhoip.cs @@ -2,16 +2,15 @@ using System.Collections.Generic; using System.Data; using System.IO; -//using MySql.Data.MySqlClient; -//using MySql.Data.Types; namespace MCSong { public class CmdWhoip : Command { public override string name { get { return "whoip"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "information"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Information; } } + public override bool consoleUsable { get { return true; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.Operator; } } public CmdWhoip() { } @@ -19,22 +18,17 @@ public CmdWhoip() { } public override void Use(Player p, string message) { if (message == "") { Help(p); return; } - if (message.IndexOf("'") != -1) { Player.SendMessage(p, "Cannot parse request."); return; } - DataTable playerDb = MySQL.fillData("SELECT Name FROM Players WHERE IP='" + message + "'"); - - if (playerDb.Rows.Count == 0) { Player.SendMessage(p, "Could not find anyone with this IP"); return; } - - string playerNames = "Players with this IP: "; - - for (int i = 0; i < playerDb.Rows.Count; i++) + SQLiteHelper.SQLResult ipQuery = SQLiteHelper.ExecuteQuery($@"SELECT name FROM Players WHERE ip = '{message}';"); + if (ipQuery.rowsAffected <= 0) { - playerNames += playerDb.Rows[i]["Name"] + ", "; + Player.SendMessage(p, "Could not find anyone with this IP."); + return; } - playerNames = playerNames.Remove(playerNames.Length - 2); - - Player.SendMessage(p, playerNames); - playerDb.Dispose(); + List players = new List(); + foreach (SQLiteHelper.SQLRow row in ipQuery) + players.Add(row["name"]); + Player.SendMessage(p, $"Found {players.Count} player{(players.Count > 1 ? "s" : "")} with this IP: {string.Join(", ", players)}"); } public override void Help(Player p) { diff --git a/MCSong/Commands/CmdWhois.cs b/MCSong/Commands/CmdWhois.cs index 57174f3..6ecf6a5 100644 --- a/MCSong/Commands/CmdWhois.cs +++ b/MCSong/Commands/CmdWhois.cs @@ -20,8 +20,9 @@ namespace MCSong public class CmdWhois : Command { public override string name { get { return "whois"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "other"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Other; } } + public override bool consoleUsable { get { return true; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.Banned; } } public CmdWhois() { } @@ -43,7 +44,7 @@ public override void Use(Player p, string message) Player.SendMessage(p, "> > &cdied &a" + who.overallDeath + Server.DefaultColor + " times"); Player.SendMessage(p, "> > &bmodified &a" + who.overallBlocks + Server.DefaultColor + " blocks, &a" + who.loginBlocks + Server.DefaultColor + " since logging in."); string storedTime = Convert.ToDateTime(DateTime.Now.Subtract(who.timeLogged).ToString()).ToString("HH:mm:ss"); - Player.SendMessage(p, "> > been logged in for &a" + storedTime); + Player.SendMessage(p, "> > been logged in for &a" + storedTime + Server.DefaultColor + " using " + ((who.clientName.ToLower().Trim().EndsWith("client")) ? "the " : "") + "&a" + who.clientName); Player.SendMessage(p, "> > first logged into the server on &a" + who.firstLogin.ToString("yyyy-MM-dd") + " at " + who.firstLogin.ToString("HH:mm:ss")); Player.SendMessage(p, "> > logged in &a" + who.totalLogins + Server.DefaultColor + " times, &c" + who.totalKicked + Server.DefaultColor + " of which ended in a kick."); Player.SendMessage(p, "> > " + Awards.awardAmount(who.name) + " awards"); @@ -51,23 +52,23 @@ public override void Use(Player p, string message) bool skip = false; if (p != null) if (p.group.Permission <= LevelPermission.AdvBuilder) skip = true; if (!skip) + { + string givenIP; + if (Server.bannedIP.Contains(who.ip)) givenIP = "&8" + who.ip + ", which is banned"; + else givenIP = who.ip; + Player.SendMessage(p, "> > the IP of " + givenIP); + if (Server.useWhitelist) { - string givenIP; - if (Server.bannedIP.Contains(who.ip)) givenIP = "&8" + who.ip + ", which is banned"; - else givenIP = who.ip; - Player.SendMessage(p, "> > the IP of " + givenIP); - if (Server.useWhitelist) - { - if (Server.whiteList.Contains(who.name)) - { - Player.SendMessage(p, "> > Player is &fWhitelisted"); - } - } - if (Server.devs.Contains(who.name.ToLower())) + if (Server.whiteList.Contains(who.name)) { - Player.SendMessage(p, Server.DefaultColor + "> > Player is a &9Developer"); + Player.SendMessage(p, "> > Player is &fWhitelisted"); } } + if (Server.devs.Contains(who.name.ToLower())) + { + Player.SendMessage(p, Server.DefaultColor + "> > Player is a &9Developer"); + } + } } else { Player.SendMessage(p, "\"" + message + "\" is offline! Using /whowas instead."); Command.all.Find("whowas").Use(p, message); } } diff --git a/MCSong/Commands/CmdWhowas.cs b/MCSong/Commands/CmdWhowas.cs index 73d69da..5d44f09 100644 --- a/MCSong/Commands/CmdWhowas.cs +++ b/MCSong/Commands/CmdWhowas.cs @@ -13,18 +13,15 @@ software distributed under the License is distributed on an "AS IS" permissions and limitations under the License. */ using System; -using System.Collections.Generic; -using System.Data; -//using MySql.Data.MySqlClient; -//using MySql.Data.Types; namespace MCSong { public class CmdWhowas : Command { public override string name { get { return "whowas"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "information"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Information; } } + public override bool consoleUsable { get { return true; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.Banned; } } public CmdWhowas() { } @@ -32,56 +29,36 @@ public CmdWhowas() { } public override void Use(Player p, string message) { if (message == "") { Help(p); return; } - Player pl = Player.Find(message); + Player pl = Player.Find(message); if (pl != null && !pl.hidden) - { - Player.SendMessage(p, pl.color + pl.name + Server.DefaultColor + " is online, using /whois instead."); + { + Player.SendMessage(p, pl.color + pl.name + Server.DefaultColor + " is online, using /whois instead."); Command.all.Find("whois").Use(p, message); - return; + return; } - if (message.IndexOf("'") != -1) { Player.SendMessage(p, "Cannot parse request."); return; } - string FoundRank = Group.findPlayer(message.ToLower()); - DataTable playerDb = MySQL.fillData("SELECT * FROM Players WHERE Name='" + message + "'"); - if (playerDb.Rows.Count == 0) { Player.SendMessage(p, Group.Find(FoundRank).color + message + Server.DefaultColor + " has the rank of " + Group.Find(FoundRank).color + FoundRank); return; } - - Player.SendMessage(p, Group.Find(FoundRank).color + playerDb.Rows[0]["Title"] + " " + message + Server.DefaultColor + " has :"); - Player.SendMessage(p, "> > the rank of \"" + Group.Find(FoundRank).color + FoundRank); - try - { - if (!Group.Find("Nobody").commands.Contains("pay") && !Group.Find("Nobody").commands.Contains("give") && !Group.Find("Nobody").commands.Contains("take")) Player.SendMessage(p, "> > &a" + playerDb.Rows[0]["Money"] + Server.DefaultColor + " " + Server.moneys); - } - catch { } - Player.SendMessage(p, "> > &cdied &a" + playerDb.Rows[0]["TotalDeaths"] + Server.DefaultColor + " times"); - Player.SendMessage(p, "> > &bmodified &a" + playerDb.Rows[0]["totalBlocks"] + Server.DefaultColor + " blocks."); - Player.SendMessage(p, "> > was last seen on &a" + playerDb.Rows[0]["LastLogin"]); - Player.SendMessage(p, "> > first logged into the server on &a" + playerDb.Rows[0]["FirstLogin"]); - Player.SendMessage(p, "> > logged in &a" + playerDb.Rows[0]["totalLogin"] + Server.DefaultColor + " times, &c" + playerDb.Rows[0]["totalKicked"] + Server.DefaultColor + " of which ended in a kick."); - Player.SendMessage(p, "> > " + Awards.awardAmount(message) + " awards"); - - bool skip = false; - if (p != null) if (p.group.Permission <= LevelPermission.AdvBuilder) skip = true; - - if (!skip) + SQLiteHelper.SQLResult playerQuery = SQLiteHelper.ExecuteQuery($@"SELECT title, color, tcolor, money, deaths, blocks, first_login, last_login, logins, kicks, ip FROM Players WHERE name = '{message}';"); + if (playerQuery.rowsAffected <= 0) { - if (Server.bannedIP.Contains(playerDb.Rows[0]["IP"].ToString())) - playerDb.Rows[0]["IP"] = "&8" + playerDb.Rows[0]["IP"] + ", which is banned"; - Player.SendMessage(p, "> > the IP of " + playerDb.Rows[0]["IP"]); - if (Server.useWhitelist) - { - if (Server.whiteList.Contains(message.ToLower())) - { - Player.SendMessage(p, "> > Player is &fWhitelisted"); - } - } - if (Server.devs.Contains(message.ToLower())) - { - Player.SendMessage(p, Server.DefaultColor + "> > Player is a &9Developer"); - } + Player.SendMessage(p, $"{Group.Find(FoundRank).color}{message}{Server.DefaultColor} has the rank of {Group.Find(FoundRank).color}{FoundRank}{Server.DefaultColor}."); + return; } - playerDb.Dispose(); + SQLiteHelper.SQLRow row = playerQuery[0]; + Player.SendMessage(p, $"{row["color"]}{(string.IsNullOrEmpty(row["title"]) ? "" : $"[{row["tcolor"]}{row["title"]}{row["color"]}] ")}{message}{Server.DefaultColor}:"); + Player.SendMessage(p, $"> > has the rank of {Group.Find(FoundRank).color}{FoundRank}"); + Player.SendMessage(p, $"> > $a{row["money"]}{Server.DefaultColor} {Server.moneys}"); + Player.SendMessage(p, $"> > &cdied &a{row["deaths"]}{Server.DefaultColor} times"); + Player.SendMessage(p, $"> > was last seen on &a{row["last_login"]}"); + Player.SendMessage(p, $"> > first logged into the server on &a{row["first_login"]}"); + Player.SendMessage(p, $"> > logged in &a{row["logins"]}{Server.DefaultColor} times, &c{row["kicks"]}{Server.DefaultColor} of which ended in a kick"); + Player.SendMessage(p, $"> > has &a{Awards.awardAmount(message)}{Server.DefaultColor} awards"); + Player.SendMessage(p, $"> > has the IP of {(Server.bannedIP.Contains(row["ip"]) ? $"&8{row["ip"]}{Server.DefaultColor}, which is banned" : row["ip"])}"); + if (Server.useWhitelist && Server.whiteList.Contains(message.ToLower())) + Player.SendMessage(p, "> > Player is &fwhitelisted"); + if (Server.devs.Contains(message.ToLower())) + Player.SendMessage(p, "> > Player is a &9developer"); } public override void Help(Player p) { diff --git a/MCSong/Commands/CmdWrite.cs b/MCSong/Commands/CmdWrite.cs index 9694e03..5e25c53 100644 --- a/MCSong/Commands/CmdWrite.cs +++ b/MCSong/Commands/CmdWrite.cs @@ -6,8 +6,9 @@ namespace MCSong public class CmdWrite : Command { public override string name { get { return "write"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "build"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Building; } } + public override bool consoleUsable { get { return false; } } public override bool museumUsable { get { return false; } } public override LevelPermission defaultRank { get { return LevelPermission.Operator; } } public CmdWrite() { } diff --git a/MCSong/Commands/CmdZone.cs b/MCSong/Commands/CmdZone.cs index e33f6e1..3265881 100644 --- a/MCSong/Commands/CmdZone.cs +++ b/MCSong/Commands/CmdZone.cs @@ -1,15 +1,14 @@ using System; using System.Collections.Generic; -//using MySql.Data.MySqlClient; -//using MySql.Data.Types; namespace MCSong { public class CmdZone : Command { public override string name { get { return "zone"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "mod"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Moderation; } } + public override bool consoleUsable { get { return false; } } public override bool museumUsable { get { return false; } } public override LevelPermission defaultRank { get { return LevelPermission.Operator; } } public CmdZone() { } @@ -54,23 +53,17 @@ public override void Use(Player p, string message) } else { - for (int i = 0; i < p.level.ZoneList.Count; i++) - { - Level.Zone Zn = p.level.ZoneList[i]; - MySQL.executeQuery("DELETE FROM `Zone" + p.level.name + "` WHERE Owner='" + Zn.Owner + "' AND SmallX='" + Zn.smallX + "' AND SMALLY='" + Zn.smallY + "' AND SMALLZ='" + Zn.smallZ + "' AND BIGX='" + Zn.bigX + "' AND BIGY='" + Zn.bigY + "' AND BIGZ='" + Zn.bigZ + "'"); - - Player.SendMessage(p, "Zone deleted for &b" + Zn.Owner); - p.level.ZoneList.Remove(p.level.ZoneList[i]); - if (i == p.level.ZoneList.Count) { Player.SendMessage(p, "Finished removing all zones"); return; } - i--; - } + SQLiteHelper.SQLResult zonesQuery = SQLiteHelper.ExecuteQuery($@"DELETE FROM Zones{p.level.name};"); + Player.SendMessage(p, $"Deleted {(zonesQuery.rowsAffected >= 0 ? $"{zonesQuery.rowsAffected}" : "all")} zones."); + return; } } if (p.group.Permission < LevelPermission.Operator) { - Player.SendMessage(p, "Setting zones is reserved for OP+"); return; + Player.SendMessage(p, "Setting zones is reserved for OP+"); + return; } if (Group.Find(message.Split(' ')[1]) != null) @@ -133,9 +126,8 @@ public void Blockchange2(Player p, ushort x, ushort y, ushort z, byte type) p.level.ZoneList.Add(Zn); - //DB - MySQL.executeQuery("INSERT INTO `Zone" + p.level.name + "` (SmallX, SmallY, SmallZ, BigX, BigY, BigZ, Owner) VALUES (" + Zn.smallX + ", " + Zn.smallY + ", " + Zn.smallZ + ", " + Zn.bigX + ", " + Zn.bigY + ", " + Zn.bigZ + ", '" + Zn.Owner + "')"); - //DB + SQLiteHelper.ExecuteQuery($@"INSERT INTO Zone{p.level.name} (smallx, smally, smallz, bigx, bigy, bigz, owner) " + + $@"VALUES ({Zn.smallX}, {Zn.smallY}, {Zn.smallZ}, {Zn.bigX}, {Zn.bigY}, {Zn.bigZ}, '{Zn.Owner}');"); Player.SendMessage(p, "Added zone for &b" + cpos.Owner); } diff --git a/MCSong/Commands/Command.cs b/MCSong/Commands/Command.cs index 0c57d53..910f02b 100644 --- a/MCSong/Commands/Command.cs +++ b/MCSong/Commands/Command.cs @@ -14,27 +14,66 @@ permissions and limitations under the License. */ using System; using System.Collections.Generic; -using MCSong.Commands; namespace MCSong { + public enum CommandType + { + Building, + Moderation, + Information, + Game, + Other + } + public abstract class Command { + /// + /// The name of the command (what comes after the '/') + /// public abstract string name { get; } - public abstract string shortcut { get; } - //public abstract string[] aliases { get; } [TODO] - public abstract string type { get; } + /// + /// The command's aliases or shortcuts + /// + public abstract string[] aliases { get; } + /// + /// The command's type; Determines which /help submenu to display it under + /// + public abstract CommandType type { get; } + /// + /// Whether the command can be used in museums + /// Block-altering commands should be set to false + /// public abstract bool museumUsable { get; } + /// + /// Whether this command can safely be used by the console + /// + public abstract bool consoleUsable { get; } + /// + /// The default permission required to use the command + /// public abstract LevelPermission defaultRank { get; } + /// + /// What happens when the command is used + /// + /// The player using the command (null = console) + /// The command message (everything after "/command ") public abstract void Use(Player p, string message); + /// + /// What to display under /help for this command + /// + /// The player who used /help public abstract void Help(Player p); public static CommandList all = new CommandList(); public static CommandList core = new CommandList(); + /// + /// Adds core (built-in) commands to the command list + /// public static void InitAll() { // Development Commands - DO NOT USE - //all.Add(new CmdHeartbeat()); + all.Add(new CmdHeartbeat());// Dev-only perms //all.Add(new CmdListcommands()); // Building Commands @@ -84,6 +123,7 @@ public static void InitAll() all.Add(new CmdBotRemove()); all.Add(new CmdBotSummon()); all.Add(new CmdClearBlockChanges()); + all.Add(new CmdClickdistance()); all.Add(new CmdCmdSet()); all.Add(new CmdCrashServer()); all.Add(new CmdDeleteLvl()); @@ -120,6 +160,7 @@ public static void InitAll() all.Add(new CmdSave()); all.Add(new CmdSetRank()); all.Add(new CmdSetspawn()); + all.Add(new CmdShutdown()); all.Add(new CmdTempBan()); all.Add(new CmdTrust()); all.Add(new CmdUnban()); @@ -132,9 +173,12 @@ public static void InitAll() // Information Commands all.Add(new CmdAbout()); all.Add(new CmdAfk()); + all.Add(new CmdAliases()); all.Add(new CmdBlocks()); all.Add(new CmdClones()); all.Add(new CmdDevs()); + all.Add(new CmdExtensions()); + all.Add(new CmdGCRules()); all.Add(new CmdHasirc()); all.Add(new CmdHelp()); all.Add(new CmdHost()); @@ -149,14 +193,18 @@ public static void InitAll() all.Add(new CmdPlayers()); all.Add(new CmdRules()); all.Add(new CmdServerReport()); + all.Add(new CmdStatus()); all.Add(new CmdTime()); all.Add(new CmdUnloaded()); all.Add(new CmdUpdate()); all.Add(new CmdViewRanks()); + all.Add(new CmdWhere()); all.Add(new CmdWhoip()); all.Add(new CmdWhowas()); // Other Commands + all.Add(new CmdAdminChat()); + all.Add(new CmdAgree()); all.Add(new CmdAward()); all.Add(new CmdAwardMod()); all.Add(new CmdAwards()); @@ -184,9 +232,11 @@ public static void InitAll() all.Add(new CmdMuseum()); all.Add(new CmdOpChat()); all.Add(new CmdPay()); + all.Add(new CmdPWeather()); all.Add(new CmdRainbow()); all.Add(new CmdRepeat()); all.Add(new CmdRide()); + all.Add(new CmdPlugin()); all.Add(new CmdRoll()); all.Add(new CmdSay()); all.Add(new CmdSend()); @@ -203,6 +253,7 @@ public static void InitAll() all.Add(new CmdTp()); all.Add(new CmdTpZone()); all.Add(new CmdView()); + all.Add(new CmdWeather()); all.Add(new CmdWhisper()); all.Add(new CmdWhois()); diff --git a/MCSong/Commands/CommandList.cs b/MCSong/Commands/CommandList.cs index 2534478..7e0864b 100644 --- a/MCSong/Commands/CommandList.cs +++ b/MCSong/Commands/CommandList.cs @@ -51,10 +51,22 @@ public Command Find(string name) { name = name.ToLower(); foreach (Command cmd in commands) { - if (cmd.name == name.ToLower() || cmd.shortcut == name.ToLower()) { return cmd; } + if (cmd.name == name.ToLower() || hasAlias(cmd, name)) { return cmd; } } return null; } + private bool hasAlias(Command cmd, string alias) + { + foreach (string s in cmd.aliases) + { + if (s == alias.ToLower()) + { + return true; + } + } + return false; + } + public string FindShort(string shortcut) { if (shortcut == "") return ""; @@ -62,7 +74,7 @@ public string FindShort(string shortcut) shortcut = shortcut.ToLower(); foreach (Command cmd in commands) { - if (cmd.shortcut == shortcut) return cmd.name; + if (hasAlias(cmd, shortcut)) return cmd.name; } return ""; } diff --git a/MCSong/Commands/cmdRestart.cs b/MCSong/Commands/cmdRestart.cs index dfb2b71..96797dc 100644 --- a/MCSong/Commands/cmdRestart.cs +++ b/MCSong/Commands/cmdRestart.cs @@ -9,8 +9,9 @@ namespace MCSong public class CmdRestart : Command { public override string name { get { return "restart"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return "mod"; } } + public override string[] aliases { get { return new string[] { "" }; } } + public override CommandType type { get { return CommandType.Moderation; } } + public override bool consoleUsable { get { return true; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.Admin; } } public CmdRestart() { } @@ -18,8 +19,8 @@ public CmdRestart() { } public override void Use(Player p, string message) { if (message != "") { Help(p); return; } - MCLawl_.Gui.Program.restartMe(); - //MCLawl_.Gui.Program.ExitProgram(true); + MCSong_.Gui.Program.restartMe(); + //MCSong_.Gui.Program.ExitProgram(true); } public override void Help(Player p) { diff --git a/MCSong/Events.cs b/MCSong/Events.cs new file mode 100644 index 0000000..6e66545 --- /dev/null +++ b/MCSong/Events.cs @@ -0,0 +1,72 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MCSong +{ + public sealed partial class Player + { + public bool noKick = false, noSendMessage = false, noJoin = false, noBlockchange = false; + + // Kick + public delegate void OnPlayerKickedEventHandler(Player p, string reason); + public static event OnPlayerKickedEventHandler OnPlayerKickedEvent = null; + public delegate void OnKickedEventHandler(string reason); + public event OnKickedEventHandler OnKickedEvent = null; + // SendMessage + public delegate void OnPlayerSendMessageEventHandler(Player p, string message); + public static event OnPlayerSendMessageEventHandler OnPlayerSendMessageEvent = null; + public delegate void OnSendMessageEventHandler(string message); + public event OnSendMessageEventHandler OnSendMessageEvent = null; + // Join + public delegate void OnPlayerJoinEventHandler(Player p); + public static event OnPlayerJoinEventHandler OnPlayerJoinEvent = null; + // Blockchange + public delegate void OnPlayerBlockchangeEventHandler(Player p, ushort x, ushort y, ushort z, byte type); + public static event OnPlayerBlockchangeEventHandler OnPlayerBlockchangeEvent = null; + public delegate void OnBlockchangeEventHandler(ushort x, ushort y, ushort z, byte type); + public event OnBlockchangeEventHandler OnBlockchangeEvent = null; + } + + public partial class Level + { + // Load + public delegate void OnLevelLoadEventHandler(string name); + public static event OnLevelLoadEventHandler OnLevelLoadEvent = null; + // Unload + public delegate void OnLevelUnloadEventHandler(string name); + public static event OnLevelUnloadEventHandler OnLevelUnloadEvent = null; + public delegate void OnUnloadEventHandler(); + public event OnUnloadEventHandler OnUnloadEvent = null; + // Physics + public delegate void OnPhysChangeEventHandler(int level); + public event OnPhysChangeEventHandler OnPhysChangeEvent = null; + public delegate void OnLevelPhysChangeEventHandler();// [TODO] add name/phys level to this one? + public static event OnLevelPhysChangeEventHandler OnLevelPhysChangeEvent = null; + } + /* + * + * Player Events: + * MCSong.Player.OnPlayerKickedEvent(Player p, string reason) + * #MCSong.Player.OnKickedEvent(string reason) + * MCSong.Player.OnPlayerSendMessageEvent(Player p, string message) + * #MCSong.Player.OnSendMessageEvent(string message) + * MCSong.Player.OnPlayerJoinEvent(Player p) + * MCSong.Player.OnPlayerBlockchangeEvent(Player p, ushort x, ushort y, ushort z, byte type) + * #MCSong.Player.OnBlockchangeEvent(ushort x, ushort y, ushort z, byte type) + * Booleans: noKick, noSendMessage, noJoin, noBlockchange + * + * Level Events: + * MCSong.Level.OnLevelLoadEvent(string name) + * MCSong.Level.OnLevelUnloadEvent(string name) + * #MCSong.Level.OnUnloadEvent() + * MCSong.Level.OnLevelPhysChangeEvent(string name) + * #MCSong.Level.OnPhysChangeEvent(int level) + * Booleans: + * + * Server Events: + * + */ +} diff --git a/MCSong/Extension.cs b/MCSong/Extension.cs new file mode 100644 index 0000000..6d04430 --- /dev/null +++ b/MCSong/Extension.cs @@ -0,0 +1,110 @@ +/* + Copyright 2015 MCSong, Licensed under the + Educational Community License, Version 2.0 (the "License"); you may + not use this file except in compliance with the License. You may + obtain a copy of the License at + + http://www.osedu.org/licenses/ECL-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an "AS IS" + BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + or implied. See the License for the specific language governing + permissions and limitations under the License. +*/ +using System; +using System.Collections; +using System.Collections.Generic; + +namespace MCSong +{ + public class Extension + { + public string name { get; private set; } + public int version { get; private set; } + public string[] description { get; private set; } + public bool implemented { get; private set; } + private Extension(string n, int v, string[] d, bool i = true) + { + name = n; + version = v; + description = d; + implemented = i; + all.Add(this); + names.Add(n.ToLower()); + } + public static readonly ExtensionList all = new ExtensionList(); + public static readonly List names = new List(); + + // Supported + public static readonly Extension ClickDistance = new Extension("ClickDistance", 1, new string[] { "-Can restrict or extend a player's reach, up to 1023 blocks or down to 0" }); + public static readonly Extension CustomBlocks = new Extension("CustomBlocks", 1, new string[] { "-Adds new visually distinct blocks to the game", "-There are currently 16 custom blocks:", "-Cobblestone Slab, Rope, Sandstone, Snow, Fire, Light Pink Wool, Forest Green Wool, Brown Wool, Deep Blue Wool, Turquoise Wool, Ice, Ceramic Tile, Magma, Pillar, Crate, Stone Brick" }); + public static readonly Extension HackControl = new Extension("HackControl", 1, new string[] { "-Allows servers to control which client cheats/hacks can be used" }); + public static readonly Extension MessageTypes = new Extension("MessageTypes", 1, new string[] { "-Adds new on-screen message types, including centered announcements and status messages in the top right corner" }); + public static readonly Extension EnvWeatherType = new Extension("EnvWeatherType", 1, new string[] { "-Allows servers to create rain and snow" }); + public static readonly Extension HeldBlock = new Extension("HeldBlock", 1, new string[] { "-Allows the server to know which block a player is holding, to improve features like /cuboid and /follow" }); + public static readonly Extension EnvColors = new Extension("EnvColors", 1, new string[] { "-Allows the server to make maps more unique by altering environment colors" }); + + // Unsupported + + public static readonly Extension EmoteFix = new Extension("EmoteFix", 1, new string[] { "-Improves the appearance of emotes (smileys) in chat" }, false); + public static readonly Extension TextHotKey = new Extension("TextHotKey", 1, new string[] { "-Allows players to set hotkeys for certain server commands" }, false); + public static readonly Extension ExtPlayerList = new Extension("ExtPlayerList", 2, new string[] { "-Provides more flexibility in naming of players and loading of skins, autocompletion, and player tab-list display" }, false); + public static readonly Extension SelectionCuboid = new Extension("SelectionCuboid", 1, new string[] { "-Allows players to see highlighted selections in the map when using building commands" }, false); + public static readonly Extension BlockPermissions = new Extension("BlockPermissions", 1, new string[] { "-Prevents players from placing/breaking certain block types" }, false); + public static readonly Extension ChangeModel = new Extension("ChangeModel", 1, new string[] { "-Lets servers spawn animal and monster models" }, false); + public static readonly Extension EnvMapAppearance = new Extension("EnvMapAppearance", 1, new string[] { "-Allows customization of map edge textures" }, false); + public static readonly Extension PlayerClick = new Extension("PlayerClick", 1, new string[] { "-Allows servers to receive details of every mouse click players make" }, false); + + + public override bool Equals(object obj) + { + if (obj is Extension) + { + Extension e = (Extension)obj; + return (e.name == name && e.version == version); + } + return false; + } + + public override int GetHashCode() + { + var hashCode = 1545369197; + hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(name); + hashCode = hashCode * -1521134295 + version.GetHashCode(); + return hashCode; + } + } + public class ExtensionList : CollectionBase + { + public void Add(Extension e) { List.Add(e); } + public Extension Find(string name) + { + foreach (Extension e in List) + { + if (e.name.ToLower() == name.ToLower()) + return e; + } + return null; + } + public bool Contains(Extension e) + { + return List.Contains(e); + } + public override string ToString() + { + if (List.Count == 0) + return "none"; + string temp = ""; + foreach (Extension e in this) + { + temp += "," + e.name; + } + return temp.Remove(0, 1); + } + public override int GetHashCode() + { + return base.GetHashCode(); + } + } +} \ No newline at end of file diff --git a/MCSong/GUI/BackupManager.Designer.cs b/MCSong/GUI/BackupManager.Designer.cs new file mode 100644 index 0000000..ddcab8b --- /dev/null +++ b/MCSong/GUI/BackupManager.Designer.cs @@ -0,0 +1,193 @@ +namespace MCSong.Gui +{ + partial class BackupManager + { + /// + /// 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() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(BackupManager)); + this.panel1 = new System.Windows.Forms.Panel(); + this.label2 = new System.Windows.Forms.Label(); + this.label1 = new System.Windows.Forms.Label(); + this.liBackups = new System.Windows.Forms.ListBox(); + this.liMaps = new System.Windows.Forms.ListBox(); + this.btnCreate = new System.Windows.Forms.Button(); + this.btnRestore = new System.Windows.Forms.Button(); + this.btnDelete = new System.Windows.Forms.Button(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.txtTime = new System.Windows.Forms.TextBox(); + this.lblTime = new System.Windows.Forms.Label(); + this.panel1.SuspendLayout(); + this.SuspendLayout(); + // + // panel1 + // + this.panel1.Controls.Add(this.lblTime); + this.panel1.Controls.Add(this.txtTime); + this.panel1.Controls.Add(this.groupBox1); + this.panel1.Controls.Add(this.btnDelete); + this.panel1.Controls.Add(this.btnRestore); + this.panel1.Controls.Add(this.btnCreate); + this.panel1.Controls.Add(this.label2); + this.panel1.Controls.Add(this.label1); + this.panel1.Controls.Add(this.liBackups); + this.panel1.Controls.Add(this.liMaps); + this.panel1.Dock = System.Windows.Forms.DockStyle.Fill; + this.panel1.Location = new System.Drawing.Point(0, 0); + this.panel1.Name = "panel1"; + this.panel1.Size = new System.Drawing.Size(366, 179); + this.panel1.TabIndex = 0; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(131, 7); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(52, 13); + this.label2.TabIndex = 13; + this.label2.Text = "Backups:"; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(12, 7); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(41, 13); + this.label1.TabIndex = 12; + this.label1.Text = "Levels:"; + // + // liBackups + // + this.liBackups.FormattingEnabled = true; + this.liBackups.Location = new System.Drawing.Point(122, 29); + this.liBackups.Name = "liBackups"; + this.liBackups.ScrollAlwaysVisible = true; + this.liBackups.Size = new System.Drawing.Size(113, 147); + this.liBackups.TabIndex = 11; + this.liBackups.SelectedIndexChanged += new System.EventHandler(this.liBackups_SelectedIndexChanged); + // + // liMaps + // + this.liMaps.FormattingEnabled = true; + this.liMaps.Location = new System.Drawing.Point(3, 29); + this.liMaps.Name = "liMaps"; + this.liMaps.ScrollAlwaysVisible = true; + this.liMaps.Size = new System.Drawing.Size(113, 147); + this.liMaps.TabIndex = 10; + this.liMaps.SelectedIndexChanged += new System.EventHandler(this.liMaps_SelectedIndexChanged); + // + // btnCreate + // + this.btnCreate.Location = new System.Drawing.Point(250, 29); + this.btnCreate.Name = "btnCreate"; + this.btnCreate.Size = new System.Drawing.Size(103, 23); + this.btnCreate.TabIndex = 14; + this.btnCreate.Text = "Create Backup"; + this.btnCreate.UseVisualStyleBackColor = true; + this.btnCreate.Click += new System.EventHandler(this.btnCreate_Click); + // + // btnRestore + // + this.btnRestore.Location = new System.Drawing.Point(250, 58); + this.btnRestore.Name = "btnRestore"; + this.btnRestore.Size = new System.Drawing.Size(103, 23); + this.btnRestore.TabIndex = 15; + this.btnRestore.Text = "Restore Backup"; + this.btnRestore.UseVisualStyleBackColor = true; + this.btnRestore.Click += new System.EventHandler(this.btnRestore_Click); + // + // btnDelete + // + this.btnDelete.Location = new System.Drawing.Point(250, 87); + this.btnDelete.Name = "btnDelete"; + this.btnDelete.Size = new System.Drawing.Size(103, 23); + this.btnDelete.TabIndex = 16; + this.btnDelete.Text = "Delete Backup"; + this.btnDelete.UseVisualStyleBackColor = true; + this.btnDelete.Click += new System.EventHandler(this.btnDelete_Click); + // + // groupBox1 + // + this.groupBox1.Location = new System.Drawing.Point(240, 111); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(122, 10); + this.groupBox1.TabIndex = 17; + this.groupBox1.TabStop = false; + // + // txtTime + // + this.txtTime.BackColor = System.Drawing.SystemColors.Window; + this.txtTime.Location = new System.Drawing.Point(250, 143); + this.txtTime.Name = "txtTime"; + this.txtTime.ReadOnly = true; + this.txtTime.Size = new System.Drawing.Size(103, 20); + this.txtTime.TabIndex = 18; + // + // lblTime + // + this.lblTime.AutoSize = true; + this.lblTime.Location = new System.Drawing.Point(247, 127); + this.lblTime.Name = "lblTime"; + this.lblTime.Size = new System.Drawing.Size(73, 13); + this.lblTime.TabIndex = 19; + this.lblTime.Text = "Backup Time:"; + // + // BackupManager + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(366, 179); + this.Controls.Add(this.panel1); + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.MaximizeBox = false; + this.MaximumSize = new System.Drawing.Size(382, 500); + this.MinimizeBox = false; + this.MinimumSize = new System.Drawing.Size(382, 217); + this.Name = "BackupManager"; + this.Text = "Backup Manager"; + this.Load += new System.EventHandler(this.BackupManager_Load); + this.Resize += new System.EventHandler(this.BackupManager_Resize); + this.panel1.ResumeLayout(false); + this.panel1.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Panel panel1; + private System.Windows.Forms.ListBox liBackups; + private System.Windows.Forms.ListBox liMaps; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label lblTime; + private System.Windows.Forms.TextBox txtTime; + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.Button btnDelete; + private System.Windows.Forms.Button btnRestore; + private System.Windows.Forms.Button btnCreate; + } +} \ No newline at end of file diff --git a/MCSong/GUI/BackupManager.cs b/MCSong/GUI/BackupManager.cs new file mode 100644 index 0000000..ae31490 --- /dev/null +++ b/MCSong/GUI/BackupManager.cs @@ -0,0 +1,167 @@ +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 System.IO; + +namespace MCSong.Gui +{ + public partial class BackupManager : Form + { + public BackupManager() + { + InitializeComponent(); + } + + private void BackupManager_Load(object sender, EventArgs e) + { + UpdateMapList(); + UpdateInfo(); + } + + private void UpdateMapList() + { + liMaps.Items.Clear(); + foreach (FileInfo f in new DirectoryInfo("levels").GetFiles("*.lvl", SearchOption.TopDirectoryOnly)) + { + liMaps.Items.Add(f.Name.Replace(".lvl", "")); + } + UpdateBackupList(); + UpdateInfo(); + } + private void UpdateBackupList() + { + if (String.IsNullOrWhiteSpace(liMaps.Text)) + { + liBackups.Items.Clear(); + return; + } + string l = liMaps.Text; + liBackups.Items.Clear(); + try + { + foreach (DirectoryInfo di in new DirectoryInfo(@Server.backupLocation + "/" + l).GetDirectories("*", SearchOption.TopDirectoryOnly)) + { + liBackups.Items.Add(di.Name); + } + } + catch (DirectoryNotFoundException) { } + } + private void UpdateInfo() + { + if (!String.IsNullOrWhiteSpace(liMaps.Text))// Is a level selected? + { + btnCreate.Enabled = true; + if (!String.IsNullOrWhiteSpace(liBackups.Text))// Is a backup selected? + { + btnRestore.Enabled = btnDelete.Enabled = true; + lblTime.Text = "Backup Time:"; + txtTime.Text = new FileInfo(@Server.backupLocation + "/" + liMaps.Text + "/" + liBackups.Text + "/" + liMaps.Text + ".lvl").LastWriteTime.ToString(); + return; + } + btnRestore.Enabled = btnDelete.Enabled = false; + lblTime.Text = "Last Backup:"; + try + { + DirectoryInfo di = new DirectoryInfo(@Server.backupLocation + "/" + liMaps.Text + "/"); + txtTime.Text = (di.GetDirectories().Length == 0) ? "Never" : di.GetDirectories().OrderByDescending(d => d.LastWriteTime).First().LastWriteTime.ToString(); + } + catch (DirectoryNotFoundException) { txtTime.Text = "Never"; } + return; + } + btnCreate.Enabled = btnRestore.Enabled = btnDelete.Enabled = false; + lblTime.Text = "Last Backup:"; + txtTime.Clear(); + } + + private void liMaps_SelectedIndexChanged(object sender, EventArgs e) + { + UpdateBackupList(); + UpdateInfo(); + } + + private void liBackups_SelectedIndexChanged(object sender, EventArgs e) + { + UpdateInfo(); + } + + private void btnCreate_Click(object sender, EventArgs e) + { + string pre = liMaps.Text; + new CreateBackupDialog(liMaps.Text).ShowDialog(); + UpdateMapList(); + try { liMaps.SetSelected(liMaps.Items.IndexOf(pre), true); } + catch { } + } + + private void btnRestore_Click(object sender, EventArgs e) + { + if (MessageBox.Show("Restore backup " + liBackups.Text + " for level " + liMaps.Text + "?", "Restore backup?", MessageBoxButtons.YesNo) == DialogResult.Yes) + { + try + { + File.Copy(@Server.backupLocation + "/" + liMaps.Text + "/" + liBackups.Text + "/" + liMaps.Text + ".lvl", "levels/" + liMaps.Text + ".lvl", true); + Level temp = Level.Load(liMaps.Text); + temp.physThread.Start(); + if (temp != null) + { + Player.players.ForEach(delegate(Player p) + { + if (p.level.name == liMaps.Text) + { + p.level.spawnx = temp.spawnx; + p.level.spawny = temp.spawny; + p.level.spawnz = temp.spawnz; + + p.level.height = temp.height; + p.level.width = temp.width; + p.level.depth = temp.depth; + + p.level.blocks = temp.blocks; + p.level.setPhysics(0); + p.level.ClearPhysics(); + } + }); + } + Player.GlobalMessage("Restored backup " + liBackups.Text + " for level " + liMaps.Text + "."); + MessageBox.Show("Restored backup " + liBackups.Text + " for level " + liMaps.Text + "."); + } + catch { MessageBox.Show("Restore fail"); Server.s.Log("Restore fail"); } + } + string pre = liMaps.Text; + string prev = liBackups.Text; + UpdateMapList(); + try { liMaps.SetSelected(liMaps.Items.IndexOf(pre), true); } + catch { } + try { liBackups.SetSelected(liBackups.Items.IndexOf(prev), true); } + catch { } + } + + private void btnDelete_Click(object sender, EventArgs e) + { + if (MessageBox.Show("Are you sure you want to delete this backup? This cannot be undone!", "Are you sure?", MessageBoxButtons.YesNo) == DialogResult.Yes) + { + try + { + DirectoryInfo di = new DirectoryInfo(@Server.backupLocation + "/" + liMaps.Text + "/" + liBackups.Text); + di.Delete(true); + MessageBox.Show("Backup deleted."); + } + catch (Exception ex) { MessageBox.Show("Error while deleting backup."); Server.ErrorLog(ex); } + } + UpdateBackupList(); + } + + private void BackupManager_Resize(object sender, EventArgs e) + { + int offset = this.Size.Height - this.MinimumSize.Height; + liMaps.Height = 147 + offset; + liBackups.Height = 147 + offset; + } + } +} diff --git a/MCSong/GUI/BackupManager.resx b/MCSong/GUI/BackupManager.resx new file mode 100644 index 0000000..dc35ce2 --- /dev/null +++ b/MCSong/GUI/BackupManager.resx @@ -0,0 +1,675 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + + AAABAAQAQEAAAAEAIAAoQAAARgAAACAgAAABACAAKBAAAG5AAAAYGAAAAQAgACgJAACWUAAAEBAAAAEA + IAAoBAAAvlkAACgAAABAAAAAgAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAABEAAABJAAAAhgAAAIYAAACGAAAAhgAAAIYAAABIAAAAEQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHkAAADiAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AOEAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADkAAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAALoAAAAiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAC3AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA2wAAACAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAASAAAA9QAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAADcAAAAFQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAEQAAAO4AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAH0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABEAAADyAAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADKAAAACwAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAnQAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + ACkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAACcAAAD+AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAAnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbwAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAJwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAClAAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAACcAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAGEAAAD5AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD9AAAA/wAA + AP8AAAAnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALAAAAIwAAADUAAAA/QAAAP8AAAD/AAAA+gAA + AMwAAABVAAAAmAAAAP8AAAD/AAAAJwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAA + ADgAAAB1AAAAdQAAADAAAAAEAAAAAAAAAIwAAAD/AAAA/wAAACcAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAA/wAAAP8AAAAnAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAA + AP8AAAD/AAAAJwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAJAAAAD/AAAA/wAAACcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAA/wAAAP8AAAAnAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAIwAAAGgAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAAP8AAAD/AAAAJwAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACcAAAA0gAAABEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AJAAAAD/AAAA/wAAACcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAP4AAADKAAAADQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAACQAAAA/wAAAP8AAAAnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAACLAAAA/wAAAIEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAAP8AAAD/AAAAJwAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAGwAAAO0AAAD/AAAANQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAAAAD/AAAA/wAA + ACcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAA/wAAANYAAAAOAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAACQAAAA/wAAAP8AAAAnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAA + AP8AAAD/AAAAOQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAAP8AAAD/AAAAJwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAACUAAAD/AAAA/wAAALIAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAAAAD/AAAA/wAAACcAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqAAAA/wAAAP8AAADzAAAACgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAA/wAA + AP8AAAAnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKgAAAP8AAAD/AAAA9wAA + AEcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAkAAAAP8AAAD/AAAAJwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + ACoAAAD/AAAA/wAAAP8AAAB5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAAAAD/AAAA/wAAACcAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAqAAAA/wAAAP8AAAD/AAAAcQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAA/wAAAP8AAAAnAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJgAAAP8AAAD/AAAA/wAAAHEAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAA + AP8AAAD/AAAAJwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAD/AAAA/wAA + AP8AAABxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAJAAAAD/AAAA/wAAACcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAACOAAAA/wAAAP8AAAD/AAAAcQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAA/wAAAP8AAAAnAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAFAAAAtAAAAP8AAAD/AAAA/wAAAHMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAAP8AAAD/AAAAJwAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAPkAAAD/AAAA/wAAAP4AAABtAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AJAAAAD/AAAA/wAAACcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAH0AAAD+AAAA/wAA + AP8AAAD0AAAAGwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAACQAAAA/wAAAP8AAAAnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAEAAADhAAAA/wAAAP8AAAD/AAAA2gAAAAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAAP8AAAD/AAAAJwAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAABEAAAA+QAAAP8AAAD/AAAA/wAAAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAAAAD/AAAA/wAA + ACcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvwAAAP8AAAD/AAAA/wAAAP8AAABjAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAACQAAAA/wAAAP8AAAAnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbwAAAP8AAAD/AAAA/wAA + AP8AAAD5AAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAAP8AAAD/AAAAJwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAA + AO0AAAD/AAAA/wAAAP8AAAD/AAAAmAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAAAAD/AAAA/wAAACcAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAJUAAAD/AAAA/wAAAP8AAAD/AAAA/wAAADYAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAA/wAA + AP8AAAAnAAAAAAAAAAAAAAAAAAAAAAAAAJEAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAM0AAAALAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAkAAAAP8AAAD/AAAAJwAAAAAAAAAAAAAAAAAAAJAAAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAABWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAAAAD/AAAA/wAAACgAAAAAAAAAAAAAAJAAAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAADOAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAA/wAAAP8AAAAZAAAAFwAA + AJQAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD7AAAAKwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAA + AP8AAAD1AAAASwAAANcAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAewAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAJAAAAD/AAAA+gAAAPcAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAzwAA + AAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAAzwAAABkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAADUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AJAAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAGMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAACQAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAGQAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AGUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAAAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAGUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAACQAAAA/wAAAP8AAAD/AAAA/wAAAGIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAAP8AAAD/AAAA/wAAAGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI8AAAD/AAAA/wAAAGUAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACjAAAA3QAA + AEsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAYwAAACcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAACAA + AABAAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABbAAAArwAAAL8AAAC/AAAAjAAAACAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQwAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA7QAA + AEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACKAAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA+wAAACYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGkAAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQAA + ANoAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAACSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAKgAAAM4AAAD/AAAA/wAAAP8AAAD/AAAA/AAAAI4AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAFsAAACrAAAAqAAAAEwAAADYAAAAmwAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANkAAACeAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2gAA + AJ0AAAAAAAAAAAAAAAAAAAAmAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAADaAAAAnQAAAAAAAAAAAAAAAAAAAD8AAACnAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAANoAAACdAAAAAAAAAAAAAAAAAAAAAAAAAL0AAACAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAA2gAAAJ0AAAAAAAAAAAAAAAAAAAAAAAAASgAAAP4AAAAYAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADaAAAAnQAAAAAAAAAAAAAAAAAAAAAAAAAbAAAA/wAA + AHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANoAAACdAAAAAAAAAAAAAAAAAAAAAAAA + ABwAAAD/AAAAswAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2gAAAJ0AAAAAAAAAAAAA + AAAAAAAAAAAAGQAAAP8AAAC+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADaAAAAnQAA + AAAAAAAAAAAAAAAAAAAAAAAxAAAA/wAAALoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + ANoAAACdAAAAAAAAAAAAAAAAAAAAAAAAAHMAAAD/AAAAtgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAA2gAAAJ0AAAAAAAAAAAAAAAAAAAABAAAA0gAAAP8AAAB/AAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAADaAAAAnQAAAAAAAAAAAAAAAAAAAEIAAAD/AAAA/wAAAD8AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANoAAACdAAAAAAAAAAAAAAAAAAAA0wAAAP8AAADfAAAACgAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2gAAAJ4AAAAAAAAAAAAAAIsAAAD/AAAA/wAA + AIEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADbAAAAlgAAAAAAAACJAAAA/wAA + AP8AAADzAAAAGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANUAAACkAAAAjgAA + AP8AAAD/AAAA/wAAAGkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxQAA + AP0AAAD/AAAA/wAAAP8AAACrAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAADFAAAA/wAAAP8AAAD/AAAA1AAAAAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAMUAAAD/AAAA/wAAANQAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAxAAAAP8AAADUAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADbAAAA3QAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAHYAAAAXAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAGAAAADAA + AAABACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADEAAABUAAAATgAAABQAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAXAAAAP8AAAD/AAAA/wAAAOcAAABUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArAAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAALAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAZAAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAbAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AJkAAAD/AAAA/wAAAP8AAAD9AAAAbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAggAAAFkAAACyAAAAfAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACoAAAAgAAAAAAAAAABAAAABgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAACrAAAAfwAAAAAAAAABAAAAWAAAAEMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACrAAAAfwAAAAAAAAAAAAAAHAAA + AMEAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAACrAAAAfwAAAAAAAAAAAAAAAAAAALIAAACCAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACrAAAAfwAA + AAAAAAAAAAAAAAAAAJoAAADRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACrAAAAfwAAAAAAAAAAAAAAAAAAAJkAAADfAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAACrAAAAfwAAAAAAAAAAAAAAAAAAAMcAAADaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACrAAAAfwAAAAAAAAAAAAAAGgAA + APwAAACtAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAACrAAAAfwAAAAAAAAAAAAAAhwAAAP8AAABlAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACrAAAAgAAA + AAAAAAArAAAA+gAAAPYAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACsAAAAbAAAABkAAADiAAAA/wAAAJcAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAACfAAAAtAAAANsAAAD/AAAA6AAAABMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACUAAAA/wAAAP8AAAD/AAAAPgAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAACVAAAA/wAAAP8AAABbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAA/wAA + AFsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOAAAAaQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAABAA + AAAgAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaQAA + ANYAAADNAAAAWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AMgAAAD/AAAA/wAAAP8AAAAtAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAABHAAAA8QAAAP8AAAD/AAAASwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAB8AAABRAAAAjAAAAFcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGwAAABdAAAAAAAAADoAAAAFAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABzAAAAXAAAAAAAAABUAAAAZgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcwAAAFwAAAAAAAAAIgAAALoAAAACAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHMAAABcAAAAAAAAACIAAADSAAAABAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABzAAAAXQAAAAAAAABeAAAA2wAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcwAAAFcAAAAAAAAA2QAA + AJoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHEAAABNAAAAeQAA + AP8AAAApAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABkAAAA2AAA + AP8AAACHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZQAA + AP8AAACtAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AHYAAAC9AAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAgAAAABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + 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 + 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 + 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 + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + + + \ No newline at end of file diff --git a/MCSong/GUI/CreateBackupDialog.Designer.cs b/MCSong/GUI/CreateBackupDialog.Designer.cs new file mode 100644 index 0000000..5cf96d7 --- /dev/null +++ b/MCSong/GUI/CreateBackupDialog.Designer.cs @@ -0,0 +1,102 @@ +namespace MCSong.Gui +{ + partial class CreateBackupDialog + { + /// + /// 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() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(CreateBackupDialog)); + this.label1 = new System.Windows.Forms.Label(); + this.txtName = new System.Windows.Forms.TextBox(); + this.button1 = new System.Windows.Forms.Button(); + this.button2 = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(3, 5); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(38, 13); + this.label1.TabIndex = 0; + this.label1.Text = "Name:"; + // + // txtName + // + this.txtName.Location = new System.Drawing.Point(44, 2); + this.txtName.Name = "txtName"; + this.txtName.Size = new System.Drawing.Size(100, 20); + this.txtName.TabIndex = 1; + // + // button1 + // + this.button1.Location = new System.Drawing.Point(78, 28); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(66, 23); + this.button1.TabIndex = 2; + this.button1.Text = "Create"; + this.button1.UseVisualStyleBackColor = true; + this.button1.Click += new System.EventHandler(this.button1_Click); + // + // button2 + // + this.button2.Location = new System.Drawing.Point(6, 28); + this.button2.Name = "button2"; + this.button2.Size = new System.Drawing.Size(66, 23); + this.button2.TabIndex = 3; + this.button2.Text = "Cancel"; + this.button2.UseVisualStyleBackColor = true; + this.button2.Click += new System.EventHandler(this.button2_Click); + // + // CreateBackupDialog + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(146, 54); + this.Controls.Add(this.button2); + this.Controls.Add(this.button1); + this.Controls.Add(this.txtName); + this.Controls.Add(this.label1); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "CreateBackupDialog"; + this.Text = "Create Backup"; + this.Load += new System.EventHandler(this.CreateBackupDialog_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Label label1; + private System.Windows.Forms.TextBox txtName; + private System.Windows.Forms.Button button1; + private System.Windows.Forms.Button button2; + } +} \ No newline at end of file diff --git a/MCSong/GUI/CreateBackupDialog.cs b/MCSong/GUI/CreateBackupDialog.cs new file mode 100644 index 0000000..b6f689f --- /dev/null +++ b/MCSong/GUI/CreateBackupDialog.cs @@ -0,0 +1,115 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace MCSong.Gui +{ + public partial class CreateBackupDialog : Form + { + public CreateBackupDialog(string level) + { + InitializeComponent(); + name = level; + } + + private string name; + + private void CreateBackupDialog_Load(object sender, EventArgs e) + { + DirectoryInfo[] di = new DirectoryInfo(@Server.backupLocation + "/" + name).GetDirectories("*"); + di.OrderBy(d => d.Name); + string s = ""; + int x = 1; + for (int i = 0; i < di.Length; i++) + { + x = i + 2; + if ((i + 1).ToString() != di[i].Name) + { + s = (i + 1).ToString(); + break; + } + } + txtName.Text = (s == "") ? x.ToString() : s; + txtName.Select(txtName.Text.Length, 1); + } + + private void button2_Click(object sender, EventArgs e) + { + this.DialogResult = DialogResult.Cancel; + } + + private void button1_Click(object sender, EventArgs e) + { + if (String.IsNullOrWhiteSpace(txtName.Text)) { MessageBox.Show("Backup name cannot be empty!"); return; } + retry: + Level l = Level.Find(name); + int num = -1; + if (l != null) + { + num = BackupLevel(txtName.Text, true); + } + else + { + num = BackupLevel(txtName.Text); + } + if (num == -1) + { + if (MessageBox.Show("Failed to create backup " + txtName.Text + " for level " + name + ".", "", MessageBoxButtons.RetryCancel) == DialogResult.Retry) + { + goto retry; + } + this.DialogResult = DialogResult.Cancel; + return; + } + MessageBox.Show("Created backup " + txtName.Text + " for level " + name + "."); + this.DialogResult = DialogResult.OK; + } + + private int BackupLevel(string backupName, bool loaded = false) + { + if (loaded) + { + Level l = Level.Find(name); + l.Save(true); + return l.Backup(true, backupName); + } + else + { + int backupNumber = 1; string backupPath = @Server.backupLocation; + if (Directory.Exists(backupPath + "/" + name)) + { + backupNumber = Directory.GetDirectories(backupPath + "/" + name).Length + 1; + } + else + { + Directory.CreateDirectory(backupPath + "/" + name); + } + + string path = backupPath + "/" + name + "/" + backupName; + + Directory.CreateDirectory(path); + + string BackPath = path + "/" + name + ".lvl"; + string current = "levels/" + name + ".lvl"; + try + { + File.Copy(current, BackPath, true); + return backupNumber; + } + catch (Exception e) + { + Server.ErrorLog(e); + Server.s.Log("FAILED TO INCREMENTAL BACKUP :" + name); + return -1; + } + } + } + } +} diff --git a/MCSong/GUI/CreateBackupDialog.resx b/MCSong/GUI/CreateBackupDialog.resx new file mode 100644 index 0000000..dc35ce2 --- /dev/null +++ b/MCSong/GUI/CreateBackupDialog.resx @@ -0,0 +1,675 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + + AAABAAQAQEAAAAEAIAAoQAAARgAAACAgAAABACAAKBAAAG5AAAAYGAAAAQAgACgJAACWUAAAEBAAAAEA + IAAoBAAAvlkAACgAAABAAAAAgAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAABEAAABJAAAAhgAAAIYAAACGAAAAhgAAAIYAAABIAAAAEQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHkAAADiAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AOEAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADkAAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAALoAAAAiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAC3AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA2wAAACAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAASAAAA9QAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAADcAAAAFQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAEQAAAO4AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAH0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABEAAADyAAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADKAAAACwAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAnQAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + ACkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAACcAAAD+AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAAnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbwAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAJwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAClAAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAACcAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAGEAAAD5AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD9AAAA/wAA + AP8AAAAnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALAAAAIwAAADUAAAA/QAAAP8AAAD/AAAA+gAA + AMwAAABVAAAAmAAAAP8AAAD/AAAAJwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAA + ADgAAAB1AAAAdQAAADAAAAAEAAAAAAAAAIwAAAD/AAAA/wAAACcAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAA/wAAAP8AAAAnAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAA + AP8AAAD/AAAAJwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAJAAAAD/AAAA/wAAACcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAA/wAAAP8AAAAnAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAIwAAAGgAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAAP8AAAD/AAAAJwAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACcAAAA0gAAABEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AJAAAAD/AAAA/wAAACcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAP4AAADKAAAADQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAACQAAAA/wAAAP8AAAAnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAACLAAAA/wAAAIEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAAP8AAAD/AAAAJwAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAGwAAAO0AAAD/AAAANQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAAAAD/AAAA/wAA + ACcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAA/wAAANYAAAAOAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAACQAAAA/wAAAP8AAAAnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAA + AP8AAAD/AAAAOQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAAP8AAAD/AAAAJwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAACUAAAD/AAAA/wAAALIAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAAAAD/AAAA/wAAACcAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqAAAA/wAAAP8AAADzAAAACgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAA/wAA + AP8AAAAnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKgAAAP8AAAD/AAAA9wAA + AEcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAkAAAAP8AAAD/AAAAJwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + ACoAAAD/AAAA/wAAAP8AAAB5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAAAAD/AAAA/wAAACcAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAqAAAA/wAAAP8AAAD/AAAAcQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAA/wAAAP8AAAAnAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJgAAAP8AAAD/AAAA/wAAAHEAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAA + AP8AAAD/AAAAJwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAD/AAAA/wAA + AP8AAABxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAJAAAAD/AAAA/wAAACcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAACOAAAA/wAAAP8AAAD/AAAAcQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAA/wAAAP8AAAAnAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAFAAAAtAAAAP8AAAD/AAAA/wAAAHMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAAP8AAAD/AAAAJwAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAPkAAAD/AAAA/wAAAP4AAABtAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AJAAAAD/AAAA/wAAACcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAH0AAAD+AAAA/wAA + AP8AAAD0AAAAGwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAACQAAAA/wAAAP8AAAAnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAEAAADhAAAA/wAAAP8AAAD/AAAA2gAAAAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAAP8AAAD/AAAAJwAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAABEAAAA+QAAAP8AAAD/AAAA/wAAAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAAAAD/AAAA/wAA + ACcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvwAAAP8AAAD/AAAA/wAAAP8AAABjAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAACQAAAA/wAAAP8AAAAnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbwAAAP8AAAD/AAAA/wAA + AP8AAAD5AAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAAP8AAAD/AAAAJwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAA + AO0AAAD/AAAA/wAAAP8AAAD/AAAAmAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAAAAD/AAAA/wAAACcAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAJUAAAD/AAAA/wAAAP8AAAD/AAAA/wAAADYAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAA/wAA + AP8AAAAnAAAAAAAAAAAAAAAAAAAAAAAAAJEAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAM0AAAALAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAkAAAAP8AAAD/AAAAJwAAAAAAAAAAAAAAAAAAAJAAAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAABWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAAAAD/AAAA/wAAACgAAAAAAAAAAAAAAJAAAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAADOAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAA/wAAAP8AAAAZAAAAFwAA + AJQAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD7AAAAKwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAA + AP8AAAD1AAAASwAAANcAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAewAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAJAAAAD/AAAA+gAAAPcAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAzwAA + AAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAAzwAAABkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAADUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AJAAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAGMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAACQAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAGQAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AGUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAAAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAGUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAACQAAAA/wAAAP8AAAD/AAAA/wAAAGIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAAP8AAAD/AAAA/wAAAGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI8AAAD/AAAA/wAAAGUAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACjAAAA3QAA + AEsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAYwAAACcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAACAA + AABAAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABbAAAArwAAAL8AAAC/AAAAjAAAACAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQwAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA7QAA + AEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACKAAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA+wAAACYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGkAAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQAA + ANoAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAACSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAKgAAAM4AAAD/AAAA/wAAAP8AAAD/AAAA/AAAAI4AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAFsAAACrAAAAqAAAAEwAAADYAAAAmwAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANkAAACeAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2gAA + AJ0AAAAAAAAAAAAAAAAAAAAmAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAADaAAAAnQAAAAAAAAAAAAAAAAAAAD8AAACnAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAANoAAACdAAAAAAAAAAAAAAAAAAAAAAAAAL0AAACAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAA2gAAAJ0AAAAAAAAAAAAAAAAAAAAAAAAASgAAAP4AAAAYAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADaAAAAnQAAAAAAAAAAAAAAAAAAAAAAAAAbAAAA/wAA + AHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANoAAACdAAAAAAAAAAAAAAAAAAAAAAAA + ABwAAAD/AAAAswAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2gAAAJ0AAAAAAAAAAAAA + AAAAAAAAAAAAGQAAAP8AAAC+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADaAAAAnQAA + AAAAAAAAAAAAAAAAAAAAAAAxAAAA/wAAALoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + ANoAAACdAAAAAAAAAAAAAAAAAAAAAAAAAHMAAAD/AAAAtgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAA2gAAAJ0AAAAAAAAAAAAAAAAAAAABAAAA0gAAAP8AAAB/AAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAADaAAAAnQAAAAAAAAAAAAAAAAAAAEIAAAD/AAAA/wAAAD8AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANoAAACdAAAAAAAAAAAAAAAAAAAA0wAAAP8AAADfAAAACgAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2gAAAJ4AAAAAAAAAAAAAAIsAAAD/AAAA/wAA + AIEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADbAAAAlgAAAAAAAACJAAAA/wAA + AP8AAADzAAAAGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANUAAACkAAAAjgAA + AP8AAAD/AAAA/wAAAGkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxQAA + AP0AAAD/AAAA/wAAAP8AAACrAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAADFAAAA/wAAAP8AAAD/AAAA1AAAAAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAMUAAAD/AAAA/wAAANQAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAxAAAAP8AAADUAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADbAAAA3QAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAHYAAAAXAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAGAAAADAA + AAABACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADEAAABUAAAATgAAABQAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAXAAAAP8AAAD/AAAA/wAAAOcAAABUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArAAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAALAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAZAAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAbAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AJkAAAD/AAAA/wAAAP8AAAD9AAAAbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAggAAAFkAAACyAAAAfAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACoAAAAgAAAAAAAAAABAAAABgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAACrAAAAfwAAAAAAAAABAAAAWAAAAEMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACrAAAAfwAAAAAAAAAAAAAAHAAA + AMEAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAACrAAAAfwAAAAAAAAAAAAAAAAAAALIAAACCAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACrAAAAfwAA + AAAAAAAAAAAAAAAAAJoAAADRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACrAAAAfwAAAAAAAAAAAAAAAAAAAJkAAADfAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAACrAAAAfwAAAAAAAAAAAAAAAAAAAMcAAADaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACrAAAAfwAAAAAAAAAAAAAAGgAA + APwAAACtAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAACrAAAAfwAAAAAAAAAAAAAAhwAAAP8AAABlAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACrAAAAgAAA + AAAAAAArAAAA+gAAAPYAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACsAAAAbAAAABkAAADiAAAA/wAAAJcAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAACfAAAAtAAAANsAAAD/AAAA6AAAABMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACUAAAA/wAAAP8AAAD/AAAAPgAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAACVAAAA/wAAAP8AAABbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAA/wAA + AFsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOAAAAaQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAABAA + AAAgAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaQAA + ANYAAADNAAAAWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AMgAAAD/AAAA/wAAAP8AAAAtAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAABHAAAA8QAAAP8AAAD/AAAASwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAB8AAABRAAAAjAAAAFcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGwAAABdAAAAAAAAADoAAAAFAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABzAAAAXAAAAAAAAABUAAAAZgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcwAAAFwAAAAAAAAAIgAAALoAAAACAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHMAAABcAAAAAAAAACIAAADSAAAABAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABzAAAAXQAAAAAAAABeAAAA2wAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcwAAAFcAAAAAAAAA2QAA + AJoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHEAAABNAAAAeQAA + AP8AAAApAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABkAAAA2AAA + AP8AAACHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZQAA + AP8AAACtAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AHYAAAC9AAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAgAAAABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + 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 + 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 + 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 + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + + + \ No newline at end of file diff --git a/MCSong/GUI/EnvColorsDialog.Designer.cs b/MCSong/GUI/EnvColorsDialog.Designer.cs new file mode 100644 index 0000000..c5378a4 --- /dev/null +++ b/MCSong/GUI/EnvColorsDialog.Designer.cs @@ -0,0 +1,274 @@ +namespace MCSong.Gui +{ + partial class EnvColorsDialog + { + /// + /// 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() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(EnvColorsDialog)); + this.label1 = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + this.label3 = new System.Windows.Forms.Label(); + this.label4 = new System.Windows.Forms.Label(); + this.label5 = new System.Windows.Forms.Label(); + this.btnSave = new System.Windows.Forms.Button(); + this.btnCancel = new System.Windows.Forms.Button(); + this.colorDialog1 = new System.Windows.Forms.ColorDialog(); + this.textBox1 = new System.Windows.Forms.TextBox(); + this.button1 = new System.Windows.Forms.Button(); + this.button2 = new System.Windows.Forms.Button(); + this.textBox2 = new System.Windows.Forms.TextBox(); + this.button3 = new System.Windows.Forms.Button(); + this.textBox3 = new System.Windows.Forms.TextBox(); + this.button4 = new System.Windows.Forms.Button(); + this.textBox4 = new System.Windows.Forms.TextBox(); + this.button5 = new System.Windows.Forms.Button(); + this.textBox5 = new System.Windows.Forms.TextBox(); + this.button6 = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(35, 9); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(28, 13); + this.label1.TabIndex = 0; + this.label1.Text = "Sky:"; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(21, 35); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(42, 13); + this.label2.TabIndex = 1; + this.label2.Text = "Clouds:"; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(35, 60); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(28, 13); + this.label3.TabIndex = 2; + this.label3.Text = "Fog:"; + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Location = new System.Drawing.Point(9, 86); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(54, 13); + this.label4.TabIndex = 3; + this.label4.Text = "Shadows:"; + // + // label5 + // + this.label5.AutoSize = true; + this.label5.Location = new System.Drawing.Point(15, 113); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(48, 13); + this.label5.TabIndex = 4; + this.label5.Text = "Sunlight:"; + // + // btnSave + // + this.btnSave.Location = new System.Drawing.Point(147, 136); + this.btnSave.Name = "btnSave"; + this.btnSave.Size = new System.Drawing.Size(63, 23); + this.btnSave.TabIndex = 5; + this.btnSave.Text = "Save"; + this.btnSave.UseVisualStyleBackColor = true; + this.btnSave.Click += new System.EventHandler(this.btnSave_Click); + // + // btnCancel + // + this.btnCancel.Location = new System.Drawing.Point(14, 136); + this.btnCancel.Name = "btnCancel"; + this.btnCancel.Size = new System.Drawing.Size(61, 23); + this.btnCancel.TabIndex = 6; + this.btnCancel.Text = "Cancel"; + this.btnCancel.UseVisualStyleBackColor = true; + this.btnCancel.Click += new System.EventHandler(this.btnCancel_Click); + // + // colorDialog1 + // + this.colorDialog1.SolidColorOnly = true; + // + // textBox1 + // + this.textBox1.Location = new System.Drawing.Point(69, 6); + this.textBox1.Name = "textBox1"; + this.textBox1.ReadOnly = true; + this.textBox1.Size = new System.Drawing.Size(98, 20); + this.textBox1.TabIndex = 7; + // + // button1 + // + this.button1.Location = new System.Drawing.Point(173, 6); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(37, 20); + this.button1.TabIndex = 8; + this.button1.UseVisualStyleBackColor = true; + this.button1.Click += new System.EventHandler(this.colorButton); + // + // button2 + // + this.button2.Location = new System.Drawing.Point(173, 32); + this.button2.Name = "button2"; + this.button2.Size = new System.Drawing.Size(37, 20); + this.button2.TabIndex = 10; + this.button2.UseVisualStyleBackColor = true; + this.button2.Click += new System.EventHandler(this.colorButton); + // + // textBox2 + // + this.textBox2.Location = new System.Drawing.Point(69, 32); + this.textBox2.Name = "textBox2"; + this.textBox2.ReadOnly = true; + this.textBox2.Size = new System.Drawing.Size(98, 20); + this.textBox2.TabIndex = 9; + // + // button3 + // + this.button3.Location = new System.Drawing.Point(173, 58); + this.button3.Name = "button3"; + this.button3.Size = new System.Drawing.Size(37, 20); + this.button3.TabIndex = 12; + this.button3.UseVisualStyleBackColor = true; + this.button3.Click += new System.EventHandler(this.colorButton); + // + // textBox3 + // + this.textBox3.Location = new System.Drawing.Point(69, 58); + this.textBox3.Name = "textBox3"; + this.textBox3.ReadOnly = true; + this.textBox3.Size = new System.Drawing.Size(98, 20); + this.textBox3.TabIndex = 11; + // + // button4 + // + this.button4.Location = new System.Drawing.Point(173, 84); + this.button4.Name = "button4"; + this.button4.Size = new System.Drawing.Size(37, 20); + this.button4.TabIndex = 14; + this.button4.UseVisualStyleBackColor = true; + this.button4.Click += new System.EventHandler(this.colorButton); + // + // textBox4 + // + this.textBox4.Location = new System.Drawing.Point(69, 84); + this.textBox4.Name = "textBox4"; + this.textBox4.ReadOnly = true; + this.textBox4.Size = new System.Drawing.Size(98, 20); + this.textBox4.TabIndex = 13; + // + // button5 + // + this.button5.Location = new System.Drawing.Point(173, 110); + this.button5.Name = "button5"; + this.button5.Size = new System.Drawing.Size(37, 20); + this.button5.TabIndex = 16; + this.button5.UseVisualStyleBackColor = true; + this.button5.Click += new System.EventHandler(this.colorButton); + // + // textBox5 + // + this.textBox5.Location = new System.Drawing.Point(69, 110); + this.textBox5.Name = "textBox5"; + this.textBox5.ReadOnly = true; + this.textBox5.Size = new System.Drawing.Size(98, 20); + this.textBox5.TabIndex = 15; + // + // button6 + // + this.button6.Location = new System.Drawing.Point(80, 136); + this.button6.Name = "button6"; + this.button6.Size = new System.Drawing.Size(61, 23); + this.button6.TabIndex = 17; + this.button6.Text = "Defaults"; + this.button6.UseVisualStyleBackColor = true; + this.button6.Click += new System.EventHandler(this.button6_Click); + // + // EnvColorsDialog + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(220, 166); + this.Controls.Add(this.button6); + this.Controls.Add(this.button5); + this.Controls.Add(this.textBox5); + this.Controls.Add(this.button4); + this.Controls.Add(this.textBox4); + this.Controls.Add(this.button3); + this.Controls.Add(this.textBox3); + this.Controls.Add(this.button2); + this.Controls.Add(this.textBox2); + this.Controls.Add(this.button1); + this.Controls.Add(this.textBox1); + this.Controls.Add(this.btnCancel); + this.Controls.Add(this.btnSave); + this.Controls.Add(this.label5); + this.Controls.Add(this.label4); + this.Controls.Add(this.label3); + this.Controls.Add(this.label2); + this.Controls.Add(this.label1); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "EnvColorsDialog"; + this.Text = "Level Environment Colors"; + this.Load += new System.EventHandler(this.EnvColorsDialog_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.Button btnSave; + private System.Windows.Forms.Button btnCancel; + private System.Windows.Forms.ColorDialog colorDialog1; + private System.Windows.Forms.TextBox textBox1; + private System.Windows.Forms.Button button1; + private System.Windows.Forms.Button button2; + private System.Windows.Forms.TextBox textBox2; + private System.Windows.Forms.Button button3; + private System.Windows.Forms.TextBox textBox3; + private System.Windows.Forms.Button button4; + private System.Windows.Forms.TextBox textBox4; + private System.Windows.Forms.Button button5; + private System.Windows.Forms.TextBox textBox5; + private System.Windows.Forms.Button button6; + } +} \ No newline at end of file diff --git a/MCSong/GUI/EnvColorsDialog.cs b/MCSong/GUI/EnvColorsDialog.cs new file mode 100644 index 0000000..3af01a4 --- /dev/null +++ b/MCSong/GUI/EnvColorsDialog.cs @@ -0,0 +1,104 @@ +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; + +namespace MCSong.Gui +{ + public partial class EnvColorsDialog : Form + { + public Level level; + + //a=sky b=clouds c=fog d=shadows e=sunlight + Color a = Color.FromArgb(Convert.ToInt32(0x99), Convert.ToInt32(0xCC), Convert.ToInt32(0xFF)); + Color b = Color.White; + Color c = Color.White; + Color d = Color.FromArgb(Convert.ToInt32(0x9B), Convert.ToInt32(0x9B), Convert.ToInt32(0x9B)); + Color f = Color.White; + + public EnvColorsDialog(Level l) + { + InitializeComponent(); + level = l; + } + + private void btnCancel_Click(object sender, EventArgs e) + { + this.DialogResult = DialogResult.Cancel; this.Close(); + } + + private void EnvColorsDialog_Load(object sender, EventArgs e) + { + if (!level.skyColor.Contains(-1)) + a = Color.FromName(String.Format("{0:X}", level.skyColor[0]) + String.Format("{0:X}", level.skyColor[1]) + String.Format("{0:X}", level.skyColor[2])); + if (!level.cloudColor.Contains(-1)) + b = Color.FromName(String.Format("{0:X}", level.cloudColor[0]) + String.Format("{0:X}", level.cloudColor[1]) + String.Format("{0:X}", level.cloudColor[2])); + if (!level.fogColor.Contains(-1)) + c = Color.FromName(String.Format("{0:X}", level.fogColor[0]) + String.Format("{0:X}", level.fogColor[1]) + String.Format("{0:X}", level.fogColor[2])); + if (!level.shadowColor.Contains(-1)) + d = Color.FromName(String.Format("{0:X}", level.shadowColor[0]) + String.Format("{0:X}", level.shadowColor[1]) + String.Format("{0:X}", level.shadowColor[2])); + if (!level.sunlightColor.Contains(-1)) + f = Color.FromName(String.Format("{0:X}", level.sunlightColor[0]) + String.Format("{0:X}", level.sunlightColor[1]) + String.Format("{0:X}", level.sunlightColor[2])); + updateColors(); + } + + + private void button6_Click(object sender, EventArgs e) + { + a = Color.FromArgb(Convert.ToInt32(0x99), Convert.ToInt32(0xCC), Convert.ToInt32(0xFF)); + b = Color.White; + c = Color.White; + d = Color.FromArgb(Convert.ToInt32(0x9B), Convert.ToInt32(0x9B), Convert.ToInt32(0x9B)); + f = Color.White; + updateColors(); + } + + private void colorButton(object sender, EventArgs e) + { + Button b = (Button)sender; + if (colorDialog1.ShowDialog() == DialogResult.OK) + { + b.BackColor = colorDialog1.Color; + if (b == button1) + textBox1.Text = colorDialog1.Color.Name; + if (b == button2) + textBox2.Text = colorDialog1.Color.Name; + if (b == button3) + textBox3.Text = colorDialog1.Color.Name; + if (b == button4) + textBox4.Text = colorDialog1.Color.Name; + if (b == button5) + textBox5.Text = colorDialog1.Color.Name; + } + } + + private void btnSave_Click(object sender, EventArgs e) + { + level.skyColor = new short[3] { a.R, a.G, a.B }; + level.cloudColor = new short[3] { b.R, b.G, b.B }; + level.fogColor = new short[3] { c.R, c.G, c.B }; + level.shadowColor = new short[3] { d.R, d.G, d.B }; + level.sunlightColor = new short[3] { f.R, f.G, f.B }; + this.DialogResult = DialogResult.OK; this.Close(); + } + + private void updateColors() + { + button1.BackColor = a; + textBox1.Text = a.Name; + button2.BackColor = b; + textBox2.Text = b.Name; + button3.BackColor = c; + textBox3.Text = c.Name; + button4.BackColor = d; + textBox4.Text = d.Name; + button5.BackColor = f; + textBox5.Text = f.Name; + } + } +} diff --git a/MCSong/GUI/EnvColorsDialog.resx b/MCSong/GUI/EnvColorsDialog.resx new file mode 100644 index 0000000..2d3cb9d --- /dev/null +++ b/MCSong/GUI/EnvColorsDialog.resx @@ -0,0 +1,678 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + 17, 17 + + + + + AAABAAQAQEAAAAEAIAAoQAAARgAAACAgAAABACAAKBAAAG5AAAAYGAAAAQAgACgJAACWUAAAEBAAAAEA + IAAoBAAAvlkAACgAAABAAAAAgAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAABEAAABJAAAAhgAAAIYAAACGAAAAhgAAAIYAAABIAAAAEQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHkAAADiAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AOEAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADkAAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAALoAAAAiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAC3AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA2wAAACAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAASAAAA9QAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAADcAAAAFQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAEQAAAO4AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAH0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABEAAADyAAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADKAAAACwAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAnQAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + ACkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAACcAAAD+AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAAnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbwAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAJwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAClAAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAACcAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAGEAAAD5AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD9AAAA/wAA + AP8AAAAnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALAAAAIwAAADUAAAA/QAAAP8AAAD/AAAA+gAA + AMwAAABVAAAAmAAAAP8AAAD/AAAAJwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAA + ADgAAAB1AAAAdQAAADAAAAAEAAAAAAAAAIwAAAD/AAAA/wAAACcAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAA/wAAAP8AAAAnAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAA + AP8AAAD/AAAAJwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAJAAAAD/AAAA/wAAACcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAA/wAAAP8AAAAnAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAIwAAAGgAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAAP8AAAD/AAAAJwAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACcAAAA0gAAABEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AJAAAAD/AAAA/wAAACcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAP4AAADKAAAADQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAACQAAAA/wAAAP8AAAAnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAACLAAAA/wAAAIEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAAP8AAAD/AAAAJwAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAGwAAAO0AAAD/AAAANQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAAAAD/AAAA/wAA + ACcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAA/wAAANYAAAAOAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAACQAAAA/wAAAP8AAAAnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAA + AP8AAAD/AAAAOQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAAP8AAAD/AAAAJwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAACUAAAD/AAAA/wAAALIAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAAAAD/AAAA/wAAACcAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqAAAA/wAAAP8AAADzAAAACgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAA/wAA + AP8AAAAnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKgAAAP8AAAD/AAAA9wAA + AEcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAkAAAAP8AAAD/AAAAJwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + ACoAAAD/AAAA/wAAAP8AAAB5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAAAAD/AAAA/wAAACcAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAqAAAA/wAAAP8AAAD/AAAAcQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAA/wAAAP8AAAAnAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJgAAAP8AAAD/AAAA/wAAAHEAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAA + AP8AAAD/AAAAJwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAD/AAAA/wAA + AP8AAABxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAJAAAAD/AAAA/wAAACcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAACOAAAA/wAAAP8AAAD/AAAAcQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAA/wAAAP8AAAAnAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAFAAAAtAAAAP8AAAD/AAAA/wAAAHMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAAP8AAAD/AAAAJwAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAPkAAAD/AAAA/wAAAP4AAABtAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AJAAAAD/AAAA/wAAACcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAH0AAAD+AAAA/wAA + AP8AAAD0AAAAGwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAACQAAAA/wAAAP8AAAAnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAEAAADhAAAA/wAAAP8AAAD/AAAA2gAAAAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAAP8AAAD/AAAAJwAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAABEAAAA+QAAAP8AAAD/AAAA/wAAAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAAAAD/AAAA/wAA + ACcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvwAAAP8AAAD/AAAA/wAAAP8AAABjAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAACQAAAA/wAAAP8AAAAnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbwAAAP8AAAD/AAAA/wAA + AP8AAAD5AAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAAP8AAAD/AAAAJwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAA + AO0AAAD/AAAA/wAAAP8AAAD/AAAAmAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAAAAD/AAAA/wAAACcAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAJUAAAD/AAAA/wAAAP8AAAD/AAAA/wAAADYAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAA/wAA + AP8AAAAnAAAAAAAAAAAAAAAAAAAAAAAAAJEAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAM0AAAALAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAkAAAAP8AAAD/AAAAJwAAAAAAAAAAAAAAAAAAAJAAAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAABWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAAAAD/AAAA/wAAACgAAAAAAAAAAAAAAJAAAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAADOAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAA/wAAAP8AAAAZAAAAFwAA + AJQAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD7AAAAKwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAA + AP8AAAD1AAAASwAAANcAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAewAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAJAAAAD/AAAA+gAAAPcAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAzwAA + AAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAAzwAAABkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAADUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AJAAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAGMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAACQAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAGQAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AGUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAAAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAGUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAACQAAAA/wAAAP8AAAD/AAAA/wAAAGIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAAP8AAAD/AAAA/wAAAGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI8AAAD/AAAA/wAAAGUAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACjAAAA3QAA + AEsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAYwAAACcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAACAA + AABAAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABbAAAArwAAAL8AAAC/AAAAjAAAACAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQwAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA7QAA + AEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACKAAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA+wAAACYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGkAAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQAA + ANoAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAACSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAKgAAAM4AAAD/AAAA/wAAAP8AAAD/AAAA/AAAAI4AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAFsAAACrAAAAqAAAAEwAAADYAAAAmwAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANkAAACeAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2gAA + AJ0AAAAAAAAAAAAAAAAAAAAmAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAADaAAAAnQAAAAAAAAAAAAAAAAAAAD8AAACnAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAANoAAACdAAAAAAAAAAAAAAAAAAAAAAAAAL0AAACAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAA2gAAAJ0AAAAAAAAAAAAAAAAAAAAAAAAASgAAAP4AAAAYAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADaAAAAnQAAAAAAAAAAAAAAAAAAAAAAAAAbAAAA/wAA + AHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANoAAACdAAAAAAAAAAAAAAAAAAAAAAAA + ABwAAAD/AAAAswAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2gAAAJ0AAAAAAAAAAAAA + AAAAAAAAAAAAGQAAAP8AAAC+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADaAAAAnQAA + AAAAAAAAAAAAAAAAAAAAAAAxAAAA/wAAALoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + ANoAAACdAAAAAAAAAAAAAAAAAAAAAAAAAHMAAAD/AAAAtgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAA2gAAAJ0AAAAAAAAAAAAAAAAAAAABAAAA0gAAAP8AAAB/AAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAADaAAAAnQAAAAAAAAAAAAAAAAAAAEIAAAD/AAAA/wAAAD8AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANoAAACdAAAAAAAAAAAAAAAAAAAA0wAAAP8AAADfAAAACgAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2gAAAJ4AAAAAAAAAAAAAAIsAAAD/AAAA/wAA + AIEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADbAAAAlgAAAAAAAACJAAAA/wAA + AP8AAADzAAAAGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANUAAACkAAAAjgAA + AP8AAAD/AAAA/wAAAGkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxQAA + AP0AAAD/AAAA/wAAAP8AAACrAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAADFAAAA/wAAAP8AAAD/AAAA1AAAAAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAMUAAAD/AAAA/wAAANQAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAxAAAAP8AAADUAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADbAAAA3QAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAHYAAAAXAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAGAAAADAA + AAABACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADEAAABUAAAATgAAABQAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAXAAAAP8AAAD/AAAA/wAAAOcAAABUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArAAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAALAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAZAAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAbAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AJkAAAD/AAAA/wAAAP8AAAD9AAAAbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAggAAAFkAAACyAAAAfAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACoAAAAgAAAAAAAAAABAAAABgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAACrAAAAfwAAAAAAAAABAAAAWAAAAEMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACrAAAAfwAAAAAAAAAAAAAAHAAA + AMEAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAACrAAAAfwAAAAAAAAAAAAAAAAAAALIAAACCAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACrAAAAfwAA + AAAAAAAAAAAAAAAAAJoAAADRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACrAAAAfwAAAAAAAAAAAAAAAAAAAJkAAADfAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAACrAAAAfwAAAAAAAAAAAAAAAAAAAMcAAADaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACrAAAAfwAAAAAAAAAAAAAAGgAA + APwAAACtAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAACrAAAAfwAAAAAAAAAAAAAAhwAAAP8AAABlAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACrAAAAgAAA + AAAAAAArAAAA+gAAAPYAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACsAAAAbAAAABkAAADiAAAA/wAAAJcAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAACfAAAAtAAAANsAAAD/AAAA6AAAABMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACUAAAA/wAAAP8AAAD/AAAAPgAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAACVAAAA/wAAAP8AAABbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAA/wAA + AFsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOAAAAaQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAABAA + AAAgAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaQAA + ANYAAADNAAAAWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AMgAAAD/AAAA/wAAAP8AAAAtAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAABHAAAA8QAAAP8AAAD/AAAASwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAB8AAABRAAAAjAAAAFcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGwAAABdAAAAAAAAADoAAAAFAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABzAAAAXAAAAAAAAABUAAAAZgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcwAAAFwAAAAAAAAAIgAAALoAAAACAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHMAAABcAAAAAAAAACIAAADSAAAABAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABzAAAAXQAAAAAAAABeAAAA2wAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcwAAAFcAAAAAAAAA2QAA + AJoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHEAAABNAAAAeQAA + AP8AAAApAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABkAAAA2AAA + AP8AAACHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZQAA + AP8AAACtAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AHYAAAC9AAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAgAAAABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + 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 + 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 + 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 + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + + + \ No newline at end of file diff --git a/MCSong/GUI/FolderBrowserDialogEx.cs b/MCSong/GUI/FolderBrowserDialogEx.cs new file mode 100644 index 0000000..52c1895 --- /dev/null +++ b/MCSong/GUI/FolderBrowserDialogEx.cs @@ -0,0 +1,548 @@ +// FolderBrowserDialogEx.cs +// +// A replacement for the builtin System.Windows.Forms.FolderBrowserDialog class. +// This one includes an edit box, and also displays the full path in the edit box. +// +// based on code from http://support.microsoft.com/default.aspx?scid=kb;[LN];306285 +// +// 20 Feb 2009 +// +// ======================================================================================== +// Example usage: +// +// string _folderName = "c:\\dinoch"; +// private void button1_Click(object sender, EventArgs e) +// { +// _folderName = (System.IO.Directory.Exists(_folderName)) ? _folderName : ""; +// var dlg1 = new Ionic.Utils.FolderBrowserDialogEx +// { +// Description = "Select a folder for the extracted files:", +// ShowNewFolderButton = true, +// ShowEditBox = true, +// //NewStyle = false, +// SelectedPath = _folderName, +// ShowFullPathInEditBox= false, +// }; +// dlg1.RootFolder = System.Environment.SpecialFolder.MyComputer; +// +// var result = dlg1.ShowDialog(); +// +// if (result == DialogResult.OK) +// { +// _folderName = dlg1.SelectedPath; +// this.label1.Text = "The folder selected was: "; +// this.label2.Text = _folderName; +// } +// } +// + + +namespace MCSong.Gui +{ +using System; +using System.Windows.Forms; +using System.Runtime.InteropServices; +using System.ComponentModel; +using System.Security.Permissions; +using System.Security; +using System.Threading; + + //[Designer("System WINDOWS.Forms.Design.FolderBrowserDialogDesigner, System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"), DefaultEvent("HelpRequest"), SRDescription("DescriptionFolderBrowserDialog"), DefaultProperty("SelectedPath")] + public class FolderBrowserDialogEx : System.Windows.Forms.CommonDialog + { + private static readonly int MAX_PATH = 260; + + // Fields + private PInvoke.BrowseFolderCallbackProc _callback; + private string _descriptionText; + private Environment.SpecialFolder _rootFolder; + private string _selectedPath; + private bool _selectedPathNeedsCheck; + private bool _showNewFolderButton; + private bool _showEditBox; + private bool _showBothFilesAndFolders; + private bool _newStyle = true; + private bool _showFullPathInEditBox = true; + private bool _dontIncludeNetworkFoldersBelowDomainLevel; + private int _uiFlags; + private IntPtr _hwndEdit; + private IntPtr _rootFolderLocation; + + // EVENTS + //[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public new event EventHandler HelpRequest + { + add + { + base.HelpRequest += value; + } + remove + { + base.HelpRequest -= value; + } + } + + // ctor + public FolderBrowserDialogEx() + { + this.Reset(); + } + + // Factory Methods + public static FolderBrowserDialogEx PrinterBrowser() + { + FolderBrowserDialogEx x = new FolderBrowserDialogEx(); + // avoid MBRO comppiler warning when passing _rootFolderLocation as a ref: + x.BecomePrinterBrowser(); + return x; + } + + public static FolderBrowserDialogEx ComputerBrowser() + { + FolderBrowserDialogEx x = new FolderBrowserDialogEx(); + // avoid MBRO comppiler warning when passing _rootFolderLocation as a ref: + x.BecomeComputerBrowser(); + return x; + } + + + // Helpers + private void BecomePrinterBrowser() + { + _uiFlags += BrowseFlags.BIF_BROWSEFORPRINTER; + Description = "Select a PRINTER:"; + PInvoke.Shell32.SHGetSpecialFolderLocation(IntPtr.Zero, CSIDL.PRINTERS, ref this._rootFolderLocation); + ShowNewFolderButton = false; + ShowEditBox = false; + } + + private void BecomeComputerBrowser() + { + _uiFlags += BrowseFlags.BIF_BROWSEFORCOMPUTER; + Description = "Select a COMPUTER:"; + PInvoke.Shell32.SHGetSpecialFolderLocation(IntPtr.Zero, CSIDL.NETWORK, ref this._rootFolderLocation); + ShowNewFolderButton = false; + ShowEditBox = false; + } + + + private class CSIDL + { + public const int PRINTERS = 4; + public const int NETWORK = 0x12; + } + + private class BrowseFlags + { + public const int BIF_DEFAULT = 0x0000; + public const int BIF_BROWSEFORCOMPUTER = 0x1000; + public const int BIF_BROWSEFORPRINTER = 0x2000; + public const int BIF_BROWSEINCLUDEFILES = 0x4000; + public const int BIF_BROWSEINCLUDEURLS = 0x0080; + public const int BIF_DONTGOBELOWDOMAIN = 0x0002; + public const int BIF_EDITBOX = 0x0010; + public const int BIF_NEWDIALOGSTYLE = 0x0040; + public const int BIF_NONEWFOLDERBUTTON = 0x0200; + public const int BIF_RETURNFSANCESTORS = 0x0008; + public const int BIF_RETURNONLYFSDIRS = 0x0001; + public const int BIF_SHAREABLE = 0x8000; + public const int BIF_STATUSTEXT = 0x0004; + public const int BIF_UAHINT = 0x0100; + public const int BIF_VALIDATE = 0x0020; + public const int BIF_NOTRANSLATETARGETS = 0x0400; + } + + private static class BrowseForFolderMessages + { + // messages FROM the folder browser + public const int BFFM_INITIALIZED = 1; + public const int BFFM_SELCHANGED = 2; + public const int BFFM_VALIDATEFAILEDA = 3; + public const int BFFM_VALIDATEFAILEDW = 4; + public const int BFFM_IUNKNOWN = 5; + + // messages TO the folder browser + public const int BFFM_SETSTATUSTEXT = 0x464; + public const int BFFM_ENABLEOK = 0x465; + public const int BFFM_SETSELECTIONA = 0x466; + public const int BFFM_SETSELECTIONW = 0x467; + } + + private int FolderBrowserCallback(IntPtr hwnd, int msg, IntPtr lParam, IntPtr lpData) + { + switch (msg) + { + case BrowseForFolderMessages.BFFM_INITIALIZED: + if (this._selectedPath.Length != 0) + { + PInvoke.User32.SendMessage(new HandleRef(null, hwnd), BrowseForFolderMessages.BFFM_SETSELECTIONW, 1, this._selectedPath); + if (this._showEditBox && this._showFullPathInEditBox) + { + // get handle to the Edit box inside the Folder Browser Dialog + _hwndEdit = PInvoke.User32.FindWindowEx(new HandleRef(null, hwnd), IntPtr.Zero, "Edit", null); + PInvoke.User32.SetWindowText(_hwndEdit, this._selectedPath); + } + } + break; + + case BrowseForFolderMessages.BFFM_SELCHANGED: + IntPtr pidl = lParam; + if (pidl != IntPtr.Zero) + { + if (((_uiFlags & BrowseFlags.BIF_BROWSEFORPRINTER) == BrowseFlags.BIF_BROWSEFORPRINTER) || + ((_uiFlags & BrowseFlags.BIF_BROWSEFORCOMPUTER) == BrowseFlags.BIF_BROWSEFORCOMPUTER)) + { + // we're browsing for a printer or computer, enable the OK button unconditionally. + PInvoke.User32.SendMessage(new HandleRef(null, hwnd), BrowseForFolderMessages.BFFM_ENABLEOK, 0, 1); + } + else + { + IntPtr pszPath = Marshal.AllocHGlobal(MAX_PATH * Marshal.SystemDefaultCharSize); + bool haveValidPath = PInvoke.Shell32.SHGetPathFromIDList(pidl, pszPath); + String displayedPath = Marshal.PtrToStringAuto(pszPath); + Marshal.FreeHGlobal(pszPath); + // whether to enable the OK button or not. (if file is VALID) + PInvoke.User32.SendMessage(new HandleRef(null, hwnd), BrowseForFolderMessages.BFFM_ENABLEOK, 0, haveValidPath ? 1 : 0); + + // Maybe set the Edit Box text to the Full Folder path + if (haveValidPath && !String.IsNullOrEmpty(displayedPath)) + { + if (_showEditBox && _showFullPathInEditBox) + { + if (_hwndEdit != IntPtr.Zero) + PInvoke.User32.SetWindowText(_hwndEdit, displayedPath); + } + + if ((_uiFlags & BrowseFlags.BIF_STATUSTEXT) == BrowseFlags.BIF_STATUSTEXT) + PInvoke.User32.SendMessage(new HandleRef(null, hwnd), BrowseForFolderMessages.BFFM_SETSTATUSTEXT, 0, displayedPath); + } + } + } + break; + } + return 0; + } + + private static PInvoke.IMalloc GetSHMalloc() + { + PInvoke.IMalloc[] ppMalloc = new PInvoke.IMalloc[1]; + PInvoke.Shell32.SHGetMalloc(ppMalloc); + return ppMalloc[0]; + } + + public override void Reset() + { + this._rootFolder = (Environment.SpecialFolder)0; + this._descriptionText = string.Empty; + this._selectedPath = string.Empty; + this._selectedPathNeedsCheck = false; + this._showNewFolderButton = true; + this._showEditBox = true; + this._newStyle = true; + this._dontIncludeNetworkFoldersBelowDomainLevel = false; + this._hwndEdit = IntPtr.Zero; + this._rootFolderLocation = IntPtr.Zero; + } + + protected override bool RunDialog(IntPtr hWndOwner) + { + bool result = false; + if (_rootFolderLocation == IntPtr.Zero) + { + PInvoke.Shell32.SHGetSpecialFolderLocation(hWndOwner, (int)this._rootFolder, ref _rootFolderLocation); + if (_rootFolderLocation == IntPtr.Zero) + { + PInvoke.Shell32.SHGetSpecialFolderLocation(hWndOwner, 0, ref _rootFolderLocation); + if (_rootFolderLocation == IntPtr.Zero) + { + throw new InvalidOperationException("FolderBrowserDialogNoRootFolder"); + } + } + } + _hwndEdit = IntPtr.Zero; + //_uiFlags = 0; + if (_dontIncludeNetworkFoldersBelowDomainLevel) + _uiFlags += BrowseFlags.BIF_DONTGOBELOWDOMAIN; + if (this._newStyle) + _uiFlags += BrowseFlags.BIF_NEWDIALOGSTYLE; + if (!this._showNewFolderButton) + _uiFlags += BrowseFlags.BIF_NONEWFOLDERBUTTON; + if (this._showEditBox) + _uiFlags += BrowseFlags.BIF_EDITBOX; + if (this._showBothFilesAndFolders) + _uiFlags += BrowseFlags.BIF_BROWSEINCLUDEFILES; + + + if (Control.CheckForIllegalCrossThreadCalls && Application.OleRequired() != ApartmentState.STA) + { + throw new ThreadStateException("DebuggingException: ThreadMustBeSTA"); + } + IntPtr pidl = IntPtr.Zero; + IntPtr hglobal = IntPtr.Zero; + IntPtr pszPath = IntPtr.Zero; + try + { + PInvoke.BROWSEINFO browseInfo = new PInvoke.BROWSEINFO(); + hglobal = Marshal.AllocHGlobal(MAX_PATH * Marshal.SystemDefaultCharSize); + pszPath = Marshal.AllocHGlobal(MAX_PATH * Marshal.SystemDefaultCharSize); + this._callback = new PInvoke.BrowseFolderCallbackProc(this.FolderBrowserCallback); + browseInfo.pidlRoot = _rootFolderLocation; + browseInfo.Owner = hWndOwner; + browseInfo.pszDisplayName = hglobal; + browseInfo.Title = this._descriptionText; + browseInfo.Flags = _uiFlags; + browseInfo.callback = this._callback; + browseInfo.lParam = IntPtr.Zero; + browseInfo.iImage = 0; + pidl = PInvoke.Shell32.SHBrowseForFolder(browseInfo); + if (((_uiFlags & BrowseFlags.BIF_BROWSEFORPRINTER) == BrowseFlags.BIF_BROWSEFORPRINTER) || + ((_uiFlags & BrowseFlags.BIF_BROWSEFORCOMPUTER) == BrowseFlags.BIF_BROWSEFORCOMPUTER)) + { + this._selectedPath = Marshal.PtrToStringAuto(browseInfo.pszDisplayName); + result = true; + } + else + { + if (pidl != IntPtr.Zero) + { + PInvoke.Shell32.SHGetPathFromIDList(pidl, pszPath); + this._selectedPathNeedsCheck = true; + this._selectedPath = Marshal.PtrToStringAuto(pszPath); + result = true; + } + } + } + finally + { + PInvoke.IMalloc sHMalloc = GetSHMalloc(); + sHMalloc.Free(_rootFolderLocation); + _rootFolderLocation = IntPtr.Zero; + if (pidl != IntPtr.Zero) + { + sHMalloc.Free(pidl); + } + if (pszPath != IntPtr.Zero) + { + Marshal.FreeHGlobal(pszPath); + } + if (hglobal != IntPtr.Zero) + { + Marshal.FreeHGlobal(hglobal); + } + this._callback = null; + } + return result; + } + + // Properties + //[SRDescription("FolderBrowserDialogDescription"), SRCategory("CatFolderBrowsing"), Browsable(true), DefaultValue(""), Localizable(true)] + + /// + /// This description appears near the top of the dialog box, providing direction to the user. + /// + public string Description + { + get + { + return this._descriptionText; + } + set + { + this._descriptionText = (value == null) ? string.Empty : value; + } + } + + //[Localizable(false), SRCategory("CatFolderBrowsing"), SRDescription("FolderBrowserDialogRootFolder"), TypeConverter(typeof(SpecialFolderEnumConverter)), Browsable(true), DefaultValue(0)] + public Environment.SpecialFolder RootFolder + { + get + { + return this._rootFolder; + } + set + { + if (!Enum.IsDefined(typeof(Environment.SpecialFolder), value)) + { + throw new InvalidEnumArgumentException("value", (int)value, typeof(Environment.SpecialFolder)); + } + this._rootFolder = value; + } + } + + //[Browsable(true), SRDescription("FolderBrowserDialogSelectedPath"), SRCategory("CatFolderBrowsing"), DefaultValue(""), Editor("System WINDOWS.Forms.Design.SelectedPathEditor, System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", typeof(UITypeEditor)), Localizable(true)] + + /// + /// Set or get the selected path. + /// + public string SelectedPath + { + get + { + if (((this._selectedPath != null) && (this._selectedPath.Length != 0)) && this._selectedPathNeedsCheck) + { + new FileIOPermission(FileIOPermissionAccess.PathDiscovery, this._selectedPath).Demand(); + this._selectedPathNeedsCheck = false; + } + return this._selectedPath; + } + set + { + this._selectedPath = (value == null) ? string.Empty : value; + this._selectedPathNeedsCheck = true; + } + } + + //[SRDescription("FolderBrowserDialogShowNewFolderButton"), Localizable(false), Browsable(true), DefaultValue(true), SRCategory("CatFolderBrowsing")] + + /// + /// Enable or DISABLE the "New Folder" button in the browser dialog. + /// + public bool ShowNewFolderButton + { + get + { + return this._showNewFolderButton; + } + set + { + this._showNewFolderButton = value; + } + } + + /// + /// Show an "edit box" in the folder browser. + /// + /// + /// The "edit box" normally shows the name of the selected folder. + /// The user may also type a pathname directly into the edit box. + /// + /// + public bool ShowEditBox + { + get + { + return this._showEditBox; + } + set + { + this._showEditBox = value; + } + } + + /// + /// Set whether to use the New Folder Browser dialog style. + /// + /// + /// The new style is resizable and includes a "New Folder" button. + /// + public bool NewStyle + { + get + { + return this._newStyle; + } + set + { + this._newStyle = value; + } + } + + + public bool DontIncludeNetworkFoldersBelowDomainLevel + { + get { return _dontIncludeNetworkFoldersBelowDomainLevel; } + set { _dontIncludeNetworkFoldersBelowDomainLevel = value; } + } + + /// + /// Show the full path in the edit box as the user selects it. + /// + /// + /// This works only if ShowEditBox is also set to true. + /// + public bool ShowFullPathInEditBox + { + get { return _showFullPathInEditBox; } + set { _showFullPathInEditBox = value; } + } + + public bool ShowBothFilesAndFolders + { + get { return _showBothFilesAndFolders; } + set { _showBothFilesAndFolders = value; } + } + } + + + + internal static class PInvoke + { + static PInvoke() { } + + public delegate int BrowseFolderCallbackProc(IntPtr hwnd, int msg, IntPtr lParam, IntPtr lpData); + + internal static class User32 + { + [DllImport("user32.dll", CharSet = CharSet.Auto)] + public static extern IntPtr SendMessage(HandleRef hWnd, int msg, int wParam, string lParam); + + [DllImport("user32.dll", CharSet = CharSet.Auto)] + public static extern IntPtr SendMessage(HandleRef hWnd, int msg, int wParam, int lParam); + + [DllImport("user32.dll", SetLastError = true)] + //public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow); + //public static extern IntPtr FindWindowEx(HandleRef hwndParent, HandleRef hwndChildAfter, string lpszClass, string lpszWindow); + public static extern IntPtr FindWindowEx(HandleRef hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow); + + [DllImport("user32.dll", SetLastError = true)] + public static extern Boolean SetWindowText(IntPtr hWnd, String text); + } + + [ComImport, Guid("00000002-0000-0000-c000-000000000046"), SuppressUnmanagedCodeSecurity, InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + public interface IMalloc + { + [PreserveSig] + IntPtr Alloc(int cb); + [PreserveSig] + IntPtr Realloc(IntPtr pv, int cb); + [PreserveSig] + void Free(IntPtr pv); + [PreserveSig] + int GetSize(IntPtr pv); + [PreserveSig] + int DidAlloc(IntPtr pv); + [PreserveSig] + void HeapMinimize(); + } + + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] + public class BROWSEINFO + { + public IntPtr Owner; + public IntPtr pidlRoot; + public IntPtr pszDisplayName; + public string Title; + public int Flags; + public BrowseFolderCallbackProc callback; + public IntPtr lParam; + public int iImage; + } + + + + [SuppressUnmanagedCodeSecurity] + internal static class Shell32 + { + // Methods + [DllImport("shell32.dll", CharSet = CharSet.Auto)] + public static extern IntPtr SHBrowseForFolder([In] PInvoke.BROWSEINFO lpbi); + [DllImport("shell32.dll")] + public static extern int SHGetMalloc([Out, MarshalAs(UnmanagedType.LPArray)] PInvoke.IMalloc[] ppMalloc); + [DllImport("shell32.dll", CharSet = CharSet.Auto)] + public static extern bool SHGetPathFromIDList(IntPtr pidl, IntPtr pszPath); + [DllImport("shell32.dll")] + public static extern int SHGetSpecialFolderLocation(IntPtr hwnd, int csidl, ref IntPtr ppidl); + } + + } +} \ No newline at end of file diff --git a/MCSong/GUI/HackControlDialog.Designer.cs b/MCSong/GUI/HackControlDialog.Designer.cs new file mode 100644 index 0000000..48e367f --- /dev/null +++ b/MCSong/GUI/HackControlDialog.Designer.cs @@ -0,0 +1,299 @@ +namespace MCSong.Gui +{ + partial class HackControlDialog + { + /// + /// 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() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(HackControlDialog)); + this.chkFlying = new System.Windows.Forms.CheckBox(); + this.chkNoClip = new System.Windows.Forms.CheckBox(); + this.chkSpeeding = new System.Windows.Forms.CheckBox(); + this.chkSpawnControl = new System.Windows.Forms.CheckBox(); + this.chkThirdPerson = new System.Windows.Forms.CheckBox(); + this.numJumpHeight = new System.Windows.Forms.NumericUpDown(); + this.label1 = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + this.label3 = new System.Windows.Forms.Label(); + this.label4 = new System.Windows.Forms.Label(); + this.label5 = new System.Windows.Forms.Label(); + this.label6 = new System.Windows.Forms.Label(); + this.label7 = new System.Windows.Forms.Label(); + this.btnDiscard = new System.Windows.Forms.Button(); + this.btnSave = new System.Windows.Forms.Button(); + this.btnDefaults = new System.Windows.Forms.Button(); + ((System.ComponentModel.ISupportInitialize)(this.numJumpHeight)).BeginInit(); + this.SuspendLayout(); + // + // chkFlying + // + this.chkFlying.Appearance = System.Windows.Forms.Appearance.Button; + this.chkFlying.Location = new System.Drawing.Point(16, 15); + this.chkFlying.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.chkFlying.Name = "chkFlying"; + this.chkFlying.Size = new System.Drawing.Size(157, 30); + this.chkFlying.TabIndex = 0; + this.chkFlying.Text = "Flying"; + this.chkFlying.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.chkFlying.UseVisualStyleBackColor = true; + // + // chkNoClip + // + this.chkNoClip.Appearance = System.Windows.Forms.Appearance.Button; + this.chkNoClip.Location = new System.Drawing.Point(16, 52); + this.chkNoClip.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.chkNoClip.Name = "chkNoClip"; + this.chkNoClip.Size = new System.Drawing.Size(157, 30); + this.chkNoClip.TabIndex = 1; + this.chkNoClip.Text = "NoClip"; + this.chkNoClip.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.chkNoClip.UseVisualStyleBackColor = true; + // + // chkSpeeding + // + this.chkSpeeding.Appearance = System.Windows.Forms.Appearance.Button; + this.chkSpeeding.Location = new System.Drawing.Point(16, 89); + this.chkSpeeding.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.chkSpeeding.Name = "chkSpeeding"; + this.chkSpeeding.Size = new System.Drawing.Size(157, 30); + this.chkSpeeding.TabIndex = 2; + this.chkSpeeding.Text = "Speeding"; + this.chkSpeeding.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.chkSpeeding.UseVisualStyleBackColor = true; + // + // chkSpawnControl + // + this.chkSpawnControl.Appearance = System.Windows.Forms.Appearance.Button; + this.chkSpawnControl.Location = new System.Drawing.Point(16, 126); + this.chkSpawnControl.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.chkSpawnControl.Name = "chkSpawnControl"; + this.chkSpawnControl.Size = new System.Drawing.Size(157, 30); + this.chkSpawnControl.TabIndex = 3; + this.chkSpawnControl.Text = "Spawn Control"; + this.chkSpawnControl.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.chkSpawnControl.UseVisualStyleBackColor = true; + // + // chkThirdPerson + // + this.chkThirdPerson.Appearance = System.Windows.Forms.Appearance.Button; + this.chkThirdPerson.Location = new System.Drawing.Point(16, 162); + this.chkThirdPerson.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.chkThirdPerson.Name = "chkThirdPerson"; + this.chkThirdPerson.Size = new System.Drawing.Size(157, 30); + this.chkThirdPerson.TabIndex = 4; + this.chkThirdPerson.Text = "Third Person View"; + this.chkThirdPerson.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.chkThirdPerson.UseVisualStyleBackColor = true; + // + // numJumpHeight + // + this.numJumpHeight.DecimalPlaces = 1; + this.numJumpHeight.Increment = new decimal(new int[] { + 5, + 0, + 0, + 65536}); + this.numJumpHeight.Location = new System.Drawing.Point(115, 199); + this.numJumpHeight.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.numJumpHeight.Maximum = new decimal(new int[] { + 1023, + 0, + 0, + 0}); + this.numJumpHeight.Minimum = new decimal(new int[] { + 1, + 0, + 0, + -2147483648}); + this.numJumpHeight.Name = "numJumpHeight"; + this.numJumpHeight.Size = new System.Drawing.Size(59, 22); + this.numJumpHeight.TabIndex = 5; + this.numJumpHeight.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; + this.numJumpHeight.Value = new decimal(new int[] { + 1, + 0, + 0, + -2147483648}); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(24, 202); + this.label1.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(91, 17); + this.label1.TabIndex = 6; + this.label1.Text = "Jump Height:"; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(173, 22); + this.label2.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(132, 17); + this.label2.TabIndex = 7; + this.label2.Text = "Allow players to fly?"; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(173, 126); + this.label3.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(157, 34); + this.label3.TabIndex = 8; + this.label3.Text = "Allow using ENTER and\r\nR for respawns?"; + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Location = new System.Drawing.Point(173, 96); + this.label4.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(127, 17); + this.label4.TabIndex = 9; + this.label4.Text = "Allow fast running?"; + // + // label5 + // + this.label5.AutoSize = true; + this.label5.Location = new System.Drawing.Point(173, 170); + this.label5.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(159, 17); + this.label5.TabIndex = 10; + this.label5.Text = "Allow third person view?"; + // + // label6 + // + this.label6.AutoSize = true; + this.label6.Location = new System.Drawing.Point(173, 194); + this.label6.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.label6.Name = "label6"; + this.label6.Size = new System.Drawing.Size(171, 34); + this.label6.TabIndex = 11; + this.label6.Text = "Max jump height (blocks).\r\nNegatives = client default."; + // + // label7 + // + this.label7.AutoSize = true; + this.label7.Location = new System.Drawing.Point(173, 52); + this.label7.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.label7.Name = "label7"; + this.label7.Size = new System.Drawing.Size(143, 34); + this.label7.TabIndex = 12; + this.label7.Text = "Allow walking through\r\nblocks?"; + // + // btnDiscard + // + this.btnDiscard.Location = new System.Drawing.Point(124, 236); + this.btnDiscard.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.btnDiscard.Name = "btnDiscard"; + this.btnDiscard.Size = new System.Drawing.Size(100, 28); + this.btnDiscard.TabIndex = 13; + this.btnDiscard.Text = "Discard"; + this.btnDiscard.UseVisualStyleBackColor = true; + this.btnDiscard.Click += new System.EventHandler(this.btnDiscard_Click); + // + // btnSave + // + this.btnSave.Location = new System.Drawing.Point(16, 236); + this.btnSave.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.btnSave.Name = "btnSave"; + this.btnSave.Size = new System.Drawing.Size(100, 28); + this.btnSave.TabIndex = 14; + this.btnSave.Text = "Save"; + this.btnSave.UseVisualStyleBackColor = true; + this.btnSave.Click += new System.EventHandler(this.btnSave_Click); + // + // btnDefaults + // + this.btnDefaults.Location = new System.Drawing.Point(232, 236); + this.btnDefaults.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.btnDefaults.Name = "btnDefaults"; + this.btnDefaults.Size = new System.Drawing.Size(100, 28); + this.btnDefaults.TabIndex = 15; + this.btnDefaults.Text = "Defaults"; + this.btnDefaults.UseVisualStyleBackColor = true; + this.btnDefaults.Click += new System.EventHandler(this.btnDefaults_Click); + // + // HackControlDialog + // + this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(345, 279); + this.Controls.Add(this.btnDefaults); + this.Controls.Add(this.btnSave); + this.Controls.Add(this.btnDiscard); + this.Controls.Add(this.label7); + this.Controls.Add(this.label6); + this.Controls.Add(this.label5); + this.Controls.Add(this.label4); + this.Controls.Add(this.label3); + this.Controls.Add(this.label2); + this.Controls.Add(this.numJumpHeight); + this.Controls.Add(this.label1); + this.Controls.Add(this.chkThirdPerson); + this.Controls.Add(this.chkSpawnControl); + this.Controls.Add(this.chkSpeeding); + this.Controls.Add(this.chkNoClip); + this.Controls.Add(this.chkFlying); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "HackControlDialog"; + this.ShowInTaskbar = false; + this.Text = "Hack Control"; + this.Load += new System.EventHandler(this.HackControl_Load); + ((System.ComponentModel.ISupportInitialize)(this.numJumpHeight)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.CheckBox chkFlying; + private System.Windows.Forms.CheckBox chkNoClip; + private System.Windows.Forms.CheckBox chkSpeeding; + private System.Windows.Forms.CheckBox chkSpawnControl; + private System.Windows.Forms.CheckBox chkThirdPerson; + private System.Windows.Forms.NumericUpDown numJumpHeight; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.Label label6; + private System.Windows.Forms.Label label7; + private System.Windows.Forms.Button btnDiscard; + private System.Windows.Forms.Button btnSave; + private System.Windows.Forms.Button btnDefaults; + } +} \ No newline at end of file diff --git a/MCSong/GUI/HackControlDialog.cs b/MCSong/GUI/HackControlDialog.cs new file mode 100644 index 0000000..e3a3427 --- /dev/null +++ b/MCSong/GUI/HackControlDialog.cs @@ -0,0 +1,55 @@ +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; + +namespace MCSong.Gui +{ + public partial class HackControlDialog : Form + { + public HackControlDialog(Level level) + { + InitializeComponent(); + l = level; + } + Level l; + + private void HackControl_Load(object sender, EventArgs e) + { + chkFlying.Checked = l.hacks.Flying; + chkNoClip.Checked = l.hacks.NoClip; + chkSpeeding.Checked = l.hacks.Speeding; + chkSpawnControl.Checked = l.hacks.SpawnControl; + chkThirdPerson.Checked = l.hacks.ThirdPerson; + numJumpHeight.Value = (l.hacks.JumpHeight >= 0) ? (Math.Round((decimal)l.hacks.JumpHeight / 16, MidpointRounding.AwayFromZero) / 2) : -1; + } + + private void btnDiscard_Click(object sender, EventArgs e) + { + this.DialogResult = DialogResult.Cancel; + } + + private void btnSave_Click(object sender, EventArgs e) + { + l.hacks.Flying = chkFlying.Checked; + l.hacks.NoClip = chkNoClip.Checked; + l.hacks.Speeding = chkSpeeding.Checked; + l.hacks.SpawnControl = chkSpawnControl.Checked; + l.hacks.ThirdPerson = chkThirdPerson.Checked; + l.hacks.JumpHeight = (numJumpHeight.Value >= 0) ? (short)(numJumpHeight.Value * 32) : (short)-1; + + this.DialogResult = DialogResult.OK; + } + + private void btnDefaults_Click(object sender, EventArgs e) + { + chkFlying.Checked = chkNoClip.Checked = chkSpeeding.Checked = chkSpawnControl.Checked = chkThirdPerson.Checked = true; + numJumpHeight.Value = -1; + } + } +} diff --git a/MCSong/GUI/HackControlDialog.resx b/MCSong/GUI/HackControlDialog.resx new file mode 100644 index 0000000..dc35ce2 --- /dev/null +++ b/MCSong/GUI/HackControlDialog.resx @@ -0,0 +1,675 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + + AAABAAQAQEAAAAEAIAAoQAAARgAAACAgAAABACAAKBAAAG5AAAAYGAAAAQAgACgJAACWUAAAEBAAAAEA + IAAoBAAAvlkAACgAAABAAAAAgAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAABEAAABJAAAAhgAAAIYAAACGAAAAhgAAAIYAAABIAAAAEQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHkAAADiAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AOEAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADkAAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAALoAAAAiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAC3AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA2wAAACAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAASAAAA9QAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAADcAAAAFQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAEQAAAO4AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAH0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABEAAADyAAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADKAAAACwAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAnQAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + ACkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAACcAAAD+AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAAnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbwAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAJwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAClAAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAACcAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAGEAAAD5AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD9AAAA/wAA + AP8AAAAnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALAAAAIwAAADUAAAA/QAAAP8AAAD/AAAA+gAA + AMwAAABVAAAAmAAAAP8AAAD/AAAAJwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAA + ADgAAAB1AAAAdQAAADAAAAAEAAAAAAAAAIwAAAD/AAAA/wAAACcAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAA/wAAAP8AAAAnAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAA + AP8AAAD/AAAAJwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAJAAAAD/AAAA/wAAACcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAA/wAAAP8AAAAnAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAIwAAAGgAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAAP8AAAD/AAAAJwAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACcAAAA0gAAABEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AJAAAAD/AAAA/wAAACcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAP4AAADKAAAADQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAACQAAAA/wAAAP8AAAAnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAACLAAAA/wAAAIEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAAP8AAAD/AAAAJwAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAGwAAAO0AAAD/AAAANQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAAAAD/AAAA/wAA + ACcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAA/wAAANYAAAAOAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAACQAAAA/wAAAP8AAAAnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAA + AP8AAAD/AAAAOQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAAP8AAAD/AAAAJwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAACUAAAD/AAAA/wAAALIAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAAAAD/AAAA/wAAACcAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqAAAA/wAAAP8AAADzAAAACgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAA/wAA + AP8AAAAnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKgAAAP8AAAD/AAAA9wAA + AEcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAkAAAAP8AAAD/AAAAJwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + ACoAAAD/AAAA/wAAAP8AAAB5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAAAAD/AAAA/wAAACcAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAqAAAA/wAAAP8AAAD/AAAAcQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAA/wAAAP8AAAAnAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJgAAAP8AAAD/AAAA/wAAAHEAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAA + AP8AAAD/AAAAJwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAD/AAAA/wAA + AP8AAABxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAJAAAAD/AAAA/wAAACcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAACOAAAA/wAAAP8AAAD/AAAAcQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAA/wAAAP8AAAAnAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAFAAAAtAAAAP8AAAD/AAAA/wAAAHMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAAP8AAAD/AAAAJwAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAPkAAAD/AAAA/wAAAP4AAABtAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AJAAAAD/AAAA/wAAACcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAH0AAAD+AAAA/wAA + AP8AAAD0AAAAGwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAACQAAAA/wAAAP8AAAAnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAEAAADhAAAA/wAAAP8AAAD/AAAA2gAAAAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAAP8AAAD/AAAAJwAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAABEAAAA+QAAAP8AAAD/AAAA/wAAAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAAAAD/AAAA/wAA + ACcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvwAAAP8AAAD/AAAA/wAAAP8AAABjAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAACQAAAA/wAAAP8AAAAnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbwAAAP8AAAD/AAAA/wAA + AP8AAAD5AAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAAP8AAAD/AAAAJwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAA + AO0AAAD/AAAA/wAAAP8AAAD/AAAAmAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAAAAD/AAAA/wAAACcAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAJUAAAD/AAAA/wAAAP8AAAD/AAAA/wAAADYAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAA/wAA + AP8AAAAnAAAAAAAAAAAAAAAAAAAAAAAAAJEAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAM0AAAALAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAkAAAAP8AAAD/AAAAJwAAAAAAAAAAAAAAAAAAAJAAAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAABWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAAAAD/AAAA/wAAACgAAAAAAAAAAAAAAJAAAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAADOAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAA/wAAAP8AAAAZAAAAFwAA + AJQAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD7AAAAKwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAA + AP8AAAD1AAAASwAAANcAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAewAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAJAAAAD/AAAA+gAAAPcAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAzwAA + AAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAAzwAAABkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAADUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AJAAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAGMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAACQAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAGQAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AGUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAAAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAGUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAACQAAAA/wAAAP8AAAD/AAAA/wAAAGIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAAP8AAAD/AAAA/wAAAGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI8AAAD/AAAA/wAAAGUAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACjAAAA3QAA + AEsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAYwAAACcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAACAA + AABAAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABbAAAArwAAAL8AAAC/AAAAjAAAACAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQwAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA7QAA + AEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACKAAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA+wAAACYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGkAAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQAA + ANoAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAACSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAKgAAAM4AAAD/AAAA/wAAAP8AAAD/AAAA/AAAAI4AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAFsAAACrAAAAqAAAAEwAAADYAAAAmwAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANkAAACeAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2gAA + AJ0AAAAAAAAAAAAAAAAAAAAmAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAADaAAAAnQAAAAAAAAAAAAAAAAAAAD8AAACnAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAANoAAACdAAAAAAAAAAAAAAAAAAAAAAAAAL0AAACAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAA2gAAAJ0AAAAAAAAAAAAAAAAAAAAAAAAASgAAAP4AAAAYAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADaAAAAnQAAAAAAAAAAAAAAAAAAAAAAAAAbAAAA/wAA + AHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANoAAACdAAAAAAAAAAAAAAAAAAAAAAAA + ABwAAAD/AAAAswAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2gAAAJ0AAAAAAAAAAAAA + AAAAAAAAAAAAGQAAAP8AAAC+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADaAAAAnQAA + AAAAAAAAAAAAAAAAAAAAAAAxAAAA/wAAALoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + ANoAAACdAAAAAAAAAAAAAAAAAAAAAAAAAHMAAAD/AAAAtgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAA2gAAAJ0AAAAAAAAAAAAAAAAAAAABAAAA0gAAAP8AAAB/AAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAADaAAAAnQAAAAAAAAAAAAAAAAAAAEIAAAD/AAAA/wAAAD8AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANoAAACdAAAAAAAAAAAAAAAAAAAA0wAAAP8AAADfAAAACgAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2gAAAJ4AAAAAAAAAAAAAAIsAAAD/AAAA/wAA + AIEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADbAAAAlgAAAAAAAACJAAAA/wAA + AP8AAADzAAAAGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANUAAACkAAAAjgAA + AP8AAAD/AAAA/wAAAGkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxQAA + AP0AAAD/AAAA/wAAAP8AAACrAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAADFAAAA/wAAAP8AAAD/AAAA1AAAAAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAMUAAAD/AAAA/wAAANQAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAxAAAAP8AAADUAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADbAAAA3QAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAHYAAAAXAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAGAAAADAA + AAABACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADEAAABUAAAATgAAABQAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAXAAAAP8AAAD/AAAA/wAAAOcAAABUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArAAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAALAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAZAAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAbAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AJkAAAD/AAAA/wAAAP8AAAD9AAAAbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAggAAAFkAAACyAAAAfAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACoAAAAgAAAAAAAAAABAAAABgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAACrAAAAfwAAAAAAAAABAAAAWAAAAEMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACrAAAAfwAAAAAAAAAAAAAAHAAA + AMEAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAACrAAAAfwAAAAAAAAAAAAAAAAAAALIAAACCAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACrAAAAfwAA + AAAAAAAAAAAAAAAAAJoAAADRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACrAAAAfwAAAAAAAAAAAAAAAAAAAJkAAADfAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAACrAAAAfwAAAAAAAAAAAAAAAAAAAMcAAADaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACrAAAAfwAAAAAAAAAAAAAAGgAA + APwAAACtAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAACrAAAAfwAAAAAAAAAAAAAAhwAAAP8AAABlAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACrAAAAgAAA + AAAAAAArAAAA+gAAAPYAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACsAAAAbAAAABkAAADiAAAA/wAAAJcAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAACfAAAAtAAAANsAAAD/AAAA6AAAABMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACUAAAA/wAAAP8AAAD/AAAAPgAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAACVAAAA/wAAAP8AAABbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAA/wAA + AFsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOAAAAaQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAABAA + AAAgAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaQAA + ANYAAADNAAAAWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AMgAAAD/AAAA/wAAAP8AAAAtAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAABHAAAA8QAAAP8AAAD/AAAASwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAB8AAABRAAAAjAAAAFcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGwAAABdAAAAAAAAADoAAAAFAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABzAAAAXAAAAAAAAABUAAAAZgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcwAAAFwAAAAAAAAAIgAAALoAAAACAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHMAAABcAAAAAAAAACIAAADSAAAABAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABzAAAAXQAAAAAAAABeAAAA2wAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcwAAAFcAAAAAAAAA2QAA + AJoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHEAAABNAAAAeQAA + AP8AAAApAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABkAAAA2AAA + AP8AAACHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZQAA + AP8AAACtAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AHYAAAC9AAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAgAAAABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + 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 + 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 + 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 + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + + + \ No newline at end of file diff --git a/MCSong/GUI/IsoCat.cs b/MCSong/GUI/IsoCat.cs new file mode 100644 index 0000000..3da1600 --- /dev/null +++ b/MCSong/GUI/IsoCat.cs @@ -0,0 +1,453 @@ +// Copyright 2009-2012 Matvei Stefarov +// Modified for use with MCDawn, by Jonny Li (jonnyli1125). +// Modified for use with MCSong, by Andrew Schimelpfening (727021) <727021@mcsong.x10.mx> +/*using System; +using System.ComponentModel; +using System.Drawing; +using System.Drawing.Imaging; +using System.IO; +using System.Net; + +namespace MCSong +{ + + /// Drawing/clipping mode of IsoCat level renderer. + public enum IsoCatMode + { + /// Normal isometric view. + Normal, + + /// Isometric view with the outermost layer of blocks stripped (useful for boxed levels). + Peeled, + + /// Isometric view with a front-facing quarter of the level cut out (to show level cross-section). + Cut, + + /// Only a specified chunk of the level is drawn. + Chunk + } + + + /// Isometric level renderer, tightly integrated with BackgroundWorker. + /// Creates a bitlevel of the level. Every IsoCat instance is single-use. + unsafe public sealed class IsoCat + { + static readonly byte[] Tiles, ShadowTiles; + static readonly int TileX, TileY; + static readonly int MaxTileDim, TileStride; + + static readonly Bitmap Tileset, TilesetShadowed; + + static IsoCat() + { + if (!Directory.Exists("extra")) Directory.CreateDirectory("extra"); + if (!File.Exists("extra/Tileset.png")) + using (WebClient w = new WebClient()) + w.DownloadFile("http://updates.mcsong.x10.mx/Tileset.png", "extra/Tileset.png"); + if (!File.Exists("extra/TilesetShadowed.png")) + using (WebClient w = new WebClient()) + w.DownloadFile("http://updates.mcsong.x10.mx/TilesetShadowed.png", "extra/TilesetShadowed.png"); + Tileset = new Bitmap(Bitmap.FromFile("extra/Tileset.png")); + TilesetShadowed = new Bitmap(Bitmap.FromFile("extra/TilesetShadowed.png")); + using (Bitmap tilesBmp = Tileset) + { + TileX = tilesBmp.Width / 50; + TileY = tilesBmp.Height; + TileStride = TileX * TileY * 4; + Tiles = new byte[50 * TileStride]; + + MaxTileDim = Math.Max(TileX, TileY); + + for (int i = 0; i < 50; i++) + { + for (int y = 0; y < TileY; y++) + { + for (int x = 0; x < TileX; x++) + { + int p = i * TileStride + (y * TileX + x) * 4; + System.Drawing.Color c = tilesBmp.GetPixel(x + i * TileX, y); + Tiles[p] = c.B; + Tiles[p + 1] = c.G; + Tiles[p + 2] = c.R; + Tiles[p + 3] = c.A; + } + } + } + } + + using (Bitmap stilesBmp = TilesetShadowed) + { + + ShadowTiles = new byte[50 * TileStride]; + + for (int i = 0; i < 50; i++) + { + for (int y = 0; y < TileY; y++) + { + for (int x = 0; x < TileX; x++) + { + int p = i * TileStride + (y * TileX + x) * 4; + System.Drawing.Color c = stilesBmp.GetPixel(x + i * TileX, y); + ShadowTiles[p] = c.B; + ShadowTiles[p + 1] = c.G; + ShadowTiles[p + 2] = c.R; + ShadowTiles[p + 3] = c.A; + } + } + } + } + } + + + int x, y, z; + byte block; + public readonly int[] ChunkCoords = new int[6]; + + readonly byte* image; + readonly Bitmap imageBmp; + readonly BitmapData imageData; + readonly int imageWidth, imageHeight; + + readonly int dimX, dimY, dimX1, dimY1, dimX2, dimY2; + readonly int offsetX, offsetY; + readonly int isoOffset, isoX, isoY, isoH; + readonly int imageStride; + + public readonly int Rot; + public readonly IsoCatMode Mode; + public readonly Level Level; + + + public IsoCat(Level level, IsoCatMode mode, int rot) + { + Rot = rot; + Mode = mode; + Level = level; + + dimX = Level.width; + dimY = Level.height; + offsetY = Math.Max(0, Level.width - Level.height); + offsetX = Math.Max(0, Level.height - Level.width); + dimX2 = dimX / 2 - 1; + dimY2 = dimY / 2 - 1; + dimX1 = dimX - 1; + dimY1 = dimY - 1; + + blendDivisor = 255 * Level.depth; + + imageWidth = TileX * Math.Max(dimX, dimY) + TileY / 2 * Level.depth + TileX * 2; + imageHeight = TileY / 2 * Level.depth + MaxTileDim / 2 * Math.Max(Math.Max(dimX, dimY), Level.depth) + TileY * 2; + + imageBmp = new Bitmap(imageWidth, imageHeight, PixelFormat.Format32bppArgb); + imageData = imageBmp.LockBits(new Rectangle(0, 0, imageBmp.Width, imageBmp.Height), + ImageLockMode.ReadWrite, + PixelFormat.Format32bppArgb); + + image = (byte*)imageData.Scan0; + imageStride = imageData.Stride; + + isoOffset = (Level.depth * TileY / 2 * imageStride + imageStride / 2 + TileX * 2); + isoX = (TileX / 4 * imageStride + TileX * 2); + isoY = (TileY / 4 * imageStride - TileY * 2); + isoH = (-TileY / 2 * imageStride); + + mh34 = Level.depth * 3 / 4; + } + + byte* bp, ctp; + //[CanBeNull] + public Bitmap Draw(out Rectangle cropRectangle, BackgroundWorker worker) + { + cropRectangle = Rectangle.Empty; + try + { + //byte[] convertedBlocks = Level.blocks; + //for (ushort x = 0; x < Level.width; x++) + // for (ushort y = 0; y < Level.depth; y++) + // for (ushort z = 0; z < Level.height; z++) + // convertedBlocks[Level.PosToInt(x, y, z)] = Block.Convert(Level.GetTile(x, y, z)); + fixed (byte* bpx = Level.blocks) + { + fixed (byte* tp = Tiles) + { + fixed (byte* stp = ShadowTiles) + { + bp = bpx; + while (z < Level.depth) + { + block = GetBlock(x, y, z); + if (block != 0) + { + + switch (Rot) + { + case 0: ctp = (z >= Level.shadows[x, y] ? tp : stp); break; + case 1: ctp = (z >= Level.shadows[dimX1 - y, x] ? tp : stp); break; + case 2: ctp = (z >= Level.shadows[dimX1 - x, dimY1 - y] ? tp : stp); break; + case 3: ctp = (z >= Level.shadows[y, dimY1 - x] ? tp : stp); break; + } + + int blockRight, blockLeft, blockUp; + + if (x != (Rot == 1 || Rot == 3 ? dimY1 : dimX1)) blockRight = GetBlock(x + 1, y, z); + else blockRight = 0; + if (y != (Rot == 1 || Rot == 3 ? dimX1 : dimY1)) blockLeft = GetBlock(x, y + 1, z); + else blockLeft = 0; + if (z != Level.depth - 1) blockUp = GetBlock(x, y, z + 1); + else blockUp = 0; + + if (blockUp == 0 || blockLeft == 0 || blockRight == 0 || // air + blockUp == 8 || blockLeft == 8 || blockRight == 8 || // water + blockUp == 9 || blockLeft == 9 || blockRight == 9 || // water + (block != 20 && (blockUp == 20 || blockLeft == 20 || blockRight == 20)) || // glass + blockUp == 18 || blockLeft == 18 || blockRight == 18 || // foliage + blockLeft == 44 || blockRight == 44 || // step + + blockUp == 10 || blockLeft == 10 || blockRight == 10 || // lava + blockUp == 11 || blockLeft == 11 || blockRight == 11 || // lava + + blockUp == 37 || blockLeft == 37 || blockRight == 37 || // flower + blockUp == 38 || blockLeft == 38 || blockRight == 38 || // flower + blockUp == 6 || blockLeft == 6 || blockRight == 6 || // tree + blockUp == 39 || blockLeft == 39 || blockRight == 39 || // mushroom + blockUp == 40 || blockLeft == 40 || blockRight == 40) // mushroom + BlendTile(); + } + + x++; + if (x == (Rot == 1 || Rot == 3 ? dimY : dimX)) + { + y++; + x = 0; + } + if (y == (Rot == 1 || Rot == 3 ? dimX : dimY)) + { + z++; + y = 0; + if (worker != null && z % 4 == 0) + { + if (worker.CancellationPending) return null; + worker.ReportProgress((z * 100) / Level.depth); + } + } + } + } + } + } + + int xMin = 0, xMax = imageWidth - 1, yMin = 0, yMax = imageHeight - 1; + bool cont = true; + int offset; + + // find left bound (xMin) + for (x = 0; cont && x < imageWidth; x++) + { + offset = x * 4 + 3; + for (y = 0; y < imageHeight; y++) + { + if (image[offset] > 0) + { + xMin = x; + cont = false; + break; + } + offset += imageStride; + } + } + + if (worker != null && worker.CancellationPending) return null; + + // find top bound (yMin) + cont = true; + for (y = 0; cont && y < imageHeight; y++) + { + offset = imageStride * y + xMin * 4 + 3; + for (x = xMin; x < imageWidth; x++) + { + if (image[offset] > 0) + { + yMin = y; + cont = false; + break; + } + offset += 4; + } + } + + if (worker != null && worker.CancellationPending) return null; + + // find right bound (xMax) + cont = true; + for (x = imageWidth - 1; cont && x >= xMin; x--) + { + offset = x * 4 + 3 + yMin * imageStride; + for (y = yMin; y < imageHeight; y++) + { + if (image[offset] > 0) + { + xMax = x + 1; + cont = false; + break; + } + offset += imageStride; + } + } + + if (worker != null && worker.CancellationPending) return null; + + // find bottom bound (yMax) + cont = true; + for (y = imageHeight - 1; cont && y >= yMin; y--) + { + offset = imageStride * y + 3 + xMin * 4; + for (x = xMin; x < xMax; x++) + { + if (image[offset] > 0) + { + yMax = y + 1; + cont = false; + break; + } + offset += 4; + } + } + + cropRectangle = new Rectangle(Math.Max(0, xMin - 2), + Math.Max(0, yMin - 2), + Math.Min(imageBmp.Width, xMax - xMin + 4), + Math.Min(imageBmp.Height, yMax - yMin + 4)); + return imageBmp; + } + finally + { + imageBmp.UnlockBits(imageData); + if (worker != null && worker.CancellationPending && imageBmp != null) + { + try + { + imageBmp.Dispose(); + } + catch (ObjectDisposedException) { } + } + } + } + + + void BlendTile() + { + int pos = (x + (Rot == 1 || Rot == 3 ? offsetY : offsetX)) * isoX + (y + (Rot == 1 || Rot == 3 ? offsetX : offsetY)) * isoY + z * isoH + isoOffset; + if (block > 49) return; + int tileOffset = block * TileStride; + BlendPixel(pos, tileOffset); + BlendPixel(pos + 4, tileOffset + 4); + BlendPixel(pos + 8, tileOffset + 8); + BlendPixel(pos + 12, tileOffset + 12); + pos += imageStride; + BlendPixel(pos, tileOffset + 16); + BlendPixel(pos + 4, tileOffset + 20); + BlendPixel(pos + 8, tileOffset + 24); + BlendPixel(pos + 12, tileOffset + 28); + pos += imageStride; + BlendPixel(pos, tileOffset + 32); + BlendPixel(pos + 4, tileOffset + 36); + BlendPixel(pos + 8, tileOffset + 40); + BlendPixel(pos + 12, tileOffset + 44); + pos += imageStride; + //BlendPixel( pos, tileOffset + 48 ); // bottom left block, always blank in current tileset + BlendPixel(pos + 4, tileOffset + 52); + BlendPixel(pos + 8, tileOffset + 56); + //BlendPixel( pos + 12, tileOffset + 60 ); // bottom right block, always blank in current tileset + } + + + const byte ShadingStrength = 48; + readonly int blendDivisor, mh34; + + // inspired by http://www.devmaster.net/wiki/Alpha_blending + void BlendPixel(int imageOffset, int tileOffset) + { + int sourceAlpha; + if (ctp[tileOffset + 3] == 0) return; + + byte tA = ctp[tileOffset + 3]; + + // Get final alpha channel. + int finalAlpha = tA + ((255 - tA) * image[imageOffset + 3]) / 255; + + // Get percentage (out of 256) of source alpha compared to final alpha + if (finalAlpha == 0) + { + sourceAlpha = 0; + } + else + { + sourceAlpha = tA * 255 / finalAlpha; + } + + // Destination percentage is just the additive inverse. + int destAlpha = 255 - sourceAlpha; + + if (z < (Level.height >> 1)) + { + int shadow = (z >> 1) + mh34; + image[imageOffset] = (byte)((ctp[tileOffset] * sourceAlpha * shadow + image[imageOffset] * destAlpha * Level.height) / blendDivisor); + image[imageOffset + 1] = (byte)((ctp[tileOffset + 1] * sourceAlpha * shadow + image[imageOffset + 1] * destAlpha * Level.height) / blendDivisor); + image[imageOffset + 2] = (byte)((ctp[tileOffset + 2] * sourceAlpha * shadow + image[imageOffset + 2] * destAlpha * Level.height) / blendDivisor); + } + else + { + int shadow = (z - (Level.height >> 1)) * ShadingStrength; + image[imageOffset] = (byte)Math.Min(255, (ctp[tileOffset] * sourceAlpha + shadow + image[imageOffset] * destAlpha) / 255); + image[imageOffset + 1] = (byte)Math.Min(255, (ctp[tileOffset + 1] * sourceAlpha + shadow + image[imageOffset + 1] * destAlpha) / 255); + image[imageOffset + 2] = (byte)Math.Min(255, (ctp[tileOffset + 2] * sourceAlpha + shadow + image[imageOffset + 2] * destAlpha) / 255); + } + + image[imageOffset + 3] = (byte)finalAlpha; + } + + byte GetBlock(int xx, int yy, int zz) + { + int realx; + int realy; + switch (Rot) + { + case 0: + realx = xx; + realy = yy; + break; + case 1: + realx = dimX1 - yy; + realy = xx; + break; + case 2: + realx = dimX1 - xx; + realy = dimY1 - yy; + break; + default: + realx = yy; + realy = dimY1 - xx; + break; + } + int pos = (zz * dimY + realy) * dimX + realx; + + if (Mode == IsoCatMode.Normal) + { + return Block.Convert(bp[pos]); + } + else if (Mode == IsoCatMode.Peeled && (xx == (Rot == 1 || Rot == 3 ? dimY1 : dimX1) || yy == (Rot == 1 || Rot == 3 ? dimX1 : dimY1) || zz == Level.height - 1)) + { + return 0; + } + else if (Mode == IsoCatMode.Cut && xx > (Rot == 1 || Rot == 3 ? dimY2 : dimX2) && yy > (Rot == 1 || Rot == 3 ? dimX2 : dimY2)) + { + return 0; + } + else if (Mode == IsoCatMode.Chunk && (realx < ChunkCoords[0] || realy < ChunkCoords[1] || zz < ChunkCoords[2] || realx > ChunkCoords[3] || realy > ChunkCoords[4] || zz > ChunkCoords[5])) + { + return 0; + } + + return Block.Convert(bp[pos]); + } + } +}*/ \ No newline at end of file diff --git a/MCSong/GUI/NewLevelDialog.Designer.cs b/MCSong/GUI/NewLevelDialog.Designer.cs new file mode 100644 index 0000000..0637649 --- /dev/null +++ b/MCSong/GUI/NewLevelDialog.Designer.cs @@ -0,0 +1,233 @@ +namespace MCSong.Gui +{ + partial class NewLevelDialog + { + /// + /// 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() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(NewLevelDialog)); + this.label1 = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + this.label3 = new System.Windows.Forms.Label(); + this.label4 = new System.Windows.Forms.Label(); + this.txtName = new System.Windows.Forms.TextBox(); + this.cmbX = new System.Windows.Forms.ComboBox(); + this.cmbZ = new System.Windows.Forms.ComboBox(); + this.cmbY = new System.Windows.Forms.ComboBox(); + this.label5 = new System.Windows.Forms.Label(); + this.cmbType = new System.Windows.Forms.ComboBox(); + this.btnCancel = new System.Windows.Forms.Button(); + this.btnCreate = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(12, 9); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(38, 13); + this.label1.TabIndex = 0; + this.label1.Text = "Name:"; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(14, 35); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(54, 13); + this.label2.TabIndex = 1; + this.label2.Text = "Width (X):"; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(13, 89); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(55, 13); + this.label3.TabIndex = 2; + this.label3.Text = "Depth (Z):"; + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Location = new System.Drawing.Point(11, 62); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(57, 13); + this.label4.TabIndex = 3; + this.label4.Text = "Height (Y):"; + // + // txtName + // + this.txtName.Location = new System.Drawing.Point(56, 6); + this.txtName.Name = "txtName"; + this.txtName.Size = new System.Drawing.Size(104, 20); + this.txtName.TabIndex = 4; + // + // cmbX + // + this.cmbX.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbX.FormattingEnabled = true; + this.cmbX.Items.AddRange(new object[] { + "16", + "32", + "64", + "128", + "256", + "512", + "1024"}); + this.cmbX.Location = new System.Drawing.Point(72, 32); + this.cmbX.Name = "cmbX"; + this.cmbX.Size = new System.Drawing.Size(88, 21); + this.cmbX.TabIndex = 5; + // + // cmbZ + // + this.cmbZ.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbZ.FormattingEnabled = true; + this.cmbZ.Items.AddRange(new object[] { + "16", + "32", + "64", + "128", + "256", + "512", + "1024"}); + this.cmbZ.Location = new System.Drawing.Point(72, 86); + this.cmbZ.Name = "cmbZ"; + this.cmbZ.Size = new System.Drawing.Size(88, 21); + this.cmbZ.TabIndex = 6; + // + // cmbY + // + this.cmbY.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbY.FormattingEnabled = true; + this.cmbY.Items.AddRange(new object[] { + "16", + "32", + "64", + "128", + "256", + "512", + "1024"}); + this.cmbY.Location = new System.Drawing.Point(72, 59); + this.cmbY.Name = "cmbY"; + this.cmbY.Size = new System.Drawing.Size(88, 21); + this.cmbY.TabIndex = 7; + // + // label5 + // + this.label5.AutoSize = true; + this.label5.Location = new System.Drawing.Point(12, 116); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(34, 13); + this.label5.TabIndex = 8; + this.label5.Text = "Type:"; + // + // cmbType + // + this.cmbType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbType.FormattingEnabled = true; + this.cmbType.Items.AddRange(new object[] { + "flat", + "pixel", + "space", + "island", + "mountans", + "ocean", + "forest", + "desert", + "random"}); + this.cmbType.Location = new System.Drawing.Point(52, 113); + this.cmbType.Name = "cmbType"; + this.cmbType.Size = new System.Drawing.Size(108, 21); + this.cmbType.TabIndex = 9; + // + // btnCancel + // + this.btnCancel.Location = new System.Drawing.Point(93, 140); + this.btnCancel.Name = "btnCancel"; + this.btnCancel.Size = new System.Drawing.Size(67, 23); + this.btnCancel.TabIndex = 10; + this.btnCancel.Text = "Cancel"; + this.btnCancel.UseVisualStyleBackColor = true; + this.btnCancel.Click += new System.EventHandler(this.btnCancel_Click); + // + // btnCreate + // + this.btnCreate.Location = new System.Drawing.Point(12, 140); + this.btnCreate.Name = "btnCreate"; + this.btnCreate.Size = new System.Drawing.Size(65, 23); + this.btnCreate.TabIndex = 11; + this.btnCreate.Text = "Create"; + this.btnCreate.UseVisualStyleBackColor = true; + this.btnCreate.Click += new System.EventHandler(this.btnCreate_Click); + // + // NewLevelDialog + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(172, 174); + this.Controls.Add(this.btnCreate); + this.Controls.Add(this.btnCancel); + this.Controls.Add(this.cmbType); + this.Controls.Add(this.label5); + this.Controls.Add(this.cmbY); + this.Controls.Add(this.cmbZ); + this.Controls.Add(this.cmbX); + this.Controls.Add(this.txtName); + this.Controls.Add(this.label4); + this.Controls.Add(this.label3); + this.Controls.Add(this.label2); + this.Controls.Add(this.label1); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "NewLevelDialog"; + this.ShowInTaskbar = false; + this.Text = "Create New Level"; + this.Load += new System.EventHandler(this.NewLevelDialog_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.TextBox txtName; + private System.Windows.Forms.ComboBox cmbX; + private System.Windows.Forms.ComboBox cmbZ; + private System.Windows.Forms.ComboBox cmbY; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.ComboBox cmbType; + private System.Windows.Forms.Button btnCancel; + private System.Windows.Forms.Button btnCreate; + } +} \ No newline at end of file diff --git a/MCSong/GUI/NewLevelDialog.cs b/MCSong/GUI/NewLevelDialog.cs new file mode 100644 index 0000000..1aed097 --- /dev/null +++ b/MCSong/GUI/NewLevelDialog.cs @@ -0,0 +1,63 @@ +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 System.IO; + +namespace MCSong.Gui +{ + public partial class NewLevelDialog : Form + { + public NewLevelDialog() + { + InitializeComponent(); + } + + private void btnCancel_Click(object sender, EventArgs e) + { + this.DialogResult = DialogResult.Cancel; + } + + private void btnCreate_Click(object sender, EventArgs e) + { + string errors = ""; + if (String.IsNullOrWhiteSpace(txtName.Text)) + errors += "The name cannot be blank.\r\n"; + if (errors == "") + if (File.Exists("levels/" + txtName.Text + ".lvl")) + errors += "A level with this name already exists.\r\n"; + if (cmbX.SelectedIndex < 0) + errors += "A width must be selected.\r\n"; + if (cmbZ.SelectedIndex < 0) + errors += "A height must be selected.\r\n"; + if (cmbY.SelectedIndex < 0) + errors += "A depth must be selected.\r\n"; + if (cmbType.SelectedIndex < 0) + errors += "A type must be selected."; + if (errors != "") + MessageBox.Show(errors); + else + { + Level l = new Level(txtName.Text, Convert.ToUInt16(cmbX.Items[cmbX.SelectedIndex]), Convert.ToUInt16(cmbY.Items[cmbY.SelectedIndex]), Convert.ToUInt16(cmbZ.Items[cmbZ.SelectedIndex]),cmbType.Items[cmbType.SelectedIndex].ToString()); + l.Save(true, true); + Server.addLevel(Level.Load(l.name)); + MessageBox.Show(String.Format("Created {0} type level named {1}, with dimensions {2}, {3}, {4}.", new object[] { cmbType.Items[cmbType.SelectedIndex].ToString(), l.name, l.width, l.depth, l.height })); + this.DialogResult = DialogResult.OK; + } + } + + private void NewLevelDialog_Load(object sender, EventArgs e) + { + txtName.Text = "NewLevel"; + cmbX.SelectedIndex = cmbZ.SelectedIndex = 3; + cmbY.SelectedIndex = 2; + cmbType.SelectedIndex = 0; + txtName.SelectAll(); + } + } +} diff --git a/MCSong/GUI/NewLevelDialog.resx b/MCSong/GUI/NewLevelDialog.resx new file mode 100644 index 0000000..dc35ce2 --- /dev/null +++ b/MCSong/GUI/NewLevelDialog.resx @@ -0,0 +1,675 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + + AAABAAQAQEAAAAEAIAAoQAAARgAAACAgAAABACAAKBAAAG5AAAAYGAAAAQAgACgJAACWUAAAEBAAAAEA + IAAoBAAAvlkAACgAAABAAAAAgAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAABEAAABJAAAAhgAAAIYAAACGAAAAhgAAAIYAAABIAAAAEQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHkAAADiAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AOEAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADkAAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAALoAAAAiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAC3AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA2wAAACAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAASAAAA9QAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAADcAAAAFQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAEQAAAO4AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAH0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABEAAADyAAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADKAAAACwAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAnQAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + ACkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAACcAAAD+AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAAnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbwAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAJwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAClAAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAACcAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAGEAAAD5AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD9AAAA/wAA + AP8AAAAnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALAAAAIwAAADUAAAA/QAAAP8AAAD/AAAA+gAA + AMwAAABVAAAAmAAAAP8AAAD/AAAAJwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAA + ADgAAAB1AAAAdQAAADAAAAAEAAAAAAAAAIwAAAD/AAAA/wAAACcAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAA/wAAAP8AAAAnAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAA + AP8AAAD/AAAAJwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAJAAAAD/AAAA/wAAACcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAA/wAAAP8AAAAnAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAIwAAAGgAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAAP8AAAD/AAAAJwAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACcAAAA0gAAABEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AJAAAAD/AAAA/wAAACcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAP4AAADKAAAADQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAACQAAAA/wAAAP8AAAAnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAACLAAAA/wAAAIEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAAP8AAAD/AAAAJwAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAGwAAAO0AAAD/AAAANQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAAAAD/AAAA/wAA + ACcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAA/wAAANYAAAAOAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAACQAAAA/wAAAP8AAAAnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAA + AP8AAAD/AAAAOQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAAP8AAAD/AAAAJwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAACUAAAD/AAAA/wAAALIAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAAAAD/AAAA/wAAACcAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqAAAA/wAAAP8AAADzAAAACgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAA/wAA + AP8AAAAnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKgAAAP8AAAD/AAAA9wAA + AEcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAkAAAAP8AAAD/AAAAJwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + ACoAAAD/AAAA/wAAAP8AAAB5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAAAAD/AAAA/wAAACcAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAqAAAA/wAAAP8AAAD/AAAAcQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAA/wAAAP8AAAAnAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJgAAAP8AAAD/AAAA/wAAAHEAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAA + AP8AAAD/AAAAJwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAD/AAAA/wAA + AP8AAABxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAJAAAAD/AAAA/wAAACcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAACOAAAA/wAAAP8AAAD/AAAAcQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAA/wAAAP8AAAAnAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAFAAAAtAAAAP8AAAD/AAAA/wAAAHMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAAP8AAAD/AAAAJwAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAPkAAAD/AAAA/wAAAP4AAABtAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AJAAAAD/AAAA/wAAACcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAH0AAAD+AAAA/wAA + AP8AAAD0AAAAGwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAACQAAAA/wAAAP8AAAAnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAEAAADhAAAA/wAAAP8AAAD/AAAA2gAAAAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAAP8AAAD/AAAAJwAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAABEAAAA+QAAAP8AAAD/AAAA/wAAAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAAAAD/AAAA/wAA + ACcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvwAAAP8AAAD/AAAA/wAAAP8AAABjAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAACQAAAA/wAAAP8AAAAnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbwAAAP8AAAD/AAAA/wAA + AP8AAAD5AAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAAP8AAAD/AAAAJwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAA + AO0AAAD/AAAA/wAAAP8AAAD/AAAAmAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAAAAD/AAAA/wAAACcAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAJUAAAD/AAAA/wAAAP8AAAD/AAAA/wAAADYAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAA/wAA + AP8AAAAnAAAAAAAAAAAAAAAAAAAAAAAAAJEAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAM0AAAALAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAkAAAAP8AAAD/AAAAJwAAAAAAAAAAAAAAAAAAAJAAAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAABWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAAAAD/AAAA/wAAACgAAAAAAAAAAAAAAJAAAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAADOAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAA/wAAAP8AAAAZAAAAFwAA + AJQAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD7AAAAKwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAA + AP8AAAD1AAAASwAAANcAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAewAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAJAAAAD/AAAA+gAAAPcAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAzwAA + AAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAAzwAAABkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAADUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AJAAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAGMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAACQAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAGQAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AGUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAAAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAGUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAACQAAAA/wAAAP8AAAD/AAAA/wAAAGIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAAP8AAAD/AAAA/wAAAGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI8AAAD/AAAA/wAAAGUAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACjAAAA3QAA + AEsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAYwAAACcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAACAA + AABAAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABbAAAArwAAAL8AAAC/AAAAjAAAACAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQwAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA7QAA + AEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACKAAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA+wAAACYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGkAAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQAA + ANoAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAACSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAKgAAAM4AAAD/AAAA/wAAAP8AAAD/AAAA/AAAAI4AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAFsAAACrAAAAqAAAAEwAAADYAAAAmwAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANkAAACeAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2gAA + AJ0AAAAAAAAAAAAAAAAAAAAmAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAADaAAAAnQAAAAAAAAAAAAAAAAAAAD8AAACnAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAANoAAACdAAAAAAAAAAAAAAAAAAAAAAAAAL0AAACAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAA2gAAAJ0AAAAAAAAAAAAAAAAAAAAAAAAASgAAAP4AAAAYAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADaAAAAnQAAAAAAAAAAAAAAAAAAAAAAAAAbAAAA/wAA + AHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANoAAACdAAAAAAAAAAAAAAAAAAAAAAAA + ABwAAAD/AAAAswAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2gAAAJ0AAAAAAAAAAAAA + AAAAAAAAAAAAGQAAAP8AAAC+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADaAAAAnQAA + AAAAAAAAAAAAAAAAAAAAAAAxAAAA/wAAALoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + ANoAAACdAAAAAAAAAAAAAAAAAAAAAAAAAHMAAAD/AAAAtgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAA2gAAAJ0AAAAAAAAAAAAAAAAAAAABAAAA0gAAAP8AAAB/AAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAADaAAAAnQAAAAAAAAAAAAAAAAAAAEIAAAD/AAAA/wAAAD8AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANoAAACdAAAAAAAAAAAAAAAAAAAA0wAAAP8AAADfAAAACgAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2gAAAJ4AAAAAAAAAAAAAAIsAAAD/AAAA/wAA + AIEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADbAAAAlgAAAAAAAACJAAAA/wAA + AP8AAADzAAAAGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANUAAACkAAAAjgAA + AP8AAAD/AAAA/wAAAGkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxQAA + AP0AAAD/AAAA/wAAAP8AAACrAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAADFAAAA/wAAAP8AAAD/AAAA1AAAAAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAMUAAAD/AAAA/wAAANQAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAxAAAAP8AAADUAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADbAAAA3QAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAHYAAAAXAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAGAAAADAA + AAABACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADEAAABUAAAATgAAABQAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAXAAAAP8AAAD/AAAA/wAAAOcAAABUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArAAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAALAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAZAAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAbAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AJkAAAD/AAAA/wAAAP8AAAD9AAAAbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAggAAAFkAAACyAAAAfAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACoAAAAgAAAAAAAAAABAAAABgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAACrAAAAfwAAAAAAAAABAAAAWAAAAEMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACrAAAAfwAAAAAAAAAAAAAAHAAA + AMEAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAACrAAAAfwAAAAAAAAAAAAAAAAAAALIAAACCAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACrAAAAfwAA + AAAAAAAAAAAAAAAAAJoAAADRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACrAAAAfwAAAAAAAAAAAAAAAAAAAJkAAADfAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAACrAAAAfwAAAAAAAAAAAAAAAAAAAMcAAADaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACrAAAAfwAAAAAAAAAAAAAAGgAA + APwAAACtAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAACrAAAAfwAAAAAAAAAAAAAAhwAAAP8AAABlAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACrAAAAgAAA + AAAAAAArAAAA+gAAAPYAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACsAAAAbAAAABkAAADiAAAA/wAAAJcAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAACfAAAAtAAAANsAAAD/AAAA6AAAABMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACUAAAA/wAAAP8AAAD/AAAAPgAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAACVAAAA/wAAAP8AAABbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAA/wAA + AFsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOAAAAaQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAABAA + AAAgAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaQAA + ANYAAADNAAAAWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AMgAAAD/AAAA/wAAAP8AAAAtAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAABHAAAA8QAAAP8AAAD/AAAASwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAB8AAABRAAAAjAAAAFcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGwAAABdAAAAAAAAADoAAAAFAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABzAAAAXAAAAAAAAABUAAAAZgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcwAAAFwAAAAAAAAAIgAAALoAAAACAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHMAAABcAAAAAAAAACIAAADSAAAABAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABzAAAAXQAAAAAAAABeAAAA2wAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcwAAAFcAAAAAAAAA2QAA + AJoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHEAAABNAAAAeQAA + AP8AAAApAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABkAAAA2AAA + AP8AAACHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZQAA + AP8AAACtAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AHYAAAC9AAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAgAAAABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + 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 + 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 + 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 + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + + + \ No newline at end of file diff --git a/MCSong/GUI/Program.cs b/MCSong/GUI/Program.cs index 34a1732..02d36c5 100644 --- a/MCSong/GUI/Program.cs +++ b/MCSong/GUI/Program.cs @@ -16,7 +16,7 @@ using System.Net; using MCSong; -namespace MCLawl_.Gui +namespace MCSong_.Gui { public static class Program { @@ -50,6 +50,13 @@ public static void ThreadExHandler(object sender, ThreadExceptionEventArgs e) Program.restartMe(false); } + public static void WriteLine(string message = "") + { + if (message == "") { Console.WriteLine(); return; } + try { Console.WriteLine(Server.StripColors(message)); } + catch { Console.WriteLine(message); } + } + public static void Main(string[] args) { if (Process.GetProcessesByName("MCSong").Length != 1) @@ -74,7 +81,7 @@ public static void Main(string[] args) StreamWriter SW = new StreamWriter(File.Create("Viewmode.cfg")); SW.WriteLine("#This file controls how the console window is shown to the server host"); SW.WriteLine("#cli: True or False (Determines whether a CLI interface is used) (Set True if on Mono)"); - SW.WriteLine("#high-quality: True or false (Determines whether the GUI interface uses higher quality objects)"); + SW.WriteLine("#high-quality: True or false (Determines whether the Gui interface uses higher quality objects)"); SW.WriteLine(); SW.WriteLine("cli = false"); SW.WriteLine("high-quality = true"); @@ -91,12 +98,13 @@ public static void Main(string[] args) if (foundView[4].Split(' ')[2].ToLower() == "true") { Server s = new Server(); - s.OnLog += Console.WriteLine; - s.OnCommand += Console.WriteLine; - s.OnSystem += Console.WriteLine; + s.OnLog += WriteLine; + s.OnCommand += WriteLine; + s.OnSystem += WriteLine; s.Start(); - Console.Title = Server.name + " MCSong Version: " + Server.Version; + Console.Title = Server.name + " - MCSong Version: " + Server.Version; + usingConsole = true; handleComm(Console.ReadLine()); @@ -127,6 +135,84 @@ public static void Main(string[] args) public static void handleComm(string s) { + if (s == "") goto handle; + switch (s[0]) + { + case '/': + case '!':// Command + string cmd = "", msg = ""; + s = s.Remove(0, 1); + if (s.IndexOf(' ') != -1) + { + cmd = s.Split(' ')[0]; + msg = s.Substring(s.IndexOf(' ') + 1); + } + else if (s != "") + { + cmd = s; + } + else + { + WriteLine("CONSOLE: Whitespace commands are not allowed"); + goto handle; + } + + try + { + Command c = Command.all.Find(cmd); + if (c != null) + { + if (c.consoleUsable) + { + c.Use(null, msg); + WriteLine("CONSOLE: USED /" + cmd + " " + msg); + } + else + { + WriteLine("CONSOLE: Cannot use /" + cmd); + } + } + else + { + WriteLine("CONSOLE: Command /" + cmd + " not found"); + } + } + catch (Exception e) + { + Server.ErrorLog(e); + WriteLine("CONSOLE: Failed command"); + + } + break; + case '#':// OP Chat + s = s.Remove(0, 1); + Player.GlobalMessageOps("To Ops &f-" + Server.DefaultColor + "Console [&a" + Server.ZallState + Server.DefaultColor + "]&f- " + s); + Server.s.Log("(OPs): Console: " + s); + //IRCBot.Say("Console: " + s, true); + break; + case ';':// Admin Chat + s = s.Remove(0, 1); + Player.GlobalMessageAdmins("To Admins &f-" + Server.DefaultColor + "Console [&a" + Server.ZallState + Server.DefaultColor + "]&f- " + s); + Server.s.Log("(Admins): Console: " + s); + //IRCBot.Say("Console: " + s, true); + break; + case '\\':// Global Chat + s = s.Remove(0, 1); + Player.GlobalMessageGC(Server.gcColor + "[Global][" + Server.gcNick + "] Console: &f" + s); + Server.s.Log("[Global][" + Server.gcNick + "] Console: " + s); + //GlobalBot.Say("Console: " + s); + break; + default:// Chat + Player.GlobalMessage("Console [&a" + Server.ZallState + Server.DefaultColor + "]: &f" + s); + //IRCBot.Say("Console [" + Server.ZallState + "]: " + s); + WriteLine(" " + s); + break; + } + handle: + handleComm(Console.ReadLine()); + + // OLD (MCLawl) MESSAGE HANDLING + /* string sentCmd = "", sentMsg = ""; if (s.IndexOf(' ') != -1) @@ -148,22 +234,32 @@ public static void handleComm(string s) Command cmd = Command.all.Find(sentCmd); if (cmd != null) { - cmd.Use(null, sentMsg); - Console.WriteLine("CONSOLE: USED /" + sentCmd + " " + sentMsg); - handleComm(Console.ReadLine()); + if (cmd.consoleUsable) + { + cmd.Use(null, sentMsg); + WriteLine("CONSOLE: USED /" + sentCmd + " " + sentMsg); + handleComm(Console.ReadLine()); + } + else + { + WriteLine("CONSOLE: Cannot use /" + sentCmd); + handleComm(Console.ReadLine()); + } return; } } catch (Exception e) { Server.ErrorLog(e); - Console.WriteLine("CONSOLE: Failed command."); + WriteLine("CONSOLE: Failed command."); handleComm(Console.ReadLine()); return; } + talk: handleComm("say " + MCSong.Group.findPerm(LevelPermission.Admin).color + "Console: &f" + s); handleComm(Console.ReadLine()); + */ } public static bool CurrentUpdate = false; @@ -242,8 +338,8 @@ public static void UpdateCheck(bool wait = false, Player p = null) { ConsoleColor prevColor = Console.ForegroundColor; Console.ForegroundColor = ConsoleColor.Red; - Console.WriteLine("An update was found!"); - Console.WriteLine("Update using the file at updates.mcsong.x10.mx/MCSong_.dll and placing it over the top of your current MCSong_.dll!"); + WriteLine("An update was found!"); + WriteLine("Update using the file at updates.mcsong.x10.mx/MCSong_.dll and placing it over the top of your current MCSong_.dll!"); Console.ForegroundColor = prevColor; } } diff --git a/MCSong/GUI/PropertyWindow.Designer.cs b/MCSong/GUI/PropertyWindow.Designer.cs index a64bc94..f2b0aee 100644 --- a/MCSong/GUI/PropertyWindow.Designer.cs +++ b/MCSong/GUI/PropertyWindow.Designer.cs @@ -31,84 +31,94 @@ private void InitializeComponent() this.components = new System.ComponentModel.Container(); this.tabControl = new System.Windows.Forms.TabControl(); this.tabPage1 = new System.Windows.Forms.TabPage(); - this.chkMaintKick = new System.Windows.Forms.CheckBox(); - this.cmbMaintenance = new System.Windows.Forms.ComboBox(); - this.label33 = new System.Windows.Forms.Label(); - this.chkLogBeat = new System.Windows.Forms.CheckBox(); - this.cmbOpChat = new System.Windows.Forms.ComboBox(); - this.lblOpChat = new System.Windows.Forms.Label(); - this.cmbDefaultRank = new System.Windows.Forms.ComboBox(); - this.label29 = new System.Windows.Forms.Label(); - this.txtOpChannel = new System.Windows.Forms.TextBox(); - this.label31 = new System.Windows.Forms.Label(); - this.lblIRC = new System.Windows.Forms.Label(); - this.lblDefault = new System.Windows.Forms.Label(); - this.cmbIRCColour = new System.Windows.Forms.ComboBox(); - this.cmbDefaultColour = new System.Windows.Forms.ComboBox(); - this.chkMono = new System.Windows.Forms.CheckBox(); + this.groupBox9 = new System.Windows.Forms.GroupBox(); + this.chkDebug = new System.Windows.Forms.CheckBox(); this.chkRestart = new System.Windows.Forms.CheckBox(); - this.chkIRC = new System.Windows.Forms.CheckBox(); - this.chkPublic = new System.Windows.Forms.CheckBox(); - this.chkAutoload = new System.Windows.Forms.CheckBox(); - this.chkWorld = new System.Windows.Forms.CheckBox(); - this.label23 = new System.Windows.Forms.Label(); + this.chkMono = new System.Windows.Forms.CheckBox(); + this.chkLogBeat = new System.Windows.Forms.CheckBox(); this.chkUpdates = new System.Windows.Forms.CheckBox(); + this.groupBox8 = new System.Windows.Forms.GroupBox(); + this.chkPremium = new System.Windows.Forms.CheckBox(); this.chkVerify = new System.Windows.Forms.CheckBox(); - this.label10 = new System.Windows.Forms.Label(); - this.label27 = new System.Windows.Forms.Label(); - this.label22 = new System.Windows.Forms.Label(); - this.label21 = new System.Windows.Forms.Label(); - this.label30 = new System.Windows.Forms.Label(); - this.label3 = new System.Windows.Forms.Label(); - this.txtDepth = new System.Windows.Forms.TextBox(); - this.txtMain = new System.Windows.Forms.TextBox(); - this.txtMaps = new System.Windows.Forms.TextBox(); - this.txtPlayers = new System.Windows.Forms.TextBox(); - this.txtHost = new System.Windows.Forms.TextBox(); - this.txtPort = new System.Windows.Forms.TextBox(); + this.chkPublic = new System.Windows.Forms.CheckBox(); + this.groupBox7 = new System.Windows.Forms.GroupBox(); + this.chkMaintKick = new System.Windows.Forms.CheckBox(); + this.label33 = new System.Windows.Forms.Label(); + this.cmbMaintenance = new System.Windows.Forms.ComboBox(); + this.groupBox6 = new System.Windows.Forms.GroupBox(); + this.label41 = new System.Windows.Forms.Label(); + this.button3 = new System.Windows.Forms.Button(); + this.chkUPNP = new System.Windows.Forms.CheckBox(); + this.txtName = new System.Windows.Forms.TextBox(); this.label2 = new System.Windows.Forms.Label(); - this.label5 = new System.Windows.Forms.Label(); - this.label6 = new System.Windows.Forms.Label(); - this.label4 = new System.Windows.Forms.Label(); - this.label1 = new System.Windows.Forms.Label(); this.txtMOTD = new System.Windows.Forms.TextBox(); - this.txtChannel = new System.Windows.Forms.TextBox(); - this.txtIRCServer = new System.Windows.Forms.TextBox(); - this.txtNick = new System.Windows.Forms.TextBox(); - this.txtName = new System.Windows.Forms.TextBox(); - this.ChkTunnels = new System.Windows.Forms.CheckBox(); - this.label7 = new System.Windows.Forms.Label(); - this.tabPage4 = new System.Windows.Forms.TabPage(); - this.chkRepeatMessages = new System.Windows.Forms.CheckBox(); - this.chkForceCuboid = new System.Windows.Forms.CheckBox(); - this.txtShutdown = new System.Windows.Forms.TextBox(); - this.txtBanMessage = new System.Windows.Forms.TextBox(); + this.label3 = new System.Windows.Forms.Label(); + this.label1 = new System.Windows.Forms.Label(); + this.txtPort = new System.Windows.Forms.TextBox(); + this.tabPage7 = new System.Windows.Forms.TabPage(); + this.groupBox4 = new System.Windows.Forms.GroupBox(); + this.groupBox3 = new System.Windows.Forms.GroupBox(); + this.groupBox2 = new System.Windows.Forms.GroupBox(); + this.label36 = new System.Windows.Forms.Label(); + this.cmbOpChat = new System.Windows.Forms.ComboBox(); + this.lblOpChat = new System.Windows.Forms.Label(); + this.cmbAdminChat = new System.Windows.Forms.ComboBox(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.txtRestartTime = new System.Windows.Forms.TextBox(); this.chkShutdown = new System.Windows.Forms.CheckBox(); this.chkBanMessage = new System.Windows.Forms.CheckBox(); - this.chkrankSuper = new System.Windows.Forms.CheckBox(); + this.txtBanMessage = new System.Windows.Forms.TextBox(); + this.txtShutdown = new System.Windows.Forms.TextBox(); this.chkCheap = new System.Windows.Forms.CheckBox(); - this.chkDeath = new System.Windows.Forms.CheckBox(); + this.txtCheap = new System.Windows.Forms.TextBox(); + this.chkRestartTime = new System.Windows.Forms.CheckBox(); + this.label34 = new System.Windows.Forms.Label(); + this.chkRepeatMessages = new System.Windows.Forms.CheckBox(); + this.txtMoneys = new System.Windows.Forms.TextBox(); + this.chkWorld = new System.Windows.Forms.CheckBox(); this.chk17Dollar = new System.Windows.Forms.CheckBox(); - this.chkPhysicsRest = new System.Windows.Forms.CheckBox(); this.chkSmile = new System.Windows.Forms.CheckBox(); + this.chkDeath = new System.Windows.Forms.CheckBox(); this.chkHelp = new System.Windows.Forms.CheckBox(); - this.label28 = new System.Windows.Forms.Label(); + this.txtHost = new System.Windows.Forms.TextBox(); + this.label10 = new System.Windows.Forms.Label(); + this.label30 = new System.Windows.Forms.Label(); + this.cmbDefaultColour = new System.Windows.Forms.ComboBox(); + this.lblDefault = new System.Windows.Forms.Label(); + this.tabPage4 = new System.Windows.Forms.TabPage(); + this.groupBox12 = new System.Windows.Forms.GroupBox(); + this.groupBox11 = new System.Windows.Forms.GroupBox(); + this.ChkTunnels = new System.Windows.Forms.CheckBox(); + this.label7 = new System.Windows.Forms.Label(); + this.txtDepth = new System.Windows.Forms.TextBox(); + this.label27 = new System.Windows.Forms.Label(); + this.label32 = new System.Windows.Forms.Label(); + this.label22 = new System.Windows.Forms.Label(); + this.txtMain = new System.Windows.Forms.TextBox(); + this.chkAutoload = new System.Windows.Forms.CheckBox(); + this.groupBox10 = new System.Windows.Forms.GroupBox(); + this.chkForceCuboid = new System.Windows.Forms.CheckBox(); + this.chkPhysicsRest = new System.Windows.Forms.CheckBox(); + this.txtRP = new System.Windows.Forms.TextBox(); this.label24 = new System.Windows.Forms.Label(); + this.label28 = new System.Windows.Forms.Label(); this.txtNormRp = new System.Windows.Forms.TextBox(); - this.txtRP = new System.Windows.Forms.TextBox(); - this.label34 = new System.Windows.Forms.Label(); - this.label26 = new System.Windows.Forms.Label(); + this.txtBackup = new System.Windows.Forms.TextBox(); + this.txtMaps = new System.Windows.Forms.TextBox(); + this.label9 = new System.Windows.Forms.Label(); + this.groupBox5 = new System.Windows.Forms.GroupBox(); + this.label39 = new System.Windows.Forms.Label(); + this.txtMaxGuests = new System.Windows.Forms.TextBox(); + this.chkrankSuper = new System.Windows.Forms.CheckBox(); + this.cmbDefaultRank = new System.Windows.Forms.ComboBox(); + this.label29 = new System.Windows.Forms.Label(); + this.label21 = new System.Windows.Forms.Label(); + this.txtPlayers = new System.Windows.Forms.TextBox(); this.label25 = new System.Windows.Forms.Label(); - this.txtAFKKick = new System.Windows.Forms.TextBox(); this.txtafk = new System.Windows.Forms.TextBox(); - this.label9 = new System.Windows.Forms.Label(); - this.txtBackup = new System.Windows.Forms.TextBox(); - this.label32 = new System.Windows.Forms.Label(); + this.label26 = new System.Windows.Forms.Label(); + this.txtAFKKick = new System.Windows.Forms.TextBox(); this.txtBackupLocation = new System.Windows.Forms.TextBox(); - this.txtMoneys = new System.Windows.Forms.TextBox(); - this.txtCheap = new System.Windows.Forms.TextBox(); - this.txtRestartTime = new System.Windows.Forms.TextBox(); - this.chkRestartTime = new System.Windows.Forms.CheckBox(); this.tabPage2 = new System.Windows.Forms.TabPage(); this.lblColor = new System.Windows.Forms.Label(); this.cmbColor = new System.Windows.Forms.ComboBox(); @@ -144,124 +154,143 @@ private void InitializeComponent() this.label19 = new System.Windows.Forms.Label(); this.label20 = new System.Windows.Forms.Label(); this.listBlocks = new System.Windows.Forms.ListBox(); + this.tabPage6 = new System.Windows.Forms.TabPage(); + this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); + this.gbIRC = new System.Windows.Forms.GroupBox(); + this.txtIrcPass = new System.Windows.Forms.TextBox(); + this.label35 = new System.Windows.Forms.Label(); + this.chkIrcIdentify = new System.Windows.Forms.CheckBox(); + this.txtNick = new System.Windows.Forms.TextBox(); + this.label4 = new System.Windows.Forms.Label(); + this.txtOpChannel = new System.Windows.Forms.TextBox(); + this.label31 = new System.Windows.Forms.Label(); + this.lblIRC = new System.Windows.Forms.Label(); + this.chkIRC = new System.Windows.Forms.CheckBox(); + this.label23 = new System.Windows.Forms.Label(); + this.label5 = new System.Windows.Forms.Label(); + this.cmbIRCColour = new System.Windows.Forms.ComboBox(); + this.label6 = new System.Windows.Forms.Label(); + this.txtChannel = new System.Windows.Forms.TextBox(); + this.txtIRCServer = new System.Windows.Forms.TextBox(); + this.gbGlobal = new System.Windows.Forms.GroupBox(); + this.button2 = new System.Windows.Forms.Button(); + this.txtGlobalPassword = new System.Windows.Forms.TextBox(); + this.chkGlobal = new System.Windows.Forms.CheckBox(); + this.label37 = new System.Windows.Forms.Label(); + this.cmbGlobalColor = new System.Windows.Forms.ComboBox(); + this.chkGlobalIdentify = new System.Windows.Forms.CheckBox(); + this.label40 = new System.Windows.Forms.Label(); + this.txtGlobalNick = new System.Windows.Forms.TextBox(); + this.lblGlobalColor = new System.Windows.Forms.Label(); + this.label38 = new System.Windows.Forms.Label(); this.btnSave = new System.Windows.Forms.Button(); this.btnDiscard = new System.Windows.Forms.Button(); this.btnApply = new System.Windows.Forms.Button(); this.toolTip = new System.Windows.Forms.ToolTip(this.components); this.tabControl.SuspendLayout(); this.tabPage1.SuspendLayout(); + this.groupBox9.SuspendLayout(); + this.groupBox8.SuspendLayout(); + this.groupBox7.SuspendLayout(); + this.groupBox6.SuspendLayout(); + this.tabPage7.SuspendLayout(); + this.groupBox2.SuspendLayout(); + this.groupBox1.SuspendLayout(); this.tabPage4.SuspendLayout(); + this.groupBox11.SuspendLayout(); + this.groupBox10.SuspendLayout(); + this.groupBox5.SuspendLayout(); this.tabPage2.SuspendLayout(); this.tabPage3.SuspendLayout(); this.tabPage5.SuspendLayout(); + this.tabPage6.SuspendLayout(); + this.tableLayoutPanel1.SuspendLayout(); + this.gbIRC.SuspendLayout(); + this.gbGlobal.SuspendLayout(); this.SuspendLayout(); // // tabControl // this.tabControl.Controls.Add(this.tabPage1); + this.tabControl.Controls.Add(this.tabPage7); this.tabControl.Controls.Add(this.tabPage4); this.tabControl.Controls.Add(this.tabPage2); this.tabControl.Controls.Add(this.tabPage3); this.tabControl.Controls.Add(this.tabPage5); + this.tabControl.Controls.Add(this.tabPage6); this.tabControl.Font = new System.Drawing.Font("Calibri", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.tabControl.Location = new System.Drawing.Point(0, 12); this.tabControl.Name = "tabControl"; this.tabControl.SelectedIndex = 0; - this.tabControl.Size = new System.Drawing.Size(345, 430); + this.tabControl.Size = new System.Drawing.Size(419, 430); this.tabControl.TabIndex = 0; // // tabPage1 // this.tabPage1.AutoScroll = true; - this.tabPage1.Controls.Add(this.chkMaintKick); - this.tabPage1.Controls.Add(this.cmbMaintenance); - this.tabPage1.Controls.Add(this.label33); - this.tabPage1.Controls.Add(this.chkLogBeat); - this.tabPage1.Controls.Add(this.cmbOpChat); - this.tabPage1.Controls.Add(this.lblOpChat); - this.tabPage1.Controls.Add(this.cmbDefaultRank); - this.tabPage1.Controls.Add(this.label29); - this.tabPage1.Controls.Add(this.txtOpChannel); - this.tabPage1.Controls.Add(this.label31); - this.tabPage1.Controls.Add(this.lblIRC); - this.tabPage1.Controls.Add(this.lblDefault); - this.tabPage1.Controls.Add(this.cmbIRCColour); - this.tabPage1.Controls.Add(this.cmbDefaultColour); - this.tabPage1.Controls.Add(this.chkMono); - this.tabPage1.Controls.Add(this.chkRestart); - this.tabPage1.Controls.Add(this.chkIRC); - this.tabPage1.Controls.Add(this.chkPublic); - this.tabPage1.Controls.Add(this.chkAutoload); - this.tabPage1.Controls.Add(this.chkWorld); - this.tabPage1.Controls.Add(this.label23); - this.tabPage1.Controls.Add(this.chkUpdates); - this.tabPage1.Controls.Add(this.chkVerify); - this.tabPage1.Controls.Add(this.label10); - this.tabPage1.Controls.Add(this.label27); - this.tabPage1.Controls.Add(this.label22); - this.tabPage1.Controls.Add(this.label21); - this.tabPage1.Controls.Add(this.label30); - this.tabPage1.Controls.Add(this.label3); - this.tabPage1.Controls.Add(this.txtDepth); - this.tabPage1.Controls.Add(this.txtMain); - this.tabPage1.Controls.Add(this.txtMaps); - this.tabPage1.Controls.Add(this.txtPlayers); - this.tabPage1.Controls.Add(this.txtHost); - this.tabPage1.Controls.Add(this.txtPort); - this.tabPage1.Controls.Add(this.label2); - this.tabPage1.Controls.Add(this.label5); - this.tabPage1.Controls.Add(this.label6); - this.tabPage1.Controls.Add(this.label4); - this.tabPage1.Controls.Add(this.label1); - this.tabPage1.Controls.Add(this.txtMOTD); - this.tabPage1.Controls.Add(this.txtChannel); - this.tabPage1.Controls.Add(this.txtIRCServer); - this.tabPage1.Controls.Add(this.txtNick); - this.tabPage1.Controls.Add(this.txtName); - this.tabPage1.Controls.Add(this.ChkTunnels); - this.tabPage1.Controls.Add(this.label7); + this.tabPage1.Controls.Add(this.groupBox9); + this.tabPage1.Controls.Add(this.groupBox8); + this.tabPage1.Controls.Add(this.groupBox7); + this.tabPage1.Controls.Add(this.groupBox6); this.tabPage1.Location = new System.Drawing.Point(4, 22); this.tabPage1.Name = "tabPage1"; this.tabPage1.Padding = new System.Windows.Forms.Padding(3); - this.tabPage1.Size = new System.Drawing.Size(337, 404); + this.tabPage1.Size = new System.Drawing.Size(411, 404); this.tabPage1.TabIndex = 0; this.tabPage1.Text = "Server"; // - // chkMaintKick - // - this.chkMaintKick.Appearance = System.Windows.Forms.Appearance.Button; - this.chkMaintKick.AutoSize = true; - this.chkMaintKick.Location = new System.Drawing.Point(218, 225); - this.chkMaintKick.Name = "chkMaintKick"; - this.chkMaintKick.Size = new System.Drawing.Size(101, 23); - this.chkMaintKick.TabIndex = 2; - this.chkMaintKick.Text = "Maintenance Kick"; - this.chkMaintKick.UseVisualStyleBackColor = true; + // groupBox9 + // + this.groupBox9.Controls.Add(this.chkDebug); + this.groupBox9.Controls.Add(this.chkRestart); + this.groupBox9.Controls.Add(this.chkMono); + this.groupBox9.Controls.Add(this.chkLogBeat); + this.groupBox9.Controls.Add(this.chkUpdates); + this.groupBox9.Location = new System.Drawing.Point(240, 107); + this.groupBox9.Name = "groupBox9"; + this.groupBox9.Size = new System.Drawing.Size(166, 169); + this.groupBox9.TabIndex = 25; + this.groupBox9.TabStop = false; + this.groupBox9.Text = "Misc."; + // + // chkDebug + // + this.chkDebug.Appearance = System.Windows.Forms.Appearance.Button; + this.chkDebug.AutoSize = true; + this.chkDebug.Location = new System.Drawing.Point(63, 136); + this.chkDebug.Name = "chkDebug"; + this.chkDebug.Size = new System.Drawing.Size(96, 23); + this.chkDebug.TabIndex = 25; + this.chkDebug.Text = "Debug Messages"; + this.chkDebug.UseVisualStyleBackColor = true; // - // cmbMaintenance + // chkRestart // - this.cmbMaintenance.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.cmbMaintenance.FormattingEnabled = true; - this.cmbMaintenance.Location = new System.Drawing.Point(247, 289); - this.cmbMaintenance.Name = "cmbMaintenance"; - this.cmbMaintenance.Size = new System.Drawing.Size(81, 21); - this.cmbMaintenance.TabIndex = 26; - this.toolTip.SetToolTip(this.cmbMaintenance, "Rank required to join while in maintenance mode"); + this.chkRestart.Appearance = System.Windows.Forms.Appearance.Button; + this.chkRestart.AutoSize = true; + this.chkRestart.Location = new System.Drawing.Point(6, 20); + this.chkRestart.Name = "chkRestart"; + this.chkRestart.Size = new System.Drawing.Size(153, 23); + this.chkRestart.TabIndex = 4; + this.chkRestart.Text = "Restart when an error occurs"; + this.chkRestart.UseVisualStyleBackColor = true; // - // label33 + // chkMono // - this.label33.AutoSize = true; - this.label33.Location = new System.Drawing.Point(140, 292); - this.label33.Name = "label33"; - this.label33.Size = new System.Drawing.Size(98, 13); - this.label33.TabIndex = 25; - this.label33.Text = "Maintenance Rank:"; + this.chkMono.Appearance = System.Windows.Forms.Appearance.Button; + this.chkMono.AutoSize = true; + this.chkMono.Location = new System.Drawing.Point(53, 49); + this.chkMono.Name = "chkMono"; + this.chkMono.Size = new System.Drawing.Size(106, 23); + this.chkMono.TabIndex = 4; + this.chkMono.Text = "Using Mono/Linux?"; + this.chkMono.UseVisualStyleBackColor = true; // // chkLogBeat // this.chkLogBeat.Appearance = System.Windows.Forms.Appearance.Button; this.chkLogBeat.AutoSize = true; - this.chkLogBeat.Location = new System.Drawing.Point(136, 370); + this.chkLogBeat.Location = new System.Drawing.Point(70, 78); this.chkLogBeat.Name = "chkLogBeat"; this.chkLogBeat.Size = new System.Drawing.Size(89, 23); this.chkLogBeat.TabIndex = 24; @@ -270,302 +299,203 @@ private void InitializeComponent() " server gets a URL slowly or not at all."); this.chkLogBeat.UseVisualStyleBackColor = true; // - // cmbOpChat - // - this.cmbOpChat.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.cmbOpChat.FormattingEnabled = true; - this.cmbOpChat.Location = new System.Drawing.Point(247, 316); - this.cmbOpChat.Name = "cmbOpChat"; - this.cmbOpChat.Size = new System.Drawing.Size(81, 21); - this.cmbOpChat.TabIndex = 23; - this.toolTip.SetToolTip(this.cmbOpChat, "Default rank required to read op chat."); + // chkUpdates // - // lblOpChat + this.chkUpdates.Appearance = System.Windows.Forms.Appearance.Button; + this.chkUpdates.AutoSize = true; + this.chkUpdates.Location = new System.Drawing.Point(58, 107); + this.chkUpdates.Name = "chkUpdates"; + this.chkUpdates.Size = new System.Drawing.Size(101, 23); + this.chkUpdates.TabIndex = 4; + this.chkUpdates.Text = "Check for updates"; + this.chkUpdates.UseVisualStyleBackColor = true; // - this.lblOpChat.AutoSize = true; - this.lblOpChat.Location = new System.Drawing.Point(168, 319); - this.lblOpChat.Name = "lblOpChat"; - this.lblOpChat.Size = new System.Drawing.Size(70, 13); - this.lblOpChat.TabIndex = 22; - this.lblOpChat.Text = "Op Chat rank:"; + // groupBox8 + // + this.groupBox8.Controls.Add(this.chkPremium); + this.groupBox8.Controls.Add(this.chkVerify); + this.groupBox8.Controls.Add(this.chkPublic); + this.groupBox8.Location = new System.Drawing.Point(124, 107); + this.groupBox8.Name = "groupBox8"; + this.groupBox8.Size = new System.Drawing.Size(110, 110); + this.groupBox8.TabIndex = 29; + this.groupBox8.TabStop = false; + this.groupBox8.Text = "Security"; + // + // chkPremium + // + this.chkPremium.Appearance = System.Windows.Forms.Appearance.Button; + this.chkPremium.AutoSize = true; + this.chkPremium.Location = new System.Drawing.Point(6, 78); + this.chkPremium.Name = "chkPremium"; + this.chkPremium.Size = new System.Drawing.Size(83, 23); + this.chkPremium.TabIndex = 5; + this.chkPremium.Text = "Premium Only"; + this.chkPremium.UseVisualStyleBackColor = true; // - // cmbDefaultRank + // chkVerify // - this.cmbDefaultRank.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.cmbDefaultRank.FormattingEnabled = true; - this.cmbDefaultRank.Location = new System.Drawing.Point(247, 343); - this.cmbDefaultRank.Name = "cmbDefaultRank"; - this.cmbDefaultRank.Size = new System.Drawing.Size(81, 21); - this.cmbDefaultRank.TabIndex = 21; - this.toolTip.SetToolTip(this.cmbDefaultRank, "Default rank assigned to new visitors to the server."); + this.chkVerify.Appearance = System.Windows.Forms.Appearance.Button; + this.chkVerify.AutoSize = true; + this.chkVerify.Location = new System.Drawing.Point(6, 20); + this.chkVerify.Name = "chkVerify"; + this.chkVerify.Size = new System.Drawing.Size(78, 23); + this.chkVerify.TabIndex = 4; + this.chkVerify.Text = "Verify Names"; + this.toolTip.SetToolTip(this.chkVerify, "Make sure the user is who they claim to be."); + this.chkVerify.UseVisualStyleBackColor = true; // - // label29 + // chkPublic // - this.label29.AutoSize = true; - this.label29.Location = new System.Drawing.Point(173, 346); - this.label29.Name = "label29"; - this.label29.Size = new System.Drawing.Size(68, 13); - this.label29.TabIndex = 20; - this.label29.Text = "Default rank:"; + this.chkPublic.Appearance = System.Windows.Forms.Appearance.Button; + this.chkPublic.AutoSize = true; + this.chkPublic.Location = new System.Drawing.Point(6, 49); + this.chkPublic.Name = "chkPublic"; + this.chkPublic.Size = new System.Drawing.Size(46, 23); + this.chkPublic.TabIndex = 4; + this.chkPublic.Text = "Public"; + this.toolTip.SetToolTip(this.chkPublic, "Whether or not the server will appear on the server list."); + this.chkPublic.UseVisualStyleBackColor = true; // - // txtOpChannel + // groupBox7 // - this.txtOpChannel.Location = new System.Drawing.Point(118, 223); - this.txtOpChannel.Name = "txtOpChannel"; - this.txtOpChannel.Size = new System.Drawing.Size(75, 21); - this.txtOpChannel.TabIndex = 14; - this.toolTip.SetToolTip(this.txtOpChannel, "The IRC channel to be used."); + this.groupBox7.Controls.Add(this.chkMaintKick); + this.groupBox7.Controls.Add(this.label33); + this.groupBox7.Controls.Add(this.cmbMaintenance); + this.groupBox7.Location = new System.Drawing.Point(3, 107); + this.groupBox7.Name = "groupBox7"; + this.groupBox7.Size = new System.Drawing.Size(115, 92); + this.groupBox7.TabIndex = 28; + this.groupBox7.TabStop = false; + this.groupBox7.Text = "Maintenance Mode"; // - // label31 + // chkMaintKick // - this.label31.AutoSize = true; - this.label31.Location = new System.Drawing.Point(48, 226); - this.label31.Name = "label31"; - this.label31.Size = new System.Drawing.Size(64, 13); - this.label31.TabIndex = 13; - this.label31.Text = "Op Channel:"; + this.chkMaintKick.Appearance = System.Windows.Forms.Appearance.Button; + this.chkMaintKick.AutoSize = true; + this.chkMaintKick.Location = new System.Drawing.Point(6, 20); + this.chkMaintKick.Name = "chkMaintKick"; + this.chkMaintKick.Size = new System.Drawing.Size(101, 23); + this.chkMaintKick.TabIndex = 2; + this.chkMaintKick.Text = "Maintenance Kick"; + this.chkMaintKick.UseVisualStyleBackColor = true; // - // lblIRC + // label33 // - this.lblIRC.Location = new System.Drawing.Point(302, 278); - this.lblIRC.Name = "lblIRC"; - this.lblIRC.Size = new System.Drawing.Size(26, 23); - this.lblIRC.TabIndex = 10; + this.label33.AutoSize = true; + this.label33.Location = new System.Drawing.Point(9, 49); + this.label33.Name = "label33"; + this.label33.Size = new System.Drawing.Size(98, 13); + this.label33.TabIndex = 25; + this.label33.Text = "Maintenance Rank:"; // - // lblDefault + // cmbMaintenance // - this.lblDefault.Location = new System.Drawing.Point(302, 251); - this.lblDefault.Name = "lblDefault"; - this.lblDefault.Size = new System.Drawing.Size(26, 23); - this.lblDefault.TabIndex = 10; + this.cmbMaintenance.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbMaintenance.FormattingEnabled = true; + this.cmbMaintenance.Location = new System.Drawing.Point(6, 65); + this.cmbMaintenance.Name = "cmbMaintenance"; + this.cmbMaintenance.Size = new System.Drawing.Size(101, 21); + this.cmbMaintenance.TabIndex = 26; + this.toolTip.SetToolTip(this.cmbMaintenance, "Rank required to join while in maintenance mode"); // - // cmbIRCColour + // groupBox6 + // + this.groupBox6.Controls.Add(this.label41); + this.groupBox6.Controls.Add(this.button3); + this.groupBox6.Controls.Add(this.chkUPNP); + this.groupBox6.Controls.Add(this.txtName); + this.groupBox6.Controls.Add(this.label2); + this.groupBox6.Controls.Add(this.txtMOTD); + this.groupBox6.Controls.Add(this.label3); + this.groupBox6.Controls.Add(this.label1); + this.groupBox6.Controls.Add(this.txtPort); + this.groupBox6.Location = new System.Drawing.Point(3, 3); + this.groupBox6.Name = "groupBox6"; + this.groupBox6.Size = new System.Drawing.Size(403, 98); + this.groupBox6.TabIndex = 27; + this.groupBox6.TabStop = false; + this.groupBox6.Text = "General Information"; + // + // label41 + // + this.label41.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.label41.Enabled = false; + this.label41.Location = new System.Drawing.Point(320, 66); + this.label41.Name = "label41"; + this.label41.Size = new System.Drawing.Size(77, 23); + this.label41.TabIndex = 6; + this.label41.Text = "Not Started"; + this.label41.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // button3 + // + this.button3.Enabled = false; + this.button3.Location = new System.Drawing.Point(239, 66); + this.button3.Name = "button3"; + this.button3.Size = new System.Drawing.Size(75, 23); + this.button3.TabIndex = 5; + this.button3.Text = "Check Port"; + this.button3.UseVisualStyleBackColor = true; + // + // chkUPNP + // + this.chkUPNP.Appearance = System.Windows.Forms.Appearance.Button; + this.chkUPNP.AutoSize = true; + this.chkUPNP.Location = new System.Drawing.Point(116, 66); + this.chkUPNP.Name = "chkUPNP"; + this.chkUPNP.Size = new System.Drawing.Size(107, 23); + this.chkUPNP.TabIndex = 4; + this.chkUPNP.Text = "Forward with UPNP"; + this.chkUPNP.UseVisualStyleBackColor = true; // - this.cmbIRCColour.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.cmbIRCColour.FormattingEnabled = true; - this.cmbIRCColour.Location = new System.Drawing.Point(239, 256); - this.cmbIRCColour.Name = "cmbIRCColour"; - this.cmbIRCColour.Size = new System.Drawing.Size(57, 21); - this.cmbIRCColour.TabIndex = 9; - this.toolTip.SetToolTip(this.cmbIRCColour, "The colour of the IRC nicks used in the IRC."); - this.cmbIRCColour.SelectedIndexChanged += new System.EventHandler(this.cmbIRCColour_SelectedIndexChanged); + // txtName // - // cmbDefaultColour - // - this.cmbDefaultColour.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.cmbDefaultColour.FormattingEnabled = true; - this.cmbDefaultColour.Location = new System.Drawing.Point(99, 256); - this.cmbDefaultColour.Name = "cmbDefaultColour"; - this.cmbDefaultColour.Size = new System.Drawing.Size(57, 21); - this.cmbDefaultColour.TabIndex = 9; - this.toolTip.SetToolTip(this.cmbDefaultColour, "The colour of the default chat used in the server.\nFor example, when you are aske" + - "d to select two corners in a cuboid."); - this.cmbDefaultColour.SelectedIndexChanged += new System.EventHandler(this.cmbDefaultColour_SelectedIndexChanged); - // - // chkMono - // - this.chkMono.Appearance = System.Windows.Forms.Appearance.Button; - this.chkMono.AutoSize = true; - this.chkMono.Location = new System.Drawing.Point(11, 341); - this.chkMono.Name = "chkMono"; - this.chkMono.Size = new System.Drawing.Size(106, 23); - this.chkMono.TabIndex = 4; - this.chkMono.Text = "Using Mono/Linux?"; - this.chkMono.UseVisualStyleBackColor = true; - // - // chkRestart - // - this.chkRestart.Appearance = System.Windows.Forms.Appearance.Button; - this.chkRestart.AutoSize = true; - this.chkRestart.Location = new System.Drawing.Point(40, 87); - this.chkRestart.Name = "chkRestart"; - this.chkRestart.Size = new System.Drawing.Size(153, 23); - this.chkRestart.TabIndex = 4; - this.chkRestart.Text = "Restart when an error occurs"; - this.chkRestart.UseVisualStyleBackColor = true; - // - // chkIRC - // - this.chkIRC.Appearance = System.Windows.Forms.Appearance.Button; - this.chkIRC.AutoSize = true; - this.chkIRC.Location = new System.Drawing.Point(11, 167); - this.chkIRC.Name = "chkIRC"; - this.chkIRC.Size = new System.Drawing.Size(52, 23); - this.chkIRC.TabIndex = 4; - this.chkIRC.Text = "Use IRC"; - this.toolTip.SetToolTip(this.chkIRC, "Whether to use the IRC bot or not.\nIRC stands for Internet Relay Chat and allows " + - "for communication with the server while outside Minecraft."); - this.chkIRC.UseVisualStyleBackColor = true; - // - // chkPublic - // - this.chkPublic.Appearance = System.Windows.Forms.Appearance.Button; - this.chkPublic.AutoSize = true; - this.chkPublic.Location = new System.Drawing.Point(283, 58); - this.chkPublic.Name = "chkPublic"; - this.chkPublic.Size = new System.Drawing.Size(46, 23); - this.chkPublic.TabIndex = 4; - this.chkPublic.Text = "Public"; - this.toolTip.SetToolTip(this.chkPublic, "Whether or not the server will appear on the server list."); - this.chkPublic.UseVisualStyleBackColor = true; - // - // chkAutoload - // - this.chkAutoload.Appearance = System.Windows.Forms.Appearance.Button; - this.chkAutoload.AutoSize = true; - this.chkAutoload.Location = new System.Drawing.Point(247, 370); - this.chkAutoload.Name = "chkAutoload"; - this.chkAutoload.Size = new System.Drawing.Size(81, 23); - this.chkAutoload.TabIndex = 4; - this.chkAutoload.Text = "Load on /goto"; - this.toolTip.SetToolTip(this.chkAutoload, "Load a map when a user wishes to go to it, and unload empty maps"); - this.chkAutoload.UseVisualStyleBackColor = true; - // - // chkWorld - // - this.chkWorld.Appearance = System.Windows.Forms.Appearance.Button; - this.chkWorld.AutoSize = true; - this.chkWorld.Location = new System.Drawing.Point(124, 58); - this.chkWorld.Name = "chkWorld"; - this.chkWorld.Size = new System.Drawing.Size(69, 23); - this.chkWorld.TabIndex = 4; - this.chkWorld.Text = "World chat"; - this.toolTip.SetToolTip(this.chkWorld, "If disabled, every map has isolated chat.\nIf enabled, every map is able to commun" + - "icate without special letters."); - this.chkWorld.UseVisualStyleBackColor = true; - // - // label23 - // - this.label23.AutoSize = true; - this.label23.Location = new System.Drawing.Point(182, 259); - this.label23.Name = "label23"; - this.label23.Size = new System.Drawing.Size(51, 13); - this.label23.TabIndex = 3; - this.label23.Text = "IRC color:"; - // - // chkUpdates - // - this.chkUpdates.Appearance = System.Windows.Forms.Appearance.Button; - this.chkUpdates.AutoSize = true; - this.chkUpdates.Location = new System.Drawing.Point(11, 370); - this.chkUpdates.Name = "chkUpdates"; - this.chkUpdates.Size = new System.Drawing.Size(101, 23); - this.chkUpdates.TabIndex = 4; - this.chkUpdates.Text = "Check for updates"; - this.chkUpdates.UseVisualStyleBackColor = true; - // - // chkVerify - // - this.chkVerify.Appearance = System.Windows.Forms.Appearance.Button; - this.chkVerify.AutoSize = true; - this.chkVerify.Location = new System.Drawing.Point(199, 58); - this.chkVerify.Name = "chkVerify"; - this.chkVerify.Size = new System.Drawing.Size(78, 23); - this.chkVerify.TabIndex = 4; - this.chkVerify.Text = "Verify Names"; - this.toolTip.SetToolTip(this.chkVerify, "Make sure the user is who they claim to be."); - this.chkVerify.UseVisualStyleBackColor = true; - // - // label10 - // - this.label10.AutoSize = true; - this.label10.Location = new System.Drawing.Point(26, 259); - this.label10.Name = "label10"; - this.label10.Size = new System.Drawing.Size(71, 13); - this.label10.TabIndex = 3; - this.label10.Text = "Default color:"; - // - // label27 - // - this.label27.AutoSize = true; - this.label27.Location = new System.Drawing.Point(200, 146); - this.label27.Name = "label27"; - this.label27.Size = new System.Drawing.Size(63, 13); - this.label27.TabIndex = 3; - this.label27.Text = "Main name:"; - // - // label22 - // - this.label22.AutoSize = true; - this.label22.Location = new System.Drawing.Point(205, 119); - this.label22.Name = "label22"; - this.label22.Size = new System.Drawing.Size(58, 13); - this.label22.TabIndex = 3; - this.label22.Text = "Max Maps:"; + this.txtName.Location = new System.Drawing.Point(50, 14); + this.txtName.Name = "txtName"; + this.txtName.Size = new System.Drawing.Size(348, 21); + this.txtName.TabIndex = 0; + this.toolTip.SetToolTip(this.txtName, "The name of the server.\nPick something good!"); // - // label21 + // label2 // - this.label21.AutoSize = true; - this.label21.Location = new System.Drawing.Point(196, 90); - this.label21.Name = "label21"; - this.label21.Size = new System.Drawing.Size(67, 13); - this.label21.TabIndex = 3; - this.label21.Text = "Max Players:"; + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(6, 44); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(38, 13); + this.label2.TabIndex = 1; + this.label2.Text = "MOTD:"; // - // label30 + // txtMOTD // - this.label30.AutoSize = true; - this.label30.Location = new System.Drawing.Point(17, 119); - this.label30.Name = "label30"; - this.label30.Size = new System.Drawing.Size(95, 13); - this.label30.TabIndex = 3; - this.label30.Text = "Default host state:"; + this.txtMOTD.Location = new System.Drawing.Point(50, 41); + this.txtMOTD.Name = "txtMOTD"; + this.txtMOTD.Size = new System.Drawing.Size(348, 21); + this.txtMOTD.TabIndex = 0; + this.toolTip.SetToolTip(this.txtMOTD, "The MOTD of the server.\nUse \"+hax\" to allow any WoM hack, \"-hax\" to disallow any " + + "hacks at support and use \"-fly\" and whatnot to disallow other things."); // // label3 // this.label3.AutoSize = true; - this.label3.Location = new System.Drawing.Point(16, 65); + this.label3.Location = new System.Drawing.Point(9, 71); this.label3.Name = "label3"; this.label3.Size = new System.Drawing.Size(30, 13); this.label3.TabIndex = 3; this.label3.Text = "Port:"; // - // txtDepth - // - this.txtDepth.Location = new System.Drawing.Point(52, 312); - this.txtDepth.Name = "txtDepth"; - this.txtDepth.Size = new System.Drawing.Size(41, 21); - this.txtDepth.TabIndex = 2; - this.toolTip.SetToolTip(this.txtDepth, "Depth which guests can dig.\nDefault = 4"); - this.txtDepth.TextChanged += new System.EventHandler(this.txtDepth_TextChanged); - // - // txtMain - // - this.txtMain.Location = new System.Drawing.Point(269, 143); - this.txtMain.Name = "txtMain"; - this.txtMain.Size = new System.Drawing.Size(60, 21); - this.txtMain.TabIndex = 2; - this.txtMain.TextChanged += new System.EventHandler(this.txtMaps_TextChanged); - // - // txtMaps - // - this.txtMaps.Location = new System.Drawing.Point(269, 116); - this.txtMaps.Name = "txtMaps"; - this.txtMaps.Size = new System.Drawing.Size(60, 21); - this.txtMaps.TabIndex = 2; - this.toolTip.SetToolTip(this.txtMaps, "The total number of maps which can be loaded at once.\nDefault = 5"); - this.txtMaps.TextChanged += new System.EventHandler(this.txtMaps_TextChanged); - // - // txtPlayers - // - this.txtPlayers.Location = new System.Drawing.Point(269, 87); - this.txtPlayers.Name = "txtPlayers"; - this.txtPlayers.Size = new System.Drawing.Size(60, 21); - this.txtPlayers.TabIndex = 2; - this.toolTip.SetToolTip(this.txtPlayers, "The total number of players which can login.\nDefault = 12"); - this.txtPlayers.TextChanged += new System.EventHandler(this.txtPlayers_TextChanged); - // - // txtHost + // label1 // - this.txtHost.Location = new System.Drawing.Point(118, 116); - this.txtHost.Name = "txtHost"; - this.txtHost.Size = new System.Drawing.Size(75, 21); - this.txtHost.TabIndex = 2; - this.txtHost.TextChanged += new System.EventHandler(this.txtPort_TextChanged); + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(6, 17); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(38, 13); + this.label1.TabIndex = 1; + this.label1.Text = "Name:"; // // txtPort // - this.txtPort.Location = new System.Drawing.Point(52, 60); + this.txtPort.Location = new System.Drawing.Point(50, 68); this.txtPort.Name = "txtPort"; this.txtPort.Size = new System.Drawing.Size(60, 21); this.txtPort.TabIndex = 2; @@ -573,198 +503,130 @@ private void InitializeComponent() "r ExternalURL."); this.txtPort.TextChanged += new System.EventHandler(this.txtPort_TextChanged); // - // label2 - // - this.label2.AutoSize = true; - this.label2.Location = new System.Drawing.Point(8, 36); - this.label2.Name = "label2"; - this.label2.Size = new System.Drawing.Size(38, 13); - this.label2.TabIndex = 1; - this.label2.Text = "MOTD:"; - // - // label5 - // - this.label5.AutoSize = true; - this.label5.Location = new System.Drawing.Point(63, 199); - this.label5.Name = "label5"; - this.label5.Size = new System.Drawing.Size(49, 13); - this.label5.TabIndex = 1; - this.label5.Text = "Channel:"; - // - // label6 + // tabPage7 + // + this.tabPage7.BackColor = System.Drawing.SystemColors.Control; + this.tabPage7.Controls.Add(this.groupBox4); + this.tabPage7.Controls.Add(this.groupBox3); + this.tabPage7.Controls.Add(this.groupBox2); + this.tabPage7.Controls.Add(this.groupBox1); + this.tabPage7.Controls.Add(this.label34); + this.tabPage7.Controls.Add(this.chkRepeatMessages); + this.tabPage7.Controls.Add(this.txtMoneys); + this.tabPage7.Controls.Add(this.chkWorld); + this.tabPage7.Controls.Add(this.chk17Dollar); + this.tabPage7.Controls.Add(this.chkSmile); + this.tabPage7.Controls.Add(this.chkDeath); + this.tabPage7.Controls.Add(this.chkHelp); + this.tabPage7.Controls.Add(this.txtHost); + this.tabPage7.Controls.Add(this.label10); + this.tabPage7.Controls.Add(this.label30); + this.tabPage7.Controls.Add(this.cmbDefaultColour); + this.tabPage7.Controls.Add(this.lblDefault); + this.tabPage7.Location = new System.Drawing.Point(4, 22); + this.tabPage7.Name = "tabPage7"; + this.tabPage7.Size = new System.Drawing.Size(411, 404); + this.tabPage7.TabIndex = 7; + this.tabPage7.Text = "Chat"; + // + // groupBox4 + // + this.groupBox4.Location = new System.Drawing.Point(3, 296); + this.groupBox4.Name = "groupBox4"; + this.groupBox4.Size = new System.Drawing.Size(193, 76); + this.groupBox4.TabIndex = 32; + this.groupBox4.TabStop = false; + this.groupBox4.Text = "Spam Filter"; + // + // groupBox3 + // + this.groupBox3.Location = new System.Drawing.Point(3, 219); + this.groupBox3.Name = "groupBox3"; + this.groupBox3.Size = new System.Drawing.Size(193, 71); + this.groupBox3.TabIndex = 31; + this.groupBox3.TabStop = false; + this.groupBox3.Text = "Profanity Filter"; + // + // groupBox2 + // + this.groupBox2.Controls.Add(this.label36); + this.groupBox2.Controls.Add(this.cmbOpChat); + this.groupBox2.Controls.Add(this.lblOpChat); + this.groupBox2.Controls.Add(this.cmbAdminChat); + this.groupBox2.Location = new System.Drawing.Point(3, 141); + this.groupBox2.Name = "groupBox2"; + this.groupBox2.Size = new System.Drawing.Size(193, 72); + this.groupBox2.TabIndex = 30; + this.groupBox2.TabStop = false; + this.groupBox2.Text = "Chat Channels"; + // + // label36 + // + this.label36.AutoSize = true; + this.label36.Location = new System.Drawing.Point(6, 17); + this.label36.Name = "label36"; + this.label36.Size = new System.Drawing.Size(87, 13); + this.label36.TabIndex = 27; + this.label36.Text = "Admin Chat rank:"; // - this.label6.AutoSize = true; - this.label6.Location = new System.Drawing.Point(72, 172); - this.label6.Name = "label6"; - this.label6.Size = new System.Drawing.Size(40, 13); - this.label6.TabIndex = 1; - this.label6.Text = "Server:"; - // - // label4 - // - this.label4.AutoSize = true; - this.label4.Location = new System.Drawing.Point(199, 199); - this.label4.Name = "label4"; - this.label4.Size = new System.Drawing.Size(30, 13); - this.label4.TabIndex = 1; - this.label4.Text = "Nick:"; - // - // label1 - // - this.label1.AutoSize = true; - this.label1.Location = new System.Drawing.Point(8, 9); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(38, 13); - this.label1.TabIndex = 1; - this.label1.Text = "Name:"; - // - // txtMOTD - // - this.txtMOTD.Location = new System.Drawing.Point(52, 33); - this.txtMOTD.Name = "txtMOTD"; - this.txtMOTD.Size = new System.Drawing.Size(277, 21); - this.txtMOTD.TabIndex = 0; - this.toolTip.SetToolTip(this.txtMOTD, "The MOTD of the server.\nUse \"+hax\" to allow any WoM hack, \"-hax\" to disallow any " + - "hacks at all and use \"-fly\" and whatnot to disallow other things."); - // - // txtChannel - // - this.txtChannel.Location = new System.Drawing.Point(118, 196); - this.txtChannel.Name = "txtChannel"; - this.txtChannel.Size = new System.Drawing.Size(75, 21); - this.txtChannel.TabIndex = 0; - this.toolTip.SetToolTip(this.txtChannel, "The IRC channel to be used."); - // - // txtIRCServer - // - this.txtIRCServer.Location = new System.Drawing.Point(118, 169); - this.txtIRCServer.Name = "txtIRCServer"; - this.txtIRCServer.Size = new System.Drawing.Size(211, 21); - this.txtIRCServer.TabIndex = 0; - this.toolTip.SetToolTip(this.txtIRCServer, "The IRC server to be used.\nDefault = irc.esper.net\nBetter choice = irc.foonetic.n" + - "et"); - // - // txtNick - // - this.txtNick.Location = new System.Drawing.Point(235, 196); - this.txtNick.Name = "txtNick"; - this.txtNick.Size = new System.Drawing.Size(94, 21); - this.txtNick.TabIndex = 0; - this.toolTip.SetToolTip(this.txtNick, "The Nick that the IRC bot will try and use."); - // - // txtName - // - this.txtName.Location = new System.Drawing.Point(52, 6); - this.txtName.Name = "txtName"; - this.txtName.Size = new System.Drawing.Size(277, 21); - this.txtName.TabIndex = 0; - this.toolTip.SetToolTip(this.txtName, "The name of the server.\nPick something good!"); - // - // ChkTunnels - // - this.ChkTunnels.Appearance = System.Windows.Forms.Appearance.Button; - this.ChkTunnels.AutoSize = true; - this.ChkTunnels.Location = new System.Drawing.Point(11, 283); - this.ChkTunnels.Name = "ChkTunnels"; - this.ChkTunnels.Size = new System.Drawing.Size(82, 23); - this.ChkTunnels.TabIndex = 4; - this.ChkTunnels.Text = "Anti tunneling"; - this.toolTip.SetToolTip(this.ChkTunnels, "Should guests be limited to digging a certain depth?"); - this.ChkTunnels.UseVisualStyleBackColor = true; - // - // label7 - // - this.label7.AutoSize = true; - this.label7.Location = new System.Drawing.Point(8, 315); - this.label7.Name = "label7"; - this.label7.Size = new System.Drawing.Size(39, 13); - this.label7.TabIndex = 3; - this.label7.Text = "Depth:"; - // - // tabPage4 - // - this.tabPage4.BackColor = System.Drawing.SystemColors.Control; - this.tabPage4.Controls.Add(this.chkRepeatMessages); - this.tabPage4.Controls.Add(this.chkForceCuboid); - this.tabPage4.Controls.Add(this.txtShutdown); - this.tabPage4.Controls.Add(this.txtBanMessage); - this.tabPage4.Controls.Add(this.chkShutdown); - this.tabPage4.Controls.Add(this.chkBanMessage); - this.tabPage4.Controls.Add(this.chkrankSuper); - this.tabPage4.Controls.Add(this.chkCheap); - this.tabPage4.Controls.Add(this.chkDeath); - this.tabPage4.Controls.Add(this.chk17Dollar); - this.tabPage4.Controls.Add(this.chkPhysicsRest); - this.tabPage4.Controls.Add(this.chkSmile); - this.tabPage4.Controls.Add(this.chkHelp); - this.tabPage4.Controls.Add(this.label28); - this.tabPage4.Controls.Add(this.label24); - this.tabPage4.Controls.Add(this.txtNormRp); - this.tabPage4.Controls.Add(this.txtRP); - this.tabPage4.Controls.Add(this.label34); - this.tabPage4.Controls.Add(this.label26); - this.tabPage4.Controls.Add(this.label25); - this.tabPage4.Controls.Add(this.txtAFKKick); - this.tabPage4.Controls.Add(this.txtafk); - this.tabPage4.Controls.Add(this.label9); - this.tabPage4.Controls.Add(this.txtBackup); - this.tabPage4.Controls.Add(this.label32); - this.tabPage4.Controls.Add(this.txtBackupLocation); - this.tabPage4.Controls.Add(this.txtMoneys); - this.tabPage4.Controls.Add(this.txtCheap); - this.tabPage4.Controls.Add(this.txtRestartTime); - this.tabPage4.Controls.Add(this.chkRestartTime); - this.tabPage4.Font = new System.Drawing.Font("Calibri", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.tabPage4.Location = new System.Drawing.Point(4, 22); - this.tabPage4.Name = "tabPage4"; - this.tabPage4.Size = new System.Drawing.Size(337, 404); - this.tabPage4.TabIndex = 3; - this.tabPage4.Text = "Misc"; - // - // chkRepeatMessages - // - this.chkRepeatMessages.Appearance = System.Windows.Forms.Appearance.Button; - this.chkRepeatMessages.AutoSize = true; - this.chkRepeatMessages.Location = new System.Drawing.Point(195, 89); - this.chkRepeatMessages.Name = "chkRepeatMessages"; - this.chkRepeatMessages.Size = new System.Drawing.Size(127, 23); - this.chkRepeatMessages.TabIndex = 29; - this.chkRepeatMessages.Text = "Repeat message blocks"; - this.chkRepeatMessages.UseVisualStyleBackColor = true; - // - // chkForceCuboid + // cmbOpChat // - this.chkForceCuboid.Appearance = System.Windows.Forms.Appearance.Button; - this.chkForceCuboid.AutoSize = true; - this.chkForceCuboid.Location = new System.Drawing.Point(13, 283); - this.chkForceCuboid.Name = "chkForceCuboid"; - this.chkForceCuboid.Size = new System.Drawing.Size(78, 23); - this.chkForceCuboid.TabIndex = 29; - this.chkForceCuboid.Text = "Force Cuboid"; - this.toolTip.SetToolTip(this.chkForceCuboid, "When true, runs an attempted cuboid despite cuboid limits, until it hits the grou" + - "p limit for that user."); - this.chkForceCuboid.UseVisualStyleBackColor = true; + this.cmbOpChat.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbOpChat.FormattingEnabled = true; + this.cmbOpChat.Location = new System.Drawing.Point(102, 41); + this.cmbOpChat.Name = "cmbOpChat"; + this.cmbOpChat.Size = new System.Drawing.Size(81, 21); + this.cmbOpChat.TabIndex = 23; + this.toolTip.SetToolTip(this.cmbOpChat, "Default rank required to read op chat."); // - // txtShutdown + // lblOpChat // - this.txtShutdown.Location = new System.Drawing.Point(176, 226); - this.txtShutdown.MaxLength = 128; - this.txtShutdown.Name = "txtShutdown"; - this.txtShutdown.Size = new System.Drawing.Size(145, 21); - this.txtShutdown.TabIndex = 28; + this.lblOpChat.AutoSize = true; + this.lblOpChat.Location = new System.Drawing.Point(23, 44); + this.lblOpChat.Name = "lblOpChat"; + this.lblOpChat.Size = new System.Drawing.Size(70, 13); + this.lblOpChat.TabIndex = 22; + this.lblOpChat.Text = "Op Chat rank:"; // - // txtBanMessage + // cmbAdminChat + // + this.cmbAdminChat.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbAdminChat.FormattingEnabled = true; + this.cmbAdminChat.Location = new System.Drawing.Point(103, 14); + this.cmbAdminChat.Name = "cmbAdminChat"; + this.cmbAdminChat.Size = new System.Drawing.Size(81, 21); + this.cmbAdminChat.TabIndex = 28; + this.toolTip.SetToolTip(this.cmbAdminChat, "Default rank required to read admin chat."); + // + // groupBox1 + // + this.groupBox1.Controls.Add(this.txtRestartTime); + this.groupBox1.Controls.Add(this.chkShutdown); + this.groupBox1.Controls.Add(this.chkBanMessage); + this.groupBox1.Controls.Add(this.txtBanMessage); + this.groupBox1.Controls.Add(this.txtShutdown); + this.groupBox1.Controls.Add(this.chkCheap); + this.groupBox1.Controls.Add(this.txtCheap); + this.groupBox1.Controls.Add(this.chkRestartTime); + this.groupBox1.Location = new System.Drawing.Point(3, 3); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(405, 132); + this.groupBox1.TabIndex = 0; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "Custom Messages"; // - this.txtBanMessage.Location = new System.Drawing.Point(148, 199); - this.txtBanMessage.MaxLength = 128; - this.txtBanMessage.Name = "txtBanMessage"; - this.txtBanMessage.Size = new System.Drawing.Size(173, 21); - this.txtBanMessage.TabIndex = 27; + // txtRestartTime + // + this.txtRestartTime.Location = new System.Drawing.Point(143, 18); + this.txtRestartTime.Name = "txtRestartTime"; + this.txtRestartTime.Size = new System.Drawing.Size(255, 21); + this.txtRestartTime.TabIndex = 1; + this.txtRestartTime.Text = "HH: mm: ss"; // // chkShutdown // this.chkShutdown.AutoSize = true; - this.chkShutdown.Location = new System.Drawing.Point(12, 229); + this.chkShutdown.Location = new System.Drawing.Point(6, 104); this.chkShutdown.Name = "chkShutdown"; this.chkShutdown.Size = new System.Drawing.Size(158, 17); this.chkShutdown.TabIndex = 26; @@ -774,29 +636,34 @@ private void InitializeComponent() // chkBanMessage // this.chkBanMessage.AutoSize = true; - this.chkBanMessage.Location = new System.Drawing.Point(12, 202); + this.chkBanMessage.Location = new System.Drawing.Point(6, 77); this.chkBanMessage.Name = "chkBanMessage"; this.chkBanMessage.Size = new System.Drawing.Size(129, 17); this.chkBanMessage.TabIndex = 25; this.chkBanMessage.Text = "Custom ban message:"; this.chkBanMessage.UseVisualStyleBackColor = true; // - // chkrankSuper + // txtBanMessage // - this.chkrankSuper.Appearance = System.Windows.Forms.Appearance.Button; - this.chkrankSuper.AutoSize = true; - this.chkrankSuper.Location = new System.Drawing.Point(127, 369); - this.chkrankSuper.Name = "chkrankSuper"; - this.chkrankSuper.Size = new System.Drawing.Size(195, 23); - this.chkrankSuper.TabIndex = 24; - this.chkrankSuper.Text = "SuperOPs can appoint other SuperOPs"; - this.toolTip.SetToolTip(this.chkrankSuper, "Does what it says on the tin"); - this.chkrankSuper.UseVisualStyleBackColor = true; + this.txtBanMessage.Location = new System.Drawing.Point(141, 73); + this.txtBanMessage.MaxLength = 128; + this.txtBanMessage.Name = "txtBanMessage"; + this.txtBanMessage.Size = new System.Drawing.Size(257, 21); + this.txtBanMessage.TabIndex = 27; + // + // txtShutdown + // + this.txtShutdown.Location = new System.Drawing.Point(170, 102); + this.txtShutdown.MaxLength = 128; + this.txtShutdown.Name = "txtShutdown"; + this.txtShutdown.Size = new System.Drawing.Size(229, 21); + this.txtShutdown.TabIndex = 28; + this.txtShutdown.TextChanged += new System.EventHandler(this.txtShutdown_TextChanged); // // chkCheap // this.chkCheap.AutoSize = true; - this.chkCheap.Location = new System.Drawing.Point(12, 174); + this.chkCheap.Location = new System.Drawing.Point(6, 49); this.chkCheap.Name = "chkCheap"; this.chkCheap.Size = new System.Drawing.Size(103, 17); this.chkCheap.TabIndex = 23; @@ -804,57 +671,102 @@ private void InitializeComponent() this.toolTip.SetToolTip(this.chkCheap, "Is immortality cheap and unfair?"); this.chkCheap.UseVisualStyleBackColor = true; // - // chkDeath + // txtCheap // - this.chkDeath.Appearance = System.Windows.Forms.Appearance.Button; - this.chkDeath.AutoSize = true; - this.chkDeath.Location = new System.Drawing.Point(13, 340); - this.chkDeath.Name = "chkDeath"; - this.chkDeath.Size = new System.Drawing.Size(75, 23); - this.chkDeath.TabIndex = 21; - this.chkDeath.Text = "Death count"; - this.toolTip.SetToolTip(this.chkDeath, "\"Bob has died 10 times.\""); - this.chkDeath.UseVisualStyleBackColor = true; + this.txtCheap.Location = new System.Drawing.Point(115, 45); + this.txtCheap.Name = "txtCheap"; + this.txtCheap.Size = new System.Drawing.Size(283, 21); + this.txtCheap.TabIndex = 1; + // + // chkRestartTime + // + this.chkRestartTime.AutoSize = true; + this.chkRestartTime.Location = new System.Drawing.Point(6, 20); + this.chkRestartTime.Name = "chkRestartTime"; + this.chkRestartTime.Size = new System.Drawing.Size(131, 17); + this.chkRestartTime.TabIndex = 0; + this.chkRestartTime.Text = "Restart server at time:"; + this.chkRestartTime.UseVisualStyleBackColor = true; + // + // label34 + // + this.label34.AutoSize = true; + this.label34.Location = new System.Drawing.Point(246, 171); + this.label34.Name = "label34"; + this.label34.Size = new System.Drawing.Size(71, 13); + this.label34.TabIndex = 11; + this.label34.Text = "Money name:"; + // + // chkRepeatMessages + // + this.chkRepeatMessages.Appearance = System.Windows.Forms.Appearance.Button; + this.chkRepeatMessages.AutoSize = true; + this.chkRepeatMessages.Location = new System.Drawing.Point(275, 349); + this.chkRepeatMessages.Name = "chkRepeatMessages"; + this.chkRepeatMessages.Size = new System.Drawing.Size(127, 23); + this.chkRepeatMessages.TabIndex = 29; + this.chkRepeatMessages.Text = "Repeat message blocks"; + this.chkRepeatMessages.UseVisualStyleBackColor = true; + // + // txtMoneys + // + this.txtMoneys.Location = new System.Drawing.Point(323, 168); + this.txtMoneys.Name = "txtMoneys"; + this.txtMoneys.Size = new System.Drawing.Size(82, 21); + this.txtMoneys.TabIndex = 1; + // + // chkWorld + // + this.chkWorld.Appearance = System.Windows.Forms.Appearance.Button; + this.chkWorld.AutoSize = true; + this.chkWorld.Location = new System.Drawing.Point(6, 378); + this.chkWorld.Name = "chkWorld"; + this.chkWorld.Size = new System.Drawing.Size(69, 23); + this.chkWorld.TabIndex = 4; + this.chkWorld.Text = "World chat"; + this.toolTip.SetToolTip(this.chkWorld, "If disabled, every map has isolated chat.\nIf enabled, every map is able to commun" + + "icate without special letters."); + this.chkWorld.UseVisualStyleBackColor = true; // // chk17Dollar // this.chk17Dollar.Appearance = System.Windows.Forms.Appearance.Button; this.chk17Dollar.AutoSize = true; - this.chk17Dollar.Location = new System.Drawing.Point(231, 340); + this.chk17Dollar.Location = new System.Drawing.Point(224, 378); this.chk17Dollar.Name = "chk17Dollar"; this.chk17Dollar.Size = new System.Drawing.Size(91, 23); this.chk17Dollar.TabIndex = 22; this.chk17Dollar.Text = "$ before $name"; this.chk17Dollar.UseVisualStyleBackColor = true; // - // chkPhysicsRest - // - this.chkPhysicsRest.Appearance = System.Windows.Forms.Appearance.Button; - this.chkPhysicsRest.AutoSize = true; - this.chkPhysicsRest.Location = new System.Drawing.Point(13, 311); - this.chkPhysicsRest.Name = "chkPhysicsRest"; - this.chkPhysicsRest.Size = new System.Drawing.Size(89, 23); - this.chkPhysicsRest.TabIndex = 22; - this.chkPhysicsRest.Text = "Restart physics"; - this.toolTip.SetToolTip(this.chkPhysicsRest, "Restart physics on shutdown, clearing all physics blocks."); - this.chkPhysicsRest.UseVisualStyleBackColor = true; - // // chkSmile // this.chkSmile.Appearance = System.Windows.Forms.Appearance.Button; this.chkSmile.AutoSize = true; - this.chkSmile.Location = new System.Drawing.Point(240, 311); + this.chkSmile.Location = new System.Drawing.Point(321, 378); this.chkSmile.Name = "chkSmile"; this.chkSmile.Size = new System.Drawing.Size(82, 23); this.chkSmile.TabIndex = 19; this.chkSmile.Text = "Parse emotes"; this.chkSmile.UseVisualStyleBackColor = true; // + // chkDeath + // + this.chkDeath.Appearance = System.Windows.Forms.Appearance.Button; + this.chkDeath.AutoSize = true; + this.chkDeath.Location = new System.Drawing.Point(143, 378); + this.chkDeath.Name = "chkDeath"; + this.chkDeath.Size = new System.Drawing.Size(75, 23); + this.chkDeath.TabIndex = 21; + this.chkDeath.Text = "Death count"; + this.toolTip.SetToolTip(this.chkDeath, "\"Bob has died 10 times.\""); + this.chkDeath.UseVisualStyleBackColor = true; + // // chkHelp // this.chkHelp.Appearance = System.Windows.Forms.Appearance.Button; this.chkHelp.AutoSize = true; - this.chkHelp.Location = new System.Drawing.Point(13, 369); + this.chkHelp.Location = new System.Drawing.Point(81, 378); this.chkHelp.Name = "chkHelp"; this.chkHelp.Size = new System.Drawing.Size(56, 23); this.chkHelp.TabIndex = 20; @@ -862,148 +774,402 @@ private void InitializeComponent() this.toolTip.SetToolTip(this.chkHelp, "Should the old, cluttered help menu be used?"); this.chkHelp.UseVisualStyleBackColor = true; // - // label28 + // txtHost // - this.label28.AutoSize = true; - this.label28.Location = new System.Drawing.Point(211, 68); - this.label28.Name = "label28"; - this.label28.Size = new System.Drawing.Size(61, 13); - this.label28.TabIndex = 16; - this.label28.Text = "Normal /rp:"; + this.txtHost.Location = new System.Drawing.Point(323, 195); + this.txtHost.Name = "txtHost"; + this.txtHost.Size = new System.Drawing.Size(82, 21); + this.txtHost.TabIndex = 2; + this.txtHost.TextChanged += new System.EventHandler(this.txtPort_TextChanged); + // + // label10 + // + this.label10.AutoSize = true; + this.label10.Location = new System.Drawing.Point(248, 144); + this.label10.Name = "label10"; + this.label10.Size = new System.Drawing.Size(71, 13); + this.label10.TabIndex = 3; + this.label10.Text = "Default color:"; + // + // label30 + // + this.label30.AutoSize = true; + this.label30.Location = new System.Drawing.Point(222, 198); + this.label30.Name = "label30"; + this.label30.Size = new System.Drawing.Size(95, 13); + this.label30.TabIndex = 3; + this.label30.Text = "Default host state:"; + // + // cmbDefaultColour + // + this.cmbDefaultColour.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbDefaultColour.FormattingEnabled = true; + this.cmbDefaultColour.Location = new System.Drawing.Point(321, 141); + this.cmbDefaultColour.Name = "cmbDefaultColour"; + this.cmbDefaultColour.Size = new System.Drawing.Size(57, 21); + this.cmbDefaultColour.TabIndex = 9; + this.toolTip.SetToolTip(this.cmbDefaultColour, "The colour of the default chat used in the server.\nFor example, when you are aske" + + "d to select two corners in a cuboid."); + this.cmbDefaultColour.SelectedIndexChanged += new System.EventHandler(this.cmbDefaultColour_SelectedIndexChanged); + // + // lblDefault + // + this.lblDefault.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.lblDefault.Location = new System.Drawing.Point(384, 141); + this.lblDefault.Name = "lblDefault"; + this.lblDefault.Size = new System.Drawing.Size(21, 21); + this.lblDefault.TabIndex = 10; + // + // tabPage4 + // + this.tabPage4.BackColor = System.Drawing.SystemColors.Control; + this.tabPage4.Controls.Add(this.groupBox12); + this.tabPage4.Controls.Add(this.groupBox11); + this.tabPage4.Controls.Add(this.label27); + this.tabPage4.Controls.Add(this.label32); + this.tabPage4.Controls.Add(this.label22); + this.tabPage4.Controls.Add(this.txtMain); + this.tabPage4.Controls.Add(this.chkAutoload); + this.tabPage4.Controls.Add(this.groupBox10); + this.tabPage4.Controls.Add(this.txtBackup); + this.tabPage4.Controls.Add(this.txtMaps); + this.tabPage4.Controls.Add(this.label9); + this.tabPage4.Controls.Add(this.groupBox5); + this.tabPage4.Controls.Add(this.txtBackupLocation); + this.tabPage4.Font = new System.Drawing.Font("Calibri", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.tabPage4.Location = new System.Drawing.Point(4, 22); + this.tabPage4.Name = "tabPage4"; + this.tabPage4.Size = new System.Drawing.Size(411, 404); + this.tabPage4.TabIndex = 3; + this.tabPage4.Text = "Maps/Players"; + // + // groupBox12 + // + this.groupBox12.Location = new System.Drawing.Point(294, 123); + this.groupBox12.Name = "groupBox12"; + this.groupBox12.Size = new System.Drawing.Size(114, 109); + this.groupBox12.TabIndex = 33; + this.groupBox12.TabStop = false; + this.groupBox12.Text = "Block Spam"; + // + // groupBox11 + // + this.groupBox11.Controls.Add(this.ChkTunnels); + this.groupBox11.Controls.Add(this.label7); + this.groupBox11.Controls.Add(this.txtDepth); + this.groupBox11.Location = new System.Drawing.Point(294, 39); + this.groupBox11.Name = "groupBox11"; + this.groupBox11.Size = new System.Drawing.Size(114, 78); + this.groupBox11.TabIndex = 32; + this.groupBox11.TabStop = false; + this.groupBox11.Text = "Anti Tunneling"; + // + // ChkTunnels + // + this.ChkTunnels.Appearance = System.Windows.Forms.Appearance.Button; + this.ChkTunnels.AutoSize = true; + this.ChkTunnels.Location = new System.Drawing.Point(6, 20); + this.ChkTunnels.Name = "ChkTunnels"; + this.ChkTunnels.Size = new System.Drawing.Size(102, 23); + this.ChkTunnels.TabIndex = 4; + this.ChkTunnels.Text = "Use Anti Tunneling"; + this.toolTip.SetToolTip(this.ChkTunnels, "Should guests be limited to digging a certain depth?"); + this.ChkTunnels.UseVisualStyleBackColor = true; + // + // label7 + // + this.label7.AutoSize = true; + this.label7.Location = new System.Drawing.Point(3, 52); + this.label7.Name = "label7"; + this.label7.Size = new System.Drawing.Size(39, 13); + this.label7.TabIndex = 3; + this.label7.Text = "Depth:"; + // + // txtDepth + // + this.txtDepth.Location = new System.Drawing.Point(47, 49); + this.txtDepth.Name = "txtDepth"; + this.txtDepth.Size = new System.Drawing.Size(41, 21); + this.txtDepth.TabIndex = 2; + this.toolTip.SetToolTip(this.txtDepth, "Depth which guests can dig.\nDefault = 4"); + this.txtDepth.TextChanged += new System.EventHandler(this.txtDepth_TextChanged); + // + // label27 + // + this.label27.AutoSize = true; + this.label27.Location = new System.Drawing.Point(33, 96); + this.label27.Name = "label27"; + this.label27.Size = new System.Drawing.Size(63, 13); + this.label27.TabIndex = 3; + this.label27.Text = "Main name:"; + // + // label32 + // + this.label32.AutoSize = true; + this.label32.Location = new System.Drawing.Point(10, 15); + this.label32.Name = "label32"; + this.label32.Size = new System.Drawing.Size(86, 13); + this.label32.TabIndex = 3; + this.label32.Text = "Backup Location:"; + // + // label22 + // + this.label22.AutoSize = true; + this.label22.Location = new System.Drawing.Point(38, 69); + this.label22.Name = "label22"; + this.label22.Size = new System.Drawing.Size(58, 13); + this.label22.TabIndex = 3; + this.label22.Text = "Max Maps:"; + // + // txtMain + // + this.txtMain.Location = new System.Drawing.Point(102, 93); + this.txtMain.Name = "txtMain"; + this.txtMain.Size = new System.Drawing.Size(60, 21); + this.txtMain.TabIndex = 2; + this.txtMain.TextChanged += new System.EventHandler(this.txtMaps_TextChanged); + // + // chkAutoload + // + this.chkAutoload.Appearance = System.Windows.Forms.Appearance.Button; + this.chkAutoload.AutoSize = true; + this.chkAutoload.Location = new System.Drawing.Point(180, 39); + this.chkAutoload.Name = "chkAutoload"; + this.chkAutoload.Size = new System.Drawing.Size(81, 23); + this.chkAutoload.TabIndex = 4; + this.chkAutoload.Text = "Load on /goto"; + this.toolTip.SetToolTip(this.chkAutoload, "Load a map when a user wishes to go to it, and unload empty maps"); + this.chkAutoload.UseVisualStyleBackColor = true; + // + // groupBox10 + // + this.groupBox10.Controls.Add(this.chkForceCuboid); + this.groupBox10.Controls.Add(this.chkPhysicsRest); + this.groupBox10.Controls.Add(this.txtRP); + this.groupBox10.Controls.Add(this.label24); + this.groupBox10.Controls.Add(this.label28); + this.groupBox10.Controls.Add(this.txtNormRp); + this.groupBox10.Location = new System.Drawing.Point(3, 238); + this.groupBox10.Name = "groupBox10"; + this.groupBox10.Size = new System.Drawing.Size(405, 62); + this.groupBox10.TabIndex = 31; + this.groupBox10.TabStop = false; + this.groupBox10.Text = "Physics"; + // + // chkForceCuboid + // + this.chkForceCuboid.Appearance = System.Windows.Forms.Appearance.Button; + this.chkForceCuboid.AutoSize = true; + this.chkForceCuboid.Location = new System.Drawing.Point(6, 20); + this.chkForceCuboid.Name = "chkForceCuboid"; + this.chkForceCuboid.Size = new System.Drawing.Size(78, 23); + this.chkForceCuboid.TabIndex = 29; + this.chkForceCuboid.Text = "Force Cuboid"; + this.toolTip.SetToolTip(this.chkForceCuboid, "When true, runs an attempted cuboid despite cuboid limits, until it hits the grou" + + "p limit for that user."); + this.chkForceCuboid.UseVisualStyleBackColor = true; + // + // chkPhysicsRest + // + this.chkPhysicsRest.Appearance = System.Windows.Forms.Appearance.Button; + this.chkPhysicsRest.AutoSize = true; + this.chkPhysicsRest.Location = new System.Drawing.Point(90, 20); + this.chkPhysicsRest.Name = "chkPhysicsRest"; + this.chkPhysicsRest.Size = new System.Drawing.Size(89, 23); + this.chkPhysicsRest.TabIndex = 22; + this.chkPhysicsRest.Text = "Restart physics"; + this.toolTip.SetToolTip(this.chkPhysicsRest, "Restart physics on shutdown, clearing all physics blocks."); + this.chkPhysicsRest.UseVisualStyleBackColor = true; + // + // txtRP + // + this.txtRP.Location = new System.Drawing.Point(239, 22); + this.txtRP.Name = "txtRP"; + this.txtRP.Size = new System.Drawing.Size(41, 21); + this.txtRP.TabIndex = 14; // // label24 // this.label24.AutoSize = true; - this.label24.Location = new System.Drawing.Point(224, 42); + this.label24.Location = new System.Drawing.Point(185, 25); this.label24.Name = "label24"; this.label24.Size = new System.Drawing.Size(48, 13); this.label24.TabIndex = 15; this.label24.Text = "/rp limit:"; this.toolTip.SetToolTip(this.label24, "Limit for custom physics set by /rp"); // + // label28 + // + this.label28.AutoSize = true; + this.label28.Location = new System.Drawing.Point(289, 25); + this.label28.Name = "label28"; + this.label28.Size = new System.Drawing.Size(61, 13); + this.label28.TabIndex = 16; + this.label28.Text = "Normal /rp:"; + // // txtNormRp // - this.txtNormRp.Location = new System.Drawing.Point(281, 65); + this.txtNormRp.Location = new System.Drawing.Point(356, 22); this.txtNormRp.Name = "txtNormRp"; this.txtNormRp.Size = new System.Drawing.Size(41, 21); this.txtNormRp.TabIndex = 13; // - // txtRP + // txtBackup // - this.txtRP.Location = new System.Drawing.Point(281, 39); - this.txtRP.Name = "txtRP"; - this.txtRP.Size = new System.Drawing.Size(41, 21); - this.txtRP.TabIndex = 14; + this.txtBackup.Location = new System.Drawing.Point(102, 39); + this.txtBackup.Name = "txtBackup"; + this.txtBackup.Size = new System.Drawing.Size(41, 21); + this.txtBackup.TabIndex = 5; + this.toolTip.SetToolTip(this.txtBackup, "How often should backups be taken, in seconds.\nDefault = 300"); // - // label34 + // txtMaps // - this.label34.AutoSize = true; - this.label34.Location = new System.Drawing.Point(162, 287); - this.label34.Name = "label34"; - this.label34.Size = new System.Drawing.Size(71, 13); - this.label34.TabIndex = 11; - this.label34.Text = "Money name:"; + this.txtMaps.Location = new System.Drawing.Point(102, 66); + this.txtMaps.Name = "txtMaps"; + this.txtMaps.Size = new System.Drawing.Size(60, 21); + this.txtMaps.TabIndex = 2; + this.toolTip.SetToolTip(this.txtMaps, "The total number of maps which can be loaded at once.\nDefault = 5"); + this.txtMaps.TextChanged += new System.EventHandler(this.txtMaps_TextChanged); // - // label26 + // label9 // - this.label26.AutoSize = true; - this.label26.Location = new System.Drawing.Point(29, 93); - this.label26.Name = "label26"; - this.label26.Size = new System.Drawing.Size(48, 13); - this.label26.TabIndex = 11; - this.label26.Text = "AFK Kick:"; + this.label9.AutoSize = true; + this.label9.Location = new System.Drawing.Point(29, 44); + this.label9.Name = "label9"; + this.label9.Size = new System.Drawing.Size(67, 13); + this.label9.TabIndex = 7; + this.label9.Text = "Backup time:"; + // + // groupBox5 + // + this.groupBox5.Controls.Add(this.label39); + this.groupBox5.Controls.Add(this.txtMaxGuests); + this.groupBox5.Controls.Add(this.chkrankSuper); + this.groupBox5.Controls.Add(this.cmbDefaultRank); + this.groupBox5.Controls.Add(this.label29); + this.groupBox5.Controls.Add(this.label21); + this.groupBox5.Controls.Add(this.txtPlayers); + this.groupBox5.Controls.Add(this.label25); + this.groupBox5.Controls.Add(this.txtafk); + this.groupBox5.Controls.Add(this.label26); + this.groupBox5.Controls.Add(this.txtAFKKick); + this.groupBox5.Location = new System.Drawing.Point(3, 306); + this.groupBox5.Name = "groupBox5"; + this.groupBox5.Size = new System.Drawing.Size(405, 95); + this.groupBox5.TabIndex = 30; + this.groupBox5.TabStop = false; + this.groupBox5.Text = "Players"; + // + // label39 + // + this.label39.AutoSize = true; + this.label39.Location = new System.Drawing.Point(144, 44); + this.label39.Name = "label39"; + this.label39.Size = new System.Drawing.Size(65, 13); + this.label39.TabIndex = 23; + this.label39.Text = "Max Guests:"; + // + // txtMaxGuests + // + this.txtMaxGuests.Location = new System.Drawing.Point(217, 41); + this.txtMaxGuests.Name = "txtMaxGuests"; + this.txtMaxGuests.Size = new System.Drawing.Size(60, 21); + this.txtMaxGuests.TabIndex = 22; + this.toolTip.SetToolTip(this.txtMaxGuests, "The total number of players which can login.\nDefault = 12"); + this.txtMaxGuests.TextChanged += new System.EventHandler(this.txtMaxGuests_TextChanged); + // + // chkrankSuper + // + this.chkrankSuper.Appearance = System.Windows.Forms.Appearance.Button; + this.chkrankSuper.AutoSize = true; + this.chkrankSuper.Location = new System.Drawing.Point(166, 12); + this.chkrankSuper.Name = "chkrankSuper"; + this.chkrankSuper.Size = new System.Drawing.Size(195, 23); + this.chkrankSuper.TabIndex = 24; + this.chkrankSuper.Text = "SuperOPs can appoint other SuperOPs"; + this.toolTip.SetToolTip(this.chkrankSuper, "Does what it says on the tin"); + this.chkrankSuper.UseVisualStyleBackColor = true; + // + // cmbDefaultRank + // + this.cmbDefaultRank.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbDefaultRank.FormattingEnabled = true; + this.cmbDefaultRank.Location = new System.Drawing.Point(79, 14); + this.cmbDefaultRank.Name = "cmbDefaultRank"; + this.cmbDefaultRank.Size = new System.Drawing.Size(81, 21); + this.cmbDefaultRank.TabIndex = 21; + this.toolTip.SetToolTip(this.cmbDefaultRank, "Default rank assigned to new visitors to the server."); + // + // label29 + // + this.label29.AutoSize = true; + this.label29.Location = new System.Drawing.Point(5, 17); + this.label29.Name = "label29"; + this.label29.Size = new System.Drawing.Size(68, 13); + this.label29.TabIndex = 20; + this.label29.Text = "Default rank:"; + // + // label21 + // + this.label21.AutoSize = true; + this.label21.Location = new System.Drawing.Point(5, 44); + this.label21.Name = "label21"; + this.label21.Size = new System.Drawing.Size(67, 13); + this.label21.TabIndex = 3; + this.label21.Text = "Max Players:"; + // + // txtPlayers + // + this.txtPlayers.Location = new System.Drawing.Point(78, 41); + this.txtPlayers.Name = "txtPlayers"; + this.txtPlayers.Size = new System.Drawing.Size(60, 21); + this.txtPlayers.TabIndex = 2; + this.toolTip.SetToolTip(this.txtPlayers, "The total number of players which can login.\nDefault = 12"); + this.txtPlayers.TextChanged += new System.EventHandler(this.txtPlayers_TextChanged); // // label25 // this.label25.AutoSize = true; - this.label25.Location = new System.Drawing.Point(23, 67); + this.label25.Location = new System.Drawing.Point(18, 71); this.label25.Name = "label25"; this.label25.Size = new System.Drawing.Size(54, 13); this.label25.TabIndex = 12; this.label25.Text = "AFK timer:"; // - // txtAFKKick - // - this.txtAFKKick.Location = new System.Drawing.Point(83, 91); - this.txtAFKKick.Name = "txtAFKKick"; - this.txtAFKKick.Size = new System.Drawing.Size(41, 21); - this.txtAFKKick.TabIndex = 9; - this.toolTip.SetToolTip(this.txtAFKKick, "Kick the user after they have been afk for this many minutes (0 = No kick)"); - // // txtafk // - this.txtafk.Location = new System.Drawing.Point(83, 64); + this.txtafk.Location = new System.Drawing.Point(79, 68); this.txtafk.Name = "txtafk"; this.txtafk.Size = new System.Drawing.Size(41, 21); this.txtafk.TabIndex = 10; this.toolTip.SetToolTip(this.txtafk, "How long the server should wait before declaring someone ask afk. (0 = No timer a" + "t all)"); + this.txtafk.TextChanged += new System.EventHandler(this.txtafk_TextChanged); // - // label9 - // - this.label9.AutoSize = true; - this.label9.Location = new System.Drawing.Point(10, 42); - this.label9.Name = "label9"; - this.label9.Size = new System.Drawing.Size(67, 13); - this.label9.TabIndex = 7; - this.label9.Text = "Backup time:"; - // - // txtBackup + // label26 // - this.txtBackup.Location = new System.Drawing.Point(83, 37); - this.txtBackup.Name = "txtBackup"; - this.txtBackup.Size = new System.Drawing.Size(41, 21); - this.txtBackup.TabIndex = 5; - this.toolTip.SetToolTip(this.txtBackup, "How often should backups be taken, in seconds.\nDefault = 300"); + this.label26.AutoSize = true; + this.label26.Location = new System.Drawing.Point(163, 71); + this.label26.Name = "label26"; + this.label26.Size = new System.Drawing.Size(48, 13); + this.label26.TabIndex = 11; + this.label26.Text = "AFK Kick:"; // - // label32 + // txtAFKKick // - this.label32.AutoSize = true; - this.label32.Location = new System.Drawing.Point(10, 15); - this.label32.Name = "label32"; - this.label32.Size = new System.Drawing.Size(44, 13); - this.label32.TabIndex = 3; - this.label32.Text = "Backup:"; + this.txtAFKKick.Location = new System.Drawing.Point(217, 68); + this.txtAFKKick.Name = "txtAFKKick"; + this.txtAFKKick.Size = new System.Drawing.Size(41, 21); + this.txtAFKKick.TabIndex = 9; + this.toolTip.SetToolTip(this.txtAFKKick, "Kick the user after they have been afk for this many minutes (0 = No kick)"); // // txtBackupLocation // - this.txtBackupLocation.Location = new System.Drawing.Point(60, 12); + this.txtBackupLocation.Location = new System.Drawing.Point(102, 12); this.txtBackupLocation.Name = "txtBackupLocation"; - this.txtBackupLocation.Size = new System.Drawing.Size(262, 21); + this.txtBackupLocation.Size = new System.Drawing.Size(300, 21); this.txtBackupLocation.TabIndex = 2; // - // txtMoneys - // - this.txtMoneys.Location = new System.Drawing.Point(239, 284); - this.txtMoneys.Name = "txtMoneys"; - this.txtMoneys.Size = new System.Drawing.Size(82, 21); - this.txtMoneys.TabIndex = 1; - // - // txtCheap - // - this.txtCheap.Location = new System.Drawing.Point(121, 172); - this.txtCheap.Name = "txtCheap"; - this.txtCheap.Size = new System.Drawing.Size(200, 21); - this.txtCheap.TabIndex = 1; - // - // txtRestartTime - // - this.txtRestartTime.Location = new System.Drawing.Point(149, 145); - this.txtRestartTime.Name = "txtRestartTime"; - this.txtRestartTime.Size = new System.Drawing.Size(172, 21); - this.txtRestartTime.TabIndex = 1; - this.txtRestartTime.Text = "HH: mm: ss"; - // - // chkRestartTime - // - this.chkRestartTime.AutoSize = true; - this.chkRestartTime.Location = new System.Drawing.Point(12, 147); - this.chkRestartTime.Name = "chkRestartTime"; - this.chkRestartTime.Size = new System.Drawing.Size(131, 17); - this.chkRestartTime.TabIndex = 0; - this.chkRestartTime.Text = "Restart server at time:"; - this.chkRestartTime.UseVisualStyleBackColor = true; - // // tabPage2 // this.tabPage2.BackColor = System.Drawing.Color.Transparent; @@ -1024,7 +1190,7 @@ private void InitializeComponent() this.tabPage2.Location = new System.Drawing.Point(4, 22); this.tabPage2.Name = "tabPage2"; this.tabPage2.Padding = new System.Windows.Forms.Padding(3); - this.tabPage2.Size = new System.Drawing.Size(337, 404); + this.tabPage2.Size = new System.Drawing.Size(411, 404); this.tabPage2.TabIndex = 4; this.tabPage2.Text = "Ranks"; // @@ -1169,7 +1335,7 @@ private void InitializeComponent() this.tabPage3.Controls.Add(this.listCommands); this.tabPage3.Location = new System.Drawing.Point(4, 22); this.tabPage3.Name = "tabPage3"; - this.tabPage3.Size = new System.Drawing.Size(337, 404); + this.tabPage3.Size = new System.Drawing.Size(411, 404); this.tabPage3.TabIndex = 2; this.tabPage3.Text = "Commands"; this.toolTip.SetToolTip(this.tabPage3, "Which ranks can use which commands."); @@ -1268,7 +1434,7 @@ private void InitializeComponent() this.tabPage5.Location = new System.Drawing.Point(4, 22); this.tabPage5.Name = "tabPage5"; this.tabPage5.Padding = new System.Windows.Forms.Padding(3); - this.tabPage5.Size = new System.Drawing.Size(337, 404); + this.tabPage5.Size = new System.Drawing.Size(411, 404); this.tabPage5.TabIndex = 5; this.tabPage5.Text = "Blocks"; // @@ -1351,6 +1517,310 @@ private void InitializeComponent() this.listBlocks.TabIndex = 15; this.listBlocks.SelectedIndexChanged += new System.EventHandler(this.listBlocks_SelectedIndexChanged); // + // tabPage6 + // + this.tabPage6.BackColor = System.Drawing.SystemColors.Control; + this.tabPage6.Controls.Add(this.tableLayoutPanel1); + this.tabPage6.Location = new System.Drawing.Point(4, 22); + this.tabPage6.Name = "tabPage6"; + this.tabPage6.Size = new System.Drawing.Size(411, 404); + this.tabPage6.TabIndex = 6; + this.tabPage6.Text = "IRC/Global"; + // + // tableLayoutPanel1 + // + this.tableLayoutPanel1.ColumnCount = 1; + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F)); + this.tableLayoutPanel1.Controls.Add(this.gbIRC, 0, 0); + this.tableLayoutPanel1.Controls.Add(this.gbGlobal, 0, 1); + this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill; + this.tableLayoutPanel1.Location = new System.Drawing.Point(0, 0); + this.tableLayoutPanel1.Name = "tableLayoutPanel1"; + this.tableLayoutPanel1.RowCount = 2; + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutPanel1.Size = new System.Drawing.Size(411, 404); + this.tableLayoutPanel1.TabIndex = 0; + // + // gbIRC + // + this.gbIRC.Controls.Add(this.txtIrcPass); + this.gbIRC.Controls.Add(this.label35); + this.gbIRC.Controls.Add(this.chkIrcIdentify); + this.gbIRC.Controls.Add(this.txtNick); + this.gbIRC.Controls.Add(this.label4); + this.gbIRC.Controls.Add(this.txtOpChannel); + this.gbIRC.Controls.Add(this.label31); + this.gbIRC.Controls.Add(this.lblIRC); + this.gbIRC.Controls.Add(this.chkIRC); + this.gbIRC.Controls.Add(this.label23); + this.gbIRC.Controls.Add(this.label5); + this.gbIRC.Controls.Add(this.cmbIRCColour); + this.gbIRC.Controls.Add(this.label6); + this.gbIRC.Controls.Add(this.txtChannel); + this.gbIRC.Controls.Add(this.txtIRCServer); + this.gbIRC.Dock = System.Windows.Forms.DockStyle.Fill; + this.gbIRC.Location = new System.Drawing.Point(3, 3); + this.gbIRC.Name = "gbIRC"; + this.gbIRC.Size = new System.Drawing.Size(405, 196); + this.gbIRC.TabIndex = 0; + this.gbIRC.TabStop = false; + this.gbIRC.Text = "IRC"; + // + // txtIrcPass + // + this.txtIrcPass.Location = new System.Drawing.Point(66, 128); + this.txtIrcPass.Name = "txtIrcPass"; + this.txtIrcPass.Size = new System.Drawing.Size(94, 21); + this.txtIrcPass.TabIndex = 28; + // + // label35 + // + this.label35.AutoSize = true; + this.label35.Location = new System.Drawing.Point(5, 131); + this.label35.Name = "label35"; + this.label35.Size = new System.Drawing.Size(56, 13); + this.label35.TabIndex = 29; + this.label35.Text = "Password:"; + // + // chkIrcIdentify + // + this.chkIrcIdentify.AutoSize = true; + this.chkIrcIdentify.Location = new System.Drawing.Point(165, 130); + this.chkIrcIdentify.Name = "chkIrcIdentify"; + this.chkIrcIdentify.Size = new System.Drawing.Size(126, 17); + this.chkIrcIdentify.TabIndex = 27; + this.chkIrcIdentify.Text = "Identify with NickServ"; + this.chkIrcIdentify.UseVisualStyleBackColor = true; + this.chkIrcIdentify.CheckedChanged += new System.EventHandler(this.chkIrcIdentify_CheckedChanged); + // + // txtNick + // + this.txtNick.Location = new System.Drawing.Point(66, 101); + this.txtNick.Name = "txtNick"; + this.txtNick.Size = new System.Drawing.Size(94, 21); + this.txtNick.TabIndex = 17; + this.toolTip.SetToolTip(this.txtNick, "The Nick that the IRC bot will try and use."); + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Location = new System.Drawing.Point(31, 102); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(30, 13); + this.label4.TabIndex = 20; + this.label4.Text = "Nick:"; + // + // txtOpChannel + // + this.txtOpChannel.Location = new System.Drawing.Point(232, 74); + this.txtOpChannel.Name = "txtOpChannel"; + this.txtOpChannel.Size = new System.Drawing.Size(86, 21); + this.txtOpChannel.TabIndex = 26; + this.toolTip.SetToolTip(this.txtOpChannel, "The IRC channel to be used."); + // + // label31 + // + this.label31.AutoSize = true; + this.label31.Location = new System.Drawing.Point(162, 77); + this.label31.Name = "label31"; + this.label31.Size = new System.Drawing.Size(64, 13); + this.label31.TabIndex = 25; + this.label31.Text = "Op Channel:"; + // + // lblIRC + // + this.lblIRC.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.lblIRC.Location = new System.Drawing.Point(295, 101); + this.lblIRC.Name = "lblIRC"; + this.lblIRC.Size = new System.Drawing.Size(21, 21); + this.lblIRC.TabIndex = 24; + // + // chkIRC + // + this.chkIRC.Appearance = System.Windows.Forms.Appearance.Button; + this.chkIRC.AutoSize = true; + this.chkIRC.Location = new System.Drawing.Point(9, 20); + this.chkIRC.Name = "chkIRC"; + this.chkIRC.Size = new System.Drawing.Size(52, 23); + this.chkIRC.TabIndex = 22; + this.chkIRC.Text = "Use IRC"; + this.toolTip.SetToolTip(this.chkIRC, "Whether to use the IRC bot or not.\nIRC stands for Internet Relay Chat and allows " + + "for communication with the server while outside Minecraft."); + this.chkIRC.UseVisualStyleBackColor = true; + this.chkIRC.CheckedChanged += new System.EventHandler(this.chkIRC_CheckedChanged); + // + // label23 + // + this.label23.AutoSize = true; + this.label23.Location = new System.Drawing.Point(175, 104); + this.label23.Name = "label23"; + this.label23.Size = new System.Drawing.Size(51, 13); + this.label23.TabIndex = 21; + this.label23.Text = "IRC color:"; + // + // label5 + // + this.label5.AutoSize = true; + this.label5.Location = new System.Drawing.Point(12, 77); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(49, 13); + this.label5.TabIndex = 18; + this.label5.Text = "Channel:"; + // + // cmbIRCColour + // + this.cmbIRCColour.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbIRCColour.FormattingEnabled = true; + this.cmbIRCColour.Location = new System.Drawing.Point(232, 101); + this.cmbIRCColour.Name = "cmbIRCColour"; + this.cmbIRCColour.Size = new System.Drawing.Size(57, 21); + this.cmbIRCColour.TabIndex = 23; + this.toolTip.SetToolTip(this.cmbIRCColour, "The colour of the IRC nicks used in the IRC."); + this.cmbIRCColour.SelectedIndexChanged += new System.EventHandler(this.cmbIRCColour_SelectedIndexChanged); + // + // label6 + // + this.label6.AutoSize = true; + this.label6.Location = new System.Drawing.Point(21, 50); + this.label6.Name = "label6"; + this.label6.Size = new System.Drawing.Size(40, 13); + this.label6.TabIndex = 19; + this.label6.Text = "Server:"; + // + // txtChannel + // + this.txtChannel.Location = new System.Drawing.Point(66, 74); + this.txtChannel.Name = "txtChannel"; + this.txtChannel.Size = new System.Drawing.Size(94, 21); + this.txtChannel.TabIndex = 15; + this.toolTip.SetToolTip(this.txtChannel, "The IRC channel to be used."); + // + // txtIRCServer + // + this.txtIRCServer.Location = new System.Drawing.Point(66, 47); + this.txtIRCServer.Name = "txtIRCServer"; + this.txtIRCServer.Size = new System.Drawing.Size(252, 21); + this.txtIRCServer.TabIndex = 16; + this.toolTip.SetToolTip(this.txtIRCServer, "The IRC server to be used.\nDefault = irc.esper.net\nBetter choice = irc.foonetic.n" + + "et"); + // + // gbGlobal + // + this.gbGlobal.Controls.Add(this.button2); + this.gbGlobal.Controls.Add(this.txtGlobalPassword); + this.gbGlobal.Controls.Add(this.chkGlobal); + this.gbGlobal.Controls.Add(this.label37); + this.gbGlobal.Controls.Add(this.cmbGlobalColor); + this.gbGlobal.Controls.Add(this.chkGlobalIdentify); + this.gbGlobal.Controls.Add(this.label40); + this.gbGlobal.Controls.Add(this.txtGlobalNick); + this.gbGlobal.Controls.Add(this.lblGlobalColor); + this.gbGlobal.Controls.Add(this.label38); + this.gbGlobal.Dock = System.Windows.Forms.DockStyle.Fill; + this.gbGlobal.Location = new System.Drawing.Point(3, 205); + this.gbGlobal.Name = "gbGlobal"; + this.gbGlobal.Size = new System.Drawing.Size(405, 196); + this.gbGlobal.TabIndex = 1; + this.gbGlobal.TabStop = false; + this.gbGlobal.Text = "Global Chat"; + // + // button2 + // + this.button2.Location = new System.Drawing.Point(107, 20); + this.button2.Name = "button2"; + this.button2.Size = new System.Drawing.Size(105, 23); + this.button2.TabIndex = 38; + this.button2.Text = "Generate New Nick"; + this.button2.UseVisualStyleBackColor = true; + this.button2.Click += new System.EventHandler(this.button2_Click); + // + // txtGlobalPassword + // + this.txtGlobalPassword.Location = new System.Drawing.Point(66, 80); + this.txtGlobalPassword.Name = "txtGlobalPassword"; + this.txtGlobalPassword.Size = new System.Drawing.Size(94, 21); + this.txtGlobalPassword.TabIndex = 36; + // + // chkGlobal + // + this.chkGlobal.Appearance = System.Windows.Forms.Appearance.Button; + this.chkGlobal.AutoSize = true; + this.chkGlobal.Location = new System.Drawing.Point(9, 20); + this.chkGlobal.Name = "chkGlobal"; + this.chkGlobal.Size = new System.Drawing.Size(92, 23); + this.chkGlobal.TabIndex = 30; + this.chkGlobal.Text = "Use Global Chat"; + this.toolTip.SetToolTip(this.chkGlobal, "Whether to use MCSong Global Chat. Global Chat allows you to talk to all other MC" + + "Song servers with it enabled."); + this.chkGlobal.UseVisualStyleBackColor = true; + this.chkGlobal.CheckedChanged += new System.EventHandler(this.chkGlobal_CheckedChanged); + // + // label37 + // + this.label37.AutoSize = true; + this.label37.Location = new System.Drawing.Point(5, 83); + this.label37.Name = "label37"; + this.label37.Size = new System.Drawing.Size(56, 13); + this.label37.TabIndex = 37; + this.label37.Text = "Password:"; + // + // cmbGlobalColor + // + this.cmbGlobalColor.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbGlobalColor.FormattingEnabled = true; + this.cmbGlobalColor.Location = new System.Drawing.Point(232, 53); + this.cmbGlobalColor.Name = "cmbGlobalColor"; + this.cmbGlobalColor.Size = new System.Drawing.Size(57, 21); + this.cmbGlobalColor.TabIndex = 33; + this.toolTip.SetToolTip(this.cmbGlobalColor, "The colour of the GC nicks used in the GC."); + this.cmbGlobalColor.SelectedIndexChanged += new System.EventHandler(this.cmbGlobalColor_SelectedIndexChanged); + // + // chkGlobalIdentify + // + this.chkGlobalIdentify.AutoSize = true; + this.chkGlobalIdentify.Location = new System.Drawing.Point(165, 82); + this.chkGlobalIdentify.Name = "chkGlobalIdentify"; + this.chkGlobalIdentify.Size = new System.Drawing.Size(126, 17); + this.chkGlobalIdentify.TabIndex = 35; + this.chkGlobalIdentify.Text = "Identify with NickServ"; + this.chkGlobalIdentify.UseVisualStyleBackColor = true; + this.chkGlobalIdentify.CheckedChanged += new System.EventHandler(this.chkGlobalIdentify_CheckedChanged); + // + // label40 + // + this.label40.AutoSize = true; + this.label40.Location = new System.Drawing.Point(177, 56); + this.label40.Name = "label40"; + this.label40.Size = new System.Drawing.Size(49, 13); + this.label40.TabIndex = 32; + this.label40.Text = "GC color:"; + // + // txtGlobalNick + // + this.txtGlobalNick.Location = new System.Drawing.Point(66, 53); + this.txtGlobalNick.Name = "txtGlobalNick"; + this.txtGlobalNick.Size = new System.Drawing.Size(94, 21); + this.txtGlobalNick.TabIndex = 30; + this.toolTip.SetToolTip(this.txtGlobalNick, "The Nick that Global Chat will try to use"); + // + // lblGlobalColor + // + this.lblGlobalColor.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.lblGlobalColor.Location = new System.Drawing.Point(295, 53); + this.lblGlobalColor.Name = "lblGlobalColor"; + this.lblGlobalColor.Size = new System.Drawing.Size(21, 21); + this.lblGlobalColor.TabIndex = 34; + // + // label38 + // + this.label38.AutoSize = true; + this.label38.Location = new System.Drawing.Point(31, 54); + this.label38.Name = "label38"; + this.label38.Size = new System.Drawing.Size(30, 13); + this.label38.TabIndex = 31; + this.label38.Text = "Nick:"; + // // btnSave // this.btnSave.Font = new System.Drawing.Font("Calibri", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); @@ -1376,7 +1846,7 @@ private void InitializeComponent() // btnApply // this.btnApply.Font = new System.Drawing.Font("Calibri", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.btnApply.Location = new System.Drawing.Point(266, 448); + this.btnApply.Location = new System.Drawing.Point(340, 447); this.btnApply.Name = "btnApply"; this.btnApply.Size = new System.Drawing.Size(75, 23); this.btnApply.TabIndex = 1; @@ -1398,7 +1868,7 @@ private void InitializeComponent() // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(345, 475); + this.ClientSize = new System.Drawing.Size(420, 475); this.Controls.Add(this.btnApply); this.Controls.Add(this.btnDiscard); this.Controls.Add(this.btnSave); @@ -1413,15 +1883,40 @@ private void InitializeComponent() this.Disposed += new System.EventHandler(this.PropertyWindow_Unload); this.tabControl.ResumeLayout(false); this.tabPage1.ResumeLayout(false); - this.tabPage1.PerformLayout(); + this.groupBox9.ResumeLayout(false); + this.groupBox9.PerformLayout(); + this.groupBox8.ResumeLayout(false); + this.groupBox8.PerformLayout(); + this.groupBox7.ResumeLayout(false); + this.groupBox7.PerformLayout(); + this.groupBox6.ResumeLayout(false); + this.groupBox6.PerformLayout(); + this.tabPage7.ResumeLayout(false); + this.tabPage7.PerformLayout(); + this.groupBox2.ResumeLayout(false); + this.groupBox2.PerformLayout(); + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); this.tabPage4.ResumeLayout(false); this.tabPage4.PerformLayout(); + this.groupBox11.ResumeLayout(false); + this.groupBox11.PerformLayout(); + this.groupBox10.ResumeLayout(false); + this.groupBox10.PerformLayout(); + this.groupBox5.ResumeLayout(false); + this.groupBox5.PerformLayout(); this.tabPage2.ResumeLayout(false); this.tabPage2.PerformLayout(); this.tabPage3.ResumeLayout(false); this.tabPage3.PerformLayout(); this.tabPage5.ResumeLayout(false); this.tabPage5.PerformLayout(); + this.tabPage6.ResumeLayout(false); + this.tableLayoutPanel1.ResumeLayout(false); + this.gbIRC.ResumeLayout(false); + this.gbIRC.PerformLayout(); + this.gbGlobal.ResumeLayout(false); + this.gbGlobal.PerformLayout(); this.ResumeLayout(false); } @@ -1440,14 +1935,7 @@ private void InitializeComponent() private System.Windows.Forms.Label label1; private System.Windows.Forms.TextBox txtMOTD; private System.Windows.Forms.TextBox txtName; - private System.Windows.Forms.CheckBox chkIRC; - private System.Windows.Forms.Label label5; - private System.Windows.Forms.Label label4; - private System.Windows.Forms.TextBox txtChannel; - private System.Windows.Forms.TextBox txtNick; private System.Windows.Forms.Label label10; - private System.Windows.Forms.Label label6; - private System.Windows.Forms.TextBox txtIRCServer; private System.Windows.Forms.Button btnSave; private System.Windows.Forms.Button btnDiscard; private System.Windows.Forms.Label label22; @@ -1457,16 +1945,11 @@ private void InitializeComponent() private System.Windows.Forms.ComboBox cmbDefaultColour; private System.Windows.Forms.Label lblDefault; private System.Windows.Forms.Button btnApply; - private System.Windows.Forms.Label lblIRC; - private System.Windows.Forms.ComboBox cmbIRCColour; - private System.Windows.Forms.Label label23; private System.Windows.Forms.ToolTip toolTip; private System.Windows.Forms.CheckBox chkUpdates; private System.Windows.Forms.CheckBox chkAutoload; private System.Windows.Forms.Label label27; private System.Windows.Forms.TextBox txtMain; - private System.Windows.Forms.TextBox txtOpChannel; - private System.Windows.Forms.Label label31; private System.Windows.Forms.TabPage tabPage4; private System.Windows.Forms.TextBox txtRestartTime; private System.Windows.Forms.CheckBox chkRestartTime; @@ -1547,5 +2030,56 @@ private void InitializeComponent() private System.Windows.Forms.ComboBox cmbMaintenance; private System.Windows.Forms.Label label33; private System.Windows.Forms.CheckBox chkMaintKick; + private System.Windows.Forms.TabPage tabPage6; + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1; + private System.Windows.Forms.GroupBox gbIRC; + private System.Windows.Forms.TextBox txtNick; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.TextBox txtOpChannel; + private System.Windows.Forms.Label label31; + private System.Windows.Forms.Label lblIRC; + private System.Windows.Forms.CheckBox chkIRC; + private System.Windows.Forms.Label label23; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.ComboBox cmbIRCColour; + private System.Windows.Forms.Label label6; + private System.Windows.Forms.TextBox txtChannel; + private System.Windows.Forms.TextBox txtIRCServer; + private System.Windows.Forms.GroupBox gbGlobal; + private System.Windows.Forms.TextBox txtIrcPass; + private System.Windows.Forms.Label label35; + private System.Windows.Forms.CheckBox chkIrcIdentify; + private System.Windows.Forms.ComboBox cmbAdminChat; + private System.Windows.Forms.Label label36; + private System.Windows.Forms.Button button2; + private System.Windows.Forms.TextBox txtGlobalPassword; + private System.Windows.Forms.CheckBox chkGlobal; + private System.Windows.Forms.Label label37; + private System.Windows.Forms.ComboBox cmbGlobalColor; + private System.Windows.Forms.CheckBox chkGlobalIdentify; + private System.Windows.Forms.Label label40; + private System.Windows.Forms.TextBox txtGlobalNick; + private System.Windows.Forms.Label lblGlobalColor; + private System.Windows.Forms.Label label38; + private System.Windows.Forms.TabPage tabPage7; + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.GroupBox groupBox4; + private System.Windows.Forms.GroupBox groupBox3; + private System.Windows.Forms.GroupBox groupBox2; + private System.Windows.Forms.GroupBox groupBox5; + private System.Windows.Forms.Label label39; + private System.Windows.Forms.TextBox txtMaxGuests; + private System.Windows.Forms.GroupBox groupBox9; + private System.Windows.Forms.GroupBox groupBox8; + private System.Windows.Forms.CheckBox chkPremium; + private System.Windows.Forms.GroupBox groupBox7; + private System.Windows.Forms.GroupBox groupBox6; + private System.Windows.Forms.Label label41; + private System.Windows.Forms.Button button3; + private System.Windows.Forms.CheckBox chkUPNP; + private System.Windows.Forms.GroupBox groupBox12; + private System.Windows.Forms.GroupBox groupBox11; + private System.Windows.Forms.GroupBox groupBox10; + private System.Windows.Forms.CheckBox chkDebug; } } \ No newline at end of file diff --git a/MCSong/GUI/PropertyWindow.cs b/MCSong/GUI/PropertyWindow.cs index fa6a1c1..0b361e5 100644 --- a/MCSong/GUI/PropertyWindow.cs +++ b/MCSong/GUI/PropertyWindow.cs @@ -7,11 +7,23 @@ using System.Text; using System.Windows.Forms; using System.IO; +using System.Threading; namespace MCSong.Gui { public partial class PropertyWindow : Form { + private const int CP_NOCLOSE_BUTTON = 0x200; + protected override CreateParams CreateParams + { + get + { + CreateParams myCp = base.CreateParams; + myCp.ClassStyle = myCp.ClassStyle | CP_NOCLOSE_BUTTON; + return myCp; + } + } + public PropertyWindow() { InitializeComponent(); } @@ -31,18 +43,27 @@ private void PropertyWindow_Load(object sender, EventArgs e) { cmbDefaultColour.Items.AddRange(colors); cmbIRCColour.Items.AddRange(colors); cmbColor.Items.AddRange(colors); + cmbGlobalColor.Items.AddRange(colors); + + string opchatperm = ""; + string adminchatperm = ""; string maintperm = ""; foreach (Group grp in Group.GroupList) { cmbDefaultRank.Items.Add(grp.name); cmbOpChat.Items.Add(grp.name); + cmbAdminChat.Items.Add(grp.name); cmbMaintenance.Items.Add(grp.name); if (grp.Permission == Server.opchatperm) { opchatperm = grp.name; } + if (grp.Permission == Server.adminchatperm) + { + adminchatperm = grp.name; + } if (grp.Permission == Server.maintPerm) { maintperm = grp.name; @@ -50,6 +71,7 @@ private void PropertyWindow_Load(object sender, EventArgs e) { } cmbDefaultRank.SelectedIndex = 1; cmbOpChat.SelectedIndex = (opchatperm != "") ? cmbOpChat.Items.IndexOf(opchatperm) : 1; + cmbAdminChat.SelectedIndex = (adminchatperm != "") ? cmbAdminChat.Items.IndexOf(adminchatperm) : 1; cmbMaintenance.SelectedIndex = (maintperm != "") ? cmbMaintenance.Items.IndexOf(maintperm) : 1; //Load server stuff @@ -64,10 +86,15 @@ private void PropertyWindow_Load(object sender, EventArgs e) { { Server.s.Log("Failed to load commands and blocks!"); } + + updateIRC(); + UpdateGC(); } - private void PropertyWindow_Unload(object sender, EventArgs e) { + private void PropertyWindow_Unload(object sender, EventArgs e) + { Window.prevLoaded = false; + Window.thisWindow.CheckGlobal(); } List storedRanks = new List(); @@ -147,9 +174,12 @@ public void LoadProp(string givenPath) { switch (key.ToLower()) { + case "debug": + chkDebug.Checked = (value.ToLower() == "true"); + break; case "server-name": if (ValidString(value, "![]:.,{}~-+()?_/\\ ")) txtName.Text = value; - else txtName.Text = "[MCZall] Minecraft server"; + else txtName.Text = "[MCSong] Minecraft server"; break; case "motd": if (ValidString(value, "![]&:.,{}~-+()?_/\\ ")) txtMOTD.Text = value; @@ -159,12 +189,18 @@ public void LoadProp(string givenPath) { try { txtPort.Text = Convert.ToInt32(value).ToString(); } catch { txtPort.Text = "25565"; } break; + case "upnp": + chkUPNP.Checked = (value.ToLower() == "true");// ? true : false; <- This is redundant + break; case "verify-names": chkVerify.Checked = (value.ToLower() == "true") ? true : false; break; case "public": chkPublic.Checked = (value.ToLower() == "true") ? true : false; break; + case "premium-only": + chkPremium.Checked = (value.ToLower() == "true"); + break; case "world-chat": chkWorld.Checked = (value.ToLower() == "true") ? true : false; break; @@ -181,6 +217,25 @@ public void LoadProp(string givenPath) { txtPlayers.Text = "12"; } break; + case "max-guests": + try + { + if (Convert.ToByte(value) > 128) + { + value = "128"; + } + else if (Convert.ToByte(value) < 1) + { + value = "1"; + } + txtMaxGuests.Text = value; + } + catch + { + Server.s.Log("max-players invalid! setting to default."); + txtMaxGuests.Text = "12"; + } + break; case "max-maps": try { if (Convert.ToByte(value) > 100) { @@ -209,6 +264,24 @@ public void LoadProp(string givenPath) { case "irc-opchannel": txtOpChannel.Text = value; break; + case "irc-identify": + chkIrcIdentify.Checked = (value.ToLower() == "true") ? true : false; + break; + case "irc-password": + txtIrcPass.Text = value; + break; + case "global-chat": + chkGlobal.Checked = (value.ToLower() == "true") ? true : false; + break; + case "gc-nick": + txtGlobalNick.Text = value; + break; + case "gc-identify": + chkGlobalIdentify.Checked = (value.ToLower() == "true") ? true : false; + break; + case "gc-password": + txtGlobalPassword.Text = value; + break; case "anti-tunnels": ChkTunnels.Checked = (value.ToLower() == "true") ? true : false; break; @@ -260,6 +333,14 @@ public void LoadProp(string givenPath) { color = c.Name(value); if (color != "") color = value; else { Server.s.Log("Could not find " + value); return; } } cmbIRCColour.SelectedIndex = cmbIRCColour.Items.IndexOf(c.Name(value)); break; + case "gc-color": + color = c.Parse(value); + if (color == "") + { + color = c.Name(value); if (color != "") color = value; else { Server.s.Log("Could not find " + value); return; } + } + cmbGlobalColor.SelectedIndex = cmbGlobalColor.Items.IndexOf(c.Name(value)); + break; case "default-rank": try { if (cmbDefaultRank.Items.IndexOf(value.ToLower()) != -1) @@ -369,7 +450,7 @@ public void Save(string givenPath) { w.WriteLine("# server-name\t=\tThe name which displays on minecraft.net"); w.WriteLine("# motd\t=\tThe message which displays when a player connects"); w.WriteLine("# port\t=\tThe port to operate from"); - w.WriteLine("# console-only\t=\tRun without a GUI (useful for Linux servers with mono)"); + w.WriteLine("# console-only\t=\tRun without a Gui (useful for Linux servers with mono)"); w.WriteLine("# verify-names\t=\tVerify the validity of names"); w.WriteLine("# public\t=\tSet to true to appear in the public server list"); w.WriteLine("# max-players\t=\tThe maximum number of connections"); @@ -401,12 +482,16 @@ public void Save(string givenPath) { w.WriteLine(); w.WriteLine(); w.WriteLine("# Server options"); + w.WriteLine("debug = " + chkDebug.Checked.ToString()); w.WriteLine("server-name = " + txtName.Text); w.WriteLine("motd = " + txtMOTD.Text); w.WriteLine("port = " + txtPort.Text); + w.WriteLine("upnp = " + chkUPNP.Checked.ToString().ToLower()); w.WriteLine("verify-names = " + chkVerify.Checked.ToString().ToLower()); w.WriteLine("public = " + chkPublic.Checked.ToString().ToLower()); + w.WriteLine("premium-only = " + chkPremium.Checked.ToString().ToLower()); w.WriteLine("max-players = " + txtPlayers.Text); + w.WriteLine("max-guests = " + txtMaxGuests.Text); w.WriteLine("max-maps = " + txtMaps.Text); w.WriteLine("world-chat = " + chkWorld.Checked.ToString().ToLower()); w.WriteLine("check-updates = " + chkUpdates.Checked.ToString().ToLower()); @@ -424,8 +509,14 @@ public void Save(string givenPath) { w.WriteLine("irc-channel = " + txtChannel.Text); w.WriteLine("irc-opchannel = " + txtOpChannel.Text); w.WriteLine("irc-port = " + Server.ircPort.ToString()); - w.WriteLine("irc-identify = " + Server.ircIdentify.ToString()); - w.WriteLine("irc-password = " + Server.ircPassword); + w.WriteLine("irc-identify = " + chkIrcIdentify.Checked.ToString()); + w.WriteLine("irc-password = " + txtIrcPass.Text); + w.WriteLine(); + w.WriteLine("# Global Chat"); + w.WriteLine("global-chat = " + chkGlobal.Checked.ToString().ToLower()); + w.WriteLine("gc-nick = " + txtGlobalNick.Text); + w.WriteLine("gc-identify = " + chkGlobalIdentify.Checked.ToString().ToLower()); + w.WriteLine("gc-password = " + txtGlobalPassword.Text); w.WriteLine(); w.WriteLine("# other options"); w.WriteLine("anti-tunnels = " + ChkTunnels.Checked.ToString().ToLower()); @@ -441,6 +532,7 @@ public void Save(string givenPath) { w.WriteLine("use-whitelist = " + Server.useWhitelist.ToString().ToLower()); w.WriteLine("money-name = " + txtMoneys.Text); w.WriteLine("opchat-perm = " + ((sbyte)Group.GroupList.Find(grp => grp.name == cmbOpChat.Items[cmbOpChat.SelectedIndex].ToString()).Permission).ToString()); + w.WriteLine("adminchat-perm = " + ((sbyte)Group.GroupList.Find(grp => grp.name == cmbAdminChat.Items[cmbAdminChat.SelectedIndex].ToString()).Permission).ToString()); w.WriteLine("maintenance-perm = " + ((sbyte)Group.GroupList.Find(grp => grp.name == cmbMaintenance.Items[cmbMaintenance.SelectedIndex].ToString()).Permission).ToString()); w.WriteLine("maintenance-kick = " + chkMaintKick.Checked.ToString().ToLower()); w.WriteLine("log-heartbeat = " + chkLogBeat.Checked.ToString().ToLower()); @@ -455,18 +547,10 @@ public void Save(string givenPath) { w.WriteLine("#Error logging"); w.WriteLine("report-back = " + Server.reportBack.ToString().ToLower()); w.WriteLine(); - w.WriteLine("#MySQL information"); - w.WriteLine("UseMySQL = " + Server.useMySQL); - w.WriteLine("Host = " + Server.MySQLHost); - w.WriteLine("SQLPort = " + Server.MySQLPort); - w.WriteLine("Username = " + Server.MySQLUsername); - w.WriteLine("Password = " + Server.MySQLPassword); - w.WriteLine("DatabaseName = " + Server.MySQLDatabaseName); - w.WriteLine("Pooling = " + Server.MySQLPooling); - w.WriteLine(); w.WriteLine("#Colors"); w.WriteLine("defaultColor = " + cmbDefaultColour.Items[cmbDefaultColour.SelectedIndex].ToString()); w.WriteLine("irc-color = " + cmbIRCColour.Items[cmbIRCColour.SelectedIndex].ToString()); + w.WriteLine("gc-color = " + cmbGlobalColor.Items[cmbGlobalColor.SelectedIndex].ToString()); w.WriteLine(); w.WriteLine("#Running on mono?"); w.WriteLine("mono = " + chkMono.Checked.ToString().ToLower()); @@ -481,6 +565,7 @@ public void Save(string givenPath) { w.WriteLine("cheap-message-given = " + txtCheap.Text); w.WriteLine("rank-super = " + chkrankSuper.Checked.ToString().ToLower()); w.WriteLine("default-rank = " + cmbDefaultRank.Items[cmbDefaultRank.SelectedIndex].ToString()); + w.WriteLine(); } w.Flush(); w.Close(); @@ -500,6 +585,11 @@ private void cmbIRCColour_SelectedIndexChanged(object sender, EventArgs e) { lblIRC.BackColor = Color.FromName(cmbIRCColour.Items[cmbIRCColour.SelectedIndex].ToString()); } + private void cmbGlobalColor_SelectedIndexChanged(object sender, EventArgs e) + { + lblGlobalColor.BackColor = Color.FromName(cmbGlobalColor.Items[cmbGlobalColor.SelectedIndex].ToString()); + } + void removeDigit(TextBox foundTxt) { try { int lastChar = int.Parse(foundTxt.Text[foundTxt.Text.Length - 1].ToString()); @@ -532,7 +622,7 @@ void saveStuff() { SaveCommands(); SaveBlocks(); - Properties.Load("properties/server.properties", true); + ServerProperties.Load("properties/server.properties", true); GrpCommands.fillRanks(); } @@ -829,8 +919,76 @@ private void getHelp(string toHelp) Command.all.Find("help").Use(null, toHelp); Player.storeHelp = false; string messageInfo = "Help information for " + toHelp + ":\r\n\r\n"; - messageInfo += Player.storedHelp; + messageInfo += Server.StripColors(Player.storedHelp); MessageBox.Show(messageInfo); } + + private void chkIRC_CheckedChanged(object sender, EventArgs e) + { + updateIRC(); + } + + private void chkIrcIdentify_CheckedChanged(object sender, EventArgs e) + { + txtIrcPass.Enabled = chkIrcIdentify.Checked; + } + + private void updateIRC() + { + foreach (Control c in gbIRC.Controls) + { + if (c != chkIRC) + { + c.Enabled = chkIRC.Checked; + } + } + txtIrcPass.Enabled = (chkIRC.Checked) ? chkIrcIdentify.Checked : false; + try { lblIRC.BackColor = Color.FromName(cmbIRCColour.Items[cmbIRCColour.SelectedIndex].ToString()); } + catch { lblIRC.BackColor = Color.FromName(c.Name(Server.IRCColour)); } + } + + private void button2_Click(object sender, EventArgs e) + { + txtGlobalNick.Text = "SONG_" + new Random().Next(1000, 9999).ToString(); + } + + private void chkGlobalIdentify_CheckedChanged(object sender, EventArgs e) + { + txtGlobalPassword.Enabled = chkGlobalIdentify.Checked; + } + + private void UpdateGC() + { + foreach (Control c in gbGlobal.Controls) + { + if (c != chkGlobal) + { + c.Enabled = chkGlobal.Checked; + } + } + txtGlobalPassword.Enabled = (chkGlobal.Checked) ? chkGlobalIdentify.Checked : false; + try { lblGlobalColor.BackColor = Color.FromName(cmbGlobalColor.Items[cmbGlobalColor.SelectedIndex].ToString()); } + catch { lblGlobalColor.BackColor = Color.FromName(c.Name(Server.gcColor)); } + } + + private void chkGlobal_CheckedChanged(object sender, EventArgs e) + { + UpdateGC(); + } + + private void txtShutdown_TextChanged(object sender, EventArgs e) + { + + } + + private void txtafk_TextChanged(object sender, EventArgs e) + { + + } + + private void txtMaxGuests_TextChanged(object sender, EventArgs e) + { + removeDigit(txtMaxGuests); + } } } diff --git a/MCSong/GUI/PropertyWindow.resx b/MCSong/GUI/PropertyWindow.resx index 14399f9..59c87f9 100644 --- a/MCSong/GUI/PropertyWindow.resx +++ b/MCSong/GUI/PropertyWindow.resx @@ -112,15 +112,15 @@ 2.0 - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + 17, 17 - + 25 \ No newline at end of file diff --git a/MCSong/GUI/RenameLevelDialog.Designer.cs b/MCSong/GUI/RenameLevelDialog.Designer.cs new file mode 100644 index 0000000..e0b4e70 --- /dev/null +++ b/MCSong/GUI/RenameLevelDialog.Designer.cs @@ -0,0 +1,90 @@ +namespace MCSong.Gui +{ + partial class RenameLevelDialog + { + /// + /// 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() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(RenameLevelDialog)); + this.textBox1 = new System.Windows.Forms.TextBox(); + this.button1 = new System.Windows.Forms.Button(); + this.button2 = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // textBox1 + // + this.textBox1.Location = new System.Drawing.Point(12, 12); + this.textBox1.Name = "textBox1"; + this.textBox1.Size = new System.Drawing.Size(156, 20); + this.textBox1.TabIndex = 0; + this.textBox1.KeyDown += new System.Windows.Forms.KeyEventHandler(this.textBox1_KeyDown); + // + // button1 + // + this.button1.Location = new System.Drawing.Point(12, 38); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(75, 23); + this.button1.TabIndex = 1; + this.button1.Text = "OK"; + this.button1.UseVisualStyleBackColor = true; + this.button1.Click += new System.EventHandler(this.button1_Click); + // + // button2 + // + this.button2.Location = new System.Drawing.Point(93, 38); + this.button2.Name = "button2"; + this.button2.Size = new System.Drawing.Size(75, 23); + this.button2.TabIndex = 2; + this.button2.Text = "Cancel"; + this.button2.UseVisualStyleBackColor = true; + this.button2.Click += new System.EventHandler(this.button2_Click); + // + // RenameLevelDialog + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(184, 75); + this.Controls.Add(this.button2); + this.Controls.Add(this.button1); + this.Controls.Add(this.textBox1); + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "RenameLevelDialog"; + this.Text = "Rename"; + this.Load += new System.EventHandler(this.RenameLevelDialog_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox textBox1; + private System.Windows.Forms.Button button1; + private System.Windows.Forms.Button button2; + } +} \ No newline at end of file diff --git a/MCSong/GUI/RenameLevelDialog.cs b/MCSong/GUI/RenameLevelDialog.cs new file mode 100644 index 0000000..a94d53b --- /dev/null +++ b/MCSong/GUI/RenameLevelDialog.cs @@ -0,0 +1,57 @@ +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; + +namespace MCSong.Gui +{ + public partial class RenameLevelDialog : Form + { + public RenameLevelDialog(Level level) + { + InitializeComponent(); + l = level; + } + private Level l; + + private void RenameLevelDialog_Load(object sender, EventArgs e) + { + textBox1.Text = l.name; + } + + private void button1_Click(object sender, EventArgs e) + { + if (!String.IsNullOrEmpty(textBox1.Text)) + { + Window.thisWindow.newName = textBox1.Text; + this.DialogResult = DialogResult.OK; + } + } + + private void button2_Click(object sender, EventArgs e) + { + this.DialogResult = DialogResult.Cancel; + } + + private void textBox1_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Enter) + { + if (!String.IsNullOrEmpty(textBox1.Text)) + { + Window.thisWindow.newName = textBox1.Text; + this.DialogResult = DialogResult.OK; + } + } + else if (e.KeyCode == Keys.Escape) + { + this.DialogResult = DialogResult.Cancel; + } + } + } +} diff --git a/MCSong/GUI/RenameLevelDialog.resx b/MCSong/GUI/RenameLevelDialog.resx new file mode 100644 index 0000000..dc35ce2 --- /dev/null +++ b/MCSong/GUI/RenameLevelDialog.resx @@ -0,0 +1,675 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + + AAABAAQAQEAAAAEAIAAoQAAARgAAACAgAAABACAAKBAAAG5AAAAYGAAAAQAgACgJAACWUAAAEBAAAAEA + IAAoBAAAvlkAACgAAABAAAAAgAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAABEAAABJAAAAhgAAAIYAAACGAAAAhgAAAIYAAABIAAAAEQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHkAAADiAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AOEAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADkAAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAALoAAAAiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAC3AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA2wAAACAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAASAAAA9QAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAADcAAAAFQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAEQAAAO4AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAH0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABEAAADyAAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADKAAAACwAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAnQAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + ACkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAACcAAAD+AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAAnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbwAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAJwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAClAAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAACcAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAGEAAAD5AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD9AAAA/wAA + AP8AAAAnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALAAAAIwAAADUAAAA/QAAAP8AAAD/AAAA+gAA + AMwAAABVAAAAmAAAAP8AAAD/AAAAJwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAA + ADgAAAB1AAAAdQAAADAAAAAEAAAAAAAAAIwAAAD/AAAA/wAAACcAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAA/wAAAP8AAAAnAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAA + AP8AAAD/AAAAJwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAJAAAAD/AAAA/wAAACcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAA/wAAAP8AAAAnAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAIwAAAGgAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAAP8AAAD/AAAAJwAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACcAAAA0gAAABEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AJAAAAD/AAAA/wAAACcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAP4AAADKAAAADQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAACQAAAA/wAAAP8AAAAnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAACLAAAA/wAAAIEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAAP8AAAD/AAAAJwAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAGwAAAO0AAAD/AAAANQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAAAAD/AAAA/wAA + ACcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAA/wAAANYAAAAOAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAACQAAAA/wAAAP8AAAAnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAA + AP8AAAD/AAAAOQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAAP8AAAD/AAAAJwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAACUAAAD/AAAA/wAAALIAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAAAAD/AAAA/wAAACcAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqAAAA/wAAAP8AAADzAAAACgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAA/wAA + AP8AAAAnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKgAAAP8AAAD/AAAA9wAA + AEcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAkAAAAP8AAAD/AAAAJwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + ACoAAAD/AAAA/wAAAP8AAAB5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAAAAD/AAAA/wAAACcAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAqAAAA/wAAAP8AAAD/AAAAcQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAA/wAAAP8AAAAnAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJgAAAP8AAAD/AAAA/wAAAHEAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAA + AP8AAAD/AAAAJwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAD/AAAA/wAA + AP8AAABxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAJAAAAD/AAAA/wAAACcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAACOAAAA/wAAAP8AAAD/AAAAcQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAA/wAAAP8AAAAnAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAFAAAAtAAAAP8AAAD/AAAA/wAAAHMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAAP8AAAD/AAAAJwAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAPkAAAD/AAAA/wAAAP4AAABtAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AJAAAAD/AAAA/wAAACcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAH0AAAD+AAAA/wAA + AP8AAAD0AAAAGwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAACQAAAA/wAAAP8AAAAnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAEAAADhAAAA/wAAAP8AAAD/AAAA2gAAAAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAAP8AAAD/AAAAJwAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAABEAAAA+QAAAP8AAAD/AAAA/wAAAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAAAAD/AAAA/wAA + ACcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvwAAAP8AAAD/AAAA/wAAAP8AAABjAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAACQAAAA/wAAAP8AAAAnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbwAAAP8AAAD/AAAA/wAA + AP8AAAD5AAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAAP8AAAD/AAAAJwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAA + AO0AAAD/AAAA/wAAAP8AAAD/AAAAmAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAAAAD/AAAA/wAAACcAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAJUAAAD/AAAA/wAAAP8AAAD/AAAA/wAAADYAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAA/wAA + AP8AAAAnAAAAAAAAAAAAAAAAAAAAAAAAAJEAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAM0AAAALAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAkAAAAP8AAAD/AAAAJwAAAAAAAAAAAAAAAAAAAJAAAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAABWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAAAAD/AAAA/wAAACgAAAAAAAAAAAAAAJAAAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAADOAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAA/wAAAP8AAAAZAAAAFwAA + AJQAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD7AAAAKwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAA + AP8AAAD1AAAASwAAANcAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAewAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAJAAAAD/AAAA+gAAAPcAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAzwAA + AAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAAzwAAABkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAADUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AJAAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAGMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAACQAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAGQAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AGUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAAAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAGUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAACQAAAA/wAAAP8AAAD/AAAA/wAAAGIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAAP8AAAD/AAAA/wAAAGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI8AAAD/AAAA/wAAAGUAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACjAAAA3QAA + AEsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAYwAAACcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAACAA + AABAAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABbAAAArwAAAL8AAAC/AAAAjAAAACAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQwAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA7QAA + AEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACKAAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA+wAAACYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGkAAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQAA + ANoAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAACSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAKgAAAM4AAAD/AAAA/wAAAP8AAAD/AAAA/AAAAI4AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAFsAAACrAAAAqAAAAEwAAADYAAAAmwAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANkAAACeAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2gAA + AJ0AAAAAAAAAAAAAAAAAAAAmAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAADaAAAAnQAAAAAAAAAAAAAAAAAAAD8AAACnAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAANoAAACdAAAAAAAAAAAAAAAAAAAAAAAAAL0AAACAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAA2gAAAJ0AAAAAAAAAAAAAAAAAAAAAAAAASgAAAP4AAAAYAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADaAAAAnQAAAAAAAAAAAAAAAAAAAAAAAAAbAAAA/wAA + AHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANoAAACdAAAAAAAAAAAAAAAAAAAAAAAA + ABwAAAD/AAAAswAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2gAAAJ0AAAAAAAAAAAAA + AAAAAAAAAAAAGQAAAP8AAAC+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADaAAAAnQAA + AAAAAAAAAAAAAAAAAAAAAAAxAAAA/wAAALoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + ANoAAACdAAAAAAAAAAAAAAAAAAAAAAAAAHMAAAD/AAAAtgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAA2gAAAJ0AAAAAAAAAAAAAAAAAAAABAAAA0gAAAP8AAAB/AAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAADaAAAAnQAAAAAAAAAAAAAAAAAAAEIAAAD/AAAA/wAAAD8AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANoAAACdAAAAAAAAAAAAAAAAAAAA0wAAAP8AAADfAAAACgAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2gAAAJ4AAAAAAAAAAAAAAIsAAAD/AAAA/wAA + AIEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADbAAAAlgAAAAAAAACJAAAA/wAA + AP8AAADzAAAAGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANUAAACkAAAAjgAA + AP8AAAD/AAAA/wAAAGkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxQAA + AP0AAAD/AAAA/wAAAP8AAACrAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAADFAAAA/wAAAP8AAAD/AAAA1AAAAAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAMUAAAD/AAAA/wAAANQAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAxAAAAP8AAADUAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADbAAAA3QAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAHYAAAAXAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAGAAAADAA + AAABACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADEAAABUAAAATgAAABQAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAXAAAAP8AAAD/AAAA/wAAAOcAAABUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArAAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAALAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAZAAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAbAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AJkAAAD/AAAA/wAAAP8AAAD9AAAAbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAggAAAFkAAACyAAAAfAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACoAAAAgAAAAAAAAAABAAAABgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAACrAAAAfwAAAAAAAAABAAAAWAAAAEMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACrAAAAfwAAAAAAAAAAAAAAHAAA + AMEAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAACrAAAAfwAAAAAAAAAAAAAAAAAAALIAAACCAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACrAAAAfwAA + AAAAAAAAAAAAAAAAAJoAAADRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACrAAAAfwAAAAAAAAAAAAAAAAAAAJkAAADfAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAACrAAAAfwAAAAAAAAAAAAAAAAAAAMcAAADaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACrAAAAfwAAAAAAAAAAAAAAGgAA + APwAAACtAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAACrAAAAfwAAAAAAAAAAAAAAhwAAAP8AAABlAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACrAAAAgAAA + AAAAAAArAAAA+gAAAPYAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACsAAAAbAAAABkAAADiAAAA/wAAAJcAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAACfAAAAtAAAANsAAAD/AAAA6AAAABMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACUAAAA/wAAAP8AAAD/AAAAPgAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAACVAAAA/wAAAP8AAABbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAA/wAA + AFsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOAAAAaQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAABAA + AAAgAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaQAA + ANYAAADNAAAAWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AMgAAAD/AAAA/wAAAP8AAAAtAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAABHAAAA8QAAAP8AAAD/AAAASwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAB8AAABRAAAAjAAAAFcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGwAAABdAAAAAAAAADoAAAAFAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABzAAAAXAAAAAAAAABUAAAAZgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcwAAAFwAAAAAAAAAIgAAALoAAAACAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHMAAABcAAAAAAAAACIAAADSAAAABAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABzAAAAXQAAAAAAAABeAAAA2wAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcwAAAFcAAAAAAAAA2QAA + AJoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHEAAABNAAAAeQAA + AP8AAAApAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABkAAAA2AAA + AP8AAACHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZQAA + AP8AAACtAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AHYAAAC9AAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAgAAAABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + 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 + 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 + 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 + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + + + \ No newline at end of file diff --git a/MCSong/GUI/UpdatePropertiesDialog.Designer.cs b/MCSong/GUI/UpdatePropertiesDialog.Designer.cs new file mode 100644 index 0000000..34eed51 --- /dev/null +++ b/MCSong/GUI/UpdatePropertiesDialog.Designer.cs @@ -0,0 +1,129 @@ +namespace MCSong +{ + partial class UpdatePropertiesDialog + { + /// + /// 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() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(UpdatePropertiesDialog)); + this.chkAutoupdate = new System.Windows.Forms.CheckBox(); + this.checkBox2 = new System.Windows.Forms.CheckBox(); + this.label1 = new System.Windows.Forms.Label(); + this.txtCountdown = new System.Windows.Forms.TextBox(); + this.btnSave = new System.Windows.Forms.Button(); + this.btnDiscard = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // chkAutoupdate + // + this.chkAutoupdate.AutoSize = true; + this.chkAutoupdate.Location = new System.Drawing.Point(57, 12); + this.chkAutoupdate.Name = "chkAutoupdate"; + this.chkAutoupdate.Size = new System.Drawing.Size(133, 17); + this.chkAutoupdate.TabIndex = 0; + this.chkAutoupdate.Text = "Auto update to newest"; + this.chkAutoupdate.UseVisualStyleBackColor = true; + // + // checkBox2 + // + this.checkBox2.AutoSize = true; + this.checkBox2.Location = new System.Drawing.Point(57, 35); + this.checkBox2.Name = "checkBox2"; + this.checkBox2.Size = new System.Drawing.Size(137, 17); + this.checkBox2.TabIndex = 1; + this.checkBox2.Text = "Notify in-game of restart"; + this.checkBox2.UseVisualStyleBackColor = true; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(9, 61); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(161, 13); + this.label1.TabIndex = 2; + this.label1.Text = "Time (in seconds) to countdown:"; + // + // txtCountdown + // + this.txtCountdown.Location = new System.Drawing.Point(176, 58); + this.txtCountdown.Name = "txtCountdown"; + this.txtCountdown.Size = new System.Drawing.Size(45, 20); + this.txtCountdown.TabIndex = 3; + // + // btnSave + // + this.btnSave.Location = new System.Drawing.Point(165, 89); + this.btnSave.Name = "btnSave"; + this.btnSave.Size = new System.Drawing.Size(56, 23); + this.btnSave.TabIndex = 4; + this.btnSave.Text = "Save"; + this.btnSave.UseVisualStyleBackColor = true; + this.btnSave.Click += new System.EventHandler(this.btnSave_Click); + // + // btnDiscard + // + this.btnDiscard.Location = new System.Drawing.Point(12, 89); + this.btnDiscard.Name = "btnDiscard"; + this.btnDiscard.Size = new System.Drawing.Size(56, 23); + this.btnDiscard.TabIndex = 5; + this.btnDiscard.Text = "Discard"; + this.btnDiscard.UseVisualStyleBackColor = true; + this.btnDiscard.Click += new System.EventHandler(this.btnDiscard_Click); + // + // UpdatePropertiesDialog + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(229, 122); + this.Controls.Add(this.btnDiscard); + this.Controls.Add(this.btnSave); + this.Controls.Add(this.txtCountdown); + this.Controls.Add(this.label1); + this.Controls.Add(this.checkBox2); + this.Controls.Add(this.chkAutoupdate); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "UpdatePropertiesDialog"; + this.ShowInTaskbar = false; + this.Text = "Updater Properties"; + this.Load += new System.EventHandler(this.UpdatePropertiesDialog_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.CheckBox chkAutoupdate; + private System.Windows.Forms.CheckBox checkBox2; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.TextBox txtCountdown; + private System.Windows.Forms.Button btnSave; + private System.Windows.Forms.Button btnDiscard; + } +} \ No newline at end of file diff --git a/MCSong/GUI/UpdatePropertiesDialog.cs b/MCSong/GUI/UpdatePropertiesDialog.cs new file mode 100644 index 0000000..b1924a1 --- /dev/null +++ b/MCSong/GUI/UpdatePropertiesDialog.cs @@ -0,0 +1,47 @@ +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; + +namespace MCSong +{ + public partial class UpdatePropertiesDialog : Form + { + public UpdatePropertiesDialog() + { + InitializeComponent(); + } + + private void UpdatePropertiesDialog_Load(object sender, EventArgs e) + { + Updater.Load("properties/updater.properties"); + chkAutoupdate.Checked = Server.autoupdate; + checkBox2.Checked = Server.autonotify; + txtCountdown.Text = Server.restartcountdown; + } + + private void btnDiscard_Click(object sender, EventArgs e) + { + this.DialogResult = DialogResult.Cancel; + } + + private void btnSave_Click(object sender, EventArgs e) + { + try { UInt32.Parse(txtCountdown.Text.Trim()); } + catch { goto fail; } + Server.autoupdate = chkAutoupdate.Checked; + Server.autonotify = checkBox2.Checked; + Server.restartcountdown = txtCountdown.Text.Trim(); + Updater.Save("properties/updater.properties"); + this.DialogResult = DialogResult.OK; + return; + fail: + MessageBox.Show("Countdown must be a positive number!"); + } + } +} diff --git a/MCSong/GUI/UpdatePropertiesDialog.resx b/MCSong/GUI/UpdatePropertiesDialog.resx new file mode 100644 index 0000000..dc35ce2 --- /dev/null +++ b/MCSong/GUI/UpdatePropertiesDialog.resx @@ -0,0 +1,675 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + + AAABAAQAQEAAAAEAIAAoQAAARgAAACAgAAABACAAKBAAAG5AAAAYGAAAAQAgACgJAACWUAAAEBAAAAEA + IAAoBAAAvlkAACgAAABAAAAAgAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAABEAAABJAAAAhgAAAIYAAACGAAAAhgAAAIYAAABIAAAAEQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHkAAADiAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AOEAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADkAAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAALoAAAAiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAC3AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA2wAAACAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAASAAAA9QAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAADcAAAAFQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAEQAAAO4AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAH0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABEAAADyAAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADKAAAACwAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAnQAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + ACkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAACcAAAD+AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAAnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbwAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAJwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAClAAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAACcAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAGEAAAD5AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD9AAAA/wAA + AP8AAAAnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALAAAAIwAAADUAAAA/QAAAP8AAAD/AAAA+gAA + AMwAAABVAAAAmAAAAP8AAAD/AAAAJwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAA + ADgAAAB1AAAAdQAAADAAAAAEAAAAAAAAAIwAAAD/AAAA/wAAACcAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAA/wAAAP8AAAAnAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAA + AP8AAAD/AAAAJwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAJAAAAD/AAAA/wAAACcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAA/wAAAP8AAAAnAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAIwAAAGgAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAAP8AAAD/AAAAJwAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACcAAAA0gAAABEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AJAAAAD/AAAA/wAAACcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAP4AAADKAAAADQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAACQAAAA/wAAAP8AAAAnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAACLAAAA/wAAAIEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAAP8AAAD/AAAAJwAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAGwAAAO0AAAD/AAAANQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAAAAD/AAAA/wAA + ACcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAA/wAAANYAAAAOAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAACQAAAA/wAAAP8AAAAnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAA + AP8AAAD/AAAAOQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAAP8AAAD/AAAAJwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAACUAAAD/AAAA/wAAALIAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAAAAD/AAAA/wAAACcAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqAAAA/wAAAP8AAADzAAAACgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAA/wAA + AP8AAAAnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKgAAAP8AAAD/AAAA9wAA + AEcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAkAAAAP8AAAD/AAAAJwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + ACoAAAD/AAAA/wAAAP8AAAB5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAAAAD/AAAA/wAAACcAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAqAAAA/wAAAP8AAAD/AAAAcQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAA/wAAAP8AAAAnAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJgAAAP8AAAD/AAAA/wAAAHEAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAA + AP8AAAD/AAAAJwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAD/AAAA/wAA + AP8AAABxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAJAAAAD/AAAA/wAAACcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAACOAAAA/wAAAP8AAAD/AAAAcQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAA/wAAAP8AAAAnAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAFAAAAtAAAAP8AAAD/AAAA/wAAAHMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAAP8AAAD/AAAAJwAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAPkAAAD/AAAA/wAAAP4AAABtAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AJAAAAD/AAAA/wAAACcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAH0AAAD+AAAA/wAA + AP8AAAD0AAAAGwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAACQAAAA/wAAAP8AAAAnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAEAAADhAAAA/wAAAP8AAAD/AAAA2gAAAAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAAP8AAAD/AAAAJwAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAABEAAAA+QAAAP8AAAD/AAAA/wAAAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAAAAD/AAAA/wAA + ACcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvwAAAP8AAAD/AAAA/wAAAP8AAABjAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAACQAAAA/wAAAP8AAAAnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbwAAAP8AAAD/AAAA/wAA + AP8AAAD5AAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAAP8AAAD/AAAAJwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAA + AO0AAAD/AAAA/wAAAP8AAAD/AAAAmAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAAAAD/AAAA/wAAACcAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAJUAAAD/AAAA/wAAAP8AAAD/AAAA/wAAADYAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAA/wAA + AP8AAAAnAAAAAAAAAAAAAAAAAAAAAAAAAJEAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAM0AAAALAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAkAAAAP8AAAD/AAAAJwAAAAAAAAAAAAAAAAAAAJAAAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAABWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAAAAD/AAAA/wAAACgAAAAAAAAAAAAAAJAAAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAADOAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAA/wAAAP8AAAAZAAAAFwAA + AJQAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD7AAAAKwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAA + AP8AAAD1AAAASwAAANcAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAewAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAJAAAAD/AAAA+gAAAPcAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAzwAA + AAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAAzwAAABkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAADUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AJAAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAGMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAACQAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAGQAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AGUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAAAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAGUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAACQAAAA/wAAAP8AAAD/AAAA/wAAAGIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAAP8AAAD/AAAA/wAAAGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI8AAAD/AAAA/wAAAGUAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACjAAAA3QAA + AEsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAYwAAACcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAACAA + AABAAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABbAAAArwAAAL8AAAC/AAAAjAAAACAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQwAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA7QAA + AEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACKAAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA+wAAACYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGkAAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQAA + ANoAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAACSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAKgAAAM4AAAD/AAAA/wAAAP8AAAD/AAAA/AAAAI4AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAFsAAACrAAAAqAAAAEwAAADYAAAAmwAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANkAAACeAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2gAA + AJ0AAAAAAAAAAAAAAAAAAAAmAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAADaAAAAnQAAAAAAAAAAAAAAAAAAAD8AAACnAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAANoAAACdAAAAAAAAAAAAAAAAAAAAAAAAAL0AAACAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAA2gAAAJ0AAAAAAAAAAAAAAAAAAAAAAAAASgAAAP4AAAAYAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADaAAAAnQAAAAAAAAAAAAAAAAAAAAAAAAAbAAAA/wAA + AHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANoAAACdAAAAAAAAAAAAAAAAAAAAAAAA + ABwAAAD/AAAAswAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2gAAAJ0AAAAAAAAAAAAA + AAAAAAAAAAAAGQAAAP8AAAC+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADaAAAAnQAA + AAAAAAAAAAAAAAAAAAAAAAAxAAAA/wAAALoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + ANoAAACdAAAAAAAAAAAAAAAAAAAAAAAAAHMAAAD/AAAAtgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAA2gAAAJ0AAAAAAAAAAAAAAAAAAAABAAAA0gAAAP8AAAB/AAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAADaAAAAnQAAAAAAAAAAAAAAAAAAAEIAAAD/AAAA/wAAAD8AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANoAAACdAAAAAAAAAAAAAAAAAAAA0wAAAP8AAADfAAAACgAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2gAAAJ4AAAAAAAAAAAAAAIsAAAD/AAAA/wAA + AIEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADbAAAAlgAAAAAAAACJAAAA/wAA + AP8AAADzAAAAGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANUAAACkAAAAjgAA + AP8AAAD/AAAA/wAAAGkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxQAA + AP0AAAD/AAAA/wAAAP8AAACrAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAADFAAAA/wAAAP8AAAD/AAAA1AAAAAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAMUAAAD/AAAA/wAAANQAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAxAAAAP8AAADUAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADbAAAA3QAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAHYAAAAXAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAGAAAADAA + AAABACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADEAAABUAAAATgAAABQAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAXAAAAP8AAAD/AAAA/wAAAOcAAABUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArAAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAALAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAZAAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAbAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AJkAAAD/AAAA/wAAAP8AAAD9AAAAbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAggAAAFkAAACyAAAAfAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACoAAAAgAAAAAAAAAABAAAABgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAACrAAAAfwAAAAAAAAABAAAAWAAAAEMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACrAAAAfwAAAAAAAAAAAAAAHAAA + AMEAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAACrAAAAfwAAAAAAAAAAAAAAAAAAALIAAACCAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACrAAAAfwAA + AAAAAAAAAAAAAAAAAJoAAADRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACrAAAAfwAAAAAAAAAAAAAAAAAAAJkAAADfAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAACrAAAAfwAAAAAAAAAAAAAAAAAAAMcAAADaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACrAAAAfwAAAAAAAAAAAAAAGgAA + APwAAACtAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAACrAAAAfwAAAAAAAAAAAAAAhwAAAP8AAABlAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACrAAAAgAAA + AAAAAAArAAAA+gAAAPYAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACsAAAAbAAAABkAAADiAAAA/wAAAJcAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAACfAAAAtAAAANsAAAD/AAAA6AAAABMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACUAAAA/wAAAP8AAAD/AAAAPgAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAACVAAAA/wAAAP8AAABbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAA/wAA + AFsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOAAAAaQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAABAA + AAAgAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaQAA + ANYAAADNAAAAWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AMgAAAD/AAAA/wAAAP8AAAAtAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAABHAAAA8QAAAP8AAAD/AAAASwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAB8AAABRAAAAjAAAAFcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGwAAABdAAAAAAAAADoAAAAFAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABzAAAAXAAAAAAAAABUAAAAZgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcwAAAFwAAAAAAAAAIgAAALoAAAACAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHMAAABcAAAAAAAAACIAAADSAAAABAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABzAAAAXQAAAAAAAABeAAAA2wAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcwAAAFcAAAAAAAAA2QAA + AJoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHEAAABNAAAAeQAA + AP8AAAApAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABkAAAA2AAA + AP8AAACHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZQAA + AP8AAACtAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AHYAAAC9AAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAgAAAABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + 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 + 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 + 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 + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + + + \ No newline at end of file diff --git a/MCSong/GUI/UpdateWindow.Designer.cs b/MCSong/GUI/UpdateWindow.Designer.cs index 60fd9c6..5ebcd22 100644 --- a/MCSong/GUI/UpdateWindow.Designer.cs +++ b/MCSong/GUI/UpdateWindow.Designer.cs @@ -28,108 +28,76 @@ protected override void Dispose(bool disposing) /// private void InitializeComponent() { - this.groupBox1 = new System.Windows.Forms.GroupBox(); - this.txtCountdown = new System.Windows.Forms.TextBox(); - this.cmdDiscard = new System.Windows.Forms.Button(); - this.button1 = new System.Windows.Forms.Button(); - this.label1 = new System.Windows.Forms.Label(); - this.chkNotify = new System.Windows.Forms.CheckBox(); - this.chkAutoUpdate = new System.Windows.Forms.CheckBox(); - this.groupBox2 = new System.Windows.Forms.GroupBox(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(UpdateWindow)); + this.grpVersions = new System.Windows.Forms.GroupBox(); + this.txtCurrentVersion = new System.Windows.Forms.TextBox(); + this.label4 = new System.Windows.Forms.Label(); + this.txtLatestVersion = new System.Windows.Forms.TextBox(); + this.label3 = new System.Windows.Forms.Label(); this.cmdUpdate = new System.Windows.Forms.Button(); this.listRevisions = new System.Windows.Forms.ListBox(); - this.groupBox1.SuspendLayout(); - this.groupBox2.SuspendLayout(); + this.grpReadOnly = new System.Windows.Forms.GroupBox(); + this.txtCountdownRO = new System.Windows.Forms.TextBox(); + this.chkAutoUpdateRO = new System.Windows.Forms.CheckBox(); + this.btnEdit = new System.Windows.Forms.Button(); + this.chkNotifyRO = new System.Windows.Forms.CheckBox(); + this.label2 = new System.Windows.Forms.Label(); + this.grpVersions.SuspendLayout(); + this.grpReadOnly.SuspendLayout(); this.SuspendLayout(); // - // groupBox1 - // - this.groupBox1.Controls.Add(this.txtCountdown); - this.groupBox1.Controls.Add(this.chkAutoUpdate); - this.groupBox1.Controls.Add(this.cmdDiscard); - this.groupBox1.Controls.Add(this.chkNotify); - this.groupBox1.Controls.Add(this.button1); - this.groupBox1.Controls.Add(this.label1); - this.groupBox1.Location = new System.Drawing.Point(8, 186); - this.groupBox1.Name = "groupBox1"; - this.groupBox1.Size = new System.Drawing.Size(209, 120); - this.groupBox1.TabIndex = 1; - this.groupBox1.TabStop = false; - this.groupBox1.Text = "Updater Properties"; - // - // txtCountdown - // - this.txtCountdown.Location = new System.Drawing.Point(164, 60); - this.txtCountdown.Name = "txtCountdown"; - this.txtCountdown.Size = new System.Drawing.Size(42, 20); - this.txtCountdown.TabIndex = 4; - // - // cmdDiscard - // - this.cmdDiscard.Font = new System.Drawing.Font("Calibri", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.cmdDiscard.Location = new System.Drawing.Point(111, 90); - this.cmdDiscard.Name = "cmdDiscard"; - this.cmdDiscard.Size = new System.Drawing.Size(59, 23); - this.cmdDiscard.TabIndex = 2; - this.cmdDiscard.Text = "Discard"; - this.cmdDiscard.UseVisualStyleBackColor = true; - // - // button1 - // - this.button1.Font = new System.Drawing.Font("Calibri", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.button1.Location = new System.Drawing.Point(31, 90); - this.button1.Name = "button1"; - this.button1.Size = new System.Drawing.Size(59, 23); - this.button1.TabIndex = 3; - this.button1.Text = "Save"; - this.button1.UseVisualStyleBackColor = true; - // - // label1 - // - this.label1.AutoSize = true; - this.label1.Font = new System.Drawing.Font("Calibri", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.label1.Location = new System.Drawing.Point(5, 64); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(158, 13); - this.label1.TabIndex = 3; - this.label1.Text = "Time (in seconds) to countdown:"; - // - // chkNotify - // - this.chkNotify.AutoSize = true; - this.chkNotify.Font = new System.Drawing.Font("Calibri", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.chkNotify.Location = new System.Drawing.Point(31, 38); - this.chkNotify.Name = "chkNotify"; - this.chkNotify.Size = new System.Drawing.Size(139, 17); - this.chkNotify.TabIndex = 2; - this.chkNotify.Text = "Notify in-game of restart"; - this.chkNotify.UseVisualStyleBackColor = true; - // - // chkAutoUpdate - // - this.chkAutoUpdate.AutoSize = true; - this.chkAutoUpdate.Font = new System.Drawing.Font("Calibri", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.chkAutoUpdate.Location = new System.Drawing.Point(31, 19); - this.chkAutoUpdate.Name = "chkAutoUpdate"; - this.chkAutoUpdate.Size = new System.Drawing.Size(133, 17); - this.chkAutoUpdate.TabIndex = 1; - this.chkAutoUpdate.Text = "Auto update to newest"; - this.chkAutoUpdate.UseVisualStyleBackColor = true; - // - // groupBox2 - // - this.groupBox2.Controls.Add(this.cmdUpdate); - this.groupBox2.Controls.Add(this.listRevisions); - this.groupBox2.Location = new System.Drawing.Point(8, 3); - this.groupBox2.Name = "groupBox2"; - this.groupBox2.Size = new System.Drawing.Size(209, 177); - this.groupBox2.TabIndex = 2; - this.groupBox2.TabStop = false; + // grpVersions + // + this.grpVersions.Controls.Add(this.txtCurrentVersion); + this.grpVersions.Controls.Add(this.label4); + this.grpVersions.Controls.Add(this.txtLatestVersion); + this.grpVersions.Controls.Add(this.label3); + this.grpVersions.Controls.Add(this.cmdUpdate); + this.grpVersions.Controls.Add(this.listRevisions); + this.grpVersions.Location = new System.Drawing.Point(3, 3); + this.grpVersions.Name = "grpVersions"; + this.grpVersions.Size = new System.Drawing.Size(209, 177); + this.grpVersions.TabIndex = 2; + this.grpVersions.TabStop = false; + // + // txtCurrentVersion + // + this.txtCurrentVersion.Location = new System.Drawing.Point(111, 97); + this.txtCurrentVersion.Name = "txtCurrentVersion"; + this.txtCurrentVersion.ReadOnly = true; + this.txtCurrentVersion.Size = new System.Drawing.Size(74, 20); + this.txtCurrentVersion.TabIndex = 6; + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Location = new System.Drawing.Point(108, 81); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(82, 13); + this.label4.TabIndex = 7; + this.label4.Text = "Current Version:"; + // + // txtLatestVersion + // + this.txtLatestVersion.Location = new System.Drawing.Point(111, 47); + this.txtLatestVersion.Name = "txtLatestVersion"; + this.txtLatestVersion.ReadOnly = true; + this.txtLatestVersion.Size = new System.Drawing.Size(74, 20); + this.txtLatestVersion.TabIndex = 5; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(108, 31); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(77, 13); + this.label3.TabIndex = 5; + this.label3.Text = "Latest Version:"; // // cmdUpdate // this.cmdUpdate.Font = new System.Drawing.Font("Calibri", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.cmdUpdate.Location = new System.Drawing.Point(64, 148); + this.cmdUpdate.Location = new System.Drawing.Point(9, 148); this.cmdUpdate.Name = "cmdUpdate"; this.cmdUpdate.Size = new System.Drawing.Size(82, 23); this.cmdUpdate.TabIndex = 4; @@ -140,42 +108,114 @@ private void InitializeComponent() // this.listRevisions.Font = new System.Drawing.Font("Calibri", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.listRevisions.FormattingEnabled = true; - this.listRevisions.Location = new System.Drawing.Point(64, 19); + this.listRevisions.Location = new System.Drawing.Point(9, 19); this.listRevisions.Name = "listRevisions"; this.listRevisions.Size = new System.Drawing.Size(82, 121); this.listRevisions.TabIndex = 3; // + // grpReadOnly + // + this.grpReadOnly.Controls.Add(this.txtCountdownRO); + this.grpReadOnly.Controls.Add(this.chkAutoUpdateRO); + this.grpReadOnly.Controls.Add(this.btnEdit); + this.grpReadOnly.Controls.Add(this.chkNotifyRO); + this.grpReadOnly.Controls.Add(this.label2); + this.grpReadOnly.Location = new System.Drawing.Point(3, 186); + this.grpReadOnly.Name = "grpReadOnly"; + this.grpReadOnly.Size = new System.Drawing.Size(209, 120); + this.grpReadOnly.TabIndex = 5; + this.grpReadOnly.TabStop = false; + this.grpReadOnly.Text = "Updater Properties"; + // + // txtCountdownRO + // + this.txtCountdownRO.Location = new System.Drawing.Point(164, 60); + this.txtCountdownRO.Name = "txtCountdownRO"; + this.txtCountdownRO.ReadOnly = true; + this.txtCountdownRO.Size = new System.Drawing.Size(42, 20); + this.txtCountdownRO.TabIndex = 4; + // + // chkAutoUpdateRO + // + this.chkAutoUpdateRO.AutoCheck = false; + this.chkAutoUpdateRO.AutoSize = true; + this.chkAutoUpdateRO.Font = new System.Drawing.Font("Calibri", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.chkAutoUpdateRO.Location = new System.Drawing.Point(31, 19); + this.chkAutoUpdateRO.Name = "chkAutoUpdateRO"; + this.chkAutoUpdateRO.Size = new System.Drawing.Size(133, 17); + this.chkAutoUpdateRO.TabIndex = 1; + this.chkAutoUpdateRO.Text = "Auto update to newest"; + this.chkAutoUpdateRO.UseVisualStyleBackColor = true; + // + // btnEdit + // + this.btnEdit.Font = new System.Drawing.Font("Calibri", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btnEdit.Location = new System.Drawing.Point(72, 89); + this.btnEdit.Name = "btnEdit"; + this.btnEdit.Size = new System.Drawing.Size(59, 23); + this.btnEdit.TabIndex = 2; + this.btnEdit.Text = "Edit"; + this.btnEdit.UseVisualStyleBackColor = true; + this.btnEdit.Click += new System.EventHandler(this.btnEdit_Click); + // + // chkNotifyRO + // + this.chkNotifyRO.AutoCheck = false; + this.chkNotifyRO.AutoSize = true; + this.chkNotifyRO.Font = new System.Drawing.Font("Calibri", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.chkNotifyRO.Location = new System.Drawing.Point(31, 38); + this.chkNotifyRO.Name = "chkNotifyRO"; + this.chkNotifyRO.Size = new System.Drawing.Size(139, 17); + this.chkNotifyRO.TabIndex = 2; + this.chkNotifyRO.Text = "Notify in-game of restart"; + this.chkNotifyRO.UseVisualStyleBackColor = true; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Font = new System.Drawing.Font("Calibri", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label2.Location = new System.Drawing.Point(5, 64); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(158, 13); + this.label2.TabIndex = 3; + this.label2.Text = "Time (in seconds) to countdown:"; + // // UpdateWindow // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(223, 318); - this.Controls.Add(this.groupBox2); - this.Controls.Add(this.groupBox1); + this.ClientSize = new System.Drawing.Size(214, 309); + this.Controls.Add(this.grpReadOnly); + this.Controls.Add(this.grpVersions); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); this.MaximizeBox = false; this.MinimizeBox = false; this.Name = "UpdateWindow"; this.Text = "MCSong Updater"; this.Load += new System.EventHandler(this.UpdateWindow_Load); - this.groupBox1.ResumeLayout(false); - this.groupBox1.PerformLayout(); - this.groupBox2.ResumeLayout(false); + this.Disposed += new System.EventHandler(this.UpdateWindow_Unload); + this.grpVersions.ResumeLayout(false); + this.grpVersions.PerformLayout(); + this.grpReadOnly.ResumeLayout(false); + this.grpReadOnly.PerformLayout(); this.ResumeLayout(false); } #endregion - - private System.Windows.Forms.GroupBox groupBox1; - private System.Windows.Forms.TextBox txtCountdown; - private System.Windows.Forms.CheckBox chkAutoUpdate; - private System.Windows.Forms.Button cmdDiscard; - private System.Windows.Forms.CheckBox chkNotify; - private System.Windows.Forms.Button button1; - private System.Windows.Forms.Label label1; - private System.Windows.Forms.GroupBox groupBox2; + private System.Windows.Forms.GroupBox grpVersions; private System.Windows.Forms.Button cmdUpdate; private System.Windows.Forms.ListBox listRevisions; - + private System.Windows.Forms.GroupBox grpReadOnly; + private System.Windows.Forms.TextBox txtCountdownRO; + private System.Windows.Forms.CheckBox chkAutoUpdateRO; + private System.Windows.Forms.Button btnEdit; + private System.Windows.Forms.CheckBox chkNotifyRO; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.TextBox txtCurrentVersion; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.TextBox txtLatestVersion; + private System.Windows.Forms.Label label3; } } \ No newline at end of file diff --git a/MCSong/GUI/UpdateWindow.cs b/MCSong/GUI/UpdateWindow.cs index b20adc9..d9701dc 100644 --- a/MCSong/GUI/UpdateWindow.cs +++ b/MCSong/GUI/UpdateWindow.cs @@ -21,108 +21,58 @@ public UpdateWindow() } private void UpdateWindow_Load(object sender, EventArgs e) { - this.Icon = new Icon(System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream("MCSong.Lawl.ico")); - UpdLoadProp("properties/update.properties"); - WebClient client = new WebClient(); - client.DownloadFile("http://updates.mcsong.x10.mx/revs.txt", "text/revs.txt"); - listRevisions.Items.Clear(); - FileInfo file = new FileInfo("text/revs.txt"); - StreamReader stRead = file.OpenText(); - if (File.Exists("text/revs.txt")) - { - while (!stRead.EndOfStream) - { - listRevisions.Items.Add(stRead.ReadLine()); - } - } - stRead.Close(); - stRead.Dispose(); - file.Delete(); - client.Dispose(); - } - - - public void UpdSave(string givenPath) - { - StreamWriter SW = new StreamWriter(File.Create(givenPath)); - SW.WriteLine("#This file manages the update process"); - SW.WriteLine("#Toggle AutoUpdate to true for the server to automatically update"); - SW.WriteLine("#Notify notifies players in-game of impending restart"); - SW.WriteLine("#Restart Countdown is how long in seconds the server will count before restarting and updating"); - SW.WriteLine(); - SW.WriteLine("autoupdate= " + chkAutoUpdate.Checked.ToString()); - SW.WriteLine("notify = " + chkNotify.Checked.ToString()); - SW.WriteLine("restartcountdown = " + txtCountdown.Text); - SW.Flush(); - SW.Close(); - SW.Dispose(); - this.Close(); - } - + Updater.Load("properties/updater.properties"); + chkAutoUpdateRO.Checked = Server.autoupdate; + chkNotifyRO.Checked = Server.autonotify; + txtCountdownRO.Text = Server.restartcountdown; - public void UpdLoadProp(string givenPath) - { - if (File.Exists(givenPath)) + try { - string[] lines = File.ReadAllLines(givenPath); - - foreach (string line in lines) + WebClient client = new WebClient(); + client.DownloadFile("http://updates.mcsong.x10.mx/versions.txt", "text/revs.txt"); + listRevisions.Items.Clear(); + FileInfo file = new FileInfo("text/revs.txt"); + StreamReader stRead = file.OpenText(); + if (File.Exists("text/revs.txt")) { - if (line != "" && line[0] != '#') + while (!stRead.EndOfStream) { - //int index = line.IndexOf('=') + 1; // not needed if we use Split('=') - string key = line.Split('=')[0].Trim(); - string value = line.Split('=')[1].Trim(); - - switch (key.ToLower()) - { - case "autoupdate": - chkAutoUpdate.Checked = (value.ToLower() == "true") ? true : false; - break; - case "notify": - chkNotify.Checked = (value.ToLower() == "true") ? true : false; - break; - case "restartcountdown": - txtCountdown.Text = value; - break; - } + listRevisions.Items.Add(stRead.ReadLine()); } } - //Save(givenPath); + stRead.Close(); + stRead.Dispose(); + file.Delete(); + client.Dispose(); } - //else Save(givenPath); - } - - private void button1_Click(object sender, EventArgs e) - { - string chkNum = txtCountdown.Text.Trim(); - double Num; - bool isNum = double.TryParse(chkNum, out Num); - if (!isNum || txtCountdown.Text == "") + catch { - MessageBox.Show("You must enter a number for the countdown"); + MessageBox.Show("Could not load versions", "Error", MessageBoxButtons.AbortRetryIgnore, MessageBoxIcon.Error); } - else + try { - UpdSave("properties/update.properties"); - Server.autoupdate = chkAutoUpdate.Checked; + txtCurrentVersion.Text = Server.Version; + txtLatestVersion.Text = new WebClient().DownloadString("http://updates.mcsong.x10.mx/curversion.txt"); + txtCurrentVersion.BackColor = (txtCurrentVersion.Text == txtLatestVersion.Text) ? Color.Green : Color.Red; + txtCurrentVersion.Update(); } + catch { } } - private void cmdDiscard_Click(object sender, EventArgs e) + private void UpdateWindow_Unload(object sender, EventArgs e) { - UpdLoadProp("properties/update.properties"); - this.Close(); + Window.updLoaded = false; } private void cmdUpdate_Click(object sender, EventArgs e) { + btnEdit.Enabled = false; if (Server.selectedrevision != "") { - MCLawl_.Gui.Program.PerformUpdate(true); + MCSong_.Gui.Program.PerformUpdate(true); } - else { MCLawl_.Gui.Program.PerformUpdate(false); } + else { MCSong_.Gui.Program.PerformUpdate(false); } /* if (!Program.CurrentUpdate) Program.UpdateCheck(); else @@ -138,8 +88,14 @@ private void cmdUpdate_Click(object sender, EventArgs e) private void listRevisions_SelectedValueChanged(object sender, EventArgs e) { Server.selectedrevision = listRevisions.SelectedItem.ToString(); - } + private void btnEdit_Click(object sender, EventArgs e) + { + new UpdatePropertiesDialog().ShowDialog(); + chkAutoUpdateRO.Checked = Server.autoupdate; + chkNotifyRO.Checked = Server.autonotify; + txtCountdownRO.Text = Server.restartcountdown; + } } } diff --git a/MCSong/GUI/UpdateWindow.resx b/MCSong/GUI/UpdateWindow.resx index 7080a7d..dc35ce2 100644 --- a/MCSong/GUI/UpdateWindow.resx +++ b/MCSong/GUI/UpdateWindow.resx @@ -112,9 +112,564 @@ 2.0 - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + AAABAAQAQEAAAAEAIAAoQAAARgAAACAgAAABACAAKBAAAG5AAAAYGAAAAQAgACgJAACWUAAAEBAAAAEA + IAAoBAAAvlkAACgAAABAAAAAgAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAABEAAABJAAAAhgAAAIYAAACGAAAAhgAAAIYAAABIAAAAEQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHkAAADiAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AOEAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADkAAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAALoAAAAiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAC3AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA2wAAACAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAASAAAA9QAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAADcAAAAFQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAEQAAAO4AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAH0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABEAAADyAAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADKAAAACwAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAnQAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + ACkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAACcAAAD+AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAAnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbwAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAJwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAClAAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAACcAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAGEAAAD5AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD9AAAA/wAA + AP8AAAAnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALAAAAIwAAADUAAAA/QAAAP8AAAD/AAAA+gAA + AMwAAABVAAAAmAAAAP8AAAD/AAAAJwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAA + ADgAAAB1AAAAdQAAADAAAAAEAAAAAAAAAIwAAAD/AAAA/wAAACcAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAA/wAAAP8AAAAnAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAA + AP8AAAD/AAAAJwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAJAAAAD/AAAA/wAAACcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAA/wAAAP8AAAAnAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAIwAAAGgAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAAP8AAAD/AAAAJwAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACcAAAA0gAAABEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AJAAAAD/AAAA/wAAACcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAP4AAADKAAAADQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAACQAAAA/wAAAP8AAAAnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAACLAAAA/wAAAIEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAAP8AAAD/AAAAJwAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAGwAAAO0AAAD/AAAANQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAAAAD/AAAA/wAA + ACcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAA/wAAANYAAAAOAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAACQAAAA/wAAAP8AAAAnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAA + AP8AAAD/AAAAOQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAAP8AAAD/AAAAJwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAACUAAAD/AAAA/wAAALIAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAAAAD/AAAA/wAAACcAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqAAAA/wAAAP8AAADzAAAACgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAA/wAA + AP8AAAAnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKgAAAP8AAAD/AAAA9wAA + AEcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAkAAAAP8AAAD/AAAAJwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + ACoAAAD/AAAA/wAAAP8AAAB5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAAAAD/AAAA/wAAACcAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAqAAAA/wAAAP8AAAD/AAAAcQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAA/wAAAP8AAAAnAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJgAAAP8AAAD/AAAA/wAAAHEAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAA + AP8AAAD/AAAAJwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAD/AAAA/wAA + AP8AAABxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAJAAAAD/AAAA/wAAACcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAACOAAAA/wAAAP8AAAD/AAAAcQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAA/wAAAP8AAAAnAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAFAAAAtAAAAP8AAAD/AAAA/wAAAHMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAAP8AAAD/AAAAJwAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAPkAAAD/AAAA/wAAAP4AAABtAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AJAAAAD/AAAA/wAAACcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAH0AAAD+AAAA/wAA + AP8AAAD0AAAAGwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAACQAAAA/wAAAP8AAAAnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAEAAADhAAAA/wAAAP8AAAD/AAAA2gAAAAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAAP8AAAD/AAAAJwAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAABEAAAA+QAAAP8AAAD/AAAA/wAAAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAAAAD/AAAA/wAA + ACcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvwAAAP8AAAD/AAAA/wAAAP8AAABjAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAACQAAAA/wAAAP8AAAAnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbwAAAP8AAAD/AAAA/wAA + AP8AAAD5AAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAAP8AAAD/AAAAJwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAA + AO0AAAD/AAAA/wAAAP8AAAD/AAAAmAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAAAAD/AAAA/wAAACcAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAJUAAAD/AAAA/wAAAP8AAAD/AAAA/wAAADYAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAA/wAA + AP8AAAAnAAAAAAAAAAAAAAAAAAAAAAAAAJEAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAM0AAAALAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAkAAAAP8AAAD/AAAAJwAAAAAAAAAAAAAAAAAAAJAAAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAABWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAAAAD/AAAA/wAAACgAAAAAAAAAAAAAAJAAAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAADOAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAA/wAAAP8AAAAZAAAAFwAA + AJQAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD7AAAAKwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAA + AP8AAAD1AAAASwAAANcAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAewAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAJAAAAD/AAAA+gAAAPcAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAzwAA + AAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAAzwAAABkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAADUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AJAAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAGMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAACQAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAGQAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AGUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAAAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAGUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAACQAAAA/wAAAP8AAAD/AAAA/wAAAGIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAAP8AAAD/AAAA/wAAAGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI8AAAD/AAAA/wAAAGUAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACjAAAA3QAA + AEsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAYwAAACcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAACAA + AABAAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABbAAAArwAAAL8AAAC/AAAAjAAAACAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQwAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA7QAA + AEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACKAAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA+wAAACYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGkAAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQAA + ANoAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAACSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAKgAAAM4AAAD/AAAA/wAAAP8AAAD/AAAA/AAAAI4AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAFsAAACrAAAAqAAAAEwAAADYAAAAmwAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANkAAACeAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2gAA + AJ0AAAAAAAAAAAAAAAAAAAAmAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAADaAAAAnQAAAAAAAAAAAAAAAAAAAD8AAACnAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAANoAAACdAAAAAAAAAAAAAAAAAAAAAAAAAL0AAACAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAA2gAAAJ0AAAAAAAAAAAAAAAAAAAAAAAAASgAAAP4AAAAYAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADaAAAAnQAAAAAAAAAAAAAAAAAAAAAAAAAbAAAA/wAA + AHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANoAAACdAAAAAAAAAAAAAAAAAAAAAAAA + ABwAAAD/AAAAswAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2gAAAJ0AAAAAAAAAAAAA + AAAAAAAAAAAAGQAAAP8AAAC+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADaAAAAnQAA + AAAAAAAAAAAAAAAAAAAAAAAxAAAA/wAAALoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + ANoAAACdAAAAAAAAAAAAAAAAAAAAAAAAAHMAAAD/AAAAtgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAA2gAAAJ0AAAAAAAAAAAAAAAAAAAABAAAA0gAAAP8AAAB/AAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAADaAAAAnQAAAAAAAAAAAAAAAAAAAEIAAAD/AAAA/wAAAD8AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANoAAACdAAAAAAAAAAAAAAAAAAAA0wAAAP8AAADfAAAACgAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2gAAAJ4AAAAAAAAAAAAAAIsAAAD/AAAA/wAA + AIEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADbAAAAlgAAAAAAAACJAAAA/wAA + AP8AAADzAAAAGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANUAAACkAAAAjgAA + AP8AAAD/AAAA/wAAAGkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxQAA + AP0AAAD/AAAA/wAAAP8AAACrAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAADFAAAA/wAAAP8AAAD/AAAA1AAAAAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAMUAAAD/AAAA/wAAANQAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAxAAAAP8AAADUAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADbAAAA3QAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAHYAAAAXAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAGAAAADAA + AAABACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADEAAABUAAAATgAAABQAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAXAAAAP8AAAD/AAAA/wAAAOcAAABUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArAAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAALAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAZAAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAbAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AJkAAAD/AAAA/wAAAP8AAAD9AAAAbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAggAAAFkAAACyAAAAfAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACoAAAAgAAAAAAAAAABAAAABgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAACrAAAAfwAAAAAAAAABAAAAWAAAAEMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACrAAAAfwAAAAAAAAAAAAAAHAAA + AMEAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAACrAAAAfwAAAAAAAAAAAAAAAAAAALIAAACCAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACrAAAAfwAA + AAAAAAAAAAAAAAAAAJoAAADRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACrAAAAfwAAAAAAAAAAAAAAAAAAAJkAAADfAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAACrAAAAfwAAAAAAAAAAAAAAAAAAAMcAAADaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACrAAAAfwAAAAAAAAAAAAAAGgAA + APwAAACtAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAACrAAAAfwAAAAAAAAAAAAAAhwAAAP8AAABlAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACrAAAAgAAA + AAAAAAArAAAA+gAAAPYAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACsAAAAbAAAABkAAADiAAAA/wAAAJcAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAACfAAAAtAAAANsAAAD/AAAA6AAAABMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACUAAAA/wAAAP8AAAD/AAAAPgAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAACVAAAA/wAAAP8AAABbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAA/wAA + AFsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOAAAAaQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAABAA + AAAgAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaQAA + ANYAAADNAAAAWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AMgAAAD/AAAA/wAAAP8AAAAtAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAABHAAAA8QAAAP8AAAD/AAAASwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAB8AAABRAAAAjAAAAFcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGwAAABdAAAAAAAAADoAAAAFAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABzAAAAXAAAAAAAAABUAAAAZgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcwAAAFwAAAAAAAAAIgAAALoAAAACAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHMAAABcAAAAAAAAACIAAADSAAAABAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABzAAAAXQAAAAAAAABeAAAA2wAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcwAAAFcAAAAAAAAA2QAA + AJoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHEAAABNAAAAeQAA + AP8AAAApAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABkAAAA2AAA + AP8AAACHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZQAA + AP8AAACtAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AHYAAAC9AAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAgAAAABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + 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 + 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 + 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 + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + + \ No newline at end of file diff --git a/MCSong/GUI/Window.Designer.cs b/MCSong/GUI/Window.Designer.cs index 3cf01df..5b23d66 100644 --- a/MCSong/GUI/Window.Designer.cs +++ b/MCSong/GUI/Window.Designer.cs @@ -59,10 +59,12 @@ protected override void WndProc(ref Message msg) private void InitializeComponent() { this.components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Window)); this.tabControl1 = new System.Windows.Forms.TabControl(); this.tabPage1 = new System.Windows.Forms.TabPage(); + this.btnPlay = new System.Windows.Forms.Button(); this.chkMaintenance = new System.Windows.Forms.CheckBox(); - this.label2 = new System.Windows.Forms.Label(); + this.lblCopyright = new System.Windows.Forms.Label(); this.groupBox3 = new System.Windows.Forms.GroupBox(); this.txtHost = new System.Windows.Forms.TextBox(); this.label1 = new System.Windows.Forms.Label(); @@ -86,6 +88,19 @@ private void InitializeComponent() this.txtInput = new System.Windows.Forms.TextBox(); this.txtUrl = new System.Windows.Forms.TextBox(); this.tabPage2 = new System.Windows.Forms.TabPage(); + this.tableLayoutPanel3 = new System.Windows.Forms.TableLayoutPanel(); + this.groupBox14 = new System.Windows.Forms.GroupBox(); + this.txtAdminOut = new System.Windows.Forms.TextBox(); + this.btnAdminChat = new System.Windows.Forms.Button(); + this.txtAdminIn = new System.Windows.Forms.TextBox(); + this.groupBox15 = new System.Windows.Forms.GroupBox(); + this.txtOpOut = new System.Windows.Forms.TextBox(); + this.btnOpChat = new System.Windows.Forms.Button(); + this.txtOpIn = new System.Windows.Forms.TextBox(); + this.groupBox16 = new System.Windows.Forms.GroupBox(); + this.txtGlobalOut = new System.Windows.Forms.TextBox(); + this.btnGlobalChat = new System.Windows.Forms.Button(); + this.txtGlobalIn = new System.Windows.Forms.TextBox(); this.tpPlayers = new System.Windows.Forms.TabPage(); this.panel1 = new System.Windows.Forms.Panel(); this.txtPlayerCount = new System.Windows.Forms.TextBox(); @@ -94,39 +109,51 @@ private void InitializeComponent() this.groupBox4 = new System.Windows.Forms.GroupBox(); this.groupBox5 = new System.Windows.Forms.GroupBox(); this.liClients = new System.Windows.Forms.ListBox(); - this.playerStrip = new System.Windows.Forms.ContextMenuStrip(this.components); - this.whoisToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.kickToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.banToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.voiceToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.tpLevels = new System.Windows.Forms.TabPage(); this.panel2 = new System.Windows.Forms.Panel(); + this.gbMapViewer = new System.Windows.Forms.GroupBox(); + this.btnSaveImage = new System.Windows.Forms.Button(); + this.pbMapViewer = new System.Windows.Forms.PictureBox(); this.groupBox8 = new System.Windows.Forms.GroupBox(); + this.groupBox18 = new System.Windows.Forms.GroupBox(); + this.chkAutoLoad = new System.Windows.Forms.CheckBox(); + this.chkAutoUnload = new System.Windows.Forms.CheckBox(); + this.chkEdgeWater = new System.Windows.Forms.CheckBox(); + this.chkFiniteMode = new System.Windows.Forms.CheckBox(); + this.chkLevelChat = new System.Windows.Forms.CheckBox(); + this.chkSurvivalDeath = new System.Windows.Forms.CheckBox(); + this.chkAnimalAi = new System.Windows.Forms.CheckBox(); + this.chkKillerBlocks = new System.Windows.Forms.CheckBox(); + this.chkGrassGrowing = new System.Windows.Forms.CheckBox(); + this.btnNewLevel = new System.Windows.Forms.Button(); + this.btnLevelHacks = new System.Windows.Forms.Button(); + this.label15 = new System.Windows.Forms.Label(); + this.label14 = new System.Windows.Forms.Label(); + this.cmbPerVisit = new System.Windows.Forms.ComboBox(); + this.cmbPerBuild = new System.Windows.Forms.ComboBox(); + this.btnRenameLevel = new System.Windows.Forms.Button(); + this.btnBackupManager = new System.Windows.Forms.Button(); + this.btnDeleteLevel = new System.Windows.Forms.Button(); + this.cmbLevelPhys = new System.Windows.Forms.ComboBox(); + this.label13 = new System.Windows.Forms.Label(); + this.txtLevelY = new System.Windows.Forms.TextBox(); + this.label12 = new System.Windows.Forms.Label(); + this.txtLevelZ = new System.Windows.Forms.TextBox(); + this.label11 = new System.Windows.Forms.Label(); + this.txtLevelX = new System.Windows.Forms.TextBox(); + this.label10 = new System.Windows.Forms.Label(); + this.txtLevelMotd = new System.Windows.Forms.TextBox(); + this.label9 = new System.Windows.Forms.Label(); + this.btnUpdateLevel = new System.Windows.Forms.Button(); this.groupBox7 = new System.Windows.Forms.GroupBox(); this.liUnloaded = new System.Windows.Forms.ListBox(); - this.mapsStrip = new System.Windows.Forms.ContextMenuStrip(this.components); - this.physicsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItem2 = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItem3 = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItem4 = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItem5 = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItem6 = new System.Windows.Forms.ToolStripMenuItem(); - this.unloadToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.settingsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.finiteModeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.animalAIToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.edgeWaterToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.growingGrassToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.survivalDeathToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.killerBlocksToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.rPChatToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.saveToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.groupBox6 = new System.Windows.Forms.GroupBox(); this.liMaps = new System.Windows.Forms.ListBox(); - this.txtLevelPath = new System.Windows.Forms.TextBox(); - this.button3 = new System.Windows.Forms.Button(); + this.btnUnloadLevel = new System.Windows.Forms.Button(); this.btnLoadLevel = new System.Windows.Forms.Button(); this.tpChangelog = new System.Windows.Forms.TabPage(); + this.txtLatestVersion = new System.Windows.Forms.TextBox(); + this.label2 = new System.Windows.Forms.Label(); this.txtCurrentVersion = new System.Windows.Forms.TextBox(); this.label3 = new System.Windows.Forms.Label(); this.btnChangelog = new System.Windows.Forms.Button(); @@ -138,10 +165,41 @@ private void InitializeComponent() this.gbErrors = new System.Windows.Forms.GroupBox(); this.txtErrors = new System.Windows.Forms.TextBox(); this.tabPage3 = new System.Windows.Forms.TabPage(); + this.lblUrl = new System.Windows.Forms.Label(); + this.groupBox13 = new System.Windows.Forms.GroupBox(); + this.label20 = new System.Windows.Forms.Label(); + this.linkLabel9 = new System.Windows.Forms.LinkLabel(); + this.linkLabel5 = new System.Windows.Forms.LinkLabel(); + this.linkLabel4 = new System.Windows.Forms.LinkLabel(); + this.linkLabel10 = new System.Windows.Forms.LinkLabel(); + this.label8 = new System.Windows.Forms.Label(); + this.linkLabel6 = new System.Windows.Forms.LinkLabel(); + this.label7 = new System.Windows.Forms.Label(); + this.label6 = new System.Windows.Forms.Label(); + this.linkLabel1 = new System.Windows.Forms.LinkLabel(); + this.label5 = new System.Windows.Forms.Label(); + this.groupBox12 = new System.Windows.Forms.GroupBox(); + this.textBox1 = new System.Windows.Forms.TextBox(); + this.groupBox11 = new System.Windows.Forms.GroupBox(); + this.txtDevList = new System.Windows.Forms.TextBox(); + this.groupBox10 = new System.Windows.Forms.GroupBox(); + this.lblStartingCounters = new System.Windows.Forms.Label(); + this.button3 = new System.Windows.Forms.Button(); + this.groupBox17 = new System.Windows.Forms.GroupBox(); + this.txtThreads = new System.Windows.Forms.TextBox(); + this.txtMemory = new System.Windows.Forms.TextBox(); + this.txtCpu = new System.Windows.Forms.TextBox(); + this.txtUptime = new System.Windows.Forms.TextBox(); + this.label19 = new System.Windows.Forms.Label(); + this.label18 = new System.Windows.Forms.Label(); + this.label17 = new System.Windows.Forms.Label(); + this.label16 = new System.Windows.Forms.Label(); this.tmrRestart = new System.Windows.Forms.Timer(this.components); this.iconContext = new System.Windows.Forms.ContextMenuStrip(this.components); this.openConsole = new System.Windows.Forms.ToolStripMenuItem(); this.shutdownServer = new System.Windows.Forms.ToolStripMenuItem(); + this.btnEnvColors = new System.Windows.Forms.Button(); + this.button8 = new System.Windows.Forms.Button(); this.tabControl1.SuspendLayout(); this.tabPage1.SuspendLayout(); this.groupBox3.SuspendLayout(); @@ -149,20 +207,31 @@ private void InitializeComponent() this.groupBox2.SuspendLayout(); this.gBCommands.SuspendLayout(); this.gBChat.SuspendLayout(); + this.tabPage2.SuspendLayout(); + this.tableLayoutPanel3.SuspendLayout(); + this.groupBox14.SuspendLayout(); + this.groupBox15.SuspendLayout(); + this.groupBox16.SuspendLayout(); this.tpPlayers.SuspendLayout(); this.panel1.SuspendLayout(); this.tableLayoutPanel1.SuspendLayout(); - this.playerStrip.SuspendLayout(); this.tpLevels.SuspendLayout(); this.panel2.SuspendLayout(); + this.gbMapViewer.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pbMapViewer)).BeginInit(); + this.groupBox8.SuspendLayout(); this.groupBox7.SuspendLayout(); - this.mapsStrip.SuspendLayout(); this.groupBox6.SuspendLayout(); this.tpChangelog.SuspendLayout(); this.tpLogs.SuspendLayout(); this.tableLayoutPanel2.SuspendLayout(); this.groupBox1.SuspendLayout(); this.gbErrors.SuspendLayout(); + this.tabPage3.SuspendLayout(); + this.groupBox13.SuspendLayout(); + this.groupBox12.SuspendLayout(); + this.groupBox11.SuspendLayout(); + this.groupBox10.SuspendLayout(); this.iconContext.SuspendLayout(); this.SuspendLayout(); // @@ -187,8 +256,9 @@ private void InitializeComponent() // tabPage1 // this.tabPage1.BackColor = System.Drawing.Color.Transparent; + this.tabPage1.Controls.Add(this.btnPlay); this.tabPage1.Controls.Add(this.chkMaintenance); - this.tabPage1.Controls.Add(this.label2); + this.tabPage1.Controls.Add(this.lblCopyright); this.tabPage1.Controls.Add(this.groupBox3); this.tabPage1.Controls.Add(this.groupBox9); this.tabPage1.Controls.Add(this.groupBox2); @@ -202,24 +272,34 @@ private void InitializeComponent() this.tabPage1.TabIndex = 0; this.tabPage1.Text = "Main"; // + // btnPlay + // + this.btnPlay.Location = new System.Drawing.Point(392, 7); + this.btnPlay.Name = "btnPlay"; + this.btnPlay.Size = new System.Drawing.Size(40, 23); + this.btnPlay.TabIndex = 39; + this.btnPlay.Text = "Play"; + this.btnPlay.UseVisualStyleBackColor = true; + this.btnPlay.Click += new System.EventHandler(this.btnPlay_Click); + // // chkMaintenance // this.chkMaintenance.AutoSize = true; - this.chkMaintenance.Location = new System.Drawing.Point(438, 11); + this.chkMaintenance.Location = new System.Drawing.Point(449, 11); this.chkMaintenance.Name = "chkMaintenance"; this.chkMaintenance.Size = new System.Drawing.Size(118, 17); this.chkMaintenance.TabIndex = 38; this.chkMaintenance.Text = "Maintenance Mode"; this.chkMaintenance.UseVisualStyleBackColor = true; - this.chkMaintenance.CheckedChanged += new System.EventHandler(this.chkMaintenance_CheckedChanged); + this.chkMaintenance.Click += new System.EventHandler(this.chkMaintenance_Click); // - // label2 + // lblCopyright // - this.label2.Location = new System.Drawing.Point(517, 464); - this.label2.Name = "label2"; - this.label2.Size = new System.Drawing.Size(46, 13); - this.label2.TabIndex = 36; - this.label2.Text = "© 2014"; + this.lblCopyright.Location = new System.Drawing.Point(517, 464); + this.lblCopyright.Name = "lblCopyright"; + this.lblCopyright.Size = new System.Drawing.Size(46, 13); + this.lblCopyright.TabIndex = 36; + this.lblCopyright.Text = "© "; // // groupBox3 // @@ -378,9 +458,9 @@ private void InitializeComponent() this.gBCommands.Controls.Add(this.txtCommandsUsed); this.gBCommands.Controls.Add(this.txtCommands); this.gBCommands.Font = new System.Drawing.Font("Calibri", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.gBCommands.Location = new System.Drawing.Point(416, 34); + this.gBCommands.Location = new System.Drawing.Point(392, 34); this.gBCommands.Name = "gBCommands"; - this.gBCommands.Size = new System.Drawing.Size(151, 408); + this.gBCommands.Size = new System.Drawing.Size(175, 408); this.gBCommands.TabIndex = 34; this.gBCommands.TabStop = false; this.gBCommands.Text = "Commands"; @@ -388,7 +468,7 @@ private void InitializeComponent() // btnCommand // this.btnCommand.Font = new System.Drawing.Font("Calibri", 8F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.btnCommand.Location = new System.Drawing.Point(124, 384); + this.btnCommand.Location = new System.Drawing.Point(148, 384); this.btnCommand.Margin = new System.Windows.Forms.Padding(0); this.btnCommand.Name = "btnCommand"; this.btnCommand.Size = new System.Drawing.Size(21, 21); @@ -408,7 +488,7 @@ private void InitializeComponent() this.txtCommandsUsed.Name = "txtCommandsUsed"; this.txtCommandsUsed.ReadOnly = true; this.txtCommandsUsed.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; - this.txtCommandsUsed.Size = new System.Drawing.Size(137, 359); + this.txtCommandsUsed.Size = new System.Drawing.Size(161, 359); this.txtCommandsUsed.TabIndex = 0; // // txtCommands @@ -416,7 +496,7 @@ private void InitializeComponent() this.txtCommands.Font = new System.Drawing.Font("Calibri", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.txtCommands.Location = new System.Drawing.Point(8, 384); this.txtCommands.Name = "txtCommands"; - this.txtCommands.Size = new System.Drawing.Size(113, 21); + this.txtCommands.Size = new System.Drawing.Size(137, 21); this.txtCommands.TabIndex = 28; this.txtCommands.KeyDown += new System.Windows.Forms.KeyEventHandler(this.txtCommands_KeyDown); // @@ -428,7 +508,7 @@ private void InitializeComponent() this.gBChat.Font = new System.Drawing.Font("Calibri", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.gBChat.Location = new System.Drawing.Point(6, 34); this.gBChat.Name = "gBChat"; - this.gBChat.Size = new System.Drawing.Size(404, 408); + this.gBChat.Size = new System.Drawing.Size(380, 408); this.gBChat.TabIndex = 32; this.gBChat.TabStop = false; this.gBChat.Text = "Chat"; @@ -436,7 +516,7 @@ private void InitializeComponent() // btnChat // this.btnChat.Font = new System.Drawing.Font("Calibri", 8F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.btnChat.Location = new System.Drawing.Point(376, 384); + this.btnChat.Location = new System.Drawing.Point(353, 384); this.btnChat.Margin = new System.Windows.Forms.Padding(0); this.btnChat.Name = "btnChat"; this.btnChat.Size = new System.Drawing.Size(21, 21); @@ -456,7 +536,7 @@ private void InitializeComponent() this.txtLog.Name = "txtLog"; this.txtLog.ReadOnly = true; this.txtLog.ScrollBars = System.Windows.Forms.ScrollBars.Both; - this.txtLog.Size = new System.Drawing.Size(391, 359); + this.txtLog.Size = new System.Drawing.Size(368, 359); this.txtLog.TabIndex = 1; // // txtInput @@ -464,7 +544,7 @@ private void InitializeComponent() this.txtInput.Font = new System.Drawing.Font("Calibri", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.txtInput.Location = new System.Drawing.Point(6, 384); this.txtInput.Name = "txtInput"; - this.txtInput.Size = new System.Drawing.Size(365, 21); + this.txtInput.Size = new System.Drawing.Size(344, 21); this.txtInput.TabIndex = 27; this.txtInput.KeyDown += new System.Windows.Forms.KeyEventHandler(this.txtInput_KeyDown); // @@ -472,21 +552,171 @@ private void InitializeComponent() // this.txtUrl.Cursor = System.Windows.Forms.Cursors.Default; this.txtUrl.Font = new System.Drawing.Font("Calibri", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.txtUrl.Location = new System.Drawing.Point(7, 7); + this.txtUrl.Location = new System.Drawing.Point(6, 9); this.txtUrl.Name = "txtUrl"; this.txtUrl.ReadOnly = true; - this.txtUrl.Size = new System.Drawing.Size(403, 21); + this.txtUrl.Size = new System.Drawing.Size(380, 21); this.txtUrl.TabIndex = 25; // // tabPage2 // this.tabPage2.BackColor = System.Drawing.SystemColors.Control; + this.tabPage2.Controls.Add(this.tableLayoutPanel3); this.tabPage2.Location = new System.Drawing.Point(4, 22); this.tabPage2.Name = "tabPage2"; this.tabPage2.Size = new System.Drawing.Size(573, 488); this.tabPage2.TabIndex = 6; this.tabPage2.Text = "Chat"; // + // tableLayoutPanel3 + // + this.tableLayoutPanel3.ColumnCount = 1; + this.tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F)); + this.tableLayoutPanel3.Controls.Add(this.groupBox14, 0, 0); + this.tableLayoutPanel3.Controls.Add(this.groupBox15, 0, 1); + this.tableLayoutPanel3.Controls.Add(this.groupBox16, 0, 2); + this.tableLayoutPanel3.Dock = System.Windows.Forms.DockStyle.Fill; + this.tableLayoutPanel3.Location = new System.Drawing.Point(0, 0); + this.tableLayoutPanel3.Name = "tableLayoutPanel3"; + this.tableLayoutPanel3.RowCount = 3; + this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 33.33F)); + this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 33.33F)); + this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 33.34F)); + this.tableLayoutPanel3.Size = new System.Drawing.Size(573, 488); + this.tableLayoutPanel3.TabIndex = 0; + // + // groupBox14 + // + this.groupBox14.Controls.Add(this.txtAdminOut); + this.groupBox14.Controls.Add(this.btnAdminChat); + this.groupBox14.Controls.Add(this.txtAdminIn); + this.groupBox14.Dock = System.Windows.Forms.DockStyle.Fill; + this.groupBox14.Location = new System.Drawing.Point(3, 3); + this.groupBox14.Name = "groupBox14"; + this.groupBox14.Size = new System.Drawing.Size(567, 156); + this.groupBox14.TabIndex = 0; + this.groupBox14.TabStop = false; + this.groupBox14.Text = "Admin Chat"; + // + // txtAdminOut + // + this.txtAdminOut.Location = new System.Drawing.Point(6, 20); + this.txtAdminOut.Multiline = true; + this.txtAdminOut.Name = "txtAdminOut"; + this.txtAdminOut.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; + this.txtAdminOut.Size = new System.Drawing.Size(556, 103); + this.txtAdminOut.TabIndex = 38; + // + // btnAdminChat + // + this.btnAdminChat.Font = new System.Drawing.Font("Calibri", 8F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btnAdminChat.Location = new System.Drawing.Point(541, 129); + this.btnAdminChat.Margin = new System.Windows.Forms.Padding(0); + this.btnAdminChat.Name = "btnAdminChat"; + this.btnAdminChat.Size = new System.Drawing.Size(21, 21); + this.btnAdminChat.TabIndex = 37; + this.btnAdminChat.Text = "→"; + this.btnAdminChat.TextAlign = System.Drawing.ContentAlignment.TopCenter; + this.btnAdminChat.UseVisualStyleBackColor = true; + this.btnAdminChat.Click += new System.EventHandler(this.btnAdminChat_Click); + // + // txtAdminIn + // + this.txtAdminIn.Font = new System.Drawing.Font("Calibri", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.txtAdminIn.Location = new System.Drawing.Point(6, 129); + this.txtAdminIn.Name = "txtAdminIn"; + this.txtAdminIn.Size = new System.Drawing.Size(532, 21); + this.txtAdminIn.TabIndex = 36; + this.txtAdminIn.KeyDown += new System.Windows.Forms.KeyEventHandler(this.txtAdminIn_KeyDown); + // + // groupBox15 + // + this.groupBox15.Controls.Add(this.txtOpOut); + this.groupBox15.Controls.Add(this.btnOpChat); + this.groupBox15.Controls.Add(this.txtOpIn); + this.groupBox15.Dock = System.Windows.Forms.DockStyle.Fill; + this.groupBox15.Location = new System.Drawing.Point(3, 165); + this.groupBox15.Name = "groupBox15"; + this.groupBox15.Size = new System.Drawing.Size(567, 156); + this.groupBox15.TabIndex = 1; + this.groupBox15.TabStop = false; + this.groupBox15.Text = "Op Chat"; + // + // txtOpOut + // + this.txtOpOut.Location = new System.Drawing.Point(6, 20); + this.txtOpOut.Multiline = true; + this.txtOpOut.Name = "txtOpOut"; + this.txtOpOut.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; + this.txtOpOut.Size = new System.Drawing.Size(556, 103); + this.txtOpOut.TabIndex = 41; + // + // btnOpChat + // + this.btnOpChat.Font = new System.Drawing.Font("Calibri", 8F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btnOpChat.Location = new System.Drawing.Point(541, 129); + this.btnOpChat.Margin = new System.Windows.Forms.Padding(0); + this.btnOpChat.Name = "btnOpChat"; + this.btnOpChat.Size = new System.Drawing.Size(21, 21); + this.btnOpChat.TabIndex = 40; + this.btnOpChat.Text = "→"; + this.btnOpChat.TextAlign = System.Drawing.ContentAlignment.TopCenter; + this.btnOpChat.UseVisualStyleBackColor = true; + this.btnOpChat.Click += new System.EventHandler(this.btnOpChat_Click); + // + // txtOpIn + // + this.txtOpIn.Font = new System.Drawing.Font("Calibri", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.txtOpIn.Location = new System.Drawing.Point(6, 129); + this.txtOpIn.Name = "txtOpIn"; + this.txtOpIn.Size = new System.Drawing.Size(532, 21); + this.txtOpIn.TabIndex = 39; + this.txtOpIn.KeyDown += new System.Windows.Forms.KeyEventHandler(this.txtOpIn_KeyDown); + // + // groupBox16 + // + this.groupBox16.Controls.Add(this.txtGlobalOut); + this.groupBox16.Controls.Add(this.btnGlobalChat); + this.groupBox16.Controls.Add(this.txtGlobalIn); + this.groupBox16.Dock = System.Windows.Forms.DockStyle.Fill; + this.groupBox16.Location = new System.Drawing.Point(3, 327); + this.groupBox16.Name = "groupBox16"; + this.groupBox16.Size = new System.Drawing.Size(567, 158); + this.groupBox16.TabIndex = 2; + this.groupBox16.TabStop = false; + this.groupBox16.Text = "Global Chat"; + // + // txtGlobalOut + // + this.txtGlobalOut.Location = new System.Drawing.Point(6, 20); + this.txtGlobalOut.Multiline = true; + this.txtGlobalOut.Name = "txtGlobalOut"; + this.txtGlobalOut.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; + this.txtGlobalOut.Size = new System.Drawing.Size(556, 103); + this.txtGlobalOut.TabIndex = 44; + // + // btnGlobalChat + // + this.btnGlobalChat.Font = new System.Drawing.Font("Calibri", 8F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btnGlobalChat.Location = new System.Drawing.Point(541, 129); + this.btnGlobalChat.Margin = new System.Windows.Forms.Padding(0); + this.btnGlobalChat.Name = "btnGlobalChat"; + this.btnGlobalChat.Size = new System.Drawing.Size(21, 21); + this.btnGlobalChat.TabIndex = 43; + this.btnGlobalChat.Text = "→"; + this.btnGlobalChat.TextAlign = System.Drawing.ContentAlignment.TopCenter; + this.btnGlobalChat.UseVisualStyleBackColor = true; + this.btnGlobalChat.Click += new System.EventHandler(this.btnGlobalChat_Click); + // + // txtGlobalIn + // + this.txtGlobalIn.Font = new System.Drawing.Font("Calibri", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.txtGlobalIn.Location = new System.Drawing.Point(6, 129); + this.txtGlobalIn.Name = "txtGlobalIn"; + this.txtGlobalIn.Size = new System.Drawing.Size(532, 21); + this.txtGlobalIn.TabIndex = 42; + this.txtGlobalIn.KeyDown += new System.Windows.Forms.KeyEventHandler(this.txtGlobalIn_KeyDown); + // // tpPlayers // this.tpPlayers.BackColor = System.Drawing.SystemColors.Control; @@ -562,7 +792,6 @@ private void InitializeComponent() // // liClients // - this.liClients.ContextMenuStrip = this.playerStrip; this.liClients.Font = new System.Drawing.Font("Calibri", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.liClients.FormattingEnabled = true; this.liClients.Location = new System.Drawing.Point(4, 29); @@ -570,44 +799,7 @@ private void InitializeComponent() this.liClients.ScrollAlwaysVisible = true; this.liClients.Size = new System.Drawing.Size(120, 446); this.liClients.TabIndex = 34; - // - // playerStrip - // - this.playerStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.whoisToolStripMenuItem, - this.kickToolStripMenuItem, - this.banToolStripMenuItem, - this.voiceToolStripMenuItem}); - this.playerStrip.Name = "playerStrip"; - this.playerStrip.Size = new System.Drawing.Size(106, 92); - // - // whoisToolStripMenuItem - // - this.whoisToolStripMenuItem.Name = "whoisToolStripMenuItem"; - this.whoisToolStripMenuItem.Size = new System.Drawing.Size(105, 22); - this.whoisToolStripMenuItem.Text = "whois"; - this.whoisToolStripMenuItem.Click += new System.EventHandler(this.whoisToolStripMenuItem_Click); - // - // kickToolStripMenuItem - // - this.kickToolStripMenuItem.Name = "kickToolStripMenuItem"; - this.kickToolStripMenuItem.Size = new System.Drawing.Size(105, 22); - this.kickToolStripMenuItem.Text = "kick"; - this.kickToolStripMenuItem.Click += new System.EventHandler(this.kickToolStripMenuItem_Click); - // - // banToolStripMenuItem - // - this.banToolStripMenuItem.Name = "banToolStripMenuItem"; - this.banToolStripMenuItem.Size = new System.Drawing.Size(105, 22); - this.banToolStripMenuItem.Text = "ban"; - this.banToolStripMenuItem.Click += new System.EventHandler(this.banToolStripMenuItem_Click); - // - // voiceToolStripMenuItem - // - this.voiceToolStripMenuItem.Name = "voiceToolStripMenuItem"; - this.voiceToolStripMenuItem.Size = new System.Drawing.Size(105, 22); - this.voiceToolStripMenuItem.Text = "voice"; - this.voiceToolStripMenuItem.Click += new System.EventHandler(this.voiceToolStripMenuItem_Click); + this.liClients.SelectedIndexChanged += new System.EventHandler(this.liClients_SelectedIndexChanged); // // tpLevels // @@ -622,236 +814,475 @@ private void InitializeComponent() // // panel2 // + this.panel2.Controls.Add(this.gbMapViewer); this.panel2.Controls.Add(this.groupBox8); this.panel2.Controls.Add(this.groupBox7); this.panel2.Controls.Add(this.groupBox6); - this.panel2.Controls.Add(this.txtLevelPath); - this.panel2.Controls.Add(this.button3); + this.panel2.Controls.Add(this.btnUnloadLevel); this.panel2.Controls.Add(this.btnLoadLevel); this.panel2.Dock = System.Windows.Forms.DockStyle.Fill; this.panel2.Location = new System.Drawing.Point(3, 3); this.panel2.Name = "panel2"; this.panel2.Size = new System.Drawing.Size(567, 482); this.panel2.TabIndex = 37; + this.panel2.Paint += new System.Windows.Forms.PaintEventHandler(this.panel2_Paint); + // + // gbMapViewer + // + this.gbMapViewer.Controls.Add(this.btnSaveImage); + this.gbMapViewer.Controls.Add(this.pbMapViewer); + this.gbMapViewer.Location = new System.Drawing.Point(147, 297); + this.gbMapViewer.Name = "gbMapViewer"; + this.gbMapViewer.Size = new System.Drawing.Size(274, 182); + this.gbMapViewer.TabIndex = 44; + this.gbMapViewer.TabStop = false; + this.gbMapViewer.Text = "Map Viewer"; + // + // btnSaveImage + // + this.btnSaveImage.Location = new System.Drawing.Point(229, 20); + this.btnSaveImage.Name = "btnSaveImage"; + this.btnSaveImage.Size = new System.Drawing.Size(39, 23); + this.btnSaveImage.TabIndex = 1; + this.btnSaveImage.Text = "Save"; + this.btnSaveImage.UseVisualStyleBackColor = true; + this.btnSaveImage.Click += new System.EventHandler(this.btnSaveImage_Click); + // + // pbMapViewer + // + this.pbMapViewer.Dock = System.Windows.Forms.DockStyle.Fill; + this.pbMapViewer.Location = new System.Drawing.Point(3, 17); + this.pbMapViewer.Name = "pbMapViewer"; + this.pbMapViewer.Size = new System.Drawing.Size(268, 162); + this.pbMapViewer.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.pbMapViewer.TabIndex = 0; + this.pbMapViewer.TabStop = false; // // groupBox8 // - this.groupBox8.Location = new System.Drawing.Point(11, 289); + this.groupBox8.Controls.Add(this.button8); + this.groupBox8.Controls.Add(this.btnEnvColors); + this.groupBox8.Controls.Add(this.groupBox18); + this.groupBox8.Controls.Add(this.chkAutoLoad); + this.groupBox8.Controls.Add(this.chkAutoUnload); + this.groupBox8.Controls.Add(this.chkEdgeWater); + this.groupBox8.Controls.Add(this.chkFiniteMode); + this.groupBox8.Controls.Add(this.chkLevelChat); + this.groupBox8.Controls.Add(this.chkSurvivalDeath); + this.groupBox8.Controls.Add(this.chkAnimalAi); + this.groupBox8.Controls.Add(this.chkKillerBlocks); + this.groupBox8.Controls.Add(this.chkGrassGrowing); + this.groupBox8.Controls.Add(this.btnNewLevel); + this.groupBox8.Controls.Add(this.btnLevelHacks); + this.groupBox8.Controls.Add(this.label15); + this.groupBox8.Controls.Add(this.label14); + this.groupBox8.Controls.Add(this.cmbPerVisit); + this.groupBox8.Controls.Add(this.cmbPerBuild); + this.groupBox8.Controls.Add(this.btnRenameLevel); + this.groupBox8.Controls.Add(this.btnBackupManager); + this.groupBox8.Controls.Add(this.btnDeleteLevel); + this.groupBox8.Controls.Add(this.cmbLevelPhys); + this.groupBox8.Controls.Add(this.label13); + this.groupBox8.Controls.Add(this.txtLevelY); + this.groupBox8.Controls.Add(this.label12); + this.groupBox8.Controls.Add(this.txtLevelZ); + this.groupBox8.Controls.Add(this.label11); + this.groupBox8.Controls.Add(this.txtLevelX); + this.groupBox8.Controls.Add(this.label10); + this.groupBox8.Controls.Add(this.txtLevelMotd); + this.groupBox8.Controls.Add(this.label9); + this.groupBox8.Controls.Add(this.btnUpdateLevel); + this.groupBox8.Location = new System.Drawing.Point(146, 3); this.groupBox8.Name = "groupBox8"; - this.groupBox8.Size = new System.Drawing.Size(547, 185); + this.groupBox8.Size = new System.Drawing.Size(275, 288); this.groupBox8.TabIndex = 43; this.groupBox8.TabStop = false; + this.groupBox8.Text = "Level Settings"; + // + // groupBox18 + // + this.groupBox18.Location = new System.Drawing.Point(4, 182); + this.groupBox18.Name = "groupBox18"; + this.groupBox18.Size = new System.Drawing.Size(268, 10); + this.groupBox18.TabIndex = 2; + this.groupBox18.TabStop = false; + // + // chkAutoLoad + // + this.chkAutoLoad.Appearance = System.Windows.Forms.Appearance.Button; + this.chkAutoLoad.Location = new System.Drawing.Point(187, 153); + this.chkAutoLoad.Name = "chkAutoLoad"; + this.chkAutoLoad.Size = new System.Drawing.Size(82, 23); + this.chkAutoLoad.TabIndex = 29; + this.chkAutoLoad.Text = "Auto Load"; + this.chkAutoLoad.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.chkAutoLoad.UseVisualStyleBackColor = true; + this.chkAutoLoad.CheckedChanged += new System.EventHandler(this.LevelSettings_Changed); + // + // chkAutoUnload + // + this.chkAutoUnload.Appearance = System.Windows.Forms.Appearance.Button; + this.chkAutoUnload.Location = new System.Drawing.Point(99, 153); + this.chkAutoUnload.Name = "chkAutoUnload"; + this.chkAutoUnload.Size = new System.Drawing.Size(82, 23); + this.chkAutoUnload.TabIndex = 28; + this.chkAutoUnload.Text = "Auto Unload"; + this.chkAutoUnload.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.chkAutoUnload.UseVisualStyleBackColor = true; + this.chkAutoUnload.CheckedChanged += new System.EventHandler(this.LevelSettings_Changed); + // + // chkEdgeWater + // + this.chkEdgeWater.Appearance = System.Windows.Forms.Appearance.Button; + this.chkEdgeWater.Location = new System.Drawing.Point(99, 124); + this.chkEdgeWater.Name = "chkEdgeWater"; + this.chkEdgeWater.Size = new System.Drawing.Size(82, 23); + this.chkEdgeWater.TabIndex = 27; + this.chkEdgeWater.Text = "Edge Water"; + this.chkEdgeWater.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.chkEdgeWater.UseVisualStyleBackColor = true; + this.chkEdgeWater.CheckedChanged += new System.EventHandler(this.LevelSettings_Changed); + // + // chkFiniteMode + // + this.chkFiniteMode.Appearance = System.Windows.Forms.Appearance.Button; + this.chkFiniteMode.Location = new System.Drawing.Point(9, 124); + this.chkFiniteMode.Name = "chkFiniteMode"; + this.chkFiniteMode.Size = new System.Drawing.Size(84, 23); + this.chkFiniteMode.TabIndex = 26; + this.chkFiniteMode.Text = "Finite Liquids"; + this.chkFiniteMode.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.chkFiniteMode.UseVisualStyleBackColor = true; + this.chkFiniteMode.CheckedChanged += new System.EventHandler(this.LevelSettings_Changed); + // + // chkLevelChat + // + this.chkLevelChat.Appearance = System.Windows.Forms.Appearance.Button; + this.chkLevelChat.Location = new System.Drawing.Point(9, 153); + this.chkLevelChat.Name = "chkLevelChat"; + this.chkLevelChat.Size = new System.Drawing.Size(84, 23); + this.chkLevelChat.TabIndex = 30; + this.chkLevelChat.Text = "Level Chat"; + this.chkLevelChat.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.chkLevelChat.UseVisualStyleBackColor = true; + this.chkLevelChat.CheckedChanged += new System.EventHandler(this.LevelSettings_Changed); + // + // chkSurvivalDeath + // + this.chkSurvivalDeath.Appearance = System.Windows.Forms.Appearance.Button; + this.chkSurvivalDeath.Location = new System.Drawing.Point(187, 95); + this.chkSurvivalDeath.Name = "chkSurvivalDeath"; + this.chkSurvivalDeath.Size = new System.Drawing.Size(82, 23); + this.chkSurvivalDeath.TabIndex = 25; + this.chkSurvivalDeath.Text = "Survival Mode"; + this.chkSurvivalDeath.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.chkSurvivalDeath.UseVisualStyleBackColor = true; + this.chkSurvivalDeath.CheckedChanged += new System.EventHandler(this.LevelSettings_Changed); + // + // chkAnimalAi + // + this.chkAnimalAi.Appearance = System.Windows.Forms.Appearance.Button; + this.chkAnimalAi.Location = new System.Drawing.Point(187, 124); + this.chkAnimalAi.Name = "chkAnimalAi"; + this.chkAnimalAi.Size = new System.Drawing.Size(82, 23); + this.chkAnimalAi.TabIndex = 24; + this.chkAnimalAi.Text = "Animal AI"; + this.chkAnimalAi.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.chkAnimalAi.UseVisualStyleBackColor = true; + this.chkAnimalAi.CheckedChanged += new System.EventHandler(this.LevelSettings_Changed); + // + // chkKillerBlocks + // + this.chkKillerBlocks.Appearance = System.Windows.Forms.Appearance.Button; + this.chkKillerBlocks.Location = new System.Drawing.Point(99, 95); + this.chkKillerBlocks.Name = "chkKillerBlocks"; + this.chkKillerBlocks.Size = new System.Drawing.Size(82, 23); + this.chkKillerBlocks.TabIndex = 23; + this.chkKillerBlocks.Text = "Killer Blocks"; + this.chkKillerBlocks.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.chkKillerBlocks.UseVisualStyleBackColor = true; + this.chkKillerBlocks.CheckedChanged += new System.EventHandler(this.LevelSettings_Changed); + // + // chkGrassGrowing + // + this.chkGrassGrowing.Appearance = System.Windows.Forms.Appearance.Button; + this.chkGrassGrowing.Location = new System.Drawing.Point(8, 95); + this.chkGrassGrowing.Name = "chkGrassGrowing"; + this.chkGrassGrowing.Size = new System.Drawing.Size(85, 23); + this.chkGrassGrowing.TabIndex = 22; + this.chkGrassGrowing.Text = "Grass Growing"; + this.chkGrassGrowing.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.chkGrassGrowing.UseVisualStyleBackColor = true; + this.chkGrassGrowing.CheckedChanged += new System.EventHandler(this.LevelSettings_Changed); + // + // btnNewLevel + // + this.btnNewLevel.Location = new System.Drawing.Point(7, 259); + this.btnNewLevel.Name = "btnNewLevel"; + this.btnNewLevel.Size = new System.Drawing.Size(93, 23); + this.btnNewLevel.TabIndex = 21; + this.btnNewLevel.Text = "Create New"; + this.btnNewLevel.UseVisualStyleBackColor = true; + this.btnNewLevel.Click += new System.EventHandler(this.btnNewLevel_Click); + // + // btnLevelHacks + // + this.btnLevelHacks.Location = new System.Drawing.Point(104, 201); + this.btnLevelHacks.Name = "btnLevelHacks"; + this.btnLevelHacks.Size = new System.Drawing.Size(75, 23); + this.btnLevelHacks.TabIndex = 20; + this.btnLevelHacks.Text = "Hack Control"; + this.btnLevelHacks.UseVisualStyleBackColor = true; + this.btnLevelHacks.Click += new System.EventHandler(this.btnLevelHacks_Click); + // + // label15 + // + this.label15.AutoSize = true; + this.label15.Location = new System.Drawing.Point(6, 71); + this.label15.Name = "label15"; + this.label15.Size = new System.Drawing.Size(31, 13); + this.label15.TabIndex = 19; + this.label15.Text = "Visit:"; + // + // label14 + // + this.label14.AutoSize = true; + this.label14.Location = new System.Drawing.Point(140, 71); + this.label14.Name = "label14"; + this.label14.Size = new System.Drawing.Size(34, 13); + this.label14.TabIndex = 18; + this.label14.Text = "Build:"; + // + // cmbPerVisit + // + this.cmbPerVisit.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbPerVisit.FormattingEnabled = true; + this.cmbPerVisit.Location = new System.Drawing.Point(43, 68); + this.cmbPerVisit.Name = "cmbPerVisit"; + this.cmbPerVisit.Size = new System.Drawing.Size(91, 21); + this.cmbPerVisit.TabIndex = 17; + this.cmbPerVisit.SelectedIndexChanged += new System.EventHandler(this.LevelSettings_Changed); + // + // cmbPerBuild + // + this.cmbPerBuild.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbPerBuild.FormattingEnabled = true; + this.cmbPerBuild.Location = new System.Drawing.Point(178, 68); + this.cmbPerBuild.Name = "cmbPerBuild"; + this.cmbPerBuild.Size = new System.Drawing.Size(91, 21); + this.cmbPerBuild.TabIndex = 16; + this.cmbPerBuild.SelectedIndexChanged += new System.EventHandler(this.LevelSettings_Changed); + // + // btnRenameLevel + // + this.btnRenameLevel.Location = new System.Drawing.Point(104, 259); + this.btnRenameLevel.Name = "btnRenameLevel"; + this.btnRenameLevel.Size = new System.Drawing.Size(75, 23); + this.btnRenameLevel.TabIndex = 15; + this.btnRenameLevel.Text = "Rename"; + this.btnRenameLevel.UseVisualStyleBackColor = true; + this.btnRenameLevel.Click += new System.EventHandler(this.btnRenameLevel_Click); + // + // btnBackupManager + // + this.btnBackupManager.Location = new System.Drawing.Point(7, 201); + this.btnBackupManager.Name = "btnBackupManager"; + this.btnBackupManager.Size = new System.Drawing.Size(93, 23); + this.btnBackupManager.TabIndex = 13; + this.btnBackupManager.Text = "Backup Manager"; + this.btnBackupManager.UseVisualStyleBackColor = true; + this.btnBackupManager.Click += new System.EventHandler(this.btnBackupManager_Click); + // + // btnDeleteLevel + // + this.btnDeleteLevel.Location = new System.Drawing.Point(181, 259); + this.btnDeleteLevel.Name = "btnDeleteLevel"; + this.btnDeleteLevel.Size = new System.Drawing.Size(88, 23); + this.btnDeleteLevel.TabIndex = 12; + this.btnDeleteLevel.Text = "Delete"; + this.btnDeleteLevel.UseVisualStyleBackColor = true; + this.btnDeleteLevel.Click += new System.EventHandler(this.btnDeleteLevel_Click); + // + // cmbLevelPhys + // + this.cmbLevelPhys.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbLevelPhys.FormattingEnabled = true; + this.cmbLevelPhys.Items.AddRange(new object[] { + "0 - OFF", + "1 - Normal", + "2 - Advanced", + "3 - Hardcore", + "4 - Instant", + "5 - Doors-Only"}); + this.cmbLevelPhys.Location = new System.Drawing.Point(178, 41); + this.cmbLevelPhys.Name = "cmbLevelPhys"; + this.cmbLevelPhys.Size = new System.Drawing.Size(91, 21); + this.cmbLevelPhys.TabIndex = 11; + this.cmbLevelPhys.SelectedIndexChanged += new System.EventHandler(this.LevelSettings_Changed); + // + // label13 + // + this.label13.AutoSize = true; + this.label13.BackColor = System.Drawing.Color.Transparent; + this.label13.Location = new System.Drawing.Point(134, 44); + this.label13.Name = "label13"; + this.label13.Size = new System.Drawing.Size(45, 13); + this.label13.TabIndex = 10; + this.label13.Text = "Physics:"; + // + // txtLevelY + // + this.txtLevelY.BackColor = System.Drawing.SystemColors.ControlLightLight; + this.txtLevelY.Location = new System.Drawing.Point(61, 41); + this.txtLevelY.Name = "txtLevelY"; + this.txtLevelY.ReadOnly = true; + this.txtLevelY.Size = new System.Drawing.Size(28, 21); + this.txtLevelY.TabIndex = 9; + this.txtLevelY.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; + // + // label12 + // + this.label12.AutoSize = true; + this.label12.Location = new System.Drawing.Point(50, 44); + this.label12.Name = "label12"; + this.label12.Size = new System.Drawing.Size(14, 13); + this.label12.TabIndex = 8; + this.label12.Text = "Y:"; + // + // txtLevelZ + // + this.txtLevelZ.BackColor = System.Drawing.SystemColors.ControlLightLight; + this.txtLevelZ.Location = new System.Drawing.Point(107, 41); + this.txtLevelZ.Name = "txtLevelZ"; + this.txtLevelZ.ReadOnly = true; + this.txtLevelZ.Size = new System.Drawing.Size(28, 21); + this.txtLevelZ.TabIndex = 7; + this.txtLevelZ.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; + // + // label11 + // + this.label11.AutoSize = true; + this.label11.Location = new System.Drawing.Point(96, 44); + this.label11.Name = "label11"; + this.label11.Size = new System.Drawing.Size(15, 13); + this.label11.TabIndex = 6; + this.label11.Text = "Z:"; + // + // txtLevelX + // + this.txtLevelX.BackColor = System.Drawing.SystemColors.ControlLightLight; + this.txtLevelX.Location = new System.Drawing.Point(16, 41); + this.txtLevelX.Name = "txtLevelX"; + this.txtLevelX.ReadOnly = true; + this.txtLevelX.Size = new System.Drawing.Size(28, 21); + this.txtLevelX.TabIndex = 5; + this.txtLevelX.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; + // + // label10 + // + this.label10.AutoSize = true; + this.label10.Location = new System.Drawing.Point(5, 44); + this.label10.Name = "label10"; + this.label10.Size = new System.Drawing.Size(16, 13); + this.label10.TabIndex = 4; + this.label10.Text = "X:"; + // + // txtLevelMotd + // + this.txtLevelMotd.BackColor = System.Drawing.SystemColors.Window; + this.txtLevelMotd.Location = new System.Drawing.Point(50, 14); + this.txtLevelMotd.Name = "txtLevelMotd"; + this.txtLevelMotd.ReadOnly = true; + this.txtLevelMotd.Size = new System.Drawing.Size(219, 21); + this.txtLevelMotd.TabIndex = 3; + this.txtLevelMotd.TextChanged += new System.EventHandler(this.LevelSettings_Changed); + // + // label9 + // + this.label9.AutoSize = true; + this.label9.Location = new System.Drawing.Point(6, 17); + this.label9.Name = "label9"; + this.label9.Size = new System.Drawing.Size(38, 13); + this.label9.TabIndex = 2; + this.label9.Text = "MOTD:"; + // + // btnUpdateLevel + // + this.btnUpdateLevel.Location = new System.Drawing.Point(181, 201); + this.btnUpdateLevel.Name = "btnUpdateLevel"; + this.btnUpdateLevel.Size = new System.Drawing.Size(88, 23); + this.btnUpdateLevel.TabIndex = 0; + this.btnUpdateLevel.Text = "Update Settings"; + this.btnUpdateLevel.UseVisualStyleBackColor = true; + this.btnUpdateLevel.Click += new System.EventHandler(this.btnUpdateLevel_Click); // // groupBox7 // this.groupBox7.Controls.Add(this.liUnloaded); - this.groupBox7.Enabled = false; - this.groupBox7.Location = new System.Drawing.Point(5, 3); + this.groupBox7.Location = new System.Drawing.Point(3, 32); this.groupBox7.Name = "groupBox7"; - this.groupBox7.Size = new System.Drawing.Size(98, 251); + this.groupBox7.Size = new System.Drawing.Size(137, 447); this.groupBox7.TabIndex = 42; this.groupBox7.TabStop = false; this.groupBox7.Text = "Unloaded"; // // liUnloaded // - this.liUnloaded.ContextMenuStrip = this.mapsStrip; this.liUnloaded.Font = new System.Drawing.Font("Calibri", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.liUnloaded.FormattingEnabled = true; this.liUnloaded.Location = new System.Drawing.Point(6, 20); this.liUnloaded.Name = "liUnloaded"; this.liUnloaded.ScrollAlwaysVisible = true; - this.liUnloaded.Size = new System.Drawing.Size(86, 225); + this.liUnloaded.Size = new System.Drawing.Size(125, 420); this.liUnloaded.TabIndex = 37; this.liUnloaded.SelectedIndexChanged += new System.EventHandler(this.liUnloaded_SelectedIndexChanged); // - // mapsStrip - // - this.mapsStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.physicsToolStripMenuItem, - this.unloadToolStripMenuItem, - this.settingsToolStripMenuItem, - this.saveToolStripMenuItem}); - this.mapsStrip.Name = "mapsStrip"; - this.mapsStrip.Size = new System.Drawing.Size(117, 92); - // - // physicsToolStripMenuItem - // - this.physicsToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.toolStripMenuItem2, - this.toolStripMenuItem3, - this.toolStripMenuItem4, - this.toolStripMenuItem5, - this.toolStripMenuItem6}); - this.physicsToolStripMenuItem.Name = "physicsToolStripMenuItem"; - this.physicsToolStripMenuItem.Size = new System.Drawing.Size(116, 22); - this.physicsToolStripMenuItem.Text = "Physics"; - // - // toolStripMenuItem2 - // - this.toolStripMenuItem2.Name = "toolStripMenuItem2"; - this.toolStripMenuItem2.Size = new System.Drawing.Size(80, 22); - this.toolStripMenuItem2.Text = "0"; - this.toolStripMenuItem2.Click += new System.EventHandler(this.toolStripMenuItem2_Click); - // - // toolStripMenuItem3 - // - this.toolStripMenuItem3.Name = "toolStripMenuItem3"; - this.toolStripMenuItem3.Size = new System.Drawing.Size(80, 22); - this.toolStripMenuItem3.Text = "1"; - this.toolStripMenuItem3.Click += new System.EventHandler(this.toolStripMenuItem3_Click); - // - // toolStripMenuItem4 - // - this.toolStripMenuItem4.Name = "toolStripMenuItem4"; - this.toolStripMenuItem4.Size = new System.Drawing.Size(80, 22); - this.toolStripMenuItem4.Text = "2"; - this.toolStripMenuItem4.Click += new System.EventHandler(this.toolStripMenuItem4_Click); - // - // toolStripMenuItem5 - // - this.toolStripMenuItem5.Name = "toolStripMenuItem5"; - this.toolStripMenuItem5.Size = new System.Drawing.Size(80, 22); - this.toolStripMenuItem5.Text = "3"; - this.toolStripMenuItem5.Click += new System.EventHandler(this.toolStripMenuItem5_Click); - // - // toolStripMenuItem6 - // - this.toolStripMenuItem6.Name = "toolStripMenuItem6"; - this.toolStripMenuItem6.Size = new System.Drawing.Size(80, 22); - this.toolStripMenuItem6.Text = "4"; - this.toolStripMenuItem6.Click += new System.EventHandler(this.toolStripMenuItem6_Click); - // - // unloadToolStripMenuItem - // - this.unloadToolStripMenuItem.Name = "unloadToolStripMenuItem"; - this.unloadToolStripMenuItem.Size = new System.Drawing.Size(116, 22); - this.unloadToolStripMenuItem.Text = "Unload"; - this.unloadToolStripMenuItem.Click += new System.EventHandler(this.unloadToolStripMenuItem_Click); - // - // settingsToolStripMenuItem - // - this.settingsToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.finiteModeToolStripMenuItem, - this.animalAIToolStripMenuItem, - this.edgeWaterToolStripMenuItem, - this.growingGrassToolStripMenuItem, - this.survivalDeathToolStripMenuItem, - this.killerBlocksToolStripMenuItem, - this.rPChatToolStripMenuItem}); - this.settingsToolStripMenuItem.Name = "settingsToolStripMenuItem"; - this.settingsToolStripMenuItem.Size = new System.Drawing.Size(116, 22); - this.settingsToolStripMenuItem.Text = "Settings"; - // - // finiteModeToolStripMenuItem - // - this.finiteModeToolStripMenuItem.Name = "finiteModeToolStripMenuItem"; - this.finiteModeToolStripMenuItem.Size = new System.Drawing.Size(150, 22); - this.finiteModeToolStripMenuItem.Text = "Finite Mode"; - this.finiteModeToolStripMenuItem.Click += new System.EventHandler(this.finiteModeToolStripMenuItem_Click); - // - // animalAIToolStripMenuItem - // - this.animalAIToolStripMenuItem.Name = "animalAIToolStripMenuItem"; - this.animalAIToolStripMenuItem.Size = new System.Drawing.Size(150, 22); - this.animalAIToolStripMenuItem.Text = "Animal AI"; - this.animalAIToolStripMenuItem.Click += new System.EventHandler(this.animalAIToolStripMenuItem_Click); - // - // edgeWaterToolStripMenuItem - // - this.edgeWaterToolStripMenuItem.Name = "edgeWaterToolStripMenuItem"; - this.edgeWaterToolStripMenuItem.Size = new System.Drawing.Size(150, 22); - this.edgeWaterToolStripMenuItem.Text = "Edge Water"; - this.edgeWaterToolStripMenuItem.Click += new System.EventHandler(this.edgeWaterToolStripMenuItem_Click); - // - // growingGrassToolStripMenuItem - // - this.growingGrassToolStripMenuItem.Name = "growingGrassToolStripMenuItem"; - this.growingGrassToolStripMenuItem.Size = new System.Drawing.Size(150, 22); - this.growingGrassToolStripMenuItem.Text = "Grass Growing"; - this.growingGrassToolStripMenuItem.Click += new System.EventHandler(this.growingGrassToolStripMenuItem_Click); - // - // survivalDeathToolStripMenuItem - // - this.survivalDeathToolStripMenuItem.Name = "survivalDeathToolStripMenuItem"; - this.survivalDeathToolStripMenuItem.Size = new System.Drawing.Size(150, 22); - this.survivalDeathToolStripMenuItem.Text = "Survival Death"; - this.survivalDeathToolStripMenuItem.Click += new System.EventHandler(this.survivalDeathToolStripMenuItem_Click); - // - // killerBlocksToolStripMenuItem - // - this.killerBlocksToolStripMenuItem.Name = "killerBlocksToolStripMenuItem"; - this.killerBlocksToolStripMenuItem.Size = new System.Drawing.Size(150, 22); - this.killerBlocksToolStripMenuItem.Text = "Killer Blocks"; - this.killerBlocksToolStripMenuItem.Click += new System.EventHandler(this.killerBlocksToolStripMenuItem_Click); - // - // rPChatToolStripMenuItem - // - this.rPChatToolStripMenuItem.Name = "rPChatToolStripMenuItem"; - this.rPChatToolStripMenuItem.Size = new System.Drawing.Size(150, 22); - this.rPChatToolStripMenuItem.Text = "RP Chat"; - this.rPChatToolStripMenuItem.Click += new System.EventHandler(this.rPChatToolStripMenuItem_Click); - // - // saveToolStripMenuItem - // - this.saveToolStripMenuItem.Name = "saveToolStripMenuItem"; - this.saveToolStripMenuItem.Size = new System.Drawing.Size(116, 22); - this.saveToolStripMenuItem.Text = "Save"; - this.saveToolStripMenuItem.Click += new System.EventHandler(this.saveToolStripMenuItem_Click); - // // groupBox6 // this.groupBox6.Controls.Add(this.liMaps); - this.groupBox6.Location = new System.Drawing.Point(109, 3); + this.groupBox6.Location = new System.Drawing.Point(427, 32); this.groupBox6.Name = "groupBox6"; - this.groupBox6.Size = new System.Drawing.Size(455, 251); + this.groupBox6.Size = new System.Drawing.Size(137, 447); this.groupBox6.TabIndex = 41; this.groupBox6.TabStop = false; this.groupBox6.Text = "Loaded"; // // liMaps // - this.liMaps.ContextMenuStrip = this.mapsStrip; this.liMaps.Font = new System.Drawing.Font("Calibri", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.liMaps.FormattingEnabled = true; this.liMaps.Location = new System.Drawing.Point(6, 20); this.liMaps.Name = "liMaps"; this.liMaps.ScrollAlwaysVisible = true; - this.liMaps.Size = new System.Drawing.Size(443, 225); + this.liMaps.Size = new System.Drawing.Size(125, 420); this.liMaps.TabIndex = 36; this.liMaps.SelectedIndexChanged += new System.EventHandler(this.liMaps_SelectedIndexChanged); // - // txtLevelPath - // - this.txtLevelPath.Location = new System.Drawing.Point(206, 262); - this.txtLevelPath.Name = "txtLevelPath"; - this.txtLevelPath.ReadOnly = true; - this.txtLevelPath.Size = new System.Drawing.Size(352, 21); - this.txtLevelPath.TabIndex = 40; - this.txtLevelPath.TextAlign = System.Windows.Forms.HorizontalAlignment.Right; + // btnUnloadLevel // - // button3 - // - this.button3.Location = new System.Drawing.Point(115, 260); - this.button3.Name = "button3"; - this.button3.Size = new System.Drawing.Size(85, 23); - this.button3.TabIndex = 39; - this.button3.Text = "← Unload"; - this.button3.UseVisualStyleBackColor = true; + this.btnUnloadLevel.Location = new System.Drawing.Point(433, 3); + this.btnUnloadLevel.Name = "btnUnloadLevel"; + this.btnUnloadLevel.Size = new System.Drawing.Size(125, 23); + this.btnUnloadLevel.TabIndex = 39; + this.btnUnloadLevel.Text = "← Unload"; + this.btnUnloadLevel.UseVisualStyleBackColor = true; + this.btnUnloadLevel.Click += new System.EventHandler(this.btnUnloadLevel_Click); // // btnLoadLevel // - this.btnLoadLevel.Enabled = false; - this.btnLoadLevel.Location = new System.Drawing.Point(11, 260); + this.btnLoadLevel.Location = new System.Drawing.Point(9, 3); this.btnLoadLevel.Name = "btnLoadLevel"; - this.btnLoadLevel.Size = new System.Drawing.Size(86, 23); + this.btnLoadLevel.Size = new System.Drawing.Size(125, 23); this.btnLoadLevel.TabIndex = 38; this.btnLoadLevel.Text = "Load →"; this.btnLoadLevel.UseVisualStyleBackColor = true; + this.btnLoadLevel.Click += new System.EventHandler(this.btnLoadLevel_Click); // // tpChangelog // this.tpChangelog.BackColor = System.Drawing.Color.Transparent; + this.tpChangelog.Controls.Add(this.txtLatestVersion); + this.tpChangelog.Controls.Add(this.label2); this.tpChangelog.Controls.Add(this.txtCurrentVersion); this.tpChangelog.Controls.Add(this.label3); this.tpChangelog.Controls.Add(this.btnChangelog); @@ -863,6 +1294,26 @@ private void InitializeComponent() this.tpChangelog.TabIndex = 1; this.tpChangelog.Text = "Changelog"; // + // txtLatestVersion + // + this.txtLatestVersion.BackColor = System.Drawing.SystemColors.Window; + this.txtLatestVersion.ForeColor = System.Drawing.Color.Green; + this.txtLatestVersion.Location = new System.Drawing.Point(287, 8); + this.txtLatestVersion.Name = "txtLatestVersion"; + this.txtLatestVersion.ReadOnly = true; + this.txtLatestVersion.Size = new System.Drawing.Size(94, 21); + this.txtLatestVersion.TabIndex = 6; + this.txtLatestVersion.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(204, 11); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(77, 13); + this.label2.TabIndex = 5; + this.label2.Text = "Latest Version:"; + // // txtCurrentVersion // this.txtCurrentVersion.BackColor = System.Drawing.SystemColors.Window; @@ -871,6 +1322,7 @@ private void InitializeComponent() this.txtCurrentVersion.ReadOnly = true; this.txtCurrentVersion.Size = new System.Drawing.Size(94, 21); this.txtCurrentVersion.TabIndex = 4; + this.txtCurrentVersion.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; // // label3 // @@ -980,10 +1432,345 @@ private void InitializeComponent() // tabPage3 // this.tabPage3.BackColor = System.Drawing.SystemColors.Control; + this.tabPage3.Controls.Add(this.lblUrl); + this.tabPage3.Controls.Add(this.groupBox13); + this.tabPage3.Controls.Add(this.groupBox12); + this.tabPage3.Controls.Add(this.groupBox11); + this.tabPage3.Controls.Add(this.groupBox10); this.tabPage3.Location = new System.Drawing.Point(4, 22); this.tabPage3.Name = "tabPage3"; this.tabPage3.Size = new System.Drawing.Size(573, 488); this.tabPage3.TabIndex = 7; + this.tabPage3.Text = "Info"; + // + // lblUrl + // + this.lblUrl.AutoSize = true; + this.lblUrl.ForeColor = System.Drawing.SystemColors.ControlDark; + this.lblUrl.Location = new System.Drawing.Point(7, 445); + this.lblUrl.Name = "lblUrl"; + this.lblUrl.Size = new System.Drawing.Size(31, 13); + this.lblUrl.TabIndex = 0; + this.lblUrl.Text = "(URL)"; + this.lblUrl.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // groupBox13 + // + this.groupBox13.Controls.Add(this.label20); + this.groupBox13.Controls.Add(this.linkLabel9); + this.groupBox13.Controls.Add(this.linkLabel5); + this.groupBox13.Controls.Add(this.linkLabel4); + this.groupBox13.Controls.Add(this.linkLabel10); + this.groupBox13.Controls.Add(this.label8); + this.groupBox13.Controls.Add(this.linkLabel6); + this.groupBox13.Controls.Add(this.label7); + this.groupBox13.Controls.Add(this.label6); + this.groupBox13.Controls.Add(this.linkLabel1); + this.groupBox13.Controls.Add(this.label5); + this.groupBox13.Location = new System.Drawing.Point(7, 452); + this.groupBox13.Name = "groupBox13"; + this.groupBox13.Size = new System.Drawing.Size(556, 33); + this.groupBox13.TabIndex = 3; + this.groupBox13.TabStop = false; + // + // label20 + // + this.label20.AutoSize = true; + this.label20.Location = new System.Drawing.Point(484, 14); + this.label20.Name = "label20"; + this.label20.Size = new System.Drawing.Size(12, 13); + this.label20.TabIndex = 8; + this.label20.Text = "|"; + // + // linkLabel9 + // + this.linkLabel9.AccessibleDescription = "https://github.com/727021/MCSong"; + this.linkLabel9.AutoSize = true; + this.linkLabel9.Location = new System.Drawing.Point(224, 14); + this.linkLabel9.Name = "linkLabel9"; + this.linkLabel9.Size = new System.Drawing.Size(65, 13); + this.linkLabel9.TabIndex = 4; + this.linkLabel9.TabStop = true; + this.linkLabel9.Text = "Source Code"; + this.linkLabel9.Click += new System.EventHandler(this.linkLabels_Click); + this.linkLabel9.MouseEnter += new System.EventHandler(this.linkLabels_MouseEnter); + this.linkLabel9.MouseLeave += new System.EventHandler(this.linkLabels_MouseLeave); + // + // linkLabel5 + // + this.linkLabel5.AccessibleDescription = "http://dev.mysql.com/downloads/windows/installer/"; + this.linkLabel5.AutoSize = true; + this.linkLabel5.Location = new System.Drawing.Point(502, 14); + this.linkLabel5.Name = "linkLabel5"; + this.linkLabel5.Size = new System.Drawing.Size(38, 13); + this.linkLabel5.TabIndex = 0; + this.linkLabel5.TabStop = true; + this.linkLabel5.Text = "MySQL"; + this.linkLabel5.Click += new System.EventHandler(this.linkLabels_Click); + this.linkLabel5.MouseEnter += new System.EventHandler(this.linkLabels_MouseEnter); + this.linkLabel5.MouseLeave += new System.EventHandler(this.linkLabels_MouseLeave); + // + // linkLabel4 + // + this.linkLabel4.AccessibleDescription = "http://www.classicube.net/"; + this.linkLabel4.AutoSize = true; + this.linkLabel4.Location = new System.Drawing.Point(419, 14); + this.linkLabel4.Name = "linkLabel4"; + this.linkLabel4.Size = new System.Drawing.Size(59, 13); + this.linkLabel4.TabIndex = 0; + this.linkLabel4.TabStop = true; + this.linkLabel4.Text = "ClassiCube"; + this.linkLabel4.Click += new System.EventHandler(this.linkLabels_Click); + this.linkLabel4.MouseEnter += new System.EventHandler(this.linkLabels_MouseEnter); + this.linkLabel4.MouseLeave += new System.EventHandler(this.linkLabels_MouseLeave); + // + // linkLabel10 + // + this.linkLabel10.AccessibleDescription = "http://mcsong.x10.mx/remote/"; + this.linkLabel10.AutoSize = true; + this.linkLabel10.Location = new System.Drawing.Point(116, 14); + this.linkLabel10.Name = "linkLabel10"; + this.linkLabel10.Size = new System.Drawing.Size(84, 13); + this.linkLabel10.TabIndex = 5; + this.linkLabel10.TabStop = true; + this.linkLabel10.Text = "Remote Console"; + this.linkLabel10.Click += new System.EventHandler(this.linkLabels_Click); + this.linkLabel10.MouseEnter += new System.EventHandler(this.linkLabels_MouseEnter); + this.linkLabel10.MouseLeave += new System.EventHandler(this.linkLabels_MouseLeave); + // + // label8 + // + this.label8.AutoSize = true; + this.label8.Location = new System.Drawing.Point(401, 14); + this.label8.Name = "label8"; + this.label8.Size = new System.Drawing.Size(12, 13); + this.label8.TabIndex = 7; + this.label8.Text = "|"; + // + // linkLabel6 + // + this.linkLabel6.AccessibleDescription = "http://portforward.com/english/routers/port_forwarding/routerindex.htm"; + this.linkLabel6.AutoSize = true; + this.linkLabel6.Location = new System.Drawing.Point(313, 14); + this.linkLabel6.Name = "linkLabel6"; + this.linkLabel6.Size = new System.Drawing.Size(82, 13); + this.linkLabel6.TabIndex = 1; + this.linkLabel6.TabStop = true; + this.linkLabel6.Text = "Port Forwarding"; + this.linkLabel6.Click += new System.EventHandler(this.linkLabels_Click); + this.linkLabel6.MouseEnter += new System.EventHandler(this.linkLabels_MouseEnter); + this.linkLabel6.MouseLeave += new System.EventHandler(this.linkLabels_MouseLeave); + // + // label7 + // + this.label7.AutoSize = true; + this.label7.Location = new System.Drawing.Point(295, 14); + this.label7.Name = "label7"; + this.label7.Size = new System.Drawing.Size(12, 13); + this.label7.TabIndex = 5; + this.label7.Text = "|"; + // + // label6 + // + this.label6.AutoSize = true; + this.label6.Location = new System.Drawing.Point(206, 14); + this.label6.Name = "label6"; + this.label6.Size = new System.Drawing.Size(12, 13); + this.label6.TabIndex = 3; + this.label6.Text = "|"; + // + // linkLabel1 + // + this.linkLabel1.AccessibleDescription = "http://mcsong.x10.mx"; + this.linkLabel1.AutoSize = true; + this.linkLabel1.Location = new System.Drawing.Point(6, 14); + this.linkLabel1.Name = "linkLabel1"; + this.linkLabel1.Size = new System.Drawing.Size(86, 13); + this.linkLabel1.TabIndex = 2; + this.linkLabel1.TabStop = true; + this.linkLabel1.Text = "MCSong Website"; + this.linkLabel1.Click += new System.EventHandler(this.linkLabels_Click); + this.linkLabel1.MouseEnter += new System.EventHandler(this.linkLabels_MouseEnter); + this.linkLabel1.MouseLeave += new System.EventHandler(this.linkLabels_MouseLeave); + // + // label5 + // + this.label5.AutoSize = true; + this.label5.Location = new System.Drawing.Point(98, 14); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(12, 13); + this.label5.TabIndex = 1; + this.label5.Text = "|"; + // + // groupBox12 + // + this.groupBox12.Controls.Add(this.textBox1); + this.groupBox12.Location = new System.Drawing.Point(368, 197); + this.groupBox12.Name = "groupBox12"; + this.groupBox12.Size = new System.Drawing.Size(195, 249); + this.groupBox12.TabIndex = 2; + this.groupBox12.TabStop = false; + this.groupBox12.Text = "About MCSong"; + // + // textBox1 + // + this.textBox1.BackColor = System.Drawing.SystemColors.ControlLightLight; + this.textBox1.Dock = System.Windows.Forms.DockStyle.Fill; + this.textBox1.Location = new System.Drawing.Point(3, 17); + this.textBox1.Multiline = true; + this.textBox1.Name = "textBox1"; + this.textBox1.ReadOnly = true; + this.textBox1.Size = new System.Drawing.Size(189, 229); + this.textBox1.TabIndex = 0; + this.textBox1.Text = resources.GetString("textBox1.Text"); + // + // groupBox11 + // + this.groupBox11.Controls.Add(this.txtDevList); + this.groupBox11.Location = new System.Drawing.Point(368, 3); + this.groupBox11.Name = "groupBox11"; + this.groupBox11.Size = new System.Drawing.Size(195, 191); + this.groupBox11.TabIndex = 1; + this.groupBox11.TabStop = false; + this.groupBox11.Text = "MCSong Development Team"; + // + // txtDevList + // + this.txtDevList.BackColor = System.Drawing.SystemColors.Window; + this.txtDevList.Cursor = System.Windows.Forms.Cursors.Default; + this.txtDevList.Dock = System.Windows.Forms.DockStyle.Fill; + this.txtDevList.Location = new System.Drawing.Point(3, 17); + this.txtDevList.Multiline = true; + this.txtDevList.Name = "txtDevList"; + this.txtDevList.ReadOnly = true; + this.txtDevList.Size = new System.Drawing.Size(189, 171); + this.txtDevList.TabIndex = 0; + this.txtDevList.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; + this.txtDevList.GotFocus += new System.EventHandler(this.txtDevList_Focus); + // + // groupBox10 + // + this.groupBox10.Controls.Add(this.lblStartingCounters); + this.groupBox10.Controls.Add(this.button3); + this.groupBox10.Controls.Add(this.groupBox17); + this.groupBox10.Controls.Add(this.txtThreads); + this.groupBox10.Controls.Add(this.txtMemory); + this.groupBox10.Controls.Add(this.txtCpu); + this.groupBox10.Controls.Add(this.txtUptime); + this.groupBox10.Controls.Add(this.label19); + this.groupBox10.Controls.Add(this.label18); + this.groupBox10.Controls.Add(this.label17); + this.groupBox10.Controls.Add(this.label16); + this.groupBox10.Location = new System.Drawing.Point(7, 3); + this.groupBox10.Name = "groupBox10"; + this.groupBox10.Size = new System.Drawing.Size(355, 443); + this.groupBox10.TabIndex = 0; + this.groupBox10.TabStop = false; + this.groupBox10.Text = "Server Statistics"; + // + // lblStartingCounters + // + this.lblStartingCounters.AutoSize = true; + this.lblStartingCounters.Location = new System.Drawing.Point(190, 18); + this.lblStartingCounters.Name = "lblStartingCounters"; + this.lblStartingCounters.Size = new System.Drawing.Size(151, 13); + this.lblStartingCounters.TabIndex = 10; + this.lblStartingCounters.Text = "STARTING PROCESS COUNTERS..."; + this.lblStartingCounters.Visible = false; + // + // button3 + // + this.button3.Location = new System.Drawing.Point(204, 13); + this.button3.Name = "button3"; + this.button3.Size = new System.Drawing.Size(137, 23); + this.button3.TabIndex = 9; + this.button3.Text = "START PROCESS COUNTERS"; + this.button3.UseVisualStyleBackColor = true; + this.button3.Click += new System.EventHandler(this.button3_Click); + // + // groupBox17 + // + this.groupBox17.Location = new System.Drawing.Point(6, 160); + this.groupBox17.Name = "groupBox17"; + this.groupBox17.Size = new System.Drawing.Size(346, 10); + this.groupBox17.TabIndex = 8; + this.groupBox17.TabStop = false; + // + // txtThreads + // + this.txtThreads.Font = new System.Drawing.Font("Calibri", 12F); + this.txtThreads.Location = new System.Drawing.Point(285, 127); + this.txtThreads.Name = "txtThreads"; + this.txtThreads.ReadOnly = true; + this.txtThreads.Size = new System.Drawing.Size(56, 27); + this.txtThreads.TabIndex = 7; + // + // txtMemory + // + this.txtMemory.Font = new System.Drawing.Font("Calibri", 12F); + this.txtMemory.Location = new System.Drawing.Point(123, 127); + this.txtMemory.Name = "txtMemory"; + this.txtMemory.ReadOnly = true; + this.txtMemory.Size = new System.Drawing.Size(85, 27); + this.txtMemory.TabIndex = 6; + // + // txtCpu + // + this.txtCpu.Font = new System.Drawing.Font("Calibri", 12F); + this.txtCpu.Location = new System.Drawing.Point(10, 94); + this.txtCpu.Name = "txtCpu"; + this.txtCpu.ReadOnly = true; + this.txtCpu.Size = new System.Drawing.Size(331, 27); + this.txtCpu.TabIndex = 5; + // + // txtUptime + // + this.txtUptime.Font = new System.Drawing.Font("Calibri", 12F); + this.txtUptime.Location = new System.Drawing.Point(10, 42); + this.txtUptime.Name = "txtUptime"; + this.txtUptime.ReadOnly = true; + this.txtUptime.Size = new System.Drawing.Size(331, 27); + this.txtUptime.TabIndex = 4; + // + // label19 + // + this.label19.AutoSize = true; + this.label19.Font = new System.Drawing.Font("Calibri", 12F); + this.label19.Location = new System.Drawing.Point(214, 130); + this.label19.Name = "label19"; + this.label19.Size = new System.Drawing.Size(65, 19); + this.label19.TabIndex = 3; + this.label19.Text = "Threads:"; + // + // label18 + // + this.label18.AutoSize = true; + this.label18.Font = new System.Drawing.Font("Calibri", 12F); + this.label18.Location = new System.Drawing.Point(6, 72); + this.label18.Name = "label18"; + this.label18.Size = new System.Drawing.Size(191, 19); + this.label18.TabIndex = 2; + this.label18.Text = "CPU Usage (MCSong/Total):"; + // + // label17 + // + this.label17.AutoSize = true; + this.label17.Font = new System.Drawing.Font("Calibri", 12F); + this.label17.Location = new System.Drawing.Point(6, 130); + this.label17.Name = "label17"; + this.label17.Size = new System.Drawing.Size(111, 19); + this.label17.TabIndex = 1; + this.label17.Text = "Memory Usage:"; + // + // label16 + // + this.label16.AutoSize = true; + this.label16.Font = new System.Drawing.Font("Calibri", 12F); + this.label16.Location = new System.Drawing.Point(6, 20); + this.label16.Name = "label16"; + this.label16.Size = new System.Drawing.Size(60, 19); + this.label16.TabIndex = 0; + this.label16.Text = "Uptime:"; // // tmrRestart // @@ -1012,6 +1799,25 @@ private void InitializeComponent() this.shutdownServer.Text = "Shutdown Server"; this.shutdownServer.Click += new System.EventHandler(this.shutdownServer_Click); // + // btnEnvColors + // + this.btnEnvColors.Location = new System.Drawing.Point(7, 230); + this.btnEnvColors.Name = "btnEnvColors"; + this.btnEnvColors.Size = new System.Drawing.Size(127, 23); + this.btnEnvColors.TabIndex = 31; + this.btnEnvColors.Text = "Environment Colors"; + this.btnEnvColors.UseVisualStyleBackColor = true; + this.btnEnvColors.Click += new System.EventHandler(this.button7_Click); + // + // button8 + // + this.button8.Enabled = false; + this.button8.Location = new System.Drawing.Point(142, 230); + this.button8.Name = "button8"; + this.button8.Size = new System.Drawing.Size(127, 23); + this.button8.TabIndex = 32; + this.button8.UseVisualStyleBackColor = true; + // // Window // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); @@ -1035,16 +1841,25 @@ private void InitializeComponent() this.gBCommands.PerformLayout(); this.gBChat.ResumeLayout(false); this.gBChat.PerformLayout(); + this.tabPage2.ResumeLayout(false); + this.tableLayoutPanel3.ResumeLayout(false); + this.groupBox14.ResumeLayout(false); + this.groupBox14.PerformLayout(); + this.groupBox15.ResumeLayout(false); + this.groupBox15.PerformLayout(); + this.groupBox16.ResumeLayout(false); + this.groupBox16.PerformLayout(); this.tpPlayers.ResumeLayout(false); this.panel1.ResumeLayout(false); this.panel1.PerformLayout(); this.tableLayoutPanel1.ResumeLayout(false); - this.playerStrip.ResumeLayout(false); this.tpLevels.ResumeLayout(false); this.panel2.ResumeLayout(false); - this.panel2.PerformLayout(); + this.gbMapViewer.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.pbMapViewer)).EndInit(); + this.groupBox8.ResumeLayout(false); + this.groupBox8.PerformLayout(); this.groupBox7.ResumeLayout(false); - this.mapsStrip.ResumeLayout(false); this.groupBox6.ResumeLayout(false); this.tpChangelog.ResumeLayout(false); this.tpChangelog.PerformLayout(); @@ -1054,6 +1869,16 @@ private void InitializeComponent() this.groupBox1.PerformLayout(); this.gbErrors.ResumeLayout(false); this.gbErrors.PerformLayout(); + this.tabPage3.ResumeLayout(false); + this.tabPage3.PerformLayout(); + this.groupBox13.ResumeLayout(false); + this.groupBox13.PerformLayout(); + this.groupBox12.ResumeLayout(false); + this.groupBox12.PerformLayout(); + this.groupBox11.ResumeLayout(false); + this.groupBox11.PerformLayout(); + this.groupBox10.ResumeLayout(false); + this.groupBox10.PerformLayout(); this.iconContext.ResumeLayout(false); this.ResumeLayout(false); @@ -1081,28 +1906,6 @@ private void InitializeComponent() private ToolStripMenuItem shutdownServer; private TabPage tpLogs; private TextBox txtHost; - private ContextMenuStrip playerStrip; - private ToolStripMenuItem whoisToolStripMenuItem; - private ToolStripMenuItem kickToolStripMenuItem; - private ToolStripMenuItem banToolStripMenuItem; - private ToolStripMenuItem voiceToolStripMenuItem; - private ContextMenuStrip mapsStrip; - private ToolStripMenuItem physicsToolStripMenuItem; - private ToolStripMenuItem toolStripMenuItem2; - private ToolStripMenuItem toolStripMenuItem3; - private ToolStripMenuItem toolStripMenuItem4; - private ToolStripMenuItem toolStripMenuItem5; - private ToolStripMenuItem toolStripMenuItem6; - private ToolStripMenuItem unloadToolStripMenuItem; - private ToolStripMenuItem settingsToolStripMenuItem; - private ToolStripMenuItem finiteModeToolStripMenuItem; - private ToolStripMenuItem animalAIToolStripMenuItem; - private ToolStripMenuItem edgeWaterToolStripMenuItem; - private ToolStripMenuItem growingGrassToolStripMenuItem; - private ToolStripMenuItem survivalDeathToolStripMenuItem; - private ToolStripMenuItem killerBlocksToolStripMenuItem; - private ToolStripMenuItem rPChatToolStripMenuItem; - private ToolStripMenuItem saveToolStripMenuItem; private TableLayoutPanel tableLayoutPanel2; private GroupBox groupBox1; private TextBox txtSystem; @@ -1119,7 +1922,7 @@ private void InitializeComponent() private Button btnRestart; private Label label1; internal CheckBox chkMaintenance; - private Label label2; + private Label lblCopyright; private GroupBox groupBox3; private Panel panel1; private TabPage tpLevels; @@ -1130,8 +1933,7 @@ private void InitializeComponent() private TableLayoutPanel tableLayoutPanel1; private Button btnLoadLevel; private ListBox liUnloaded; - private TextBox txtLevelPath; - private Button button3; + private Button btnUnloadLevel; private GroupBox groupBox8; private GroupBox groupBox7; private GroupBox groupBox6; @@ -1144,5 +1946,85 @@ private void InitializeComponent() private Button button6; private TabPage tabPage2; private TabPage tabPage3; + private Button btnPlay; + private GroupBox groupBox13; + private LinkLabel linkLabel4; + private Label label8; + private Label label7; + private Label label6; + private LinkLabel linkLabel1; + private Label label5; + private GroupBox groupBox12; + private LinkLabel linkLabel9; + private LinkLabel linkLabel6; + private LinkLabel linkLabel5; + private GroupBox groupBox11; + private GroupBox groupBox10; + private TextBox txtDevList; + private LinkLabel linkLabel10; + private TableLayoutPanel tableLayoutPanel3; + private GroupBox groupBox14; + private TextBox txtAdminOut; + private Button btnAdminChat; + private TextBox txtAdminIn; + private GroupBox groupBox15; + private TextBox txtOpOut; + private Button btnOpChat; + private TextBox txtOpIn; + private GroupBox groupBox16; + private TextBox txtGlobalOut; + private Button btnGlobalChat; + private TextBox txtGlobalIn; + private TextBox txtLatestVersion; + private Label label2; + private Button btnUpdateLevel; + private TextBox txtLevelMotd; + private Label label9; + private ComboBox cmbLevelPhys; + private Label label13; + private TextBox txtLevelY; + private Label label12; + private TextBox txtLevelZ; + private Label label11; + private TextBox txtLevelX; + private Label label10; + private GroupBox gbMapViewer; + private PictureBox pbMapViewer; + private Button btnBackupManager; + private Button btnDeleteLevel; + private Button btnRenameLevel; + private Label lblUrl; + private Label label14; + private ComboBox cmbPerVisit; + private ComboBox cmbPerBuild; + private Label label15; + private Button btnSaveImage; + private GroupBox groupBox17; + private TextBox txtThreads; + private TextBox txtMemory; + private TextBox txtCpu; + private TextBox txtUptime; + private Label label19; + private Label label18; + private Label label17; + private Label label16; + private Button btnLevelHacks; + private Button button3; + private Label lblStartingCounters; + private Label label20; + private TextBox textBox1; + private Button btnNewLevel; + private CheckBox chkGrassGrowing; + private GroupBox groupBox18; + private CheckBox chkAutoLoad; + private CheckBox chkAutoUnload; + private CheckBox chkEdgeWater; + private CheckBox chkFiniteMode; + private CheckBox chkLevelChat; + private CheckBox chkSurvivalDeath; + private CheckBox chkAnimalAi; + private CheckBox chkKillerBlocks; + private Button button8; + private Button btnEnvColors; } } \ No newline at end of file diff --git a/MCSong/GUI/Window.cs b/MCSong/GUI/Window.cs index ff7603e..a141670 100644 --- a/MCSong/GUI/Window.cs +++ b/MCSong/GUI/Window.cs @@ -24,6 +24,7 @@ permissions and limitations under the License. using System.Text.RegularExpressions; using System.Net; using MCSong; +using System.Diagnostics; namespace MCSong.Gui { @@ -32,10 +33,10 @@ public partial class Window : Form Regex regex = new Regex(@"^([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(\." + "([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}$"); // for cross thread use - delegate void StringCallback(string s); - delegate void PlayerListCallback(List players); - delegate void ReportCallback(Report r); - delegate void VoidDelegate(); + //delegate void StringCallback(string s); + //delegate void PlayerListCallback(List players); + //delegate void ReportCallback(Report r); + //delegate void VoidDelegate(); public static event EventHandler Minimize; public NotifyIcon notifyIcon1 = new NotifyIcon(); @@ -44,6 +45,18 @@ public partial class Window : Form internal static Server s; bool shuttingDown = false; + + private const int CP_NOCLOSE_BUTTON = 0x200; + protected override CreateParams CreateParams + { + get + { + CreateParams myCp = base.CreateParams; + myCp.ClassStyle |= CP_NOCLOSE_BUTTON; + return myCp; + } + } + public Window() { InitializeComponent(); } @@ -73,18 +86,28 @@ private void Window_Minimize(object sender, EventArgs e) public static Window thisWindow; - private void Window_Load(object sender, EventArgs e) { + private void Window_Load(object sender, EventArgs e) + { thisWindow = this; MaximizeBox = false; this.Text = ""; this.Icon = new Icon(System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream("MCSong.Lawl.ico")); + CheckForIllegalCrossThreadCalls = false; + + lblCopyright.Text += DateTime.Today.Year.ToString(); + txtGlobalOut.Enabled = txtGlobalIn.Enabled = btnGlobalChat.Enabled = Server.gc; + lblUrl.Text = ""; + this.Show(); this.BringToFront(); WindowState = FormWindowState.Normal; s = new Server(); s.OnLog += WriteLine; + s.OnOp += WriteLineOp; + s.OnAdmin += WriteLineAdmin; + s.OnGlobal += WriteLineGlobal; s.OnCommand += newCommand; s.OnError += newError; s.OnSystem += newSystem; @@ -103,51 +126,82 @@ private void Window_Load(object sender, EventArgs e) { this.notifyIcon1.ContextMenuStrip = this.iconContext; this.notifyIcon1.Icon = this.Icon; this.notifyIcon1.Visible = true; - this.notifyIcon1.MouseClick += new System.Windows.Forms.MouseEventHandler(this.notifyIcon1_MouseClick); + notifyIcon1.MouseClick += new System.Windows.Forms.MouseEventHandler(this.notifyIcon1_MouseClick); - System.Timers.Timer MapTimer = new System.Timers.Timer(10000); + /*System.Timers.Timer MapTimer = new System.Timers.Timer(10000); MapTimer.Elapsed += delegate { UpdateMapList("'"); - }; MapTimer.Start(); + }; MapTimer.Start();*/ - //if (File.Exists(Logger.ErrorLogPath)) - //txtErrors.Lines = File.ReadAllLines(Logger.ErrorLogPath); - try + // Update the list on load, unload, and physchange + Level.OnLevelLoadEvent += UpdateMapList; + Level.OnLevelUnloadEvent += UpdateMapList; + Level.OnLevelPhysChangeEvent += UpdateMapsTab; + + foreach (Group g in Group.GroupList) { - if (File.Exists("extra/Changelog.txt")) - { - File.Delete("extra/Changelog.txt"); - } - WebClient Web = new WebClient(); - Web.DownloadFile("http://updates.mcsong.x10.mx/changelog.txt", "extra/Changelog.txt"); - Web.Dispose(); + cmbPerBuild.Items.Add(g.name); + cmbPerVisit.Items.Add(g.name); } - catch { } - if (File.Exists("extra/Changelog.txt")) + + //if (File.Exists(Logger.ErrorLogPath)) + //txtErrors.Lines = File.ReadAllLines(Logger.ErrorLogPath); + + new Thread((ThreadStart)(() => { - txtChangelog.Text = "Changelog for " + Server.Version + ":"; - foreach (string line in File.ReadAllLines(("extra/Changelog.txt"))) + thisWindow.Invoke(new Action(delegate { - txtChangelog.AppendText("\r\n " + line); + txtChangelog.Text = "\r\nLoading..."; + })); + try + { + if (File.Exists("extra/Changelog.txt")) + { + File.Delete("extra/Changelog.txt"); + } + WebClient Web = new WebClient(); + Web.DownloadFile("https://raw.githubusercontent.com/727021/MCSong/master/Text/Changelog.txt", "extra/Changelog.txt"); + Web.Dispose(); } - } - else - { - txtChangelog.Text = "Changelog for " + Server.Version + "\r\n\r\nChangelog not found!\r\nDownload it manually from http://updates.mcsong.x10.mx/changelog.txt and save it as \'extra/Changelog.txt\'"; - } - txtCurrentVersion.Text = Server.Version; + catch { } + string latest = ""; + try { latest = new WebClient().DownloadString("http://updates.mcsong.x10.mx/curversion.txt"); } + catch { } + + thisWindow.Invoke(new Action(delegate + { + try + { + txtChangelog.Clear(); + foreach (string line in File.ReadAllLines(("extra/Changelog.txt"))) + { + txtChangelog.AppendText("\r\n " + line); + } + } + catch + { + txtChangelog.Text = "\r\nChangelog not found!\r\nDownload it manually from https://raw.githubusercontent.com/727021/MCSong/master/Text/Changelog.txt and save it as \'extra/Changelog.txt\'"; + } + txtCurrentVersion.Text = Server.Version; + txtLatestVersion.Text = latest; + txtLatestVersion.Enabled = (latest != ""); + if (txtLatestVersion.Enabled) + txtCurrentVersion.ForeColor = (txtCurrentVersion.Text == txtLatestVersion.Text) ? Color.Green : Color.Red; + })); + + })).Start(); + + + Server.devs.ForEach(delegate(string dev) { txtDevList.Text += (Environment.NewLine + dev); }); } void SettingsUpdate() { if (shuttingDown) return; - if (txtLog.InvokeRequired) + Invoke(new Action(delegate { - VoidDelegate d = new VoidDelegate(SettingsUpdate); - this.Invoke(d); - } else { this.Text = Server.name + " - MCSong Version: " + Server.Version; - } + })); } void HeartBeatFail() { @@ -158,53 +212,38 @@ void newError(string message) { try { - if (txtErrors.InvokeRequired) - { - LogDelegate d = new LogDelegate(newError); - this.Invoke(d, new object[] { message }); - } - else + Invoke(new Action(delegate { txtErrors.AppendText(Environment.NewLine + message); - txtErrors.SelectionStart = txtErrors.Text.Length; - txtErrors.ScrollToCaret(); - } - } catch { } + txtErrors.Select(txtErrors.MaxLength, 0); + })); + } + catch { } } void newSystem(string message) { try { - if (txtSystem.InvokeRequired) - { - LogDelegate d = new LogDelegate(newSystem); - this.Invoke(d, new object[] { message }); - } - else + Invoke(new Action(delegate { txtSystem.AppendText(Environment.NewLine + message); - txtSystem.SelectionStart = txtSystem.Text.Length; - txtSystem.ScrollToCaret(); - } - } catch { } + txtSystem.Select(txtSystem.Text.Length, 0); + })); + } + catch { } } - - delegate void LogDelegate(string message); - + /// /// Does the same as Console.Write() only in the form /// /// The string to write public void Write(string s) { if (shuttingDown) return; - if (txtLog.InvokeRequired) { - LogDelegate d = new LogDelegate(Write); - this.Invoke(d, new object[] { s }); - } else { + Invoke(new Action(delegate + { txtLog.AppendText(s); - txtLog.SelectionStart = txtLog.Text.Length; - txtLog.ScrollToCaret(); - } + txtLog.Select(txtLog.Text.Length, 0); + })); } /// /// Does the same as Console.WriteLine() only in the form @@ -213,46 +252,75 @@ public void Write(string s) { public void WriteLine(string s) { if (shuttingDown) return; - if (this.InvokeRequired) { - LogDelegate d = new LogDelegate(WriteLine); - this.Invoke(d, new object[] { s }); - } else { - txtLog.AppendText("\r\n" + s); - txtLog.SelectionStart = txtLog.Text.Length; - txtLog.ScrollToCaret(); - } + Invoke(new Action(delegate + { + txtLog.AppendText(s + "\r\n"); + txtLog.Select(txtLog.Text.Length, 0); + })); + } + public void WriteLineOp(string s) + { + if (shuttingDown) return; + Invoke(new Action(delegate + { + txtOpOut.AppendText(s + "\r\n"); + txtOpOut.Select(txtOpOut.Text.Length, 0); + })); + } + public void WriteLineAdmin(string s) + { + if (shuttingDown) return; + Invoke(new Action(delegate + { + txtAdminOut.AppendText(s + "\r\n"); + txtAdminOut.Select(txtAdminOut.Text.Length, 0); + })); + } + public void WriteLineGlobal(string s) + { + if (shuttingDown) return; + Invoke(new Action(delegate + { + txtGlobalOut.AppendText(s + "\r\n"); + txtGlobalOut.Select(txtGlobalOut.Text.Length, 0); + })); } /// /// Updates the list of client names in the window /// /// The list of players to add - public void UpdateClientList(List players) { - if (this.InvokeRequired) { - PlayerListCallback d = new PlayerListCallback(UpdateClientList); - this.Invoke(d, new object[] { players }); - } else { + public void UpdateClientList() { + Invoke(new Action(delegate + { liClients.Items.Clear(); - Player.players.ForEach(delegate(Player p) { liClients.Items.Add(p.name); }); + Player.players.ForEach(delegate (Player p) { liClients.Items.Add(p.name); }); txtPlayerCount.Clear(); txtPlayerCount.Text = Player.players.Count.ToString() + "/"; int guests = 0; - Player.players.ForEach(delegate(Player p) { if (p.group.Permission == LevelPermission.Guest) { guests++; } }); + Player.players.ForEach(delegate (Player p) { if (p.group.Permission == LevelPermission.Guest) { guests++; } }); txtPlayerCount.AppendText(guests.ToString()); - } + })); } - public void UpdateMapList(string blah) { - if (this.InvokeRequired) { - LogDelegate d = new LogDelegate(UpdateMapList); - this.Invoke(d, new object[] { blah }); - } else { + public void UpdateMapList(string mapname = "") { + Invoke(new Action(delegate + { liMaps.Items.Clear(); - foreach (Level level in Server.levels) { + foreach (Level level in Server.levels) + { liMaps.Items.Add(level.name + " - " + level.physics); } liUnloaded.Items.Clear(); - - } + if (Directory.Exists("levels")) + foreach (string f in Directory.GetFiles("levels/", "*.lvl", SearchOption.TopDirectoryOnly)) + { + FileInfo fi = new FileInfo(f); + string n = fi.Name.Replace(fi.Extension, ""); + if (Level.Find(n) == null) + liUnloaded.Items.Add(n); + } + UpdateMapsTab(); + })); } /// @@ -261,48 +329,83 @@ public void UpdateMapList(string blah) { /// The URL to display public void UpdateUrl(string s) { - if (this.InvokeRequired) + Invoke(new Action(delegate { - StringCallback d = new StringCallback(UpdateUrl); - this.Invoke(d, new object[] { s }); - } - else txtUrl.Text = s; + })); } private void Window_FormClosing(object sender, FormClosingEventArgs e) { if (notifyIcon1 != null) { notifyIcon1.Visible = false; } - MCLawl_.Gui.Program.ExitProgram(false); + MCSong_.Gui.Program.ExitProgram(false); } + private ChatBuffer cbInput = new ChatBuffer(); + private void txtInput_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Enter) { - if (txtInput.Text == null || txtInput.Text.Trim()=="") { return; } + if (txtInput.Text == null || txtInput.Text.Trim() == "") { return; } + cbInput.addEntry(txtInput.Text); string text = txtInput.Text.Trim(); string newtext = text; if (txtInput.Text[0] == '#') { newtext = text.Remove(0, 1).Trim(); - Player.GlobalMessageOps("To Ops &f-"+Server.DefaultColor +"Console [&a" + Server.ZallState + Server.DefaultColor + "]&f- " + newtext); - Server.s.Log("(OPs): Console: " + newtext); - IRCBot.Say("Console: " + newtext, true); + cbOpChat.addEntry(newtext); + Player.GlobalMessageOps("To Ops &f-" + Server.DefaultColor + "Console [&a" + Server.ZallState + Server.DefaultColor + "]&f- " + newtext); + Server.s.LogOp("Console: " + newtext); + //IRCBot.Say("Console: " + newtext, true); // WriteLine("(OPs): " + txtInput.Text); txtInput.Clear(); } + else if (txtInput.Text[0] == ';') + { + newtext = text.Remove(0, 1).Trim(); + cbAdminChat.addEntry(newtext); + Player.GlobalMessageAdmins("To Admins &f-" + Server.DefaultColor + "Console [&a" + Server.ZallState + Server.DefaultColor + "]&f- " + newtext); + Server.s.LogAdmin("Console: " + newtext); + //IRCBot.Say("Console: " + newtext, true); + txtInput.Clear(); + } + else if (txtInput.Text[0] == '\\') + { + if (!Server.gc) return; + newtext = text.Remove(0, 1).Trim(); + cbGlobalChat.addEntry(newtext); + Player.GlobalMessageGC(Server.gcColor + "[Global][" + Server.gcNick + "] Console: &f" + newtext); + Server.s.LogGC("[" + Server.gcNick + "] Console: " + newtext); + //GlobalBot.Say("Console: " + newtext); + txtInput.Clear(); + } else { Player.GlobalMessage("Console [&a" + Server.ZallState + Server.DefaultColor + "]: &f" + txtInput.Text); - IRCBot.Say("Console [" + Server.ZallState + "]: " + txtInput.Text); + //IRCBot.Say("Console [" + Server.ZallState + "]: " + txtInput.Text); WriteLine(" " + txtInput.Text); txtInput.Clear(); } } + else if (e.KeyCode == Keys.Up) + { + e.SuppressKeyPress = true; + string up = cbInput.up(); + txtInput.Text = (up == "") ? txtInput.Text : up; + txtInput.Select(txtInput.Text.Length, 0); + } + else if (e.KeyCode == Keys.Down) + { + e.SuppressKeyPress = true; + txtInput.Text = cbInput.down(); + txtInput.Select(txtInput.Text.Length, 0); + } } + private ChatBuffer cbCommands = new ChatBuffer(); + private void txtCommands_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Enter) { string sentCmd = "", sentMsg = ""; @@ -314,6 +417,8 @@ private void txtCommands_KeyDown(object sender, KeyEventArgs e) { return; } + cbCommands.addEntry(txtCommands.Text); + if (txtCommands.Text[0] == '/') if (txtCommands.Text.Length > 1) txtCommands.Text = txtCommands.Text.Substring(1); @@ -327,37 +432,61 @@ private void txtCommands_KeyDown(object sender, KeyEventArgs e) { return; } - try { - Command.all.Find(sentCmd).Use(null, sentMsg); - newCommand("CONSOLE: USED /" + sentCmd + " " + sentMsg); - } catch (Exception ex) { - Server.ErrorLog(ex); - newCommand("CONSOLE: Failed command."); + if (Command.all.Find(sentCmd) == null) + { + newCommand("CONSOLE: Command not found."); + txtCommands.Clear(); + return; + } + + if (Command.all.Find(sentCmd).consoleUsable) + { + try + { + Command.all.Find(sentCmd).Use(null, sentMsg); + newCommand("CONSOLE: USED /" + sentCmd + " " + sentMsg); + } + catch (Exception ex) + { + Server.ErrorLog(ex); + newCommand("CONSOLE: Failed command."); + } + } + else + { + newCommand("CONSOLE: Cannot use /" + sentCmd); } txtCommands.Clear(); } + else if (e.KeyCode == Keys.Up) + { + e.SuppressKeyPress = true; + string up = cbCommands.up(); + txtCommands.Text = (up == "") ? txtCommands.Text : up; + txtCommands.Select(txtCommands.Text.Length, 0); + } + else if (e.KeyCode == Keys.Down) + { + e.SuppressKeyPress = true; + txtCommands.Text = cbCommands.down(); + txtCommands.Select(txtCommands.Text.Length, 0); + } } private void btnClose_Click_1(object sender, EventArgs e) { if (notifyIcon1 != null) { notifyIcon1.Visible = false; } - MCLawl_.Gui.Program.ExitProgram(false); + MCSong_.Gui.Program.ExitProgram(false); } - public void newCommand(string p) { - if (txtCommandsUsed.InvokeRequired) - { - LogDelegate d = new LogDelegate(newCommand); - this.Invoke(d, new object[] { p }); - } - else + public void newCommand(string p) { + Invoke(new Action(delegate { - txtCommandsUsed.AppendText("\r\n" + p); - txtCommandsUsed.SelectionStart = txtCommandsUsed.Text.Length; - txtCommandsUsed.ScrollToCaret(); - } + txtCommandsUsed.AppendText(p + "\r\n"); + txtCommandsUsed.Select(txtCommandsUsed.Text.Length, 0); + })); } void ChangeCheck(string newCheck) @@ -373,18 +502,20 @@ private void txtHost_TextChanged(object sender, EventArgs e) } } - private void btnProperties_Click_1(object sender, EventArgs e) { + private void btnProperties_Click_1(object sender, EventArgs e) + { if (!prevLoaded) { PropertyForm = new PropertyWindow(); prevLoaded = true; } PropertyForm.Show(); + PropertyForm.BringToFront(); } private void btnUpdate_Click_1(object sender, EventArgs e) { - if (!MCLawl_.Gui.Program.CurrentUpdate) - MCLawl_.Gui.Program.UpdateCheck(); + if (!MCSong_.Gui.Program.CurrentUpdate) + MCSong_.Gui.Program.UpdateCheck(); else { Thread messageThread = new Thread(new ThreadStart(delegate { MessageBox.Show("Already checking for updates."); @@ -393,6 +524,7 @@ private void btnUpdate_Click_1(object sender, EventArgs e) { } public static bool prevLoaded = false; + public static bool updLoaded = false; Form PropertyForm; Form UpdateForm; @@ -413,8 +545,13 @@ private void notifyIcon1_MouseClick(object sender, MouseEventArgs e) { private void button1_Click_1(object sender, EventArgs e) { - UpdateForm = new UpdateWindow(); + if (!updLoaded) + { + UpdateForm = new UpdateWindow(); + updLoaded = true; + } UpdateForm.Show(); + UpdateForm.BringToFront(); } private void tmrRestart_Tick(object sender, EventArgs e) @@ -431,7 +568,7 @@ private void tmrRestart_Tick(object sender, EventArgs e) notifyIcon1.Icon = null; notifyIcon1.Visible = false; } - MCLawl_.Gui.Program.ExitProgram(true); + MCSong_.Gui.Program.ExitProgram(true); } } } @@ -453,166 +590,7 @@ private void shutdownServer_Click(object sender, EventArgs e) { notifyIcon1.Visible = false; } - MCLawl_.Gui.Program.ExitProgram(false); - } - - private void voiceToolStripMenuItem_Click(object sender, EventArgs e) - { - if (this.liClients.SelectedIndex != -1) - { - Command.all.Find("voice").Use(null, this.liClients.SelectedItem.ToString()); - } - } - - private void whoisToolStripMenuItem_Click(object sender, EventArgs e) - { - if (this.liClients.SelectedIndex != -1) - { - Command.all.Find("whois").Use(null, this.liClients.SelectedItem.ToString()); - } - } - - private void kickToolStripMenuItem_Click(object sender, EventArgs e) - { - if (this.liClients.SelectedIndex != -1) - { - Command.all.Find("kick").Use(null, this.liClients.SelectedItem.ToString() + " You have been kicked by the console."); - } - } - - - private void banToolStripMenuItem_Click(object sender, EventArgs e) - { - if (this.liClients.SelectedIndex != -1) - { - Command.all.Find("ban").Use(null, this.liClients.SelectedItem.ToString()); - } - } - - private void liClients_MouseDown(object sender, MouseEventArgs e) - { - int i; - i = liClients.IndexFromPoint(e.X, e.Y); - liClients.SelectedIndex = i; - } - - private void toolStripMenuItem2_Click(object sender, EventArgs e) - { - if (this.liMaps.SelectedIndex != -1) - { - Command.all.Find("physics").Use(null, this.liMaps.SelectedItem.ToString().Remove((this.liMaps.SelectedItem.ToString().Length - 4)) + " 0"); - } - } - - private void toolStripMenuItem3_Click(object sender, EventArgs e) - { - if (this.liMaps.SelectedIndex != -1) - { - Command.all.Find("physics").Use(null, this.liMaps.SelectedItem.ToString().Remove((this.liMaps.SelectedItem.ToString().Length - 4)) + " 1"); - } - } - - private void toolStripMenuItem4_Click(object sender, EventArgs e) - { - if (this.liMaps.SelectedIndex != -1) - { - Command.all.Find("physics").Use(null, this.liMaps.SelectedItem.ToString().Remove((this.liMaps.SelectedItem.ToString().Length - 4)) + " 2"); - } - } - - private void toolStripMenuItem5_Click(object sender, EventArgs e) - { - if (this.liMaps.SelectedIndex != -1) - { - Command.all.Find("physics").Use(null, this.liMaps.SelectedItem.ToString().Remove((this.liMaps.SelectedItem.ToString().Length - 4)) + " 3"); - } - } - - private void toolStripMenuItem6_Click(object sender, EventArgs e) - { - if (this.liMaps.SelectedIndex != -1) - { - Command.all.Find("physics").Use(null, this.liMaps.SelectedItem.ToString().Remove((this.liMaps.SelectedItem.ToString().Length - 4)) + " 4"); - } - } - - private void unloadToolStripMenuItem_Click(object sender, EventArgs e) - { - if (this.liMaps.SelectedIndex != -1) - { - Command.all.Find("unload").Use(null, this.liMaps.SelectedItem.ToString().Remove((this.liMaps.SelectedItem.ToString().Length - 4))); - } - } - - private void finiteModeToolStripMenuItem_Click(object sender, EventArgs e) - { - if (this.liMaps.SelectedIndex != -1) - { - Command.all.Find("map").Use(null, this.liMaps.SelectedItem.ToString().Remove((this.liMaps.SelectedItem.ToString().Length - 4)) + " finite"); - } - } - - private void animalAIToolStripMenuItem_Click(object sender, EventArgs e) - { - if (this.liMaps.SelectedIndex != -1) - { - Command.all.Find("map").Use(null, this.liMaps.SelectedItem.ToString().Remove((this.liMaps.SelectedItem.ToString().Length - 4)) + " ai"); - } - } - - private void edgeWaterToolStripMenuItem_Click(object sender, EventArgs e) - { - if (this.liMaps.SelectedIndex != -1) - { - Command.all.Find("map").Use(null, this.liMaps.SelectedItem.ToString().Remove((this.liMaps.SelectedItem.ToString().Length - 4)) + " edge"); - } - } - - private void growingGrassToolStripMenuItem_Click(object sender, EventArgs e) - { - if (this.liMaps.SelectedIndex != -1) - { - Command.all.Find("map").Use(null, this.liMaps.SelectedItem.ToString().Remove((this.liMaps.SelectedItem.ToString().Length - 4)) + " grass"); - } - } - - private void survivalDeathToolStripMenuItem_Click(object sender, EventArgs e) - { - if (this.liMaps.SelectedIndex != -1) - { - Command.all.Find("map").Use(null, this.liMaps.SelectedItem.ToString().Remove((this.liMaps.SelectedItem.ToString().Length - 4)) + " death"); - } - } - - private void killerBlocksToolStripMenuItem_Click(object sender, EventArgs e) - { - if (this.liMaps.SelectedIndex != -1) - { - Command.all.Find("map").Use(null, this.liMaps.SelectedItem.ToString().Remove((this.liMaps.SelectedItem.ToString().Length - 4)) + " killer"); - } - } - - private void rPChatToolStripMenuItem_Click(object sender, EventArgs e) - { - if (this.liMaps.SelectedIndex != -1) - { - Command.all.Find("map").Use(null, this.liMaps.SelectedItem.ToString().Remove((this.liMaps.SelectedItem.ToString().Length - 4)) + " chat"); - } - } - - private void saveToolStripMenuItem_Click(object sender, EventArgs e) - { - if (this.liMaps.SelectedIndex != -1) - { - Command.all.Find("save").Use(null, this.liMaps.SelectedItem.ToString().Remove((this.liMaps.SelectedItem.ToString().Length - 4))); - } - } - - private void liMaps_MouseDown(object sender, MouseEventArgs e) - { - int i; - i = liMaps.IndexFromPoint(e.X, e.Y); - liMaps.SelectedIndex = i; + MCSong_.Gui.Program.ExitProgram(false); } private void tabControl1_Click(object sender, EventArgs e) @@ -628,54 +606,99 @@ private void tabControl1_Click(object sender, EventArgs e) } } } + txtAdminOut.Select(txtAdminOut.Text.Length, 0); + txtOpOut.Select(txtOpOut.Text.Length, 0); + txtGlobalOut.Select(txtGlobalOut.Text.Length, 0); + txtLog.Select(txtLog.Text.Length, 0); + UpdateMapList(); } private void button2_Click(object sender, EventArgs e) { - try + new Thread((ThreadStart)(() => { - if (File.Exists("extra/Changelog.txt")) + thisWindow.Invoke(new Action(delegate { - File.Delete("extra/Changelog.txt"); - } - WebClient Web = new WebClient(); - Web.DownloadFile("http://updates.mcsong.x10.mx/changelog.txt", "extra/Changelog.txt"); - Web.Dispose(); - } - catch { } - if (File.Exists("extra/Changelog.txt")) - { - txtChangelog.Text = "Changelog for " + Server.Version + ":"; - foreach (string line in File.ReadAllLines(("extra/Changelog.txt"))) + txtChangelog.Text = "\r\nLoading..."; + })); + try { - txtChangelog.AppendText("\r\n " + line); + if (File.Exists("extra/Changelog.txt")) + { + File.Delete("extra/Changelog.txt"); + } + WebClient Web = new WebClient(); + Web.DownloadFile("https://raw.githubusercontent.com/727021/MCSong/master/Text/Changelog.txt", "extra/Changelog.txt"); + Web.Dispose(); } - } - else - { - txtChangelog.Text = "Changelog for " + Server.Version + "\r\n\r\nChangelog not found!\r\nDownload it manually from http://updates.mcsong.x10.mx/changelog.txt and save it as \'extra/Changelog.txt\'"; - } - txtCurrentVersion.Text = Server.Version; + catch { } + string latest = ""; + try { latest = new WebClient().DownloadString("http://updates.mcsong.x10.mx/curversion.txt"); } + catch { } + + thisWindow.Invoke(new Action(delegate + { + try + { + txtChangelog.Clear(); + foreach (string line in File.ReadAllLines(("extra/Changelog.txt"))) + { + txtChangelog.AppendText("\r\n " + line); + } + } + catch + { + txtChangelog.Text = "\r\nChangelog not found!\r\nDownload it manually from https://raw.githubusercontent.com/727021/MCSong/master/Text/Changelog.txt and save it as \'extra/Changelog.txt\'"; + } + txtCurrentVersion.Text = Server.Version; + txtLatestVersion.Text = latest; + txtLatestVersion.Enabled = (latest != ""); + if (txtLatestVersion.Enabled) + txtCurrentVersion.ForeColor = (txtCurrentVersion.Text == txtLatestVersion.Text) ? Color.Green : Color.Red; + })); + + })).Start(); } private void btnChat_Click(object sender, EventArgs e) { if (txtInput.Text == null || txtInput.Text.Trim() == "") { return; } + cbInput.addEntry(txtInput.Text); string text = txtInput.Text.Trim(); string newtext = text; if (txtInput.Text[0] == '#') { newtext = text.Remove(0, 1).Trim(); + cbOpChat.addEntry(newtext); Player.GlobalMessageOps("To Ops &f-" + Server.DefaultColor + "Console [&a" + Server.ZallState + Server.DefaultColor + "]&f- " + newtext); - Server.s.Log("(OPs): Console: " + newtext); - IRCBot.Say("Console: " + newtext, true); + Server.s.LogOp("Console: " + newtext); + //IRCBot.Say("Console: " + newtext, true); // WriteLine("(OPs): " + txtInput.Text); txtInput.Clear(); } + else if (txtInput.Text[0] == ';') + { + newtext = text.Remove(0, 1).Trim(); + cbAdminChat.addEntry(newtext); + Player.GlobalMessageAdmins("To Admins &f-" + Server.DefaultColor + "Console [&a" + Server.ZallState + Server.DefaultColor + "]&f- " + newtext); + Server.s.LogAdmin("Console: " + newtext); + //IRCBot.Say("Console: " + newtext, true); + txtInput.Clear(); + } + else if (txtInput.Text[0] == '\\') + { + if (!Server.gc) return; + newtext = text.Remove(0, 1).Trim(); + cbGlobalChat.addEntry(newtext); + Player.GlobalMessageGC(Server.gcColor + "[Global][" + Server.gcNick + "] Console: &f" + newtext); + Server.s.LogGC("[" + Server.gcNick + "] Console: " + newtext); + //GlobalBot.Say("Console: " + newtext); + txtInput.Clear(); + } else { Player.GlobalMessage("Console [&a" + Server.ZallState + Server.DefaultColor + "]: &f" + txtInput.Text); - IRCBot.Say("Console [" + Server.ZallState + "]: " + txtInput.Text); + //IRCBot.Say("Console [" + Server.ZallState + "]: " + txtInput.Text); WriteLine(" " + txtInput.Text); txtInput.Clear(); } @@ -691,7 +714,7 @@ private void btnCommand_Click(object sender, EventArgs e) txtCommands.Clear(); return; } - + cbCommands.addEntry(txtCommands.Text); if (txtCommands.Text[0] == '/') if (txtCommands.Text.Length > 1) txtCommands.Text = txtCommands.Text.Substring(1); @@ -736,14 +759,17 @@ private void btnRestart_Click(object sender, EventArgs e) notifyIcon1.Icon = null; notifyIcon1.Visible = false; } - MCLawl_.Gui.Program.ExitProgram(true); + MCSong_.Gui.Program.ExitProgram(true); } - private void chkMaintenance_CheckedChanged(object sender, EventArgs e) + private void chkMaintenance_Click(object sender, EventArgs e) { if (chkMaintenance.Checked) { Server.maintenanceMode = true; + chkMaintenance.ForeColor = Color.Red; + chkMaintenance.Font = new Font(chkMaintenance.Font, FontStyle.Bold); + thisWindow.Text += " [MAINTENANCE]"; Player.GlobalMessage(c.purple + "MAINTENANCE MODE " + Server.DefaultColor + "has been turned " + c.green + "ON"); Server.s.Log("MAINTENANCE MODE has been turned ON"); if (Server.maintKick) @@ -762,73 +788,671 @@ private void chkMaintenance_CheckedChanged(object sender, EventArgs e) else if (!chkMaintenance.Checked) { Server.maintenanceMode = false; + chkMaintenance.ForeColor = Color.Black; + chkMaintenance.Font = new Font(chkMaintenance.Font, FontStyle.Regular); + thisWindow.Text = thisWindow.Text.Replace(" [MAINTENANCE]", ""); Player.GlobalMessage(c.purple + "MAINTENANCE MODE " + Server.DefaultColor + "has been turned " + c.red + "OFF"); Server.s.Log("MAINTENANCE MODE has been turned OFF"); } } - private void liMaps_SelectedIndexChanged(object sender, EventArgs e) + public static void updateMaintenance() { - if ((liMaps.SelectedIndex < 0) || (liMaps.SelectedIndex.ToString().Trim() == "")) + if (!thisWindow.InvokeRequired) { - foreach (Control c in panel2.Controls) + thisWindow.chkMaintenance.Checked = Server.maintenanceMode; + if (Server.maintenanceMode) { - if (c is TextBox) - { - TextBox txt = (TextBox)c; - txt.Clear(); - txt.Update(); - } + thisWindow.chkMaintenance.Font = new Font(thisWindow.chkMaintenance.Font, FontStyle.Bold); + thisWindow.chkMaintenance.ForeColor = Color.Red; + thisWindow.Text += " [MAINTENANCE]"; + } + else + { + thisWindow.chkMaintenance.Font = new Font(thisWindow.chkMaintenance.Font, FontStyle.Regular); + thisWindow.chkMaintenance.ForeColor = Color.Black; + thisWindow.Text = thisWindow.Text.Replace("[MAINTENANCE]", ""); } + } + else + { + thisWindow.Invoke(new Action(updateMaintenance)); + } + } - return; + public static void clearChatBuffer() + { + if (!thisWindow.InvokeRequired) + { + thisWindow.cbInput.clear(); + thisWindow.cbAdminChat.clear(); + thisWindow.cbOpChat.clear(); + thisWindow.cbGlobalChat.clear(); + thisWindow.cbCommands.clear(); + } + else + { + thisWindow.Invoke(new Action(clearChatBuffer)); + } + } + + private void btnPlay_Click(object sender, EventArgs e) + { + btnPlay.Enabled = false; + if (txtUrl.Text.StartsWith("http")) + { + try + { + Process.Start(txtUrl.Text); + } + catch (Exception ex) + { + Server.ErrorLog(ex); + } + } + else + { + MessageBox.Show("The URL found was invalid and could not be started.", "Invalid URL", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); + } + btnPlay.Enabled = true; + } + + private void txtDevList_Focus(object sender, EventArgs e) + { + groupBox11.Focus(); + } + + private void liClients_SelectedIndexChanged(object sender, EventArgs e) + { + + } + + ChatBuffer cbAdminChat = new ChatBuffer(); + ChatBuffer cbOpChat = new ChatBuffer(); + ChatBuffer cbGlobalChat = new ChatBuffer(); + + private void btnAdminChat_Click(object sender, EventArgs e) + { + if (txtAdminIn.Text == null || txtAdminIn.Text.Trim() == "") { return; } + cbAdminChat.addEntry(txtAdminIn.Text); + cbInput.addEntry(";" + txtAdminIn.Text); + string text = txtAdminIn.Text.Trim(); + + Player.GlobalMessageAdmins("To Admins &f-" + Server.DefaultColor + "Console [&a" + Server.ZallState + Server.DefaultColor + "]&f- " + text); + Server.s.LogAdmin("Console: " + text); + //IRCBot.Say("Console: " + text, true); + txtAdminIn.Clear(); + } + + private void btnOpChat_Click(object sender, EventArgs e) + { + if (txtOpIn.Text == null || txtOpIn.Text.Trim() == "") { return; } + cbOpChat.addEntry(txtOpIn.Text); + cbInput.addEntry("#" + txtOpIn.Text); + string text = txtOpIn.Text.Trim(); + + Player.GlobalMessageOps("To Ops &f-" + Server.DefaultColor + "Console [&a" + Server.ZallState + Server.DefaultColor + "]&f- " + text); + Server.s.LogOp("Console: " + text); + //IRCBot.Say("Console: " + text, true); + txtOpIn.Clear(); + } + + private void btnGlobalChat_Click(object sender, EventArgs e) + { + if (txtGlobalIn.Text == null || txtGlobalIn.Text.Trim() == "") return; + cbGlobalChat.addEntry(txtGlobalIn.Text); + cbInput.addEntry("\\" + txtGlobalIn.Text); + string text = txtGlobalIn.Text.Trim(); + + Player.GlobalMessageGC(Server.gcColor + "[Global][" + Server.gcNick + "] Console: &f" + text); + Server.s.LogGC("[" + Server.gcNick + "] Console: " + text); + //GlobalBot.Say("Console: " + text); + txtGlobalIn.Clear(); + } + + private void txtAdminIn_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Enter) + { + if (txtAdminIn.Text == null || txtAdminIn.Text.Trim() == "") { return; } + cbAdminChat.addEntry(txtAdminIn.Text); + cbInput.addEntry(";" + txtAdminIn.Text); + string text = txtAdminIn.Text.Trim(); + + Player.GlobalMessageAdmins("To Admins &f-" + Server.DefaultColor + "Console [&a" + Server.ZallState + Server.DefaultColor + "]&f- " + text); + Server.s.LogAdmin("Console: " + text); + //IRCBot.Say("Console: " + text, true); + txtAdminIn.Clear(); + } + else if (e.KeyCode == Keys.Up) + { + e.SuppressKeyPress = true; + string up = cbAdminChat.up(); + txtAdminIn.Text = (up == "") ? txtAdminIn.Text : up; + txtAdminIn.Select(txtAdminIn.Text.Length, 0); + } + else if (e.KeyCode == Keys.Down) + { + e.SuppressKeyPress = true; + txtAdminIn.Text = cbAdminChat.down(); + txtAdminIn.Select(txtAdminIn.Text.Length, 0); + } + } + + private void txtOpIn_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Enter) + { + if (txtOpIn.Text == null || txtOpIn.Text.Trim() == "") { return; } + cbOpChat.addEntry(txtOpIn.Text); + cbInput.addEntry("#" + txtOpIn.Text); + string text = txtOpIn.Text.Trim(); + + Player.GlobalMessageOps("To Ops &f-" + Server.DefaultColor + "Console [&a" + Server.ZallState + Server.DefaultColor + "]&f- " + text); + Server.s.LogOp("Console: " + text); + //IRCBot.Say("Console: " + text, true); + txtOpIn.Clear(); + } + else if (e.KeyCode == Keys.Up) + { + e.SuppressKeyPress = true; + string up = cbOpChat.up(); + txtOpIn.Text = (up == "") ? txtOpIn.Text : up; + txtOpIn.Select(txtOpIn.Text.Length, 0); + } + else if (e.KeyCode == Keys.Down) + { + e.SuppressKeyPress = true; + txtOpIn.Text = cbOpChat.down(); + txtOpIn.Select(txtOpIn.Text.Length, 0); + } + } + + private void txtGlobalIn_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Enter) + { + if (txtGlobalIn.Text == null || txtGlobalIn.Text.Trim() == "") return; + cbGlobalChat.addEntry(txtGlobalIn.Text); + cbInput.addEntry("\\" + txtGlobalIn.Text); + string text = txtGlobalIn.Text.Trim(); + + Player.GlobalMessageGC(Server.gcColor + "[Global][" + Server.gcNick + "] Console: &f" + text); + Server.s.LogGC("[" + Server.gcNick + "] Console: " + text); + //GlobalBot.Say("Console: " + text); + txtGlobalIn.Clear(); + } + else if (e.KeyCode == Keys.Up) + { + e.SuppressKeyPress = true; + string up = cbGlobalChat.up(); + txtGlobalIn.Text = (up == "") ? txtGlobalIn.Text : up; + txtGlobalIn.Select(txtGlobalIn.Text.Length, 0); + } + else if (e.KeyCode == Keys.Down) + { + e.SuppressKeyPress = true; + txtGlobalIn.Text = cbGlobalChat.down(); + txtGlobalIn.Select(txtGlobalIn.Text.Length, 0); } + } + + public void CheckGlobal() + { + txtGlobalOut.Enabled = txtGlobalIn.Enabled = btnGlobalChat.Enabled = Server.gc; + } + + private void panel2_Paint(object sender, PaintEventArgs e) + { - if (liUnloaded.SelectedIndex > -1) { liUnloaded.SetSelected(liUnloaded.SelectedIndex, false); } + } - foreach (Control c in panel2.Controls) + private void UpdateMapsTab() + { + if (!this.InvokeRequired) { - if (c is TextBox) + if (!String.IsNullOrWhiteSpace(liMaps.Text)) + { + Level l = Level.Find(liMaps.Text.Remove(liMaps.Text.Length - 4)); + + btnLevelHacks.Enabled = true; + btnEnvColors.Enabled = true; + txtLevelMotd.ReadOnly = false; + + btnLoadLevel.Enabled = false; + cmbLevelPhys.Enabled = cmbPerVisit.Enabled = cmbPerBuild.Enabled = true; + + chkGrassGrowing.Enabled = chkKillerBlocks.Enabled = chkSurvivalDeath.Enabled = true; + chkFiniteMode.Enabled = chkEdgeWater.Enabled = chkAnimalAi.Enabled = true; + chkLevelChat.Enabled = chkAutoUnload.Enabled = chkAutoLoad.Enabled = true; + + btnUnloadLevel.Enabled = btnRenameLevel.Enabled = btnDeleteLevel.Enabled = chkAutoLoad.Enabled = chkAutoUnload.Enabled = (l != Server.mainLevel); + + txtLevelMotd.Text = l.motd; + cmbLevelPhys.SelectedIndex = l.physics; + txtLevelX.Text = l.width.ToString(); + txtLevelY.Text = l.depth.ToString(); + txtLevelZ.Text = l.height.ToString(); + try {cmbPerVisit.SelectedIndex = cmbPerVisit.Items.IndexOf(Level.PermissionToName(l.permissionvisit)); } + catch { cmbPerVisit.SelectedIndex = 0; } + try { cmbPerBuild.SelectedIndex = cmbPerBuild.Items.IndexOf(Level.PermissionToName(l.permissionbuild)); } + catch { cmbPerBuild.SelectedIndex = 0; } + + chkGrassGrowing.Checked = l.GrassGrow; + chkKillerBlocks.Checked = l.Killer; + chkSurvivalDeath.Checked = l.Death; + chkFiniteMode.Checked = l.finite; + chkEdgeWater.Checked = l.edgeWater; + chkAnimalAi.Checked = l.ai; + chkLevelChat.Checked = !l.worldChat; + chkAutoUnload.Checked = (l == Server.mainLevel) ? false : l.unload; + chkAutoLoad.Checked = (l == Server.mainLevel) ? ((File.Exists("extra/autoload.txt") ? (new List(File.ReadAllLines("extra/autoload.txt")).Contains(l.name) || new List(File.ReadAllLines("extra/autoload.txt")).Contains(l.name.ToLower())) : false)) : false; + + btnUpdateLevel.Enabled = false; + + DrawLevel(l); + btnSaveImage.Enabled = true; + return; + } + else if (!String.IsNullOrWhiteSpace(liUnloaded.Text)) + { + btnUpdateLevel.Enabled = btnRenameLevel.Enabled = btnDeleteLevel.Enabled = btnLevelHacks.Enabled = btnEnvColors.Enabled = false; + txtLevelMotd.ReadOnly = true; + btnUnloadLevel.Enabled = false; + btnLoadLevel.Enabled = true; + + goto clearMaps; + } + else { - TextBox txt = (TextBox)c; - txt.Clear(); - txt.Update(); + cmbLevelPhys.Enabled = cmbPerVisit.Enabled = cmbPerBuild.Enabled = false; + btnLoadLevel.Enabled = btnUnloadLevel.Enabled = false; + txtLevelMotd.ReadOnly = true; + btnUpdateLevel.Enabled = btnRenameLevel.Enabled = btnDeleteLevel.Enabled = btnLevelHacks.Enabled = btnEnvColors.Enabled = false; } + + clearMaps: + txtLevelMotd.Clear(); + cmbLevelPhys.SelectedIndex = 0; + cmbPerBuild.SelectedIndex = cmbPerVisit.SelectedIndex = 0; + txtLevelX.Clear(); + txtLevelY.Clear(); + txtLevelZ.Clear(); + btnSaveImage.Enabled = false; + pbMapViewer.Image = new Bitmap(pbMapViewer.Width, pbMapViewer.Height); + cmbLevelPhys.Enabled = cmbPerVisit.Enabled = cmbPerBuild.Enabled = false; + chkGrassGrowing.Checked = chkKillerBlocks.Checked = chkSurvivalDeath.Checked = false; + chkFiniteMode.Checked = chkEdgeWater.Checked = chkAnimalAi.Checked = false; + chkLevelChat.Checked = chkAutoUnload.Checked = chkAutoLoad.Checked = false; + chkGrassGrowing.Enabled = chkKillerBlocks.Enabled = chkSurvivalDeath.Enabled = false; + chkFiniteMode.Enabled = chkEdgeWater.Enabled = chkAnimalAi.Enabled = false; + chkLevelChat.Enabled = chkAutoUnload.Enabled = chkAutoLoad.Enabled = false; + } + else + { + this.Invoke(new Action(UpdateMapsTab)); + } + } + + private void DrawLevel(Level l) + { + try + { + if (l == null) return; + Rectangle r = new Rectangle(0, 0, pbMapViewer.Width, pbMapViewer.Height); + //pbMapViewer.Image = new IsoCat(l, IsoCatMode.Normal, 0).Draw(out r, new BackgroundWorker() { WorkerReportsProgress = true }); } + catch (Exception e) { Server.ErrorLog(e); pbMapViewer.Image = new Bitmap(pbMapViewer.Width, pbMapViewer.Height); gbMapViewer.Text = "MapViewer - ERROR"; } + } + + private void btnUnloadLevel_Click(object sender, EventArgs e) + { + if (liMaps.SelectedIndex < 0) return; + Level l = Level.Find(liMaps.SelectedItem.ToString().Remove((liMaps.SelectedItem.ToString().Length - 4))); + if (l == Server.mainLevel) { MessageBox.Show("You cannot unload the main level."); return; } + liMaps.SetSelected(0, false); + l.Unload(); + UpdateMapList(); + if (l == null && liUnloaded.Items.Contains(l.name)) + liUnloaded.SetSelected(liUnloaded.Items.IndexOf(l.name), true); + } - txtLevelPath.Text = new FileInfo("levels/" + Level.Find(liMaps.SelectedItem.ToString()).name + ".lvl").FullName; + private void btnLoadLevel_Click(object sender, EventArgs e) + { + if (liUnloaded.SelectedIndex < 0) return; + string l = liUnloaded.Text; + liUnloaded.SetSelected(0, false); + Command.all.Find("load").Use(null, l); + UpdateMapList(); + liMaps.SetSelected(liMaps.Items.IndexOf(Level.Find(l).name + " - " + Level.Find(l).physics.ToString()), true); + } + + private void liMaps_SelectedIndexChanged(object sender, EventArgs e) + { + if (liMaps.SelectedIndex > -1) + if (liUnloaded.SelectedIndex > -1) liUnloaded.SetSelected(0, false); + UpdateMapsTab(); } private void liUnloaded_SelectedIndexChanged(object sender, EventArgs e) { - if ((liUnloaded.SelectedIndex < 0) || (liUnloaded.SelectedIndex.ToString().Trim() == "")) + if (liUnloaded.SelectedIndex > -1) + if (liMaps.SelectedIndex > -1) liMaps.SetSelected(0, false); + UpdateMapsTab(); + } + + private void btnUpdateLevel_Click(object sender, EventArgs e) + { + if (!String.IsNullOrWhiteSpace(liMaps.Text)) + { + Level l = Level.Find(liMaps.Text.Remove(liMaps.Text.Length - 4)); + if (l == null) MessageBox.Show("Could not find level with name \"" + liMaps.Text.Remove(liMaps.Text.Length - 4) + "\"", "Level not found", MessageBoxButtons.OK, MessageBoxIcon.Error); + + // Only change things if the aren't blank + l.motd = (String.IsNullOrEmpty(txtLevelMotd.Text)) ? l.motd : txtLevelMotd.Text; + + l.permissionbuild = Level.PermissionFromName(cmbPerBuild.Items[cmbPerBuild.SelectedIndex].ToString()); + l.permissionvisit = Level.PermissionFromName(cmbPerVisit.Items[cmbPerVisit.SelectedIndex].ToString()); + + l.GrassGrow = chkGrassGrowing.Checked; + l.Killer = chkKillerBlocks.Checked; + l.Death = chkSurvivalDeath.Checked; + l.finite = chkFiniteMode.Checked; + l.edgeWater = chkEdgeWater.Checked; + l.ai = chkAnimalAi.Checked; + l.worldChat = !chkLevelChat.Checked; + l.unload = chkAutoUnload.Checked; + { + List oldlines = new List(); + using (StreamReader r = new StreamReader("text/autoload.txt")) + { + bool done = false; + string line; + while ((line = r.ReadLine()) != null) + { + if (line.ToLower().Contains(l.name.ToLower())) + { + if (chkAutoLoad.Checked == false) + { + line = ""; + } + done = true; + } + oldlines.Add(line); + } + if (chkAutoLoad.Checked == true && done == false) + { + oldlines.Add(l.name + "=" + l.physics); + } + } + File.Delete("text/autoload.txt"); + using (StreamWriter SW = new StreamWriter("text/autoload.txt")) + foreach (string line in oldlines) + if (line.Trim() != "") + SW.WriteLine(line); + } + l.Save(true, true); + l.setPhysics(cmbLevelPhys.SelectedIndex);// Physics has to be set last because it causes a maps tab update + btnUpdateLevel.Enabled = false; + return; + } + else + MessageBox.Show("You have to select a loaded level before you can change it.", "Select a level", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); + } + + private void btnDeleteLevel_Click(object sender, EventArgs e) + { + if (Level.Find(liMaps.Text.Remove(liMaps.Text.Length - 4)) == Server.mainLevel) { MessageBox.Show("Cannot delete the main level."); return; } + DialogResult dr = MessageBox.Show("Keep backups of " + liMaps.Text.Remove(liMaps.Text.Length - 4) + "?", "Keep backups?", MessageBoxButtons.YesNoCancel); + if (dr == DialogResult.Yes) { - foreach (Control c in panel2.Controls) + if (MessageBox.Show("Are you sure you want to delete the level " + liMaps.Text.Remove(liMaps.Text.Length - 4) + "?", "Are you sure?", MessageBoxButtons.YesNo) == DialogResult.Yes) { - if (c is TextBox) + // Delete only the level + string message = liMaps.Text.Remove(liMaps.Text.Length - 4); + Level l = Level.Find(message); + if (l != null) l.Unload(); + + try { - TextBox txt = (TextBox)c; - txt.Clear(); - txt.Update(); + if (!Directory.Exists("levels/deleted")) Directory.CreateDirectory("levels/deleted"); + + if (File.Exists("levels/" + message + ".lvl")) + { + if (File.Exists("levels/deleted/" + message + ".lvl")) + { + int currentNum = 0; + while (File.Exists("levels/deleted/" + message + currentNum + ".lvl")) currentNum++; + + File.Move("levels/" + message + ".lvl", "levels/deleted/" + message + currentNum + ".lvl"); + } + else + { + File.Move("levels/" + message + ".lvl", "levels/deleted/" + message + ".lvl"); + } + + try { File.Delete("levels/level properties/" + message + ".properties"); } + catch { } + try { File.Delete("levels/level properties/" + message); } + catch { } + + SQLiteHelper.ExecuteQuery($@"DROP TABLE IF EXISTS Blocks{message};"); + SQLiteHelper.ExecuteQuery($@"DROP TABLE IF EXISTS Portals{message};"); + SQLiteHelper.ExecuteQuery($@"DROP TABLE IF EXISTS Messages{message};"); + SQLiteHelper.ExecuteQuery($@"DROP TABLE IF EXISTS Zones{message};"); + + Player.GlobalMessage("Level " + message + " was deleted."); + MessageBox.Show("Level " + message + " was deleted."); + } + else + { + MessageBox.Show("Could not find level file: " + message + ".lvl"); + } } + catch (Exception ex) { MessageBox.Show("Error while deleting"); Server.ErrorLog(ex); } } + } + else if (dr == DialogResult.No) + { + if (MessageBox.Show("Are you sure you want to delete the level " + liMaps.Text.Remove(liMaps.Text.Length - 4) + " AND all its backups?", "Are you sure?", MessageBoxButtons.YesNo) == DialogResult.Yes) + { + // Delete the level and all backups + string message = liMaps.Text.Remove(liMaps.Text.Length - 4); + Level l = Level.Find(message); + if (l != null) l.Unload(); - return; + try + { + if (!Directory.Exists("levels/deleted")) Directory.CreateDirectory("levels/deleted"); + + if (File.Exists("levels/" + message + ".lvl")) + { + if (File.Exists("levels/deleted/" + message + ".lvl")) + { + int currentNum = 0; + while (File.Exists("levels/deleted/" + message + currentNum + ".lvl")) currentNum++; + + File.Move("levels/" + message + ".lvl", "levels/deleted/" + message + currentNum + ".lvl"); + } + else + { + File.Move("levels/" + message + ".lvl", "levels/deleted/" + message + ".lvl"); + } + + try { File.Delete("levels/level properties/" + message + ".properties"); } + catch { } + try { File.Delete("levels/level properties/" + message); } + catch { } + try { Directory.Delete(Server.backupLocation + "/" + message); } + catch { } + + SQLiteHelper.ExecuteQuery($@"DROP TABLE IF EXISTS Blocks{message};"); + SQLiteHelper.ExecuteQuery($@"DROP TABLE IF EXISTS Portals{message};"); + SQLiteHelper.ExecuteQuery($@"DROP TABLE IF EXISTS Messages{message};"); + SQLiteHelper.ExecuteQuery($@"DROP TABLE IF EXISTS Zones{message};"); + + Player.GlobalMessage("Level " + message + " was deleted."); + MessageBox.Show("Level " + message + " AND all its backups were deleted."); + } + else + { + MessageBox.Show("Could not find level file: " + message + ".lvl"); + } + } + catch (Exception ex) { MessageBox.Show("Error while deleting"); Server.ErrorLog(ex); } + } } + UpdateMapList(); + } - if (liMaps.SelectedIndex > -1) { liMaps.SetSelected(liMaps.SelectedIndex, false); } + private void btnBackupManager_Click(object sender, EventArgs e) + { + BackupManager bm = new BackupManager(); + bm.ShowDialog(); + } - foreach (Control c in panel2.Controls) + public string newName = ""; + private void btnRenameLevel_Click(object sender, EventArgs e) + { + if (String.IsNullOrWhiteSpace(liMaps.Text)) return; + Level l = Level.Find(liMaps.Text.Remove(liMaps.Text.Length - 4)); + if (l == Server.mainLevel) { MessageBox.Show("Cannot rename the main level."); return; } + try { - if (c is TextBox) + if (new RenameLevelDialog(l).ShowDialog() == DialogResult.OK) { - TextBox txt = (TextBox)c; - txt.Clear(); - txt.Update(); + if (File.Exists("levels/" + newName)) { MessageBox.Show("Level already exists."); return; } + string oldName = l.name; + l.Unload(); + + try + { + File.Move("levels/" + oldName + ".lvl", "levels/" + newName + ".lvl"); + + try + { + File.Move("levels/level properties/" + oldName + ".properties", "levels/level properties/" + newName + ".properties"); + } + catch { } + try + { + File.Move("levels/level properties/" + oldName, "levels/level properties/" + newName + ".properties"); + } + catch { } + + SQLiteHelper.ExecuteQuery($@"ALTER TABLE Blocks{oldName} RENAME TO Blocks{newName};"); + SQLiteHelper.ExecuteQuery($@"ALTER TABLE Portals{oldName} RENAME TO Portals{newName};"); + SQLiteHelper.ExecuteQuery($@"ALTER TABLE Messages{oldName} RENAME TO Messages{newName};"); + SQLiteHelper.ExecuteQuery($@"ALTER TABLE Zones{oldName} RENAME TO Zones{newName};"); + + Player.GlobalMessage("Renamed " + oldName + " to " + newName); + } + catch { } } } + catch (Exception ex) { Server.ErrorLog(ex); } + UpdateMapList(); + newName = ""; + } + + private void linkLabels_MouseEnter(object sender, EventArgs e) + { + lblUrl.Text = ((LinkLabel)sender).AccessibleDescription; + int pad = groupBox13.Width - lblUrl.Width; + lblUrl.Padding = new Padding(pad, 0, 0, 0); + } + + private void linkLabels_MouseLeave(object sender, EventArgs e) + { + lblUrl.Padding = new Padding(0); + lblUrl.ResetText(); + } + + private void linkLabels_Click(object sender, EventArgs e) + { + try { Process.Start(((LinkLabel)sender).AccessibleDescription); } + catch { MessageBox.Show("Unable to open link: " + ((LinkLabel)sender).AccessibleDescription, "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error); } + } + + private void btnSaveImage_Click(object sender, EventArgs e) + { + if (!Directory.Exists("extra/images/" + liMaps.Text.Remove(liMaps.Text.Length - 4))) + Directory.CreateDirectory("extra/images/" + liMaps.Text.Remove(liMaps.Text.Length - 4)); + DirectoryInfo di = new DirectoryInfo("extra/images/" + liMaps.Text.Remove(liMaps.Text.Length - 4)); + string path = "extra/images/" + liMaps.Text.Remove(liMaps.Text.Length - 4) + "/" + di.GetFiles().Length + ".png"; + pbMapViewer.Image.Save(path, System.Drawing.Imaging.ImageFormat.Png); + MessageBox.Show("Map saved to " + path); + } + + private void UpdateStats(object sender, System.Timers.ElapsedEventArgs e) + { + Invoke(new Action(delegate + { + if (Server.PCCounter == null || Server.ProcessCounter == null) + Server.s.Log("Starting performance counters..."); + if (Server.PCCounter == null) + { + new Thread((ThreadStart)(() => + { + Server.PCCounter = new PerformanceCounter("Processor", "% Processor Time", "_Total"); + Server.PCCounter.BeginInit(); + Server.PCCounter.NextValue(); + })).Start(); + } + if (Server.ProcessCounter == null) + { + new Thread((ThreadStart)(() => + { + Server.ProcessCounter = new PerformanceCounter("Process", "% Processor Time", Process.GetCurrentProcess().ProcessName); + Server.ProcessCounter.BeginInit(); + Server.ProcessCounter.NextValue(); + })).Start(); + } + + TimeSpan tp = Process.GetCurrentProcess().TotalProcessorTime; + TimeSpan up = (DateTime.Now - Process.GetCurrentProcess().StartTime); + + string cpu = Math.Round(Server.ProcessCounter.NextValue()).ToString(); + string cputotal = Math.Round(Server.PCCounter.NextValue()).ToString(); + txtCpu.Text = cpu + "% / " + cputotal + "%"; + txtMemory.Text = Math.Round((double)Process.GetCurrentProcess().PrivateMemorySize64 / 1048576).ToString() + " MB"; + txtThreads.Text = Process.GetCurrentProcess().Threads.Count.ToString(); + txtUptime.Text = up.Days + " Days, " + up.Hours + " Hours, " + up.Minutes + " Minutes, " + up.Seconds + " Seconds"; + lblStartingCounters.Visible = false; + })); + } + + private void btnLevelHacks_Click(object sender, EventArgs e) + { + Level l = Level.Find(liMaps.Text.Remove(liMaps.Text.Length - 4)); + new HackControlDialog(l).ShowDialog(); + } + + private void button3_Click(object sender, EventArgs e) + { + button3.Visible = false; + button3.Enabled = false; + lblStartingCounters.Visible = true; + System.Timers.Timer statsTimer = new System.Timers.Timer(1000); + statsTimer.Elapsed += UpdateStats; + statsTimer.Start(); + } - txtLevelPath.Text = new FileInfo("levels/" + Level.Find(liUnloaded.SelectedItem.ToString()).name + ".lvl").FullName; + private void btnNewLevel_Click(object sender, EventArgs e) + { + if (new NewLevelDialog().ShowDialog() == DialogResult.OK) + UpdateMapList(); + } + + private void LevelSettings_Changed(object sender, EventArgs e) + { + btnUpdateLevel.Enabled = true; + } + + private void button7_Click(object sender, EventArgs e) + { + Level l = Level.Find(liMaps.Text.Remove(liMaps.Text.Length - 4)); + new EnvColorsDialog(l).ShowDialog(); } } } diff --git a/MCSong/GUI/Window.resx b/MCSong/GUI/Window.resx index 4afbbeb..183f539 100644 --- a/MCSong/GUI/Window.resx +++ b/MCSong/GUI/Window.resx @@ -112,24 +112,24 @@ 2.0 - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 346, 17 - - - 456, 17 - - + + MCSong is a server software for the once-popular "classic" version of Minecraft. It is one of many softwares based on MCLawl, which was originally made by Lawlcat, Zallist, and Valek. + MCSong was started in June 2012, then scrapped and restarted, after a long period of inactivity, in November 2014. MCSong now features support for Classic Protocol Extension, which adds exciting new features to the game, and development is still going. + Don't hesitate to stop by the forums or the global chat channel and say hi, and, of course, thanks for choosing MCSong! + + + 17, 17 - + 229, 17 - + 25 \ No newline at end of file diff --git a/MCSong/GlobalBot.cs b/MCSong/GlobalBot.cs new file mode 100644 index 0000000..2ac6ee7 --- /dev/null +++ b/MCSong/GlobalBot.cs @@ -0,0 +1,210 @@ +using System; +using System.Collections.Generic; +using System.Text; +//using Meebey.SmartIrc4net; +using System.Threading; + +namespace MCSong +{ + class GlobalBot + {/* + static IrcClient irc = new IrcClient(); + static string server = "irc.esper.net"; + static string channel = "#mcsongglobal"; + static string nick = Server.gcNick; + static Thread ircThread; + + static string[] names; + + public GlobalBot() + { + ircThread = new Thread(new ThreadStart(delegate + { + irc.OnConnecting += new EventHandler(OnConnecting); + irc.OnConnected += new EventHandler(OnConnected); + irc.OnChannelMessage += new IrcEventHandler(OnChanMessage); + irc.OnJoin += new JoinEventHandler(OnJoin); + irc.OnPart += new PartEventHandler(OnPart); + irc.OnQuit += new QuitEventHandler(OnQuit); + irc.OnNickChange += new NickChangeEventHandler(OnNickChange); + irc.OnDisconnected += new EventHandler(OnDisconnected); + irc.OnQueryMessage += new IrcEventHandler(OnPrivMsg); + irc.OnNames += new NamesEventHandler(OnNames); + irc.OnChannelAction += new ActionEventHandler(OnAction); + + try { irc.Connect(server, Server.ircPort); } + catch (Exception e) { Server.ErrorLog(e); } + })); + ircThread.Start(); + } + + void OnConnecting(object sender, EventArgs e) + { + Server.s.Log("Connecting to Global Chat"); + } + void OnConnected(object sender, EventArgs e) + { + Server.s.Log("Connected to Global Chat"); + irc.Login(nick, nick, 0, nick); + + if (Server.gcIdentify && Server.gcPassword != string.Empty) + { + Server.s.Log("Identifying with Nickserv"); + irc.SendMessage(SendType.Message, "nickserv", "IDENTIFY " + Server.gcPassword); + } + + Server.s.Log("Joining Global Chat channel"); + irc.RfcJoin(channel); + + irc.Listen(); + } + + void OnNames(object sender, NamesEventArgs e) + { + names = e.UserList; + } + void OnDisconnected(object sender, EventArgs e) + { + Server.s.Log("Disconnected from Global Chat. Trying to reconnect."); + try { irc.Connect(server, 6667); } + catch { Server.s.Log("Failed to reconnect to Global Chat"); } + } + + void OnChanMessage(object sender, IrcEventArgs e) + { + string temp = e.Data.Message; string storedNick = e.Data.Nick; + + string allowedchars = "1234567890-=qwertyuiop[]\\asdfghjkl;'zxcvbnm,./!@#$%^*()_+QWERTYUIOPASDFGHJKL:\"ZXCVBNM<>? "; + + foreach (char ch in temp) + { + if (allowedchars.IndexOf(ch) == -1) + temp = temp.Replace(ch, '*'); + } + + Server.s.LogGC("[" + storedNick + "]" + temp); + Player.GlobalMessageGC(Server.gcColor + "[Global][" + storedNick + "]" + temp); + } + + void OnJoin(object sender, JoinEventArgs e) + { + Server.s.LogGC(e.Data.Nick + " has joined Global Chat"); + Player.GlobalMessageGC(Server.gcColor + e.Data.Nick + Server.DefaultColor + " has joined Global Chat"); + irc.RfcNames(channel); + } + void OnPart(object sender, PartEventArgs e) + { + Server.s.LogGC(e.Data.Nick + " has left Global Chat"); + Player.GlobalMessageGC(Server.gcColor + e.Data.Nick + Server.DefaultColor + " has left Global Chat"); + irc.RfcNames(channel); + } + void OnQuit(object sender, QuitEventArgs e) + { + irc.RfcNames(channel); + } + + void OnPrivMsg(object sender, IrcEventArgs e) + { + if (Server.devnicks.Contains(e.Data.Nick)) + { + string dev = Server.devs.ToArray()[Server.devnicks.IndexOf(e.Data.Nick)];// Gets dev's IGN from IRC Nick + Server.s.LogGC("RECEIVING DEV MESSAGE");// Dev IRC commands will go here + string cmd = e.Data.Message.Split(' ')[0]; + string msg = ""; + if (e.Data.Message.Split(' ').Length > 1) + { + msg = e.Data.Message.Substring(e.Data.Message.IndexOf(' ')).Trim(); + } + Server.s.LogGC("[DEV]" + dev + " USED " + cmd.ToLower() + " " + msg); + switch (cmd.ToLower()) + { + case "help":// List GC commands + irc.SendMessage(SendType.Message, e.Data.Nick, "Dev GC commands are still in beta. Usable commands are CONSOLE and SAY. HELP is unfinished."); + break; + case "console":// Use any server command as console + if (msg == "") { msg = "console"; goto case "help"; } + string com = msg.Split(' ')[0]; + if (msg.Split(' ').Length > 1) { msg = msg.Substring(msg.IndexOf(' ')).Trim(); } + else { msg = ""; } + try + { + if (Command.all.Find(com).consoleUsable) + { + Command.all.Find(com).Use(null, msg); + } + else + { + irc.SendMessage(SendType.Message, e.Data.Nick, "/"+com+" can not be used by console."); + } + } + catch + { + irc.SendMessage(SendType.Message, e.Data.Nick, "Command not found!"); + } + break; + case "say":// Send a chat message as irc nick + if (msg == "") { msg = "say"; goto case "help"; } + Command.all.Find("say").Use(null, Server.gcColor + "[GCPrivate] [&5DEV" + Server.gcColor + "]" + dev + ": &f" + msg); + break; + default: + irc.SendMessage(SendType.Message, e.Data.Nick, "Command not found!"); + break; + } + } + else + { + irc.SendMessage(SendType.Message, e.Data.Nick, "Global Chat commands can only be used by developers"); + } + } + + void OnNickChange(object sender, NickChangeEventArgs e) + { + Player.GlobalMessageGC(Server.gcColor + "[Global] " + e.OldNickname + Server.DefaultColor + " is now known as " + Server.gcColor + e.NewNickname); + Server.s.LogGC(e.OldNickname + " is now known as " + e.NewNickname); + + irc.RfcNames(channel); + } + + void OnAction(object sender, ActionEventArgs e) + { + } + + /// + /// A simple say method for use outside the bot class + /// + /// what to send + public static void Say(string msg) + { + if (irc != null && irc.IsConnected && Server.gc) + irc.SendMessage(SendType.Message, channel, msg); + } + public static bool IsConnected() + { + return irc.IsConnected; + } + + public static void Reset() + { + if (irc.IsConnected) + irc.Disconnect(); + ircThread = new Thread(new ThreadStart(delegate + { + try { irc.Connect(server, Server.ircPort); } + catch (Exception e) + { + Server.ErrorLog(e); + } + })); + ircThread.Start(); + } + public static string[] GetConnectedUsers() + { + return names; + } + public static void ShutDown() + { + irc.Disconnect(); + ircThread.Abort(); + }*/ + } +} diff --git a/MCSong/Heartbeat.cs b/MCSong/Heartbeat.cs index e1a3816..da40bdf 100644 --- a/MCSong/Heartbeat.cs +++ b/MCSong/Heartbeat.cs @@ -79,7 +79,7 @@ public static void Init() lawlBeatTimer.Interval = 300000; try { - Pump(Beat.MCSong);; + Pump(Beat.MCSong); } catch (Exception e) { @@ -117,7 +117,7 @@ public static bool Pump(Beat type) throw new Exception("Hash not set"); } - url = "http://www.mclawl.tk/hbannounce.php"; + url = "http://mcsong.x10.mx/heartbeat.php"; if (Player.number > 0) { @@ -133,6 +133,7 @@ public static bool Pump(Beat type) } if (Player.number - hidden > 0) postVars += "&players=" + players.Substring(0, players.Length - 1); + postVars += "&pcount=" + (Player.number - hidden).ToString(); } worlds = ""; @@ -144,7 +145,6 @@ public static bool Pump(Beat type) postVars += "&motd=" + UrlEncode(Server.motd) + "&lvlcount=" + (byte)Server.levels.Count + - "&lawlversion=" + Server.Version.Replace(".0", "") + "&hash=" + hash; goto default; diff --git a/MCSong/IRCBot.cs b/MCSong/IRCBot.cs index b406b11..8cc1300 100644 --- a/MCSong/IRCBot.cs +++ b/MCSong/IRCBot.cs @@ -15,13 +15,13 @@ permissions and limitations under the License. using System; using System.Collections.Generic; using System.Text; -using Meebey.SmartIrc4net; +//using Meebey.SmartIrc4net; using System.Threading; namespace MCSong { class IRCBot - { + {/* static IrcClient irc = new IrcClient(); static string server = Server.ircServer; static string channel = Server.ircChannel; @@ -399,6 +399,6 @@ public static void ShutDown() { irc.Disconnect(); ircThread.Abort(); - } + }*/ } } diff --git a/MCSong/Levels/Level.cs b/MCSong/Levels/Level.cs index f91485a..00ab68d 100644 --- a/MCSong/Levels/Level.cs +++ b/MCSong/Levels/Level.cs @@ -18,8 +18,6 @@ permissions and limitations under the License. using System.IO.Compression; using System.Data; using System.Threading; -//using MySql.Data.MySqlClient; -//using MySql.Data.Types; ///WARNING! DO NOT CHANGE THE WAY THE LEVEL IS SAVED/LOADED! ///You MUST make it able to save and load as a new version other wise you will make old levels incompatible! @@ -27,6 +25,23 @@ permissions and limitations under the License. namespace MCSong { + public enum Weather + { + SUNNY = 0, + RAINING = 1, + SNOWING = 2 + } + + public enum EnvColors + { + SKY = 0, + CLOUD = 1, + FOG = 2, + SHADOW = 3, + SUNLIGHT = 4 + } + + // TODO The permission system should be redone eventually public enum LevelPermission { Banned = -20, @@ -39,13 +54,32 @@ public enum LevelPermission Null = 150 } - public class Level + public class HackControl + { + public bool Flying = true; + public bool NoClip = true; + public bool Speeding = true; + public bool SpawnControl = true; + public bool ThirdPerson = true; + public short JumpHeight = -1; + public HackControl() { } + + public override string ToString() + { + return ((Flying) ? "1:" : "0:") + ((NoClip) ? "1:" : "0:") + ((Speeding) ? "1:" : "0:") + + ((SpawnControl) ? "1:" : "0:") + ((ThirdPerson) ? "1:" : "0:") + JumpHeight.ToString(); + } + + public static HackControl Default = new HackControl(); + } + + public partial class Level { public int id; public string name; public ushort width; // x - public ushort depth; // y THIS IS STUPID, SHOULD HAVE BEEN Z - public ushort height; // z THIS IS STUPID, SHOULD HAVE BEEN Y + public ushort depth; // y (ACTUALLY HEIGHT) THIS IS STUPID, SHOULD HAVE BEEN Z + public ushort height; // z (ACTUALLY DEPTH) THIS IS STUPID, SHOULD HAVE BEEN Y public int currentUndo = 0; public List UndoBuffer = new List(); @@ -102,6 +136,24 @@ public struct BlockPos { public ushort x, y, z; public byte type; public DateTim public struct Zone { public ushort smallX, smallY, smallZ, bigX, bigY, bigZ; public string Owner; } public List ZoneList; + public struct MessageBlock { public ushort X, Y, Z; public int type; public string message; } + public List MBList = new List(); + public MessageBlock getMB(ushort x, ushort y, ushort z) + { + try + { + foreach (MessageBlock m in MBList) + { + if (m.X == x && m.Y == y && m.Z == z) + { + return m; + } + } + } + catch { } + return new MessageBlock() { type = -1 }; + } + List ListCheck = new List(); //A list of blocks that need to be updated List ListUpdate = new List(); //A list of block to change after calculation @@ -114,6 +166,56 @@ public struct Zone { public ushort smallX, smallY, smallZ, bigX, bigY, bigZ; pub public bool changed = false; public bool backedup = false; + + // CPE + public HackControl hacks = new HackControl(); + public Weather weather = Weather.SUNNY; + // EnvColors + public short[] skyColor = new short[3] { -1, -1, -1 }; + public short[] cloudColor = new short[3] { -1, -1, -1 }; + public short[] fogColor = new short[3] { -1, -1, -1 }; + public short[] shadowColor = new short[3] { -1, -1, -1 }; + public short[] sunlightColor = new short[3] { -1, -1, -1 }; + + public ushort[,] shadows; + /// + /// Used for the GUI map viewer + /// + public void CalculateShadows() + { + try + { + if (shadows != null) return; + shadows = new ushort[width, height]; + for (ushort x = 0; x < width; x++) + { + for (ushort y = 0; y < height; y++) + { + for (ushort z = (ushort)(depth - 1); z >= 0; z--) + { + switch (GetTile(x, y, z)) + { + case Block.air: + case Block.mushroom: + case Block.glass: + case Block.leaf: + case Block.redflower: + case Block.redmushroom: + case Block.yellowflower: + case Block.rope: + continue; + default: + shadows[x, y] = z; + break; + } + break; + } + } + } + } + catch (Exception e) { Server.ErrorLog(e); shadows = new ushort[width, height]; } + } + public Level(string n, ushort x, ushort y, ushort z, string type) { width = x; depth = y; height = z; @@ -125,10 +227,14 @@ public Level(string n, ushort x, ushort y, ushort z, string type) blocks = new byte[width * depth * height]; ZoneList = new List(); + Random r = new Random(); + switch (type) { case "flat": case "pixel": + case "space": + case "random": ushort half = (ushort)(depth / 2); for (x = 0; x < width; ++x) { @@ -155,7 +261,24 @@ public Level(string n, ushort x, ushort y, ushort z, string type) SetTile(x, y, z, Block.blackrock); else if (x == 0 || x == width - 1 || z == 0 || z == height - 1) + SetTile(x, y, z, Block.white); + break; + case "space": + if (y == 0 || y == depth - 1 || x == 0 || x == width - 1 || z == 0 || z == height - 1) + { + if (r.Next(0, blocks.Length) < Math.Round((double)blocks.Length / 10)) SetTile(x, y, z, Block.white); + else if (r.Next(0, blocks.Length) > blocks.Length - Math.Round((double)blocks.Length / 10)) + SetTile(x, y, z, Block.red); + else + SetTile(x, y, z, Block.obsidian); + } + break; + case "random": + if (y < half) + SetTile(x, y, z, (byte)r.Next(1, 66)); + else + SetTile(x, y, z, Block.air); break; } //blocks[x + width * z + width * height * y] = b; @@ -213,13 +336,17 @@ public bool Unload() saveChanges(); } physThread.Abort(); - physThread.Join(); + //physThread.Join(); Server.levels.Remove(this); GC.Collect(); GC.WaitForPendingFinalizers(); Player.GlobalMessageOps("&3" + name + Server.DefaultColor + " was unloaded."); Server.s.Log(name + " was unloaded."); + + OnLevelUnloadEvent?.Invoke(this.name); + OnUnloadEvent?.Invoke(); + return true; } @@ -228,20 +355,28 @@ public void saveChanges() if (blockCache.Count == 0) return; List tempCache = blockCache; blockCache = new List(); - string queryString; - queryString = "INSERT INTO `Block" + name + "` (Username, TimePerformed, X, Y, Z, type, deleted) VALUES "; + string queryString = $@"INSERT INTO Blocks{name} (username, when, x, y, z, type, deleted) VALUES "; foreach (BlockPos bP in tempCache) { - queryString += "('" + bP.name + "', '" + bP.TimePerformed.ToString("yyyy-MM-dd HH:mm:ss") + "', " + (int)bP.x + ", " + (int)bP.y + ", " + (int)bP.z + ", " + bP.type + ", " + bP.deleted + "), "; + queryString += $@"('{bP.name}', '{bP.TimePerformed.ToString("yyyy-MM-dd HH:mm:ss")}', {(int)bP.x}, {(int)bP.y}, {(int)bP.z}, {(int)bP.type}, {bP.deleted.ToString()}), "; } - queryString = queryString.Remove(queryString.Length - 2); + queryString = queryString.Remove(queryString.Length - 2) + ";"; + + int rowsAffected = SQLiteHelper.ExecuteQuery(queryString).rowsAffected; + Server.s.Debug($"Inserted {rowsAffected} into Blocks{name}"); - MySQL.executeQuery(queryString); tempCache.Clear(); } + /// + /// Finds a block in a level + /// + /// The x coordinate to look at + /// The y coordinate to look at + /// The z coordinate to look at + /// (byte) The ID of the found block public byte GetTile(ushort x, ushort y, ushort z) { //if (PosToInt(x, y, z) >= blocks.Length) { return null; } @@ -325,8 +460,9 @@ public void Blockchange(Player p, ushort x, ushort y, ushort z, byte type, bool inZone = true; if (p.zoneDel) { - //DB - MySQL.executeQuery("DELETE FROM `Zone" + p.level.name + "` WHERE Owner='" + Zn.Owner + "' AND SmallX='" + Zn.smallX + "' AND SMALLY='" + Zn.smallY + "' AND SMALLZ='" + Zn.smallZ + "' AND BIGX='" + Zn.bigX + "' AND BIGY='" + Zn.bigY + "' AND BIGZ='" + Zn.bigZ + "'"); + int rowsAffected = SQLiteHelper.ExecuteQuery($@"DELETE FROM Zone{p.level.name} WHERE owner = '{Zn.Owner}' AND smallx = {Zn.smallX} AND smally = {Zn.smallY} AND smallz = {Zn.smallZ} AND bigx = {Zn.bigX} AND bigy = {Zn.bigY} AND bigz = {Zn.bigZ};").rowsAffected; + Server.s.Debug($"Deleted {rowsAffected} rows from Zone{p.level.name}"); + toDel.Add(Zn); p.SendBlockchange(x, y, z, b); @@ -407,7 +543,9 @@ public void Blockchange(Player p, ushort x, ushort y, ushort z, byte type, bool errorLocation = "Block sending"; if (Block.Convert(b) != Block.Convert(type) && !Instant) + { Player.GlobalBlockchange(this, x, y, z, type); + } if (b == Block.sponge && physics > 0 && type != Block.sponge) PhysSpongeRemoved(PosToInt(x, y, z)); @@ -442,8 +580,8 @@ public void Blockchange(Player p, ushort x, ushort y, ushort z, byte type, bool Server.ErrorLog(e); Player.GlobalMessageOps(p.name + " triggered a non-fatal error on " + name); Player.GlobalMessageOps("Error location: " + errorLocation); - Server.s.Log(p.name + " triggered a non-fatal error on " + name); - Server.s.Log("Error location: " + errorLocation); + Server.s.LogOp(p.name + " triggered a non-fatal error on " + name); + Server.s.LogOp("Error location: " + errorLocation); } //if (addaction) @@ -456,7 +594,16 @@ public void Blockchange(Player p, ushort x, ushort y, ushort z, byte type, bool // b.lastaction.Add(foo); edits.Add(foo); p.actions.Add(foo); //} b.type = type; } - public void Blockchange(ushort x, ushort y, ushort z, byte type, bool overRide = false, string extraInfo = "") //Block change made by physics + /// + /// Block change made by physics + /// + /// + /// + /// + /// + /// + /// + public void Blockchange(ushort x, ushort y, ushort z, byte type, bool overRide = false, string extraInfo = "") { if (x < 0 || y < 0 || z < 0) return; if (x >= width || y >= depth || z >= height) return; @@ -467,8 +614,10 @@ public void Blockchange(ushort x, ushort y, ushort z, byte type, bool overRide = if (!overRide) if (Block.OPBlocks(b) || Block.OPBlocks(type)) return; - if (Block.Convert(b) != Block.Convert(type)) //Should save bandwidth sending identical looking blocks, like air/op_air changes. + if (Block.Convert(b) != Block.Convert(type)) + { //Should save bandwidth sending identical looking blocks, like air/op_air changes. Player.GlobalBlockchange(this, x, y, z, type); + } if (b == Block.sponge && physics > 0 && type != Block.sponge) PhysSpongeRemoved(PosToInt(x, y, z)); @@ -518,7 +667,7 @@ public void skipChange(ushort x, ushort y, ushort z, byte type) SetTile(x, y, z, type); } - public void Save(Boolean Override = false) + public void Save(Boolean Override = false, bool quiet = false) { string path = "levels/" + name + ".lvl"; @@ -560,6 +709,21 @@ public void Save(Boolean Override = false) } gs.Write(level, 0, level.Length); gs.Close(); fs.Close(); + SQLiteHelper.ExecuteQuery($@"CREATE TABLE IF NOT EXISTS Messages{name} (x INTEGER, y INTEGER, z INTEGER, type INTEGER, message TEXT);"); + + if (MBList.Count > 0) + { + string queryString = $@"INSERT INTO Messages{name} (x,y,z,type,message) VALUES "; + foreach (MessageBlock mb in MBList) + { + queryString += $@"({(int)mb.X}, {(int)mb.Y}, {(int)mb.Z}, {(int)mb.type}, '{mb.message}'), "; + } + queryString = queryString.Remove(-2) + ";"; + + int rowsAffected = SQLiteHelper.ExecuteQuery(queryString).rowsAffected; + Server.s.Debug($"Inserted {rowsAffected} rows into Messages{name}"); + } + File.Delete(path + ".backup"); File.Copy(path + ".back", path + ".backup"); File.Delete(path); @@ -584,12 +748,19 @@ public void Save(Boolean Override = false) SW.WriteLine("Unload = " + unload); SW.WriteLine("PerBuild = " + PermissionToName(permissionbuild)); SW.WriteLine("PerVisit = " + PermissionToName(permissionvisit)); + SW.WriteLine("HackControl = " + hacks.ToString()); + SW.WriteLine("SkyColor = " + skyColor[0] + ":" + skyColor[1] + ":" + skyColor[2]); + SW.WriteLine("CloudColor = " + cloudColor[0] + ":" + cloudColor[1] + ":" + cloudColor[2]); + SW.WriteLine("FogColor = " + fogColor[0] + ":" + fogColor[1] + ":" + fogColor[2]); + SW.WriteLine("ShadowColor = " + shadowColor[0] + ":" + shadowColor[1] + ":" + shadowColor[2]); + SW.WriteLine("SunlightColor = " + sunlightColor[0] + ":" + sunlightColor[1] + ":" + sunlightColor[2]); SW.Flush(); SW.Close(); - Server.s.Log("SAVED: Level \"" + name + "\". (" + players.Count + "/" + Player.players.Count + "/" + Server.players + ")"); + if (!quiet) + Server.s.Log("SAVED: Level \"" + name + "\". (" + players.Count + "/" + Player.players.Count + "/" + Server.players + ")"); changed = false; - + fs.Dispose(); gs.Dispose(); SW.Dispose(); @@ -657,11 +828,12 @@ public int Backup(bool Forced = false, string backupName = "") public static Level Load(string givenName) { return Load(givenName, 0); } public static Level Load(string givenName, byte phys) { - MySQL.executeQuery("CREATE TABLE if not exists `Block" + givenName + "` (Username CHAR(20), TimePerformed DATETIME, X SMALLINT UNSIGNED, Y SMALLINT UNSIGNED, Z SMALLINT UNSIGNED, Type TINYINT UNSIGNED, Deleted BOOL)"); - MySQL.executeQuery("CREATE TABLE if not exists `Portals" + givenName + "` (EntryX SMALLINT UNSIGNED, EntryY SMALLINT UNSIGNED, EntryZ SMALLINT UNSIGNED, ExitMap CHAR(20), ExitX SMALLINT UNSIGNED, ExitY SMALLINT UNSIGNED, ExitZ SMALLINT UNSIGNED)"); - MySQL.executeQuery("CREATE TABLE if not exists `Messages" + givenName + "` (X SMALLINT UNSIGNED, Y SMALLINT UNSIGNED, Z SMALLINT UNSIGNED, Message CHAR(255));"); - MySQL.executeQuery("CREATE TABLE if not exists `Zone" + givenName + "` (SmallX SMALLINT UNSIGNED, SmallY SMALLINT UNSIGNED, SmallZ SMALLINT UNSIGNED, BigX SMALLINT UNSIGNED, BigY SMALLINT UNSIGNED, BigZ SMALLINT UNSIGNED, Owner VARCHAR(20));"); - + + SQLiteHelper.ExecuteQuery($@"CREATE TABLE IF NOT EXISTS Blocks{givenName} (username TEXT, edit_time TEXT, x INTEGER, y INTEGER, z INTEGER, type INTEGER, deleted TEXT);"); + SQLiteHelper.ExecuteQuery($@"CREATE TABLE IF NOT EXISTS Portals{givenName} (entryx INTEGER, entryy INTEGER, entryz INTEGER, exitmap TEXT, exitx INTEGER, exity INTEGER, exitz INTEGER);"); + SQLiteHelper.ExecuteQuery($@"CREATE TABLE IF NOT EXISTS Messages{givenName} (x INTEGER, y INTEGER, z INTEGER, type INTEGER, message TEXT);"); + SQLiteHelper.ExecuteQuery($@"CREATE TABLE IF NOT EXISTS Zones{givenName} (owner TEXT, smallx INTEGER, smally INTEGER, smallz INTEGER, bigx INTEGER, bigy INTEGER, bigz INTEGER);"); + string path = "levels/" + givenName + ".lvl"; if (File.Exists(path)) { @@ -711,52 +883,52 @@ public static Level Load(string givenName, byte phys) level.backedup = true; - DataTable ZoneDB = MySQL.fillData("SELECT * FROM `Zone" + givenName + "`"); - - Zone Zn; - for (int i = 0; i < ZoneDB.Rows.Count; ++i) + // Load zones from db + level.ZoneList.Clear(); + SQLiteHelper.SQLResult zoneQuery = SQLiteHelper.ExecuteQuery($@"SELECT owner, smallx, smally, smallz, bigx, bigy, bigz FROM Zones{givenName};"); + for (int i = 0; i < zoneQuery.rowsAffected; i++) { - Zn.smallX = (ushort)ZoneDB.Rows[i]["SmallX"]; - Zn.smallY = (ushort)ZoneDB.Rows[i]["SmallY"]; - Zn.smallZ = (ushort)ZoneDB.Rows[i]["SmallZ"]; - Zn.bigX = (ushort)ZoneDB.Rows[i]["BigX"]; - Zn.bigY = (ushort)ZoneDB.Rows[i]["BigY"]; - Zn.bigZ = (ushort)ZoneDB.Rows[i]["BigZ"]; - Zn.Owner = ZoneDB.Rows[i]["Owner"].ToString(); - level.ZoneList.Add(Zn); + level.ZoneList.Add(new Zone() + { + Owner = zoneQuery[i]["owner"], + smallX = ushort.Parse(zoneQuery[i]["smallx"]), + smallY = ushort.Parse(zoneQuery[i]["smally"]), + smallZ = ushort.Parse(zoneQuery[i]["smallz"]), + bigX = ushort.Parse(zoneQuery[i]["bigX"]), + bigY = ushort.Parse(zoneQuery[i]["bigY"]), + bigZ = ushort.Parse(zoneQuery[i]["bigZ"]) + }); } - ZoneDB.Dispose(); + // Load message blocks from db + level.MBList.Clear(); + SQLiteHelper.SQLResult messageQuery = SQLiteHelper.ExecuteQuery($@"SELECT x, y, z, type, message FROM Messages{givenName};"); + for (int i = 0; i < messageQuery.rowsAffected; i++) + { + MessageBlock mb = new MessageBlock() + { + X = ushort.Parse(messageQuery[i]["x"]), + Y = ushort.Parse(messageQuery[i]["y"]), + Z = ushort.Parse(messageQuery[i]["z"]), + type = int.Parse(messageQuery[i]["type"]), + message = messageQuery[i]["message"] + }; + if (Block.mb(level.GetTile(mb.X, mb.Y, mb.Z))) + level.MBList.Add(mb); + else // Remove invalid message blocks from db + SQLiteHelper.ExecuteQuery($@"DELETE FROM Messages{givenName} WHERE x = {mb.X} AND y = {mb.Y} AND z = {mb.Z} AND type = {mb.type} AND message = '{SQLiteHelper.EscapeQuotes(mb.message)}';"); + } level.jailx = (ushort)(level.spawnx * 32); level.jaily = (ushort)(level.spawny * 32); level.jailz = (ushort)(level.spawnz * 32); level.jailrotx = level.rotx; level.jailroty = level.roty; level.physThread = new Thread(new ThreadStart(level.Physics)); - try - { - DataTable foundDB = MySQL.fillData("SELECT * FROM `Portals" + givenName + "`"); - - for (int i = 0; i < foundDB.Rows.Count; ++i) - { - if (!Block.portal(level.GetTile((ushort)foundDB.Rows[i]["EntryX"], (ushort)foundDB.Rows[i]["EntryY"], (ushort)foundDB.Rows[i]["EntryZ"]))) - { - MySQL.executeQuery("DELETE FROM `Portals" + givenName + "` WHERE EntryX=" + foundDB.Rows[i]["EntryX"] + " AND EntryY=" + foundDB.Rows[i]["EntryY"] + " AND EntryZ=" + foundDB.Rows[i]["EntryZ"]); - } - } - - foundDB = MySQL.fillData("SELECT * FROM `Messages" + givenName + "`"); - - for (int i = 0; i < foundDB.Rows.Count; ++i) - { - if (!Block.mb(level.GetTile((ushort)foundDB.Rows[i]["X"], (ushort)foundDB.Rows[i]["Y"], (ushort)foundDB.Rows[i]["Z"]))) - { - MySQL.executeQuery("DELETE FROM `Messages" + givenName + "` WHERE X=" + foundDB.Rows[i]["X"] + " AND Y=" + foundDB.Rows[i]["Y"] + " AND Z=" + foundDB.Rows[i]["Z"]); - } - } - foundDB.Dispose(); - } - catch (Exception e) { Server.ErrorLog(e); } + // Remove invalid portals from db + SQLiteHelper.SQLResult portalsQuery = SQLiteHelper.ExecuteQuery($@"SELECT entryx, entryy, entryz, exitmap, exitx, exity, exitz FROM Portals{givenName};"); + for (int i = 0; i < portalsQuery.rowsAffected; i++) + if (!Block.portal(level.GetTile(ushort.Parse(portalsQuery[i]["x"]), ushort.Parse(portalsQuery[i]["y"]), ushort.Parse(portalsQuery[i]["z"])))) + SQLiteHelper.ExecuteQuery($@"DELETE FROM Portals{givenName} WHERE entryx = {portalsQuery[i]["entryx"]} AND entryy = {portalsQuery[i]["entryy"]} AND entry = {portalsQuery[i]["entryz"]} AND exitmap = '{portalsQuery[i]["exitmap"]}' AND exitx = {portalsQuery[i]["exitx"]} AND exit = {portalsQuery[i]["exity"]} AND exitz = {portalsQuery[i]["exitz"]};"); try { @@ -799,6 +971,62 @@ public static Level Load(string givenName, byte phys) case "pervisit": if (PermissionFromName(value) != LevelPermission.Null) level.permissionvisit = PermissionFromName(value); break; + case "hackcontrol": + try + { + string[] h = value.Split(':'); + level.hacks = new HackControl() + { + Flying = (h[0] == "1"), + NoClip = (h[1] == "1"), + Speeding = (h[2] == "1"), + SpawnControl = (h[3] == "1"), + ThirdPerson = (h[4] == "1"), + JumpHeight = Convert.ToInt16(h[5]) + }; + } + catch { Server.s.Log("Invalid hack control for " + level.name + ". Using default."); level.hacks = new HackControl(); } + break; + case "skycolor": + string[] s = value.Trim().Split(':'); + try + { + level.skyColor = new short[3] { Convert.ToInt16(s[0]), Convert.ToInt16(s[1]), Convert.ToInt16(s[2]) }; + } + catch { Server.s.Log("Invalid sky color for " + level.name + ". Using default."); level.skyColor = new short[3] { -1, -1, -1 }; } + break; + case "cloudcolor": + string[] ss = value.Trim().Split(':'); + try + { + level.cloudColor = new short[3] { Convert.ToInt16(ss[0]), Convert.ToInt16(ss[1]), Convert.ToInt16(ss[2]) }; + } + catch { Server.s.Log("Invalid cloud color for " + level.name + ". Using default."); level.cloudColor = new short[3] { -1, -1, -1 }; } + break; + case "fogcolor": + string[] sss = value.Trim().Split(':'); + try + { + level.fogColor = new short[3] { Convert.ToInt16(sss[0]), Convert.ToInt16(sss[1]), Convert.ToInt16(sss[2]) }; + } + catch { Server.s.Log("Invalid fog color for " + level.name + ". Using default."); level.fogColor = new short[3] { -1, -1, -1 }; } + break; + case "shadowcolor": + string[] ssss = value.Trim().Split(':'); + try + { + level.shadowColor = new short[3] { Convert.ToInt16(ssss[0]), Convert.ToInt16(ssss[1]), Convert.ToInt16(ssss[2]) }; + } + catch { Server.s.Log("Invalid shadow color for " + level.name + ". Using default."); level.shadowColor = new short[3] { -1, -1, -1 }; } + break; + case "sunlightcolor": + string[] sssss = value.Trim().Split(':'); + try + { + level.sunlightColor = new short[3] { Convert.ToInt16(sssss[0]), Convert.ToInt16(sssss[1]), Convert.ToInt16(sssss[2]) }; + } + catch { Server.s.Log("Invalid sunlight color for " + level.name + ". Using default."); level.sunlightColor = new short[3] { -1, -1, -1 }; } + break; } } } @@ -806,10 +1034,11 @@ public static Level Load(string givenName, byte phys) } } catch { } - + level.CalculateShadows(); Server.s.Log("Level \"" + level.name + "\" loaded."); level.ctfgame.mapOn = level; + if (OnLevelLoadEvent != null) OnLevelLoadEvent(level.name); return level; } catch (Exception ex) { Server.ErrorLog(ex); return null; } @@ -828,6 +1057,9 @@ public void ChatLevel(string message) public void setPhysics(int newValue) { + + int oldValue = physics; + if (physics == 0 && newValue != 0) { for (int i = 0; i < blocks.Length; i++) @@ -835,6 +1067,9 @@ public void setPhysics(int newValue) AddCheck(i); } physics = newValue; + + if (OnPhysChangeEvent != null) OnPhysChangeEvent(newValue); + if (OnLevelPhysChangeEvent != null) OnLevelPhysChangeEvent(); } @@ -926,6 +1161,167 @@ public void CalcPhysics() { try { + if (physics == 5) + { + ushort x, y, z; + + lastCheck = ListCheck.Count; + ListCheck.ForEach(delegate(Check C) + { + try + { + IntToPos(C.b, out x, out y, out z); + string foundInfo = C.extraInfo; + + newPhysic: + if (foundInfo != "") + { + int currentLoop = 0; + if (foundInfo.Contains("wait")) + if (blocks[C.b] == Block.air) C.extraInfo = ""; + + bool wait = false; + int waitnum = 0; + bool door = false; + + foreach (string s in C.extraInfo.Split(' ')) + { + if (currentLoop % 2 == 0) + { + switch (s) + { + case "wait": + wait = true; + waitnum = int.Parse(C.extraInfo.Split(' ')[currentLoop + 1]); + break; + case "door": + door = true; + break; + } + } + currentLoop++; + } + + startCheck: + if (wait) + { + int storedInt = 0; + if (door && C.time < 2) + { + storedInt = IntOffset(C.b, -1, 0, 0); + if (Block.tDoor(blocks[storedInt])) { AddUpdate(storedInt, Block.air, false, "wait 10 door 1 revert " + blocks[storedInt].ToString()); } + storedInt = IntOffset(C.b, 1, 0, 0); + if (Block.tDoor(blocks[storedInt])) { AddUpdate(storedInt, Block.air, false, "wait 10 door 1 revert " + blocks[storedInt].ToString()); } + storedInt = IntOffset(C.b, 0, 1, 0); + if (Block.tDoor(blocks[storedInt])) { AddUpdate(storedInt, Block.air, false, "wait 10 door 1 revert " + blocks[storedInt].ToString()); } + storedInt = IntOffset(C.b, 0, -1, 0); + if (Block.tDoor(blocks[storedInt])) { AddUpdate(storedInt, Block.air, false, "wait 10 door 1 revert " + blocks[storedInt].ToString()); } + storedInt = IntOffset(C.b, 0, 0, 1); + if (Block.tDoor(blocks[storedInt])) { AddUpdate(storedInt, Block.air, false, "wait 10 door 1 revert " + blocks[storedInt].ToString()); } + storedInt = IntOffset(C.b, 0, 0, -1); + if (Block.tDoor(blocks[storedInt])) { AddUpdate(storedInt, Block.air, false, "wait 10 door 1 revert " + blocks[storedInt].ToString()); } + } + + if (waitnum <= C.time) + { + wait = false; + C.extraInfo = C.extraInfo.Substring(0, C.extraInfo.IndexOf("wait ")) + C.extraInfo.Substring(C.extraInfo.IndexOf(' ', C.extraInfo.IndexOf("wait ") + 5) + 1); + //C.extraInfo = C.extraInfo.Substring(8); + goto startCheck; + } + else + { + C.time++; + foundInfo = ""; + goto newPhysic; + } + } + else + { + switch (blocks[C.b]) + { + case Block.door_air: //door_air Change any door blocks nearby into door_air + case Block.door2_air: //door_air Change any door blocks nearby into door_air + case Block.door3_air: //door_air Change any door blocks nearby into door_air + case Block.door4_air: //door_air Change any door blocks nearby into door_air + case Block.door5_air: //door_air Change any door blocks nearby into door_air + case Block.door6_air: //door_air Change any door blocks nearby into door_air + case Block.door7_air: //door_air Change any door blocks nearby into door_air + case Block.door8_air: //door_air Change any door blocks nearby into door_air + case Block.door10_air: //door_air Change any door blocks nearby into door_air + case Block.door12_air: + case Block.door13_air: + case Block.door_iron_air: + case Block.door_dirt_air: + case Block.door_grass_air: + case Block.door_blue_air: + case Block.door_book_air: + AnyDoor(C, x, y, z, 16); break; + case Block.door11_air: + case Block.door14_air: + AnyDoor(C, x, y, z, 4, true); break; + case Block.door9_air: //door_air Change any door blocks nearby into door_air + AnyDoor(C, x, y, z, 4); break; + + case Block.odoor1_air: + case Block.odoor2_air: + case Block.odoor3_air: + case Block.odoor4_air: + case Block.odoor5_air: + case Block.odoor6_air: + case Block.odoor7_air: + case Block.odoor8_air: + case Block.odoor9_air: + case Block.odoor10_air: + case Block.odoor11_air: + case Block.odoor12_air: + + case Block.odoor1: + case Block.odoor2: + case Block.odoor3: + case Block.odoor4: + case Block.odoor5: + case Block.odoor6: + case Block.odoor7: + case Block.odoor8: + case Block.odoor9: + case Block.odoor10: + case Block.odoor11: + case Block.odoor12: + odoor(C); break; + default: //non special blocks are then ignored, maybe it would be better to avoid getting here and cutting down the list + if (!C.extraInfo.Contains("wait")) C.time = 255; + break; + } + } + } + } + catch + { + ListCheck.Remove(C); + //Server.s.Log(e.Message); + } + + }); + + ListCheck.RemoveAll(Check => Check.time == 255); //Remove all that are finished with 255 time + + lastUpdate = ListUpdate.Count; + ListUpdate.ForEach(delegate(Update C) + { + try + { + IntToPos(C.b, out x, out y, out z); + Blockchange(x, y, z, C.type, false, C.extraInfo); + } + catch + { + Server.s.Log("Phys update issue"); + } + }); + + ListUpdate.Clear(); + } if (physics > 0) { ushort x, y, z; int mx, my, mz; diff --git a/MCSong/MCSong_.csproj b/MCSong/MCSong_.csproj index 9fd66e9..bce36a1 100644 --- a/MCSong/MCSong_.csproj +++ b/MCSong/MCSong_.csproj @@ -1,5 +1,6 @@  - + + Debug x86 @@ -10,8 +11,9 @@ Properties MCSong MCSong_ - v3.5 - Client + v4.7.2 + + 512 false publish\ @@ -28,6 +30,8 @@ 1.0.0.%2a false true + + x86 @@ -38,6 +42,8 @@ DEBUG;TRACE prompt 4 + false + true x86 @@ -48,6 +54,8 @@ prompt 4 MinimumRecommendedRules.ruleset + false + true Lawl.ico @@ -60,17 +68,63 @@ - - .\Meebey.SmartIrc4net.dll + + ..\packages\EntityFramework.6.4.0\lib\net45\EntityFramework.dll - + + ..\packages\EntityFramework.6.4.0\lib\net45\EntityFramework.SqlServer.dll + + + ..\Interop.NATUPNPLib.dll + True + + + ..\packages\Microsoft.Bcl.AsyncInterfaces.1.0.0\lib\net461\Microsoft.Bcl.AsyncInterfaces.dll + + + False - ..\MySql.Data.dll + ..\Newtonsoft.Json.dll + + ..\packages\System.Buffers.4.5.0\lib\netstandard2.0\System.Buffers.dll + + + + ..\packages\System.Data.SQLite.Core.1.0.112.0\lib\net46\System.Data.SQLite.dll + + + ..\packages\System.Data.SQLite.EF6.1.0.112.0\lib\net46\System.Data.SQLite.EF6.dll + + + ..\packages\System.Data.SQLite.Linq.1.0.112.0\lib\net46\System.Data.SQLite.Linq.dll + + + ..\packages\System.Memory.4.5.3\lib\netstandard2.0\System.Memory.dll + + + + ..\packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll + + + ..\packages\System.Runtime.CompilerServices.Unsafe.4.6.0\lib\netstandard2.0\System.Runtime.CompilerServices.Unsafe.dll + + + ..\packages\System.Text.Encodings.Web.4.6.0\lib\netstandard2.0\System.Text.Encodings.Web.dll + + + ..\packages\System.Text.Json.4.6.0\lib\net461\System.Text.Json.dll + + + ..\packages\System.Threading.Tasks.Extensions.4.5.3\lib\netstandard2.0\System.Threading.Tasks.Extensions.dll + + + ..\packages\System.ValueTuple.4.5.0\lib\net47\System.ValueTuple.dll + @@ -85,10 +139,24 @@ + + + + + + + + + Code + + + + + @@ -117,7 +185,14 @@ + + Code + + + + + @@ -193,7 +268,6 @@ - @@ -234,7 +308,6 @@ - @@ -254,13 +327,60 @@ + + + Form + + + BackupManager.cs + + + Form + + + CreateBackupDialog.cs + + + Form + + + EnvColorsDialog.cs + + + Component + + + Form + + + HackControlDialog.cs + + + + Form + + + NewLevelDialog.cs + Form PropertyWindow.cs + + Form + + + RenameLevelDialog.cs + + + Form + + + UpdatePropertiesDialog.cs + Form @@ -270,7 +390,7 @@ - + @@ -281,7 +401,9 @@ - + + + Form @@ -289,19 +411,50 @@ Window.cs + + True + True + Resources.resx + + + + + + + + BackupManager.cs + + + CreateBackupDialog.cs + + + EnvColorsDialog.cs + + + HackControlDialog.cs + + + NewLevelDialog.cs + PropertyWindow.cs Designer + + RenameLevelDialog.cs + + + UpdatePropertiesDialog.cs + UpdateWindow.cs Designer @@ -310,6 +463,11 @@ Window.cs Designer + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + @@ -339,8 +497,22 @@ + + + + + + + This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {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 + + \ No newline at end of file diff --git a/MCSong/Remote/Remote.cs b/MCSong/Remote/Remote.cs new file mode 100644 index 0000000..95a1aa2 --- /dev/null +++ b/MCSong/Remote/Remote.cs @@ -0,0 +1,197 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net; +using System.Net.Sockets; +using System.Text; +using System.Threading.Tasks; + +namespace MCSong +{ + internal class Remote + { + public static UTF8Encoding enc = new UTF8Encoding(); + public static List remotes = new List(); + + public string name = ""; + public string username = ""; + public string pass = ""; + public string ip = ""; + public bool loggedIn = false; + public bool disconnected = false; + public Socket socket { get; private set; } + byte[] tempbuffer = new byte[0xFF]; + byte[] buffer = new byte[0]; + + public Remote(Socket s) + { + try + { + loggedIn = false; + tempbuffer = new byte[0xFF]; + buffer = new byte[0]; + socket = s; + ip = socket.RemoteEndPoint.ToString().Split(':')[0]; + Server.s.Log("Remote Console at " + ip + "connecting..."); + socket.BeginReceive(tempbuffer, 0, tempbuffer.Length, SocketFlags.None, new AsyncCallback(Receive), this); + } + catch (Exception e) + { + Disconnect("Login failed!"); Server.ErrorLog(e); + } + } + + static void Receive(IAsyncResult result) + { + // Server.s.Log(result.AsyncState.ToString()); + Remote p = (Remote)result.AsyncState; + if (p.disconnected) + return; + try + { + int length = p.socket.EndReceive(result); + if (length == 0) { p.Disconnect(); return; } + + byte[] b = new byte[p.buffer.Length + length]; + Buffer.BlockCopy(p.buffer, 0, b, 0, p.buffer.Length); + Buffer.BlockCopy(p.tempbuffer, 0, b, p.buffer.Length, length); + + p.buffer = p.HandleMessage(b); + p.socket.BeginReceive(p.tempbuffer, 0, p.tempbuffer.Length, SocketFlags.None, new AsyncCallback(Receive), p); + } + catch (SocketException) + { + p.Disconnect("Error!"); + } + catch (Exception e) + { + Server.ErrorLog(e); + if (p != null) p.Disconnect("Error!"); + Server.s.Log("Attempting to restart socket for Remote Console..."); + RemoteServer.listen = null; + if (RemoteServer.Setup()) { Server.s.Log("Listening socket on " + RemoteServer.port + "for Remote Console restarted."); } + else { Server.s.Log("Failed to restart listening socket for Remote Console."); } + } + } + + byte[] HandleMessage(byte[] buffer) + { + try + { + int length = 0; byte msg = buffer[0]; + // Get the length of the message by checking the first byte + switch (msg) + { + case 0: + length = 257; + break; + case 2: + if (!loggedIn) goto default; + length = 64; + break; + default: + Disconnect("Unhandled message id \"" + msg + "\"!"); + return new byte[0]; + } + if (buffer.Length > length) + { + byte[] message = new byte[length]; + Buffer.BlockCopy(buffer, 1, message, 0, length); + + byte[] tempbuffer = new byte[buffer.Length - length - 1]; + Buffer.BlockCopy(buffer, length + 1, tempbuffer, 0, buffer.Length - length - 1); + + buffer = tempbuffer; + + // Thread thread = null; + switch (msg) + { + case 0: + HandleLogin(message); + break; + case 2: + if (!loggedIn) break; + HandleChat(message); + break; + } + //thread.Start((object)message); + if (buffer.Length > 0) + buffer = HandleMessage(buffer); + else + return new byte[0]; + } + } + catch (Exception e) + { + Server.ErrorLog(e); + } + return buffer; + } + + public void HandleLogin(byte[] message) + { + /* IF login is successful + * loggedIn <- TRUE + * remotes.Add(this) + * ELSE + * Disconnect(Login error message) + */ + } + + public void HandleChat(byte[] message) + { + + } + + + public void Disconnect(string reason = "") + { + try + { + disconnected = true; + SendKick(reason); + if (loggedIn) + { + Server.s.Log("Remote Console user " + name + " disconnected."); + remotes.Remove(this); + } + else + { + Server.s.Log("Remote Console at " + ip + " disconnected."); + } + try + { + socket.Shutdown(SocketShutdown.Both); + socket.Close(); + } + catch (Exception e) + { + Server.ErrorLog(e); + } + if (remotes.Contains(this)) + remotes.Remove(this); + } + catch (Exception e) { Server.ErrorLog(e); } + } + + public void SendRaw(byte[] buffer) + { + + } + + public void SendMessage(string message) + { + + } + + public void SendLogin() + { + + } + + public void SendKick(string reason) + { + + } + } +} diff --git a/MCSong/Remote/RemoteServer.cs b/MCSong/Remote/RemoteServer.cs new file mode 100644 index 0000000..0a3fd2d --- /dev/null +++ b/MCSong/Remote/RemoteServer.cs @@ -0,0 +1,116 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net; +using System.Net.Sockets; +using System.Text; +using System.Threading.Tasks; + +namespace MCSong +{ + internal class RemoteServer + { + public struct User + { + public string name; + public string pass; + } + + public static List remotes = new List(); + public static ushort port = 4700; + public static string rpass = ""; + public static byte version = 1; + public static Socket listen; + private static bool upnpRunning = false; + + public static void Start() + { + try + { + Server.s.Log($"Creating listening socket on port {port} for Remote Console..."); + if (Setup()) + { + if (Server.upnp) + { + if (UpnpSetup()) + { + Server.s.Log($"Port {port} has been forwarded with upnp."); + upnpRunning = true; + } + else + Server.s.Log($"Could not auto forward port {port}. Make sure upnp is enabled on your router."); + } + if (!Server.upnp || Server.upnp && upnpRunning) + Server.s.Log("Done."); + } + else + { + Server.s.Log("Could not create socket connection for Remote Console."); + return; + } + } + catch (Exception ex) + { + Server.ErrorLog(ex); + Server.s.Log("Could not start Remote Console server. See error log for more information."); + } + } + + public static bool UpnpSetup() + { + try + { + if (new UpnpHelper().AddMapping(Convert.ToUInt16(port), "TCP", "MCSongRC")) + return true; + return false; + } + catch (Exception e) + { + Server.ErrorLog(e); + Server.s.Log("Failed. Make sure your router supports upnp."); + return false; + } + } + + public static bool Setup() + { + try + { + IPEndPoint endpoint = new IPEndPoint(IPAddress.Any, port); + listen = new Socket(endpoint.Address.AddressFamily, SocketType.Stream, ProtocolType.Tcp); + listen.Bind(endpoint); + listen.Listen((int)SocketOptionName.MaxConnections); + + listen.BeginAccept(new AsyncCallback(Accept), null); + return true; + } + catch (Exception e) { Server.ErrorLog(e); return false; } + } + + static void Accept(IAsyncResult result) + { + if (Server.shuttingDown == false) + { + // found information: http://www.codeguru.com/csharp/csharp/cs_network/sockets/article.php/c7695 + // -Descention + Remote p = null; + try + { + p = new Remote(listen.EndAccept(result)); + listen.BeginAccept(new AsyncCallback(Accept), null); + } + catch (SocketException) + { + if (p != null) + p.Disconnect(); + } + catch (Exception e) + { + Server.ErrorLog(e); + if (p != null) + p.Disconnect(); + } + } + } + } +} diff --git a/MCSong/Resources/Icon1.ico b/MCSong/Resources/Icon1.ico new file mode 100644 index 0000000..498c8b8 Binary files /dev/null and b/MCSong/Resources/Icon1.ico differ diff --git a/MCSong/SQLiteHelper.cs b/MCSong/SQLiteHelper.cs new file mode 100644 index 0000000..6b64ecf --- /dev/null +++ b/MCSong/SQLiteHelper.cs @@ -0,0 +1,125 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Data.SQLite; +using System.Text.RegularExpressions; +using System.IO; +using System.Collections; + +namespace MCSong +{ + static class SQLiteHelper + { + public class SQLRow + { + public SQLRow() + { + data = new Dictionary(); + } + + private Dictionary data; + + public string this[string key] + { + get { return data[key]; } + set + { + if (data.ContainsKey(key)) + data[key] = value; + else + data.Add(key, value); + } + } + } + + public class SQLResult : IEnumerable + { + private List rows; + public int rowsAffected { get; private set; } + public SQLRow this[int i] + { + get { return rows[i]; } + private set { } + } + + public SQLResult() { } + public SQLResult(int rows) => rowsAffected = rows; + public SQLResult(SQLiteDataReader reader) + { + rows = new List(); + List columns = new List(); + for (int i = 0; i < reader.FieldCount; i++) + columns.Add(reader.GetName(i)); + while (reader.Read()) + { + SQLRow row = new SQLRow(); + foreach (string col in columns) + row[col] = reader[col].ToString(); + rows.Add(row); + } + rowsAffected = rows.Count; + } + + public IEnumerator GetEnumerator() + { + foreach (SQLRow row in rows) + yield return row; + } + IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); + + public int IndexOf(SQLRow row) => rows.IndexOf(row); + } + + private static SQLiteConnection conn = null; + public static SQLiteConnection GetConnection() + { + if (conn != null) + return conn; + string cs = @"URI=file:" + Directory.GetCurrentDirectory() + @"\MCSong.db"; + conn = new SQLiteConnection(cs).OpenAndReturn(); + return conn; + } + + public static SQLResult ExecuteQuery(string queryString) + { + switch (queryString.Split(" ".ToCharArray())[0].ToUpper()) + { + case "CREATE": + new SQLiteCommand(queryString, GetConnection()).ExecuteNonQuery(); + goto default; + case "INSERT": + case "UPDATE": + case "DELETE": + return new SQLResult(new SQLiteCommand(queryString, GetConnection()).ExecuteNonQuery()); + case "SELECT": + return new SQLResult(new SQLiteCommand(queryString, GetConnection()).ExecuteReader()); + default: + return new SQLResult(); + } + } + + public static SQLResult ExecuteQuery(SQLiteCommand preparedQuery) + { + switch (preparedQuery.CommandText.Split(" ".ToCharArray())[0].ToUpper()) + { + case "CREATE": + preparedQuery.ExecuteNonQuery(); + goto default; + case "INSERT": + case "UPDATE": + case "DELETE": + return new SQLResult(preparedQuery.ExecuteNonQuery()); + case "SELECT": + return new SQLResult(preparedQuery.ExecuteReader()); + default: + return new SQLResult(); + } + } + + public static object ExecuteScalar(string queryString) => new SQLiteCommand(queryString, GetConnection()).ExecuteScalar(); + + public static string EscapeQuotes(string param) => param.Replace("'", "''"); + } +} diff --git a/MCSong/Scripting.cs b/MCSong/Scripting.cs index b11c08b..2ce923b 100644 --- a/MCSong/Scripting.cs +++ b/MCSong/Scripting.cs @@ -52,7 +52,7 @@ public static void CreateNew(string CmdName) "*/" + Environment.NewLine + Environment.NewLine + "// Add any other using statements you need up here, of course." + Environment.NewLine + - "// As a note, MCSong is designed for .NET 3.5." + Environment.NewLine + + "// As a note, MCSong is designed for .NET 4.5." + Environment.NewLine + "using System;" + Environment.NewLine + Environment.NewLine + "namespace MCSong" + Environment.NewLine + @@ -62,11 +62,15 @@ public static void CreateNew(string CmdName) "\t\t// The command's name, in all lowercase. What you'll be putting behind the slash when using it." + Environment.NewLine + "\t\tpublic override string name { get { return \"" + CmdName.ToLower() + "\"; } }" + Environment.NewLine + Environment.NewLine + - "\t\t// Command's shortcut (please take care not to use an existing one, or you may have issues." + Environment.NewLine + - "\t\tpublic override string shortcut { get { return \"\"; } }" + Environment.NewLine + + "\t\t// Command's aliases (please take care not to use existing ones, or you may have issues." + Environment.NewLine + + "\t\tpublic override string[] aliases { get { return new string[] { \"\" }; } }" + Environment.NewLine + Environment.NewLine + - "\t\t// Determines which submenu the command displays in under /help." + Environment.NewLine + - "\t\tpublic override string type { get { return \"other\"; } }" + Environment.NewLine + + "\t\t// Determines which submenu the command displays in under /help. Valid values are:" + Environment.NewLine + + "\t\t// CommandType.Building, CommandType.Moderation, CommandType.Information, CommandType.Other" + Environment.NewLine + + "\t\tpublic override CommandType type { get { return CommandType.Other; } }" + Environment.NewLine + + Environment.NewLine + + "\t\t// Determines whether or not this command can be used from the console. Block/map altering commands or commands that use p as a player should be made false to avoid errors." + Environment.NewLine + + "\t\tpublic override bool consoleUsable { get { return false; } }" + Environment.NewLine + Environment.NewLine + "\t\t// Determines whether or not this command can be used in a museum. Block/map altering commands should be made false to avoid errors." + Environment.NewLine + "\t\tpublic override bool museumUsable { get { return false; } }" + Environment.NewLine + @@ -122,7 +126,7 @@ public static bool Compile(string commandName) parameters.GenerateExecutable = false; parameters.MainClass = commandName; parameters.OutputAssembly = dllpath + "Cmd" + commandName + ".dll"; - parameters.ReferencedAssemblies.Add("MCLawl_.dll"); + parameters.ReferencedAssemblies.Add("MCSong_.dll"); StreamReader sr = new StreamReader(sourcepath + "cmd" + commandName + ".cs"); results = compiler.CompileAssemblyFromSource(parameters, sr.ReadToEnd()); sr.Dispose(); diff --git a/MCSong/Server.cs b/MCSong/Server.cs index b0ede01..d8da813 100644 --- a/MCSong/Server.cs +++ b/MCSong/Server.cs @@ -20,14 +20,8 @@ permissions and limitations under the License. using System.Text.RegularExpressions; using System.Collections.Generic; using System.Windows.Forms; -using System.Text; -using System.ComponentModel; -using System.Collections.Specialized; using System.Diagnostics; -using System.Data; - -//using MySql.Data.MySqlClient; -//using MySql.Data.Types; +using System.Data.SQLite; using MonoTorrent.Client; @@ -38,10 +32,13 @@ public class Server public delegate void LogHandler(string message); public delegate void HeartBeatHandler(); public delegate void MessageEventHandler(string message); - public delegate void PlayerListHandler(List playerList); + public delegate void PlayerListHandler(); public delegate void VoidHandler(); public event LogHandler OnLog; + public event LogHandler OnOp; + public event LogHandler OnAdmin; + public event LogHandler OnGlobal; public event LogHandler OnSystem; public event LogHandler OnCommand; public event LogHandler OnError; @@ -53,7 +50,6 @@ public class Server public static Thread locationChecker; public static Thread blockThread; - public static List mySQLCommands = new List(); public static int speedPhysics = 250; @@ -78,7 +74,10 @@ public class Server public static PlayerList bannedIP; public static PlayerList whiteList; public static PlayerList ircControllers; + public static PlayerList gcAgreed; + public static List devs = new List(new string[] { "727021" }); + public static List devnicks = new List(new string[] { "_727021" }); public static List tempBans = new List(); public struct TempBan { public string name; public DateTime allowedJoin; } @@ -89,7 +88,7 @@ public struct TempBan { public string name; public DateTime allowedJoin; } public static PerformanceCounter ProcessCounter = null; public static Level mainLevel; - public static List levels; + public static List levels = new List(); //public static List allLevels = new List(); public struct levelID { public int ID; public string name; } @@ -100,9 +99,9 @@ public struct levelID { public int ID; public string name; } public static DateTime timeOnline; //auto updater stuff - public static bool autoupdate; - public static bool autonotify; - public static string restartcountdown = ""; + public static bool autoupdate = false; + public static bool autonotify = true; + public static string restartcountdown = "30"; public static string selectedrevision = ""; public static bool autorestart; public static DateTime restarttime; @@ -111,6 +110,9 @@ public struct levelID { public int ID; public string name; } public static bool maintenanceMode = false; + public static string externalURL = ""; + + public static bool cancelShutdown = false; //Settings #region Server Settings @@ -120,17 +122,17 @@ public struct levelID { public int ID; public string name; } public static string name = "[MCSong] Default"; public static string motd = "Welcome!"; public static byte players = 12; + public static byte guests = 4; public static byte maps = 5; public static int port = 25565; public static bool pub = true; + public static bool premium = false; public static bool verify = true; public static bool worldChat = true; public static bool guestGoto = false; public static string ZallState = "Alive"; - //public static string[] userMOTD; - public static string level = "main"; public static string errlog = "error.log"; @@ -139,13 +141,18 @@ public struct levelID { public int ID; public string name; } public static bool irc = false; public static int ircPort = 6667; - public static string ircNick = "MCZall_Minecraft_Bot"; + public static string ircNick = "MCSong_Minecraft_Bot"; public static string ircServer = "irc.esper.net"; public static string ircChannel = "#changethis"; public static string ircOpChannel = "#changethistoo"; public static bool ircIdentify = false; public static string ircPassword = ""; + public static bool gc = true; + public static string gcNick = "SONG_" + new Random().Next(1000, 9999).ToString(); + public static bool gcIdentify = false; + public static string gcPassword = ""; + public static bool restartOnError = true; public static bool antiTunnel = true; @@ -172,16 +179,9 @@ public struct levelID { public int ID; public string name; } public static bool checkUpdates = true; - public static bool useMySQL = true; - public static string MySQLHost = "127.0.0.1"; - public static string MySQLPort = "3306"; - public static string MySQLUsername = "root"; - public static string MySQLPassword = "password"; - public static string MySQLDatabaseName = "MCZallDB"; - public static bool MySQLPooling = true; - public static string DefaultColor = "&e"; public static string IRCColour = "&5"; + public static string gcColor = "&6"; public static int afkminutes = 10; public static int afkkick = 45; @@ -197,17 +197,27 @@ public struct levelID { public int ID; public string name; } public static bool customShutdown = false; public static string customShutdownMessage = "Server shutdown. Rejoin in 10 seconds."; public static string moneys = "moneys"; - public static LevelPermission opchatperm = LevelPermission.Operator; + public static LevelPermission opchatperm = LevelPermission.Operator;// # + public static LevelPermission adminchatperm = LevelPermission.Admin;// ; + public static bool logbeat = false; public static LevelPermission maintPerm = LevelPermission.Admin; public static bool maintKick = true; + // CPE + public static readonly byte CustomBlockSupportLevel = 1; + public static bool mono = false; public static bool flipHead = false; public static bool shuttingDown = false; + + public static bool debugMode = false; + + public static bool upnp = false; + public static bool upnpRunning = false; #endregion public static MainLoop ml; @@ -215,7 +225,7 @@ public struct levelID { public int ID; public string name; } public Server() { ml = new MainLoop("server"); - Server.s = this; + s = this; } public void Start() { @@ -241,10 +251,10 @@ public void Start() if (File.Exists("externalurl.txt")) File.Move("externalurl.txt", "text/externalurl.txt"); if (File.Exists("autoload.txt")) File.Move("autoload.txt", "text/autoload.txt"); if (File.Exists("IRC_Controllers.txt")) File.Move("IRC_Controllers.txt", "ranks/IRC_Controllers.txt"); - if (Server.useWhitelist) if (File.Exists("whitelist.txt")) File.Move("whitelist.txt", "ranks/whitelist.txt"); + if (useWhitelist) if (File.Exists("whitelist.txt")) File.Move("whitelist.txt", "ranks/whitelist.txt"); } catch { } - Properties.Load("properties/server.properties"); + ServerProperties.Load("properties/server.properties"); Updater.Load("properties/update.properties"); Group.InitAll(); @@ -267,45 +277,10 @@ public void Start() timeOnline = DateTime.Now; - try - { - MySQL.executeQuery("CREATE DATABASE if not exists `" + MySQLDatabaseName + "`", true); - } - catch (Exception e) - { - Server.s.Log("MySQL settings have not been set! Please reference the MySQL_Setup.txt file on setting up MySQL!"); - try - { - WebClient web = new WebClient(); - web.DownloadFile("http://updates.mcsong.x10.mx/MySQL_Setup.txt", "MySQL_Setup.txt"); - web.Dispose(); - Server.s.Log("MySQL_Setup.txt has been downloaded automatically."); - } - catch { Server.s.Log("MySQL_Setup.txt can be downloaded manually from http://updates.mcsong.x10.mx."); } - Server.ErrorLog(e); - //process.Kill(); - return; - } - - MySQL.executeQuery("CREATE TABLE if not exists Players (ID MEDIUMINT not null auto_increment, Name VARCHAR(20), IP CHAR(15), FirstLogin DATETIME, LastLogin DATETIME, totalLogin MEDIUMINT, Title CHAR(20), TotalDeaths SMALLINT, Money MEDIUMINT UNSIGNED, totalBlocks BIGINT, totalKicked MEDIUMINT, color VARCHAR(6), title_color VARCHAR(6), PRIMARY KEY (ID));"); - - // Check if the color column exists. - DataTable colorExists = MySQL.fillData("SHOW COLUMNS FROM Players WHERE `Field`='color'"); - - if (colorExists.Rows.Count == 0) - { - MySQL.executeQuery("ALTER TABLE Players ADD COLUMN color VARCHAR(6) AFTER totalKicked"); - } - colorExists.Dispose(); - - // Check if the title color column exists. - DataTable tcolorExists = MySQL.fillData("SHOW COLUMNS FROM Players WHERE `Field`='title_color'"); - - if (tcolorExists.Rows.Count == 0) - { - MySQL.executeQuery("ALTER TABLE Players ADD COLUMN title_color VARCHAR(6) AFTER color"); - } - tcolorExists.Dispose(); + SQLiteHelper.ExecuteQuery(@"CREATE TABLE IF NOT EXISTS Players (id INTEGER PRIMARY KEY ASC, name TEXT, ip TEXT, first_login TEXT, last_login TEXT, total_login INTEGER, title TEXT, deaths INTEGER, money INTEGER, blocks INTEGER, kicks INTEGER, color TEXT, tcolor TEXT);"); + // Insert a console player if there isn't one already (needed for inbox messages) + if (SQLiteHelper.ExecuteQuery($@"SELECT id FROM Players WHERE name = 'Console';").rowsAffected <= 0) + SQLiteHelper.ExecuteQuery($@"INSERT INTO Players (name) VALUES ('Console');"); if (levels != null) foreach (Level l in levels) { l.Unload(); } @@ -338,22 +313,24 @@ public void Start() else { Log("mainlevel not found"); - mainLevel = new Level(Server.level, 128, 64, 128, "flat"); + Level temp = new Level(Server.level, 128, 64, 128, "flat"); - mainLevel.permissionvisit = LevelPermission.Guest; - mainLevel.permissionbuild = LevelPermission.Guest; - mainLevel.Save(); + temp.permissionvisit = LevelPermission.Guest; + temp.permissionbuild = LevelPermission.Guest; + temp.Save(true, true); + mainLevel = Level.Load(temp.name); } } } else { Log("mainlevel not found"); - mainLevel = new Level(Server.level, 128, 64, 128, "flat"); + Level temp = new Level(Server.level, 128, 64, 128, "flat"); - mainLevel.permissionvisit = LevelPermission.Guest; - mainLevel.permissionbuild = LevelPermission.Guest; - mainLevel.Save(); + temp.permissionvisit = LevelPermission.Guest; + temp.permissionbuild = LevelPermission.Guest; + temp.Save(true, true); + mainLevel = Level.Load(temp.name); } addLevel(mainLevel); mainLevel.physThread.Start(); @@ -364,6 +341,7 @@ public void Start() { bannedIP = PlayerList.Load("banned-ip.txt", null); ircControllers = PlayerList.Load("IRC_Controllers.txt", null); + gcAgreed = PlayerList.Load("GCAgreed.txt", null); foreach (Group grp in Group.GroupList) grp.playerList = PlayerList.Load(grp.fileName, grp); @@ -443,18 +421,35 @@ public void Start() ml.Queue(delegate { - Log("Creating listening socket on port " + Server.port + "... "); + Log($"Creating listening socket on port {port}..."); if (Setup()) { - s.Log("Done."); + if (upnp) + { + if (UpnpSetup()) + { + s.Log($"Port {port} has been forwarded with upnp."); upnpRunning = true; + } + else + { + s.Log($"Could not auto forward port {port}. Make sure upnp is enabled on your router."); upnpRunning = false; + } + } + if (!upnp || upnp && upnpRunning) + s.Log("Done."); } else { - s.Log("Could not create socket connection. Shutting down."); + s.Log("Could not create socket connection. Shutting down."); return; } }); + ml.Queue(delegate + { + RemoteServer.Start(); + }); + ml.Queue(delegate { updateTimer.Elapsed += delegate @@ -473,7 +468,7 @@ public void Start() { try { - Heartbeat.Init(); + SongBeat.Init(); } catch (Exception e) { @@ -483,11 +478,12 @@ public void Start() // END Heartbeat code - /* + Thread processThread = new Thread(new ThreadStart(delegate { try { + Server.s.Log("Starting performance counters..."); PCCounter = new PerformanceCounter("Processor", "% Processor Time", "_Total"); ProcessCounter = new PerformanceCounter("Process", "% Processor Time", Process.GetCurrentProcess().ProcessName); PCCounter.BeginInit(); @@ -498,7 +494,7 @@ public void Start() catch { } })); processThread.Start(); - */ + ml.Queue(delegate { @@ -523,6 +519,10 @@ public void Start() { new IRCBot(); } + if (Server.gc) + { + new GlobalBot(); + } // string CheckName = "FROSTEDBUTTS"; @@ -606,6 +606,26 @@ public void Start() Log("Finished setting up server"); }); + + try + { + using (WebClient web = new WebClient()) + { + if (new List(web.DownloadString("http://updates.mcsong.x10.mx/hostbans.txt").Split(',')).Contains(web.DownloadString("http://ipinfo.io/ip").Trim())) + { + s.Log("! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !"); + s.Log("YOUR IP HAS BEEN HOST BANNED. APPEAL AT http://mcsong.x10.mx/forums."); + s.Log("! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !"); + listen.Close(); + } + } + } + catch + { + // Hard-coded list + } + + //PluginManager.AutoLoad(); } public static bool Setup() @@ -624,6 +644,22 @@ public static bool Setup() catch (Exception e) { ErrorLog(e); return false; } } + public static bool UpnpSetup() + { + try + { + if (new UpnpHelper().AddMapping(Convert.ToUInt16(port), "TCP", "MCSong")) + return true; + return false; + } + catch (Exception e) + { + ErrorLog(e); + s.Log("Failed. Make sure your router supports upnp."); + return false; + } + } + static void Accept(IAsyncResult result) { if (shuttingDown == false) @@ -636,7 +672,7 @@ static void Accept(IAsyncResult result) p = new Player(listen.EndAccept(result)); listen.BeginAccept(new AsyncCallback(Accept), null); } - catch (SocketException e) + catch (SocketException) { if (p != null) p.Disconnect(); @@ -652,6 +688,14 @@ static void Accept(IAsyncResult result) public static void Exit() { + /*PluginManager.loaded.ForEach(delegate(Plugin p) + { + try + { + PluginManager.Unload(p); + } + catch { } + });*/ List players = new List(); foreach (Player p in Player.players) { p.save(); players.Add(p.name); } foreach (string p in players) @@ -666,7 +710,6 @@ public static void Exit() } } - //Player.players.ForEach(delegate(Player p) { p.Kick("Server shutdown. Rejoin in 10 seconds."); }); Player.connections.ForEach( delegate(Player p) { @@ -694,46 +737,61 @@ public static void addLevel(Level level) public void PlayerListUpdate() { - if (Server.s.OnPlayerListChange != null) Server.s.OnPlayerListChange(Player.players); + Server.s.OnPlayerListChange?.Invoke(); } public void FailBeat() { - if (HeartBeatFail != null) HeartBeatFail(); + HeartBeatFail?.Invoke(); } public void UpdateUrl(string url) { - if (OnURLChange != null) OnURLChange(url); + OnURLChange?.Invoke(url); } + public void LogOp(string message) + { + message = StripColors(message); + OnOp?.Invoke(message); + Log("(OPs): " + message); + } + public void LogAdmin(string message) + { + message = StripColors(message); + OnAdmin?.Invoke(message); + Log("(Admin): " + message); + } + public void LogGC(string message) + { + message = StripColors(message); + OnGlobal?.Invoke(message); + Log("[GLOBAL]" + message); + } public void Log(string message, bool systemMsg = false) { - message = stripColors(message); - if (OnLog != null) - { - if (!systemMsg) - { - OnLog(DateTime.Now.ToString("(HH:mm:ss) ") + message); - } - else - { - OnSystem(DateTime.Now.ToString("(HH:mm:ss) ") + message); - } - } + message = StripColors(message); + string msg = DateTime.Now.ToString("HH:mm:ss) ") + message; + if (systemMsg) + OnSystem?.Invoke(msg); + else + OnLog?.Invoke(msg); - Logger.Write(DateTime.Now.ToString("(HH:mm:ss) ") + message + Environment.NewLine); + Logger.Write(msg + Environment.NewLine); + } + public void Debug(string message) + { + if (Server.debugMode) + Log("[Debug]" + message); } - public void ErrorCase(string message) { - if (OnError != null) - OnError(message); + OnError?.Invoke(message); } public void CommandUsed(string message) { - if (OnCommand != null) OnCommand(DateTime.Now.ToString("(HH:mm:ss) ") + message); + OnCommand?.Invoke(DateTime.Now.ToString("(HH:mm:ss) ") + message); Logger.Write(DateTime.Now.ToString("(HH:mm:ss) ") + message + Environment.NewLine); } @@ -754,7 +812,7 @@ public static void RandomMessage() internal void SettingsUpdate() { - if (OnSettingsUpdate != null) OnSettingsUpdate(); + OnSettingsUpdate?.Invoke(); } public static string FindColor(string Username) @@ -766,15 +824,9 @@ public static string FindColor(string Username) return Group.standard.color; } - public static string stripColors(string input) + public static string StripColors(string input) { - string[] matches = new string[] { }; - Regex.Matches(input, "/(&([a-f][0-9]))/g").CopyTo(matches, 0); - foreach (string s in matches) - { - input = input.Replace(s, ""); - } - return input; + return new Regex("&[0-9a-f]", RegexOptions.IgnoreCase).Replace(input, "");// Why not use regex? } } } \ No newline at end of file diff --git a/MCSong/Properties.cs b/MCSong/ServerProperties.cs similarity index 88% rename from MCSong/Properties.cs rename to MCSong/ServerProperties.cs index b27278e..f4f9763 100644 --- a/MCSong/Properties.cs +++ b/MCSong/ServerProperties.cs @@ -17,7 +17,7 @@ permissions and limitations under the License. namespace MCSong { - public static class Properties + public static class ServerProperties { public static void Load(string givenPath, bool skipsalt = false) { @@ -44,6 +44,9 @@ public static void Load(string givenPath, bool skipsalt = false) switch (key.ToLower()) { + case "debug": + Server.debugMode = (value.ToLower() == "true"); + break; case "server-name": if (ValidString(value, "![]:.,{}~-+()?_/\\ ")) { @@ -62,12 +65,18 @@ public static void Load(string givenPath, bool skipsalt = false) try { Server.port = Convert.ToInt32(value); } catch { Server.s.Log("port invalid! setting to default."); } break; + case "upnp": + Server.upnp = (value.ToLower() == "true") ? true : false; + break; case "verify-names": Server.verify = (value.ToLower() == "true") ? true : false; break; case "public": Server.pub = (value.ToLower() == "true") ? true : false; break; + case "premium-only": + Server.premium = (value.ToLower() == "true"); + break; case "world-chat": Server.worldChat = (value.ToLower() == "true") ? true : false; break; @@ -89,6 +98,21 @@ public static void Load(string givenPath, bool skipsalt = false) } catch { Server.s.Log("max-players invalid! setting to default."); } break; + case "max-guests": + try + { + if (Convert.ToByte(value) > 128) + { + value = "128"; Server.s.Log("Max players has been lowered to 128."); + } + else if (Convert.ToByte(value) < 1) + { + value = "1"; Server.s.Log("Max players has been increased to 1."); + } + Server.guests = Convert.ToByte(value); + } + catch { Server.s.Log("max-players invalid! setting to default."); } + break; case "max-maps": try { @@ -147,6 +171,18 @@ public static void Load(string givenPath, bool skipsalt = false) case "irc-password": Server.ircPassword = value; break; + case "global-chat": + Server.gc = (value.ToLower() == "true") ? true : false; + break; + case "gc-nick": + Server.gcNick = value; + break; + case "gc-identify": + Server.gcIdentify = (value.ToLower() == "true") ? true : false; + break; + case "gc-password": + Server.gcPassword = value; + break; case "anti-tunnels": Server.antiTunnel = (value.ToLower() == "true") ? true : false; break; @@ -192,29 +228,6 @@ public static void Load(string givenPath, bool skipsalt = false) case "deathcount": Server.deathcount = (value.ToLower() == "true") ? true : false; break; - - case "usemysql": - Server.useMySQL = (value.ToLower() == "true") ? true : false; - break; - case "host": - Server.MySQLHost = value; - break; - case "sqlport": - Server.MySQLPort = value; - break; - case "username": - Server.MySQLUsername = value; - break; - case "password": - Server.MySQLPassword = value; - break; - case "databasename": - Server.MySQLDatabaseName = value; - break; - case "pooling": - try { Server.MySQLPooling = bool.Parse(value); } - catch { Server.s.Log("Invalid " + key + ". Using default."); break; } - break; case "defaultcolor": color = c.Parse(value); if (color == "") @@ -231,6 +244,14 @@ public static void Load(string givenPath, bool skipsalt = false) } Server.IRCColour = color; break; + case "gc-color": + color = c.Parse(value); + if (color == "") + { + color = c.Name(value); if (color != "") color = value; else { Server.s.Log("Could not find " + value); return; } + } + Server.gcColor = color; + break; case "old-help": try { Server.oldHelp = bool.Parse(value); } catch { Server.s.Log("Invalid " + key + ". Using default."); break; } @@ -263,6 +284,18 @@ public static void Load(string givenPath, bool skipsalt = false) } catch { Server.s.Log("Invalid " + key + ". Using default."); break; } break; + case "adminchat-perm": + try + { + sbyte parsed = sbyte.Parse(value); + if (parsed < -50 || parsed > 120) + { + throw new FormatException(); + } + Server.adminchatperm = (LevelPermission)parsed; + } + catch { Server.s.Log("Invalid " + key + ". Using default."); break; } + break; case "log-heartbeat": try { Server.logbeat = bool.Parse(value); } catch { Server.s.Log("Invalid " + key + ". Using default."); break; } @@ -395,7 +428,7 @@ static void Save(string givenPath) w.WriteLine("# server-name\t=\tThe name which displays on minecraft.net"); w.WriteLine("# motd\t=\tThe message which displays when a player connects"); w.WriteLine("# port\t=\tThe port to operate from"); - w.WriteLine("# console-only\t=\tRun without a GUI (useful for Linux servers with mono)"); + w.WriteLine("# console-only\t=\tRun without a Gui (useful for Linux servers with mono)"); w.WriteLine("# verify-names\t=\tVerify the validity of names"); w.WriteLine("# public\t=\tSet to true to appear in the public server list"); w.WriteLine("# max-players\t=\tThe maximum number of connections"); @@ -432,12 +465,16 @@ static void Save(string givenPath) w.WriteLine(); w.WriteLine(); w.WriteLine("# Server options"); + w.WriteLine("debug = " + Server.debugMode.ToString()); w.WriteLine("server-name = " + Server.name); w.WriteLine("motd = " + Server.motd); w.WriteLine("port = " + Server.port.ToString()); + w.WriteLine("upnp = " + Server.upnp.ToString()); w.WriteLine("verify-names = " + Server.verify.ToString().ToLower()); w.WriteLine("public = " + Server.pub.ToString().ToLower()); + w.WriteLine("premium-only = " + Server.premium.ToString().ToLower()); w.WriteLine("max-players = " + Server.players.ToString()); + w.WriteLine("max-guests = " + Server.guests.ToString()); w.WriteLine("max-maps = " + Server.maps.ToString()); w.WriteLine("world-chat = " + Server.worldChat.ToString().ToLower()); w.WriteLine("check-updates = " + Server.checkUpdates.ToString().ToLower()); @@ -457,6 +494,12 @@ static void Save(string givenPath) w.WriteLine("irc-identify = " + Server.ircIdentify.ToString()); w.WriteLine("irc-password = " + Server.ircPassword); w.WriteLine(); + w.WriteLine("# Global Chat"); + w.WriteLine("global-chat = " + Server.gc.ToString().ToLower()); + w.WriteLine("gc-nick = " + Server.gcNick); + w.WriteLine("gc-identify = " + Server.gcIdentify.ToString().ToLower()); + w.WriteLine("gc-password = " + Server.gcPassword); + w.WriteLine(); w.WriteLine("# other options"); w.WriteLine("anti-tunnels = " + Server.antiTunnel.ToString().ToLower()); w.WriteLine("max-depth = " + Server.maxDepth.ToString().ToLower()); @@ -472,6 +515,7 @@ static void Save(string givenPath) w.WriteLine("use-whitelist = " + Server.useWhitelist.ToString().ToLower()); w.WriteLine("money-name = " + Server.moneys); w.WriteLine("opchat-perm = " + ((sbyte)Server.opchatperm).ToString()); + w.WriteLine("adminchat-perm = " + ((sbyte)Server.adminchatperm).ToString()); w.WriteLine("maintenance-perm = " + ((sbyte)Server.opchatperm).ToString()); w.WriteLine("maintenance-kick = " + Server.maintKick.ToString().ToLower()); w.WriteLine("log-heartbeat = " + Server.logbeat.ToString()); @@ -486,18 +530,10 @@ static void Save(string givenPath) w.WriteLine("#Error logging"); w.WriteLine("report-back = " + Server.reportBack.ToString().ToLower()); w.WriteLine(); - w.WriteLine("#MySQL information"); - w.WriteLine("UseMySQL = " + Server.useMySQL); - w.WriteLine("Host = " + Server.MySQLHost); - w.WriteLine("SQLPort = " + Server.MySQLPort); - w.WriteLine("Username = " + Server.MySQLUsername); - w.WriteLine("Password = " + Server.MySQLPassword); - w.WriteLine("DatabaseName = " + Server.MySQLDatabaseName); - w.WriteLine("Pooling = " + Server.MySQLPooling); - w.WriteLine(); w.WriteLine("#Colors"); w.WriteLine("defaultColor = " + Server.DefaultColor); w.WriteLine("irc-color = " + Server.IRCColour); + w.WriteLine("gc-color = " + Server.gcColor); w.WriteLine(); w.WriteLine("#Running on mono?"); w.WriteLine("mono = " + Server.mono); @@ -513,6 +549,7 @@ static void Save(string givenPath) w.WriteLine("rank-super = " + Server.rankSuper.ToString().ToLower()); try { w.WriteLine("default-rank = " + Server.defaultRank); } catch { w.WriteLine("default-rank = guest"); } + w.WriteLine(); } w.Flush(); w.Close(); diff --git a/MCSong/SongBeat.cs b/MCSong/SongBeat.cs new file mode 100644 index 0000000..d208188 --- /dev/null +++ b/MCSong/SongBeat.cs @@ -0,0 +1,269 @@ +using System; +using System.Text; +using System.Net; +using System.IO; +using System.Threading; +using System.ComponentModel; +using System.Linq; + +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using System.Collections.Generic; + +namespace MCSong +{ + public enum BeatType + { + Mojang, + ClassiCube, + MCSong + } + + public static class SongBeat + { + static int timeout = 60 * 1000; + static string hash; + public static string serverURL; + static string staticVars; + + static bool ccSuccess = true; + + static BackgroundWorker worker; + static HttpWebRequest request; + + static StreamWriter beatLogger; + + public static void Init() + { + if (!Directory.Exists("heartbeat")) + Directory.CreateDirectory("heartbeat"); + if (Server.logbeat) + { + if (!File.Exists("heartbeat/beats.log")) + File.Create("heartbeat/beats.log").Close(); + } + + // Transfer old logs/remove old responses + if (File.Exists("heartbeat.log")) + { + StreamReader sr = new StreamReader("heartbeat.log"); + StreamWriter sw = new StreamWriter("heartbeat/beats.log"); + sw.Write(sr.ReadToEnd()); + sr.Close(); + sw.Close(); + File.Delete("heartbeat.log"); + } + if (File.Exists("songbeat.log")) + { + StreamReader sr = new StreamReader("songbeat.log"); + StreamWriter sw = new StreamWriter("heartbeat/beats.log"); + sw.Write(sr.ReadToEnd()); + sr.Close(); + sw.Close(); + File.Delete("songbeat.log"); + } + if (File.Exists("text/externalurl.txt")) + File.Delete("text/externalurl.txt"); + + staticVars = "port=" + Server.port + + "&max=" + Server.players + + "&name=" + URLEncode(Server.name) + + "&public=" + Server.pub + + "&version=" + Server.version; + worker = new BackgroundWorker(); + worker.DoWork += new DoWorkEventHandler(worker_DoWork); + worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted); + + worker.RunWorkerAsync(); + } + + static void worker_DoWork(object sender, DoWorkEventArgs e) + { + Pump(BeatType.ClassiCube); + //Pump(BeatType.Mojang); + //Pump(BeatType.MCSong); + Thread.Sleep(timeout); + } + + static void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) + { + worker.RunWorkerAsync(); + } + + public static bool Pump(BeatType type) + { + if (staticVars == null) + Init(); + + if (Server.logbeat) + beatLogger = new StreamWriter("heartbeat/beats.log", File.Exists("heartbeat/beats.log")); + + string postVars = staticVars; + + string url = "http://www.classicube.net/heartbeat.jsp"; + try + { + int hidden = 0; + + foreach (Player p in Player.players) + { + if (p.hidden) + hidden++; + } + + switch (type) + { + case BeatType.ClassiCube: + ccSuccess = false; + postVars += "&salt=" + Server.salt + + "&software=MCSong"; + goto default; + case BeatType.Mojang: + url = "https://minecraft.net/heartbeat.jsp"; + postVars += "&salt=" + Server.salt; + goto default; + case BeatType.MCSong: + url = "http://mcsong.x10.mx/heartbeat.php"; + postVars += "&songversion=" + Server.Version + + "&url=" + URLEncode(Server.externalURL) + + "&motd=" + URLEncode(Server.motd); + goto default; + default: + postVars += "&users=" + (Player.number - hidden); + break; + } + + request = (HttpWebRequest)WebRequest.Create(new Uri(url + "?" + postVars)); + request.Method = "POST"; + request.ContentType = "application/x-www-form-urlencoded"; + request.CachePolicy = new System.Net.Cache.RequestCachePolicy(System.Net.Cache.RequestCacheLevel.NoCacheNoStore); + byte[] formData = Encoding.ASCII.GetBytes(postVars); + request.ContentLength = formData.Length; + request.Timeout = 15000; + try + { + using (Stream requestStream = request.GetRequestStream()) + { + requestStream.Write(formData, 0, formData.Length); + requestStream.Close(); + } + if (Server.logbeat) + { + beatLogger.WriteLine(string.Format("[{0}] Request sent at {1}", type, DateTime.Now.ToString())); + } + } + catch (WebException e) + { + if (e.Status == WebExceptionStatus.Timeout) + { + throw new WebException("Failed during request.GetRequestStream()", e.InnerException, e.Status, e.Response); + } + } + + using (WebResponse response = request.GetResponse()) + { + if (Server.logbeat) + { + beatLogger.WriteLine(string.Format("[{0}] Response received at {1}", type, DateTime.Now.ToString())); + } + StreamReader responseReader; + switch (type) + { + case BeatType.ClassiCube: + responseReader = new StreamReader(response.GetResponseStream()); + string resp = responseReader.ReadToEnd(); + File.WriteAllText("heartbeat/ClassiCube.txt", resp); + if (Server.logbeat) Server.s.Log("ClassiCube response saved to heartbeat/ClassiCube.txt"); + + if (resp.StartsWith("http")) + { + serverURL = resp; + Server.s.UpdateUrl(serverURL); + Server.externalURL = serverURL; + File.WriteAllText("heartbeat/externalurl.txt", resp); + if (Server.logbeat) Server.s.Log("URL saved to heartbeat/externalurl.txt..."); + ccSuccess = true; + } + else if (resp.StartsWith("{")) + { + JObject json = JObject.Parse(resp); + serverURL = json["errors"][0][0].ToString().Replace("\"", ""); + Server.s.Log("ClassiCube returned an error: " + serverURL); + ccSuccess = false; + Server.s.UpdateUrl(serverURL); + Server.externalURL = serverURL; + } + responseReader.Close(); + break; + /*case BeatType.Mojang: + responseReader = new StreamReader(response.GetResponseStream()); + string line = responseReader.ReadLine(); + File.WriteAllText("heartbeat/Mojang.txt", line); + if (Server.logbeat) Server.s.Log("Mojang response saved to heartbeat/Mojang.txt..."); + if (!ccSuccess) + { + hash = line.Substring(line.LastIndexOf('=') + 1); + serverURL = line; + Server.s.UpdateUrl(serverURL); + Server.externalURL = serverURL; + File.WriteAllText("heartbeat/externalurl.txt", line); + if (Server.logbeat) Server.s.Log("URL saved to heartbeat/externalurl.txt..."); + } + responseReader.Close(); + break;*/ + case BeatType.MCSong: + new WebClient().DownloadFile(url + "?" + postVars, "heartbeat/MCSong.txt"); + if (Server.logbeat) Server.s.Log("MCSong response saved to heartbeat/MCSong.txt"); + break; + } + + + } + } + catch (WebException e) + { + if (e.Status == WebExceptionStatus.Timeout) + { + Server.s.Log(string.Format("Timeout: {0}", type)); + } + Server.ErrorLog(e); + } + catch (Exception e) + { + Server.s.Log(string.Format("Error reporting to {0}", type)); + Server.ErrorLog(e); + return false; + } + finally + { + request.Abort(); + if (beatLogger != null) + beatLogger.Close(); + } + + return true; + } + + public static string URLEncode(string s) + { + StringBuilder o = new StringBuilder(); + for (int i = 0; i < s.Length; i++) + { + if ((s[i] >= '0' && s[i] <= '9') || + (s[i] >= 'A' && s[i] <= 'Z') || + (s[i] >= 'a' && s[i] <= 'z') || + s[i] == '-' || s[i] == '_' || s[i] == '.' || s[i] == '~') + { + o.Append(s[i]); + } + else if (Array.IndexOf(reserved, s[i]) != -1) + { + o.Append("%").Append(((int)s[i]).ToString("X")); + } + } + return o.ToString(); + } + + private static char[] reserved = new char[] { ' ', '!', '*', '\'', '(', ')', ';', ':', '@', '&', '=', '+', '$', ',', '/', '?', '%', '#', '[', ']' }; + } +} diff --git a/MCSong/Starter.csproj b/MCSong/Starter.csproj index d59510d..999830c 100644 --- a/MCSong/Starter.csproj +++ b/MCSong/Starter.csproj @@ -1,5 +1,5 @@  - + Debug x86 @@ -10,8 +10,9 @@ Properties Starter MCSong - v3.5 - Client + v4.7.2 + + 512 @@ -23,6 +24,7 @@ DEBUG;TRACE prompt 4 + false x86 @@ -32,6 +34,7 @@ TRACE prompt 4 + false Starter.Program @@ -45,12 +48,25 @@ + + + ..\packages\Microsoft.Bcl.AsyncInterfaces.1.1.0\lib\net461\Microsoft.Bcl.AsyncInterfaces.dll + + + ..\packages\System.Runtime.CompilerServices.Unsafe.4.7.0\lib\netstandard2.0\System.Runtime.CompilerServices.Unsafe.dll + + + ..\packages\System.Text.Encodings.Web.4.7.0\lib\netstandard2.0\System.Text.Encodings.Web.dll + + + ..\packages\System.Text.Json.4.7.0\lib\net461\System.Text.Json.dll + diff --git a/MCSong/Updater.cs b/MCSong/Updater.cs index 72aa5fc..ab8d4e3 100644 --- a/MCSong/Updater.cs +++ b/MCSong/Updater.cs @@ -41,7 +41,22 @@ public static void Load(string givenPath) } } } + Save(givenPath); } + public static void Save(string givenPath) + { + try + { + StreamWriter w = new StreamWriter(File.Create(givenPath)); + w.WriteLine("autoupdate = " + Server.autoupdate.ToString()); + w.WriteLine("notify = " + Server.autonotify.ToString()); + w.WriteLine("restartcountdown = " + Server.restartcountdown.ToString()); + w.Flush(); + w.Close(); + w.Dispose(); + } + catch { Server.s.Log("SAVE FAILED! " + givenPath); } + } } } diff --git a/MCSong/UpnpHelper.cs b/MCSong/UpnpHelper.cs new file mode 100644 index 0000000..9627ebe3 --- /dev/null +++ b/MCSong/UpnpHelper.cs @@ -0,0 +1,137 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Net; +using System.Net.Sockets; +using NATUPNPLib; + + +// .NET 4 command line application that lists UPNP mappings on connected routers. +// Uses Windows Native UPnp Support library (NATUPNPLib). +// v 1.0 +// (9/14/2010) - Alex Soya, Logan Industries, Inc. +// +// + +namespace MCSong +{ + internal class UpnpHelper + { + UPnPNAT NatMgr; + + public UpnpHelper() + { + NatMgr = new UPnPNAT(); + } + + public static string GetLocalIP() + { + string IP = null; + foreach (IPAddress IPAddress in Dns.GetHostEntry(Dns.GetHostName()).AddressList) + { + if (IPAddress.AddressFamily.ToString() == "InterNetwork") + IP = IPAddress.ToString(); + } + return IP; + } + + private bool DeleteMapNat(int port) + { + + try + { + IStaticPortMappingCollection mappings = NatMgr.StaticPortMappingCollection; + mappings.Remove(port, "TCP"); + } + catch (Exception) + { + return false; + } + return true; + + } + + internal void ListMappings() + { + if (NatMgr == null) + { + Server.s.Log("Initialization failed creating Windows UPnPNAT interface."); + return; + } + + IStaticPortMappingCollection mappings = NatMgr.StaticPortMappingCollection; + if (mappings == null) + { + Server.s.Log("No mappings found. Do you have a uPnP enabled router as your gateway?"); + return; + } + + if (mappings.Count == 0) + { + Server.s.Log("Router does not have any active uPnP mappings."); + } + + foreach (IStaticPortMapping pm in mappings) + { + Server.s.Log("Description:"); + Server.s.Log(pm.Description); + Server.s.Log(String.Format(" {0}:{1} ---> {2}:{3} ({4})", pm.ExternalIPAddress, pm.ExternalPort, pm.InternalClient, pm.InternalPort, pm.Protocol)); + Server.s.Log(""); + } + + } + + internal void ClearMappings() + { + if (NatMgr == null) + { + Server.s.Log("Initialization failed creating Windows UPnPNAT interface."); + return; + } + + IStaticPortMappingCollection mappings = NatMgr.StaticPortMappingCollection; + if (mappings == null) + { + Server.s.Log("No mappings found. Do you have a uPnP enabled router as your gateway?"); + return; + } + + List pmsToDelete = new List(); + + + // We need to build our own list as we can not remove from mappings list without altering the list + // resulting in last entry never being deleted. + foreach (IStaticPortMapping pm in mappings) + { + pmsToDelete.Add(pm); + } + + foreach (IStaticPortMapping pm in pmsToDelete) + { + Server.s.Log(String.Format("Deleting : {0}", pm.Description)); + mappings.Remove(pm.ExternalPort, pm.Protocol); + } + + } + + internal bool AddMapping(ushort Port, string Protocol, string Description) + { + if (NatMgr == null) + { + Server.s.Log("Initialization failed creating Windows UPnPNAT interface."); + return false; + } + + IStaticPortMappingCollection mappings = NatMgr.StaticPortMappingCollection; + if (mappings == null) + { + Server.s.Log("No mappings found. Do you have a uPnP enabled router as your gateway?"); + return false; + } + + mappings.Add(Port, Protocol, Port, GetLocalIP(), true, Description); + return true; + } + } +} \ No newline at end of file diff --git a/MCSong/app.config b/MCSong/app.config index e91dbe0..357ac66 100644 --- a/MCSong/app.config +++ b/MCSong/app.config @@ -1,3 +1,50 @@ - + - + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/MCSong/packages.config b/MCSong/packages.config new file mode 100644 index 0000000..c964f72 --- /dev/null +++ b/MCSong/packages.config @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Newtonsoft.Json.dll b/Newtonsoft.Json.dll new file mode 100644 index 0000000..71fd69e Binary files /dev/null and b/Newtonsoft.Json.dll differ diff --git a/README.md b/README.md index 84afb75..5e67c36 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,10 @@ MCSong ============= -MCSong is a server software for Minecraft Classic written in C# and semi-actively developed by [727021](https://github.com/727021). It is based on [MCLawl](http://minecraft.gamepedia.net/Custom_Servers/MCLawl) by Zallist, Lawlcat, and Valek. +MCSong is a server software for the once-popular "classic" version of Minecraft and for [Classicube](https://www.classicube.net/). It is one of many softwares based on [MCLawl](https://github.com/727021/MCLawl), which was originally made by Lawlcat, Zallist, and Valek. + +MCSong was started in June 2012, then scrapped and restarted in November 2014 after a long period of inactivity. It's now 2019, and MCSong hasn't had a major update in 5 years. Even though nobody plays Minecraft Classic/Classicube anymore (or uses MCSong), I've decided to start a complete rewrite of MCSong featuring full [CPE](http://wiki.vg/CPE) support, an improved GUI, plugin/extension support, and more. Overall, it will be an improved version of the MCSong that used to be. I will also start work on a new website/forum with a server list and a remote console. Watch this repository for changes/updates. --- -MCSong is licensed under the ECL-2.0 License, which can be found in the LICENSE.md file, or at [http://opensource.org/licenses/ECL-2.0](http://opensource.org/licenses/ECL-2.0 "ECL-2.0 License"). \ No newline at end of file +MCSong is licensed under the ECL-2.0 License, which can be found in the [LICENSE.md](https://github.com/727021/MCSong/blob/master/LICENSE.md) file, or at [http://opensource.org/licenses/ECL-2.0](http://opensource.org/licenses/ECL-2.0 "ECL-2.0 License"). diff --git a/Text/Changelog.txt b/Text/Changelog.txt new file mode 100644 index 0000000..c3618a1 --- /dev/null +++ b/Text/Changelog.txt @@ -0,0 +1,25 @@ +1.0.0.0: + + + First official release + +1.0.0.0-pre1: + + + CPE Support + - ClickDistance Extension + * Expand or limit the reach of players + - CustomBlocks Extension + * Adds new blocks to the game, including fire, snow, sandstone, stone bricks, rope, ane more + - HackControl Extension + * Control which maps allow the use of flying, noclip, speeding, jumping, and even vanilla respawn controls + + Completely new GUI design + - Level backup manager and map viewer + - Chat channels tab + - CPU/Memory usage information + - Player/Level settings management + - New and improved updater + - Reorganized, easy to use properties window + - ChatBuffers: Use the up and down arrows to scroll through chat messages, just like in the Minecraft client + + Admin chat + + MCSong Global Chat + - Connect with other MCSong servers through IRC + diff --git a/Text/Omnibans.txt b/Text/Omnibans.txt new file mode 100644 index 0000000..20645a3 --- /dev/null +++ b/Text/Omnibans.txt @@ -0,0 +1 @@ +soysauceships \ No newline at end of file diff --git a/Text/SQLite Info.txt b/Text/SQLite Info.txt new file mode 100644 index 0000000..60183c7 --- /dev/null +++ b/Text/SQLite Info.txt @@ -0,0 +1,64 @@ +This file contains a summary of the SQLite database structure used +by MCSong. The database contains one 'Blocks' 'Messages' 'Portals' +and 'Zones' table for each map. This may be changed in the future +if I decide to store map properties in the database. + +== Table Name == +column TYPE CONSTRAINTS + + +== Players == +id INTEGER PRIMARY KEY +name TEXT +ip TEXT +first_login TEXT +last_login TEXT +logins INTEGER +title TEXT +deaths INTEGER +money INTEGER +blocks INTEGER +kicks INTEGER +color TEXT +tcolor TEXT + +== Inbox == +id INTEGER PRIMARY KEY +to INTEGER FOREIGN KEY Player(id) +from INTEGER FOREIGN KEY Player(id) +sent TEXT +message TEXT + +== Blocks{Map} == +username TEXT +edit_time TEXT +x INTEGER +y INTEGER +z INTEGER +type INTEGER +deleted TEXT + +== Messages{Map} == +x INTEGER +y INTEGER +z INTEGER +type INTEGER +message TEXT + +== Portals{Map} == +entryx INTEGER +entryy INTEGER +entryz INTEGER +exitmap TEXT +exitx INTEGER +exity INTEGER +exitz INTEGER + +== Zones{Map} == +owner TEXT +smallx INTEGER +smally INTEGER +smallz INTEGER +bigx INTEGER +bigy INTEGER +bigz INTEGER \ No newline at end of file