From b6e220e9f29d0ea384df16beb7d96c6e2fea8c93 Mon Sep 17 00:00:00 2001 From: k0rd Date: Mon, 6 Feb 2012 20:17:39 -0500 Subject: [PATCH 01/73] A player should be teleported to remembered position after he is finished being harassed to login. --- TShockAPI/Commands.cs | 12 +++++++++++- TShockAPI/TSPlayer.cs | 15 ++++++++++----- TShockAPI/TShock.cs | 4 +++- 3 files changed, 24 insertions(+), 7 deletions(-) diff --git a/TShockAPI/Commands.cs b/TShockAPI/Commands.cs index 3feb0311..918dc316 100644 --- a/TShockAPI/Commands.cs +++ b/TShockAPI/Commands.cs @@ -407,8 +407,18 @@ namespace TShockAPI TShock.InventoryDB.InsertPlayerData(args.Player); } args.Player.SendMessage("Authenticated as " + user.Name + " successfully.", Color.LimeGreen); + Log.ConsoleInfo(args.Player.Name + " authenticated successfully as user: " + user.Name); - } + if ((args.Player.LoginHarassed) && (TShock.Config.RememberLeavePos)){ + if (TShock.RememberedPos.GetLeavePos(args.Player.Name, args.Player.IP) != Vector2.Zero) + { + Vector2 pos = TShock.RememberedPos.GetLeavePos(args.Player.Name, args.Player.IP); + + args.Player.Teleport((int) pos.X, (int) pos.Y + 3); + } + args.Player.LoginHarassed = false; + + }} else { args.Player.SendMessage("Incorrect password", Color.LimeGreen); diff --git a/TShockAPI/TSPlayer.cs b/TShockAPI/TSPlayer.cs index 441543c5..0dd7ff1f 100644 --- a/TShockAPI/TSPlayer.cs +++ b/TShockAPI/TSPlayer.cs @@ -76,12 +76,12 @@ namespace TShockAPI public bool RequiresPassword; public bool SilentKickInProgress; public List IceTiles; - public long RPm=1; - public long WPm=1; - public long SPm=1; - public long BPm=1; + public long RPm = 1; + public long WPm = 1; + public long SPm = 1; + public long BPm = 1; public long LoginMS; - + public bool LoginHarassed = false; public bool RealPlayer { get { return Index >= 0 && Index < Main.maxNetPlayers && Main.player[Index] != null; } @@ -257,6 +257,10 @@ namespace TShockAPI //The error occurs when a tile trys to update which the client hasnt load yet, Clients only update tiles withen 150 blocks //Try 300 if it does not work (Higher number - Longer load times - Less chance of error) //Should we properly send sections so that clients don't get tiles twice? + SendTileSquare(tilex, tiley, 150); + +/* //We shouldn't need this section anymore -it can prevent otherwise acceptable teleportation under some circumstances. + if (!SendTileSquare(tilex, tiley, 150)) { InitSpawn = true; @@ -264,6 +268,7 @@ namespace TShockAPI return false; } +*/ Spawn(-1, -1); SendWorldInfo(Main.spawnTileX, Main.spawnTileY, false); diff --git a/TShockAPI/TShock.cs b/TShockAPI/TShock.cs index 6c8e8054..dc527da0 100644 --- a/TShockAPI/TShock.cs +++ b/TShockAPI/TShock.cs @@ -686,7 +686,7 @@ namespace TShockAPI InventoryDB.InsertPlayerData(tsplr); } - if (Config.RememberLeavePos) + if ((Config.RememberLeavePos) &&(!tsplr.LoginHarassed)) { RememberedPos.InsertLeavePos(tsplr.Name, tsplr.IP, (int) (tsplr.X/16), (int) (tsplr.Y/16)); } @@ -860,10 +860,12 @@ namespace TShockAPI player.SendMessage( player.IgnoreActionsForInventory = "Server Side Inventory is enabled! Please /register or /login to play!", Color.Red); + player.LoginHarassed = true; } else if (Config.RequireLogin) { player.SendMessage("Please /register or /login to play!", Color.Red); + player.LoginHarassed = true; } } From 16b3e51b4b1cf75497c90adde77bde587fcfcd6e Mon Sep 17 00:00:00 2001 From: k0rd Date: Wed, 8 Feb 2012 00:56:45 -0500 Subject: [PATCH 02/73] (REST) add max slots to /status --- TShockAPI/Rest/RestManager.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/TShockAPI/Rest/RestManager.cs b/TShockAPI/Rest/RestManager.cs index 50e029a6..0de04184 100644 --- a/TShockAPI/Rest/RestManager.cs +++ b/TShockAPI/Rest/RestManager.cs @@ -148,6 +148,7 @@ namespace TShockAPI ret["playercount"] = Convert.ToString(activeplayers.Count()); ret["players"] = currentPlayers; + ret["maxplayers"] = TShock.Config.MaxSlots; return ret; } @@ -651,4 +652,4 @@ namespace TShockAPI #endregion } -} \ No newline at end of file +} From ee20946cdd8dd7c7204804694bc16e2899619fee Mon Sep 17 00:00:00 2001 From: Lucas Nicodemus Date: Thu, 9 Feb 2012 21:43:35 -0700 Subject: [PATCH 03/73] REST endpoint /v2/users/activelist now null checks and works with 0 players. Fixes #362 --- TShockAPI/Properties/AssemblyInfo.cs | 4 +- TShockAPI/Rest/RestManager.cs | 4 + TShockAPI/TShock.cs | 2916 +++++++++++++------------- 3 files changed, 1464 insertions(+), 1460 deletions(-) diff --git a/TShockAPI/Properties/AssemblyInfo.cs b/TShockAPI/Properties/AssemblyInfo.cs index 5a72e5d3..c9e9f598 100644 --- a/TShockAPI/Properties/AssemblyInfo.cs +++ b/TShockAPI/Properties/AssemblyInfo.cs @@ -48,5 +48,5 @@ using System.Runtime.InteropServices; // Build Number // MMdd of the build -[assembly: AssemblyVersion("3.7.0.0204")] -[assembly: AssemblyFileVersion("3.7.0.0204")] +[assembly: AssemblyVersion("3.7.0.0209")] +[assembly: AssemblyFileVersion("3.7.0.0209")] diff --git a/TShockAPI/Rest/RestManager.cs b/TShockAPI/Rest/RestManager.cs index 0de04184..65ff601b 100644 --- a/TShockAPI/Rest/RestManager.cs +++ b/TShockAPI/Rest/RestManager.cs @@ -161,6 +161,10 @@ namespace TShockAPI string playerlist = ""; foreach (var TSPlayer in TShock.Players) { + if (TSPlayer == null) + { + continue; + } playerlist += playerlist == "" ? TSPlayer.UserAccountName : "\t" + TSPlayer.UserAccountName; } var returnBlock = new Dictionary(); diff --git a/TShockAPI/TShock.cs b/TShockAPI/TShock.cs index dc527da0..d9de18fb 100644 --- a/TShockAPI/TShock.cs +++ b/TShockAPI/TShock.cs @@ -1,1460 +1,1460 @@ -/* -TShock, a server mod for Terraria -Copyright (C) 2011 The TShock Team - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Data; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.Globalization; -using System.IO; -using System.Net; -using System.Reflection; -using System.Threading; -using Hooks; -using MaxMind; -using Mono.Data.Sqlite; -using MySql.Data.MySqlClient; -using Rests; -using Terraria; -using TShockAPI.DB; -using TShockAPI.Net; - -namespace TShockAPI -{ - [APIVersion(1, 11)] - public class TShock : TerrariaPlugin - { - public static readonly Version VersionNum = Assembly.GetExecutingAssembly().GetName().Version; - public static readonly string VersionCodename = "Squashing bugs, and adding suggestions"; - - public static string SavePath = "tshock"; - - public static TSPlayer[] Players = new TSPlayer[Main.maxPlayers]; - public static BanManager Bans; - public static WarpManager Warps; - public static RegionManager Regions; - public static BackupManager Backups; - public static GroupManager Groups; - public static UserManager Users; - public static ItemManager Itembans; - public static RemeberedPosManager RememberedPos; - public static InventoryManager InventoryDB; - public static ConfigFile Config { get; set; } - public static IDbConnection DB; - public static bool OverridePort; - public static PacketBufferer PacketBuffer; - public static GeoIPCountry Geo; - public static SecureRest RestApi; - public static RestManager RestManager; - public static Utils Utils = new Utils(); - public static StatTracker StatTracker = new StatTracker(); - /// - /// Used for implementing REST Tokens prior to the REST system starting up. - /// - public static Dictionary RESTStartupTokens = new Dictionary(); - - /// - /// Called after TShock is initialized. Useful for plugins that needs hooks before tshock but also depend on tshock being loaded. - /// - public static event Action Initialized; - - - public override Version Version - { - get { return VersionNum; } - } - - public override string Name - { - get { return "TShock"; } - } - - public override string Author - { - get { return "The Nyx Team"; } - } - - public override string Description - { - get { return "The administration modification of the future."; } - } - - public TShock(Main game) - : base(game) - { - Config = new ConfigFile(); - Order = 0; - } - - - [SuppressMessage("Microsoft.Security", "CA2122:DoNotIndirectlyExposeMethodsWithLinkDemands")] - public override void Initialize() - { - HandleCommandLine(Environment.GetCommandLineArgs()); - - if (!Directory.Exists(SavePath)) - Directory.CreateDirectory(SavePath); - - DateTime now = DateTime.Now; -#if DEBUG - Log.Initialize(Path.Combine(SavePath, now.ToString("yyyyMMddHHmmss")+".log"), LogLevel.All, false); -#else - Log.Initialize(Path.Combine(SavePath, now.ToString("yyyyMMddHHmmss")+".log"), LogLevel.All & ~LogLevel.Debug, false); -#endif - AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; - - try - { - if (File.Exists(Path.Combine(SavePath, "tshock.pid"))) - { - Log.ConsoleInfo( - "TShock was improperly shut down. Please avoid this in the future, world corruption may result from this."); - File.Delete(Path.Combine(SavePath, "tshock.pid")); - } - File.WriteAllText(Path.Combine(SavePath, "tshock.pid"), Process.GetCurrentProcess().Id.ToString(CultureInfo.InvariantCulture)); - - ConfigFile.ConfigRead += OnConfigRead; - FileTools.SetupConfig(); - - HandleCommandLinePostConfigLoad(Environment.GetCommandLineArgs()); - - if (Config.StorageType.ToLower() == "sqlite") - { - string sql = Path.Combine(SavePath, "tshock.sqlite"); - DB = new SqliteConnection(string.Format("uri=file://{0},Version=3", sql)); - } - else if (Config.StorageType.ToLower() == "mysql") - { - try - { - var hostport = Config.MySqlHost.Split(':'); - DB = new MySqlConnection(); - DB.ConnectionString = - String.Format("Server={0}; Port={1}; Database={2}; Uid={3}; Pwd={4};", - hostport[0], - hostport.Length > 1 ? hostport[1] : "3306", - Config.MySqlDbName, - Config.MySqlUsername, - Config.MySqlPassword - ); - } - catch (MySqlException ex) - { - Log.Error(ex.ToString()); - throw new Exception("MySql not setup correctly"); - } - } - else - { - throw new Exception("Invalid storage type"); - } - - Backups = new BackupManager(Path.Combine(SavePath, "backups")); - Backups.KeepFor = Config.BackupKeepFor; - Backups.Interval = Config.BackupInterval; - Bans = new BanManager(DB); - Warps = new WarpManager(DB); - Users = new UserManager(DB); - Groups = new GroupManager(DB); - Groups.LoadPermisions(); - Regions = new RegionManager(DB); - Itembans = new ItemManager(DB); - RememberedPos = new RemeberedPosManager(DB); - InventoryDB = new InventoryManager(DB); - RestApi = new SecureRest(Netplay.serverListenIP, Config.RestApiPort); - RestApi.Verify += RestApi_Verify; - RestApi.Port = Config.RestApiPort; - RestManager = new RestManager(RestApi); - RestManager.RegisterRestfulCommands(); - - var geoippath = Path.Combine(SavePath, "GeoIP.dat"); - if (Config.EnableGeoIP && File.Exists(geoippath)) - Geo = new GeoIPCountry(geoippath); - - Console.Title = string.Format("TerrariaShock Version {0} ({1})", Version, VersionCodename); - Log.ConsoleInfo(string.Format("TerrariaShock Version {0} ({1}) now running.", Version, VersionCodename)); - - GameHooks.PostInitialize += OnPostInit; - GameHooks.Update += OnUpdate; - ServerHooks.Connect += OnConnect; - ServerHooks.Join += OnJoin; - ServerHooks.Leave += OnLeave; - ServerHooks.Chat += OnChat; - ServerHooks.Command += ServerHooks_OnCommand; - NetHooks.GetData += OnGetData; - NetHooks.SendData += NetHooks_SendData; - NetHooks.GreetPlayer += OnGreetPlayer; - NpcHooks.StrikeNpc += NpcHooks_OnStrikeNpc; - NpcHooks.SetDefaultsInt += OnNpcSetDefaults; - ProjectileHooks.SetDefaults += OnProjectileSetDefaults; - WorldHooks.StartHardMode += OnStartHardMode; - WorldHooks.SaveWorld += OnSaveWorld; - - GetDataHandlers.InitGetDataHandler(); - Commands.InitCommands(); - //RconHandler.StartThread(); - - if (Config.BufferPackets) - PacketBuffer = new PacketBufferer(); - - Log.ConsoleInfo("AutoSave " + (Config.AutoSave ? "Enabled" : "Disabled")); - Log.ConsoleInfo("Backups " + (Backups.Interval > 0 ? "Enabled" : "Disabled")); - - if (Initialized != null) - Initialized(); - } - catch (Exception ex) - { - Log.Error("Fatal Startup Exception"); - Log.Error(ex.ToString()); - Environment.Exit(1); - } - } - - private RestObject RestApi_Verify(string username, string password) - { - var userAccount = Users.GetUserByName(username); - if (userAccount == null) - { - return new RestObject("401") - {Error = "Invalid username/password combination provided. Please re-submit your query with a correct pair."}; - } - - if (Utils.HashPassword(password).ToUpper() != userAccount.Password.ToUpper()) - { - return new RestObject("401") - {Error = "Invalid username/password combination provided. Please re-submit your query with a correct pair."}; - } - - if (!Utils.GetGroup(userAccount.Group).HasPermission("api") && userAccount.Group != "superadmin") - { - return new RestObject("403") - { - Error = - "Although your account was successfully found and identified, your account lacks the permission required to use the API. (api)" - }; - } - - return new RestObject("200") {Response = "Successful login"}; //Maybe return some user info too? - } - - protected override void Dispose(bool disposing) - { - if (disposing) - { - if (Geo != null) - { - Geo.Dispose(); - } - GameHooks.PostInitialize -= OnPostInit; - GameHooks.Update -= OnUpdate; - ServerHooks.Connect -= OnConnect; - ServerHooks.Join -= OnJoin; - ServerHooks.Leave -= OnLeave; - ServerHooks.Chat -= OnChat; - ServerHooks.Command -= ServerHooks_OnCommand; - NetHooks.GetData -= OnGetData; - NetHooks.SendData -= NetHooks_SendData; - NetHooks.GreetPlayer -= OnGreetPlayer; - NpcHooks.StrikeNpc -= NpcHooks_OnStrikeNpc; - NpcHooks.SetDefaultsInt -= OnNpcSetDefaults; - ProjectileHooks.SetDefaults -= OnProjectileSetDefaults; - WorldHooks.StartHardMode -= OnStartHardMode; - WorldHooks.SaveWorld -= OnSaveWorld; - if (File.Exists(Path.Combine(SavePath, "tshock.pid"))) - { - File.Delete(Path.Combine(SavePath, "tshock.pid")); - } - RestApi.Dispose(); - Log.Dispose(); - } - - base.Dispose(disposing); - } - - /// - /// Handles exceptions that we didn't catch or that Red fucked up - /// - /// - /// - private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) - { - Log.Error(e.ExceptionObject.ToString()); - - if (e.ExceptionObject.ToString().Contains("Terraria.Netplay.ListenForClients") || - e.ExceptionObject.ToString().Contains("Terraria.Netplay.ServerLoop")) - { - var sb = new List(); - for (int i = 0; i < Netplay.serverSock.Length; i++) - { - if (Netplay.serverSock[i] == null) - { - sb.Add("Sock[" + i + "]"); - } - else if (Netplay.serverSock[i].tcpClient == null) - { - sb.Add("Tcp[" + i + "]"); - } - } - Log.Error(string.Join(", ", sb)); - } - - if (e.IsTerminating) - { - if (Main.worldPathName != null && Config.SaveWorldOnCrash) - { - Main.worldPathName += ".crash"; - WorldGen.saveWorld(); - } - } - } - - private void HandleCommandLine(string[] parms) - { - for (int i = 0; i < parms.Length; i++) - { - if (parms[i].ToLower() == "-configpath") - { - var path = parms[++i]; - if (path.IndexOfAny(Path.GetInvalidPathChars()) == -1) - { - SavePath = path; - Log.ConsoleInfo("Config path has been set to " + path); - } - } - if (parms[i].ToLower() == "-worldpath") - { - var path = parms[++i]; - if (path.IndexOfAny(Path.GetInvalidPathChars()) == -1) - { - Main.WorldPath = path; - Log.ConsoleInfo("World path has been set to " + path); - } - } - if (parms[i].ToLower() == "-dump") - { - ConfigFile.DumpDescriptions(); - Permissions.DumpDescriptions(); - } - } - } - - private void HandleCommandLinePostConfigLoad(string[] parms) - { - for (int i = 0; i < parms.Length; i++) - { - if (parms[i].ToLower() == "-port") - { - int port = Convert.ToInt32(parms[++i]); - Netplay.serverPort = port; - Config.ServerPort = port; - OverridePort = true; - Log.ConsoleInfo("Port overridden by startup argument. Set to " + port); - } - if (parms[i].ToLower() == "-rest-token") - { - string token = Convert.ToString(parms[++i]); - RESTStartupTokens.Add(token, "null"); - Console.WriteLine("Startup parameter overrode REST token."); - } - if (parms[i].ToLower() == "-rest-enabled") - { - Config.RestApiEnabled = Convert.ToBoolean(parms[++i]); - Console.WriteLine("Startup parameter overrode REST enable."); - - } - if (parms[i].ToLower() == "-rest-port") - { - Config.RestApiPort = Convert.ToInt32(parms[++i]); - Console.WriteLine("Startup parameter overrode REST port."); - - } - } - } - - /* - * Hooks: - * - */ - - public static int AuthToken = -1; - - private void OnPostInit() - { - if (!File.Exists(Path.Combine(SavePath, "auth.lck")) && !File.Exists(Path.Combine(SavePath, "authcode.txt"))) - { - var r = new Random((int) DateTime.Now.ToBinary()); - AuthToken = r.Next(100000, 10000000); - Console.ForegroundColor = ConsoleColor.Yellow; - Console.WriteLine("TShock Notice: To become SuperAdmin, join the game and type /auth " + AuthToken); - Console.WriteLine("This token will display until disabled by verification. (/auth-verify)"); - Console.ForegroundColor = ConsoleColor.Gray; - FileTools.CreateFile(Path.Combine(SavePath, "authcode.txt")); - using (var tw = new StreamWriter(Path.Combine(SavePath, "authcode.txt"))) - { - tw.WriteLine(AuthToken); - } - } - else if (File.Exists(Path.Combine(SavePath, "authcode.txt"))) - { - using (var tr = new StreamReader(Path.Combine(SavePath, "authcode.txt"))) - { - AuthToken = Convert.ToInt32(tr.ReadLine()); - } - Console.ForegroundColor = ConsoleColor.Yellow; - Console.WriteLine( - "TShock Notice: authcode.txt is still present, and the AuthToken located in that file will be used."); - Console.WriteLine("To become superadmin, join the game and type /auth " + AuthToken); - Console.WriteLine("This token will display until disabled by verification. (/auth-verify)"); - Console.ForegroundColor = ConsoleColor.Gray; - } - else - { - AuthToken = 0; - } - Regions.ReloadAllRegions(); - if (Config.RestApiEnabled) - RestApi.Start(); - - StatTracker.CheckIn(); - FixChestStacks(); - } - - private void FixChestStacks() - { - foreach (Chest chest in Main.chest) - { - if (chest != null) - { - foreach (Item item in chest.item) - { - if (item != null && item.stack > item.maxStack) - item.stack = item.maxStack; - } - } - } - } - - private DateTime LastCheck = DateTime.UtcNow; - private DateTime LastSave = DateTime.UtcNow; - - private void OnUpdate() - { - UpdateManager.UpdateProcedureCheck(); - StatTracker.CheckIn(); - if (Backups.IsBackupTime) - Backups.Backup(); - - //call these every second, not every update - if ((DateTime.UtcNow - LastCheck).TotalSeconds >= 1) - { - OnSecondUpdate(); - LastCheck = DateTime.UtcNow; - } - - if ((DateTime.UtcNow - LastSave).TotalMinutes >= Config.ServerSideInventorySave) - { - foreach (TSPlayer player in Players) - { - // prevent null point exceptions - if (player != null && player.IsLoggedIn && !player.IgnoreActionsForClearingTrashCan) - { - - InventoryDB.InsertPlayerData(player); - } - } - LastSave = DateTime.UtcNow; - } - } - - private void OnSecondUpdate() - { - if (Config.ForceTime != "normal") - { - switch (Config.ForceTime) - { - case "day": - TSPlayer.Server.SetTime(true, 27000.0); - break; - case "night": - TSPlayer.Server.SetTime(false, 16200.0); - break; - } - } - int count = 0; - foreach (TSPlayer player in Players) - { - if (player != null && player.Active) - { - count++; - if (player.TilesDestroyed != null) - { - if (player.TileKillThreshold >= Config.TileKillThreshold) - { - player.Disable("Reached TileKill threshold"); - TSPlayer.Server.RevertTiles(player.TilesDestroyed); - player.TilesDestroyed.Clear(); - } - } - if (player.TileKillThreshold > 0) - { - player.TileKillThreshold = 0; - //We don't want to revert the entire map in case of a disable. - player.TilesDestroyed.Clear(); - } - if (player.TilesCreated != null) - { - if (player.TilePlaceThreshold >= Config.TilePlaceThreshold) - { - player.Disable("Reached TilePlace threshold"); - TSPlayer.Server.RevertTiles(player.TilesCreated); - player.TilesCreated.Clear(); - } - } - if (player.TilePlaceThreshold > 0) - { - player.TilePlaceThreshold = 0; - } - if (player.TileLiquidThreshold >= Config.TileLiquidThreshold) - { - player.Disable("Reached TileLiquid threshold"); - } - if (player.TileLiquidThreshold > 0) - { - player.TileLiquidThreshold = 0; - } - if (player.ProjectileThreshold >= Config.ProjectileThreshold) - { - player.Disable("Reached Projectile threshold"); - } - if (player.ProjectileThreshold > 0) - { - player.ProjectileThreshold = 0; - } - if (player.Dead && (DateTime.Now - player.LastDeath).Seconds >= 3 && player.Difficulty != 2) - { - player.Spawn(); - } - string check = "none"; - foreach (Item item in player.TPlayer.inventory) - { - if (!player.Group.HasPermission(Permissions.ignorestackhackdetection) && item.stack > item.maxStack && - item.type != 0) - { - check = "Remove Item " + item.name + " (" + item.stack + ") exceeds max stack of " + item.maxStack; - } - } - player.IgnoreActionsForCheating = check; - check = "none"; - foreach (Item item in player.TPlayer.armor) - { - if (!player.Group.HasPermission(Permissions.usebanneditem) && Itembans.ItemIsBanned(item.name, player)) - { - player.SetBuff(30, 120); //Bleeding - player.SetBuff(36, 120); //Broken Armor - check = "Remove Armor/Accessory " + item.name; - } - } - player.IgnoreActionsForDisabledArmor = check; - if (CheckIgnores(player)) - { - player.SetBuff(33, 120); //Weak - player.SetBuff(32, 120); //Slow - player.SetBuff(23, 120); //Cursed - } - else if (!player.Group.HasPermission(Permissions.usebanneditem) && - Itembans.ItemIsBanned(player.TPlayer.inventory[player.TPlayer.selectedItem].name, player)) - { - player.SetBuff(23, 120); //Cursed - } - } - } - Console.Title = string.Format("TerrariaShock Version {0} ({1}) ({2}/{3})", Version, VersionCodename, count, - Config.MaxSlots); - } - - private void OnConnect(int ply, HandledEventArgs handler) - { - var player = new TSPlayer(ply); - if (Config.EnableDNSHostResolution) - { - player.Group = Users.GetGroupForIPExpensive(player.IP); - } - else - { - player.Group = Users.GetGroupForIP(player.IP); - } - - if (Utils.ActivePlayers() + 1 > Config.MaxSlots + 20) - { - Utils.ForceKick(player, Config.ServerFullNoReservedReason); - handler.Handled = true; - return; - } - - var ipban = Bans.GetBanByIp(player.IP); - Ban ban = null; - if (ipban != null && Config.EnableIPBans) - ban = ipban; - - if (ban != null) - { - Utils.ForceKick(player, string.Format("You are banned: {0}", ban.Reason)); - handler.Handled = true; - return; - } - - if (!FileTools.OnWhitelist(player.IP)) - { - Utils.ForceKick(player, "Not on whitelist."); - handler.Handled = true; - return; - } - - if (Geo != null) - { - var code = Geo.TryGetCountryCode(IPAddress.Parse(player.IP)); - player.Country = code == null ? "N/A" : GeoIPCountry.GetCountryNameByCode(code); - if (code == "A1") - { - if (Config.KickProxyUsers) - { - Utils.ForceKick(player, "Proxies are not allowed"); - handler.Handled = true; - return; - } - } - } - Players[ply] = player; - } - - private void OnJoin(int ply, HandledEventArgs handler) - { - var player = Players[ply]; - if (player == null) - { - handler.Handled = true; - return; - } - - var nameban = Bans.GetBanByName(player.Name); - Ban ban = null; - if (nameban != null && Config.EnableBanOnUsernames) - ban = nameban; - - if (ban != null) - { - Utils.ForceKick(player, string.Format("You are banned: {0}", ban.Reason)); - handler.Handled = true; - return; - } - } - - private void OnLeave(int ply) - { - - var tsplr = Players[ply]; - Players[ply] = null; - - if (tsplr != null && tsplr.ReceivedInfo) - { - if (!tsplr.SilentKickInProgress) - { - Utils.Broadcast(tsplr.Name + " left", Color.Yellow); - } - Log.Info(string.Format("{0} left.", tsplr.Name)); - - if (tsplr.IsLoggedIn && !tsplr.IgnoreActionsForClearingTrashCan) - { - tsplr.PlayerData.CopyInventory(tsplr); - InventoryDB.InsertPlayerData(tsplr); - } - - if ((Config.RememberLeavePos) &&(!tsplr.LoginHarassed)) - { - RememberedPos.InsertLeavePos(tsplr.Name, tsplr.IP, (int) (tsplr.X/16), (int) (tsplr.Y/16)); - } - } - } - - private void OnChat(messageBuffer msg, int ply, string text, HandledEventArgs e) - { - if (e.Handled) - return; - - var tsplr = Players[msg.whoAmI]; - if (tsplr == null) - { - e.Handled = true; - return; - } - - /*if (!Utils.ValidString(text)) - { - e.Handled = true; - return; - }*/ - - if (text.StartsWith("/")) - { - try - { - e.Handled = Commands.HandleCommand(tsplr, text); - } - catch (Exception ex) - { - Log.ConsoleError("Command exception"); - Log.Error(ex.ToString()); - } - } - else if (!tsplr.mute) - { - Utils.Broadcast( - String.Format(Config.ChatFormat, tsplr.Group.Name, tsplr.Group.Prefix, tsplr.Name, tsplr.Group.Suffix, text), - tsplr.Group.R, tsplr.Group.G, tsplr.Group.B); - e.Handled = true; - } - else if (tsplr.mute) - { - tsplr.SendMessage("You are muted!"); - e.Handled = true; - } - } - - /// - /// When a server command is run. - /// - /// - /// - private void ServerHooks_OnCommand(string text, HandledEventArgs e) - { - if (e.Handled) - return; - - // Damn you ThreadStatic and Redigit - if (Main.rand == null) - { - Main.rand = new Random(); - } - if (WorldGen.genRand == null) - { - WorldGen.genRand = new Random(); - } - - if (text.StartsWith("playing") || text.StartsWith("/playing")) - { - int count = 0; - foreach (TSPlayer player in Players) - { - if (player != null && player.Active) - { - count++; - TSPlayer.Server.SendMessage(string.Format("{0} ({1}) [{2}] <{3}>", player.Name, player.IP, - player.Group.Name, player.UserAccountName)); - } - } - TSPlayer.Server.SendMessage(string.Format("{0} players connected.", count)); - } - else if (text == "autosave") - { - Main.autoSave = Config.AutoSave = !Config.AutoSave; - Log.ConsoleInfo("AutoSave " + (Config.AutoSave ? "Enabled" : "Disabled")); - } - else if (text.StartsWith("/")) - { - Commands.HandleCommand(TSPlayer.Server, text); - } - else - { - Commands.HandleCommand(TSPlayer.Server, "/" + text); - } - e.Handled = true; - } - - private void OnGetData(GetDataEventArgs e) - { - if (e.Handled) - return; - - PacketTypes type = e.MsgID; - - Debug.WriteLine("Recv: {0:X}: {2} ({1:XX})", e.Msg.whoAmI, (byte) type, type); - - var player = Players[e.Msg.whoAmI]; - if (player == null) - { - e.Handled = true; - return; - } - - if (!player.ConnectionAlive) - { - e.Handled = true; - return; - } - - if (player.RequiresPassword && type != PacketTypes.PasswordSend) - { - e.Handled = true; - return; - } - - if ((player.State < 10 || player.Dead) && (int) type > 12 && (int) type != 16 && (int) type != 42 && (int) type != 50 && - (int) type != 38 && (int) type != 5 && (int) type != 21) - { - e.Handled = true; - return; - } - - using (var data = new MemoryStream(e.Msg.readBuffer, e.Index, e.Length)) - { - try - { - if (GetDataHandlers.HandlerGetData(type, player, data)) - e.Handled = true; - } - catch (Exception ex) - { - Log.Error(ex.ToString()); - } - } - } - - private void OnGreetPlayer(int who, HandledEventArgs e) - { - var player = Players[who]; - if (player == null) - { - e.Handled = true; - return; - } - player.LoginMS= DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond; - - Utils.ShowFileToUser(player, "motd.txt"); - - if (Config.PvPMode == "always" && !player.TPlayer.hostile) - { - player.SendMessage("PvP is forced! Enable PvP else you can't move or do anything!", Color.Red); - } - - if (!player.IsLoggedIn) - { - if (Config.ServerSideInventory) - { - player.SendMessage( - player.IgnoreActionsForInventory = "Server Side Inventory is enabled! Please /register or /login to play!", - Color.Red); +/* +TShock, a server mod for Terraria +Copyright (C) 2011 The TShock Team + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; +using System.Globalization; +using System.IO; +using System.Net; +using System.Reflection; +using System.Threading; +using Hooks; +using MaxMind; +using Mono.Data.Sqlite; +using MySql.Data.MySqlClient; +using Rests; +using Terraria; +using TShockAPI.DB; +using TShockAPI.Net; + +namespace TShockAPI +{ + [APIVersion(1, 11)] + public class TShock : TerrariaPlugin + { + public static readonly Version VersionNum = Assembly.GetExecutingAssembly().GetName().Version; + public static readonly string VersionCodename = "Squashing bugs, and adding suggestions"; + + public static string SavePath = "tshock"; + + public static TSPlayer[] Players = new TSPlayer[Main.maxPlayers]; + public static BanManager Bans; + public static WarpManager Warps; + public static RegionManager Regions; + public static BackupManager Backups; + public static GroupManager Groups; + public static UserManager Users; + public static ItemManager Itembans; + public static RemeberedPosManager RememberedPos; + public static InventoryManager InventoryDB; + public static ConfigFile Config { get; set; } + public static IDbConnection DB; + public static bool OverridePort; + public static PacketBufferer PacketBuffer; + public static GeoIPCountry Geo; + public static SecureRest RestApi; + public static RestManager RestManager; + public static Utils Utils = new Utils(); + public static StatTracker StatTracker = new StatTracker(); + /// + /// Used for implementing REST Tokens prior to the REST system starting up. + /// + public static Dictionary RESTStartupTokens = new Dictionary(); + + /// + /// Called after TShock is initialized. Useful for plugins that needs hooks before tshock but also depend on tshock being loaded. + /// + public static event Action Initialized; + + + public override Version Version + { + get { return VersionNum; } + } + + public override string Name + { + get { return "TShock"; } + } + + public override string Author + { + get { return "The Nyx Team"; } + } + + public override string Description + { + get { return "The administration modification of the future."; } + } + + public TShock(Main game) + : base(game) + { + Config = new ConfigFile(); + Order = 0; + } + + + [SuppressMessage("Microsoft.Security", "CA2122:DoNotIndirectlyExposeMethodsWithLinkDemands")] + public override void Initialize() + { + HandleCommandLine(Environment.GetCommandLineArgs()); + + if (!Directory.Exists(SavePath)) + Directory.CreateDirectory(SavePath); + + DateTime now = DateTime.Now; +#if DEBUG + Log.Initialize(Path.Combine(SavePath, now.ToString("yyyyMMddHHmmss")+".log"), LogLevel.All, false); +#else + Log.Initialize(Path.Combine(SavePath, now.ToString("yyyyMMddHHmmss")+".log"), LogLevel.All & ~LogLevel.Debug, false); +#endif + AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; + + try + { + if (File.Exists(Path.Combine(SavePath, "tshock.pid"))) + { + Log.ConsoleInfo( + "TShock was improperly shut down. Please avoid this in the future, world corruption may result from this."); + File.Delete(Path.Combine(SavePath, "tshock.pid")); + } + File.WriteAllText(Path.Combine(SavePath, "tshock.pid"), Process.GetCurrentProcess().Id.ToString(CultureInfo.InvariantCulture)); + + ConfigFile.ConfigRead += OnConfigRead; + FileTools.SetupConfig(); + + HandleCommandLinePostConfigLoad(Environment.GetCommandLineArgs()); + + if (Config.StorageType.ToLower() == "sqlite") + { + string sql = Path.Combine(SavePath, "tshock.sqlite"); + DB = new SqliteConnection(string.Format("uri=file://{0},Version=3", sql)); + } + else if (Config.StorageType.ToLower() == "mysql") + { + try + { + var hostport = Config.MySqlHost.Split(':'); + DB = new MySqlConnection(); + DB.ConnectionString = + String.Format("Server={0}; Port={1}; Database={2}; Uid={3}; Pwd={4};", + hostport[0], + hostport.Length > 1 ? hostport[1] : "3306", + Config.MySqlDbName, + Config.MySqlUsername, + Config.MySqlPassword + ); + } + catch (MySqlException ex) + { + Log.Error(ex.ToString()); + throw new Exception("MySql not setup correctly"); + } + } + else + { + throw new Exception("Invalid storage type"); + } + + Backups = new BackupManager(Path.Combine(SavePath, "backups")); + Backups.KeepFor = Config.BackupKeepFor; + Backups.Interval = Config.BackupInterval; + Bans = new BanManager(DB); + Warps = new WarpManager(DB); + Users = new UserManager(DB); + Groups = new GroupManager(DB); + Groups.LoadPermisions(); + Regions = new RegionManager(DB); + Itembans = new ItemManager(DB); + RememberedPos = new RemeberedPosManager(DB); + InventoryDB = new InventoryManager(DB); + RestApi = new SecureRest(Netplay.serverListenIP, Config.RestApiPort); + RestApi.Verify += RestApi_Verify; + RestApi.Port = Config.RestApiPort; + RestManager = new RestManager(RestApi); + RestManager.RegisterRestfulCommands(); + + var geoippath = Path.Combine(SavePath, "GeoIP.dat"); + if (Config.EnableGeoIP && File.Exists(geoippath)) + Geo = new GeoIPCountry(geoippath); + + Console.Title = string.Format("TerrariaShock Version {0} ({1})", Version, VersionCodename); + Log.ConsoleInfo(string.Format("TerrariaShock Version {0} ({1}) now running.", Version, VersionCodename)); + + GameHooks.PostInitialize += OnPostInit; + GameHooks.Update += OnUpdate; + ServerHooks.Connect += OnConnect; + ServerHooks.Join += OnJoin; + ServerHooks.Leave += OnLeave; + ServerHooks.Chat += OnChat; + ServerHooks.Command += ServerHooks_OnCommand; + NetHooks.GetData += OnGetData; + NetHooks.SendData += NetHooks_SendData; + NetHooks.GreetPlayer += OnGreetPlayer; + NpcHooks.StrikeNpc += NpcHooks_OnStrikeNpc; + NpcHooks.SetDefaultsInt += OnNpcSetDefaults; + ProjectileHooks.SetDefaults += OnProjectileSetDefaults; + WorldHooks.StartHardMode += OnStartHardMode; + WorldHooks.SaveWorld += OnSaveWorld; + + GetDataHandlers.InitGetDataHandler(); + Commands.InitCommands(); + //RconHandler.StartThread(); + + if (Config.BufferPackets) + PacketBuffer = new PacketBufferer(); + + Log.ConsoleInfo("AutoSave " + (Config.AutoSave ? "Enabled" : "Disabled")); + Log.ConsoleInfo("Backups " + (Backups.Interval > 0 ? "Enabled" : "Disabled")); + + if (Initialized != null) + Initialized(); + } + catch (Exception ex) + { + Log.Error("Fatal Startup Exception"); + Log.Error(ex.ToString()); + Environment.Exit(1); + } + } + + private RestObject RestApi_Verify(string username, string password) + { + var userAccount = Users.GetUserByName(username); + if (userAccount == null) + { + return new RestObject("401") + {Error = "Invalid username/password combination provided. Please re-submit your query with a correct pair."}; + } + + if (Utils.HashPassword(password).ToUpper() != userAccount.Password.ToUpper()) + { + return new RestObject("401") + {Error = "Invalid username/password combination provided. Please re-submit your query with a correct pair."}; + } + + if (!Utils.GetGroup(userAccount.Group).HasPermission("api") && userAccount.Group != "superadmin") + { + return new RestObject("403") + { + Error = + "Although your account was successfully found and identified, your account lacks the permission required to use the API. (api)" + }; + } + + return new RestObject("200") {Response = "Successful login"}; //Maybe return some user info too? + } + + protected override void Dispose(bool disposing) + { + if (disposing) + { + if (Geo != null) + { + Geo.Dispose(); + } + GameHooks.PostInitialize -= OnPostInit; + GameHooks.Update -= OnUpdate; + ServerHooks.Connect -= OnConnect; + ServerHooks.Join -= OnJoin; + ServerHooks.Leave -= OnLeave; + ServerHooks.Chat -= OnChat; + ServerHooks.Command -= ServerHooks_OnCommand; + NetHooks.GetData -= OnGetData; + NetHooks.SendData -= NetHooks_SendData; + NetHooks.GreetPlayer -= OnGreetPlayer; + NpcHooks.StrikeNpc -= NpcHooks_OnStrikeNpc; + NpcHooks.SetDefaultsInt -= OnNpcSetDefaults; + ProjectileHooks.SetDefaults -= OnProjectileSetDefaults; + WorldHooks.StartHardMode -= OnStartHardMode; + WorldHooks.SaveWorld -= OnSaveWorld; + if (File.Exists(Path.Combine(SavePath, "tshock.pid"))) + { + File.Delete(Path.Combine(SavePath, "tshock.pid")); + } + RestApi.Dispose(); + Log.Dispose(); + } + + base.Dispose(disposing); + } + + /// + /// Handles exceptions that we didn't catch or that Red fucked up + /// + /// + /// + private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) + { + Log.Error(e.ExceptionObject.ToString()); + + if (e.ExceptionObject.ToString().Contains("Terraria.Netplay.ListenForClients") || + e.ExceptionObject.ToString().Contains("Terraria.Netplay.ServerLoop")) + { + var sb = new List(); + for (int i = 0; i < Netplay.serverSock.Length; i++) + { + if (Netplay.serverSock[i] == null) + { + sb.Add("Sock[" + i + "]"); + } + else if (Netplay.serverSock[i].tcpClient == null) + { + sb.Add("Tcp[" + i + "]"); + } + } + Log.Error(string.Join(", ", sb)); + } + + if (e.IsTerminating) + { + if (Main.worldPathName != null && Config.SaveWorldOnCrash) + { + Main.worldPathName += ".crash"; + WorldGen.saveWorld(); + } + } + } + + private void HandleCommandLine(string[] parms) + { + for (int i = 0; i < parms.Length; i++) + { + if (parms[i].ToLower() == "-configpath") + { + var path = parms[++i]; + if (path.IndexOfAny(Path.GetInvalidPathChars()) == -1) + { + SavePath = path; + Log.ConsoleInfo("Config path has been set to " + path); + } + } + if (parms[i].ToLower() == "-worldpath") + { + var path = parms[++i]; + if (path.IndexOfAny(Path.GetInvalidPathChars()) == -1) + { + Main.WorldPath = path; + Log.ConsoleInfo("World path has been set to " + path); + } + } + if (parms[i].ToLower() == "-dump") + { + ConfigFile.DumpDescriptions(); + Permissions.DumpDescriptions(); + } + } + } + + private void HandleCommandLinePostConfigLoad(string[] parms) + { + for (int i = 0; i < parms.Length; i++) + { + if (parms[i].ToLower() == "-port") + { + int port = Convert.ToInt32(parms[++i]); + Netplay.serverPort = port; + Config.ServerPort = port; + OverridePort = true; + Log.ConsoleInfo("Port overridden by startup argument. Set to " + port); + } + if (parms[i].ToLower() == "-rest-token") + { + string token = Convert.ToString(parms[++i]); + RESTStartupTokens.Add(token, "null"); + Console.WriteLine("Startup parameter overrode REST token."); + } + if (parms[i].ToLower() == "-rest-enabled") + { + Config.RestApiEnabled = Convert.ToBoolean(parms[++i]); + Console.WriteLine("Startup parameter overrode REST enable."); + + } + if (parms[i].ToLower() == "-rest-port") + { + Config.RestApiPort = Convert.ToInt32(parms[++i]); + Console.WriteLine("Startup parameter overrode REST port."); + + } + } + } + + /* + * Hooks: + * + */ + + public static int AuthToken = -1; + + private void OnPostInit() + { + if (!File.Exists(Path.Combine(SavePath, "auth.lck")) && !File.Exists(Path.Combine(SavePath, "authcode.txt"))) + { + var r = new Random((int) DateTime.Now.ToBinary()); + AuthToken = r.Next(100000, 10000000); + Console.ForegroundColor = ConsoleColor.Yellow; + Console.WriteLine("TShock Notice: To become SuperAdmin, join the game and type /auth " + AuthToken); + Console.WriteLine("This token will display until disabled by verification. (/auth-verify)"); + Console.ForegroundColor = ConsoleColor.Gray; + FileTools.CreateFile(Path.Combine(SavePath, "authcode.txt")); + using (var tw = new StreamWriter(Path.Combine(SavePath, "authcode.txt"))) + { + tw.WriteLine(AuthToken); + } + } + else if (File.Exists(Path.Combine(SavePath, "authcode.txt"))) + { + using (var tr = new StreamReader(Path.Combine(SavePath, "authcode.txt"))) + { + AuthToken = Convert.ToInt32(tr.ReadLine()); + } + Console.ForegroundColor = ConsoleColor.Yellow; + Console.WriteLine( + "TShock Notice: authcode.txt is still present, and the AuthToken located in that file will be used."); + Console.WriteLine("To become superadmin, join the game and type /auth " + AuthToken); + Console.WriteLine("This token will display until disabled by verification. (/auth-verify)"); + Console.ForegroundColor = ConsoleColor.Gray; + } + else + { + AuthToken = 0; + } + Regions.ReloadAllRegions(); + if (Config.RestApiEnabled) + RestApi.Start(); + + StatTracker.CheckIn(); + FixChestStacks(); + } + + private void FixChestStacks() + { + foreach (Chest chest in Main.chest) + { + if (chest != null) + { + foreach (Item item in chest.item) + { + if (item != null && item.stack > item.maxStack) + item.stack = item.maxStack; + } + } + } + } + + private DateTime LastCheck = DateTime.UtcNow; + private DateTime LastSave = DateTime.UtcNow; + + private void OnUpdate() + { + UpdateManager.UpdateProcedureCheck(); + StatTracker.CheckIn(); + if (Backups.IsBackupTime) + Backups.Backup(); + + //call these every second, not every update + if ((DateTime.UtcNow - LastCheck).TotalSeconds >= 1) + { + OnSecondUpdate(); + LastCheck = DateTime.UtcNow; + } + + if ((DateTime.UtcNow - LastSave).TotalMinutes >= Config.ServerSideInventorySave) + { + foreach (TSPlayer player in Players) + { + // prevent null point exceptions + if (player != null && player.IsLoggedIn && !player.IgnoreActionsForClearingTrashCan) + { + + InventoryDB.InsertPlayerData(player); + } + } + LastSave = DateTime.UtcNow; + } + } + + private void OnSecondUpdate() + { + if (Config.ForceTime != "normal") + { + switch (Config.ForceTime) + { + case "day": + TSPlayer.Server.SetTime(true, 27000.0); + break; + case "night": + TSPlayer.Server.SetTime(false, 16200.0); + break; + } + } + int count = 0; + foreach (TSPlayer player in Players) + { + if (player != null && player.Active) + { + count++; + if (player.TilesDestroyed != null) + { + if (player.TileKillThreshold >= Config.TileKillThreshold) + { + player.Disable("Reached TileKill threshold"); + TSPlayer.Server.RevertTiles(player.TilesDestroyed); + player.TilesDestroyed.Clear(); + } + } + if (player.TileKillThreshold > 0) + { + player.TileKillThreshold = 0; + //We don't want to revert the entire map in case of a disable. + player.TilesDestroyed.Clear(); + } + if (player.TilesCreated != null) + { + if (player.TilePlaceThreshold >= Config.TilePlaceThreshold) + { + player.Disable("Reached TilePlace threshold"); + TSPlayer.Server.RevertTiles(player.TilesCreated); + player.TilesCreated.Clear(); + } + } + if (player.TilePlaceThreshold > 0) + { + player.TilePlaceThreshold = 0; + } + if (player.TileLiquidThreshold >= Config.TileLiquidThreshold) + { + player.Disable("Reached TileLiquid threshold"); + } + if (player.TileLiquidThreshold > 0) + { + player.TileLiquidThreshold = 0; + } + if (player.ProjectileThreshold >= Config.ProjectileThreshold) + { + player.Disable("Reached Projectile threshold"); + } + if (player.ProjectileThreshold > 0) + { + player.ProjectileThreshold = 0; + } + if (player.Dead && (DateTime.Now - player.LastDeath).Seconds >= 3 && player.Difficulty != 2) + { + player.Spawn(); + } + string check = "none"; + foreach (Item item in player.TPlayer.inventory) + { + if (!player.Group.HasPermission(Permissions.ignorestackhackdetection) && item.stack > item.maxStack && + item.type != 0) + { + check = "Remove Item " + item.name + " (" + item.stack + ") exceeds max stack of " + item.maxStack; + } + } + player.IgnoreActionsForCheating = check; + check = "none"; + foreach (Item item in player.TPlayer.armor) + { + if (!player.Group.HasPermission(Permissions.usebanneditem) && Itembans.ItemIsBanned(item.name, player)) + { + player.SetBuff(30, 120); //Bleeding + player.SetBuff(36, 120); //Broken Armor + check = "Remove Armor/Accessory " + item.name; + } + } + player.IgnoreActionsForDisabledArmor = check; + if (CheckIgnores(player)) + { + player.SetBuff(33, 120); //Weak + player.SetBuff(32, 120); //Slow + player.SetBuff(23, 120); //Cursed + } + else if (!player.Group.HasPermission(Permissions.usebanneditem) && + Itembans.ItemIsBanned(player.TPlayer.inventory[player.TPlayer.selectedItem].name, player)) + { + player.SetBuff(23, 120); //Cursed + } + } + } + Console.Title = string.Format("TerrariaShock Version {0} ({1}) ({2}/{3})", Version, VersionCodename, count, + Config.MaxSlots); + } + + private void OnConnect(int ply, HandledEventArgs handler) + { + var player = new TSPlayer(ply); + if (Config.EnableDNSHostResolution) + { + player.Group = Users.GetGroupForIPExpensive(player.IP); + } + else + { + player.Group = Users.GetGroupForIP(player.IP); + } + + if (Utils.ActivePlayers() + 1 > Config.MaxSlots + 20) + { + Utils.ForceKick(player, Config.ServerFullNoReservedReason); + handler.Handled = true; + return; + } + + var ipban = Bans.GetBanByIp(player.IP); + Ban ban = null; + if (ipban != null && Config.EnableIPBans) + ban = ipban; + + if (ban != null) + { + Utils.ForceKick(player, string.Format("You are banned: {0}", ban.Reason)); + handler.Handled = true; + return; + } + + if (!FileTools.OnWhitelist(player.IP)) + { + Utils.ForceKick(player, "Not on whitelist."); + handler.Handled = true; + return; + } + + if (Geo != null) + { + var code = Geo.TryGetCountryCode(IPAddress.Parse(player.IP)); + player.Country = code == null ? "N/A" : GeoIPCountry.GetCountryNameByCode(code); + if (code == "A1") + { + if (Config.KickProxyUsers) + { + Utils.ForceKick(player, "Proxies are not allowed"); + handler.Handled = true; + return; + } + } + } + Players[ply] = player; + } + + private void OnJoin(int ply, HandledEventArgs handler) + { + var player = Players[ply]; + if (player == null) + { + handler.Handled = true; + return; + } + + var nameban = Bans.GetBanByName(player.Name); + Ban ban = null; + if (nameban != null && Config.EnableBanOnUsernames) + ban = nameban; + + if (ban != null) + { + Utils.ForceKick(player, string.Format("You are banned: {0}", ban.Reason)); + handler.Handled = true; + return; + } + } + + private void OnLeave(int ply) + { + + var tsplr = Players[ply]; + Players[ply] = null; + + if (tsplr != null && tsplr.ReceivedInfo) + { + if (!tsplr.SilentKickInProgress) + { + Utils.Broadcast(tsplr.Name + " left", Color.Yellow); + } + Log.Info(string.Format("{0} left.", tsplr.Name)); + + if (tsplr.IsLoggedIn && !tsplr.IgnoreActionsForClearingTrashCan) + { + tsplr.PlayerData.CopyInventory(tsplr); + InventoryDB.InsertPlayerData(tsplr); + } + + if ((Config.RememberLeavePos) &&(!tsplr.LoginHarassed)) + { + RememberedPos.InsertLeavePos(tsplr.Name, tsplr.IP, (int) (tsplr.X/16), (int) (tsplr.Y/16)); + } + } + } + + private void OnChat(messageBuffer msg, int ply, string text, HandledEventArgs e) + { + if (e.Handled) + return; + + var tsplr = Players[msg.whoAmI]; + if (tsplr == null) + { + e.Handled = true; + return; + } + + /*if (!Utils.ValidString(text)) + { + e.Handled = true; + return; + }*/ + + if (text.StartsWith("/")) + { + try + { + e.Handled = Commands.HandleCommand(tsplr, text); + } + catch (Exception ex) + { + Log.ConsoleError("Command exception"); + Log.Error(ex.ToString()); + } + } + else if (!tsplr.mute) + { + Utils.Broadcast( + String.Format(Config.ChatFormat, tsplr.Group.Name, tsplr.Group.Prefix, tsplr.Name, tsplr.Group.Suffix, text), + tsplr.Group.R, tsplr.Group.G, tsplr.Group.B); + e.Handled = true; + } + else if (tsplr.mute) + { + tsplr.SendMessage("You are muted!"); + e.Handled = true; + } + } + + /// + /// When a server command is run. + /// + /// + /// + private void ServerHooks_OnCommand(string text, HandledEventArgs e) + { + if (e.Handled) + return; + + // Damn you ThreadStatic and Redigit + if (Main.rand == null) + { + Main.rand = new Random(); + } + if (WorldGen.genRand == null) + { + WorldGen.genRand = new Random(); + } + + if (text.StartsWith("playing") || text.StartsWith("/playing")) + { + int count = 0; + foreach (TSPlayer player in Players) + { + if (player != null && player.Active) + { + count++; + TSPlayer.Server.SendMessage(string.Format("{0} ({1}) [{2}] <{3}>", player.Name, player.IP, + player.Group.Name, player.UserAccountName)); + } + } + TSPlayer.Server.SendMessage(string.Format("{0} players connected.", count)); + } + else if (text == "autosave") + { + Main.autoSave = Config.AutoSave = !Config.AutoSave; + Log.ConsoleInfo("AutoSave " + (Config.AutoSave ? "Enabled" : "Disabled")); + } + else if (text.StartsWith("/")) + { + Commands.HandleCommand(TSPlayer.Server, text); + } + else + { + Commands.HandleCommand(TSPlayer.Server, "/" + text); + } + e.Handled = true; + } + + private void OnGetData(GetDataEventArgs e) + { + if (e.Handled) + return; + + PacketTypes type = e.MsgID; + + Debug.WriteLine("Recv: {0:X}: {2} ({1:XX})", e.Msg.whoAmI, (byte) type, type); + + var player = Players[e.Msg.whoAmI]; + if (player == null) + { + e.Handled = true; + return; + } + + if (!player.ConnectionAlive) + { + e.Handled = true; + return; + } + + if (player.RequiresPassword && type != PacketTypes.PasswordSend) + { + e.Handled = true; + return; + } + + if ((player.State < 10 || player.Dead) && (int) type > 12 && (int) type != 16 && (int) type != 42 && (int) type != 50 && + (int) type != 38 && (int) type != 5 && (int) type != 21) + { + e.Handled = true; + return; + } + + using (var data = new MemoryStream(e.Msg.readBuffer, e.Index, e.Length)) + { + try + { + if (GetDataHandlers.HandlerGetData(type, player, data)) + e.Handled = true; + } + catch (Exception ex) + { + Log.Error(ex.ToString()); + } + } + } + + private void OnGreetPlayer(int who, HandledEventArgs e) + { + var player = Players[who]; + if (player == null) + { + e.Handled = true; + return; + } + player.LoginMS= DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond; + + Utils.ShowFileToUser(player, "motd.txt"); + + if (Config.PvPMode == "always" && !player.TPlayer.hostile) + { + player.SendMessage("PvP is forced! Enable PvP else you can't move or do anything!", Color.Red); + } + + if (!player.IsLoggedIn) + { + if (Config.ServerSideInventory) + { + player.SendMessage( + player.IgnoreActionsForInventory = "Server Side Inventory is enabled! Please /register or /login to play!", + Color.Red); player.LoginHarassed = true; - } - else if (Config.RequireLogin) - { - player.SendMessage("Please /register or /login to play!", Color.Red); + } + else if (Config.RequireLogin) + { + player.SendMessage("Please /register or /login to play!", Color.Red); player.LoginHarassed = true; - } - } - - if (player.Group.HasPermission(Permissions.causeevents) && Config.InfiniteInvasion) - { - StartInvasion(); - } - - player.LastNetPosition = new Vector2(Main.spawnTileX*16f, Main.spawnTileY*16f); - - if (Config.RememberLeavePos) - { - if (RememberedPos.GetLeavePos(player.Name, player.IP) != Vector2.Zero){ - var pos = RememberedPos.GetLeavePos(player.Name, player.IP); - - player.Teleport((int) pos.X, (int) pos.Y + 3); - }} - - e.Handled = true; - } - - private void NpcHooks_OnStrikeNpc(NpcStrikeEventArgs e) - { - if (Config.InfiniteInvasion) - { - IncrementKills(); - if (Main.invasionSize < 10) - { - Main.invasionSize = 20000000; - } - } - } - - private void OnProjectileSetDefaults(SetDefaultsEventArgs e) - { - if (e.Info == 43) - if (Config.DisableTombstones) - e.Object.SetDefaults(0); - if (e.Info == 75) - if (Config.DisableClownBombs) - e.Object.SetDefaults(0); - if (e.Info == 109) - if (Config.DisableSnowBalls) - e.Object.SetDefaults(0); - } - - private void OnNpcSetDefaults(SetDefaultsEventArgs e) - { - if (Itembans.ItemIsBanned(e.Object.name, null)) - { - e.Object.SetDefaults(0); - } - } - - /// - /// Send bytes to client using packetbuffering if available - /// - /// socket to send to - /// bytes to send - /// False on exception - public static bool SendBytes(ServerSock client, byte[] bytes) - { - if (PacketBuffer != null) - { - PacketBuffer.BufferBytes(client, bytes); - return true; - } - - return SendBytesBufferless(client, bytes); - } - - /// - /// Send bytes to a client ignoring the packet buffer - /// - /// socket to send to - /// bytes to send - /// False on exception - public static bool SendBytesBufferless(ServerSock client, byte[] bytes) - { - try - { - if (client.tcpClient.Connected) - client.networkStream.Write(bytes, 0, bytes.Length); - return true; - } - catch (Exception ex) - { - Log.Warn("This is a normal exception"); - Log.Warn(ex.ToString()); - } - return false; - } - - private void NetHooks_SendData(SendDataEventArgs e) - { - if (e.MsgID == PacketTypes.Disconnect) - { - Action senddisconnect = (sock, str) => - { - if (sock == null || !sock.active) - return; - sock.kill = true; - using (var ms = new MemoryStream()) - { - new DisconnectMsg {Reason = str}.PackFull(ms); - SendBytesBufferless(sock, ms.ToArray()); - } - }; - - if (e.remoteClient != -1) - { - senddisconnect(Netplay.serverSock[e.remoteClient], e.text); - } - else - { - for (int i = 0; i < Netplay.serverSock.Length; i++) - { - if (e.ignoreClient != -1 && e.ignoreClient == i) - continue; - - senddisconnect(Netplay.serverSock[i], e.text); - } - } - e.Handled = true; - } - } - - private void OnStartHardMode(HandledEventArgs e) - { - if (Config.DisableHardmode) - e.Handled = true; - } - - void OnSaveWorld(bool resettime, HandledEventArgs e) - { - if (!Utils.saving) - { - Utils.Broadcast("Saving world. Momentary lag might result from this.", Color.Red); - var SaveWorld = new Thread(Utils.SaveWorld); - SaveWorld.Start(); - } - e.Handled = true; - } - - /* - * Useful stuff: - * */ - - public static void StartInvasion() - { - Main.invasionType = 1; - if (Config.InfiniteInvasion) - { - Main.invasionSize = 20000000; - } - else - { - Main.invasionSize = 100 + (Config.InvasionMultiplier*Utils.ActivePlayers()); - } - - Main.invasionWarn = 0; - if (new Random().Next(2) == 0) - { - Main.invasionX = 0.0; - } - else - { - Main.invasionX = Main.maxTilesX; - } - } - - private static int KillCount; - - public static void IncrementKills() - { - KillCount++; - Random r = new Random(); - int random = r.Next(5); - if (KillCount%100 == 0) - { - switch (random) - { - case 0: - Utils.Broadcast(string.Format("You call that a lot? {0} goblins killed!", KillCount)); - break; - case 1: - Utils.Broadcast(string.Format("Fatality! {0} goblins killed!", KillCount)); - break; - case 2: - Utils.Broadcast(string.Format("Number of 'noobs' killed to date: {0}", KillCount)); - break; - case 3: - Utils.Broadcast(string.Format("Duke Nukem would be proud. {0} goblins killed.", KillCount)); - break; - case 4: - Utils.Broadcast(string.Format("You call that a lot? {0} goblins killed!", KillCount)); - break; - case 5: - Utils.Broadcast(string.Format("{0} copies of Call of Duty smashed.", KillCount)); - break; - } - } - } - - public static bool CheckProjectilePermission(TSPlayer player, int index, int type) - { - if (type == 43) - { - return true; - } - - if (type == 17 && !player.Group.HasPermission(Permissions.usebanneditem) && Itembans.ItemIsBanned("Dirt Rod", player)) - //Dirt Rod Projectile - { - return true; - } - - if ((type == 42 || type == 65 || type == 68) && !player.Group.HasPermission(Permissions.usebanneditem) && - Itembans.ItemIsBanned("Sandgun", player)) //Sandgun Projectiles - { - return true; - } - - Projectile proj = new Projectile(); - proj.SetDefaults(type); - - if (!player.Group.HasPermission(Permissions.usebanneditem) && Itembans.ItemIsBanned(proj.name, player)) - { - return true; - } - - if (Main.projHostile[type]) - { - //player.SendMessage( proj.name, Color.Yellow); - return true; - } - - return false; - } - - public static bool CheckRangePermission(TSPlayer player, int x, int y, int range = 32) - { - if (Config.RangeChecks && ((Math.Abs(player.TileX - x) > range) || (Math.Abs(player.TileY - y) > range))) - { - return true; - } - return false; - } - - public static bool CheckTilePermission( TSPlayer player, int tileX, int tileY, byte tileType, byte actionType ) - { - if (!player.Group.HasPermission(Permissions.canbuild)) - { - if (TShock.Config.AllowIce && actionType != 1) - { - foreach (Point p in player.IceTiles) - { - if (p.X == tileX && p.Y == tileY && (Main.tile[p.X, p.Y].type == 0 || Main.tile[p.X, p.Y].type == 127)) - { - player.IceTiles.Remove(p); - return false; - } - } - if (((DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond) - player.BPm) > 2000){ - player.SendMessage("You do not have permission to build!", Color.Red); - player.BPm=DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond; - -} - return true; - } - - if (TShock.Config.AllowIce && actionType == 1 && tileType == 127) - { - player.IceTiles.Add(new Point(tileX, tileY)); - return false; - } - - if (((DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond) - player.BPm) > 2000){ - player.SendMessage("You do not have permission to build!", Color.Red); - player.BPm=DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond; - -} - return true; - - } - if (!player.Group.HasPermission(Permissions.editspawn) && !Regions.CanBuild(tileX, tileY, player) && - Regions.InArea(tileX, tileY)) - { - if (((DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond) - player.RPm) > 2000){ - player.SendMessage("Region protected from changes.", Color.Red); - player.RPm=DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond; - -} - return true; - } - if (Config.DisableBuild) - { - if (!player.Group.HasPermission(Permissions.editspawn)) - { - if (((DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond) - player.WPm) > 2000){ - player.SendMessage("World protected from changes.", Color.Red); - player.WPm=DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond; - -} - return true; - } - } - if (Config.SpawnProtection) - { - if (!player.Group.HasPermission(Permissions.editspawn)) - { - var flag = CheckSpawn(tileX, tileY); - if (flag) - { - if (((DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond) - player.SPm) > 2000){ - player.SendMessage("Spawn protected from changes.", Color.Red); - player.SPm=DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond; - } - return true; - } - } - } - return false; - } - - public static bool CheckTilePermission(TSPlayer player, int tileX, int tileY) - { - if (!player.Group.HasPermission(Permissions.canbuild)) - { - - if (((DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond) - player.BPm) > 2000){ - player.SendMessage("You do not have permission to build!", Color.Red); - player.BPm=DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond; - } - return true; - } - - if (!player.Group.HasPermission(Permissions.editspawn) && !Regions.CanBuild(tileX, tileY, player) && - Regions.InArea(tileX, tileY)) - { - - - if (((DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond) - player.RPm) > 2000){ - player.SendMessage("Region protected from changes.", Color.Red); - player.RPm=DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond; - } - return true; - } - - if (Config.DisableBuild) - { - if (!player.Group.HasPermission(Permissions.editspawn)) - { - if (((DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond) - player.WPm) > 2000){ - player.SendMessage("World protected from changes.", Color.Red); - player.WPm=DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond; - } - return true; - } - } - if (Config.SpawnProtection) - { - if (!player.Group.HasPermission(Permissions.editspawn)) - { - var flag = CheckSpawn(tileX, tileY); - if (flag) - { - if (((DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond) - player.SPm) > 1000){ - player.SendMessage("Spawn protected from changes.", Color.Red); - player.SPm=DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond; - - } - - - return true; - } - } - } - return false; - } - public static bool CheckSpawn(int x, int y) - { - Vector2 tile = new Vector2(x, y); - Vector2 spawn = new Vector2(Main.spawnTileX, Main.spawnTileY); - return Distance(spawn, tile) <= Config.SpawnProtectionRadius; - } - - public static float Distance(Vector2 value1, Vector2 value2) - { - float num2 = value1.X - value2.X; - float num = value1.Y - value2.Y; - float num3 = (num2*num2) + (num*num); - return (float) Math.Sqrt(num3); - } - - public static bool HackedHealth(TSPlayer player) - { - return (player.TPlayer.statManaMax > 400) || - (player.TPlayer.statMana > 400) || - (player.TPlayer.statLifeMax > 400) || - (player.TPlayer.statLife > 400); - } - - public static bool HackedInventory(TSPlayer player) - { - bool check = false; - - Item[] inventory = player.TPlayer.inventory; - Item[] armor = player.TPlayer.armor; - for (int i = 0; i < NetItem.maxNetInventory; i++) - { - if (i < 49) - { - Item item = new Item(); - if (inventory[i] != null && inventory[i].netID != 0) - { - item.netDefaults(inventory[i].netID); - item.Prefix(inventory[i].prefix); - item.AffixName(); - if (inventory[i].stack > item.maxStack) - { - check = true; - player.SendMessage( - String.Format("Stack cheat detected. Remove item {0} ({1}) and then rejoin", item.name, inventory[i].stack), - Color.Cyan); - } - } - } - else - { - Item item = new Item(); - if (armor[i - 48] != null && armor[i - 48].netID != 0) - { - item.netDefaults(armor[i - 48].netID); - item.Prefix(armor[i - 48].prefix); - item.AffixName(); - if (armor[i - 48].stack > item.maxStack) - { - check = true; - player.SendMessage( - String.Format("Stack cheat detected. Remove armor {0} ({1}) and then rejoin", item.name, armor[i - 48].stack), - Color.Cyan); - } - } - } - } - - return check; - } - - public static bool CheckInventory(TSPlayer player) - { - PlayerData playerData = player.PlayerData; - bool check = true; - - if (player.TPlayer.statLifeMax > playerData.maxHealth) - { - player.SendMessage("Error: Your max health exceeded (" + playerData.maxHealth + ") which is stored on server", - Color.Cyan); - check = false; - } - - Item[] inventory = player.TPlayer.inventory; - Item[] armor = player.TPlayer.armor; - for (int i = 0; i < NetItem.maxNetInventory; i++) - { - if (i < 49) - { - Item item = new Item(); - Item serverItem = new Item(); - if (inventory[i] != null && inventory[i].netID != 0) - { - if (playerData.inventory[i].netID != inventory[i].netID) - { - item.netDefaults(inventory[i].netID); - item.Prefix(inventory[i].prefix); - item.AffixName(); - player.SendMessage(player.IgnoreActionsForInventory = "Your item (" + item.name + ") needs to be deleted.", - Color.Cyan); - check = false; - } - else if (playerData.inventory[i].prefix != inventory[i].prefix) - { - item.netDefaults(inventory[i].netID); - item.Prefix(inventory[i].prefix); - item.AffixName(); - player.SendMessage(player.IgnoreActionsForInventory = "Your item (" + item.name + ") needs to be deleted.", - Color.Cyan); - check = false; - } - else if (inventory[i].stack > playerData.inventory[i].stack) - { - item.netDefaults(inventory[i].netID); - item.Prefix(inventory[i].prefix); - item.AffixName(); - player.SendMessage( - player.IgnoreActionsForInventory = - "Your item (" + item.name + ") (" + inventory[i].stack + ") needs to have it's stack decreased to (" + - playerData.inventory[i].stack + ").", Color.Cyan); - check = false; - } - } - } - else - { - Item item = new Item(); - Item serverItem = new Item(); - if (armor[i - 48] != null && armor[i - 48].netID != 0) - { - if (playerData.inventory[i].netID != armor[i - 48].netID) - { - item.netDefaults(armor[i - 48].netID); - item.Prefix(armor[i - 48].prefix); - item.AffixName(); - player.SendMessage(player.IgnoreActionsForInventory = "Your armor (" + item.name + ") needs to be deleted.", - Color.Cyan); - check = false; - } - else if (playerData.inventory[i].prefix != armor[i - 48].prefix) - { - item.netDefaults(armor[i - 48].netID); - item.Prefix(armor[i - 48].prefix); - item.AffixName(); - player.SendMessage(player.IgnoreActionsForInventory = "Your armor (" + item.name + ") needs to be deleted.", - Color.Cyan); - check = false; - } - else if (armor[i - 48].stack > playerData.inventory[i].stack) - { - item.netDefaults(armor[i - 48].netID); - item.Prefix(armor[i - 48].prefix); - item.AffixName(); - player.SendMessage( - player.IgnoreActionsForInventory = - "Your armor (" + item.name + ") (" + inventory[i].stack + ") needs to have it's stack decreased to (" + - playerData.inventory[i].stack + ").", Color.Cyan); - check = false; - } - } - } - } - - return check; - } - - public static bool CheckIgnores(TSPlayer player) - { - bool check = false; - if (Config.PvPMode == "always" && !player.TPlayer.hostile) - check = true; - if (player.IgnoreActionsForInventory != "none") - check = true; - if (player.IgnoreActionsForCheating != "none") - check = true; - if (player.IgnoreActionsForDisabledArmor != "none") - check = true; - if (player.IgnoreActionsForClearingTrashCan) - check = true; - if (!player.IsLoggedIn && Config.RequireLogin) - check = true; - return check; - } - - public void OnConfigRead(ConfigFile file) - { - NPC.defaultMaxSpawns = file.DefaultMaximumSpawns; - NPC.defaultSpawnRate = file.DefaultSpawnRate; - - Main.autoSave = file.AutoSave; - if (Backups != null) - { - Backups.KeepFor = file.BackupKeepFor; - Backups.Interval = file.BackupInterval; - } - if (!OverridePort) - { - Netplay.serverPort = file.ServerPort; - } - - if (file.MaxSlots > 235) - file.MaxSlots = 235; - Main.maxNetPlayers = file.MaxSlots + 20; - Netplay.password = ""; - Netplay.spamCheck = false; - - RconHandler.Password = file.RconPassword; - RconHandler.ListenPort = file.RconPort; - - Utils.HashAlgo = file.HashAlgorithm; - } - } -} + } + } + + if (player.Group.HasPermission(Permissions.causeevents) && Config.InfiniteInvasion) + { + StartInvasion(); + } + + player.LastNetPosition = new Vector2(Main.spawnTileX*16f, Main.spawnTileY*16f); + + if (Config.RememberLeavePos) + { + if (RememberedPos.GetLeavePos(player.Name, player.IP) != Vector2.Zero){ + var pos = RememberedPos.GetLeavePos(player.Name, player.IP); + + player.Teleport((int) pos.X, (int) pos.Y + 3); + }} + + e.Handled = true; + } + + private void NpcHooks_OnStrikeNpc(NpcStrikeEventArgs e) + { + if (Config.InfiniteInvasion) + { + IncrementKills(); + if (Main.invasionSize < 10) + { + Main.invasionSize = 20000000; + } + } + } + + private void OnProjectileSetDefaults(SetDefaultsEventArgs e) + { + if (e.Info == 43) + if (Config.DisableTombstones) + e.Object.SetDefaults(0); + if (e.Info == 75) + if (Config.DisableClownBombs) + e.Object.SetDefaults(0); + if (e.Info == 109) + if (Config.DisableSnowBalls) + e.Object.SetDefaults(0); + } + + private void OnNpcSetDefaults(SetDefaultsEventArgs e) + { + if (Itembans.ItemIsBanned(e.Object.name, null)) + { + e.Object.SetDefaults(0); + } + } + + /// + /// Send bytes to client using packetbuffering if available + /// + /// socket to send to + /// bytes to send + /// False on exception + public static bool SendBytes(ServerSock client, byte[] bytes) + { + if (PacketBuffer != null) + { + PacketBuffer.BufferBytes(client, bytes); + return true; + } + + return SendBytesBufferless(client, bytes); + } + + /// + /// Send bytes to a client ignoring the packet buffer + /// + /// socket to send to + /// bytes to send + /// False on exception + public static bool SendBytesBufferless(ServerSock client, byte[] bytes) + { + try + { + if (client.tcpClient.Connected) + client.networkStream.Write(bytes, 0, bytes.Length); + return true; + } + catch (Exception ex) + { + Log.Warn("This is a normal exception"); + Log.Warn(ex.ToString()); + } + return false; + } + + private void NetHooks_SendData(SendDataEventArgs e) + { + if (e.MsgID == PacketTypes.Disconnect) + { + Action senddisconnect = (sock, str) => + { + if (sock == null || !sock.active) + return; + sock.kill = true; + using (var ms = new MemoryStream()) + { + new DisconnectMsg {Reason = str}.PackFull(ms); + SendBytesBufferless(sock, ms.ToArray()); + } + }; + + if (e.remoteClient != -1) + { + senddisconnect(Netplay.serverSock[e.remoteClient], e.text); + } + else + { + for (int i = 0; i < Netplay.serverSock.Length; i++) + { + if (e.ignoreClient != -1 && e.ignoreClient == i) + continue; + + senddisconnect(Netplay.serverSock[i], e.text); + } + } + e.Handled = true; + } + } + + private void OnStartHardMode(HandledEventArgs e) + { + if (Config.DisableHardmode) + e.Handled = true; + } + + void OnSaveWorld(bool resettime, HandledEventArgs e) + { + if (!Utils.saving) + { + Utils.Broadcast("Saving world. Momentary lag might result from this.", Color.Red); + var SaveWorld = new Thread(Utils.SaveWorld); + SaveWorld.Start(); + } + e.Handled = true; + } + + /* + * Useful stuff: + * */ + + public static void StartInvasion() + { + Main.invasionType = 1; + if (Config.InfiniteInvasion) + { + Main.invasionSize = 20000000; + } + else + { + Main.invasionSize = 100 + (Config.InvasionMultiplier*Utils.ActivePlayers()); + } + + Main.invasionWarn = 0; + if (new Random().Next(2) == 0) + { + Main.invasionX = 0.0; + } + else + { + Main.invasionX = Main.maxTilesX; + } + } + + private static int KillCount; + + public static void IncrementKills() + { + KillCount++; + Random r = new Random(); + int random = r.Next(5); + if (KillCount%100 == 0) + { + switch (random) + { + case 0: + Utils.Broadcast(string.Format("You call that a lot? {0} goblins killed!", KillCount)); + break; + case 1: + Utils.Broadcast(string.Format("Fatality! {0} goblins killed!", KillCount)); + break; + case 2: + Utils.Broadcast(string.Format("Number of 'noobs' killed to date: {0}", KillCount)); + break; + case 3: + Utils.Broadcast(string.Format("Duke Nukem would be proud. {0} goblins killed.", KillCount)); + break; + case 4: + Utils.Broadcast(string.Format("You call that a lot? {0} goblins killed!", KillCount)); + break; + case 5: + Utils.Broadcast(string.Format("{0} copies of Call of Duty smashed.", KillCount)); + break; + } + } + } + + public static bool CheckProjectilePermission(TSPlayer player, int index, int type) + { + if (type == 43) + { + return true; + } + + if (type == 17 && !player.Group.HasPermission(Permissions.usebanneditem) && Itembans.ItemIsBanned("Dirt Rod", player)) + //Dirt Rod Projectile + { + return true; + } + + if ((type == 42 || type == 65 || type == 68) && !player.Group.HasPermission(Permissions.usebanneditem) && + Itembans.ItemIsBanned("Sandgun", player)) //Sandgun Projectiles + { + return true; + } + + Projectile proj = new Projectile(); + proj.SetDefaults(type); + + if (!player.Group.HasPermission(Permissions.usebanneditem) && Itembans.ItemIsBanned(proj.name, player)) + { + return true; + } + + if (Main.projHostile[type]) + { + //player.SendMessage( proj.name, Color.Yellow); + return true; + } + + return false; + } + + public static bool CheckRangePermission(TSPlayer player, int x, int y, int range = 32) + { + if (Config.RangeChecks && ((Math.Abs(player.TileX - x) > range) || (Math.Abs(player.TileY - y) > range))) + { + return true; + } + return false; + } + + public static bool CheckTilePermission( TSPlayer player, int tileX, int tileY, byte tileType, byte actionType ) + { + if (!player.Group.HasPermission(Permissions.canbuild)) + { + if (TShock.Config.AllowIce && actionType != 1) + { + foreach (Point p in player.IceTiles) + { + if (p.X == tileX && p.Y == tileY && (Main.tile[p.X, p.Y].type == 0 || Main.tile[p.X, p.Y].type == 127)) + { + player.IceTiles.Remove(p); + return false; + } + } + if (((DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond) - player.BPm) > 2000){ + player.SendMessage("You do not have permission to build!", Color.Red); + player.BPm=DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond; + +} + return true; + } + + if (TShock.Config.AllowIce && actionType == 1 && tileType == 127) + { + player.IceTiles.Add(new Point(tileX, tileY)); + return false; + } + + if (((DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond) - player.BPm) > 2000){ + player.SendMessage("You do not have permission to build!", Color.Red); + player.BPm=DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond; + +} + return true; + + } + if (!player.Group.HasPermission(Permissions.editspawn) && !Regions.CanBuild(tileX, tileY, player) && + Regions.InArea(tileX, tileY)) + { + if (((DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond) - player.RPm) > 2000){ + player.SendMessage("Region protected from changes.", Color.Red); + player.RPm=DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond; + +} + return true; + } + if (Config.DisableBuild) + { + if (!player.Group.HasPermission(Permissions.editspawn)) + { + if (((DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond) - player.WPm) > 2000){ + player.SendMessage("World protected from changes.", Color.Red); + player.WPm=DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond; + +} + return true; + } + } + if (Config.SpawnProtection) + { + if (!player.Group.HasPermission(Permissions.editspawn)) + { + var flag = CheckSpawn(tileX, tileY); + if (flag) + { + if (((DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond) - player.SPm) > 2000){ + player.SendMessage("Spawn protected from changes.", Color.Red); + player.SPm=DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond; + } + return true; + } + } + } + return false; + } + + public static bool CheckTilePermission(TSPlayer player, int tileX, int tileY) + { + if (!player.Group.HasPermission(Permissions.canbuild)) + { + + if (((DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond) - player.BPm) > 2000){ + player.SendMessage("You do not have permission to build!", Color.Red); + player.BPm=DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond; + } + return true; + } + + if (!player.Group.HasPermission(Permissions.editspawn) && !Regions.CanBuild(tileX, tileY, player) && + Regions.InArea(tileX, tileY)) + { + + + if (((DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond) - player.RPm) > 2000){ + player.SendMessage("Region protected from changes.", Color.Red); + player.RPm=DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond; + } + return true; + } + + if (Config.DisableBuild) + { + if (!player.Group.HasPermission(Permissions.editspawn)) + { + if (((DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond) - player.WPm) > 2000){ + player.SendMessage("World protected from changes.", Color.Red); + player.WPm=DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond; + } + return true; + } + } + if (Config.SpawnProtection) + { + if (!player.Group.HasPermission(Permissions.editspawn)) + { + var flag = CheckSpawn(tileX, tileY); + if (flag) + { + if (((DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond) - player.SPm) > 1000){ + player.SendMessage("Spawn protected from changes.", Color.Red); + player.SPm=DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond; + + } + + + return true; + } + } + } + return false; + } + public static bool CheckSpawn(int x, int y) + { + Vector2 tile = new Vector2(x, y); + Vector2 spawn = new Vector2(Main.spawnTileX, Main.spawnTileY); + return Distance(spawn, tile) <= Config.SpawnProtectionRadius; + } + + public static float Distance(Vector2 value1, Vector2 value2) + { + float num2 = value1.X - value2.X; + float num = value1.Y - value2.Y; + float num3 = (num2*num2) + (num*num); + return (float) Math.Sqrt(num3); + } + + public static bool HackedHealth(TSPlayer player) + { + return (player.TPlayer.statManaMax > 400) || + (player.TPlayer.statMana > 400) || + (player.TPlayer.statLifeMax > 400) || + (player.TPlayer.statLife > 400); + } + + public static bool HackedInventory(TSPlayer player) + { + bool check = false; + + Item[] inventory = player.TPlayer.inventory; + Item[] armor = player.TPlayer.armor; + for (int i = 0; i < NetItem.maxNetInventory; i++) + { + if (i < 49) + { + Item item = new Item(); + if (inventory[i] != null && inventory[i].netID != 0) + { + item.netDefaults(inventory[i].netID); + item.Prefix(inventory[i].prefix); + item.AffixName(); + if (inventory[i].stack > item.maxStack) + { + check = true; + player.SendMessage( + String.Format("Stack cheat detected. Remove item {0} ({1}) and then rejoin", item.name, inventory[i].stack), + Color.Cyan); + } + } + } + else + { + Item item = new Item(); + if (armor[i - 48] != null && armor[i - 48].netID != 0) + { + item.netDefaults(armor[i - 48].netID); + item.Prefix(armor[i - 48].prefix); + item.AffixName(); + if (armor[i - 48].stack > item.maxStack) + { + check = true; + player.SendMessage( + String.Format("Stack cheat detected. Remove armor {0} ({1}) and then rejoin", item.name, armor[i - 48].stack), + Color.Cyan); + } + } + } + } + + return check; + } + + public static bool CheckInventory(TSPlayer player) + { + PlayerData playerData = player.PlayerData; + bool check = true; + + if (player.TPlayer.statLifeMax > playerData.maxHealth) + { + player.SendMessage("Error: Your max health exceeded (" + playerData.maxHealth + ") which is stored on server", + Color.Cyan); + check = false; + } + + Item[] inventory = player.TPlayer.inventory; + Item[] armor = player.TPlayer.armor; + for (int i = 0; i < NetItem.maxNetInventory; i++) + { + if (i < 49) + { + Item item = new Item(); + Item serverItem = new Item(); + if (inventory[i] != null && inventory[i].netID != 0) + { + if (playerData.inventory[i].netID != inventory[i].netID) + { + item.netDefaults(inventory[i].netID); + item.Prefix(inventory[i].prefix); + item.AffixName(); + player.SendMessage(player.IgnoreActionsForInventory = "Your item (" + item.name + ") needs to be deleted.", + Color.Cyan); + check = false; + } + else if (playerData.inventory[i].prefix != inventory[i].prefix) + { + item.netDefaults(inventory[i].netID); + item.Prefix(inventory[i].prefix); + item.AffixName(); + player.SendMessage(player.IgnoreActionsForInventory = "Your item (" + item.name + ") needs to be deleted.", + Color.Cyan); + check = false; + } + else if (inventory[i].stack > playerData.inventory[i].stack) + { + item.netDefaults(inventory[i].netID); + item.Prefix(inventory[i].prefix); + item.AffixName(); + player.SendMessage( + player.IgnoreActionsForInventory = + "Your item (" + item.name + ") (" + inventory[i].stack + ") needs to have it's stack decreased to (" + + playerData.inventory[i].stack + ").", Color.Cyan); + check = false; + } + } + } + else + { + Item item = new Item(); + Item serverItem = new Item(); + if (armor[i - 48] != null && armor[i - 48].netID != 0) + { + if (playerData.inventory[i].netID != armor[i - 48].netID) + { + item.netDefaults(armor[i - 48].netID); + item.Prefix(armor[i - 48].prefix); + item.AffixName(); + player.SendMessage(player.IgnoreActionsForInventory = "Your armor (" + item.name + ") needs to be deleted.", + Color.Cyan); + check = false; + } + else if (playerData.inventory[i].prefix != armor[i - 48].prefix) + { + item.netDefaults(armor[i - 48].netID); + item.Prefix(armor[i - 48].prefix); + item.AffixName(); + player.SendMessage(player.IgnoreActionsForInventory = "Your armor (" + item.name + ") needs to be deleted.", + Color.Cyan); + check = false; + } + else if (armor[i - 48].stack > playerData.inventory[i].stack) + { + item.netDefaults(armor[i - 48].netID); + item.Prefix(armor[i - 48].prefix); + item.AffixName(); + player.SendMessage( + player.IgnoreActionsForInventory = + "Your armor (" + item.name + ") (" + inventory[i].stack + ") needs to have it's stack decreased to (" + + playerData.inventory[i].stack + ").", Color.Cyan); + check = false; + } + } + } + } + + return check; + } + + public static bool CheckIgnores(TSPlayer player) + { + bool check = false; + if (Config.PvPMode == "always" && !player.TPlayer.hostile) + check = true; + if (player.IgnoreActionsForInventory != "none") + check = true; + if (player.IgnoreActionsForCheating != "none") + check = true; + if (player.IgnoreActionsForDisabledArmor != "none") + check = true; + if (player.IgnoreActionsForClearingTrashCan) + check = true; + if (!player.IsLoggedIn && Config.RequireLogin) + check = true; + return check; + } + + public void OnConfigRead(ConfigFile file) + { + NPC.defaultMaxSpawns = file.DefaultMaximumSpawns; + NPC.defaultSpawnRate = file.DefaultSpawnRate; + + Main.autoSave = file.AutoSave; + if (Backups != null) + { + Backups.KeepFor = file.BackupKeepFor; + Backups.Interval = file.BackupInterval; + } + if (!OverridePort) + { + Netplay.serverPort = file.ServerPort; + } + + if (file.MaxSlots > 235) + file.MaxSlots = 235; + Main.maxNetPlayers = file.MaxSlots + 20; + Netplay.password = ""; + Netplay.spamCheck = false; + + RconHandler.Password = file.RconPassword; + RconHandler.ListenPort = file.RconPort; + + Utils.HashAlgo = file.HashAlgorithm; + } + } +} From 5cdd537ebd9ddd2de8cb65643e90f8c9ca095253 Mon Sep 17 00:00:00 2001 From: Lucas Nicodemus Date: Thu, 9 Feb 2012 21:48:37 -0700 Subject: [PATCH 04/73] /v2/players/kick no longer 500s if a player name isn't specified. Fixes #361 --- TShockAPI/Rest/RestManager.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/TShockAPI/Rest/RestManager.cs b/TShockAPI/Rest/RestManager.cs index 65ff601b..b5a729c0 100644 --- a/TShockAPI/Rest/RestManager.cs +++ b/TShockAPI/Rest/RestManager.cs @@ -578,6 +578,12 @@ namespace TShockAPI { var returnBlock = new Dictionary(); var playerParam = parameters["player"]; + if (playerParam == null) + { + returnBlock.Add("status", "400"); + returnBlock.Add("error", "Unspecified name."); + return returnBlock; + } var found = TShock.Utils.FindPlayer(playerParam); var reason = parameters["reason"]; if (found.Count == 0) From 454403d4956e4040ff86edf39fbc299f7385a4de Mon Sep 17 00:00:00 2001 From: Lucas Nicodemus Date: Thu, 9 Feb 2012 22:20:36 -0700 Subject: [PATCH 05/73] Added /lists/bans REST endpoint - Returns a JSON list of bans --- TShockAPI/DB/BanManager.cs | 23 +++++++++++++++++++++++ TShockAPI/Rest/RestManager.cs | 9 +++++++++ 2 files changed, 32 insertions(+) diff --git a/TShockAPI/DB/BanManager.cs b/TShockAPI/DB/BanManager.cs index 5afa69f9..082e5a41 100644 --- a/TShockAPI/DB/BanManager.cs +++ b/TShockAPI/DB/BanManager.cs @@ -16,6 +16,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ using System; +using System.Collections.Generic; using System.Data; using System.IO; using MySql.Data.MySqlClient; @@ -67,6 +68,28 @@ throw new Exception("Could not find a database library (probably Sqlite3.dll)"); return null; } + public List GetBans() + { + List banlist = new List(); + try + { + using (var reader = database.QueryReader("SELECT * FROM Bans")) + { + while (reader.Read()) + { + banlist.Add(new Ban(reader.Get("IP"), reader.Get("Name"), reader.Get("Reason"))); + } + return banlist; + } + } + catch (Exception ex) + { + Log.Error(ex.ToString()); + Console.WriteLine(ex.StackTrace); + } + return null; + } + public Ban GetBanByName(string name, bool casesensitive = true) { if (!TShock.Config.EnableBanOnUsernames) diff --git a/TShockAPI/Rest/RestManager.cs b/TShockAPI/Rest/RestManager.cs index b5a729c0..7a28a209 100644 --- a/TShockAPI/Rest/RestManager.cs +++ b/TShockAPI/Rest/RestManager.cs @@ -48,6 +48,7 @@ namespace TShockAPI Rest.Register(new RestCommand("/v2/bans/read", BanInfoV2) { RequiresToken = true }); Rest.Register(new RestCommand("/v2/bans/destroy", BanDestroyV2) { RequiresToken = true }); + Rest.Register(new RestCommand("/lists/bans", BanListIPs) { RequiresToken = true }); Rest.Register(new RestCommand("/lists/players", PlayerList) {RequiresToken = true}); Rest.Register(new RestCommand("/world/read", WorldRead) {RequiresToken = true}); @@ -252,6 +253,14 @@ namespace TShockAPI #region RestBanMethods + private object BanListIPs(RestVerbs verbs, IParameterCollection parameters) + { + RestObject returnItem = new RestObject("200"); + returnItem.Add("bans", TShock.Bans.GetBans()); + + return returnItem; + } + private object BanCreate(RestVerbs verbs, IParameterCollection parameters) { var returnBlock = new Dictionary(); From 6cb6e19f23037071f46347bd9c3de6bdc2235902 Mon Sep 17 00:00:00 2001 From: Lucas Nicodemus Date: Thu, 9 Feb 2012 22:43:54 -0700 Subject: [PATCH 06/73] REST endpoint /lists/bans is now /v2/lists/bans Added REST endpoint /v2/lists/players - JSON list of players Deprecated REST endpoint /lists/players --- TShockAPI/Rest/Rest.cs | 1 + TShockAPI/Rest/RestManager.cs | 11 ++++++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/TShockAPI/Rest/Rest.cs b/TShockAPI/Rest/Rest.cs index 719c501d..17794924 100644 --- a/TShockAPI/Rest/Rest.cs +++ b/TShockAPI/Rest/Rest.cs @@ -121,6 +121,7 @@ namespace Rests var str = JsonConvert.SerializeObject(obj, Formatting.Indented); e.Response.Connection.Type = ConnectionType.Close; + e.Response.Add(new ContentTypeHeader("application/json")); e.Response.Body.Write(Encoding.ASCII.GetBytes(str), 0, str.Length); e.Response.Status = HttpStatusCode.OK; return; diff --git a/TShockAPI/Rest/RestManager.cs b/TShockAPI/Rest/RestManager.cs index 7a28a209..4fd20273 100644 --- a/TShockAPI/Rest/RestManager.cs +++ b/TShockAPI/Rest/RestManager.cs @@ -48,8 +48,9 @@ namespace TShockAPI Rest.Register(new RestCommand("/v2/bans/read", BanInfoV2) { RequiresToken = true }); Rest.Register(new RestCommand("/v2/bans/destroy", BanDestroyV2) { RequiresToken = true }); - Rest.Register(new RestCommand("/lists/bans", BanListIPs) { RequiresToken = true }); + Rest.Register(new RestCommand("/v2/lists/bans", BanListIPs) { RequiresToken = true }); Rest.Register(new RestCommand("/lists/players", PlayerList) {RequiresToken = true}); + Rest.Register(new RestCommand("/v2/lists/players", PlayerListV2) { RequiresToken = true }); Rest.Register(new RestCommand("/world/read", WorldRead) {RequiresToken = true}); Rest.Register(new RestCommand("/world/meteor", WorldMeteor) {RequiresToken = true}); @@ -543,12 +544,20 @@ namespace TShockAPI return returnBlock; } + private object PlayerListV2(RestVerbs verbs, IParameterCollection parameters) + { + RestObject returnBlock = new RestObject("200"); + returnBlock.Add("players", TShock.Players.Where(p => p != null && p.Active)); + return returnBlock; + } + private object PlayerList(RestVerbs verbs, IParameterCollection parameters) { var activeplayers = Main.player.Where(p => p != null && p.active).ToList(); string currentPlayers = string.Join(", ", activeplayers.Select(p => p.name)); var ret = new RestObject("200"); ret["players"] = currentPlayers; + ret.Add("deprecated", "This endpoint is deprecated and has been replaced with /v2/lists/players."); return ret; } From b84e27436c7773a898fed13087040ca0e1688b1a Mon Sep 17 00:00:00 2001 From: k0rd Date: Fri, 10 Feb 2012 01:40:05 -0500 Subject: [PATCH 07/73] fixes crash on saving world with /removespecial --- TShockAPI/Commands.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TShockAPI/Commands.cs b/TShockAPI/Commands.cs index 918dc316..dc875445 100644 --- a/TShockAPI/Commands.cs +++ b/TShockAPI/Commands.cs @@ -1562,7 +1562,7 @@ namespace TShockAPI break; case 112: case 116: - Main.tile[x, y].type = 169; + Main.tile[x, y].type = 53; break; case 113: Main.tile[x, y].type = 38; From d478810336291c17c9d91bbadfe034e4a5c2f341 Mon Sep 17 00:00:00 2001 From: k0rd Date: Sun, 12 Feb 2012 15:27:23 -0500 Subject: [PATCH 08/73] -maxplayers or -players cl argument should override config additions to /removespecial --- TShockAPI/Commands.cs | 59 +++++++++++++++++++++++-------------------- TShockAPI/TShock.cs | 7 ++++- 2 files changed, 38 insertions(+), 28 deletions(-) mode change 100644 => 100755 TShockAPI/Commands.cs mode change 100644 => 100755 TShockAPI/TShock.cs diff --git a/TShockAPI/Commands.cs b/TShockAPI/Commands.cs old mode 100644 new mode 100755 index dc875445..5697c1c1 --- a/TShockAPI/Commands.cs +++ b/TShockAPI/Commands.cs @@ -1542,33 +1542,38 @@ namespace TShockAPI for (int x = 0; x < Main.maxTilesX; x++) { for (int y = 0; y < Main.maxTilesY; y++) - { - switch (Main.tile[x, y].type) - { - case 117: - case 25: - Main.tile[x, y].type = 1; - break; - case 109: - case 23: - Main.tile[x, y].type = 2; - break; - case 32: - Main.tile[x, y].type = 0; - Main.tile[x, y].active = false; - break; - case 24: - Main.tile[x, y].type = 3; - break; - case 112: - case 116: - Main.tile[x, y].type = 53; - break; - case 113: - Main.tile[x, y].type = 38; - break; - default: - continue; + { + switch (Main.tile[x, y].type) + { + case 117: + case 25: + Main.tile[x, y].type = 1; + break; + case 109: + case 23: + Main.tile[x, y].type = 2; + break; + case 32: + case 113: + case 110: + Main.tile[x, y].type = 0; + Main.tile[x, y].active = false; + break; + case 24: + Main.tile[x, y].type = 3; + break; + case 112: + case 116: + Main.tile[x, y].type = 53; + break; + case 118: + Main.tile[x, y].type = 38; + break; + case 115: + Main.tile[x, y].type = 52; + break; + default: + continue; } } } diff --git a/TShockAPI/TShock.cs b/TShockAPI/TShock.cs old mode 100644 new mode 100755 index d9de18fb..76c91934 --- a/TShockAPI/TShock.cs +++ b/TShockAPI/TShock.cs @@ -384,7 +384,12 @@ namespace TShockAPI Config.RestApiPort = Convert.ToInt32(parms[++i]); Console.WriteLine("Startup parameter overrode REST port."); - } + } + if ((parms[i].ToLower() == "-maxplayers")||(parms[i].ToLower() == "-players")) + { + Config.MaxSlots = Convert.ToInt32(parms[++i]); + Console.WriteLine("Startup parameter overrode maximum player slot configuration value."); + } } } From 3641c3ca87b5b04be6f2600654429846cb59e123 Mon Sep 17 00:00:00 2001 From: k0rd Date: Sun, 12 Feb 2012 23:56:49 -0500 Subject: [PATCH 09/73] Consider command line parameters when /reload command is issued --- TShockAPI/Commands.cs | 3 ++- TShockAPI/TShock.cs | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/TShockAPI/Commands.cs b/TShockAPI/Commands.cs index 5697c1c1..b98da283 100755 --- a/TShockAPI/Commands.cs +++ b/TShockAPI/Commands.cs @@ -2209,7 +2209,8 @@ namespace TShockAPI private static void Reload(CommandArgs args) { - FileTools.SetupConfig(); + FileTools.SetupConfig(); + TShock.HandleCommandLinePostConfigLoad(Environment.GetCommandLineArgs()); TShock.Groups.LoadPermisions(); TShock.Regions.ReloadAllRegions(); args.Player.SendMessage( diff --git a/TShockAPI/TShock.cs b/TShockAPI/TShock.cs index 76c91934..2c50bf97 100755 --- a/TShockAPI/TShock.cs +++ b/TShockAPI/TShock.cs @@ -355,7 +355,7 @@ namespace TShockAPI } } - private void HandleCommandLinePostConfigLoad(string[] parms) + public static void HandleCommandLinePostConfigLoad(string[] parms) { for (int i = 0; i < parms.Length; i++) { From 0c13716b841377835422f2a28343404132ab8d4f Mon Sep 17 00:00:00 2001 From: stevenh Date: Mon, 13 Feb 2012 18:41:44 +0000 Subject: [PATCH 10/73] Removed TShock.Config.EnableBanOnUsernames check from GetBanByName so that it can be used internally for queries --- TShockAPI/DB/BanManager.cs | 4 ---- 1 file changed, 4 deletions(-) diff --git a/TShockAPI/DB/BanManager.cs b/TShockAPI/DB/BanManager.cs index 082e5a41..57eaa909 100644 --- a/TShockAPI/DB/BanManager.cs +++ b/TShockAPI/DB/BanManager.cs @@ -92,10 +92,6 @@ throw new Exception("Could not find a database library (probably Sqlite3.dll)"); public Ban GetBanByName(string name, bool casesensitive = true) { - if (!TShock.Config.EnableBanOnUsernames) - { - return null; - } try { var namecol = casesensitive ? "Name" : "UPPER(Name)"; From 46f5f872ae02ed3ddf6aeea58ccefe4368b3822a Mon Sep 17 00:00:00 2001 From: stevenh Date: Mon, 13 Feb 2012 19:00:27 +0000 Subject: [PATCH 11/73] Moved local exceptions outside of try block in AddUser so the calling code gets the original exception and not a generic one Also added details of the SQL exception message into the message of the UserManagerException so its easier to determine the actual error when the exception message is returned / printed out --- TShockAPI/DB/UserManager.cs | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/TShockAPI/DB/UserManager.cs b/TShockAPI/DB/UserManager.cs index 70423dfb..29944e18 100644 --- a/TShockAPI/DB/UserManager.cs +++ b/TShockAPI/DB/UserManager.cs @@ -50,20 +50,22 @@ namespace TShockAPI.DB /// User user public void AddUser(User user) { + if (!TShock.Groups.GroupExists(user.Group)) + throw new GroupNotExistsException(user.Group); + + int ret; try { - if (!TShock.Groups.GroupExists(user.Group)) - throw new GroupNotExistsException(user.Group); - - if ( - database.Query("INSERT INTO Users (Username, Password, UserGroup, IP) VALUES (@0, @1, @2, @3);", user.Name, - TShock.Utils.HashPassword(user.Password), user.Group, user.Address) < 1) - throw new UserExistsException(user.Name); + ret = database.Query("INSERT INTO Users (Username, Password, UserGroup, IP) VALUES (@0, @1, @2, @3);", user.Name, + TShock.Utils.HashPassword(user.Password), user.Group, user.Address); } catch (Exception ex) { - throw new UserManagerException("AddUser SQL returned an error", ex); + throw new UserManagerException("AddUser SQL returned an error (" + ex.Message + ")", ex); } + + if (1 > ret) + throw new UserExistsException(user.Name); } /// From 4daa9add13cc0b8f786c0c46ec0037041ef018d3 Mon Sep 17 00:00:00 2001 From: stevenh Date: Mon, 13 Feb 2012 19:16:20 +0000 Subject: [PATCH 12/73] Added GetUsers method mirroring GetBans to enable RestAPI to provide a full users list as well as an active one --- TShockAPI/DB/UserManager.cs | 41 +++++++++++++++++++++++++++++-------- 1 file changed, 33 insertions(+), 8 deletions(-) diff --git a/TShockAPI/DB/UserManager.cs b/TShockAPI/DB/UserManager.cs index 29944e18..7ea6c63a 100644 --- a/TShockAPI/DB/UserManager.cs +++ b/TShockAPI/DB/UserManager.cs @@ -18,6 +18,7 @@ along with this program. If not, see . using System; using System.Data; using System.IO; +using System.Collections.Generic; using MySql.Data.MySqlClient; namespace TShockAPI.DB @@ -256,14 +257,7 @@ namespace TShockAPI.DB using (var reader = result) { if (reader.Read()) - { - user.ID = reader.Get("ID"); - user.Group = reader.Get("Usergroup"); - user.Password = reader.Get("Password"); - user.Name = reader.Get("Username"); - user.Address = reader.Get("IP"); - return user; - } + return LoadUserFromResult(user, result); } } catch (Exception ex) @@ -272,6 +266,37 @@ namespace TShockAPI.DB } throw new UserNotExistException(string.IsNullOrEmpty(user.Address) ? user.Name : user.Address); } + + public List GetUsers() + { + try + { + List users = new List(); + using (var reader = database.QueryReader("SELECT * FROM Users")) + { + while (reader.Read()) + { + users.Add(LoadUserFromResult(new User(), reader)); + } + return users; + } + } + catch (Exception ex) + { + Log.Error(ex.ToString()); + } + return null; + } + + private User LoadUserFromResult(User user, QueryResult result) + { + user.ID = result.Get("ID"); + user.Group = result.Get("Usergroup"); + user.Password = result.Get("Password"); + user.Name = result.Get("Username"); + user.Address = result.Get("IP"); + return user; + } } public class User From fb11729547d10cf65b47319baac13a9de04c2b1e Mon Sep 17 00:00:00 2001 From: stevenh Date: Mon, 13 Feb 2012 19:23:56 +0000 Subject: [PATCH 13/73] Added IEnumerable support to GroupManager to facilitate RestAPI listing groups Added optional exceptions parameter to AddGroup and DeleteGroup to faciliate RestAPI group manipulation. This changes the behaviour of these methods to throw an exception on error instead of returning an error string. Corrected internal lists from being updated in failed DB updates in DeleteGroup and AddGroup Added doc for chatcolor on AddGroup --- TShockAPI/DB/GroupManager.cs | 83 ++++++++++++++++++++++++++++++++---- 1 file changed, 75 insertions(+), 8 deletions(-) diff --git a/TShockAPI/DB/GroupManager.cs b/TShockAPI/DB/GroupManager.cs index da3ce79f..27fee59a 100644 --- a/TShockAPI/DB/GroupManager.cs +++ b/TShockAPI/DB/GroupManager.cs @@ -16,6 +16,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ using System; +using System.Collections; using System.Collections.Generic; using System.Data; using System.IO; @@ -24,7 +25,7 @@ using MySql.Data.MySqlClient; namespace TShockAPI.DB { - public class GroupManager + public class GroupManager : IEnumerable { private IDbConnection database; @@ -64,21 +65,42 @@ namespace TShockAPI.DB if (group == "superadmin") return true; - return groups.Any(g => g.Name.Equals(group)); } + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + public IEnumerator GetEnumerator() + { + return groups.GetEnumerator(); + } + + public Group GetGroupByName(string name) + { + var ret = groups.Where(g => g.Name == name); + return 1 == ret.Count() ? ret.ElementAt(0) : null; + } + /// /// Adds group with name and permissions if it does not exist. /// /// name of group /// parent of group /// permissions - public String AddGroup(String name, string parentname, String permissions, String chatcolor) + /// chatcolor + /// exceptions true indicates use exceptions for errors false otherwise + public String AddGroup(String name, string parentname, String permissions, String chatcolor, bool exceptions = false) { String message = ""; if (GroupExists(name)) + { + if (exceptions) + throw new GroupExistsException(name); return "Error: Group already exists. Use /modGroup to change permissions."; + } var group = new Group(name, null, chatcolor); group.permissions.Add(permissions); @@ -88,6 +110,8 @@ namespace TShockAPI.DB if (parent == null) { var error = "Invalid parent {0} for group {1}".SFormat(group.Name, parentname); + if (exceptions) + throw new GroupManagerException(error); Log.ConsoleError(error); return error; } @@ -98,9 +122,12 @@ namespace TShockAPI.DB ? "INSERT OR IGNORE INTO GroupList (GroupName, Parent, Commands, ChatColor) VALUES (@0, @1, @2, @3);" : "INSERT IGNORE INTO GroupList SET GroupName=@0, Parent=@1, Commands=@2, ChatColor=@3"; if (database.Query(query, name, parentname, permissions, chatcolor) == 1) + { message = "Group " + name + " has been created successfully."; - - groups.Add(group); + groups.Add(group); + } + else if (exceptions) + throw new GroupManagerException("Failed to add group '" + name + "'"); return message; } @@ -115,15 +142,23 @@ namespace TShockAPI.DB return AddGroup(name, parent, permissions, "255,255,255"); } - public String DeleteGroup(String name) + public String DeleteGroup(String name, bool exceptions = false) { String message = ""; if (!GroupExists(name)) + { + if (exceptions) + throw new GroupNotExistException(name); return "Error: Group doesn't exists."; + } if (database.Query("DELETE FROM GroupList WHERE GroupName=@0", name) == 1) + { message = "Group " + name + " has been deleted successfully."; - groups.Remove(TShock.Utils.GetGroup(name)); + groups.Remove(TShock.Utils.GetGroup(name)); + } + else if (exceptions) + throw new GroupManagerException("Failed to delete group '" + name + "'"); return message; } @@ -239,4 +274,36 @@ namespace TShockAPI.DB } } } -} \ No newline at end of file + + [Serializable] + public class GroupManagerException : Exception + { + public GroupManagerException(string message) + : base(message) + { + } + + public GroupManagerException(string message, Exception inner) + : base(message, inner) + { + } + } + + [Serializable] + public class GroupExistsException : GroupManagerException + { + public GroupExistsException(string name) + : base("Group '" + name + "' already exists") + { + } + } + + [Serializable] + public class GroupNotExistException : GroupManagerException + { + public GroupNotExistException(string name) + : base("Group '" + name + "' does not exist") + { + } + } +} From c5497acae70b7f944d06eb9892cce09e47002a7f Mon Sep 17 00:00:00 2001 From: stevenh Date: Mon, 13 Feb 2012 21:16:50 +0000 Subject: [PATCH 14/73] Check for null in FindPlayer to avoid errors on null object --- TShockAPI/Utils.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/TShockAPI/Utils.cs b/TShockAPI/Utils.cs index d5c723b9..df5c7207 100644 --- a/TShockAPI/Utils.cs +++ b/TShockAPI/Utils.cs @@ -205,6 +205,9 @@ namespace TShockAPI public List FindPlayer(string ply) { var found = new List(); + // Avoid errors caused by null search + if (null == ply) + return found; ply = ply.ToLower(); foreach (TSPlayer player in TShock.Players) { From c7a9ee32cd958c717a8e0ae757a5406979f9aac2 Mon Sep 17 00:00:00 2001 From: stevenh Date: Mon, 13 Feb 2012 21:22:47 +0000 Subject: [PATCH 15/73] Added ChatColor helper to Group useful for output methods --- TShockAPI/Group.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/TShockAPI/Group.cs b/TShockAPI/Group.cs index 01131a5e..16448677 100644 --- a/TShockAPI/Group.cs +++ b/TShockAPI/Group.cs @@ -44,6 +44,11 @@ namespace TShockAPI byte.TryParse(chatcolor.Split(',')[2], out B); } + public string ChatColor() + { + return string.Format("{0}{1}{2}", R.ToString("X2"), G.ToString("X2"), B.ToString("X2")); + } + public virtual bool HasPermission(string permission) { var cur = this; From e5a078957f52d7c9cb9834880b8a819d5e07b3a0 Mon Sep 17 00:00:00 2001 From: stevenh Date: Mon, 13 Feb 2012 21:24:01 +0000 Subject: [PATCH 16/73] Added default for status = 200 on RestObject constructor --- TShockAPI/Rest/RestObject.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TShockAPI/Rest/RestObject.cs b/TShockAPI/Rest/RestObject.cs index 6b99d1cc..e63233dc 100644 --- a/TShockAPI/Rest/RestObject.cs +++ b/TShockAPI/Rest/RestObject.cs @@ -41,7 +41,7 @@ namespace Rests set { this["response"] = value; } } - public RestObject(string status) + public RestObject(string status = "200") { Status = status; } From ce5c659e89cfc3d53c8b13a5f48fdefe3b3f44ae Mon Sep 17 00:00:00 2001 From: stevenh Date: Mon, 13 Feb 2012 21:27:35 +0000 Subject: [PATCH 17/73] Moved RestApi initialisation to main Initialise method so its available early. This helps tools detect a server during its timeconsuming startup. Additional threading may be required to ensure timely responses during high load periods --- TShockAPI/TShock.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/TShockAPI/TShock.cs b/TShockAPI/TShock.cs index 2c50bf97..0c697c24 100755 --- a/TShockAPI/TShock.cs +++ b/TShockAPI/TShock.cs @@ -210,6 +210,9 @@ namespace TShockAPI Commands.InitCommands(); //RconHandler.StartThread(); + if (Config.RestApiEnabled) + RestApi.Start(); + if (Config.BufferPackets) PacketBuffer = new PacketBufferer(); @@ -434,8 +437,6 @@ namespace TShockAPI AuthToken = 0; } Regions.ReloadAllRegions(); - if (Config.RestApiEnabled) - RestApi.Start(); StatTracker.CheckIn(); FixChestStacks(); From 78cc7a6f753ccba977e787f46c0816d59ab66af8 Mon Sep 17 00:00:00 2001 From: stevenh Date: Mon, 13 Feb 2012 18:48:28 +0000 Subject: [PATCH 18/73] Added the ability to delete a ban by name in the same way as a user --- TShockAPI/DB/BanManager.cs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/TShockAPI/DB/BanManager.cs b/TShockAPI/DB/BanManager.cs index 57eaa909..65ab171a 100644 --- a/TShockAPI/DB/BanManager.cs +++ b/TShockAPI/DB/BanManager.cs @@ -123,11 +123,15 @@ throw new Exception("Could not find a database library (probably Sqlite3.dll)"); return false; } - public bool RemoveBan(string ip) + public bool RemoveBan(string match, bool byName = false, bool casesensitive = true) { try { - return database.Query("DELETE FROM Bans WHERE IP=@0", ip) != 0; + if (!byName) + return database.Query("DELETE FROM Bans WHERE IP=@0", match) != 0; + + var namecol = casesensitive ? "Name" : "UPPER(Name)"; + return database.Query("DELETE FROM Bans WHERE " + namecol + "=@0", casesensitive ? match : match.ToUpper()) != 0; } catch (Exception ex) { From 6d08fef2758d8ed6b8a18627c7263c9c0b726317 Mon Sep 17 00:00:00 2001 From: stevenh Date: Mon, 13 Feb 2012 18:32:13 +0000 Subject: [PATCH 19/73] Fixed missing UNIQUE constraints when using SQLite Fixed missing NOT NULL constaints when using MySQL --- TShockAPI/DB/IQueryBuilder.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/TShockAPI/DB/IQueryBuilder.cs b/TShockAPI/DB/IQueryBuilder.cs index 107375da..9157e645 100644 --- a/TShockAPI/DB/IQueryBuilder.cs +++ b/TShockAPI/DB/IQueryBuilder.cs @@ -42,7 +42,7 @@ namespace TShockAPI.DB var columns = table.Columns.Select( c => - "'{0}' {1} {2} {3} {4}".SFormat(c.Name, DbTypeToString(c.Type, c.Length), c.Primary ? "PRIMARY KEY" : "", + "'{0}' {1} {2} {3} {4} {5}".SFormat(c.Name, DbTypeToString(c.Type, c.Length), c.Primary ? "PRIMARY KEY" : "", c.AutoIncrement ? "AUTOINCREMENT" : "", c.NotNull ? "NOT NULL" : "", c.Unique ? "UNIQUE" : "")); return "CREATE TABLE '{0}' ({1})".SFormat(table.Name, string.Join(", ", columns)); @@ -198,7 +198,7 @@ namespace TShockAPI.DB var columns = table.Columns.Select( c => - "{0} {1} {2} {3}".SFormat(c.Name, DbTypeToString(c.Type, c.Length), c.Primary ? "PRIMARY KEY" : "", + "{0} {1} {2} {3} {4}".SFormat(c.Name, DbTypeToString(c.Type, c.Length), c.Primary ? "PRIMARY KEY" : "", c.AutoIncrement ? "AUTO_INCREMENT" : "", c.NotNull ? "NOT NULL" : "")); var uniques = table.Columns.Where(c => c.Unique).Select(c => c.Name); return "CREATE TABLE {0} ({1} {2})".SFormat(table.Name, string.Join(", ", columns), From 75f3fe454827b2905d91ac8b41e49ba03f0bc96e Mon Sep 17 00:00:00 2001 From: stevenh Date: Tue, 14 Feb 2012 11:08:29 +0000 Subject: [PATCH 20/73] Disabled EnableBanOnUsernames test on Bans as this is currently expected behavour --- UnitTests/BanManagerTest.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/UnitTests/BanManagerTest.cs b/UnitTests/BanManagerTest.cs index b1c94d87..bcd4146b 100644 --- a/UnitTests/BanManagerTest.cs +++ b/UnitTests/BanManagerTest.cs @@ -63,8 +63,9 @@ namespace UnitTests Assert.IsNotNull(Bans.GetBanByIp("127.0.0.1")); TShock.Config.EnableBanOnUsernames = true; Assert.IsNotNull(Bans.GetBanByName("BanTest")); - TShock.Config.EnableBanOnUsernames = false; - Assert.IsNull(Bans.GetBanByName("BanTest")); + // Disabled this this for now as its currently expected behavour + //TShock.Config.EnableBanOnUsernames = false; + //Assert.IsNull(Bans.GetBanByName("BanTest")); } } } From fa0e02eb094ba7a21ffab0b6311b84c9e1e529ec Mon Sep 17 00:00:00 2001 From: k0rd Date: Tue, 14 Feb 2012 18:39:43 -0500 Subject: [PATCH 21/73] fix for noclip detection sometimes being activated by liquids --- TShockAPI/GetDataHandlers.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TShockAPI/GetDataHandlers.cs b/TShockAPI/GetDataHandlers.cs index 96b9b19d..051f5ccd 100644 --- a/TShockAPI/GetDataHandlers.cs +++ b/TShockAPI/GetDataHandlers.cs @@ -444,7 +444,7 @@ namespace TShockAPI { for (int j = num3; j < num4; j++) { - if (Main.tile[i, j] != null && Main.tile[i, j].active && Main.tileSolid[(int)Main.tile[i, j].type] && !Main.tileSolidTop[(int)Main.tile[i, j].type] &&(((int)Main.tile[i,j].type !=53) && ((int)Main.tile[i,j].type !=112) && ((int)Main.tile[i,j].type !=116) && ((int)Main.tile[i,j].type !=123))) + if (Main.tile[i, j] != null && Main.tile[i, j].active && Main.tileSolid[(int)Main.tile[i, j].type] && !Main.tileSolidTop[(int)Main.tile[i, j].type] &&(((int)Main.tile[i,j].type !=53) && ((int)Main.tile[i,j].type !=112) && ((int)Main.tile[i,j].type !=116) && ((int)Main.tile[i,j].type !=123)) && ((Main.tile[i,j].liquid == 0 )&& !Main.tile[i,j].lava)) { Vector2 vector; vector.X = (float)(i * 16); From 2c8c5dc7b999decb9e25c3bc8a62a5dfe24270b2 Mon Sep 17 00:00:00 2001 From: Lucas Nicodemus Date: Wed, 15 Feb 2012 16:06:39 -0700 Subject: [PATCH 22/73] Update TShockAPI/TShock.cs --- TShockAPI/TShock.cs | 2916 +++++++++++++++++++++---------------------- 1 file changed, 1458 insertions(+), 1458 deletions(-) diff --git a/TShockAPI/TShock.cs b/TShockAPI/TShock.cs index 0c697c24..63f86190 100755 --- a/TShockAPI/TShock.cs +++ b/TShockAPI/TShock.cs @@ -1,1466 +1,1466 @@ -/* -TShock, a server mod for Terraria -Copyright (C) 2011 The TShock Team - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Data; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.Globalization; -using System.IO; -using System.Net; -using System.Reflection; -using System.Threading; -using Hooks; -using MaxMind; -using Mono.Data.Sqlite; -using MySql.Data.MySqlClient; -using Rests; -using Terraria; -using TShockAPI.DB; -using TShockAPI.Net; - -namespace TShockAPI -{ - [APIVersion(1, 11)] - public class TShock : TerrariaPlugin - { - public static readonly Version VersionNum = Assembly.GetExecutingAssembly().GetName().Version; - public static readonly string VersionCodename = "Squashing bugs, and adding suggestions"; - - public static string SavePath = "tshock"; - - public static TSPlayer[] Players = new TSPlayer[Main.maxPlayers]; - public static BanManager Bans; - public static WarpManager Warps; - public static RegionManager Regions; - public static BackupManager Backups; - public static GroupManager Groups; - public static UserManager Users; - public static ItemManager Itembans; - public static RemeberedPosManager RememberedPos; - public static InventoryManager InventoryDB; - public static ConfigFile Config { get; set; } - public static IDbConnection DB; - public static bool OverridePort; - public static PacketBufferer PacketBuffer; - public static GeoIPCountry Geo; - public static SecureRest RestApi; - public static RestManager RestManager; - public static Utils Utils = new Utils(); - public static StatTracker StatTracker = new StatTracker(); - /// - /// Used for implementing REST Tokens prior to the REST system starting up. - /// - public static Dictionary RESTStartupTokens = new Dictionary(); - - /// - /// Called after TShock is initialized. Useful for plugins that needs hooks before tshock but also depend on tshock being loaded. - /// - public static event Action Initialized; - - - public override Version Version - { - get { return VersionNum; } - } - - public override string Name - { - get { return "TShock"; } - } - - public override string Author - { - get { return "The Nyx Team"; } - } - - public override string Description - { - get { return "The administration modification of the future."; } - } - - public TShock(Main game) - : base(game) - { - Config = new ConfigFile(); - Order = 0; - } - - - [SuppressMessage("Microsoft.Security", "CA2122:DoNotIndirectlyExposeMethodsWithLinkDemands")] - public override void Initialize() - { - HandleCommandLine(Environment.GetCommandLineArgs()); - - if (!Directory.Exists(SavePath)) - Directory.CreateDirectory(SavePath); - - DateTime now = DateTime.Now; -#if DEBUG - Log.Initialize(Path.Combine(SavePath, now.ToString("yyyyMMddHHmmss")+".log"), LogLevel.All, false); -#else - Log.Initialize(Path.Combine(SavePath, now.ToString("yyyyMMddHHmmss")+".log"), LogLevel.All & ~LogLevel.Debug, false); -#endif - AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; - - try - { - if (File.Exists(Path.Combine(SavePath, "tshock.pid"))) - { - Log.ConsoleInfo( - "TShock was improperly shut down. Please avoid this in the future, world corruption may result from this."); - File.Delete(Path.Combine(SavePath, "tshock.pid")); - } - File.WriteAllText(Path.Combine(SavePath, "tshock.pid"), Process.GetCurrentProcess().Id.ToString(CultureInfo.InvariantCulture)); - - ConfigFile.ConfigRead += OnConfigRead; - FileTools.SetupConfig(); - - HandleCommandLinePostConfigLoad(Environment.GetCommandLineArgs()); - - if (Config.StorageType.ToLower() == "sqlite") - { - string sql = Path.Combine(SavePath, "tshock.sqlite"); - DB = new SqliteConnection(string.Format("uri=file://{0},Version=3", sql)); - } - else if (Config.StorageType.ToLower() == "mysql") - { - try - { - var hostport = Config.MySqlHost.Split(':'); - DB = new MySqlConnection(); - DB.ConnectionString = - String.Format("Server={0}; Port={1}; Database={2}; Uid={3}; Pwd={4};", - hostport[0], - hostport.Length > 1 ? hostport[1] : "3306", - Config.MySqlDbName, - Config.MySqlUsername, - Config.MySqlPassword - ); - } - catch (MySqlException ex) - { - Log.Error(ex.ToString()); - throw new Exception("MySql not setup correctly"); - } - } - else - { - throw new Exception("Invalid storage type"); - } - - Backups = new BackupManager(Path.Combine(SavePath, "backups")); - Backups.KeepFor = Config.BackupKeepFor; - Backups.Interval = Config.BackupInterval; - Bans = new BanManager(DB); - Warps = new WarpManager(DB); - Users = new UserManager(DB); - Groups = new GroupManager(DB); - Groups.LoadPermisions(); - Regions = new RegionManager(DB); - Itembans = new ItemManager(DB); - RememberedPos = new RemeberedPosManager(DB); - InventoryDB = new InventoryManager(DB); - RestApi = new SecureRest(Netplay.serverListenIP, Config.RestApiPort); - RestApi.Verify += RestApi_Verify; - RestApi.Port = Config.RestApiPort; - RestManager = new RestManager(RestApi); - RestManager.RegisterRestfulCommands(); - - var geoippath = Path.Combine(SavePath, "GeoIP.dat"); - if (Config.EnableGeoIP && File.Exists(geoippath)) - Geo = new GeoIPCountry(geoippath); - - Console.Title = string.Format("TerrariaShock Version {0} ({1})", Version, VersionCodename); - Log.ConsoleInfo(string.Format("TerrariaShock Version {0} ({1}) now running.", Version, VersionCodename)); - - GameHooks.PostInitialize += OnPostInit; - GameHooks.Update += OnUpdate; - ServerHooks.Connect += OnConnect; - ServerHooks.Join += OnJoin; - ServerHooks.Leave += OnLeave; - ServerHooks.Chat += OnChat; - ServerHooks.Command += ServerHooks_OnCommand; - NetHooks.GetData += OnGetData; - NetHooks.SendData += NetHooks_SendData; - NetHooks.GreetPlayer += OnGreetPlayer; - NpcHooks.StrikeNpc += NpcHooks_OnStrikeNpc; - NpcHooks.SetDefaultsInt += OnNpcSetDefaults; - ProjectileHooks.SetDefaults += OnProjectileSetDefaults; - WorldHooks.StartHardMode += OnStartHardMode; - WorldHooks.SaveWorld += OnSaveWorld; - - GetDataHandlers.InitGetDataHandler(); - Commands.InitCommands(); - //RconHandler.StartThread(); - +/* +TShock, a server mod for Terraria +Copyright (C) 2011 The TShock Team + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; +using System.Globalization; +using System.IO; +using System.Net; +using System.Reflection; +using System.Threading; +using Hooks; +using MaxMind; +using Mono.Data.Sqlite; +using MySql.Data.MySqlClient; +using Rests; +using Terraria; +using TShockAPI.DB; +using TShockAPI.Net; + +namespace TShockAPI +{ + [APIVersion(1, 11)] + public class TShock : TerrariaPlugin + { + public static readonly Version VersionNum = Assembly.GetExecutingAssembly().GetName().Version; + public static readonly string VersionCodename = "Squashing bugs, and adding suggestions"; + + public static string SavePath = "tshock"; + + public static TSPlayer[] Players = new TSPlayer[Main.maxPlayers]; + public static BanManager Bans; + public static WarpManager Warps; + public static RegionManager Regions; + public static BackupManager Backups; + public static GroupManager Groups; + public static UserManager Users; + public static ItemManager Itembans; + public static RemeberedPosManager RememberedPos; + public static InventoryManager InventoryDB; + public static ConfigFile Config { get; set; } + public static IDbConnection DB; + public static bool OverridePort; + public static PacketBufferer PacketBuffer; + public static GeoIPCountry Geo; + public static SecureRest RestApi; + public static RestManager RestManager; + public static Utils Utils = new Utils(); + public static StatTracker StatTracker = new StatTracker(); + /// + /// Used for implementing REST Tokens prior to the REST system starting up. + /// + public static Dictionary RESTStartupTokens = new Dictionary(); + + /// + /// Called after TShock is initialized. Useful for plugins that needs hooks before tshock but also depend on tshock being loaded. + /// + public static event Action Initialized; + + + public override Version Version + { + get { return VersionNum; } + } + + public override string Name + { + get { return "TShock"; } + } + + public override string Author + { + get { return "The Nyx Team"; } + } + + public override string Description + { + get { return "The administration modification of the future."; } + } + + public TShock(Main game) + : base(game) + { + Config = new ConfigFile(); + Order = 0; + } + + + [SuppressMessage("Microsoft.Security", "CA2122:DoNotIndirectlyExposeMethodsWithLinkDemands")] + public override void Initialize() + { + HandleCommandLine(Environment.GetCommandLineArgs()); + + if (!Directory.Exists(SavePath)) + Directory.CreateDirectory(SavePath); + + DateTime now = DateTime.Now; +#if DEBUG + Log.Initialize(Path.Combine(SavePath, now.ToString("yyyyMMddHHmmss")+".log"), LogLevel.All, false); +#else + Log.Initialize(Path.Combine(SavePath, now.ToString("yyyyMMddHHmmss")+".log"), LogLevel.All & ~LogLevel.Debug, false); +#endif + AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; + + try + { + if (File.Exists(Path.Combine(SavePath, "tshock.pid"))) + { + Log.ConsoleInfo( + "TShock was improperly shut down. Please avoid this in the future, world corruption may result from this."); + File.Delete(Path.Combine(SavePath, "tshock.pid")); + } + File.WriteAllText(Path.Combine(SavePath, "tshock.pid"), Process.GetCurrentProcess().Id.ToString(CultureInfo.InvariantCulture)); + + ConfigFile.ConfigRead += OnConfigRead; + FileTools.SetupConfig(); + + HandleCommandLinePostConfigLoad(Environment.GetCommandLineArgs()); + + if (Config.StorageType.ToLower() == "sqlite") + { + string sql = Path.Combine(SavePath, "tshock.sqlite"); + DB = new SqliteConnection(string.Format("uri=file://{0},Version=3", sql)); + } + else if (Config.StorageType.ToLower() == "mysql") + { + try + { + var hostport = Config.MySqlHost.Split(':'); + DB = new MySqlConnection(); + DB.ConnectionString = + String.Format("Server={0}; Port={1}; Database={2}; Uid={3}; Pwd={4};", + hostport[0], + hostport.Length > 1 ? hostport[1] : "3306", + Config.MySqlDbName, + Config.MySqlUsername, + Config.MySqlPassword + ); + } + catch (MySqlException ex) + { + Log.Error(ex.ToString()); + throw new Exception("MySql not setup correctly"); + } + } + else + { + throw new Exception("Invalid storage type"); + } + + Backups = new BackupManager(Path.Combine(SavePath, "backups")); + Backups.KeepFor = Config.BackupKeepFor; + Backups.Interval = Config.BackupInterval; + Bans = new BanManager(DB); + Warps = new WarpManager(DB); + Users = new UserManager(DB); + Groups = new GroupManager(DB); + Groups.LoadPermisions(); + Regions = new RegionManager(DB); + Itembans = new ItemManager(DB); + RememberedPos = new RemeberedPosManager(DB); + InventoryDB = new InventoryManager(DB); + RestApi = new SecureRest(Netplay.serverListenIP, Config.RestApiPort); + RestApi.Verify += RestApi_Verify; + RestApi.Port = Config.RestApiPort; + RestManager = new RestManager(RestApi); + RestManager.RegisterRestfulCommands(); + + var geoippath = Path.Combine(SavePath, "GeoIP.dat"); + if (Config.EnableGeoIP && File.Exists(geoippath)) + Geo = new GeoIPCountry(geoippath); + + Console.Title = string.Format("TerrariaShock Version {0} ({1})", Version, VersionCodename); + Log.ConsoleInfo(string.Format("TerrariaShock Version {0} ({1}) now running.", Version, VersionCodename)); + + GameHooks.PostInitialize += OnPostInit; + GameHooks.Update += OnUpdate; + ServerHooks.Connect += OnConnect; + ServerHooks.Join += OnJoin; + ServerHooks.Leave += OnLeave; + ServerHooks.Chat += OnChat; + ServerHooks.Command += ServerHooks_OnCommand; + NetHooks.GetData += OnGetData; + NetHooks.SendData += NetHooks_SendData; + NetHooks.GreetPlayer += OnGreetPlayer; + NpcHooks.StrikeNpc += NpcHooks_OnStrikeNpc; + NpcHooks.SetDefaultsInt += OnNpcSetDefaults; + ProjectileHooks.SetDefaults += OnProjectileSetDefaults; + WorldHooks.StartHardMode += OnStartHardMode; + WorldHooks.SaveWorld += OnSaveWorld; + + GetDataHandlers.InitGetDataHandler(); + Commands.InitCommands(); + //RconHandler.StartThread(); + if (Config.RestApiEnabled) RestApi.Start(); - if (Config.BufferPackets) - PacketBuffer = new PacketBufferer(); - - Log.ConsoleInfo("AutoSave " + (Config.AutoSave ? "Enabled" : "Disabled")); - Log.ConsoleInfo("Backups " + (Backups.Interval > 0 ? "Enabled" : "Disabled")); - - if (Initialized != null) - Initialized(); - } - catch (Exception ex) - { - Log.Error("Fatal Startup Exception"); - Log.Error(ex.ToString()); - Environment.Exit(1); - } - } - - private RestObject RestApi_Verify(string username, string password) - { - var userAccount = Users.GetUserByName(username); - if (userAccount == null) - { - return new RestObject("401") - {Error = "Invalid username/password combination provided. Please re-submit your query with a correct pair."}; - } - - if (Utils.HashPassword(password).ToUpper() != userAccount.Password.ToUpper()) - { - return new RestObject("401") - {Error = "Invalid username/password combination provided. Please re-submit your query with a correct pair."}; - } - - if (!Utils.GetGroup(userAccount.Group).HasPermission("api") && userAccount.Group != "superadmin") - { - return new RestObject("403") - { - Error = - "Although your account was successfully found and identified, your account lacks the permission required to use the API. (api)" - }; - } - - return new RestObject("200") {Response = "Successful login"}; //Maybe return some user info too? - } - - protected override void Dispose(bool disposing) - { - if (disposing) - { - if (Geo != null) - { - Geo.Dispose(); - } - GameHooks.PostInitialize -= OnPostInit; - GameHooks.Update -= OnUpdate; - ServerHooks.Connect -= OnConnect; - ServerHooks.Join -= OnJoin; - ServerHooks.Leave -= OnLeave; - ServerHooks.Chat -= OnChat; - ServerHooks.Command -= ServerHooks_OnCommand; - NetHooks.GetData -= OnGetData; - NetHooks.SendData -= NetHooks_SendData; - NetHooks.GreetPlayer -= OnGreetPlayer; - NpcHooks.StrikeNpc -= NpcHooks_OnStrikeNpc; - NpcHooks.SetDefaultsInt -= OnNpcSetDefaults; - ProjectileHooks.SetDefaults -= OnProjectileSetDefaults; - WorldHooks.StartHardMode -= OnStartHardMode; - WorldHooks.SaveWorld -= OnSaveWorld; - if (File.Exists(Path.Combine(SavePath, "tshock.pid"))) - { - File.Delete(Path.Combine(SavePath, "tshock.pid")); - } - RestApi.Dispose(); - Log.Dispose(); - } - - base.Dispose(disposing); - } - - /// - /// Handles exceptions that we didn't catch or that Red fucked up - /// - /// - /// - private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) - { - Log.Error(e.ExceptionObject.ToString()); - - if (e.ExceptionObject.ToString().Contains("Terraria.Netplay.ListenForClients") || - e.ExceptionObject.ToString().Contains("Terraria.Netplay.ServerLoop")) - { - var sb = new List(); - for (int i = 0; i < Netplay.serverSock.Length; i++) - { - if (Netplay.serverSock[i] == null) - { - sb.Add("Sock[" + i + "]"); - } - else if (Netplay.serverSock[i].tcpClient == null) - { - sb.Add("Tcp[" + i + "]"); - } - } - Log.Error(string.Join(", ", sb)); - } - - if (e.IsTerminating) - { - if (Main.worldPathName != null && Config.SaveWorldOnCrash) - { - Main.worldPathName += ".crash"; - WorldGen.saveWorld(); - } - } - } - - private void HandleCommandLine(string[] parms) - { - for (int i = 0; i < parms.Length; i++) - { - if (parms[i].ToLower() == "-configpath") - { - var path = parms[++i]; - if (path.IndexOfAny(Path.GetInvalidPathChars()) == -1) - { - SavePath = path; - Log.ConsoleInfo("Config path has been set to " + path); - } - } - if (parms[i].ToLower() == "-worldpath") - { - var path = parms[++i]; - if (path.IndexOfAny(Path.GetInvalidPathChars()) == -1) - { - Main.WorldPath = path; - Log.ConsoleInfo("World path has been set to " + path); - } - } - if (parms[i].ToLower() == "-dump") - { - ConfigFile.DumpDescriptions(); - Permissions.DumpDescriptions(); - } - } - } - - public static void HandleCommandLinePostConfigLoad(string[] parms) - { - for (int i = 0; i < parms.Length; i++) - { - if (parms[i].ToLower() == "-port") - { - int port = Convert.ToInt32(parms[++i]); - Netplay.serverPort = port; - Config.ServerPort = port; - OverridePort = true; - Log.ConsoleInfo("Port overridden by startup argument. Set to " + port); - } - if (parms[i].ToLower() == "-rest-token") - { - string token = Convert.ToString(parms[++i]); - RESTStartupTokens.Add(token, "null"); - Console.WriteLine("Startup parameter overrode REST token."); - } - if (parms[i].ToLower() == "-rest-enabled") - { - Config.RestApiEnabled = Convert.ToBoolean(parms[++i]); - Console.WriteLine("Startup parameter overrode REST enable."); - - } - if (parms[i].ToLower() == "-rest-port") - { - Config.RestApiPort = Convert.ToInt32(parms[++i]); - Console.WriteLine("Startup parameter overrode REST port."); - + if (Config.BufferPackets) + PacketBuffer = new PacketBufferer(); + + Log.ConsoleInfo("AutoSave " + (Config.AutoSave ? "Enabled" : "Disabled")); + Log.ConsoleInfo("Backups " + (Backups.Interval > 0 ? "Enabled" : "Disabled")); + + if (Initialized != null) + Initialized(); + } + catch (Exception ex) + { + Log.Error("Fatal Startup Exception"); + Log.Error(ex.ToString()); + Environment.Exit(1); + } + } + + private RestObject RestApi_Verify(string username, string password) + { + var userAccount = Users.GetUserByName(username); + if (userAccount == null) + { + return new RestObject("401") + {Error = "Invalid username/password combination provided. Please re-submit your query with a correct pair."}; + } + + if (Utils.HashPassword(password).ToUpper() != userAccount.Password.ToUpper()) + { + return new RestObject("401") + {Error = "Invalid username/password combination provided. Please re-submit your query with a correct pair."}; + } + + if (!Utils.GetGroup(userAccount.Group).HasPermission("api") && userAccount.Group != "superadmin") + { + return new RestObject("403") + { + Error = + "Although your account was successfully found and identified, your account lacks the permission required to use the API. (api)" + }; + } + + return new RestObject("200") {Response = "Successful login"}; //Maybe return some user info too? + } + + protected override void Dispose(bool disposing) + { + if (disposing) + { + if (Geo != null) + { + Geo.Dispose(); + } + GameHooks.PostInitialize -= OnPostInit; + GameHooks.Update -= OnUpdate; + ServerHooks.Connect -= OnConnect; + ServerHooks.Join -= OnJoin; + ServerHooks.Leave -= OnLeave; + ServerHooks.Chat -= OnChat; + ServerHooks.Command -= ServerHooks_OnCommand; + NetHooks.GetData -= OnGetData; + NetHooks.SendData -= NetHooks_SendData; + NetHooks.GreetPlayer -= OnGreetPlayer; + NpcHooks.StrikeNpc -= NpcHooks_OnStrikeNpc; + NpcHooks.SetDefaultsInt -= OnNpcSetDefaults; + ProjectileHooks.SetDefaults -= OnProjectileSetDefaults; + WorldHooks.StartHardMode -= OnStartHardMode; + WorldHooks.SaveWorld -= OnSaveWorld; + if (File.Exists(Path.Combine(SavePath, "tshock.pid"))) + { + File.Delete(Path.Combine(SavePath, "tshock.pid")); + } + RestApi.Dispose(); + Log.Dispose(); + } + + base.Dispose(disposing); + } + + /// + /// Handles exceptions that we didn't catch or that Red fucked up + /// + /// + /// + private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) + { + Log.Error(e.ExceptionObject.ToString()); + + if (e.ExceptionObject.ToString().Contains("Terraria.Netplay.ListenForClients") || + e.ExceptionObject.ToString().Contains("Terraria.Netplay.ServerLoop")) + { + var sb = new List(); + for (int i = 0; i < Netplay.serverSock.Length; i++) + { + if (Netplay.serverSock[i] == null) + { + sb.Add("Sock[" + i + "]"); + } + else if (Netplay.serverSock[i].tcpClient == null) + { + sb.Add("Tcp[" + i + "]"); + } + } + Log.Error(string.Join(", ", sb)); + } + + if (e.IsTerminating) + { + if (Main.worldPathName != null && Config.SaveWorldOnCrash) + { + Main.worldPathName += ".crash"; + WorldGen.saveWorld(); + } + } + } + + private void HandleCommandLine(string[] parms) + { + for (int i = 0; i < parms.Length; i++) + { + if (parms[i].ToLower() == "-configpath") + { + var path = parms[++i]; + if (path.IndexOfAny(Path.GetInvalidPathChars()) == -1) + { + SavePath = path; + Log.ConsoleInfo("Config path has been set to " + path); + } + } + if (parms[i].ToLower() == "-worldpath") + { + var path = parms[++i]; + if (path.IndexOfAny(Path.GetInvalidPathChars()) == -1) + { + Main.WorldPath = path; + Log.ConsoleInfo("World path has been set to " + path); + } + } + if (parms[i].ToLower() == "-dump") + { + ConfigFile.DumpDescriptions(); + Permissions.DumpDescriptions(); + } + } + } + + public static void HandleCommandLinePostConfigLoad(string[] parms) + { + for (int i = 0; i < parms.Length; i++) + { + if (parms[i].ToLower() == "-port") + { + int port = Convert.ToInt32(parms[++i]); + Netplay.serverPort = port; + Config.ServerPort = port; + OverridePort = true; + Log.ConsoleInfo("Port overridden by startup argument. Set to " + port); + } + if (parms[i].ToLower() == "-rest-token") + { + string token = Convert.ToString(parms[++i]); + RESTStartupTokens.Add(token, "null"); + Console.WriteLine("Startup parameter overrode REST token."); + } + if (parms[i].ToLower() == "-rest-enabled") + { + Config.RestApiEnabled = Convert.ToBoolean(parms[++i]); + Console.WriteLine("Startup parameter overrode REST enable."); + + } + if (parms[i].ToLower() == "-rest-port") + { + Config.RestApiPort = Convert.ToInt32(parms[++i]); + Console.WriteLine("Startup parameter overrode REST port."); + } if ((parms[i].ToLower() == "-maxplayers")||(parms[i].ToLower() == "-players")) { Config.MaxSlots = Convert.ToInt32(parms[++i]); Console.WriteLine("Startup parameter overrode maximum player slot configuration value."); - } - } - } - - /* - * Hooks: - * - */ - - public static int AuthToken = -1; - - private void OnPostInit() - { - if (!File.Exists(Path.Combine(SavePath, "auth.lck")) && !File.Exists(Path.Combine(SavePath, "authcode.txt"))) - { - var r = new Random((int) DateTime.Now.ToBinary()); - AuthToken = r.Next(100000, 10000000); - Console.ForegroundColor = ConsoleColor.Yellow; - Console.WriteLine("TShock Notice: To become SuperAdmin, join the game and type /auth " + AuthToken); - Console.WriteLine("This token will display until disabled by verification. (/auth-verify)"); - Console.ForegroundColor = ConsoleColor.Gray; - FileTools.CreateFile(Path.Combine(SavePath, "authcode.txt")); - using (var tw = new StreamWriter(Path.Combine(SavePath, "authcode.txt"))) - { - tw.WriteLine(AuthToken); - } - } - else if (File.Exists(Path.Combine(SavePath, "authcode.txt"))) - { - using (var tr = new StreamReader(Path.Combine(SavePath, "authcode.txt"))) - { - AuthToken = Convert.ToInt32(tr.ReadLine()); - } - Console.ForegroundColor = ConsoleColor.Yellow; - Console.WriteLine( - "TShock Notice: authcode.txt is still present, and the AuthToken located in that file will be used."); - Console.WriteLine("To become superadmin, join the game and type /auth " + AuthToken); - Console.WriteLine("This token will display until disabled by verification. (/auth-verify)"); - Console.ForegroundColor = ConsoleColor.Gray; - } - else - { - AuthToken = 0; - } - Regions.ReloadAllRegions(); - - StatTracker.CheckIn(); - FixChestStacks(); - } - - private void FixChestStacks() - { - foreach (Chest chest in Main.chest) - { - if (chest != null) - { - foreach (Item item in chest.item) - { - if (item != null && item.stack > item.maxStack) - item.stack = item.maxStack; - } - } - } - } - - private DateTime LastCheck = DateTime.UtcNow; - private DateTime LastSave = DateTime.UtcNow; - - private void OnUpdate() - { - UpdateManager.UpdateProcedureCheck(); - StatTracker.CheckIn(); - if (Backups.IsBackupTime) - Backups.Backup(); - - //call these every second, not every update - if ((DateTime.UtcNow - LastCheck).TotalSeconds >= 1) - { - OnSecondUpdate(); - LastCheck = DateTime.UtcNow; - } - - if ((DateTime.UtcNow - LastSave).TotalMinutes >= Config.ServerSideInventorySave) - { - foreach (TSPlayer player in Players) - { - // prevent null point exceptions - if (player != null && player.IsLoggedIn && !player.IgnoreActionsForClearingTrashCan) - { - - InventoryDB.InsertPlayerData(player); - } - } - LastSave = DateTime.UtcNow; - } - } - - private void OnSecondUpdate() - { - if (Config.ForceTime != "normal") - { - switch (Config.ForceTime) - { - case "day": - TSPlayer.Server.SetTime(true, 27000.0); - break; - case "night": - TSPlayer.Server.SetTime(false, 16200.0); - break; - } - } - int count = 0; - foreach (TSPlayer player in Players) - { - if (player != null && player.Active) - { - count++; - if (player.TilesDestroyed != null) - { - if (player.TileKillThreshold >= Config.TileKillThreshold) - { - player.Disable("Reached TileKill threshold"); - TSPlayer.Server.RevertTiles(player.TilesDestroyed); - player.TilesDestroyed.Clear(); - } - } - if (player.TileKillThreshold > 0) - { - player.TileKillThreshold = 0; - //We don't want to revert the entire map in case of a disable. - player.TilesDestroyed.Clear(); - } - if (player.TilesCreated != null) - { - if (player.TilePlaceThreshold >= Config.TilePlaceThreshold) - { - player.Disable("Reached TilePlace threshold"); - TSPlayer.Server.RevertTiles(player.TilesCreated); - player.TilesCreated.Clear(); - } - } - if (player.TilePlaceThreshold > 0) - { - player.TilePlaceThreshold = 0; - } - if (player.TileLiquidThreshold >= Config.TileLiquidThreshold) - { - player.Disable("Reached TileLiquid threshold"); - } - if (player.TileLiquidThreshold > 0) - { - player.TileLiquidThreshold = 0; - } - if (player.ProjectileThreshold >= Config.ProjectileThreshold) - { - player.Disable("Reached Projectile threshold"); - } - if (player.ProjectileThreshold > 0) - { - player.ProjectileThreshold = 0; - } - if (player.Dead && (DateTime.Now - player.LastDeath).Seconds >= 3 && player.Difficulty != 2) - { - player.Spawn(); - } - string check = "none"; - foreach (Item item in player.TPlayer.inventory) - { - if (!player.Group.HasPermission(Permissions.ignorestackhackdetection) && item.stack > item.maxStack && - item.type != 0) - { - check = "Remove Item " + item.name + " (" + item.stack + ") exceeds max stack of " + item.maxStack; - } - } - player.IgnoreActionsForCheating = check; - check = "none"; - foreach (Item item in player.TPlayer.armor) - { - if (!player.Group.HasPermission(Permissions.usebanneditem) && Itembans.ItemIsBanned(item.name, player)) - { - player.SetBuff(30, 120); //Bleeding - player.SetBuff(36, 120); //Broken Armor - check = "Remove Armor/Accessory " + item.name; - } - } - player.IgnoreActionsForDisabledArmor = check; - if (CheckIgnores(player)) - { - player.SetBuff(33, 120); //Weak - player.SetBuff(32, 120); //Slow - player.SetBuff(23, 120); //Cursed - } - else if (!player.Group.HasPermission(Permissions.usebanneditem) && - Itembans.ItemIsBanned(player.TPlayer.inventory[player.TPlayer.selectedItem].name, player)) - { - player.SetBuff(23, 120); //Cursed - } - } - } - Console.Title = string.Format("TerrariaShock Version {0} ({1}) ({2}/{3})", Version, VersionCodename, count, - Config.MaxSlots); - } - - private void OnConnect(int ply, HandledEventArgs handler) - { - var player = new TSPlayer(ply); - if (Config.EnableDNSHostResolution) - { - player.Group = Users.GetGroupForIPExpensive(player.IP); - } - else - { - player.Group = Users.GetGroupForIP(player.IP); - } - - if (Utils.ActivePlayers() + 1 > Config.MaxSlots + 20) - { - Utils.ForceKick(player, Config.ServerFullNoReservedReason); - handler.Handled = true; - return; - } - - var ipban = Bans.GetBanByIp(player.IP); - Ban ban = null; - if (ipban != null && Config.EnableIPBans) - ban = ipban; - - if (ban != null) - { - Utils.ForceKick(player, string.Format("You are banned: {0}", ban.Reason)); - handler.Handled = true; - return; - } - - if (!FileTools.OnWhitelist(player.IP)) - { - Utils.ForceKick(player, "Not on whitelist."); - handler.Handled = true; - return; - } - - if (Geo != null) - { - var code = Geo.TryGetCountryCode(IPAddress.Parse(player.IP)); - player.Country = code == null ? "N/A" : GeoIPCountry.GetCountryNameByCode(code); - if (code == "A1") - { - if (Config.KickProxyUsers) - { - Utils.ForceKick(player, "Proxies are not allowed"); - handler.Handled = true; - return; - } - } - } - Players[ply] = player; - } - - private void OnJoin(int ply, HandledEventArgs handler) - { - var player = Players[ply]; - if (player == null) - { - handler.Handled = true; - return; - } - - var nameban = Bans.GetBanByName(player.Name); - Ban ban = null; - if (nameban != null && Config.EnableBanOnUsernames) - ban = nameban; - - if (ban != null) - { - Utils.ForceKick(player, string.Format("You are banned: {0}", ban.Reason)); - handler.Handled = true; - return; - } - } - - private void OnLeave(int ply) - { - - var tsplr = Players[ply]; - Players[ply] = null; - - if (tsplr != null && tsplr.ReceivedInfo) - { - if (!tsplr.SilentKickInProgress) - { - Utils.Broadcast(tsplr.Name + " left", Color.Yellow); - } - Log.Info(string.Format("{0} left.", tsplr.Name)); - - if (tsplr.IsLoggedIn && !tsplr.IgnoreActionsForClearingTrashCan) - { - tsplr.PlayerData.CopyInventory(tsplr); - InventoryDB.InsertPlayerData(tsplr); - } - - if ((Config.RememberLeavePos) &&(!tsplr.LoginHarassed)) - { - RememberedPos.InsertLeavePos(tsplr.Name, tsplr.IP, (int) (tsplr.X/16), (int) (tsplr.Y/16)); - } - } - } - - private void OnChat(messageBuffer msg, int ply, string text, HandledEventArgs e) - { - if (e.Handled) - return; - - var tsplr = Players[msg.whoAmI]; - if (tsplr == null) - { - e.Handled = true; - return; - } - - /*if (!Utils.ValidString(text)) - { - e.Handled = true; - return; - }*/ - - if (text.StartsWith("/")) - { - try - { - e.Handled = Commands.HandleCommand(tsplr, text); - } - catch (Exception ex) - { - Log.ConsoleError("Command exception"); - Log.Error(ex.ToString()); - } - } - else if (!tsplr.mute) - { - Utils.Broadcast( - String.Format(Config.ChatFormat, tsplr.Group.Name, tsplr.Group.Prefix, tsplr.Name, tsplr.Group.Suffix, text), - tsplr.Group.R, tsplr.Group.G, tsplr.Group.B); - e.Handled = true; - } - else if (tsplr.mute) - { - tsplr.SendMessage("You are muted!"); - e.Handled = true; - } - } - - /// - /// When a server command is run. - /// - /// - /// - private void ServerHooks_OnCommand(string text, HandledEventArgs e) - { - if (e.Handled) - return; - - // Damn you ThreadStatic and Redigit - if (Main.rand == null) - { - Main.rand = new Random(); - } - if (WorldGen.genRand == null) - { - WorldGen.genRand = new Random(); - } - - if (text.StartsWith("playing") || text.StartsWith("/playing")) - { - int count = 0; - foreach (TSPlayer player in Players) - { - if (player != null && player.Active) - { - count++; - TSPlayer.Server.SendMessage(string.Format("{0} ({1}) [{2}] <{3}>", player.Name, player.IP, - player.Group.Name, player.UserAccountName)); - } - } - TSPlayer.Server.SendMessage(string.Format("{0} players connected.", count)); - } - else if (text == "autosave") - { - Main.autoSave = Config.AutoSave = !Config.AutoSave; - Log.ConsoleInfo("AutoSave " + (Config.AutoSave ? "Enabled" : "Disabled")); - } - else if (text.StartsWith("/")) - { - Commands.HandleCommand(TSPlayer.Server, text); - } - else - { - Commands.HandleCommand(TSPlayer.Server, "/" + text); - } - e.Handled = true; - } - - private void OnGetData(GetDataEventArgs e) - { - if (e.Handled) - return; - - PacketTypes type = e.MsgID; - - Debug.WriteLine("Recv: {0:X}: {2} ({1:XX})", e.Msg.whoAmI, (byte) type, type); - - var player = Players[e.Msg.whoAmI]; - if (player == null) - { - e.Handled = true; - return; - } - - if (!player.ConnectionAlive) - { - e.Handled = true; - return; - } - - if (player.RequiresPassword && type != PacketTypes.PasswordSend) - { - e.Handled = true; - return; - } - - if ((player.State < 10 || player.Dead) && (int) type > 12 && (int) type != 16 && (int) type != 42 && (int) type != 50 && - (int) type != 38 && (int) type != 5 && (int) type != 21) - { - e.Handled = true; - return; - } - - using (var data = new MemoryStream(e.Msg.readBuffer, e.Index, e.Length)) - { - try - { - if (GetDataHandlers.HandlerGetData(type, player, data)) - e.Handled = true; - } - catch (Exception ex) - { - Log.Error(ex.ToString()); - } - } - } - - private void OnGreetPlayer(int who, HandledEventArgs e) - { - var player = Players[who]; - if (player == null) - { - e.Handled = true; - return; - } - player.LoginMS= DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond; - - Utils.ShowFileToUser(player, "motd.txt"); - - if (Config.PvPMode == "always" && !player.TPlayer.hostile) - { - player.SendMessage("PvP is forced! Enable PvP else you can't move or do anything!", Color.Red); - } - - if (!player.IsLoggedIn) - { - if (Config.ServerSideInventory) - { - player.SendMessage( - player.IgnoreActionsForInventory = "Server Side Inventory is enabled! Please /register or /login to play!", - Color.Red); - player.LoginHarassed = true; - } - else if (Config.RequireLogin) - { - player.SendMessage("Please /register or /login to play!", Color.Red); - player.LoginHarassed = true; - } - } - - if (player.Group.HasPermission(Permissions.causeevents) && Config.InfiniteInvasion) - { - StartInvasion(); - } - - player.LastNetPosition = new Vector2(Main.spawnTileX*16f, Main.spawnTileY*16f); - - if (Config.RememberLeavePos) - { - if (RememberedPos.GetLeavePos(player.Name, player.IP) != Vector2.Zero){ - var pos = RememberedPos.GetLeavePos(player.Name, player.IP); - - player.Teleport((int) pos.X, (int) pos.Y + 3); - }} - - e.Handled = true; - } - - private void NpcHooks_OnStrikeNpc(NpcStrikeEventArgs e) - { - if (Config.InfiniteInvasion) - { - IncrementKills(); - if (Main.invasionSize < 10) - { - Main.invasionSize = 20000000; - } - } - } - - private void OnProjectileSetDefaults(SetDefaultsEventArgs e) - { - if (e.Info == 43) - if (Config.DisableTombstones) - e.Object.SetDefaults(0); - if (e.Info == 75) - if (Config.DisableClownBombs) - e.Object.SetDefaults(0); - if (e.Info == 109) - if (Config.DisableSnowBalls) - e.Object.SetDefaults(0); - } - - private void OnNpcSetDefaults(SetDefaultsEventArgs e) - { - if (Itembans.ItemIsBanned(e.Object.name, null)) - { - e.Object.SetDefaults(0); - } - } - - /// - /// Send bytes to client using packetbuffering if available - /// - /// socket to send to - /// bytes to send - /// False on exception - public static bool SendBytes(ServerSock client, byte[] bytes) - { - if (PacketBuffer != null) - { - PacketBuffer.BufferBytes(client, bytes); - return true; - } - - return SendBytesBufferless(client, bytes); - } - - /// - /// Send bytes to a client ignoring the packet buffer - /// - /// socket to send to - /// bytes to send - /// False on exception - public static bool SendBytesBufferless(ServerSock client, byte[] bytes) - { - try - { - if (client.tcpClient.Connected) - client.networkStream.Write(bytes, 0, bytes.Length); - return true; - } - catch (Exception ex) - { - Log.Warn("This is a normal exception"); - Log.Warn(ex.ToString()); - } - return false; - } - - private void NetHooks_SendData(SendDataEventArgs e) - { - if (e.MsgID == PacketTypes.Disconnect) - { - Action senddisconnect = (sock, str) => - { - if (sock == null || !sock.active) - return; - sock.kill = true; - using (var ms = new MemoryStream()) - { - new DisconnectMsg {Reason = str}.PackFull(ms); - SendBytesBufferless(sock, ms.ToArray()); - } - }; - - if (e.remoteClient != -1) - { - senddisconnect(Netplay.serverSock[e.remoteClient], e.text); - } - else - { - for (int i = 0; i < Netplay.serverSock.Length; i++) - { - if (e.ignoreClient != -1 && e.ignoreClient == i) - continue; - - senddisconnect(Netplay.serverSock[i], e.text); - } - } - e.Handled = true; - } - } - - private void OnStartHardMode(HandledEventArgs e) - { - if (Config.DisableHardmode) - e.Handled = true; - } - - void OnSaveWorld(bool resettime, HandledEventArgs e) - { - if (!Utils.saving) - { - Utils.Broadcast("Saving world. Momentary lag might result from this.", Color.Red); - var SaveWorld = new Thread(Utils.SaveWorld); - SaveWorld.Start(); - } - e.Handled = true; - } - - /* - * Useful stuff: - * */ - - public static void StartInvasion() - { - Main.invasionType = 1; - if (Config.InfiniteInvasion) - { - Main.invasionSize = 20000000; - } - else - { - Main.invasionSize = 100 + (Config.InvasionMultiplier*Utils.ActivePlayers()); - } - - Main.invasionWarn = 0; - if (new Random().Next(2) == 0) - { - Main.invasionX = 0.0; - } - else - { - Main.invasionX = Main.maxTilesX; - } - } - - private static int KillCount; - - public static void IncrementKills() - { - KillCount++; - Random r = new Random(); - int random = r.Next(5); - if (KillCount%100 == 0) - { - switch (random) - { - case 0: - Utils.Broadcast(string.Format("You call that a lot? {0} goblins killed!", KillCount)); - break; - case 1: - Utils.Broadcast(string.Format("Fatality! {0} goblins killed!", KillCount)); - break; - case 2: - Utils.Broadcast(string.Format("Number of 'noobs' killed to date: {0}", KillCount)); - break; - case 3: - Utils.Broadcast(string.Format("Duke Nukem would be proud. {0} goblins killed.", KillCount)); - break; - case 4: - Utils.Broadcast(string.Format("You call that a lot? {0} goblins killed!", KillCount)); - break; - case 5: - Utils.Broadcast(string.Format("{0} copies of Call of Duty smashed.", KillCount)); - break; - } - } - } - - public static bool CheckProjectilePermission(TSPlayer player, int index, int type) - { - if (type == 43) - { - return true; - } - - if (type == 17 && !player.Group.HasPermission(Permissions.usebanneditem) && Itembans.ItemIsBanned("Dirt Rod", player)) - //Dirt Rod Projectile - { - return true; - } - - if ((type == 42 || type == 65 || type == 68) && !player.Group.HasPermission(Permissions.usebanneditem) && - Itembans.ItemIsBanned("Sandgun", player)) //Sandgun Projectiles - { - return true; - } - - Projectile proj = new Projectile(); - proj.SetDefaults(type); - - if (!player.Group.HasPermission(Permissions.usebanneditem) && Itembans.ItemIsBanned(proj.name, player)) - { - return true; - } - - if (Main.projHostile[type]) - { - //player.SendMessage( proj.name, Color.Yellow); - return true; - } - - return false; - } - - public static bool CheckRangePermission(TSPlayer player, int x, int y, int range = 32) - { - if (Config.RangeChecks && ((Math.Abs(player.TileX - x) > range) || (Math.Abs(player.TileY - y) > range))) - { - return true; - } - return false; - } - - public static bool CheckTilePermission( TSPlayer player, int tileX, int tileY, byte tileType, byte actionType ) - { - if (!player.Group.HasPermission(Permissions.canbuild)) - { - if (TShock.Config.AllowIce && actionType != 1) - { - foreach (Point p in player.IceTiles) - { - if (p.X == tileX && p.Y == tileY && (Main.tile[p.X, p.Y].type == 0 || Main.tile[p.X, p.Y].type == 127)) - { - player.IceTiles.Remove(p); - return false; - } - } - if (((DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond) - player.BPm) > 2000){ - player.SendMessage("You do not have permission to build!", Color.Red); - player.BPm=DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond; - -} - return true; - } - - if (TShock.Config.AllowIce && actionType == 1 && tileType == 127) - { - player.IceTiles.Add(new Point(tileX, tileY)); - return false; - } - - if (((DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond) - player.BPm) > 2000){ - player.SendMessage("You do not have permission to build!", Color.Red); - player.BPm=DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond; - -} - return true; - - } - if (!player.Group.HasPermission(Permissions.editspawn) && !Regions.CanBuild(tileX, tileY, player) && - Regions.InArea(tileX, tileY)) - { - if (((DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond) - player.RPm) > 2000){ - player.SendMessage("Region protected from changes.", Color.Red); - player.RPm=DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond; - -} - return true; - } - if (Config.DisableBuild) - { - if (!player.Group.HasPermission(Permissions.editspawn)) - { - if (((DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond) - player.WPm) > 2000){ - player.SendMessage("World protected from changes.", Color.Red); - player.WPm=DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond; - -} - return true; - } - } - if (Config.SpawnProtection) - { - if (!player.Group.HasPermission(Permissions.editspawn)) - { - var flag = CheckSpawn(tileX, tileY); - if (flag) - { - if (((DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond) - player.SPm) > 2000){ - player.SendMessage("Spawn protected from changes.", Color.Red); - player.SPm=DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond; - } - return true; - } - } - } - return false; - } - - public static bool CheckTilePermission(TSPlayer player, int tileX, int tileY) - { - if (!player.Group.HasPermission(Permissions.canbuild)) - { - - if (((DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond) - player.BPm) > 2000){ - player.SendMessage("You do not have permission to build!", Color.Red); - player.BPm=DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond; - } - return true; - } - - if (!player.Group.HasPermission(Permissions.editspawn) && !Regions.CanBuild(tileX, tileY, player) && - Regions.InArea(tileX, tileY)) - { - - - if (((DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond) - player.RPm) > 2000){ - player.SendMessage("Region protected from changes.", Color.Red); - player.RPm=DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond; - } - return true; - } - - if (Config.DisableBuild) - { - if (!player.Group.HasPermission(Permissions.editspawn)) - { - if (((DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond) - player.WPm) > 2000){ - player.SendMessage("World protected from changes.", Color.Red); - player.WPm=DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond; - } - return true; - } - } - if (Config.SpawnProtection) - { - if (!player.Group.HasPermission(Permissions.editspawn)) - { - var flag = CheckSpawn(tileX, tileY); - if (flag) - { - if (((DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond) - player.SPm) > 1000){ - player.SendMessage("Spawn protected from changes.", Color.Red); - player.SPm=DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond; - - } - - - return true; - } - } - } - return false; - } - public static bool CheckSpawn(int x, int y) - { - Vector2 tile = new Vector2(x, y); - Vector2 spawn = new Vector2(Main.spawnTileX, Main.spawnTileY); - return Distance(spawn, tile) <= Config.SpawnProtectionRadius; - } - - public static float Distance(Vector2 value1, Vector2 value2) - { - float num2 = value1.X - value2.X; - float num = value1.Y - value2.Y; - float num3 = (num2*num2) + (num*num); - return (float) Math.Sqrt(num3); - } - - public static bool HackedHealth(TSPlayer player) - { - return (player.TPlayer.statManaMax > 400) || - (player.TPlayer.statMana > 400) || - (player.TPlayer.statLifeMax > 400) || - (player.TPlayer.statLife > 400); - } - - public static bool HackedInventory(TSPlayer player) - { - bool check = false; - - Item[] inventory = player.TPlayer.inventory; - Item[] armor = player.TPlayer.armor; - for (int i = 0; i < NetItem.maxNetInventory; i++) - { - if (i < 49) - { - Item item = new Item(); - if (inventory[i] != null && inventory[i].netID != 0) - { - item.netDefaults(inventory[i].netID); - item.Prefix(inventory[i].prefix); - item.AffixName(); - if (inventory[i].stack > item.maxStack) - { - check = true; - player.SendMessage( - String.Format("Stack cheat detected. Remove item {0} ({1}) and then rejoin", item.name, inventory[i].stack), - Color.Cyan); - } - } - } - else - { - Item item = new Item(); - if (armor[i - 48] != null && armor[i - 48].netID != 0) - { - item.netDefaults(armor[i - 48].netID); - item.Prefix(armor[i - 48].prefix); - item.AffixName(); - if (armor[i - 48].stack > item.maxStack) - { - check = true; - player.SendMessage( - String.Format("Stack cheat detected. Remove armor {0} ({1}) and then rejoin", item.name, armor[i - 48].stack), - Color.Cyan); - } - } - } - } - - return check; - } - - public static bool CheckInventory(TSPlayer player) - { - PlayerData playerData = player.PlayerData; - bool check = true; - - if (player.TPlayer.statLifeMax > playerData.maxHealth) - { - player.SendMessage("Error: Your max health exceeded (" + playerData.maxHealth + ") which is stored on server", - Color.Cyan); - check = false; - } - - Item[] inventory = player.TPlayer.inventory; - Item[] armor = player.TPlayer.armor; - for (int i = 0; i < NetItem.maxNetInventory; i++) - { - if (i < 49) - { - Item item = new Item(); - Item serverItem = new Item(); - if (inventory[i] != null && inventory[i].netID != 0) - { - if (playerData.inventory[i].netID != inventory[i].netID) - { - item.netDefaults(inventory[i].netID); - item.Prefix(inventory[i].prefix); - item.AffixName(); - player.SendMessage(player.IgnoreActionsForInventory = "Your item (" + item.name + ") needs to be deleted.", - Color.Cyan); - check = false; - } - else if (playerData.inventory[i].prefix != inventory[i].prefix) - { - item.netDefaults(inventory[i].netID); - item.Prefix(inventory[i].prefix); - item.AffixName(); - player.SendMessage(player.IgnoreActionsForInventory = "Your item (" + item.name + ") needs to be deleted.", - Color.Cyan); - check = false; - } - else if (inventory[i].stack > playerData.inventory[i].stack) - { - item.netDefaults(inventory[i].netID); - item.Prefix(inventory[i].prefix); - item.AffixName(); - player.SendMessage( - player.IgnoreActionsForInventory = - "Your item (" + item.name + ") (" + inventory[i].stack + ") needs to have it's stack decreased to (" + - playerData.inventory[i].stack + ").", Color.Cyan); - check = false; - } - } - } - else - { - Item item = new Item(); - Item serverItem = new Item(); - if (armor[i - 48] != null && armor[i - 48].netID != 0) - { - if (playerData.inventory[i].netID != armor[i - 48].netID) - { - item.netDefaults(armor[i - 48].netID); - item.Prefix(armor[i - 48].prefix); - item.AffixName(); - player.SendMessage(player.IgnoreActionsForInventory = "Your armor (" + item.name + ") needs to be deleted.", - Color.Cyan); - check = false; - } - else if (playerData.inventory[i].prefix != armor[i - 48].prefix) - { - item.netDefaults(armor[i - 48].netID); - item.Prefix(armor[i - 48].prefix); - item.AffixName(); - player.SendMessage(player.IgnoreActionsForInventory = "Your armor (" + item.name + ") needs to be deleted.", - Color.Cyan); - check = false; - } - else if (armor[i - 48].stack > playerData.inventory[i].stack) - { - item.netDefaults(armor[i - 48].netID); - item.Prefix(armor[i - 48].prefix); - item.AffixName(); - player.SendMessage( - player.IgnoreActionsForInventory = - "Your armor (" + item.name + ") (" + inventory[i].stack + ") needs to have it's stack decreased to (" + - playerData.inventory[i].stack + ").", Color.Cyan); - check = false; - } - } - } - } - - return check; - } - - public static bool CheckIgnores(TSPlayer player) - { - bool check = false; - if (Config.PvPMode == "always" && !player.TPlayer.hostile) - check = true; - if (player.IgnoreActionsForInventory != "none") - check = true; - if (player.IgnoreActionsForCheating != "none") - check = true; - if (player.IgnoreActionsForDisabledArmor != "none") - check = true; - if (player.IgnoreActionsForClearingTrashCan) - check = true; - if (!player.IsLoggedIn && Config.RequireLogin) - check = true; - return check; - } - - public void OnConfigRead(ConfigFile file) - { - NPC.defaultMaxSpawns = file.DefaultMaximumSpawns; - NPC.defaultSpawnRate = file.DefaultSpawnRate; - - Main.autoSave = file.AutoSave; - if (Backups != null) - { - Backups.KeepFor = file.BackupKeepFor; - Backups.Interval = file.BackupInterval; - } - if (!OverridePort) - { - Netplay.serverPort = file.ServerPort; - } - - if (file.MaxSlots > 235) - file.MaxSlots = 235; - Main.maxNetPlayers = file.MaxSlots + 20; - Netplay.password = ""; - Netplay.spamCheck = false; - - RconHandler.Password = file.RconPassword; - RconHandler.ListenPort = file.RconPort; - - Utils.HashAlgo = file.HashAlgorithm; - } - } -} + } + } + } + + /* + * Hooks: + * + */ + + public static int AuthToken = -1; + + private void OnPostInit() + { + if (!File.Exists(Path.Combine(SavePath, "auth.lck")) && !File.Exists(Path.Combine(SavePath, "authcode.txt"))) + { + var r = new Random((int) DateTime.Now.ToBinary()); + AuthToken = r.Next(100000, 10000000); + Console.ForegroundColor = ConsoleColor.Yellow; + Console.WriteLine("TShock Notice: To become SuperAdmin, join the game and type /auth " + AuthToken); + Console.WriteLine("This token will display until disabled by verification. (/auth-verify)"); + Console.ForegroundColor = ConsoleColor.Gray; + FileTools.CreateFile(Path.Combine(SavePath, "authcode.txt")); + using (var tw = new StreamWriter(Path.Combine(SavePath, "authcode.txt"))) + { + tw.WriteLine(AuthToken); + } + } + else if (File.Exists(Path.Combine(SavePath, "authcode.txt"))) + { + using (var tr = new StreamReader(Path.Combine(SavePath, "authcode.txt"))) + { + AuthToken = Convert.ToInt32(tr.ReadLine()); + } + Console.ForegroundColor = ConsoleColor.Yellow; + Console.WriteLine( + "TShock Notice: authcode.txt is still present, and the AuthToken located in that file will be used."); + Console.WriteLine("To become superadmin, join the game and type /auth " + AuthToken); + Console.WriteLine("This token will display until disabled by verification. (/auth-verify)"); + Console.ForegroundColor = ConsoleColor.Gray; + } + else + { + AuthToken = 0; + } + Regions.ReloadAllRegions(); + + StatTracker.CheckIn(); + FixChestStacks(); + } + + private void FixChestStacks() + { + foreach (Chest chest in Main.chest) + { + if (chest != null) + { + foreach (Item item in chest.item) + { + if (item != null && item.stack > item.maxStack) + item.stack = item.maxStack; + } + } + } + } + + private DateTime LastCheck = DateTime.UtcNow; + private DateTime LastSave = DateTime.UtcNow; + + private void OnUpdate() + { + UpdateManager.UpdateProcedureCheck(); + StatTracker.CheckIn(); + if (Backups.IsBackupTime) + Backups.Backup(); + + //call these every second, not every update + if ((DateTime.UtcNow - LastCheck).TotalSeconds >= 1) + { + OnSecondUpdate(); + LastCheck = DateTime.UtcNow; + } + + if ((DateTime.UtcNow - LastSave).TotalMinutes >= Config.ServerSideInventorySave) + { + foreach (TSPlayer player in Players) + { + // prevent null point exceptions + if (player != null && player.IsLoggedIn && !player.IgnoreActionsForClearingTrashCan) + { + + InventoryDB.InsertPlayerData(player); + } + } + LastSave = DateTime.UtcNow; + } + } + + private void OnSecondUpdate() + { + if (Config.ForceTime != "normal") + { + switch (Config.ForceTime) + { + case "day": + TSPlayer.Server.SetTime(true, 27000.0); + break; + case "night": + TSPlayer.Server.SetTime(false, 16200.0); + break; + } + } + int count = 0; + foreach (TSPlayer player in Players) + { + if (player != null && player.Active) + { + count++; + if (player.TilesDestroyed != null) + { + if (player.TileKillThreshold >= Config.TileKillThreshold) + { + player.Disable("Reached TileKill threshold"); + TSPlayer.Server.RevertTiles(player.TilesDestroyed); + player.TilesDestroyed.Clear(); + } + } + if (player.TileKillThreshold > 0) + { + player.TileKillThreshold = 0; + //We don't want to revert the entire map in case of a disable. + player.TilesDestroyed.Clear(); + } + if (player.TilesCreated != null) + { + if (player.TilePlaceThreshold >= Config.TilePlaceThreshold) + { + player.Disable("Reached TilePlace threshold"); + TSPlayer.Server.RevertTiles(player.TilesCreated); + player.TilesCreated.Clear(); + } + } + if (player.TilePlaceThreshold > 0) + { + player.TilePlaceThreshold = 0; + } + if (player.TileLiquidThreshold >= Config.TileLiquidThreshold) + { + player.Disable("Reached TileLiquid threshold"); + } + if (player.TileLiquidThreshold > 0) + { + player.TileLiquidThreshold = 0; + } + if (player.ProjectileThreshold >= Config.ProjectileThreshold) + { + player.Disable("Reached Projectile threshold"); + } + if (player.ProjectileThreshold > 0) + { + player.ProjectileThreshold = 0; + } + if (player.Dead && (DateTime.Now - player.LastDeath).Seconds >= 3 && player.Difficulty != 2) + { + player.Spawn(); + } + string check = "none"; + foreach (Item item in player.TPlayer.inventory) + { + if (!player.Group.HasPermission(Permissions.ignorestackhackdetection) && item.stack > item.maxStack && + item.type != 0) + { + check = "Remove Item " + item.name + " (" + item.stack + ") exceeds max stack of " + item.maxStack; + } + } + player.IgnoreActionsForCheating = check; + check = "none"; + foreach (Item item in player.TPlayer.armor) + { + if (!player.Group.HasPermission(Permissions.usebanneditem) && Itembans.ItemIsBanned(item.name, player)) + { + player.SetBuff(30, 120); //Bleeding + player.SetBuff(36, 120); //Broken Armor + check = "Remove Armor/Accessory " + item.name; + } + } + player.IgnoreActionsForDisabledArmor = check; + if (CheckIgnores(player)) + { + player.SetBuff(33, 120); //Weak + player.SetBuff(32, 120); //Slow + player.SetBuff(23, 120); //Cursed + } + else if (!player.Group.HasPermission(Permissions.usebanneditem) && + Itembans.ItemIsBanned(player.TPlayer.inventory[player.TPlayer.selectedItem].name, player)) + { + player.SetBuff(23, 120); //Cursed + } + } + } + Console.Title = string.Format("TerrariaShock Version {0} ({1}) ({2}/{3})", Version, VersionCodename, count, + Config.MaxSlots); + } + + private void OnConnect(int ply, HandledEventArgs handler) + { + var player = new TSPlayer(ply); + if (Config.EnableDNSHostResolution) + { + player.Group = Users.GetGroupForIPExpensive(player.IP); + } + else + { + player.Group = Users.GetGroupForIP(player.IP); + } + + if (Utils.ActivePlayers() + 1 > Config.MaxSlots + 20) + { + Utils.ForceKick(player, Config.ServerFullNoReservedReason); + handler.Handled = true; + return; + } + + var ipban = Bans.GetBanByIp(player.IP); + Ban ban = null; + if (ipban != null && Config.EnableIPBans) + ban = ipban; + + if (ban != null) + { + Utils.ForceKick(player, string.Format("You are banned: {0}", ban.Reason)); + handler.Handled = true; + return; + } + + if (!FileTools.OnWhitelist(player.IP)) + { + Utils.ForceKick(player, "Not on whitelist."); + handler.Handled = true; + return; + } + + if (Geo != null) + { + var code = Geo.TryGetCountryCode(IPAddress.Parse(player.IP)); + player.Country = code == null ? "N/A" : GeoIPCountry.GetCountryNameByCode(code); + if (code == "A1") + { + if (Config.KickProxyUsers) + { + Utils.ForceKick(player, "Proxies are not allowed"); + handler.Handled = true; + return; + } + } + } + Players[ply] = player; + } + + private void OnJoin(int ply, HandledEventArgs handler) + { + var player = Players[ply]; + if (player == null) + { + handler.Handled = true; + return; + } + + var nameban = Bans.GetBanByName(player.Name); + Ban ban = null; + if (nameban != null && Config.EnableBanOnUsernames) + ban = nameban; + + if (ban != null) + { + Utils.ForceKick(player, string.Format("You are banned: {0}", ban.Reason)); + handler.Handled = true; + return; + } + } + + private void OnLeave(int ply) + { + + var tsplr = Players[ply]; + Players[ply] = null; + + if (tsplr != null && tsplr.ReceivedInfo) + { + if (!tsplr.SilentKickInProgress) + { + Utils.Broadcast(tsplr.Name + " left", Color.Yellow); + } + Log.Info(string.Format("{0} left.", tsplr.Name)); + + if (tsplr.IsLoggedIn && !tsplr.IgnoreActionsForClearingTrashCan) + { + tsplr.PlayerData.CopyInventory(tsplr); + InventoryDB.InsertPlayerData(tsplr); + } + + if ((Config.RememberLeavePos) &&(!tsplr.LoginHarassed)) + { + RememberedPos.InsertLeavePos(tsplr.Name, tsplr.IP, (int) (tsplr.X/16), (int) (tsplr.Y/16)); + } + } + } + + private void OnChat(messageBuffer msg, int ply, string text, HandledEventArgs e) + { + if (e.Handled) + return; + + var tsplr = Players[msg.whoAmI]; + if (tsplr == null) + { + e.Handled = true; + return; + } + + /*if (!Utils.ValidString(text)) + { + e.Handled = true; + return; + }*/ + + if (text.StartsWith("/")) + { + try + { + e.Handled = Commands.HandleCommand(tsplr, text); + } + catch (Exception ex) + { + Log.ConsoleError("Command exception"); + Log.Error(ex.ToString()); + } + } + else if (!tsplr.mute) + { + Utils.Broadcast( + String.Format(Config.ChatFormat, tsplr.Group.Name, tsplr.Group.Prefix, tsplr.Name, tsplr.Group.Suffix, text), + tsplr.Group.R, tsplr.Group.G, tsplr.Group.B); + e.Handled = true; + } + else if (tsplr.mute) + { + tsplr.SendMessage("You are muted!"); + e.Handled = true; + } + } + + /// + /// When a server command is run. + /// + /// + /// + private void ServerHooks_OnCommand(string text, HandledEventArgs e) + { + if (e.Handled) + return; + + // Damn you ThreadStatic and Redigit + if (Main.rand == null) + { + Main.rand = new Random(); + } + if (WorldGen.genRand == null) + { + WorldGen.genRand = new Random(); + } + + if (text.StartsWith("playing") || text.StartsWith("/playing")) + { + int count = 0; + foreach (TSPlayer player in Players) + { + if (player != null && player.Active) + { + count++; + TSPlayer.Server.SendMessage(string.Format("{0} ({1}) [{2}] <{3}>", player.Name, player.IP, + player.Group.Name, player.UserAccountName)); + } + } + TSPlayer.Server.SendMessage(string.Format("{0} players connected.", count)); + } + else if (text == "autosave") + { + Main.autoSave = Config.AutoSave = !Config.AutoSave; + Log.ConsoleInfo("AutoSave " + (Config.AutoSave ? "Enabled" : "Disabled")); + } + else if (text.StartsWith("/")) + { + Commands.HandleCommand(TSPlayer.Server, text); + } + else + { + Commands.HandleCommand(TSPlayer.Server, "/" + text); + } + e.Handled = true; + } + + private void OnGetData(GetDataEventArgs e) + { + if (e.Handled) + return; + + PacketTypes type = e.MsgID; + + Debug.WriteLine("Recv: {0:X}: {2} ({1:XX})", e.Msg.whoAmI, (byte) type, type); + + var player = Players[e.Msg.whoAmI]; + if (player == null) + { + e.Handled = true; + return; + } + + if (!player.ConnectionAlive) + { + e.Handled = true; + return; + } + + if (player.RequiresPassword && type != PacketTypes.PasswordSend) + { + e.Handled = true; + return; + } + + if ((player.State < 10 || player.Dead) && (int) type > 12 && (int) type != 16 && (int) type != 42 && (int) type != 50 && + (int) type != 38 && (int) type != 5 && (int) type != 21) + { + e.Handled = true; + return; + } + + using (var data = new MemoryStream(e.Msg.readBuffer, e.Index, e.Length)) + { + try + { + if (GetDataHandlers.HandlerGetData(type, player, data)) + e.Handled = true; + } + catch (Exception ex) + { + Log.Error(ex.ToString()); + } + } + } + + private void OnGreetPlayer(int who, HandledEventArgs e) + { + var player = Players[who]; + if (player == null) + { + e.Handled = true; + return; + } + player.LoginMS= DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond; + + Utils.ShowFileToUser(player, "motd.txt"); + + if (Config.PvPMode == "always" && !player.TPlayer.hostile) + { + player.SendMessage("PvP is forced! Enable PvP else you can't move or do anything!", Color.Red); + } + + if (!player.IsLoggedIn) + { + if (Config.ServerSideInventory) + { + player.SendMessage( + player.IgnoreActionsForInventory = "Server Side Inventory is enabled! Please /register or /login to play!", + Color.Red); + player.LoginHarassed = true; + } + else if (Config.RequireLogin) + { + player.SendMessage("Please /register or /login to play!", Color.Red); + player.LoginHarassed = true; + } + } + + if (player.Group.HasPermission(Permissions.causeevents) && Config.InfiniteInvasion) + { + StartInvasion(); + } + + player.LastNetPosition = new Vector2(Main.spawnTileX*16f, Main.spawnTileY*16f); + + if (Config.RememberLeavePos) + { + if (RememberedPos.GetLeavePos(player.Name, player.IP) != Vector2.Zero){ + var pos = RememberedPos.GetLeavePos(player.Name, player.IP); + + player.Teleport((int) pos.X, (int) pos.Y + 3); + }} + + e.Handled = true; + } + + private void NpcHooks_OnStrikeNpc(NpcStrikeEventArgs e) + { + if (Config.InfiniteInvasion) + { + IncrementKills(); + if (Main.invasionSize < 10) + { + Main.invasionSize = 20000000; + } + } + } + + private void OnProjectileSetDefaults(SetDefaultsEventArgs e) + { + if (e.Info == 43) + if (Config.DisableTombstones) + e.Object.SetDefaults(0); + if (e.Info == 75) + if (Config.DisableClownBombs) + e.Object.SetDefaults(0); + if (e.Info == 109) + if (Config.DisableSnowBalls) + e.Object.SetDefaults(0); + } + + private void OnNpcSetDefaults(SetDefaultsEventArgs e) + { + if (Itembans.ItemIsBanned(e.Object.name, null)) + { + e.Object.SetDefaults(0); + } + } + + /// + /// Send bytes to client using packetbuffering if available + /// + /// socket to send to + /// bytes to send + /// False on exception + public static bool SendBytes(ServerSock client, byte[] bytes) + { + if (PacketBuffer != null) + { + PacketBuffer.BufferBytes(client, bytes); + return true; + } + + return SendBytesBufferless(client, bytes); + } + + /// + /// Send bytes to a client ignoring the packet buffer + /// + /// socket to send to + /// bytes to send + /// False on exception + public static bool SendBytesBufferless(ServerSock client, byte[] bytes) + { + try + { + if (client.tcpClient.Connected) + client.networkStream.Write(bytes, 0, bytes.Length); + return true; + } + catch (Exception ex) + { + Log.Warn("This is a normal exception"); + Log.Warn(ex.ToString()); + } + return false; + } + + private void NetHooks_SendData(SendDataEventArgs e) + { + if (e.MsgID == PacketTypes.Disconnect) + { + Action senddisconnect = (sock, str) => + { + if (sock == null || !sock.active) + return; + sock.kill = true; + using (var ms = new MemoryStream()) + { + new DisconnectMsg {Reason = str}.PackFull(ms); + SendBytesBufferless(sock, ms.ToArray()); + } + }; + + if (e.remoteClient != -1) + { + senddisconnect(Netplay.serverSock[e.remoteClient], e.text); + } + else + { + for (int i = 0; i < Netplay.serverSock.Length; i++) + { + if (e.ignoreClient != -1 && e.ignoreClient == i) + continue; + + senddisconnect(Netplay.serverSock[i], e.text); + } + } + e.Handled = true; + } + } + + private void OnStartHardMode(HandledEventArgs e) + { + if (Config.DisableHardmode) + e.Handled = true; + } + + void OnSaveWorld(bool resettime, HandledEventArgs e) + { + if (!Utils.saving) + { + Utils.Broadcast("Saving world. Momentary lag might result from this.", Color.Red); + var SaveWorld = new Thread(Utils.SaveWorld); + SaveWorld.Start(); + } + e.Handled = true; + } + + /* + * Useful stuff: + * */ + + public static void StartInvasion() + { + Main.invasionType = 1; + if (Config.InfiniteInvasion) + { + Main.invasionSize = 20000000; + } + else + { + Main.invasionSize = 100 + (Config.InvasionMultiplier*Utils.ActivePlayers()); + } + + Main.invasionWarn = 0; + if (new Random().Next(2) == 0) + { + Main.invasionX = 0.0; + } + else + { + Main.invasionX = Main.maxTilesX; + } + } + + private static int KillCount; + + public static void IncrementKills() + { + KillCount++; + Random r = new Random(); + int random = r.Next(5); + if (KillCount%100 == 0) + { + switch (random) + { + case 0: + Utils.Broadcast(string.Format("You call that a lot? {0} goblins killed!", KillCount)); + break; + case 1: + Utils.Broadcast(string.Format("Fatality! {0} goblins killed!", KillCount)); + break; + case 2: + Utils.Broadcast(string.Format("Number of 'noobs' killed to date: {0}", KillCount)); + break; + case 3: + Utils.Broadcast(string.Format("Duke Nukem would be proud. {0} goblins killed.", KillCount)); + break; + case 4: + Utils.Broadcast(string.Format("You call that a lot? {0} goblins killed!", KillCount)); + break; + case 5: + Utils.Broadcast(string.Format("{0} copies of Call of Duty smashed.", KillCount)); + break; + } + } + } + + public static bool CheckProjectilePermission(TSPlayer player, int index, int type) + { + if (type == 43) + { + return true; + } + + if (type == 17 && !player.Group.HasPermission(Permissions.usebanneditem) && Itembans.ItemIsBanned("Dirt Rod", player)) + //Dirt Rod Projectile + { + return true; + } + + if ((type == 42 || type == 65 || type == 68) && !player.Group.HasPermission(Permissions.usebanneditem) && + Itembans.ItemIsBanned("Sandgun", player)) //Sandgun Projectiles + { + return true; + } + + Projectile proj = new Projectile(); + proj.SetDefaults(type); + + if (!player.Group.HasPermission(Permissions.usebanneditem) && Itembans.ItemIsBanned(proj.name, player)) + { + return true; + } + + if (Main.projHostile[type]) + { + //player.SendMessage( proj.name, Color.Yellow); + return true; + } + + return false; + } + + public static bool CheckRangePermission(TSPlayer player, int x, int y, int range = 32) + { + if (Config.RangeChecks && ((Math.Abs(player.TileX - x) > range) || (Math.Abs(player.TileY - y) > range))) + { + return true; + } + return false; + } + + public static bool CheckTilePermission( TSPlayer player, int tileX, int tileY, byte tileType, byte actionType ) + { + if (!player.Group.HasPermission(Permissions.canbuild)) + { + if (TShock.Config.AllowIce && actionType != 1) + { + foreach (Point p in player.IceTiles) + { + if (p.X == tileX && p.Y == tileY && (Main.tile[p.X, p.Y].type == 0 || Main.tile[p.X, p.Y].type == 127)) + { + player.IceTiles.Remove(p); + return false; + } + } + if (((DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond) - player.BPm) > 2000){ + player.SendMessage("You do not have permission to build!", Color.Red); + player.BPm=DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond; + +} + return true; + } + + if (TShock.Config.AllowIce && actionType == 1 && tileType == 127) + { + player.IceTiles.Add(new Point(tileX, tileY)); + return false; + } + + if (((DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond) - player.BPm) > 2000){ + player.SendMessage("You do not have permission to build!", Color.Red); + player.BPm=DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond; + +} + return true; + + } + if (!player.Group.HasPermission(Permissions.editspawn) && !Regions.CanBuild(tileX, tileY, player) && + Regions.InArea(tileX, tileY)) + { + if (((DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond) - player.RPm) > 2000){ + player.SendMessage("Region protected from changes.", Color.Red); + player.RPm=DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond; + +} + return true; + } + if (Config.DisableBuild) + { + if (!player.Group.HasPermission(Permissions.editspawn)) + { + if (((DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond) - player.WPm) > 2000){ + player.SendMessage("World protected from changes.", Color.Red); + player.WPm=DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond; + +} + return true; + } + } + if (Config.SpawnProtection) + { + if (!player.Group.HasPermission(Permissions.editspawn)) + { + var flag = CheckSpawn(tileX, tileY); + if (flag) + { + if (((DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond) - player.SPm) > 2000){ + player.SendMessage("Spawn protected from changes.", Color.Red); + player.SPm=DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond; + } + return true; + } + } + } + return false; + } + + public static bool CheckTilePermission(TSPlayer player, int tileX, int tileY) + { + if (!player.Group.HasPermission(Permissions.canbuild)) + { + + if (((DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond) - player.BPm) > 2000){ + player.SendMessage("You do not have permission to build!", Color.Red); + player.BPm=DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond; + } + return true; + } + + if (!player.Group.HasPermission(Permissions.editspawn) && !Regions.CanBuild(tileX, tileY, player) && + Regions.InArea(tileX, tileY)) + { + + + if (((DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond) - player.RPm) > 2000){ + player.SendMessage("Region protected from changes.", Color.Red); + player.RPm=DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond; + } + return true; + } + + if (Config.DisableBuild) + { + if (!player.Group.HasPermission(Permissions.editspawn)) + { + if (((DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond) - player.WPm) > 2000){ + player.SendMessage("World protected from changes.", Color.Red); + player.WPm=DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond; + } + return true; + } + } + if (Config.SpawnProtection) + { + if (!player.Group.HasPermission(Permissions.editspawn)) + { + var flag = CheckSpawn(tileX, tileY); + if (flag) + { + if (((DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond) - player.SPm) > 1000){ + player.SendMessage("Spawn protected from changes.", Color.Red); + player.SPm=DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond; + + } + + + return true; + } + } + } + return false; + } + public static bool CheckSpawn(int x, int y) + { + Vector2 tile = new Vector2(x, y); + Vector2 spawn = new Vector2(Main.spawnTileX, Main.spawnTileY); + return Distance(spawn, tile) <= Config.SpawnProtectionRadius; + } + + public static float Distance(Vector2 value1, Vector2 value2) + { + float num2 = value1.X - value2.X; + float num = value1.Y - value2.Y; + float num3 = (num2*num2) + (num*num); + return (float) Math.Sqrt(num3); + } + + public static bool HackedHealth(TSPlayer player) + { + return (player.TPlayer.statManaMax > 400) || + (player.TPlayer.statMana > 400) || + (player.TPlayer.statLifeMax > 400) || + (player.TPlayer.statLife > 400); + } + + public static bool HackedInventory(TSPlayer player) + { + bool check = false; + + Item[] inventory = player.TPlayer.inventory; + Item[] armor = player.TPlayer.armor; + for (int i = 0; i < NetItem.maxNetInventory; i++) + { + if (i < 49) + { + Item item = new Item(); + if (inventory[i] != null && inventory[i].netID != 0) + { + item.netDefaults(inventory[i].netID); + item.Prefix(inventory[i].prefix); + item.AffixName(); + if (inventory[i].stack > item.maxStack) + { + check = true; + player.SendMessage( + String.Format("Stack cheat detected. Remove item {0} ({1}) and then rejoin", item.name, inventory[i].stack), + Color.Cyan); + } + } + } + else + { + Item item = new Item(); + if (armor[i - 48] != null && armor[i - 48].netID != 0) + { + item.netDefaults(armor[i - 48].netID); + item.Prefix(armor[i - 48].prefix); + item.AffixName(); + if (armor[i - 48].stack > item.maxStack) + { + check = true; + player.SendMessage( + String.Format("Stack cheat detected. Remove armor {0} ({1}) and then rejoin", item.name, armor[i - 48].stack), + Color.Cyan); + } + } + } + } + + return check; + } + + public static bool CheckInventory(TSPlayer player) + { + PlayerData playerData = player.PlayerData; + bool check = true; + + if (player.TPlayer.statLifeMax > playerData.maxHealth) + { + player.SendMessage("Error: Your max health exceeded (" + playerData.maxHealth + ") which is stored on server", + Color.Cyan); + check = false; + } + + Item[] inventory = player.TPlayer.inventory; + Item[] armor = player.TPlayer.armor; + for (int i = 0; i < NetItem.maxNetInventory; i++) + { + if (i < 49) + { + Item item = new Item(); + Item serverItem = new Item(); + if (inventory[i] != null && inventory[i].netID != 0) + { + if (playerData.inventory[i].netID != inventory[i].netID) + { + item.netDefaults(inventory[i].netID); + item.Prefix(inventory[i].prefix); + item.AffixName(); + player.SendMessage(player.IgnoreActionsForInventory = "Your item (" + item.name + ") needs to be deleted.", + Color.Cyan); + check = false; + } + else if (playerData.inventory[i].prefix != inventory[i].prefix) + { + item.netDefaults(inventory[i].netID); + item.Prefix(inventory[i].prefix); + item.AffixName(); + player.SendMessage(player.IgnoreActionsForInventory = "Your item (" + item.name + ") needs to be deleted.", + Color.Cyan); + check = false; + } + else if (inventory[i].stack > playerData.inventory[i].stack) + { + item.netDefaults(inventory[i].netID); + item.Prefix(inventory[i].prefix); + item.AffixName(); + player.SendMessage( + player.IgnoreActionsForInventory = + "Your item (" + item.name + ") (" + inventory[i].stack + ") needs to have it's stack decreased to (" + + playerData.inventory[i].stack + ").", Color.Cyan); + check = false; + } + } + } + else + { + Item item = new Item(); + Item serverItem = new Item(); + if (armor[i - 48] != null && armor[i - 48].netID != 0) + { + if (playerData.inventory[i].netID != armor[i - 48].netID) + { + item.netDefaults(armor[i - 48].netID); + item.Prefix(armor[i - 48].prefix); + item.AffixName(); + player.SendMessage(player.IgnoreActionsForInventory = "Your armor (" + item.name + ") needs to be deleted.", + Color.Cyan); + check = false; + } + else if (playerData.inventory[i].prefix != armor[i - 48].prefix) + { + item.netDefaults(armor[i - 48].netID); + item.Prefix(armor[i - 48].prefix); + item.AffixName(); + player.SendMessage(player.IgnoreActionsForInventory = "Your armor (" + item.name + ") needs to be deleted.", + Color.Cyan); + check = false; + } + else if (armor[i - 48].stack > playerData.inventory[i].stack) + { + item.netDefaults(armor[i - 48].netID); + item.Prefix(armor[i - 48].prefix); + item.AffixName(); + player.SendMessage( + player.IgnoreActionsForInventory = + "Your armor (" + item.name + ") (" + inventory[i].stack + ") needs to have it's stack decreased to (" + + playerData.inventory[i].stack + ").", Color.Cyan); + check = false; + } + } + } + } + + return check; + } + + public static bool CheckIgnores(TSPlayer player) + { + bool check = false; + if (Config.PvPMode == "always" && !player.TPlayer.hostile) + check = true; + if (player.IgnoreActionsForInventory != "none") + check = true; + if (player.IgnoreActionsForCheating != "none") + check = true; + if (player.IgnoreActionsForDisabledArmor != "none") + check = true; + if (player.IgnoreActionsForClearingTrashCan) + check = true; + if (!player.IsLoggedIn && Config.RequireLogin) + check = true; + return check; + } + + public void OnConfigRead(ConfigFile file) + { + NPC.defaultMaxSpawns = file.DefaultMaximumSpawns; + NPC.defaultSpawnRate = file.DefaultSpawnRate; + + Main.autoSave = file.AutoSave; + if (Backups != null) + { + Backups.KeepFor = file.BackupKeepFor; + Backups.Interval = file.BackupInterval; + } + if (!OverridePort) + { + Netplay.serverPort = file.ServerPort; + } + + if (file.MaxSlots > 235) + file.MaxSlots = 235; + Main.maxNetPlayers = file.MaxSlots + 20; + Netplay.password = ""; + Netplay.spamCheck = false; + + RconHandler.Password = file.RconPassword; + RconHandler.ListenPort = file.RconPort; + + Utils.HashAlgo = file.HashAlgorithm; + } + } +} From 2f3bfca0829e9639af854d6b1012c829c5f97b5d Mon Sep 17 00:00:00 2001 From: stevenh Date: Thu, 16 Feb 2012 10:58:53 +0000 Subject: [PATCH 23/73] Fixed how ban logic works so it matches the description of the variables EnableBanOnUsernames & EnableIPBans Now it doesn't prevent bans being created or found but it only actions kicks on join based on the relavent config options. Changed /unban to only work on names and /unbanip to only work on ip's to avoid user confusion Changed error message returned when no bans are found when actioning /unban & /unbanip to be more appropriate Fixed formatting of -maxplayers / -players block --- TShockAPI/Commands.cs | 21 +++++---------------- TShockAPI/TShock.cs | 24 ++++++++++++++++-------- 2 files changed, 21 insertions(+), 24 deletions(-) diff --git a/TShockAPI/Commands.cs b/TShockAPI/Commands.cs index b98da283..44539bfe 100755 --- a/TShockAPI/Commands.cs +++ b/TShockAPI/Commands.cs @@ -870,25 +870,14 @@ namespace TShockAPI var ban = TShock.Bans.GetBanByName(plStr); if (ban != null) { - if (TShock.Bans.RemoveBan(ban.IP)) - args.Player.SendMessage(string.Format("Unbanned {0} ({1})!", ban.Name, ban.IP), Color.Red); - else - args.Player.SendMessage(string.Format("Failed to unban {0} ({1})!", ban.Name, ban.IP), Color.Red); - } - else if (!TShock.Config.EnableBanOnUsernames) - { - ban = TShock.Bans.GetBanByIp(plStr); - - if (ban == null) - args.Player.SendMessage(string.Format("Failed to unban {0}, not found.", args.Parameters[0]), Color.Red); - else if (TShock.Bans.RemoveBan(ban.IP)) + if (TShock.Bans.RemoveBan(ban.IP, true)) args.Player.SendMessage(string.Format("Unbanned {0} ({1})!", ban.Name, ban.IP), Color.Red); else args.Player.SendMessage(string.Format("Failed to unban {0} ({1})!", ban.Name, ban.IP), Color.Red); } else { - args.Player.SendMessage("Invalid player!", Color.Red); + args.Player.SendMessage(string.Format("No bans for player {0} exist", plStr), Color.Red); } } @@ -947,8 +936,8 @@ namespace TShockAPI return; } - string plStr = args.Parameters[0]; - var ban = TShock.Bans.GetBanByIp(plStr); + var ip = args.Parameters[0]; + var ban = TShock.Bans.GetBanByIp(ip); if (ban != null) { if (TShock.Bans.RemoveBan(ban.IP)) @@ -958,7 +947,7 @@ namespace TShockAPI } else { - args.Player.SendMessage("Invalid player!", Color.Red); + args.Player.SendMessage(string.Format("No bans for ip {0} exist", ip), Color.Red); } } diff --git a/TShockAPI/TShock.cs b/TShockAPI/TShock.cs index 63f86190..c46c3ab5 100755 --- a/TShockAPI/TShock.cs +++ b/TShockAPI/TShock.cs @@ -388,11 +388,11 @@ namespace TShockAPI Console.WriteLine("Startup parameter overrode REST port."); } - if ((parms[i].ToLower() == "-maxplayers")||(parms[i].ToLower() == "-players")) - { - Config.MaxSlots = Convert.ToInt32(parms[++i]); - Console.WriteLine("Startup parameter overrode maximum player slot configuration value."); - } + if ((parms[i].ToLower() == "-maxplayers")||(parms[i].ToLower() == "-players")) + { + Config.MaxSlots = Convert.ToInt32(parms[++i]); + Console.WriteLine("Startup parameter overrode maximum player slot configuration value."); + } } } @@ -659,10 +659,18 @@ namespace TShockAPI return; } - var nameban = Bans.GetBanByName(player.Name); Ban ban = null; - if (nameban != null && Config.EnableBanOnUsernames) - ban = nameban; + if (Config.EnableBanOnUsernames) + { + var newban = Bans.GetBanByName(player.Name); + if (null != newban) + ban = newban; + } + + if (Config.EnableIPBans && null == ban) + { + ban = Bans.GetBanByIp(player.IP); + } if (ban != null) { From 2f7cb9f44ec9955993a0e3cc2e56f13049917a51 Mon Sep 17 00:00:00 2001 From: stevenh Date: Thu, 16 Feb 2012 11:11:30 +0000 Subject: [PATCH 24/73] Added exception handling option to AddBan & Remove Ban Fixed formatting of EnsureExists(table) block --- TShockAPI/DB/BanManager.cs | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/TShockAPI/DB/BanManager.cs b/TShockAPI/DB/BanManager.cs index 65ab171a..bc446228 100644 --- a/TShockAPI/DB/BanManager.cs +++ b/TShockAPI/DB/BanManager.cs @@ -40,15 +40,15 @@ namespace TShockAPI.DB db.GetSqlType() == SqlType.Sqlite ? (IQueryBuilder) new SqliteQueryCreator() : new MysqlQueryCreator()); - try{ - creator.EnsureExists(table); - } - catch (DllNotFoundException ex) -{ -System.Console.WriteLine("Possible problem with your database - is Sqlite3.dll present?"); -throw new Exception("Could not find a database library (probably Sqlite3.dll)"); -} - + try + { + creator.EnsureExists(table); + } + catch (DllNotFoundException) + { + System.Console.WriteLine("Possible problem with your database - is Sqlite3.dll present?"); + throw new Exception("Could not find a database library (probably Sqlite3.dll)"); + } } public Ban GetBanByIp(string ip) @@ -110,7 +110,7 @@ throw new Exception("Could not find a database library (probably Sqlite3.dll)"); return null; } - public bool AddBan(string ip, string name = "", string reason = "") + public bool AddBan(string ip, string name = "", string reason = "", bool exceptions = false) { try { @@ -118,12 +118,15 @@ throw new Exception("Could not find a database library (probably Sqlite3.dll)"); } catch (Exception ex) { + if (exceptions) + throw ex; Log.Error(ex.ToString()); } return false; } + - public bool RemoveBan(string match, bool byName = false, bool casesensitive = true) + public bool RemoveBan(string match, bool byName = false, bool casesensitive = true, bool exceptions = false) { try { @@ -135,6 +138,8 @@ throw new Exception("Could not find a database library (probably Sqlite3.dll)"); } catch (Exception ex) { + if (exceptions) + throw ex; Log.Error(ex.ToString()); } return false; From 0108795f2739cb92bdd68c1ca8c1988a735447f3 Mon Sep 17 00:00:00 2001 From: stevenh Date: Thu, 16 Feb 2012 11:14:52 +0000 Subject: [PATCH 25/73] Fixed broken Content-Type header, was adding to text/html instead of replacing it Added Server header to RestAPI responses --- TShockAPI/Rest/Rest.cs | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/TShockAPI/Rest/Rest.cs b/TShockAPI/Rest/Rest.cs index 17794924..0875b3b4 100644 --- a/TShockAPI/Rest/Rest.cs +++ b/TShockAPI/Rest/Rest.cs @@ -21,6 +21,7 @@ using System.ComponentModel; using System.Net; using System.Text; using System.Text.RegularExpressions; +using System.Reflection; using HttpServer; using HttpServer.Headers; using Newtonsoft.Json; @@ -41,6 +42,7 @@ namespace Rests { private readonly List commands = new List(); private HttpListener listener; + private StringHeader serverHeader; public IPAddress Ip { get; set; } public int Port { get; set; } @@ -48,6 +50,9 @@ namespace Rests { Ip = ip; Port = port; + string appName = this.GetType().Assembly.GetName().Version.ToString(); + AssemblyName ass = this.GetType().Assembly.GetName(); + serverHeader = new StringHeader("Server", String.Format("{0}/{1}", ass.Name, ass.Version)); } public virtual void Start() @@ -117,14 +122,14 @@ namespace Rests throw new NullReferenceException("obj"); if (OnRestRequestCall(e)) - return; + return; var str = JsonConvert.SerializeObject(obj, Formatting.Indented); e.Response.Connection.Type = ConnectionType.Close; - e.Response.Add(new ContentTypeHeader("application/json")); + e.Response.ContentType = new ContentTypeHeader("application/json"); + e.Response.Add(serverHeader); e.Response.Body.Write(Encoding.ASCII.GetBytes(str), 0, str.Length); e.Response.Status = HttpStatusCode.OK; - return; } protected virtual object ProcessRequest(object sender, RequestEventArgs e) From 098363a9cc2a3bb5d13fffcdc70c4b4ce5768e2f Mon Sep 17 00:00:00 2001 From: stevenh Date: Thu, 16 Feb 2012 11:23:39 +0000 Subject: [PATCH 26/73] Fixed internal object and DB inconsitencies for modified default groups Fixed console errors for failed parent dependencies of default groups that already exist caused by fb11729547 consistency fixes Made GroupManager.groups readonly to discourage overwriting it. Could still do with better encapsulation to prevent consistency problems if modified externally. Added UpdateGroup method to GroupManager Refactored Group handling of permissions and chatcolor to prevent inconsistent data Notably:- * AddPermission now does the right thing when passed the string "!permission" * Converted ChatColor from method to getter / setter Added RemovePermission to Group Refactored GroupManager Permissions handling to ensure consistent data between DB and internal objects Removed redundent AddGroup method in preference to a default value on the main method Correct some tabs vs spaces Added ParentName helper to Group Fixed inverted parameters to error "Invalid parent {0} for group {1}" --- TShockAPI/DB/GroupManager.cs | 177 ++++++++++++++++++----------------- TShockAPI/Group.cs | 83 +++++++++++++--- TShockAPI/TShock.cs | 1 - 3 files changed, 162 insertions(+), 99 deletions(-) diff --git a/TShockAPI/DB/GroupManager.cs b/TShockAPI/DB/GroupManager.cs index 27fee59a..125a7bad 100644 --- a/TShockAPI/DB/GroupManager.cs +++ b/TShockAPI/DB/GroupManager.cs @@ -29,7 +29,7 @@ namespace TShockAPI.DB { private IDbConnection database; - public List groups = new List(); + public readonly List groups = new List(); public GroupManager(IDbConnection db) { @@ -49,14 +49,23 @@ namespace TShockAPI.DB : new MysqlQueryCreator()); creator.EnsureExists(table); - //Add default groups - AddGroup("guest", "canbuild,canregister,canlogin,canpartychat,cantalkinthird"); - AddGroup("default", "guest", "warp,canchangepassword"); - AddGroup("newadmin", "default", "kick,editspawn,reservedslot"); - AddGroup("admin", "newadmin", + // Load Permissions from the DB + LoadPermisions(); + + // Add default groups if they don't exist + AddDefaultGroup("guest", "", "canbuild,canregister,canlogin,canpartychat,cantalkinthird"); + AddDefaultGroup("default", "guest", "warp,canchangepassword"); + AddDefaultGroup("newadmin", "default", "kick,editspawn,reservedslot"); + AddDefaultGroup("admin", "newadmin", "ban,unban,whitelist,causeevents,spawnboss,spawnmob,managewarp,time,tp,pvpfun,kill,logs,immunetokick,tphere"); - AddGroup("trustedadmin", "admin", "maintenance,cfg,butcher,item,heal,immunetoban,usebanneditem,manageusers"); - AddGroup("vip", "default", "reservedslot"); + AddDefaultGroup("trustedadmin", "admin", "maintenance,cfg,butcher,item,heal,immunetoban,usebanneditem,manageusers"); + AddDefaultGroup("vip", "default", "reservedslot"); + } + + private void AddDefaultGroup(string name, string parent, string permissions) + { + if (!GroupExists(name)) + AddGroup(name, parent, permissions); } @@ -92,9 +101,8 @@ namespace TShockAPI.DB /// permissions /// chatcolor /// exceptions true indicates use exceptions for errors false otherwise - public String AddGroup(String name, string parentname, String permissions, String chatcolor, bool exceptions = false) + public String AddGroup(String name, string parentname, String permissions, String chatcolor = "255,255,255", bool exceptions = false) { - String message = ""; if (GroupExists(name)) { if (exceptions) @@ -103,13 +111,13 @@ namespace TShockAPI.DB } var group = new Group(name, null, chatcolor); - group.permissions.Add(permissions); + group.Permissions = permissions; if (!string.IsNullOrWhiteSpace(parentname)) { var parent = groups.FirstOrDefault(gp => gp.Name == parentname); if (parent == null) { - var error = "Invalid parent {0} for group {1}".SFormat(group.Name, parentname); + var error = "Invalid parent {0} for group {1}".SFormat(parentname, group.Name); if (exceptions) throw new GroupManagerException(error); Log.ConsoleError(error); @@ -123,13 +131,13 @@ namespace TShockAPI.DB : "INSERT IGNORE INTO GroupList SET GroupName=@0, Parent=@1, Commands=@2, ChatColor=@3"; if (database.Query(query, name, parentname, permissions, chatcolor) == 1) { - message = "Group " + name + " has been created successfully."; groups.Add(group); + return "Group " + name + " has been created successfully."; } else if (exceptions) throw new GroupManagerException("Failed to add group '" + name + "'"); - return message; + return ""; } public String AddGroup(String name, String permissions) @@ -137,14 +145,38 @@ namespace TShockAPI.DB return AddGroup(name, "", permissions, "255,255,255"); } - public String AddGroup(String name, string parent, String permissions) + /// + /// Updates a group including permissions + /// + /// name of the group to update + /// parent of group + /// permissions + /// chatcolor + public void UpdateGroup(string name, string parentname, string permissions, string chatcolor) { - return AddGroup(name, parent, permissions, "255,255,255"); + if (!GroupExists(name)) + throw new GroupNotExistException(name); + + Group parent = null; + if (!string.IsNullOrWhiteSpace(parentname)) + { + parent = groups.FirstOrDefault(gp => gp.Name == parentname); + if (null == parent) + throw new GroupManagerException("Invalid parent {0} for group {1}".SFormat(parentname, name)); + } + + // NOTE: we use newgroup.XYZ to ensure any validation is also persisted to the DB + var newgroup = new Group(name, parent, chatcolor, permissions); + string query = "UPDATE GroupList SET Parent=@0, Commands=@1, ChatColor=@2 WHERE GroupName=@3"; + if (database.Query(query, parentname, newgroup.Permissions, newgroup.ChatColor, name) != 1) + throw new GroupManagerException("Failed to update group '" + name + "'"); + + groups.Remove(TShock.Utils.GetGroup(name)); + groups.Add(newgroup); } public String DeleteGroup(String name, bool exceptions = false) { - String message = ""; if (!GroupExists(name)) { if (exceptions) @@ -154,60 +186,60 @@ namespace TShockAPI.DB if (database.Query("DELETE FROM GroupList WHERE GroupName=@0", name) == 1) { - message = "Group " + name + " has been deleted successfully."; groups.Remove(TShock.Utils.GetGroup(name)); + return "Group " + name + " has been deleted successfully."; } else if (exceptions) throw new GroupManagerException("Failed to delete group '" + name + "'"); - return message; + return ""; } public String AddPermissions(String name, List permissions) { - String message = ""; if (!GroupExists(name)) return "Error: Group doesn't exists."; var group = TShock.Utils.GetGroup(name); - //Add existing permissions (without duplicating) - permissions.AddRange(group.permissions.Where(s => !permissions.Contains(s))); + var oldperms = group.Permissions; // Store old permissions in case of error + permissions.ForEach(p => group.AddPermission(p)); + + if (database.Query("UPDATE GroupList SET Commands=@0 WHERE GroupName=@1", group.Permissions, name) == 1) + return "Group " + name + " has been modified successfully."; - if (database.Query("UPDATE GroupList SET Commands=@0 WHERE GroupName=@1", String.Join(",", permissions), name) != 0) - { - message = "Group " + name + " has been modified successfully."; - group.SetPermission(permissions); - } - return message; + // Restore old permissions so DB and internal object are in a consistent state + group.Permissions = oldperms; + return ""; } public String DeletePermissions(String name, List permissions) { - String message = ""; if (!GroupExists(name)) return "Error: Group doesn't exists."; var group = TShock.Utils.GetGroup(name); + var oldperms = group.Permissions; // Store old permissions in case of error + permissions.ForEach(p => group.RemovePermission(p)); - //Only get permissions that exist in the group. - var newperms = group.permissions.Except(permissions); - - if (database.Query("UPDATE GroupList SET Commands=@0 WHERE GroupName=@1", String.Join(",", newperms), name) != 0) - { - message = "Group " + name + " has been modified successfully."; - group.SetPermission(newperms.ToList()); - } - return message; + if (database.Query("UPDATE GroupList SET Commands=@0 WHERE GroupName=@1", group.Permissions, name) == 1) + return "Group " + name + " has been modified successfully."; + + // Restore old permissions so DB and internal object are in a consistent state + group.Permissions = oldperms; + return ""; } public void LoadPermisions() { - //Create a temporary list so if there is an error it doesn't override the currently loaded groups with broken groups. + // Create a temporary list so if there is an error it doesn't override the currently loaded groups with broken groups. var tempgroups = new List(); tempgroups.Add(new SuperAdminGroup()); if (groups == null || groups.Count < 2) - groups = tempgroups; + { + groups.Clear(); + groups.AddRange(tempgroups); + } try { @@ -216,34 +248,9 @@ namespace TShockAPI.DB { while (reader.Read()) { - string groupname = reader.Get("GroupName"); - var group = new Group(groupname); - + var group = new Group(reader.Get("GroupName"), null, reader.Get("ChatColor"), reader.Get("Commands")); group.Prefix = reader.Get("Prefix"); group.Suffix = reader.Get("Suffix"); - - //Inherit Given commands - String[] commands = reader.Get("Commands").Split(','); - foreach (var t in commands) - { - var str = t.Trim(); - if (str.StartsWith("!")) - { - group.NegatePermission(str.Substring(1)); - } - else - { - group.AddPermission(str); - } - } - String[] chatcolour = (reader.Get("ChatColor") ?? "").Split(','); - if (chatcolour.Length == 3) - { - byte.TryParse(chatcolour[0], out group.R); - byte.TryParse(chatcolour[1], out group.G); - byte.TryParse(chatcolour[2], out group.B); - } - groupsparents.Add(Tuple.Create(group, reader.Get("Parent"))); } } @@ -257,7 +264,7 @@ namespace TShockAPI.DB var parent = groupsparents.FirstOrDefault(gp => gp.Item1.Name == parentname); if (parent == null) { - Log.ConsoleError("Invalid parent {0} for group {1}".SFormat(group.Name, parentname)); + Log.ConsoleError("Invalid parent {0} for group {1}".SFormat(parentname, group.Name)); return; } group.Parent = parent.Item1; @@ -265,8 +272,8 @@ namespace TShockAPI.DB tempgroups.Add(group); } - - groups = tempgroups; + groups.Clear(); + groups.AddRange(tempgroups); } catch (Exception ex) { @@ -289,21 +296,21 @@ namespace TShockAPI.DB } } - [Serializable] - public class GroupExistsException : GroupManagerException - { - public GroupExistsException(string name) - : base("Group '" + name + "' already exists") - { - } - } + [Serializable] + public class GroupExistsException : GroupManagerException + { + public GroupExistsException(string name) + : base("Group '" + name + "' already exists") + { + } + } - [Serializable] - public class GroupNotExistException : GroupManagerException - { - public GroupNotExistException(string name) - : base("Group '" + name + "' does not exist") - { - } - } + [Serializable] + public class GroupNotExistException : GroupManagerException + { + public GroupNotExistException(string name) + : base("Group '" + name + "' does not exist") + { + } + } } diff --git a/TShockAPI/Group.cs b/TShockAPI/Group.cs index 16448677..b1a44a5e 100644 --- a/TShockAPI/Group.cs +++ b/TShockAPI/Group.cs @@ -30,23 +30,57 @@ namespace TShockAPI public int Order { get; set; } public string Prefix { get; set; } public string Suffix { get; set; } + public string ParentName { get { return (null == Parent) ? "" : Parent.Name; } } + public string ChatColor + { + get { return string.Format("{0}{1}{2}", R.ToString("X2"), G.ToString("X2"), B.ToString("X2")); } + set + { + if (null != value) + { + string[] parts = value.Split(','); + if (3 == parts.Length) + { + byte r, g, b; + if (byte.TryParse(parts[0], out r) && byte.TryParse(parts[1], out g) && byte.TryParse(parts[2], out b)) + { + R = r; + G = g; + B = b; + return; + } + } + } + } + } + + public string Permissions + { + get + { + List all = new List(permissions); + permissions.ForEach(p => all.Add("!" + p)); + return string.Join(",", all); + } + set + { + permissions.Clear(); + negatedpermissions.Clear(); + if (null != value) + value.Split(',').ForEach(p => AddPermission(p.Trim())); + } + } public byte R = 255; public byte G = 255; public byte B = 255; - public Group(string groupname, Group parentgroup = null, string chatcolor = "255,255,255") + public Group(string groupname, Group parentgroup = null, string chatcolor = "255,255,255", string permissions = null) { Name = groupname; Parent = parentgroup; - byte.TryParse(chatcolor.Split(',')[0], out R); - byte.TryParse(chatcolor.Split(',')[1], out G); - byte.TryParse(chatcolor.Split(',')[2], out B); - } - - public string ChatColor() - { - return string.Format("{0}{1}{2}", R.ToString("X2"), G.ToString("X2"), B.ToString("X2")); + ChatColor = chatcolor; + Permissions = permissions; } public virtual bool HasPermission(string permission) @@ -73,21 +107,44 @@ namespace TShockAPI public void NegatePermission(string permission) { - negatedpermissions.Add(permission); + // Avoid duplicates + if (!negatedpermissions.Contains(permission)) + { + negatedpermissions.Add(permission); + permissions.Remove(permission); // Ensure we don't have conflicting definitions for a permissions + } } public void AddPermission(string permission) { - permissions.Add(permission); + if (permission.StartsWith("!")) + { + NegatePermission(permission.Substring(1)); + return; + } + // Avoid duplicates + if (!permissions.Contains(permission)) + { + permissions.Add(permission); + negatedpermissions.Remove(permission); // Ensure we don't have conflicting definitions for a permissions + } } public void SetPermission(List permission) { permissions.Clear(); - foreach (string s in permission) + negatedpermissions.Clear(); + permission.ForEach(p => AddPermission(p)); + } + + public void RemovePermission(string permission) + { + if (permission.StartsWith("!")) { - permissions.Add(s); + negatedpermissions.Remove(permission.Substring(1)); + return; } + permissions.Remove(permission); } } diff --git a/TShockAPI/TShock.cs b/TShockAPI/TShock.cs index c46c3ab5..2a7824ed 100755 --- a/TShockAPI/TShock.cs +++ b/TShockAPI/TShock.cs @@ -172,7 +172,6 @@ namespace TShockAPI Warps = new WarpManager(DB); Users = new UserManager(DB); Groups = new GroupManager(DB); - Groups.LoadPermisions(); Regions = new RegionManager(DB); Itembans = new ItemManager(DB); RememberedPos = new RemeberedPosManager(DB); From d862d7922e9e0f70d912519d05e42c2b0c3dfc93 Mon Sep 17 00:00:00 2001 From: stevenh Date: Thu, 16 Feb 2012 11:30:44 +0000 Subject: [PATCH 27/73] Added better support for detection of duplicate users Corrected and enhanced exception message for GetUser --- TShockAPI/DB/UserManager.cs | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/TShockAPI/DB/UserManager.cs b/TShockAPI/DB/UserManager.cs index 7ea6c63a..0b6ba990 100644 --- a/TShockAPI/DB/UserManager.cs +++ b/TShockAPI/DB/UserManager.cs @@ -20,6 +20,7 @@ using System.Data; using System.IO; using System.Collections.Generic; using MySql.Data.MySqlClient; +using System.Text.RegularExpressions; namespace TShockAPI.DB { @@ -62,6 +63,9 @@ namespace TShockAPI.DB } catch (Exception ex) { + // Detect duplicate user using a regexp as Sqlite doesn't have well structured exceptions + if (Regex.IsMatch(ex.Message, "Username.*not unique")) + throw new UserExistsException(user.Name); throw new UserManagerException("AddUser SQL returned an error (" + ex.Message + ")", ex); } @@ -254,15 +258,22 @@ namespace TShockAPI.DB result = database.QueryReader("SELECT * FROM Users WHERE IP=@0", user.Address); } - using (var reader = result) + if (result.Read()) { - if (reader.Read()) - return LoadUserFromResult(user, result); + user = LoadUserFromResult(user, result); + // Check for multiple matches + if (!result.Read()) + return user; + + if (string.IsNullOrEmpty(user.Address)) + throw new UserManagerException(String.Format("Multiple users found for name '{0}'", user.Name)); + else + throw new UserManagerException(String.Format("Multiple users found for ip '{0}'", user.Address)); } } catch (Exception ex) { - throw new UserManagerException("GetUserID SQL returned an error", ex); + throw new UserManagerException("GetUser SQL returned an error (" + ex.Message + ")", ex); } throw new UserNotExistException(string.IsNullOrEmpty(user.Address) ? user.Name : user.Address); } From 5d4e210a2611806affbe446a1dc5d21b40321e91 Mon Sep 17 00:00:00 2001 From: stevenh Date: Thu, 16 Feb 2012 11:51:10 +0000 Subject: [PATCH 28/73] Removed EnableBanOnUsernames code from FindBanTest as its no longer applicable --- UnitTests/BanManagerTest.cs | 4 ---- 1 file changed, 4 deletions(-) diff --git a/UnitTests/BanManagerTest.cs b/UnitTests/BanManagerTest.cs index bcd4146b..2f4daa67 100644 --- a/UnitTests/BanManagerTest.cs +++ b/UnitTests/BanManagerTest.cs @@ -61,11 +61,7 @@ namespace UnitTests public void FindBanTest() { Assert.IsNotNull(Bans.GetBanByIp("127.0.0.1")); - TShock.Config.EnableBanOnUsernames = true; Assert.IsNotNull(Bans.GetBanByName("BanTest")); - // Disabled this this for now as its currently expected behavour - //TShock.Config.EnableBanOnUsernames = false; - //Assert.IsNull(Bans.GetBanByName("BanTest")); } } } From c258406bcbf96cf27bb61363d723a1b1aeee5c3c Mon Sep 17 00:00:00 2001 From: stevenh Date: Thu, 16 Feb 2012 12:01:02 +0000 Subject: [PATCH 29/73] Added parameterless constructor for RestObject required for JavaScriptSerializer.Deserialize --- TShockAPI/Rest/RestObject.cs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/TShockAPI/Rest/RestObject.cs b/TShockAPI/Rest/RestObject.cs index e63233dc..130e2ec8 100644 --- a/TShockAPI/Rest/RestObject.cs +++ b/TShockAPI/Rest/RestObject.cs @@ -41,7 +41,14 @@ namespace Rests set { this["response"] = value; } } - public RestObject(string status = "200") + // Parameterless constructor for deseralisation required by JavaScriptSerializer.Deserialize in TShockRestTestPlugin + // Note: The constructor with all defaults isn't good enough :( + public RestObject() + { + Status = "200"; + } + + public RestObject(string status = "200") { Status = status; } From dee2c1a9f4f81bf603bc35a40ee8e010d7c86c09 Mon Sep 17 00:00:00 2001 From: stevenh Date: Thu, 16 Feb 2012 12:03:08 +0000 Subject: [PATCH 30/73] Refactored output processing to always return RestObject's Refactored method names to be consistent with function e.g. Off -> ServerOff Added new endpoints:- /v2/server/status - Status query including player and rules matching common query tool requirements such as qstat. The json returned uses native types e.g. int's where possible /v2/groups/list - Lists groups /v2/groups/read - Query group detail /v2/groups/destroy - Remove a group /v2/groups/create - Create a group /v2/players/list - Lists players including basic details /v2/users/create - Create a user /v2/users/list - Lists users basic user details applying a filter if specified. Refactored missing parameter and error handling to use common utility methods RestError, RestMissingParam which ensures consistency across all functions and protects against null object references Removed maxplayers from /status to ensure 100% compatibility, this and more details can be found in the new end point /v2/server/status Protected against null names in user/activelist Refactored variable checks to use string.IsNullOrWhiteSpace where applicable to capture errors early in the RestAPI Added the ability to location users by "id" matching the underlying API. Refactored locating players, bans & users to utility methods to ensure consitency across the api and eliminate duplicate code making for easier maintainence NOTE: Duplicate and invalid DB entries currently can still be made if the DB format hasn't been updated to with missing unique and not null constaints Removed { RequiresToken = true } from RestCommand constructors as this is the default anyway. Optimised function calls so that tests are processed sequentially avoiding unnessasary operations in failure cases Cleaned up formatting ensuring consistent line endings, indentation and single line if layout Fixed ServerCommand duplicate key issue for multi line returns, now uses a single "response" string with embeded newlines Fixed PlayerKill output using verb instead of parameters for "from" option --- TShockAPI/Rest/RestManager.cs | 1041 +++++++++++++++++++-------------- 1 file changed, 588 insertions(+), 453 deletions(-) diff --git a/TShockAPI/Rest/RestManager.cs b/TShockAPI/Rest/RestManager.cs index 4fd20273..ed79492e 100644 --- a/TShockAPI/Rest/RestManager.cs +++ b/TShockAPI/Rest/RestManager.cs @@ -16,6 +16,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ using System; +using System.Collections; using System.Collections.Generic; using System.Linq; using HttpServer; @@ -36,395 +37,393 @@ namespace TShockAPI public void RegisterRestfulCommands() { - Rest.Register(new RestCommand("/status", Status) {RequiresToken = false}); - Rest.Register(new RestCommand("/tokentest", TokenTest) {RequiresToken = true}); + // Server Commands + Rest.Register(new RestCommand("/v2/server/broadcast", ServerBroadcast)); + Rest.Register(new RestCommand("/v2/server/off", ServerOff)); + Rest.Register(new RestCommand("/v2/server/rawcmd", ServerCommand)); + Rest.Register(new RestCommand("/v2/server/status", ServerStatusV2) { RequiresToken = false }); + Rest.Register(new RestCommand("/tokentest", ServerTokenTest)); + Rest.Register(new RestCommand("/status", ServerStatus) { RequiresToken = false }); - Rest.Register(new RestCommand("/v2/users/activelist", UserListV2) { RequiresToken = true }); - Rest.Register(new RestCommand("/v2/users/read", UserInfoV2) { RequiresToken = true }); - Rest.Register(new RestCommand("/v2/users/destroy", UserDestroyV2) { RequiresToken = true }); - Rest.Register(new RestCommand("/v2/users/update", UserUpdateV2) { RequiresToken = true }); + // User Commands + Rest.Register(new RestCommand("/v2/users/activelist", UserActiveListV2)); + Rest.Register(new RestCommand("/v2/users/create", UserCreateV2)); + Rest.Register(new RestCommand("/v2/users/list", UserListV2)); + Rest.Register(new RestCommand("/v2/users/read", UserInfoV2)); + Rest.Register(new RestCommand("/v2/users/destroy", UserDestroyV2)); + Rest.Register(new RestCommand("/v2/users/update", UserUpdateV2)); - Rest.Register(new RestCommand("/bans/create", BanCreate) {RequiresToken = true}); - Rest.Register(new RestCommand("/v2/bans/read", BanInfoV2) { RequiresToken = true }); - Rest.Register(new RestCommand("/v2/bans/destroy", BanDestroyV2) { RequiresToken = true }); + // Ban Commands + Rest.Register(new RestCommand("/bans/create", BanCreate)); + Rest.Register(new RestCommand("/v2/bans/list", BanListV2)); + Rest.Register(new RestCommand("/v2/bans/read", BanInfoV2)); + Rest.Register(new RestCommand("/v2/bans/destroy", BanDestroyV2)); - Rest.Register(new RestCommand("/v2/lists/bans", BanListIPs) { RequiresToken = true }); - Rest.Register(new RestCommand("/lists/players", PlayerList) {RequiresToken = true}); - Rest.Register(new RestCommand("/v2/lists/players", PlayerListV2) { RequiresToken = true }); + // World Commands + Rest.Register(new RestCommand("/world/read", WorldRead)); + Rest.Register(new RestCommand("/world/meteor", WorldMeteor)); + Rest.Register(new RestCommand("/world/bloodmoon/{bool}", WorldBloodmoon)); + Rest.Register(new RestCommand("/v2/world/save", WorldSave)); + Rest.Register(new RestCommand("/v2/world/autosave/state/{bool}", WorldChangeSaveSettings)); + Rest.Register(new RestCommand("/v2/world/butcher", WorldButcher)); - Rest.Register(new RestCommand("/world/read", WorldRead) {RequiresToken = true}); - Rest.Register(new RestCommand("/world/meteor", WorldMeteor) {RequiresToken = true}); - Rest.Register(new RestCommand("/world/bloodmoon/{bool}", WorldBloodmoon) {RequiresToken = true}); - Rest.Register(new RestCommand("/v2/world/save", WorldSave) { RequiresToken = true}); - Rest.Register(new RestCommand("/v2/world/autosave/state/{bool}", ChangeWorldSaveSettings) { RequiresToken = true }); - Rest.Register(new RestCommand("/v2/world/butcher", Butcher) {RequiresToken = true}); + // Player Commands + Rest.Register(new RestCommand("/lists/players", PlayerList)); + Rest.Register(new RestCommand("/v2/players/list", PlayerListV2)); + Rest.Register(new RestCommand("/v2/players/read", PlayerReadV2)); + Rest.Register(new RestCommand("/v2/players/kick", PlayerKickV2)); + Rest.Register(new RestCommand("/v2/players/ban", PlayerBanV2)); + Rest.Register(new RestCommand("/v2/players/kill", PlayerKill)); + Rest.Register(new RestCommand("/v2/players/mute", PlayerMute)); + Rest.Register(new RestCommand("/v2/players/unmute", PlayerUnMute)); - Rest.Register(new RestCommand("/v2/players/read", PlayerReadV2) { RequiresToken = true }); - Rest.Register(new RestCommand("/v2/players/kick", PlayerKickV2) { RequiresToken = true }); - Rest.Register(new RestCommand("/v2/players/ban", PlayerBanV2) { RequiresToken = true }); - Rest.Register(new RestCommand("/v2/players/kill", PlayerKill) {RequiresToken = true}); - Rest.Register(new RestCommand("/v2/players/mute", PlayerMute) {RequiresToken = true}); - Rest.Register(new RestCommand("/v2/players/unmute", PlayerUnMute) {RequiresToken = true}); - - Rest.Register(new RestCommand("/v2/server/broadcast", Broadcast) { RequiresToken = true}); - Rest.Register(new RestCommand("/v2/server/off", Off) {RequiresToken = true}); - Rest.Register(new RestCommand("/v2/server/rawcmd", ServerCommand) {RequiresToken = true}); + // Group Commands + Rest.Register(new RestCommand("/v2/groups/list", GroupList)); + Rest.Register(new RestCommand("/v2/groups/read", GroupInfo)); + Rest.Register(new RestCommand("/v2/groups/destroy", GroupDestroy)); + Rest.Register(new RestCommand("/v2/groups/create", GroupCreate)); + Rest.Register(new RestCommand("/v2/groups/update", GroupUpdate)); } #region RestServerMethods private object ServerCommand(RestVerbs verbs, IParameterCollection parameters) { - if (parameters["cmd"] != null && parameters["cmd"].Trim() != "") - { - TSRestPlayer tr = new TSRestPlayer(); - RestObject ro = new RestObject("200"); - Commands.HandleCommand(tr, parameters["cmd"]); - foreach (string s in tr.GetCommandOutput()) - { - ro.Add("response", s); - } - return ro; - } - RestObject fail = new RestObject("400"); - fail["response"] = "Missing or blank cmd parameter."; - return fail; + if (string.IsNullOrWhiteSpace(parameters["cmd"])) + return RestMissingParam("cmd"); + + TSRestPlayer tr = new TSRestPlayer(); + Commands.HandleCommand(tr, parameters["cmd"]); + return RestResponse(string.Join("\n", tr.GetCommandOutput())); } - private object Off(RestVerbs verbs, IParameterCollection parameters) + private object ServerOff(RestVerbs verbs, IParameterCollection parameters) { - bool confirm; - bool.TryParse(parameters["confirm"], out confirm); - bool nosave; - bool.TryParse(parameters["nosave"], out nosave); + if (!GetBool(parameters["confirm"], false)) + return RestInvalidParam("confirm"); - if (confirm == true) + if (!GetBool(parameters["nosave"], false)) + WorldGen.saveWorld(); + Netplay.disconnect = true; + + // Inform players the server is shutting down + var msg = string.IsNullOrWhiteSpace(parameters["message"]) ? "Server is shutting down" : parameters["message"]; + foreach (TSPlayer player in TShock.Players.Where(p => null != p)) { - if (!nosave) - WorldGen.saveWorld(); - Netplay.disconnect = true; - RestObject reply = new RestObject("200"); - reply["response"] = "The server is shutting down."; - return reply; + TShock.Utils.ForceKick(player, msg); } - RestObject fail = new RestObject("400"); - fail["response"] = "Invalid/missing confirm switch, and/or missing nosave switch."; - return fail; + return RestResponse("The server is shutting down"); } - private object Broadcast(RestVerbs verbs, IParameterCollection parameters) + private object ServerBroadcast(RestVerbs verbs, IParameterCollection parameters) { - if (parameters["msg"] != null && parameters["msg"].Trim() != "") - { - TShock.Utils.Broadcast(parameters["msg"]); - RestObject reply = new RestObject("200"); - reply["response"] = "The message was broadcasted successfully."; - return reply; - } - RestObject fail = new RestObject("400"); - fail["response"] = "Broadcast failed."; - return fail; + var msg = parameters["msg"]; + if (string.IsNullOrWhiteSpace(msg)) + return RestMissingParam("msg"); + TShock.Utils.Broadcast(msg); + return RestResponse("The message was broadcasted successfully"); } - #endregion - - #region RestMethods - - private object TokenTest(RestVerbs verbs, IParameterCollection parameters) - { - return new Dictionary - {{"status", "200"}, {"response", "Token is valid and was passed through correctly."}}; - } - - private object Status(RestVerbs verbs, IParameterCollection parameters) + private object ServerStatus(RestVerbs verbs, IParameterCollection parameters) { if (TShock.Config.EnableTokenEndpointAuthentication) - return new RestObject("403") {Error = "Server settings require a token for this API call."}; + return RestError("Server settings require a token for this API call"); - var activeplayers = Main.player.Where(p => p != null && p.active).ToList(); - string currentPlayers = string.Join(", ", activeplayers.Select(p => p.name)); + var activeplayers = Main.player.Where(p => null != p && p.active).ToList(); + return new RestObject() + { + {"name", TShock.Config.ServerNickname}, + {"port", Convert.ToString(TShock.Config.ServerPort)}, + {"playercount", Convert.ToString(activeplayers.Count())}, + {"players", string.Join(", ", activeplayers.Select(p => p.name))}, + }; + } - var ret = new RestObject("200"); - ret["name"] = TShock.Config.ServerNickname; - ret["port"] = Convert.ToString(TShock.Config.ServerPort); - ret["playercount"] = Convert.ToString(activeplayers.Count()); - ret["players"] = currentPlayers; + private object ServerStatusV2(RestVerbs verbs, IParameterCollection parameters) + { + if (TShock.Config.EnableTokenEndpointAuthentication) + return RestError("Server settings require a token for this API call"); - ret["maxplayers"] = TShock.Config.MaxSlots; + var ret = new RestObject() + { + {"name", TShock.Config.ServerNickname}, + {"port", TShock.Config.ServerPort}, + {"playercount", Main.player.Where(p => null != p && p.active).Count()}, + {"maxplayers", TShock.Config.MaxSlots}, + {"world", Main.worldName} + }; + + if (GetBool(parameters["players"], false)) + { + var players = new ArrayList(); + foreach (TSPlayer tsPlayer in TShock.Players.Where(p => null != p)) + { + var p = PlayerFilter(tsPlayer, parameters); + if (null != p) + players.Add(p); + } + ret.Add("players", players); + } + + if (GetBool(parameters["rules"], false)) + { + var rules = new Dictionary(); + rules.Add("AutoSave", TShock.Config.AutoSave); + rules.Add("DisableBuild", TShock.Config.DisableBuild); + rules.Add("DisableClownBombs", TShock.Config.DisableClownBombs); + rules.Add("DisableDungeonGuardian", TShock.Config.DisableDungeonGuardian); + rules.Add("DisableInvisPvP", TShock.Config.DisableInvisPvP); + rules.Add("DisableSnowBalls", TShock.Config.DisableSnowBalls); + rules.Add("DisableTombstones", TShock.Config.DisableTombstones); + rules.Add("EnableWhitelist", TShock.Config.EnableWhitelist); + rules.Add("HardcoreOnly", TShock.Config.HardcoreOnly); + rules.Add("PvPMode", TShock.Config.PvPMode); + rules.Add("SpawnProtection", TShock.Config.SpawnProtection); + rules.Add("SpawnProtectionRadius", TShock.Config.SpawnProtectionRadius); + + ret.Add("rules", rules); + } return ret; } + private object ServerTokenTest(RestVerbs verbs, IParameterCollection parameters) + { + return RestResponse("Token is valid and was passed through correctly"); + } + #endregion #region RestUserMethods + private object UserActiveListV2(RestVerbs verbs, IParameterCollection parameters) + { + return new RestObject() { { "activeusers", string.Join("\t", TShock.Players.Where(p => null != p && null != p.UserAccountName && p.Active).Select(p => p.UserAccountName)) } }; + } + private object UserListV2(RestVerbs verbs, IParameterCollection parameters) { - string playerlist = ""; - foreach (var TSPlayer in TShock.Players) + return new RestObject() { { "users", TShock.Users.GetUsers().Select(p => new Dictionary(){ + {"name", p.Name}, + {"id", p.ID}, + {"group", p.Group}, + {"ip", p.Address}, + }) } }; + } + + private object UserCreateV2(RestVerbs verbs, IParameterCollection parameters) + { + var username = parameters["user"]; + if (string.IsNullOrWhiteSpace(username)) + return RestMissingParam("user"); + + var group = parameters["group"]; + if (string.IsNullOrWhiteSpace(group)) + return RestMissingParam("group"); + + var password = parameters["password"]; + if (string.IsNullOrWhiteSpace(password)) + return RestMissingParam("password"); + + // NOTE: ip can be blank + User user = new User(parameters["ip"], username, password, group); + try { - if (TSPlayer == null) - { - continue; - } - playerlist += playerlist == "" ? TSPlayer.UserAccountName : "\t" + TSPlayer.UserAccountName; + TShock.Users.AddUser(user); } - var returnBlock = new Dictionary(); - returnBlock.Add("status", "200"); - returnBlock.Add("activeusers", playerlist); - return returnBlock; + catch (Exception e) + { + return RestError(e.Message); + } + + return RestResponse("User was successfully created"); } private object UserUpdateV2(RestVerbs verbs, IParameterCollection parameters) { - var returnBlock = new Dictionary(); + var ret = UserFind(parameters); + if (ret is RestObject) + return ret; + var password = parameters["password"]; var group = parameters["group"]; + if (string.IsNullOrWhiteSpace(group) && string.IsNullOrWhiteSpace(password)) + return RestMissingParam("group", "password"); - if (group == null && password == null) + User user = (User)ret; + var response = new RestObject(); + if (!string.IsNullOrWhiteSpace(password)) { - returnBlock.Add("status", "400"); - returnBlock.Add("error", "No parameters were passed."); - return returnBlock; + try + { + TShock.Users.SetUserPassword(user, password); + response.Add("password-response", "Password updated successfully"); + } + catch (Exception e) + { + return RestError("Failed to update user password (" + e.Message + ")"); + } } - var user = TShock.Users.GetUserByName(parameters["user"]); - if (user == null) + if (!string.IsNullOrWhiteSpace(group)) { - returnBlock.Add("status", "400"); - returnBlock.Add("error", "The specefied user doesn't exist."); - return returnBlock; + try + { + TShock.Users.SetUserGroup(user, group); + response.Add("group-response", "Group updated successfully"); + } + catch (Exception e) + { + return RestError("Failed to update user group (" + e.Message + ")"); + } } - if (password != null) - { - TShock.Users.SetUserPassword(user, password); - returnBlock.Add("password-response", "Password updated successfully."); - } - - if (group != null) - { - TShock.Users.SetUserGroup(user, group); - returnBlock.Add("group-response", "Group updated successfully."); - } - - returnBlock.Add("status", "200"); - return returnBlock; + return response; } private object UserDestroyV2(RestVerbs verbs, IParameterCollection parameters) { - var user = TShock.Users.GetUserByName(parameters["user"]); - if (user == null) - { - return new Dictionary {{"status", "400"}, {"error", "The specified user account does not exist."}}; - } - var returnBlock = new Dictionary(); + var ret = UserFind(parameters); + if (ret is RestObject) + return ret; + try { - TShock.Users.RemoveUser(user); + TShock.Users.RemoveUser((User)ret); } - catch (Exception) + catch (Exception e) { - returnBlock.Add("status", "400"); - returnBlock.Add("error", "The specified user was unable to be removed."); - return returnBlock; + return RestError(e.Message); } - returnBlock.Add("status", "200"); - returnBlock.Add("response", "User deleted successfully."); - return returnBlock; + + return RestResponse("User deleted successfully"); } private object UserInfoV2(RestVerbs verbs, IParameterCollection parameters) { - var user = TShock.Users.GetUserByName(parameters["user"]); - if (user == null) - { - return new Dictionary {{"status", "400"}, {"error", "The specified user account does not exist."}}; - } + var ret = UserFind(parameters); + if (ret is RestObject) + return ret; - var returnBlock = new Dictionary(); - returnBlock.Add("status", "200"); - returnBlock.Add("group", user.Group); - returnBlock.Add("id", user.ID.ToString()); - return returnBlock; + User user = (User)ret; + return new RestObject() { { "group", user.Group }, { "id", user.ID.ToString() } }; } #endregion #region RestBanMethods - private object BanListIPs(RestVerbs verbs, IParameterCollection parameters) - { - RestObject returnItem = new RestObject("200"); - returnItem.Add("bans", TShock.Bans.GetBans()); - - return returnItem; - } - private object BanCreate(RestVerbs verbs, IParameterCollection parameters) { - var returnBlock = new Dictionary(); var ip = parameters["ip"]; var name = parameters["name"]; - var reason = parameters["reason"]; - if (ip == null && name == null) - { - returnBlock.Add("status", "400"); - returnBlock.Add("error", "Required parameters were missing from this API endpoint."); - return returnBlock; - } - - if (ip == null) - { - ip = ""; - } - - if (name == null) - { - name = ""; - } - - if (reason == null) - { - reason = ""; - } + if (string.IsNullOrWhiteSpace(ip) && string.IsNullOrWhiteSpace(name)) + return RestMissingParam("ip", "name"); try { - TShock.Bans.AddBan(ip, name, reason); + TShock.Bans.AddBan(ip, name, parameters["reason"], true); } - catch (Exception) + catch (Exception e) { - returnBlock.Add("status", "400"); - returnBlock.Add("error", "The specified ban was unable to be created."); - return returnBlock; + return RestError(e.Message); } - returnBlock.Add("status", "200"); - returnBlock.Add("response", "Ban created successfully."); - return returnBlock; + return RestResponse("Ban created successfully"); } private object BanDestroyV2(RestVerbs verbs, IParameterCollection parameters) { - var returnBlock = new Dictionary(); - - var type = parameters["type"]; - if (type == null) - { - returnBlock.Add("Error", "Invalid Type"); - return returnBlock; - } - - var ban = new Ban(); - if (type == "ip") ban = TShock.Bans.GetBanByIp(parameters["user"]); - else if (type == "name") ban = TShock.Bans.GetBanByName(parameters["user"]); - else - { - returnBlock.Add("Error", "Invalid Type"); - return returnBlock; - } - - if (ban == null) - { - return new Dictionary {{"status", "400"}, {"error", "The specified ban does not exist."}}; - } + var ret = BanFind(parameters); + if (ret is RestObject) + return ret; try { - TShock.Bans.RemoveBan(ban.IP); + Ban ban = (Ban)ret; + switch (parameters["type"]) + { + case "ip": + if (!TShock.Bans.RemoveBan(ban.IP, false, false, true)) + return RestResponse("Failed to delete ban (already deleted?)"); + break; + case "name": + if (!TShock.Bans.RemoveBan(ban.Name, true, GetBool(parameters["caseinsensitive"], true))) + return RestResponse("Failed to delete ban (already deleted?)"); + break; + default: + return RestError("Invalid Type: '" + parameters["type"] + "'"); + } + } - catch (Exception) + catch (Exception e) { - returnBlock.Add("status", "400"); - returnBlock.Add("error", "The specified ban was unable to be removed."); - return returnBlock; + return RestError(e.Message); } - returnBlock.Add("status", "200"); - returnBlock.Add("response", "Ban deleted successfully."); - return returnBlock; + + return RestResponse("Ban deleted successfully"); } private object BanInfoV2(RestVerbs verbs, IParameterCollection parameters) { - var returnBlock = new Dictionary(); + var ret = BanFind(parameters); + if (ret is RestObject) + return ret; - var type = parameters["type"]; - if (type == null) + Ban ban = (Ban)ret; + return new RestObject() { + {"name", null == ban.Name ? "" : ban.Name}, + {"ip", null == ban.IP ? "" : ban.IP}, + {"reason", null == ban.Reason ? "" : ban.Reason}, + }; + } + + private object BanListV2(RestVerbs verbs, IParameterCollection parameters) + { + var banList = new ArrayList(); + foreach (var ban in TShock.Bans.GetBans()) { - returnBlock.Add("Error", "Invalid Type"); - return returnBlock; + banList.Add( + new Dictionary + { + {"name", null == ban.Name ? "" : ban.Name}, + {"ip", null == ban.IP ? "" : ban.IP}, + {"reason", null == ban.Reason ? "" : ban.Reason}, + } + ); } - var ban = new Ban(); - if (type == "ip") ban = TShock.Bans.GetBanByIp(parameters["user"]); - else if (type == "name") ban = TShock.Bans.GetBanByName(parameters["user"]); - else - { - returnBlock.Add("Error", "Invalid Type"); - return returnBlock; - } - - if (ban == null) - { - return new Dictionary { { "status", "400" }, { "error", "The specified ban does not exist." } }; - } - - returnBlock.Add("status", "200"); - returnBlock.Add("name", ban.Name); - returnBlock.Add("ip", ban.IP); - returnBlock.Add("reason", ban.Reason); - return returnBlock; + return new RestObject() { { "bans", banList } }; } #endregion #region RestWorldMethods - private object ChangeWorldSaveSettings(RestVerbs verbs, IParameterCollection parameters) + private object WorldChangeSaveSettings(RestVerbs verbs, IParameterCollection parameters) { - bool state; - bool.TryParse(verbs["state"], out state); + bool autoSave; + if (!bool.TryParse(verbs["bool"], out autoSave)) + return RestInvalidParam("state"); + TShock.Config.AutoSave = autoSave; - if (state == true) - { - TShock.Config.AutoSave = true; - } - else - { - TShock.Config.AutoSave = false; - } - - RestObject rj = new RestObject("200"); - rj["response"] = "Value changed"; - rj["state"] = state; - - return rj; + return RestResponse("AutoSave has been set to " + autoSave); } private object WorldSave(RestVerbs verbs, IParameterCollection parameters) { TShock.Utils.SaveWorld(); - RestObject rj = new RestObject("200"); - rj["response"] = "World saved."; - return rj; + return RestResponse("World saved"); } - private object Butcher(RestVerbs verbs, IParameterCollection parameters) + private object WorldButcher(RestVerbs verbs, IParameterCollection parameters) { bool killFriendly; if (!bool.TryParse(parameters["killfriendly"], out killFriendly)) - { - RestObject fail = new RestObject("400"); - fail["response"] = "The given value for killfriendly wasn't a boolean value."; - return fail; - } + return RestInvalidParam("killfriendly"); + if (killFriendly) - { killFriendly = !killFriendly; - } int killcount = 0; for (int i = 0; i < Main.npc.Length; i++) @@ -436,54 +435,38 @@ namespace TShockAPI } } - RestObject rj = new RestObject("200"); - rj["response"] = killcount + " NPCs have been killed."; - return rj; + return RestResponse(killcount + " NPCs have been killed"); } private object WorldRead(RestVerbs verbs, IParameterCollection parameters) { - var returnBlock = new Dictionary(); - returnBlock.Add("status", "200"); - returnBlock.Add("name", Main.worldName); - returnBlock.Add("size", Main.maxTilesX + "*" + Main.maxTilesY); - returnBlock.Add("time", Main.time); - returnBlock.Add("daytime", Main.dayTime); - returnBlock.Add("bloodmoon", Main.bloodMoon); - returnBlock.Add("invasionsize", Main.invasionSize); - return returnBlock; + return new RestObject() + { + {"name", Main.worldName}, + {"size", Main.maxTilesX + "*" + Main.maxTilesY}, + {"time", Main.time}, + {"daytime", Main.dayTime}, + {"bloodmoon", Main.bloodMoon}, + {"invasionsize", Main.invasionSize} + }; } private object WorldMeteor(RestVerbs verbs, IParameterCollection parameters) { - if (WorldGen.genRand == null) + if (null == WorldGen.genRand) WorldGen.genRand = new Random(); WorldGen.dropMeteor(); - var returnBlock = new Dictionary {{"status", "200"}, {"response", "Meteor has been spawned."}}; - return returnBlock; + return RestResponse("Meteor has been spawned"); } private object WorldBloodmoon(RestVerbs verbs, IParameterCollection parameters) { - var returnBlock = new Dictionary(); - var bloodmoonVerb = verbs["bool"]; bool bloodmoon; - if (bloodmoonVerb == null) - { - returnBlock.Add("status", "400"); - returnBlock.Add("error", "No parameter was passed."); - return returnBlock; - } - if (!bool.TryParse(bloodmoonVerb, out bloodmoon)) - { - returnBlock.Add("status", "400"); - returnBlock.Add("error", "Unable to parse parameter."); - return returnBlock; - } + if (!bool.TryParse(verbs["bool"], out bloodmoon)) + return RestInvalidParam("bloodmoon"); Main.bloodMoon = bloodmoon; - returnBlock.Add("status", "200"); - returnBlock.Add("response", "Blood Moon has been set to " + bloodmoon); - return returnBlock; + + return RestResponse("Blood Moon has been set to " + bloodmoon); } #endregion @@ -492,190 +475,342 @@ namespace TShockAPI private object PlayerUnMute(RestVerbs verbs, IParameterCollection parameters) { - var returnBlock = new Dictionary(); - var playerParam = parameters["player"]; - var found = TShock.Utils.FindPlayer(playerParam); - var reason = parameters["reason"]; - if (found.Count == 0) - { - returnBlock.Add("status", "400"); - returnBlock.Add("error", "Name " + playerParam + " was not found"); - } - else if (found.Count > 1) - { - returnBlock.Add("status", "400"); - returnBlock.Add("error", "Name " + playerParam + " matches " + playerParam.Count() + " players"); - } - else if (found.Count == 1) - { - var player = found[0]; - player.mute = false; - player.SendMessage("You have been remotely unmuted."); - returnBlock.Add("status", "200"); - returnBlock.Add("response", "Player " + player.Name + " was muted."); - } - return returnBlock; + return PlayerSetMute(parameters, false); } private object PlayerMute(RestVerbs verbs, IParameterCollection parameters) { - var returnBlock = new Dictionary(); - var playerParam = parameters["player"]; - var found = TShock.Utils.FindPlayer(playerParam); - var reason = parameters["reason"]; - if (found.Count == 0) - { - returnBlock.Add("status", "400"); - returnBlock.Add("error", "Name " + playerParam + " was not found"); - } - else if (found.Count > 1) - { - returnBlock.Add("status", "400"); - returnBlock.Add("error", "Name " + playerParam + " matches " + playerParam.Count() + " players"); - } - else if (found.Count == 1) - { - var player = found[0]; - player.mute = true; - player.SendMessage("You have been remotely muted."); - returnBlock.Add("status", "200"); - returnBlock.Add("response", "Player " + player.Name + " was muted."); - } - return returnBlock; - } - - private object PlayerListV2(RestVerbs verbs, IParameterCollection parameters) - { - RestObject returnBlock = new RestObject("200"); - returnBlock.Add("players", TShock.Players.Where(p => p != null && p.Active)); - return returnBlock; + return PlayerSetMute(parameters, true); } private object PlayerList(RestVerbs verbs, IParameterCollection parameters) { - var activeplayers = Main.player.Where(p => p != null && p.active).ToList(); - string currentPlayers = string.Join(", ", activeplayers.Select(p => p.name)); - var ret = new RestObject("200"); - ret["players"] = currentPlayers; - ret.Add("deprecated", "This endpoint is deprecated and has been replaced with /v2/lists/players."); - return ret; + var activeplayers = Main.player.Where(p => null != p && p.active).ToList(); + return new RestObject() { { "players", string.Join(", ", activeplayers.Select(p => p.name)) } }; + } + + private object PlayerListV2(RestVerbs verbs, IParameterCollection parameters) + { + var playerList = new ArrayList(); + foreach (TSPlayer tsPlayer in TShock.Players.Where(p => null != p)) + { + var p = PlayerFilter(tsPlayer, parameters); + if (null != p) + playerList.Add(p); + } + return new RestObject() { { "players", playerList } }; } private object PlayerReadV2(RestVerbs verbs, IParameterCollection parameters) { - var returnBlock = new Dictionary(); - var playerParam = parameters["player"]; - var found = TShock.Utils.FindPlayer(playerParam); - if (found.Count == 0) + var ret = PlayerFind(parameters); + if (ret is RestObject) + return ret; + + TSPlayer player = (TSPlayer)ret; + var activeItems = player.TPlayer.inventory.Where(p => p.active).ToList(); + return new RestObject() { - returnBlock.Add("status", "400"); - returnBlock.Add("error", "Name " + playerParam + " was not found"); - } - else if (found.Count > 1) - { - returnBlock.Add("status", "400"); - returnBlock.Add("error", "Name " + playerParam + " matches " + playerParam.Count() + " players"); - } - else if (found.Count == 1) - { - var player = found[0]; - returnBlock.Add("status", "200"); - returnBlock.Add("nickname", player.Name); - returnBlock.Add("username", player.UserAccountName == null ? "" : player.UserAccountName); - returnBlock.Add("ip", player.IP); - returnBlock.Add("group", player.Group.Name); - returnBlock.Add("position", player.TileX + "," + player.TileY); - var activeItems = player.TPlayer.inventory.Where(p => p.active).ToList(); - returnBlock.Add("inventory", string.Join(", ", activeItems.Select(p => (p.name + ":" + p.stack)))); - returnBlock.Add("buffs", string.Join(", ", player.TPlayer.buffType)); - } - return returnBlock; + {"nickname", player.Name}, + {"username", null == player.UserAccountName ? "" : player.UserAccountName}, + {"ip", player.IP}, + {"group", player.Group.Name}, + {"position", player.TileX + "," + player.TileY}, + {"inventory", string.Join(", ", activeItems.Select(p => (p.name + ":" + p.stack)))}, + {"buffs", string.Join(", ", player.TPlayer.buffType)} + }; } private object PlayerKickV2(RestVerbs verbs, IParameterCollection parameters) { - var returnBlock = new Dictionary(); - var playerParam = parameters["player"]; - if (playerParam == null) - { - returnBlock.Add("status", "400"); - returnBlock.Add("error", "Unspecified name."); - return returnBlock; - } - var found = TShock.Utils.FindPlayer(playerParam); - var reason = parameters["reason"]; - if (found.Count == 0) - { - returnBlock.Add("status", "400"); - returnBlock.Add("error", "Name " + playerParam + " was not found"); - } - else if (found.Count > 1) - { - returnBlock.Add("status", "400"); - returnBlock.Add("error", "Name " + playerParam + " matches " + playerParam.Count() + " players"); - } - else if (found.Count == 1) - { - var player = found[0]; - TShock.Utils.ForceKick(player, reason == null ? "Kicked via web" : reason); - returnBlock.Add("status", "200"); - returnBlock.Add("response", "Player " + player.Name + " was kicked"); - } - return returnBlock; + var ret = PlayerFind(parameters); + if (ret is RestObject) + return ret; + + TSPlayer player = (TSPlayer)ret; + TShock.Utils.ForceKick(player, null == parameters["reason"] ? "Kicked via web" : parameters["reason"]); + return RestResponse("Player " + player.Name + " was kicked"); } private object PlayerBanV2(RestVerbs verbs, IParameterCollection parameters) { - var returnBlock = new Dictionary(); - var playerParam = parameters["player"]; - var found = TShock.Utils.FindPlayer(playerParam); - var reason = parameters["reason"]; - if (found.Count == 0) - { - returnBlock.Add("status", "400"); - returnBlock.Add("error", "Name " + playerParam + " was not found"); - } - else if (found.Count > 1) - { - returnBlock.Add("status", "400"); - returnBlock.Add("error", "Name " + playerParam + " matches " + playerParam.Count() + " players"); - } - else if (found.Count == 1) - { - var player = found[0]; - TShock.Bans.AddBan(player.IP, player.Name, reason == null ? "Banned via web" : reason); - TShock.Utils.ForceKick(player, reason == null ? "Banned via web" : reason); - returnBlock.Add("status", "200"); - returnBlock.Add("response", "Player " + player.Name + " was banned"); - } - return returnBlock; + var ret = PlayerFind(parameters); + if (ret is RestObject) + return ret; + + TSPlayer player = (TSPlayer)ret; + var reason = null == parameters["reason"] ? "Banned via web" : parameters["reason"]; + TShock.Bans.AddBan(player.IP, player.Name, reason); + TShock.Utils.ForceKick(player, reason); + return RestResponse("Player " + player.Name + " was banned"); } private object PlayerKill(RestVerbs verbs, IParameterCollection parameters) { - var returnBlock = new Dictionary(); - var playerParam = parameters["player"]; - var found = TShock.Utils.FindPlayer(playerParam); - var from = verbs["from"]; - if (found.Count == 0) + var ret = PlayerFind(parameters); + if (ret is RestObject) + return ret; + + TSPlayer player = (TSPlayer)ret; + player.DamagePlayer(999999); + var from = string.IsNullOrWhiteSpace(parameters["from"]) ? "Server Admin" : parameters["from"]; + player.SendMessage(string.Format("{0} just killed you!", from)); + return RestResponse("Player " + player.Name + " was killed"); + } + + #endregion + + #region RestGroupMethods + + private object GroupList(RestVerbs verbs, IParameterCollection parameters) + { + var groups = new ArrayList(); + foreach (Group group in TShock.Groups) { - returnBlock.Add("status", "400"); - returnBlock.Add("error", "Name " + playerParam + " was not found"); + groups.Add(new Dictionary {{"name", group.Name}, {"parent", group.ParentName}, {"chatcolor", group.ChatColor}}); } - else if (found.Count > 1) + return new RestObject() { { "groups", groups } }; + } + + private object GroupInfo(RestVerbs verbs, IParameterCollection parameters) + { + var ret = GroupFind(parameters); + if (ret is RestObject) + return ret; + + Group group = (Group)ret; + return new RestObject() { + {"name", group.Name}, + {"parent", group.ParentName}, + {"chatcolor", group.ChatColor}, + {"permissions", group.permissions}, + {"negatedpermissions", group.negatedpermissions} + }; + } + + private object GroupDestroy(RestVerbs verbs, IParameterCollection parameters) + { + var ret = GroupFind(parameters); + if (ret is RestObject) + return ret; + + Group group = (Group)ret; + try { - returnBlock.Add("status", "400"); - returnBlock.Add("error", "Name " + playerParam + " matches " + playerParam.Count() + " players"); + TShock.Groups.DeleteGroup(group.Name, true); } - else if (found.Count == 1) + catch (Exception e) { - var player = found[0]; - player.DamagePlayer(999999); - player.SendMessage(string.Format("{0} just killed you!", from)); - returnBlock.Add("status", "200"); - returnBlock.Add("response", "Player " + player.Name + " was killed."); + return RestError(e.Message); } - return returnBlock; + + return RestResponse("Group '" + group.Name + "' deleted successfully"); + } + + private object GroupCreate(RestVerbs verbs, IParameterCollection parameters) + { + var name = parameters["group"]; + if (string.IsNullOrWhiteSpace(name)) + return RestMissingParam("group"); + try + { + TShock.Groups.AddGroup(name, parameters["parent"], parameters["permissions"], parameters["chatcolor"], true); + } + catch (Exception e) + { + return RestError(e.Message); + } + + return RestResponse("Group '" + name + "' created successfully"); + } + + private object GroupUpdate(RestVerbs verbs, IParameterCollection parameters) + { + var ret = GroupFind(parameters); + if (ret is RestObject) + return ret; + + Group group = (Group)ret; + var parent = (null == parameters["parent"]) ? group.ParentName : parameters["parent"]; + var chatcolor = (null == parameters["chatcolor"]) ? group.ChatColor : parameters["chatcolor"]; + var permissions = (null == parameters["permissions"]) ? group.Permissions : parameters["permissions"]; + try + { + TShock.Groups.UpdateGroup(group.Name, parent, permissions, chatcolor); + } + catch (Exception e) + { + return RestError(e.Message); + } + + return RestResponse("Group '" + group.Name + "' updated successfully"); + } + + #endregion + + #region Utility Methods + + private RestObject RestError(string message, string status = "400") + { + return new RestObject(status) {Error = message}; + } + + private RestObject RestResponse(string message, string status = "200") + { + return new RestObject(status) {Response = message}; + } + + private RestObject RestMissingParam(string var) + { + return RestError("Missing or empty " + var + " parameter"); + } + + private RestObject RestMissingParam(params string[] vars) + { + return RestMissingParam(string.Join(", ", vars)); + } + + private RestObject RestInvalidParam(string var) + { + return RestError("Missing or invalid " + var + " parameter"); + } + + private bool GetBool(string val, bool def) + { + bool ret; + return bool.TryParse(val, out ret) ? ret : def; + } + + private object PlayerFind(IParameterCollection parameters) + { + string name = parameters["player"]; + if (string.IsNullOrWhiteSpace(name)) + return RestMissingParam("player"); + + var found = TShock.Utils.FindPlayer(name); + switch(found.Count) + { + case 1: + return found[0]; + case 0: + return RestError("Player " + name + " was not found"); + default: + return RestError("Player " + name + " matches " + found.Count + " players"); + } + } + + private object UserFind(IParameterCollection parameters) + { + string name = parameters["user"]; + if (string.IsNullOrWhiteSpace(name)) + return RestMissingParam("user"); + + User user; + string type = parameters["type"]; + try + { + switch (type) + { + case null: + case "name": + type = "name"; + user = TShock.Users.GetUserByName(name); + break; + case "id": + user = TShock.Users.GetUserByID(Convert.ToInt32(name)); + break; + case "ip": + user = TShock.Users.GetUserByIP(name); + + break; + default: + return RestError("Invalid Type: '" + type + "'"); + } + } + catch (Exception e) + { + return RestError(e.Message); + } + + if (null == user) + return RestError(String.Format("User {0} '{1}' doesn't exist", type, name)); + + return user; + } + + private object BanFind(IParameterCollection parameters) + { + string name = parameters["ban"]; + if (string.IsNullOrWhiteSpace(name)) + return RestMissingParam("ban"); + + string type = parameters["type"]; + if (string.IsNullOrWhiteSpace(type)) + return RestMissingParam("type"); + + Ban ban; + switch (type) + { + case "ip": + ban = TShock.Bans.GetBanByIp(name); + break; + case "name": + ban = TShock.Bans.GetBanByName(name, GetBool(parameters["caseinsensitive"], true)); + break; + default: + return RestError("Invalid Type: '" + type + "'"); + } + + if (null == ban) + return RestError("Ban " + type + " '" + name + "' doesn't exist"); + + return ban; + } + + private object GroupFind(IParameterCollection parameters) + { + var name = parameters["group"]; + if (string.IsNullOrWhiteSpace(name)) + return RestMissingParam("group"); + + var group = TShock.Groups.GetGroupByName(name); + if (null == group) + return RestError("Group '" + name + "' doesn't exist"); + + return group; + } + + private Dictionary PlayerFilter(TSPlayer tsPlayer, IParameterCollection parameters) + { + var player = new Dictionary + { + {"nickname", tsPlayer.Name}, + {"username", null == tsPlayer.UserAccountName ? "" : tsPlayer.UserAccountName}, + {"ip", tsPlayer.IP}, + {"group", tsPlayer.Group.Name}, + {"active", tsPlayer.Active}, + {"state", tsPlayer.State}, + {"team", tsPlayer.Team}, + }; + foreach (IParameter filter in parameters) + { + if (player.ContainsKey(filter.Name) && !player[filter.Name].Equals(filter.Value)) + return null; + } + return player; + } + + private object PlayerSetMute(IParameterCollection parameters, bool mute) + { + var ret = PlayerFind(parameters); + if (ret is RestObject) + return ret; + + TSPlayer player = (TSPlayer)ret; + player.mute = mute; + var verb = mute ? "muted" : "unmuted"; + player.SendMessage("You have been remotely " + verb); + return RestResponse("Player " + player.Name + " was " + verb); } #endregion From a1d3132138f277d4ff850099c2d504acb6b5cde0 Mon Sep 17 00:00:00 2001 From: stevenh Date: Thu, 16 Feb 2012 12:33:10 +0000 Subject: [PATCH 31/73] Added full test suite for RestAPI --- TShock.sln | 12 + .../Properties/AssemblyInfo.cs | 36 + TShockRestTestPlugin/TShockRestTestPlugin.cs | 192 ++ .../TShockRestTestPlugin.csproj | 62 + UnitTests/RestApiTests.webtest | 1542 +++++++++++++++++ UnitTests/UnitTests.csproj | 8 + 6 files changed, 1852 insertions(+) create mode 100644 TShockRestTestPlugin/Properties/AssemblyInfo.cs create mode 100644 TShockRestTestPlugin/TShockRestTestPlugin.cs create mode 100644 TShockRestTestPlugin/TShockRestTestPlugin.csproj create mode 100644 UnitTests/RestApiTests.webtest diff --git a/TShock.sln b/TShock.sln index 85d6a0f9..db301cae 100644 --- a/TShock.sln +++ b/TShock.sln @@ -13,6 +13,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Terraria.vsmdi = Terraria.vsmdi EndProjectSection EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TShockRestTestPlugin", "TShockRestTestPlugin\TShockRestTestPlugin.csproj", "{F2FEDAFB-58DE-4611-9168-A86112C346C7}" +EndProject Global GlobalSection(TestCaseManagementSettings) = postSolution CategoryFile = Terraria.vsmdi @@ -52,6 +54,16 @@ Global {F3742F51-D7BF-4754-A68A-CD944D2A21FF}.Release|Any CPU.ActiveCfg = Release|Any CPU {F3742F51-D7BF-4754-A68A-CD944D2A21FF}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU {F3742F51-D7BF-4754-A68A-CD944D2A21FF}.Release|x86.ActiveCfg = Release|Any CPU + {F2FEDAFB-58DE-4611-9168-A86112C346C7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F2FEDAFB-58DE-4611-9168-A86112C346C7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F2FEDAFB-58DE-4611-9168-A86112C346C7}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {F2FEDAFB-58DE-4611-9168-A86112C346C7}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {F2FEDAFB-58DE-4611-9168-A86112C346C7}.Debug|x86.ActiveCfg = Debug|Any CPU + {F2FEDAFB-58DE-4611-9168-A86112C346C7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F2FEDAFB-58DE-4611-9168-A86112C346C7}.Release|Any CPU.Build.0 = Release|Any CPU + {F2FEDAFB-58DE-4611-9168-A86112C346C7}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {F2FEDAFB-58DE-4611-9168-A86112C346C7}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {F2FEDAFB-58DE-4611-9168-A86112C346C7}.Release|x86.ActiveCfg = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/TShockRestTestPlugin/Properties/AssemblyInfo.cs b/TShockRestTestPlugin/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..17cb9a46 --- /dev/null +++ b/TShockRestTestPlugin/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("ClassLibrary1")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Multiplay")] +[assembly: AssemblyProduct("ClassLibrary1")] +[assembly: AssemblyCopyright("Copyright © Multiplay 2012")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("c6aed7ee-6282-49a2-8177-b79cad20d6d3")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/TShockRestTestPlugin/TShockRestTestPlugin.cs b/TShockRestTestPlugin/TShockRestTestPlugin.cs new file mode 100644 index 00000000..403b6f8f --- /dev/null +++ b/TShockRestTestPlugin/TShockRestTestPlugin.cs @@ -0,0 +1,192 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Text; +using System.Web; +using System.Web.Script.Serialization; +using System.Text.RegularExpressions; +using Microsoft.VisualStudio.TestTools.WebTesting; +using Microsoft.VisualStudio.TestTools.WebTesting.Rules; +using Rests; + +namespace TshockRestTestPlugin +{ + [DisplayName("JSON Status")] + [Description("Checks to see the that the JSON response has the specified status response")] + public class JsonValidateStatus : JsonValidate + { + public override void Validate(object sender, ValidationEventArgs e) + { + if (null != ValidateJson(sender, e)) + e.IsValid = true; + } + } + + [DisplayName("JSON Regexp Property")] + [Description("Checks to see the that the JSON response contains the specified property and is matches the specified regexp")] + public class JsonValidateRegexpProperty : JsonValidateProperty + { + // The name of the desired JSON property + [DisplayName("Regexp")] + [DefaultValue(true)] + public new bool UseRegularExpression { get { return base.UseRegularExpression; } set { base.UseRegularExpression = value; } } + } + + [DisplayName("JSON Error")] + [Description("Checks to see the that the JSON response contains the specified error")] + public class JsonValidateError : JsonValidateProperty + { + // The status of the JSON request + [DisplayName("JSON Status")] + [DefaultValue("400")] + public new string JSonStatus { get { return base.JSonStatus; } set { base.JSonStatus = value; } } + + // The name of the desired JSON property + [DisplayName("Property")] + [DefaultValue("error")] + public new string PropertyName { get { return base.PropertyName; } set { base.PropertyName = value; } } + } + + [DisplayName("JSON Missing Parameter")] + [Description("Checks to see the that the JSON response indicates a missing or invalid parameter")] + public class JsonValidateMissingParameter : JsonValidateError + { + // The value of the desired JSON property + [DisplayName("Missing Value")] + public new string PropertyValue { get { return base.PropertyValue; } set { base.PropertyValue = String.Format("Missing or empty {0} parameter", value); } } + } + + [DisplayName("JSON Invalid Parameter")] + [Description("Checks to see the that the JSON response indicates a missing or invalid parameter")] + public class JsonValidateInvalidParameter : JsonValidateError + { + // The value of the desired JSON property + [DisplayName("Invalid Value")] + public new string PropertyValue { get { return base.PropertyValue; } set { base.PropertyValue = String.Format("Missing or invalid {0} parameter", value); } } + } + + [DisplayName("JSON Response")] + [Description("Checks to see the that the JSON response contains the specified message")] + public class JsonValidateResponse : JsonValidateProperty + { + // The name of the desired JSON property + [DisplayName("Response")] + [DefaultValue("response")] + public new string PropertyName { get { return base.PropertyName; } set { base.PropertyName = value; } } + } + + [DisplayName("JSON Property")] + [Description("Checks to see the that the JSON response contains the specified property and is set to the specified value")] + public class JsonValidateProperty : JsonValidate + { + // The name of the desired JSON property + [DisplayName("Property")] + public string PropertyName { get; set; } + + // The value of the desired JSON property + [DisplayName("Value")] + public string PropertyValue { get; set; } + + // Is the value a regexp of the desired JSON property + [DisplayName("Regexp")] + [DefaultValue(false)] + public bool UseRegularExpression { get; set; } + + public override void Validate(object sender, ValidationEventArgs e) + { + RestObject response = ValidateJson(sender, e); + if (null == response) + return; + + if (null == response[PropertyName]) + { + e.Message = String.Format("{0} Not Found", PropertyName); + e.IsValid = false; + return; + } + + if (UseRegularExpression) + { + var re = new Regex(PropertyValue); + if (!re.IsMatch((string)response[PropertyName])) + { + e.Message = String.Format("{0} => '{1}' !~ '{2}'", PropertyName, response[PropertyName], PropertyValue); + e.IsValid = false; + return; + } + } + else + { + if (PropertyValue != (string)response[PropertyName]) + { + e.Message = String.Format("{0} => '{1}' != '{2}'", PropertyName, response[PropertyName], PropertyValue); + e.IsValid = false; + return; + } + } + + e.IsValid = true; + //e.WebTest.Context.Add(ContextParameterName, propertyValue); + } + } + + [DisplayName("JSON Has Properties")] + [Description("Checks to see the that the JSON response contains the specified properties (comma seperated)")] + public class JsonHasProperties : JsonValidate + { + // The name of the desired JSON properties to check + [DisplayName("Properties")] + [Description("A comma seperated list of property names to check exist")] + public string PropertyNames { get; set; } + + //--------------------------------------------------------------------- + public override void Validate(object sender, ValidationEventArgs e) + { + RestObject response = ValidateJson(sender, e); + if (null == response) + return; + foreach (var p in PropertyNames.Split(',')) + { + if (null == response[p]) + { + e.Message = String.Format("'{0}' Not Found", p); + e.IsValid = false; + return; + } + } + e.IsValid = true; + + //e.WebTest.Context.Add(ContextParameterName, propertyValue); + } + } + + public abstract class JsonValidate : ValidationRule + { + // The status of the JSON request + [DisplayName("JSON Status")] + [DefaultValue("200")] + public string JSonStatus { get; set; } + + public RestObject ValidateJson(object sender, ValidationEventArgs e) + { + if (string.IsNullOrWhiteSpace(e.Response.BodyString)) + { + e.IsValid = false; + e.Message = String.Format("Empty or null response {0}", e.Response.StatusCode); + return null; + } + JavaScriptSerializer serialiser = new JavaScriptSerializer(); + //dynamic data = serialiser.Deserialize(e.Response.BodyString); + RestObject response = serialiser.Deserialize(e.Response.BodyString); + + if (JSonStatus != response.Status) + { + e.IsValid = false; + e.Message = String.Format("Response Status '{0}' not '{1}'", response.Status, JSonStatus); + return null; + } + + return response; + } + } +} \ No newline at end of file diff --git a/TShockRestTestPlugin/TShockRestTestPlugin.csproj b/TShockRestTestPlugin/TShockRestTestPlugin.csproj new file mode 100644 index 00000000..bf2dd997 --- /dev/null +++ b/TShockRestTestPlugin/TShockRestTestPlugin.csproj @@ -0,0 +1,62 @@ + + + + Debug + AnyCPU + 8.0.30703 + 2.0 + {F2FEDAFB-58DE-4611-9168-A86112C346C7} + Library + Properties + TshockRestTestPlugin + TshockRestTestPlugin + v4.0 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + + + + {49606449-072B-4CF5-8088-AA49DA586694} + TShockAPI + + + + + \ No newline at end of file diff --git a/UnitTests/RestApiTests.webtest b/UnitTests/RestApiTests.webtest new file mode 100644 index 00000000..84057748 --- /dev/null +++ b/UnitTests/RestApiTests.webtest @@ -0,0 +1,1542 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/UnitTests/UnitTests.csproj b/UnitTests/UnitTests.csproj index d9b9c7f9..923856ac 100644 --- a/UnitTests/UnitTests.csproj +++ b/UnitTests/UnitTests.csproj @@ -49,6 +49,7 @@ + ..\SqlBins\Mono.Data.Sqlite.dll @@ -87,6 +88,10 @@ {49606449-072B-4CF5-8088-AA49DA586694} TShockAPI + + {F2FEDAFB-58DE-4611-9168-A86112C346C7} + TShockRestTestPlugin + @@ -102,6 +107,9 @@ Always + + Always + From a79b346d3c5d10f0a22276b591469eabba282e8f Mon Sep 17 00:00:00 2001 From: k0rd Date: Thu, 16 Feb 2012 23:00:22 -0500 Subject: [PATCH 32/73] support group modification and deleting usernames containing a DOT (.) --- TShockAPI/Commands.cs | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/TShockAPI/Commands.cs b/TShockAPI/Commands.cs index 44539bfe..f685cbd4 100755 --- a/TShockAPI/Commands.cs +++ b/TShockAPI/Commands.cs @@ -583,8 +583,11 @@ namespace TShockAPI // User deletion requires a username else if (subcmd == "del" && args.Parameters.Count == 2) { - var user = new User(); - if (args.Parameters[1].Contains(".")) + var user = new User(); + if (args.Parameters[1].Split('.').Count() ==4) + + // changed to support dot character in usernames + // if (args.Parameters[1].Contains(".")) user.Address = args.Parameters[1]; else user.Name = args.Parameters[1]; @@ -629,8 +632,12 @@ namespace TShockAPI // Group changing requires a username or IP address, and a new group to set else if (subcmd == "group") { - var user = new User(); - if (args.Parameters[1].Contains(".")) + var user = new User(); + if (args.Parameters[1].Split('.').Count()==4) + + //changed to support dot character in usernames + //if (args.Parameters[1].Contains(".")) + user.Address = args.Parameters[1]; else user.Name = args.Parameters[1]; From bc2fdf3eabe0a2213c5188353a4de372d0174dbd Mon Sep 17 00:00:00 2001 From: k0rd Date: Fri, 17 Feb 2012 03:12:10 -0500 Subject: [PATCH 33/73] add gems and demonite to genore --- TShockAPI/Commands.cs | 71 ++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 66 insertions(+), 5 deletions(-) diff --git a/TShockAPI/Commands.cs b/TShockAPI/Commands.cs index f685cbd4..5000f618 100755 --- a/TShockAPI/Commands.cs +++ b/TShockAPI/Commands.cs @@ -1091,7 +1091,7 @@ namespace TShockAPI if (args.Parameters.Count < 1) { - ply.SendMessage("Picking a random ore!", Color.Green); + ply.SendMessage("Picking a random ore!", Color.Green); //should this be a help message instead? num = WorldGen.genRand.Next(6); } else if (args.Parameters[0] == "cobalt") @@ -1117,8 +1117,35 @@ namespace TShockAPI else if (args.Parameters[0] == "gold") { num = 5; + } + else if (args.Parameters[0] == "demonite") + { + num = 7; + } + else if (args.Parameters[0] == "sapphire") + { + num = 8; + } + else if (args.Parameters[0] == "ruby") + { + num = 9; + } + else if (args.Parameters[0] == "emerald") + { + num = 10; + } + else if (args.Parameters[0] == "topaz") + { + num = 11; + } + else if (args.Parameters[0] == "amethyst") + { + num = 12; + } + else if (args.Parameters[0] == "diamond") + { + num = 13; } - else { num = 2; @@ -1153,7 +1180,41 @@ namespace TShockAPI num = 9; num3 *= 1.1f; } - + else if (num == 7) + { + num = 22; + num3 *= 1; + } + else if (num == 8) + { + num = 63; + num3 *= .80f; + } + else if (num == 9) + { + num = 64; + num3 *=1; + } + else if (num == 10) + { + num = 65; + num3 *= 1; + } + else if (num == 11) + { + num = 66; + num3 *= 1; + } + else if (num == 12) + { + num = 67; + num3 *= 1; + } + else if (num == 13) + { + num = 68; + num3 *= 1; + } else { num = 111; @@ -1171,11 +1232,11 @@ namespace TShockAPI { int i2 = WorldGen.genRand.Next(100, Main.maxTilesX - 100); double num6 = Main.worldSurface; - if ((num == 108) || (num == 6) || (num == 7) || (num == 8) || (num == 9)) + if ((num == 108) || (num == 6) || (num == 7) || (num == 8) || (num == 9) ||((num > 62) && (num < 69))) { num6 = Main.rockLayer; } - if (num == 111) + if ((num == 111) || (num == 22) || (num == 68)) { num6 = (Main.rockLayer + Main.rockLayer + (double)Main.maxTilesY) / 3.0; } From 1bc785f39820395c5e4f7e72fb653c342b339575 Mon Sep 17 00:00:00 2001 From: stevenh Date: Mon, 20 Feb 2012 10:56:06 +0000 Subject: [PATCH 34/73] Fixes #392 making user group changes take effect on active players instantly --- TShockAPI/DB/UserManager.cs | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/TShockAPI/DB/UserManager.cs b/TShockAPI/DB/UserManager.cs index 0b6ba990..afb0d8dc 100644 --- a/TShockAPI/DB/UserManager.cs +++ b/TShockAPI/DB/UserManager.cs @@ -19,6 +19,7 @@ using System; using System.Data; using System.IO; using System.Collections.Generic; +using System.Linq; using MySql.Data.MySqlClient; using System.Text.RegularExpressions; @@ -130,11 +131,18 @@ namespace TShockAPI.DB { try { - if (!TShock.Groups.GroupExists(group)) + Group grp = TShock.Groups.GetGroupByName(group); + if (null == grp) throw new GroupNotExistsException(group); if (database.Query("UPDATE Users SET UserGroup = @0 WHERE Username = @1;", group, user.Name) == 0) throw new UserNotExistException(user.Name); + + // Update player group reference for any logged in player + foreach (var player in TShock.Players.Where(p => null != p && p.UserAccountName == user.Name)) + { + player.Group = grp; + } } catch (Exception ex) { From 4c09e7b66ffae774c7033b2a68cf25a105ab6406 Mon Sep 17 00:00:00 2001 From: stevenh Date: Mon, 20 Feb 2012 10:58:46 +0000 Subject: [PATCH 35/73] Potential fix for #390 fixing the return of group.Permissions listing permissions as negated permissions Added TotalPermissions method to get the combined total permissions as used for HasPermissions Added totalpermissions to output of /v2/group/read output in RestAPI --- TShockAPI/Group.cs | 38 ++++++++++++++++++++++++++++++++--- TShockAPI/Rest/RestManager.cs | 3 ++- 2 files changed, 37 insertions(+), 4 deletions(-) diff --git a/TShockAPI/Group.cs b/TShockAPI/Group.cs index b1a44a5e..8e36e51d 100644 --- a/TShockAPI/Group.cs +++ b/TShockAPI/Group.cs @@ -16,6 +16,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ using System; +using System.Linq; using System.Collections.Generic; namespace TShockAPI @@ -59,7 +60,7 @@ namespace TShockAPI get { List all = new List(permissions); - permissions.ForEach(p => all.Add("!" + p)); + negatedpermissions.ForEach(p => all.Add("!" + p)); return string.Join(",", all); } set @@ -71,6 +72,36 @@ namespace TShockAPI } } + public List TotalPermissions + { + get + { + var cur = this; + var traversed = new List(); + HashSet all = new HashSet(); + while (cur != null) + { + foreach (var perm in cur.permissions) + { + all.Add(perm); + } + + foreach (var perm in cur.negatedpermissions) + { + all.Remove(perm); + } + + if (traversed.Contains(cur)) + { + throw new Exception("Infinite group parenting ({0})".SFormat(cur.Name)); + } + traversed.Add(cur); + cur = cur.Parent; + } + return all.ToList(); + } + } + public byte R = 255; public byte G = 255; public byte B = 255; @@ -85,12 +116,13 @@ namespace TShockAPI public virtual bool HasPermission(string permission) { + if (string.IsNullOrEmpty(permission)) + return true; + var cur = this; var traversed = new List(); while (cur != null) { - if (string.IsNullOrEmpty(permission)) - return true; if (cur.negatedpermissions.Contains(permission)) return false; if (cur.permissions.Contains(permission)) diff --git a/TShockAPI/Rest/RestManager.cs b/TShockAPI/Rest/RestManager.cs index ed79492e..2efd2d65 100644 --- a/TShockAPI/Rest/RestManager.cs +++ b/TShockAPI/Rest/RestManager.cs @@ -584,7 +584,8 @@ namespace TShockAPI {"parent", group.ParentName}, {"chatcolor", group.ChatColor}, {"permissions", group.permissions}, - {"negatedpermissions", group.negatedpermissions} + {"negatedpermissions", group.negatedpermissions}, + {"totalpermissions", group.TotalPermissions} }; } From a3e838c1ce15fc9520816944006b7a4cc4452fca Mon Sep 17 00:00:00 2001 From: stevenh Date: Mon, 20 Feb 2012 11:10:48 +0000 Subject: [PATCH 36/73] Updated HttpServer to latest head + a fix for Connection: TE which was causing all RestAPI calls from TE supporting clients to fail --- HttpBins/HttpServer.dll | Bin 156160 -> 171520 bytes HttpBins/HttpServer.pdb | Bin 456192 -> 421376 bytes HttpBins/HttpServer.xml | 12371 +++++++++++++++++++------------------- 3 files changed, 6188 insertions(+), 6183 deletions(-) diff --git a/HttpBins/HttpServer.dll b/HttpBins/HttpServer.dll index bf54306832eaeb2d4da67c8d86ab9460073802ac..b87662e724ec8bfdf78914203892e463f5f3c11f 100644 GIT binary patch literal 171520 zcmb?^37izg6?bhg?+7 z2?t!D5=to-^!@ir{R&t9jh5dZ|7nGHr}~FGsrxd|_x)AH-p}{l@8~(jhIwIdRCw5N z4M!Yy{PDs3hQntygbR*um~(u?t`ny;92XopYe;o04QmR_ZcGDNnn0x*vQ4_$P3sbmYNOZvI7A#nQlizo`juqn9YvMgHy8Kpjo}>OMzJ zA&+#|QV|{h-gZpiJ0|cb33NkAOxn`qqyU;uS_bJN7Kg#B)q>w38lPwW|9?AD{EYnB)I5s=n7N zU-oqW_1*z%`aE^oZZBMM`5$wA6L0?Y<`>_&_nn>AU+~49{f>F`gs0YzYB>7H-woXB z>ly!e;q&wVdFima*Z#1_XX|?|IQzm$dz|<8y0ak$6NrBfWdz76r#S_;pbiR=lES@atAyGDS9nDJiJ&I}G$pzfs&s@z z(5oDS;hT)kOnN$eenUmpYwBWRxB(hRRu$5Y>vv`DjV7;0qqvD~8!B|1$`FO0SL}lb zixR=&3gr#%sjtCiaBHc@kKceF1TR$NkxOORnKAn67_BA-uRk1PR5?aeDCQ(Z)nasy zyC;nNHSHZYM~O;5+k2$bpdWk!lrvI%6b9|;2g2;* z6#FB5iB;zK10?0mG}E|e%<@n-s9ddIZO^cF*aC95wm?98m1LAtY)n9S=oB_vJctE> zrX`ig=Fu*Y2BfoT5R~l=_6>jJWc>*m6I*#|7Rt^)r#O%WsD``Ka5pTtglco0wGhVf zeR%m_JIX7eLyigv#g>pWAYwu`XM+ccz2YDQ?$)r?0(6c1DWbI55}KMT!@T+mVx=u55n{})|7!Fy~5JYxE#GdEFfU`Bpe2rHKa><-`6|zhfhrqEa9c+n< z=Wm5ym_?UH)n$@37?K)RG^(W>IjuNHtJ$`P-7RVK4{MsY-?i>6=nk) zsqgJ?hcrtphNDa4G*emr_GM=&qrU?%S_xV&!}`Mj2OukH>&Q+)akM#lCc?+55DF{F zNVm{ytEAK+^p`Vbuhd14iufWT1q)d=ClM?{C9*ob9zAM{J2GzsW2JkEU^pPk-^D{~ zuSz$iykG=fps}`eD$*Wh(|XuWbsfh6nmXyECd|}BChPYIxWNN*CnT?|5v;1cVC&0* zd146uPFjGpt*W*@l~FOiLugM5p9)TiYO2x5Qmgt7i-zos8nLUc6Y3^}EU*YGi|3C- zHr1IXw_8sRUxTV%BU*mMtVw@ z?PZMWJ~h%)e>G;dww+#EIchv)Lx;=y6=U3{oNc5yEnZZiT6CDY)Q-07jp_y|IclKl zF-q%WNRi!0D;q^))Fag(Z#ZaMZNUiRIsv*|-Q5jW#$_~IbpHs$RW+1TeDr9

yk zH@FvJ_%PydH_9*3yl`TSpBCc}iSft9co=9Dx0Mn#BJc7)@=0vvs=wgMKPO+@1v!?` zo1%w8t;BmM3{9@n0uy(eYPxOkX0uBgi_oofDk$+OHAo=zR65X6474i)(FuWgDfN{= zs7D>>Xa?Gif#`%lyp%A?AUpJ9I?$YQc634@UP>5hV!fun9|9>1wln2gd=u7O!Z3~w zvRq;?y3Bu)6923+4@MGF=DB4d=ma5nF=cLw0v*FZQf4|K5HF_8=w5Y7$1;$VnNA4A zizzcYUmfVUa&~k=AYOjF%t=#T_Hz|7@9nPJ0o5P|7L9G_kui2*M7CoWL1Qo2!@kfB z#%{JB%sX5(jLKA#QyAl%f)Ud7cSl_ffM0I_3{D8`701D?Td;@twAHfnqrHS@!TLNq z06_N@(zEqeeRfo}?BCh1jYfX8%ugkX=;ytx(=0aP1>=z*CMXUZt8||w$-aPOQ~sXt z3=qLnwN)5h(v3Rp3RT}=$Bt^G-9yTfpt*YSIo}WaxeDV$6wfUVLnbC-4fF#U6xtH> z_M{rYnXKeui&RL=!U7c4|V z!CW}2R3g}mB|BO`u!bIc!+}FF#?GcrDRIls4JJ@Kl3?*PNLZ81B@@A!R7fs~flr!H zI@pJyRPhU>Q=JY_BVLqJ=Zr*71^W>U3B5tuCCRkaAw&M-n%=rHXAUF}l)b4XPIFPJR zQCpoE{%fes3e24|eyp=h(wqpXz4u%Nu=n<~aA?kFJ%MQ`*{zPgN%NtMq ze@o7vM8$dyD^Tj7fZ{1Hd=0q=Tas5{CZXoV6yXJpa2J8RUC9J#GFv3(x;ELn_Y= zD&-fA%PZ2M(rIpBPmv0yiR3{BjXpP+74ko0%jwaH^L+5Bo;2U7{?2!a)QN5(w@nPdX2 zz%Y7bjIUc8pw%E4dKMJl^jp2u8P};vy5Dlu>8Sb5I_kO`J3n@fiC{Y9&YDhh2KWKG zKONl3X+|{mtC78Pp2|@-I6#7VJ~}=R6QH4yh%+Ig7hqt^>Td4@3hUJd2f_v25ISB@ ztwR%syu&%A(!DPtrKB^F`JJ|Z6PS}xWRQ;1SSOoYT0qXcOfZwu{T;GDnb|AHV;AIA zrFGq>on{U*!CzPp>2`+oW#nYd@0-ZU+S-4`DfogH)i$VHj*mK&L;Czka9LRB`KnT# zRqOd`IO|8LuhgN_DhBDkNv{bpm|@K84;iJ0<{k%utmjg!W7cJ@?!BXNl5S4(fOs4N ziBp9*4O0K2Z;4ogx$((x?r|7Hdt7M>?@p)^oj?;uohvT2yGUvLW`jDEuyc@mSpfZc8*S#Mo6KWdg!!* zL*ceyDAL!h5WPCm?u|7YBZ}{Q`UZy~oSCr2W*0ixCMFk+Q?Yqf;;h7^bU5=yfw@lH z3gy9|hw?VCycl5)FPQ>-mS{I?6}=(q5x2ocQ+HYcyK4F&J&a4{5Y^jn!Xt1aq@(fI!+X1}o0>aw_~7 zDcH83i`*Um1f&+sM$+QD4;C0l0igR!_$TR%_I2E(e{=^&+Xm5LppLeV=TFeMi_>rc z%9HRHNHVH%cjMstCmNR_$OPR9N~0RL#*Ul6$N;Vrw}UGhb50e%Lw}rggMVPw#S!=` z&c423A8p+}r`vyI*r+V1RC&>gG}u>QzRz4Z=f{4I8_Ypzg1J$lIsPZqScE|xKsAZr zKL{Qq;9ptjo(hg(Kphhs9>)TyRB#+FSW&;z)`iP?uC1fxJQ^(LkKEtbVyIrjbMAt{ zK@DR1?%?ijFdhPj-=b3d1|+11dL&X6e#fdF2j4E}PAIGn+f@a}BjDglFX1MGuOVNd zqMHmAXRET(+S%qp#!f-MD!CzZfTKg%IVQqQ z82k&B>X(p9r4zJ)uX2J9aZzb5eCh`bN#l3qkX&I~Pmh(s)|@I7wnhB0QT%EX$4g}- zDIG=?I=7F5!Uk_4Z6nt3lfVD|d#?to>>T?ANA?^C$7F})Rfglrk~={Q#6)EL!z(Q% zsVsDHiWfj6Y@RNI@rd!Y-+GY!mK+R#e@<};LY20sSruE6UTFuiYhjV`otI(ae=7ZV z6!tW-!^yVnhF{s6xDP4m{TMo7vw)Y4ZSMltwd9w7(u60&V$MAfR$u(N(#aZjIojcrAJ%|3dL-7`;np zHP^q4KsD~{$fk{doVL2Jxjya_&Y@?!yrs{=3Be3CjLMSeGpn!?tzy z{aZ>r^lUa=f^s~L4Nmi}aesowozZ|FOaqOsGCY}9a}ad3 z$Z2M+B?9y;oU||wYDmY44`z2*J8O=o^hhivnnEHtL#M>{7Rx^oprABu$-myS`P0A> z!ICI{SHW&LZ_24|*+lSL#6nZ$TDz%$PM$c}1Fa;ShBSiiShZHB{4)_-f}~RZS>Uk< zHtn17JpUJTi?p)_N$7;U0CtPTLM*IP7?D`80M?F4qNG?E&Y`g5VIYeV^XXHaNe6u> zhRdc7fVrO+qzRyNSG@@Nhf;o5@2`~Q-x~6Bn?-M}EJN>BA%nQySBd-SZ5LJOXJUl^ zVqs^lVWAZ+kE1PKph#y9}s&EFGdl4ZSPm$IwlUjSbd@ERmIfSbQ;AK0Hl zIu)^W%Efp5OA$%7pU`3&8kQqecoH(u9+T{<5|$Z+5F@-D0sN(?_2Lr{BltbM zAfb3YAaO5;OL0Ki4`Vc1f}~^ng^|l%kVIQ;8j(lvR-8os7b2URa2d=IX(Ta&)(&A~Ix=~V`0@6y z=MqS+8-a;)XgN*;{lfcz_3lsbD$=kD!z{%Wv$eI0sggEwJ%>oCKK<0lE~rS}h3|8i z8iB@xyVC6d$3t}i$n#jP&v(KX?p0}g#qBG?1fZ527#D8LI)Y1se+ zayEPuBBqw@i+ucZ=_rPqs%q<}kPb#2-LI`~>)bW5A&=Qjujp1?zN)|-W(Xxh=GBY< zn+^Dj=B*eDV4po?LI69grU^?Sv7fMAqBe3L5UC=*P3GUqg2f`Zc^RZ=FPK&;*nbWp z%is~54=Jk(J8MJN+wSW6@}ItKvLY=%C^3Ujq#Uv>mEc|oeg<( zv9_$3w_t$~l~wLRN?B(^ZERh34?7W{smT6d4eoi*gRC$)&TTQQVZ3*fvID65oQ_>% z)=MOHH|Pe>Al1P&`r2-DuNJzjN2`*ZPnqc&tFFpK{SN28u6hc2!!DS&88HzvIqV)d z>!B!UMILBm_=itF<68VLT=fvHgB7QvK-z&ZIbH@AiOP3_(k=!EQ^Ur@^@t}EpkNF* zak`OCV-X@i>FMMnqQ~3600~+WOdg3`f*=s#Zms#vVw%U+28D;}jh)R<``w}KjPv^` za7Sul3uVD73%RZpkzfI$Gm{F*1QXN0A(M&?`FJK=3~(J~+R>$u1|4Ly9%~p9*>!wR zgw?t6ehOWGdYy0M&O%nvUd+#nyYnXVrRz`UYvacA{dsXYR&HEgy8d*&Hf}uMpNiWL z^{S^5v3xVI4eaBL*7>?WzK_FDII;V$q^72iNY!KoNB^_ZPhry?!b3g@Rt4x(kN^H`>Bk;%C@vXTm?vLCn#&a$|4 z3T`S}sKFhg>71ox0IZFMGyzFvEIwR8=iW*!G+*Fz3yv%H8$V|#9 z^uYZOjBR@GaS9nHol%g$%c*+gxC4k(L^ zYFykBDNM<^x#U$h0wegP10%J6PEz9Nc4Jca6RTgC|n{HlyIqP z>w=gJkP2==2!(wG4zs2|8ltL(NBcvLbWG@NbFxpa7ur0lC~IoU!9RzCX|{M9eoCw^ zr)6*a$`bhrc9 z+Ph#L$un;-j=_}IRYTRMy0I)lTV`?ap zIQa+{g~eh87EPS}j4eU;P>JxTD-Ux{%`a8n2@!uj#uMt=}`KxUTg%#eeAeTyHxseVM8;kO3M}}>8(wyZ%x zDltR<4X&;1&pYfj?hB{#7(md$AFBZCPtd`Czqmg^`Bo3tlVec7S>4WE|1(+|T7euW z@;@bt)>?>&VEQQ6{zxSJ4T{qKD3|Dfr=+_0(OE86H6wkDs~8)SuAFDV=pyl*EaIOx zM-IS*n9R+Kt-xKes)p-feH*xK%E3)Xa|1bQpcjB%9tr64Fp!K!A}RMnVyW2CBqLXa zI_z*O7y1ST^+PVq@>n)EKR3?}&g_7OBT<*H<*RsTzvBy zpb9XI*n?RAhTf<%@$3#y44Rk;U|`~gS9bozXa<$&y1YuvHJ%YsQu6$Q0bxVjqZOIU zk%)SP)FE&{1>JwkvvBaA!w;$-D(&xu{SZ-m)+DkBcx@;6~_O$iNxeH+8a;Q#EOK^KBnwPN1e?;J#RH0Wc6}$kp zN>@OdcNx8OAj*T6PO|AQZC!Kb)N&fGBM<>o*?9g=Lf=JpXB{l2-P7d7vw6%~!oRdglKwH3x_HIa4`PDRPG8yib9I#lwU{De)r+nnern?NM!go`D2vE#|Zw4bX_%WBGU|;a!sd}z;Ve;GyUgCXEs1*Sd*-8kVh!E*b@<(`sBQD zF%k}!;3wc*HC)Pkwg*?}99~GTvO`TOlS}EOf|n7%e+56fPrs6pSU`zcV(|(?+J~;4 z{^Q||Qe+y*x>}RdI|ZV5G%NiWhYp2ve6J!iRh)u8r6!ZhXdMOn0IFOjmkcIpPAfIo zJ3;bui|{*U#b5ef=D!$8~zu~7UT^nF} zpH=D7d$>5w{N+Rug^@W^74!}@aqr^qa1|x;J}L$$~fMlkrBauA=5F+3Lv z@xsR=1(wg`d(mS{d01Jq1bqsD^z#v%h{nr>$M(t(p5>CVwszDl>Ofb|GjPYLqH>pt zd{Uahwd$mN#bol1ny)@Tsv-lWpw1Gwm!TAf>YN(paNKj6*|Ris8HoFYUw~uT)44S6 z!u$i8HxDIdx@NXue9V5I&`%|b=4!0_w%VQ3dueQ6BB|gj{GiL+r)$>#57;W?ZK`($ zEY&`%$o!nbz_KqMi}F&@yi%m${%Ts=r$TC9GhxPBg@qnW1~yy15vJO<;8}8X>*f@z zF3!5%C{D)z1~K*dsB#G$|64ek$1SDK-T@9fcY(P#F{8?SP1UgLQ21PBuIj3qB=%Kh zPXvS6bMTKe<`hnX$A1~a({?ntQEMaTbxn!E53cK)ifON@) zjbbs`{SIgVAL6Wz9({?$qP)Y@F}lqN0*>Z>Uc;N~*Ad{yl<8F9%sT9->=RGnlTAu01=r ztL^f1MEy{;Q<#z0eXSz_w4Lbt-LeFdF;I)9``?3*d9j2aF#>c1+PYh(j`k~%kvt(C zbmdskDE-_?kmCT#Aw5yn>5RK`(vdSEF355AP4`Ywt)+VOkS?bRtB!>98v2RS&h7e~ zLlK?l^ti(+dm46+6^}AzqWU%Ki)~c@>H3_WgA_g%PJbmm!dG zx)S*efXQh@vcH}S9ToQ{;NC|bdAEC7d^6FN9lu>k`{;OF0=d6|MAS^ySIZnY zIk>%n6C7-)urwDZ{Pq&}{!wLZI#gSKr)4gp7oVlw>M&lAqB^|FSnc4ZyWUqCpte6y z*U8jk8o^qbd2uWj=&ekryrZMXSU$rULQekaSz0NBNKQ)@zp}!r1S3!Vw9*MHEM7`g z_$kls5~XTFx73N3W&s<#&HyoEfGu>P3uYx*ALF2hnUs~`6fHt~88GT<8M;OhTj>ND zc-f>38)tquv%r!0X!|`CZvhx#(GXxgDmtMBXWntu%m8~JI@gkz>bn?2;@JI zb)As5jz|CD<4VKEtjqDSCz?Ih&*Qf^j#~_-SxZ~k9dR)%z)qN_G}FPo7Lzyan@@}c{ zR74}wYlKu(2OXXZI!I)lk8tJwilE#d(H5NM1#y1@_`5v+6@PxTPL2y=)#o%bUo86^ ze>enL21Bn{nd-sEO4FSA^JXXe-C;(i=mi+@qochr*Cha=7RLPvI{0IBv+)TU=c3vAo0Nl(Kl~eNYWMhqIM~M@>^e#J z?^ssa^a;xOYyU-Ye}WGFm<8DQ1Rea*gIRxqa!<>8TME4&0zIhW9qh*ov#~8c2>Ov)orN7m~{>N||Qcd!#S8sz-Cc?!dX*nCK}8*UlJD_{%nGeoSyy+N5s1a|`=>-rJF z$C@i2RA-{+czhValM|G7OF-rpmqNZnDPLl6=R{D87K3x0oE2emBP;PFZz_h-t{2zl zDLJj%1@DED@Om#Po6tM$*g?dNOzgR1O2NRD;Wo4`Ii0IFywceJ+8v{k9Cr^I*p$+^ zx7itUMS1QpQ^Y<*c9Fh~Y4+u}Q4>#7o%exlv)yBG)_Whda?^x+A4`$RN*v>Wwc7$l z{Wtq(r+IO_o(RhIco@syf+@SHN9D8N1xw3hwR{}Yt`b^52q{R!Z&-*p9p-Sf#xv~ z78}`CIw24*r6mj$?a3rcrxRjaK9Yg^AaD`Wn{4ScICCCOyB!4`A1-n`%?w_Agkcjf zE_o#Q=t!2JiuT6SZF8cW1MFzRNpAqK4suBA2(1HV5#W^`W`xywLBG7g3>(DZzwelZ z9MKRt=$DNAFr+x8z4&{e%adkw4b%<+WWR_!@yj%Frw5k7|=daLgq& z4D)~V@Lw^l3sAuN!G0Ykuy{xytbs6ck0ZDezIX=tLL?jQAxPX8P&zNHkHTSj%97)p z5SqSyoP$M^;MXH~n%SG%3)o>NC{(*xk;1q<|6=@9heMHI(hJ8#>58FohG(1LX)6E`$`lWn#yjyu7y( z@4o89-yWS(_^s=d#&6F~N&NOA>kmMMRjUFTudI^XDre8<+%oY5@nhzbsbzTHT@ZqD-MAic$(bYu?{@g+j+EX+6G%fA@O}BGebb>x=`0c zRsX44zZ|PE_fW@Dh9V{q*bwrE;^N5ZkYH8^?JUX;q; z20^q|Hu3(rm(x;c^W-MX1M@WWx#~FPrwbIl=1Wi_*cQp@{hO_I06Z-RCvBE6Fym=r zC$u%@vu)jKvpB38du1CR(%|t^Q|3-;4^!qL#qE(`D?4|-ub}xNFo|Fp%qbD<0H0`H zb}HmNo^mF5!Xx%b(}F#r#OS6oZqQVQ4?z*pGlWdelfE7|KZYSagve`$u)YQg!}>B? z+z}p&QpoXDBpqNqiOq!<$wE8X01Mr0a1MJd8VclKd!B-8KzWSJ!A=Y{5zz-hiZQVr*Q1m$^MDE`;P{Rzb1)`fo$vMuY}&c(h( z!NeJL=h(Tf98h#r1UWPvmd~d@a1HO;p7lPl+@TY>W&ls?jAZx(I1eFF{M^I(JYJzG5?kDJE zz~cm+4S0s2ivceaKeZfM9b2787h?z*2&K23$zc z-+-$L1{kn{V4wl3348LN!FU5QwE%k>P(!en0euMeHeevZ1Ov7t*vEh!2__mamSB9sp&Lx;`z~uxp3|K*MfB~xsW*Trm!GQ)m zPH>O`&k!7Jz{>=O7_g4uPy^m4ILv_02@W^lYl0&TsOSN3qyd!#vka&qm~B8Gf};!= zNN}_PLkZ>>FoIyN0pkdcF<>IWu?EZ}IL?5>2#z=47=plng#_~qIF;Z81C|nm23$-~ zG+;Twd;@MKSYW`t1ScBs7{NjVo+dcSfENi)HsB3{MFzZ2&}_gL1g9AAJweHUOdUXr z0W}1R4d?^V(27}u!2^jo<1~0EF?Q7=Jd&6zUE@EV_za7u5HGR#AmTGEog#F$w|_yb~0^CJ8`F(zFR&h!MvbT7i)i80NKa6R!A77rrEd?NB6N{mTG zghvo#`V-;Zh%w!X@I>O}7EdF-*5bp6xgt0E!CT$uHC%7;$;2xxKAm`_#pe^>VDXj2 zH(GoH@hXe&Ail}s2Z?XCcn$F_7C%RPtHrMp-)8Y!#H%e{Pkg(@pAg?+@z=z6TAb(w ze3!-5#CKaRprPW)?&ZzX=*;(Ljou=sJ}H5NZj{2Pm3B>t_% zZxC}g#N_`z@lzImM*KUAzbD30FbbdP4g7nHYlyLD68ZNbe%9iF#Lrngl=u%8k0gHH z;&H@(w0H_J_bQFN2NAEe_$cBREk1$xC5!Q5!g&oZTfBt$6^qX$#$qZ;|59QsrXswY z_%(}fCjPU<_Yl8s@fza4So{p}8y3Gz{HDe0h}T*C0dbqfpA)}j@pr^;Tb$|x{Eo%d z#DBH8miS$Z`x5`n;wIwt7Vk*>p2eex-?w-?@!u_;Li~Zn2N8d0@lnJdS$qQVKP<*8 zHs>{bZ1ED}e_DJY@h28vP5i0FtB60d_%7mqS^N<3=NA8#_}>;kPyB_&uMvM~@p|H~ zEdGS}KNf#Y{I$i&&49nLxHIv$7S|E~*W$j!-&tHB-eB=I#NS&yk{Fwtk$sLM#*wrL zPbPLOo=Kdrcowm1F}^A?uOVsi$;6(;rxT|vK9?A0m!kYGC&q!A2(KWPnsHi%p}JB z-3T8=j9a}CE)wIGOoZ|3_IV8r7B3;j{nW_+Tw>f$jqv5fxIYu&6~z54UQOKJ;`@nl z(;^E0IPpM>pCiV`f8_r%G4}r>yp9-m0V2Gf7~B65{)8BJ0wVl1ag)Ur4Zzr!kNi`_ z*p`lPju@ME5$;Qjjpqm#h_U+|;q8dA)g0k5#Mmp2@Lt5&D30*{#MtMJ@FB$5-Hq@Z zV(iXFxJZmm*$6Kt#WC|CfoeQyAfO#MmK>@OonGU`6;7V(el?_*>%LEl&0Y9%pf9;yo;`BOY(@7Q}m6 z+(f*W#UqLLws;)z1dAsV?_=>y;)xc|BA#UN3B;2vZYJK>;w8jWEWVt0KZ|cB-rwST zh^Jco2=O$FpCX=a@pHs8EPjpn0E^!to@wz%#0OgZ1@S=^S8NV^u*H?chge)oe5l2P zh!3-PJL1DF9z}eF#p8*Ow0M8wSr#8eJlo=x=P1mdGD#yg7VHO#U29OAhaUrKz8 z#n%xZYw@kb$60(o@$nWvP8?YL4DmdRUnM@l;&+Kdi$5YRTKom^e2c#)USKgEW0==) zqQy1D3oY(Le3HcjiLpT(wV$EHi!2^V+-&hU;!`Z1OkA>fCUJ|!vxpa4jN_YF|66=A z@u?P{PJEih=MtZ8@s-49SbPKV5{vI3KGWg{iO;fl4e>85evWvl#jg^dZSh;g=UDs! z@iL1)CqCEW?}^W|IMWaKe2Z&{FR&Odn8W(t;(^2$Sv-{ZVv9!-Ut;li;!7=_MtqsY zM-X3b@iD|#SiFGvN{bg0UuE%9;;SvbnD`otmlH3y_-5j3Exw2NI*T76zTV=eiC0+s zBJoO#-ypuh;`PKgTKoy|DvQ4+zRBW>{=hd|TuFS3#odW-wYZ-6Hj4)lueNv_;@d4A zNqmRJ6aPBG8){n7x47mWR0=n@cE=5;9Xt2L zVVvC_N2sLI-}vl>>j2PD&`zLnpnX9HfsO_hK`kKe)LjDNj?!%)?tDA};tHLs-giJ; zopHtEApL4k56~8%A)p;WyMj0(bCl!A!QPlX9D5D6L|Qj3hPA+w{T}o(s15W1=-;64 zL0LyBe1JwZfC`}PL1RF834)piIvjKy=p@kTpz}aif^G!iNg?$x=qb=z&>NulKsa)% z{tHSaaO)b>2jqjc0qqPL584lO2xu;70jL#p4(Kw_3efGK2SL99JrBYcP}IAie}cXS zxvo;3K|MkJK{%G9Mu2t)O$HqZItmnmN}ykWE(To-x)pRE=yA}qpjSa}gFXU%393Ma zR)P2trOiQ2pkW}q2V3m}ngKcz#JA8c0xbbu0J<7<6X+h$qoAijFM-y9{to&av;may z@DfrGULLF(LEC{wgZ2VV1sw)D7PJs_8t7cm6`&hHcY+=QJqdaN^cT>2(5IkpL0$?s zPeHvw13_DZMuPSLO#vMYngimy0vChM23-oe9<&;Sx2vi(pg(|K1N{~BG3Y;_L>l+# zL3N;hpe;eeLA!w_fo6hcgH8aQ0y+zH5okH+7SO$*UxS_jy#jg*^daaA5KoF#g7Tog zpuwOWK)Zk@fTn|v038oH8FU8de9%>(RUo{8NIe4j9q2{So1phW{{npn!h2g)4QMma zAkem;QJ_6R`-2Vz9RoTMbSh{W=yK3X&>f&(fqo16Bj|O|-$0*$z5yjG(f&cbKm$NS zL3mq+8VA}JbP(uhP!ZGuS_--ZbRFn6(EXq%K+l2x1bPSb571X2rwZ*K)C05yXb5OW z(5|3~paVd&K=VNS;^LX03qjX_ZU+4l^cd*(pqD{ypbtR*27M30xj5Awghvon0kl16 z3}|oAG|=Io<3J~YP6wR_x)O9F=q}L1pr=6mq}>~!_duV4{tHTVLi-2x0r{Y9Ks$rR zgZ2X*0-6h20BQxD1G)^f0(3j*LC|kN&x8I9dKdIh5FTk)ZfCTAP)|^Q&{m)kpxr@} zK?j140`W_({4D4%Ko^6q1>Fj|4}>Ru)w7^iL2rXT0(}YMIjbsAEogI46KEJ{ENCCl z3=rRI6Mz;ysl{fpxz)Hk5gNNaNJGp0h$6j z7&HeoAG8>BHt15&a?mQ!9iaO`kAa>7Jr8;nv<|c$^fBlQ(08C@4fK-6Pxu)I%ts(C_K##A6ZW@cUlaCMWIqy?GKG}`nZio4I|_Tb zWtUm@RI(E#z=>q>C@7*GLw1F*hmw6m*!{_l^BG`Ivi$f(cGxJgbHsI9vP*>>MD{vi zHzWI)usEQo!k2|j+W_C89>VqF`Y*EI3Hv_T+#qK0CfT9Fz9<1CD_HMGr ziR&uMUPbnNaXp{xgTkIc_6=cAwgHYOThYjjkFe}?vbEwm!Mg53c8a*}Kz6aPgUQ}3 zY+tfZ3!5kVxv-U%U7T{`<1w!Lbm^4%5Z`WFq`ZIah*x_bYUlv)zNk%d!@JzC%al$ zJWUj_{m8y3u61M+P0XSbS#3KBvO3-Wpd$&JB*4dHCky*mvd0Pgnq~h$R?D!4>{1Ev z0NHzlT}}2?VXr5v8^fh!zZ2K9$rgrCoW*3v2|Hf`h;hv!s}*%H*<&QY6zjSN*`?w- zlI%UgZcX+nVF!|ZUD)1azYsP@w(pkA*dwdc{T4lRI7M7PC5x{fBfxsH%Z2?5SuM^B zWbYN%C&@l1>_cSV6828Ap9zasw?ym}WHVba-E+w{340pZ$-*uqyHMC;EqfSQo$*w% z%O${GWY-8gn(QaSZfCXW7Ha9w%X^k=07w z+p=RUyFFQ*Sb^-760O0q-7Sl=+fjh;vDye=R@^5%zwv^&^?sZDc11dmY)MguR69Vquq(T`p{kurgj0$v!5oN0a?T z*n=#)FWKbI%winb3Bv9~R=1X+WKS2@0c0N(winsggzaM4B-zv`CiV@M%V95JKOs9! z*uRmzSlHLC>mSLk7T4ce*I!xo4$H12`-X(QoUB&gGO~J3a4K0{$0v&GXo_OmgdIgzPw2O`>>#qMB>+B46Scw`vM-1$Uvy>ye20Aq!{T#4Dtuo8 zyl>ez$>zpTvKPsY74~;zX9@cV*>i-wo9sivt|I%Quvd|-+=VHePgZAfhGkDCTQ32Q zCp$&hBgmdF>~yjZ3Oj-9JHqZlwr(ub-NCYhE!&sub`l^@R<8pp$sQrDJf?3d;0x^a zgbT&>L$cQi`xaSkT(6LQU0k0b`?avYCfj#c%5X2)F~Z(L_Ap_WTlONd3&iy-vX={c z3RykDIDzbA;yPPgg`G+ETVW?zb~noow=6y>2XS_zIQ_^@5SAaNHf$%ddbyJz8%Tiv zU?VNOR9Jld5%Wo5|4Q~fM>e8nR=AeSqu&VONt~E$sDVKNj{T_Ubi$lf9B9%Qv?j3lc?-OGiSZ?ZcG zi}!3J3t>I7rwaQmb|}MD!hUMm^<;I;<2$}EWeM;C*~ECJ`=n(bBCEx@lWd&?xPk1B z!d^l4Fk#Ont7qn?k=0o&Bzvg@IF{^cVGpzHRI*Qt>t5D%v}N(meyCakG?LZbNEbbw@ zP}rNuo+IqlWLF7$0ogUeE+PA|uy`X(*v*9<%*1NRz9X)9wjb*uVeuk2bo>(-;7e?;hhv2Oh^$^tzD@QRaebBS`NBR+ z_8wt*M}0aKG2pHSI(~5-LALWmX1on1b(w840AF?5RK zaFeLC2Y&1$Tcz=U`a2JkAm)5|&Z(JU`bQ5^Is$_|;ig{|jpvK;O>>3`_QFrLt!Ml> zNqiZEJ~+$47YQI^{fua5HE?_Vj3}Sk^pV$sSYBEEOuSAt5lld2r0LoBm|+)#&++2e z9A-3p+^jMFFW&^|i>l_IQyh(lxk@)+N7gC!!*gt<8-?AK>?&bL;Y}5#n}qGfus4%k zI~H+c&lTQ6$Cmr>EAQ}l2?2}yK(JOi;q@H6lcRNsE7c&MKA1M2X67F8evnw<6dE7ruMq8{*Bk0U7Vfh^oDVHIT!^>K|D5>A}7T zqnvz+i8#S;7z~fx&f8Q%jn?0z&XRa+@0oF_I!z zB=khbgyb1!mhpPDmxZ>BR`dpnp0T1!k$+SJcw`ke99e@+siP8XN|_x!4ZIL$1Tyvo*pQmmz$F0D9~(DTY0a4;yvHB>q5rLq8Gs{u$e}+S6F7kyV(ZSaG`=W*FYDG?cVCAQAzL!5s$?Ov&rQRY)36;Tl}!RR^i!BGE%zlq7tEyp~ydNS#qIjRjJL z!x@ZybR=$oLjcSwUx`T$6VG2I&%Q_Ln$SoTb0%s@BKNo|*iA#}sb+Uw zE!DuOYVbZN4(`OM9&1#d{I8J&M~*}=KsR9mH^8w0CNABz4iL;>YSL%&ME=RTO>y|p zuLR*+u4?y{H+(1M<>`3KTR2D@>RjW{Gn_0Ay_{xt(tOdf{)pwuls^$2y#6o-x@X&~ z(jIVb0bj(P40)Jc&vP-=L+_jq57XIgoLGtlhX zi^TZhs#j4~)F_{WXG8w+R$reDjzCtXIbMUPb@B! z2vLHC611Cc{<<5I{@09F8+GEa1^qomw0!h)w7l56qp&5*cSq3`?~ba3t!KTI3?>lL zzB{U8+*v5!{GS>36v>yZDwc1x&X=yp7b$Hz-;Qx5-=7(`B>A#!#PaQ=^Q9~DMM|5_ zw_{w%_h-h%87AnN-C``?&N^SZB44Dm>3loJm3)6@+)0uzd)!#QebER}zjQ^u=(0AQ zZ^yWj?@z>SbJp&Tela#neHgho#hK_XN{^6@=6$UX33`W?tKV%2LsQ)$uWF%}p6@9~ z!Zq@(Y>bYN17RhG&J1B`!~JnZr^q%g-oZieMT5c%$D9Hd0UhHcwo0n!5l8-`=U+Q|E{l1-*U@uv%=2#@J<;8l1$wumXG6?$ zeS1%>50~H1RLB7O&|m%bVJC$Er`^1)o4<;0cB}A;e?pIhuc~bD{?0@=JrBNtlS=8g zudwgj0_n6e9mbk~SZ;0mYwTrutcPCl@Ml9#hG$`lIB90ya2CDOO42QUfnF}^tCRd* ziaPa&<*tPUl}K_G>bs&Um3DhXWx);-I_-_ik}1D}N9<%c(myR`CwOu4!LSsJ9erUs zw9zmz1w*!c>_JBDpc%?h-6{)wtui`X{jQB6NC(Bj9A!Q&KwemAwTL||4!w^dIWKqv zAehTUB(8qP2+Qs?KN{ILWJ~g!f?C&3@o^}nL|+{y0Luhv#qDhMAFMdqs%{PO6z$qc z=S5+xo_8we6&Xku7)bF5BvoQa(_)~{k2_{jPKYvpi*!z>9@av$`nwza#{2t-6utXg zUOl!=q}}n*ETTY^48LREZuINGu#v{jVQD(j4W$U$3K)^5#K9= zqoM4@tnSg7qn>{q>7MIW0(l1(+vpk8of}}Y&%=jgJ^wJIgx5S}8!ed``khUUv&u7%ebpB7o^CysZ)v%w{{%hj?1nvBleAHfS zXEQ|;$u5er*~O8w>+Rl^%OkXSAswWFDpb37EaH0%T0O9L-42qXA8cLObv=RIG(i%4 zSE++U`RA-fClnu6oYOR<{cr{J40m>TO(?rEKXg0hR&e4Zgv24cDzY&Ks7#4F1zH?vHsWZ@{1kO`? z!I6k7a{-s{H;l&ha*4}d$kP!Q^oB*?qdt1HuXmcIw&RJSsy+P@*FqnsS?bw%a||wG z!_G6WbcL-Y$o6IFoR9VEu}>3$a-79uWT!XKT_HpwG^8RLgAe2(-m{U%n!{4JI0*_iKF+^{#0CqMPEqu$MQud z#C++Bd?CfA=b#Zfn@rN>9rdVugH@NEY#tjR z>)A0`qYqu^bX-j9jz-p;H1JKH)d^33z;hj1Bz9)(hewR6Ym$0jpKYGn4(1>>-uZY8 zzJ`pcTbAF)ZGh^c1P9?GmvBx6{a7bhrj)bljQ0=XPM68A?EoD_2M>;o$P|Pm; zmJ{YO|xi@I#`|Z7Z`)^6V-Wema*D?z@e&K?6a%tUzZuGCpGkS9<{aoW8sGG%iTwtYuBl5RoP(+p044Av%_-~} z2DUmAet)qopDL+u4CWyZY?{b7I}vsiwiU(8tDO;?0KfVnLpm9k0Jqw*Sf!QyiA{2~ zeqSbwg@nI_Ft#mWN`U_4MHHjlmI%somu2FQ-B#;QQ1;hzpO@qQ1hIDrCj3Szlk58( z^44+x9FI%TA??@W{siJ*g}PyU%wq;3SrMN7!=~L63KMRAI|K8?(4UF{^miXY(K!wZMgk5lfl&EkXTg)Q+-(2YHMR2K5#RJg~! z?Nx*l@j`F?S%DEY|E}0h?txVpmSx3TF$Pr^GAVgSVY_bv+~yR=AU?nR7g-G$m zd`k+0>3qm0<9|ZFeWG>6uWq@)0(cGXsRQa?ae_^q2%kblH_>Lt`S%;~dLSs*1IADG zw@kZS59qwrdDfkqYT0EwqbbJHW*9WMC~k)^XU9eW*$jsD>b>5iFPpq7{;`W_Y|u9K zW+V#727(SYwJz>Y(80eg?oZG-J8IC-^PZw-xAZnV6h32Gp2`{@c_pUtjcoD+T~0j*=ySv$NFIa6MOvTluyPoTMSu#1;dg=fR6v_iRWfB{LJFZuZ68Q$^tz$KUsQ^9+z zF$(i8MQ2aGPmz)d7+(3Q-x7;8$i?Ui+O0vv!LC8LhDem>V7Acwj3Vdn>v=IBhAzEF zAfJYE&zsX@x_rj8^uB~BeZY&n7P#~wSngM88@+(CC(fHwJ0n}@mhdigy$kiXn9$~G z(B-iwG@p=u2dzy-`v|zNr7o0mC&C+{5xwPbHOd>s&`lR#x}S{Ya0@)9OF+$5I`x~U zf|FpNxRoavl!I@cO53)X4!?EPyy`-=lS-#%1lLfX1$@39{l2Sy4;d~J`Q0CqA(cz< zHR|55x#j57qI$J#q6LdUD z)LpAbr0PBwWkVmN(oNZnyFJ9kDFpVzJspQJ}v+b(f6Y(0z-l_5J8 zj9;fR_0_l+9T!0j<587#?Ka4*NrLj-_6R-v2DnEVinJTcc@ct0G!X({J*~nmKn%Ag zn$t{U#oY>C@L_VS`!K19AQT9tngV2`+`BNUHh3M%pNzIAiH}3#T5hk$-09p3%kt~u zy7+Y_!~TKRjPb{9uXs_1{YeT$VRFeHGcK%e;@xQtYYF4UZ$jMK(%%qP6^@BQF;ew5 z80u{#+|uU9W2oL;|KCL{Z2yC0?5=$}6cJDRONx!mD&Zs^nWp^~$hb=+)OQgM^ zxj4=2-15OGtnR{?cy(5$bhANkoK)Sa3j3x^Yk@;T73xwnb!-_hfz*ouj#J@Fjusx7*svI`Ufp+Ofz&A+D$rpz4NU1Sg|v#E|oGg(;}KG9e;nQ6A48h4nmjY4#SjI z6=#Z`7pPQt8)q^8W>6UIl-~y$j3;};SJ=7ki%_M1A}!BJg>7`10v8_#+C2F%v?^?! z3P0T_0o*Rv&eBf>51>KewNseHe1xP}%Ttj+|4O^BID9_7O=%hd+eVd_E`5Tqj=vv5 zR-@VJ?t#+D$B#OBne>d($CRx7e)WDR+-0JJ!JQn*9;MP6;6Vx}TiC$~tEORA$T6dK zNVOv$&6XvJ-f>}=8po+WFu0!~ri=JyJWlW&mAahi*JsNgI_iq#__Z(j>Njrz4;F_y zN51yGGSxHONgQws_#cpXWvX|$pE&e!PGKqi#VGR1)Mnvqajnldr?6zk*>8of&O(t1|6u5cbNxf*n)DCnHMV}f0IpCUO)f^!an^4#J|@&7FDPf+&1O8oy7 z_a}hAr?B=>&?4?T)kB=M%ecDo!L`5;-ImYsQ(HWh!h6AKxKuj9>A1kCt5Z&J23Y@S zN}Fm~0zNnsKMEda(POUm_yu?;SSmg(XXBznd22_Z=a9Vk^84(3!ss51ryhn}7_t8c zxt1Z3sx;q+ua}cQD&Tntr3Fj}=Ywy;r%^7zm5q$+iq81>3Sc_GxP$JXI@N;NRRmK% zRSZ4Nz&yj_{V0X`LsSlSRa(FQ{vY*w3G$EBXcRn0D>$yx(d~6gXmxrgWV!Z#lI2ol z`olW?zfqkNi0Xfy=rKK_y>hL-u^umjh?}(2%i)1e1E$)aCV2(mfK{6t|4w=g28hBTuYz!l|81tehDM}Cgj{CrWIHpwOq&e(i-rgOz;o{cV(-c zmg@l$I#0B}1n;Nmz1|MtDBI5ox1vM1sYvg7$guWc_R(y~!Ab;am6nY6%qhr`=gT*= z8LsqNX^1^G*C_W|&8C;)xRsE5rYn$dIe>iQ1fS{*7okJ+F~iIHQH=PS z$Z7r(377jd0xlDEF0npvrPTdbQCQ@u_ZA!IUVH?*`jWbI_5;m{bk(b;w)oZv^Ra-y214i-_mzR+vzSR@Y5i>9>BO0N*E+_?7d4JXbnv zXGK=;e+@e*Q3DP)X0j#f$kP4+t*5rZ=C%k6`5 z@$dgO6@2P6>0ij^Bisex2I%{zuDTNjag*3-6^uv~N5PHsLa(J zYM4UOccMyVYNw|&GvI@vSVq7J4TZzxc-v^+-lyfx`^AaiXsz0!P%ixz~ zzZLXznpvBh$#FZbmhxdY2(~hps!iah2R`|gstdQ*PCfD6tz4>CI90>mM17=zfr*{D zbDC)p36UTrzmmNdpuXfl4)>D(0GqfuR(B6UE-~V2DObYOUBbTt9%adGwPvMOtJ0=U z(@9;U>4Yx56dd3#WT{n}_Owc**l8?btdPOo2t_q>Hsj{23-|&()e_D_NfTiUev|qx zzv)A4)RZn17BJW>VLx>;%5@9Nm6YtdB=T8wmsd*Z@G;ZE-dtT@#oGnE0h*L~xUSwp zA=Ta#tDHny)ZnK4^HEu4L#WNdhVi+3m~;*c_zkWkaFhPFD)Q(0ZXvE{qUi5eBP#WD zBkMb@t0lNaKr+B{KXAl)j4js-?qLlXd8;wID-6oyTuN&M<$46irM%!)#7hOEQ7q)) zLKdhlBcd?Kvm8$xelMQy;FA86Dhqze+PD`#RfWFjDDMM@PBge4i6x?Y9~e1skVf~U z_agxCE4nAelDRyRU~wu-Thp)AsIA6EeQ8pmI@N0Cs|(wu0%p$g1rH#-n#`~{@b8-O zAC&AdaNUgjbwy-zSv2(V@K2zva6N?2MVTd0l^3i+!1^J}is()g_;QuRYe69CIqJ8p zA0o|5?$TBxNh(P;erqZVL%LS_zhd?-^p!E+Ib?QDp(f{6>%eIK4wy)vuXg@Ju=Ses#OpjNHePu>=hc*5_m7(HpBh zX2^{w|02YWZd%e@F~}}f+#`})aBK0`$Oj(%xL{>ggS)i%Lx*qT!KRDduoZ#N6$e)! zq!(O+U#Zssrh>(ycIOx5v;O0>H9Qr`6L@V^1F*l+hS3neW{mHRLZ}ne@YP5{iVprB zkU=BZ8mdN5aTUcJ4SCR%DttCn zcsz&7t=N!{H`GStsplSBs2vZqZL}*Y25T&|QQfCwyVI;ddL(M)*%Njt`T8xFqftBo z&kn6PIqY7f+%>t0Rt(i9hg}NajoT=`RTgW*srF44{jD8ebh}AQd+;wnVYM-g)+0kN znH96!&4*{oaOl}_m7i!84J2+DgGoy7n9xIaM$e>4djpP++(MckjDgTE8^Cn$eA zy1kr9}!!f)4)4xIaPJznhfPi~AEa9uTdC^esgHHnDBq!|)U~F4WzOS6l<_ zmr@8Hg)V=RST+Nb!*C`+@9mK5jik}N|zBFQBgq=y@FRn zRJ>wGMMXqK)Xw~ra(YJj6tg{QkkPFI@86>(t>rKsaF8F5iXiyM@A+{v6$6HPaT6f=qczHZ9>s$WVG(5~FsI3_6 zlD?vP`j-v3wX%$Q;t=SQ&Jh)z429#wp(Mb9J%NNjzL5zb1Wc^8Jl`hI7IXrOSm}hH zKC4c8x+~@-kz~=RjXwK9{WBAB+ljd8 z9APkq#vCu$I1jXIJpJQ%s>~NK-$lro0arhQsnrJ5d!D^dR@UCsL|IS3B1cbKxKMXP zZ&u_(4xIa;NG(22Xwd;lvu3cw4TuwK8^=DuCrrq0U+WX%?3;OE+*eH}p>R5B9TJR> z+TdxcbvU*~%L~A~+{TK>&gKDNxn0+@+^)x~tmQTTC_Jncn#P*a( z*;9mdW+I#M=96GBIrYRdNpaRgoS1h~*>f>qHt`;cfLgUooG-U@{Su#fYZ8TsxtK1w z_Yt5ez0|3P`=1OO8Fqv1n+k`1e2pJr z`+r0Gv5p8KzG09@O%I`(opF%>j~66I63ZLin2>Z1<&u%-Zmn*bBn8@rDZPm){3Z93%q2wjSO_ zxxx#C_$)EaB@~}I!g_&Zp>&HOA8^(Ig909)158dFE|ceDeG}#95p~$3BrhzeigLD{yotyj}W&`rqtC zxLSJPRW1il^gXnSxMns5fgzNtAH4%KE7l!0YaJ=A)i4hh(B>$^+F_lEzc2O?f`wqU zpjwP!+C|H;WZ!gZlkoi%)D+8G9P-CE98hQA=qqMnnSu4L$DHGo-BShhRy?iD8f$5fb?Id|Y&EWI$ zCyl41Vh>WCO_EaGXkE4*aj5B7RV8#F0cXzqI@8nKbONrqyP`W1^mwLbrGv(52WnXr zHky?ItS2|2@_J|>+UA}$oBY*m;zk3ZzCm-gJjxG8p<)kUYQ&XZ5}k=s*R0ss9gZwe zn<85v@-HxTPF4IWdgizaTw3m%nMF~@w@@nff^#-AG|9bQvQs#{tDc~<10+^#O*!Q z2Yk^WC!wOagU1*3F(@C0fF8EYReVNb3Gzn$QvQ*gc$4z4rc)|b>}4eA^nYDf8@Mj& zgUkflqb7j5ve;(vmJXi{zb3`WO;yDch@(kpCVBWdNK=#oL#KW*4x;{Z+;I|c=o^{d zz)dH>bn2r-hs<^34AeGhtbUvQt(inn*|(h!TLCu3ba^bN*P4m2+*i@uDW61})M+-1 zM@ji4fHak$dB`T6CY4k9QmPCpt832VB#P?zVs!Ymd>sg^yfH>PdPVU(bV9f-94?we!b2kkGsndbtfTE~73I)kxE2gKWpC45 z&|W;E8{$E3&>k$U)tDo8Ex7Y$&uu6WC97Ge#V?S=%z6+2=k4ext70Ej3M)Qt7o=a! z{G0ks%$Z!n|G0T~9^yB7)!&iVGH|?H?npEP;!-+M^ha#&rgPf5+$?9$HGWvxF_iFJ zeIRPlHCIopLqg@QC5{!`5Vz9WRCkQzGK=;)qZaM*eCk6EQP;OrPP%wAlm|>qb)37XLwtikO~*0TY}2P&3Zf zj4yTwRC64~%y}}zxmU(*zaFt4@_oqi(U2RoSOBx(S4&u5Da_vV-b*ccExlJmXFFBl zRP4{4AigGDYRvY={A5lwlezjE2&k*r#_o&FRh;JWp@GD7{o132bM&6>Uu=<|A_e_6pjeNjhVqUYq~R70-8+&BJi!4>{G^yd_1a&)#d>!;VCF zTAO^2(8t*xJpBIFM*9TOue6L0>!;j_HlTtpvV$ncWFBILi;OA73fcuApmT&F=lHbaS$ zn&$C^WVn%Ja1=DEB2>N~+0d4;@`ZJvtB(L%<;i%|gS=CMG)AG&#U~tx(T~*j-Enw$ z$e`i>c#8KpO3JW!x;!(tVn1V2PH(;kV`yDC9f_O2CIZEe3Y!QEDA-i=glRrZ!F_xv z!yi9S5%y*JSqDYbbjo|c6T@^3XJJ##xWkd~>jbcm$1sE&<0AXFKma>>7X^UQ0v*GL zFZvo}i06kxHWh^p1gz>D{6w-J77OPfcYOXpW0NSq7qaWd8t>1ub$yIRJ;(lygiKRL zeJQ@fg4gxdHAU{Fc)G^XD-p;O`-wxfu&yaQj)!pc3Kx&B0wo-rM$=R71B39(eaRg^ z4fZDfQ54o2JBmP98@UtEOq{^wZYGn0(^`i(O)=UUvCNEeb96UQ?c+MRJF_`>6yAV| z;`3CPC3#FBmf6emc`i#eor0?A#BO=43uC`>hsQc%Y&}(>wr1Zg(<4g z%RipX*0B9kP|w2LJiI>`e-6+o8+yOI8Ut>Mf~GxXD!L4z<>O^|0hA}qB|Pa_fr>7# zpMsXUm5N+hlZmSH=7|pCoOyK)NnT6z_@Bp8U8+3mD}q0eS7t3m9sD*grG#(ONtl8R>#3=$}&ib;pr)VH+#65H@D6M-G@Z zbfF2O*R3YZ0F**8c+pi8yqc5B)}4n!cOD2hb3UENA~&4?=P?cP>G6_tr=`SuRcIr< zam}5PO_!qX6FzYeVQ5lj^2D!P@YP%@O7a#ZtLQ-dISD=1HTCCS2g&x12eNkP~#CI3xTZfATC{%y~ z1)};!M=f6gG&`k9rx`H8q{b68+2dWX5Kb%VtWeUq1tmea!%9?Pq%ha;;aZ?pc$0;) z%V%VwWl;B+pCFvO6xTR~sE-4qO?X5N&v6_UkhU%*H8|6poV-9;_o%z#4rK>|aKeDbW%n`n`<@hDO_ zAi$=hAm%07uHb>`2zPqW_=nrh$aLh7-ay3+-&&?4TE4I)h1MOXQH@}h5=ihovb#i$;?lc#nT$51LEr15n=wM?9= z4frPCfUfJ<6?9y%*__R=uAA#B(C5Cco=(dh&B@)fltY%NGtae z&1m7BRxE>XvQPP0##(cq9K1~gB^<1n3F$GZCrNRBRof73SOK^=3r{ooi%==W=V^6u zzZi$Z6qIuq(BTRrC_!4+IHm_KE3z%{ddYCtwmsCc&roc!@pnwP-Ipf4_D^xz$@vrzDGbOyrMLVNWETw(8?>KG(z087yy8XxPD7~?l!RcX9)DERZMiQz6+5^BE0Bv|W zd9$7>bLqfkNJLwwwOZ8SJao^fsoUx85sp`+)T9%7-y^OB&ti((tVyx);#_N^*QJT& zDNX`YJRbcvcV0=ITG&~pZiz2bPnKwWjDWxxBRa&hL+d~S(636k)`9mSYbv@FE?)ql zB|mN*=;kpx+#_I|h_3?^biEG5X*QBfMTvl}J&77s+>S{4(mEX6fR3z zr~VD_#C7Uo_{Q}gPZv1@Sf}2N7*$lq!IfYNh*zkrolTUyLgmO$T%j5fmLri`TAF8R zCZ+$46)M%gN4y0IPq{{YRA-*$imy>=en}HXUDH^Ouy|&fIs)FrP3i;7)JA5R+SG7i zfl5^O0u}35jsWY|GfqM#lY+aV5Wl;y7hpN7OTa8=IZrhZ&#Y$+Gv>6l*Rx!|e`Rh= zHJC^g@$h<D|spHqPEOqoQ=F#g}E=FF@^3%!Jvrfz>SF5F+j?GM+a^CU?X zdhi-b3Lm+)`2{MPI_+S~Hnz8NPHcOmQaR|OG$x*EO^fAh7A=u3&UD(B~~^hdK+O~m2S zg8x@L>qed$BJw#6y#|N4Ikznnh16AkR~3Eh>>B+WCkI|!KXzlOZ%wVqyQ zzK(pT={-Q?9MU|90M8w0%>IV+8S-!Av4{C14DPn1Z;Fk6$|0&kh^jJOjV4j<0+_RUziP4m(+bP0*+! zf9o%>R(QaKGml>U@F>nAb`>^0E#jj{{N&7sKrD{qO+MPR>Z@qG)M_*ht4OKGWN z0eCj`d1FEPwW8}$6wwf#Q6iL4eWPy!?WOe*4Ele)9M%6H<@nzUt^`*WSkX7A2efEI z&z|V(3_!?q5i;F`Y!@NhO{nW4)O8c;xd`>#g!(Q*eTU%g*)Z8+PM3u0qCd6eR+_tD zODU+Y8R(6kqVkqiNkJcQ!`0m9!{w{F|3p42dV+B_dEr8B`k7hAOhe*K#~dc|0u%kr zJd2qwh%;f?XTByzUSOi1nP)T8&^VJMCLD|i&L%G~(a+2Q#FQ|N?WVGYX>2F|MnA<5 zPQL#@Lg2_|Fov%af*$w(mi#HoSPJ{k>WSEhCphy=JjK_dwB8~6o|x4OzFKDqHJgC5 z-uaGo+Bps#I*ouszntj<-E;yDT`~P!H=O{kykMc!bP^~Qq5i3&-%;+UPwMxB@V*<( z;da3{b}@1@xiz$vQGoHa=La1BAb0!(obna zEu1o?>xVy@74Ga~ucisfX-w1iEMo1MI;$Ur!uf9%MKJ{@BV7IP_2h}0oKZ0D8>ByG z`@l)VUh!AMwt`%gu9{Ab)pdt7C#+_W?};fVzK?T!*hIpo4olxT;kN40x1rNqkj{Rg z-H7kG>=K_ngnZlA7?3VW7aEyc;(gD6aGJ!x-^=bo(25L)_gc zz_yh5PH^a+yah0}mHg0l_4lvx#62&HEVL~eE5)X5@%P>=wue%i#Q~*?n_zA*%^79p z7iDM@KX93GhKxZCXT30d!;~U)*HqDuk-;cV{6i$goEG(SzKD}ej})R|JOk}6#Rxr> zm`(rM^(ES_&Yk|eRazi5fRoftH(Q<>$SS`S!SIl6zGamfs9T;MWG{Wg1`I7YZksm` z(-wW5CnZ`S_!x%n)VP>H?>lor`n3$Sk$eQ=$l zD_pM-Lv1?cE_P2ygWcVC%|v7nwja*+x$$ax1Gz}`@lLh=%E$?E`gP(*Nb~sIsi*pp z7Q8sIcr9~dMQ7|zo4fd|gNZ z6W`16o_d|jC_sI8WAwS&n+bx6p06m|1?UnSUlvdQ_30XDr6|6{>?==Ahi$C@vGO^+ z7&Ze@A90O?V>tNc8R;1QOsa8XY1{^sjz7AOGB&F}F&Qr%bp?8#FNRY$q$+saKP8z( ziH$-;EUqy3jjc%zbP=P_C4_UpRQW_q0PD!P9KsHzCFg=Dj zBEZOx?G2au<;pDYi^9`)QK{(HR2F*9yd2?=XkEpV5$Uru2Sv)_i>fDbXfPe z`k%sA-+SWfr9hLybhz7*-^;l#V(+nsq- z){6<01>MPAj$itlbs>b{Wr9WXc6@v%IGemMZ>OJ%4Dz7q_Nd-^#pl=k$z^= zG;r3%aUQS3LtfyapV?GR_{=o!35)Kau17C!K#Aj})My9++_r~*bGcmtBFj#;2Le2g z#q>}2b#u{7eC`a}Alme$?l1(LxiN+S&@Xe-3E+JPFTM9Degd8Lb*Wp?pzx z`a7TpG##6JngM%z^$?(#&dt-PTo^V!?udU!z*LV8Dg5R{Jjw+tLLnN6hNp?ViCj#0 zzF6d48GoKGI{zKdbWVy`sZ6jCLzPqvgQ|<#R1b>tR}?U3fH4MfCB(}a6IYbuaCbQp zaLQS)VMe&=1RT>7>7aT@`)5vj`bf}due?6xIq^O|&BU4HiRDlUw>ZIr^gi~7aWfC) zA@{UsT?lU`pp-^3GIx||{LKVyzGmAD?&3Vav*g$z`r*s>gQ`3)gp=Hf9Sr{9Lx?|# zhPR`3gVWqB!f{}Rm)kY=jgE$i1tquxiN6F<=u@%pK?y6JfX#a-(L7XU5w5Q#Zb%b1 zW`)X&hGRtE1}e^I+p#RF15ua^-Ou5S2jbSLom@_{ug~YJDUm%$1jDd7581gh&fA!q z%xFC`66N*_m5sKcnX-;GKuJdm3vl~kLp+6i<>inJXHas1@RNrh`Uq99DLC>0xFojX zWfk0yh$XG-Wfe3yTu0`*BQagH?W5n#7-`sfvwZzFmYE4tPNvVpAA6&(nqZs8h{)^Q zTIuDv+mg+9Qk*)yl9Q&FovHl33s0UR?E|bt{(hr8q~k`M!fORyhQcxgCdAxkCCN4& z1+{aBnOUGd)Y{28eoscwthfPGnM3?>+ad0po{5N>LKX3^C`{*oTwAu|E9mkZbcI={ zDqKi|C_7J~R)U2Za|X195eHutAAF_$mf_S1wJ{3GZ7hD}7s^q;C-pn`JBz;46XXv8 z6n21Syf0dSVnql(gJ81&xb~K=w&#@-olJmy{tLm185tis^f}kxt)m<8*u$k_{7KprDDx^+|ee9O}YekFsxBR1~=*fN1^`dRrL%&4bo}cmA8T`(?5=rp- zh3t9rARGPtPi4b+IEqB|#9(#s#Z%t`35`T~n-Hs!@&u_o^l<`T^dw?Y9b+w}-w9IF zN!H`uwO0IY{U21nyofsWYvKB>aJ?x>@zVScYaQt7>7x;Elj2-#9v7iVcqPc%vDiQB zK3uI;=$(cAFFo`(rC9>;JL5}J#G$5-g_kooAmGr^k3k>jrV}`hewCX}0CdG?4Y#n2 z(TrmrD1UiX}cfUB;RFu#>Y8mEj{Aii;Dj55>ar~9#rMe5woQPD-dKJBdBF6Y<%xW|sgvtjwfvng>n#NkOa{OSW zN?~#B2QBiksTQR7)A=wMg&Tm%IF7EOk3!ZM%({3pNhJ4oVu zuqa;z5jY6PMS6(iD&G|MkM9KkT~!n!!!xf%%FY%|#jO~_W?si$=ezm~$&D>Tl8N{^ zfw-)e_NPGXPvhH2Y{>8*PGuvS@B8nG3)PEA@3uS{sXvkYXPk^Qm`KCmoG8ZaMEbJuWTeGJ zx~|p9NXv+{@}v=NBGT7=P8Mnlk?!w$GEy~>_MS9CaXCo8oO7~JHjyqkX_ixnlnv*^ zEYk(uL;GCGR zABgnCNlX4$BK>jFe5p|&ebwz`5!$CFr4T6_j!O*I8J6gX&gP+h=!v}nHSOgIjGm+% zZ-Ec`aN7HOFhR|FV~6R1&OqDZUd$o9iN35y5IZ5^q>>QeGkrf!`C633ur^Bq0HQp`%^>wa$Q7s|3Dp2tOT(;5$;Mwgmij;JdG>< z*hUCg-UgZG>u9bS4?RSy2wJSr{mfHwBS7qRNR}3^6K0*BhM_72Iw#Fv2meJ|B69p- zjz>SO^-ml9(^miBy?>(NwSr(2uhQc>a35}9Z-J47RvnZ|9bxBTh9Y9)c(6+g?4E#8 zvJRyZ5q9|yh^G_fkBA%lJnl{bH|}a9zUUA*A{!ywrAFey+o=)r3PPGK%F7XpF1o}; zX{mMvwmW^(L~5V~?SUxNb4v))8o$Hwi%kpXuN$7)!4D&s$is6C!)4s&;?wmy1v;8+ zE_lDgZF8YzzG#bVOi)(aiA#Ar2)LFo?>Fa#pU4a(}w48;5!|B@PAL=h&;k&a){pp zmL@uu)wVO7fiN>kuDG26vh+BwtcMgRApFsoc5R!IRweCQb!;?W5K$+FDb&MZif470!oJTwXC`GP`NX88;c$J)LlN8H-SruxMGR7!Dp8u2Voqd4D8dkH&hG#nUOAd-~=WjX%MGjn_c(*I1*r6No zpUv(#c5h~PIlHg0yMx{D*$sB5P-k?{>+Tchu{)wW#W0QCe{{d6dzxI=ooeTs?(cyo z(u3SWc6;|A&P#fboL8}1)q`SN%I?eTZf5sz4=R(?o>Xp)*)3-GqMqbGhM%YQ>=wLO z-Uy?;Ph8WPI3HvGx7pps?x*ZNekO(b=}b!NcXm~8dhXSm{D<=MT)0<>`+Ey|PU}l~xxFu?{wlk_v76eDe2V)u=!dfENBrgN zUdR47@$*~ke#Y)mc7tWaSyV<+_2cIu{5+Q3kJ%^xERs`8GWo0v&hm-BvHKjmFM{e5 z|L9NU{BwVLPClF5_Gjmv?Gr=z`AUAihM%{xyW?zXKXnF>TaVq511N^={4CF*=W*vy zjvnCWt>;jjAG159H9g-n@E+9io$UJa$mhp_)B;DI+o>ohs@Pp~?!yhy5(ag{!d3Tg za_PSm+@RVL`YDb&Goryr;u^%W@QwKZ&hsQAREn4aS^!!ho5S7AoHoK!EK6a14B)>U z@gR8D(>-1yB=VW|IZyzo3CHpyqdKtOR3ZhBq&Vv!E(#X{60qgB<#2VGR!{U~T2o23 zh*sEzr}Vl51%M_p8UW4=+*NlCqhUbZ5XV$T6Xk5#3urpWvP3?HSlWu2EXxL<0MIPv ztd^9AwqiD;Z}IuVx_I}yisj5xEmT0X7xS5Rnj)#&`0Qv;FH$^N5B_Iaj{XdHHADGt#aLd%U z9PTAWmfoS*iy+!Ypa9UXj6PyHFA{%nHGd7%KwKeGvAj(Y$JA`;1yDbAyVe0h>(X$ekN}4r97m0s3dL> zmvagQo)#G6=7~v6>&mowVkV=rJk+jl5jQaBr5?)PZQ@p@T@4ffx}DJtjP4XmnDcKO z=Uw6fracT45O;}XI!B(@klrG(oN3#D0zeNj+T)>mzgIja0mWgUe0(MEIZ3Vj7-R{c z?w(^#Ts4IpJt$T)XG5R{_@38`Oe^uuMl27BS0q-yq7#PQ2DrEQBTl`ym)g=x;#1~4 z4=4b%lViCIr~!5zzh&Ch-p6DUpdS!NikJ-)!0ny?X48f#EH4mTNyI6E?$nCxdQELU-y^Zld;ZTURM@^>KUWcdQ4 zrx*q0Ys~pFDYVBDGXV4lb9S|CaUuD`%rgaA*$!-mhWIg2v9Lv2x0U(@TK#o=b z6{%s;=bMM2YS)*`9Q48z@p*ts{&LxvIXmMkJ6><9S#lh+=#!QVe%}q>aoMo+M~> zk;3lzNu<-SOS%N^ElDHbE=d|CQ^i9`W95+9`@l0~_91q^XZPRi{t+SnU-T1(67WhDUZW#UWa^cs6#xD z)LD(^*Xj`GC-A|?bbBpPsbWyChv44W>v6bi*ykX-4bLS1bI&CIxo0j>LuMDGQSQ!2 z+lzQA(|lIGcq%Oy^_-S|7M8cA=@a17ExjD>fb?tOl7#uX;pB=ZkEUz3h0& z$n4qms4i}Xn=0zyU?#S``J_2zRe=Zm%VT0(|5>WxJzAJ%)&E5)bak>c}u zBjBU!Xmfo^Ye^2dFXi}zX<$y<^K)tQ~AXC4xZ7H3s%D2mGUh7A5S?5_mYBRknnKXLAZ~W9RqcJ0r78S zSN9a%BT~>`@pzPqDv#9{;kn?f4+F3(QRtZ| zegq%g-a3fJji2{-5G8P_m+gjI*7ys*&o{jB2=KH>|H40H_89mKnOzPyU)o1%>zdvPcTH2Oksq5v*32@e<$2={i&wvHQSC9b?zE9 z`xs%1no+5q)@&c1qqws^-m}Kz87-e(t!JqG<6$3&?n69}M|%d)ZlitS{t%^lY1RA~ z+~#$r1gKu9c5-`BO%3Wb1w7Qo^2L6 z$m}OG$h`y4=p&%&mV-KK@vM1U)5CGtD46=~yH;U^J;uAR?Y?Fz+f@a`7WkEpNZi{#efaK5PD z+JhP_X`LBP742Hr3;V>B)}6yryxsa-xL>gUu9StK?r1~(;`3Hd!2k0$&%*t_4Qbk6 z+q{Tp(UxSmx$SN|$44CU|9e|D%Bs_QVHw6PxV5Q?}t>>H}gf` zcEqDwKDA^iMzeB>QT*7E$G})JgH)Q`{9v%QPqB7gyJCykB_H==u`4i zB;LlJE%*SfYYDqgu)Buc2ibiTuGR@s9BH2!ZY_p)_#=`k#&no3@>xz@gHlZDK%?r6 z4%GX;=|JPi57GE&k}9t2NY8I~q#jEBLW*BHwt!D&X=ze?Wbax^C6mbA@#72i+%@Py zsUrW}YYI|Dd`w&dZLhWN?WNZtHn;Bmpp14ez^m2SVc@PPVWfkAJD zCS%U^s0p_Ws7b)7UZE!))lK6Rf;E) z#>;wQJ{hb;rFb=|8g~QjG-zwmBw1g0ni8!>QhGUJkwKJR1CiHE(2~YIW5jPn0rREOL`yl6m5Mg9?+^p*4@v$ZntfrYsOM80lEJDiP<# z$fe02f~NmAM#d#~6$x}*Ep%gYwTp8>@@^MelKi~jD&aU+)IzT$e<>ZBcN-8F7;$>5 zldG{ZjHiAm`2Z{saU@a>NG>9HY>Z^39Fbfoj9LJ3b{KU_`BOI6!N7R|Pz!O0$#YRk z9aW*&%Va{Qt75T%4l0PbcIVW-s+HKus3t&Cw-P@ZL{hgBzcZ>7y;G}2Ycal%!c~ev zsRLANv5C=QF*0?qY9sbJXqdv*SP^j&ZM5nrau{upkETviokd?pmE!r-W4OJhU9pby z&D5!?i&#^l(bm*Tb-GBWMIX}JojOl-6OCJG^zYO=R1dL*Hr+%`faM0I0+8ChP>?J(dw<1oe&0eBDqe{C@o$f%54UOvdOwq+4s@pTg27{<>dy7v^xV$=F z%HCq1rb(*JK4NKGPC-&__7$r&3Q%qK6^9L?+UzHaP&6b9)n=I(V-VHmSz?7jRGa<9 zUW2GM&lWlDDO{D^v(5oIKnyi#1kgERmu}Z0t=E{;fnu*gy?e!gzA$KNuWNy73|hsU z+qg|E6nhx`%b+@EQn+e^&ODRCeQMB@GbsiAw=r_G&N`JqGL6t8Eg9O`hd`T*oXyfc zQRj+1j4JK6X&(aZXH*lQSOy9HJP*o+Vi|;eAkHmfISAC65w+bP)L_w9)9hH2Owyk>apMHjNe|MLO?OR$&ZiZjBU^4cdck-pj=nMl=R=v91(H8GR;e(sqg~MM^0p zs5RJ?qOpTIg4W7Gy{*w0_2ZmpTVq9;gU+|E51Fa7(O4rc z&uc|H2R&`EzYkp7H~)^srsryog&WM_O} z%@m{0(5Pv~N7gJcpV0<+TE-r0w)nuH{y>#tyFtT%ZV*Ge>2Rcp=7@RSH5#8$W8El< zdJx(mr)PX;Rf&0wD#gv9%@f%@HSOMvGI_IT$7rs2GUH;{*q>%pg;mIx@;0%k7jagJ z>g4X&A@Q8a$bL8DfV@L=GiVRc0x`oN(k~0e8iPo`+$oM2sYdZ7K!l& zk$$;btTc%9%VKdhw~2+UL+%j+4eAZeaF008ps9?87_W7puIqU6B&J37SwG^&k_+eC?l&H_Wq@eDn(IN2haT?+D~&XP3z+MyLeh7 zPGOl?#E9g4D18~R;csK4Q&vyUGJYo1Bdf0q4bB?iLZh+s*{4XO+1)zs~9^9*)Q9{XXeF zkAosd5blvUEpiOu66n^*BG01^Etu^_4YMC~(VAvInn2!5ve#qBNdIm0j>>+^^O%Fa zPx`>~xCoSyht^W7L93^)}J_QBuVz7IBXEfvPNt=ThmC+m-OKbw6pJl zUJ>nh5YqFySH(m|Rd%Pk>(r~*=cRB}c3Isr`Knl8(8Zvw6OS4+9<+7hX@h2h_L_Lx zpqoK^O>EJK+u(Xpt&s@V%kZujrRQ=AK)K#G#1?~6>oxbjC5B^Qqdr{^oNtSJ2W#|v zY8&rA#UVzE?KA52^llc>^NF_DJ_qPMaVsNT^6!f)80q}IFGgx4*7W;6gZ7K*Z)0R+ zy)v(Zyfgy6FIF*UjU=>Hj2}vzH38z>E*3M=DQp+ZG_sG@Tc@^*7Y*{)FO%EFdKc%v z#6BD~r}E6K-xarh{%%lS{q8`~i!^Oj`Xk;QqMJc2>OU`bh@l4ctpBClAx1G;Xb-FZ zxc4J5-Jo&xp8}ezIWcp5#9J-0FQzyv#gzK1f%+SCbNxy3V=<9Yl{gxC#ruiCrNzv7 zcl~PI&p72WjaJp4r#=;140;)8ml!&nXjS5y$m`xc;;2E}lHd036^%z|8qMTBqerYy zsg!nj<7lJI&ROmK!q7I#;+&n{eGclBbBFp$jMuT)J#*Hn{bG(mgLBH{elg#mD{_8Q zUyFwfnw%r7uf-~Z<{;bw@uop{Alw15StD+P2gP;=O~uWh`wb_peGiFaj4Ewf`yOJ+ z&_cXP4fcD#aZu+5hrQp$QKV0Ub?UH#1~({^2{Zz3| zOia|sZr!j24son9s3(w=|Ikun%=tb;$r4U)p_s~OzvhJ0oqbB$S5llCZCZDDWe%e% zduzjljj-a$?Xm_jL`-`t0li&s%c2!VxKMdI;a}wJ`S01 z({nHPg(Rkn_?u%_<&FUgGpgd5YFIWhw1v4}%CIalv?aOEV{fykp*;dxME2K6Jd=B| z4<;i1+vv^6tFcn$XdMo+l*u}Bii47^G&x@*doaeT4Ec~j4f4ulhFoP3&Gj?on+6qw zmMJ$I)FE%3%939gbQWk?@{mEpLCcob7!sz+o&;L93~K~gszqIy&PdPM>&nMmwEA+j zp^+Y}FUO3fShOB&C~sk;+h;?$NFzHfe}=E2eB7Xd{7RtJjHpH4A4)!glL0#o5-CS~EoJt2O0UYEP+!1fg!)<%~x6%7xL9*4sL63q~>O#p@CkH(N+G#G7 zY;|$av!I>sLdn({4q5|RcNa>wddLMjM=1FNo?dbvqmAOdf_195%)XjLtFo!>_Li*- z+QGEG2JJ})~V65e+8k%Vp^lo{?T$RqYZL?qxGIKvfE^$ z>Cs}W?9YhS+SmHW%25U#E|}>bCyy9pH!AR5B}ZLD;dGzA+R6K4jc)W`EoVBkJN*;n z0!B5GXfcPAblpVxq{Df@GfD1r(BJ$OGW}Xk!QPELTq}zVI?$*q&H?l?=ntk1W3*9H zoY%_6*Tp4!*?*lp!$BMTQ{`}t>{}!6`lre37**Q$MYaOXHnh^l)&A-79)r3!-T<_W zk#4Os%5?8~SM){z1Bt+L(oM5_{yBhK4p#tRy~j96}$gEg|ZHMz{b zT`n+aKhPa=vq9-iE9?c*ev!l3g+L2sFM|d(y~(~)&Nk?Bpu6N+gKloR#9kzi8uS3r z-Ll;p9m}SsEqsgRM1yt$-6L0X36iEASNC4|qCvfTl>@zO(9~YjfL=9dRj(U>)*Ezb z|L-&ItyO<?iv{+25d%&8l%8F#0laR*Gwy9kU;j6AdaZIA%XA zml<>#(4%sbK{tW(F}c^E2Y?=z-Cm(sHpmy7`2$bLd5kK>KbuvmC*@9q_JH$g*>|l@ z?+DPdasi_nN%>nXHyF<6`yaEPm#qxvr$8^(D#4eWGRw|6X20T~;+%}Ys}AavQxJGv z-t#J@M|!DDz9Cm>WCx?`)SL26MwNEmXqkLdZf2xsGaF>%b@6c3Vxuh5$UX<*Hp-p` z4Mn((vcEy3uiuuJ8#Ds6x8-<7S~F~ta||NQuu0ykIk`4B$-5kc5l60IMAp}2>!0!k zhjycQS8mqGrV(hf{DM)XP5Ww_+#&;vD#hC9(7+bi%An;< zh6lFE!v?(>tyJ6PsMiq;ZQ@_iF@YU&jX_^TCkCoz${R$}z4#N^${^~uyJR;tRRf#6qL?KKUUdy*k^+Erfd2q~?nPU&@`DQ_OAtOyDaS z-JtWguz9ukS`IU4dGnV7U&|E^dM0pC+HVo(XYwD2$BZuSK{7w#Y&@+MWr2RJ2 z><^lE72nHTMwRyN=G}p!hW1VKHv&J%GYswL=9_@}8k%gePW>n^GqmIuW%5TkM$?eq z0nZUR*KpDd=_k3wAetflBv&xfZSZIL3ZqJ!)&W1u4TeT7@~GU&NRMhqZU~gevOx4ge>w2bVqoSbP#mbp1^N$PFVI1cz$;fS)2ZhqXFNPewX_QuQ}9ibbhWj6RbaTPWNlKhGfA9Z>2Yj7U%5 z-D&lngQ|sBRcmCEMbN9hGl(pLUUk$UvS9gC@;kbw$%5rm*#?ni!LM2xM3x1=D%A+- zwFug3kb}x_mVct*q*+Nw%`=E{8&VG#M0FcdD;en;3#;{vbV-C&wLw(3VU_i6y#C5? z@mG|Q)-Ms&#i8{MCaXn^D#g^obAol$7Dfw2RpAA=#%}OtiltIKTzE+k7frsW(U!u; ztZcR71C72Y?25D2(JdMsF2pKQ4K?U@Mu!+x32)Km!EAMSD{(Fq8AYT0*=pc6LOMrv z)fPs2R#{h7J7{dMuKHag`;ww-f;lSfLkd@EUtKf}D2Gv%J+o+buz_l8Xg3vA0d+C7 zg+;do8>;gR?ct)kfQB(zEcz9{7R*&g42l(R4(6$~+bM;`;@0AigZZlOzcgA=ToWu% zo*f#kFa9yuNUdbFPy|Z;3^rCf4ax*+syrVN=R#2c6jenU@g6&!WKPWT;)rGm{t#Xk zXBt_)l0$e|)F85a;YChHR7yL%c%ReIvU74mc%Rdt;+#eyyx3__r<{@y-d$v*!{LQR zL!((G-cB@#W|avu>$4b_FE>hvo2x;5>#j4aGl5CjD`CQY;c7KUl$q45|O3LJAs`?9} zRoUB07KVna?+n^gvKZ*7L5E7#sSzr9pXU4p;YO%zgM2O5sgbIsLG@df$&sqmpjMz= zuFf&22WXe8p$3tT9Hn9gk&Yatrf9@%;tDm}&`7c?)IA1~WLKzV27Qkdu2e4?WVI@j zSE}^}Q3|8gM+Q*}qt#x6GFlxBj8Q)`sX1Qqgx7?|shqEfa}MhEwa``SSw>ZYP9=?38w{EQImfHK{luxyC|#|3 zG5Sp2(rRPq>Ue97+z~GEU#+fW8nvt!d=u0>jgZ24PfYD}&;idxHU4XgljizYc*@m! zMl}J7WwP3@Y4*LKU8C|2XinPax=syeM6%R`rl@(0^j`TCwM=tzNla0nI_PLEO)AX29Yd_)YIQlxEe{a+@ro?q_xz2>IkDM z`_|THgzr~A`#PA$~1&GRl=w9S_?!Py41N1SkEFGwJ= z7bH;EHdluqbvSz?oP)dJw5b-4yU>(y0*wW2l|vibW>z?X-p`&B ze!`*6KcTa) zSX|U*arjv^+n~o9-5-8V-Oot3iPh>cSKY35V!1ct;qYp;+Mxx5FR0nP!Bb^ZzkNw9 zGl=$*Usf+Nsh?$^`f7CsoS=%?m>s4b$H38a^|nE@j(cBi zF^JX(AE>VkqBX(?>aa$L^M~*jwf|>IUC&syD$h|yBCp+H&sMdXw4|;H&=_!3H8zOGfTOCHL8QHp!bGh(Y3w+vRv1L%!%_8$K{P%b zRT~VV@!=Qj@l&`;dsw?K^{Xpnq62k45Cp626z73$S04agPNsvj3f~0vjke)&W#>yS0)p* zRqcLLc%jwA`C>b~tn47tS(bxHXF16G24eA88(6X``{Q<_h1dGjps(9q4Ybc7vUT~a z-wdLY2)O46?rtG+>GE%aNBHR9H4TSX4)93V^+|*%%HsmPXLW! zq-S{{YaSy#%L`c#7*5hlA#0_fu?@o7q-mU9*z(|A4xEPuI^YRgrHrVD_lYD~Hs0qT zsqY96iX>Z&8R0}h`$3TuYcM0NUsA1!29bWLW3>zE+9dswZVlFmHCTonJ`yizAw!O^(zzG@75yh%|Ii zr<|K3jVw$`x(`6 z?=P~B8AQFm$g=quf$sgqR*^x}`-`pq22t-Xw&of{y}#I6Z4mYTV(VRlsP`9J+YO@L zUt%3(q=g9IaFBtfw6`FWk=QRSrtFx?4{fM0@2ut!EvSZ1u99H;DG_ds}N9lx+2}UNMOF?fY5l9F%O8S?@8@ z<7R*Bbw+w_+TZ$@LwhgM-#V<3y{3Kt@Bqu7MI}*bZ))GcGr&q=v{-!Een;dSYm}ym zZ`<#Q4765d6K56B*OBwAeRXvSQn{RO9d=N%HN^VEAS#!kR-m5dd=_U9a8a~DR4x}= z1rEYFajT_4R4$iVr#UFuy3Fcp5S7aaYp{cot&!FUgQ#3aSywwK*}B5fv~*@@w1en< zganFq_&$)mpWKCvNh5e%g zvfO&wplqND>ky+#L2s-~wnRe;SIMXFueGvs32l(wIu<2eYqeukDbDVAhq}&MpRYOT zEY1{bStE@u=r~?Zv-TQvRmZkT)2-VZ6KxJohF6Oj)@DX@GUov9TdK{9SiMq-C#{Li1xYWSkt(@&_36g z)VbD7gXk>yTx+&Lboyu@s?y7W<}=dg>u$D|F`CQg>u$DQG@Nw4?q+K} zqbi%u*WF@$WDuRNyT#heXoH|Sy4BhqrPM1$W$C!2`Ig;Wm&-GyGkgoIT!Yq^Rsuy0 zqSm_5I>R7ptqZNb8X*tW;!bOzq0tKEPU~8O?!~;|F6$e@~7K@)s?@qeUTHv51NlUGL2FXr$ zCq00dEh(18LUvk`^q@7^pkSxb{uP#8tZ7X;y(AyDiVSMoX?fBk)>=lSL!L`oX$>uj z%koOndqiN-?g}hNLI0UW{r2v<`pLn#HKfrgiv});vR_+2~W&0|wD- z^eJnlK{Tg*+Io#qrA=$}r>#wfMl;-JtUU(N4EGspzd^M2eby?bTO!d{Xzlx~Rm!L) zKr`IutaA*a8SZn|P=jbyzS@czM62@E))a$iw*9=dz#v+AKX0wnNYc#sd272tw0?iV z8r+&v*X#E+)_9G0{r-|Q*U-q~`I5DQkzTdFWUXaHW&KXlOIEc;cC^EXNv~MnF{-p* z?({LxQ9~mgxzpuGrwR8rV*kbZnIW0(sT9?t@Q@cEd4|4BhAUZ>O*T!EoAed!76)Xy&lOQT6qR#v^pE8R3q`X z&eh^WYb75c#QUk8&jalcqZ&SuwZq!bSxbFKcv|vD)*+3=`fqz{rm+}$yFwX8ulSq ziEsG%-|U_k_89voV!&Mh?BhR;zP?&z9(WLfC=qqeJPu4}*^qm$Uz=p08l)spS0YIdaD^#uaA;%P@s~63>>n z-o>M-}QRdOl&mQ+|8R|>yuj8lp z_M|CccfQ=uI^7SLa|gS-*rnEsn_M_uT?;3cKT$PL+;!KErq&>~c-?8AZ#aG(v%8Pz zI{J~RZVCU&v+P2t1mWVQ71y&a;SBcAVORUO<8=GvGmoZ5UC-L5E&H4XSBY-?tbNMZ zX8`+XPPfm+OdZKodb3f9NpP)NG3aTW0;N%TQ|={d^JHOuXf2pX)i@6FDiA zB~H{WC$_*7eNL1_`)ECr%{8c9cYAO@YtFeW+wEK?ck{FMCs&E3@Ua9@rJz<+TgU1Y zbt~1+4|6tv8fP=Z>oC8}9Ma+TQ2J_p&y zT@LQ&ADHTv#QiM0QZC3pJfK${m=rVN6qo1k2W1L0nvP3HLYwc8zpHEIz zf?Ap-nt{h7sKmTnVm{FdK7P>-t}Qyl4T!FAanlgucZb3qaPU{6FI;>b60V0sc{!BN zgwi9pmZv|*LorKn0lT{8>lUkdblbjysrp&xdOUoTn9Tl(XG=_DAI(GjO5E%U>n^KB z?7y5{?eFfhOF8U`{q)3^{4~el*0+D9N4O>V&(Hr^sux`H>-_FvpA(uib<8Kmpe5PTpUQj(Tq)eo|BJV8fv@VS^4{m%8y+JueH}+d+oK?-e;d^E5Txw-0=B>cQ&HD=Q4-{aSQfqOgDMo8oN=DP;>_(-nuwTvx^N7@|_KB_*PYXun zLFaMKTq?a$xs8VNV^w=ZWxJ4)$5D%KzAtr!;h0^w7Gl^hzWJ%7e?jtUnSY9ewZ zSU4=-Ghw)R?NR!pvNU%2W65f?gs3)C%Z(V%s8#P@&2YKEN`Z9|sF+Ixqq535SFH}* zh$md4JUG3fJc-tRKH;eTFHFxeUGJ-GMAJlLqxe-q^Ll|wRR~>aQB2{gR!dfVp_WrC zORX1Dm2ZhDudYGuzVtY5?F_=M-*t_wy`$k>lIBLCISj{4QZU8(G1_VkNBc3_%i6OV zt36(rS2aK(Ub!(oUVRQBSI3`&Jfk*@jtI5iqS786DFecR(U`c{5+zo=2*j>34RF!p!u0;djIM=M zldILL6o$FRYHu`FwM0}WsAgtq(1fFC@XYUk@y(?5oNK~x%*+}S6VF@Ug)8Eish9L& zy)p4K$HiVMF^eTO>VJ;XtnF3b5q%5J?-%xtXO^$$2e;z5)pD|_$2XIf;m*vcv zRk(w*3iw*wsacEPIr!?+9E9f}JkR8C8{=(A-Gi?dB5GZkoIfggb%TV`kv5++2%~JY9?5>&*4ubqHUF@C``QgL0DQ?cP4rk;2zg zQo!GgdT++>0rOGs0Kx|l?nheOu7=ymhVZ47e*8_tUpf9RF^BQ(jl-ztFrJT~&Jq0G zg1@7n^EKE7el60!7U^G$_~R(&bx8j@q<!+KbJo0o%9C~PWhRZ>n?c6e`m`d%TD_z5x(8OY1Sj&?f%0pUir6C z!qoEP=I1Rn<-2fW-jn8j|36zUF27&W9LI;o)|B6eU7#an_krfqCHDz!_X9SYCcr03 zHVSML_^ki%rrXMEz||*89x|sl)lWj~oVS;ghWC_TV!pfSQU59PlTGW)Q|4EjJ`qDM z8~b><7rS8dqu^5I=I@lBHMN_6SpF2wue@TyQ)c02a9+y1O=>~C$n}s}yxE`etbfJk z+sY@$IybL_EOTe@2D5ohvnh{}{|_PkTK^%rSMDK`+5FvUw|l(9@*&(Uhr3c@CtDVx zgtu;9HlrqX>#~J2%H^huOOWdtk8pbI0rbw-XM9?E`SXVNIXxhKchGzSH9lZIv-!7( zJvFtY;sK=R&7iyim~eB9aJ#@gv2xrl&^Gm)`TFKZ{pCX2a>E;dZ!o_R%6W6)Q*v?w zcWYNRo6BR>TlP;(`8?ItjPy^M$EE!534Gc@_Q?07Umh2j^0{Mu)~wyqUvbv7Y{^ul zOxu>n%5Znp)X!J^Oz0o+_%0`Vmb!< z1^#+Vcjd0wl&!hS5pVX^TPk0a5%i+)Gw$)Wg}BFC7H)|3ZhZu?kpIf5A_H;2s!5fA zPvYA{gel*<9JLEqPy4T(^{=F1>$8=WI4^#>N-p>AX#HPRgm+gR1ouuNd{66#koQFEJs6?)xBdv@_v`Zy zdQ9^`)g18oIUGbFC6moZH+-%Naz5uc_VOu#<>vdXe{UX%{cGzVK*KLv|6FwzXOZJG zPfP47k6%4#l6qHp{9?i?kKamIQ@mG1gzwESMe@$xUDvx(rukv^| z*tb#66D8#+VPIytciA<~_%;c@uuv}V*sb#TorNZkI%<{2uQROjJ^;)rkGGSt?_NLi zso0Kd-i|VPC)q08WqcZtH^9|Jglv%Oj{uuiR_W%GsX`UC@2`PP|e8iym|XCXQxokuV>#N9K)P~a-J4l@iS?~Iq2$F*8WWLJ}tW9S29A+ znYV6d+gEHm75|m+{cmfjPs$Mf-DSV8zR!GU`{T9u$qaHIEQBWz zrv732Kh!>DKDixdD$K*%?~grYzP$YtxYvm%_o+AL&bi#9{(s)5wjs~g%}IggmjnK6 zd*7TJyx(qL$1ip6Xq$R4-mqhEPRhGvM;7=-!8BRSEpraWH!vLEyyK2J32)Dihii_< znK$7LAm#D+Yj&(N$K!7XJQ%;*=K2tF-HY(S_=f=#-UG;W&OEZ?vlpB*Uq;H5cXr3G z5&IvK=65#NAAtEI!skr+PH!&hxnSPY6bFsiiz;ouZotMsiO60TBCpYH!)PZw+ zYTZho(o*SDdsjk-JZTmJezEdp5~e2SEc4LT_s?C3G!v(s_FH!DpSaMcoWD$RE%d2p zR-xpQiYAo&{h3Wt^2?;IjZ)VO(x>+s>X{d$H=j4{J15Rt=u=;9l=KUI>XVdzbmzOK zrTjPV?3~voG~5%rbLXq)bqbv~O1(Gw9A7s|-W!FgPM@0dMo7YuvKv9qZDqaEie5?6 zD<$_zY_Cw;FVxaL{AK*8q&#OH*f|AXnEC8Z_7ttAbLJlrJ}TuuBqR5c_454x#W4;mjlPOWU8RpXzhe z#{uU|q0V^{_C4RB=ZyA;`jp?)-Z?MjZ*H$`__9#@Wug4bQa&v)%<^VeJKt}iPAm5k z?O$pr_p-p8meNkg?`?mq;j#Ef+P~E>;yu*fHZ|pcsr`wD%e}|jp9Z|A^`{M9><8`7 zHazarx_I2Db#c2`yiZy9TzlR8Z^zHIUpW6M6Wg_7{_Uo8*DL0K5A-~N^wi{MQP&eC z&jQ{t|JnH4cfEUlxy%BWm=Ep3Er+5p=7|28BRc$P;oi@Ldp{G7JuN((gI@R|WcVFz z&&^Ny-`X{K!Bg=kc9ktS3H%j+KiYLFe$o?b#2noTn*sB}&IP{`&b%PJ^}J_xJ?g(; z`~CS{oSXhAFut4NsRFA6)(gCB_Zt?Zz{xunyePR|l-_w!IQ*iN`J(h=JjPKoHO5gh zHOBGyBI^BOZfiHVc&jk^~BkNW2TkNJO@I1OcAJb9Aoj1hl*jQAU4#2<~7Ur=J+6k82= zM{F&==6Z4bKc`GGzlt;Euj5SlLi{g)e~3R?I?22k{}P}n`D*Dj^W~D*^l9dMC9|eC z;47NvCN`R^NiJ+O?=v3&>@kY~KaOuTG@4i7`wfleRf4(I96|CX@0Yy z5v%Mt!Yz_!n^}Tz2k`5q!Y2ft5_m?S!L7jOCicWXH=%Ln zaS5Lkcv|3DfnEvIGze@Km=Jhe;7Ng}1)dccn{em!9n}pJn5$V}%LJC+Gl7(xobV^~ zW5Xng6_^lsT;NH8rv#oBct+q^f!<{1icS901rN?%F!|2u-xc`S?BjxOxIoGjxL068 z;4y*61>SnWozowz{on=U{3*el5qMVM`YBSv6jHcX!U+iDk?>v#CrVjYF9pg781pCnS7a;K}Kv=d6UiGUja%*it67NcgP4=5od+ z1oo7(H;+sBOXW;yW-vB3gW-A!uNSyi;0b}J1b#`hr1fCXn zR-jiexdb)~Ob9$K@T9=gif>@b;{u!KGn^23Lf|QZX9SuBjI9^AUSLAtae*fUo)maW z;Aw$p1$qmG9)ZmQ69SJ5JgN8#rFMbG1)dOiQs60prv;uB=v^db3Opt7w7@e0&kFPw zG0l2`dj%d7ctT+P#S$y9S>RrQ#{?d~m=bbA!lyL$5~e>U@Pxoq0?!CME6^-v8c$%o zzy^Wq1vU#z2s|$Eq`=bx&kFP|WeN2H8w9Qw*eoz1@PxpV0#6A%E%1!MvjWY_gc5-b z3YQSmEHEMPxWJPFPYXOF@T@@7$n<-c5grqGLf|QZX9Sw%jJ6EEAW`W69P{O zJR{KTk(2`03+&w^JiMOx^#YFxJRvZS<1*;GmoxU1z%v5PD~P!b8^h3MT@0JOgnI=Z z6L>=4DS`C~#;zB5O5hoR_1%IOctYSQfoBAo9>yLMctT+>F{cEc5onUc+_#UE>`h5} zf%P{tyk6j5fyV@%8X*3RKr_g2y}jmx=cue34foBAo z<5H%;y#kL3JR#7$PD&8CUf^C0zn=KL0*?tiA@G#IGXmGYLDC33Ch&y7GjAl`yh%zH zxL)98Wld$xWn0SH$_|vhrtE)}y|e7YWgjnlsO%SIlgjJMmzFn`Z!N#Rd~f+{%HLdm zZ~2GH|E~Q1l%Fa8RrznqC(o#yQ8S}%#^xEx8Lyx5H#6>=@%b6g&UkS~ZAD{6Q^idc zJr#WwhbwNcxVz$`6%STCQSn^Gxr!;3vnv->US4^1Fa^N%zA>Pgjet1qiw zSKV6u^6F%Dw)%b5_f>zo`Ulm2t*)E3cvkPMqE0XGwW-!el=@a&Fq@`n$dB2_a z;=HQ5#=4bt8|zx@Zm7Gt?qJ>Fx}$Zkt9xVJTkGCk_x`#M)_tt*@9REWcdG6yb>FP} ze%%l2{#duHen)+#{;l=zsXtNwh5D!JpRJEIOl&A`XlPj6u(V-y!@7nI4O<%88oC?$ z8Zr$>8t!QLNW()7pKbVc!v*up=Fgme_58&A{qx^2|K$8n&wph8_vim%{$J4H@YHZ0h)VBdm+3yv+gXTet%{B*%o>}r-`|8f>i@z!HMZZV!#VqMr`@Re@tU%mw~ z24A$D2l%FI|*z0m9t+D{DOIeA1_-Bc+>nwz*85l0Q4?e z1GwoTYzE_dvDg&H_hOmyHy1PIvP+oqk{KHS|9uV1|INi=Er-`K{7-9{o@w||_89)f zaXNVd_V^}ZA9e~_HWe)^#Ww|~VNY~Ac45m*9okoq_BEJVa}h9?VqbPOuxo(19Q(6Z zm<8rae8p}(Vq46`_^R4svjwT}wKJ@nmztf}8R{@Aux?(BRr4D2agk*Whbt$VP$dM$QVuQRVk3CFO1bgQ|^yb-zI zjFs(MOs}~ErM%Vb$Cs1(u$oQbTSPaTdr;bYQQG@V+WZYlJAsluY7Uu4uwVN*?9qM! zd$f;YZ}uNi;^Ww#{U-KhzhhpHFPXdnUo5%Z{1~PG1f~BRrT-^N|1C=YFYL?y4tFMc z__|UI-&88Wmy{;r`$>~Myk|INH+Wk<Dj*)(9@S;o9~3;gwr{{xJM$4_5g z@efEjQ{eR#KSwxoGp39xb2Cjqs5ZPDekJ`K!OvzYgqS!_$(WB8|~#P5>W*|R>2@P##HCC2=+ zhOxgF7@y5>cJ^-I75<`@nBUg2oI7WJ9r$y#M=2Z^gRJRA1eRV8(Vtoc-<;Jvnrn$G8r76e$tDfNr4TMV7&l~PV z`jL4b0Q|M!|0ozu|I7JIsgj_5T__K;7KG(%c;Z50rY|Ht^CbM!(qBw8W>NKj07m<6 z`XW+z=gjGov0;5NbG=t!v`p=HD|;e`2NtvBLyNzMTt^o(m(m$6*-7cYB26^*;l;ll z6Qez=y{7zEnxlD@l4(osyTF*)OYR5U{;~%Fm2X=b*H3Yr*V_Ma<_TaPTS^MQBk&o4 zT8qXWSjJezj4UHtJ+7L-?$R#EZ`$5C{YMWx8Ki#?+K zt5ij4RtmK(QTml;H$t0A-KhN9D&g%ajvA%p?#a|zQGNBx`P2YWzFk>*14>YOwyY*S z_pg2snEx(424nwB+X| z97X!Vk^bCeln1Tr%2KvM`&7B~9pQ=gmvX64?_FO(PHKOt4&1fo=cr35AGm_$4_`qJ zN4b}s-8CKbEV~)-%F;Ihl9Q7#6Z)8GuL@>mAE6j9>!Fe-nX3UkyirsFY#gx6Y`~m7 z$>3{2z)!;5?c;AE@LhPCWL}9s5A*qC;3wnXB+RuJAT|N$VTPXq{1p5v!|XW~vE6_k zX8cm%Is2DkHk}51FQ5-AU^+0Lz~3aC{U}4qa{ME`<@kFL=b0v%PXcn)ZppO$!bAcK3<^eMR=!;EKW*+nEf%z(+FBXaiYoh^}fA;1h{nr3} z*d7ajdE8qF%+~?&#cS9vKCGDwf&Yeg5%Avx^vx!-2$*kq7X$NcKo6G9CBSb6oMfi@ zi-9i%#24RT@%XS-E(Ly?|1#jG1NyLCmH<=cHv&@*hF2KzRIPD}euZKp*zfO2obbaFY35Y!&do2lUM#T8y25*cxEY0s63W)*}3;*k!=~ z5zvGEbUE+`0kK;Uy8^L)2K2Eva3x?)lm9+=(F|^({|BSZ! z=4)sZPI1GM^Uc>Gxt{q3pbtANf$(=Ao4)zB!0$pHee*rocX-zT)}06YjPPGz;rTep zL-=oI0GMA0{3STyn`Z&>RdTf6$2Zal|A2P;=1;H#J@Xe>fxh{(K;w-7;{jsad9MPD zd9Ma0E^vbPT3|{5@vV37IKou|tG!!+nFZ*Z8t?T8&jy5?<6IwPUf_K1c3>I+J+shz z3&INoUWhM#dgdZPA17hn2Drq7RcRUlA&0OoJ#!^&OW#}}u*rK5FzWz))9l@Y@CHEN zw0Q4Bcq1TW)w>tr%>vuJzXfKS!0p~i;CBdY_dW>xPJz3;4*|a$&^On49|636-Fq0} zHvszPjou>&zX=d;6ndWne6#ljz&r4DMc=&5I}P{_?@NFm^1cH2Veg*+KjJ-xTn~6( zL-^wYKjD2Hm`?)w=I^|30zTw@8<;P6-$nTIfS&oW_kD!_Mc{9}9{}?Lpl^PUZw7ki z4}iWo=kdnCKLSD?yng|F(fbLY=br`M7g+5-1I$c;_5RO+ZxFb^|2N?01A68{|5=0= z0(v;Z`5eNF1YY9*J1~m@eRHY*pMXpK=K+`bzXe?7{}|@v3tOxW=3vM#>%?5!R{Ssg{0pjgEd?n5|t^QwtN$!1wzNz~2k#o4@fFApEz0zB%Dvi10~)_xX!}`5>T&dwVZI_(K9e;$I5PM+JV& zUjqF70zc_5MfgE~IpE*>E0N}N{%V9j3+S1D@Yf=ITHu%c%Ypd{Aasj=CE)k{b-+9! z@Jat_V16L*$9^-yKk-`t&-j}F&-z=C@~40}#qGBO{><*_(_16e`7Zxd;uWl+*lXj)K~(T zQi0QBJ-|#8SRP9PKSN+;Y(MZ70;^&v;AaY)6*~ZYwZPig0Pu5TX<+6EoEJL?OdX(a zE{tUnzDVH3v0-2q30x98jBsOY1n}zEs{psfUX7G(fRLHkYXNt}jsxzD-3r(qdp+Q; z*c*{%x4_QW?Z9*h+!K2X!o9J#0w!Z`1KbyT2jKqLJCVK*&^M{ryAZxvV1MjAz#IVd za97to2oC~!=3wl72oDL&#O?(q3+S6evA;$5u)telCxICe_^Q|k5q@p#Lx8u%J_7jq z*!_TSi+vpMuGlA#>s^4pd3WqV!1u%+0=zr+DZqPTe~;Mr#U4iZy#n7Kdjyz!0U^n; z&msK9*cT9fRNyybUqtv@vD1Lxj(rL6JF%|-emC|{fZxMcaXj;6>}v@BKp;-|0P{nE zPshFq{Er0wOYGag{}>Q*82c{5KaG7K;j;ptiTwbWp8?`3_}Ehj|0^KmF!m$BU&Q_e zaAN!?z)u2%T*c1)?8Oom->w4?;H z{Y4W#hV%OuPj~=u!-Nvd`FjChXD*nyH~w~W%cK(6#WP^HHo&S|iZfWX{(Qe;V(r8a zPx|Df&rEuB(jAj;EK8T&TeiFW%QK#u@yv|!ip>?j`ozOC|~E5BR$ z!^*0vPgh+#^OZCA&HU2L$7fblFRQ-2`p)VVvo_Cq#jJmr_2jId&T6c=vZkeGTg?r# z-!*$p?bh0C?bEfl&H2)t%DF9bubKOnxp&R|!Q8WR|1vi>?~Zxzn|Es7*?GU5=hyA3 zd$#U3bu;Vh>qqKutv3y~HTd&iGyf~|zdrw_1&0@We!({uJh>o#jBkSIf6!It-P4x> zIt=l!gt6Wpjay%UyRZUg9{#I?-M$ev;4bj@M%Zfm@pbw>{H0-e4&l$hn%r!@Ciy$f zPw*QDPx&0jyBdmr)WoKcnn%q9ti_EvWuH%($@2UU@*6iNJw!}IO~W7lYucXf9qvzFWwz#W zLmkP?p=749x4++Xq4-O}@xiD^bGCPzW%qCmX z=>sXi{{Cc7E|ngPWNO@=%w`k&lUdWss!}~kWJ>p=PP6GqPjZOK!vZ%Zd(yqh-i?V| zB3j0Vbnl2pWu%;J7P&fd=}a=3ssl9vpEWjsmLxS1s+OqsO!`o&7gcXh=K9jTrj;CM zOJ#G(K_K%UTDK+>Oc~*kVzNeC8;K7ZVm2gt9g|$+OnV}e1w(`9NQsU&jhY7ZNTv2E zlF(Ld(`8NbFzC;uZb^`RHhF|ek)GI{9L^@X!3gQx9m(9`bml-uE|W~)JDp+wcV-fU z=*vtlYxZRN3km2Cp^z zFCUe{$(5J}S-X`$IZ+@DK<&YYDC*Xgc{_rfKwo!-)y7~G%i z-I^He?MErD(6-cIG88;Zzw5j}`djy)?_8NthOq}QL{dG{1*SFsnYj$I4J9+Vk+HH1 zKO1d|6h=o!vS&DxWRC>$$mWI=w(6*j(x4cOh(WMtFww6)k}qlGtd&^XtLWcRJi~C1 zF&cDYTYCR~G$0}$#Aug@3eX{7Hf1vDOglz*gv-c_OzlB zM?wq6ak?Ke6JT0*r-vy85u%78Q7Vr%9yte93)vAGB05L#6>L0WxaSz&n(RjhnVsD? zBSSkR975BAk&#PUVZk%2vy9W9sOoUkGLZ}0Uz<$xY))sIbGb~a8!a$UZb@4r`4S9c zOKv`|D3Ga4vN!BhTfP(Hkn{PSD9t>Qljf!dhoe12rizj`VQ5EU0D~>jle97DlpYSB z!TqQRL(M>C;Guw}wjr(fMG5Gii0TQE)PWl9=8*i+m)9qvCBU)nRBvx`Fl;!PETeu1 zqdqDI5w(zQ+@2mxn@#=60ratH=}+OO1%oiPk0Ui{HVve5w%eO!s@l84Y#tu$aX-t= zj^Y0PJh8LtD-csKMD$sJ*fh|c1gX&cd5W$*k?RXJS!CEmS)>e&UD=b@@L)vDHzcyDp8T;Oowqx=k46Sm%ZA~7`;r;k zD$X)uiZ}st@}F0~Y0hL4BV*C*xYrDs-|vh8)u)XrFEU9%z}-CJa)bh^?Y0D2F|tz^ znBJB=l!f0t!^CfHY4VX?f19}o!m;wFC{T$()cG@?r(?leDV+s-?wvg#u zZaT4D50;2(6Vu2vid5}S=DJ$5THVeACY%4rSdEhy8*BzUYeS;v0CeT%RIRhTEsV0ojuoNB z7Q{H>gF;Q~#*}EYfVO+m1L zG0esxm6e8Sh`2x-X+-3)NfH$l)D$Kuh|^-j1g0Z#2ty)0+|!52J^{XBm|&1}K{aEN z;H+=DhA>gNv9=q{1lt?Iom8UVE-)G~8xJIMP=49Q4XHtNq|u)MZ@TumB(9{+K3Gz{ zG|$+N8PnB+o*cA;)1tC!p|_>>C0VQK>Q}?FD?2jS(~n_kb`DYiTsEw|P-rgMnH(6} z2(w7n9Ox-qESoQF+B0}yFnxH?w5PK<3XEwVhRFbW%uZQxW(}=u2uxRYc!zjV+mxp!(pHBDd-SZ;51{{*AxL) zePOH>u;K}HD#{b>0!`Lri7Si>)e%SqBb`joH|K-3g@|IFJ0*x>u9o3Uh69-4?TI54D?E0j zZc&zwLNS$2?b59*JMyT^;eruN&JOh_M#4d*TGNdl=Y{FoIT$9{IhfxBjJ6F)%zV~t z&IZq}6f}gKbdDPPXvd^`vdpr1M%BQ9?}iwhM53L7XO6?sI6L}AquVpdp+p8_Sr(!) zF^odljH9qk`SiG+DG=YL{C+5m4||~?&h>D95om2-qgY9|i$C!pWwXhF?*0+Z(G*$m zL{{bSjrR7AUXeo*(fBOv7s#e8gAvGzM?*$jhM6`d_a(3#P(;?~DqGAAn}(t#q9anN zVyLsT9pr&yNuGldNf`_tm{)a8)<|Jio^3()Nh){AY<1SFC1um_k^q&>wP+Vv!g`|5 z%-5Q2zBzG3l3GiKsUk+ruHj^6L|3lx{H7!&f0>NGAjnlLl}0PDg-46nbOci=m&${* zHHD$brmh?~V$lI~i*!&H6Ex<#2GrLpJ(TNH`zbF6=5zKN=@|=8h9y#P`m;(kf45*0 z15O-1uri6+Fmhe0zqcik!HR5*VhTiZj5NZU=58$C;l-1JNmCwz9N(SnhfDZSm?96s z6kuzR-G!T?WqN_*zT$|vh;6&U7 zZzxSU8aC;4&gde;ba7Kd))-8UcwJX)Ix>Vs0_?B!V6R(pa_$ah2CXD83dAR(^R$%1 zc37J7i(xGLLV%?%GZ zb1AUZ+u`l*New0Xv9t?<=&b4d-BSG~q zu_ZhA?E`fZZ-eTScAI>rNwXDH4P5}|O(9xKDZtyxZ5^OnOnx#ZqOFCDK-P99i81oQ|rtwYo26pv+`b- zK*8fE*^LadRvqJ3n(@Rqy8W?Av1Nr%o!}sRK5hnZzfECn1(dsC)!JJa6%qV+}V9bBK18I@C7kqkYH5vOB)HNMS^E=xV$JHUiY5HU?dQQ!6+iU@W?87)l+(K@W;_4Wi{Nz7 zHP%JewNJNfyY^+$1K7f+Ybrh5kF{a1I6^^TnrQN2vrWQqM}8`zIwhe?G%A5cTGM^` zGH1juUoIt!xhCV8Tj@=FED*gz?3k`Dvn`n%YVL<6%>En9Vy`Y(1c4FO@DuT}%Mq+2 zhPgkqk!w`=Wi}1!uQ(jS?WV3iS;0jRD1=9Ku(U&l==mgIR6Zk#yRrD+Fp^7V+micW zN_NXGqOpaFRcfp8f(3SiK23syYx zI|nzXGT9sp2U@eMJ1E3sykKUqgOMp^VX6~!AvPFf!jwpIH|!#)=qQb#gCdlRkr*W~ zQhy%8=F7tctq!yRD=oy@yoC{VrzYSSvyaBv%%jmwq+I)~KwQHp*jCon)HNXI!!Ydo zM6{d>5%|1=G8_qZghxCGk)Y_9a4d82JX*6VYh|ZYR>Z27#PE^hKrX$kZ`HYNg^|*O zdGtswbpOIy<02t9JfysLgj=NLi^J{*`I=4ym92?9Hih8=riD?W7Gycc>_NaP(4Dt5F6yz9t|U~Jpd)H^Ol^k5g!#<-Z8|9tr@m>4ktC>oY;+XnG!4Nk>a9Gutv@T znEV>$jFij-jkZ{JVr!P(jUIY8*b9+I#_GufMreq*uy*3ZCu|10q6)gFNwOEBgWLsC zVPQtA4w8yXKz1*hySe$(B+9X%0Fo*(Sz~{?4sm)3oZ(Ubwmof-x6|v^5#s9`y{X%z z1F4`^iXD1K{7x;qP1|PEmB?*M?=#&zqr&Y^7wGEdOk(UL(#vD3N#}@H!^Bxu*={s> z00k#y@)6rWtzh-Mr+AVxJgu;W%W^T2$BMo#mFo*8)9u*J>rC%}9@yZ>!=kr0??K0F z79%0iD44h*;c zq&?fxc{r^h`WbPoL(Edu)biYs755rx9Q zM$=$6ml@`ExTB%KW8TQ4Z>F^^oN3yJvwf||n1C@0U-XgIeLIp#F8KEhc1NDN;9b=; z?5H3^5a=4R#xnNK-LCo&B*~tA6LrS5AoU!7v#o=h(_DNIVMR{%IK+Rij#^P=^efmx zXsk+7;@m?}0qMdbS@#1dIl%*C^46ijgT%l~4DBxUQZtE6(si7NWJ;>zO-Hbz3monF zm?l?afqcm!4i-K}%&3|QQ{+`r5FNCofaJVl#gK}U8~jE9zHeYB`qKW zPCL8xQV^Aw5z5DH(d?EZ2u`8Aln#$fgLc~IX&pOD)1Nz9uUo547GN@MU=2)ldI*Xs z*&ARqK=I{h758$+oi4=CvkSl+S2{ZDkgaxQl*OT%4LC83vnia)Sh5zkg+4-i60{CBG`ek>1-V$*Bn{52_k^#*;%HvdBr}=q z+5IL3C6NKi;@htW>Psv)eTfw&m)?MP1)(u8qeM4v3>uHtntgUBM)zh$?bv|lU@nqn znLM(->;c`uJBWrvWJxT9M3(q?EgR02pO&YJeW^mUe`j*a{QSKV3X6qCgiuyia$4kk}^=F0Y z=ZS)h3^4V5X7bjh`$nyZA-Iv%xejTvA~?hoxF%e+A~S`nxLjH!JC_#A3Cb{&fU^hN zitHr38_}EW=K*_mMGyqBfg?H`%UKL1KMBYvea}13@DEr2U!d_!9mWG)Fg~hc%Ar5CE z#J99{h?hQvB~6&zdCu&cFmmo9Eq-`hUcj?#1J|aqDeMA=S+)$PaBjeMLBJEcP%Dhs z42Bj&+G;nZ66n_~UM$ZV*$&^&4d<{7#X)MIxIxV*V%Z!No}qGe)B+)l=K;VY63T|f z+4p_KHJwX!r(owqI>HraeTFo@TqCU?M7;?ix;4}s*vZ|N91($RPoy$<_lpV`+9L}z z-o#WTMk6D5X^IEiIlpyc^x$nznqKLlu1yE=CI_9(E>D==lFt#O3oEW(`9vR~#n2ef z1P9t^qU=Z?mQ5FXFfi{;BK8fPy!}b>&@iAp4jeXZiEK_*RV-pyUCfUbxiIlxKr zU>Db7tcl{FIOsJTX0Y#XF_g=v7(+FPZ0wPj9-HLd$E&)#x|W%ij)hHEUEb9tX9jzl zG2e|0q=&P*RpQ>VTxG&6cxV26vaF6|fhe3$mNk(qE6*>>+DMkm&M!+(B+KRJmj#F2 z0*)olFALV-K^ANUolo=k!QBEu;(KtgFIsWXMBi$Uyn19`IHFM7^_wiHu{Egces;c2 z`6z15Di*j>#vwfgavmrt+d=ezK|&#ix;wSGAA18_DDfQ8P|j9^wS_3nf-RkTbvN=aT@8nzt@91`DxlOt+V7#*;EU{~-Ej;M=JhhRt@N^+kH zDq#fF>GT$P{gXx0{VnspZqZ=P%lB0x?~*eS#vqqvV5C)<*Co5famQDtsa%3XQ^`PmxmikL*=||rB0d=;@I$e#mVpj#S0!!DraI?+K3rG-{X ztJCBz9S{4s*En|+Tmi5%l%4(;gE2eUmz{|Kx_Of6evC6JNX1^R=^TD7!h32O!;xDJu`%eHfshVIw#-Q3@= zV|pi7YFKUr3{Iq0$Rj`Op~y7vQE~Uk&?#8xtd0a}9LF`3c@i&f{Ph-pIh+0BIb3(H2E5 zmGhF|6&(LEzAjzWoUTX_&#X)$OJI zP)*j9;x0#DbN_ybR<3VAG$WctB(tM+x!}d*ke$rGl}qH#bX)o`tPUJt=HO1Y($h&( zL$uGvBn+?q>{YK?wqe8C6&u&CS+Z>9s^%rDRxe+>WW(C#tou zwOP1O*W=5MtXZ~f+49R1OU`qWzbrD#tvbIh#FVRZ098B|w9pe6wip-gmM*b=n#MZT zq(dPGCAb2sGTc?>Qsw(HnQVD@6T}`~M-~o(Ak>K>l2}yRj@;6p?#6tkS8N%(b_k3> zPIeGATrQ)F3e&11GU(Wi=mYAUj@$?hO7vdPBcrD#&IWQWNMwo1LiWse%Y?Wa&KOY@ z>}kBtF6TsKECvtPrZEmTjtnLSQax&>al(l1^fRx#Hj5ceD#1(+PatL!&LDUvo_Ygs zo5-(e!x5ML;Fug3U{*QeASpX?`*5elZp`-T+YIJ$R0tcu)~-Le!A0jH@I;P7NC`>` z4zt;zgA=f+OpXJIv!?)9$vF_gnounMx5dhWfQ7gzPt>H8D%OQNYNL(A-BGYOP)>ik z2WBnKH&9o>-9&R7Q=_<2q(4zZ1ZA7QOiw{5>}nny5x!Y(8FGYLiv*6E$Du)-UCsjw z;c$gYZyij!^$eFeFo`fjhkK;FS%I(kZ0=7$pi#Ev9=E6Wqc33EQ6wbXnw5=Zw-0R% zFif?e&R(s@xd(QYFsaj?VUfI4@9=rcZX>J7I}hKP7N?S-xxj8*vr2WMEX;H^uoH5? zm=sK(tSqRMOg%|y-_Ii9>gDZK44kYersn`w>zLprxS7r{QX&Cqy6t!7w(r5%%a7V| z%^sKkcK#F-HcLT;LqsPhn2@p%!}(}1OIx!6l5n6UJ%rmU`0~EQD0`^2+}wJetA_4q zp39>T35*Z=Q0m~4BGqh@eO0u$(l7S%CBg{Qvwued5vsyc`v9TojHp&liP8V ze23}8XIZx3_Iduc;|_WJmTtszo8UGXGkGgQ&1NG$L9r7zm3HD@`knZCP=_&F_JH0# z)HH~?91oJX>AnZ`3`tGo65B(#0a$E6Al!@;E)8hg)B$>X(3_+#8t1s0L9YGymjrL? z0Y}#$T)liOzK{o$fqqaqB6+d-f!bKk5O6HhT-q+wC#0|HK?$i=J`E$DQkB4Sl6<^y zH+~O-*OUX|!hWZ0kQ3;E)s(*xiO=F5T|N!tsUA1uvOJdGFZ3kv+mGkN%(a|7P6;Bl z7!;D$QR8Hle5RCOHwahAzRE1aH=F9stITryy8^$ZxNnz#rhF^iYdIWWodX}1!(M4Wognsg#Pn5-?60(TnB9tTcDPAZ>d3`pwj$c#C(t6Ni z9Lc7d{Xr>GeW5b=3fxwXuY{G{M48yqRuIooq2r%D%yKv$DS^~W6Rjm_D&98#9-N4>wxh}UHzoplw5?bQkd99 zXqn1!26S~udes-ErUl>csK-su*oH(5bFnSRyE6JzFJoU@IZmresSA6-O}5MQw1DP8 z{7a)o_E)d;TQm*j?XdKTaw)9;JZoG#UVn^3Y56A5#XfMF(;R!_ZV(*~cMjcdeELi~ zNXa3&DmYZJR8`6nC&u+6w9zsyM)yz!k?|CFRY%=;rkHS2(`ld$%x}k)*&LRwz)=9P zdxbRp$d}(0o1{FJWY+CQiBvaCP3ng5OX1L|%c(31y$BgeG4>AojcS3sbS-qE%zh+Y9LnsSu!pb2NBhj8v6Ll^5}h(w zYKr_S5w&-T8V-z8`3ifB(-|j_ENDOr7qvhd(s*)GLjmRhiz*SMD{TjL-BxXwilrjx zDpQ2G%zQc(O^7iu;5O~CbZMznSgeOMsoZwsnL}7r8dWJ(8kMS(Khzyt4C8|46Mjp? z9JzXIZuEo3EXoKcVNUjxlBhyMiRF|fa>upWOpi{vNO9d*HIQe@Z|s<(+yqMIM9T3o zjH%%~YJQ1w-Dvo4ms?wWDmPUcN6FBMUMBY%@_@>o{pKbJrtxA>@D*1g_6TGph1OAW zsr2yyHsERau+{5O8qEh&BIO-F-2`L~1Gpbw$|9=X{v%#zuzY+NPwQLR$r5s?VhJ!* zEL4Z<%zPm-6s{$(N=A?>iI`|-GX+yqc-Zkv1B$McbShr#My8{Z+lQJilTwzBqB^9G zb7T&!N+N|aun8qcvH7iKtz)&f2?I!#T`@lN!OmhGYLzVk&0&2S7p*CzkSa;3qy0we z944Bc_OrrHf!3O#&umgA(q}|p=vY_SJQ>>bWz5`m1Y;p=|!EOb`z-$*SS=fs}_j+HN5rIK=-c9C8$ETu>Ki?l+{rf_Pp6qd4$`|yw4FeU5o9X1og z-=48*qYNsQJ90T9-g}~ z(sDJ}*kc1SSD4s*NG4a=VJ^-griwVWFJU!}V9SXm2U$WAC73DuBuv>hb&O>U&Ya1Z z;Y7)Lw!;Im+LozYTZeQUPgsXHT!+zg9s1lE&#If;3N49VJ_25uq>Iq~`xCAAIiy<@FEtky7V&!ltM4t$Igmgr5SG6E!w0Uc) zwjm{bPV52dKQ6(jw^oAA0rap7?GpnuA(}dYws!|1q(XY)vNqJsF@c<%7wEUr_H%IZIL64q1HC(ya~vO)F9% zxj0VPdiqE;j*D>@Ld_DV^x=MF$UWOakBQnA47-|KPxc~}$^b+AZD~gW+!0$ReZH)T zzgj29xt7KjfP<)=Gm56l*|sK;23DZtJc4-ktJb#<-#}d}G5he<(`7c~dX5WPmyY9* zC2+)O4>P2^+=sTgbksGPZYYSAz5y5ZfeVAM%2+>I30n7KOfxk{BuWsBwsAjNp)$pg zjthpAvkak?D3iWZvDPFnq*rjapgg2RJ&%%Oht*6DVI*1|d7q#LwkFLQeY0kFS{^65KDnnWp=NR-4C}v3cOp8KG z<^G7aLPN>{XGLf(az;a(gGmAP6)hXZ%7~Kkx$tM(g;Rpz%%T{TV`^T_b;$NAF)B$n zqfG4;hL8?5X-Ii-GicUvd^2d4-mPK^4KG29yCDnxqStQ*b!fGez>tmrV#AQqdb4fa z%`(rCwgaeLC63m5R2Xyw)5^z|RHDbdu*n{NP0Qyq;M`~~_ z4AarZ)^wbETpJ}M6fh+FeL~p~XB!(@8H5~kRniC0k2)*T3PPFF8zH$2QIBYzK}#Wjl^3)Klv5hgUSU|} zgriSKH8nVR1v%02PR?l?I1?fbTBaf8sD>d8$e}G9f@Ccdt}-igQW(;j7*gsO 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 literal 156160 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 {uZ{=TN-kG; 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�{d$M?OcI<@2IhqyTIl1r+&TM$!?f zOgdns${qvB9zM2~7njcS7i;QD#=H^o*Fa|n&qw=vH<>yH?>zJI)5m}E_s=~0vV-$J z{LKq*_}Mit+4IGr+$WFy;HO`>`k~uy9_;+j*ZkM6+h6?2um923>%97xUH_idH+6pJ zUB{n#;{EOaQF`{|sXs~Fbmgk-XBxl#+#f7XpFI7Szx+y2e)!M7`>utL{oc^aUwqeB z|L@Cw>-ds){%Fgt-1?W?@K-;$>3x@dWzKN%wLiMzyFcjot(9{I-v{HC;1-E0vazm- zs*-Zj(IHQri3IYRWT%fEdt;)>mvnPeqS0$Y5kJwHXsT;uEWltx3Z>D^T^8gGg_$?c zGYz|Qxs&Mtm!BHplT5%~d8V$f7~rU}NfkxuBj5CC9WPrD)*_5Djx*LyY3!DLN~SbbFpei*eM|W zvt#qSFf;iN4^W1F>n8X#@LxJQI#x9 z&U&aUOa=eLJqDedF(m5e&*^9R0vn+?DEbk7oYRONu#bEN297oLf%ThPuwYmotV%-{ z>R@Bhkeq`Yh;j4W#yWJm4({YSkRe%q7z($!v!kKW@9fYIRGdfW@-_PZ{1z{<(zL8J z{5NN=dfTPXEp1GQ-(C7#<%cU#zTirfFQ|j=KALPBix$}?7D>K^u72qeSHJX#_TWD1 zu#$H-fy3_RKakn$fR*C5x~WkNZE_4eWVhGzh_Y$S6a-iR)(Ju!HF9hD&0v{E`Am+j zY~-FhIp&9Dv~inFmfn*pg2|V7rnPUh8^3;>9!&=$-Tmq8Fwnw_Z<}YpCm{4YTFZ~l z!D1xK*wmHCC(TLEEZ|Rk^T*5OC&W>QZ25URYV5vSF}ta?*n8_3kcNHtFiYxu*!(Hl z0e;eK0L|?;9^qW*C%5Hu8zDHFC3JCR-ikbku!P)NH!T3GwQfR5FaUimv_ga4#aY0C z!3IyZ{~#F{2g)|Ua}x*&Rss`ucK8b#u@Ud2@%p>YjwT&Maz3V<>`Kn(l+n<9$_WAk z$@$EePg5uR1M+9`_GWetVWaRt`qp^nvSWpyt2h>P^#_FlegwVHg&*<`3KOZ}pev0Z zs>UyfL(8DC3p!(r8C-6Rb@x6tx3M1FUV06NRNvx(altf*NMPFKPc)J+_@n^Ih8do8 zYx%RS2Qi_J2Yb6Q2`)C}`MxMPm!q z1nREF6WhRN>n2yWbrZaFSPx8iYX^y0dOx`0$qsQ=I_kk0x}$0>f4dz#1_R=m0e?Yn zCX+jJa57U&Ph+sQbwHUdv(HvFmN^~W zuXAy*`-CBYH^}Wi_x53~W~wg!Zm5gD3nnQyDfZt(?7s^Z#A>29+}UQ9H`d9}(6{E1 zbXvEI-Tg4iz;4E6X_q1tP0k#Ykx~nRoYqZDfSFo1 ztpIb`WOB7Fr932(gq=aNsNT{Okamaxr2G@Mm=xevp&8_wYQ=#>=?OeFL1~KKN9!Ps zC=0AeD00`TArrMj~ z3^vc_4pr^MWiCT>M1xim0-2qnzY*pC^7PPaO0|33ryC8USHKd0t1^(o2SW<|^ za0e<6Ru7d*%c(D(fVU2#g76}|uyrzgJVNX+{`!TUnY%le%?86om<-qllc2}rgYp8ju(L{gTHcT%q!3B}B8;Pfm4Xr-a}LqDJrVDT7;+Q}8l> zmYhOjyBp|ZbqISUn%HSm6MQ^a{T&`iOnq8<45c(yGMA2yCS{k2LT%oB(+K^=bGT&r zZE!xIp&;3%C$Iw`sp05DCBWZ9+z^ZWoajF?1C$s<2SV|~=0tOXd^W$Ou?Y*Doa&`j z6H5j{!F-YS$<;Jy!UyFmI_Tu6VmWW;P=3fVk9BGWS*4^kh~?Ky zK~*})p{s&?Ffcb2u?E|q8p^N7a1yR%NJ%5Lgvk0jKvl`5$E|8!hWXOHncBvLM0&^v zQ`?++EIsbjW9e~GkKu=`pCSrd zCl;H6Ps}I>DEqb zfqWhV60O06C`Okk!w^FrK95*OD1b;=aqAEPgo|B@Fl5lnyY38z`h)!G058Q{=9$j1 zVsYZe4I9n`Lj}REAI^;gaAnUTfw(|D&xQ=QL@&x^Q-!YmsmamNG?e!ho>{d!H*qeX zJ~3A8`sBO1D)PHFZ``(DmKhhBt2RzCJaa z+8W$&{kCmGqsGkl{$G3N@7pvK#PN%piVn0eA*R*?EJ#G5WI%`^ZH*KL(y9q5KP-V8 zTae1BBRdi8R(0w>z{<{6iJ6&yp#K9S8zb=j-iuwkAw?Z4^;LGR&v)nZy}FTKKKCNm zmMc~MU`nDSoTgD>PK8Cz)3mKyTd_B2M!Qe@s5jR9#y+ z>lt_8#lcpBSAudWNcRjM)sv85yQ7bPZ5$;^#cx^7)q|15E=ngmQoYiGCjDDQ8uxV z`6Q&qRg6<;kRhLg6eAz=uubE4;5olO&=_NbkEtb+I93%*17|*pKs3+4j99DLCQ_Fh z&}Y_(W2F^-rxB;c04+UAoR;g)5VAFQhA&I7C*1fRR~u?JxrQ-OQPwg6Vf{y+Enjd` zPS1snI5|@I--g!E7}v)>iNWzqX`c9-;&ae5<2EhUCz{_4_#r+_(0o`JoAdHo)4UdK o&t~^*ZXc=53P!PrZ~xCuFZ!apfhE^r^UkE~qSjaXmplW10UTy7ssI20 diff --git a/HttpBins/HttpServer.pdb b/HttpBins/HttpServer.pdb index f1cfd83f7158a5dd3669271cedc0b7b078eb7207..b1eaaeeb1ac7a5e8f601dc04edc13e63ac20243c 100644 GIT binary patch literal 421376 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

yDwz;jl%eL0qF1c)LyHvl=_c`ae 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

UO`A5I`%1SzX=-im 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 z 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 Q5kwL-Q3*sP@ZU|~U&oikF#rGn diff --git a/HttpBins/HttpServer.xml b/HttpBins/HttpServer.xml index fff737b5..e291a290 100644 --- a/HttpBins/HttpServer.xml +++ b/HttpBins/HttpServer.xml @@ -1,6183 +1,6188 @@ - - - - HttpServer - - - -

- Used to read from a string object. - - - - - Base interface to read string tokens from different sources. - - - - - Assign a new buffer - - Buffer to process. - Where to start process buffer - Buffer length - - - - Assign a new buffer - - Buffer to process - - - - Consume current character. - - - - - Consume specified characters - - One or more characters. - - - - Consumes horizontal white spaces (space and tab). - - - - - Consume horizontal white spaces and the specified character. - - Extra character to consume - - - - Checks if one of the remaining bytes are a specified character. - - Character to find. - true if found; otherwise false. - - - - Read a character. - - Character if not EOF; otherwise null. - - - - Get a text line. - - - Will merge multiline headers. - - - - Read quoted string - - string if current character (in buffer) is a quote; otherwise null. - - - - Read until end of string, or to one of the delimiters are found. - - characters to stop at - A string (can be ). - - Will not consume the delimiter. - - - - - Read until end of string, or to one of the delimiters are found. - - A string (can be ). - - Will not consume the delimiter. - - - - - Read to end of buffer, or until specified delimiter is found. - - Delimiter to find. - A string (can be ). - - Will not consume the delimiter. - - - - - Will read until specified delimiter is found. - - Character to stop at. - A string if the delimiter was found; otherwise null. - - Will trim away spaces and tabs from the end. - Will not consume the delimiter. - - - - - Read until one of the delimiters are found. - - characters to stop at - A string if one of the delimiters was found; otherwise null. - - Will trim away spaces and tabs from the end. - Will not consume the delimiter. - - - - - Read until a horizontal white space occurs. - - A string if a white space was found; otherwise null. - - - - Gets current character - - if end of buffer. - - - - Gets if end of buffer have been reached - - - - - Gets if more bytes can be processed. - - - - - Gets or sets current position in buffer. - - - THINK before you manually change the position since it can blow up - the whole parsing in your face. - - - - - Gets total length of buffer. - - - - - Gets or sets line number. - - - - - Gets next character - - if end of buffer. - - - - Gets number of bytes left. - - - - - Initializes a new instance of the class. - - Buffer to process. - - - - Initializes a new instance of the class. - - - - - Assign a new buffer - - Buffer to process. - Where to start process buffer - Buffer length - MUST be of type . - buffer needs to be of type string - - - - Assign a new buffer - - Buffer to process - MUST be of type . - buffer needs to be of type string - - - - Consume current character. - - - - - Get a text line. - - - Will merge multiline headers. - - - - Read quoted string - - string if current character (in buffer) is a quote; otherwise null. - - - - Read until end of string, or to one of the delimiters are found. - - characters to stop at - A string (can be ). - InvalidOperationException. - - - - Read until end of string, or to one of the delimiters are found. - - A string (can be ). - - Will not consume the delimiter. - - - - - Read to end of buffer, or until specified delimiter is found. - - Delimiter to find. - A string (can be ). - InvalidOperationException. - - - - Consume specified characters - - One or more characters. - - - - Consumes horizontal white spaces (space and tab). - - - - - Read a character. - - - Character if not EOF; otherwise null. - - - - - Will read until specified delimiter is found. - - Character to stop at. - - A string if the delimiter was found; otherwise null. - - - Will trim away spaces and tabs from the end. - Will not consume the delimiter. - - InvalidOperationException. - - - - Read until one of the delimiters are found. - - characters to stop at - - A string if one of the delimiters was found; otherwise null. - - - Will not consume the delimiter. - - InvalidOperationException. - - - - Read until a horizontal white space occurs (or end, or end of line). - - - A string if a white space was found; otherwise null. - - - - - Consume horizontal white spaces and the specified character. - - Extra character to consume - - - - Checks if one of the remaining bytes are a specified character. - - Character to find. - - true if found; otherwise false. - - - - - Gets or sets line number. - - - - - Gets if end of buffer have been reached - - - - - - Gets if more bytes can be processed. - - - - - - Gets next character - - if end of buffer. - - - - Gets current character - - if end of buffer. - - - - Gets or sets current position in buffer. - - - THINK before you manually change the position since it can blow up - the whole parsing in your face. - - - - - Gets total length of buffer. - - - - - - Gets number of bytes left. - - - - - Reads strings from a byte array. - - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class. - - Encoding to use when converting byte array to strings. - - - - Initializes a new instance of the class. - - Buffer to read from. - Encoding to use when converting byte array to strings. - - - - Assign a new buffer - - Buffer to process. - Where to start process buffer - Buffer length - Buffer needs to be a byte array - - - - Assign a new buffer - - Buffer to process - Buffer needs to be a byte array - - - - Consume current character. - - - - - Get a text line. - - - Will merge multi line headers. - - - - Read quoted string - - string if current character (in buffer) is a quote; otherwise null. - - - - Read until end of string, or to one of the delimiters are found. - - characters to stop at - - A string (can be ). - - - Will not consume the delimiter. - - InvalidOperationException. - - - - Read until end of string, or to one of the delimiters are found. - - A string (can be ). - - Will not consume the delimiter. - - - - - Read to end of buffer, or until specified delimiter is found. - - Delimiter to find. - - A string (can be ). - - - Will not consume the delimiter. - - InvalidOperationException. - - - - Consume specified characters - - One or more characters. - - - - Consumes horizontal white spaces (space and tab). - - - - - Consume horizontal white spaces and the specified character. - - Extra character to consume - - - - Read a character. - - - Character if not EOF; otherwise null. - - - - - Will read until specified delimiter is found. - - Character to stop at. - - A string if the delimiter was found; otherwise null. - - - Will trim away spaces and tabs from the end. - InvalidOperationException. - - - - Read until one of the delimiters are found. - - characters to stop at - - A string if one of the delimiters was found; otherwise null. - - - Will not consume the delimiter. - - InvalidOperationException. - - - - Read until a horizontal white space occurs. - - A string if a white space was found; otherwise null. - - - - Checks if one of the remaining bytes are a specified character. - - Character to find. - - true if found; otherwise false. - - - - - Gets or sets line number. - - - - - Gets if end of buffer have been reached - - - - - - Gets if more bytes can be processed. - - - - - - Gets next character - - if end of buffer. - - - - Gets current character - - if end of buffer. - - - - Gets or sets current position in buffer. - - - THINK before you manually change the position since it can blow up - the whole parsing in your face. - - - - - Gets total length of buffer. - - - - - - Gets number of bytes left. - - - - - Event arguments used when a new header have been parsed. - - - - - Initializes a new instance of the class. - - Name of header. - Header value. - Name cannot be empty - value is null. - - - - Initializes a new instance of the class. - - - - - Gets or sets header name. - - - - - Gets or sets header value. - - - - - Resource information. - - - Used by content providers to be able to get information - on resources (views, files etc). - - - - - Gets or sets date when resource was modified. - - - if not used. - - - Should always be universal time. - - - - - Gets or sets resource stream. - - - - - Loads resources from a specific location (such as assembly, hard drive etc). - - - - - Checks if a resource exists in the specified directory - - Uri path to resource - true if resource was found; otherwise false. - - - if (resources.Exists("/files/user/user.png")) - Debug.WriteLine("Resource exists."); - - - - - - Find all views in a folder/path. - - Absolute Uri path to files that should be found, can end with wild card. - Collection to add all view names to. - - - - Gets a resource. - - Uri path to resource. - Resource - Uri contains forbidden characters. - - - Resource resource = resources.Get("/files/user/user.png"); - - - - - - Parses Cookie header. - - - - - Used to parse header values - - - - - Parse a header - - Name of header. - Reader containing value. - HTTP Header - Header value is not of the expected format. - - - - Parse a header - - Name of header. - Reader containing value. - HTTP Header - Header value is not of the expected format. - - - - Used by to filter out unwanted connections. - - - - - Initializes a new instance of the class. - - The socket. - - - - Gets or sets if socket can be accepted. - - - - - Gets socket. - - - - - Http listener - - - - - Start listener. - - Number of pending accepts. - - Make sure that you are subscribing on first. - - Listener have already been started. - Failed to start socket. - Invalid port number. - - - - Stop listener. - - - - - Gets listener address. - - - - - Gets if listener is secure. - - - - - Gets if listener have been started. - - - - - Gets or sets logger. - - - - - Gets listening port. - - - - - Gets the maximum content size. - - The content length limit. - - Used when responding to 100-continue. - - - - - A new request have been received. - - - - - Can be used to reject certain clients. - - - - - A HTTP exception have been thrown. - - - Fill the body with a user friendly error page, or redirect to somewhere else. - - - - - Collection of files. - - - - - Checks if a file exists. - - Name of the file (form item name) - - - - - Add a new file. - - File to add. - - - - Remove all files from disk. - - - - - Get a file - - Name in form - File if found; otherwise null. - - - - Gets number of files - - - - - Custom network stream to mark sockets as reusable when disposing the stream. - - - - - Creates a new instance of the class for the specified . - - - The that the will use to send and receive data. - - - The parameter is null. - - - The parameter is not connected. - -or- - The property of the parameter is not . - -or- - The parameter is in a nonblocking state. - - - - - Initializes a new instance of the class for the specified with the specified ownership. - - - The that the will use to send and receive data. - - - Set to true to indicate that the will take ownership of the ; otherwise, false. - - - The parameter is null. - - - The parameter is not connected. - -or- - the value of the property of the parameter is not . - -or- - the parameter is in a nonblocking state. - - - - - Creates a new instance of the class for the specified with the specified access rights. - - - The that the will use to send and receive data. - - - A bitwise combination of the values that specify the type of access given to the over the provided . - - - The parameter is null. - - - The parameter is not connected. - -or- - the property of the parameter is not . - -or- - the parameter is in a nonblocking state. - - - - - Creates a new instance of the class for the specified with the specified access rights and the specified ownership. - - - The that the will use to send and receive data. - - - A bitwise combination of the values that specifies the type of access given to the over the provided . - - - Set to true to indicate that the will take ownership of the ; otherwise, false. - - - The parameter is null. - - - The parameter is not connected. - -or- - The property of the parameter is not . - -or- - The parameter is in a nonblocking state. - - - - - Closes the current stream and releases any resources (such as sockets and file handles) associated with the current stream. - - - - - Releases the unmanaged resources used by the and optionally releases the managed resources. - - true to release both managed and unmanaged resources; false to release only unmanaged resources. - - - - Request sent to a HTTP server. - - - - - - Base interface for request and response. - - - - - Add a new header. - - - - - - - Add a new header. - - Header to add. - - - - Gets body stream. - - - - - Size of the body. MUST be specified before sending the header, - unless property Chunked is set to true. - - - - - Kind of content in the body - - Default is text/html - - - - Gets or sets encoding - - - - - Gets headers. - - - - - Get a header - - Type that it should be cast to - Name of header - Header if found and casted properly; otherwise null. - - - - Gets or sets connection header. - - - - - Gets cookies. - - - - - Gets all uploaded files. - - - - - Gets form parameters. - - - - - Gets or sets HTTP version. - - - - - Gets if request is an Ajax request. - - - - - Gets or sets HTTP method. - - - - - Gets query string and form parameters - - - - - Gets query string. - - - - - Gets requested URI. - - - - - Serves files in the web server. - - - - FileModule fileModule = new FileModule(); - fileModule.Resources.Add(new FileResources("/", "C:\\inetpub\\myweb")); - - - - - - HTTP Module - - - - - Process a request. - - Request information - What to do next. - - - - Initializes a new instance of the class. - - baseUri or basePath is null. - - - - Mime types that this class can handle per default - - - Contains the following mime types: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Will send a file to client. - - HTTP context containing outbound stream. - Response containing headers. - File stream - - - - Process a request. - - Request information - What to do next. - Failed to find file extension - Forbidden file type. - - - - Gets a list with all allowed content types. - - All other mime types will result in . - - - - Gets provider used to add files to the file manager, - - - - - An exception that can't be handled by the library have been thrown. - - - - - Initializes a new instance of the class. - - The exception. - - - - Gets caught exception. - - - - - Helper for content types. - - - - - Decodes forms that have multiple sections. - - - http://www.faqs.org/rfcs/rfc1867.html - - - - - Decodes body stream. - - - - - Decode body stream - - Stream containing the content - Content type header - Stream encoding - Decoded data. - Body format is invalid for the specified content type. - Something unexpected failed. - - - - All content types that the decoder can parse. - - A collection of all content types that the decoder can handle. - - - - form-data - - - - - multipart/form-data - - - - - Decode body stream - - Stream containing the content - Content type header - Stream encoding - Decoded data. - Body format is invalid for the specified content type. - Something unexpected failed. - stream is null. - - - - All content types that the decoder can parse. - - A collection of all content types that the decoder can handle. - - - - A HTTP parser using delegates to which parsing methods. - - - - - Initializes a new instance of the class. - - - - - Parser method to copy all body bytes. - - - Needed since a TCP packet can contain multiple messages - after each other, or partial messages. - - - - Try to find a header name. - - - - - - Get header values. - - - Will also look for multi header values and automatically merge them to one line. - Content length is not a number. - - - - Toggle body bytes event. - - - - - - - - Raise the event, since we have successfully parsed a message and it's body. - - - - - First message line. - - Will always contain three elements. - Used to raise the or event - depending on the words in the array. - BadRequestException. - - - - Continue parsing a message - - Byte buffer containing bytes - Where to start the parsing - Number of bytes to parse - index where the parsing stopped. - Parsing failed. - - - - Parses the first line in a request/response. - - true if first line is well formatted; otherwise false. - Invalid request/response line. - - - - Reset parser to initial state. - - - - - Gets or sets current line number. - - - - - The request line has been parsed. - - - - - Response line has been parsed. - - - - - Parsed a header. - - - - - Received body bytes. - - - - - A message have been successfully parsed. - - - - - Used to be able to quickly swap parser method. - - - - - - Default log filter implementation. - - - - - Determines which classes can log - - - - - Checks if the specified type can send - log entries at the specified level. - - Log level - Type that want to write a log entry. - true if logging is allowed; otherwise false. - - - - Add a name space filter. - - Name space to add filter for. - Minimum log level required. - - - // Parsing can only add error and fatal messages - AddNamespace("SipSharp.Messages.Headers.Parsers", LogLevel.Error); - AddType(typeof(SipParser), LogLevel.Error); - - // Transport layer can only log warnings, errors and fatal messages - AddNamespace("SipSharp.Transports.*", LogLevel.Warning); - - - - - - Used to specify standard filter rules - - - Parser can only display errors. Transports only warnings. - - - - - Add filter for a type - - Type to add filter for. - Minimum log level required. - - - // Parsing can only add error and fatal messages - AddNamespace("SipSharp.Messages.Headers.Parsers", LogLevel.Error); - AddType(typeof(SipParser), LogLevel.Error); - - // Transport layer can only log warnings, errors and fatal messages - AddNamespace("SipSharp.Transports.*", LogLevel.Warning); - - - - - - Add filter for a type - - Type to add filter for. - Minimum log level required. - - - // Parsing can only add error and fatal messages - AddNamespace("SipSharp.Messages.Headers.Parsers", LogLevel.Error); - AddType("SipSharp.Messages.MessageFactory", LogLevel.Error); - - // Transport layer can only log warnings, errors and fatal messages - AddNamespace("SipSharp.Transports.*", LogLevel.Warning); - - - Type could not be identified. - - - - Checks if the specified type can send - log entries at the specified level. - - Log level - Type that want to write a log entry. - true if logging is allowed; otherwise false. - - - No filters = everything logged. = no logs. Don't use a rule with '*' or '.*' - - - - User have specified a wild card filter. - - - Wild card filters are used to log a name space and - all it's children name spaces. - - - - - Factory implementation used to create logs. - - - - - Create a new logger. - - Type that requested a logger. - Logger for the specified type; - - MUST ALWAYS return a logger. Return if no logging - should be used. - - - - - Response to a request. - - - - - Redirect user. - - Where to redirect to. - - Any modifications after a redirect will be ignored. - - - - - Gets connection type. - - - - - Gets cookies. - - - - - Gets HTTP version. - - - Default is HTTP/1.1 - - - - - Information about why a specific status code was used. - - - - - Status code that is sent to the client. - - Default is - - - - Gets or sets content type - - - - - Rules are used to perform operations before a request is being handled. - Rules can be used to create routing etc. - - - - - Process the incoming request. - - Request context information. - Processing result. - If any parameter is null. - - - - Used to access resources. - - - - - Add a new resource loader. - - Provider to add. - Manager have been started. - - - - Check if a resource exists. - - Uri to check - true if found; otherwise false. - - - if (manager.Exists("/views/user/view.haml")) - return true - - - - - - Get a resource. - - Uri path to resource. - Resource if found; otherwise null. - - - Resource resource = manager.Get("/views/user/view.haml"); - - - - - - Start manager. - - - - - Gets number of resource providers - - - - - Parses "Date" header. - - - - - Parse a header - - Name of header. - Reader containing value. - HTTP Header - Header value is not of the expected format. - - - - Content-type - - - - - Header in a message - - - Important! Each header should override ToString() - and return it's data correctly formatted as a HTTP header value. - - - - - Gets header name - - - - - Gets value as it would be sent back to client. - - - - - Header name. - - - - - Initializes a new instance of the class. - - Type of the content. - Value parameters. - - - - Initializes a new instance of the class. - - Type of the content. - - - - Returns data formatted as a HTTP header value. - - - A that represents the current . - - - - - Gets all parameters. - - - - - Gets content type. - - - - - Gets header name - - - - - Used to get or set properties on objects. - - - This class should be a bit faster than the standard reflection. - - - - - Get cached type. - - Type to get/set properties in - Type to use - - - - Flyweight design pattern implementation. - - Type of object. - - - - Initializes a new instance of the class. - - How large buffers to allocate. - - - - Get an object. - - Created object. - Will create one if queue is empty. - - - - Enqueues the specified buffer. - - Object to enqueue. - Buffer is is less than the minimum requirement. - - - - Used to create new objects. - - Type of objects to create. - Newly created object. - . - - - - Used to load/store sessions in the server. - - - - - Initializes a new instance of the class. - - Web server that the provider is for.. - Store to use. - - - - Initializes a new instance of the class. - - The server. - - Uses a file store. - - - - - Loads a session for all requests that got the session cookie. - - The sender. - The instance containing the event data. - - - - Gets current session - - Session if set, otherwise null. - - - - Gets or sets the session life time in minutes. - - The session life time. - - - - A session have been loaded. Use to access it. - - - - - Used to build headers. - - - - - Add a parser - - Header that the parser is for. - Parser implementation - - Will replace any existing parser for the specified header. - - - - - Add all default (built-in) parsers. - - - Will not replace previously added parsers. - - - - - Create a header parser - - implementation. - - - Uses attribute to find which headers - the parser is for. - - Will not replace previously added parsers. - - - - - Parse a header. - - Name of header - Header value - Header. - Value is not a well formatted header value. - - - - Arguments used when more body bytes have come. - - - - - Initializes a new instance of the class. - - buffer that contains the received bytes. - offset in buffer where to start processing. - number of bytes from that should be parsed. - buffer is null. - - - - Initializes a new instance of the class. - - - - - Gets or sets buffer that contains the received bytes. - - - - - Gets or sets number of bytes from that should be parsed. - - - - - Gets or sets offset in buffer where to start processing. - - - - - redirects from one URL to another. - - - - - Initializes a new instance of the class. - - Absolute path (no server name) - Absolute path (no server name) - - server.Add(new RedirectRule("/", "/user/index")); - - - - - Initializes a new instance of the class. - - Absolute path (no server name) - Absolute path (no server name) - true if request should be redirected, false if the request URI should be replaced. - - server.Add(new RedirectRule("/", "/user/index")); - - - - - Process the incoming request. - - Request context. - Processing result. - If any parameter is null. - - - - Gets string to match request URI with. - - Is compared to request.Uri.AbsolutePath - - - - Gets whether the server should redirect the client instead of simply modifying the URI. - - - false means that the rule will replace - the current request URI with the new one from this class. - true means that a redirect response is sent to the client. - - - - - Gets where to redirect. - - - - - cookie sent by the client/browser - - - - - - Constructor. - - cookie identifier - cookie content - id or content is null - id is empty - - - - Gets the cookie HTML representation. - - cookie string - - - - Gets the cookie identifier. - - - - - Gets value. - - - Set to null to remove cookie. - - - - - A request have been parsed successfully by the server. - - - - - Initializes a new instance of the class. - - Received request. - - - - Gets received request. - - - - - Context that received a HTTP request. - - - - - Disconnect context. - - - - - Gets if current context is using a secure connection. - - - - - Gets logger. - - - - - Gets remote end point - - - - - Gets stream used to send/receive data to/from remote end point. - - - - The stream can be any type of stream, do not assume that it's a network - stream. For instance, it can be a or a ZipStream. - - - - - - Gets the currently handled request - - The request. - - - - Gets the response that is going to be sent back - - The response. - - - - File sent from remote end. - - - - - Gets or sets content type. - - - - - Gets or sets name in form. - - - - - Gets or sets name original file name - - - - - Gets or sets filename for locally stored file. - - - - - Client X.509 certificate, X.509 chain, and any SSL policy errors encountered - during the SSL stream creation - - - - - Initializes a new instance of the class. - - The certificate. - Client security certificate chain. - Any SSL policy errors encountered during the SSL stream creation. - - - - Client security certificate - - - - - Client security certificate chain - - - - - Any SSL policy errors encountered during the SSL stream creation - - - - - Provides sessions. - - Type of session object - - Will always use files for sessions (utilizing the binary formatter), but can - also cache them in memory. - - If caching is enabled, it will only write sessions to disk every 20 seconds if they have - been accessed the last minute (to not keep writing dead sessions to disk). - - - - - - Initializes a new instance of the class. - - Session type must use [Serializable] attribute. - - - - Create a new session. - - - - - - Load session - - Id of session. - Session if found; otherwise null. - sessionId is null. - - - - Load session when a new request comes in. - - - - - - - Save a session to disk. - - Session to write to disk. - - You are responsible for writing sessions to disk if you are not using caching. - - - - - Start the session system and hook - - - - - - Stop session handling - - - - - Gets or sets session cookie name - - - - - Gets or sets cache - - - - - Gets current session. - - - - - Gets or sets number of seconds before a session expired. - - - A session have expired if nothing have accessed it for X seconds. This - class modifies the write time each time it's accessed. - - - - - Determines if cookie should be set in the response. - - - - - Invoked when a session have been changed and should be written to disc. - - - - - Base class for sessions. - - - Your class must be tagged with attribute to be able to use sessions. - - - - - The session have been changed and should be written to disk. - - - - - Session have been changed. - - - - - Gets or sets when session was accessed last - - - - - Gets current session. - - - - - Gets or sets session id. - - - - - Gets or sets when the session was last written to disk. - - - - - Used when the request line have been successfully parsed. - - - - - Initializes a new instance of the class. - - The HTTP method. - The URI path. - The HTTP version. - - - - Initializes a new instance of the class. - - - - - Gets or sets HTTP method. - - - Should be one of the methods declared in . - - - - - Gets or sets requested URI path. - - - - - Gets or sets the version of the SIP protocol that the client want to use. - - - - - cookie being sent back to the browser. - - - - - - Constructor. - - cookie identifier - cookie content - cookie expiration date. Use for session cookie. - id or content is null - id is empty - - - - Create a new cookie - - name identifying the cookie - cookie value - when the cookie expires. Setting will delete the cookie when the session is closed. - Path to where the cookie is valid - Domain that the cookie is valid for. - - - - Create a new cookie - - Name and value will be used - when the cookie expires. - - - - Gets the cookie HTML representation. - - cookie string - - - - Gets when the cookie expires. - - means that the cookie expires when the session do so. - - - - Gets path that the cookie is valid under. - - - - - Used to define which headers a parse is for. - - - - - Initializes a new instance of the class. - - Name of the header. - - - - Gets name of header that this parser is for. - - - - - Collection of headers. - - - - - Gets a header - - header name. - header if found; otherwise null. - - - - Something failed during parsing. - - - - - Request couldn't be parsed successfully. - - - - - Exception thrown from HTTP server. - - - - - Initializes a new instance of the class. - - HTTP status code. - Exception description. - - - - Initializes a new instance of the class. - - HTTP status code. - Exception description. - Inner exception. - - - - Gets HTTP status code. - - - - - Initializes a new instance of the class. - - Exception description. - - - - Initializes a new instance of the class. - - Exception description. - Exception description. - - - - Initializes a new instance of the class. - - Exception description. - - - - Initializes a new instance of the class. - - Exception description. - Inner exception. - - - - Provides resources. - - - - - Get all view names from a folder. - - Path to find views in. - A collection of view names (without path). - - - - Add a new resource loader. - - Provider to add. - Manager have been started. - - - - Start manager. - - - - - Check if a resource exists. - - Uri to check - true if found; otherwise false. - - - if (manager.Exists("/views/user/view.haml")) - return true - - - - - - Get a resource. - - Uri path to resource. - Resource if found; otherwise null. - - - Resource resource = manager.Get("/views/user/view.haml"); - - - - - - Gets number of resource providers - - - - - Collection of parameters. - - - or is not used since each parameter can - have multiple values. - - - - - Collection of parameters - - - - - Get a parameter. - - - - - - - Add a query string parameter. - - Parameter name - Value - - - - Checks if the specified parameter exists - - Parameter name. - true if found; otherwise false; - - - - Gets number of parameters. - - - - - Gets last value of an parameter. - - Parameter name - String if found; otherwise null. - - - - Initializes a new instance of the class. - - Collections to merge. - - Later collections will overwrite parameters from earlier collections. - - - - - Initializes a new instance of the class. - - - - - Get a list of string arrays. - - - - - - Get parameters - - Sub array (text array) - - - - - Returns an enumerator that iterates through the collection. - - - A that can be used to iterate through the collection. - - 1 - - - - Returns an enumerator that iterates through a collection. - - - An object that can be used to iterate through the collection. - - 2 - - - - Get a parameter. - - - - - - - Add a query string parameter. - - Parameter name - Value - - - - Checks if the specified parameter exists - - Parameter name. - true if found; otherwise false; - - - - Gets number of parameters. - - - - - Gets last value of an parameter. - - Parameter name - String if found; otherwise null. - - - - Result of processing. - - - - - Continue with the next handler - - - - - No more handlers can process the request. - - - The server will process the response object and - generate a HTTP response from it. - - - - - Response have been sent back by the handler. - - - This option should only be used if you are streaming - something or sending back a custom result. The server will - not process the response object or send anything back - to the client. - - - - - A HTTP context - - - - - - - - Initializes a new instance of the class. - - Socket received from HTTP listener. - Context used to parse incoming messages. - - - - Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. - - 2 - - - - Disconnect context. - - - - - Close and release socket. - - - - - Create stream used to send and receive bytes from the socket. - - Socket to wrap - Stream - Stream could not be created. - - - - Interpret incoming data. - - - - - - A request was received from the parser. - - - - - - - Parse all complete requests in buffer. - - - offset in buffer where parsing stopped. - Parsing failed. - - - - Start content. - - A socket operation failed. - Reading from stream failed. - - - - Gets currently executing HTTP context. - - - - - Gets or sets description - - - - - gets factory used to build request objects - - - - - Gets socket - - - - - Gets remove end point - - - - - Gets network stream. - - - - - Gets the currently handled request - - The request. - - - - Gets the response that is going to be sent back - - The response. - - - - Gets logger. - - - - - Gets if current context is using a secure connection. - - - - - Triggered for all requests in the server (after the response have been sent) - - - - - Triggered for current request (after the response have been sent) - - - - - A new request have been received. - - - - - A new request have been received (invoked for ALL requests) - - - - - Client have been disconnected. - - - - - Client asks if he may continue. - - - If the body is too large or anything like that you should respond . - - - - - Used to store all headers that that aren't recognized. - - - - - Initializes a new instance of the class. - - The name. - The value. - - - - Gets or sets value - - - - - Gets header name - - - - - The Connection general-header field allows the sender to specify options - that are desired for that particular connection and MUST NOT be - communicated by proxies over further connections. - - - - HTTP/1.1 proxies MUST parse the Connection header field before a - message is forwarded and, for each connection-token in this field, - remove any header field(s) from the message with the same name as the - connection-token. Connection options are signaled by the presence of - a connection-token in the Connection header field, not by any - corresponding additional header field(s), since the additional header - field may not be sent if there are no parameters associated with that - connection option. - - Message headers listed in the Connection header MUST NOT include - end-to-end headers, such as Cache-Control. - - HTTP/1.1 defines the "close" connection option for the sender to - signal that the connection will be closed after completion of the - response. For example, - - Connection: close - - in either the request or the response header fields indicates that - the connection SHOULD NOT be considered `persistent' (section 8.1) - after the current request/response is complete. - - HTTP/1.1 applications that do not support persistent connections MUST - include the "close" connection option in every message. - - A system receiving an HTTP/1.0 (or lower-version) message that - includes a Connection header MUST, for each connection-token in this - field, remove and ignore any header field(s) from the message with - the same name as the connection-token. This protects against mistaken - forwarding of such header fields by pre-HTTP/1.1 proxies. See section - 19.6.2 in RFC2616. - - - - - - Header name - - - - - Default connection header for HTTP/1.0 - - - - - Default connection header for HTTP/1.1 - - - - - Initializes a new instance of the class. - - Connection type. - The parameters. - - - - Initializes a new instance of the class. - - The type. - - - - Returns data formatted as a HTTP header value. - - - A that represents the current . - - - - - Gets connection parameters. - - - - - Gets or sets connection type - - - - - Gets header name - - - - - Type of HTTP connection - - - - - Connection is closed after each request-response - - - - - Connection is kept alive for X seconds (unless another request have been made) - - - - - Parameter in - - - - - Gets *last* value. - - - Parameters can have multiple values. This property will always get the last value in the list. - - String if any value exist; otherwise null. - - - - Gets or sets name. - - - - - Gets a list of all values. - - - - - A parameter in . - - - - - Returns an enumerator that iterates through the collection. - - - A that can be used to iterate through the collection. - - 1 - - - - Returns an enumerator that iterates through a collection. - - - An object that can be used to iterate through the collection. - - 2 - - - - Gets last value. - - - Parameters can have multiple values. This property will always get the last value in the list. - - String if any value exist; otherwise null. - - - - Gets or sets name. - - - - - Gets a list of all values. - - - - - Secure version of the HTTP listener. - - - - - Http listener. - - - - - Initializes a new instance of the class. - - The address. - The port. - - - - Initializes a new instance of the class. - - The address. - The port. - The HTTP factory. - - - - Creates a new instance with default factories. - - Address that the listener should accept connections on. - Port that listener should accept connections on. - Created HTTP listener. - - - - Creates a new instance with default factories. - - Address that the listener should accept connections on. - Port that listener should accept connections on. - Factory used to create different types in the framework. - Created HTTP listener. - - - - Creates a new instance with default factories. - - Address that the listener should accept connections on. - Port that listener should accept connections on. - Certificate to use - Created HTTP listener. - - - - Create a new context - - Accepted socket - A new context. - - - Throwing exception if in debug mode and not exception handler have been specified. - - - - Start listener. - - Number of pending accepts. - - Make sure that you are subscribing on first. - - Listener have already been started. - Failed to start socket. - Invalid port number. - - - - Stop listener. - - - - - Gets HTTP factory used to create types used by this HTTP library. - - - - - Gets or sets the maximum number of bytes that the request body can contain. - - The content length limit. - - - Used when responding to 100-continue. - - - 0 = turned off. - - - - - - Gets listener address. - - - - - Gets if listener is secure. - - - - - Gets if listener have been started. - - - - - Gets or sets logger. - - - - - Gets listening port. - - - - - A new request have been received. - - - - - Can be used to reject certain clients. - - - - - A HTTP exception have been thrown. - - - Fill the body with a user friendly error page, or redirect to somewhere else. - - - - - Client asks if he may continue. - - - If the body is too large or anything like that you should respond . - - - - - Initializes a new instance of the class. - - Address to accept new connections on. - Port to accept connections on. - Certificate securing the connection. - - - - Create a new context - - Accepted socket - A new context. - - Factory is assigned by the on each incoming request. - - - - - Gets if listener is secure. - - - - - - Gets or sets SSL protocol. - - - - - Gets or sets if client certificate should be used. - - - - - A response have been received. - - - - - Initializes a new instance of the class. - - The response. - - - - Gets or sets response. - - - - - Implements HTTP Digest authentication. It's more secure than Basic auth since password is - encrypted with a "key" from the server. - - - Keep in mind that the password is encrypted with MD5. Use a combination of SSL and digest auth to be secure. - - - - - Authenticates requests - - - - - Authenticate request - - Authorization header send by web client - Realm to authenticate in, typically a domain name. - HTTP Verb used in the request. - User if authentication was successful; otherwise null. - - - - Create a authentication challenge. - - Realm that the user should authenticate in - A WWW-Authenticate header. - If realm is empty or null. - - - - Gets authenticator scheme - - - digest - - - - - Initializes a new instance of the class. - - Supplies users during authentication process. - - - - Used by test classes to be able to use hardcoded values - - - - - An authentication response have been received from the web browser. - Check if it's correct - - Contents from the Authorization header - Realm that should be authenticated - GET/POST/PUT/DELETE etc. - - Authentication object that is stored for the request. A user class or something like that. - - if authenticationHeader is invalid - If any of the parameters is empty or null. - - - - Encrypts parameters into a Digest string - - Realm that the user want to log into. - User logging in - Users password. - HTTP method. - Uri/domain that generated the login prompt. - Quality of Protection. - "Number used ONCE" - Hexadecimal request counter. - "Client Number used ONCE" - Digest encrypted string - - - - - - Md5 hex encoded "userName:realm:password", without the quotes. - Md5 hex encoded "method:uri", without the quotes - Quality of Protection - "Number used ONCE" - Hexadecimal request counter. - Client number used once - - - - - Create a authentication challenge. - - Realm that the user should authenticate in - A correct auth request. - If realm is empty or null. - - - - Gets the current nonce. - - - - - - Gets the Md5 hash bin hex2. - - To be hashed. - - - - - determines if the nonce is valid or has expired. - - nonce value (check wikipedia for info) - true if the nonce has not expired. - - - - Gets authentication scheme name - - - - - Gets authenticator scheme - - - - digest - - - - - Session in the system - - - - - Gets or sets session id. - - - - - Factory creating null logger. - - - - - Initializes a new instance of the class. - - - - - Create a new logger. - - Type that requested a logger. - Logger for the specified type; - - MUST ALWAYS return a logger. Return if no logging - should be used. - - - - - Logger instance. - - - - - HTTP methods. - - - - - Unknown method - - - - - Posting data - - - - - Get data - - - - - Update data - - - - - Remove data - - - - - Get only HTTP headers. - - - - - Options HTTP 1.1 header. - - - - - Parses . - - - - - Parse a header - - Name of header. - Reader containing value. - HTTP Header - Header value is not of the expected format. - - - - Request couldn't be parsed successfully. - - - - - Initializes a new instance of the class. - - Exception description. - - - - Initializes a new instance of the class. - - Exception description. - Exception description. - - - - Arguments for . - - - - - Initializes a new instance of the class. - - The context. - - - - Gets or sets thrown exception - - - - - Gets or sets if error page was provided. - - - - - Gets requested resource. - - - - - Gets response to send - - - - - Convention over configuration server. - - - Used to make it easy to create and use a web server. - - All resources must exist in the "YourProject.Content" namespace (or a subdirectory called "Content" relative to yourapp.exe). - - - - - - Http server. - - - - - Initializes a new instance of the class. - - Factory used to create objects used in this library. - - - - Initializes a new instance of the class. - - - - - Add a decoder. - - decoder to add - - Adding zero decoders will make the server add the - default ones which is and . - - - - - Add a new router. - - Router to add - Server have been started. - - - - Add a file module - - Module to add - module is null. - Cannot add modules when server have been started. - - - - Add a HTTP listener. - - - Listener have been started. - - - - An error have occurred and we need to send a result pack to the client - - The context. - The exception. - - Invoke base class () to send the contents - of . - - - - - Called before anything else. - - The context. - - Looks after a in the request and will - use the if found. - - - - - All server modules are about to be invoked. - - The context. - - Called when routers have been invoked but no modules yet. - - - - - A request have arrived but not yet been processed yet. - - The context. - - Default implementation adds a Date header and Server header. - - - - - Go through all modules and check if any of them can handle the current request. - - - - - - - Process result (check if it should be sent back or not) - - - - true if request was processed properly.; otherwise false. - - - - Processes all routers. - - Request context. - Processing result. - - - - Requests authentication from the user. - - Host/domain name that the server hosts. - - Used when calculating hashes in Digest authentication. - - - - - - - Send a response. - - - - - - - - Start http server. - - Number of pending connections. - - - - Stops the server - - true if all modules should be removed. - - - - Gets the authentication provider. - - - A authentication provider is used to keep track of all authentication types - that can be used. - - - - - Gets or sets number of bytes that a body can be. - - - - Used to determine the answer to a 100-continue request. - - - 0 = turned off. - - - - - - Gets current server. - - - Only valid when a request have been received and is being processed. - - - - - Gets or sets the maximum size of request body (in bytes) - - - - - Gets or sets server name. - - - Used in the "Server" header when serving requests. - - - - - Invoked just before a response is sent back to the client. - - - - - Invoked *after* the web server has tried to handled the request. - - - The event can be used to handle the request after all routes and modules - have tried to process the request. - - - - - Invoked *before* the web server has tried to handled the request. - - - Event can be used to load a session from a cookie or to force - authentication or anything other you might need t do before a request - is handled. - - - - - An error page have been requested. - - - - - Initializes a new instance of the class. - - - - - Class to make dynamic binding of redirects. Instead of having to specify a number of similar redirect rules - a regular expression can be used to identify redirect URLs and their targets. - - - [a-z0-9]+)", "/users/${target}/?find=true", RegexOptions.IgnoreCase) - ]]> - - - - - Initializes a new instance of the class. - - Expression to match URL - Expression to generate URL - - [a-zA-Z0-9]+)", "/user/${first}")); - Result of ie. /employee1 will then be /user/employee1 - ]]> - - - - - Initializes a new instance of the class. - - Expression to match URL - Expression to generate URL - Regular expression options to use, can be null - - [a-zA-Z0-9]+)", "/user/{first}", RegexOptions.IgnoreCase)); - Result of ie. /employee1 will then be /user/employee1 - ]]> - - - - - Initializes a new instance of the class. - - Expression to match URL - Expression to generate URL - Regular expression options to apply - true if request should be redirected, false if the request URI should be replaced. - - [a-zA-Z0-9]+)", "/user/${first}", RegexOptions.None)); - Result of ie. /employee1 will then be /user/employee1 - ]]> - - Argument is null. - - - - - Process the incoming request. - - Request context. - Processing result. - If any parameter is null. - - - - Load resources from disk. - - - - - Default forbidden characters. - - - - - relative to absolute path mappings. - - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class. - - Request URI path - Disk path - - File names should not be included in URI or path. - - - - new FileResources("/files/user/", "C:\\intetpub\\files\users\\"); - - - - - - Add a new resource mapping. - - Request URI path - Disk path - - File names should not be included in URI or path. - - - - resources.Add("/files/", "C:\\intetpub\\files\\"); - - - absolutePath is not found. - - - - check if source contains any of the chars. - - string to check - Characters to fined - - - - - Go through all mappings and find requested Uri. - - Uri to get local path for. - Path if found; otherwise null. - - - - Checks if a resource exists in the specified directory - - Uri path to resource - true if resource was found; otherwise false. - - - if (resources.Exists("/files/user/user.png")) - Debug.WriteLine("Resource exists."); - - - - - - Gets a resource. - - Uri path to resource. - Resource - Uri contains forbidden characters. - - - Resource resource = resources.Get("/files/user/user.png"); - - - - - - Find all views in a folder/path. - - Absolute Uri path to files that should be found, can end with wild card. - Collection to add all view names to. - Uri contains forbidden characters. - - Find(" - - - - - Gets or sets forbidden characters. - - - Used to revoke access to any system files. - - - - - Gets or sets absolute path on disk, including file name. - - - - - Gets or sets relative file path. - - - - - Gets or sets Uri path, excluding file name - - - - - Used to send a response back to the client. - - - - Writes a object into a stream. - - - Important! ResponseWriter do not throw any exceptions. Instead it just logs them and - let them die peacefully. This is since the response writer is used from - catch blocks here and there. - - - - - - Sends response using the specified context. - - The context. - The response. - - - - Converts and sends a string. - - - - Encoding used to transfer string - - - - Send a body to the client - - Context containing the stream to use. - Body to send - - - - Send all headers to the client - - Response containing call headers. - Content used to send headers. - - - - Parses . - - - - - Parse a header - - Name of header. - Reader containing value. - HTTP Header - Header value is not of the expected format. - - - - Collection of headers. - - - - - Initializes a new instance of the class. - - Factory used to created headers. - - - - Adds a header - - - Will replace any existing header with the same name. - - header to add - header is null. - Header name cannot be null. - - - - Add a header. - - Header name - Header value - - Will try to parse the header and create a object. - - Header value is not correctly formatted. - name or value is null. - - - - Add a header. - - Header name - Header value - - Will try to parse the header and create a object. - - name or value is null. - - - - Get a header - - Type that it should be cast to - Name of header - Header if found and casted properly; otherwise null. - - - - Returns an enumerator that iterates through the collection. - - - A that can be used to iterate through the collection. - - 1 - - - - Returns an enumerator that iterates through a collection. - - - An object that can be used to iterate through the collection. - - 2 - - - - Gets a header - - header name. - header if found; otherwise null. - - - - Used to authenticate users - - - Authentication is requested by throwing - - - - - Implements basic authentication scheme. - - - - - Create a response that can be sent in the WWW-Authenticate header. - - Realm that the user should authenticate in - Not used by basic authentication - A WWW-Authenticate header. - Argument is null. - - - - An authentication response have been received from the web browser. - Check if it's correct - - Authorization header - Realm that should be authenticated - GET/POST/PUT/DELETE etc. - Authentication object that is stored for the request. A user class or something like that. - if authenticationHeader is invalid - If any of the paramters is empty or null. - - - - Gets authenticator scheme - - - - digest - - - - - Request implementation. - - - - - Initializes a new instance of the class. - - The method. - The path. - The version. - - - - Get a header - - Type that it should be cast to - Name of header - Header if found and casted properly; otherwise null. - - - - Add a new header. - - - - - - - Add a new header. - - Header to add. - - - - Returns an enumerator that iterates through the collection. - - - A that can be used to iterate through the collection. - - 1 - - - - Returns an enumerator that iterates through a collection. - - - An object that can be used to iterate through the collection. - - 2 - - - - Gets a header. - - - - - - - Gets request URI. - - - - - Gets cookies. - - - - - Gets all uploaded files. - - - - - Gets query string and form parameters - - - - - Gets form parameters. - - - - - Gets query string. - - - - - Gets if request is an Ajax request. - - - - - Gets or sets connection header. - - - - - Gets or sets HTTP version. - - - - - Gets or sets HTTP method. - - - - - Gets requested URI. - - - - - Kind of content in the body - - Default is text/html - - - - Gets or sets encoding - - - - - Gets headers. - - - - - Gets body stream. - - - - - Size of the body. MUST be specified before sending the header, - unless property Chunked is set to true. - - - Any specifically assigned value or Body stream length. - - - - - Initializes a new instance of the class. - - SSL protocol to use. - The socket. - The context. - Server certificate to use. - - - - Create stream used to send and receive bytes from the socket. - - Socket to wrap - Stream - Stream could not be created. - - - - Gets or sets client certificate. - - - - - Gets used protocol. - - - - - Gets or sets if client certificate should be used instead of server certificate. - - - - - A list of request cookies. - - - - - Let's copy all the cookies. - - value from cookie header. - - - - Initializes a new instance of the class. - - - - - Adds a cookie in the collection. - - cookie to add - cookie is null - Name must be specified. - - - - Remove all cookies. - - - - - Remove a cookie from the collection. - - Name of cookie. - - - - Gets a collection enumerator on the cookie list. - - collection enumerator - - - - Returns an enumerator that iterates through the collection. - - - - A that can be used to iterate through the collection. - - 1 - - - - Gets the count of cookies in the collection. - - - - - Gets the cookie of a given identifier (null if not existing). - - - - - Parses query string - - - - - Parse a query string - - string to parse - A collection - reader is null. - - - - Parse a query string - - string to parse - A collection - queryString is null. - - - - Stores sessions in files. - - - All session parameters must be serializable. - - - - - Stores sessions in your favorite store - - - - - - - - Saves the specified session. - - The session. - - - - Touches the specified session - - Session id. - - Used to prevent sessions from expiring. - - - - - Loads a session - - Session id. - Session if found; otherwise null. - - - - Delete a session - - Id of session - - - - Saves the specified session. - - The session. - - - - Touches the specified session - - Session id. - - Used to prevent sessions from expiring. - - - - - Loads a session - - Session id. - Session if found; otherwise null. - - - - Create a HTTP response object. - - - - - Initializes a new instance of the class. - - HTTP Version. - HTTP status code. - Why the status code was selected. - Version must start with 'HTTP/' - - - - Initializes a new instance of the class. - - Context that the response will be sent through. - Request that the response is for. - Version must start with 'HTTP/' - - - - Redirect user. - - Where to redirect to. - - Any modifications after a redirect will be ignored. - - - - - Add a new header. - - - - - - - Add a new header. - - Header to add. - - - - Returns an enumerator that iterates through the collection. - - - A that can be used to iterate through the collection. - - 1 - - - - Returns an enumerator that iterates through a collection. - - - An object that can be used to iterate through the collection. - - 2 - - - - Gets a header. - - - - - - - Gets connection type. - - - - - Status code that is sent to the client. - - Default is - - - - Gets HTTP version. - - - Default is HTTP/1.1 - - - - - Information about why a specific status code was used. - - - - - Size of the body. MUST be specified before sending the header, - unless property Chunked is set to true. - - - Any specifically assigned value or Body stream length. - - - - - Kind of content in the body - - Default is text/html - - - - Gets or sets encoding - - - - - Gets cookies. - - - - - Gets body stream. - - - - - Gets headers. - - - - - Loads resources that are embedded in assemblies. - - - No locks used internally since all mappings are loaded during start up. - - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class. - - Path (Uri) requested by clients - Assembly that the resources exist in - Name space that the resources exist in - - - - Add a specific resource. - - Path (Uri) requested by clients - Assembly that the resources exist in - Name space to root folder under (all name spaces below the specified one are considered as folders) - Name space and name of resource. - - - Add("/", Assembly.GetExecutingAssembly(), "MyApplication.Files", "Myapplication.Files.Images.MyImage.png"); - - - - - - Add resources. - - Path (Uri) requested by clients - Assembly that the resources exist in - Name of resource, including name space. - true if file was found (and has not previously been added); otherwise false. - - - - - - Add resources in a specific path (will not work with sub folders) - - Path (Uri) requested by clients - Assembly that the resources exist in - Name space to root folder under which all name spaces exists in, - true if any files was found; otherwise false. - - - Adds all views in the specified folder. Sub folders are not supported since it's hard to determine - with parts are the path and witch parts are the filename. Use to get support - for sub folders. - - - - - Add("/user/", typeof(MyController).Assembly, "YourProject.Users.Views"); - - - - - - Add resources in a folder and it's sub folder - - - - - - This method is not going to map files but keep the mapping and - try to look up views every time they are requested. This is the method - to use to add a resource folder that has sub folders. - - - - - - Tries to load file by using previously added paths. - - Uri path including file name - - - - - Checks if a resource exists in the specified directory - - Uri path to resource - true if resource was found; otherwise false. - - - if (resources.Exists("/files/user/user.png")) - Debug.WriteLine("Resource exists."); - - - - - - Load a resource. - - Uri of resource. - Resource if found and loaded; otherwise null. - - - - Find all views in a folder/path. - - Uri path - Collection to add all view names to. - - - - Loads all files in a resource directory - - - - - - Gets or sets assembly that the resource exists in. - - - - - Gets or sets resource name. - - - - - Gets or sets full name space path to resource. - - - - - Gets or sets if this file is for a certain content type. - - - - - Gets or sets full "virtual" Uri path, excluding file name. - - - - - Gets or sets assembly - - - - - Gets or sets name space root. - - - - - Gets or sets uri path. - - - - - Something unexpected went wrong. - - - - - Initializes a new instance of the class. - - Exception description. - - - - Initializes a new instance of the class. - - Exception description. - Inner exception. - - - - Decodes URL encoded values. - - - - - - - Stream containing the content - Content type header - Stream encoding - Collection with all parameters. - Body format is invalid for the specified content type. - Failed to read all bytes from body stream. - - - - All content types that the decoder can parse. - - A collection of all content types that the decoder can handle. - - - - Parses and builds messages - - - The message factory takes care of building messages - from all end points. - - Since both message and packet protocols are used, the factory - hands out contexts to all end points. The context keeps a state - to be able to parse partial messages properly. - - - Each end point need to hand the context back to the message factory - when the client disconnects (or a message have been parsed). - - - - - - Initializes a new instance of the class. - - Factory used to create headers. - - - - Create a new message factory context. - - A new context. - - A context is used to parse messages from a specific endpoint. - - - - - Release a used factory context. - - - - - - A request have been received from one of the end points. - - - - - A response have been received from one of the end points. - - - - - Priority for log entries - - - - - - Very detailed logs to be able to follow the flow of the program. - - - - - Logs to help debug errors in the application - - - - - Information to be able to keep track of state changes etc. - - - - - Something did not go as we expected, but it's no problem. - - - - - Something that should not fail failed, but we can still keep - on going. - - - - - Something failed, and we cannot handle it properly. - - - - - Parses . - - - - - Parse a header - - Name of header. - Reader containing value. - HTTP Header - Header value is not of the expected format. - - - - Form parameters where form string arrays have been converted to real arrays. - - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class. - - The name. - The value. - - - - Initializes a new instance of the class. - - Parse parameters from the this collection. - - - - Get a parameter. - - - - - - - Add a parameter - - Name of parameter, can contain a string array. - Value - - - ArrayParameterCollection array = new ArrayParameterCollection(); - array.Add("user[FirstName]", "Jonas"); - array.Add("user[FirstName]", "Arne"); - string firstName = array["user"]["FirstName"].Value; // "Arne" is returned - foreach (string value in array["user"]["FirstName"]) - Console.WriteLine(value); // each name is displayed. - - - - - - Checks if the specified parameter exists - - Parameter name. - true if found; otherwise false; - - - - Returns an enumerator that iterates through the collection. - - - A that can be used to iterate through the collection. - - 1 - - - - Gets first value of an item. - - - String if found; otherwise null. - - - - Gets number of parameters. - - - - - Gets last value of an parameter. - - Parameter name - String if found; otherwise null. - - - - Assign properties from HTTP parameters. - - - - - Used to filter out properties. - - Filter handler. - Handler have already been set. - - - - Assign properties in the specified object. - - Object to fill. - Contains all parameters that should be assigned to the properties. - Properties was not found or value could not be converted. - Any parameter is null. - - - - Used to be able to filter properties - - Model having it's properties assigned - Property about to be assigned - Value to assign - true if value can be set; otherwise false. - - - - Failed to assign properties. - - - - - Initializes a new instance of the class. - - The property errors. - - - - Gets all errors during assignment. - - - Dictionary key is property name. - - - - - Requested resource may not be accessed. - - - Normally thrown after an authentication attempt have failed too many times. - - - - - - Initializes a new instance of the class. - - Exception description. - - - - Initializes a new instance of the class. - - Exception description. - Inner exception. - - - - User needs to authenticate. - - - - - - - Initializes a new instance of the class. - - Exception description. - - - - Initializes a new instance of the class. - - Exception description. - Inner exception. - - - - First line in a response have been received - - - - - Gets or sets motivation to why the status code was used. - - - - - Gets or sets message status code - - - - - Gets or sets sip protocol version used. - - - - - Request context - - - Contains information about a HTTP request and where it came from. - - - - - Gets or sets http context. - - - - - Gets or sets http request. - - - - - Gets or sets http response. - - - - - Header for "Date" and "If-Modified-Since" - - - - The field value is an HTTP-date, as described in section 3.3.1 in RFC2616; - it MUST be sent in RFC 1123 [8]-date format. An example is - - Date: Tue, 15 Nov 1994 08:12:31 GMT - - Origin servers MUST include a Date header field in all - responses, except in these cases: - - If the response status code is 100 (Continue) or 101 (Switching - Protocols), the response MAY include a Date header field, at the server's - option. - If the response status code conveys a server error, e.g. 500 - (Internal Server Error) or 503 (Service Unavailable), and it is inconvenient - or impossible to generate a valid Date. - If the server does not have a clock that can provide a - reasonable approximation of the current time, its responses MUST NOT include - a Date header field. In this case, the rules in section 14.18.1 in RFC2616 - MUST be followed. - - - A received message that does not have a Date header field MUST - be assigned one by the recipient if the message will be cached by that - recipient or gatewayed via a protocol which requires a Date. An HTTP - implementation without a clock MUST NOT cache responses without revalidating - them on every use. An HTTP cache, especially a shared cache, SHOULD use a - mechanism, such as NTP [28], to synchronize its clock with a reliable - external standard. - Clients SHOULD only send a Date header field in messages that - include an entity-body, as in the case of the PUT and POST requests, and - even then it is optional. A client without a clock MUST NOT send a Date - header field in a request. - The HTTP-date sent in a Date header SHOULD NOT represent a date - and time subsequent to the generation of the message. It SHOULD represent - the best available approximation of the date and time of message generation, - unless the implementation has no means of generating a reasonably accurate - date and time. In theory, the date ought to represent the moment just before - the entity is generated. In practice, the date can be generated at any time - during the message origination without affecting its semantic value. - - - - - - Header name - - - - - Initializes a new instance of the class. - - Header name. - Name must not be empty. - - - - Initializes a new instance of the class. - - Header name. - Universal time. - - - - Returns data formatted as a HTTP header value. - - - A that represents the current . - - - - - Gets or sets date time. - - Should be in UTC. - - - - Gets header name - - - - - The Cache-Control general-header field is used to specify directives that - MUST be obeyed by all caching mechanisms along the request/response - chain. . - - - - The directives specify behavior intended to prevent caches from adversely - interfering with the request or response. These directives typically - override the default caching algorithms. Cache directives are - unidirectional in that the presence of a directive in a request does not - imply that the same directive is to be given in the response. - Note that HTTP/1.0 caches might not implement Cache-Control and - might only implement Pragma: no-cache (see section 14.32 in RFC2616). - Cache directives MUST be passed through by a proxy or gateway - application, regardless of their significance to that application, since the - directives might be applicable to all recipients along the request/response - chain. It is not possible to specify a cache- directive for a specific cache - - - When a directive appears without any 1#field-name parameter, the - directive applies to the entire request or response. When such a - directive appears with a 1#field-name parameter, it applies only to - the named field or fields, and not to the rest of the request or - response. This mechanism supports extensibility; implementations of - future versions of the HTTP protocol might apply these directives to - header fields not defined in HTTP/1.1. - - - The cache-control directives can be broken down into these general - categories: - - - Restrictions on what are cacheable; these may only be imposed by - the origin server. - - Restrictions on what may be stored by a cache; these may be - imposed by either the origin server or the user agent. - - Modifications of the basic expiration mechanism; these may be - imposed by either the origin server or the user agent. - - Controls over cache revalidation and reload; these may only be - imposed by a user agent. - - Control over transformation of entities. - - Extensions to the caching system. - - - - - - - - Header name - - - - - Gets header name - - - - - Authorization response - - - - A user agent that wishes to authenticate itself with a server-- - usually, but not necessarily, after receiving a 401 response--does - so by including an Authorization request-header field with the - request. The Authorization field value consists of credentials - containing the authentication information of the user agent for - the realm of the resource being requested. - - - Authorization = "Authorization" ":" credentials - - - HTTP access authentication is described in "HTTP Authentication: - Basic and Digest Access Authentication" [43]. If a request is - authenticated and a realm specified, the same credentials SHOULD - be valid for all other requests within this realm (assuming that - the authentication scheme itself does not require otherwise, such - as credentials that vary according to a challenge value or using - synchronized clocks). - When a shared cache (see section 13.7) receives a request - containing an Authorization field, it MUST NOT return the - corresponding response as a reply to any other request, unless one - of the following specific exceptions holds: - - - - If the response includes the "s-maxage" cache-control - directive, the cache MAY use that response in replying to a - subsequent request. But (if the specified maximum age has - passed) a proxy cache MUST first revalidate it with the origin - server, using the request-headers from the new request to allow - the origin server to authenticate the new request. (This is the - defined behavior for s-maxage.) If the response includes "s- - maxage=0", the proxy MUST always revalidate it before re-using - it. - - If the response includes the "must-revalidate" cache-control - directive, the cache MAY use that response in replying to a - subsequent request. But if the response is stale, all caches - MUST first revalidate it with the origin server, using the - request-headers from the new request to allow the origin server - to authenticate the new request. - - If the response includes the "public" cache-control directive, - it MAY be returned in reply to any subsequent request. - - - - - - - Name constant - - - - - Gets or sets authentication data. - - - - - Gets or sets authentication protocol. - - - - - Gets name of header. - - - - - Factory is used to create new logs in the system. - - - - - Assigns log factory being used. - - The log factory. - A factory have already been assigned. - - - - Create a new logger. - - Type that requested a logger. - Logger for the specified type; - - - - A request have been received. - - - - - - - Initializes a new instance of the class. - - context that received the request. - Received request. - Response to send. - - - - Gets context that received the request. - - - Do not forget to set to true if you are sending - back a response manually through . - - - - - Gets or sets if the request have been handled. - - - The library will not attempt to send the response object - back to the client if this property is set to true. - - - - - Gets request object. - - - - - Gets response object. - - - - - Get or create components used in the web server framework - - - - - - - - Get or create a type. - - Type to create - Created type. - - Gets or creates types in the framework. - Check for more information on which - types the factory should contain. - - - - - Parses numerical values - - - - - Parse a header - - Name of header. - Reader containing value. - HTTP Header - Header value is not of the expected format. - - - - Contains parameters for HTTP headers. - - - - - Add a parameter - - name - value - - Existing parameter with the same name will be replaced. - - - - - Parse parameters. - - Parser containing buffer to parse. - A collection with all parameters (or just a empty collection). - Expected a value after equal sign. - - - - Parse parameters. - - Parser containing buffer to parse. - Parameter delimiter - A collection with all parameters (or just a empty collection). - Expected a value after equal sign. - - - - Returns a that represents the current . - - - A that represents the current . - - - - - Gets or sets a value - - parameter name - value if found; otherwise null. - - - - Component that should be registered in the container. - - - Register using all interfaces that is specified in this assembly. - - - - - Stream-based multipart handling. - - In this incarnation deals with an HttpInputStream as we are now using - IntPtr-based streams instead of byte []. In the future, we will also - send uploads above a certain threshold into the disk (to implement - limit-less HttpInputFiles). - - - Taken from HttpRequest in mono (http://www.mono-project.com) - - - - - Interface used to write to log files. - - - If you want to use the built in filtering mechanism, create a constructor - which takes one parameter, a . - - - - - Write an entry that helps when debugging code. - - Log message - - - - Write an entry that helps when debugging code. - - Log message - Thrown exception to log. - - - - Something went wrong, but the application do not need to die. The current thread/request - cannot continue as expected. - - Log message - - - - Something went wrong, but the application do not need to die. The current thread/request - cannot continue as expected. - - Log message - Thrown exception to log. - - - - Something went very wrong, application might not recover. - - Log message - - - - Something went very wrong, application might not recover. - - Log message - Thrown exception to log. - - - - Informational message, needed when helping customer to find a problem. - - Log message - - - - Informational message, needed when helping customer to find a problem. - - Log message - Thrown exception to log. - - - - Write a entry that helps when trying to find hard to find bugs. - - Log message - - - - Write a entry that helps when trying to find hard to find bugs. - - Log message - Thrown exception to log. - - - - Something is not as we expect, but the code can continue to run without any changes. - - Log message - - - - Something is not as we expect, but the code can continue to run without any changes. - - Log message - Thrown exception to log. - - - - Used to create all key types in the HTTP server. - - - Should have factory methods at least for the following types: - , , - , , - , , - , , - . - - Check the default implementations to see which constructor - parameters you will get. - - - HttpFactory.Add(typeof(IRequest), (type, args) => new MyRequest((string)args[0])); - - - - - - Initializes a new instance of the class. - - - - - Add a factory method for a type. - - Type to create - Method creating the type. - - - - Used to - - - - - - - Setup our singleton. - - - - - - We want to use a singleton, but we also want to be able - to let the developer to setup his own header factory. - Therefore we use this method to create our own factory only if the user - have not specified one. - - - - - Small method to create a message factory singleton and replace then default delegate method. - - - - - - - - Create a type. - - Type to create - Created type. - - - - Gets http factory for the current listener. - - - - - Delegate used to create a certain type - - Created type. - - Method must never fail. - - - - - Contains numerical value. - - - - - Initializes a new instance of the class. - - The name. - The value. - - - - Returns data formatted as a HTTP header value. - - - A that represents the current . - - - - - Gets value - - - - - Gets header name - - - - - Contents of a cookie header. - - - - - Initializes a new instance of the class. - - The collection. - collection is null. - - - - Gets cookie collection - - - - - Gets header name - - - - - Gets value as it would be sent back to client. - - - - - - Data decoded from a POST body. - - - - - Initializes a new instance of the class. - - - - - Gets or sets decoded files. - - - - - Gets or sets decoded parameters. - - - - - Collection of body decoders. - - - Body decoders are used to parse request body and convert it - into a and a . - - - - - Add another body decoder. - - - - - - Decode body stream - - Stream containing the content - Content type header - Stream encoding - Decoded data. - Body format is invalid for the specified content type. - Something unexpected failed. - - - - Returns an enumerator that iterates through the collection. - - - A that can be used to iterate through the collection. - - 1 - - - - Returns an enumerator that iterates through a collection. - - - An object that can be used to iterate through the collection. - - 2 - - - - Gets number of decoders. - - - - - Credits and description: http://theinstructionlimit.com/?p=76 - - - Converted to .Net 2.0 - - - - - Type cached for fast property value modifications. - - - - - Get a property value. - - Instance to get value from. - Name of property. - Property value. - - - - Assign a value, try to convert it if it's not the same type as the property type. - - Object containing the property - Name of property - Value to convert and assign - Failed to find property. - Could not convert value type to property type. - - - - Assign value to a property - - Object containing the property - Name of property - Value to assign, must be of the same type as the property. - Failed to find property. - - - - Used to cache property information - - - - - Gets the property. - - The name. - - Failed to find property. - - - InvalidCastException. - - - - Get a property value. - - Instance to get value from. - Name of property. - Property value. - - - - Assign a value, try to convert it if it's not the same type as the property type. - - Object containing the property - Name of property - Value to convert and assign - Failed to find property. - Could not convert value type to property type. - - - - Assign value to a property - - Object containing the property - Name of property - Value to assign, must be of the same type as the property. - Failed to find property. - - - - Gets or sets member info - - - - - Gets or sets member type - - - - - A request have been received. - - - - - Initializes a new instance of the class. - - The request. - End point that the request was received from. - - - - End point that the message was received from. - - - - - Received request. - - - - - Creates a single message for one of the end points. - - - The factory is - - - - - Initializes a new instance of the class. - - The MSG factory. - The factory. - The parser. - - - - Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. - - 2 - - - - Received a header from parser - - - - - - - Will continue the parsing until nothing more can be parsed. - - buffer to parse - where to start in the buffer - number of bytes to process. - Position where parser stopped parsing. - Parsing failed. - - - - Reset parser. - - - Something failed, reset parser so it can start on a new request. - - - - - A request have been successfully parsed. - - - - - A response have been successfully parsed. - - - - - Client asks if he may continue. - - - If the body is too large or anything like that you should respond . - - - - - Used to notify about 100-continue header. - - - - - Initializes a new instance of the class. - - request that want to continue. - - - - Gets request that want to continue - - - - - Default log writer, writes everything to void (nowhere). - - - - - - The logging instance. - - - - - Write an entry that helps when debugging code. - - Log message - - - - Write an entry that helps when debugging code. - - Log message - Thrown exception to log. - - - - Write a entry needed when following through code during hard to find bugs. - - Log message - - - - Write a entry that helps when trying to find hard to find bugs. - - Log message - Thrown exception to log. - - - - Informational message, needed when helping customer to find a problem. - - Log message - - - - Informational message, needed when helping customer to find a problem. - - Log message - Thrown exception to log. - - - - Something is not as we expect, but the code can continue to run without any changes. - - Log message - - - - Something is not as we expect, but the code can continue to run without any changes. - - Log message - Thrown exception to log. - - - - Something went wrong, but the application do not need to die. The current thread/request - cannot continue as expected. - - Log message - - - - Something went wrong, but the application do not need to die. The current thread/request - cannot continue as expected. - - Log message - Thrown exception to log. - - - - Something went very wrong, application might not recover. - - Log message - - - - Something went very wrong, application might not recover. - - Log message - Thrown exception to log. - - - - This class writes to the console. - - - It colors the output depending on the log level - and includes a 3-level stack trace (in debug mode) - - - - - - Initializes a new instance of the class. - - Type being logged. - Log filter. - - - - Get color for the specified log level - - Level for the log entry - A for the level - - - - Write an entry - - Importance of the log message - The message. - - - - Write an entry that helps when debugging code. - - Log message - - - - Write an entry that helps when debugging code. - - Log message - Thrown exception to log. - - - - Write a entry needed when following through code during hard to find bugs. - - Log message - - - - Write a entry that helps when trying to find hard to find bugs. - - Log message - Thrown exception to log. - - - - Informational message, needed when helping customer to find a problem. - - Log message - - - - Informational message, needed when helping customer to find a problem. - - Log message - Thrown exception to log. - - - - Something is not as we expect, but the code can continue to run without any changes. - - Log message - - - - Something is not as we expect, but the code can continue to run without any changes. - - Log message - Thrown exception to log. - - - - Something went wrong, but the application do not need to die. The current thread/request - cannot continue as expected. - - Log message - - - - Something went wrong, but the application do not need to die. The current thread/request - cannot continue as expected. - - Log message - Thrown exception to log. - - - - Something went very wrong, application might not recover. - - Log message - - - - Something went very wrong, application might not recover. - - Log message - Thrown exception to log. - - - - Gets or sets type that the logger is for - - - - - Creates a console logger. - - - - - Initializes a new instance of the class. - - The filter. - - - - Create a new logger. - - Type that requested a logger. - Logger for the specified type; - - MUST ALWAYS return a logger. Return if no logging - should be used. - - - - - Cookies that should be set. - - - - - Adds a cookie in the collection. - - cookie to add - cookie is null - Name and Content must be specified. - - - - Copy a request cookie - - - When the cookie should expire - - - - Remove all cookies - - - - - Gets a collection enumerator on the cookie list. - - collection enumerator - - - - Returns an enumerator that iterates through the collection. - - - - A that can be used to iterate through the collection. - - 1 - - - - Gets the count of cookies in the collection. - - - - - Gets the cookie of a given identifier. - - Cookie if found; otherwise null. - - - - Provider returning user to be authenticated. - - - - - Lookups the specified user - - User name. - Typically web server domain name. - User if found; otherwise null. - - User name can basically be anything. For instance name entered by user when using - basic or digest authentication, or SID when using Windows authentication. - - - - - Gets the principal to use. - - Successfully authenticated user. - - - Invoked when a user have successfully been authenticated. - - - - - - - User information used during authentication process. - - - - - Gets or sets user name used during authentication. - - - - - Gets or sets unencrypted password. - - - Password as clear text. You could use instead if your passwords - are encrypted in the database. - - - - - Gets or sets HA1 hash. - - - - Digest authentication requires clear text passwords to work. If you - do not have that, you can store a HA1 hash in your database (which is part of - the Digest authentication process). - - - A HA1 hash is simply a Md5 encoded string: "UserName:Realm:Password". The quotes should - not be included. Realm is the currently requested Host (as in Request.Headers["host"]). - - - Leave the string as null if you are not using HA1 hashes. - - - - - - Provides authentication in the web server. - - - To initiate authentication you just need to throw a Una - - - - - Add a authenticator. - - - - - - Authenticate request. - - - - - Requires that a AuthorizationHeader have been sent by the client. If not, - request one by sending a WWW-Authentication header (can be generated by the Challenge method). - - Authorization header was not found in the request. - Requested authentication scheme is not supported. - - - - Create a challenge header (WWW-authenticate) - - Response that the authentication header should be added to - Realm that the user should authenticate in - WWW-Authenticate header. - - - Scheme can currently be basic or digest. Basic is not very safe, but easier to use. - Digest is quite safe. - - - - Requested scheme is not supported. - - - + + + + HttpServer + + + + + Used by to filter out unwanted connections. + + + + + Initializes a new instance of the class. + + The socket. + + + + Gets or sets if socket can be accepted. + + + + + Gets socket. + + + + + A request have been received. + + + + + + + Initializes a new instance of the class. + + context that received the request. + Received request. + Response to send. + + + + Gets context that received the request. + + + Do not forget to set to true if you are sending + back a response manually through . + + + + + Gets or sets if the request have been handled. + + + The library will not attempt to send the response object + back to the client if this property is set to true. + + + + + Gets request object. + + + + + Gets response object. + + + + + Cookies that should be set. + + + + + Adds a cookie in the collection. + + cookie to add + cookie is null + Name and Content must be specified. + + + + Copy a request cookie + + + When the cookie should expire + + + + Remove all cookies + + + + + Gets a collection enumerator on the cookie list. + + collection enumerator + + + + Returns an enumerator that iterates through the collection. + + + + A that can be used to iterate through the collection. + + 1 + + + + Gets the count of cookies in the collection. + + + + + Gets the cookie of a given identifier. + + Cookie if found; otherwise null. + + + + An exception that can't be handled by the library have been thrown. + + + + + Initializes a new instance of the class. + + The exception. + + + + Gets caught exception. + + + + + Data decoded from a POST body. + + + + + Initializes a new instance of the class. + + + + + Gets or sets decoded files. + + + + + Gets or sets decoded parameters. + + + + + Stores sessions in files. + + + All session parameters must be serializable. + + + + + Stores sessions in your favorite store + + + + + + + + Saves the specified session. + + The session. + + + + Touches the specified session + + Session id. + + Used to prevent sessions from expiring. + + + + + Loads a session + + Session id. + Session if found; otherwise null. + + + + Delete a session + + Id of session + + + + Saves the specified session. + + The session. + + + + Touches the specified session + + Session id. + + Used to prevent sessions from expiring. + + + + + Loads a session + + Session id. + Session if found; otherwise null. + + + + HTTP methods. + + + + + Unknown method + + + + + Posting data + + + + + Get data + + + + + Update data + + + + + Remove data + + + + + Get only HTTP headers. + + + + + Options HTTP 1.1 header. + + + + + Http listener. + + + + + Http listener + + + + + Start listener. + + Number of pending accepts. + + Make sure that you are subscribing on first. + + Listener have already been started. + Failed to start socket. + Invalid port number. + + + + Stop listener. + + + + + Gets listener address. + + + + + Gets if listener is secure. + + + + + Gets if listener have been started. + + + + + Gets or sets logger. + + + + + Gets listening port. + + + + + Gets the maximum content size. + + The content length limit. + + Used when responding to 100-continue. + + + + + A new request have been received. + + + + + Can be used to reject certain clients. + + + + + A HTTP exception have been thrown. + + + Fill the body with a user friendly error page, or redirect to somewhere else. + + + + + Initializes a new instance of the class. + + The address. + The port. + + + + Initializes a new instance of the class. + + The address. + The port. + The HTTP factory. + + + + Creates a new instance with default factories. + + Address that the listener should accept connections on. + Port that listener should accept connections on. + Created HTTP listener. + + + + Creates a new instance with default factories. + + Address that the listener should accept connections on. + Port that listener should accept connections on. + Factory used to create different types in the framework. + Created HTTP listener. + + + + Creates a new instance with default factories. + + Address that the listener should accept connections on. + Port that listener should accept connections on. + Certificate to use + Created HTTP listener. + + + + Create a new context + + Accepted socket + A new context. + + + Throwing exception if in debug mode and not exception handler have been specified. + + + + Start listener. + + Number of pending accepts. + + Make sure that you are subscribing on first. + + Listener have already been started. + Failed to start socket. + Invalid port number. + + + + Stop listener. + + + + + Gets HTTP factory used to create types used by this HTTP library. + + + + + Gets or sets the maximum number of bytes that the request body can contain. + + The content length limit. + + + Used when responding to 100-continue. + + + 0 = turned off. + + + + + + Gets listener address. + + + + + Gets if listener is secure. + + + + + Gets if listener have been started. + + + + + Gets or sets logger. + + + + + Gets listening port. + + + + + A new request have been received. + + + + + Can be used to reject certain clients. + + + + + A HTTP exception have been thrown. + + + Fill the body with a user friendly error page, or redirect to somewhere else. + + + + + Client asks if he may continue. + + + If the body is too large or anything like that you should respond . + + + + + Contents of a cookie header. + + + + + Header in a message + + + Important! Each header should override ToString() + and return it's data correctly formatted as a HTTP header value. + + + + + Gets header name + + + + + Gets value as it would be sent back to client. + + + + + Initializes a new instance of the class. + + The collection. + collection is null. + + + + Gets cookie collection + + + + + Gets header name + + + + + Gets value as it would be sent back to client. + + + + + + Request couldn't be parsed successfully. + + + + + Exception thrown from HTTP server. + + + + + Initializes a new instance of the class. + + HTTP status code. + Exception description. + + + + Initializes a new instance of the class. + + HTTP status code. + Exception description. + Inner exception. + + + + Gets HTTP status code. + + + + + Initializes a new instance of the class. + + Exception description. + + + + Initializes a new instance of the class. + + Exception description. + Exception description. + + + + Something failed during parsing. + + + + + Initializes a new instance of the class. + + Exception description. + + + + Initializes a new instance of the class. + + Exception description. + Inner exception. + + + + Used to parse header values + + + + + Parse a header + + Name of header. + Reader containing value. + HTTP Header + Header value is not of the expected format. + + + + Collection of body decoders. + + + Body decoders are used to parse request body and convert it + into a and a . + + + + + Add another body decoder. + + + + + + Decode body stream + + Stream containing the content + Content type header + Stream encoding + Decoded data. + Body format is invalid for the specified content type. + Something unexpected failed. + + + + Returns an enumerator that iterates through the collection. + + + A that can be used to iterate through the collection. + + 1 + + + + Returns an enumerator that iterates through a collection. + + + An object that can be used to iterate through the collection. + + 2 + + + + Gets number of decoders. + + + + + Custom network stream to mark sockets as reusable when disposing the stream. + + + + + Creates a new instance of the class for the specified . + + + The that the will use to send and receive data. + + + The parameter is null. + + + The parameter is not connected. + -or- + The property of the parameter is not . + -or- + The parameter is in a nonblocking state. + + + + + Initializes a new instance of the class for the specified with the specified ownership. + + + The that the will use to send and receive data. + + + Set to true to indicate that the will take ownership of the ; otherwise, false. + + + The parameter is null. + + + The parameter is not connected. + -or- + the value of the property of the parameter is not . + -or- + the parameter is in a nonblocking state. + + + + + Creates a new instance of the class for the specified with the specified access rights. + + + The that the will use to send and receive data. + + + A bitwise combination of the values that specify the type of access given to the over the provided . + + + The parameter is null. + + + The parameter is not connected. + -or- + the property of the parameter is not . + -or- + the parameter is in a nonblocking state. + + + + + Creates a new instance of the class for the specified with the specified access rights and the specified ownership. + + + The that the will use to send and receive data. + + + A bitwise combination of the values that specifies the type of access given to the over the provided . + + + Set to true to indicate that the will take ownership of the ; otherwise, false. + + + The parameter is null. + + + The parameter is not connected. + -or- + The property of the parameter is not . + -or- + The parameter is in a nonblocking state. + + + + + Closes the current stream and releases any resources (such as sockets and file handles) associated with the current stream. + + + + + Releases the unmanaged resources used by the and optionally releases the managed resources. + + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Parses query string + + + + + Parse a query string + + string to parse + A collection + reader is null. + + + + Parse a query string + + string to parse + A collection + queryString is null. + + + + Convention over configuration server. + + + Used to make it easy to create and use a web server. + + All resources must exist in the "YourProject.Content" namespace (or a subdirectory called "Content" relative to yourapp.exe). + + + + + + Http server. + + + + + Initializes a new instance of the class. + + Factory used to create objects used in this library. + + + + Initializes a new instance of the class. + + + + + Add a decoder. + + decoder to add + + Adding zero decoders will make the server add the + default ones which is and . + + + + + Add a new router. + + Router to add + Server have been started. + + + + Add a file module + + Module to add + module is null. + Cannot add modules when server have been started. + + + + Add a HTTP listener. + + + Listener have been started. + + + + An error have occurred and we need to send a result pack to the client + + The context. + The exception. + + Invoke base class () to send the contents + of . + + + + + Called before anything else. + + The context. + + Looks after a in the request and will + use the if found. + + + + + All server modules are about to be invoked. + + The context. + + Called when routers have been invoked but no modules yet. + + + + + A request have arrived but not yet been processed yet. + + The context. + + Default implementation adds a Date header and Server header. + + + + + Go through all modules and check if any of them can handle the current request. + + + + + + + Process result (check if it should be sent back or not) + + + + true if request was processed properly.; otherwise false. + + + + Processes all routers. + + Request context. + Processing result. + + + + Requests authentication from the user. + + Host/domain name that the server hosts. + + Used when calculating hashes in Digest authentication. + + + + + + + Send a response. + + + + + + + + Start http server. + + Number of pending connections. + + + + Stops the server + + true if all modules should be removed. + + + + Gets the authentication provider. + + + A authentication provider is used to keep track of all authentication types + that can be used. + + + + + Gets or sets number of bytes that a body can be. + + + + Used to determine the answer to a 100-continue request. + + + 0 = turned off. + + + + + + Gets current server. + + + Only valid when a request have been received and is being processed. + + + + + Gets or sets the maximum size of request body (in bytes) + + + + + Gets or sets server name. + + + Used in the "Server" header when serving requests. + + + + + Invoked just before a response is sent back to the client. + + + + + Invoked *after* the web server has tried to handled the request. + + + The event can be used to handle the request after all routes and modules + have tried to process the request. + + + + + Invoked *before* the web server has tried to handled the request. + + + Event can be used to load a session from a cookie or to force + authentication or anything other you might need t do before a request + is handled. + + + + + An error page have been requested. + + + + + Initializes a new instance of the class. + + + + + Used to build headers. + + + + + Add a parser + + Header that the parser is for. + Parser implementation + + Will replace any existing parser for the specified header. + + + + + Add all default (built-in) parsers. + + + Will not replace previously added parsers. + + + + + Create a header parser + + implementation. + + + Uses attribute to find which headers + the parser is for. + + Will not replace previously added parsers. + + + + + Parse a header. + + Name of header + Header value + Header. + Value is not a well formatted header value. + + + + Request sent to a HTTP server. + + + + + + Base interface for request and response. + + + + + Add a new header. + + + + + + + Add a new header. + + Header to add. + + + + Gets body stream. + + + + + Size of the body. MUST be specified before sending the header, + unless property Chunked is set to true. + + + + + Kind of content in the body + + Default is text/html + + + + Gets or sets encoding + + + + + Gets headers. + + + + + Get a header + + Type that it should be cast to + Name of header + Header if found and casted properly; otherwise null. + + + + Gets or sets connection header. + + + + + Gets cookies. + + + + + Gets all uploaded files. + + + + + Gets form parameters. + + + + + Gets or sets HTTP version. + + + + + Gets if request is an Ajax request. + + + + + Gets or sets HTTP method. + + + + + Gets query string and form parameters + + + + + Gets query string. + + + + + Gets requested URI. + + + + + Load resources from disk. + + + + + Loads resources from a specific location (such as assembly, hard drive etc). + + + + + Checks if a resource exists in the specified directory + + Uri path to resource + true if resource was found; otherwise false. + + + if (resources.Exists("/files/user/user.png")) + Debug.WriteLine("Resource exists."); + + + + + + Find all views in a folder/path. + + Absolute Uri path to files that should be found, can end with wild card. + Collection to add all view names to. + + + + Gets a resource. + + Uri path to resource. + Resource + Uri contains forbidden characters. + + + Resource resource = resources.Get("/files/user/user.png"); + + + + + + Default forbidden characters. + + + + + relative to absolute path mappings. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + Request URI path + Disk path + + File names should not be included in URI or path. + + + + new FileResources("/files/user/", "C:\\intetpub\\files\users\\"); + + + + + + Add a new resource mapping. + + Request URI path + Disk path + + File names should not be included in URI or path. + + + + resources.Add("/files/", "C:\\intetpub\\files\\"); + + + absolutePath is not found. + + + + check if source contains any of the chars. + + string to check + Characters to fined + + + + + Go through all mappings and find requested Uri. + + Uri to get local path for. + Path if found; otherwise null. + + + + Checks if a resource exists in the specified directory + + Uri path to resource + true if resource was found; otherwise false. + + + if (resources.Exists("/files/user/user.png")) + Debug.WriteLine("Resource exists."); + + + + + + Gets a resource. + + Uri path to resource. + Resource + Uri contains forbidden characters. + + + Resource resource = resources.Get("/files/user/user.png"); + + + + + + Find all views in a folder/path. + + Absolute Uri path to files that should be found, can end with wild card. + Collection to add all view names to. + Uri contains forbidden characters. + + Find(" + + + + + Gets or sets forbidden characters. + + + Used to revoke access to any system files. + + + + + Gets or sets absolute path on disk, including file name. + + + + + Gets or sets relative file path. + + + + + Gets or sets Uri path, excluding file name + + + + + Used to send a response back to the client. + + + + Writes a object into a stream. + + + Important! ResponseWriter do not throw any exceptions. Instead it just logs them and + let them die peacefully. This is since the response writer is used from + catch blocks here and there. + + + + + + Sends response using the specified context. + + The context. + The response. + + + + Converts and sends a string. + + + + Encoding used to transfer string + + + + Send a body to the client + + Context containing the stream to use. + Body to send + + + + Send all headers to the client + + Response containing call headers. + Content used to send headers. + + + + Decodes body stream. + + + + + Decode body stream + + Stream containing the content + Content type header + Stream encoding + Decoded data. + Body format is invalid for the specified content type. + Something unexpected failed. + + + + All content types that the decoder can parse. + + A collection of all content types that the decoder can handle. + + + + Decodes forms that have multiple sections. + + + http://www.faqs.org/rfcs/rfc1867.html + + + + + form-data + + + + + multipart/form-data + + + + + Decode body stream + + Stream containing the content + Content type header + Stream encoding + Decoded data. + Body format is invalid for the specified content type. + Something unexpected failed. + stream is null. + + + + All content types that the decoder can parse. + + A collection of all content types that the decoder can handle. + + + + Provides sessions. + + Type of session object + + Will always use files for sessions (utilizing the binary formatter), but can + also cache them in memory. + + If caching is enabled, it will only write sessions to disk every 20 seconds if they have + been accessed the last minute (to not keep writing dead sessions to disk). + + + + + + Initializes a new instance of the class. + + Session type must use [Serializable] attribute. + + + + Create a new session. + + + + + + Load session + + Id of session. + Session if found; otherwise null. + sessionId is null. + + + + Load session when a new request comes in. + + + + + + + Save a session to disk. + + Session to write to disk. + + You are responsible for writing sessions to disk if you are not using caching. + + + + + Start the session system and hook + + + + + + Stop session handling + + + + + Gets or sets session cookie name + + + + + Gets or sets cache + + + + + Gets current session. + + + + + Gets or sets number of seconds before a session expired. + + + A session have expired if nothing have accessed it for X seconds. This + class modifies the write time each time it's accessed. + + + + + Determines if cookie should be set in the response. + + + + + Invoked when a session have been changed and should be written to disc. + + + + + First line in a response have been received + + + + + Gets or sets motivation to why the status code was used. + + + + + Gets or sets message status code + + + + + Gets or sets sip protocol version used. + + + + + A request have been parsed successfully by the server. + + + + + Initializes a new instance of the class. + + Received request. + + + + Gets received request. + + + + + Provider returning user to be authenticated. + + + + + Lookups the specified user + + User name. + Typically web server domain name. + User if found; otherwise null. + + User name can basically be anything. For instance name entered by user when using + basic or digest authentication, or SID when using Windows authentication. + + + + + Gets the principal to use. + + Successfully authenticated user. + + + Invoked when a user have successfully been authenticated. + + + + + + + User information used during authentication process. + + + + + Gets or sets user name used during authentication. + + + + + Gets or sets unencrypted password. + + + Password as clear text. You could use instead if your passwords + are encrypted in the database. + + + + + Gets or sets HA1 hash. + + + + Digest authentication requires clear text passwords to work. If you + do not have that, you can store a HA1 hash in your database (which is part of + the Digest authentication process). + + + A HA1 hash is simply a Md5 encoded string: "UserName:Realm:Password". The quotes should + not be included. Realm is the currently requested Host (as in Request.Headers["host"]). + + + Leave the string as null if you are not using HA1 hashes. + + + + + + Used to get or set properties on objects. + + + This class should be a bit faster than the standard reflection. + + + + + Get cached type. + + Type to get/set properties in + Type to use + + + + Used to load/store sessions in the server. + + + + + Initializes a new instance of the class. + + Web server that the provider is for.. + Store to use. + + + + Initializes a new instance of the class. + + The server. + + Uses a file store. + + + + + Loads a session for all requests that got the session cookie. + + The sender. + The instance containing the event data. + + + + Gets current session + + Session if set, otherwise null. + + + + Gets or sets the session life time in minutes. + + The session life time. + + + + A session have been loaded. Use to access it. + + + + + Secure version of the HTTP listener. + + + + + Initializes a new instance of the class. + + Address to accept new connections on. + Port to accept connections on. + Certificate securing the connection. + + + + Create a new context + + Accepted socket + A new context. + + Factory is assigned by the on each incoming request. + + + + + Gets if listener is secure. + + + + + + Gets or sets SSL protocol. + + + + + Gets or sets if client certificate should be used. + + + + + Arguments used when more body bytes have come. + + + + + Initializes a new instance of the class. + + buffer that contains the received bytes. + offset in buffer where to start processing. + number of bytes from that should be parsed. + buffer is null. + + + + Initializes a new instance of the class. + + + + + Gets or sets buffer that contains the received bytes. + + + + + Gets or sets number of bytes from that should be parsed. + + + + + Gets or sets offset in buffer where to start processing. + + + + + HTTP Module + + + + + Process a request. + + Request information + What to do next. + + + + Something unexpected went wrong. + + + + + Initializes a new instance of the class. + + Exception description. + + + + Initializes a new instance of the class. + + Exception description. + Inner exception. + + + + File sent from remote end. + + + + + Gets or sets content type. + + + + + Gets or sets name in form. + + + + + Gets or sets name original file name + + + + + Gets or sets filename for locally stored file. + + + + + Parses Cookie header. + + + + + Parse a header + + Name of header. + Reader containing value. + HTTP Header + Header value is not of the expected format. + + + + Decodes URL encoded values. + + + + + + + Stream containing the content + Content type header + Stream encoding + Collection with all parameters. + Body format is invalid for the specified content type. + Failed to read all bytes from body stream. + + + + All content types that the decoder can parse. + + A collection of all content types that the decoder can handle. + + + + Base class for sessions. + + + Your class must be tagged with attribute to be able to use sessions. + + + + + The session have been changed and should be written to disk. + + + + + Session have been changed. + + + + + Gets or sets when session was accessed last + + + + + Gets current session. + + + + + Gets or sets session id. + + + + + Gets or sets when the session was last written to disk. + + + + + Parses and builds messages + + + The message factory takes care of building messages + from all end points. + + Since both message and packet protocols are used, the factory + hands out contexts to all end points. The context keeps a state + to be able to parse partial messages properly. + + + Each end point need to hand the context back to the message factory + when the client disconnects (or a message have been parsed). + + + + + + Initializes a new instance of the class. + + Factory used to create headers. + + + + Create a new message factory context. + + A new context. + + A context is used to parse messages from a specific endpoint. + + + + + Release a used factory context. + + + + + + A request have been received from one of the end points. + + + + + A response have been received from one of the end points. + + + + + Interface used to write to log files. + + + If you want to use the built in filtering mechanism, create a constructor + which takes one parameter, a . + + + + + Write an entry that helps when debugging code. + + Log message + + + + Write an entry that helps when debugging code. + + Log message + Thrown exception to log. + + + + Something went wrong, but the application do not need to die. The current thread/request + cannot continue as expected. + + Log message + + + + Something went wrong, but the application do not need to die. The current thread/request + cannot continue as expected. + + Log message + Thrown exception to log. + + + + Something went very wrong, application might not recover. + + Log message + + + + Something went very wrong, application might not recover. + + Log message + Thrown exception to log. + + + + Informational message, needed when helping customer to find a problem. + + Log message + + + + Informational message, needed when helping customer to find a problem. + + Log message + Thrown exception to log. + + + + Write a entry that helps when trying to find hard to find bugs. + + Log message + + + + Write a entry that helps when trying to find hard to find bugs. + + Log message + Thrown exception to log. + + + + Something is not as we expect, but the code can continue to run without any changes. + + Log message + + + + Something is not as we expect, but the code can continue to run without any changes. + + Log message + Thrown exception to log. + + + + cookie sent by the client/browser + + + + + + Constructor. + + cookie identifier + cookie content + id or content is null + id is empty + + + + Gets the cookie HTML representation. + + cookie string + + + + Gets the cookie identifier. + + + + + Gets value. + + + Set to null to remove cookie. + + + + + Arguments for . + + + + + Initializes a new instance of the class. + + The context. + + + + Gets or sets thrown exception + + + + + Gets or sets if error page was provided. + + + + + Gets requested resource. + + + + + Gets response to send + + + + + Implements HTTP Digest authentication. It's more secure than Basic auth since password is + encrypted with a "key" from the server. + + + Keep in mind that the password is encrypted with MD5. Use a combination of SSL and digest auth to be secure. + + + + + Authenticates requests + + + + + Authenticate request + + Authorization header send by web client + Realm to authenticate in, typically a domain name. + HTTP Verb used in the request. + User if authentication was successful; otherwise null. + + + + Create a authentication challenge. + + Realm that the user should authenticate in + A WWW-Authenticate header. + If realm is empty or null. + + + + Gets authenticator scheme + + + digest + + + + + Initializes a new instance of the class. + + Supplies users during authentication process. + + + + Used by test classes to be able to use hardcoded values + + + + + An authentication response have been received from the web browser. + Check if it's correct + + Contents from the Authorization header + Realm that should be authenticated + GET/POST/PUT/DELETE etc. + + Authentication object that is stored for the request. A user class or something like that. + + if authenticationHeader is invalid + If any of the parameters is empty or null. + + + + Encrypts parameters into a Digest string + + Realm that the user want to log into. + User logging in + Users password. + HTTP method. + Uri/domain that generated the login prompt. + Quality of Protection. + "Number used ONCE" + Hexadecimal request counter. + "Client Number used ONCE" + Digest encrypted string + + + + + + Md5 hex encoded "userName:realm:password", without the quotes. + Md5 hex encoded "method:uri", without the quotes + Quality of Protection + "Number used ONCE" + Hexadecimal request counter. + Client number used once + + + + + Create a authentication challenge. + + Realm that the user should authenticate in + A correct auth request. + If realm is empty or null. + + + + Gets the current nonce. + + + + + + Gets the Md5 hash bin hex2. + + To be hashed. + + + + + determines if the nonce is valid or has expired. + + nonce value (check wikipedia for info) + true if the nonce has not expired. + + + + Gets authentication scheme name + + + + + Gets authenticator scheme + + + + digest + + + + + Provides authentication in the web server. + + + To initiate authentication you just need to throw a Una + + + + + Add a authenticator. + + + + + + Authenticate request. + + + + + Requires that a AuthorizationHeader have been sent by the client. If not, + request one by sending a WWW-Authentication header (can be generated by the Challenge method). + + Authorization header was not found in the request. + Requested authentication scheme is not supported. + + + + Create a challenge header (WWW-authenticate) + + Response that the authentication header should be added to + Realm that the user should authenticate in + WWW-Authenticate header. + + + Scheme can currently be basic or digest. Basic is not very safe, but easier to use. + Digest is quite safe. + + + + Requested scheme is not supported. + + + + Creates a console logger. + + + + + Factory implementation used to create logs. + + + + + Create a new logger. + + Type that requested a logger. + Logger for the specified type; + + MUST ALWAYS return a logger. Return if no logging + should be used. + + + + + Initializes a new instance of the class. + + The filter. + + + + Create a new logger. + + Type that requested a logger. + Logger for the specified type; + + MUST ALWAYS return a logger. Return if no logging + should be used. + + + + + redirects from one URL to another. + + + + + Rules are used to perform operations before a request is being handled. + Rules can be used to create routing etc. + + + + + Process the incoming request. + + Request context information. + Processing result. + If any parameter is null. + + + + Initializes a new instance of the class. + + Absolute path (no server name) + Absolute path (no server name) + + server.Add(new RedirectRule("/", "/user/index")); + + + + + Initializes a new instance of the class. + + Absolute path (no server name) + Absolute path (no server name) + true if request should be redirected, false if the request URI should be replaced. + + server.Add(new RedirectRule("/", "/user/index")); + + + + + Process the incoming request. + + Request context. + Processing result. + If any parameter is null. + + + + Gets string to match request URI with. + + Is compared to request.Uri.AbsolutePath + + + + Gets whether the server should redirect the client instead of simply modifying the URI. + + + false means that the rule will replace + the current request URI with the new one from this class. + true means that a redirect response is sent to the client. + + + + + Gets where to redirect. + + + + + The Connection general-header field allows the sender to specify options + that are desired for that particular connection and MUST NOT be + communicated by proxies over further connections. + + + + HTTP/1.1 proxies MUST parse the Connection header field before a + message is forwarded and, for each connection-token in this field, + remove any header field(s) from the message with the same name as the + connection-token. Connection options are signaled by the presence of + a connection-token in the Connection header field, not by any + corresponding additional header field(s), since the additional header + field may not be sent if there are no parameters associated with that + connection option. + + Message headers listed in the Connection header MUST NOT include + end-to-end headers, such as Cache-Control. + + HTTP/1.1 defines the "close" connection option for the sender to + signal that the connection will be closed after completion of the + response. For example, + + Connection: close + + in either the request or the response header fields indicates that + the connection SHOULD NOT be considered `persistent' (section 8.1) + after the current request/response is complete. + + HTTP/1.1 applications that do not support persistent connections MUST + include the "close" connection option in every message. + + A system receiving an HTTP/1.0 (or lower-version) message that + includes a Connection header MUST, for each connection-token in this + field, remove and ignore any header field(s) from the message with + the same name as the connection-token. This protects against mistaken + forwarding of such header fields by pre-HTTP/1.1 proxies. See section + 19.6.2 in RFC2616. + + + + + + Header name + + + + + Default connection header for HTTP/1.0 + + + + + Default connection header for HTTP/1.1 + + + + + Initializes a new instance of the class. + + Connection type. + The parameters. + + + + Initializes a new instance of the class. + + The type. + + + + Returns data formatted as a HTTP header value. + + + A that represents the current . + + + + + Gets connection parameters. + + + + + Gets or sets connection type + + + + + Gets header name + + + + + Type of HTTP connection + + + + + Connection is closed after each request-response + + + + + Connection is kept alive for X seconds (unless another request have been made) + + + + + Requests message-body be sent with an encoding to be specified in the "Transfer-Encoding" header. + + + + + Helper for content types. + + + + + Flyweight design pattern implementation. + + Type of object. + + + + Initializes a new instance of the class. + + How large buffers to allocate. + + + + Get an object. + + Created object. + Will create one if queue is empty. + + + + Enqueues the specified buffer. + + Object to enqueue. + Buffer is is less than the minimum requirement. + + + + Used to create new objects. + + Type of objects to create. + Newly created object. + . + + + + A HTTP parser using delegates to which parsing methods. + + + + + Initializes a new instance of the class. + + + + + Parser method to copy all body bytes. + + + Needed since a TCP packet can contain multiple messages + after each other, or partial messages. + + + + Try to find a header name. + + + + + + Get header values. + + + Will also look for multi header values and automatically merge them to one line. + Content length is not a number. + + + + Toggle body bytes event. + + + + + + + + Raise the event, since we have successfully parsed a message and it's body. + + + + + First message line. + + Will always contain three elements. + Used to raise the or event + depending on the words in the array. + BadRequestException. + + + + Continue parsing a message + + Byte buffer containing bytes + Where to start the parsing + Number of bytes to parse + index where the parsing stopped. + Parsing failed. + + + + Parses the first line in a request/response. + + true if first line is well formatted; otherwise false. + Invalid request/response line. + + + + Reset parser to initial state. + + + + + Gets or sets current line number. + + + + + The request line has been parsed. + + + + + Response line has been parsed. + + + + + Parsed a header. + + + + + Received body bytes. + + + + + A message have been successfully parsed. + + + + + Used to be able to quickly swap parser method. + + + + + + Get or create components used in the web server framework + + + + + + + + Get or create a type. + + Type to create + Created type. + + Gets or creates types in the framework. + Check for more information on which + types the factory should contain. + + + + + Used to create all key types in the HTTP server. + + + Should have factory methods at least for the following types: + , , + , , + , , + , , + . + + Check the default implementations to see which constructor + parameters you will get. + + + HttpFactory.Add(typeof(IRequest), (type, args) => new MyRequest((string)args[0])); + + + + + + Initializes a new instance of the class. + + + + + Add a factory method for a type. + + Type to create + Method creating the type. + + + + Used to + + + + + + + Setup our singleton. + + + + + + We want to use a singleton, but we also want to be able + to let the developer to setup his own header factory. + Therefore we use this method to create our own factory only if the user + have not specified one. + + + + + Small method to create a message factory singleton and replace then default delegate method. + + + + + + + + Create a type. + + Type to create + Created type. + + + + Gets http factory for the current listener. + + + + + Delegate used to create a certain type + + Created type. + + Method must never fail. + + + + + Used to define which headers a parse is for. + + + + + Initializes a new instance of the class. + + Name of the header. + + + + Gets name of header that this parser is for. + + + + + Parses "Date" header. + + + + + Parse a header + + Name of header. + Reader containing value. + HTTP Header + Header value is not of the expected format. + + + + Authorization response + + + + A user agent that wishes to authenticate itself with a server-- + usually, but not necessarily, after receiving a 401 response--does + so by including an Authorization request-header field with the + request. The Authorization field value consists of credentials + containing the authentication information of the user agent for + the realm of the resource being requested. + + + Authorization = "Authorization" ":" credentials + + + HTTP access authentication is described in "HTTP Authentication: + Basic and Digest Access Authentication" [43]. If a request is + authenticated and a realm specified, the same credentials SHOULD + be valid for all other requests within this realm (assuming that + the authentication scheme itself does not require otherwise, such + as credentials that vary according to a challenge value or using + synchronized clocks). + When a shared cache (see section 13.7) receives a request + containing an Authorization field, it MUST NOT return the + corresponding response as a reply to any other request, unless one + of the following specific exceptions holds: + + + + If the response includes the "s-maxage" cache-control + directive, the cache MAY use that response in replying to a + subsequent request. But (if the specified maximum age has + passed) a proxy cache MUST first revalidate it with the origin + server, using the request-headers from the new request to allow + the origin server to authenticate the new request. (This is the + defined behavior for s-maxage.) If the response includes "s- + maxage=0", the proxy MUST always revalidate it before re-using + it. + + If the response includes the "must-revalidate" cache-control + directive, the cache MAY use that response in replying to a + subsequent request. But if the response is stale, all caches + MUST first revalidate it with the origin server, using the + request-headers from the new request to allow the origin server + to authenticate the new request. + + If the response includes the "public" cache-control directive, + it MAY be returned in reply to any subsequent request. + + + + + + + Name constant + + + + + Gets or sets authentication data. + + + + + Gets or sets authentication protocol. + + + + + Gets name of header. + + + + + User needs to authenticate. + + + + + + + Initializes a new instance of the class. + + Exception description. + + + + Initializes a new instance of the class. + + Exception description. + Inner exception. + + + + A response have been received. + + + + + Initializes a new instance of the class. + + The response. + + + + Gets or sets response. + + + + + Creates a single message for one of the end points. + + + The factory is + + + + + Initializes a new instance of the class. + + The MSG factory. + The factory. + The parser. + + + + Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + + 2 + + + + Received a header from parser + + + + + + + Will continue the parsing until nothing more can be parsed. + + buffer to parse + where to start in the buffer + number of bytes to process. + Position where parser stopped parsing. + Parsing failed. + + + + Reset parser. + + + Something failed, reset parser so it can start on a new request. + + + + + A request have been successfully parsed. + + + + + A response have been successfully parsed. + + + + + Client asks if he may continue. + + + If the body is too large or anything like that you should respond . + + + + + Used to notify about 100-continue header. + + + + + Initializes a new instance of the class. + + request that want to continue. + + + + Gets request that want to continue + + + + + Default log filter implementation. + + + + + Determines which classes can log + + + + + Checks if the specified type can send + log entries at the specified level. + + Log level + Type that want to write a log entry. + true if logging is allowed; otherwise false. + + + + Add a name space filter. + + Name space to add filter for. + Minimum log level required. + + + // Parsing can only add error and fatal messages + AddNamespace("SipSharp.Messages.Headers.Parsers", LogLevel.Error); + AddType(typeof(SipParser), LogLevel.Error); + + // Transport layer can only log warnings, errors and fatal messages + AddNamespace("SipSharp.Transports.*", LogLevel.Warning); + + + + + + Used to specify standard filter rules + + + Parser can only display errors. Transports only warnings. + + + + + Add filter for a type + + Type to add filter for. + Minimum log level required. + + + // Parsing can only add error and fatal messages + AddNamespace("SipSharp.Messages.Headers.Parsers", LogLevel.Error); + AddType(typeof(SipParser), LogLevel.Error); + + // Transport layer can only log warnings, errors and fatal messages + AddNamespace("SipSharp.Transports.*", LogLevel.Warning); + + + + + + Add filter for a type + + Type to add filter for. + Minimum log level required. + + + // Parsing can only add error and fatal messages + AddNamespace("SipSharp.Messages.Headers.Parsers", LogLevel.Error); + AddType("SipSharp.Messages.MessageFactory", LogLevel.Error); + + // Transport layer can only log warnings, errors and fatal messages + AddNamespace("SipSharp.Transports.*", LogLevel.Warning); + + + Type could not be identified. + + + + Checks if the specified type can send + log entries at the specified level. + + Log level + Type that want to write a log entry. + true if logging is allowed; otherwise false. + + + No filters = everything logged. = no logs. Don't use a rule with '*' or '.*' + + + + User have specified a wild card filter. + + + Wild card filters are used to log a name space and + all it's children name spaces. + + + + + Result of processing. + + + + + Continue with the next handler + + + + + No more handlers can process the request. + + + The server will process the response object and + generate a HTTP response from it. + + + + + Response have been sent back by the handler. + + + This option should only be used if you are streaming + something or sending back a custom result. The server will + not process the response object or send anything back + to the client. + + + + + Used to store all headers that that aren't recognized. + + + + + Initializes a new instance of the class. + + The name. + The value. + + + + Gets or sets value + + + + + Gets header name + + + + + Parses . + + + + + Parse a header + + Name of header. + Reader containing value. + HTTP Header + Header value is not of the expected format. + + + + Collection of parameters + + + + + Get a parameter. + + + + + + + Add a query string parameter. + + Parameter name + Value + + + + Checks if the specified parameter exists + + Parameter name. + true if found; otherwise false; + + + + Gets number of parameters. + + + + + Gets last value of an parameter. + + Parameter name + String if found; otherwise null. + + + + Parameter in + + + + + Gets *last* value. + + + Parameters can have multiple values. This property will always get the last value in the list. + + String if any value exist; otherwise null. + + + + Gets or sets name. + + + + + Gets a list of all values. + + + + + A parameter in . + + + + + Returns an enumerator that iterates through the collection. + + + A that can be used to iterate through the collection. + + 1 + + + + Returns an enumerator that iterates through a collection. + + + An object that can be used to iterate through the collection. + + 2 + + + + Gets last value. + + + Parameters can have multiple values. This property will always get the last value in the list. + + String if any value exist; otherwise null. + + + + Gets or sets name. + + + + + Gets a list of all values. + + + + + Used when the request line have been successfully parsed. + + + + + Initializes a new instance of the class. + + The HTTP method. + The URI path. + The HTTP version. + + + + Initializes a new instance of the class. + + + + + Gets or sets HTTP method. + + + Should be one of the methods declared in . + + + + + Gets or sets requested URI path. + + + + + Gets or sets the version of the SIP protocol that the client want to use. + + + + + Content-type + + + + + Header name. + + + + + Initializes a new instance of the class. + + Type of the content. + Value parameters. + + + + Initializes a new instance of the class. + + Type of the content. + + + + Returns data formatted as a HTTP header value. + + + A that represents the current . + + + + + Gets all parameters. + + + + + Gets content type. + + + + + Gets header name + + + + + Requested resource may not be accessed. + + + Normally thrown after an authentication attempt have failed too many times. + + + + + + Initializes a new instance of the class. + + Exception description. + + + + Initializes a new instance of the class. + + Exception description. + Inner exception. + + + + Stream-based multipart handling. + + In this incarnation deals with an HttpInputStream as we are now using + IntPtr-based streams instead of byte []. In the future, we will also + send uploads above a certain threshold into the disk (to implement + limit-less HttpInputFiles). + + + Taken from HttpRequest in mono (http://www.mono-project.com) + + + + + Client X.509 certificate, X.509 chain, and any SSL policy errors encountered + during the SSL stream creation + + + + + Initializes a new instance of the class. + + The certificate. + Client security certificate chain. + Any SSL policy errors encountered during the SSL stream creation. + + + + Client security certificate + + + + + Client security certificate chain + + + + + Any SSL policy errors encountered during the SSL stream creation + + + + + Credits and description: http://theinstructionlimit.com/?p=76 + + + Converted to .Net 2.0 + + + + + Session in the system + + + + + Gets or sets session id. + + + + + Factory creating null logger. + + + + + Initializes a new instance of the class. + + + + + Create a new logger. + + Type that requested a logger. + Logger for the specified type; + + MUST ALWAYS return a logger. Return if no logging + should be used. + + + + + Logger instance. + + + + + Provides resources. + + + + + Used to access resources. + + + + + Add a new resource loader. + + Provider to add. + Manager have been started. + + + + Check if a resource exists. + + Uri to check + true if found; otherwise false. + + + if (manager.Exists("/views/user/view.haml")) + return true + + + + + + Get a resource. + + Uri path to resource. + Resource if found; otherwise null. + + + Resource resource = manager.Get("/views/user/view.haml"); + + + + + + Start manager. + + + + + Gets number of resource providers + + + + + Get all view names from a folder. + + Path to find views in. + A collection of view names (without path). + + + + Add a new resource loader. + + Provider to add. + Manager have been started. + + + + Start manager. + + + + + Check if a resource exists. + + Uri to check + true if found; otherwise false. + + + if (manager.Exists("/views/user/view.haml")) + return true + + + + + + Get a resource. + + Uri path to resource. + Resource if found; otherwise null. + + + Resource resource = manager.Get("/views/user/view.haml"); + + + + + + Gets number of resource providers + + + + + Loads resources that are embedded in assemblies. + + + No locks used internally since all mappings are loaded during start up. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + Path (Uri) requested by clients + Assembly that the resources exist in + Name space that the resources exist in + + + + Add a specific resource. + + Path (Uri) requested by clients + Assembly that the resources exist in + Name space to root folder under (all name spaces below the specified one are considered as folders) + Name space and name of resource. + + + Add("/", Assembly.GetExecutingAssembly(), "MyApplication.Files", "Myapplication.Files.Images.MyImage.png"); + + + + + + Add resources. + + Path (Uri) requested by clients + Assembly that the resources exist in + Name of resource, including name space. + true if file was found (and has not previously been added); otherwise false. + + + + + + Add resources in a specific path (will not work with sub folders) + + Path (Uri) requested by clients + Assembly that the resources exist in + Name space to root folder under which all name spaces exists in, + true if any files was found; otherwise false. + + + Adds all views in the specified folder. Sub folders are not supported since it's hard to determine + with parts are the path and witch parts are the filename. Use to get support + for sub folders. + + + + + Add("/user/", typeof(MyController).Assembly, "YourProject.Users.Views"); + + + + + + Add resources in a folder and it's sub folder + + + + + + This method is not going to map files but keep the mapping and + try to look up views every time they are requested. This is the method + to use to add a resource folder that has sub folders. + + + + + + Tries to load file by using previously added paths. + + Uri path including file name + + + + + Checks if a resource exists in the specified directory + + Uri path to resource + true if resource was found; otherwise false. + + + if (resources.Exists("/files/user/user.png")) + Debug.WriteLine("Resource exists."); + + + + + + Load a resource. + + Uri of resource. + Resource if found and loaded; otherwise null. + + + + Find all views in a folder/path. + + Uri path + Collection to add all view names to. + + + + Loads all files in a resource directory + + + + + + Gets or sets assembly that the resource exists in. + + + + + Gets or sets resource name. + + + + + Gets or sets full name space path to resource. + + + + + Gets or sets if this file is for a certain content type. + + + + + Gets or sets full "virtual" Uri path, excluding file name. + + + + + Gets or sets assembly + + + + + Gets or sets name space root. + + + + + Gets or sets uri path. + + + + + A list of request cookies. + + + + + Let's copy all the cookies. + + value from cookie header. + + + + Initializes a new instance of the class. + + + + + Adds a cookie in the collection. + + cookie to add + cookie is null + Name must be specified. + + + + Remove all cookies. + + + + + Remove a cookie from the collection. + + Name of cookie. + + + + Gets a collection enumerator on the cookie list. + + collection enumerator + + + + Returns an enumerator that iterates through the collection. + + + + A that can be used to iterate through the collection. + + 1 + + + + Gets the count of cookies in the collection. + + + + + Gets the cookie of a given identifier (null if not existing). + + + + + Collection of headers. + + + + + Collection of headers. + + + + + Gets a header + + header name. + header if found; otherwise null. + + + + Initializes a new instance of the class. + + Factory used to created headers. + + + + Adds a header + + + Will replace any existing header with the same name. + + header to add + header is null. + Header name cannot be null. + + + + Add a header. + + Header name + Header value + + Will try to parse the header and create a object. + + Header value is not correctly formatted. + name or value is null. + + + + Add a header. + + Header name + Header value + + Will try to parse the header and create a object. + + name or value is null. + + + + Get a header + + Type that it should be cast to + Name of header + Header if found and casted properly; otherwise null. + + + + Returns an enumerator that iterates through the collection. + + + A that can be used to iterate through the collection. + + 1 + + + + Returns an enumerator that iterates through a collection. + + + An object that can be used to iterate through the collection. + + 2 + + + + Gets a header + + header name. + header if found; otherwise null. + + + + Header for "Date" and "If-Modified-Since" + + + + The field value is an HTTP-date, as described in section 3.3.1 in RFC2616; + it MUST be sent in RFC 1123 [8]-date format. An example is + + Date: Tue, 15 Nov 1994 08:12:31 GMT + + Origin servers MUST include a Date header field in all + responses, except in these cases: + + If the response status code is 100 (Continue) or 101 (Switching + Protocols), the response MAY include a Date header field, at the server's + option. + If the response status code conveys a server error, e.g. 500 + (Internal Server Error) or 503 (Service Unavailable), and it is inconvenient + or impossible to generate a valid Date. + If the server does not have a clock that can provide a + reasonable approximation of the current time, its responses MUST NOT include + a Date header field. In this case, the rules in section 14.18.1 in RFC2616 + MUST be followed. + + + A received message that does not have a Date header field MUST + be assigned one by the recipient if the message will be cached by that + recipient or gatewayed via a protocol which requires a Date. An HTTP + implementation without a clock MUST NOT cache responses without revalidating + them on every use. An HTTP cache, especially a shared cache, SHOULD use a + mechanism, such as NTP [28], to synchronize its clock with a reliable + external standard. + Clients SHOULD only send a Date header field in messages that + include an entity-body, as in the case of the PUT and POST requests, and + even then it is optional. A client without a clock MUST NOT send a Date + header field in a request. + The HTTP-date sent in a Date header SHOULD NOT represent a date + and time subsequent to the generation of the message. It SHOULD represent + the best available approximation of the date and time of message generation, + unless the implementation has no means of generating a reasonably accurate + date and time. In theory, the date ought to represent the moment just before + the entity is generated. In practice, the date can be generated at any time + during the message origination without affecting its semantic value. + + + + + + Header name + + + + + Initializes a new instance of the class. + + Header name. + Name must not be empty. + + + + Initializes a new instance of the class. + + Header name. + Universal time. + + + + Returns data formatted as a HTTP header value. + + + A that represents the current . + + + + + Gets or sets date time. + + Should be in UTC. + + + + Gets header name + + + + + Type cached for fast property value modifications. + + + + + Get a property value. + + Instance to get value from. + Name of property. + Property value. + + + + Assign a value, try to convert it if it's not the same type as the property type. + + Object containing the property + Name of property + Value to convert and assign + Failed to find property. + Could not convert value type to property type. + + + + Assign value to a property + + Object containing the property + Name of property + Value to assign, must be of the same type as the property. + Failed to find property. + + + + Used to cache property information + + + + + Gets the property. + + The name. + + Failed to find property. + + + InvalidCastException. + + + + Get a property value. + + Instance to get value from. + Name of property. + Property value. + + + + Assign a value, try to convert it if it's not the same type as the property type. + + Object containing the property + Name of property + Value to convert and assign + Failed to find property. + Could not convert value type to property type. + + + + Assign value to a property + + Object containing the property + Name of property + Value to assign, must be of the same type as the property. + Failed to find property. + + + + Gets or sets member info + + + + + Gets or sets member type + + + + + Base interface to read string tokens from different sources. + + + + + Assign a new buffer + + Buffer to process. + Where to start process buffer + Buffer length + + + + Assign a new buffer + + Buffer to process + + + + Consume current character. + + + + + Consume specified characters + + One or more characters. + + + + Consumes horizontal white spaces (space and tab). + + + + + Consume horizontal white spaces and the specified character. + + Extra character to consume + + + + Checks if one of the remaining bytes are a specified character. + + Character to find. + true if found; otherwise false. + + + + Read a character. + + Character if not EOF; otherwise null. + + + + Get a text line. + + + Will merge multiline headers. + + + + Read quoted string + + string if current character (in buffer) is a quote; otherwise null. + + + + Read until end of string, or to one of the delimiters are found. + + characters to stop at + A string (can be ). + + Will not consume the delimiter. + + + + + Read until end of string, or to one of the delimiters are found. + + A string (can be ). + + Will not consume the delimiter. + + + + + Read to end of buffer, or until specified delimiter is found. + + Delimiter to find. + A string (can be ). + + Will not consume the delimiter. + + + + + Will read until specified delimiter is found. + + Character to stop at. + A string if the delimiter was found; otherwise null. + + Will trim away spaces and tabs from the end. + Will not consume the delimiter. + + + + + Read until one of the delimiters are found. + + characters to stop at + A string if one of the delimiters was found; otherwise null. + + Will trim away spaces and tabs from the end. + Will not consume the delimiter. + + + + + Read until a horizontal white space occurs. + + A string if a white space was found; otherwise null. + + + + Gets current character + + if end of buffer. + + + + Gets if end of buffer have been reached + + + + + Gets if more bytes can be processed. + + + + + Gets or sets current position in buffer. + + + THINK before you manually change the position since it can blow up + the whole parsing in your face. + + + + + Gets total length of buffer. + + + + + Gets or sets line number. + + + + + Gets next character + + if end of buffer. + + + + Gets number of bytes left. + + + + + Factory is used to create new logs in the system. + + + + + Assigns log factory being used. + + The log factory. + A factory have already been assigned. + + + + Create a new logger. + + Type that requested a logger. + Logger for the specified type; + + + + Component that should be registered in the container. + + + Register using all interfaces that is specified in this assembly. + + + + + Used to authenticate users + + + Authentication is requested by throwing + + + + + Request implementation. + + + + + Initializes a new instance of the class. + + The method. + The path. + The version. + + + + Get a header + + Type that it should be cast to + Name of header + Header if found and casted properly; otherwise null. + + + + Add a new header. + + + + + + + Add a new header. + + Header to add. + + + + Returns an enumerator that iterates through the collection. + + + A that can be used to iterate through the collection. + + 1 + + + + Returns an enumerator that iterates through a collection. + + + An object that can be used to iterate through the collection. + + 2 + + + + Gets a header. + + + + + + + Gets request URI. + + + + + Gets cookies. + + + + + Gets all uploaded files. + + + + + Gets query string and form parameters + + + + + Gets form parameters. + + + + + Gets query string. + + + + + Gets if request is an Ajax request. + + + + + Gets or sets connection header. + + + + + Gets or sets HTTP version. + + + + + Gets or sets HTTP method. + + + + + Gets requested URI. + + + + + Kind of content in the body + + Default is text/html + + + + Gets or sets encoding + + + + + Gets headers. + + + + + Gets body stream. + + + + + Size of the body. MUST be specified before sending the header, + unless property Chunked is set to true. + + + Any specifically assigned value or Body stream length. + + + + + Event arguments used when a new header have been parsed. + + + + + Initializes a new instance of the class. + + Name of header. + Header value. + Name cannot be empty + value is null. + + + + Initializes a new instance of the class. + + + + + Gets or sets header name. + + + + + Gets or sets header value. + + + + + Collection of parameters. + + + or is not used since each parameter can + have multiple values. + + + + + Initializes a new instance of the class. + + Collections to merge. + + Later collections will overwrite parameters from earlier collections. + + + + + Initializes a new instance of the class. + + + + + Get a list of string arrays. + + + + + + Get parameters + + Sub array (text array) + + + + + Returns an enumerator that iterates through the collection. + + + A that can be used to iterate through the collection. + + 1 + + + + Returns an enumerator that iterates through a collection. + + + An object that can be used to iterate through the collection. + + 2 + + + + Get a parameter. + + + + + + + Add a query string parameter. + + Parameter name + Value + + + + Checks if the specified parameter exists + + Parameter name. + true if found; otherwise false; + + + + Gets number of parameters. + + + + + Gets last value of an parameter. + + Parameter name + String if found; otherwise null. + + + + Parses . + + + + + Parse a header + + Name of header. + Reader containing value. + HTTP Header + Header value is not of the expected format. + + + + Parses numerical values + + + + + Parse a header + + Name of header. + Reader containing value. + HTTP Header + Header value is not of the expected format. + + + + Parses . + + + + + Parse a header + + Name of header. + Reader containing value. + HTTP Header + Header value is not of the expected format. + + + + Request couldn't be parsed successfully. + + + + + Initializes a new instance of the class. + + Exception description. + + + + Initializes a new instance of the class. + + Exception description. + Exception description. + + + + Implements basic authentication scheme. + + + + + Create a response that can be sent in the WWW-Authenticate header. + + Realm that the user should authenticate in + Not used by basic authentication + A WWW-Authenticate header. + Argument is null. + + + + An authentication response have been received from the web browser. + Check if it's correct + + Authorization header + Realm that should be authenticated + GET/POST/PUT/DELETE etc. + Authentication object that is stored for the request. A user class or something like that. + if authenticationHeader is invalid + If any of the paramters is empty or null. + + + + Gets authenticator scheme + + + + digest + + + + + Reads strings from a byte array. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + Encoding to use when converting byte array to strings. + + + + Initializes a new instance of the class. + + Buffer to read from. + Encoding to use when converting byte array to strings. + + + + Assign a new buffer + + Buffer to process. + Where to start process buffer + Buffer length + Buffer needs to be a byte array + + + + Assign a new buffer + + Buffer to process + Buffer needs to be a byte array + + + + Consume current character. + + + + + Get a text line. + + + Will merge multi line headers. + + + + Read quoted string + + string if current character (in buffer) is a quote; otherwise null. + + + + Read until end of string, or to one of the delimiters are found. + + characters to stop at + + A string (can be ). + + + Will not consume the delimiter. + + InvalidOperationException. + + + + Read until end of string, or to one of the delimiters are found. + + A string (can be ). + + Will not consume the delimiter. + + + + + Read to end of buffer, or until specified delimiter is found. + + Delimiter to find. + + A string (can be ). + + + Will not consume the delimiter. + + InvalidOperationException. + + + + Consume specified characters + + One or more characters. + + + + Consumes horizontal white spaces (space and tab). + + + + + Consume horizontal white spaces and the specified character. + + Extra character to consume + + + + Read a character. + + + Character if not EOF; otherwise null. + + + + + Will read until specified delimiter is found. + + Character to stop at. + + A string if the delimiter was found; otherwise null. + + + Will trim away spaces and tabs from the end. + InvalidOperationException. + + + + Read until one of the delimiters are found. + + characters to stop at + + A string if one of the delimiters was found; otherwise null. + + + Will not consume the delimiter. + + InvalidOperationException. + + + + Read until a horizontal white space occurs. + + A string if a white space was found; otherwise null. + + + + Checks if one of the remaining bytes are a specified character. + + Character to find. + + true if found; otherwise false. + + + + + Gets or sets line number. + + + + + Gets if end of buffer have been reached + + + + + + Gets if more bytes can be processed. + + + + + + Gets next character + + if end of buffer. + + + + Gets current character + + if end of buffer. + + + + Gets or sets current position in buffer. + + + THINK before you manually change the position since it can blow up + the whole parsing in your face. + + + + + Gets total length of buffer. + + + + + + Gets number of bytes left. + + + + + Response to a request. + + + + + Redirect user. + + Where to redirect to. + + Any modifications after a redirect will be ignored. + + + + + Gets connection type. + + + + + Gets cookies. + + + + + Gets HTTP version. + + + Default is HTTP/1.1 + + + + + Information about why a specific status code was used. + + + + + Status code that is sent to the client. + + Default is + + + + Gets or sets content type + + + + + Request context + + + Contains information about a HTTP request and where it came from. + + + + + Gets or sets http context. + + + + + Gets or sets http request. + + + + + Gets or sets http response. + + + + + Contains numerical value. + + + + + Initializes a new instance of the class. + + The name. + The value. + + + + Returns data formatted as a HTTP header value. + + + A that represents the current . + + + + + Gets value + + + + + Gets header name + + + + + Form parameters where form string arrays have been converted to real arrays. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The name. + The value. + + + + Initializes a new instance of the class. + + Parse parameters from the this collection. + + + + Get a parameter. + + + + + + + Add a parameter + + Name of parameter, can contain a string array. + Value + + + ArrayParameterCollection array = new ArrayParameterCollection(); + array.Add("user[FirstName]", "Jonas"); + array.Add("user[FirstName]", "Arne"); + string firstName = array["user"]["FirstName"].Value; // "Arne" is returned + foreach (string value in array["user"]["FirstName"]) + Console.WriteLine(value); // each name is displayed. + + + + + + Checks if the specified parameter exists + + Parameter name. + true if found; otherwise false; + + + + Returns an enumerator that iterates through the collection. + + + A that can be used to iterate through the collection. + + 1 + + + + Gets first value of an item. + + + String if found; otherwise null. + + + + Gets number of parameters. + + + + + Gets last value of an parameter. + + Parameter name + String if found; otherwise null. + + + + Assign properties from HTTP parameters. + + + + + Used to filter out properties. + + Filter handler. + Handler have already been set. + + + + Assign properties in the specified object. + + Object to fill. + Contains all parameters that should be assigned to the properties. + Properties was not found or value could not be converted. + Any parameter is null. + + + + Used to be able to filter properties + + Model having it's properties assigned + Property about to be assigned + Value to assign + true if value can be set; otherwise false. + + + + Failed to assign properties. + + + + + Initializes a new instance of the class. + + The property errors. + + + + Gets all errors during assignment. + + + Dictionary key is property name. + + + + + Used to read from a string object. + + + + + Initializes a new instance of the class. + + Buffer to process. + + + + Initializes a new instance of the class. + + + + + Assign a new buffer + + Buffer to process. + Where to start process buffer + Buffer length + MUST be of type . + buffer needs to be of type string + + + + Assign a new buffer + + Buffer to process + MUST be of type . + buffer needs to be of type string + + + + Consume current character. + + + + + Get a text line. + + + Will merge multiline headers. + + + + Read quoted string + + string if current character (in buffer) is a quote; otherwise null. + + + + Read until end of string, or to one of the delimiters are found. + + characters to stop at + A string (can be ). + InvalidOperationException. + + + + Read until end of string, or to one of the delimiters are found. + + A string (can be ). + + Will not consume the delimiter. + + + + + Read to end of buffer, or until specified delimiter is found. + + Delimiter to find. + A string (can be ). + InvalidOperationException. + + + + Consume specified characters + + One or more characters. + + + + Consumes horizontal white spaces (space and tab). + + + + + Read a character. + + + Character if not EOF; otherwise null. + + + + + Will read until specified delimiter is found. + + Character to stop at. + + A string if the delimiter was found; otherwise null. + + + Will trim away spaces and tabs from the end. + Will not consume the delimiter. + + InvalidOperationException. + + + + Read until one of the delimiters are found. + + characters to stop at + + A string if one of the delimiters was found; otherwise null. + + + Will not consume the delimiter. + + InvalidOperationException. + + + + Read until a horizontal white space occurs (or end, or end of line). + + + A string if a white space was found; otherwise null. + + + + + Consume horizontal white spaces and the specified character. + + Extra character to consume + + + + Checks if one of the remaining bytes are a specified character. + + Character to find. + + true if found; otherwise false. + + + + + Gets or sets line number. + + + + + Gets if end of buffer have been reached + + + + + + Gets if more bytes can be processed. + + + + + + Gets next character + + if end of buffer. + + + + Gets current character + + if end of buffer. + + + + Gets or sets current position in buffer. + + + THINK before you manually change the position since it can blow up + the whole parsing in your face. + + + + + Gets total length of buffer. + + + + + + Gets number of bytes left. + + + + + Default log writer, writes everything to void (nowhere). + + + + + + The logging instance. + + + + + Write an entry that helps when debugging code. + + Log message + + + + Write an entry that helps when debugging code. + + Log message + Thrown exception to log. + + + + Write a entry needed when following through code during hard to find bugs. + + Log message + + + + Write a entry that helps when trying to find hard to find bugs. + + Log message + Thrown exception to log. + + + + Informational message, needed when helping customer to find a problem. + + Log message + + + + Informational message, needed when helping customer to find a problem. + + Log message + Thrown exception to log. + + + + Something is not as we expect, but the code can continue to run without any changes. + + Log message + + + + Something is not as we expect, but the code can continue to run without any changes. + + Log message + Thrown exception to log. + + + + Something went wrong, but the application do not need to die. The current thread/request + cannot continue as expected. + + Log message + + + + Something went wrong, but the application do not need to die. The current thread/request + cannot continue as expected. + + Log message + Thrown exception to log. + + + + Something went very wrong, application might not recover. + + Log message + + + + Something went very wrong, application might not recover. + + Log message + Thrown exception to log. + + + + Priority for log entries + + + + + + Very detailed logs to be able to follow the flow of the program. + + + + + Logs to help debug errors in the application + + + + + Information to be able to keep track of state changes etc. + + + + + Something did not go as we expected, but it's no problem. + + + + + Something that should not fail failed, but we can still keep + on going. + + + + + Something failed, and we cannot handle it properly. + + + + + This class writes to the console. + + + It colors the output depending on the log level + and includes a 3-level stack trace (in debug mode) + + + + + + Initializes a new instance of the class. + + Type being logged. + Log filter. + + + + Get color for the specified log level + + Level for the log entry + A for the level + + + + Write an entry + + Importance of the log message + The message. + + + + Write an entry that helps when debugging code. + + Log message + + + + Write an entry that helps when debugging code. + + Log message + Thrown exception to log. + + + + Write a entry needed when following through code during hard to find bugs. + + Log message + + + + Write a entry that helps when trying to find hard to find bugs. + + Log message + Thrown exception to log. + + + + Informational message, needed when helping customer to find a problem. + + Log message + + + + Informational message, needed when helping customer to find a problem. + + Log message + Thrown exception to log. + + + + Something is not as we expect, but the code can continue to run without any changes. + + Log message + + + + Something is not as we expect, but the code can continue to run without any changes. + + Log message + Thrown exception to log. + + + + Something went wrong, but the application do not need to die. The current thread/request + cannot continue as expected. + + Log message + + + + Something went wrong, but the application do not need to die. The current thread/request + cannot continue as expected. + + Log message + Thrown exception to log. + + + + Something went very wrong, application might not recover. + + Log message + + + + Something went very wrong, application might not recover. + + Log message + Thrown exception to log. + + + + Gets or sets type that the logger is for + + + + + A HTTP context + + + + + + + + Context that received a HTTP request. + + + + + Disconnect context. + + + + + Gets if current context is using a secure connection. + + + + + Gets logger. + + + + + Gets remote end point + + + + + Gets stream used to send/receive data to/from remote end point. + + + + The stream can be any type of stream, do not assume that it's a network + stream. For instance, it can be a or a ZipStream. + + + + + + Gets the currently handled request + + The request. + + + + Gets the response that is going to be sent back + + The response. + + + + Initializes a new instance of the class. + + Socket received from HTTP listener. + Context used to parse incoming messages. + + + + Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + + 2 + + + + Disconnect context. + + + + + Close and release socket. + + + + + Create stream used to send and receive bytes from the socket. + + Socket to wrap + Stream + Stream could not be created. + + + + Interpret incoming data. + + + + + + A request was received from the parser. + + + + + + + Parse all complete requests in buffer. + + + offset in buffer where parsing stopped. + Parsing failed. + + + + Start content. + + A socket operation failed. + Reading from stream failed. + + + + Gets currently executing HTTP context. + + + + + Gets or sets description + + + + + gets factory used to build request objects + + + + + Gets socket + + + + + Gets remove end point + + + + + Gets network stream. + + + + + Gets the currently handled request + + The request. + + + + Gets the response that is going to be sent back + + The response. + + + + Gets logger. + + + + + Gets if current context is using a secure connection. + + + + + Triggered for all requests in the server (after the response have been sent) + + + + + Triggered for current request (after the response have been sent) + + + + + A new request have been received. + + + + + A new request have been received (invoked for ALL requests) + + + + + Client have been disconnected. + + + + + Client asks if he may continue. + + + If the body is too large or anything like that you should respond . + + + + + Initializes a new instance of the class. + + SSL protocol to use. + The socket. + The context. + Server certificate to use. + + + + Create stream used to send and receive bytes from the socket. + + Socket to wrap + Stream + Stream could not be created. + + + + Gets or sets client certificate. + + + + + Gets used protocol. + + + + + Gets or sets if client certificate should be used instead of server certificate. + + + + + Resource information. + + + Used by content providers to be able to get information + on resources (views, files etc). + + + + + Gets or sets date when resource was modified. + + + if not used. + + + Should always be universal time. + + + + + Gets or sets resource stream. + + + + + Contains parameters for HTTP headers. + + + + + Add a parameter + + name + value + + Existing parameter with the same name will be replaced. + + + + + Parse parameters. + + Parser containing buffer to parse. + A collection with all parameters (or just a empty collection). + Expected a value after equal sign. + + + + Parse parameters. + + Parser containing buffer to parse. + Parameter delimiter + A collection with all parameters (or just a empty collection). + Expected a value after equal sign. + + + + Returns a that represents the current . + + + A that represents the current . + + + + + Gets or sets a value + + parameter name + value if found; otherwise null. + + + + Create a HTTP response object. + + + + + Initializes a new instance of the class. + + HTTP Version. + HTTP status code. + Why the status code was selected. + Version must start with 'HTTP/' + + + + Initializes a new instance of the class. + + Context that the response will be sent through. + Request that the response is for. + Version must start with 'HTTP/' + + + + Redirect user. + + Where to redirect to. + + Any modifications after a redirect will be ignored. + + + + + Add a new header. + + + + + + + Add a new header. + + Header to add. + + + + Returns an enumerator that iterates through the collection. + + + A that can be used to iterate through the collection. + + 1 + + + + Returns an enumerator that iterates through a collection. + + + An object that can be used to iterate through the collection. + + 2 + + + + Gets a header. + + + + + + + Gets connection type. + + + + + Status code that is sent to the client. + + Default is + + + + Gets HTTP version. + + + Default is HTTP/1.1 + + + + + Information about why a specific status code was used. + + + + + Size of the body. MUST be specified before sending the header, + unless property Chunked is set to true. + + + Any specifically assigned value or Body stream length. + + + + + Kind of content in the body + + Default is text/html + + + + Gets or sets encoding + + + + + Gets cookies. + + + + + Gets body stream. + + + + + Gets headers. + + + + + A request have been received. + + + + + Initializes a new instance of the class. + + The request. + End point that the request was received from. + + + + End point that the message was received from. + + + + + Received request. + + + + + Class to make dynamic binding of redirects. Instead of having to specify a number of similar redirect rules + a regular expression can be used to identify redirect URLs and their targets. + + + [a-z0-9]+)", "/users/${target}/?find=true", RegexOptions.IgnoreCase) + ]]> + + + + + Initializes a new instance of the class. + + Expression to match URL + Expression to generate URL + + [a-zA-Z0-9]+)", "/user/${first}")); + Result of ie. /employee1 will then be /user/employee1 + ]]> + + + + + Initializes a new instance of the class. + + Expression to match URL + Expression to generate URL + Regular expression options to use, can be null + + [a-zA-Z0-9]+)", "/user/{first}", RegexOptions.IgnoreCase)); + Result of ie. /employee1 will then be /user/employee1 + ]]> + + + + + Initializes a new instance of the class. + + Expression to match URL + Expression to generate URL + Regular expression options to apply + true if request should be redirected, false if the request URI should be replaced. + + [a-zA-Z0-9]+)", "/user/${first}", RegexOptions.None)); + Result of ie. /employee1 will then be /user/employee1 + ]]> + + Argument is null. + + + + + Process the incoming request. + + Request context. + Processing result. + If any parameter is null. + + + + cookie being sent back to the browser. + + + + + + Constructor. + + cookie identifier + cookie content + cookie expiration date. Use for session cookie. + id or content is null + id is empty + + + + Create a new cookie + + name identifying the cookie + cookie value + when the cookie expires. Setting will delete the cookie when the session is closed. + Path to where the cookie is valid + Domain that the cookie is valid for. + + + + Create a new cookie + + Name and value will be used + when the cookie expires. + + + + Gets the cookie HTML representation. + + cookie string + + + + Gets when the cookie expires. + + means that the cookie expires when the session do so. + + + + Gets path that the cookie is valid under. + + + + + The Cache-Control general-header field is used to specify directives that + MUST be obeyed by all caching mechanisms along the request/response + chain. . + + + + The directives specify behavior intended to prevent caches from adversely + interfering with the request or response. These directives typically + override the default caching algorithms. Cache directives are + unidirectional in that the presence of a directive in a request does not + imply that the same directive is to be given in the response. + Note that HTTP/1.0 caches might not implement Cache-Control and + might only implement Pragma: no-cache (see section 14.32 in RFC2616). + Cache directives MUST be passed through by a proxy or gateway + application, regardless of their significance to that application, since the + directives might be applicable to all recipients along the request/response + chain. It is not possible to specify a cache- directive for a specific cache + + + When a directive appears without any 1#field-name parameter, the + directive applies to the entire request or response. When such a + directive appears with a 1#field-name parameter, it applies only to + the named field or fields, and not to the rest of the request or + response. This mechanism supports extensibility; implementations of + future versions of the HTTP protocol might apply these directives to + header fields not defined in HTTP/1.1. + + + The cache-control directives can be broken down into these general + categories: + + + Restrictions on what are cacheable; these may only be imposed by + the origin server. + + Restrictions on what may be stored by a cache; these may be + imposed by either the origin server or the user agent. + + Modifications of the basic expiration mechanism; these may be + imposed by either the origin server or the user agent. + + Controls over cache revalidation and reload; these may only be + imposed by a user agent. + + Control over transformation of entities. + + Extensions to the caching system. + + + + + + + + Header name + + + + + Gets header name + + + + + Serves files in the web server. + + + + FileModule fileModule = new FileModule(); + fileModule.Resources.Add(new FileResources("/", "C:\\inetpub\\myweb")); + + + + + + Initializes a new instance of the class. + + baseUri or basePath is null. + + + + Mime types that this class can handle per default + + + Contains the following mime types: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Will send a file to client. + + HTTP context containing outbound stream. + Response containing headers. + File stream + + + + Process a request. + + Request information + What to do next. + Failed to find file extension + Forbidden file type. + + + + Gets a list with all allowed content types. + + All other mime types will result in . + + + + Gets provider used to add files to the file manager, + + + + + Collection of files. + + + + + Checks if a file exists. + + Name of the file (form item name) + + + + + Add a new file. + + File to add. + + + + Remove all files from disk. + + + + + Get a file + + Name in form + File if found; otherwise null. + + + + Gets number of files + + + + From 84789ff4d5c162e3c92205f82acb7c26a94abf42 Mon Sep 17 00:00:00 2001 From: stevenh Date: Mon, 20 Feb 2012 21:44:25 +0000 Subject: [PATCH 37/73] Fixed GetUser not locating users by ID and hence GetUserById not working either, fixes #395 --- TShockAPI/DB/UserManager.cs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/TShockAPI/DB/UserManager.cs b/TShockAPI/DB/UserManager.cs index afb0d8dc..7aa6a0d3 100644 --- a/TShockAPI/DB/UserManager.cs +++ b/TShockAPI/DB/UserManager.cs @@ -257,14 +257,12 @@ namespace TShockAPI.DB try { QueryResult result; - if (string.IsNullOrEmpty(user.Address)) - { + if (0 != user.ID) + result = database.QueryReader("SELECT * FROM Users WHERE ID=@0", user.ID); + else if (string.IsNullOrEmpty(user.Address)) result = database.QueryReader("SELECT * FROM Users WHERE Username=@0", user.Name); - } else - { result = database.QueryReader("SELECT * FROM Users WHERE IP=@0", user.Address); - } if (result.Read()) { @@ -273,7 +271,9 @@ namespace TShockAPI.DB if (!result.Read()) return user; - if (string.IsNullOrEmpty(user.Address)) + if (0 != user.ID) + throw new UserManagerException(String.Format("Multiple users found for id '{0}'", user.ID)); + else if (string.IsNullOrEmpty(user.Address)) throw new UserManagerException(String.Format("Multiple users found for name '{0}'", user.Name)); else throw new UserManagerException(String.Format("Multiple users found for ip '{0}'", user.Address)); From d34199b17de3108610a66e140e679c37331f184a Mon Sep 17 00:00:00 2001 From: stevenh Date: Mon, 20 Feb 2012 22:31:16 +0000 Subject: [PATCH 38/73] Refactored server stop and world save operations fixing race conditions so as to ensure operations always happen in a predicable order. This fixes output not appearing in the console / log for example. This adds TShock.Utils.StopServer method used by IGA, rcon and the RestAPI. Fixed console title set not working Optimised command line parsing Made Utils a singleton to enforce the fact that only one copy should ever exist Added name to /v2/user/read output as users can be found by id --- TShockAPI/BackupManager.cs | 6 +- TShockAPI/Commands.cs | 62 ++++++++--------- TShockAPI/RconHandler.cs | 4 +- TShockAPI/Rest/RestManager.cs | 16 ++--- TShockAPI/SaveManager.cs | 123 ++++++++++++++++++++++++++++++++++ TShockAPI/TShock.cs | 92 ++++++++++++------------- TShockAPI/Utils.cs | 46 +++++++------ 7 files changed, 228 insertions(+), 121 deletions(-) create mode 100644 TShockAPI/SaveManager.cs diff --git a/TShockAPI/BackupManager.cs b/TShockAPI/BackupManager.cs index 8aa8c2f5..4bce32cc 100644 --- a/TShockAPI/BackupManager.cs +++ b/TShockAPI/BackupManager.cs @@ -63,11 +63,7 @@ namespace TShockAPI TShock.Utils.Broadcast("Server map saving, potential lag spike"); Console.WriteLine("Backing up world..."); - Thread SaveWorld = new Thread(TShock.Utils.SaveWorld); - SaveWorld.Start(); - - while (SaveWorld.ThreadState == ThreadState.Running) - Thread.Sleep(50); + SaveManager.Instance.SaveWorld(); Console.WriteLine("World backed up"); Console.ForegroundColor = ConsoleColor.Gray; Log.Info(string.Format("World backed up ({0})", Main.worldPathName)); diff --git a/TShockAPI/Commands.cs b/TShockAPI/Commands.cs index 5000f618..436ae4ee 100755 --- a/TShockAPI/Commands.cs +++ b/TShockAPI/Commands.cs @@ -1007,38 +1007,37 @@ namespace TShockAPI } } - TShock.Utils.ForceKickAll("Server shutting down!"); - WorldGen.saveWorld(); - Netplay.disconnect = true; + TShock.Utils.StopServer(); } - //Added restart command - private static void Restart(CommandArgs args) - { - if (Main.runningMono){ - Log.ConsoleInfo("Sorry, this command has not yet been implemented in Mono"); - }else{ - if (TShock.Config.ServerSideInventory) - { - foreach (TSPlayer player in TShock.Players) - { - if (player != null && player.IsLoggedIn && !player.IgnoreActionsForClearingTrashCan) - { - TShock.InventoryDB.InsertPlayerData(player); - } - } - } + //Added restart command + private static void Restart(CommandArgs args) + { + if (Main.runningMono) + { + Log.ConsoleInfo("Sorry, this command has not yet been implemented in Mono"); + } + else + { + if (TShock.Config.ServerSideInventory) + { + foreach (TSPlayer player in TShock.Players) + { + if (player != null && player.IsLoggedIn && !player.IgnoreActionsForClearingTrashCan) + { + TShock.InventoryDB.InsertPlayerData(player); + } + } + } - TShock.Utils.ForceKickAll("Server restarting!"); - WorldGen.saveWorld(); - Netplay.disconnect = true; - System.Diagnostics.Process.Start(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase); - Environment.Exit(0); - }} + TShock.Utils.StopServer(); + System.Diagnostics.Process.Start(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase); + Environment.Exit(0); + } + } private static void OffNoSave(CommandArgs args) { - TShock.Utils.ForceKickAll("Server shutting down!"); - Netplay.disconnect = true; + TShock.Utils.StopServer(false); } private static void CheckUpdates(CommandArgs args) @@ -2258,10 +2257,7 @@ namespace TShockAPI { Main.spawnTileX = args.Player.TileX + 1; Main.spawnTileY = args.Player.TileY + 3; - - TShock.Utils.Broadcast("Server map saving, potential lag spike"); - Thread SaveWorld = new Thread(TShock.Utils.SaveWorld); - SaveWorld.Start(); + SaveManager.Instance.SaveWorld(false); } private static void Reload(CommandArgs args) @@ -2288,9 +2284,7 @@ namespace TShockAPI private static void Save(CommandArgs args) { - TShock.Utils.Broadcast("Server map saving, potential lag spike"); - Thread SaveWorld = new Thread(TShock.Utils.SaveWorld); - SaveWorld.Start(); + SaveManager.Instance.SaveWorld(false); } private static void Settle(CommandArgs args) diff --git a/TShockAPI/RconHandler.cs b/TShockAPI/RconHandler.cs index 9da51328..539e87b7 100644 --- a/TShockAPI/RconHandler.cs +++ b/TShockAPI/RconHandler.cs @@ -253,9 +253,7 @@ namespace TShockAPI WorldGen.genRand = new Random(); if (text.StartsWith("exit")) { - TShock.Utils.ForceKickAll("Server shutting down!"); - WorldGen.saveWorld(false); - Netplay.disconnect = true; + TShock.Utils.StopServer(); return "Server shutting down."; } else if (text.StartsWith("playing") || text.StartsWith("/playing")) diff --git a/TShockAPI/Rest/RestManager.cs b/TShockAPI/Rest/RestManager.cs index 2efd2d65..edf5d8fe 100644 --- a/TShockAPI/Rest/RestManager.cs +++ b/TShockAPI/Rest/RestManager.cs @@ -102,16 +102,10 @@ namespace TShockAPI if (!GetBool(parameters["confirm"], false)) return RestInvalidParam("confirm"); - if (!GetBool(parameters["nosave"], false)) - WorldGen.saveWorld(); - Netplay.disconnect = true; - // Inform players the server is shutting down var msg = string.IsNullOrWhiteSpace(parameters["message"]) ? "Server is shutting down" : parameters["message"]; - foreach (TSPlayer player in TShock.Players.Where(p => null != p)) - { - TShock.Utils.ForceKick(player, msg); - } + TShock.Utils.StopServer(!GetBool(parameters["nosave"], false), msg); + return RestResponse("The server is shutting down"); } @@ -304,8 +298,8 @@ namespace TShockAPI if (ret is RestObject) return ret; - User user = (User)ret; - return new RestObject() { { "group", user.Group }, { "id", user.ID.ToString() } }; + User user = (User)ret; + return new RestObject() { { "group", user.Group }, { "id", user.ID.ToString() }, { "name", user.Name } }; } #endregion @@ -411,7 +405,7 @@ namespace TShockAPI private object WorldSave(RestVerbs verbs, IParameterCollection parameters) { - TShock.Utils.SaveWorld(); + SaveManager.Instance.SaveWorld(); return RestResponse("World saved"); } diff --git a/TShockAPI/SaveManager.cs b/TShockAPI/SaveManager.cs new file mode 100644 index 00000000..dca8628e --- /dev/null +++ b/TShockAPI/SaveManager.cs @@ -0,0 +1,123 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Threading; +using System.Diagnostics; +using Terraria; + +namespace TShockAPI +{ + class SaveManager : IDisposable + { + // Singleton + private static readonly SaveManager instance = new SaveManager(); + private SaveManager() + { + _saveThread = new Thread(SaveWorker); + _saveThread.Name = "TShock SaveManager Worker"; + _saveThread.Start(); + } + public static SaveManager Instance { get { return instance; } } + + // Producer Consumer + private EventWaitHandle _wh = new AutoResetEvent(false); + private Object _saveLock = new Object(); + private Queue _saveQueue = new Queue(); + private Thread _saveThread; + private int saveQueueCount { get { lock (_saveLock) return _saveQueue.Count; } } + + /// + /// SaveWorld event handler which notifies users that the server may lag + /// + public void OnSaveWorld(bool resettime = false, HandledEventArgs e = null) + { + TShock.Utils.Broadcast("Saving world. Momentary lag might result from this.", Color.Red); + } + + /// + /// Saves the map data + /// + /// wait for all pending saves to finish (default: true) + /// reset the last save time counter (default: false) + /// use the realsaveWorld method instead of saveWorld event (default: false) + public void SaveWorld(bool wait = true, bool resetTime = false, bool direct = false) + { + EnqueueTask(new SaveTask(resetTime, direct)); + if (!wait) + return; + + // Wait for all outstanding saves to complete + int count = saveQueueCount; + while (0 != count) + { + Thread.Sleep(50); + count = saveQueueCount; + } + } + + /// + /// Processes any outstanding saves, shutsdown the save thread and returns + /// + public void Dispose() + { + EnqueueTask(null); + _saveThread.Join(); + _wh.Close(); + } + + private void EnqueueTask(SaveTask task) + { + lock (_saveLock) + { + _saveQueue.Enqueue(task); + } + _wh.Set(); + } + + private void SaveWorker() + { + while (true) + { + lock (_saveLock) + { + // NOTE: lock for the entire process so wait works in SaveWorld + if (_saveQueue.Count > 0) + { + SaveTask task = _saveQueue.Dequeue(); + if (null == task) + return; + else + { + if (task.direct) + { + OnSaveWorld(); + WorldGen.realsaveWorld(task.resetTime); + } + else + WorldGen.saveWorld(task.resetTime); + TShock.Utils.Broadcast("World saved.", Color.Yellow); + Log.Info(string.Format("World saved at ({0})", Main.worldPathName)); + } + } + } + _wh.WaitOne(); + } + } + + class SaveTask + { + public bool resetTime { get; set; } + public bool direct { get; set; } + public SaveTask(bool resetTime, bool direct) + { + this.resetTime = resetTime; + this.direct = direct; + } + + public override string ToString() + { + return string.Format("resetTime {0}, direct {1}", resetTime, direct); + } + } + } +} \ No newline at end of file diff --git a/TShockAPI/TShock.cs b/TShockAPI/TShock.cs index 2a7824ed..218b9d87 100755 --- a/TShockAPI/TShock.cs +++ b/TShockAPI/TShock.cs @@ -62,7 +62,7 @@ namespace TShockAPI public static GeoIPCountry Geo; public static SecureRest RestApi; public static RestManager RestManager; - public static Utils Utils = new Utils(); + public static Utils Utils = Utils.Instance; public static StatTracker StatTracker = new StatTracker(); /// /// Used for implementing REST Tokens prior to the REST system starting up. @@ -186,7 +186,6 @@ namespace TShockAPI if (Config.EnableGeoIP && File.Exists(geoippath)) Geo = new GeoIPCountry(geoippath); - Console.Title = string.Format("TerrariaShock Version {0} ({1})", Version, VersionCodename); Log.ConsoleInfo(string.Format("TerrariaShock Version {0} ({1}) now running.", Version, VersionCodename)); GameHooks.PostInitialize += OnPostInit; @@ -203,7 +202,7 @@ namespace TShockAPI NpcHooks.SetDefaultsInt += OnNpcSetDefaults; ProjectileHooks.SetDefaults += OnProjectileSetDefaults; WorldHooks.StartHardMode += OnStartHardMode; - WorldHooks.SaveWorld += OnSaveWorld; + WorldHooks.SaveWorld += SaveManager.Instance.OnSaveWorld; GetDataHandlers.InitGetDataHandler(); Commands.InitCommands(); @@ -260,10 +259,13 @@ namespace TShockAPI { if (disposing) { + // NOTE: order is important here if (Geo != null) { Geo.Dispose(); } + SaveManager.Instance.Dispose(); + GameHooks.PostInitialize -= OnPostInit; GameHooks.Update -= OnUpdate; ServerHooks.Connect -= OnConnect; @@ -278,15 +280,16 @@ namespace TShockAPI NpcHooks.SetDefaultsInt -= OnNpcSetDefaults; ProjectileHooks.SetDefaults -= OnProjectileSetDefaults; WorldHooks.StartHardMode -= OnStartHardMode; - WorldHooks.SaveWorld -= OnSaveWorld; + WorldHooks.SaveWorld -= SaveManager.Instance.OnSaveWorld; + if (File.Exists(Path.Combine(SavePath, "tshock.pid"))) { File.Delete(Path.Combine(SavePath, "tshock.pid")); } + RestApi.Dispose(); Log.Dispose(); } - base.Dispose(disposing); } @@ -322,7 +325,7 @@ namespace TShockAPI if (Main.worldPathName != null && Config.SaveWorldOnCrash) { Main.worldPathName += ".crash"; - WorldGen.saveWorld(); + SaveManager.Instance.SaveWorld(); } } } @@ -361,36 +364,33 @@ namespace TShockAPI { for (int i = 0; i < parms.Length; i++) { - if (parms[i].ToLower() == "-port") + switch(parms[i].ToLower()) { - int port = Convert.ToInt32(parms[++i]); - Netplay.serverPort = port; - Config.ServerPort = port; - OverridePort = true; - Log.ConsoleInfo("Port overridden by startup argument. Set to " + port); - } - if (parms[i].ToLower() == "-rest-token") - { - string token = Convert.ToString(parms[++i]); - RESTStartupTokens.Add(token, "null"); - Console.WriteLine("Startup parameter overrode REST token."); - } - if (parms[i].ToLower() == "-rest-enabled") - { - Config.RestApiEnabled = Convert.ToBoolean(parms[++i]); - Console.WriteLine("Startup parameter overrode REST enable."); - - } - if (parms[i].ToLower() == "-rest-port") - { - Config.RestApiPort = Convert.ToInt32(parms[++i]); - Console.WriteLine("Startup parameter overrode REST port."); - - } - if ((parms[i].ToLower() == "-maxplayers")||(parms[i].ToLower() == "-players")) - { - Config.MaxSlots = Convert.ToInt32(parms[++i]); - Console.WriteLine("Startup parameter overrode maximum player slot configuration value."); + case "-port": + int port = Convert.ToInt32(parms[++i]); + Netplay.serverPort = port; + Config.ServerPort = port; + OverridePort = true; + Log.ConsoleInfo("Port overridden by startup argument. Set to " + port); + break; + case "-rest-token": + string token = Convert.ToString(parms[++i]); + RESTStartupTokens.Add(token, "null"); + Console.WriteLine("Startup parameter overrode REST token."); + break; + case "-rest-enabled": + Config.RestApiEnabled = Convert.ToBoolean(parms[++i]); + Console.WriteLine("Startup parameter overrode REST enable."); + break; + case "-rest-port": + Config.RestApiPort = Convert.ToInt32(parms[++i]); + Console.WriteLine("Startup parameter overrode REST port."); + break; + case "-maxplayers": + case "-players": + Config.MaxSlots = Convert.ToInt32(parms[++i]); + Console.WriteLine("Startup parameter overrode maximum player slot configuration value."); + break; } } } @@ -404,6 +404,7 @@ namespace TShockAPI private void OnPostInit() { + SetConsoleTitle(); if (!File.Exists(Path.Combine(SavePath, "auth.lck")) && !File.Exists(Path.Combine(SavePath, "authcode.txt"))) { var r = new Random((int) DateTime.Now.ToBinary()); @@ -465,7 +466,6 @@ namespace TShockAPI StatTracker.CheckIn(); if (Backups.IsBackupTime) Backups.Backup(); - //call these every second, not every update if ((DateTime.UtcNow - LastCheck).TotalSeconds >= 1) { @@ -590,8 +590,13 @@ namespace TShockAPI } } } - Console.Title = string.Format("TerrariaShock Version {0} ({1}) ({2}/{3})", Version, VersionCodename, count, - Config.MaxSlots); + SetConsoleTitle(); + } + + private void SetConsoleTitle() + { + Console.Title = string.Format("{0} - {1}/{2} @ {3}:{4} (TerrariaShock v{5})", Config.ServerName, Utils.ActivePlayers(), + Config.MaxSlots, Netplay.serverListenIP, Config.ServerPort, Version); } private void OnConnect(int ply, HandledEventArgs handler) @@ -1012,17 +1017,6 @@ namespace TShockAPI e.Handled = true; } - void OnSaveWorld(bool resettime, HandledEventArgs e) - { - if (!Utils.saving) - { - Utils.Broadcast("Saving world. Momentary lag might result from this.", Color.Red); - var SaveWorld = new Thread(Utils.SaveWorld); - SaveWorld.Start(); - } - e.Handled = true; - } - /* * Useful stuff: * */ diff --git a/TShockAPI/Utils.cs b/TShockAPI/Utils.cs index df5c7207..b5048f67 100644 --- a/TShockAPI/Utils.cs +++ b/TShockAPI/Utils.cs @@ -29,11 +29,10 @@ namespace TShockAPI { public class Utils { - public static bool saving = false; - - public Utils() - { - } + // Utils is a Singleton + private static readonly Utils instance = new Utils(); + private Utils() {} + public static Utils Instance { get { return instance; } } public Random Random = new Random(); //private static List groups = new List(); @@ -135,11 +134,7 @@ namespace TShockAPI /// public void SaveWorld() { - saving = true; - WorldGen.realsaveWorld(); - Broadcast("World saved.", Color.Yellow); - Log.Info(string.Format("World saved at ({0})", Main.worldPathName)); - saving = false; + SaveManager.Instance.SaveWorld(); } /// @@ -186,15 +181,7 @@ namespace TShockAPI /// int playerCount public int ActivePlayers() { - int num = 0; - foreach (TSPlayer player in TShock.Players) - { - if (player != null && player.Active) - { - num++; - } - } - return num; + return Main.player.Where(p => null != p && p.active).Count(); } /// @@ -510,6 +497,27 @@ namespace TShockAPI } } + /// + /// Stops the server after kicking all players with a reason message, and optionally saving the world + /// + /// bool perform a world save before stop (default: true) + /// string reason (default: "Server shutting down!") + public void StopServer(bool save = true, string reason = "Server shutting down!") + { + ForceKickAll(reason); + if (save) + SaveManager.Instance.SaveWorld(); + + // Save takes a while so kick again + ForceKickAll(reason); + + // Broadcast so console can see we are shutting down as well + TShock.Utils.Broadcast(reason, Color.Red); + + // Disconnect after kick as that signifies server is exiting and could cause a race + Netplay.disconnect = true; + } + /// /// Kicks a player from the server without checking for immunetokick permission. /// From aeab6d9e4536e75d71b3c23a1519511fb596e65d Mon Sep 17 00:00:00 2001 From: stevenh Date: Tue, 21 Feb 2012 00:19:50 +0000 Subject: [PATCH 39/73] Fix for getting Mythical prefix by name fixes #374 Also optimised processing so it only does one pass instead of two as well as minimising string manipulation functions --- TShockAPI/Utils.cs | 36 ++++++++++++++++++++++++------------ 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/TShockAPI/Utils.cs b/TShockAPI/Utils.cs index b5048f67..ca28491f 100644 --- a/TShockAPI/Utils.cs +++ b/TShockAPI/Utils.cs @@ -29,6 +29,8 @@ namespace TShockAPI { public class Utils { + private readonly static int firstItemPrefix = 1; + private readonly static int lastItemPrefix = 83; // Utils is a Singleton private static readonly Utils instance = new Utils(); private Utils() {} @@ -442,22 +444,32 @@ namespace TShockAPI { Item item = new Item(); item.SetDefaults(0); - for (int i = 1; i < 83; i++) - { - item.prefix = (byte) i; - if (item.AffixName().Trim() == name) - return new List {i}; - } + string lowerName = name.ToLower(); var found = new List(); - for (int i = 1; i < 83; i++) + for (int i = firstItemPrefix; i <= lastItemPrefix; i++) { try { - item.prefix = (byte) i; - if (item.AffixName().Trim().ToLower() == name.ToLower()) - return new List {i}; - if (item.AffixName().Trim().ToLower().StartsWith(name.ToLower())) + item.prefix = (byte)i; + string trimmed = item.AffixName().Trim(); + if (trimmed == name) + { + // Exact match found.Add(i); + return found; + } + else + { + string trimmedLower = trimmed.ToLower(); + if (trimmedLower == lowerName) + { + // Exact match (caseinsensitive) + found.Add(i); + return found; + } + else if (trimmedLower.StartsWith(lowerName)) // Partial match + found.Add(i); + } } catch { @@ -474,7 +486,7 @@ namespace TShockAPI public List GetPrefixByIdOrName(string idOrName) { int type = -1; - if (int.TryParse(idOrName, out type) && type > 0 && type < 84) + if (int.TryParse(idOrName, out type) && type >= firstItemPrefix && type <= lastItemPrefix) { return new List {type}; } From 988bc4198b7c01023d03b7790e84a4ca9fdb9089 Mon Sep 17 00:00:00 2001 From: stevenh Date: Tue, 21 Feb 2012 01:07:41 +0000 Subject: [PATCH 40/73] Server either console can now kick and ban players regardless of the players immune permissions which fixes #391 Refactored Utils ForceKick to call Kick so we have one core method with all the logic in Added missing params to docs for Kick and Ban --- TShockAPI/Commands.cs | 4 ++-- TShockAPI/Utils.cs | 45 ++++++++++++++++++++----------------------- 2 files changed, 23 insertions(+), 26 deletions(-) diff --git a/TShockAPI/Commands.cs b/TShockAPI/Commands.cs index 436ae4ee..29923559 100755 --- a/TShockAPI/Commands.cs +++ b/TShockAPI/Commands.cs @@ -786,7 +786,7 @@ namespace TShockAPI string reason = args.Parameters.Count > 1 ? String.Join(" ", args.Parameters.GetRange(1, args.Parameters.Count - 1)) : "Misbehaviour."; - if (!TShock.Utils.Kick(players[0], reason)) + if (!TShock.Utils.Kick(players[0], reason, !args.Player.RealPlayer, false, args.Player.Name)) { args.Player.SendMessage("You can't kick another admin!", Color.Red); } @@ -833,7 +833,7 @@ namespace TShockAPI string reason = args.Parameters.Count > 1 ? String.Join(" ", args.Parameters.GetRange(1, args.Parameters.Count - 1)) : "Misbehaviour."; - if (!TShock.Utils.Ban(players[0], reason)) + if (!TShock.Utils.Ban(players[0], reason, !args.Player.RealPlayer, args.Player.Name)) { args.Player.SendMessage("You can't ban another admin!", Color.Red); } diff --git a/TShockAPI/Utils.cs b/TShockAPI/Utils.cs index ca28491f..d5caa544 100644 --- a/TShockAPI/Utils.cs +++ b/TShockAPI/Utils.cs @@ -535,21 +535,10 @@ namespace TShockAPI /// /// int player /// string reason - public void ForceKick(TSPlayer player, string reason) + /// bool silent (default: false) + public void ForceKick(TSPlayer player, string reason, bool silent = false) { - if (!player.ConnectionAlive) - return; - player.Disconnect(reason); - Log.ConsoleInfo(string.Format("{0} was force kicked for : {1}", player.IP, reason)); - } - - public void ForceKick(TSPlayer player, string reason, bool silent) - { - player.SilentKickInProgress = true; - if (!player.ConnectionAlive) - return; - player.Disconnect(reason); - Log.ConsoleInfo(string.Format("{0} was force kicked for : {1}", player.IP, reason)); + Kick(player, reason, true, silent); } /// @@ -557,19 +546,24 @@ namespace TShockAPI /// /// int player /// string reason - public bool Kick(TSPlayer player, string reason, string adminUserName = "") + /// bool force (default: false) + /// bool silent (default: false) + /// bool silent (default: null) + public bool Kick(TSPlayer player, string reason, bool force = false, bool silent = false, string adminUserName = null) { if (!player.ConnectionAlive) return true; - if (!player.Group.HasPermission(Permissions.immunetokick)) + if (force || !player.Group.HasPermission(Permissions.immunetokick)) { string playerName = player.Name; + player.SilentKickInProgress = silent; player.Disconnect(string.Format("Kicked: {0}", reason)); Log.ConsoleInfo(string.Format("Kicked {0} for : {1}", playerName, reason)); - if (adminUserName.Length == 0) - Broadcast(string.Format("{0} was kicked for {1}", playerName, reason.ToLower())); + string verb = force ? "force " : ""; + if (string.IsNullOrWhiteSpace(adminUserName)) + Broadcast(string.Format("{0} was {1}kicked for {2}", playerName, verb, reason.ToLower())); else - Broadcast(string.Format("{0} kicked {1} for {2}", adminUserName, playerName, reason.ToLower())); + Broadcast(string.Format("{0} {1}kicked {2} for {3}", adminUserName, verb, playerName, reason.ToLower())); return true; } return false; @@ -580,21 +574,24 @@ namespace TShockAPI /// /// int player /// string reason - public bool Ban(TSPlayer player, string reason, string adminUserName = "") + /// bool force (default: false) + /// bool silent (default: null) + public bool Ban(TSPlayer player, string reason, bool force = false, string adminUserName = null) { if (!player.ConnectionAlive) return true; - if (!player.Group.HasPermission(Permissions.immunetoban)) + if (force || !player.Group.HasPermission(Permissions.immunetoban)) { string ip = player.IP; string playerName = player.Name; TShock.Bans.AddBan(ip, playerName, reason); player.Disconnect(string.Format("Banned: {0}", reason)); Log.ConsoleInfo(string.Format("Banned {0} for : {1}", playerName, reason)); - if (adminUserName.Length == 0) - Broadcast(string.Format("{0} was banned for {1}", playerName, reason.ToLower())); + string verb = force ? "force " : ""; + if (string.IsNullOrWhiteSpace(adminUserName)) + Broadcast(string.Format("{0} was {1}banned for {1}", playerName, verb, reason.ToLower())); else - Broadcast(string.Format("{0} banned {1} for {2}", adminUserName, playerName, reason.ToLower())); + Broadcast(string.Format("{0} {1}banned {1} for {2}", adminUserName, verb, playerName, reason.ToLower())); return true; } return false; From 3890a82b0eab92f0b8f47d268721f4246d956b93 Mon Sep 17 00:00:00 2001 From: stevenh Date: Tue, 21 Feb 2012 14:38:36 +0000 Subject: [PATCH 41/73] Fixed missing SaveManager.cs from project file fixes #401 --- TShockAPI/TShockAPI.csproj | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/TShockAPI/TShockAPI.csproj b/TShockAPI/TShockAPI.csproj index 3968ad3f..2786fff0 100644 --- a/TShockAPI/TShockAPI.csproj +++ b/TShockAPI/TShockAPI.csproj @@ -85,6 +85,7 @@ + @@ -197,4 +198,4 @@ --> - \ No newline at end of file + From 41dbd31aac7ed4c03b592108e9035dea350eec56 Mon Sep 17 00:00:00 2001 From: stevenh Date: Tue, 21 Feb 2012 15:56:34 +0000 Subject: [PATCH 42/73] Converted all files to LF line endings --- HttpBins/HttpServer.xml | 12376 ++++++++-------- TShockAPI/BackupManager.cs | 190 +- TShockAPI/Commands.cs | 200 +- TShockAPI/ConfigFile.cs | 572 +- TShockAPI/DB/BanManager.cs | 2 +- TShockAPI/DB/RegionManager.cs | 2 +- TShockAPI/FileTools.cs | 236 +- TShockAPI/GetDataHandlers.cs | 5408 +++---- TShockAPI/Group.cs | 398 +- TShockAPI/Rest/RestCommand.cs | 2 +- TShockAPI/Rest/RestManager.cs | 2 +- TShockAPI/Rest/RestObject.cs | 2 +- TShockAPI/Rest/RestVerbs.cs | 2 +- TShockAPI/TSPlayer.cs | 1432 +- TShockAPI/TShock.cs | 2934 ++-- TShockAPI/UpdateManager.cs | 202 +- TShockAPI/Utils.cs | 1564 +- .../Properties/AssemblyInfo.cs | 72 +- TShockRestTestPlugin/TShockRestTestPlugin.cs | 382 +- .../TShockRestTestPlugin.csproj | 122 +- UnitTests/RestApiTests.webtest | 3082 ++-- 21 files changed, 14591 insertions(+), 14591 deletions(-) diff --git a/HttpBins/HttpServer.xml b/HttpBins/HttpServer.xml index e291a290..c5e51443 100644 --- a/HttpBins/HttpServer.xml +++ b/HttpBins/HttpServer.xml @@ -1,6188 +1,6188 @@ - - - - HttpServer - - - - - Used by to filter out unwanted connections. - - - - - Initializes a new instance of the class. - - The socket. - - - - Gets or sets if socket can be accepted. - - - - - Gets socket. - - - - - A request have been received. - - - - - - - Initializes a new instance of the class. - - context that received the request. - Received request. - Response to send. - - - - Gets context that received the request. - - - Do not forget to set to true if you are sending - back a response manually through . - - - - - Gets or sets if the request have been handled. - - - The library will not attempt to send the response object - back to the client if this property is set to true. - - - - - Gets request object. - - - - - Gets response object. - - - - - Cookies that should be set. - - - - - Adds a cookie in the collection. - - cookie to add - cookie is null - Name and Content must be specified. - - - - Copy a request cookie - - - When the cookie should expire - - - - Remove all cookies - - - - - Gets a collection enumerator on the cookie list. - - collection enumerator - - - - Returns an enumerator that iterates through the collection. - - - - A that can be used to iterate through the collection. - - 1 - - - - Gets the count of cookies in the collection. - - - - - Gets the cookie of a given identifier. - - Cookie if found; otherwise null. - - - - An exception that can't be handled by the library have been thrown. - - - - - Initializes a new instance of the class. - - The exception. - - - - Gets caught exception. - - - - - Data decoded from a POST body. - - - - - Initializes a new instance of the class. - - - - - Gets or sets decoded files. - - - - - Gets or sets decoded parameters. - - - - - Stores sessions in files. - - - All session parameters must be serializable. - - - - - Stores sessions in your favorite store - - - - - - - - Saves the specified session. - - The session. - - - - Touches the specified session - - Session id. - - Used to prevent sessions from expiring. - - - - - Loads a session - - Session id. - Session if found; otherwise null. - - - - Delete a session - - Id of session - - - - Saves the specified session. - - The session. - - - - Touches the specified session - - Session id. - - Used to prevent sessions from expiring. - - - - - Loads a session - - Session id. - Session if found; otherwise null. - - - - HTTP methods. - - - - - Unknown method - - - - - Posting data - - - - - Get data - - - - - Update data - - - - - Remove data - - - - - Get only HTTP headers. - - - - - Options HTTP 1.1 header. - - - - - Http listener. - - - - - Http listener - - - - - Start listener. - - Number of pending accepts. - - Make sure that you are subscribing on first. - - Listener have already been started. - Failed to start socket. - Invalid port number. - - - - Stop listener. - - - - - Gets listener address. - - - - - Gets if listener is secure. - - - - - Gets if listener have been started. - - - - - Gets or sets logger. - - - - - Gets listening port. - - - - - Gets the maximum content size. - - The content length limit. - - Used when responding to 100-continue. - - - - - A new request have been received. - - - - - Can be used to reject certain clients. - - - - - A HTTP exception have been thrown. - - - Fill the body with a user friendly error page, or redirect to somewhere else. - - - - - Initializes a new instance of the class. - - The address. - The port. - - - - Initializes a new instance of the class. - - The address. - The port. - The HTTP factory. - - - - Creates a new instance with default factories. - - Address that the listener should accept connections on. - Port that listener should accept connections on. - Created HTTP listener. - - - - Creates a new instance with default factories. - - Address that the listener should accept connections on. - Port that listener should accept connections on. - Factory used to create different types in the framework. - Created HTTP listener. - - - - Creates a new instance with default factories. - - Address that the listener should accept connections on. - Port that listener should accept connections on. - Certificate to use - Created HTTP listener. - - - - Create a new context - - Accepted socket - A new context. - - - Throwing exception if in debug mode and not exception handler have been specified. - - - - Start listener. - - Number of pending accepts. - - Make sure that you are subscribing on first. - - Listener have already been started. - Failed to start socket. - Invalid port number. - - - - Stop listener. - - - - - Gets HTTP factory used to create types used by this HTTP library. - - - - - Gets or sets the maximum number of bytes that the request body can contain. - - The content length limit. - - - Used when responding to 100-continue. - - - 0 = turned off. - - - - - - Gets listener address. - - - - - Gets if listener is secure. - - - - - Gets if listener have been started. - - - - - Gets or sets logger. - - - - - Gets listening port. - - - - - A new request have been received. - - - - - Can be used to reject certain clients. - - - - - A HTTP exception have been thrown. - - - Fill the body with a user friendly error page, or redirect to somewhere else. - - - - - Client asks if he may continue. - - - If the body is too large or anything like that you should respond . - - - - - Contents of a cookie header. - - - - - Header in a message - - - Important! Each header should override ToString() - and return it's data correctly formatted as a HTTP header value. - - - - - Gets header name - - - - - Gets value as it would be sent back to client. - - - - - Initializes a new instance of the class. - - The collection. - collection is null. - - - - Gets cookie collection - - - - - Gets header name - - - - - Gets value as it would be sent back to client. - - - - - - Request couldn't be parsed successfully. - - - - - Exception thrown from HTTP server. - - - - - Initializes a new instance of the class. - - HTTP status code. - Exception description. - - - - Initializes a new instance of the class. - - HTTP status code. - Exception description. - Inner exception. - - - - Gets HTTP status code. - - - - - Initializes a new instance of the class. - - Exception description. - - - - Initializes a new instance of the class. - - Exception description. - Exception description. - - - - Something failed during parsing. - - - - - Initializes a new instance of the class. - - Exception description. - - - - Initializes a new instance of the class. - - Exception description. - Inner exception. - - - - Used to parse header values - - - - - Parse a header - - Name of header. - Reader containing value. - HTTP Header - Header value is not of the expected format. - - - - Collection of body decoders. - - - Body decoders are used to parse request body and convert it - into a and a . - - - - - Add another body decoder. - - - - - - Decode body stream - - Stream containing the content - Content type header - Stream encoding - Decoded data. - Body format is invalid for the specified content type. - Something unexpected failed. - - - - Returns an enumerator that iterates through the collection. - - - A that can be used to iterate through the collection. - - 1 - - - - Returns an enumerator that iterates through a collection. - - - An object that can be used to iterate through the collection. - - 2 - - - - Gets number of decoders. - - - - - Custom network stream to mark sockets as reusable when disposing the stream. - - - - - Creates a new instance of the class for the specified . - - - The that the will use to send and receive data. - - - The parameter is null. - - - The parameter is not connected. - -or- - The property of the parameter is not . - -or- - The parameter is in a nonblocking state. - - - - - Initializes a new instance of the class for the specified with the specified ownership. - - - The that the will use to send and receive data. - - - Set to true to indicate that the will take ownership of the ; otherwise, false. - - - The parameter is null. - - - The parameter is not connected. - -or- - the value of the property of the parameter is not . - -or- - the parameter is in a nonblocking state. - - - - - Creates a new instance of the class for the specified with the specified access rights. - - - The that the will use to send and receive data. - - - A bitwise combination of the values that specify the type of access given to the over the provided . - - - The parameter is null. - - - The parameter is not connected. - -or- - the property of the parameter is not . - -or- - the parameter is in a nonblocking state. - - - - - Creates a new instance of the class for the specified with the specified access rights and the specified ownership. - - - The that the will use to send and receive data. - - - A bitwise combination of the values that specifies the type of access given to the over the provided . - - - Set to true to indicate that the will take ownership of the ; otherwise, false. - - - The parameter is null. - - - The parameter is not connected. - -or- - The property of the parameter is not . - -or- - The parameter is in a nonblocking state. - - - - - Closes the current stream and releases any resources (such as sockets and file handles) associated with the current stream. - - - - - Releases the unmanaged resources used by the and optionally releases the managed resources. - - true to release both managed and unmanaged resources; false to release only unmanaged resources. - - - - Parses query string - - - - - Parse a query string - - string to parse - A collection - reader is null. - - - - Parse a query string - - string to parse - A collection - queryString is null. - - - - Convention over configuration server. - - - Used to make it easy to create and use a web server. - - All resources must exist in the "YourProject.Content" namespace (or a subdirectory called "Content" relative to yourapp.exe). - - - - - - Http server. - - - - - Initializes a new instance of the class. - - Factory used to create objects used in this library. - - - - Initializes a new instance of the class. - - - - - Add a decoder. - - decoder to add - - Adding zero decoders will make the server add the - default ones which is and . - - - - - Add a new router. - - Router to add - Server have been started. - - - - Add a file module - - Module to add - module is null. - Cannot add modules when server have been started. - - - - Add a HTTP listener. - - - Listener have been started. - - - - An error have occurred and we need to send a result pack to the client - - The context. - The exception. - - Invoke base class () to send the contents - of . - - - - - Called before anything else. - - The context. - - Looks after a in the request and will - use the if found. - - - - - All server modules are about to be invoked. - - The context. - - Called when routers have been invoked but no modules yet. - - - - - A request have arrived but not yet been processed yet. - - The context. - - Default implementation adds a Date header and Server header. - - - - - Go through all modules and check if any of them can handle the current request. - - - - - - - Process result (check if it should be sent back or not) - - - - true if request was processed properly.; otherwise false. - - - - Processes all routers. - - Request context. - Processing result. - - - - Requests authentication from the user. - - Host/domain name that the server hosts. - - Used when calculating hashes in Digest authentication. - - - - - - - Send a response. - - - - - - - - Start http server. - - Number of pending connections. - - - - Stops the server - - true if all modules should be removed. - - - - Gets the authentication provider. - - - A authentication provider is used to keep track of all authentication types - that can be used. - - - - - Gets or sets number of bytes that a body can be. - - - - Used to determine the answer to a 100-continue request. - - - 0 = turned off. - - - - - - Gets current server. - - - Only valid when a request have been received and is being processed. - - - - - Gets or sets the maximum size of request body (in bytes) - - - - - Gets or sets server name. - - - Used in the "Server" header when serving requests. - - - - - Invoked just before a response is sent back to the client. - - - - - Invoked *after* the web server has tried to handled the request. - - - The event can be used to handle the request after all routes and modules - have tried to process the request. - - - - - Invoked *before* the web server has tried to handled the request. - - - Event can be used to load a session from a cookie or to force - authentication or anything other you might need t do before a request - is handled. - - - - - An error page have been requested. - - - - - Initializes a new instance of the class. - - - - - Used to build headers. - - - - - Add a parser - - Header that the parser is for. - Parser implementation - - Will replace any existing parser for the specified header. - - - - - Add all default (built-in) parsers. - - - Will not replace previously added parsers. - - - - - Create a header parser - - implementation. - - - Uses attribute to find which headers - the parser is for. - - Will not replace previously added parsers. - - - - - Parse a header. - - Name of header - Header value - Header. - Value is not a well formatted header value. - - - - Request sent to a HTTP server. - - - - - - Base interface for request and response. - - - - - Add a new header. - - - - - - - Add a new header. - - Header to add. - - - - Gets body stream. - - - - - Size of the body. MUST be specified before sending the header, - unless property Chunked is set to true. - - - - - Kind of content in the body - - Default is text/html - - - - Gets or sets encoding - - - - - Gets headers. - - - - - Get a header - - Type that it should be cast to - Name of header - Header if found and casted properly; otherwise null. - - - - Gets or sets connection header. - - - - - Gets cookies. - - - - - Gets all uploaded files. - - - - - Gets form parameters. - - - - - Gets or sets HTTP version. - - - - - Gets if request is an Ajax request. - - - - - Gets or sets HTTP method. - - - - - Gets query string and form parameters - - - - - Gets query string. - - - - - Gets requested URI. - - - - - Load resources from disk. - - - - - Loads resources from a specific location (such as assembly, hard drive etc). - - - - - Checks if a resource exists in the specified directory - - Uri path to resource - true if resource was found; otherwise false. - - - if (resources.Exists("/files/user/user.png")) - Debug.WriteLine("Resource exists."); - - - - - - Find all views in a folder/path. - - Absolute Uri path to files that should be found, can end with wild card. - Collection to add all view names to. - - - - Gets a resource. - - Uri path to resource. - Resource - Uri contains forbidden characters. - - - Resource resource = resources.Get("/files/user/user.png"); - - - - - - Default forbidden characters. - - - - - relative to absolute path mappings. - - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class. - - Request URI path - Disk path - - File names should not be included in URI or path. - - - - new FileResources("/files/user/", "C:\\intetpub\\files\users\\"); - - - - - - Add a new resource mapping. - - Request URI path - Disk path - - File names should not be included in URI or path. - - - - resources.Add("/files/", "C:\\intetpub\\files\\"); - - - absolutePath is not found. - - - - check if source contains any of the chars. - - string to check - Characters to fined - - - - - Go through all mappings and find requested Uri. - - Uri to get local path for. - Path if found; otherwise null. - - - - Checks if a resource exists in the specified directory - - Uri path to resource - true if resource was found; otherwise false. - - - if (resources.Exists("/files/user/user.png")) - Debug.WriteLine("Resource exists."); - - - - - - Gets a resource. - - Uri path to resource. - Resource - Uri contains forbidden characters. - - - Resource resource = resources.Get("/files/user/user.png"); - - - - - - Find all views in a folder/path. - - Absolute Uri path to files that should be found, can end with wild card. - Collection to add all view names to. - Uri contains forbidden characters. - - Find(" - - - - - Gets or sets forbidden characters. - - - Used to revoke access to any system files. - - - - - Gets or sets absolute path on disk, including file name. - - - - - Gets or sets relative file path. - - - - - Gets or sets Uri path, excluding file name - - - - - Used to send a response back to the client. - - - - Writes a object into a stream. - - - Important! ResponseWriter do not throw any exceptions. Instead it just logs them and - let them die peacefully. This is since the response writer is used from - catch blocks here and there. - - - - - - Sends response using the specified context. - - The context. - The response. - - - - Converts and sends a string. - - - - Encoding used to transfer string - - - - Send a body to the client - - Context containing the stream to use. - Body to send - - - - Send all headers to the client - - Response containing call headers. - Content used to send headers. - - - - Decodes body stream. - - - - - Decode body stream - - Stream containing the content - Content type header - Stream encoding - Decoded data. - Body format is invalid for the specified content type. - Something unexpected failed. - - - - All content types that the decoder can parse. - - A collection of all content types that the decoder can handle. - - - - Decodes forms that have multiple sections. - - - http://www.faqs.org/rfcs/rfc1867.html - - - - - form-data - - - - - multipart/form-data - - - - - Decode body stream - - Stream containing the content - Content type header - Stream encoding - Decoded data. - Body format is invalid for the specified content type. - Something unexpected failed. - stream is null. - - - - All content types that the decoder can parse. - - A collection of all content types that the decoder can handle. - - - - Provides sessions. - - Type of session object - - Will always use files for sessions (utilizing the binary formatter), but can - also cache them in memory. - - If caching is enabled, it will only write sessions to disk every 20 seconds if they have - been accessed the last minute (to not keep writing dead sessions to disk). - - - - - - Initializes a new instance of the class. - - Session type must use [Serializable] attribute. - - - - Create a new session. - - - - - - Load session - - Id of session. - Session if found; otherwise null. - sessionId is null. - - - - Load session when a new request comes in. - - - - - - - Save a session to disk. - - Session to write to disk. - - You are responsible for writing sessions to disk if you are not using caching. - - - - - Start the session system and hook - - - - - - Stop session handling - - - - - Gets or sets session cookie name - - - - - Gets or sets cache - - - - - Gets current session. - - - - - Gets or sets number of seconds before a session expired. - - - A session have expired if nothing have accessed it for X seconds. This - class modifies the write time each time it's accessed. - - - - - Determines if cookie should be set in the response. - - - - - Invoked when a session have been changed and should be written to disc. - - - - - First line in a response have been received - - - - - Gets or sets motivation to why the status code was used. - - - - - Gets or sets message status code - - - - - Gets or sets sip protocol version used. - - - - - A request have been parsed successfully by the server. - - - - - Initializes a new instance of the class. - - Received request. - - - - Gets received request. - - - - - Provider returning user to be authenticated. - - - - - Lookups the specified user - - User name. - Typically web server domain name. - User if found; otherwise null. - - User name can basically be anything. For instance name entered by user when using - basic or digest authentication, or SID when using Windows authentication. - - - - - Gets the principal to use. - - Successfully authenticated user. - - - Invoked when a user have successfully been authenticated. - - - - - - - User information used during authentication process. - - - - - Gets or sets user name used during authentication. - - - - - Gets or sets unencrypted password. - - - Password as clear text. You could use instead if your passwords - are encrypted in the database. - - - - - Gets or sets HA1 hash. - - - - Digest authentication requires clear text passwords to work. If you - do not have that, you can store a HA1 hash in your database (which is part of - the Digest authentication process). - - - A HA1 hash is simply a Md5 encoded string: "UserName:Realm:Password". The quotes should - not be included. Realm is the currently requested Host (as in Request.Headers["host"]). - - - Leave the string as null if you are not using HA1 hashes. - - - - - - Used to get or set properties on objects. - - - This class should be a bit faster than the standard reflection. - - - - - Get cached type. - - Type to get/set properties in - Type to use - - - - Used to load/store sessions in the server. - - - - - Initializes a new instance of the class. - - Web server that the provider is for.. - Store to use. - - - - Initializes a new instance of the class. - - The server. - - Uses a file store. - - - - - Loads a session for all requests that got the session cookie. - - The sender. - The instance containing the event data. - - - - Gets current session - - Session if set, otherwise null. - - - - Gets or sets the session life time in minutes. - - The session life time. - - - - A session have been loaded. Use to access it. - - - - - Secure version of the HTTP listener. - - - - - Initializes a new instance of the class. - - Address to accept new connections on. - Port to accept connections on. - Certificate securing the connection. - - - - Create a new context - - Accepted socket - A new context. - - Factory is assigned by the on each incoming request. - - - - - Gets if listener is secure. - - - - - - Gets or sets SSL protocol. - - - - - Gets or sets if client certificate should be used. - - - - - Arguments used when more body bytes have come. - - - - - Initializes a new instance of the class. - - buffer that contains the received bytes. - offset in buffer where to start processing. - number of bytes from that should be parsed. - buffer is null. - - - - Initializes a new instance of the class. - - - - - Gets or sets buffer that contains the received bytes. - - - - - Gets or sets number of bytes from that should be parsed. - - - - - Gets or sets offset in buffer where to start processing. - - - - - HTTP Module - - - - - Process a request. - - Request information - What to do next. - - - - Something unexpected went wrong. - - - - - Initializes a new instance of the class. - - Exception description. - - - - Initializes a new instance of the class. - - Exception description. - Inner exception. - - - - File sent from remote end. - - - - - Gets or sets content type. - - - - - Gets or sets name in form. - - - - - Gets or sets name original file name - - - - - Gets or sets filename for locally stored file. - - - - - Parses Cookie header. - - - - - Parse a header - - Name of header. - Reader containing value. - HTTP Header - Header value is not of the expected format. - - - - Decodes URL encoded values. - - - - - - - Stream containing the content - Content type header - Stream encoding - Collection with all parameters. - Body format is invalid for the specified content type. - Failed to read all bytes from body stream. - - - - All content types that the decoder can parse. - - A collection of all content types that the decoder can handle. - - - - Base class for sessions. - - - Your class must be tagged with attribute to be able to use sessions. - - - - - The session have been changed and should be written to disk. - - - - - Session have been changed. - - - - - Gets or sets when session was accessed last - - - - - Gets current session. - - - - - Gets or sets session id. - - - - - Gets or sets when the session was last written to disk. - - - - - Parses and builds messages - - - The message factory takes care of building messages - from all end points. - - Since both message and packet protocols are used, the factory - hands out contexts to all end points. The context keeps a state - to be able to parse partial messages properly. - - - Each end point need to hand the context back to the message factory - when the client disconnects (or a message have been parsed). - - - - - - Initializes a new instance of the class. - - Factory used to create headers. - - - - Create a new message factory context. - - A new context. - - A context is used to parse messages from a specific endpoint. - - - - - Release a used factory context. - - - - - - A request have been received from one of the end points. - - - - - A response have been received from one of the end points. - - - - - Interface used to write to log files. - - - If you want to use the built in filtering mechanism, create a constructor - which takes one parameter, a . - - - - - Write an entry that helps when debugging code. - - Log message - - - - Write an entry that helps when debugging code. - - Log message - Thrown exception to log. - - - - Something went wrong, but the application do not need to die. The current thread/request - cannot continue as expected. - - Log message - - - - Something went wrong, but the application do not need to die. The current thread/request - cannot continue as expected. - - Log message - Thrown exception to log. - - - - Something went very wrong, application might not recover. - - Log message - - - - Something went very wrong, application might not recover. - - Log message - Thrown exception to log. - - - - Informational message, needed when helping customer to find a problem. - - Log message - - - - Informational message, needed when helping customer to find a problem. - - Log message - Thrown exception to log. - - - - Write a entry that helps when trying to find hard to find bugs. - - Log message - - - - Write a entry that helps when trying to find hard to find bugs. - - Log message - Thrown exception to log. - - - - Something is not as we expect, but the code can continue to run without any changes. - - Log message - - - - Something is not as we expect, but the code can continue to run without any changes. - - Log message - Thrown exception to log. - - - - cookie sent by the client/browser - - - - - - Constructor. - - cookie identifier - cookie content - id or content is null - id is empty - - - - Gets the cookie HTML representation. - - cookie string - - - - Gets the cookie identifier. - - - - - Gets value. - - - Set to null to remove cookie. - - - - - Arguments for . - - - - - Initializes a new instance of the class. - - The context. - - - - Gets or sets thrown exception - - - - - Gets or sets if error page was provided. - - - - - Gets requested resource. - - - - - Gets response to send - - - - - Implements HTTP Digest authentication. It's more secure than Basic auth since password is - encrypted with a "key" from the server. - - - Keep in mind that the password is encrypted with MD5. Use a combination of SSL and digest auth to be secure. - - - - - Authenticates requests - - - - - Authenticate request - - Authorization header send by web client - Realm to authenticate in, typically a domain name. - HTTP Verb used in the request. - User if authentication was successful; otherwise null. - - - - Create a authentication challenge. - - Realm that the user should authenticate in - A WWW-Authenticate header. - If realm is empty or null. - - - - Gets authenticator scheme - - - digest - - - - - Initializes a new instance of the class. - - Supplies users during authentication process. - - - - Used by test classes to be able to use hardcoded values - - - - - An authentication response have been received from the web browser. - Check if it's correct - - Contents from the Authorization header - Realm that should be authenticated - GET/POST/PUT/DELETE etc. - - Authentication object that is stored for the request. A user class or something like that. - - if authenticationHeader is invalid - If any of the parameters is empty or null. - - - - Encrypts parameters into a Digest string - - Realm that the user want to log into. - User logging in - Users password. - HTTP method. - Uri/domain that generated the login prompt. - Quality of Protection. - "Number used ONCE" - Hexadecimal request counter. - "Client Number used ONCE" - Digest encrypted string - - - - - - Md5 hex encoded "userName:realm:password", without the quotes. - Md5 hex encoded "method:uri", without the quotes - Quality of Protection - "Number used ONCE" - Hexadecimal request counter. - Client number used once - - - - - Create a authentication challenge. - - Realm that the user should authenticate in - A correct auth request. - If realm is empty or null. - - - - Gets the current nonce. - - - - - - Gets the Md5 hash bin hex2. - - To be hashed. - - - - - determines if the nonce is valid or has expired. - - nonce value (check wikipedia for info) - true if the nonce has not expired. - - - - Gets authentication scheme name - - - - - Gets authenticator scheme - - - - digest - - - - - Provides authentication in the web server. - - - To initiate authentication you just need to throw a Una - - - - - Add a authenticator. - - - - - - Authenticate request. - - - - - Requires that a AuthorizationHeader have been sent by the client. If not, - request one by sending a WWW-Authentication header (can be generated by the Challenge method). - - Authorization header was not found in the request. - Requested authentication scheme is not supported. - - - - Create a challenge header (WWW-authenticate) - - Response that the authentication header should be added to - Realm that the user should authenticate in - WWW-Authenticate header. - - - Scheme can currently be basic or digest. Basic is not very safe, but easier to use. - Digest is quite safe. - - - - Requested scheme is not supported. - - - - Creates a console logger. - - - - - Factory implementation used to create logs. - - - - - Create a new logger. - - Type that requested a logger. - Logger for the specified type; - - MUST ALWAYS return a logger. Return if no logging - should be used. - - - - - Initializes a new instance of the class. - - The filter. - - - - Create a new logger. - - Type that requested a logger. - Logger for the specified type; - - MUST ALWAYS return a logger. Return if no logging - should be used. - - - - - redirects from one URL to another. - - - - - Rules are used to perform operations before a request is being handled. - Rules can be used to create routing etc. - - - - - Process the incoming request. - - Request context information. - Processing result. - If any parameter is null. - - - - Initializes a new instance of the class. - - Absolute path (no server name) - Absolute path (no server name) - - server.Add(new RedirectRule("/", "/user/index")); - - - - - Initializes a new instance of the class. - - Absolute path (no server name) - Absolute path (no server name) - true if request should be redirected, false if the request URI should be replaced. - - server.Add(new RedirectRule("/", "/user/index")); - - - - - Process the incoming request. - - Request context. - Processing result. - If any parameter is null. - - - - Gets string to match request URI with. - - Is compared to request.Uri.AbsolutePath - - - - Gets whether the server should redirect the client instead of simply modifying the URI. - - - false means that the rule will replace - the current request URI with the new one from this class. - true means that a redirect response is sent to the client. - - - - - Gets where to redirect. - - - - - The Connection general-header field allows the sender to specify options - that are desired for that particular connection and MUST NOT be - communicated by proxies over further connections. - - - - HTTP/1.1 proxies MUST parse the Connection header field before a - message is forwarded and, for each connection-token in this field, - remove any header field(s) from the message with the same name as the - connection-token. Connection options are signaled by the presence of - a connection-token in the Connection header field, not by any - corresponding additional header field(s), since the additional header - field may not be sent if there are no parameters associated with that - connection option. - - Message headers listed in the Connection header MUST NOT include - end-to-end headers, such as Cache-Control. - - HTTP/1.1 defines the "close" connection option for the sender to - signal that the connection will be closed after completion of the - response. For example, - - Connection: close - - in either the request or the response header fields indicates that - the connection SHOULD NOT be considered `persistent' (section 8.1) - after the current request/response is complete. - - HTTP/1.1 applications that do not support persistent connections MUST - include the "close" connection option in every message. - - A system receiving an HTTP/1.0 (or lower-version) message that - includes a Connection header MUST, for each connection-token in this - field, remove and ignore any header field(s) from the message with - the same name as the connection-token. This protects against mistaken - forwarding of such header fields by pre-HTTP/1.1 proxies. See section - 19.6.2 in RFC2616. - - - - - - Header name - - - - - Default connection header for HTTP/1.0 - - - - - Default connection header for HTTP/1.1 - - - - - Initializes a new instance of the class. - - Connection type. - The parameters. - - - - Initializes a new instance of the class. - - The type. - - - - Returns data formatted as a HTTP header value. - - - A that represents the current . - - - - - Gets connection parameters. - - - - - Gets or sets connection type - - - - - Gets header name - - - - - Type of HTTP connection - - - - - Connection is closed after each request-response - - - - - Connection is kept alive for X seconds (unless another request have been made) - - - - - Requests message-body be sent with an encoding to be specified in the "Transfer-Encoding" header. - - - - - Helper for content types. - - - - - Flyweight design pattern implementation. - - Type of object. - - - - Initializes a new instance of the class. - - How large buffers to allocate. - - - - Get an object. - - Created object. - Will create one if queue is empty. - - - - Enqueues the specified buffer. - - Object to enqueue. - Buffer is is less than the minimum requirement. - - - - Used to create new objects. - - Type of objects to create. - Newly created object. - . - - - - A HTTP parser using delegates to which parsing methods. - - - - - Initializes a new instance of the class. - - - - - Parser method to copy all body bytes. - - - Needed since a TCP packet can contain multiple messages - after each other, or partial messages. - - - - Try to find a header name. - - - - - - Get header values. - - - Will also look for multi header values and automatically merge them to one line. - Content length is not a number. - - - - Toggle body bytes event. - - - - - - - - Raise the event, since we have successfully parsed a message and it's body. - - - - - First message line. - - Will always contain three elements. - Used to raise the or event - depending on the words in the array. - BadRequestException. - - - - Continue parsing a message - - Byte buffer containing bytes - Where to start the parsing - Number of bytes to parse - index where the parsing stopped. - Parsing failed. - - - - Parses the first line in a request/response. - - true if first line is well formatted; otherwise false. - Invalid request/response line. - - - - Reset parser to initial state. - - - - - Gets or sets current line number. - - - - - The request line has been parsed. - - - - - Response line has been parsed. - - - - - Parsed a header. - - - - - Received body bytes. - - - - - A message have been successfully parsed. - - - - - Used to be able to quickly swap parser method. - - - - - - Get or create components used in the web server framework - - - - - - - - Get or create a type. - - Type to create - Created type. - - Gets or creates types in the framework. - Check for more information on which - types the factory should contain. - - - - - Used to create all key types in the HTTP server. - - - Should have factory methods at least for the following types: - , , - , , - , , - , , - . - - Check the default implementations to see which constructor - parameters you will get. - - - HttpFactory.Add(typeof(IRequest), (type, args) => new MyRequest((string)args[0])); - - - - - - Initializes a new instance of the class. - - - - - Add a factory method for a type. - - Type to create - Method creating the type. - - - - Used to - - - - - - - Setup our singleton. - - - - - - We want to use a singleton, but we also want to be able - to let the developer to setup his own header factory. - Therefore we use this method to create our own factory only if the user - have not specified one. - - - - - Small method to create a message factory singleton and replace then default delegate method. - - - - - - - - Create a type. - - Type to create - Created type. - - - - Gets http factory for the current listener. - - - - - Delegate used to create a certain type - - Created type. - - Method must never fail. - - - - - Used to define which headers a parse is for. - - - - - Initializes a new instance of the class. - - Name of the header. - - - - Gets name of header that this parser is for. - - - - - Parses "Date" header. - - - - - Parse a header - - Name of header. - Reader containing value. - HTTP Header - Header value is not of the expected format. - - - - Authorization response - - - - A user agent that wishes to authenticate itself with a server-- - usually, but not necessarily, after receiving a 401 response--does - so by including an Authorization request-header field with the - request. The Authorization field value consists of credentials - containing the authentication information of the user agent for - the realm of the resource being requested. - - - Authorization = "Authorization" ":" credentials - - - HTTP access authentication is described in "HTTP Authentication: - Basic and Digest Access Authentication" [43]. If a request is - authenticated and a realm specified, the same credentials SHOULD - be valid for all other requests within this realm (assuming that - the authentication scheme itself does not require otherwise, such - as credentials that vary according to a challenge value or using - synchronized clocks). - When a shared cache (see section 13.7) receives a request - containing an Authorization field, it MUST NOT return the - corresponding response as a reply to any other request, unless one - of the following specific exceptions holds: - - - - If the response includes the "s-maxage" cache-control - directive, the cache MAY use that response in replying to a - subsequent request. But (if the specified maximum age has - passed) a proxy cache MUST first revalidate it with the origin - server, using the request-headers from the new request to allow - the origin server to authenticate the new request. (This is the - defined behavior for s-maxage.) If the response includes "s- - maxage=0", the proxy MUST always revalidate it before re-using - it. - - If the response includes the "must-revalidate" cache-control - directive, the cache MAY use that response in replying to a - subsequent request. But if the response is stale, all caches - MUST first revalidate it with the origin server, using the - request-headers from the new request to allow the origin server - to authenticate the new request. - - If the response includes the "public" cache-control directive, - it MAY be returned in reply to any subsequent request. - - - - - - - Name constant - - - - - Gets or sets authentication data. - - - - - Gets or sets authentication protocol. - - - - - Gets name of header. - - - - - User needs to authenticate. - - - - - - - Initializes a new instance of the class. - - Exception description. - - - - Initializes a new instance of the class. - - Exception description. - Inner exception. - - - - A response have been received. - - - - - Initializes a new instance of the class. - - The response. - - - - Gets or sets response. - - - - - Creates a single message for one of the end points. - - - The factory is - - - - - Initializes a new instance of the class. - - The MSG factory. - The factory. - The parser. - - - - Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. - - 2 - - - - Received a header from parser - - - - - - - Will continue the parsing until nothing more can be parsed. - - buffer to parse - where to start in the buffer - number of bytes to process. - Position where parser stopped parsing. - Parsing failed. - - - - Reset parser. - - - Something failed, reset parser so it can start on a new request. - - - - - A request have been successfully parsed. - - - - - A response have been successfully parsed. - - - - - Client asks if he may continue. - - - If the body is too large or anything like that you should respond . - - - - - Used to notify about 100-continue header. - - - - - Initializes a new instance of the class. - - request that want to continue. - - - - Gets request that want to continue - - - - - Default log filter implementation. - - - - - Determines which classes can log - - - - - Checks if the specified type can send - log entries at the specified level. - - Log level - Type that want to write a log entry. - true if logging is allowed; otherwise false. - - - - Add a name space filter. - - Name space to add filter for. - Minimum log level required. - - - // Parsing can only add error and fatal messages - AddNamespace("SipSharp.Messages.Headers.Parsers", LogLevel.Error); - AddType(typeof(SipParser), LogLevel.Error); - - // Transport layer can only log warnings, errors and fatal messages - AddNamespace("SipSharp.Transports.*", LogLevel.Warning); - - - - - - Used to specify standard filter rules - - - Parser can only display errors. Transports only warnings. - - - - - Add filter for a type - - Type to add filter for. - Minimum log level required. - - - // Parsing can only add error and fatal messages - AddNamespace("SipSharp.Messages.Headers.Parsers", LogLevel.Error); - AddType(typeof(SipParser), LogLevel.Error); - - // Transport layer can only log warnings, errors and fatal messages - AddNamespace("SipSharp.Transports.*", LogLevel.Warning); - - - - - - Add filter for a type - - Type to add filter for. - Minimum log level required. - - - // Parsing can only add error and fatal messages - AddNamespace("SipSharp.Messages.Headers.Parsers", LogLevel.Error); - AddType("SipSharp.Messages.MessageFactory", LogLevel.Error); - - // Transport layer can only log warnings, errors and fatal messages - AddNamespace("SipSharp.Transports.*", LogLevel.Warning); - - - Type could not be identified. - - - - Checks if the specified type can send - log entries at the specified level. - - Log level - Type that want to write a log entry. - true if logging is allowed; otherwise false. - - - No filters = everything logged. = no logs. Don't use a rule with '*' or '.*' - - - - User have specified a wild card filter. - - - Wild card filters are used to log a name space and - all it's children name spaces. - - - - - Result of processing. - - - - - Continue with the next handler - - - - - No more handlers can process the request. - - - The server will process the response object and - generate a HTTP response from it. - - - - - Response have been sent back by the handler. - - - This option should only be used if you are streaming - something or sending back a custom result. The server will - not process the response object or send anything back - to the client. - - - - - Used to store all headers that that aren't recognized. - - - - - Initializes a new instance of the class. - - The name. - The value. - - - - Gets or sets value - - - - - Gets header name - - - - - Parses . - - - - - Parse a header - - Name of header. - Reader containing value. - HTTP Header - Header value is not of the expected format. - - - - Collection of parameters - - - - - Get a parameter. - - - - - - - Add a query string parameter. - - Parameter name - Value - - - - Checks if the specified parameter exists - - Parameter name. - true if found; otherwise false; - - - - Gets number of parameters. - - - - - Gets last value of an parameter. - - Parameter name - String if found; otherwise null. - - - - Parameter in - - - - - Gets *last* value. - - - Parameters can have multiple values. This property will always get the last value in the list. - - String if any value exist; otherwise null. - - - - Gets or sets name. - - - - - Gets a list of all values. - - - - - A parameter in . - - - - - Returns an enumerator that iterates through the collection. - - - A that can be used to iterate through the collection. - - 1 - - - - Returns an enumerator that iterates through a collection. - - - An object that can be used to iterate through the collection. - - 2 - - - - Gets last value. - - - Parameters can have multiple values. This property will always get the last value in the list. - - String if any value exist; otherwise null. - - - - Gets or sets name. - - - - - Gets a list of all values. - - - - - Used when the request line have been successfully parsed. - - - - - Initializes a new instance of the class. - - The HTTP method. - The URI path. - The HTTP version. - - - - Initializes a new instance of the class. - - - - - Gets or sets HTTP method. - - - Should be one of the methods declared in . - - - - - Gets or sets requested URI path. - - - - - Gets or sets the version of the SIP protocol that the client want to use. - - - - - Content-type - - - - - Header name. - - - - - Initializes a new instance of the class. - - Type of the content. - Value parameters. - - - - Initializes a new instance of the class. - - Type of the content. - - - - Returns data formatted as a HTTP header value. - - - A that represents the current . - - - - - Gets all parameters. - - - - - Gets content type. - - - - - Gets header name - - - - - Requested resource may not be accessed. - - - Normally thrown after an authentication attempt have failed too many times. - - - - - - Initializes a new instance of the class. - - Exception description. - - - - Initializes a new instance of the class. - - Exception description. - Inner exception. - - - - Stream-based multipart handling. - - In this incarnation deals with an HttpInputStream as we are now using - IntPtr-based streams instead of byte []. In the future, we will also - send uploads above a certain threshold into the disk (to implement - limit-less HttpInputFiles). - - - Taken from HttpRequest in mono (http://www.mono-project.com) - - - - - Client X.509 certificate, X.509 chain, and any SSL policy errors encountered - during the SSL stream creation - - - - - Initializes a new instance of the class. - - The certificate. - Client security certificate chain. - Any SSL policy errors encountered during the SSL stream creation. - - - - Client security certificate - - - - - Client security certificate chain - - - - - Any SSL policy errors encountered during the SSL stream creation - - - - - Credits and description: http://theinstructionlimit.com/?p=76 - - - Converted to .Net 2.0 - - - - - Session in the system - - - - - Gets or sets session id. - - - - - Factory creating null logger. - - - - - Initializes a new instance of the class. - - - - - Create a new logger. - - Type that requested a logger. - Logger for the specified type; - - MUST ALWAYS return a logger. Return if no logging - should be used. - - - - - Logger instance. - - - - - Provides resources. - - - - - Used to access resources. - - - - - Add a new resource loader. - - Provider to add. - Manager have been started. - - - - Check if a resource exists. - - Uri to check - true if found; otherwise false. - - - if (manager.Exists("/views/user/view.haml")) - return true - - - - - - Get a resource. - - Uri path to resource. - Resource if found; otherwise null. - - - Resource resource = manager.Get("/views/user/view.haml"); - - - - - - Start manager. - - - - - Gets number of resource providers - - - - - Get all view names from a folder. - - Path to find views in. - A collection of view names (without path). - - - - Add a new resource loader. - - Provider to add. - Manager have been started. - - - - Start manager. - - - - - Check if a resource exists. - - Uri to check - true if found; otherwise false. - - - if (manager.Exists("/views/user/view.haml")) - return true - - - - - - Get a resource. - - Uri path to resource. - Resource if found; otherwise null. - - - Resource resource = manager.Get("/views/user/view.haml"); - - - - - - Gets number of resource providers - - - - - Loads resources that are embedded in assemblies. - - - No locks used internally since all mappings are loaded during start up. - - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class. - - Path (Uri) requested by clients - Assembly that the resources exist in - Name space that the resources exist in - - - - Add a specific resource. - - Path (Uri) requested by clients - Assembly that the resources exist in - Name space to root folder under (all name spaces below the specified one are considered as folders) - Name space and name of resource. - - - Add("/", Assembly.GetExecutingAssembly(), "MyApplication.Files", "Myapplication.Files.Images.MyImage.png"); - - - - - - Add resources. - - Path (Uri) requested by clients - Assembly that the resources exist in - Name of resource, including name space. - true if file was found (and has not previously been added); otherwise false. - - - - - - Add resources in a specific path (will not work with sub folders) - - Path (Uri) requested by clients - Assembly that the resources exist in - Name space to root folder under which all name spaces exists in, - true if any files was found; otherwise false. - - - Adds all views in the specified folder. Sub folders are not supported since it's hard to determine - with parts are the path and witch parts are the filename. Use to get support - for sub folders. - - - - - Add("/user/", typeof(MyController).Assembly, "YourProject.Users.Views"); - - - - - - Add resources in a folder and it's sub folder - - - - - - This method is not going to map files but keep the mapping and - try to look up views every time they are requested. This is the method - to use to add a resource folder that has sub folders. - - - - - - Tries to load file by using previously added paths. - - Uri path including file name - - - - - Checks if a resource exists in the specified directory - - Uri path to resource - true if resource was found; otherwise false. - - - if (resources.Exists("/files/user/user.png")) - Debug.WriteLine("Resource exists."); - - - - - - Load a resource. - - Uri of resource. - Resource if found and loaded; otherwise null. - - - - Find all views in a folder/path. - - Uri path - Collection to add all view names to. - - - - Loads all files in a resource directory - - - - - - Gets or sets assembly that the resource exists in. - - - - - Gets or sets resource name. - - - - - Gets or sets full name space path to resource. - - - - - Gets or sets if this file is for a certain content type. - - - - - Gets or sets full "virtual" Uri path, excluding file name. - - - - - Gets or sets assembly - - - - - Gets or sets name space root. - - - - - Gets or sets uri path. - - - - - A list of request cookies. - - - - - Let's copy all the cookies. - - value from cookie header. - - - - Initializes a new instance of the class. - - - - - Adds a cookie in the collection. - - cookie to add - cookie is null - Name must be specified. - - - - Remove all cookies. - - - - - Remove a cookie from the collection. - - Name of cookie. - - - - Gets a collection enumerator on the cookie list. - - collection enumerator - - - - Returns an enumerator that iterates through the collection. - - - - A that can be used to iterate through the collection. - - 1 - - - - Gets the count of cookies in the collection. - - - - - Gets the cookie of a given identifier (null if not existing). - - - - - Collection of headers. - - - - - Collection of headers. - - - - - Gets a header - - header name. - header if found; otherwise null. - - - - Initializes a new instance of the class. - - Factory used to created headers. - - - - Adds a header - - - Will replace any existing header with the same name. - - header to add - header is null. - Header name cannot be null. - - - - Add a header. - - Header name - Header value - - Will try to parse the header and create a object. - - Header value is not correctly formatted. - name or value is null. - - - - Add a header. - - Header name - Header value - - Will try to parse the header and create a object. - - name or value is null. - - - - Get a header - - Type that it should be cast to - Name of header - Header if found and casted properly; otherwise null. - - - - Returns an enumerator that iterates through the collection. - - - A that can be used to iterate through the collection. - - 1 - - - - Returns an enumerator that iterates through a collection. - - - An object that can be used to iterate through the collection. - - 2 - - - - Gets a header - - header name. - header if found; otherwise null. - - - - Header for "Date" and "If-Modified-Since" - - - - The field value is an HTTP-date, as described in section 3.3.1 in RFC2616; - it MUST be sent in RFC 1123 [8]-date format. An example is - - Date: Tue, 15 Nov 1994 08:12:31 GMT - - Origin servers MUST include a Date header field in all - responses, except in these cases: - - If the response status code is 100 (Continue) or 101 (Switching - Protocols), the response MAY include a Date header field, at the server's - option. - If the response status code conveys a server error, e.g. 500 - (Internal Server Error) or 503 (Service Unavailable), and it is inconvenient - or impossible to generate a valid Date. - If the server does not have a clock that can provide a - reasonable approximation of the current time, its responses MUST NOT include - a Date header field. In this case, the rules in section 14.18.1 in RFC2616 - MUST be followed. - - - A received message that does not have a Date header field MUST - be assigned one by the recipient if the message will be cached by that - recipient or gatewayed via a protocol which requires a Date. An HTTP - implementation without a clock MUST NOT cache responses without revalidating - them on every use. An HTTP cache, especially a shared cache, SHOULD use a - mechanism, such as NTP [28], to synchronize its clock with a reliable - external standard. - Clients SHOULD only send a Date header field in messages that - include an entity-body, as in the case of the PUT and POST requests, and - even then it is optional. A client without a clock MUST NOT send a Date - header field in a request. - The HTTP-date sent in a Date header SHOULD NOT represent a date - and time subsequent to the generation of the message. It SHOULD represent - the best available approximation of the date and time of message generation, - unless the implementation has no means of generating a reasonably accurate - date and time. In theory, the date ought to represent the moment just before - the entity is generated. In practice, the date can be generated at any time - during the message origination without affecting its semantic value. - - - - - - Header name - - - - - Initializes a new instance of the class. - - Header name. - Name must not be empty. - - - - Initializes a new instance of the class. - - Header name. - Universal time. - - - - Returns data formatted as a HTTP header value. - - - A that represents the current . - - - - - Gets or sets date time. - - Should be in UTC. - - - - Gets header name - - - - - Type cached for fast property value modifications. - - - - - Get a property value. - - Instance to get value from. - Name of property. - Property value. - - - - Assign a value, try to convert it if it's not the same type as the property type. - - Object containing the property - Name of property - Value to convert and assign - Failed to find property. - Could not convert value type to property type. - - - - Assign value to a property - - Object containing the property - Name of property - Value to assign, must be of the same type as the property. - Failed to find property. - - - - Used to cache property information - - - - - Gets the property. - - The name. - - Failed to find property. - - - InvalidCastException. - - - - Get a property value. - - Instance to get value from. - Name of property. - Property value. - - - - Assign a value, try to convert it if it's not the same type as the property type. - - Object containing the property - Name of property - Value to convert and assign - Failed to find property. - Could not convert value type to property type. - - - - Assign value to a property - - Object containing the property - Name of property - Value to assign, must be of the same type as the property. - Failed to find property. - - - - Gets or sets member info - - - - - Gets or sets member type - - - - - Base interface to read string tokens from different sources. - - - - - Assign a new buffer - - Buffer to process. - Where to start process buffer - Buffer length - - - - Assign a new buffer - - Buffer to process - - - - Consume current character. - - - - - Consume specified characters - - One or more characters. - - - - Consumes horizontal white spaces (space and tab). - - - - - Consume horizontal white spaces and the specified character. - - Extra character to consume - - - - Checks if one of the remaining bytes are a specified character. - - Character to find. - true if found; otherwise false. - - - - Read a character. - - Character if not EOF; otherwise null. - - - - Get a text line. - - - Will merge multiline headers. - - - - Read quoted string - - string if current character (in buffer) is a quote; otherwise null. - - - - Read until end of string, or to one of the delimiters are found. - - characters to stop at - A string (can be ). - - Will not consume the delimiter. - - - - - Read until end of string, or to one of the delimiters are found. - - A string (can be ). - - Will not consume the delimiter. - - - - - Read to end of buffer, or until specified delimiter is found. - - Delimiter to find. - A string (can be ). - - Will not consume the delimiter. - - - - - Will read until specified delimiter is found. - - Character to stop at. - A string if the delimiter was found; otherwise null. - - Will trim away spaces and tabs from the end. - Will not consume the delimiter. - - - - - Read until one of the delimiters are found. - - characters to stop at - A string if one of the delimiters was found; otherwise null. - - Will trim away spaces and tabs from the end. - Will not consume the delimiter. - - - - - Read until a horizontal white space occurs. - - A string if a white space was found; otherwise null. - - - - Gets current character - - if end of buffer. - - - - Gets if end of buffer have been reached - - - - - Gets if more bytes can be processed. - - - - - Gets or sets current position in buffer. - - - THINK before you manually change the position since it can blow up - the whole parsing in your face. - - - - - Gets total length of buffer. - - - - - Gets or sets line number. - - - - - Gets next character - - if end of buffer. - - - - Gets number of bytes left. - - - - - Factory is used to create new logs in the system. - - - - - Assigns log factory being used. - - The log factory. - A factory have already been assigned. - - - - Create a new logger. - - Type that requested a logger. - Logger for the specified type; - - - - Component that should be registered in the container. - - - Register using all interfaces that is specified in this assembly. - - - - - Used to authenticate users - - - Authentication is requested by throwing - - - - - Request implementation. - - - - - Initializes a new instance of the class. - - The method. - The path. - The version. - - - - Get a header - - Type that it should be cast to - Name of header - Header if found and casted properly; otherwise null. - - - - Add a new header. - - - - - - - Add a new header. - - Header to add. - - - - Returns an enumerator that iterates through the collection. - - - A that can be used to iterate through the collection. - - 1 - - - - Returns an enumerator that iterates through a collection. - - - An object that can be used to iterate through the collection. - - 2 - - - - Gets a header. - - - - - - - Gets request URI. - - - - - Gets cookies. - - - - - Gets all uploaded files. - - - - - Gets query string and form parameters - - - - - Gets form parameters. - - - - - Gets query string. - - - - - Gets if request is an Ajax request. - - - - - Gets or sets connection header. - - - - - Gets or sets HTTP version. - - - - - Gets or sets HTTP method. - - - - - Gets requested URI. - - - - - Kind of content in the body - - Default is text/html - - - - Gets or sets encoding - - - - - Gets headers. - - - - - Gets body stream. - - - - - Size of the body. MUST be specified before sending the header, - unless property Chunked is set to true. - - - Any specifically assigned value or Body stream length. - - - - - Event arguments used when a new header have been parsed. - - - - - Initializes a new instance of the class. - - Name of header. - Header value. - Name cannot be empty - value is null. - - - - Initializes a new instance of the class. - - - - - Gets or sets header name. - - - - - Gets or sets header value. - - - - - Collection of parameters. - - - or is not used since each parameter can - have multiple values. - - - - - Initializes a new instance of the class. - - Collections to merge. - - Later collections will overwrite parameters from earlier collections. - - - - - Initializes a new instance of the class. - - - - - Get a list of string arrays. - - - - - - Get parameters - - Sub array (text array) - - - - - Returns an enumerator that iterates through the collection. - - - A that can be used to iterate through the collection. - - 1 - - - - Returns an enumerator that iterates through a collection. - - - An object that can be used to iterate through the collection. - - 2 - - - - Get a parameter. - - - - - - - Add a query string parameter. - - Parameter name - Value - - - - Checks if the specified parameter exists - - Parameter name. - true if found; otherwise false; - - - - Gets number of parameters. - - - - - Gets last value of an parameter. - - Parameter name - String if found; otherwise null. - - - - Parses . - - - - - Parse a header - - Name of header. - Reader containing value. - HTTP Header - Header value is not of the expected format. - - - - Parses numerical values - - - - - Parse a header - - Name of header. - Reader containing value. - HTTP Header - Header value is not of the expected format. - - - - Parses . - - - - - Parse a header - - Name of header. - Reader containing value. - HTTP Header - Header value is not of the expected format. - - - - Request couldn't be parsed successfully. - - - - - Initializes a new instance of the class. - - Exception description. - - - - Initializes a new instance of the class. - - Exception description. - Exception description. - - - - Implements basic authentication scheme. - - - - - Create a response that can be sent in the WWW-Authenticate header. - - Realm that the user should authenticate in - Not used by basic authentication - A WWW-Authenticate header. - Argument is null. - - - - An authentication response have been received from the web browser. - Check if it's correct - - Authorization header - Realm that should be authenticated - GET/POST/PUT/DELETE etc. - Authentication object that is stored for the request. A user class or something like that. - if authenticationHeader is invalid - If any of the paramters is empty or null. - - - - Gets authenticator scheme - - - - digest - - - - - Reads strings from a byte array. - - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class. - - Encoding to use when converting byte array to strings. - - - - Initializes a new instance of the class. - - Buffer to read from. - Encoding to use when converting byte array to strings. - - - - Assign a new buffer - - Buffer to process. - Where to start process buffer - Buffer length - Buffer needs to be a byte array - - - - Assign a new buffer - - Buffer to process - Buffer needs to be a byte array - - - - Consume current character. - - - - - Get a text line. - - - Will merge multi line headers. - - - - Read quoted string - - string if current character (in buffer) is a quote; otherwise null. - - - - Read until end of string, or to one of the delimiters are found. - - characters to stop at - - A string (can be ). - - - Will not consume the delimiter. - - InvalidOperationException. - - - - Read until end of string, or to one of the delimiters are found. - - A string (can be ). - - Will not consume the delimiter. - - - - - Read to end of buffer, or until specified delimiter is found. - - Delimiter to find. - - A string (can be ). - - - Will not consume the delimiter. - - InvalidOperationException. - - - - Consume specified characters - - One or more characters. - - - - Consumes horizontal white spaces (space and tab). - - - - - Consume horizontal white spaces and the specified character. - - Extra character to consume - - - - Read a character. - - - Character if not EOF; otherwise null. - - - - - Will read until specified delimiter is found. - - Character to stop at. - - A string if the delimiter was found; otherwise null. - - - Will trim away spaces and tabs from the end. - InvalidOperationException. - - - - Read until one of the delimiters are found. - - characters to stop at - - A string if one of the delimiters was found; otherwise null. - - - Will not consume the delimiter. - - InvalidOperationException. - - - - Read until a horizontal white space occurs. - - A string if a white space was found; otherwise null. - - - - Checks if one of the remaining bytes are a specified character. - - Character to find. - - true if found; otherwise false. - - - - - Gets or sets line number. - - - - - Gets if end of buffer have been reached - - - - - - Gets if more bytes can be processed. - - - - - - Gets next character - - if end of buffer. - - - - Gets current character - - if end of buffer. - - - - Gets or sets current position in buffer. - - - THINK before you manually change the position since it can blow up - the whole parsing in your face. - - - - - Gets total length of buffer. - - - - - - Gets number of bytes left. - - - - - Response to a request. - - - - - Redirect user. - - Where to redirect to. - - Any modifications after a redirect will be ignored. - - - - - Gets connection type. - - - - - Gets cookies. - - - - - Gets HTTP version. - - - Default is HTTP/1.1 - - - - - Information about why a specific status code was used. - - - - - Status code that is sent to the client. - - Default is - - - - Gets or sets content type - - - - - Request context - - - Contains information about a HTTP request and where it came from. - - - - - Gets or sets http context. - - - - - Gets or sets http request. - - - - - Gets or sets http response. - - - - - Contains numerical value. - - - - - Initializes a new instance of the class. - - The name. - The value. - - - - Returns data formatted as a HTTP header value. - - - A that represents the current . - - - - - Gets value - - - - - Gets header name - - - - - Form parameters where form string arrays have been converted to real arrays. - - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class. - - The name. - The value. - - - - Initializes a new instance of the class. - - Parse parameters from the this collection. - - - - Get a parameter. - - - - - - - Add a parameter - - Name of parameter, can contain a string array. - Value - - - ArrayParameterCollection array = new ArrayParameterCollection(); - array.Add("user[FirstName]", "Jonas"); - array.Add("user[FirstName]", "Arne"); - string firstName = array["user"]["FirstName"].Value; // "Arne" is returned - foreach (string value in array["user"]["FirstName"]) - Console.WriteLine(value); // each name is displayed. - - - - - - Checks if the specified parameter exists - - Parameter name. - true if found; otherwise false; - - - - Returns an enumerator that iterates through the collection. - - - A that can be used to iterate through the collection. - - 1 - - - - Gets first value of an item. - - - String if found; otherwise null. - - - - Gets number of parameters. - - - - - Gets last value of an parameter. - - Parameter name - String if found; otherwise null. - - - - Assign properties from HTTP parameters. - - - - - Used to filter out properties. - - Filter handler. - Handler have already been set. - - - - Assign properties in the specified object. - - Object to fill. - Contains all parameters that should be assigned to the properties. - Properties was not found or value could not be converted. - Any parameter is null. - - - - Used to be able to filter properties - - Model having it's properties assigned - Property about to be assigned - Value to assign - true if value can be set; otherwise false. - - - - Failed to assign properties. - - - - - Initializes a new instance of the class. - - The property errors. - - - - Gets all errors during assignment. - - - Dictionary key is property name. - - - - - Used to read from a string object. - - - - - Initializes a new instance of the class. - - Buffer to process. - - - - Initializes a new instance of the class. - - - - - Assign a new buffer - - Buffer to process. - Where to start process buffer - Buffer length - MUST be of type . - buffer needs to be of type string - - - - Assign a new buffer - - Buffer to process - MUST be of type . - buffer needs to be of type string - - - - Consume current character. - - - - - Get a text line. - - - Will merge multiline headers. - - - - Read quoted string - - string if current character (in buffer) is a quote; otherwise null. - - - - Read until end of string, or to one of the delimiters are found. - - characters to stop at - A string (can be ). - InvalidOperationException. - - - - Read until end of string, or to one of the delimiters are found. - - A string (can be ). - - Will not consume the delimiter. - - - - - Read to end of buffer, or until specified delimiter is found. - - Delimiter to find. - A string (can be ). - InvalidOperationException. - - - - Consume specified characters - - One or more characters. - - - - Consumes horizontal white spaces (space and tab). - - - - - Read a character. - - - Character if not EOF; otherwise null. - - - - - Will read until specified delimiter is found. - - Character to stop at. - - A string if the delimiter was found; otherwise null. - - - Will trim away spaces and tabs from the end. - Will not consume the delimiter. - - InvalidOperationException. - - - - Read until one of the delimiters are found. - - characters to stop at - - A string if one of the delimiters was found; otherwise null. - - - Will not consume the delimiter. - - InvalidOperationException. - - - - Read until a horizontal white space occurs (or end, or end of line). - - - A string if a white space was found; otherwise null. - - - - - Consume horizontal white spaces and the specified character. - - Extra character to consume - - - - Checks if one of the remaining bytes are a specified character. - - Character to find. - - true if found; otherwise false. - - - - - Gets or sets line number. - - - - - Gets if end of buffer have been reached - - - - - - Gets if more bytes can be processed. - - - - - - Gets next character - - if end of buffer. - - - - Gets current character - - if end of buffer. - - - - Gets or sets current position in buffer. - - - THINK before you manually change the position since it can blow up - the whole parsing in your face. - - - - - Gets total length of buffer. - - - - - - Gets number of bytes left. - - - - - Default log writer, writes everything to void (nowhere). - - - - - - The logging instance. - - - - - Write an entry that helps when debugging code. - - Log message - - - - Write an entry that helps when debugging code. - - Log message - Thrown exception to log. - - - - Write a entry needed when following through code during hard to find bugs. - - Log message - - - - Write a entry that helps when trying to find hard to find bugs. - - Log message - Thrown exception to log. - - - - Informational message, needed when helping customer to find a problem. - - Log message - - - - Informational message, needed when helping customer to find a problem. - - Log message - Thrown exception to log. - - - - Something is not as we expect, but the code can continue to run without any changes. - - Log message - - - - Something is not as we expect, but the code can continue to run without any changes. - - Log message - Thrown exception to log. - - - - Something went wrong, but the application do not need to die. The current thread/request - cannot continue as expected. - - Log message - - - - Something went wrong, but the application do not need to die. The current thread/request - cannot continue as expected. - - Log message - Thrown exception to log. - - - - Something went very wrong, application might not recover. - - Log message - - - - Something went very wrong, application might not recover. - - Log message - Thrown exception to log. - - - - Priority for log entries - - - - - - Very detailed logs to be able to follow the flow of the program. - - - - - Logs to help debug errors in the application - - - - - Information to be able to keep track of state changes etc. - - - - - Something did not go as we expected, but it's no problem. - - - - - Something that should not fail failed, but we can still keep - on going. - - - - - Something failed, and we cannot handle it properly. - - - - - This class writes to the console. - - - It colors the output depending on the log level - and includes a 3-level stack trace (in debug mode) - - - - - - Initializes a new instance of the class. - - Type being logged. - Log filter. - - - - Get color for the specified log level - - Level for the log entry - A for the level - - - - Write an entry - - Importance of the log message - The message. - - - - Write an entry that helps when debugging code. - - Log message - - - - Write an entry that helps when debugging code. - - Log message - Thrown exception to log. - - - - Write a entry needed when following through code during hard to find bugs. - - Log message - - - - Write a entry that helps when trying to find hard to find bugs. - - Log message - Thrown exception to log. - - - - Informational message, needed when helping customer to find a problem. - - Log message - - - - Informational message, needed when helping customer to find a problem. - - Log message - Thrown exception to log. - - - - Something is not as we expect, but the code can continue to run without any changes. - - Log message - - - - Something is not as we expect, but the code can continue to run without any changes. - - Log message - Thrown exception to log. - - - - Something went wrong, but the application do not need to die. The current thread/request - cannot continue as expected. - - Log message - - - - Something went wrong, but the application do not need to die. The current thread/request - cannot continue as expected. - - Log message - Thrown exception to log. - - - - Something went very wrong, application might not recover. - - Log message - - - - Something went very wrong, application might not recover. - - Log message - Thrown exception to log. - - - - Gets or sets type that the logger is for - - - - - A HTTP context - - - - - - - - Context that received a HTTP request. - - - - - Disconnect context. - - - - - Gets if current context is using a secure connection. - - - - - Gets logger. - - - - - Gets remote end point - - - - - Gets stream used to send/receive data to/from remote end point. - - - - The stream can be any type of stream, do not assume that it's a network - stream. For instance, it can be a or a ZipStream. - - - - - - Gets the currently handled request - - The request. - - - - Gets the response that is going to be sent back - - The response. - - - - Initializes a new instance of the class. - - Socket received from HTTP listener. - Context used to parse incoming messages. - - - - Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. - - 2 - - - - Disconnect context. - - - - - Close and release socket. - - - - - Create stream used to send and receive bytes from the socket. - - Socket to wrap - Stream - Stream could not be created. - - - - Interpret incoming data. - - - - - - A request was received from the parser. - - - - - - - Parse all complete requests in buffer. - - - offset in buffer where parsing stopped. - Parsing failed. - - - - Start content. - - A socket operation failed. - Reading from stream failed. - - - - Gets currently executing HTTP context. - - - - - Gets or sets description - - - - - gets factory used to build request objects - - - - - Gets socket - - - - - Gets remove end point - - - - - Gets network stream. - - - - - Gets the currently handled request - - The request. - - - - Gets the response that is going to be sent back - - The response. - - - - Gets logger. - - - - - Gets if current context is using a secure connection. - - - - - Triggered for all requests in the server (after the response have been sent) - - - - - Triggered for current request (after the response have been sent) - - - - - A new request have been received. - - - - - A new request have been received (invoked for ALL requests) - - - - - Client have been disconnected. - - - - - Client asks if he may continue. - - - If the body is too large or anything like that you should respond . - - - - - Initializes a new instance of the class. - - SSL protocol to use. - The socket. - The context. - Server certificate to use. - - - - Create stream used to send and receive bytes from the socket. - - Socket to wrap - Stream - Stream could not be created. - - - - Gets or sets client certificate. - - - - - Gets used protocol. - - - - - Gets or sets if client certificate should be used instead of server certificate. - - - - - Resource information. - - - Used by content providers to be able to get information - on resources (views, files etc). - - - - - Gets or sets date when resource was modified. - - - if not used. - - - Should always be universal time. - - - - - Gets or sets resource stream. - - - - - Contains parameters for HTTP headers. - - - - - Add a parameter - - name - value - - Existing parameter with the same name will be replaced. - - - - - Parse parameters. - - Parser containing buffer to parse. - A collection with all parameters (or just a empty collection). - Expected a value after equal sign. - - - - Parse parameters. - - Parser containing buffer to parse. - Parameter delimiter - A collection with all parameters (or just a empty collection). - Expected a value after equal sign. - - - - Returns a that represents the current . - - - A that represents the current . - - - - - Gets or sets a value - - parameter name - value if found; otherwise null. - - - - Create a HTTP response object. - - - - - Initializes a new instance of the class. - - HTTP Version. - HTTP status code. - Why the status code was selected. - Version must start with 'HTTP/' - - - - Initializes a new instance of the class. - - Context that the response will be sent through. - Request that the response is for. - Version must start with 'HTTP/' - - - - Redirect user. - - Where to redirect to. - - Any modifications after a redirect will be ignored. - - - - - Add a new header. - - - - - - - Add a new header. - - Header to add. - - - - Returns an enumerator that iterates through the collection. - - - A that can be used to iterate through the collection. - - 1 - - - - Returns an enumerator that iterates through a collection. - - - An object that can be used to iterate through the collection. - - 2 - - - - Gets a header. - - - - - - - Gets connection type. - - - - - Status code that is sent to the client. - - Default is - - - - Gets HTTP version. - - - Default is HTTP/1.1 - - - - - Information about why a specific status code was used. - - - - - Size of the body. MUST be specified before sending the header, - unless property Chunked is set to true. - - - Any specifically assigned value or Body stream length. - - - - - Kind of content in the body - - Default is text/html - - - - Gets or sets encoding - - - - - Gets cookies. - - - - - Gets body stream. - - - - - Gets headers. - - - - - A request have been received. - - - - - Initializes a new instance of the class. - - The request. - End point that the request was received from. - - - - End point that the message was received from. - - - - - Received request. - - - - - Class to make dynamic binding of redirects. Instead of having to specify a number of similar redirect rules - a regular expression can be used to identify redirect URLs and their targets. - - - [a-z0-9]+)", "/users/${target}/?find=true", RegexOptions.IgnoreCase) - ]]> - - - - - Initializes a new instance of the class. - - Expression to match URL - Expression to generate URL - - [a-zA-Z0-9]+)", "/user/${first}")); - Result of ie. /employee1 will then be /user/employee1 - ]]> - - - - - Initializes a new instance of the class. - - Expression to match URL - Expression to generate URL - Regular expression options to use, can be null - - [a-zA-Z0-9]+)", "/user/{first}", RegexOptions.IgnoreCase)); - Result of ie. /employee1 will then be /user/employee1 - ]]> - - - - - Initializes a new instance of the class. - - Expression to match URL - Expression to generate URL - Regular expression options to apply - true if request should be redirected, false if the request URI should be replaced. - - [a-zA-Z0-9]+)", "/user/${first}", RegexOptions.None)); - Result of ie. /employee1 will then be /user/employee1 - ]]> - - Argument is null. - - - - - Process the incoming request. - - Request context. - Processing result. - If any parameter is null. - - - - cookie being sent back to the browser. - - - - - - Constructor. - - cookie identifier - cookie content - cookie expiration date. Use for session cookie. - id or content is null - id is empty - - - - Create a new cookie - - name identifying the cookie - cookie value - when the cookie expires. Setting will delete the cookie when the session is closed. - Path to where the cookie is valid - Domain that the cookie is valid for. - - - - Create a new cookie - - Name and value will be used - when the cookie expires. - - - - Gets the cookie HTML representation. - - cookie string - - - - Gets when the cookie expires. - - means that the cookie expires when the session do so. - - - - Gets path that the cookie is valid under. - - - - - The Cache-Control general-header field is used to specify directives that - MUST be obeyed by all caching mechanisms along the request/response - chain. . - - - - The directives specify behavior intended to prevent caches from adversely - interfering with the request or response. These directives typically - override the default caching algorithms. Cache directives are - unidirectional in that the presence of a directive in a request does not - imply that the same directive is to be given in the response. - Note that HTTP/1.0 caches might not implement Cache-Control and - might only implement Pragma: no-cache (see section 14.32 in RFC2616). - Cache directives MUST be passed through by a proxy or gateway - application, regardless of their significance to that application, since the - directives might be applicable to all recipients along the request/response - chain. It is not possible to specify a cache- directive for a specific cache - - - When a directive appears without any 1#field-name parameter, the - directive applies to the entire request or response. When such a - directive appears with a 1#field-name parameter, it applies only to - the named field or fields, and not to the rest of the request or - response. This mechanism supports extensibility; implementations of - future versions of the HTTP protocol might apply these directives to - header fields not defined in HTTP/1.1. - - - The cache-control directives can be broken down into these general - categories: - - - Restrictions on what are cacheable; these may only be imposed by - the origin server. - - Restrictions on what may be stored by a cache; these may be - imposed by either the origin server or the user agent. - - Modifications of the basic expiration mechanism; these may be - imposed by either the origin server or the user agent. - - Controls over cache revalidation and reload; these may only be - imposed by a user agent. - - Control over transformation of entities. - - Extensions to the caching system. - - - - - - - - Header name - - - - - Gets header name - - - - - Serves files in the web server. - - - - FileModule fileModule = new FileModule(); - fileModule.Resources.Add(new FileResources("/", "C:\\inetpub\\myweb")); - - - - - - Initializes a new instance of the class. - - baseUri or basePath is null. - - - - Mime types that this class can handle per default - - - Contains the following mime types: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Will send a file to client. - - HTTP context containing outbound stream. - Response containing headers. - File stream - - - - Process a request. - - Request information - What to do next. - Failed to find file extension - Forbidden file type. - - - - Gets a list with all allowed content types. - - All other mime types will result in . - - - - Gets provider used to add files to the file manager, - - - - - Collection of files. - - - - - Checks if a file exists. - - Name of the file (form item name) - - - - - Add a new file. - - File to add. - - - - Remove all files from disk. - - - - - Get a file - - Name in form - File if found; otherwise null. - - - - Gets number of files - - - - + + + + HttpServer + + + + + Used by to filter out unwanted connections. + + + + + Initializes a new instance of the class. + + The socket. + + + + Gets or sets if socket can be accepted. + + + + + Gets socket. + + + + + A request have been received. + + + + + + + Initializes a new instance of the class. + + context that received the request. + Received request. + Response to send. + + + + Gets context that received the request. + + + Do not forget to set to true if you are sending + back a response manually through . + + + + + Gets or sets if the request have been handled. + + + The library will not attempt to send the response object + back to the client if this property is set to true. + + + + + Gets request object. + + + + + Gets response object. + + + + + Cookies that should be set. + + + + + Adds a cookie in the collection. + + cookie to add + cookie is null + Name and Content must be specified. + + + + Copy a request cookie + + + When the cookie should expire + + + + Remove all cookies + + + + + Gets a collection enumerator on the cookie list. + + collection enumerator + + + + Returns an enumerator that iterates through the collection. + + + + A that can be used to iterate through the collection. + + 1 + + + + Gets the count of cookies in the collection. + + + + + Gets the cookie of a given identifier. + + Cookie if found; otherwise null. + + + + An exception that can't be handled by the library have been thrown. + + + + + Initializes a new instance of the class. + + The exception. + + + + Gets caught exception. + + + + + Data decoded from a POST body. + + + + + Initializes a new instance of the class. + + + + + Gets or sets decoded files. + + + + + Gets or sets decoded parameters. + + + + + Stores sessions in files. + + + All session parameters must be serializable. + + + + + Stores sessions in your favorite store + + + + + + + + Saves the specified session. + + The session. + + + + Touches the specified session + + Session id. + + Used to prevent sessions from expiring. + + + + + Loads a session + + Session id. + Session if found; otherwise null. + + + + Delete a session + + Id of session + + + + Saves the specified session. + + The session. + + + + Touches the specified session + + Session id. + + Used to prevent sessions from expiring. + + + + + Loads a session + + Session id. + Session if found; otherwise null. + + + + HTTP methods. + + + + + Unknown method + + + + + Posting data + + + + + Get data + + + + + Update data + + + + + Remove data + + + + + Get only HTTP headers. + + + + + Options HTTP 1.1 header. + + + + + Http listener. + + + + + Http listener + + + + + Start listener. + + Number of pending accepts. + + Make sure that you are subscribing on first. + + Listener have already been started. + Failed to start socket. + Invalid port number. + + + + Stop listener. + + + + + Gets listener address. + + + + + Gets if listener is secure. + + + + + Gets if listener have been started. + + + + + Gets or sets logger. + + + + + Gets listening port. + + + + + Gets the maximum content size. + + The content length limit. + + Used when responding to 100-continue. + + + + + A new request have been received. + + + + + Can be used to reject certain clients. + + + + + A HTTP exception have been thrown. + + + Fill the body with a user friendly error page, or redirect to somewhere else. + + + + + Initializes a new instance of the class. + + The address. + The port. + + + + Initializes a new instance of the class. + + The address. + The port. + The HTTP factory. + + + + Creates a new instance with default factories. + + Address that the listener should accept connections on. + Port that listener should accept connections on. + Created HTTP listener. + + + + Creates a new instance with default factories. + + Address that the listener should accept connections on. + Port that listener should accept connections on. + Factory used to create different types in the framework. + Created HTTP listener. + + + + Creates a new instance with default factories. + + Address that the listener should accept connections on. + Port that listener should accept connections on. + Certificate to use + Created HTTP listener. + + + + Create a new context + + Accepted socket + A new context. + + + Throwing exception if in debug mode and not exception handler have been specified. + + + + Start listener. + + Number of pending accepts. + + Make sure that you are subscribing on first. + + Listener have already been started. + Failed to start socket. + Invalid port number. + + + + Stop listener. + + + + + Gets HTTP factory used to create types used by this HTTP library. + + + + + Gets or sets the maximum number of bytes that the request body can contain. + + The content length limit. + + + Used when responding to 100-continue. + + + 0 = turned off. + + + + + + Gets listener address. + + + + + Gets if listener is secure. + + + + + Gets if listener have been started. + + + + + Gets or sets logger. + + + + + Gets listening port. + + + + + A new request have been received. + + + + + Can be used to reject certain clients. + + + + + A HTTP exception have been thrown. + + + Fill the body with a user friendly error page, or redirect to somewhere else. + + + + + Client asks if he may continue. + + + If the body is too large or anything like that you should respond . + + + + + Contents of a cookie header. + + + + + Header in a message + + + Important! Each header should override ToString() + and return it's data correctly formatted as a HTTP header value. + + + + + Gets header name + + + + + Gets value as it would be sent back to client. + + + + + Initializes a new instance of the class. + + The collection. + collection is null. + + + + Gets cookie collection + + + + + Gets header name + + + + + Gets value as it would be sent back to client. + + + + + + Request couldn't be parsed successfully. + + + + + Exception thrown from HTTP server. + + + + + Initializes a new instance of the class. + + HTTP status code. + Exception description. + + + + Initializes a new instance of the class. + + HTTP status code. + Exception description. + Inner exception. + + + + Gets HTTP status code. + + + + + Initializes a new instance of the class. + + Exception description. + + + + Initializes a new instance of the class. + + Exception description. + Exception description. + + + + Something failed during parsing. + + + + + Initializes a new instance of the class. + + Exception description. + + + + Initializes a new instance of the class. + + Exception description. + Inner exception. + + + + Used to parse header values + + + + + Parse a header + + Name of header. + Reader containing value. + HTTP Header + Header value is not of the expected format. + + + + Collection of body decoders. + + + Body decoders are used to parse request body and convert it + into a and a . + + + + + Add another body decoder. + + + + + + Decode body stream + + Stream containing the content + Content type header + Stream encoding + Decoded data. + Body format is invalid for the specified content type. + Something unexpected failed. + + + + Returns an enumerator that iterates through the collection. + + + A that can be used to iterate through the collection. + + 1 + + + + Returns an enumerator that iterates through a collection. + + + An object that can be used to iterate through the collection. + + 2 + + + + Gets number of decoders. + + + + + Custom network stream to mark sockets as reusable when disposing the stream. + + + + + Creates a new instance of the class for the specified . + + + The that the will use to send and receive data. + + + The parameter is null. + + + The parameter is not connected. + -or- + The property of the parameter is not . + -or- + The parameter is in a nonblocking state. + + + + + Initializes a new instance of the class for the specified with the specified ownership. + + + The that the will use to send and receive data. + + + Set to true to indicate that the will take ownership of the ; otherwise, false. + + + The parameter is null. + + + The parameter is not connected. + -or- + the value of the property of the parameter is not . + -or- + the parameter is in a nonblocking state. + + + + + Creates a new instance of the class for the specified with the specified access rights. + + + The that the will use to send and receive data. + + + A bitwise combination of the values that specify the type of access given to the over the provided . + + + The parameter is null. + + + The parameter is not connected. + -or- + the property of the parameter is not . + -or- + the parameter is in a nonblocking state. + + + + + Creates a new instance of the class for the specified with the specified access rights and the specified ownership. + + + The that the will use to send and receive data. + + + A bitwise combination of the values that specifies the type of access given to the over the provided . + + + Set to true to indicate that the will take ownership of the ; otherwise, false. + + + The parameter is null. + + + The parameter is not connected. + -or- + The property of the parameter is not . + -or- + The parameter is in a nonblocking state. + + + + + Closes the current stream and releases any resources (such as sockets and file handles) associated with the current stream. + + + + + Releases the unmanaged resources used by the and optionally releases the managed resources. + + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Parses query string + + + + + Parse a query string + + string to parse + A collection + reader is null. + + + + Parse a query string + + string to parse + A collection + queryString is null. + + + + Convention over configuration server. + + + Used to make it easy to create and use a web server. + + All resources must exist in the "YourProject.Content" namespace (or a subdirectory called "Content" relative to yourapp.exe). + + + + + + Http server. + + + + + Initializes a new instance of the class. + + Factory used to create objects used in this library. + + + + Initializes a new instance of the class. + + + + + Add a decoder. + + decoder to add + + Adding zero decoders will make the server add the + default ones which is and . + + + + + Add a new router. + + Router to add + Server have been started. + + + + Add a file module + + Module to add + module is null. + Cannot add modules when server have been started. + + + + Add a HTTP listener. + + + Listener have been started. + + + + An error have occurred and we need to send a result pack to the client + + The context. + The exception. + + Invoke base class () to send the contents + of . + + + + + Called before anything else. + + The context. + + Looks after a in the request and will + use the if found. + + + + + All server modules are about to be invoked. + + The context. + + Called when routers have been invoked but no modules yet. + + + + + A request have arrived but not yet been processed yet. + + The context. + + Default implementation adds a Date header and Server header. + + + + + Go through all modules and check if any of them can handle the current request. + + + + + + + Process result (check if it should be sent back or not) + + + + true if request was processed properly.; otherwise false. + + + + Processes all routers. + + Request context. + Processing result. + + + + Requests authentication from the user. + + Host/domain name that the server hosts. + + Used when calculating hashes in Digest authentication. + + + + + + + Send a response. + + + + + + + + Start http server. + + Number of pending connections. + + + + Stops the server + + true if all modules should be removed. + + + + Gets the authentication provider. + + + A authentication provider is used to keep track of all authentication types + that can be used. + + + + + Gets or sets number of bytes that a body can be. + + + + Used to determine the answer to a 100-continue request. + + + 0 = turned off. + + + + + + Gets current server. + + + Only valid when a request have been received and is being processed. + + + + + Gets or sets the maximum size of request body (in bytes) + + + + + Gets or sets server name. + + + Used in the "Server" header when serving requests. + + + + + Invoked just before a response is sent back to the client. + + + + + Invoked *after* the web server has tried to handled the request. + + + The event can be used to handle the request after all routes and modules + have tried to process the request. + + + + + Invoked *before* the web server has tried to handled the request. + + + Event can be used to load a session from a cookie or to force + authentication or anything other you might need t do before a request + is handled. + + + + + An error page have been requested. + + + + + Initializes a new instance of the class. + + + + + Used to build headers. + + + + + Add a parser + + Header that the parser is for. + Parser implementation + + Will replace any existing parser for the specified header. + + + + + Add all default (built-in) parsers. + + + Will not replace previously added parsers. + + + + + Create a header parser + + implementation. + + + Uses attribute to find which headers + the parser is for. + + Will not replace previously added parsers. + + + + + Parse a header. + + Name of header + Header value + Header. + Value is not a well formatted header value. + + + + Request sent to a HTTP server. + + + + + + Base interface for request and response. + + + + + Add a new header. + + + + + + + Add a new header. + + Header to add. + + + + Gets body stream. + + + + + Size of the body. MUST be specified before sending the header, + unless property Chunked is set to true. + + + + + Kind of content in the body + + Default is text/html + + + + Gets or sets encoding + + + + + Gets headers. + + + + + Get a header + + Type that it should be cast to + Name of header + Header if found and casted properly; otherwise null. + + + + Gets or sets connection header. + + + + + Gets cookies. + + + + + Gets all uploaded files. + + + + + Gets form parameters. + + + + + Gets or sets HTTP version. + + + + + Gets if request is an Ajax request. + + + + + Gets or sets HTTP method. + + + + + Gets query string and form parameters + + + + + Gets query string. + + + + + Gets requested URI. + + + + + Load resources from disk. + + + + + Loads resources from a specific location (such as assembly, hard drive etc). + + + + + Checks if a resource exists in the specified directory + + Uri path to resource + true if resource was found; otherwise false. + + + if (resources.Exists("/files/user/user.png")) + Debug.WriteLine("Resource exists."); + + + + + + Find all views in a folder/path. + + Absolute Uri path to files that should be found, can end with wild card. + Collection to add all view names to. + + + + Gets a resource. + + Uri path to resource. + Resource + Uri contains forbidden characters. + + + Resource resource = resources.Get("/files/user/user.png"); + + + + + + Default forbidden characters. + + + + + relative to absolute path mappings. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + Request URI path + Disk path + + File names should not be included in URI or path. + + + + new FileResources("/files/user/", "C:\\intetpub\\files\users\\"); + + + + + + Add a new resource mapping. + + Request URI path + Disk path + + File names should not be included in URI or path. + + + + resources.Add("/files/", "C:\\intetpub\\files\\"); + + + absolutePath is not found. + + + + check if source contains any of the chars. + + string to check + Characters to fined + + + + + Go through all mappings and find requested Uri. + + Uri to get local path for. + Path if found; otherwise null. + + + + Checks if a resource exists in the specified directory + + Uri path to resource + true if resource was found; otherwise false. + + + if (resources.Exists("/files/user/user.png")) + Debug.WriteLine("Resource exists."); + + + + + + Gets a resource. + + Uri path to resource. + Resource + Uri contains forbidden characters. + + + Resource resource = resources.Get("/files/user/user.png"); + + + + + + Find all views in a folder/path. + + Absolute Uri path to files that should be found, can end with wild card. + Collection to add all view names to. + Uri contains forbidden characters. + + Find(" + + + + + Gets or sets forbidden characters. + + + Used to revoke access to any system files. + + + + + Gets or sets absolute path on disk, including file name. + + + + + Gets or sets relative file path. + + + + + Gets or sets Uri path, excluding file name + + + + + Used to send a response back to the client. + + + + Writes a object into a stream. + + + Important! ResponseWriter do not throw any exceptions. Instead it just logs them and + let them die peacefully. This is since the response writer is used from + catch blocks here and there. + + + + + + Sends response using the specified context. + + The context. + The response. + + + + Converts and sends a string. + + + + Encoding used to transfer string + + + + Send a body to the client + + Context containing the stream to use. + Body to send + + + + Send all headers to the client + + Response containing call headers. + Content used to send headers. + + + + Decodes body stream. + + + + + Decode body stream + + Stream containing the content + Content type header + Stream encoding + Decoded data. + Body format is invalid for the specified content type. + Something unexpected failed. + + + + All content types that the decoder can parse. + + A collection of all content types that the decoder can handle. + + + + Decodes forms that have multiple sections. + + + http://www.faqs.org/rfcs/rfc1867.html + + + + + form-data + + + + + multipart/form-data + + + + + Decode body stream + + Stream containing the content + Content type header + Stream encoding + Decoded data. + Body format is invalid for the specified content type. + Something unexpected failed. + stream is null. + + + + All content types that the decoder can parse. + + A collection of all content types that the decoder can handle. + + + + Provides sessions. + + Type of session object + + Will always use files for sessions (utilizing the binary formatter), but can + also cache them in memory. + + If caching is enabled, it will only write sessions to disk every 20 seconds if they have + been accessed the last minute (to not keep writing dead sessions to disk). + + + + + + Initializes a new instance of the class. + + Session type must use [Serializable] attribute. + + + + Create a new session. + + + + + + Load session + + Id of session. + Session if found; otherwise null. + sessionId is null. + + + + Load session when a new request comes in. + + + + + + + Save a session to disk. + + Session to write to disk. + + You are responsible for writing sessions to disk if you are not using caching. + + + + + Start the session system and hook + + + + + + Stop session handling + + + + + Gets or sets session cookie name + + + + + Gets or sets cache + + + + + Gets current session. + + + + + Gets or sets number of seconds before a session expired. + + + A session have expired if nothing have accessed it for X seconds. This + class modifies the write time each time it's accessed. + + + + + Determines if cookie should be set in the response. + + + + + Invoked when a session have been changed and should be written to disc. + + + + + First line in a response have been received + + + + + Gets or sets motivation to why the status code was used. + + + + + Gets or sets message status code + + + + + Gets or sets sip protocol version used. + + + + + A request have been parsed successfully by the server. + + + + + Initializes a new instance of the class. + + Received request. + + + + Gets received request. + + + + + Provider returning user to be authenticated. + + + + + Lookups the specified user + + User name. + Typically web server domain name. + User if found; otherwise null. + + User name can basically be anything. For instance name entered by user when using + basic or digest authentication, or SID when using Windows authentication. + + + + + Gets the principal to use. + + Successfully authenticated user. + + + Invoked when a user have successfully been authenticated. + + + + + + + User information used during authentication process. + + + + + Gets or sets user name used during authentication. + + + + + Gets or sets unencrypted password. + + + Password as clear text. You could use instead if your passwords + are encrypted in the database. + + + + + Gets or sets HA1 hash. + + + + Digest authentication requires clear text passwords to work. If you + do not have that, you can store a HA1 hash in your database (which is part of + the Digest authentication process). + + + A HA1 hash is simply a Md5 encoded string: "UserName:Realm:Password". The quotes should + not be included. Realm is the currently requested Host (as in Request.Headers["host"]). + + + Leave the string as null if you are not using HA1 hashes. + + + + + + Used to get or set properties on objects. + + + This class should be a bit faster than the standard reflection. + + + + + Get cached type. + + Type to get/set properties in + Type to use + + + + Used to load/store sessions in the server. + + + + + Initializes a new instance of the class. + + Web server that the provider is for.. + Store to use. + + + + Initializes a new instance of the class. + + The server. + + Uses a file store. + + + + + Loads a session for all requests that got the session cookie. + + The sender. + The instance containing the event data. + + + + Gets current session + + Session if set, otherwise null. + + + + Gets or sets the session life time in minutes. + + The session life time. + + + + A session have been loaded. Use to access it. + + + + + Secure version of the HTTP listener. + + + + + Initializes a new instance of the class. + + Address to accept new connections on. + Port to accept connections on. + Certificate securing the connection. + + + + Create a new context + + Accepted socket + A new context. + + Factory is assigned by the on each incoming request. + + + + + Gets if listener is secure. + + + + + + Gets or sets SSL protocol. + + + + + Gets or sets if client certificate should be used. + + + + + Arguments used when more body bytes have come. + + + + + Initializes a new instance of the class. + + buffer that contains the received bytes. + offset in buffer where to start processing. + number of bytes from that should be parsed. + buffer is null. + + + + Initializes a new instance of the class. + + + + + Gets or sets buffer that contains the received bytes. + + + + + Gets or sets number of bytes from that should be parsed. + + + + + Gets or sets offset in buffer where to start processing. + + + + + HTTP Module + + + + + Process a request. + + Request information + What to do next. + + + + Something unexpected went wrong. + + + + + Initializes a new instance of the class. + + Exception description. + + + + Initializes a new instance of the class. + + Exception description. + Inner exception. + + + + File sent from remote end. + + + + + Gets or sets content type. + + + + + Gets or sets name in form. + + + + + Gets or sets name original file name + + + + + Gets or sets filename for locally stored file. + + + + + Parses Cookie header. + + + + + Parse a header + + Name of header. + Reader containing value. + HTTP Header + Header value is not of the expected format. + + + + Decodes URL encoded values. + + + + + + + Stream containing the content + Content type header + Stream encoding + Collection with all parameters. + Body format is invalid for the specified content type. + Failed to read all bytes from body stream. + + + + All content types that the decoder can parse. + + A collection of all content types that the decoder can handle. + + + + Base class for sessions. + + + Your class must be tagged with attribute to be able to use sessions. + + + + + The session have been changed and should be written to disk. + + + + + Session have been changed. + + + + + Gets or sets when session was accessed last + + + + + Gets current session. + + + + + Gets or sets session id. + + + + + Gets or sets when the session was last written to disk. + + + + + Parses and builds messages + + + The message factory takes care of building messages + from all end points. + + Since both message and packet protocols are used, the factory + hands out contexts to all end points. The context keeps a state + to be able to parse partial messages properly. + + + Each end point need to hand the context back to the message factory + when the client disconnects (or a message have been parsed). + + + + + + Initializes a new instance of the class. + + Factory used to create headers. + + + + Create a new message factory context. + + A new context. + + A context is used to parse messages from a specific endpoint. + + + + + Release a used factory context. + + + + + + A request have been received from one of the end points. + + + + + A response have been received from one of the end points. + + + + + Interface used to write to log files. + + + If you want to use the built in filtering mechanism, create a constructor + which takes one parameter, a . + + + + + Write an entry that helps when debugging code. + + Log message + + + + Write an entry that helps when debugging code. + + Log message + Thrown exception to log. + + + + Something went wrong, but the application do not need to die. The current thread/request + cannot continue as expected. + + Log message + + + + Something went wrong, but the application do not need to die. The current thread/request + cannot continue as expected. + + Log message + Thrown exception to log. + + + + Something went very wrong, application might not recover. + + Log message + + + + Something went very wrong, application might not recover. + + Log message + Thrown exception to log. + + + + Informational message, needed when helping customer to find a problem. + + Log message + + + + Informational message, needed when helping customer to find a problem. + + Log message + Thrown exception to log. + + + + Write a entry that helps when trying to find hard to find bugs. + + Log message + + + + Write a entry that helps when trying to find hard to find bugs. + + Log message + Thrown exception to log. + + + + Something is not as we expect, but the code can continue to run without any changes. + + Log message + + + + Something is not as we expect, but the code can continue to run without any changes. + + Log message + Thrown exception to log. + + + + cookie sent by the client/browser + + + + + + Constructor. + + cookie identifier + cookie content + id or content is null + id is empty + + + + Gets the cookie HTML representation. + + cookie string + + + + Gets the cookie identifier. + + + + + Gets value. + + + Set to null to remove cookie. + + + + + Arguments for . + + + + + Initializes a new instance of the class. + + The context. + + + + Gets or sets thrown exception + + + + + Gets or sets if error page was provided. + + + + + Gets requested resource. + + + + + Gets response to send + + + + + Implements HTTP Digest authentication. It's more secure than Basic auth since password is + encrypted with a "key" from the server. + + + Keep in mind that the password is encrypted with MD5. Use a combination of SSL and digest auth to be secure. + + + + + Authenticates requests + + + + + Authenticate request + + Authorization header send by web client + Realm to authenticate in, typically a domain name. + HTTP Verb used in the request. + User if authentication was successful; otherwise null. + + + + Create a authentication challenge. + + Realm that the user should authenticate in + A WWW-Authenticate header. + If realm is empty or null. + + + + Gets authenticator scheme + + + digest + + + + + Initializes a new instance of the class. + + Supplies users during authentication process. + + + + Used by test classes to be able to use hardcoded values + + + + + An authentication response have been received from the web browser. + Check if it's correct + + Contents from the Authorization header + Realm that should be authenticated + GET/POST/PUT/DELETE etc. + + Authentication object that is stored for the request. A user class or something like that. + + if authenticationHeader is invalid + If any of the parameters is empty or null. + + + + Encrypts parameters into a Digest string + + Realm that the user want to log into. + User logging in + Users password. + HTTP method. + Uri/domain that generated the login prompt. + Quality of Protection. + "Number used ONCE" + Hexadecimal request counter. + "Client Number used ONCE" + Digest encrypted string + + + + + + Md5 hex encoded "userName:realm:password", without the quotes. + Md5 hex encoded "method:uri", without the quotes + Quality of Protection + "Number used ONCE" + Hexadecimal request counter. + Client number used once + + + + + Create a authentication challenge. + + Realm that the user should authenticate in + A correct auth request. + If realm is empty or null. + + + + Gets the current nonce. + + + + + + Gets the Md5 hash bin hex2. + + To be hashed. + + + + + determines if the nonce is valid or has expired. + + nonce value (check wikipedia for info) + true if the nonce has not expired. + + + + Gets authentication scheme name + + + + + Gets authenticator scheme + + + + digest + + + + + Provides authentication in the web server. + + + To initiate authentication you just need to throw a Una + + + + + Add a authenticator. + + + + + + Authenticate request. + + + + + Requires that a AuthorizationHeader have been sent by the client. If not, + request one by sending a WWW-Authentication header (can be generated by the Challenge method). + + Authorization header was not found in the request. + Requested authentication scheme is not supported. + + + + Create a challenge header (WWW-authenticate) + + Response that the authentication header should be added to + Realm that the user should authenticate in + WWW-Authenticate header. + + + Scheme can currently be basic or digest. Basic is not very safe, but easier to use. + Digest is quite safe. + + + + Requested scheme is not supported. + + + + Creates a console logger. + + + + + Factory implementation used to create logs. + + + + + Create a new logger. + + Type that requested a logger. + Logger for the specified type; + + MUST ALWAYS return a logger. Return if no logging + should be used. + + + + + Initializes a new instance of the class. + + The filter. + + + + Create a new logger. + + Type that requested a logger. + Logger for the specified type; + + MUST ALWAYS return a logger. Return if no logging + should be used. + + + + + redirects from one URL to another. + + + + + Rules are used to perform operations before a request is being handled. + Rules can be used to create routing etc. + + + + + Process the incoming request. + + Request context information. + Processing result. + If any parameter is null. + + + + Initializes a new instance of the class. + + Absolute path (no server name) + Absolute path (no server name) + + server.Add(new RedirectRule("/", "/user/index")); + + + + + Initializes a new instance of the class. + + Absolute path (no server name) + Absolute path (no server name) + true if request should be redirected, false if the request URI should be replaced. + + server.Add(new RedirectRule("/", "/user/index")); + + + + + Process the incoming request. + + Request context. + Processing result. + If any parameter is null. + + + + Gets string to match request URI with. + + Is compared to request.Uri.AbsolutePath + + + + Gets whether the server should redirect the client instead of simply modifying the URI. + + + false means that the rule will replace + the current request URI with the new one from this class. + true means that a redirect response is sent to the client. + + + + + Gets where to redirect. + + + + + The Connection general-header field allows the sender to specify options + that are desired for that particular connection and MUST NOT be + communicated by proxies over further connections. + + + + HTTP/1.1 proxies MUST parse the Connection header field before a + message is forwarded and, for each connection-token in this field, + remove any header field(s) from the message with the same name as the + connection-token. Connection options are signaled by the presence of + a connection-token in the Connection header field, not by any + corresponding additional header field(s), since the additional header + field may not be sent if there are no parameters associated with that + connection option. + + Message headers listed in the Connection header MUST NOT include + end-to-end headers, such as Cache-Control. + + HTTP/1.1 defines the "close" connection option for the sender to + signal that the connection will be closed after completion of the + response. For example, + + Connection: close + + in either the request or the response header fields indicates that + the connection SHOULD NOT be considered `persistent' (section 8.1) + after the current request/response is complete. + + HTTP/1.1 applications that do not support persistent connections MUST + include the "close" connection option in every message. + + A system receiving an HTTP/1.0 (or lower-version) message that + includes a Connection header MUST, for each connection-token in this + field, remove and ignore any header field(s) from the message with + the same name as the connection-token. This protects against mistaken + forwarding of such header fields by pre-HTTP/1.1 proxies. See section + 19.6.2 in RFC2616. + + + + + + Header name + + + + + Default connection header for HTTP/1.0 + + + + + Default connection header for HTTP/1.1 + + + + + Initializes a new instance of the class. + + Connection type. + The parameters. + + + + Initializes a new instance of the class. + + The type. + + + + Returns data formatted as a HTTP header value. + + + A that represents the current . + + + + + Gets connection parameters. + + + + + Gets or sets connection type + + + + + Gets header name + + + + + Type of HTTP connection + + + + + Connection is closed after each request-response + + + + + Connection is kept alive for X seconds (unless another request have been made) + + + + + Requests message-body be sent with an encoding to be specified in the "Transfer-Encoding" header. + + + + + Helper for content types. + + + + + Flyweight design pattern implementation. + + Type of object. + + + + Initializes a new instance of the class. + + How large buffers to allocate. + + + + Get an object. + + Created object. + Will create one if queue is empty. + + + + Enqueues the specified buffer. + + Object to enqueue. + Buffer is is less than the minimum requirement. + + + + Used to create new objects. + + Type of objects to create. + Newly created object. + . + + + + A HTTP parser using delegates to which parsing methods. + + + + + Initializes a new instance of the class. + + + + + Parser method to copy all body bytes. + + + Needed since a TCP packet can contain multiple messages + after each other, or partial messages. + + + + Try to find a header name. + + + + + + Get header values. + + + Will also look for multi header values and automatically merge them to one line. + Content length is not a number. + + + + Toggle body bytes event. + + + + + + + + Raise the event, since we have successfully parsed a message and it's body. + + + + + First message line. + + Will always contain three elements. + Used to raise the or event + depending on the words in the array. + BadRequestException. + + + + Continue parsing a message + + Byte buffer containing bytes + Where to start the parsing + Number of bytes to parse + index where the parsing stopped. + Parsing failed. + + + + Parses the first line in a request/response. + + true if first line is well formatted; otherwise false. + Invalid request/response line. + + + + Reset parser to initial state. + + + + + Gets or sets current line number. + + + + + The request line has been parsed. + + + + + Response line has been parsed. + + + + + Parsed a header. + + + + + Received body bytes. + + + + + A message have been successfully parsed. + + + + + Used to be able to quickly swap parser method. + + + + + + Get or create components used in the web server framework + + + + + + + + Get or create a type. + + Type to create + Created type. + + Gets or creates types in the framework. + Check for more information on which + types the factory should contain. + + + + + Used to create all key types in the HTTP server. + + + Should have factory methods at least for the following types: + , , + , , + , , + , , + . + + Check the default implementations to see which constructor + parameters you will get. + + + HttpFactory.Add(typeof(IRequest), (type, args) => new MyRequest((string)args[0])); + + + + + + Initializes a new instance of the class. + + + + + Add a factory method for a type. + + Type to create + Method creating the type. + + + + Used to + + + + + + + Setup our singleton. + + + + + + We want to use a singleton, but we also want to be able + to let the developer to setup his own header factory. + Therefore we use this method to create our own factory only if the user + have not specified one. + + + + + Small method to create a message factory singleton and replace then default delegate method. + + + + + + + + Create a type. + + Type to create + Created type. + + + + Gets http factory for the current listener. + + + + + Delegate used to create a certain type + + Created type. + + Method must never fail. + + + + + Used to define which headers a parse is for. + + + + + Initializes a new instance of the class. + + Name of the header. + + + + Gets name of header that this parser is for. + + + + + Parses "Date" header. + + + + + Parse a header + + Name of header. + Reader containing value. + HTTP Header + Header value is not of the expected format. + + + + Authorization response + + + + A user agent that wishes to authenticate itself with a server-- + usually, but not necessarily, after receiving a 401 response--does + so by including an Authorization request-header field with the + request. The Authorization field value consists of credentials + containing the authentication information of the user agent for + the realm of the resource being requested. + + + Authorization = "Authorization" ":" credentials + + + HTTP access authentication is described in "HTTP Authentication: + Basic and Digest Access Authentication" [43]. If a request is + authenticated and a realm specified, the same credentials SHOULD + be valid for all other requests within this realm (assuming that + the authentication scheme itself does not require otherwise, such + as credentials that vary according to a challenge value or using + synchronized clocks). + When a shared cache (see section 13.7) receives a request + containing an Authorization field, it MUST NOT return the + corresponding response as a reply to any other request, unless one + of the following specific exceptions holds: + + + + If the response includes the "s-maxage" cache-control + directive, the cache MAY use that response in replying to a + subsequent request. But (if the specified maximum age has + passed) a proxy cache MUST first revalidate it with the origin + server, using the request-headers from the new request to allow + the origin server to authenticate the new request. (This is the + defined behavior for s-maxage.) If the response includes "s- + maxage=0", the proxy MUST always revalidate it before re-using + it. + + If the response includes the "must-revalidate" cache-control + directive, the cache MAY use that response in replying to a + subsequent request. But if the response is stale, all caches + MUST first revalidate it with the origin server, using the + request-headers from the new request to allow the origin server + to authenticate the new request. + + If the response includes the "public" cache-control directive, + it MAY be returned in reply to any subsequent request. + + + + + + + Name constant + + + + + Gets or sets authentication data. + + + + + Gets or sets authentication protocol. + + + + + Gets name of header. + + + + + User needs to authenticate. + + + + + + + Initializes a new instance of the class. + + Exception description. + + + + Initializes a new instance of the class. + + Exception description. + Inner exception. + + + + A response have been received. + + + + + Initializes a new instance of the class. + + The response. + + + + Gets or sets response. + + + + + Creates a single message for one of the end points. + + + The factory is + + + + + Initializes a new instance of the class. + + The MSG factory. + The factory. + The parser. + + + + Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + + 2 + + + + Received a header from parser + + + + + + + Will continue the parsing until nothing more can be parsed. + + buffer to parse + where to start in the buffer + number of bytes to process. + Position where parser stopped parsing. + Parsing failed. + + + + Reset parser. + + + Something failed, reset parser so it can start on a new request. + + + + + A request have been successfully parsed. + + + + + A response have been successfully parsed. + + + + + Client asks if he may continue. + + + If the body is too large or anything like that you should respond . + + + + + Used to notify about 100-continue header. + + + + + Initializes a new instance of the class. + + request that want to continue. + + + + Gets request that want to continue + + + + + Default log filter implementation. + + + + + Determines which classes can log + + + + + Checks if the specified type can send + log entries at the specified level. + + Log level + Type that want to write a log entry. + true if logging is allowed; otherwise false. + + + + Add a name space filter. + + Name space to add filter for. + Minimum log level required. + + + // Parsing can only add error and fatal messages + AddNamespace("SipSharp.Messages.Headers.Parsers", LogLevel.Error); + AddType(typeof(SipParser), LogLevel.Error); + + // Transport layer can only log warnings, errors and fatal messages + AddNamespace("SipSharp.Transports.*", LogLevel.Warning); + + + + + + Used to specify standard filter rules + + + Parser can only display errors. Transports only warnings. + + + + + Add filter for a type + + Type to add filter for. + Minimum log level required. + + + // Parsing can only add error and fatal messages + AddNamespace("SipSharp.Messages.Headers.Parsers", LogLevel.Error); + AddType(typeof(SipParser), LogLevel.Error); + + // Transport layer can only log warnings, errors and fatal messages + AddNamespace("SipSharp.Transports.*", LogLevel.Warning); + + + + + + Add filter for a type + + Type to add filter for. + Minimum log level required. + + + // Parsing can only add error and fatal messages + AddNamespace("SipSharp.Messages.Headers.Parsers", LogLevel.Error); + AddType("SipSharp.Messages.MessageFactory", LogLevel.Error); + + // Transport layer can only log warnings, errors and fatal messages + AddNamespace("SipSharp.Transports.*", LogLevel.Warning); + + + Type could not be identified. + + + + Checks if the specified type can send + log entries at the specified level. + + Log level + Type that want to write a log entry. + true if logging is allowed; otherwise false. + + + No filters = everything logged. = no logs. Don't use a rule with '*' or '.*' + + + + User have specified a wild card filter. + + + Wild card filters are used to log a name space and + all it's children name spaces. + + + + + Result of processing. + + + + + Continue with the next handler + + + + + No more handlers can process the request. + + + The server will process the response object and + generate a HTTP response from it. + + + + + Response have been sent back by the handler. + + + This option should only be used if you are streaming + something or sending back a custom result. The server will + not process the response object or send anything back + to the client. + + + + + Used to store all headers that that aren't recognized. + + + + + Initializes a new instance of the class. + + The name. + The value. + + + + Gets or sets value + + + + + Gets header name + + + + + Parses . + + + + + Parse a header + + Name of header. + Reader containing value. + HTTP Header + Header value is not of the expected format. + + + + Collection of parameters + + + + + Get a parameter. + + + + + + + Add a query string parameter. + + Parameter name + Value + + + + Checks if the specified parameter exists + + Parameter name. + true if found; otherwise false; + + + + Gets number of parameters. + + + + + Gets last value of an parameter. + + Parameter name + String if found; otherwise null. + + + + Parameter in + + + + + Gets *last* value. + + + Parameters can have multiple values. This property will always get the last value in the list. + + String if any value exist; otherwise null. + + + + Gets or sets name. + + + + + Gets a list of all values. + + + + + A parameter in . + + + + + Returns an enumerator that iterates through the collection. + + + A that can be used to iterate through the collection. + + 1 + + + + Returns an enumerator that iterates through a collection. + + + An object that can be used to iterate through the collection. + + 2 + + + + Gets last value. + + + Parameters can have multiple values. This property will always get the last value in the list. + + String if any value exist; otherwise null. + + + + Gets or sets name. + + + + + Gets a list of all values. + + + + + Used when the request line have been successfully parsed. + + + + + Initializes a new instance of the class. + + The HTTP method. + The URI path. + The HTTP version. + + + + Initializes a new instance of the class. + + + + + Gets or sets HTTP method. + + + Should be one of the methods declared in . + + + + + Gets or sets requested URI path. + + + + + Gets or sets the version of the SIP protocol that the client want to use. + + + + + Content-type + + + + + Header name. + + + + + Initializes a new instance of the class. + + Type of the content. + Value parameters. + + + + Initializes a new instance of the class. + + Type of the content. + + + + Returns data formatted as a HTTP header value. + + + A that represents the current . + + + + + Gets all parameters. + + + + + Gets content type. + + + + + Gets header name + + + + + Requested resource may not be accessed. + + + Normally thrown after an authentication attempt have failed too many times. + + + + + + Initializes a new instance of the class. + + Exception description. + + + + Initializes a new instance of the class. + + Exception description. + Inner exception. + + + + Stream-based multipart handling. + + In this incarnation deals with an HttpInputStream as we are now using + IntPtr-based streams instead of byte []. In the future, we will also + send uploads above a certain threshold into the disk (to implement + limit-less HttpInputFiles). + + + Taken from HttpRequest in mono (http://www.mono-project.com) + + + + + Client X.509 certificate, X.509 chain, and any SSL policy errors encountered + during the SSL stream creation + + + + + Initializes a new instance of the class. + + The certificate. + Client security certificate chain. + Any SSL policy errors encountered during the SSL stream creation. + + + + Client security certificate + + + + + Client security certificate chain + + + + + Any SSL policy errors encountered during the SSL stream creation + + + + + Credits and description: http://theinstructionlimit.com/?p=76 + + + Converted to .Net 2.0 + + + + + Session in the system + + + + + Gets or sets session id. + + + + + Factory creating null logger. + + + + + Initializes a new instance of the class. + + + + + Create a new logger. + + Type that requested a logger. + Logger for the specified type; + + MUST ALWAYS return a logger. Return if no logging + should be used. + + + + + Logger instance. + + + + + Provides resources. + + + + + Used to access resources. + + + + + Add a new resource loader. + + Provider to add. + Manager have been started. + + + + Check if a resource exists. + + Uri to check + true if found; otherwise false. + + + if (manager.Exists("/views/user/view.haml")) + return true + + + + + + Get a resource. + + Uri path to resource. + Resource if found; otherwise null. + + + Resource resource = manager.Get("/views/user/view.haml"); + + + + + + Start manager. + + + + + Gets number of resource providers + + + + + Get all view names from a folder. + + Path to find views in. + A collection of view names (without path). + + + + Add a new resource loader. + + Provider to add. + Manager have been started. + + + + Start manager. + + + + + Check if a resource exists. + + Uri to check + true if found; otherwise false. + + + if (manager.Exists("/views/user/view.haml")) + return true + + + + + + Get a resource. + + Uri path to resource. + Resource if found; otherwise null. + + + Resource resource = manager.Get("/views/user/view.haml"); + + + + + + Gets number of resource providers + + + + + Loads resources that are embedded in assemblies. + + + No locks used internally since all mappings are loaded during start up. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + Path (Uri) requested by clients + Assembly that the resources exist in + Name space that the resources exist in + + + + Add a specific resource. + + Path (Uri) requested by clients + Assembly that the resources exist in + Name space to root folder under (all name spaces below the specified one are considered as folders) + Name space and name of resource. + + + Add("/", Assembly.GetExecutingAssembly(), "MyApplication.Files", "Myapplication.Files.Images.MyImage.png"); + + + + + + Add resources. + + Path (Uri) requested by clients + Assembly that the resources exist in + Name of resource, including name space. + true if file was found (and has not previously been added); otherwise false. + + + + + + Add resources in a specific path (will not work with sub folders) + + Path (Uri) requested by clients + Assembly that the resources exist in + Name space to root folder under which all name spaces exists in, + true if any files was found; otherwise false. + + + Adds all views in the specified folder. Sub folders are not supported since it's hard to determine + with parts are the path and witch parts are the filename. Use to get support + for sub folders. + + + + + Add("/user/", typeof(MyController).Assembly, "YourProject.Users.Views"); + + + + + + Add resources in a folder and it's sub folder + + + + + + This method is not going to map files but keep the mapping and + try to look up views every time they are requested. This is the method + to use to add a resource folder that has sub folders. + + + + + + Tries to load file by using previously added paths. + + Uri path including file name + + + + + Checks if a resource exists in the specified directory + + Uri path to resource + true if resource was found; otherwise false. + + + if (resources.Exists("/files/user/user.png")) + Debug.WriteLine("Resource exists."); + + + + + + Load a resource. + + Uri of resource. + Resource if found and loaded; otherwise null. + + + + Find all views in a folder/path. + + Uri path + Collection to add all view names to. + + + + Loads all files in a resource directory + + + + + + Gets or sets assembly that the resource exists in. + + + + + Gets or sets resource name. + + + + + Gets or sets full name space path to resource. + + + + + Gets or sets if this file is for a certain content type. + + + + + Gets or sets full "virtual" Uri path, excluding file name. + + + + + Gets or sets assembly + + + + + Gets or sets name space root. + + + + + Gets or sets uri path. + + + + + A list of request cookies. + + + + + Let's copy all the cookies. + + value from cookie header. + + + + Initializes a new instance of the class. + + + + + Adds a cookie in the collection. + + cookie to add + cookie is null + Name must be specified. + + + + Remove all cookies. + + + + + Remove a cookie from the collection. + + Name of cookie. + + + + Gets a collection enumerator on the cookie list. + + collection enumerator + + + + Returns an enumerator that iterates through the collection. + + + + A that can be used to iterate through the collection. + + 1 + + + + Gets the count of cookies in the collection. + + + + + Gets the cookie of a given identifier (null if not existing). + + + + + Collection of headers. + + + + + Collection of headers. + + + + + Gets a header + + header name. + header if found; otherwise null. + + + + Initializes a new instance of the class. + + Factory used to created headers. + + + + Adds a header + + + Will replace any existing header with the same name. + + header to add + header is null. + Header name cannot be null. + + + + Add a header. + + Header name + Header value + + Will try to parse the header and create a object. + + Header value is not correctly formatted. + name or value is null. + + + + Add a header. + + Header name + Header value + + Will try to parse the header and create a object. + + name or value is null. + + + + Get a header + + Type that it should be cast to + Name of header + Header if found and casted properly; otherwise null. + + + + Returns an enumerator that iterates through the collection. + + + A that can be used to iterate through the collection. + + 1 + + + + Returns an enumerator that iterates through a collection. + + + An object that can be used to iterate through the collection. + + 2 + + + + Gets a header + + header name. + header if found; otherwise null. + + + + Header for "Date" and "If-Modified-Since" + + + + The field value is an HTTP-date, as described in section 3.3.1 in RFC2616; + it MUST be sent in RFC 1123 [8]-date format. An example is + + Date: Tue, 15 Nov 1994 08:12:31 GMT + + Origin servers MUST include a Date header field in all + responses, except in these cases: + + If the response status code is 100 (Continue) or 101 (Switching + Protocols), the response MAY include a Date header field, at the server's + option. + If the response status code conveys a server error, e.g. 500 + (Internal Server Error) or 503 (Service Unavailable), and it is inconvenient + or impossible to generate a valid Date. + If the server does not have a clock that can provide a + reasonable approximation of the current time, its responses MUST NOT include + a Date header field. In this case, the rules in section 14.18.1 in RFC2616 + MUST be followed. + + + A received message that does not have a Date header field MUST + be assigned one by the recipient if the message will be cached by that + recipient or gatewayed via a protocol which requires a Date. An HTTP + implementation without a clock MUST NOT cache responses without revalidating + them on every use. An HTTP cache, especially a shared cache, SHOULD use a + mechanism, such as NTP [28], to synchronize its clock with a reliable + external standard. + Clients SHOULD only send a Date header field in messages that + include an entity-body, as in the case of the PUT and POST requests, and + even then it is optional. A client without a clock MUST NOT send a Date + header field in a request. + The HTTP-date sent in a Date header SHOULD NOT represent a date + and time subsequent to the generation of the message. It SHOULD represent + the best available approximation of the date and time of message generation, + unless the implementation has no means of generating a reasonably accurate + date and time. In theory, the date ought to represent the moment just before + the entity is generated. In practice, the date can be generated at any time + during the message origination without affecting its semantic value. + + + + + + Header name + + + + + Initializes a new instance of the class. + + Header name. + Name must not be empty. + + + + Initializes a new instance of the class. + + Header name. + Universal time. + + + + Returns data formatted as a HTTP header value. + + + A that represents the current . + + + + + Gets or sets date time. + + Should be in UTC. + + + + Gets header name + + + + + Type cached for fast property value modifications. + + + + + Get a property value. + + Instance to get value from. + Name of property. + Property value. + + + + Assign a value, try to convert it if it's not the same type as the property type. + + Object containing the property + Name of property + Value to convert and assign + Failed to find property. + Could not convert value type to property type. + + + + Assign value to a property + + Object containing the property + Name of property + Value to assign, must be of the same type as the property. + Failed to find property. + + + + Used to cache property information + + + + + Gets the property. + + The name. + + Failed to find property. + + + InvalidCastException. + + + + Get a property value. + + Instance to get value from. + Name of property. + Property value. + + + + Assign a value, try to convert it if it's not the same type as the property type. + + Object containing the property + Name of property + Value to convert and assign + Failed to find property. + Could not convert value type to property type. + + + + Assign value to a property + + Object containing the property + Name of property + Value to assign, must be of the same type as the property. + Failed to find property. + + + + Gets or sets member info + + + + + Gets or sets member type + + + + + Base interface to read string tokens from different sources. + + + + + Assign a new buffer + + Buffer to process. + Where to start process buffer + Buffer length + + + + Assign a new buffer + + Buffer to process + + + + Consume current character. + + + + + Consume specified characters + + One or more characters. + + + + Consumes horizontal white spaces (space and tab). + + + + + Consume horizontal white spaces and the specified character. + + Extra character to consume + + + + Checks if one of the remaining bytes are a specified character. + + Character to find. + true if found; otherwise false. + + + + Read a character. + + Character if not EOF; otherwise null. + + + + Get a text line. + + + Will merge multiline headers. + + + + Read quoted string + + string if current character (in buffer) is a quote; otherwise null. + + + + Read until end of string, or to one of the delimiters are found. + + characters to stop at + A string (can be ). + + Will not consume the delimiter. + + + + + Read until end of string, or to one of the delimiters are found. + + A string (can be ). + + Will not consume the delimiter. + + + + + Read to end of buffer, or until specified delimiter is found. + + Delimiter to find. + A string (can be ). + + Will not consume the delimiter. + + + + + Will read until specified delimiter is found. + + Character to stop at. + A string if the delimiter was found; otherwise null. + + Will trim away spaces and tabs from the end. + Will not consume the delimiter. + + + + + Read until one of the delimiters are found. + + characters to stop at + A string if one of the delimiters was found; otherwise null. + + Will trim away spaces and tabs from the end. + Will not consume the delimiter. + + + + + Read until a horizontal white space occurs. + + A string if a white space was found; otherwise null. + + + + Gets current character + + if end of buffer. + + + + Gets if end of buffer have been reached + + + + + Gets if more bytes can be processed. + + + + + Gets or sets current position in buffer. + + + THINK before you manually change the position since it can blow up + the whole parsing in your face. + + + + + Gets total length of buffer. + + + + + Gets or sets line number. + + + + + Gets next character + + if end of buffer. + + + + Gets number of bytes left. + + + + + Factory is used to create new logs in the system. + + + + + Assigns log factory being used. + + The log factory. + A factory have already been assigned. + + + + Create a new logger. + + Type that requested a logger. + Logger for the specified type; + + + + Component that should be registered in the container. + + + Register using all interfaces that is specified in this assembly. + + + + + Used to authenticate users + + + Authentication is requested by throwing + + + + + Request implementation. + + + + + Initializes a new instance of the class. + + The method. + The path. + The version. + + + + Get a header + + Type that it should be cast to + Name of header + Header if found and casted properly; otherwise null. + + + + Add a new header. + + + + + + + Add a new header. + + Header to add. + + + + Returns an enumerator that iterates through the collection. + + + A that can be used to iterate through the collection. + + 1 + + + + Returns an enumerator that iterates through a collection. + + + An object that can be used to iterate through the collection. + + 2 + + + + Gets a header. + + + + + + + Gets request URI. + + + + + Gets cookies. + + + + + Gets all uploaded files. + + + + + Gets query string and form parameters + + + + + Gets form parameters. + + + + + Gets query string. + + + + + Gets if request is an Ajax request. + + + + + Gets or sets connection header. + + + + + Gets or sets HTTP version. + + + + + Gets or sets HTTP method. + + + + + Gets requested URI. + + + + + Kind of content in the body + + Default is text/html + + + + Gets or sets encoding + + + + + Gets headers. + + + + + Gets body stream. + + + + + Size of the body. MUST be specified before sending the header, + unless property Chunked is set to true. + + + Any specifically assigned value or Body stream length. + + + + + Event arguments used when a new header have been parsed. + + + + + Initializes a new instance of the class. + + Name of header. + Header value. + Name cannot be empty + value is null. + + + + Initializes a new instance of the class. + + + + + Gets or sets header name. + + + + + Gets or sets header value. + + + + + Collection of parameters. + + + or is not used since each parameter can + have multiple values. + + + + + Initializes a new instance of the class. + + Collections to merge. + + Later collections will overwrite parameters from earlier collections. + + + + + Initializes a new instance of the class. + + + + + Get a list of string arrays. + + + + + + Get parameters + + Sub array (text array) + + + + + Returns an enumerator that iterates through the collection. + + + A that can be used to iterate through the collection. + + 1 + + + + Returns an enumerator that iterates through a collection. + + + An object that can be used to iterate through the collection. + + 2 + + + + Get a parameter. + + + + + + + Add a query string parameter. + + Parameter name + Value + + + + Checks if the specified parameter exists + + Parameter name. + true if found; otherwise false; + + + + Gets number of parameters. + + + + + Gets last value of an parameter. + + Parameter name + String if found; otherwise null. + + + + Parses . + + + + + Parse a header + + Name of header. + Reader containing value. + HTTP Header + Header value is not of the expected format. + + + + Parses numerical values + + + + + Parse a header + + Name of header. + Reader containing value. + HTTP Header + Header value is not of the expected format. + + + + Parses . + + + + + Parse a header + + Name of header. + Reader containing value. + HTTP Header + Header value is not of the expected format. + + + + Request couldn't be parsed successfully. + + + + + Initializes a new instance of the class. + + Exception description. + + + + Initializes a new instance of the class. + + Exception description. + Exception description. + + + + Implements basic authentication scheme. + + + + + Create a response that can be sent in the WWW-Authenticate header. + + Realm that the user should authenticate in + Not used by basic authentication + A WWW-Authenticate header. + Argument is null. + + + + An authentication response have been received from the web browser. + Check if it's correct + + Authorization header + Realm that should be authenticated + GET/POST/PUT/DELETE etc. + Authentication object that is stored for the request. A user class or something like that. + if authenticationHeader is invalid + If any of the paramters is empty or null. + + + + Gets authenticator scheme + + + + digest + + + + + Reads strings from a byte array. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + Encoding to use when converting byte array to strings. + + + + Initializes a new instance of the class. + + Buffer to read from. + Encoding to use when converting byte array to strings. + + + + Assign a new buffer + + Buffer to process. + Where to start process buffer + Buffer length + Buffer needs to be a byte array + + + + Assign a new buffer + + Buffer to process + Buffer needs to be a byte array + + + + Consume current character. + + + + + Get a text line. + + + Will merge multi line headers. + + + + Read quoted string + + string if current character (in buffer) is a quote; otherwise null. + + + + Read until end of string, or to one of the delimiters are found. + + characters to stop at + + A string (can be ). + + + Will not consume the delimiter. + + InvalidOperationException. + + + + Read until end of string, or to one of the delimiters are found. + + A string (can be ). + + Will not consume the delimiter. + + + + + Read to end of buffer, or until specified delimiter is found. + + Delimiter to find. + + A string (can be ). + + + Will not consume the delimiter. + + InvalidOperationException. + + + + Consume specified characters + + One or more characters. + + + + Consumes horizontal white spaces (space and tab). + + + + + Consume horizontal white spaces and the specified character. + + Extra character to consume + + + + Read a character. + + + Character if not EOF; otherwise null. + + + + + Will read until specified delimiter is found. + + Character to stop at. + + A string if the delimiter was found; otherwise null. + + + Will trim away spaces and tabs from the end. + InvalidOperationException. + + + + Read until one of the delimiters are found. + + characters to stop at + + A string if one of the delimiters was found; otherwise null. + + + Will not consume the delimiter. + + InvalidOperationException. + + + + Read until a horizontal white space occurs. + + A string if a white space was found; otherwise null. + + + + Checks if one of the remaining bytes are a specified character. + + Character to find. + + true if found; otherwise false. + + + + + Gets or sets line number. + + + + + Gets if end of buffer have been reached + + + + + + Gets if more bytes can be processed. + + + + + + Gets next character + + if end of buffer. + + + + Gets current character + + if end of buffer. + + + + Gets or sets current position in buffer. + + + THINK before you manually change the position since it can blow up + the whole parsing in your face. + + + + + Gets total length of buffer. + + + + + + Gets number of bytes left. + + + + + Response to a request. + + + + + Redirect user. + + Where to redirect to. + + Any modifications after a redirect will be ignored. + + + + + Gets connection type. + + + + + Gets cookies. + + + + + Gets HTTP version. + + + Default is HTTP/1.1 + + + + + Information about why a specific status code was used. + + + + + Status code that is sent to the client. + + Default is + + + + Gets or sets content type + + + + + Request context + + + Contains information about a HTTP request and where it came from. + + + + + Gets or sets http context. + + + + + Gets or sets http request. + + + + + Gets or sets http response. + + + + + Contains numerical value. + + + + + Initializes a new instance of the class. + + The name. + The value. + + + + Returns data formatted as a HTTP header value. + + + A that represents the current . + + + + + Gets value + + + + + Gets header name + + + + + Form parameters where form string arrays have been converted to real arrays. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The name. + The value. + + + + Initializes a new instance of the class. + + Parse parameters from the this collection. + + + + Get a parameter. + + + + + + + Add a parameter + + Name of parameter, can contain a string array. + Value + + + ArrayParameterCollection array = new ArrayParameterCollection(); + array.Add("user[FirstName]", "Jonas"); + array.Add("user[FirstName]", "Arne"); + string firstName = array["user"]["FirstName"].Value; // "Arne" is returned + foreach (string value in array["user"]["FirstName"]) + Console.WriteLine(value); // each name is displayed. + + + + + + Checks if the specified parameter exists + + Parameter name. + true if found; otherwise false; + + + + Returns an enumerator that iterates through the collection. + + + A that can be used to iterate through the collection. + + 1 + + + + Gets first value of an item. + + + String if found; otherwise null. + + + + Gets number of parameters. + + + + + Gets last value of an parameter. + + Parameter name + String if found; otherwise null. + + + + Assign properties from HTTP parameters. + + + + + Used to filter out properties. + + Filter handler. + Handler have already been set. + + + + Assign properties in the specified object. + + Object to fill. + Contains all parameters that should be assigned to the properties. + Properties was not found or value could not be converted. + Any parameter is null. + + + + Used to be able to filter properties + + Model having it's properties assigned + Property about to be assigned + Value to assign + true if value can be set; otherwise false. + + + + Failed to assign properties. + + + + + Initializes a new instance of the class. + + The property errors. + + + + Gets all errors during assignment. + + + Dictionary key is property name. + + + + + Used to read from a string object. + + + + + Initializes a new instance of the class. + + Buffer to process. + + + + Initializes a new instance of the class. + + + + + Assign a new buffer + + Buffer to process. + Where to start process buffer + Buffer length + MUST be of type . + buffer needs to be of type string + + + + Assign a new buffer + + Buffer to process + MUST be of type . + buffer needs to be of type string + + + + Consume current character. + + + + + Get a text line. + + + Will merge multiline headers. + + + + Read quoted string + + string if current character (in buffer) is a quote; otherwise null. + + + + Read until end of string, or to one of the delimiters are found. + + characters to stop at + A string (can be ). + InvalidOperationException. + + + + Read until end of string, or to one of the delimiters are found. + + A string (can be ). + + Will not consume the delimiter. + + + + + Read to end of buffer, or until specified delimiter is found. + + Delimiter to find. + A string (can be ). + InvalidOperationException. + + + + Consume specified characters + + One or more characters. + + + + Consumes horizontal white spaces (space and tab). + + + + + Read a character. + + + Character if not EOF; otherwise null. + + + + + Will read until specified delimiter is found. + + Character to stop at. + + A string if the delimiter was found; otherwise null. + + + Will trim away spaces and tabs from the end. + Will not consume the delimiter. + + InvalidOperationException. + + + + Read until one of the delimiters are found. + + characters to stop at + + A string if one of the delimiters was found; otherwise null. + + + Will not consume the delimiter. + + InvalidOperationException. + + + + Read until a horizontal white space occurs (or end, or end of line). + + + A string if a white space was found; otherwise null. + + + + + Consume horizontal white spaces and the specified character. + + Extra character to consume + + + + Checks if one of the remaining bytes are a specified character. + + Character to find. + + true if found; otherwise false. + + + + + Gets or sets line number. + + + + + Gets if end of buffer have been reached + + + + + + Gets if more bytes can be processed. + + + + + + Gets next character + + if end of buffer. + + + + Gets current character + + if end of buffer. + + + + Gets or sets current position in buffer. + + + THINK before you manually change the position since it can blow up + the whole parsing in your face. + + + + + Gets total length of buffer. + + + + + + Gets number of bytes left. + + + + + Default log writer, writes everything to void (nowhere). + + + + + + The logging instance. + + + + + Write an entry that helps when debugging code. + + Log message + + + + Write an entry that helps when debugging code. + + Log message + Thrown exception to log. + + + + Write a entry needed when following through code during hard to find bugs. + + Log message + + + + Write a entry that helps when trying to find hard to find bugs. + + Log message + Thrown exception to log. + + + + Informational message, needed when helping customer to find a problem. + + Log message + + + + Informational message, needed when helping customer to find a problem. + + Log message + Thrown exception to log. + + + + Something is not as we expect, but the code can continue to run without any changes. + + Log message + + + + Something is not as we expect, but the code can continue to run without any changes. + + Log message + Thrown exception to log. + + + + Something went wrong, but the application do not need to die. The current thread/request + cannot continue as expected. + + Log message + + + + Something went wrong, but the application do not need to die. The current thread/request + cannot continue as expected. + + Log message + Thrown exception to log. + + + + Something went very wrong, application might not recover. + + Log message + + + + Something went very wrong, application might not recover. + + Log message + Thrown exception to log. + + + + Priority for log entries + + + + + + Very detailed logs to be able to follow the flow of the program. + + + + + Logs to help debug errors in the application + + + + + Information to be able to keep track of state changes etc. + + + + + Something did not go as we expected, but it's no problem. + + + + + Something that should not fail failed, but we can still keep + on going. + + + + + Something failed, and we cannot handle it properly. + + + + + This class writes to the console. + + + It colors the output depending on the log level + and includes a 3-level stack trace (in debug mode) + + + + + + Initializes a new instance of the class. + + Type being logged. + Log filter. + + + + Get color for the specified log level + + Level for the log entry + A for the level + + + + Write an entry + + Importance of the log message + The message. + + + + Write an entry that helps when debugging code. + + Log message + + + + Write an entry that helps when debugging code. + + Log message + Thrown exception to log. + + + + Write a entry needed when following through code during hard to find bugs. + + Log message + + + + Write a entry that helps when trying to find hard to find bugs. + + Log message + Thrown exception to log. + + + + Informational message, needed when helping customer to find a problem. + + Log message + + + + Informational message, needed when helping customer to find a problem. + + Log message + Thrown exception to log. + + + + Something is not as we expect, but the code can continue to run without any changes. + + Log message + + + + Something is not as we expect, but the code can continue to run without any changes. + + Log message + Thrown exception to log. + + + + Something went wrong, but the application do not need to die. The current thread/request + cannot continue as expected. + + Log message + + + + Something went wrong, but the application do not need to die. The current thread/request + cannot continue as expected. + + Log message + Thrown exception to log. + + + + Something went very wrong, application might not recover. + + Log message + + + + Something went very wrong, application might not recover. + + Log message + Thrown exception to log. + + + + Gets or sets type that the logger is for + + + + + A HTTP context + + + + + + + + Context that received a HTTP request. + + + + + Disconnect context. + + + + + Gets if current context is using a secure connection. + + + + + Gets logger. + + + + + Gets remote end point + + + + + Gets stream used to send/receive data to/from remote end point. + + + + The stream can be any type of stream, do not assume that it's a network + stream. For instance, it can be a or a ZipStream. + + + + + + Gets the currently handled request + + The request. + + + + Gets the response that is going to be sent back + + The response. + + + + Initializes a new instance of the class. + + Socket received from HTTP listener. + Context used to parse incoming messages. + + + + Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + + 2 + + + + Disconnect context. + + + + + Close and release socket. + + + + + Create stream used to send and receive bytes from the socket. + + Socket to wrap + Stream + Stream could not be created. + + + + Interpret incoming data. + + + + + + A request was received from the parser. + + + + + + + Parse all complete requests in buffer. + + + offset in buffer where parsing stopped. + Parsing failed. + + + + Start content. + + A socket operation failed. + Reading from stream failed. + + + + Gets currently executing HTTP context. + + + + + Gets or sets description + + + + + gets factory used to build request objects + + + + + Gets socket + + + + + Gets remove end point + + + + + Gets network stream. + + + + + Gets the currently handled request + + The request. + + + + Gets the response that is going to be sent back + + The response. + + + + Gets logger. + + + + + Gets if current context is using a secure connection. + + + + + Triggered for all requests in the server (after the response have been sent) + + + + + Triggered for current request (after the response have been sent) + + + + + A new request have been received. + + + + + A new request have been received (invoked for ALL requests) + + + + + Client have been disconnected. + + + + + Client asks if he may continue. + + + If the body is too large or anything like that you should respond . + + + + + Initializes a new instance of the class. + + SSL protocol to use. + The socket. + The context. + Server certificate to use. + + + + Create stream used to send and receive bytes from the socket. + + Socket to wrap + Stream + Stream could not be created. + + + + Gets or sets client certificate. + + + + + Gets used protocol. + + + + + Gets or sets if client certificate should be used instead of server certificate. + + + + + Resource information. + + + Used by content providers to be able to get information + on resources (views, files etc). + + + + + Gets or sets date when resource was modified. + + + if not used. + + + Should always be universal time. + + + + + Gets or sets resource stream. + + + + + Contains parameters for HTTP headers. + + + + + Add a parameter + + name + value + + Existing parameter with the same name will be replaced. + + + + + Parse parameters. + + Parser containing buffer to parse. + A collection with all parameters (or just a empty collection). + Expected a value after equal sign. + + + + Parse parameters. + + Parser containing buffer to parse. + Parameter delimiter + A collection with all parameters (or just a empty collection). + Expected a value after equal sign. + + + + Returns a that represents the current . + + + A that represents the current . + + + + + Gets or sets a value + + parameter name + value if found; otherwise null. + + + + Create a HTTP response object. + + + + + Initializes a new instance of the class. + + HTTP Version. + HTTP status code. + Why the status code was selected. + Version must start with 'HTTP/' + + + + Initializes a new instance of the class. + + Context that the response will be sent through. + Request that the response is for. + Version must start with 'HTTP/' + + + + Redirect user. + + Where to redirect to. + + Any modifications after a redirect will be ignored. + + + + + Add a new header. + + + + + + + Add a new header. + + Header to add. + + + + Returns an enumerator that iterates through the collection. + + + A that can be used to iterate through the collection. + + 1 + + + + Returns an enumerator that iterates through a collection. + + + An object that can be used to iterate through the collection. + + 2 + + + + Gets a header. + + + + + + + Gets connection type. + + + + + Status code that is sent to the client. + + Default is + + + + Gets HTTP version. + + + Default is HTTP/1.1 + + + + + Information about why a specific status code was used. + + + + + Size of the body. MUST be specified before sending the header, + unless property Chunked is set to true. + + + Any specifically assigned value or Body stream length. + + + + + Kind of content in the body + + Default is text/html + + + + Gets or sets encoding + + + + + Gets cookies. + + + + + Gets body stream. + + + + + Gets headers. + + + + + A request have been received. + + + + + Initializes a new instance of the class. + + The request. + End point that the request was received from. + + + + End point that the message was received from. + + + + + Received request. + + + + + Class to make dynamic binding of redirects. Instead of having to specify a number of similar redirect rules + a regular expression can be used to identify redirect URLs and their targets. + + + [a-z0-9]+)", "/users/${target}/?find=true", RegexOptions.IgnoreCase) + ]]> + + + + + Initializes a new instance of the class. + + Expression to match URL + Expression to generate URL + + [a-zA-Z0-9]+)", "/user/${first}")); + Result of ie. /employee1 will then be /user/employee1 + ]]> + + + + + Initializes a new instance of the class. + + Expression to match URL + Expression to generate URL + Regular expression options to use, can be null + + [a-zA-Z0-9]+)", "/user/{first}", RegexOptions.IgnoreCase)); + Result of ie. /employee1 will then be /user/employee1 + ]]> + + + + + Initializes a new instance of the class. + + Expression to match URL + Expression to generate URL + Regular expression options to apply + true if request should be redirected, false if the request URI should be replaced. + + [a-zA-Z0-9]+)", "/user/${first}", RegexOptions.None)); + Result of ie. /employee1 will then be /user/employee1 + ]]> + + Argument is null. + + + + + Process the incoming request. + + Request context. + Processing result. + If any parameter is null. + + + + cookie being sent back to the browser. + + + + + + Constructor. + + cookie identifier + cookie content + cookie expiration date. Use for session cookie. + id or content is null + id is empty + + + + Create a new cookie + + name identifying the cookie + cookie value + when the cookie expires. Setting will delete the cookie when the session is closed. + Path to where the cookie is valid + Domain that the cookie is valid for. + + + + Create a new cookie + + Name and value will be used + when the cookie expires. + + + + Gets the cookie HTML representation. + + cookie string + + + + Gets when the cookie expires. + + means that the cookie expires when the session do so. + + + + Gets path that the cookie is valid under. + + + + + The Cache-Control general-header field is used to specify directives that + MUST be obeyed by all caching mechanisms along the request/response + chain. . + + + + The directives specify behavior intended to prevent caches from adversely + interfering with the request or response. These directives typically + override the default caching algorithms. Cache directives are + unidirectional in that the presence of a directive in a request does not + imply that the same directive is to be given in the response. + Note that HTTP/1.0 caches might not implement Cache-Control and + might only implement Pragma: no-cache (see section 14.32 in RFC2616). + Cache directives MUST be passed through by a proxy or gateway + application, regardless of their significance to that application, since the + directives might be applicable to all recipients along the request/response + chain. It is not possible to specify a cache- directive for a specific cache + + + When a directive appears without any 1#field-name parameter, the + directive applies to the entire request or response. When such a + directive appears with a 1#field-name parameter, it applies only to + the named field or fields, and not to the rest of the request or + response. This mechanism supports extensibility; implementations of + future versions of the HTTP protocol might apply these directives to + header fields not defined in HTTP/1.1. + + + The cache-control directives can be broken down into these general + categories: + + + Restrictions on what are cacheable; these may only be imposed by + the origin server. + + Restrictions on what may be stored by a cache; these may be + imposed by either the origin server or the user agent. + + Modifications of the basic expiration mechanism; these may be + imposed by either the origin server or the user agent. + + Controls over cache revalidation and reload; these may only be + imposed by a user agent. + + Control over transformation of entities. + + Extensions to the caching system. + + + + + + + + Header name + + + + + Gets header name + + + + + Serves files in the web server. + + + + FileModule fileModule = new FileModule(); + fileModule.Resources.Add(new FileResources("/", "C:\\inetpub\\myweb")); + + + + + + Initializes a new instance of the class. + + baseUri or basePath is null. + + + + Mime types that this class can handle per default + + + Contains the following mime types: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Will send a file to client. + + HTTP context containing outbound stream. + Response containing headers. + File stream + + + + Process a request. + + Request information + What to do next. + Failed to find file extension + Forbidden file type. + + + + Gets a list with all allowed content types. + + All other mime types will result in . + + + + Gets provider used to add files to the file manager, + + + + + Collection of files. + + + + + Checks if a file exists. + + Name of the file (form item name) + + + + + Add a new file. + + File to add. + + + + Remove all files from disk. + + + + + Get a file + + Name in form + File if found; otherwise null. + + + + Gets number of files + + + + diff --git a/TShockAPI/BackupManager.cs b/TShockAPI/BackupManager.cs index 4bce32cc..b871c6c1 100644 --- a/TShockAPI/BackupManager.cs +++ b/TShockAPI/BackupManager.cs @@ -1,96 +1,96 @@ -/* -TShock, a server mod for Terraria -Copyright (C) 2011 The TShock Team - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ -using System; -using System.IO; -using System.Threading; -using Terraria; - -namespace TShockAPI -{ - public class BackupManager - { - public string BackupPath { get; set; } - public int Interval { get; set; } - public int KeepFor { get; set; } - - private DateTime lastbackup = DateTime.UtcNow; - - public BackupManager(string path) - { - BackupPath = path; - } - - public bool IsBackupTime - { - get { return (Interval > 0) && ((DateTime.UtcNow - lastbackup).TotalMinutes >= Interval); } - } - - public void Backup() - { - lastbackup = DateTime.UtcNow; - ThreadPool.QueueUserWorkItem(DoBackup); - ThreadPool.QueueUserWorkItem(DeleteOld); - } - - private void DoBackup(object o) - { - try - { - string worldname = Main.worldPathName; - string name = Path.GetFileName(worldname); - - Main.worldPathName = Path.Combine(BackupPath, string.Format("{0}.{1:dd.MM.yy-HH.mm.ss}.bak", name, DateTime.UtcNow)); - - string worldpath = Path.GetDirectoryName(Main.worldPathName); - if (worldpath != null && !Directory.Exists(worldpath)) - Directory.CreateDirectory(worldpath); - - TShock.Utils.Broadcast("Server map saving, potential lag spike"); - Console.WriteLine("Backing up world..."); - - SaveManager.Instance.SaveWorld(); - Console.WriteLine("World backed up"); - Console.ForegroundColor = ConsoleColor.Gray; - Log.Info(string.Format("World backed up ({0})", Main.worldPathName)); - - Main.worldPathName = worldname; - } - catch (Exception ex) - { - Console.ForegroundColor = ConsoleColor.Red; - Console.WriteLine("Backup failed"); - Console.ForegroundColor = ConsoleColor.Gray; - Log.Error("Backup failed"); - Log.Error(ex.ToString()); - } - } - - private void DeleteOld(object o) - { - if (KeepFor <= 0) - return; - foreach (var fi in new DirectoryInfo(BackupPath).GetFiles("*.bak")) - { - if ((DateTime.UtcNow - fi.LastWriteTimeUtc).TotalMinutes > KeepFor) - { - fi.Delete(); - } - } - } - } +/* +TShock, a server mod for Terraria +Copyright (C) 2011 The TShock Team + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ +using System; +using System.IO; +using System.Threading; +using Terraria; + +namespace TShockAPI +{ + public class BackupManager + { + public string BackupPath { get; set; } + public int Interval { get; set; } + public int KeepFor { get; set; } + + private DateTime lastbackup = DateTime.UtcNow; + + public BackupManager(string path) + { + BackupPath = path; + } + + public bool IsBackupTime + { + get { return (Interval > 0) && ((DateTime.UtcNow - lastbackup).TotalMinutes >= Interval); } + } + + public void Backup() + { + lastbackup = DateTime.UtcNow; + ThreadPool.QueueUserWorkItem(DoBackup); + ThreadPool.QueueUserWorkItem(DeleteOld); + } + + private void DoBackup(object o) + { + try + { + string worldname = Main.worldPathName; + string name = Path.GetFileName(worldname); + + Main.worldPathName = Path.Combine(BackupPath, string.Format("{0}.{1:dd.MM.yy-HH.mm.ss}.bak", name, DateTime.UtcNow)); + + string worldpath = Path.GetDirectoryName(Main.worldPathName); + if (worldpath != null && !Directory.Exists(worldpath)) + Directory.CreateDirectory(worldpath); + + TShock.Utils.Broadcast("Server map saving, potential lag spike"); + Console.WriteLine("Backing up world..."); + + SaveManager.Instance.SaveWorld(); + Console.WriteLine("World backed up"); + Console.ForegroundColor = ConsoleColor.Gray; + Log.Info(string.Format("World backed up ({0})", Main.worldPathName)); + + Main.worldPathName = worldname; + } + catch (Exception ex) + { + Console.ForegroundColor = ConsoleColor.Red; + Console.WriteLine("Backup failed"); + Console.ForegroundColor = ConsoleColor.Gray; + Log.Error("Backup failed"); + Log.Error(ex.ToString()); + } + } + + private void DeleteOld(object o) + { + if (KeepFor <= 0) + return; + foreach (var fi in new DirectoryInfo(BackupPath).GetFiles("*.bak")) + { + if ((DateTime.UtcNow - fi.LastWriteTimeUtc).TotalMinutes > KeepFor) + { + fi.Delete(); + } + } + } + } } \ No newline at end of file diff --git a/TShockAPI/Commands.cs b/TShockAPI/Commands.cs index 29923559..b0c6e68e 100755 --- a/TShockAPI/Commands.cs +++ b/TShockAPI/Commands.cs @@ -1,4 +1,4 @@ -/* +/* TShock, a server mod for Terraria Copyright (C) 2011 The TShock Team @@ -583,10 +583,10 @@ namespace TShockAPI // User deletion requires a username else if (subcmd == "del" && args.Parameters.Count == 2) { - var user = new User(); - if (args.Parameters[1].Split('.').Count() ==4) - - // changed to support dot character in usernames + var user = new User(); + if (args.Parameters[1].Split('.').Count() ==4) + + // changed to support dot character in usernames // if (args.Parameters[1].Contains(".")) user.Address = args.Parameters[1]; else @@ -632,7 +632,7 @@ namespace TShockAPI // Group changing requires a username or IP address, and a new group to set else if (subcmd == "group") { - var user = new User(); + var user = new User(); if (args.Parameters[1].Split('.').Count()==4) //changed to support dot character in usernames @@ -1116,34 +1116,34 @@ namespace TShockAPI else if (args.Parameters[0] == "gold") { num = 5; - } - else if (args.Parameters[0] == "demonite") - { - num = 7; } - else if (args.Parameters[0] == "sapphire") - { - num = 8; - } - else if (args.Parameters[0] == "ruby") - { - num = 9; - } - else if (args.Parameters[0] == "emerald") - { - num = 10; - } - else if (args.Parameters[0] == "topaz") - { - num = 11; - } - else if (args.Parameters[0] == "amethyst") - { - num = 12; - } - else if (args.Parameters[0] == "diamond") - { - num = 13; + else if (args.Parameters[0] == "demonite") + { + num = 7; + } + else if (args.Parameters[0] == "sapphire") + { + num = 8; + } + else if (args.Parameters[0] == "ruby") + { + num = 9; + } + else if (args.Parameters[0] == "emerald") + { + num = 10; + } + else if (args.Parameters[0] == "topaz") + { + num = 11; + } + else if (args.Parameters[0] == "amethyst") + { + num = 12; + } + else if (args.Parameters[0] == "diamond") + { + num = 13; } else { @@ -1179,40 +1179,40 @@ namespace TShockAPI num = 9; num3 *= 1.1f; } - else if (num == 7) - { - num = 22; - num3 *= 1; - } - else if (num == 8) - { - num = 63; - num3 *= .80f; - } - else if (num == 9) - { - num = 64; - num3 *=1; - } - else if (num == 10) - { - num = 65; - num3 *= 1; - } - else if (num == 11) - { - num = 66; - num3 *= 1; - } - else if (num == 12) - { - num = 67; - num3 *= 1; - } - else if (num == 13) - { - num = 68; - num3 *= 1; + else if (num == 7) + { + num = 22; + num3 *= 1; + } + else if (num == 8) + { + num = 63; + num3 *= .80f; + } + else if (num == 9) + { + num = 64; + num3 *=1; + } + else if (num == 10) + { + num = 65; + num3 *= 1; + } + else if (num == 11) + { + num = 66; + num3 *= 1; + } + else if (num == 12) + { + num = 67; + num3 *= 1; + } + else if (num == 13) + { + num = 68; + num3 *= 1; } else { @@ -1598,38 +1598,38 @@ namespace TShockAPI for (int x = 0; x < Main.maxTilesX; x++) { for (int y = 0; y < Main.maxTilesY; y++) - { - switch (Main.tile[x, y].type) - { - case 117: - case 25: - Main.tile[x, y].type = 1; - break; - case 109: - case 23: - Main.tile[x, y].type = 2; - break; - case 32: - case 113: - case 110: - Main.tile[x, y].type = 0; - Main.tile[x, y].active = false; - break; - case 24: - Main.tile[x, y].type = 3; - break; - case 112: - case 116: - Main.tile[x, y].type = 53; - break; - case 118: - Main.tile[x, y].type = 38; - break; - case 115: - Main.tile[x, y].type = 52; - break; - default: - continue; + { + switch (Main.tile[x, y].type) + { + case 117: + case 25: + Main.tile[x, y].type = 1; + break; + case 109: + case 23: + Main.tile[x, y].type = 2; + break; + case 32: + case 113: + case 110: + Main.tile[x, y].type = 0; + Main.tile[x, y].active = false; + break; + case 24: + Main.tile[x, y].type = 3; + break; + case 112: + case 116: + Main.tile[x, y].type = 53; + break; + case 118: + Main.tile[x, y].type = 38; + break; + case 115: + Main.tile[x, y].type = 52; + break; + default: + continue; } } } @@ -2262,7 +2262,7 @@ namespace TShockAPI private static void Reload(CommandArgs args) { - FileTools.SetupConfig(); + FileTools.SetupConfig(); TShock.HandleCommandLinePostConfigLoad(Environment.GetCommandLineArgs()); TShock.Groups.LoadPermisions(); TShock.Regions.ReloadAllRegions(); diff --git a/TShockAPI/ConfigFile.cs b/TShockAPI/ConfigFile.cs index 4bb88a62..d03ff4f7 100644 --- a/TShockAPI/ConfigFile.cs +++ b/TShockAPI/ConfigFile.cs @@ -1,287 +1,287 @@ -/* -TShock, a server mod for Terraria -Copyright (C) 2011 The TShock Team - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ -using System; -using System.ComponentModel; -using System.IO; -using System.Linq; -using System.Text; -using Newtonsoft.Json; - -namespace TShockAPI -{ - public class ConfigFile - { - [Description( - "The equation for calculating invasion size is 100 + (multiplier * (number of active players with greater than 200 health))" - )] public int InvasionMultiplier = 1; - - [Description("The default maximum mobs that will spawn per wave. Higher means more mobs in that wave.")] public int - DefaultMaximumSpawns = 5; - - [Description("The delay between waves. Shorter values lead to less mobs.")] public int DefaultSpawnRate = 600; - [Description("The port the server runs on.")] public int ServerPort = 7777; - [Description("Enable or disable the whitelist based on IP addresses in whitelist.txt")] public bool EnableWhitelist; - - [Description( - "Enable the ability for invaison size to never decrease. Make sure to run /invade, and note that this adds 2 million+ goblins to the spawn que for the map." - )] public bool InfiniteInvasion; - - [Description("Set the server pvp mode. Vaild types are, \"normal\", \"always\", \"disabled\"")] public string PvPMode - = "normal"; - - [Description("Prevents tiles from being placed within SpawnProtectionRadius of the default spawn.")] public bool - SpawnProtection = true; - - [Description("Radius from spawn tile for SpawnProtection.")] public int SpawnProtectionRadius = 10; - - [Description( - "Max slots for the server. If you want people to be kicked with \"Server is full\" set this to how many players you want max and then set Terraria max players to 2 higher." - )] public int MaxSlots = 8; - - [Description("Global protection agent for any block distance based anti-grief check.")] public bool RangeChecks = true; - [Description("Disables any building; placing of blocks")] public bool DisableBuild; - - [Description("#.#.#. = Red/Blue/Green - RGB Colors for the Admin Chat Color. Max value: 255")] public float[] - SuperAdminChatRGB = {255, 0, 0}; - - [Description("Super admin group chat prefix")] public string SuperAdminChatPrefix = "(Admin) "; - [Description("Super admin group chat suffix")] public string SuperAdminChatSuffix = ""; - - [Description( - "Backup frequency in minutes. So, a value of 60 = 60 minutes. Backups are stored in the \\tshock\\backups folder.")] public int BackupInterval; - - [Description("How long backups are kept in minutes. 2880 = 2 days.")] public int BackupKeepFor = 60; - - [Description( - "Remembers where a player left off. It works by remembering the IP, NOT the character. \neg. When you try to disconnect, and reconnect to be automatically placed at spawn, you'll be at your last location. Note: Won't save after server restarts." - )] public bool RememberLeavePos; - - [Description("Hardcore players ONLY. This means softcore players cannot join.")] public bool HardcoreOnly; - [Description("Mediumcore players ONLY. This means softcore players cannot join.")] public bool MediumcoreOnly; - [Description("Kicks a Hardcore player on death.")] public bool KickOnMediumcoreDeath; - [Description("Bans a Hardcore player on death.")] public bool BanOnMediumcoreDeath; - - [Description("Enable/Disable Terrarias built in auto save")] public bool AutoSave = true; - - [Description("Number of failed login attempts before kicking the player.")] public int MaximumLoginAttempts = 3; - - [Description("Not implemented")] public string RconPassword = ""; - [Description("Not implemented")] public int RconPort = 7777; - - [Description("Used when replying to a rest /status request.")] public string ServerName = ""; - [Description("Not implemented")] public string MasterServer = "127.0.0.1"; - - [Description("Valid types are \"sqlite\" and \"mysql\"")] public string StorageType = "sqlite"; - - [Description("The MySQL Hostname and port to direct connections to")] public string MySqlHost = "localhost:3306"; - [Description("Database name to connect to")] public string MySqlDbName = ""; - [Description("Database username to connect with")] public string MySqlUsername = ""; - [Description("Database password to connect with")] public string MySqlPassword = ""; - - [Description("Bans a Mediumcore player on death.")] public string MediumcoreBanReason = "Death results in a ban"; - [Description("Kicks a Mediumcore player on death.")] public string MediumcoreKickReason = "Death results in a kick"; - - [Description("Enables DNS resolution of incoming connections with GetGroupForIPExpensive.")] public bool - EnableDNSHostResolution; - - [Description("Enables kicking of banned users by matching their IP Address")] public bool EnableIPBans = true; - - [Description("Enables kicking of banned users by matching their Character Name")] public bool EnableBanOnUsernames; - - [Description("Selects the default group name to place new registrants under")] public string - DefaultRegistrationGroupName = "default"; - - [Description("Selects the default group name to place non registered users under")] public string - DefaultGuestGroupName = "guest"; - - [Description("Force-Disable printing logs to players with the log permission")] public bool DisableSpewLogs = true; - - [Description("Valid types are \"sha512\", \"sha256\", \"md5\", append with \"-xp\" for the xp supported algorithms")] public string HashAlgorithm = "sha512"; - - [Description("Buffers up the packets and sends them out at the end of each frame")] public bool BufferPackets = true; - - [Description("String that is used when kicking people when the server is full.")] public string ServerFullReason = - "Server is full"; - - [Description("String that is used when kicking people when the server is full with no reserved slots.")] public string - ServerFullNoReservedReason = "Server is full. No reserved slots open."; - - [Description("This will save the world if Terraria crashes from an unhandled exception.")] public bool - SaveWorldOnCrash = true; - - [Description("This will announce a player's location on join")] public bool EnableGeoIP; - - [Description("This will turn on a token requirement for the /status API endpoint.")] public bool - EnableTokenEndpointAuthentication; - - [Description("This is used when the API endpoint /status is queried.")] public string ServerNickname = "TShock Server"; - - [Description("Enable/Disable the rest api.")] public bool RestApiEnabled; - - [Description("This is the port which the rest api will listen on.")] public int RestApiPort = 7878; - - [Description("Disable tombstones for all players.")] public bool DisableTombstones = true; - - [Description("Displays a player's IP on join to everyone who has the log permission")] public bool DisplayIPToAdmins; - - [Description( - "Some tiles are 'fixed' by not letting TShock handle them. Disabling this may break certain asthetic tiles.")] public - bool EnableInsecureTileFixes = true; - - [Description("Kicks users using a proxy as identified with the GeoIP database")] public bool KickProxyUsers = true; - - [Description("Disables hardmode, can't never be activated. Overrides /starthardmode")] public bool DisableHardmode; - - [Description("Disables Dungeon Guardian from being spawned by player packets, this will instead force a respawn")] public bool DisableDungeonGuardian; - - [Description("Enable Server Side Inventory checks, EXPERIMENTAL")] public bool ServerSideInventory; - - [Description("How often SSI should save, in minutes")] public int ServerSideInventorySave = 15; - - [Description("Time, in milliseconds, to disallow discarding items after logging in when ServerSideInventory is ON")] public int LogonDiscardThreshold=250; - - [Description("Disables reporting of playercount to the stat system.")] public bool DisablePlayerCountReporting; - - [Description("Disables clown bomb projectiles from spawning")] public bool DisableClownBombs; - - [Description("Disables snow ball projectiles from spawning")] public bool DisableSnowBalls; - - [Description( - "Change ingame chat format, {0} = Group Name, {1} = Group Prefix, {2} = Player Name, {3} = Group Suffix, {4} = Chat Message" - )] public string ChatFormat = "{1}{2}{3}: {4}"; - - [Description("Force the world time to be normal, day, or night")] public string ForceTime = "normal"; - - [Description("Disable/Revert a player if they exceed this number of tile kills within 1 second.")] public int - TileKillThreshold = 60; - - [Description("Disable/Revert a player if they exceed this number of tile places within 1 second.")] public int - TilePlaceThreshold = 20; - - [Description("Disable a player if they exceed this number of liquid sets within 1 second.")] public int - TileLiquidThreshold = 15; - - [Description("Disable a player if they exceed this number of projectile new within 1 second.")] public int - ProjectileThreshold = 50; - - [Description("Ignore shrapnel from crystal bullets for Projectile Threshold.")] public bool - ProjIgnoreShrapnel = true; - - [Description("Require all players to register or login before being allowed to play.")] public bool RequireLogin; - - [Description( - "Disables Invisibility potions from being used in PvP (Note, they can use them on the client, but the effect isn't sent to the rest of the server)" - )] public bool DisableInvisPvP; - - [Description("The maximum distance players disabled for various reasons can move from")] public int - MaxRangeForDisabled = 10; - - [Description("Server password required to join server")] public string ServerPassword = ""; - - [Description("Protect chests with region and build permissions")] public bool RegionProtectChests; - - [Description("Disable users from being able to login with account password when joining")] public bool - DisableLoginBeforeJoin; - - [Description("Allows users to register any username with /register")] public bool AllowRegisterAnyUsername; - - [Description("Allows users to login with any username with /login")] public bool AllowLoginAnyUsername = true; - - [Description("The maximum damage a player/npc can inflict")] public int MaxDamage = 175; - - [Description("The maximum damage a projectile can inflict")] public int MaxProjDamage = 175; - - [Description("Ignores checking to see if player 'can' update a projectile")] public bool IgnoreProjUpdate = false; - - [Description("Ignores checking to see if player 'can' kill a projectile")] public bool IgnoreProjKill = false; - - [Description("Ignores all no clip checks for players")] public bool IgnoreNoClip = false; - - [Description("Allow Ice placement even when user does not have canbuild")] public bool AllowIce = false; - - public static ConfigFile Read(string path) - { - if (!File.Exists(path)) - return new ConfigFile(); - using (var fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read)) - { - return Read(fs); - } - } - - public static ConfigFile Read(Stream stream) - { - using (var sr = new StreamReader(stream)) - { - var cf = JsonConvert.DeserializeObject(sr.ReadToEnd()); - if (ConfigRead != null) - ConfigRead(cf); - return cf; - } - } - - public void Write(string path) - { - using (var fs = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.Write)) - { - Write(fs); - } - } - - public void Write(Stream stream) - { - var str = JsonConvert.SerializeObject(this, Formatting.Indented); - using (var sw = new StreamWriter(stream)) - { - sw.Write(str); - } - } - - public static Action ConfigRead; - - - public static void DumpDescriptions() - { - var sb = new StringBuilder(); - var defaults = new ConfigFile(); - - foreach (var field in defaults.GetType().GetFields().OrderBy(f => f.Name)) - { - if (field.IsStatic) - continue; - - var name = field.Name; - var type = field.FieldType.Name; - - var descattr = - field.GetCustomAttributes(false).FirstOrDefault(o => o is DescriptionAttribute) as DescriptionAttribute; - var desc = descattr != null && !string.IsNullOrWhiteSpace(descattr.Description) ? descattr.Description : "None"; - - var def = field.GetValue(defaults); - - sb.AppendLine("## {0} ".SFormat(name)); - sb.AppendLine("**Type:** {0} ".SFormat(type)); - sb.AppendLine("**Description:** {0} ".SFormat(desc)); - sb.AppendLine("**Default:** \"{0}\" ".SFormat(def)); - sb.AppendLine(); - } - - File.WriteAllText("ConfigDescriptions.txt", sb.ToString()); - } - } +/* +TShock, a server mod for Terraria +Copyright (C) 2011 The TShock Team + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ +using System; +using System.ComponentModel; +using System.IO; +using System.Linq; +using System.Text; +using Newtonsoft.Json; + +namespace TShockAPI +{ + public class ConfigFile + { + [Description( + "The equation for calculating invasion size is 100 + (multiplier * (number of active players with greater than 200 health))" + )] public int InvasionMultiplier = 1; + + [Description("The default maximum mobs that will spawn per wave. Higher means more mobs in that wave.")] public int + DefaultMaximumSpawns = 5; + + [Description("The delay between waves. Shorter values lead to less mobs.")] public int DefaultSpawnRate = 600; + [Description("The port the server runs on.")] public int ServerPort = 7777; + [Description("Enable or disable the whitelist based on IP addresses in whitelist.txt")] public bool EnableWhitelist; + + [Description( + "Enable the ability for invaison size to never decrease. Make sure to run /invade, and note that this adds 2 million+ goblins to the spawn que for the map." + )] public bool InfiniteInvasion; + + [Description("Set the server pvp mode. Vaild types are, \"normal\", \"always\", \"disabled\"")] public string PvPMode + = "normal"; + + [Description("Prevents tiles from being placed within SpawnProtectionRadius of the default spawn.")] public bool + SpawnProtection = true; + + [Description("Radius from spawn tile for SpawnProtection.")] public int SpawnProtectionRadius = 10; + + [Description( + "Max slots for the server. If you want people to be kicked with \"Server is full\" set this to how many players you want max and then set Terraria max players to 2 higher." + )] public int MaxSlots = 8; + + [Description("Global protection agent for any block distance based anti-grief check.")] public bool RangeChecks = true; + [Description("Disables any building; placing of blocks")] public bool DisableBuild; + + [Description("#.#.#. = Red/Blue/Green - RGB Colors for the Admin Chat Color. Max value: 255")] public float[] + SuperAdminChatRGB = {255, 0, 0}; + + [Description("Super admin group chat prefix")] public string SuperAdminChatPrefix = "(Admin) "; + [Description("Super admin group chat suffix")] public string SuperAdminChatSuffix = ""; + + [Description( + "Backup frequency in minutes. So, a value of 60 = 60 minutes. Backups are stored in the \\tshock\\backups folder.")] public int BackupInterval; + + [Description("How long backups are kept in minutes. 2880 = 2 days.")] public int BackupKeepFor = 60; + + [Description( + "Remembers where a player left off. It works by remembering the IP, NOT the character. \neg. When you try to disconnect, and reconnect to be automatically placed at spawn, you'll be at your last location. Note: Won't save after server restarts." + )] public bool RememberLeavePos; + + [Description("Hardcore players ONLY. This means softcore players cannot join.")] public bool HardcoreOnly; + [Description("Mediumcore players ONLY. This means softcore players cannot join.")] public bool MediumcoreOnly; + [Description("Kicks a Hardcore player on death.")] public bool KickOnMediumcoreDeath; + [Description("Bans a Hardcore player on death.")] public bool BanOnMediumcoreDeath; + + [Description("Enable/Disable Terrarias built in auto save")] public bool AutoSave = true; + + [Description("Number of failed login attempts before kicking the player.")] public int MaximumLoginAttempts = 3; + + [Description("Not implemented")] public string RconPassword = ""; + [Description("Not implemented")] public int RconPort = 7777; + + [Description("Used when replying to a rest /status request.")] public string ServerName = ""; + [Description("Not implemented")] public string MasterServer = "127.0.0.1"; + + [Description("Valid types are \"sqlite\" and \"mysql\"")] public string StorageType = "sqlite"; + + [Description("The MySQL Hostname and port to direct connections to")] public string MySqlHost = "localhost:3306"; + [Description("Database name to connect to")] public string MySqlDbName = ""; + [Description("Database username to connect with")] public string MySqlUsername = ""; + [Description("Database password to connect with")] public string MySqlPassword = ""; + + [Description("Bans a Mediumcore player on death.")] public string MediumcoreBanReason = "Death results in a ban"; + [Description("Kicks a Mediumcore player on death.")] public string MediumcoreKickReason = "Death results in a kick"; + + [Description("Enables DNS resolution of incoming connections with GetGroupForIPExpensive.")] public bool + EnableDNSHostResolution; + + [Description("Enables kicking of banned users by matching their IP Address")] public bool EnableIPBans = true; + + [Description("Enables kicking of banned users by matching their Character Name")] public bool EnableBanOnUsernames; + + [Description("Selects the default group name to place new registrants under")] public string + DefaultRegistrationGroupName = "default"; + + [Description("Selects the default group name to place non registered users under")] public string + DefaultGuestGroupName = "guest"; + + [Description("Force-Disable printing logs to players with the log permission")] public bool DisableSpewLogs = true; + + [Description("Valid types are \"sha512\", \"sha256\", \"md5\", append with \"-xp\" for the xp supported algorithms")] public string HashAlgorithm = "sha512"; + + [Description("Buffers up the packets and sends them out at the end of each frame")] public bool BufferPackets = true; + + [Description("String that is used when kicking people when the server is full.")] public string ServerFullReason = + "Server is full"; + + [Description("String that is used when kicking people when the server is full with no reserved slots.")] public string + ServerFullNoReservedReason = "Server is full. No reserved slots open."; + + [Description("This will save the world if Terraria crashes from an unhandled exception.")] public bool + SaveWorldOnCrash = true; + + [Description("This will announce a player's location on join")] public bool EnableGeoIP; + + [Description("This will turn on a token requirement for the /status API endpoint.")] public bool + EnableTokenEndpointAuthentication; + + [Description("This is used when the API endpoint /status is queried.")] public string ServerNickname = "TShock Server"; + + [Description("Enable/Disable the rest api.")] public bool RestApiEnabled; + + [Description("This is the port which the rest api will listen on.")] public int RestApiPort = 7878; + + [Description("Disable tombstones for all players.")] public bool DisableTombstones = true; + + [Description("Displays a player's IP on join to everyone who has the log permission")] public bool DisplayIPToAdmins; + + [Description( + "Some tiles are 'fixed' by not letting TShock handle them. Disabling this may break certain asthetic tiles.")] public + bool EnableInsecureTileFixes = true; + + [Description("Kicks users using a proxy as identified with the GeoIP database")] public bool KickProxyUsers = true; + + [Description("Disables hardmode, can't never be activated. Overrides /starthardmode")] public bool DisableHardmode; + + [Description("Disables Dungeon Guardian from being spawned by player packets, this will instead force a respawn")] public bool DisableDungeonGuardian; + + [Description("Enable Server Side Inventory checks, EXPERIMENTAL")] public bool ServerSideInventory; + + [Description("How often SSI should save, in minutes")] public int ServerSideInventorySave = 15; + + [Description("Time, in milliseconds, to disallow discarding items after logging in when ServerSideInventory is ON")] public int LogonDiscardThreshold=250; + + [Description("Disables reporting of playercount to the stat system.")] public bool DisablePlayerCountReporting; + + [Description("Disables clown bomb projectiles from spawning")] public bool DisableClownBombs; + + [Description("Disables snow ball projectiles from spawning")] public bool DisableSnowBalls; + + [Description( + "Change ingame chat format, {0} = Group Name, {1} = Group Prefix, {2} = Player Name, {3} = Group Suffix, {4} = Chat Message" + )] public string ChatFormat = "{1}{2}{3}: {4}"; + + [Description("Force the world time to be normal, day, or night")] public string ForceTime = "normal"; + + [Description("Disable/Revert a player if they exceed this number of tile kills within 1 second.")] public int + TileKillThreshold = 60; + + [Description("Disable/Revert a player if they exceed this number of tile places within 1 second.")] public int + TilePlaceThreshold = 20; + + [Description("Disable a player if they exceed this number of liquid sets within 1 second.")] public int + TileLiquidThreshold = 15; + + [Description("Disable a player if they exceed this number of projectile new within 1 second.")] public int + ProjectileThreshold = 50; + + [Description("Ignore shrapnel from crystal bullets for Projectile Threshold.")] public bool + ProjIgnoreShrapnel = true; + + [Description("Require all players to register or login before being allowed to play.")] public bool RequireLogin; + + [Description( + "Disables Invisibility potions from being used in PvP (Note, they can use them on the client, but the effect isn't sent to the rest of the server)" + )] public bool DisableInvisPvP; + + [Description("The maximum distance players disabled for various reasons can move from")] public int + MaxRangeForDisabled = 10; + + [Description("Server password required to join server")] public string ServerPassword = ""; + + [Description("Protect chests with region and build permissions")] public bool RegionProtectChests; + + [Description("Disable users from being able to login with account password when joining")] public bool + DisableLoginBeforeJoin; + + [Description("Allows users to register any username with /register")] public bool AllowRegisterAnyUsername; + + [Description("Allows users to login with any username with /login")] public bool AllowLoginAnyUsername = true; + + [Description("The maximum damage a player/npc can inflict")] public int MaxDamage = 175; + + [Description("The maximum damage a projectile can inflict")] public int MaxProjDamage = 175; + + [Description("Ignores checking to see if player 'can' update a projectile")] public bool IgnoreProjUpdate = false; + + [Description("Ignores checking to see if player 'can' kill a projectile")] public bool IgnoreProjKill = false; + + [Description("Ignores all no clip checks for players")] public bool IgnoreNoClip = false; + + [Description("Allow Ice placement even when user does not have canbuild")] public bool AllowIce = false; + + public static ConfigFile Read(string path) + { + if (!File.Exists(path)) + return new ConfigFile(); + using (var fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read)) + { + return Read(fs); + } + } + + public static ConfigFile Read(Stream stream) + { + using (var sr = new StreamReader(stream)) + { + var cf = JsonConvert.DeserializeObject(sr.ReadToEnd()); + if (ConfigRead != null) + ConfigRead(cf); + return cf; + } + } + + public void Write(string path) + { + using (var fs = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.Write)) + { + Write(fs); + } + } + + public void Write(Stream stream) + { + var str = JsonConvert.SerializeObject(this, Formatting.Indented); + using (var sw = new StreamWriter(stream)) + { + sw.Write(str); + } + } + + public static Action ConfigRead; + + + public static void DumpDescriptions() + { + var sb = new StringBuilder(); + var defaults = new ConfigFile(); + + foreach (var field in defaults.GetType().GetFields().OrderBy(f => f.Name)) + { + if (field.IsStatic) + continue; + + var name = field.Name; + var type = field.FieldType.Name; + + var descattr = + field.GetCustomAttributes(false).FirstOrDefault(o => o is DescriptionAttribute) as DescriptionAttribute; + var desc = descattr != null && !string.IsNullOrWhiteSpace(descattr.Description) ? descattr.Description : "None"; + + var def = field.GetValue(defaults); + + sb.AppendLine("## {0} ".SFormat(name)); + sb.AppendLine("**Type:** {0} ".SFormat(type)); + sb.AppendLine("**Description:** {0} ".SFormat(desc)); + sb.AppendLine("**Default:** \"{0}\" ".SFormat(def)); + sb.AppendLine(); + } + + File.WriteAllText("ConfigDescriptions.txt", sb.ToString()); + } + } } \ No newline at end of file diff --git a/TShockAPI/DB/BanManager.cs b/TShockAPI/DB/BanManager.cs index bc446228..8b3423cc 100644 --- a/TShockAPI/DB/BanManager.cs +++ b/TShockAPI/DB/BanManager.cs @@ -1,4 +1,4 @@ -/* +/* TShock, a server mod for Terraria Copyright (C) 2011 The TShock Team diff --git a/TShockAPI/DB/RegionManager.cs b/TShockAPI/DB/RegionManager.cs index 25391bf2..c384cf66 100644 --- a/TShockAPI/DB/RegionManager.cs +++ b/TShockAPI/DB/RegionManager.cs @@ -1,4 +1,4 @@ -/* +/* TShock, a server mod for Terraria Copyright (C) 2011 The TShock Team diff --git a/TShockAPI/FileTools.cs b/TShockAPI/FileTools.cs index 8f3c93d4..ac4dfd31 100644 --- a/TShockAPI/FileTools.cs +++ b/TShockAPI/FileTools.cs @@ -1,119 +1,119 @@ -/* -TShock, a server mod for Terraria -Copyright (C) 2011 The TShock Team - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ -using System; -using System.IO; - -namespace TShockAPI -{ - public class FileTools - { - internal static string RulesPath - { - get { return Path.Combine(TShock.SavePath, "rules.txt"); } - } - - internal static string MotdPath - { - get { return Path.Combine(TShock.SavePath, "motd.txt"); } - } - - internal static string WhitelistPath - { - get { return Path.Combine(TShock.SavePath, "whitelist.txt"); } - } - - internal static string RememberedPosPath - { - get { return Path.Combine(TShock.SavePath, "oldpos.xml"); } - } - - internal static string ConfigPath - { - get { return Path.Combine(TShock.SavePath, "config.json"); } - } - - public static void CreateFile(string file) - { - File.Create(file).Close(); - } - - public static void CreateIfNot(string file, string data = "") - { - if (!File.Exists(file)) - { - File.WriteAllText(file, data); - } - } - - /// - /// Sets up the configuration file for all variables, and creates any missing files. - /// - public static void SetupConfig() - { - if (!Directory.Exists(TShock.SavePath)) - { - Directory.CreateDirectory(TShock.SavePath); - } - - CreateIfNot(RulesPath, "Respect the admins!\nDon't use TNT!"); - CreateIfNot(MotdPath, - "This server is running TShock for Terraria.\n Type /help for a list of commands.\n%255,000,000%Current map: %map%\nCurrent players: %players%"); - CreateIfNot(WhitelistPath); - if (File.Exists(ConfigPath)) - { - TShock.Config = ConfigFile.Read(ConfigPath); - // Add all the missing config properties in the json file - } - TShock.Config.Write(ConfigPath); - - } - - /// - /// Tells if a user is on the whitelist - /// - /// string ip of the user - /// true/false - public static bool OnWhitelist(string ip) - { - if (!TShock.Config.EnableWhitelist) - { - return true; - } - CreateIfNot(WhitelistPath, "127.0.0.1"); - using (var tr = new StreamReader(WhitelistPath)) - { - string whitelist = tr.ReadToEnd(); - ip = TShock.Utils.GetRealIP(ip); - bool contains = whitelist.Contains(ip); - if (!contains) - { - foreach (var line in whitelist.Split(Environment.NewLine.ToCharArray())) - { - if (string.IsNullOrWhiteSpace(line)) - continue; - contains = TShock.Utils.GetIPv4Address(line).Equals(ip); - if (contains) - return true; - } - return false; - } - return true; - } - } - } +/* +TShock, a server mod for Terraria +Copyright (C) 2011 The TShock Team + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ +using System; +using System.IO; + +namespace TShockAPI +{ + public class FileTools + { + internal static string RulesPath + { + get { return Path.Combine(TShock.SavePath, "rules.txt"); } + } + + internal static string MotdPath + { + get { return Path.Combine(TShock.SavePath, "motd.txt"); } + } + + internal static string WhitelistPath + { + get { return Path.Combine(TShock.SavePath, "whitelist.txt"); } + } + + internal static string RememberedPosPath + { + get { return Path.Combine(TShock.SavePath, "oldpos.xml"); } + } + + internal static string ConfigPath + { + get { return Path.Combine(TShock.SavePath, "config.json"); } + } + + public static void CreateFile(string file) + { + File.Create(file).Close(); + } + + public static void CreateIfNot(string file, string data = "") + { + if (!File.Exists(file)) + { + File.WriteAllText(file, data); + } + } + + /// + /// Sets up the configuration file for all variables, and creates any missing files. + /// + public static void SetupConfig() + { + if (!Directory.Exists(TShock.SavePath)) + { + Directory.CreateDirectory(TShock.SavePath); + } + + CreateIfNot(RulesPath, "Respect the admins!\nDon't use TNT!"); + CreateIfNot(MotdPath, + "This server is running TShock for Terraria.\n Type /help for a list of commands.\n%255,000,000%Current map: %map%\nCurrent players: %players%"); + CreateIfNot(WhitelistPath); + if (File.Exists(ConfigPath)) + { + TShock.Config = ConfigFile.Read(ConfigPath); + // Add all the missing config properties in the json file + } + TShock.Config.Write(ConfigPath); + + } + + /// + /// Tells if a user is on the whitelist + /// + /// string ip of the user + /// true/false + public static bool OnWhitelist(string ip) + { + if (!TShock.Config.EnableWhitelist) + { + return true; + } + CreateIfNot(WhitelistPath, "127.0.0.1"); + using (var tr = new StreamReader(WhitelistPath)) + { + string whitelist = tr.ReadToEnd(); + ip = TShock.Utils.GetRealIP(ip); + bool contains = whitelist.Contains(ip); + if (!contains) + { + foreach (var line in whitelist.Split(Environment.NewLine.ToCharArray())) + { + if (string.IsNullOrWhiteSpace(line)) + continue; + contains = TShock.Utils.GetIPv4Address(line).Equals(ip); + if (contains) + return true; + } + return false; + } + return true; + } + } + } } \ No newline at end of file diff --git a/TShockAPI/GetDataHandlers.cs b/TShockAPI/GetDataHandlers.cs index 051f5ccd..db514d10 100644 --- a/TShockAPI/GetDataHandlers.cs +++ b/TShockAPI/GetDataHandlers.cs @@ -1,2704 +1,2704 @@ -/* -TShock, a server mod for Terraria -Copyright (C) 2011 The TShock Team - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.IO; -using System.IO.Streams; -using System.Linq; -using System.Text; -using Terraria; -using TShockAPI.Net; - -namespace TShockAPI -{ - public delegate bool GetDataHandlerDelegate(GetDataHandlerArgs args); - - public class GetDataHandlerArgs : EventArgs - { - public TSPlayer Player { get; private set; } - public MemoryStream Data { get; private set; } - - public Player TPlayer - { - get { return Player.TPlayer; } - } - - public GetDataHandlerArgs(TSPlayer player, MemoryStream data) - { - Player = player; - Data = data; - } - } - - public static class GetDataHandlers - { - private static Dictionary GetDataHandlerDelegates; - public static int[] WhitelistBuffMaxTime; - #region Events - - /// - /// Used when a TileEdit event is called. - /// - public class TileEditEventArgs : HandledEventArgs - { - /// - /// The TSPlayer who made the tile edit - /// - public TSPlayer Player { get; set; } - - /// - /// The tile coordinate on the X plane - /// - public int X { get; set; } - - /// - /// The tile coordinate on the Y plane - /// - public int Y { get; set; } - - /// - /// The Tile ID being edited. - /// - public byte Type { get; set; } - /// - /// The EditType. - /// (KillTile = 0, PlaceTile = 1, KillWall = 2, PlaceWall = 3, KillTileNoItem = 4, PlaceWire = 5, KillWire = 6) - /// - public byte EditType { get; set; } - } - - /// - /// TileEdit - called when a tile is placed or destroyed - /// - public static HandlerList TileEdit; - private static bool OnTileEdit(TSPlayer ply, int x, int y, byte type, byte editType) - { - if (TileEdit == null) - return false; - - var args = new TileEditEventArgs - { - Player = ply, - X = x, - Y = y, - Type = type, - EditType = editType - }; - TileEdit.Invoke(null, args); - return args.Handled; - } - /// - /// For use in a TogglePvp event - /// - public class TogglePvpEventArgs : HandledEventArgs - { - /// - /// The Terraria player ID of the player - /// - public byte PlayerId { get; set; } - /// - /// Enable/disable pvp? - /// - public bool Pvp { get; set; } - } - /// - /// TogglePvp - called when a player toggles pvp - /// - public static HandlerList TogglePvp; - private static bool OnPvpToggled(byte _id, bool _pvp) - { - if (TogglePvp == null) - return false; - - var args = new TogglePvpEventArgs - { - PlayerId = _id, - Pvp = _pvp, - }; - TogglePvp.Invoke(null, args); - return args.Handled; - } - - /// - /// For use in a PlayerSlot event - /// - public class PlayerSlotEventArgs : HandledEventArgs - { - /// - /// The Terraria playerID - /// - public byte PlayerId { get; set; } - /// - /// The slot edited - /// - public byte Slot { get; set; } - /// - /// The stack edited - /// - public byte Stack { get; set; } - /// - /// The item prefix - /// - public byte Prefix { get; set; } - /// - /// Item type - /// - public short Type { get; set; } - } - /// - /// PlayerSlot - called at a PlayerSlot event - /// - public static HandlerList PlayerSlot; - private static bool OnPlayerSlot(byte _plr, byte _slot, byte _stack, byte _prefix, short _type) - { - if (PlayerSlot == null) - return false; - - var args = new PlayerSlotEventArgs - { - PlayerId = _plr, - Slot = _slot, - Stack = _stack, - Prefix = _prefix, - Type = _type - }; - PlayerSlot.Invoke(null, args); - return args.Handled; - } - - /// - /// For use in a PlayerHP event - /// - public class PlayerHPEventArgs : HandledEventArgs - { - /// - /// The Terraria playerID of the player - /// - public byte PlayerId { get; set; } - /// - /// Current HP - /// - public short Current { get; set; } - /// - /// Maximum HP - /// - public short Max { get; set; } - } - /// - /// PlayerHP - called at a PlayerHP event - /// - public static HandlerList PlayerHP; - - private static bool OnPlayerHP(byte _plr, short _cur, short _max) - { - if (PlayerHP == null) - return false; - - var args = new PlayerHPEventArgs - { - PlayerId = _plr, - Current = _cur, - Max = _max, - }; - PlayerHP.Invoke(null, args); - return args.Handled; - } - - /// - /// For use in a PlayerMana event - /// - public class PlayerManaEventArgs : HandledEventArgs - { - public byte PlayerId { get; set; } - public short Current { get; set; } - public short Max { get; set; } - } - /// - /// PlayerMana - called at a PlayerMana event - /// - public static HandlerList PlayerMana; - - private static bool OnPlayerMana(byte _plr, short _cur, short _max) - { - if (PlayerMana == null) - return false; - - var args = new PlayerManaEventArgs - { - PlayerId = _plr, - Current = _cur, - Max = _max, - }; - PlayerMana.Invoke(null, args); - return args.Handled; - } - - public class PlayerInfoEventArgs : HandledEventArgs - { - /// - /// The Terraria playerID of the player - /// - public byte PlayerId { get; set; } - /// - /// Hair color - /// - public byte Hair { get; set; } - /// - /// Gender (male = true) - /// - public bool Male { get; set; } - /// - /// Character difficulty - /// - public byte Difficulty { get; set; } - /// - /// Player/character name - /// - public string Name { get; set; } - } - /// - /// PlayerInfo - called at a PlayerInfo event - /// If this is cancelled, the server will ForceKick the player. If this should be changed in the future, let someone know. - /// - public static HandlerList PlayerInfo; - - private static bool OnPlayerInfo(byte _plrid, byte _hair, bool _male, byte _difficulty, string _name) - { - if (PlayerInfo == null) - return false; - - var args = new PlayerInfoEventArgs - { - PlayerId = _plrid, - Hair = _hair, - Male = _male, - Difficulty = _difficulty, - Name = _name, - }; - PlayerInfo.Invoke(null, args); - return args.Handled; - } - - /// - /// For use in a TileKill event - /// - public class TileKillEventArgs : HandledEventArgs - { - /// - /// The X coordinate that is being killed - /// - public int TileX { get; set; } - /// - /// The Y coordinate that is being killed - /// - public int TileY { get; set; } - } - /// - /// TileKill - When a tile is removed fromt he world - /// - public static HandlerList TileKill; - - private static bool OnTileKill(int tilex, int tiley) - { - if (TileKill == null) - return false; - - var args = new TileKillEventArgs - { - TileX = tilex, - TileY = tiley, - }; - TileKill.Invoke(null, args); - return args.Handled; - } - - /// - /// For use in a KillMe event - /// - public class KillMeEventArgs : HandledEventArgs - { - /// - /// The Terraria playerID of the player - /// - public byte PlayerId { get; set; } - /// - /// The direction the damage is coming from (?) - /// - public byte Direction { get; set; } - /// - /// Amount of damage delt - /// - public short Damage { get; set; } - /// - /// Player's current pvp setting - /// - public bool Pvp { get; set; } - } - /// - /// KillMe - Terraria's crappy way of handling damage from players - /// - public static HandlerList KillMe; - - private static bool OnKillMe(byte plr, byte direction, short damage, bool pvp) - { - if (KillMe == null) - return false; - - var args = new KillMeEventArgs - { - PlayerId = plr, - Direction = direction, - Damage = damage, - Pvp = pvp, - }; - KillMe.Invoke(null, args); - return args.Handled; - } - - /// - /// For use in a PlayerUpdate event - /// - public class PlayerUpdateEventArgs : HandledEventArgs - { - /// - /// The Terraria playerID of the player - /// - public byte PlayerId { get; set; } - /// - /// ??? - /// - public byte Control { get; set; } - /// - /// Current item? - /// - public byte Item { get; set; } - /// - /// Position of the player - /// - public Vector2 Position { get; set; } - /// - /// Velocity of the player - /// - public Vector2 Velocity { get; set; } - } - /// - /// PlayerUpdate - When the player sends it's updated information to the server - /// - public static HandlerList PlayerUpdate; - - private static bool OnPlayerUpdate(byte player, byte control, byte item, Vector2 position, Vector2 velocity) - { - if (PlayerUpdate == null) - return false; - - var args = new PlayerUpdateEventArgs - { - PlayerId = player, - Control = control, - Item = item, - Position = position, - Velocity = velocity, - }; - PlayerUpdate.Invoke(null, args); - return args.Handled; - } - public static bool TSCheckNoclip(Vector2 Position, int Width, int Height) - { - int num = (int)(Position.X / 16f) - 1; - int num2 = (int)((Position.X + (float)Width) / 16f) + 2; - int num3 = (int)(Position.Y / 16f) - 1; - int num4 = (int)((Position.Y + (float)Height) / 16f) + 2; - if (num < 0) - { - num = 0; - } - if (num2 > Main.maxTilesX) - { - num2 = Main.maxTilesX; - } - if (num3 < 0) - { - num3 = 0; - } - if (num4 > Main.maxTilesY) - { - num4 = Main.maxTilesY; - } - for (int i = num; i < num2; i++) - { - for (int j = num3; j < num4; j++) - { - if (Main.tile[i, j] != null && Main.tile[i, j].active && Main.tileSolid[(int)Main.tile[i, j].type] && !Main.tileSolidTop[(int)Main.tile[i, j].type] &&(((int)Main.tile[i,j].type !=53) && ((int)Main.tile[i,j].type !=112) && ((int)Main.tile[i,j].type !=116) && ((int)Main.tile[i,j].type !=123)) && ((Main.tile[i,j].liquid == 0 )&& !Main.tile[i,j].lava)) - { - Vector2 vector; - vector.X = (float)(i * 16); - vector.Y = (float)(j * 16); - if (Position.X + (float)Width > vector.X && Position.X < vector.X + 16f && Position.Y + (float)Height > vector.Y && Position.Y < vector.Y + 16f) - { - return true; - } - } - } - } - return false; - } - - /// - /// For use in a SendTileSquare event - /// - public class SendTileSquareEventArgs : HandledEventArgs - { - /// - /// Size of the area - /// - public short Size { get; set; } - /// - /// A corner of the section - /// - public int TileX { get; set; } - /// - /// A corner of the section - /// - public int TileY { get; set; } - } - /// - /// SendTileSquare - When the player sends a tile square - /// - public static HandlerList SendTileSquare; - - private static bool OnSendTileSquare(short size, int tilex, int tiley) - { - if (SendTileSquare == null) - return false; - - var args = new SendTileSquareEventArgs - { - Size = size, - TileX = tilex, - TileY = tiley, - }; - SendTileSquare.Invoke(null, args); - return args.Handled; - } - /// - /// For use in a NewProjectile event - /// - public class NewProjectileEventArgs : HandledEventArgs - { - /// - /// ??? - /// - public short Identity { get; set; } - /// - /// Location of the projectile - /// - public Vector2 Position { get; set; } - /// - /// Velocity of the projectile - /// - public Vector2 Velocity { get; set; } - /// - /// Knockback - /// - public float Knockback { get; set; } - /// - /// Damage from the projectile - /// - public short Damage { get; set; } - /// - /// Terraria playerID owner of the projectile - /// - public byte Owner { get; set; } - /// - /// Type of projectile - /// - public byte Type { get; set; } - /// - /// ??? - /// - public int Index { get; set; } - } - /// - /// NewProjectile - Called when a client creates a new projectile - /// - public static HandlerList NewProjectile; - - private static bool OnNewProjectile(short ident, Vector2 pos, Vector2 vel, float knockback, short dmg, byte owner, byte type, int index) - { - if (NewProjectile == null) - return false; - - var args = new NewProjectileEventArgs - { - Identity = ident, - Position = pos, - Velocity = vel, - Knockback = knockback, - Damage = dmg, - Owner = owner, - Type = type, - Index = index, - }; - NewProjectile.Invoke(null, args); - return args.Handled; - } - - /// - /// For use in a LiquidSet event - /// - public class LiquidSetEventArgs : HandledEventArgs - { - /// - /// X location of the tile - /// - public int TileX { get; set; } - /// - /// Y location of the tile - /// - public int TileY { get; set; } - /// - /// ??? - /// - public byte Liquid { get; set;} - /// - /// True if lava - /// - public bool Lava { get; set; } - } - /// - /// LiquidSet - When ever a liquid is set - /// - public static HandlerList LiquidSet; - - private static bool OnLiquidSet(int tilex, int tiley, byte liquid, bool lava) - { - if (LiquidSet == null) - return false; - - var args = new LiquidSetEventArgs - { - TileX = tilex, - TileY = tiley, - Liquid = liquid, - Lava = lava, - }; - LiquidSet.Invoke(null, args); - return args.Handled; - } - /// - /// For use in a PlayerSpawn event - /// - public class SpawnEventArgs : HandledEventArgs - { - /// - /// The Terraria playerID of the player - /// - public byte Player { get; set; } - /// - /// X location of the player's spawn - /// - public int SpawnX { get; set; } - /// - /// Y location of the player's spawn - /// - public int SpawnY { get; set; } - } - /// - /// PlayerSpawn - When a player spawns - /// - public static HandlerList PlayerSpawn; - - private static bool OnPlayerSpawn(byte player, int spawnX, int spawnY) - { - if (PlayerSpawn == null) - return false; - - var args = new SpawnEventArgs - { - Player = player, - SpawnX = spawnX, - SpawnY = spawnY, - }; - PlayerSpawn.Invoke(null, args); - return args.Handled; - } - /// - /// For use with a ChestOpen event - /// - public class ChestOpenEventArgs : HandledEventArgs - { - /// - /// X location of said chest - /// - public int X { get; set; } - /// - /// Y location of said chest - /// - public int Y { get; set; } - } - /// - /// ChestOpen - Called when any chest is opened - /// - public static HandlerList ChestOpen; - - private static bool OnChestOpen(int x, int y) - { - if (ChestOpen == null) - return false; - - var args = new ChestOpenEventArgs - { - X = x, - Y = y, - }; - ChestOpen.Invoke(null, args); - return args.Handled; - } - - /// - /// For use in a ChestItemChange event - /// - public class ChestItemEventArgs : HandledEventArgs - { - /// - /// ChestID - /// - public short ID { get; set; } - /// - /// Slot of the item - /// - public byte Slot { get; set; } - /// - /// How many? - /// - public byte Stacks { get; set; } - /// - /// Item prefix - /// - public byte Prefix { get; set; } - /// - /// Item type - /// - public short Type { get; set; } - } - /// - /// ChestItemChange - Called when an item in a chest changes - /// - public static HandlerList ChestItemChange; - - private static bool OnChestItemChange(short id, byte slot, byte stacks, byte prefix, short type) - { - if (ChestItemChange == null) - return false; - - var args = new ChestItemEventArgs - { - ID = id, - Slot = slot, - Stacks = stacks, - Prefix = prefix, - Type = type, - }; - ChestItemChange.Invoke(null, args); - return args.Handled; - } - - /// - /// For use in a Sign event - /// - public class SignEventArgs : HandledEventArgs - { - /// - /// The Terraria playerID of the player - /// - public short ID { get; set; } - /// - /// X location of the sign - /// - public int X { get; set; } - /// - /// Y location of the sign - /// - public int Y { get; set; } - } - /// - /// Sign - Called when a sign is changed - /// - public static HandlerList Sign; - - private static bool OnSignEvent(short id, int x, int y) - { - if (Sign == null) - return false; - - var args = new SignEventArgs - { - ID = id, - X = x, - Y = y, - }; - Sign.Invoke(null, args); - return args.Handled; - } - - /// - /// For use in a NPCHome event - /// - public class NPCHomeChangeEventArgs : HandledEventArgs - { - /// - /// The Terraria playerID of the player - /// - public short ID { get; set; } - /// - /// X location of the NPC home change - /// - public short X { get; set; } - /// - /// Y location of the NPC home change - /// - public short Y { get; set; } - /// - /// ByteBool homeless - /// - public byte Homeless { get; set; } - } - /// - /// NPCHome - Called when an NPC's home is changed - /// - public static HandlerList NPCHome; - - private static bool OnUpdateNPCHome(short id, short x, short y, byte homeless) - { - if (NPCHome == null) - return false; - - var args = new NPCHomeChangeEventArgs - { - ID = id, - X = x, - Y = y, - Homeless = homeless, - }; - NPCHome.Invoke(null, args); - return args.Handled; - } - - /// - /// For use in a PlayerBuff event - /// - public class PlayerBuffEventArgs : HandledEventArgs - { - /// - /// The Terraria playerID of the player - /// - public byte ID { get; set; } - /// - /// Buff Type - /// - public byte Type { get; set; } - /// - /// Time the buff lasts - /// - public short Time { get; set; } - } - /// - /// PlayerBuff - Called when a player is buffed - /// - public static HandlerList PlayerBuff; - - private static bool OnPlayerBuff(byte id, byte type, short time) - { - if (PlayerBuff == null) - return false; - - var args = new PlayerBuffEventArgs - { - ID = id, - Type = type, - Time = time, - }; - PlayerBuff.Invoke(null, args); - return args.Handled; - } - - /// - /// For use in an ItemDrop event - /// - public class ItemDropEventArgs : HandledEventArgs - { - /// - /// The Terraria playerID of the player - /// - public short ID { get; set; } - /// - /// Position of the item - /// - public Vector2 Position { get; set; } - /// - /// Velocity at which the item is deployed - /// - public Vector2 Velocity { get; set; } - /// - /// Stacks - /// - public byte Stacks { get; set; } - /// - /// Prefix of the item - /// - public byte Prefix { get; set; } - /// - /// Item type - /// - public short Type { get; set; } - } - /// - /// ItemDrop - Called when an item is dropped - /// - public static HandlerList ItemDrop; - - private static bool OnItemDrop(short id, Vector2 pos, Vector2 vel, byte stacks, byte prefix, short type) - { - if (ItemDrop == null) - return false; - - var args = new ItemDropEventArgs - { - ID = id, - Position = pos, - Velocity = vel, - Stacks = stacks, - Prefix = prefix, - Type = type, - }; - ItemDrop.Invoke(null, args); - return args.Handled; - } - - /// - /// For use in a PlayerDamage event - /// - public class PlayerDamageEventArgs : HandledEventArgs - { - /// - /// The Terraria playerID of the player - /// - public byte ID { get; set; } - /// - /// The direction the damage is occuring from - /// - public byte Direction { get; set; } - /// - /// Amount of damage - /// - public short Damage { get; set; } - /// - /// If the player has PVP on - /// - public byte PVP { get; set; } - /// - /// Is the damage critical? - /// - public byte Critical { get; set; } - } - /// - /// PlayerDamage - Called when a player is damaged - /// - public static HandlerList PlayerDamage; - - private static bool OnPlayerDamage(byte id, byte dir, short dmg, byte pvp, byte crit) - { - if (PlayerDamage == null) - return false; - - var args = new PlayerDamageEventArgs - { - ID = id, - Direction = dir, - Damage = dmg, - PVP = pvp, - Critical = crit, - }; - PlayerDamage.Invoke(null, args); - return args.Handled; - } - - /// - /// For use with a NPCStrike event - /// - public class NPCStrikeEventArgs : HandledEventArgs - { - /// - /// ??? - /// - public byte ID { get; set; } - /// - /// Direction the damage occurred from - /// - public byte Direction { get; set; } - /// - /// Amount of damage - /// - public short Damage { get; set; } - /// - /// Is PVP enabled...? - /// - public byte PVP { get; set; } - /// - /// Critical? - /// - public byte Critical { get; set; } - } - /// - /// NPCStrike - Called when an NPC is attacked - /// - public static HandlerList NPCStrike; - - private static bool OnNPCStrike(byte id, byte dir, short dmg, byte pvp, byte crit) - { - if (NPCStrike == null) - return false; - - var args = new NPCStrikeEventArgs - { - ID = id, - Direction = dir, - Damage = dmg, - PVP = pvp, - Critical = crit, - }; - NPCStrike.Invoke(null, args); - return args.Handled; - } - - /// - /// For use with a NPCSpecial event - /// - public class NPCSpecialEventArgs : HandledEventArgs - { - /// - /// ??? - /// - public byte ID { get; set; } - /// - /// Type...? - /// - public byte Type { get; set; } - } - /// - /// NPCSpecial - Called at some point - /// - public static HandlerList NPCSpecial; - - private static bool OnNPCSpecial(byte id, byte type) - { - if (NPCSpecial == null) - return false; - - var args = new NPCSpecialEventArgs - { - ID = id, - Type = type, - }; - NPCSpecial.Invoke(null, args); - return args.Handled; - } - - /// - /// For use with a PlayerAnimation event - /// - public class PlayerAnimationEventArgs : HandledEventArgs - { - } - - /// - /// PlayerAnimation - Called when a player animates - /// - public static HandlerList PlayerAnimation; - - private static bool OnPlayerAnimation() - { - if (PlayerAnimation == null) - return false; - - var args = new PlayerAnimationEventArgs {}; - PlayerAnimation.Invoke(null, args); - return args.Handled; - } - - /// - /// For use in a PlayerBuffUpdate event - /// - public class PlayerBuffUpdateEventArgs : HandledEventArgs - { - /// - /// The Terraria playerID of the player - /// - public byte ID { get; set; } - } - /// - /// PlayerBuffUpdate - Called when a player updates buffs - /// - public static HandlerList PlayerBuffUpdate; - - private static bool OnPlayerBuffUpdate(byte id) - { - if (PlayerBuffUpdate == null) - return false; - - var args = new PlayerBuffUpdateEventArgs - { - ID = id, - }; - PlayerBuffUpdate.Invoke(null, args); - return args.Handled; - } - - #endregion - public static void InitGetDataHandler() - { - #region Blacklists - - WhitelistBuffMaxTime = new int[Main.maxBuffs]; - WhitelistBuffMaxTime[20] = 600; - WhitelistBuffMaxTime[0x18] = 1200; - WhitelistBuffMaxTime[0x1f] = 120; - WhitelistBuffMaxTime[0x27] = 420; - - #endregion Blacklists - - GetDataHandlerDelegates = new Dictionary - { - {PacketTypes.PlayerInfo, HandlePlayerInfo}, - {PacketTypes.PlayerUpdate, HandlePlayerUpdate}, - {PacketTypes.Tile, HandleTile}, - {PacketTypes.TileSendSquare, HandleSendTileSquare}, - {PacketTypes.ProjectileNew, HandleProjectileNew}, - {PacketTypes.TogglePvp, HandleTogglePvp}, - {PacketTypes.TileKill, HandleTileKill}, - {PacketTypes.PlayerKillMe, HandlePlayerKillMe}, - {PacketTypes.LiquidSet, HandleLiquidSet}, - {PacketTypes.PlayerSpawn, HandleSpawn}, - {PacketTypes.ChestGetContents, HandleChestOpen}, - {PacketTypes.ChestItem, HandleChestItem}, - {PacketTypes.SignNew, HandleSign}, - {PacketTypes.PlayerSlot, HandlePlayerSlot}, - {PacketTypes.TileGetSection, HandleGetSection}, - {PacketTypes.UpdateNPCHome, UpdateNPCHome}, - {PacketTypes.PlayerAddBuff, HandlePlayerBuff}, - {PacketTypes.ItemDrop, HandleItemDrop}, - {PacketTypes.PlayerHp, HandlePlayerHp}, - {PacketTypes.PlayerMana, HandlePlayerMana}, - {PacketTypes.PlayerDamage, HandlePlayerDamage}, - {PacketTypes.NpcStrike, HandleNpcStrike}, - {PacketTypes.NpcSpecial, HandleSpecial}, - {PacketTypes.PlayerAnimation, HandlePlayerAnimation}, - {PacketTypes.PlayerBuff, HandlePlayerBuffUpdate}, - {PacketTypes.PasswordSend, HandlePassword}, - {PacketTypes.ContinueConnecting2, HandleConnecting}, - {PacketTypes.ProjectileDestroy, HandleProjectileKill}, - {PacketTypes.SpawnBossorInvasion, HandleSpawnBoss} - }; - } - - public static bool HandlerGetData(PacketTypes type, TSPlayer player, MemoryStream data) - { - GetDataHandlerDelegate handler; - if (GetDataHandlerDelegates.TryGetValue(type, out handler)) - { - try - { - return handler(new GetDataHandlerArgs(player, data)); - } - catch (Exception ex) - { - Log.Error(ex.ToString()); - } - } - return false; - } - - private static bool HandlePlayerSlot(GetDataHandlerArgs args) - { - byte plr = args.Data.ReadInt8(); - byte slot = args.Data.ReadInt8(); - byte stack = args.Data.ReadInt8(); - byte prefix = args.Data.ReadInt8(); - short type = args.Data.ReadInt16(); - - if (OnPlayerSlot(plr, slot, stack, prefix, type)) - return true; - - if (plr != args.Player.Index) - { - return true; - } - - if (slot < 0 || slot > NetItem.maxNetInventory) - { - return true; - } - - var item = new Item(); - item.netDefaults(type); - item.Prefix(prefix); - - if (args.Player.IsLoggedIn) - { - args.Player.PlayerData.StoreSlot(slot, type, prefix, stack); - } - - return false; - } - - public static bool HandlePlayerHp(GetDataHandlerArgs args) - { - var plr = args.Data.ReadInt8(); - var cur = args.Data.ReadInt16(); - var max = args.Data.ReadInt16(); - - if (OnPlayerHP(plr, cur, max)) - return true; - - if (args.Player.FirstMaxHP == 0) - args.Player.FirstMaxHP = max; - - if (max > 400 && max > args.Player.FirstMaxHP) - { - TShock.Utils.ForceKick(args.Player, "Hacked Client Detected."); - return false; - } - - if (args.Player.IsLoggedIn) - { - args.Player.PlayerData.maxHealth = max; - } - - return false; - } - - private static bool HandlePlayerMana(GetDataHandlerArgs args) - { - var plr = args.Data.ReadInt8(); - var cur = args.Data.ReadInt16(); - var max = args.Data.ReadInt16(); - - if (OnPlayerMana(plr, cur, max)) - return true; - - if (args.Player.FirstMaxMP == 0) - args.Player.FirstMaxMP = max; - - if (max > 400 && max > args.Player.FirstMaxMP) - { - TShock.Utils.ForceKick(args.Player, "Hacked Client Detected."); - return false; - } - - return false; - } - - private static bool HandlePlayerInfo(GetDataHandlerArgs args) - { - var playerid = args.Data.ReadInt8(); - var hair = args.Data.ReadInt8(); - var male = args.Data.ReadBoolean(); - args.Data.Position += 21; - var difficulty = args.Data.ReadInt8(); - string name = Encoding.UTF8.GetString(args.Data.ReadBytes((int) (args.Data.Length - args.Data.Position - 1))); - - if (OnPlayerInfo(playerid, hair, male, difficulty, name)) - { - TShock.Utils.ForceKick(args.Player, "A plugin cancelled the event."); - return true; - } - - /*if (!TShock.Utils.ValidString(name)) - { - TShock.Utils.ForceKick(args.Player, "Unprintable character in name"); - return true; - }*/ - if (name.Trim().Length == 0) - { - TShock.Utils.ForceKick(args.Player, "Empty Name."); - return true; - } - var ban = TShock.Bans.GetBanByName(name); - if (ban != null) - { - TShock.Utils.ForceKick(args.Player, string.Format("You are banned: {0}", ban.Reason)); - return true; - } - if (args.Player.ReceivedInfo) - { - return true; - } - if (TShock.Config.MediumcoreOnly && difficulty < 1) - { - TShock.Utils.ForceKick(args.Player, "Server is set to mediumcore and above characters only!"); - return true; - } - if (TShock.Config.HardcoreOnly && difficulty < 2) - { - TShock.Utils.ForceKick(args.Player, "Server is set to hardcore characters only!"); - return true; - } - args.Player.Difficulty = difficulty; - args.TPlayer.name = name; - args.Player.ReceivedInfo = true; - - return false; - } - - private static bool HandleConnecting(GetDataHandlerArgs args) - { - var user = TShock.Users.GetUserByName(args.Player.Name); - if (user != null && !TShock.Config.DisableLoginBeforeJoin) - { - args.Player.RequiresPassword = true; - NetMessage.SendData((int) PacketTypes.PasswordRequired, args.Player.Index); - return true; - } - else if (!string.IsNullOrEmpty(TShock.Config.ServerPassword)) - { - args.Player.RequiresPassword = true; - NetMessage.SendData((int) PacketTypes.PasswordRequired, args.Player.Index); - return true; - } - - if (args.Player.State == 1) - args.Player.State = 2; - NetMessage.SendData((int) PacketTypes.WorldInfo, args.Player.Index); - return true; - } - - private static bool HandlePassword(GetDataHandlerArgs args) - { - if (!args.Player.RequiresPassword) - return true; - - string password = Encoding.UTF8.GetString(args.Data.ReadBytes((int) (args.Data.Length - args.Data.Position - 1))); - var user = TShock.Users.GetUserByName(args.Player.Name); - if (user != null) - { - string encrPass = TShock.Utils.HashPassword(password); - if (user.Password.ToUpper() == encrPass.ToUpper()) - { - args.Player.RequiresPassword = false; - args.Player.PlayerData = TShock.InventoryDB.GetPlayerData(args.Player, TShock.Users.GetUserID(args.Player.Name)); - - if (args.Player.State == 1) - args.Player.State = 2; - NetMessage.SendData((int) PacketTypes.WorldInfo, args.Player.Index); - - var group = TShock.Utils.GetGroup(user.Group); - - if (TShock.Config.ServerSideInventory) - { - if (group.HasPermission(Permissions.bypassinventorychecks)) - { - args.Player.IgnoreActionsForClearingTrashCan = false; - } - else if (!TShock.CheckInventory(args.Player)) - { - args.Player.SendMessage("Login Failed, Please fix the above errors then /login again.", Color.Cyan); - args.Player.IgnoreActionsForClearingTrashCan = true; - return true; - } - } - - if (group.HasPermission(Permissions.ignorestackhackdetection)) - args.Player.IgnoreActionsForCheating = "none"; - - if (group.HasPermission(Permissions.usebanneditem)) - args.Player.IgnoreActionsForDisabledArmor = "none"; - - args.Player.Group = group; - args.Player.UserAccountName = args.Player.Name; - args.Player.UserID = TShock.Users.GetUserID(args.Player.UserAccountName); - args.Player.IsLoggedIn = true; - args.Player.IgnoreActionsForInventory = "none"; - - if (!args.Player.IgnoreActionsForClearingTrashCan) - { - args.Player.PlayerData.CopyInventory(args.Player); - TShock.InventoryDB.InsertPlayerData(args.Player); - } - args.Player.SendMessage("Authenticated as " + args.Player.Name + " successfully.", Color.LimeGreen); - Log.ConsoleInfo(args.Player.Name + " authenticated successfully as user: " + args.Player.Name); - return true; - } - TShock.Utils.ForceKick(args.Player, "Invalid user account password.", true); - return true; - } - if (!string.IsNullOrEmpty(TShock.Config.ServerPassword)) - { - if (TShock.Config.ServerPassword == password) - { - args.Player.RequiresPassword = false; - if (args.Player.State == 1) - args.Player.State = 2; - NetMessage.SendData((int) PacketTypes.WorldInfo, args.Player.Index); - return true; - } - TShock.Utils.ForceKick(args.Player, "Incorrect Server Password"); - return true; - } - - TShock.Utils.ForceKick(args.Player, "Bad Password Attempt"); - return true; - } - - private static bool HandleGetSection(GetDataHandlerArgs args) - { - if (args.Player.RequestedSection) - return true; - - args.Player.RequestedSection = true; - if (TShock.HackedHealth(args.Player) && !args.Player.Group.HasPermission(Permissions.ignorestathackdetection)) - { - TShock.Utils.ForceKick(args.Player, "You have Hacked Health/Mana, Please use a different character."); - } - - if (!args.Player.Group.HasPermission(Permissions.ignorestackhackdetection)) - { - TShock.HackedInventory(args.Player); - } - - if (TShock.Utils.ActivePlayers() + 1 > TShock.Config.MaxSlots && - !args.Player.Group.HasPermission(Permissions.reservedslot)) - { - args.Player.SilentKickInProgress = true; - TShock.Utils.ForceKick(args.Player, TShock.Config.ServerFullReason); - return true; - } - - NetMessage.SendData((int) PacketTypes.TimeSet, -1, -1, "", 0, 0, Main.sunModY, Main.moonModY); - - if (TShock.Config.EnableGeoIP && TShock.Geo != null) - { - Log.Info(string.Format("{0} ({1}) from '{2}' group from '{3}' joined. ({4}/{5})", args.Player.Name, args.Player.IP, - args.Player.Group.Name, args.Player.Country, TShock.Utils.ActivePlayers(), - TShock.Config.MaxSlots)); - TShock.Utils.Broadcast(args.Player.Name + " has joined from the " + args.Player.Country, Color.Yellow); - } - else - { - Log.Info(string.Format("{0} ({1}) from '{2}' group joined. ({3}/{4})", args.Player.Name, args.Player.IP, - args.Player.Group.Name, TShock.Utils.ActivePlayers(), TShock.Config.MaxSlots)); - TShock.Utils.Broadcast(args.Player.Name + " has joined", Color.Yellow); - } - - if (TShock.Config.DisplayIPToAdmins) - TShock.Utils.SendLogs(string.Format("{0} has joined. IP: {1}", args.Player.Name, args.Player.IP), Color.Blue); - - return false; - } - - private static bool HandleSendTileSquare(GetDataHandlerArgs args) - { - if (args.Player.Group.HasPermission(Permissions.allowclientsideworldedit)) - return false; - - var size = args.Data.ReadInt16(); - var tileX = args.Data.ReadInt32(); - var tileY = args.Data.ReadInt32(); - - if (OnSendTileSquare(size, tileX, tileY)) - return true; - - if (size > 5) - return true; - - if ((DateTime.UtcNow - args.Player.LastThreat).TotalMilliseconds < 5000) - { - args.Player.SendTileSquare(tileX, tileY, size); - return true; - } - - if (TShock.CheckIgnores(args.Player)) - { - args.Player.SendTileSquare(tileX, tileY); - return true; - } - - var tiles = new NetTile[size,size]; - - for (int x = 0; x < size; x++) - { - for (int y = 0; y < size; y++) - { - tiles[x, y] = new NetTile(args.Data); - } - } - - bool changed = false; - for (int x = 0; x < size; x++) - { - int realx = tileX + x; - if (realx < 0 || realx >= Main.maxTilesX) - continue; - - for (int y = 0; y < size; y++) - { - int realy = tileY + y; - if (realy < 0 || realy >= Main.maxTilesY) - continue; - - var tile = Main.tile[realx, realy]; - var newtile = tiles[x, y]; - if (TShock.CheckTilePermission(args.Player, realx, realy)) - { - continue; - } - // Server now has a range check built in - /*if (TShock.CheckRangePermission(args.Player, realx, realy)) - { - continue; - }*/ - if ((tile.type == 128 && newtile.Type == 128) || (tile.type == 105 && newtile.Type == 105) || (tile.type == 139 && newtile.Type == 139)) - { - if (TShock.Config.EnableInsecureTileFixes) - { - return false; - } - } - - if (tile.type == 0x17 && newtile.Type == 0x2) - { - tile.type = 0x2; - changed = true; - } - else if (tile.type == 0x19 && newtile.Type == 0x1) - { - tile.type = 0x1; - changed = true; - } - else if ((tile.type == 0xF && newtile.Type == 0xF) || - (tile.type == 0x4F && newtile.Type == 0x4F)) - { - tile.frameX = newtile.FrameX; - tile.frameY = newtile.FrameY; - changed = true; - } - // Holy water/Unholy water - else if (tile.type == 1 && newtile.Type == 117) - { - tile.type = 117; - changed = true; - } - else if (tile.type == 1 && newtile.Type == 25) - { - tile.type = 25; - changed = true; - } - else if (tile.type == 117 && newtile.Type == 25) - { - tile.type = 25; - changed = true; - } - else if (tile.type == 25 && newtile.Type == 117) - { - tile.type = 117; - changed = true; - } - else if (tile.type == 2 && newtile.Type == 23) - { - tile.type = 23; - changed = true; - } - else if (tile.type == 2 && newtile.Type == 109) - { - tile.type = 109; - changed = true; - } - else if (tile.type == 23 && newtile.Type == 109) - { - tile.type = 109; - changed = true; - } - else if (tile.type == 109 && newtile.Type == 23) - { - tile.type = 23; - changed = true; - } - else if (tile.type == 23 && newtile.Type == 109) - { - tile.type = 109; - changed = true; - } - else if (tile.type == 53 && newtile.Type == 116) - { - tile.type = 116; - changed = true; - } - else if (tile.type == 53 && newtile.Type == 112) - { - tile.type = 112; - changed = true; - } - else if (tile.type == 112 && newtile.Type == 116) - { - tile.type = 116; - changed = true; - } - else if (tile.type == 116 && newtile.Type == 112) - { - tile.type = 112; - changed = true; - } - else if (tile.type == 112 && newtile.Type == 53) - { - tile.type = 53; - changed = true; - } - else if (tile.type == 109 && newtile.Type == 2) - { - tile.type = 2; - changed = true; - } - else if (tile.type == 116 && newtile.Type == 53) - { - tile.type = 53; - changed = true; - } - else if (tile.type == 117 && newtile.Type == 1) - { - tile.type = 1; - changed = true; - } - } - } - - if (changed) - { - TSPlayer.All.SendTileSquare(tileX, tileY, size); - WorldGen.RangeFrame(tileX, tileY, tileX + size, tileY + size); - } - else - { - args.Player.SendTileSquare(tileX, tileY, size); - } - return true; - } - - private static bool HandleTile(GetDataHandlerArgs args) - { - var type = args.Data.ReadInt8(); - var tileX = args.Data.ReadInt32(); - var tileY = args.Data.ReadInt32(); - var tiletype = args.Data.ReadInt8(); - if (OnTileEdit(args.Player, tileX, tileY, tiletype, type)) - return true; - if (tileX < 0 || tileX >= Main.maxTilesX || tileY < 0 || tileY >= Main.maxTilesY) - return false; - - if (args.Player.AwaitingName) - { - var protectedregions = TShock.Regions.InAreaRegionName(tileX, tileY); - if (protectedregions.Count == 0) - { - args.Player.SendMessage("Region is not protected", Color.Yellow); - } - else - { - string regionlist = string.Join(",", protectedregions.ToArray()); - args.Player.SendMessage("Region Name(s): " + regionlist, Color.Yellow); - } - args.Player.SendTileSquare(tileX, tileY); - args.Player.AwaitingName = false; - return true; - } - - if (args.Player.AwaitingTempPoint > 0) - { - args.Player.TempPoints[args.Player.AwaitingTempPoint - 1].X = tileX; - args.Player.TempPoints[args.Player.AwaitingTempPoint - 1].Y = tileY; - args.Player.SendMessage("Set Temp Point " + args.Player.AwaitingTempPoint, Color.Yellow); - args.Player.SendTileSquare(tileX, tileY); - args.Player.AwaitingTempPoint = 0; - return true; - } - - if (type == 1 || type == 3) - { - if (tiletype >= ((type == 1) ? Main.maxTileSets : Main.maxWallTypes)) - { - return true; - } - if (tiletype == 29 && tiletype == 97 && TShock.Config.ServerSideInventory) - { - args.Player.SendMessage("You cannot place this tile, Server side inventory is enabled.", Color.Red); - args.Player.SendTileSquare(tileX, tileY); - return true; - } - if (tiletype == 48 && !args.Player.Group.HasPermission(Permissions.usebanneditem) && - TShock.Itembans.ItemIsBanned("Spike", args.Player)) - { - args.Player.Disable("Using banned spikes without permissions"); - args.Player.SendTileSquare(tileX, tileY); - return true; - } - if (type == 1 && tiletype == 21 && TShock.Utils.MaxChests()) - { - args.Player.SendMessage("Reached world's max chest limit, unable to place more!", Color.Red); - args.Player.SendTileSquare(tileX, tileY); - return true; - } - if (tiletype == 141 && !args.Player.Group.HasPermission(Permissions.usebanneditem) && - TShock.Itembans.ItemIsBanned("Explosives", args.Player)) - { - args.Player.Disable("Using banned explosives tile without permissions"); - args.Player.SendTileSquare(tileX, tileY); - return true; - } - } - - if (TShock.CheckIgnores(args.Player)) - { - args.Player.SendTileSquare(tileX, tileY); - return true; - } - - if (TShock.CheckTilePermission(args.Player, tileX, tileY, tiletype, type)) - { - args.Player.SendTileSquare(tileX, tileY); - return true; - } - - if ((tiletype == 127 || Main.tileCut[tiletype]) && (type == 0 || type == 4)) - { - return false; - } - - if (TShock.CheckRangePermission(args.Player, tileX, tileY)) - { - args.Player.SendTileSquare(tileX, tileY); - return true; - } - - if (args.Player.TileKillThreshold >= TShock.Config.TileKillThreshold) - { - args.Player.Disable("Reached TileKill threshold"); - args.Player.SendTileSquare(tileX, tileY); - return true; - } - - if (args.Player.TilePlaceThreshold >= TShock.Config.TilePlaceThreshold) - { - args.Player.Disable("Reached TilePlace threshold"); - args.Player.SendTileSquare(tileX, tileY); - return true; - } - - if ((DateTime.UtcNow - args.Player.LastThreat).TotalMilliseconds < 5000) - { - args.Player.SendTileSquare(tileX, tileY); - return true; - } - - if (type == 1 && !args.Player.Group.HasPermission(Permissions.ignoreplacetiledetection)) - { - args.Player.TilePlaceThreshold++; - var coords = new Vector2(tileX, tileY); - if (!args.Player.TilesCreated.ContainsKey(coords)) - args.Player.TilesCreated.Add(coords, Main.tile[tileX, tileY].Data); - } - - if ((type == 0 || type == 4) && Main.tileSolid[Main.tile[tileX, tileY].type] && - !args.Player.Group.HasPermission(Permissions.ignorekilltiledetection)) - { - args.Player.TileKillThreshold++; - var coords = new Vector2(tileX, tileY); - if (!args.Player.TilesDestroyed.ContainsKey(coords)) - args.Player.TilesDestroyed.Add(coords, Main.tile[tileX, tileY].Data); - } - - return false; - } - - private static bool HandleTogglePvp(GetDataHandlerArgs args) - { - byte id = args.Data.ReadInt8(); - bool pvp = args.Data.ReadBoolean(); - if (OnPvpToggled(id, pvp)) - return true; - - if (id != args.Player.Index) - { - return true; - } - - if (TShock.Config.PvPMode == "disabled") - { - return true; - } - - if (args.TPlayer.hostile != pvp) - { - long seconds = (long) (DateTime.UtcNow - args.Player.LastPvpChange).TotalSeconds; - if (seconds > 5) - { - TSPlayer.All.SendMessage(string.Format("{0} has {1} PvP!", args.Player.Name, pvp ? "enabled" : "disabled"), - Main.teamColor[args.Player.Team]); - } - args.Player.LastPvpChange = DateTime.UtcNow; - } - - args.TPlayer.hostile = pvp; - - if (TShock.Config.PvPMode == "always") - { - if (!pvp) - args.Player.Spawn(); - } - - NetMessage.SendData((int) PacketTypes.TogglePvp, -1, -1, "", args.Player.Index); - - return true; - } - - private static bool HandlePlayerUpdate(GetDataHandlerArgs args) - { - var plr = args.Data.ReadInt8(); - var control = args.Data.ReadInt8(); - var item = args.Data.ReadInt8(); - var pos = new Vector2(args.Data.ReadSingle(), args.Data.ReadSingle()); - var vel = new Vector2(args.Data.ReadSingle(), args.Data.ReadSingle()); - if (OnPlayerUpdate(plr, control, item, pos, vel)) - return true; - if (item < 0 || item >= args.TPlayer.inventory.Length) - { - return true; - } - - if (args.Player.LastNetPosition == Vector2.Zero) - { - return true; - } - - if (!pos.Equals(args.Player.LastNetPosition)) - { - float distance = Vector2.Distance(new Vector2(pos.X/16f, pos.Y/16f), - new Vector2(args.Player.LastNetPosition.X/16f, args.Player.LastNetPosition.Y/16f)); - if (TShock.CheckIgnores(args.Player)) - { - if (distance > TShock.Config.MaxRangeForDisabled) - { - if (args.Player.IgnoreActionsForCheating != "none") - { - args.Player.SendMessage("Disabled for cheating: " + args.Player.IgnoreActionsForCheating, - Color.Red); - } - else if (args.Player.IgnoreActionsForDisabledArmor != "none") - { - args.Player.SendMessage( - "Disabled for banned armor: " + args.Player.IgnoreActionsForDisabledArmor, Color.Red); - } - else if (args.Player.IgnoreActionsForInventory != "none") - { - args.Player.SendMessage( - "Disabled for Server Side Inventory: " + args.Player.IgnoreActionsForInventory, - Color.Red); - } - else if (TShock.Config.RequireLogin && !args.Player.IsLoggedIn) - { - args.Player.SendMessage("Please /register or /login to play!", Color.Red); - } - else if (args.Player.IgnoreActionsForClearingTrashCan) - { - args.Player.SendMessage("You need to rejoin to ensure your trash can is cleared!", Color.Red); - } - else if (TShock.Config.PvPMode == "always" && !args.TPlayer.hostile) - { - args.Player.SendMessage("PvP is forced! Enable PvP else you can't move or do anything!", - Color.Red); - } - int lastTileX = (int) (args.Player.LastNetPosition.X/16f); - int lastTileY = (int) (args.Player.LastNetPosition.Y/16f); - if (!args.Player.Teleport(lastTileX, lastTileY)) - { - args.Player.Spawn(); - } - return true; - } - return true; - } - - if (args.Player.Dead) - { - return true; - } - - if (!args.Player.Group.HasPermission(Permissions.ignorenoclipdetection) && - TSCheckNoclip(pos, args.TPlayer.width, args.TPlayer.height) && !TShock.Config.IgnoreNoClip) - { - int lastTileX = (int) (args.Player.LastNetPosition.X/16f); - int lastTileY = (int) (args.Player.LastNetPosition.Y/16f); - if (!args.Player.Teleport(lastTileX, lastTileY + 3)) - { - args.Player.SendMessage("You got stuck in a solid object, Sent to spawn point."); - args.Player.Spawn(); - } - return true; - } - args.Player.LastNetPosition = pos; - } - - if ((control & 32) == 32) - { - if (!args.Player.Group.HasPermission(Permissions.usebanneditem) && - TShock.Itembans.ItemIsBanned(args.TPlayer.inventory[item].name, args.Player)) - { - control -= 32; - args.Player.Disable("Using banned item"); - args.Player.SendMessage( - string.Format("You cannot use {0} on this server. Your actions are being ignored.", - args.TPlayer.inventory[item].name), Color.Red); - } - } - - args.TPlayer.selectedItem = item; - args.TPlayer.position = pos; - args.TPlayer.velocity = vel; - args.TPlayer.oldVelocity = args.TPlayer.velocity; - args.TPlayer.fallStart = (int) (pos.Y/16f); - args.TPlayer.controlUp = false; - args.TPlayer.controlDown = false; - args.TPlayer.controlLeft = false; - args.TPlayer.controlRight = false; - args.TPlayer.controlJump = false; - args.TPlayer.controlUseItem = false; - args.TPlayer.direction = -1; - if ((control & 1) == 1) - { - args.TPlayer.controlUp = true; - } - if ((control & 2) == 2) - { - args.TPlayer.controlDown = true; - } - if ((control & 4) == 4) - { - args.TPlayer.controlLeft = true; - } - if ((control & 8) == 8) - { - args.TPlayer.controlRight = true; - } - if ((control & 16) == 16) - { - args.TPlayer.controlJump = true; - } - if ((control & 32) == 32) - { - args.TPlayer.controlUseItem = true; - } - if ((control & 64) == 64) - { - args.TPlayer.direction = 1; - } - NetMessage.SendData((int) PacketTypes.PlayerUpdate, -1, args.Player.Index, "", args.Player.Index); - - return true; - } - - private static bool HandleProjectileNew(GetDataHandlerArgs args) - { - var ident = args.Data.ReadInt16(); - var pos = new Vector2(args.Data.ReadSingle(), args.Data.ReadSingle()); - var vel = new Vector2(args.Data.ReadSingle(), args.Data.ReadSingle()); - var knockback = args.Data.ReadSingle(); - var dmg = args.Data.ReadInt16(); - var owner = args.Data.ReadInt8(); - var type = args.Data.ReadInt8(); - owner = (byte)args.Player.Index; - var index = TShock.Utils.SearchProjectile(ident, owner); - - if (OnNewProjectile(ident, pos, vel, knockback, dmg, owner, type, index)) - return true; - - if (index > Main.maxProjectiles || index < 0) - { - return false; - } - - // Server now checks owner + ident, if owner is different, server will create new projectile. - /*if (args.Player.Index != owner) - { - args.Player.Disable(String.Format("Owner ({0}) and player ID ({1}) does not match to update projectile", owner, args.Player.Index)); - args.Player.RemoveProjectile(ident, owner); - return true; - }*/ - - if (dmg > TShock.Config.MaxProjDamage && !args.Player.Group.HasPermission(Permissions.ignoredamagecap)) - { - args.Player.Disable(String.Format("Projectile damage is higher than {0}", TShock.Config.MaxProjDamage)); - args.Player.RemoveProjectile(ident, owner); - return true; - } - - if (TShock.CheckIgnores(args.Player)) - { - args.Player.RemoveProjectile(ident, owner); - return true; - } - - if (!TShock.Config.IgnoreProjUpdate && TShock.CheckProjectilePermission(args.Player, index, type)) - { - if (type == 100) - { //fix for skele prime - Log.Debug("Skeletron Prime's death laser ignored for cheat detection.."); - } - else - { - args.Player.Disable("Does not have projectile permission to update projectile."); - args.Player.RemoveProjectile(ident, owner); - } - return true; - } - - if (args.Player.ProjectileThreshold >= TShock.Config.ProjectileThreshold) - { - args.Player.Disable("Reached projectile update threshold"); - args.Player.RemoveProjectile(ident, owner); - return true; - } - - if ((DateTime.UtcNow - args.Player.LastThreat).TotalMilliseconds < 5000) - { - args.Player.RemoveProjectile(ident, owner); - return true; - } - - if (!args.Player.Group.HasPermission(Permissions.ignoreprojectiledetection)) - { - if ((type ==90) && (TShock.Config.ProjIgnoreShrapnel))// ignore shrapnel - { - Log.Debug("Ignoring shrapnel per config.."); - } - else - { - args.Player.ProjectileThreshold++; - } - } - - return false; - } - - private static bool HandleProjectileKill(GetDataHandlerArgs args) - { - var ident = args.Data.ReadInt16(); - var owner = args.Data.ReadInt8(); - owner = (byte)args.Player.Index; - var index = TShock.Utils.SearchProjectile(ident, owner); - - if (index > Main.maxProjectiles || index < 0) - { - return false; - } - - var type = Main.projectile[index].type; - - // Players can no longer destroy projectiles that are not theirs as of 1.1.2 - /*if (args.Player.Index != Main.projectile[index].owner && type != 102 && type != 100 && !TShock.Config.IgnoreProjKill) // workaround for skeletron prime projectiles - { - args.Player.Disable(String.Format("Owner ({0}) and player ID ({1}) does not match to kill projectile of type: {3}", Main.projectile[index].owner, args.Player.Index, type)); - args.Player.RemoveProjectile(ident, owner); - return true; - }*/ - - if (TShock.CheckIgnores(args.Player)) - { - args.Player.RemoveProjectile(ident, owner); - return true; - } - - if (TShock.CheckProjectilePermission(args.Player, index, type) && type != 102 && type != 100 && !TShock.Config.IgnoreProjKill) - { - args.Player.Disable("Does not have projectile permission to kill projectile"); - args.Player.RemoveProjectile(ident, owner); - return true; - } - - if ((DateTime.UtcNow - args.Player.LastThreat).TotalMilliseconds < 5000) - { - args.Player.RemoveProjectile(ident, owner); - return true; - } - - return false; - } - - private static bool HandlePlayerKillMe(GetDataHandlerArgs args) - { - var id = args.Data.ReadInt8(); - var direction = args.Data.ReadInt8(); - var dmg = args.Data.ReadInt16(); - var pvp = args.Data.ReadInt8() == 0; - if (OnKillMe(id, direction, dmg, pvp)) - return true; - int textlength = (int) (args.Data.Length - args.Data.Position - 1); - string deathtext = ""; - if (textlength > 0) - { - deathtext = Encoding.UTF8.GetString(args.Data.ReadBytes(textlength)); - /*if (!TShock.Utils.ValidString(deathtext)) - { - return true; - }*/ - } - - args.Player.LastDeath = DateTime.Now; - args.Player.Dead = true; - - return false; - } - - private static bool HandleLiquidSet(GetDataHandlerArgs args) - { - int tileX = args.Data.ReadInt32(); - int tileY = args.Data.ReadInt32(); - byte liquid = args.Data.ReadInt8(); - bool lava = args.Data.ReadBoolean(); - - if (OnLiquidSet(tileX, tileY, liquid, lava)) - return true; - - //The liquid was picked up. - if (liquid == 0) - return false; - - if (tileX < 0 || tileX >= Main.maxTilesX || tileY < 0 || tileY >= Main.maxTilesY) - return false; - - if (TShock.CheckIgnores(args.Player)) - { - args.Player.SendTileSquare(tileX, tileY); - return true; - } - - if (args.Player.TileLiquidThreshold >= TShock.Config.TileLiquidThreshold) - { - args.Player.Disable("Reached TileLiquid threshold"); - args.Player.SendTileSquare(tileX, tileY); - return true; - } - - if (!args.Player.Group.HasPermission(Permissions.ignoreliquidsetdetection)) - { - args.Player.TileLiquidThreshold++; - } - - int bucket = 0; - if (args.TPlayer.inventory[args.TPlayer.selectedItem].type == 206) - { - bucket = 1; - } - else if (args.TPlayer.inventory[args.TPlayer.selectedItem].type == 207) - { - bucket = 2; - } - - if (lava && bucket != 2 && !args.Player.Group.HasPermission(Permissions.usebanneditem) && - TShock.Itembans.ItemIsBanned("Lava Bucket", args.Player)) - { - args.Player.Disable("Using banned lava bucket without permissions"); - args.Player.SendTileSquare(tileX, tileY); - return true; - } - - if (!lava && bucket != 1 && !args.Player.Group.HasPermission(Permissions.usebanneditem) && - TShock.Itembans.ItemIsBanned("Water Bucket", args.Player)) - { - args.Player.Disable("Using banned water bucket without permissions"); - args.Player.SendTileSquare(tileX, tileY); - return true; - } - - if (TShock.CheckTilePermission(args.Player, tileX, tileY)) - { - args.Player.SendTileSquare(tileX, tileY); - return true; - } - - if (TShock.CheckRangePermission(args.Player, tileX, tileY, 16)) - { - args.Player.SendTileSquare(tileX, tileY); - return true; - } - - if ((DateTime.UtcNow - args.Player.LastThreat).TotalMilliseconds < 5000) - { - args.Player.SendTileSquare(tileX, tileY); - return true; - } - - return false; - } - - private static bool HandleTileKill(GetDataHandlerArgs args) - { - var tileX = args.Data.ReadInt32(); - var tileY = args.Data.ReadInt32(); - if (OnTileKill(tileX, tileY)) - return true; - if (tileX < 0 || tileX >= Main.maxTilesX || tileY < 0 || tileY >= Main.maxTilesY) - return false; - - if (TShock.CheckIgnores(args.Player)) - { - args.Player.SendTileSquare(tileX, tileY); - return true; - } - - if (Main.tile[tileX, tileY].type != 0x15 && (!TShock.Utils.MaxChests() && Main.tile[tileX, tileY].type != 0)) //Chest - { - args.Player.SendTileSquare(tileX, tileY); - return true; - } - - if (TShock.CheckTilePermission(args.Player, tileX, tileY)) - { - args.Player.SendTileSquare(tileX, tileY); - return true; - } - - if (TShock.CheckRangePermission(args.Player, tileX, tileY)) - { - args.Player.SendTileSquare(tileX, tileY); - return true; - } - - return false; - } - - private static bool HandleSpawn(GetDataHandlerArgs args) - { - var player = args.Data.ReadInt8(); - var spawnx = args.Data.ReadInt32(); - var spawny = args.Data.ReadInt32(); - - if (OnPlayerSpawn(player, spawnx, spawny)) - return true; - - if (args.Player.InitSpawn && args.TPlayer.inventory[args.TPlayer.selectedItem].type != 50) - { - if (args.TPlayer.difficulty == 1 && (TShock.Config.KickOnMediumcoreDeath || TShock.Config.BanOnMediumcoreDeath)) - { - if (args.TPlayer.selectedItem != 50) - { - if (TShock.Config.BanOnMediumcoreDeath) - { - if (!TShock.Utils.Ban(args.Player, TShock.Config.MediumcoreBanReason)) - TShock.Utils.ForceKick(args.Player, "Death results in a ban, but can't ban you"); - } - else - { - TShock.Utils.ForceKick(args.Player, TShock.Config.MediumcoreKickReason); - } - return true; - } - } - } - else - args.Player.InitSpawn = true; - - args.Player.Dead = false; - return false; - } - - private static bool HandleChestOpen(GetDataHandlerArgs args) - { - var x = args.Data.ReadInt32(); - var y = args.Data.ReadInt32(); - - if (OnChestOpen(x, y)) - return true; - - if (TShock.CheckIgnores(args.Player)) - { - return true; - } - - if (TShock.CheckRangePermission(args.Player, x, y)) - { - return true; - } - - if (TShock.CheckTilePermission(args.Player, x, y) && TShock.Config.RegionProtectChests) - { - return true; - } - - return false; - } - - private static bool HandleChestItem(GetDataHandlerArgs args) - { - var id = args.Data.ReadInt16(); - var slot = args.Data.ReadInt8(); - var stacks = args.Data.ReadInt8(); - var prefix = args.Data.ReadInt8(); - var type = args.Data.ReadInt16(); - - if (OnChestItemChange(id, slot, stacks, prefix, type)) - return true; - - if (args.TPlayer.chest != id) - { - return false; - } - - if (TShock.CheckIgnores(args.Player)) - { - args.Player.SendData(PacketTypes.ChestItem, "", id, slot); - return true; - } - - Item item = new Item(); - item.netDefaults(type); - if (stacks > item.maxStack || TShock.Itembans.ItemIsBanned(item.name, args.Player)) - { - return false; - } - - if (TShock.CheckTilePermission(args.Player, Main.chest[id].x, Main.chest[id].y) && TShock.Config.RegionProtectChests) - { - return false; - } - - if (TShock.CheckRangePermission(args.Player, Main.chest[id].x, Main.chest[id].y)) - { - return false; - } - - return false; - } - - private static bool HandleSign(GetDataHandlerArgs args) - { - var id = args.Data.ReadInt16(); - var x = args.Data.ReadInt32(); - var y = args.Data.ReadInt32(); - - if (OnSignEvent(id, x, y)) - return true; - - if (TShock.CheckTilePermission(args.Player, x, y)) - { - args.Player.SendData(PacketTypes.SignNew, "", id); - return true; - } - - if (TShock.CheckRangePermission(args.Player, x, y)) - { - args.Player.SendData(PacketTypes.SignNew, "", id); - return true; - } - return false; - } - - private static bool UpdateNPCHome(GetDataHandlerArgs args) - { - var id = args.Data.ReadInt16(); - var x = args.Data.ReadInt16(); - var y = args.Data.ReadInt16(); - var homeless = args.Data.ReadInt8(); - - if (OnUpdateNPCHome(id, x, y, homeless)) - return true; - - if (!args.Player.Group.HasPermission(Permissions.movenpc)) - { - args.Player.SendMessage("You do not have permission to relocate NPCs.", Color.Red); - args.Player.SendData(PacketTypes.UpdateNPCHome, "", id, Main.npc[id].homeTileX, Main.npc[id].homeTileY, - Convert.ToByte(Main.npc[id].homeless)); - return true; - } - - if (TShock.CheckTilePermission(args.Player, x, y)) - { - args.Player.SendMessage( "You do not have access to modify this area.", Color.Red); - args.Player.SendData(PacketTypes.UpdateNPCHome, "", id, Main.npc[id].homeTileX, Main.npc[id].homeTileY, - Convert.ToByte(Main.npc[id].homeless)); - return true; - } - - //removed until NPC Home packet actually sends their home coords. - /*if (TShock.CheckRangePermission(args.Player, x, y)) - { - args.Player.SendData(PacketTypes.UpdateNPCHome, "", id, Main.npc[id].homeTileX, Main.npc[id].homeTileY, - Convert.ToByte(Main.npc[id].homeless)); - return true; - }*/ - return false; - } - - private static bool HandlePlayerBuff(GetDataHandlerArgs args) - { - var id = args.Data.ReadInt8(); - var type = args.Data.ReadInt8(); - var time = args.Data.ReadInt16(); - - if (OnPlayerBuff(id, type, time)) - return true; - - if (TShock.CheckIgnores(args.Player)) - { - args.Player.SendData(PacketTypes.PlayerBuff, "", id); - return true; - } - if (!TShock.Players[id].TPlayer.hostile) - { - args.Player.SendData(PacketTypes.PlayerBuff, "", id); - return true; - } - if (TShock.CheckRangePermission(args.Player, TShock.Players[id].TileX, TShock.Players[id].TileY, 50)) - { - args.Player.SendData(PacketTypes.PlayerBuff, "", id); - return true; - } - if ((DateTime.UtcNow - args.Player.LastThreat).TotalMilliseconds < 5000) - { - args.Player.SendData(PacketTypes.PlayerBuff, "", id); - return true; - } - - if (WhitelistBuffMaxTime[type] > 0 && time <= WhitelistBuffMaxTime[type]) - { - return false; - } - - args.Player.SendData(PacketTypes.PlayerBuff, "", id); - return true; - } - - private static bool HandleItemDrop(GetDataHandlerArgs args) - { - var id = args.Data.ReadInt16(); - var pos = new Vector2(args.Data.ReadSingle(), args.Data.ReadSingle()); - var vel = new Vector2(args.Data.ReadSingle(), args.Data.ReadSingle()); - var stacks = args.Data.ReadInt8(); - var prefix = args.Data.ReadInt8(); - var type = args.Data.ReadInt16(); - - if (OnItemDrop(id, pos, vel, stacks, prefix, type)) - return true; - - if (type == 0) //Item removed, let client do this to prevent item duplication client side - { - return false; - } - - if (TShock.CheckRangePermission(args.Player, (int) (pos.X/16f), (int) (pos.Y/16f))) - { - args.Player.SendData(PacketTypes.ItemDrop, "", id); - return true; - } - - Item item = new Item(); - item.netDefaults(type); - if (stacks > item.maxStack || TShock.Itembans.ItemIsBanned(item.name, args.Player)) - { - args.Player.SendData(PacketTypes.ItemDrop, "", id); - return true; - } - if ((TShock.Config.ServerSideInventory) && (DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond - args.Player.LoginMS < TShock.Config.LogonDiscardThreshold)) - { - //Player is probably trying to sneak items onto the server in their hands!!! - Log.ConsoleInfo(string.Format("Player {0} tried to sneak {1} onto the server!", args.Player.Name, item.name)); - args.Player.SendData(PacketTypes.ItemDrop, "", id); - return true; - - } - if (TShock.CheckIgnores(args.Player)) - { - args.Player.SendData(PacketTypes.ItemDrop, "", id); - return true; - } - - return false; - } - - private static bool HandlePlayerDamage(GetDataHandlerArgs args) - { - var id = args.Data.ReadInt8(); - var direction = args.Data.ReadInt8(); - var dmg = args.Data.ReadInt16(); - var pvp = args.Data.ReadInt8(); - var crit = args.Data.ReadInt8(); - - if (OnPlayerDamage(id, direction, dmg, pvp, crit)) - return true; - - int textlength = (int) (args.Data.Length - args.Data.Position - 1); - string deathtext = ""; - if (textlength > 0) - { - deathtext = Encoding.UTF8.GetString(args.Data.ReadBytes(textlength)); - /*if (!TShock.Utils.ValidString(deathtext)) - { - return true; - }*/ - } - - if (TShock.Players[id] == null) - return true; - - if (dmg > TShock.Config.MaxDamage && !args.Player.Group.HasPermission(Permissions.ignoredamagecap)) - { - args.Player.Disable(String.Format("Player damage exceeded {0}", TShock.Config.MaxDamage ) ); - args.Player.SendData(PacketTypes.PlayerHp, "", id); - args.Player.SendData(PacketTypes.PlayerUpdate, "", id); - return true; - } - - if (!TShock.Players[id].TPlayer.hostile) - { - args.Player.SendData(PacketTypes.PlayerHp, "", id); - args.Player.SendData(PacketTypes.PlayerUpdate, "", id); - return true; - } - - if (TShock.CheckIgnores(args.Player)) - { - args.Player.SendData(PacketTypes.PlayerHp, "", id); - args.Player.SendData(PacketTypes.PlayerUpdate, "", id); - return true; - } - - if (TShock.CheckRangePermission(args.Player, TShock.Players[id].TileX, TShock.Players[id].TileY, 100)) - { - args.Player.SendData(PacketTypes.PlayerHp, "", id); - args.Player.SendData(PacketTypes.PlayerUpdate, "", id); - return true; - } - - if ((DateTime.UtcNow - args.Player.LastThreat).TotalMilliseconds < 5000) - { - args.Player.SendData(PacketTypes.PlayerHp, "", id); - args.Player.SendData(PacketTypes.PlayerUpdate, "", id); - return true; - } - - return false; - } - - private static bool HandleNpcStrike(GetDataHandlerArgs args) - { - var id = args.Data.ReadInt8(); - var direction = args.Data.ReadInt8(); - var dmg = args.Data.ReadInt16(); - var pvp = args.Data.ReadInt8(); - var crit = args.Data.ReadInt8(); - - if (OnNPCStrike(id, direction, dmg, pvp, crit)) - return true; - - if (Main.npc[id] == null) - return true; - - if (dmg > TShock.Config.MaxDamage && !args.Player.Group.HasPermission(Permissions.ignoredamagecap)) - { - args.Player.Disable(String.Format("NPC damage exceeded {0}", TShock.Config.MaxDamage ) ); - args.Player.SendData(PacketTypes.NpcUpdate, "", id); - return true; - } - - if (TShock.CheckIgnores(args.Player)) - { - args.Player.SendData(PacketTypes.NpcUpdate, "", id); - return true; - } - - if (Main.npc[id].townNPC && !args.Player.Group.HasPermission(Permissions.movenpc)) - { - args.Player.SendMessage( "You don't have permission to move the NPC", Color.Yellow); - args.Player.SendData(PacketTypes.NpcUpdate, "", id); - return true; - } - - if (TShock.Config.RangeChecks && - TShock.CheckRangePermission(args.Player, (int) (Main.npc[id].position.X/16f), (int) (Main.npc[id].position.Y/16f), - 128)) - { - args.Player.SendData(PacketTypes.NpcUpdate, "", id); - return true; - } - - if ((DateTime.UtcNow - args.Player.LastThreat).TotalMilliseconds < 5000) - { - args.Player.SendData(PacketTypes.NpcUpdate, "", id); - return true; - } - - return false; - } - - private static bool HandleSpecial(GetDataHandlerArgs args) - { - var id = args.Data.ReadInt8(); - var type = args.Data.ReadInt8(); - - if (OnNPCSpecial(id, type)) - return true; - - if (type == 1 && TShock.Config.DisableDungeonGuardian) - { - args.Player.SendMessage("The Dungeon Guardian returned you to your spawn point", Color.Purple); - args.Player.Spawn(); - return true; - } - - return false; - } - - private static bool HandlePlayerAnimation(GetDataHandlerArgs args) - { - - if (OnPlayerAnimation()) - return true; - - if (TShock.CheckIgnores(args.Player)) - { - args.Player.SendData(PacketTypes.PlayerAnimation, "", args.Player.Index); - return true; - } - - if ((DateTime.UtcNow - args.Player.LastThreat).TotalMilliseconds < 5000) - { - args.Player.SendData(PacketTypes.PlayerAnimation, "", args.Player.Index); - return true; - } - - return false; - } - - private static bool HandlePlayerBuffUpdate(GetDataHandlerArgs args) - { - var id = args.Data.ReadInt8(); - - if (OnPlayerBuffUpdate(id)) - return true; - - for (int i = 0; i < 10; i++) - { - var buff = args.Data.ReadInt8(); - - if (buff == 10) - { - if (!args.Player.Group.HasPermission(Permissions.usebanneditem) && - TShock.Itembans.ItemIsBanned("Invisibility Potion", args.Player)) - buff = 0; - else if (TShock.Config.DisableInvisPvP && args.TPlayer.hostile) - buff = 0; - } - - args.TPlayer.buffType[i] = buff; - if (args.TPlayer.buffType[i] > 0) - { - args.TPlayer.buffTime[i] = 60; - } - else - { - args.TPlayer.buffTime[i] = 0; - } - } - NetMessage.SendData((int) PacketTypes.PlayerBuff, -1, args.Player.Index, "", args.Player.Index); - return true; - } - - private static bool HandleSpawnBoss(GetDataHandlerArgs args) - { - var spawnboss = false; - var invasion = -1; - var plr = args.Data.ReadInt32(); - var Type = args.Data.ReadInt32(); - spawnboss = (Type == 4 || Type == 13 || (Type == 50 || Type == 125) || (Type == 126 || Type == 134 || (Type == (int) sbyte.MaxValue || Type == 128))); - if (!spawnboss) - { - switch (Type) - { - case -1: - invasion = 1; - break; - case -2: - invasion = 2; - break; - } - } - if (spawnboss && !args.Player.Group.HasPermission(Permissions.summonboss)) - { - args.Player.SendMessage("You don't have permission to summon a boss.", Color.Red); - return true; - } - if (invasion != -1 && !args.Player.Group.HasPermission(Permissions.startinvasion)) - { - args.Player.SendMessage("You don't have permission to start an invasion.", Color.Red); - return true; - } - if (!spawnboss && invasion == -1) - return true; - if (plr != args.Player.Index) - return true; - - string boss; - switch (Type) - { - case -2: - boss = "the Snow Legion"; - break; - case -1: - boss = "a Goblin Invasion"; - break; - case 4: - boss = "the Eye of Cthulhu"; - break; - case 13: - boss = "the Eater of Worlds"; - break; - case 50: - boss = "the King Slime"; - break; - case 125: - boss = "Retinazer"; - break; - case 126: - boss = "Spazmatism"; - break; - case 134: - boss = "the Destroyer"; - break; - case sbyte.MaxValue: - boss = "Skeleton Prime"; - break; - case 128: - boss = "Skeleton Prime"; - break; - default: - boss = "error"; - break; - } - - TShock.Utils.SendLogs(string.Format("{0} summoned {1}", args.Player.Name, boss), Color.Red); - return false; - } - } -} +/* +TShock, a server mod for Terraria +Copyright (C) 2011 The TShock Team + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.IO; +using System.IO.Streams; +using System.Linq; +using System.Text; +using Terraria; +using TShockAPI.Net; + +namespace TShockAPI +{ + public delegate bool GetDataHandlerDelegate(GetDataHandlerArgs args); + + public class GetDataHandlerArgs : EventArgs + { + public TSPlayer Player { get; private set; } + public MemoryStream Data { get; private set; } + + public Player TPlayer + { + get { return Player.TPlayer; } + } + + public GetDataHandlerArgs(TSPlayer player, MemoryStream data) + { + Player = player; + Data = data; + } + } + + public static class GetDataHandlers + { + private static Dictionary GetDataHandlerDelegates; + public static int[] WhitelistBuffMaxTime; + #region Events + + /// + /// Used when a TileEdit event is called. + /// + public class TileEditEventArgs : HandledEventArgs + { + /// + /// The TSPlayer who made the tile edit + /// + public TSPlayer Player { get; set; } + + /// + /// The tile coordinate on the X plane + /// + public int X { get; set; } + + /// + /// The tile coordinate on the Y plane + /// + public int Y { get; set; } + + /// + /// The Tile ID being edited. + /// + public byte Type { get; set; } + /// + /// The EditType. + /// (KillTile = 0, PlaceTile = 1, KillWall = 2, PlaceWall = 3, KillTileNoItem = 4, PlaceWire = 5, KillWire = 6) + /// + public byte EditType { get; set; } + } + + /// + /// TileEdit - called when a tile is placed or destroyed + /// + public static HandlerList TileEdit; + private static bool OnTileEdit(TSPlayer ply, int x, int y, byte type, byte editType) + { + if (TileEdit == null) + return false; + + var args = new TileEditEventArgs + { + Player = ply, + X = x, + Y = y, + Type = type, + EditType = editType + }; + TileEdit.Invoke(null, args); + return args.Handled; + } + /// + /// For use in a TogglePvp event + /// + public class TogglePvpEventArgs : HandledEventArgs + { + /// + /// The Terraria player ID of the player + /// + public byte PlayerId { get; set; } + /// + /// Enable/disable pvp? + /// + public bool Pvp { get; set; } + } + /// + /// TogglePvp - called when a player toggles pvp + /// + public static HandlerList TogglePvp; + private static bool OnPvpToggled(byte _id, bool _pvp) + { + if (TogglePvp == null) + return false; + + var args = new TogglePvpEventArgs + { + PlayerId = _id, + Pvp = _pvp, + }; + TogglePvp.Invoke(null, args); + return args.Handled; + } + + /// + /// For use in a PlayerSlot event + /// + public class PlayerSlotEventArgs : HandledEventArgs + { + /// + /// The Terraria playerID + /// + public byte PlayerId { get; set; } + /// + /// The slot edited + /// + public byte Slot { get; set; } + /// + /// The stack edited + /// + public byte Stack { get; set; } + /// + /// The item prefix + /// + public byte Prefix { get; set; } + /// + /// Item type + /// + public short Type { get; set; } + } + /// + /// PlayerSlot - called at a PlayerSlot event + /// + public static HandlerList PlayerSlot; + private static bool OnPlayerSlot(byte _plr, byte _slot, byte _stack, byte _prefix, short _type) + { + if (PlayerSlot == null) + return false; + + var args = new PlayerSlotEventArgs + { + PlayerId = _plr, + Slot = _slot, + Stack = _stack, + Prefix = _prefix, + Type = _type + }; + PlayerSlot.Invoke(null, args); + return args.Handled; + } + + /// + /// For use in a PlayerHP event + /// + public class PlayerHPEventArgs : HandledEventArgs + { + /// + /// The Terraria playerID of the player + /// + public byte PlayerId { get; set; } + /// + /// Current HP + /// + public short Current { get; set; } + /// + /// Maximum HP + /// + public short Max { get; set; } + } + /// + /// PlayerHP - called at a PlayerHP event + /// + public static HandlerList PlayerHP; + + private static bool OnPlayerHP(byte _plr, short _cur, short _max) + { + if (PlayerHP == null) + return false; + + var args = new PlayerHPEventArgs + { + PlayerId = _plr, + Current = _cur, + Max = _max, + }; + PlayerHP.Invoke(null, args); + return args.Handled; + } + + /// + /// For use in a PlayerMana event + /// + public class PlayerManaEventArgs : HandledEventArgs + { + public byte PlayerId { get; set; } + public short Current { get; set; } + public short Max { get; set; } + } + /// + /// PlayerMana - called at a PlayerMana event + /// + public static HandlerList PlayerMana; + + private static bool OnPlayerMana(byte _plr, short _cur, short _max) + { + if (PlayerMana == null) + return false; + + var args = new PlayerManaEventArgs + { + PlayerId = _plr, + Current = _cur, + Max = _max, + }; + PlayerMana.Invoke(null, args); + return args.Handled; + } + + public class PlayerInfoEventArgs : HandledEventArgs + { + /// + /// The Terraria playerID of the player + /// + public byte PlayerId { get; set; } + /// + /// Hair color + /// + public byte Hair { get; set; } + /// + /// Gender (male = true) + /// + public bool Male { get; set; } + /// + /// Character difficulty + /// + public byte Difficulty { get; set; } + /// + /// Player/character name + /// + public string Name { get; set; } + } + /// + /// PlayerInfo - called at a PlayerInfo event + /// If this is cancelled, the server will ForceKick the player. If this should be changed in the future, let someone know. + /// + public static HandlerList PlayerInfo; + + private static bool OnPlayerInfo(byte _plrid, byte _hair, bool _male, byte _difficulty, string _name) + { + if (PlayerInfo == null) + return false; + + var args = new PlayerInfoEventArgs + { + PlayerId = _plrid, + Hair = _hair, + Male = _male, + Difficulty = _difficulty, + Name = _name, + }; + PlayerInfo.Invoke(null, args); + return args.Handled; + } + + /// + /// For use in a TileKill event + /// + public class TileKillEventArgs : HandledEventArgs + { + /// + /// The X coordinate that is being killed + /// + public int TileX { get; set; } + /// + /// The Y coordinate that is being killed + /// + public int TileY { get; set; } + } + /// + /// TileKill - When a tile is removed fromt he world + /// + public static HandlerList TileKill; + + private static bool OnTileKill(int tilex, int tiley) + { + if (TileKill == null) + return false; + + var args = new TileKillEventArgs + { + TileX = tilex, + TileY = tiley, + }; + TileKill.Invoke(null, args); + return args.Handled; + } + + /// + /// For use in a KillMe event + /// + public class KillMeEventArgs : HandledEventArgs + { + /// + /// The Terraria playerID of the player + /// + public byte PlayerId { get; set; } + /// + /// The direction the damage is coming from (?) + /// + public byte Direction { get; set; } + /// + /// Amount of damage delt + /// + public short Damage { get; set; } + /// + /// Player's current pvp setting + /// + public bool Pvp { get; set; } + } + /// + /// KillMe - Terraria's crappy way of handling damage from players + /// + public static HandlerList KillMe; + + private static bool OnKillMe(byte plr, byte direction, short damage, bool pvp) + { + if (KillMe == null) + return false; + + var args = new KillMeEventArgs + { + PlayerId = plr, + Direction = direction, + Damage = damage, + Pvp = pvp, + }; + KillMe.Invoke(null, args); + return args.Handled; + } + + /// + /// For use in a PlayerUpdate event + /// + public class PlayerUpdateEventArgs : HandledEventArgs + { + /// + /// The Terraria playerID of the player + /// + public byte PlayerId { get; set; } + /// + /// ??? + /// + public byte Control { get; set; } + /// + /// Current item? + /// + public byte Item { get; set; } + /// + /// Position of the player + /// + public Vector2 Position { get; set; } + /// + /// Velocity of the player + /// + public Vector2 Velocity { get; set; } + } + /// + /// PlayerUpdate - When the player sends it's updated information to the server + /// + public static HandlerList PlayerUpdate; + + private static bool OnPlayerUpdate(byte player, byte control, byte item, Vector2 position, Vector2 velocity) + { + if (PlayerUpdate == null) + return false; + + var args = new PlayerUpdateEventArgs + { + PlayerId = player, + Control = control, + Item = item, + Position = position, + Velocity = velocity, + }; + PlayerUpdate.Invoke(null, args); + return args.Handled; + } + public static bool TSCheckNoclip(Vector2 Position, int Width, int Height) + { + int num = (int)(Position.X / 16f) - 1; + int num2 = (int)((Position.X + (float)Width) / 16f) + 2; + int num3 = (int)(Position.Y / 16f) - 1; + int num4 = (int)((Position.Y + (float)Height) / 16f) + 2; + if (num < 0) + { + num = 0; + } + if (num2 > Main.maxTilesX) + { + num2 = Main.maxTilesX; + } + if (num3 < 0) + { + num3 = 0; + } + if (num4 > Main.maxTilesY) + { + num4 = Main.maxTilesY; + } + for (int i = num; i < num2; i++) + { + for (int j = num3; j < num4; j++) + { + if (Main.tile[i, j] != null && Main.tile[i, j].active && Main.tileSolid[(int)Main.tile[i, j].type] && !Main.tileSolidTop[(int)Main.tile[i, j].type] &&(((int)Main.tile[i,j].type !=53) && ((int)Main.tile[i,j].type !=112) && ((int)Main.tile[i,j].type !=116) && ((int)Main.tile[i,j].type !=123)) && ((Main.tile[i,j].liquid == 0 )&& !Main.tile[i,j].lava)) + { + Vector2 vector; + vector.X = (float)(i * 16); + vector.Y = (float)(j * 16); + if (Position.X + (float)Width > vector.X && Position.X < vector.X + 16f && Position.Y + (float)Height > vector.Y && Position.Y < vector.Y + 16f) + { + return true; + } + } + } + } + return false; + } + + /// + /// For use in a SendTileSquare event + /// + public class SendTileSquareEventArgs : HandledEventArgs + { + /// + /// Size of the area + /// + public short Size { get; set; } + /// + /// A corner of the section + /// + public int TileX { get; set; } + /// + /// A corner of the section + /// + public int TileY { get; set; } + } + /// + /// SendTileSquare - When the player sends a tile square + /// + public static HandlerList SendTileSquare; + + private static bool OnSendTileSquare(short size, int tilex, int tiley) + { + if (SendTileSquare == null) + return false; + + var args = new SendTileSquareEventArgs + { + Size = size, + TileX = tilex, + TileY = tiley, + }; + SendTileSquare.Invoke(null, args); + return args.Handled; + } + /// + /// For use in a NewProjectile event + /// + public class NewProjectileEventArgs : HandledEventArgs + { + /// + /// ??? + /// + public short Identity { get; set; } + /// + /// Location of the projectile + /// + public Vector2 Position { get; set; } + /// + /// Velocity of the projectile + /// + public Vector2 Velocity { get; set; } + /// + /// Knockback + /// + public float Knockback { get; set; } + /// + /// Damage from the projectile + /// + public short Damage { get; set; } + /// + /// Terraria playerID owner of the projectile + /// + public byte Owner { get; set; } + /// + /// Type of projectile + /// + public byte Type { get; set; } + /// + /// ??? + /// + public int Index { get; set; } + } + /// + /// NewProjectile - Called when a client creates a new projectile + /// + public static HandlerList NewProjectile; + + private static bool OnNewProjectile(short ident, Vector2 pos, Vector2 vel, float knockback, short dmg, byte owner, byte type, int index) + { + if (NewProjectile == null) + return false; + + var args = new NewProjectileEventArgs + { + Identity = ident, + Position = pos, + Velocity = vel, + Knockback = knockback, + Damage = dmg, + Owner = owner, + Type = type, + Index = index, + }; + NewProjectile.Invoke(null, args); + return args.Handled; + } + + /// + /// For use in a LiquidSet event + /// + public class LiquidSetEventArgs : HandledEventArgs + { + /// + /// X location of the tile + /// + public int TileX { get; set; } + /// + /// Y location of the tile + /// + public int TileY { get; set; } + /// + /// ??? + /// + public byte Liquid { get; set;} + /// + /// True if lava + /// + public bool Lava { get; set; } + } + /// + /// LiquidSet - When ever a liquid is set + /// + public static HandlerList LiquidSet; + + private static bool OnLiquidSet(int tilex, int tiley, byte liquid, bool lava) + { + if (LiquidSet == null) + return false; + + var args = new LiquidSetEventArgs + { + TileX = tilex, + TileY = tiley, + Liquid = liquid, + Lava = lava, + }; + LiquidSet.Invoke(null, args); + return args.Handled; + } + /// + /// For use in a PlayerSpawn event + /// + public class SpawnEventArgs : HandledEventArgs + { + /// + /// The Terraria playerID of the player + /// + public byte Player { get; set; } + /// + /// X location of the player's spawn + /// + public int SpawnX { get; set; } + /// + /// Y location of the player's spawn + /// + public int SpawnY { get; set; } + } + /// + /// PlayerSpawn - When a player spawns + /// + public static HandlerList PlayerSpawn; + + private static bool OnPlayerSpawn(byte player, int spawnX, int spawnY) + { + if (PlayerSpawn == null) + return false; + + var args = new SpawnEventArgs + { + Player = player, + SpawnX = spawnX, + SpawnY = spawnY, + }; + PlayerSpawn.Invoke(null, args); + return args.Handled; + } + /// + /// For use with a ChestOpen event + /// + public class ChestOpenEventArgs : HandledEventArgs + { + /// + /// X location of said chest + /// + public int X { get; set; } + /// + /// Y location of said chest + /// + public int Y { get; set; } + } + /// + /// ChestOpen - Called when any chest is opened + /// + public static HandlerList ChestOpen; + + private static bool OnChestOpen(int x, int y) + { + if (ChestOpen == null) + return false; + + var args = new ChestOpenEventArgs + { + X = x, + Y = y, + }; + ChestOpen.Invoke(null, args); + return args.Handled; + } + + /// + /// For use in a ChestItemChange event + /// + public class ChestItemEventArgs : HandledEventArgs + { + /// + /// ChestID + /// + public short ID { get; set; } + /// + /// Slot of the item + /// + public byte Slot { get; set; } + /// + /// How many? + /// + public byte Stacks { get; set; } + /// + /// Item prefix + /// + public byte Prefix { get; set; } + /// + /// Item type + /// + public short Type { get; set; } + } + /// + /// ChestItemChange - Called when an item in a chest changes + /// + public static HandlerList ChestItemChange; + + private static bool OnChestItemChange(short id, byte slot, byte stacks, byte prefix, short type) + { + if (ChestItemChange == null) + return false; + + var args = new ChestItemEventArgs + { + ID = id, + Slot = slot, + Stacks = stacks, + Prefix = prefix, + Type = type, + }; + ChestItemChange.Invoke(null, args); + return args.Handled; + } + + /// + /// For use in a Sign event + /// + public class SignEventArgs : HandledEventArgs + { + /// + /// The Terraria playerID of the player + /// + public short ID { get; set; } + /// + /// X location of the sign + /// + public int X { get; set; } + /// + /// Y location of the sign + /// + public int Y { get; set; } + } + /// + /// Sign - Called when a sign is changed + /// + public static HandlerList Sign; + + private static bool OnSignEvent(short id, int x, int y) + { + if (Sign == null) + return false; + + var args = new SignEventArgs + { + ID = id, + X = x, + Y = y, + }; + Sign.Invoke(null, args); + return args.Handled; + } + + /// + /// For use in a NPCHome event + /// + public class NPCHomeChangeEventArgs : HandledEventArgs + { + /// + /// The Terraria playerID of the player + /// + public short ID { get; set; } + /// + /// X location of the NPC home change + /// + public short X { get; set; } + /// + /// Y location of the NPC home change + /// + public short Y { get; set; } + /// + /// ByteBool homeless + /// + public byte Homeless { get; set; } + } + /// + /// NPCHome - Called when an NPC's home is changed + /// + public static HandlerList NPCHome; + + private static bool OnUpdateNPCHome(short id, short x, short y, byte homeless) + { + if (NPCHome == null) + return false; + + var args = new NPCHomeChangeEventArgs + { + ID = id, + X = x, + Y = y, + Homeless = homeless, + }; + NPCHome.Invoke(null, args); + return args.Handled; + } + + /// + /// For use in a PlayerBuff event + /// + public class PlayerBuffEventArgs : HandledEventArgs + { + /// + /// The Terraria playerID of the player + /// + public byte ID { get; set; } + /// + /// Buff Type + /// + public byte Type { get; set; } + /// + /// Time the buff lasts + /// + public short Time { get; set; } + } + /// + /// PlayerBuff - Called when a player is buffed + /// + public static HandlerList PlayerBuff; + + private static bool OnPlayerBuff(byte id, byte type, short time) + { + if (PlayerBuff == null) + return false; + + var args = new PlayerBuffEventArgs + { + ID = id, + Type = type, + Time = time, + }; + PlayerBuff.Invoke(null, args); + return args.Handled; + } + + /// + /// For use in an ItemDrop event + /// + public class ItemDropEventArgs : HandledEventArgs + { + /// + /// The Terraria playerID of the player + /// + public short ID { get; set; } + /// + /// Position of the item + /// + public Vector2 Position { get; set; } + /// + /// Velocity at which the item is deployed + /// + public Vector2 Velocity { get; set; } + /// + /// Stacks + /// + public byte Stacks { get; set; } + /// + /// Prefix of the item + /// + public byte Prefix { get; set; } + /// + /// Item type + /// + public short Type { get; set; } + } + /// + /// ItemDrop - Called when an item is dropped + /// + public static HandlerList ItemDrop; + + private static bool OnItemDrop(short id, Vector2 pos, Vector2 vel, byte stacks, byte prefix, short type) + { + if (ItemDrop == null) + return false; + + var args = new ItemDropEventArgs + { + ID = id, + Position = pos, + Velocity = vel, + Stacks = stacks, + Prefix = prefix, + Type = type, + }; + ItemDrop.Invoke(null, args); + return args.Handled; + } + + /// + /// For use in a PlayerDamage event + /// + public class PlayerDamageEventArgs : HandledEventArgs + { + /// + /// The Terraria playerID of the player + /// + public byte ID { get; set; } + /// + /// The direction the damage is occuring from + /// + public byte Direction { get; set; } + /// + /// Amount of damage + /// + public short Damage { get; set; } + /// + /// If the player has PVP on + /// + public byte PVP { get; set; } + /// + /// Is the damage critical? + /// + public byte Critical { get; set; } + } + /// + /// PlayerDamage - Called when a player is damaged + /// + public static HandlerList PlayerDamage; + + private static bool OnPlayerDamage(byte id, byte dir, short dmg, byte pvp, byte crit) + { + if (PlayerDamage == null) + return false; + + var args = new PlayerDamageEventArgs + { + ID = id, + Direction = dir, + Damage = dmg, + PVP = pvp, + Critical = crit, + }; + PlayerDamage.Invoke(null, args); + return args.Handled; + } + + /// + /// For use with a NPCStrike event + /// + public class NPCStrikeEventArgs : HandledEventArgs + { + /// + /// ??? + /// + public byte ID { get; set; } + /// + /// Direction the damage occurred from + /// + public byte Direction { get; set; } + /// + /// Amount of damage + /// + public short Damage { get; set; } + /// + /// Is PVP enabled...? + /// + public byte PVP { get; set; } + /// + /// Critical? + /// + public byte Critical { get; set; } + } + /// + /// NPCStrike - Called when an NPC is attacked + /// + public static HandlerList NPCStrike; + + private static bool OnNPCStrike(byte id, byte dir, short dmg, byte pvp, byte crit) + { + if (NPCStrike == null) + return false; + + var args = new NPCStrikeEventArgs + { + ID = id, + Direction = dir, + Damage = dmg, + PVP = pvp, + Critical = crit, + }; + NPCStrike.Invoke(null, args); + return args.Handled; + } + + /// + /// For use with a NPCSpecial event + /// + public class NPCSpecialEventArgs : HandledEventArgs + { + /// + /// ??? + /// + public byte ID { get; set; } + /// + /// Type...? + /// + public byte Type { get; set; } + } + /// + /// NPCSpecial - Called at some point + /// + public static HandlerList NPCSpecial; + + private static bool OnNPCSpecial(byte id, byte type) + { + if (NPCSpecial == null) + return false; + + var args = new NPCSpecialEventArgs + { + ID = id, + Type = type, + }; + NPCSpecial.Invoke(null, args); + return args.Handled; + } + + /// + /// For use with a PlayerAnimation event + /// + public class PlayerAnimationEventArgs : HandledEventArgs + { + } + + /// + /// PlayerAnimation - Called when a player animates + /// + public static HandlerList PlayerAnimation; + + private static bool OnPlayerAnimation() + { + if (PlayerAnimation == null) + return false; + + var args = new PlayerAnimationEventArgs {}; + PlayerAnimation.Invoke(null, args); + return args.Handled; + } + + /// + /// For use in a PlayerBuffUpdate event + /// + public class PlayerBuffUpdateEventArgs : HandledEventArgs + { + /// + /// The Terraria playerID of the player + /// + public byte ID { get; set; } + } + /// + /// PlayerBuffUpdate - Called when a player updates buffs + /// + public static HandlerList PlayerBuffUpdate; + + private static bool OnPlayerBuffUpdate(byte id) + { + if (PlayerBuffUpdate == null) + return false; + + var args = new PlayerBuffUpdateEventArgs + { + ID = id, + }; + PlayerBuffUpdate.Invoke(null, args); + return args.Handled; + } + + #endregion + public static void InitGetDataHandler() + { + #region Blacklists + + WhitelistBuffMaxTime = new int[Main.maxBuffs]; + WhitelistBuffMaxTime[20] = 600; + WhitelistBuffMaxTime[0x18] = 1200; + WhitelistBuffMaxTime[0x1f] = 120; + WhitelistBuffMaxTime[0x27] = 420; + + #endregion Blacklists + + GetDataHandlerDelegates = new Dictionary + { + {PacketTypes.PlayerInfo, HandlePlayerInfo}, + {PacketTypes.PlayerUpdate, HandlePlayerUpdate}, + {PacketTypes.Tile, HandleTile}, + {PacketTypes.TileSendSquare, HandleSendTileSquare}, + {PacketTypes.ProjectileNew, HandleProjectileNew}, + {PacketTypes.TogglePvp, HandleTogglePvp}, + {PacketTypes.TileKill, HandleTileKill}, + {PacketTypes.PlayerKillMe, HandlePlayerKillMe}, + {PacketTypes.LiquidSet, HandleLiquidSet}, + {PacketTypes.PlayerSpawn, HandleSpawn}, + {PacketTypes.ChestGetContents, HandleChestOpen}, + {PacketTypes.ChestItem, HandleChestItem}, + {PacketTypes.SignNew, HandleSign}, + {PacketTypes.PlayerSlot, HandlePlayerSlot}, + {PacketTypes.TileGetSection, HandleGetSection}, + {PacketTypes.UpdateNPCHome, UpdateNPCHome}, + {PacketTypes.PlayerAddBuff, HandlePlayerBuff}, + {PacketTypes.ItemDrop, HandleItemDrop}, + {PacketTypes.PlayerHp, HandlePlayerHp}, + {PacketTypes.PlayerMana, HandlePlayerMana}, + {PacketTypes.PlayerDamage, HandlePlayerDamage}, + {PacketTypes.NpcStrike, HandleNpcStrike}, + {PacketTypes.NpcSpecial, HandleSpecial}, + {PacketTypes.PlayerAnimation, HandlePlayerAnimation}, + {PacketTypes.PlayerBuff, HandlePlayerBuffUpdate}, + {PacketTypes.PasswordSend, HandlePassword}, + {PacketTypes.ContinueConnecting2, HandleConnecting}, + {PacketTypes.ProjectileDestroy, HandleProjectileKill}, + {PacketTypes.SpawnBossorInvasion, HandleSpawnBoss} + }; + } + + public static bool HandlerGetData(PacketTypes type, TSPlayer player, MemoryStream data) + { + GetDataHandlerDelegate handler; + if (GetDataHandlerDelegates.TryGetValue(type, out handler)) + { + try + { + return handler(new GetDataHandlerArgs(player, data)); + } + catch (Exception ex) + { + Log.Error(ex.ToString()); + } + } + return false; + } + + private static bool HandlePlayerSlot(GetDataHandlerArgs args) + { + byte plr = args.Data.ReadInt8(); + byte slot = args.Data.ReadInt8(); + byte stack = args.Data.ReadInt8(); + byte prefix = args.Data.ReadInt8(); + short type = args.Data.ReadInt16(); + + if (OnPlayerSlot(plr, slot, stack, prefix, type)) + return true; + + if (plr != args.Player.Index) + { + return true; + } + + if (slot < 0 || slot > NetItem.maxNetInventory) + { + return true; + } + + var item = new Item(); + item.netDefaults(type); + item.Prefix(prefix); + + if (args.Player.IsLoggedIn) + { + args.Player.PlayerData.StoreSlot(slot, type, prefix, stack); + } + + return false; + } + + public static bool HandlePlayerHp(GetDataHandlerArgs args) + { + var plr = args.Data.ReadInt8(); + var cur = args.Data.ReadInt16(); + var max = args.Data.ReadInt16(); + + if (OnPlayerHP(plr, cur, max)) + return true; + + if (args.Player.FirstMaxHP == 0) + args.Player.FirstMaxHP = max; + + if (max > 400 && max > args.Player.FirstMaxHP) + { + TShock.Utils.ForceKick(args.Player, "Hacked Client Detected."); + return false; + } + + if (args.Player.IsLoggedIn) + { + args.Player.PlayerData.maxHealth = max; + } + + return false; + } + + private static bool HandlePlayerMana(GetDataHandlerArgs args) + { + var plr = args.Data.ReadInt8(); + var cur = args.Data.ReadInt16(); + var max = args.Data.ReadInt16(); + + if (OnPlayerMana(plr, cur, max)) + return true; + + if (args.Player.FirstMaxMP == 0) + args.Player.FirstMaxMP = max; + + if (max > 400 && max > args.Player.FirstMaxMP) + { + TShock.Utils.ForceKick(args.Player, "Hacked Client Detected."); + return false; + } + + return false; + } + + private static bool HandlePlayerInfo(GetDataHandlerArgs args) + { + var playerid = args.Data.ReadInt8(); + var hair = args.Data.ReadInt8(); + var male = args.Data.ReadBoolean(); + args.Data.Position += 21; + var difficulty = args.Data.ReadInt8(); + string name = Encoding.UTF8.GetString(args.Data.ReadBytes((int) (args.Data.Length - args.Data.Position - 1))); + + if (OnPlayerInfo(playerid, hair, male, difficulty, name)) + { + TShock.Utils.ForceKick(args.Player, "A plugin cancelled the event."); + return true; + } + + /*if (!TShock.Utils.ValidString(name)) + { + TShock.Utils.ForceKick(args.Player, "Unprintable character in name"); + return true; + }*/ + if (name.Trim().Length == 0) + { + TShock.Utils.ForceKick(args.Player, "Empty Name."); + return true; + } + var ban = TShock.Bans.GetBanByName(name); + if (ban != null) + { + TShock.Utils.ForceKick(args.Player, string.Format("You are banned: {0}", ban.Reason)); + return true; + } + if (args.Player.ReceivedInfo) + { + return true; + } + if (TShock.Config.MediumcoreOnly && difficulty < 1) + { + TShock.Utils.ForceKick(args.Player, "Server is set to mediumcore and above characters only!"); + return true; + } + if (TShock.Config.HardcoreOnly && difficulty < 2) + { + TShock.Utils.ForceKick(args.Player, "Server is set to hardcore characters only!"); + return true; + } + args.Player.Difficulty = difficulty; + args.TPlayer.name = name; + args.Player.ReceivedInfo = true; + + return false; + } + + private static bool HandleConnecting(GetDataHandlerArgs args) + { + var user = TShock.Users.GetUserByName(args.Player.Name); + if (user != null && !TShock.Config.DisableLoginBeforeJoin) + { + args.Player.RequiresPassword = true; + NetMessage.SendData((int) PacketTypes.PasswordRequired, args.Player.Index); + return true; + } + else if (!string.IsNullOrEmpty(TShock.Config.ServerPassword)) + { + args.Player.RequiresPassword = true; + NetMessage.SendData((int) PacketTypes.PasswordRequired, args.Player.Index); + return true; + } + + if (args.Player.State == 1) + args.Player.State = 2; + NetMessage.SendData((int) PacketTypes.WorldInfo, args.Player.Index); + return true; + } + + private static bool HandlePassword(GetDataHandlerArgs args) + { + if (!args.Player.RequiresPassword) + return true; + + string password = Encoding.UTF8.GetString(args.Data.ReadBytes((int) (args.Data.Length - args.Data.Position - 1))); + var user = TShock.Users.GetUserByName(args.Player.Name); + if (user != null) + { + string encrPass = TShock.Utils.HashPassword(password); + if (user.Password.ToUpper() == encrPass.ToUpper()) + { + args.Player.RequiresPassword = false; + args.Player.PlayerData = TShock.InventoryDB.GetPlayerData(args.Player, TShock.Users.GetUserID(args.Player.Name)); + + if (args.Player.State == 1) + args.Player.State = 2; + NetMessage.SendData((int) PacketTypes.WorldInfo, args.Player.Index); + + var group = TShock.Utils.GetGroup(user.Group); + + if (TShock.Config.ServerSideInventory) + { + if (group.HasPermission(Permissions.bypassinventorychecks)) + { + args.Player.IgnoreActionsForClearingTrashCan = false; + } + else if (!TShock.CheckInventory(args.Player)) + { + args.Player.SendMessage("Login Failed, Please fix the above errors then /login again.", Color.Cyan); + args.Player.IgnoreActionsForClearingTrashCan = true; + return true; + } + } + + if (group.HasPermission(Permissions.ignorestackhackdetection)) + args.Player.IgnoreActionsForCheating = "none"; + + if (group.HasPermission(Permissions.usebanneditem)) + args.Player.IgnoreActionsForDisabledArmor = "none"; + + args.Player.Group = group; + args.Player.UserAccountName = args.Player.Name; + args.Player.UserID = TShock.Users.GetUserID(args.Player.UserAccountName); + args.Player.IsLoggedIn = true; + args.Player.IgnoreActionsForInventory = "none"; + + if (!args.Player.IgnoreActionsForClearingTrashCan) + { + args.Player.PlayerData.CopyInventory(args.Player); + TShock.InventoryDB.InsertPlayerData(args.Player); + } + args.Player.SendMessage("Authenticated as " + args.Player.Name + " successfully.", Color.LimeGreen); + Log.ConsoleInfo(args.Player.Name + " authenticated successfully as user: " + args.Player.Name); + return true; + } + TShock.Utils.ForceKick(args.Player, "Invalid user account password.", true); + return true; + } + if (!string.IsNullOrEmpty(TShock.Config.ServerPassword)) + { + if (TShock.Config.ServerPassword == password) + { + args.Player.RequiresPassword = false; + if (args.Player.State == 1) + args.Player.State = 2; + NetMessage.SendData((int) PacketTypes.WorldInfo, args.Player.Index); + return true; + } + TShock.Utils.ForceKick(args.Player, "Incorrect Server Password"); + return true; + } + + TShock.Utils.ForceKick(args.Player, "Bad Password Attempt"); + return true; + } + + private static bool HandleGetSection(GetDataHandlerArgs args) + { + if (args.Player.RequestedSection) + return true; + + args.Player.RequestedSection = true; + if (TShock.HackedHealth(args.Player) && !args.Player.Group.HasPermission(Permissions.ignorestathackdetection)) + { + TShock.Utils.ForceKick(args.Player, "You have Hacked Health/Mana, Please use a different character."); + } + + if (!args.Player.Group.HasPermission(Permissions.ignorestackhackdetection)) + { + TShock.HackedInventory(args.Player); + } + + if (TShock.Utils.ActivePlayers() + 1 > TShock.Config.MaxSlots && + !args.Player.Group.HasPermission(Permissions.reservedslot)) + { + args.Player.SilentKickInProgress = true; + TShock.Utils.ForceKick(args.Player, TShock.Config.ServerFullReason); + return true; + } + + NetMessage.SendData((int) PacketTypes.TimeSet, -1, -1, "", 0, 0, Main.sunModY, Main.moonModY); + + if (TShock.Config.EnableGeoIP && TShock.Geo != null) + { + Log.Info(string.Format("{0} ({1}) from '{2}' group from '{3}' joined. ({4}/{5})", args.Player.Name, args.Player.IP, + args.Player.Group.Name, args.Player.Country, TShock.Utils.ActivePlayers(), + TShock.Config.MaxSlots)); + TShock.Utils.Broadcast(args.Player.Name + " has joined from the " + args.Player.Country, Color.Yellow); + } + else + { + Log.Info(string.Format("{0} ({1}) from '{2}' group joined. ({3}/{4})", args.Player.Name, args.Player.IP, + args.Player.Group.Name, TShock.Utils.ActivePlayers(), TShock.Config.MaxSlots)); + TShock.Utils.Broadcast(args.Player.Name + " has joined", Color.Yellow); + } + + if (TShock.Config.DisplayIPToAdmins) + TShock.Utils.SendLogs(string.Format("{0} has joined. IP: {1}", args.Player.Name, args.Player.IP), Color.Blue); + + return false; + } + + private static bool HandleSendTileSquare(GetDataHandlerArgs args) + { + if (args.Player.Group.HasPermission(Permissions.allowclientsideworldedit)) + return false; + + var size = args.Data.ReadInt16(); + var tileX = args.Data.ReadInt32(); + var tileY = args.Data.ReadInt32(); + + if (OnSendTileSquare(size, tileX, tileY)) + return true; + + if (size > 5) + return true; + + if ((DateTime.UtcNow - args.Player.LastThreat).TotalMilliseconds < 5000) + { + args.Player.SendTileSquare(tileX, tileY, size); + return true; + } + + if (TShock.CheckIgnores(args.Player)) + { + args.Player.SendTileSquare(tileX, tileY); + return true; + } + + var tiles = new NetTile[size,size]; + + for (int x = 0; x < size; x++) + { + for (int y = 0; y < size; y++) + { + tiles[x, y] = new NetTile(args.Data); + } + } + + bool changed = false; + for (int x = 0; x < size; x++) + { + int realx = tileX + x; + if (realx < 0 || realx >= Main.maxTilesX) + continue; + + for (int y = 0; y < size; y++) + { + int realy = tileY + y; + if (realy < 0 || realy >= Main.maxTilesY) + continue; + + var tile = Main.tile[realx, realy]; + var newtile = tiles[x, y]; + if (TShock.CheckTilePermission(args.Player, realx, realy)) + { + continue; + } + // Server now has a range check built in + /*if (TShock.CheckRangePermission(args.Player, realx, realy)) + { + continue; + }*/ + if ((tile.type == 128 && newtile.Type == 128) || (tile.type == 105 && newtile.Type == 105) || (tile.type == 139 && newtile.Type == 139)) + { + if (TShock.Config.EnableInsecureTileFixes) + { + return false; + } + } + + if (tile.type == 0x17 && newtile.Type == 0x2) + { + tile.type = 0x2; + changed = true; + } + else if (tile.type == 0x19 && newtile.Type == 0x1) + { + tile.type = 0x1; + changed = true; + } + else if ((tile.type == 0xF && newtile.Type == 0xF) || + (tile.type == 0x4F && newtile.Type == 0x4F)) + { + tile.frameX = newtile.FrameX; + tile.frameY = newtile.FrameY; + changed = true; + } + // Holy water/Unholy water + else if (tile.type == 1 && newtile.Type == 117) + { + tile.type = 117; + changed = true; + } + else if (tile.type == 1 && newtile.Type == 25) + { + tile.type = 25; + changed = true; + } + else if (tile.type == 117 && newtile.Type == 25) + { + tile.type = 25; + changed = true; + } + else if (tile.type == 25 && newtile.Type == 117) + { + tile.type = 117; + changed = true; + } + else if (tile.type == 2 && newtile.Type == 23) + { + tile.type = 23; + changed = true; + } + else if (tile.type == 2 && newtile.Type == 109) + { + tile.type = 109; + changed = true; + } + else if (tile.type == 23 && newtile.Type == 109) + { + tile.type = 109; + changed = true; + } + else if (tile.type == 109 && newtile.Type == 23) + { + tile.type = 23; + changed = true; + } + else if (tile.type == 23 && newtile.Type == 109) + { + tile.type = 109; + changed = true; + } + else if (tile.type == 53 && newtile.Type == 116) + { + tile.type = 116; + changed = true; + } + else if (tile.type == 53 && newtile.Type == 112) + { + tile.type = 112; + changed = true; + } + else if (tile.type == 112 && newtile.Type == 116) + { + tile.type = 116; + changed = true; + } + else if (tile.type == 116 && newtile.Type == 112) + { + tile.type = 112; + changed = true; + } + else if (tile.type == 112 && newtile.Type == 53) + { + tile.type = 53; + changed = true; + } + else if (tile.type == 109 && newtile.Type == 2) + { + tile.type = 2; + changed = true; + } + else if (tile.type == 116 && newtile.Type == 53) + { + tile.type = 53; + changed = true; + } + else if (tile.type == 117 && newtile.Type == 1) + { + tile.type = 1; + changed = true; + } + } + } + + if (changed) + { + TSPlayer.All.SendTileSquare(tileX, tileY, size); + WorldGen.RangeFrame(tileX, tileY, tileX + size, tileY + size); + } + else + { + args.Player.SendTileSquare(tileX, tileY, size); + } + return true; + } + + private static bool HandleTile(GetDataHandlerArgs args) + { + var type = args.Data.ReadInt8(); + var tileX = args.Data.ReadInt32(); + var tileY = args.Data.ReadInt32(); + var tiletype = args.Data.ReadInt8(); + if (OnTileEdit(args.Player, tileX, tileY, tiletype, type)) + return true; + if (tileX < 0 || tileX >= Main.maxTilesX || tileY < 0 || tileY >= Main.maxTilesY) + return false; + + if (args.Player.AwaitingName) + { + var protectedregions = TShock.Regions.InAreaRegionName(tileX, tileY); + if (protectedregions.Count == 0) + { + args.Player.SendMessage("Region is not protected", Color.Yellow); + } + else + { + string regionlist = string.Join(",", protectedregions.ToArray()); + args.Player.SendMessage("Region Name(s): " + regionlist, Color.Yellow); + } + args.Player.SendTileSquare(tileX, tileY); + args.Player.AwaitingName = false; + return true; + } + + if (args.Player.AwaitingTempPoint > 0) + { + args.Player.TempPoints[args.Player.AwaitingTempPoint - 1].X = tileX; + args.Player.TempPoints[args.Player.AwaitingTempPoint - 1].Y = tileY; + args.Player.SendMessage("Set Temp Point " + args.Player.AwaitingTempPoint, Color.Yellow); + args.Player.SendTileSquare(tileX, tileY); + args.Player.AwaitingTempPoint = 0; + return true; + } + + if (type == 1 || type == 3) + { + if (tiletype >= ((type == 1) ? Main.maxTileSets : Main.maxWallTypes)) + { + return true; + } + if (tiletype == 29 && tiletype == 97 && TShock.Config.ServerSideInventory) + { + args.Player.SendMessage("You cannot place this tile, Server side inventory is enabled.", Color.Red); + args.Player.SendTileSquare(tileX, tileY); + return true; + } + if (tiletype == 48 && !args.Player.Group.HasPermission(Permissions.usebanneditem) && + TShock.Itembans.ItemIsBanned("Spike", args.Player)) + { + args.Player.Disable("Using banned spikes without permissions"); + args.Player.SendTileSquare(tileX, tileY); + return true; + } + if (type == 1 && tiletype == 21 && TShock.Utils.MaxChests()) + { + args.Player.SendMessage("Reached world's max chest limit, unable to place more!", Color.Red); + args.Player.SendTileSquare(tileX, tileY); + return true; + } + if (tiletype == 141 && !args.Player.Group.HasPermission(Permissions.usebanneditem) && + TShock.Itembans.ItemIsBanned("Explosives", args.Player)) + { + args.Player.Disable("Using banned explosives tile without permissions"); + args.Player.SendTileSquare(tileX, tileY); + return true; + } + } + + if (TShock.CheckIgnores(args.Player)) + { + args.Player.SendTileSquare(tileX, tileY); + return true; + } + + if (TShock.CheckTilePermission(args.Player, tileX, tileY, tiletype, type)) + { + args.Player.SendTileSquare(tileX, tileY); + return true; + } + + if ((tiletype == 127 || Main.tileCut[tiletype]) && (type == 0 || type == 4)) + { + return false; + } + + if (TShock.CheckRangePermission(args.Player, tileX, tileY)) + { + args.Player.SendTileSquare(tileX, tileY); + return true; + } + + if (args.Player.TileKillThreshold >= TShock.Config.TileKillThreshold) + { + args.Player.Disable("Reached TileKill threshold"); + args.Player.SendTileSquare(tileX, tileY); + return true; + } + + if (args.Player.TilePlaceThreshold >= TShock.Config.TilePlaceThreshold) + { + args.Player.Disable("Reached TilePlace threshold"); + args.Player.SendTileSquare(tileX, tileY); + return true; + } + + if ((DateTime.UtcNow - args.Player.LastThreat).TotalMilliseconds < 5000) + { + args.Player.SendTileSquare(tileX, tileY); + return true; + } + + if (type == 1 && !args.Player.Group.HasPermission(Permissions.ignoreplacetiledetection)) + { + args.Player.TilePlaceThreshold++; + var coords = new Vector2(tileX, tileY); + if (!args.Player.TilesCreated.ContainsKey(coords)) + args.Player.TilesCreated.Add(coords, Main.tile[tileX, tileY].Data); + } + + if ((type == 0 || type == 4) && Main.tileSolid[Main.tile[tileX, tileY].type] && + !args.Player.Group.HasPermission(Permissions.ignorekilltiledetection)) + { + args.Player.TileKillThreshold++; + var coords = new Vector2(tileX, tileY); + if (!args.Player.TilesDestroyed.ContainsKey(coords)) + args.Player.TilesDestroyed.Add(coords, Main.tile[tileX, tileY].Data); + } + + return false; + } + + private static bool HandleTogglePvp(GetDataHandlerArgs args) + { + byte id = args.Data.ReadInt8(); + bool pvp = args.Data.ReadBoolean(); + if (OnPvpToggled(id, pvp)) + return true; + + if (id != args.Player.Index) + { + return true; + } + + if (TShock.Config.PvPMode == "disabled") + { + return true; + } + + if (args.TPlayer.hostile != pvp) + { + long seconds = (long) (DateTime.UtcNow - args.Player.LastPvpChange).TotalSeconds; + if (seconds > 5) + { + TSPlayer.All.SendMessage(string.Format("{0} has {1} PvP!", args.Player.Name, pvp ? "enabled" : "disabled"), + Main.teamColor[args.Player.Team]); + } + args.Player.LastPvpChange = DateTime.UtcNow; + } + + args.TPlayer.hostile = pvp; + + if (TShock.Config.PvPMode == "always") + { + if (!pvp) + args.Player.Spawn(); + } + + NetMessage.SendData((int) PacketTypes.TogglePvp, -1, -1, "", args.Player.Index); + + return true; + } + + private static bool HandlePlayerUpdate(GetDataHandlerArgs args) + { + var plr = args.Data.ReadInt8(); + var control = args.Data.ReadInt8(); + var item = args.Data.ReadInt8(); + var pos = new Vector2(args.Data.ReadSingle(), args.Data.ReadSingle()); + var vel = new Vector2(args.Data.ReadSingle(), args.Data.ReadSingle()); + if (OnPlayerUpdate(plr, control, item, pos, vel)) + return true; + if (item < 0 || item >= args.TPlayer.inventory.Length) + { + return true; + } + + if (args.Player.LastNetPosition == Vector2.Zero) + { + return true; + } + + if (!pos.Equals(args.Player.LastNetPosition)) + { + float distance = Vector2.Distance(new Vector2(pos.X/16f, pos.Y/16f), + new Vector2(args.Player.LastNetPosition.X/16f, args.Player.LastNetPosition.Y/16f)); + if (TShock.CheckIgnores(args.Player)) + { + if (distance > TShock.Config.MaxRangeForDisabled) + { + if (args.Player.IgnoreActionsForCheating != "none") + { + args.Player.SendMessage("Disabled for cheating: " + args.Player.IgnoreActionsForCheating, + Color.Red); + } + else if (args.Player.IgnoreActionsForDisabledArmor != "none") + { + args.Player.SendMessage( + "Disabled for banned armor: " + args.Player.IgnoreActionsForDisabledArmor, Color.Red); + } + else if (args.Player.IgnoreActionsForInventory != "none") + { + args.Player.SendMessage( + "Disabled for Server Side Inventory: " + args.Player.IgnoreActionsForInventory, + Color.Red); + } + else if (TShock.Config.RequireLogin && !args.Player.IsLoggedIn) + { + args.Player.SendMessage("Please /register or /login to play!", Color.Red); + } + else if (args.Player.IgnoreActionsForClearingTrashCan) + { + args.Player.SendMessage("You need to rejoin to ensure your trash can is cleared!", Color.Red); + } + else if (TShock.Config.PvPMode == "always" && !args.TPlayer.hostile) + { + args.Player.SendMessage("PvP is forced! Enable PvP else you can't move or do anything!", + Color.Red); + } + int lastTileX = (int) (args.Player.LastNetPosition.X/16f); + int lastTileY = (int) (args.Player.LastNetPosition.Y/16f); + if (!args.Player.Teleport(lastTileX, lastTileY)) + { + args.Player.Spawn(); + } + return true; + } + return true; + } + + if (args.Player.Dead) + { + return true; + } + + if (!args.Player.Group.HasPermission(Permissions.ignorenoclipdetection) && + TSCheckNoclip(pos, args.TPlayer.width, args.TPlayer.height) && !TShock.Config.IgnoreNoClip) + { + int lastTileX = (int) (args.Player.LastNetPosition.X/16f); + int lastTileY = (int) (args.Player.LastNetPosition.Y/16f); + if (!args.Player.Teleport(lastTileX, lastTileY + 3)) + { + args.Player.SendMessage("You got stuck in a solid object, Sent to spawn point."); + args.Player.Spawn(); + } + return true; + } + args.Player.LastNetPosition = pos; + } + + if ((control & 32) == 32) + { + if (!args.Player.Group.HasPermission(Permissions.usebanneditem) && + TShock.Itembans.ItemIsBanned(args.TPlayer.inventory[item].name, args.Player)) + { + control -= 32; + args.Player.Disable("Using banned item"); + args.Player.SendMessage( + string.Format("You cannot use {0} on this server. Your actions are being ignored.", + args.TPlayer.inventory[item].name), Color.Red); + } + } + + args.TPlayer.selectedItem = item; + args.TPlayer.position = pos; + args.TPlayer.velocity = vel; + args.TPlayer.oldVelocity = args.TPlayer.velocity; + args.TPlayer.fallStart = (int) (pos.Y/16f); + args.TPlayer.controlUp = false; + args.TPlayer.controlDown = false; + args.TPlayer.controlLeft = false; + args.TPlayer.controlRight = false; + args.TPlayer.controlJump = false; + args.TPlayer.controlUseItem = false; + args.TPlayer.direction = -1; + if ((control & 1) == 1) + { + args.TPlayer.controlUp = true; + } + if ((control & 2) == 2) + { + args.TPlayer.controlDown = true; + } + if ((control & 4) == 4) + { + args.TPlayer.controlLeft = true; + } + if ((control & 8) == 8) + { + args.TPlayer.controlRight = true; + } + if ((control & 16) == 16) + { + args.TPlayer.controlJump = true; + } + if ((control & 32) == 32) + { + args.TPlayer.controlUseItem = true; + } + if ((control & 64) == 64) + { + args.TPlayer.direction = 1; + } + NetMessage.SendData((int) PacketTypes.PlayerUpdate, -1, args.Player.Index, "", args.Player.Index); + + return true; + } + + private static bool HandleProjectileNew(GetDataHandlerArgs args) + { + var ident = args.Data.ReadInt16(); + var pos = new Vector2(args.Data.ReadSingle(), args.Data.ReadSingle()); + var vel = new Vector2(args.Data.ReadSingle(), args.Data.ReadSingle()); + var knockback = args.Data.ReadSingle(); + var dmg = args.Data.ReadInt16(); + var owner = args.Data.ReadInt8(); + var type = args.Data.ReadInt8(); + owner = (byte)args.Player.Index; + var index = TShock.Utils.SearchProjectile(ident, owner); + + if (OnNewProjectile(ident, pos, vel, knockback, dmg, owner, type, index)) + return true; + + if (index > Main.maxProjectiles || index < 0) + { + return false; + } + + // Server now checks owner + ident, if owner is different, server will create new projectile. + /*if (args.Player.Index != owner) + { + args.Player.Disable(String.Format("Owner ({0}) and player ID ({1}) does not match to update projectile", owner, args.Player.Index)); + args.Player.RemoveProjectile(ident, owner); + return true; + }*/ + + if (dmg > TShock.Config.MaxProjDamage && !args.Player.Group.HasPermission(Permissions.ignoredamagecap)) + { + args.Player.Disable(String.Format("Projectile damage is higher than {0}", TShock.Config.MaxProjDamage)); + args.Player.RemoveProjectile(ident, owner); + return true; + } + + if (TShock.CheckIgnores(args.Player)) + { + args.Player.RemoveProjectile(ident, owner); + return true; + } + + if (!TShock.Config.IgnoreProjUpdate && TShock.CheckProjectilePermission(args.Player, index, type)) + { + if (type == 100) + { //fix for skele prime + Log.Debug("Skeletron Prime's death laser ignored for cheat detection.."); + } + else + { + args.Player.Disable("Does not have projectile permission to update projectile."); + args.Player.RemoveProjectile(ident, owner); + } + return true; + } + + if (args.Player.ProjectileThreshold >= TShock.Config.ProjectileThreshold) + { + args.Player.Disable("Reached projectile update threshold"); + args.Player.RemoveProjectile(ident, owner); + return true; + } + + if ((DateTime.UtcNow - args.Player.LastThreat).TotalMilliseconds < 5000) + { + args.Player.RemoveProjectile(ident, owner); + return true; + } + + if (!args.Player.Group.HasPermission(Permissions.ignoreprojectiledetection)) + { + if ((type ==90) && (TShock.Config.ProjIgnoreShrapnel))// ignore shrapnel + { + Log.Debug("Ignoring shrapnel per config.."); + } + else + { + args.Player.ProjectileThreshold++; + } + } + + return false; + } + + private static bool HandleProjectileKill(GetDataHandlerArgs args) + { + var ident = args.Data.ReadInt16(); + var owner = args.Data.ReadInt8(); + owner = (byte)args.Player.Index; + var index = TShock.Utils.SearchProjectile(ident, owner); + + if (index > Main.maxProjectiles || index < 0) + { + return false; + } + + var type = Main.projectile[index].type; + + // Players can no longer destroy projectiles that are not theirs as of 1.1.2 + /*if (args.Player.Index != Main.projectile[index].owner && type != 102 && type != 100 && !TShock.Config.IgnoreProjKill) // workaround for skeletron prime projectiles + { + args.Player.Disable(String.Format("Owner ({0}) and player ID ({1}) does not match to kill projectile of type: {3}", Main.projectile[index].owner, args.Player.Index, type)); + args.Player.RemoveProjectile(ident, owner); + return true; + }*/ + + if (TShock.CheckIgnores(args.Player)) + { + args.Player.RemoveProjectile(ident, owner); + return true; + } + + if (TShock.CheckProjectilePermission(args.Player, index, type) && type != 102 && type != 100 && !TShock.Config.IgnoreProjKill) + { + args.Player.Disable("Does not have projectile permission to kill projectile"); + args.Player.RemoveProjectile(ident, owner); + return true; + } + + if ((DateTime.UtcNow - args.Player.LastThreat).TotalMilliseconds < 5000) + { + args.Player.RemoveProjectile(ident, owner); + return true; + } + + return false; + } + + private static bool HandlePlayerKillMe(GetDataHandlerArgs args) + { + var id = args.Data.ReadInt8(); + var direction = args.Data.ReadInt8(); + var dmg = args.Data.ReadInt16(); + var pvp = args.Data.ReadInt8() == 0; + if (OnKillMe(id, direction, dmg, pvp)) + return true; + int textlength = (int) (args.Data.Length - args.Data.Position - 1); + string deathtext = ""; + if (textlength > 0) + { + deathtext = Encoding.UTF8.GetString(args.Data.ReadBytes(textlength)); + /*if (!TShock.Utils.ValidString(deathtext)) + { + return true; + }*/ + } + + args.Player.LastDeath = DateTime.Now; + args.Player.Dead = true; + + return false; + } + + private static bool HandleLiquidSet(GetDataHandlerArgs args) + { + int tileX = args.Data.ReadInt32(); + int tileY = args.Data.ReadInt32(); + byte liquid = args.Data.ReadInt8(); + bool lava = args.Data.ReadBoolean(); + + if (OnLiquidSet(tileX, tileY, liquid, lava)) + return true; + + //The liquid was picked up. + if (liquid == 0) + return false; + + if (tileX < 0 || tileX >= Main.maxTilesX || tileY < 0 || tileY >= Main.maxTilesY) + return false; + + if (TShock.CheckIgnores(args.Player)) + { + args.Player.SendTileSquare(tileX, tileY); + return true; + } + + if (args.Player.TileLiquidThreshold >= TShock.Config.TileLiquidThreshold) + { + args.Player.Disable("Reached TileLiquid threshold"); + args.Player.SendTileSquare(tileX, tileY); + return true; + } + + if (!args.Player.Group.HasPermission(Permissions.ignoreliquidsetdetection)) + { + args.Player.TileLiquidThreshold++; + } + + int bucket = 0; + if (args.TPlayer.inventory[args.TPlayer.selectedItem].type == 206) + { + bucket = 1; + } + else if (args.TPlayer.inventory[args.TPlayer.selectedItem].type == 207) + { + bucket = 2; + } + + if (lava && bucket != 2 && !args.Player.Group.HasPermission(Permissions.usebanneditem) && + TShock.Itembans.ItemIsBanned("Lava Bucket", args.Player)) + { + args.Player.Disable("Using banned lava bucket without permissions"); + args.Player.SendTileSquare(tileX, tileY); + return true; + } + + if (!lava && bucket != 1 && !args.Player.Group.HasPermission(Permissions.usebanneditem) && + TShock.Itembans.ItemIsBanned("Water Bucket", args.Player)) + { + args.Player.Disable("Using banned water bucket without permissions"); + args.Player.SendTileSquare(tileX, tileY); + return true; + } + + if (TShock.CheckTilePermission(args.Player, tileX, tileY)) + { + args.Player.SendTileSquare(tileX, tileY); + return true; + } + + if (TShock.CheckRangePermission(args.Player, tileX, tileY, 16)) + { + args.Player.SendTileSquare(tileX, tileY); + return true; + } + + if ((DateTime.UtcNow - args.Player.LastThreat).TotalMilliseconds < 5000) + { + args.Player.SendTileSquare(tileX, tileY); + return true; + } + + return false; + } + + private static bool HandleTileKill(GetDataHandlerArgs args) + { + var tileX = args.Data.ReadInt32(); + var tileY = args.Data.ReadInt32(); + if (OnTileKill(tileX, tileY)) + return true; + if (tileX < 0 || tileX >= Main.maxTilesX || tileY < 0 || tileY >= Main.maxTilesY) + return false; + + if (TShock.CheckIgnores(args.Player)) + { + args.Player.SendTileSquare(tileX, tileY); + return true; + } + + if (Main.tile[tileX, tileY].type != 0x15 && (!TShock.Utils.MaxChests() && Main.tile[tileX, tileY].type != 0)) //Chest + { + args.Player.SendTileSquare(tileX, tileY); + return true; + } + + if (TShock.CheckTilePermission(args.Player, tileX, tileY)) + { + args.Player.SendTileSquare(tileX, tileY); + return true; + } + + if (TShock.CheckRangePermission(args.Player, tileX, tileY)) + { + args.Player.SendTileSquare(tileX, tileY); + return true; + } + + return false; + } + + private static bool HandleSpawn(GetDataHandlerArgs args) + { + var player = args.Data.ReadInt8(); + var spawnx = args.Data.ReadInt32(); + var spawny = args.Data.ReadInt32(); + + if (OnPlayerSpawn(player, spawnx, spawny)) + return true; + + if (args.Player.InitSpawn && args.TPlayer.inventory[args.TPlayer.selectedItem].type != 50) + { + if (args.TPlayer.difficulty == 1 && (TShock.Config.KickOnMediumcoreDeath || TShock.Config.BanOnMediumcoreDeath)) + { + if (args.TPlayer.selectedItem != 50) + { + if (TShock.Config.BanOnMediumcoreDeath) + { + if (!TShock.Utils.Ban(args.Player, TShock.Config.MediumcoreBanReason)) + TShock.Utils.ForceKick(args.Player, "Death results in a ban, but can't ban you"); + } + else + { + TShock.Utils.ForceKick(args.Player, TShock.Config.MediumcoreKickReason); + } + return true; + } + } + } + else + args.Player.InitSpawn = true; + + args.Player.Dead = false; + return false; + } + + private static bool HandleChestOpen(GetDataHandlerArgs args) + { + var x = args.Data.ReadInt32(); + var y = args.Data.ReadInt32(); + + if (OnChestOpen(x, y)) + return true; + + if (TShock.CheckIgnores(args.Player)) + { + return true; + } + + if (TShock.CheckRangePermission(args.Player, x, y)) + { + return true; + } + + if (TShock.CheckTilePermission(args.Player, x, y) && TShock.Config.RegionProtectChests) + { + return true; + } + + return false; + } + + private static bool HandleChestItem(GetDataHandlerArgs args) + { + var id = args.Data.ReadInt16(); + var slot = args.Data.ReadInt8(); + var stacks = args.Data.ReadInt8(); + var prefix = args.Data.ReadInt8(); + var type = args.Data.ReadInt16(); + + if (OnChestItemChange(id, slot, stacks, prefix, type)) + return true; + + if (args.TPlayer.chest != id) + { + return false; + } + + if (TShock.CheckIgnores(args.Player)) + { + args.Player.SendData(PacketTypes.ChestItem, "", id, slot); + return true; + } + + Item item = new Item(); + item.netDefaults(type); + if (stacks > item.maxStack || TShock.Itembans.ItemIsBanned(item.name, args.Player)) + { + return false; + } + + if (TShock.CheckTilePermission(args.Player, Main.chest[id].x, Main.chest[id].y) && TShock.Config.RegionProtectChests) + { + return false; + } + + if (TShock.CheckRangePermission(args.Player, Main.chest[id].x, Main.chest[id].y)) + { + return false; + } + + return false; + } + + private static bool HandleSign(GetDataHandlerArgs args) + { + var id = args.Data.ReadInt16(); + var x = args.Data.ReadInt32(); + var y = args.Data.ReadInt32(); + + if (OnSignEvent(id, x, y)) + return true; + + if (TShock.CheckTilePermission(args.Player, x, y)) + { + args.Player.SendData(PacketTypes.SignNew, "", id); + return true; + } + + if (TShock.CheckRangePermission(args.Player, x, y)) + { + args.Player.SendData(PacketTypes.SignNew, "", id); + return true; + } + return false; + } + + private static bool UpdateNPCHome(GetDataHandlerArgs args) + { + var id = args.Data.ReadInt16(); + var x = args.Data.ReadInt16(); + var y = args.Data.ReadInt16(); + var homeless = args.Data.ReadInt8(); + + if (OnUpdateNPCHome(id, x, y, homeless)) + return true; + + if (!args.Player.Group.HasPermission(Permissions.movenpc)) + { + args.Player.SendMessage("You do not have permission to relocate NPCs.", Color.Red); + args.Player.SendData(PacketTypes.UpdateNPCHome, "", id, Main.npc[id].homeTileX, Main.npc[id].homeTileY, + Convert.ToByte(Main.npc[id].homeless)); + return true; + } + + if (TShock.CheckTilePermission(args.Player, x, y)) + { + args.Player.SendMessage( "You do not have access to modify this area.", Color.Red); + args.Player.SendData(PacketTypes.UpdateNPCHome, "", id, Main.npc[id].homeTileX, Main.npc[id].homeTileY, + Convert.ToByte(Main.npc[id].homeless)); + return true; + } + + //removed until NPC Home packet actually sends their home coords. + /*if (TShock.CheckRangePermission(args.Player, x, y)) + { + args.Player.SendData(PacketTypes.UpdateNPCHome, "", id, Main.npc[id].homeTileX, Main.npc[id].homeTileY, + Convert.ToByte(Main.npc[id].homeless)); + return true; + }*/ + return false; + } + + private static bool HandlePlayerBuff(GetDataHandlerArgs args) + { + var id = args.Data.ReadInt8(); + var type = args.Data.ReadInt8(); + var time = args.Data.ReadInt16(); + + if (OnPlayerBuff(id, type, time)) + return true; + + if (TShock.CheckIgnores(args.Player)) + { + args.Player.SendData(PacketTypes.PlayerBuff, "", id); + return true; + } + if (!TShock.Players[id].TPlayer.hostile) + { + args.Player.SendData(PacketTypes.PlayerBuff, "", id); + return true; + } + if (TShock.CheckRangePermission(args.Player, TShock.Players[id].TileX, TShock.Players[id].TileY, 50)) + { + args.Player.SendData(PacketTypes.PlayerBuff, "", id); + return true; + } + if ((DateTime.UtcNow - args.Player.LastThreat).TotalMilliseconds < 5000) + { + args.Player.SendData(PacketTypes.PlayerBuff, "", id); + return true; + } + + if (WhitelistBuffMaxTime[type] > 0 && time <= WhitelistBuffMaxTime[type]) + { + return false; + } + + args.Player.SendData(PacketTypes.PlayerBuff, "", id); + return true; + } + + private static bool HandleItemDrop(GetDataHandlerArgs args) + { + var id = args.Data.ReadInt16(); + var pos = new Vector2(args.Data.ReadSingle(), args.Data.ReadSingle()); + var vel = new Vector2(args.Data.ReadSingle(), args.Data.ReadSingle()); + var stacks = args.Data.ReadInt8(); + var prefix = args.Data.ReadInt8(); + var type = args.Data.ReadInt16(); + + if (OnItemDrop(id, pos, vel, stacks, prefix, type)) + return true; + + if (type == 0) //Item removed, let client do this to prevent item duplication client side + { + return false; + } + + if (TShock.CheckRangePermission(args.Player, (int) (pos.X/16f), (int) (pos.Y/16f))) + { + args.Player.SendData(PacketTypes.ItemDrop, "", id); + return true; + } + + Item item = new Item(); + item.netDefaults(type); + if (stacks > item.maxStack || TShock.Itembans.ItemIsBanned(item.name, args.Player)) + { + args.Player.SendData(PacketTypes.ItemDrop, "", id); + return true; + } + if ((TShock.Config.ServerSideInventory) && (DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond - args.Player.LoginMS < TShock.Config.LogonDiscardThreshold)) + { + //Player is probably trying to sneak items onto the server in their hands!!! + Log.ConsoleInfo(string.Format("Player {0} tried to sneak {1} onto the server!", args.Player.Name, item.name)); + args.Player.SendData(PacketTypes.ItemDrop, "", id); + return true; + + } + if (TShock.CheckIgnores(args.Player)) + { + args.Player.SendData(PacketTypes.ItemDrop, "", id); + return true; + } + + return false; + } + + private static bool HandlePlayerDamage(GetDataHandlerArgs args) + { + var id = args.Data.ReadInt8(); + var direction = args.Data.ReadInt8(); + var dmg = args.Data.ReadInt16(); + var pvp = args.Data.ReadInt8(); + var crit = args.Data.ReadInt8(); + + if (OnPlayerDamage(id, direction, dmg, pvp, crit)) + return true; + + int textlength = (int) (args.Data.Length - args.Data.Position - 1); + string deathtext = ""; + if (textlength > 0) + { + deathtext = Encoding.UTF8.GetString(args.Data.ReadBytes(textlength)); + /*if (!TShock.Utils.ValidString(deathtext)) + { + return true; + }*/ + } + + if (TShock.Players[id] == null) + return true; + + if (dmg > TShock.Config.MaxDamage && !args.Player.Group.HasPermission(Permissions.ignoredamagecap)) + { + args.Player.Disable(String.Format("Player damage exceeded {0}", TShock.Config.MaxDamage ) ); + args.Player.SendData(PacketTypes.PlayerHp, "", id); + args.Player.SendData(PacketTypes.PlayerUpdate, "", id); + return true; + } + + if (!TShock.Players[id].TPlayer.hostile) + { + args.Player.SendData(PacketTypes.PlayerHp, "", id); + args.Player.SendData(PacketTypes.PlayerUpdate, "", id); + return true; + } + + if (TShock.CheckIgnores(args.Player)) + { + args.Player.SendData(PacketTypes.PlayerHp, "", id); + args.Player.SendData(PacketTypes.PlayerUpdate, "", id); + return true; + } + + if (TShock.CheckRangePermission(args.Player, TShock.Players[id].TileX, TShock.Players[id].TileY, 100)) + { + args.Player.SendData(PacketTypes.PlayerHp, "", id); + args.Player.SendData(PacketTypes.PlayerUpdate, "", id); + return true; + } + + if ((DateTime.UtcNow - args.Player.LastThreat).TotalMilliseconds < 5000) + { + args.Player.SendData(PacketTypes.PlayerHp, "", id); + args.Player.SendData(PacketTypes.PlayerUpdate, "", id); + return true; + } + + return false; + } + + private static bool HandleNpcStrike(GetDataHandlerArgs args) + { + var id = args.Data.ReadInt8(); + var direction = args.Data.ReadInt8(); + var dmg = args.Data.ReadInt16(); + var pvp = args.Data.ReadInt8(); + var crit = args.Data.ReadInt8(); + + if (OnNPCStrike(id, direction, dmg, pvp, crit)) + return true; + + if (Main.npc[id] == null) + return true; + + if (dmg > TShock.Config.MaxDamage && !args.Player.Group.HasPermission(Permissions.ignoredamagecap)) + { + args.Player.Disable(String.Format("NPC damage exceeded {0}", TShock.Config.MaxDamage ) ); + args.Player.SendData(PacketTypes.NpcUpdate, "", id); + return true; + } + + if (TShock.CheckIgnores(args.Player)) + { + args.Player.SendData(PacketTypes.NpcUpdate, "", id); + return true; + } + + if (Main.npc[id].townNPC && !args.Player.Group.HasPermission(Permissions.movenpc)) + { + args.Player.SendMessage( "You don't have permission to move the NPC", Color.Yellow); + args.Player.SendData(PacketTypes.NpcUpdate, "", id); + return true; + } + + if (TShock.Config.RangeChecks && + TShock.CheckRangePermission(args.Player, (int) (Main.npc[id].position.X/16f), (int) (Main.npc[id].position.Y/16f), + 128)) + { + args.Player.SendData(PacketTypes.NpcUpdate, "", id); + return true; + } + + if ((DateTime.UtcNow - args.Player.LastThreat).TotalMilliseconds < 5000) + { + args.Player.SendData(PacketTypes.NpcUpdate, "", id); + return true; + } + + return false; + } + + private static bool HandleSpecial(GetDataHandlerArgs args) + { + var id = args.Data.ReadInt8(); + var type = args.Data.ReadInt8(); + + if (OnNPCSpecial(id, type)) + return true; + + if (type == 1 && TShock.Config.DisableDungeonGuardian) + { + args.Player.SendMessage("The Dungeon Guardian returned you to your spawn point", Color.Purple); + args.Player.Spawn(); + return true; + } + + return false; + } + + private static bool HandlePlayerAnimation(GetDataHandlerArgs args) + { + + if (OnPlayerAnimation()) + return true; + + if (TShock.CheckIgnores(args.Player)) + { + args.Player.SendData(PacketTypes.PlayerAnimation, "", args.Player.Index); + return true; + } + + if ((DateTime.UtcNow - args.Player.LastThreat).TotalMilliseconds < 5000) + { + args.Player.SendData(PacketTypes.PlayerAnimation, "", args.Player.Index); + return true; + } + + return false; + } + + private static bool HandlePlayerBuffUpdate(GetDataHandlerArgs args) + { + var id = args.Data.ReadInt8(); + + if (OnPlayerBuffUpdate(id)) + return true; + + for (int i = 0; i < 10; i++) + { + var buff = args.Data.ReadInt8(); + + if (buff == 10) + { + if (!args.Player.Group.HasPermission(Permissions.usebanneditem) && + TShock.Itembans.ItemIsBanned("Invisibility Potion", args.Player)) + buff = 0; + else if (TShock.Config.DisableInvisPvP && args.TPlayer.hostile) + buff = 0; + } + + args.TPlayer.buffType[i] = buff; + if (args.TPlayer.buffType[i] > 0) + { + args.TPlayer.buffTime[i] = 60; + } + else + { + args.TPlayer.buffTime[i] = 0; + } + } + NetMessage.SendData((int) PacketTypes.PlayerBuff, -1, args.Player.Index, "", args.Player.Index); + return true; + } + + private static bool HandleSpawnBoss(GetDataHandlerArgs args) + { + var spawnboss = false; + var invasion = -1; + var plr = args.Data.ReadInt32(); + var Type = args.Data.ReadInt32(); + spawnboss = (Type == 4 || Type == 13 || (Type == 50 || Type == 125) || (Type == 126 || Type == 134 || (Type == (int) sbyte.MaxValue || Type == 128))); + if (!spawnboss) + { + switch (Type) + { + case -1: + invasion = 1; + break; + case -2: + invasion = 2; + break; + } + } + if (spawnboss && !args.Player.Group.HasPermission(Permissions.summonboss)) + { + args.Player.SendMessage("You don't have permission to summon a boss.", Color.Red); + return true; + } + if (invasion != -1 && !args.Player.Group.HasPermission(Permissions.startinvasion)) + { + args.Player.SendMessage("You don't have permission to start an invasion.", Color.Red); + return true; + } + if (!spawnboss && invasion == -1) + return true; + if (plr != args.Player.Index) + return true; + + string boss; + switch (Type) + { + case -2: + boss = "the Snow Legion"; + break; + case -1: + boss = "a Goblin Invasion"; + break; + case 4: + boss = "the Eye of Cthulhu"; + break; + case 13: + boss = "the Eater of Worlds"; + break; + case 50: + boss = "the King Slime"; + break; + case 125: + boss = "Retinazer"; + break; + case 126: + boss = "Spazmatism"; + break; + case 134: + boss = "the Destroyer"; + break; + case sbyte.MaxValue: + boss = "Skeleton Prime"; + break; + case 128: + boss = "Skeleton Prime"; + break; + default: + boss = "error"; + break; + } + + TShock.Utils.SendLogs(string.Format("{0} summoned {1}", args.Player.Name, boss), Color.Red); + return false; + } + } +} diff --git a/TShockAPI/Group.cs b/TShockAPI/Group.cs index 8e36e51d..65747689 100644 --- a/TShockAPI/Group.cs +++ b/TShockAPI/Group.cs @@ -1,200 +1,200 @@ -/* -TShock, a server mod for Terraria -Copyright (C) 2011 The TShock Team - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ -using System; -using System.Linq; -using System.Collections.Generic; - -namespace TShockAPI -{ - public class Group - { - public readonly List permissions = new List(); - public readonly List negatedpermissions = new List(); - - public string Name { get; set; } - public Group Parent { get; set; } - public int Order { get; set; } - public string Prefix { get; set; } - public string Suffix { get; set; } - public string ParentName { get { return (null == Parent) ? "" : Parent.Name; } } - public string ChatColor - { - get { return string.Format("{0}{1}{2}", R.ToString("X2"), G.ToString("X2"), B.ToString("X2")); } - set - { - if (null != value) - { - string[] parts = value.Split(','); - if (3 == parts.Length) - { - byte r, g, b; - if (byte.TryParse(parts[0], out r) && byte.TryParse(parts[1], out g) && byte.TryParse(parts[2], out b)) - { - R = r; - G = g; - B = b; - return; - } - } - } - } - } - - public string Permissions - { - get - { - List all = new List(permissions); - negatedpermissions.ForEach(p => all.Add("!" + p)); - return string.Join(",", all); - } - set - { - permissions.Clear(); - negatedpermissions.Clear(); - if (null != value) - value.Split(',').ForEach(p => AddPermission(p.Trim())); - } - } - - public List TotalPermissions - { - get - { - var cur = this; - var traversed = new List(); - HashSet all = new HashSet(); - while (cur != null) - { - foreach (var perm in cur.permissions) - { - all.Add(perm); - } - - foreach (var perm in cur.negatedpermissions) - { - all.Remove(perm); - } - - if (traversed.Contains(cur)) - { - throw new Exception("Infinite group parenting ({0})".SFormat(cur.Name)); - } - traversed.Add(cur); - cur = cur.Parent; - } - return all.ToList(); - } - } - - public byte R = 255; - public byte G = 255; - public byte B = 255; - - public Group(string groupname, Group parentgroup = null, string chatcolor = "255,255,255", string permissions = null) - { - Name = groupname; - Parent = parentgroup; - ChatColor = chatcolor; - Permissions = permissions; - } - - public virtual bool HasPermission(string permission) - { - if (string.IsNullOrEmpty(permission)) - return true; - - var cur = this; - var traversed = new List(); - while (cur != null) - { - if (cur.negatedpermissions.Contains(permission)) - return false; - if (cur.permissions.Contains(permission)) - return true; - if (traversed.Contains(cur)) - { - throw new Exception("Infinite group parenting ({0})".SFormat(cur.Name)); - } - traversed.Add(cur); - cur = cur.Parent; - } - return false; - } - - public void NegatePermission(string permission) - { - // Avoid duplicates - if (!negatedpermissions.Contains(permission)) - { - negatedpermissions.Add(permission); - permissions.Remove(permission); // Ensure we don't have conflicting definitions for a permissions - } - } - - public void AddPermission(string permission) - { - if (permission.StartsWith("!")) - { - NegatePermission(permission.Substring(1)); - return; - } - // Avoid duplicates - if (!permissions.Contains(permission)) - { - permissions.Add(permission); - negatedpermissions.Remove(permission); // Ensure we don't have conflicting definitions for a permissions - } - } - - public void SetPermission(List permission) - { - permissions.Clear(); - negatedpermissions.Clear(); - permission.ForEach(p => AddPermission(p)); - } - - public void RemovePermission(string permission) - { - if (permission.StartsWith("!")) - { - negatedpermissions.Remove(permission.Substring(1)); - return; - } - permissions.Remove(permission); - } - } - - public class SuperAdminGroup : Group - { - public SuperAdminGroup() - : base("superadmin") - { - R = (byte) TShock.Config.SuperAdminChatRGB[0]; - G = (byte) TShock.Config.SuperAdminChatRGB[1]; - B = (byte) TShock.Config.SuperAdminChatRGB[2]; - Prefix = TShock.Config.SuperAdminChatPrefix; - Suffix = TShock.Config.SuperAdminChatSuffix; - } - - public override bool HasPermission(string permission) - { - return true; - } - } +/* +TShock, a server mod for Terraria +Copyright (C) 2011 The TShock Team + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ +using System; +using System.Linq; +using System.Collections.Generic; + +namespace TShockAPI +{ + public class Group + { + public readonly List permissions = new List(); + public readonly List negatedpermissions = new List(); + + public string Name { get; set; } + public Group Parent { get; set; } + public int Order { get; set; } + public string Prefix { get; set; } + public string Suffix { get; set; } + public string ParentName { get { return (null == Parent) ? "" : Parent.Name; } } + public string ChatColor + { + get { return string.Format("{0}{1}{2}", R.ToString("X2"), G.ToString("X2"), B.ToString("X2")); } + set + { + if (null != value) + { + string[] parts = value.Split(','); + if (3 == parts.Length) + { + byte r, g, b; + if (byte.TryParse(parts[0], out r) && byte.TryParse(parts[1], out g) && byte.TryParse(parts[2], out b)) + { + R = r; + G = g; + B = b; + return; + } + } + } + } + } + + public string Permissions + { + get + { + List all = new List(permissions); + negatedpermissions.ForEach(p => all.Add("!" + p)); + return string.Join(",", all); + } + set + { + permissions.Clear(); + negatedpermissions.Clear(); + if (null != value) + value.Split(',').ForEach(p => AddPermission(p.Trim())); + } + } + + public List TotalPermissions + { + get + { + var cur = this; + var traversed = new List(); + HashSet all = new HashSet(); + while (cur != null) + { + foreach (var perm in cur.permissions) + { + all.Add(perm); + } + + foreach (var perm in cur.negatedpermissions) + { + all.Remove(perm); + } + + if (traversed.Contains(cur)) + { + throw new Exception("Infinite group parenting ({0})".SFormat(cur.Name)); + } + traversed.Add(cur); + cur = cur.Parent; + } + return all.ToList(); + } + } + + public byte R = 255; + public byte G = 255; + public byte B = 255; + + public Group(string groupname, Group parentgroup = null, string chatcolor = "255,255,255", string permissions = null) + { + Name = groupname; + Parent = parentgroup; + ChatColor = chatcolor; + Permissions = permissions; + } + + public virtual bool HasPermission(string permission) + { + if (string.IsNullOrEmpty(permission)) + return true; + + var cur = this; + var traversed = new List(); + while (cur != null) + { + if (cur.negatedpermissions.Contains(permission)) + return false; + if (cur.permissions.Contains(permission)) + return true; + if (traversed.Contains(cur)) + { + throw new Exception("Infinite group parenting ({0})".SFormat(cur.Name)); + } + traversed.Add(cur); + cur = cur.Parent; + } + return false; + } + + public void NegatePermission(string permission) + { + // Avoid duplicates + if (!negatedpermissions.Contains(permission)) + { + negatedpermissions.Add(permission); + permissions.Remove(permission); // Ensure we don't have conflicting definitions for a permissions + } + } + + public void AddPermission(string permission) + { + if (permission.StartsWith("!")) + { + NegatePermission(permission.Substring(1)); + return; + } + // Avoid duplicates + if (!permissions.Contains(permission)) + { + permissions.Add(permission); + negatedpermissions.Remove(permission); // Ensure we don't have conflicting definitions for a permissions + } + } + + public void SetPermission(List permission) + { + permissions.Clear(); + negatedpermissions.Clear(); + permission.ForEach(p => AddPermission(p)); + } + + public void RemovePermission(string permission) + { + if (permission.StartsWith("!")) + { + negatedpermissions.Remove(permission.Substring(1)); + return; + } + permissions.Remove(permission); + } + } + + public class SuperAdminGroup : Group + { + public SuperAdminGroup() + : base("superadmin") + { + R = (byte) TShock.Config.SuperAdminChatRGB[0]; + G = (byte) TShock.Config.SuperAdminChatRGB[1]; + B = (byte) TShock.Config.SuperAdminChatRGB[2]; + Prefix = TShock.Config.SuperAdminChatPrefix; + Suffix = TShock.Config.SuperAdminChatSuffix; + } + + public override bool HasPermission(string permission) + { + return true; + } + } } \ No newline at end of file diff --git a/TShockAPI/Rest/RestCommand.cs b/TShockAPI/Rest/RestCommand.cs index 13c6b129..3e54a673 100644 --- a/TShockAPI/Rest/RestCommand.cs +++ b/TShockAPI/Rest/RestCommand.cs @@ -1,4 +1,4 @@ -/* +/* TShock, a server mod for Terraria Copyright (C) 2011 The TShock Team diff --git a/TShockAPI/Rest/RestManager.cs b/TShockAPI/Rest/RestManager.cs index edf5d8fe..e653bffe 100644 --- a/TShockAPI/Rest/RestManager.cs +++ b/TShockAPI/Rest/RestManager.cs @@ -298,7 +298,7 @@ namespace TShockAPI if (ret is RestObject) return ret; - User user = (User)ret; + User user = (User)ret; return new RestObject() { { "group", user.Group }, { "id", user.ID.ToString() }, { "name", user.Name } }; } diff --git a/TShockAPI/Rest/RestObject.cs b/TShockAPI/Rest/RestObject.cs index 130e2ec8..c2593f44 100644 --- a/TShockAPI/Rest/RestObject.cs +++ b/TShockAPI/Rest/RestObject.cs @@ -1,4 +1,4 @@ -/* +/* TShock, a server mod for Terraria Copyright (C) 2011 The TShock Team diff --git a/TShockAPI/Rest/RestVerbs.cs b/TShockAPI/Rest/RestVerbs.cs index 8dd84f50..ddd9a2cd 100644 --- a/TShockAPI/Rest/RestVerbs.cs +++ b/TShockAPI/Rest/RestVerbs.cs @@ -1,4 +1,4 @@ -/* +/* TShock, a server mod for Terraria Copyright (C) 2011 The TShock Team diff --git a/TShockAPI/TSPlayer.cs b/TShockAPI/TSPlayer.cs index 0dd7ff1f..5444d876 100644 --- a/TShockAPI/TSPlayer.cs +++ b/TShockAPI/TSPlayer.cs @@ -1,721 +1,721 @@ -/* -TShock, a server mod for Terraria -Copyright (C) 2011 The TShock Team - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.IO; -using System.Threading; -using Terraria; -using TShockAPI.Net; - -namespace TShockAPI -{ - public class TSPlayer - { - public static readonly TSServerPlayer Server = new TSServerPlayer(); - public static readonly TSPlayer All = new TSPlayer("All"); - public int TileKillThreshold { get; set; } - public int TilePlaceThreshold { get; set; } - public int TileLiquidThreshold { get; set; } - public int ProjectileThreshold { get; set; } - public Dictionary TilesDestroyed { get; protected set; } - public Dictionary TilesCreated { get; protected set; } - public int FirstMaxHP { get; set; } - public int FirstMaxMP { get; set; } - public Group Group { get; set; } - public bool ReceivedInfo { get; set; } - public int Index { get; protected set; } - public DateTime LastPvpChange; - public Point[] TempPoints = new Point[2]; - public int AwaitingTempPoint { get; set; } - public bool AwaitingName { get; set; } - public DateTime LastThreat { get; set; } - public DateTime LastTileChangeNotify { get; set; } - public bool InitSpawn; - public bool DisplayLogs = true; - public Vector2 oldSpawn = Vector2.Zero; - public TSPlayer LastWhisper; - public int LoginAttempts { get; set; } - public Vector2 TeleportCoords = new Vector2(-1, -1); - public Vector2 LastNetPosition = Vector2.Zero; - public string UserAccountName { get; set; } - public bool HasBeenSpammedWithBuildMessage; - public bool IsLoggedIn; - public int UserID = -1; - public bool HasBeenNaggedAboutLoggingIn; - public bool TPAllow = true; - public bool mute; - public bool TpLock; - private Player FakePlayer; - public bool RequestedSection; - public DateTime LastDeath { get; set; } - public bool Dead; - public string Country = "??"; - public int Difficulty; - private string CacheIP; - public string IgnoreActionsForInventory = "none"; - public string IgnoreActionsForCheating = "none"; - public string IgnoreActionsForDisabledArmor = "none"; - public bool IgnoreActionsForClearingTrashCan; - public PlayerData PlayerData; - public bool RequiresPassword; - public bool SilentKickInProgress; - public List IceTiles; - public long RPm = 1; - public long WPm = 1; - public long SPm = 1; - public long BPm = 1; - public long LoginMS; - public bool LoginHarassed = false; - public bool RealPlayer - { - get { return Index >= 0 && Index < Main.maxNetPlayers && Main.player[Index] != null; } - } - - public bool ConnectionAlive - { - get - { - return RealPlayer && - (Netplay.serverSock[Index] != null && Netplay.serverSock[Index].active && !Netplay.serverSock[Index].kill); - } - } - - public int State - { - get { return Netplay.serverSock[Index].state; } - set { Netplay.serverSock[Index].state = value; } - } - - public string IP - { - get - { - if (string.IsNullOrEmpty(CacheIP)) - return - CacheIP = - RealPlayer - ? (Netplay.serverSock[Index].tcpClient.Connected - ? TShock.Utils.GetRealIP(Netplay.serverSock[Index].tcpClient.Client.RemoteEndPoint.ToString()) - : "") - : ""; - else - return CacheIP; - } - } - - /// - /// Terraria Player - /// - public Player TPlayer - { - get { return FakePlayer ?? Main.player[Index]; } - } - - public string Name - { - get { return TPlayer.name; } - } - - public bool Active - { - get { return TPlayer != null && TPlayer.active; } - } - - public int Team - { - get { return TPlayer.team; } - } - - public float X - { - get { return RealPlayer ? TPlayer.position.X : Main.spawnTileX*16; } - } - - public float Y - { - get { return RealPlayer ? TPlayer.position.Y : Main.spawnTileY*16; } - } - - public int TileX - { - get { return (int) (X/16); } - } - - public int TileY - { - get { return (int) (Y/16); } - } - - public bool InventorySlotAvailable - { - get - { - bool flag = false; - if (RealPlayer) - { - for (int i = 0; i < 40; i++) //41 is trash can, 42-45 is coins, 46-49 is ammo - { - if (TPlayer.inventory[i] == null || !TPlayer.inventory[i].active || TPlayer.inventory[i].name == "") - { - flag = true; - break; - } - } - } - return flag; - } - } - - public TSPlayer(int index) - { - TilesDestroyed = new Dictionary(); - TilesCreated = new Dictionary(); - Index = index; - Group = new Group(TShock.Config.DefaultGuestGroupName); - IceTiles = new List(); - } - - protected TSPlayer(String playerName) - { - TilesDestroyed = new Dictionary(); - TilesCreated = new Dictionary(); - Index = -1; - FakePlayer = new Player {name = playerName, whoAmi = -1}; - Group = new Group(TShock.Config.DefaultGuestGroupName); - } - - public virtual void Disconnect(string reason) - { - SendData(PacketTypes.Disconnect, reason); - } - - public virtual void Flush() - { - var sock = Netplay.serverSock[Index]; - if (sock == null) - return; - - TShock.PacketBuffer.Flush(sock); - } - - - private void SendWorldInfo(int tilex, int tiley, bool fakeid) - { - using (var ms = new MemoryStream()) - { - var msg = new WorldInfoMsg - { - Time = (int) Main.time, - DayTime = Main.dayTime, - MoonPhase = (byte) Main.moonPhase, - BloodMoon = Main.bloodMoon, - MaxTilesX = Main.maxTilesX, - MaxTilesY = Main.maxTilesY, - SpawnX = tilex, - SpawnY = tiley, - WorldSurface = (int) Main.worldSurface, - RockLayer = (int) Main.rockLayer, - //Sending a fake world id causes the client to not be able to find a stored spawnx/y. - //This fixes the bed spawn point bug. With a fake world id it wont be able to find the bed spawn. - WorldID = !fakeid ? Main.worldID : -1, - WorldFlags = (WorldGen.shadowOrbSmashed ? WorldInfoFlag.OrbSmashed : WorldInfoFlag.None) | - (NPC.downedBoss1 ? WorldInfoFlag.DownedBoss1 : WorldInfoFlag.None) | - (NPC.downedBoss2 ? WorldInfoFlag.DownedBoss2 : WorldInfoFlag.None) | - (NPC.downedBoss3 ? WorldInfoFlag.DownedBoss3 : WorldInfoFlag.None) | - (Main.hardMode ? WorldInfoFlag.HardMode : WorldInfoFlag.None) | - (NPC.downedClown ? WorldInfoFlag.DownedClown : WorldInfoFlag.None), - WorldName = Main.worldName - }; - msg.PackFull(ms); - SendRawData(ms.ToArray()); - } - } - - public bool Teleport(int tilex, int tiley) - { - InitSpawn = false; - - SendWorldInfo(tilex, tiley, true); - - //150 Should avoid all client crash errors - //The error occurs when a tile trys to update which the client hasnt load yet, Clients only update tiles withen 150 blocks - //Try 300 if it does not work (Higher number - Longer load times - Less chance of error) - //Should we properly send sections so that clients don't get tiles twice? +/* +TShock, a server mod for Terraria +Copyright (C) 2011 The TShock Team + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Threading; +using Terraria; +using TShockAPI.Net; + +namespace TShockAPI +{ + public class TSPlayer + { + public static readonly TSServerPlayer Server = new TSServerPlayer(); + public static readonly TSPlayer All = new TSPlayer("All"); + public int TileKillThreshold { get; set; } + public int TilePlaceThreshold { get; set; } + public int TileLiquidThreshold { get; set; } + public int ProjectileThreshold { get; set; } + public Dictionary TilesDestroyed { get; protected set; } + public Dictionary TilesCreated { get; protected set; } + public int FirstMaxHP { get; set; } + public int FirstMaxMP { get; set; } + public Group Group { get; set; } + public bool ReceivedInfo { get; set; } + public int Index { get; protected set; } + public DateTime LastPvpChange; + public Point[] TempPoints = new Point[2]; + public int AwaitingTempPoint { get; set; } + public bool AwaitingName { get; set; } + public DateTime LastThreat { get; set; } + public DateTime LastTileChangeNotify { get; set; } + public bool InitSpawn; + public bool DisplayLogs = true; + public Vector2 oldSpawn = Vector2.Zero; + public TSPlayer LastWhisper; + public int LoginAttempts { get; set; } + public Vector2 TeleportCoords = new Vector2(-1, -1); + public Vector2 LastNetPosition = Vector2.Zero; + public string UserAccountName { get; set; } + public bool HasBeenSpammedWithBuildMessage; + public bool IsLoggedIn; + public int UserID = -1; + public bool HasBeenNaggedAboutLoggingIn; + public bool TPAllow = true; + public bool mute; + public bool TpLock; + private Player FakePlayer; + public bool RequestedSection; + public DateTime LastDeath { get; set; } + public bool Dead; + public string Country = "??"; + public int Difficulty; + private string CacheIP; + public string IgnoreActionsForInventory = "none"; + public string IgnoreActionsForCheating = "none"; + public string IgnoreActionsForDisabledArmor = "none"; + public bool IgnoreActionsForClearingTrashCan; + public PlayerData PlayerData; + public bool RequiresPassword; + public bool SilentKickInProgress; + public List IceTiles; + public long RPm = 1; + public long WPm = 1; + public long SPm = 1; + public long BPm = 1; + public long LoginMS; + public bool LoginHarassed = false; + public bool RealPlayer + { + get { return Index >= 0 && Index < Main.maxNetPlayers && Main.player[Index] != null; } + } + + public bool ConnectionAlive + { + get + { + return RealPlayer && + (Netplay.serverSock[Index] != null && Netplay.serverSock[Index].active && !Netplay.serverSock[Index].kill); + } + } + + public int State + { + get { return Netplay.serverSock[Index].state; } + set { Netplay.serverSock[Index].state = value; } + } + + public string IP + { + get + { + if (string.IsNullOrEmpty(CacheIP)) + return + CacheIP = + RealPlayer + ? (Netplay.serverSock[Index].tcpClient.Connected + ? TShock.Utils.GetRealIP(Netplay.serverSock[Index].tcpClient.Client.RemoteEndPoint.ToString()) + : "") + : ""; + else + return CacheIP; + } + } + + /// + /// Terraria Player + /// + public Player TPlayer + { + get { return FakePlayer ?? Main.player[Index]; } + } + + public string Name + { + get { return TPlayer.name; } + } + + public bool Active + { + get { return TPlayer != null && TPlayer.active; } + } + + public int Team + { + get { return TPlayer.team; } + } + + public float X + { + get { return RealPlayer ? TPlayer.position.X : Main.spawnTileX*16; } + } + + public float Y + { + get { return RealPlayer ? TPlayer.position.Y : Main.spawnTileY*16; } + } + + public int TileX + { + get { return (int) (X/16); } + } + + public int TileY + { + get { return (int) (Y/16); } + } + + public bool InventorySlotAvailable + { + get + { + bool flag = false; + if (RealPlayer) + { + for (int i = 0; i < 40; i++) //41 is trash can, 42-45 is coins, 46-49 is ammo + { + if (TPlayer.inventory[i] == null || !TPlayer.inventory[i].active || TPlayer.inventory[i].name == "") + { + flag = true; + break; + } + } + } + return flag; + } + } + + public TSPlayer(int index) + { + TilesDestroyed = new Dictionary(); + TilesCreated = new Dictionary(); + Index = index; + Group = new Group(TShock.Config.DefaultGuestGroupName); + IceTiles = new List(); + } + + protected TSPlayer(String playerName) + { + TilesDestroyed = new Dictionary(); + TilesCreated = new Dictionary(); + Index = -1; + FakePlayer = new Player {name = playerName, whoAmi = -1}; + Group = new Group(TShock.Config.DefaultGuestGroupName); + } + + public virtual void Disconnect(string reason) + { + SendData(PacketTypes.Disconnect, reason); + } + + public virtual void Flush() + { + var sock = Netplay.serverSock[Index]; + if (sock == null) + return; + + TShock.PacketBuffer.Flush(sock); + } + + + private void SendWorldInfo(int tilex, int tiley, bool fakeid) + { + using (var ms = new MemoryStream()) + { + var msg = new WorldInfoMsg + { + Time = (int) Main.time, + DayTime = Main.dayTime, + MoonPhase = (byte) Main.moonPhase, + BloodMoon = Main.bloodMoon, + MaxTilesX = Main.maxTilesX, + MaxTilesY = Main.maxTilesY, + SpawnX = tilex, + SpawnY = tiley, + WorldSurface = (int) Main.worldSurface, + RockLayer = (int) Main.rockLayer, + //Sending a fake world id causes the client to not be able to find a stored spawnx/y. + //This fixes the bed spawn point bug. With a fake world id it wont be able to find the bed spawn. + WorldID = !fakeid ? Main.worldID : -1, + WorldFlags = (WorldGen.shadowOrbSmashed ? WorldInfoFlag.OrbSmashed : WorldInfoFlag.None) | + (NPC.downedBoss1 ? WorldInfoFlag.DownedBoss1 : WorldInfoFlag.None) | + (NPC.downedBoss2 ? WorldInfoFlag.DownedBoss2 : WorldInfoFlag.None) | + (NPC.downedBoss3 ? WorldInfoFlag.DownedBoss3 : WorldInfoFlag.None) | + (Main.hardMode ? WorldInfoFlag.HardMode : WorldInfoFlag.None) | + (NPC.downedClown ? WorldInfoFlag.DownedClown : WorldInfoFlag.None), + WorldName = Main.worldName + }; + msg.PackFull(ms); + SendRawData(ms.ToArray()); + } + } + + public bool Teleport(int tilex, int tiley) + { + InitSpawn = false; + + SendWorldInfo(tilex, tiley, true); + + //150 Should avoid all client crash errors + //The error occurs when a tile trys to update which the client hasnt load yet, Clients only update tiles withen 150 blocks + //Try 300 if it does not work (Higher number - Longer load times - Less chance of error) + //Should we properly send sections so that clients don't get tiles twice? SendTileSquare(tilex, tiley, 150); /* //We shouldn't need this section anymore -it can prevent otherwise acceptable teleportation under some circumstances. - if (!SendTileSquare(tilex, tiley, 150)) - { - InitSpawn = true; - SendWorldInfo(Main.spawnTileX, Main.spawnTileY, false); - return false; - } - + if (!SendTileSquare(tilex, tiley, 150)) + { + InitSpawn = true; + SendWorldInfo(Main.spawnTileX, Main.spawnTileY, false); + return false; + } + */ - Spawn(-1, -1); - - SendWorldInfo(Main.spawnTileX, Main.spawnTileY, false); - - TPlayer.position.X = (float)(tilex * 16 + 8 - TPlayer.width /2); - TPlayer.position.Y = (float)(tiley * 16 - TPlayer.height); - //We need to send the tile data again to prevent clients from thinking they *really* destroyed blocks just now. - - SendTileSquare(tilex, tiley, 150); - - return true; - } - - public void Spawn() - { - Spawn(TPlayer.SpawnX, TPlayer.SpawnY); - } - - public void Spawn(int tilex, int tiley) - { - using (var ms = new MemoryStream()) - { - var msg = new SpawnMsg - { - PlayerIndex = (byte) Index, - TileX = tilex, - TileY = tiley - }; - msg.PackFull(ms); - SendRawData(ms.ToArray()); - } - } - - public void RemoveProjectile(int index, int owner) - { - using (var ms = new MemoryStream()) - { - var msg = new ProjectileRemoveMsg - { - Index = (short) index, - Owner = (byte) owner - }; - msg.PackFull(ms); - SendRawData(ms.ToArray()); - } - } - - public virtual bool SendTileSquare(int x, int y, int size = 10) - { - try - { - int num = (size - 1)/2; - int m_x=0; - int m_y=0; - - if (x - num <0){ - m_x=0; - }else{ - m_x = x - num; - } - - if (y - num <0){ - m_y=0; - }else{ - m_y = y - num; - } - - if (m_x + size > Main.maxTilesX){ - m_x=Main.maxTilesX - size; - } - - if (m_y + size > Main.maxTilesY){ - m_y=Main.maxTilesY - size; - } - - SendData(PacketTypes.TileSendSquare, "", size, m_x, m_y); - return true; - } - catch (IndexOutOfRangeException) - { - - // This is expected if square exceeds array. - } - catch (Exception ex) - { - Log.Error(ex.ToString()); - } - return false; - } - - public virtual void GiveItem(int type, string name, int width, int height, int stack, int prefix = 0) - { - int itemid = Item.NewItem((int) X, (int) Y, width, height, type, stack, true, prefix); - // This is for special pickaxe/hammers/swords etc - Main.item[itemid].SetDefaults(name); - // The set default overrides the wet and stack set by NewItem - Main.item[itemid].wet = Collision.WetCollision(Main.item[itemid].position, Main.item[itemid].width, - Main.item[itemid].height); - Main.item[itemid].stack = stack; - Main.item[itemid].owner = Index; - Main.item[itemid].prefix = (byte) prefix; - NetMessage.SendData((int) PacketTypes.ItemDrop, -1, -1, "", itemid, 0f, 0f, 0f); - NetMessage.SendData((int) PacketTypes.ItemOwner, -1, -1, "", itemid, 0f, 0f, 0f); - } - - public virtual void SendMessage(string msg) - { - SendMessage(msg, 0, 255, 0); - } - - public virtual void SendMessage(string msg, Color color) - { - SendMessage(msg, color.R, color.G, color.B); - } - - public virtual void SendMessage(string msg, byte red, byte green, byte blue) - { - SendData(PacketTypes.ChatText, msg, 255, red, green, blue); - } - - public virtual void DamagePlayer(int damage) - { - NetMessage.SendData((int) PacketTypes.PlayerDamage, -1, -1, "", Index, ((new Random()).Next(-1, 1)), damage, - (float) 0); - } - - public virtual void SetTeam(int team) - { - Main.player[Index].team = team; - SendData(PacketTypes.PlayerTeam, "", Index); - } - - public virtual void Disable(string reason = "") - { - LastThreat = DateTime.UtcNow; - SetBuff(33, 330, true); //Weak - SetBuff(32, 330, true); //Slow - SetBuff(23, 330, true); //Cursed - if (!string.IsNullOrEmpty(reason)) - Log.ConsoleInfo(string.Format("Player {0} has been disabled for {1}", Name, reason)); - - var trace = new StackTrace(); - StackFrame frame = null; - frame = trace.GetFrame(1); - if (frame != null && frame.GetMethod().DeclaringType != null) - Log.Debug(frame.GetMethod().DeclaringType.Name + " called Disable()"); - } - - public virtual void Whoopie(object time) - { - var time2 = (int) time; - var launch = DateTime.UtcNow; - var startname = Name; - SendMessage("You are now being annoyed.", Color.Red); - while ((DateTime.UtcNow - launch).TotalSeconds < time2 && startname == Name) - { - SendData(PacketTypes.NpcSpecial, number: Index, number2: 2f); - Thread.Sleep(50); - } - } - - public virtual void SetBuff(int type, int time = 3600, bool bypass = false) - { - if ((DateTime.UtcNow - LastThreat).TotalMilliseconds < 5000 && !bypass) - return; - - SendData(PacketTypes.PlayerAddBuff, number: Index, number2: type, number3: time); - } - - //Todo: Separate this into a few functions. SendTo, SendToAll, etc - public virtual void SendData(PacketTypes msgType, string text = "", int number = 0, float number2 = 0f, - float number3 = 0f, float number4 = 0f, int number5 = 0) - { - if (RealPlayer && !ConnectionAlive) - return; - - NetMessage.SendData((int) msgType, Index, -1, text, number, number2, number3, number4, number5); - } - - public virtual bool SendRawData(byte[] data) - { - if (!RealPlayer || !ConnectionAlive) - return false; - - return TShock.SendBytes(Netplay.serverSock[Index], data); - } - } - - public class TSRestPlayer : TSServerPlayer - { - internal List CommandReturn = new List(); - - public TSRestPlayer() - { - Group = new SuperAdminGroup(); - } - - public override void SendMessage(string msg) - { - SendMessage(msg, 0, 255, 0); - } - - public override void SendMessage(string msg, Color color) - { - SendMessage(msg, color.R, color.G, color.B); - } - - public override void SendMessage(string msg, byte red, byte green, byte blue) - { - CommandReturn.Add(msg); - } - - public List GetCommandOutput() - { - return CommandReturn; - } - } - - public class TSServerPlayer : TSPlayer - { - public TSServerPlayer() - : base("Server") - { - Group = new SuperAdminGroup(); - } - - public override void SendMessage(string msg) - { - SendMessage(msg, 0, 255, 0); - } - - public override void SendMessage(string msg, Color color) - { - SendMessage(msg, color.R, color.G, color.B); - } - - public override void SendMessage(string msg, byte red, byte green, byte blue) - { - Console.WriteLine(msg); - //RconHandler.Response += msg + "\n"; - } - - public void SetFullMoon(bool fullmoon) - { - Main.moonPhase = 0; - SetTime(false, 0); - } - - public void SetBloodMoon(bool bloodMoon) - { - Main.bloodMoon = bloodMoon; - SetTime(false, 0); - } - - public void SetTime(bool dayTime, double time) - { - Main.dayTime = dayTime; - Main.time = time; - NetMessage.SendData((int) PacketTypes.TimeSet, -1, -1, "", 0, 0, Main.sunModY, Main.moonModY); - NetMessage.syncPlayers(); - } - - public void SpawnNPC(int type, string name, int amount, int startTileX, int startTileY, int tileXRange = 100, - int tileYRange = 50) - { - for (int i = 0; i < amount; i++) - { - int spawnTileX; - int spawnTileY; - TShock.Utils.GetRandomClearTileWithInRange(startTileX, startTileY, tileXRange, tileYRange, out spawnTileX, - out spawnTileY); - int npcid = NPC.NewNPC(spawnTileX*16, spawnTileY*16, type, 0); - // This is for special slimes - Main.npc[npcid].SetDefaults(name); - } - } - - public void StrikeNPC(int npcid, int damage, float knockBack, int hitDirection) - { - Main.npc[npcid].StrikeNPC(damage, knockBack, hitDirection); - NetMessage.SendData((int) PacketTypes.NpcStrike, -1, -1, "", npcid, damage, knockBack, hitDirection); - } - - public void RevertTiles(Dictionary tiles) - { - // Update Main.Tile first so that when tile sqaure is sent it is correct - foreach (KeyValuePair entry in tiles) - { - Main.tile[(int) entry.Key.X, (int) entry.Key.Y].Data = entry.Value; - } - // Send all players updated tile sqaures - foreach (Vector2 coords in tiles.Keys) - { - All.SendTileSquare((int) coords.X, (int) coords.Y, 3); - } - } - } - - public class PlayerData - { - public NetItem[] inventory = new NetItem[NetItem.maxNetInventory]; - public int maxHealth = 100; - //public int maxMana = 100; - public bool exists; - - public PlayerData(TSPlayer player) - { - for (int i = 0; i < NetItem.maxNetInventory; i++) - { - this.inventory[i] = new NetItem(); - } - this.inventory[0].netID = -15; - this.inventory[0].stack = 1; - if (player.TPlayer.inventory[0] != null && player.TPlayer.inventory[0].netID == -15) - this.inventory[0].prefix = player.TPlayer.inventory[0].prefix; - this.inventory[1].netID = -13; - this.inventory[1].stack = 1; - if (player.TPlayer.inventory[1] != null && player.TPlayer.inventory[1].netID == -13) - this.inventory[1].prefix = player.TPlayer.inventory[1].prefix; - this.inventory[2].netID = -16; - this.inventory[2].stack = 1; - if (player.TPlayer.inventory[2] != null && player.TPlayer.inventory[2].netID == -16) - this.inventory[2].prefix = player.TPlayer.inventory[2].prefix; - } - - public void StoreSlot(int slot, int netID, int prefix, int stack) - { - if(slot > (this.inventory.Length - 1)) //if the slot is out of range then dont save - { - return; - } - - this.inventory[slot].netID = netID; - if (this.inventory[slot].netID != 0) - { - this.inventory[slot].stack = stack; - this.inventory[slot].prefix = prefix; - } - else - { - this.inventory[slot].stack = 0; - this.inventory[slot].prefix = 0; - } - } - - public void CopyInventory(TSPlayer player) - { - this.maxHealth = player.TPlayer.statLifeMax; - Item[] inventory = player.TPlayer.inventory; - Item[] armor = player.TPlayer.armor; - for (int i = 0; i < NetItem.maxNetInventory; i++) - { - if (i < 49) - { - if (player.TPlayer.inventory[i] != null) - { - this.inventory[i].netID = inventory[i].netID; - } - else - { - this.inventory[i].netID = 0; - } - - if (this.inventory[i].netID != 0) - { - this.inventory[i].stack = inventory[i].stack; - this.inventory[i].prefix = inventory[i].prefix; - } - else - { - this.inventory[i].stack = 0; - this.inventory[i].prefix = 0; - } - } - else - { - if (player.TPlayer.armor[i - 48] != null) - { - this.inventory[i].netID = armor[i - 48].netID; - } - else - { - this.inventory[i].netID = 0; - } - - if (this.inventory[i].netID != 0) - { - this.inventory[i].stack = armor[i - 48].stack; - this.inventory[i].prefix = armor[i - 48].prefix; - } - else - { - this.inventory[i].stack = 0; - this.inventory[i].prefix = 0; - } - } - } - } - } - - public class NetItem - { - public static int maxNetInventory = 59; - public int netID; - public int stack; - public int prefix; - - public static string ToString(NetItem[] inventory) - { - string inventoryString = ""; - for (int i = 0; i < maxNetInventory; i++) - { - if (i != 0) - inventoryString += "~"; - inventoryString += inventory[i].netID; - if (inventory[i].netID != 0) - { - inventoryString += "," + inventory[i].stack; - inventoryString += "," + inventory[i].prefix; - } - else - { - inventoryString += ",0,0"; - } - } - return inventoryString; - } - - public static NetItem[] Parse(string data) - { - NetItem[] inventory = new NetItem[maxNetInventory]; - int i; - for (i = 0; i < maxNetInventory; i++) - { - inventory[i] = new NetItem(); - } - string[] items = data.Split('~'); - i = 0; - foreach (string item in items) - { - string[] idata = item.Split(','); - inventory[i].netID = int.Parse(idata[0]); - inventory[i].stack = int.Parse(idata[1]); - inventory[i].prefix = int.Parse(idata[2]); - i++; - } - return inventory; - } - } -} + Spawn(-1, -1); + + SendWorldInfo(Main.spawnTileX, Main.spawnTileY, false); + + TPlayer.position.X = (float)(tilex * 16 + 8 - TPlayer.width /2); + TPlayer.position.Y = (float)(tiley * 16 - TPlayer.height); + //We need to send the tile data again to prevent clients from thinking they *really* destroyed blocks just now. + + SendTileSquare(tilex, tiley, 150); + + return true; + } + + public void Spawn() + { + Spawn(TPlayer.SpawnX, TPlayer.SpawnY); + } + + public void Spawn(int tilex, int tiley) + { + using (var ms = new MemoryStream()) + { + var msg = new SpawnMsg + { + PlayerIndex = (byte) Index, + TileX = tilex, + TileY = tiley + }; + msg.PackFull(ms); + SendRawData(ms.ToArray()); + } + } + + public void RemoveProjectile(int index, int owner) + { + using (var ms = new MemoryStream()) + { + var msg = new ProjectileRemoveMsg + { + Index = (short) index, + Owner = (byte) owner + }; + msg.PackFull(ms); + SendRawData(ms.ToArray()); + } + } + + public virtual bool SendTileSquare(int x, int y, int size = 10) + { + try + { + int num = (size - 1)/2; + int m_x=0; + int m_y=0; + + if (x - num <0){ + m_x=0; + }else{ + m_x = x - num; + } + + if (y - num <0){ + m_y=0; + }else{ + m_y = y - num; + } + + if (m_x + size > Main.maxTilesX){ + m_x=Main.maxTilesX - size; + } + + if (m_y + size > Main.maxTilesY){ + m_y=Main.maxTilesY - size; + } + + SendData(PacketTypes.TileSendSquare, "", size, m_x, m_y); + return true; + } + catch (IndexOutOfRangeException) + { + + // This is expected if square exceeds array. + } + catch (Exception ex) + { + Log.Error(ex.ToString()); + } + return false; + } + + public virtual void GiveItem(int type, string name, int width, int height, int stack, int prefix = 0) + { + int itemid = Item.NewItem((int) X, (int) Y, width, height, type, stack, true, prefix); + // This is for special pickaxe/hammers/swords etc + Main.item[itemid].SetDefaults(name); + // The set default overrides the wet and stack set by NewItem + Main.item[itemid].wet = Collision.WetCollision(Main.item[itemid].position, Main.item[itemid].width, + Main.item[itemid].height); + Main.item[itemid].stack = stack; + Main.item[itemid].owner = Index; + Main.item[itemid].prefix = (byte) prefix; + NetMessage.SendData((int) PacketTypes.ItemDrop, -1, -1, "", itemid, 0f, 0f, 0f); + NetMessage.SendData((int) PacketTypes.ItemOwner, -1, -1, "", itemid, 0f, 0f, 0f); + } + + public virtual void SendMessage(string msg) + { + SendMessage(msg, 0, 255, 0); + } + + public virtual void SendMessage(string msg, Color color) + { + SendMessage(msg, color.R, color.G, color.B); + } + + public virtual void SendMessage(string msg, byte red, byte green, byte blue) + { + SendData(PacketTypes.ChatText, msg, 255, red, green, blue); + } + + public virtual void DamagePlayer(int damage) + { + NetMessage.SendData((int) PacketTypes.PlayerDamage, -1, -1, "", Index, ((new Random()).Next(-1, 1)), damage, + (float) 0); + } + + public virtual void SetTeam(int team) + { + Main.player[Index].team = team; + SendData(PacketTypes.PlayerTeam, "", Index); + } + + public virtual void Disable(string reason = "") + { + LastThreat = DateTime.UtcNow; + SetBuff(33, 330, true); //Weak + SetBuff(32, 330, true); //Slow + SetBuff(23, 330, true); //Cursed + if (!string.IsNullOrEmpty(reason)) + Log.ConsoleInfo(string.Format("Player {0} has been disabled for {1}", Name, reason)); + + var trace = new StackTrace(); + StackFrame frame = null; + frame = trace.GetFrame(1); + if (frame != null && frame.GetMethod().DeclaringType != null) + Log.Debug(frame.GetMethod().DeclaringType.Name + " called Disable()"); + } + + public virtual void Whoopie(object time) + { + var time2 = (int) time; + var launch = DateTime.UtcNow; + var startname = Name; + SendMessage("You are now being annoyed.", Color.Red); + while ((DateTime.UtcNow - launch).TotalSeconds < time2 && startname == Name) + { + SendData(PacketTypes.NpcSpecial, number: Index, number2: 2f); + Thread.Sleep(50); + } + } + + public virtual void SetBuff(int type, int time = 3600, bool bypass = false) + { + if ((DateTime.UtcNow - LastThreat).TotalMilliseconds < 5000 && !bypass) + return; + + SendData(PacketTypes.PlayerAddBuff, number: Index, number2: type, number3: time); + } + + //Todo: Separate this into a few functions. SendTo, SendToAll, etc + public virtual void SendData(PacketTypes msgType, string text = "", int number = 0, float number2 = 0f, + float number3 = 0f, float number4 = 0f, int number5 = 0) + { + if (RealPlayer && !ConnectionAlive) + return; + + NetMessage.SendData((int) msgType, Index, -1, text, number, number2, number3, number4, number5); + } + + public virtual bool SendRawData(byte[] data) + { + if (!RealPlayer || !ConnectionAlive) + return false; + + return TShock.SendBytes(Netplay.serverSock[Index], data); + } + } + + public class TSRestPlayer : TSServerPlayer + { + internal List CommandReturn = new List(); + + public TSRestPlayer() + { + Group = new SuperAdminGroup(); + } + + public override void SendMessage(string msg) + { + SendMessage(msg, 0, 255, 0); + } + + public override void SendMessage(string msg, Color color) + { + SendMessage(msg, color.R, color.G, color.B); + } + + public override void SendMessage(string msg, byte red, byte green, byte blue) + { + CommandReturn.Add(msg); + } + + public List GetCommandOutput() + { + return CommandReturn; + } + } + + public class TSServerPlayer : TSPlayer + { + public TSServerPlayer() + : base("Server") + { + Group = new SuperAdminGroup(); + } + + public override void SendMessage(string msg) + { + SendMessage(msg, 0, 255, 0); + } + + public override void SendMessage(string msg, Color color) + { + SendMessage(msg, color.R, color.G, color.B); + } + + public override void SendMessage(string msg, byte red, byte green, byte blue) + { + Console.WriteLine(msg); + //RconHandler.Response += msg + "\n"; + } + + public void SetFullMoon(bool fullmoon) + { + Main.moonPhase = 0; + SetTime(false, 0); + } + + public void SetBloodMoon(bool bloodMoon) + { + Main.bloodMoon = bloodMoon; + SetTime(false, 0); + } + + public void SetTime(bool dayTime, double time) + { + Main.dayTime = dayTime; + Main.time = time; + NetMessage.SendData((int) PacketTypes.TimeSet, -1, -1, "", 0, 0, Main.sunModY, Main.moonModY); + NetMessage.syncPlayers(); + } + + public void SpawnNPC(int type, string name, int amount, int startTileX, int startTileY, int tileXRange = 100, + int tileYRange = 50) + { + for (int i = 0; i < amount; i++) + { + int spawnTileX; + int spawnTileY; + TShock.Utils.GetRandomClearTileWithInRange(startTileX, startTileY, tileXRange, tileYRange, out spawnTileX, + out spawnTileY); + int npcid = NPC.NewNPC(spawnTileX*16, spawnTileY*16, type, 0); + // This is for special slimes + Main.npc[npcid].SetDefaults(name); + } + } + + public void StrikeNPC(int npcid, int damage, float knockBack, int hitDirection) + { + Main.npc[npcid].StrikeNPC(damage, knockBack, hitDirection); + NetMessage.SendData((int) PacketTypes.NpcStrike, -1, -1, "", npcid, damage, knockBack, hitDirection); + } + + public void RevertTiles(Dictionary tiles) + { + // Update Main.Tile first so that when tile sqaure is sent it is correct + foreach (KeyValuePair entry in tiles) + { + Main.tile[(int) entry.Key.X, (int) entry.Key.Y].Data = entry.Value; + } + // Send all players updated tile sqaures + foreach (Vector2 coords in tiles.Keys) + { + All.SendTileSquare((int) coords.X, (int) coords.Y, 3); + } + } + } + + public class PlayerData + { + public NetItem[] inventory = new NetItem[NetItem.maxNetInventory]; + public int maxHealth = 100; + //public int maxMana = 100; + public bool exists; + + public PlayerData(TSPlayer player) + { + for (int i = 0; i < NetItem.maxNetInventory; i++) + { + this.inventory[i] = new NetItem(); + } + this.inventory[0].netID = -15; + this.inventory[0].stack = 1; + if (player.TPlayer.inventory[0] != null && player.TPlayer.inventory[0].netID == -15) + this.inventory[0].prefix = player.TPlayer.inventory[0].prefix; + this.inventory[1].netID = -13; + this.inventory[1].stack = 1; + if (player.TPlayer.inventory[1] != null && player.TPlayer.inventory[1].netID == -13) + this.inventory[1].prefix = player.TPlayer.inventory[1].prefix; + this.inventory[2].netID = -16; + this.inventory[2].stack = 1; + if (player.TPlayer.inventory[2] != null && player.TPlayer.inventory[2].netID == -16) + this.inventory[2].prefix = player.TPlayer.inventory[2].prefix; + } + + public void StoreSlot(int slot, int netID, int prefix, int stack) + { + if(slot > (this.inventory.Length - 1)) //if the slot is out of range then dont save + { + return; + } + + this.inventory[slot].netID = netID; + if (this.inventory[slot].netID != 0) + { + this.inventory[slot].stack = stack; + this.inventory[slot].prefix = prefix; + } + else + { + this.inventory[slot].stack = 0; + this.inventory[slot].prefix = 0; + } + } + + public void CopyInventory(TSPlayer player) + { + this.maxHealth = player.TPlayer.statLifeMax; + Item[] inventory = player.TPlayer.inventory; + Item[] armor = player.TPlayer.armor; + for (int i = 0; i < NetItem.maxNetInventory; i++) + { + if (i < 49) + { + if (player.TPlayer.inventory[i] != null) + { + this.inventory[i].netID = inventory[i].netID; + } + else + { + this.inventory[i].netID = 0; + } + + if (this.inventory[i].netID != 0) + { + this.inventory[i].stack = inventory[i].stack; + this.inventory[i].prefix = inventory[i].prefix; + } + else + { + this.inventory[i].stack = 0; + this.inventory[i].prefix = 0; + } + } + else + { + if (player.TPlayer.armor[i - 48] != null) + { + this.inventory[i].netID = armor[i - 48].netID; + } + else + { + this.inventory[i].netID = 0; + } + + if (this.inventory[i].netID != 0) + { + this.inventory[i].stack = armor[i - 48].stack; + this.inventory[i].prefix = armor[i - 48].prefix; + } + else + { + this.inventory[i].stack = 0; + this.inventory[i].prefix = 0; + } + } + } + } + } + + public class NetItem + { + public static int maxNetInventory = 59; + public int netID; + public int stack; + public int prefix; + + public static string ToString(NetItem[] inventory) + { + string inventoryString = ""; + for (int i = 0; i < maxNetInventory; i++) + { + if (i != 0) + inventoryString += "~"; + inventoryString += inventory[i].netID; + if (inventory[i].netID != 0) + { + inventoryString += "," + inventory[i].stack; + inventoryString += "," + inventory[i].prefix; + } + else + { + inventoryString += ",0,0"; + } + } + return inventoryString; + } + + public static NetItem[] Parse(string data) + { + NetItem[] inventory = new NetItem[maxNetInventory]; + int i; + for (i = 0; i < maxNetInventory; i++) + { + inventory[i] = new NetItem(); + } + string[] items = data.Split('~'); + i = 0; + foreach (string item in items) + { + string[] idata = item.Split(','); + inventory[i].netID = int.Parse(idata[0]); + inventory[i].stack = int.Parse(idata[1]); + inventory[i].prefix = int.Parse(idata[2]); + i++; + } + return inventory; + } + } +} diff --git a/TShockAPI/TShock.cs b/TShockAPI/TShock.cs index 218b9d87..78c56be6 100755 --- a/TShockAPI/TShock.cs +++ b/TShockAPI/TShock.cs @@ -1,1467 +1,1467 @@ -/* -TShock, a server mod for Terraria -Copyright (C) 2011 The TShock Team - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Data; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.Globalization; -using System.IO; -using System.Net; -using System.Reflection; -using System.Threading; -using Hooks; -using MaxMind; -using Mono.Data.Sqlite; -using MySql.Data.MySqlClient; -using Rests; -using Terraria; -using TShockAPI.DB; -using TShockAPI.Net; - -namespace TShockAPI -{ - [APIVersion(1, 11)] - public class TShock : TerrariaPlugin - { - public static readonly Version VersionNum = Assembly.GetExecutingAssembly().GetName().Version; - public static readonly string VersionCodename = "Squashing bugs, and adding suggestions"; - - public static string SavePath = "tshock"; - - public static TSPlayer[] Players = new TSPlayer[Main.maxPlayers]; - public static BanManager Bans; - public static WarpManager Warps; - public static RegionManager Regions; - public static BackupManager Backups; - public static GroupManager Groups; - public static UserManager Users; - public static ItemManager Itembans; - public static RemeberedPosManager RememberedPos; - public static InventoryManager InventoryDB; - public static ConfigFile Config { get; set; } - public static IDbConnection DB; - public static bool OverridePort; - public static PacketBufferer PacketBuffer; - public static GeoIPCountry Geo; - public static SecureRest RestApi; - public static RestManager RestManager; - public static Utils Utils = Utils.Instance; - public static StatTracker StatTracker = new StatTracker(); - /// - /// Used for implementing REST Tokens prior to the REST system starting up. - /// - public static Dictionary RESTStartupTokens = new Dictionary(); - - /// - /// Called after TShock is initialized. Useful for plugins that needs hooks before tshock but also depend on tshock being loaded. - /// - public static event Action Initialized; - - - public override Version Version - { - get { return VersionNum; } - } - - public override string Name - { - get { return "TShock"; } - } - - public override string Author - { - get { return "The Nyx Team"; } - } - - public override string Description - { - get { return "The administration modification of the future."; } - } - - public TShock(Main game) - : base(game) - { - Config = new ConfigFile(); - Order = 0; - } - - - [SuppressMessage("Microsoft.Security", "CA2122:DoNotIndirectlyExposeMethodsWithLinkDemands")] - public override void Initialize() - { - HandleCommandLine(Environment.GetCommandLineArgs()); - - if (!Directory.Exists(SavePath)) - Directory.CreateDirectory(SavePath); - - DateTime now = DateTime.Now; -#if DEBUG - Log.Initialize(Path.Combine(SavePath, now.ToString("yyyyMMddHHmmss")+".log"), LogLevel.All, false); -#else - Log.Initialize(Path.Combine(SavePath, now.ToString("yyyyMMddHHmmss")+".log"), LogLevel.All & ~LogLevel.Debug, false); -#endif - AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; - - try - { - if (File.Exists(Path.Combine(SavePath, "tshock.pid"))) - { - Log.ConsoleInfo( - "TShock was improperly shut down. Please avoid this in the future, world corruption may result from this."); - File.Delete(Path.Combine(SavePath, "tshock.pid")); - } - File.WriteAllText(Path.Combine(SavePath, "tshock.pid"), Process.GetCurrentProcess().Id.ToString(CultureInfo.InvariantCulture)); - - ConfigFile.ConfigRead += OnConfigRead; - FileTools.SetupConfig(); - - HandleCommandLinePostConfigLoad(Environment.GetCommandLineArgs()); - - if (Config.StorageType.ToLower() == "sqlite") - { - string sql = Path.Combine(SavePath, "tshock.sqlite"); - DB = new SqliteConnection(string.Format("uri=file://{0},Version=3", sql)); - } - else if (Config.StorageType.ToLower() == "mysql") - { - try - { - var hostport = Config.MySqlHost.Split(':'); - DB = new MySqlConnection(); - DB.ConnectionString = - String.Format("Server={0}; Port={1}; Database={2}; Uid={3}; Pwd={4};", - hostport[0], - hostport.Length > 1 ? hostport[1] : "3306", - Config.MySqlDbName, - Config.MySqlUsername, - Config.MySqlPassword - ); - } - catch (MySqlException ex) - { - Log.Error(ex.ToString()); - throw new Exception("MySql not setup correctly"); - } - } - else - { - throw new Exception("Invalid storage type"); - } - - Backups = new BackupManager(Path.Combine(SavePath, "backups")); - Backups.KeepFor = Config.BackupKeepFor; - Backups.Interval = Config.BackupInterval; - Bans = new BanManager(DB); - Warps = new WarpManager(DB); - Users = new UserManager(DB); - Groups = new GroupManager(DB); - Regions = new RegionManager(DB); - Itembans = new ItemManager(DB); - RememberedPos = new RemeberedPosManager(DB); - InventoryDB = new InventoryManager(DB); - RestApi = new SecureRest(Netplay.serverListenIP, Config.RestApiPort); - RestApi.Verify += RestApi_Verify; - RestApi.Port = Config.RestApiPort; - RestManager = new RestManager(RestApi); - RestManager.RegisterRestfulCommands(); - - var geoippath = Path.Combine(SavePath, "GeoIP.dat"); - if (Config.EnableGeoIP && File.Exists(geoippath)) - Geo = new GeoIPCountry(geoippath); - - Log.ConsoleInfo(string.Format("TerrariaShock Version {0} ({1}) now running.", Version, VersionCodename)); - - GameHooks.PostInitialize += OnPostInit; - GameHooks.Update += OnUpdate; - ServerHooks.Connect += OnConnect; - ServerHooks.Join += OnJoin; - ServerHooks.Leave += OnLeave; - ServerHooks.Chat += OnChat; - ServerHooks.Command += ServerHooks_OnCommand; - NetHooks.GetData += OnGetData; - NetHooks.SendData += NetHooks_SendData; - NetHooks.GreetPlayer += OnGreetPlayer; - NpcHooks.StrikeNpc += NpcHooks_OnStrikeNpc; - NpcHooks.SetDefaultsInt += OnNpcSetDefaults; - ProjectileHooks.SetDefaults += OnProjectileSetDefaults; - WorldHooks.StartHardMode += OnStartHardMode; - WorldHooks.SaveWorld += SaveManager.Instance.OnSaveWorld; - - GetDataHandlers.InitGetDataHandler(); - Commands.InitCommands(); - //RconHandler.StartThread(); - - if (Config.RestApiEnabled) - RestApi.Start(); - - if (Config.BufferPackets) - PacketBuffer = new PacketBufferer(); - - Log.ConsoleInfo("AutoSave " + (Config.AutoSave ? "Enabled" : "Disabled")); - Log.ConsoleInfo("Backups " + (Backups.Interval > 0 ? "Enabled" : "Disabled")); - - if (Initialized != null) - Initialized(); - } - catch (Exception ex) - { - Log.Error("Fatal Startup Exception"); - Log.Error(ex.ToString()); - Environment.Exit(1); - } - } - - private RestObject RestApi_Verify(string username, string password) - { - var userAccount = Users.GetUserByName(username); - if (userAccount == null) - { - return new RestObject("401") - {Error = "Invalid username/password combination provided. Please re-submit your query with a correct pair."}; - } - - if (Utils.HashPassword(password).ToUpper() != userAccount.Password.ToUpper()) - { - return new RestObject("401") - {Error = "Invalid username/password combination provided. Please re-submit your query with a correct pair."}; - } - - if (!Utils.GetGroup(userAccount.Group).HasPermission("api") && userAccount.Group != "superadmin") - { - return new RestObject("403") - { - Error = - "Although your account was successfully found and identified, your account lacks the permission required to use the API. (api)" - }; - } - - return new RestObject("200") {Response = "Successful login"}; //Maybe return some user info too? - } - - protected override void Dispose(bool disposing) - { - if (disposing) - { - // NOTE: order is important here - if (Geo != null) - { - Geo.Dispose(); - } - SaveManager.Instance.Dispose(); - - GameHooks.PostInitialize -= OnPostInit; - GameHooks.Update -= OnUpdate; - ServerHooks.Connect -= OnConnect; - ServerHooks.Join -= OnJoin; - ServerHooks.Leave -= OnLeave; - ServerHooks.Chat -= OnChat; - ServerHooks.Command -= ServerHooks_OnCommand; - NetHooks.GetData -= OnGetData; - NetHooks.SendData -= NetHooks_SendData; - NetHooks.GreetPlayer -= OnGreetPlayer; - NpcHooks.StrikeNpc -= NpcHooks_OnStrikeNpc; - NpcHooks.SetDefaultsInt -= OnNpcSetDefaults; - ProjectileHooks.SetDefaults -= OnProjectileSetDefaults; - WorldHooks.StartHardMode -= OnStartHardMode; - WorldHooks.SaveWorld -= SaveManager.Instance.OnSaveWorld; - - if (File.Exists(Path.Combine(SavePath, "tshock.pid"))) - { - File.Delete(Path.Combine(SavePath, "tshock.pid")); - } - - RestApi.Dispose(); - Log.Dispose(); - } - base.Dispose(disposing); - } - - /// - /// Handles exceptions that we didn't catch or that Red fucked up - /// - /// - /// - private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) - { - Log.Error(e.ExceptionObject.ToString()); - - if (e.ExceptionObject.ToString().Contains("Terraria.Netplay.ListenForClients") || - e.ExceptionObject.ToString().Contains("Terraria.Netplay.ServerLoop")) - { - var sb = new List(); - for (int i = 0; i < Netplay.serverSock.Length; i++) - { - if (Netplay.serverSock[i] == null) - { - sb.Add("Sock[" + i + "]"); - } - else if (Netplay.serverSock[i].tcpClient == null) - { - sb.Add("Tcp[" + i + "]"); - } - } - Log.Error(string.Join(", ", sb)); - } - - if (e.IsTerminating) - { - if (Main.worldPathName != null && Config.SaveWorldOnCrash) - { - Main.worldPathName += ".crash"; - SaveManager.Instance.SaveWorld(); - } - } - } - - private void HandleCommandLine(string[] parms) - { - for (int i = 0; i < parms.Length; i++) - { - if (parms[i].ToLower() == "-configpath") - { - var path = parms[++i]; - if (path.IndexOfAny(Path.GetInvalidPathChars()) == -1) - { - SavePath = path; - Log.ConsoleInfo("Config path has been set to " + path); - } - } - if (parms[i].ToLower() == "-worldpath") - { - var path = parms[++i]; - if (path.IndexOfAny(Path.GetInvalidPathChars()) == -1) - { - Main.WorldPath = path; - Log.ConsoleInfo("World path has been set to " + path); - } - } - if (parms[i].ToLower() == "-dump") - { - ConfigFile.DumpDescriptions(); - Permissions.DumpDescriptions(); - } - } - } - - public static void HandleCommandLinePostConfigLoad(string[] parms) - { - for (int i = 0; i < parms.Length; i++) - { - switch(parms[i].ToLower()) - { - case "-port": - int port = Convert.ToInt32(parms[++i]); - Netplay.serverPort = port; - Config.ServerPort = port; - OverridePort = true; - Log.ConsoleInfo("Port overridden by startup argument. Set to " + port); - break; - case "-rest-token": - string token = Convert.ToString(parms[++i]); - RESTStartupTokens.Add(token, "null"); - Console.WriteLine("Startup parameter overrode REST token."); - break; - case "-rest-enabled": - Config.RestApiEnabled = Convert.ToBoolean(parms[++i]); - Console.WriteLine("Startup parameter overrode REST enable."); - break; - case "-rest-port": - Config.RestApiPort = Convert.ToInt32(parms[++i]); - Console.WriteLine("Startup parameter overrode REST port."); - break; - case "-maxplayers": - case "-players": - Config.MaxSlots = Convert.ToInt32(parms[++i]); - Console.WriteLine("Startup parameter overrode maximum player slot configuration value."); - break; - } - } - } - - /* - * Hooks: - * - */ - - public static int AuthToken = -1; - - private void OnPostInit() - { - SetConsoleTitle(); - if (!File.Exists(Path.Combine(SavePath, "auth.lck")) && !File.Exists(Path.Combine(SavePath, "authcode.txt"))) - { - var r = new Random((int) DateTime.Now.ToBinary()); - AuthToken = r.Next(100000, 10000000); - Console.ForegroundColor = ConsoleColor.Yellow; - Console.WriteLine("TShock Notice: To become SuperAdmin, join the game and type /auth " + AuthToken); - Console.WriteLine("This token will display until disabled by verification. (/auth-verify)"); - Console.ForegroundColor = ConsoleColor.Gray; - FileTools.CreateFile(Path.Combine(SavePath, "authcode.txt")); - using (var tw = new StreamWriter(Path.Combine(SavePath, "authcode.txt"))) - { - tw.WriteLine(AuthToken); - } - } - else if (File.Exists(Path.Combine(SavePath, "authcode.txt"))) - { - using (var tr = new StreamReader(Path.Combine(SavePath, "authcode.txt"))) - { - AuthToken = Convert.ToInt32(tr.ReadLine()); - } - Console.ForegroundColor = ConsoleColor.Yellow; - Console.WriteLine( - "TShock Notice: authcode.txt is still present, and the AuthToken located in that file will be used."); - Console.WriteLine("To become superadmin, join the game and type /auth " + AuthToken); - Console.WriteLine("This token will display until disabled by verification. (/auth-verify)"); - Console.ForegroundColor = ConsoleColor.Gray; - } - else - { - AuthToken = 0; - } - Regions.ReloadAllRegions(); - - StatTracker.CheckIn(); - FixChestStacks(); - } - - private void FixChestStacks() - { - foreach (Chest chest in Main.chest) - { - if (chest != null) - { - foreach (Item item in chest.item) - { - if (item != null && item.stack > item.maxStack) - item.stack = item.maxStack; - } - } - } - } - - private DateTime LastCheck = DateTime.UtcNow; - private DateTime LastSave = DateTime.UtcNow; - - private void OnUpdate() - { - UpdateManager.UpdateProcedureCheck(); - StatTracker.CheckIn(); - if (Backups.IsBackupTime) - Backups.Backup(); - //call these every second, not every update - if ((DateTime.UtcNow - LastCheck).TotalSeconds >= 1) - { - OnSecondUpdate(); - LastCheck = DateTime.UtcNow; - } - - if ((DateTime.UtcNow - LastSave).TotalMinutes >= Config.ServerSideInventorySave) - { - foreach (TSPlayer player in Players) - { - // prevent null point exceptions - if (player != null && player.IsLoggedIn && !player.IgnoreActionsForClearingTrashCan) - { - - InventoryDB.InsertPlayerData(player); - } - } - LastSave = DateTime.UtcNow; - } - } - - private void OnSecondUpdate() - { - if (Config.ForceTime != "normal") - { - switch (Config.ForceTime) - { - case "day": - TSPlayer.Server.SetTime(true, 27000.0); - break; - case "night": - TSPlayer.Server.SetTime(false, 16200.0); - break; - } - } - int count = 0; - foreach (TSPlayer player in Players) - { - if (player != null && player.Active) - { - count++; - if (player.TilesDestroyed != null) - { - if (player.TileKillThreshold >= Config.TileKillThreshold) - { - player.Disable("Reached TileKill threshold"); - TSPlayer.Server.RevertTiles(player.TilesDestroyed); - player.TilesDestroyed.Clear(); - } - } - if (player.TileKillThreshold > 0) - { - player.TileKillThreshold = 0; - //We don't want to revert the entire map in case of a disable. - player.TilesDestroyed.Clear(); - } - if (player.TilesCreated != null) - { - if (player.TilePlaceThreshold >= Config.TilePlaceThreshold) - { - player.Disable("Reached TilePlace threshold"); - TSPlayer.Server.RevertTiles(player.TilesCreated); - player.TilesCreated.Clear(); - } - } - if (player.TilePlaceThreshold > 0) - { - player.TilePlaceThreshold = 0; - } - if (player.TileLiquidThreshold >= Config.TileLiquidThreshold) - { - player.Disable("Reached TileLiquid threshold"); - } - if (player.TileLiquidThreshold > 0) - { - player.TileLiquidThreshold = 0; - } - if (player.ProjectileThreshold >= Config.ProjectileThreshold) - { - player.Disable("Reached Projectile threshold"); - } - if (player.ProjectileThreshold > 0) - { - player.ProjectileThreshold = 0; - } - if (player.Dead && (DateTime.Now - player.LastDeath).Seconds >= 3 && player.Difficulty != 2) - { - player.Spawn(); - } - string check = "none"; - foreach (Item item in player.TPlayer.inventory) - { - if (!player.Group.HasPermission(Permissions.ignorestackhackdetection) && item.stack > item.maxStack && - item.type != 0) - { - check = "Remove Item " + item.name + " (" + item.stack + ") exceeds max stack of " + item.maxStack; - } - } - player.IgnoreActionsForCheating = check; - check = "none"; - foreach (Item item in player.TPlayer.armor) - { - if (!player.Group.HasPermission(Permissions.usebanneditem) && Itembans.ItemIsBanned(item.name, player)) - { - player.SetBuff(30, 120); //Bleeding - player.SetBuff(36, 120); //Broken Armor - check = "Remove Armor/Accessory " + item.name; - } - } - player.IgnoreActionsForDisabledArmor = check; - if (CheckIgnores(player)) - { - player.SetBuff(33, 120); //Weak - player.SetBuff(32, 120); //Slow - player.SetBuff(23, 120); //Cursed - } - else if (!player.Group.HasPermission(Permissions.usebanneditem) && - Itembans.ItemIsBanned(player.TPlayer.inventory[player.TPlayer.selectedItem].name, player)) - { - player.SetBuff(23, 120); //Cursed - } - } - } - SetConsoleTitle(); - } - - private void SetConsoleTitle() - { - Console.Title = string.Format("{0} - {1}/{2} @ {3}:{4} (TerrariaShock v{5})", Config.ServerName, Utils.ActivePlayers(), - Config.MaxSlots, Netplay.serverListenIP, Config.ServerPort, Version); - } - - private void OnConnect(int ply, HandledEventArgs handler) - { - var player = new TSPlayer(ply); - if (Config.EnableDNSHostResolution) - { - player.Group = Users.GetGroupForIPExpensive(player.IP); - } - else - { - player.Group = Users.GetGroupForIP(player.IP); - } - - if (Utils.ActivePlayers() + 1 > Config.MaxSlots + 20) - { - Utils.ForceKick(player, Config.ServerFullNoReservedReason); - handler.Handled = true; - return; - } - - var ipban = Bans.GetBanByIp(player.IP); - Ban ban = null; - if (ipban != null && Config.EnableIPBans) - ban = ipban; - - if (ban != null) - { - Utils.ForceKick(player, string.Format("You are banned: {0}", ban.Reason)); - handler.Handled = true; - return; - } - - if (!FileTools.OnWhitelist(player.IP)) - { - Utils.ForceKick(player, "Not on whitelist."); - handler.Handled = true; - return; - } - - if (Geo != null) - { - var code = Geo.TryGetCountryCode(IPAddress.Parse(player.IP)); - player.Country = code == null ? "N/A" : GeoIPCountry.GetCountryNameByCode(code); - if (code == "A1") - { - if (Config.KickProxyUsers) - { - Utils.ForceKick(player, "Proxies are not allowed"); - handler.Handled = true; - return; - } - } - } - Players[ply] = player; - } - - private void OnJoin(int ply, HandledEventArgs handler) - { - var player = Players[ply]; - if (player == null) - { - handler.Handled = true; - return; - } - - Ban ban = null; - if (Config.EnableBanOnUsernames) - { - var newban = Bans.GetBanByName(player.Name); - if (null != newban) - ban = newban; - } - - if (Config.EnableIPBans && null == ban) - { - ban = Bans.GetBanByIp(player.IP); - } - - if (ban != null) - { - Utils.ForceKick(player, string.Format("You are banned: {0}", ban.Reason)); - handler.Handled = true; - return; - } - } - - private void OnLeave(int ply) - { - - var tsplr = Players[ply]; - Players[ply] = null; - - if (tsplr != null && tsplr.ReceivedInfo) - { - if (!tsplr.SilentKickInProgress) - { - Utils.Broadcast(tsplr.Name + " left", Color.Yellow); - } - Log.Info(string.Format("{0} left.", tsplr.Name)); - - if (tsplr.IsLoggedIn && !tsplr.IgnoreActionsForClearingTrashCan) - { - tsplr.PlayerData.CopyInventory(tsplr); - InventoryDB.InsertPlayerData(tsplr); - } - - if ((Config.RememberLeavePos) &&(!tsplr.LoginHarassed)) - { - RememberedPos.InsertLeavePos(tsplr.Name, tsplr.IP, (int) (tsplr.X/16), (int) (tsplr.Y/16)); - } - } - } - - private void OnChat(messageBuffer msg, int ply, string text, HandledEventArgs e) - { - if (e.Handled) - return; - - var tsplr = Players[msg.whoAmI]; - if (tsplr == null) - { - e.Handled = true; - return; - } - - /*if (!Utils.ValidString(text)) - { - e.Handled = true; - return; - }*/ - - if (text.StartsWith("/")) - { - try - { - e.Handled = Commands.HandleCommand(tsplr, text); - } - catch (Exception ex) - { - Log.ConsoleError("Command exception"); - Log.Error(ex.ToString()); - } - } - else if (!tsplr.mute) - { - Utils.Broadcast( - String.Format(Config.ChatFormat, tsplr.Group.Name, tsplr.Group.Prefix, tsplr.Name, tsplr.Group.Suffix, text), - tsplr.Group.R, tsplr.Group.G, tsplr.Group.B); - e.Handled = true; - } - else if (tsplr.mute) - { - tsplr.SendMessage("You are muted!"); - e.Handled = true; - } - } - - /// - /// When a server command is run. - /// - /// - /// - private void ServerHooks_OnCommand(string text, HandledEventArgs e) - { - if (e.Handled) - return; - - // Damn you ThreadStatic and Redigit - if (Main.rand == null) - { - Main.rand = new Random(); - } - if (WorldGen.genRand == null) - { - WorldGen.genRand = new Random(); - } - - if (text.StartsWith("playing") || text.StartsWith("/playing")) - { - int count = 0; - foreach (TSPlayer player in Players) - { - if (player != null && player.Active) - { - count++; - TSPlayer.Server.SendMessage(string.Format("{0} ({1}) [{2}] <{3}>", player.Name, player.IP, - player.Group.Name, player.UserAccountName)); - } - } - TSPlayer.Server.SendMessage(string.Format("{0} players connected.", count)); - } - else if (text == "autosave") - { - Main.autoSave = Config.AutoSave = !Config.AutoSave; - Log.ConsoleInfo("AutoSave " + (Config.AutoSave ? "Enabled" : "Disabled")); - } - else if (text.StartsWith("/")) - { - Commands.HandleCommand(TSPlayer.Server, text); - } - else - { - Commands.HandleCommand(TSPlayer.Server, "/" + text); - } - e.Handled = true; - } - - private void OnGetData(GetDataEventArgs e) - { - if (e.Handled) - return; - - PacketTypes type = e.MsgID; - - Debug.WriteLine("Recv: {0:X}: {2} ({1:XX})", e.Msg.whoAmI, (byte) type, type); - - var player = Players[e.Msg.whoAmI]; - if (player == null) - { - e.Handled = true; - return; - } - - if (!player.ConnectionAlive) - { - e.Handled = true; - return; - } - - if (player.RequiresPassword && type != PacketTypes.PasswordSend) - { - e.Handled = true; - return; - } - - if ((player.State < 10 || player.Dead) && (int) type > 12 && (int) type != 16 && (int) type != 42 && (int) type != 50 && - (int) type != 38 && (int) type != 5 && (int) type != 21) - { - e.Handled = true; - return; - } - - using (var data = new MemoryStream(e.Msg.readBuffer, e.Index, e.Length)) - { - try - { - if (GetDataHandlers.HandlerGetData(type, player, data)) - e.Handled = true; - } - catch (Exception ex) - { - Log.Error(ex.ToString()); - } - } - } - - private void OnGreetPlayer(int who, HandledEventArgs e) - { - var player = Players[who]; - if (player == null) - { - e.Handled = true; - return; - } - player.LoginMS= DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond; - - Utils.ShowFileToUser(player, "motd.txt"); - - if (Config.PvPMode == "always" && !player.TPlayer.hostile) - { - player.SendMessage("PvP is forced! Enable PvP else you can't move or do anything!", Color.Red); - } - - if (!player.IsLoggedIn) - { - if (Config.ServerSideInventory) - { - player.SendMessage( - player.IgnoreActionsForInventory = "Server Side Inventory is enabled! Please /register or /login to play!", - Color.Red); - player.LoginHarassed = true; - } - else if (Config.RequireLogin) - { - player.SendMessage("Please /register or /login to play!", Color.Red); - player.LoginHarassed = true; - } - } - - if (player.Group.HasPermission(Permissions.causeevents) && Config.InfiniteInvasion) - { - StartInvasion(); - } - - player.LastNetPosition = new Vector2(Main.spawnTileX*16f, Main.spawnTileY*16f); - - if (Config.RememberLeavePos) - { - if (RememberedPos.GetLeavePos(player.Name, player.IP) != Vector2.Zero){ - var pos = RememberedPos.GetLeavePos(player.Name, player.IP); - - player.Teleport((int) pos.X, (int) pos.Y + 3); - }} - - e.Handled = true; - } - - private void NpcHooks_OnStrikeNpc(NpcStrikeEventArgs e) - { - if (Config.InfiniteInvasion) - { - IncrementKills(); - if (Main.invasionSize < 10) - { - Main.invasionSize = 20000000; - } - } - } - - private void OnProjectileSetDefaults(SetDefaultsEventArgs e) - { - if (e.Info == 43) - if (Config.DisableTombstones) - e.Object.SetDefaults(0); - if (e.Info == 75) - if (Config.DisableClownBombs) - e.Object.SetDefaults(0); - if (e.Info == 109) - if (Config.DisableSnowBalls) - e.Object.SetDefaults(0); - } - - private void OnNpcSetDefaults(SetDefaultsEventArgs e) - { - if (Itembans.ItemIsBanned(e.Object.name, null)) - { - e.Object.SetDefaults(0); - } - } - - /// - /// Send bytes to client using packetbuffering if available - /// - /// socket to send to - /// bytes to send - /// False on exception - public static bool SendBytes(ServerSock client, byte[] bytes) - { - if (PacketBuffer != null) - { - PacketBuffer.BufferBytes(client, bytes); - return true; - } - - return SendBytesBufferless(client, bytes); - } - - /// - /// Send bytes to a client ignoring the packet buffer - /// - /// socket to send to - /// bytes to send - /// False on exception - public static bool SendBytesBufferless(ServerSock client, byte[] bytes) - { - try - { - if (client.tcpClient.Connected) - client.networkStream.Write(bytes, 0, bytes.Length); - return true; - } - catch (Exception ex) - { - Log.Warn("This is a normal exception"); - Log.Warn(ex.ToString()); - } - return false; - } - - private void NetHooks_SendData(SendDataEventArgs e) - { - if (e.MsgID == PacketTypes.Disconnect) - { - Action senddisconnect = (sock, str) => - { - if (sock == null || !sock.active) - return; - sock.kill = true; - using (var ms = new MemoryStream()) - { - new DisconnectMsg {Reason = str}.PackFull(ms); - SendBytesBufferless(sock, ms.ToArray()); - } - }; - - if (e.remoteClient != -1) - { - senddisconnect(Netplay.serverSock[e.remoteClient], e.text); - } - else - { - for (int i = 0; i < Netplay.serverSock.Length; i++) - { - if (e.ignoreClient != -1 && e.ignoreClient == i) - continue; - - senddisconnect(Netplay.serverSock[i], e.text); - } - } - e.Handled = true; - } - } - - private void OnStartHardMode(HandledEventArgs e) - { - if (Config.DisableHardmode) - e.Handled = true; - } - - /* - * Useful stuff: - * */ - - public static void StartInvasion() - { - Main.invasionType = 1; - if (Config.InfiniteInvasion) - { - Main.invasionSize = 20000000; - } - else - { - Main.invasionSize = 100 + (Config.InvasionMultiplier*Utils.ActivePlayers()); - } - - Main.invasionWarn = 0; - if (new Random().Next(2) == 0) - { - Main.invasionX = 0.0; - } - else - { - Main.invasionX = Main.maxTilesX; - } - } - - private static int KillCount; - - public static void IncrementKills() - { - KillCount++; - Random r = new Random(); - int random = r.Next(5); - if (KillCount%100 == 0) - { - switch (random) - { - case 0: - Utils.Broadcast(string.Format("You call that a lot? {0} goblins killed!", KillCount)); - break; - case 1: - Utils.Broadcast(string.Format("Fatality! {0} goblins killed!", KillCount)); - break; - case 2: - Utils.Broadcast(string.Format("Number of 'noobs' killed to date: {0}", KillCount)); - break; - case 3: - Utils.Broadcast(string.Format("Duke Nukem would be proud. {0} goblins killed.", KillCount)); - break; - case 4: - Utils.Broadcast(string.Format("You call that a lot? {0} goblins killed!", KillCount)); - break; - case 5: - Utils.Broadcast(string.Format("{0} copies of Call of Duty smashed.", KillCount)); - break; - } - } - } - - public static bool CheckProjectilePermission(TSPlayer player, int index, int type) - { - if (type == 43) - { - return true; - } - - if (type == 17 && !player.Group.HasPermission(Permissions.usebanneditem) && Itembans.ItemIsBanned("Dirt Rod", player)) - //Dirt Rod Projectile - { - return true; - } - - if ((type == 42 || type == 65 || type == 68) && !player.Group.HasPermission(Permissions.usebanneditem) && - Itembans.ItemIsBanned("Sandgun", player)) //Sandgun Projectiles - { - return true; - } - - Projectile proj = new Projectile(); - proj.SetDefaults(type); - - if (!player.Group.HasPermission(Permissions.usebanneditem) && Itembans.ItemIsBanned(proj.name, player)) - { - return true; - } - - if (Main.projHostile[type]) - { - //player.SendMessage( proj.name, Color.Yellow); - return true; - } - - return false; - } - - public static bool CheckRangePermission(TSPlayer player, int x, int y, int range = 32) - { - if (Config.RangeChecks && ((Math.Abs(player.TileX - x) > range) || (Math.Abs(player.TileY - y) > range))) - { - return true; - } - return false; - } - - public static bool CheckTilePermission( TSPlayer player, int tileX, int tileY, byte tileType, byte actionType ) - { - if (!player.Group.HasPermission(Permissions.canbuild)) - { - if (TShock.Config.AllowIce && actionType != 1) - { - foreach (Point p in player.IceTiles) - { - if (p.X == tileX && p.Y == tileY && (Main.tile[p.X, p.Y].type == 0 || Main.tile[p.X, p.Y].type == 127)) - { - player.IceTiles.Remove(p); - return false; - } - } - if (((DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond) - player.BPm) > 2000){ - player.SendMessage("You do not have permission to build!", Color.Red); - player.BPm=DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond; - -} - return true; - } - - if (TShock.Config.AllowIce && actionType == 1 && tileType == 127) - { - player.IceTiles.Add(new Point(tileX, tileY)); - return false; - } - - if (((DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond) - player.BPm) > 2000){ - player.SendMessage("You do not have permission to build!", Color.Red); - player.BPm=DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond; - -} - return true; - - } - if (!player.Group.HasPermission(Permissions.editspawn) && !Regions.CanBuild(tileX, tileY, player) && - Regions.InArea(tileX, tileY)) - { - if (((DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond) - player.RPm) > 2000){ - player.SendMessage("Region protected from changes.", Color.Red); - player.RPm=DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond; - -} - return true; - } - if (Config.DisableBuild) - { - if (!player.Group.HasPermission(Permissions.editspawn)) - { - if (((DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond) - player.WPm) > 2000){ - player.SendMessage("World protected from changes.", Color.Red); - player.WPm=DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond; - -} - return true; - } - } - if (Config.SpawnProtection) - { - if (!player.Group.HasPermission(Permissions.editspawn)) - { - var flag = CheckSpawn(tileX, tileY); - if (flag) - { - if (((DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond) - player.SPm) > 2000){ - player.SendMessage("Spawn protected from changes.", Color.Red); - player.SPm=DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond; - } - return true; - } - } - } - return false; - } - - public static bool CheckTilePermission(TSPlayer player, int tileX, int tileY) - { - if (!player.Group.HasPermission(Permissions.canbuild)) - { - - if (((DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond) - player.BPm) > 2000){ - player.SendMessage("You do not have permission to build!", Color.Red); - player.BPm=DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond; - } - return true; - } - - if (!player.Group.HasPermission(Permissions.editspawn) && !Regions.CanBuild(tileX, tileY, player) && - Regions.InArea(tileX, tileY)) - { - - - if (((DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond) - player.RPm) > 2000){ - player.SendMessage("Region protected from changes.", Color.Red); - player.RPm=DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond; - } - return true; - } - - if (Config.DisableBuild) - { - if (!player.Group.HasPermission(Permissions.editspawn)) - { - if (((DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond) - player.WPm) > 2000){ - player.SendMessage("World protected from changes.", Color.Red); - player.WPm=DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond; - } - return true; - } - } - if (Config.SpawnProtection) - { - if (!player.Group.HasPermission(Permissions.editspawn)) - { - var flag = CheckSpawn(tileX, tileY); - if (flag) - { - if (((DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond) - player.SPm) > 1000){ - player.SendMessage("Spawn protected from changes.", Color.Red); - player.SPm=DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond; - - } - - - return true; - } - } - } - return false; - } - public static bool CheckSpawn(int x, int y) - { - Vector2 tile = new Vector2(x, y); - Vector2 spawn = new Vector2(Main.spawnTileX, Main.spawnTileY); - return Distance(spawn, tile) <= Config.SpawnProtectionRadius; - } - - public static float Distance(Vector2 value1, Vector2 value2) - { - float num2 = value1.X - value2.X; - float num = value1.Y - value2.Y; - float num3 = (num2*num2) + (num*num); - return (float) Math.Sqrt(num3); - } - - public static bool HackedHealth(TSPlayer player) - { - return (player.TPlayer.statManaMax > 400) || - (player.TPlayer.statMana > 400) || - (player.TPlayer.statLifeMax > 400) || - (player.TPlayer.statLife > 400); - } - - public static bool HackedInventory(TSPlayer player) - { - bool check = false; - - Item[] inventory = player.TPlayer.inventory; - Item[] armor = player.TPlayer.armor; - for (int i = 0; i < NetItem.maxNetInventory; i++) - { - if (i < 49) - { - Item item = new Item(); - if (inventory[i] != null && inventory[i].netID != 0) - { - item.netDefaults(inventory[i].netID); - item.Prefix(inventory[i].prefix); - item.AffixName(); - if (inventory[i].stack > item.maxStack) - { - check = true; - player.SendMessage( - String.Format("Stack cheat detected. Remove item {0} ({1}) and then rejoin", item.name, inventory[i].stack), - Color.Cyan); - } - } - } - else - { - Item item = new Item(); - if (armor[i - 48] != null && armor[i - 48].netID != 0) - { - item.netDefaults(armor[i - 48].netID); - item.Prefix(armor[i - 48].prefix); - item.AffixName(); - if (armor[i - 48].stack > item.maxStack) - { - check = true; - player.SendMessage( - String.Format("Stack cheat detected. Remove armor {0} ({1}) and then rejoin", item.name, armor[i - 48].stack), - Color.Cyan); - } - } - } - } - - return check; - } - - public static bool CheckInventory(TSPlayer player) - { - PlayerData playerData = player.PlayerData; - bool check = true; - - if (player.TPlayer.statLifeMax > playerData.maxHealth) - { - player.SendMessage("Error: Your max health exceeded (" + playerData.maxHealth + ") which is stored on server", - Color.Cyan); - check = false; - } - - Item[] inventory = player.TPlayer.inventory; - Item[] armor = player.TPlayer.armor; - for (int i = 0; i < NetItem.maxNetInventory; i++) - { - if (i < 49) - { - Item item = new Item(); - Item serverItem = new Item(); - if (inventory[i] != null && inventory[i].netID != 0) - { - if (playerData.inventory[i].netID != inventory[i].netID) - { - item.netDefaults(inventory[i].netID); - item.Prefix(inventory[i].prefix); - item.AffixName(); - player.SendMessage(player.IgnoreActionsForInventory = "Your item (" + item.name + ") needs to be deleted.", - Color.Cyan); - check = false; - } - else if (playerData.inventory[i].prefix != inventory[i].prefix) - { - item.netDefaults(inventory[i].netID); - item.Prefix(inventory[i].prefix); - item.AffixName(); - player.SendMessage(player.IgnoreActionsForInventory = "Your item (" + item.name + ") needs to be deleted.", - Color.Cyan); - check = false; - } - else if (inventory[i].stack > playerData.inventory[i].stack) - { - item.netDefaults(inventory[i].netID); - item.Prefix(inventory[i].prefix); - item.AffixName(); - player.SendMessage( - player.IgnoreActionsForInventory = - "Your item (" + item.name + ") (" + inventory[i].stack + ") needs to have it's stack decreased to (" + - playerData.inventory[i].stack + ").", Color.Cyan); - check = false; - } - } - } - else - { - Item item = new Item(); - Item serverItem = new Item(); - if (armor[i - 48] != null && armor[i - 48].netID != 0) - { - if (playerData.inventory[i].netID != armor[i - 48].netID) - { - item.netDefaults(armor[i - 48].netID); - item.Prefix(armor[i - 48].prefix); - item.AffixName(); - player.SendMessage(player.IgnoreActionsForInventory = "Your armor (" + item.name + ") needs to be deleted.", - Color.Cyan); - check = false; - } - else if (playerData.inventory[i].prefix != armor[i - 48].prefix) - { - item.netDefaults(armor[i - 48].netID); - item.Prefix(armor[i - 48].prefix); - item.AffixName(); - player.SendMessage(player.IgnoreActionsForInventory = "Your armor (" + item.name + ") needs to be deleted.", - Color.Cyan); - check = false; - } - else if (armor[i - 48].stack > playerData.inventory[i].stack) - { - item.netDefaults(armor[i - 48].netID); - item.Prefix(armor[i - 48].prefix); - item.AffixName(); - player.SendMessage( - player.IgnoreActionsForInventory = - "Your armor (" + item.name + ") (" + inventory[i].stack + ") needs to have it's stack decreased to (" + - playerData.inventory[i].stack + ").", Color.Cyan); - check = false; - } - } - } - } - - return check; - } - - public static bool CheckIgnores(TSPlayer player) - { - bool check = false; - if (Config.PvPMode == "always" && !player.TPlayer.hostile) - check = true; - if (player.IgnoreActionsForInventory != "none") - check = true; - if (player.IgnoreActionsForCheating != "none") - check = true; - if (player.IgnoreActionsForDisabledArmor != "none") - check = true; - if (player.IgnoreActionsForClearingTrashCan) - check = true; - if (!player.IsLoggedIn && Config.RequireLogin) - check = true; - return check; - } - - public void OnConfigRead(ConfigFile file) - { - NPC.defaultMaxSpawns = file.DefaultMaximumSpawns; - NPC.defaultSpawnRate = file.DefaultSpawnRate; - - Main.autoSave = file.AutoSave; - if (Backups != null) - { - Backups.KeepFor = file.BackupKeepFor; - Backups.Interval = file.BackupInterval; - } - if (!OverridePort) - { - Netplay.serverPort = file.ServerPort; - } - - if (file.MaxSlots > 235) - file.MaxSlots = 235; - Main.maxNetPlayers = file.MaxSlots + 20; - Netplay.password = ""; - Netplay.spamCheck = false; - - RconHandler.Password = file.RconPassword; - RconHandler.ListenPort = file.RconPort; - - Utils.HashAlgo = file.HashAlgorithm; - } - } -} +/* +TShock, a server mod for Terraria +Copyright (C) 2011 The TShock Team + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; +using System.Globalization; +using System.IO; +using System.Net; +using System.Reflection; +using System.Threading; +using Hooks; +using MaxMind; +using Mono.Data.Sqlite; +using MySql.Data.MySqlClient; +using Rests; +using Terraria; +using TShockAPI.DB; +using TShockAPI.Net; + +namespace TShockAPI +{ + [APIVersion(1, 11)] + public class TShock : TerrariaPlugin + { + public static readonly Version VersionNum = Assembly.GetExecutingAssembly().GetName().Version; + public static readonly string VersionCodename = "Squashing bugs, and adding suggestions"; + + public static string SavePath = "tshock"; + + public static TSPlayer[] Players = new TSPlayer[Main.maxPlayers]; + public static BanManager Bans; + public static WarpManager Warps; + public static RegionManager Regions; + public static BackupManager Backups; + public static GroupManager Groups; + public static UserManager Users; + public static ItemManager Itembans; + public static RemeberedPosManager RememberedPos; + public static InventoryManager InventoryDB; + public static ConfigFile Config { get; set; } + public static IDbConnection DB; + public static bool OverridePort; + public static PacketBufferer PacketBuffer; + public static GeoIPCountry Geo; + public static SecureRest RestApi; + public static RestManager RestManager; + public static Utils Utils = Utils.Instance; + public static StatTracker StatTracker = new StatTracker(); + /// + /// Used for implementing REST Tokens prior to the REST system starting up. + /// + public static Dictionary RESTStartupTokens = new Dictionary(); + + /// + /// Called after TShock is initialized. Useful for plugins that needs hooks before tshock but also depend on tshock being loaded. + /// + public static event Action Initialized; + + + public override Version Version + { + get { return VersionNum; } + } + + public override string Name + { + get { return "TShock"; } + } + + public override string Author + { + get { return "The Nyx Team"; } + } + + public override string Description + { + get { return "The administration modification of the future."; } + } + + public TShock(Main game) + : base(game) + { + Config = new ConfigFile(); + Order = 0; + } + + + [SuppressMessage("Microsoft.Security", "CA2122:DoNotIndirectlyExposeMethodsWithLinkDemands")] + public override void Initialize() + { + HandleCommandLine(Environment.GetCommandLineArgs()); + + if (!Directory.Exists(SavePath)) + Directory.CreateDirectory(SavePath); + + DateTime now = DateTime.Now; +#if DEBUG + Log.Initialize(Path.Combine(SavePath, now.ToString("yyyyMMddHHmmss")+".log"), LogLevel.All, false); +#else + Log.Initialize(Path.Combine(SavePath, now.ToString("yyyyMMddHHmmss")+".log"), LogLevel.All & ~LogLevel.Debug, false); +#endif + AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; + + try + { + if (File.Exists(Path.Combine(SavePath, "tshock.pid"))) + { + Log.ConsoleInfo( + "TShock was improperly shut down. Please avoid this in the future, world corruption may result from this."); + File.Delete(Path.Combine(SavePath, "tshock.pid")); + } + File.WriteAllText(Path.Combine(SavePath, "tshock.pid"), Process.GetCurrentProcess().Id.ToString(CultureInfo.InvariantCulture)); + + ConfigFile.ConfigRead += OnConfigRead; + FileTools.SetupConfig(); + + HandleCommandLinePostConfigLoad(Environment.GetCommandLineArgs()); + + if (Config.StorageType.ToLower() == "sqlite") + { + string sql = Path.Combine(SavePath, "tshock.sqlite"); + DB = new SqliteConnection(string.Format("uri=file://{0},Version=3", sql)); + } + else if (Config.StorageType.ToLower() == "mysql") + { + try + { + var hostport = Config.MySqlHost.Split(':'); + DB = new MySqlConnection(); + DB.ConnectionString = + String.Format("Server={0}; Port={1}; Database={2}; Uid={3}; Pwd={4};", + hostport[0], + hostport.Length > 1 ? hostport[1] : "3306", + Config.MySqlDbName, + Config.MySqlUsername, + Config.MySqlPassword + ); + } + catch (MySqlException ex) + { + Log.Error(ex.ToString()); + throw new Exception("MySql not setup correctly"); + } + } + else + { + throw new Exception("Invalid storage type"); + } + + Backups = new BackupManager(Path.Combine(SavePath, "backups")); + Backups.KeepFor = Config.BackupKeepFor; + Backups.Interval = Config.BackupInterval; + Bans = new BanManager(DB); + Warps = new WarpManager(DB); + Users = new UserManager(DB); + Groups = new GroupManager(DB); + Regions = new RegionManager(DB); + Itembans = new ItemManager(DB); + RememberedPos = new RemeberedPosManager(DB); + InventoryDB = new InventoryManager(DB); + RestApi = new SecureRest(Netplay.serverListenIP, Config.RestApiPort); + RestApi.Verify += RestApi_Verify; + RestApi.Port = Config.RestApiPort; + RestManager = new RestManager(RestApi); + RestManager.RegisterRestfulCommands(); + + var geoippath = Path.Combine(SavePath, "GeoIP.dat"); + if (Config.EnableGeoIP && File.Exists(geoippath)) + Geo = new GeoIPCountry(geoippath); + + Log.ConsoleInfo(string.Format("TerrariaShock Version {0} ({1}) now running.", Version, VersionCodename)); + + GameHooks.PostInitialize += OnPostInit; + GameHooks.Update += OnUpdate; + ServerHooks.Connect += OnConnect; + ServerHooks.Join += OnJoin; + ServerHooks.Leave += OnLeave; + ServerHooks.Chat += OnChat; + ServerHooks.Command += ServerHooks_OnCommand; + NetHooks.GetData += OnGetData; + NetHooks.SendData += NetHooks_SendData; + NetHooks.GreetPlayer += OnGreetPlayer; + NpcHooks.StrikeNpc += NpcHooks_OnStrikeNpc; + NpcHooks.SetDefaultsInt += OnNpcSetDefaults; + ProjectileHooks.SetDefaults += OnProjectileSetDefaults; + WorldHooks.StartHardMode += OnStartHardMode; + WorldHooks.SaveWorld += SaveManager.Instance.OnSaveWorld; + + GetDataHandlers.InitGetDataHandler(); + Commands.InitCommands(); + //RconHandler.StartThread(); + + if (Config.RestApiEnabled) + RestApi.Start(); + + if (Config.BufferPackets) + PacketBuffer = new PacketBufferer(); + + Log.ConsoleInfo("AutoSave " + (Config.AutoSave ? "Enabled" : "Disabled")); + Log.ConsoleInfo("Backups " + (Backups.Interval > 0 ? "Enabled" : "Disabled")); + + if (Initialized != null) + Initialized(); + } + catch (Exception ex) + { + Log.Error("Fatal Startup Exception"); + Log.Error(ex.ToString()); + Environment.Exit(1); + } + } + + private RestObject RestApi_Verify(string username, string password) + { + var userAccount = Users.GetUserByName(username); + if (userAccount == null) + { + return new RestObject("401") + {Error = "Invalid username/password combination provided. Please re-submit your query with a correct pair."}; + } + + if (Utils.HashPassword(password).ToUpper() != userAccount.Password.ToUpper()) + { + return new RestObject("401") + {Error = "Invalid username/password combination provided. Please re-submit your query with a correct pair."}; + } + + if (!Utils.GetGroup(userAccount.Group).HasPermission("api") && userAccount.Group != "superadmin") + { + return new RestObject("403") + { + Error = + "Although your account was successfully found and identified, your account lacks the permission required to use the API. (api)" + }; + } + + return new RestObject("200") {Response = "Successful login"}; //Maybe return some user info too? + } + + protected override void Dispose(bool disposing) + { + if (disposing) + { + // NOTE: order is important here + if (Geo != null) + { + Geo.Dispose(); + } + SaveManager.Instance.Dispose(); + + GameHooks.PostInitialize -= OnPostInit; + GameHooks.Update -= OnUpdate; + ServerHooks.Connect -= OnConnect; + ServerHooks.Join -= OnJoin; + ServerHooks.Leave -= OnLeave; + ServerHooks.Chat -= OnChat; + ServerHooks.Command -= ServerHooks_OnCommand; + NetHooks.GetData -= OnGetData; + NetHooks.SendData -= NetHooks_SendData; + NetHooks.GreetPlayer -= OnGreetPlayer; + NpcHooks.StrikeNpc -= NpcHooks_OnStrikeNpc; + NpcHooks.SetDefaultsInt -= OnNpcSetDefaults; + ProjectileHooks.SetDefaults -= OnProjectileSetDefaults; + WorldHooks.StartHardMode -= OnStartHardMode; + WorldHooks.SaveWorld -= SaveManager.Instance.OnSaveWorld; + + if (File.Exists(Path.Combine(SavePath, "tshock.pid"))) + { + File.Delete(Path.Combine(SavePath, "tshock.pid")); + } + + RestApi.Dispose(); + Log.Dispose(); + } + base.Dispose(disposing); + } + + /// + /// Handles exceptions that we didn't catch or that Red fucked up + /// + /// + /// + private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) + { + Log.Error(e.ExceptionObject.ToString()); + + if (e.ExceptionObject.ToString().Contains("Terraria.Netplay.ListenForClients") || + e.ExceptionObject.ToString().Contains("Terraria.Netplay.ServerLoop")) + { + var sb = new List(); + for (int i = 0; i < Netplay.serverSock.Length; i++) + { + if (Netplay.serverSock[i] == null) + { + sb.Add("Sock[" + i + "]"); + } + else if (Netplay.serverSock[i].tcpClient == null) + { + sb.Add("Tcp[" + i + "]"); + } + } + Log.Error(string.Join(", ", sb)); + } + + if (e.IsTerminating) + { + if (Main.worldPathName != null && Config.SaveWorldOnCrash) + { + Main.worldPathName += ".crash"; + SaveManager.Instance.SaveWorld(); + } + } + } + + private void HandleCommandLine(string[] parms) + { + for (int i = 0; i < parms.Length; i++) + { + if (parms[i].ToLower() == "-configpath") + { + var path = parms[++i]; + if (path.IndexOfAny(Path.GetInvalidPathChars()) == -1) + { + SavePath = path; + Log.ConsoleInfo("Config path has been set to " + path); + } + } + if (parms[i].ToLower() == "-worldpath") + { + var path = parms[++i]; + if (path.IndexOfAny(Path.GetInvalidPathChars()) == -1) + { + Main.WorldPath = path; + Log.ConsoleInfo("World path has been set to " + path); + } + } + if (parms[i].ToLower() == "-dump") + { + ConfigFile.DumpDescriptions(); + Permissions.DumpDescriptions(); + } + } + } + + public static void HandleCommandLinePostConfigLoad(string[] parms) + { + for (int i = 0; i < parms.Length; i++) + { + switch(parms[i].ToLower()) + { + case "-port": + int port = Convert.ToInt32(parms[++i]); + Netplay.serverPort = port; + Config.ServerPort = port; + OverridePort = true; + Log.ConsoleInfo("Port overridden by startup argument. Set to " + port); + break; + case "-rest-token": + string token = Convert.ToString(parms[++i]); + RESTStartupTokens.Add(token, "null"); + Console.WriteLine("Startup parameter overrode REST token."); + break; + case "-rest-enabled": + Config.RestApiEnabled = Convert.ToBoolean(parms[++i]); + Console.WriteLine("Startup parameter overrode REST enable."); + break; + case "-rest-port": + Config.RestApiPort = Convert.ToInt32(parms[++i]); + Console.WriteLine("Startup parameter overrode REST port."); + break; + case "-maxplayers": + case "-players": + Config.MaxSlots = Convert.ToInt32(parms[++i]); + Console.WriteLine("Startup parameter overrode maximum player slot configuration value."); + break; + } + } + } + + /* + * Hooks: + * + */ + + public static int AuthToken = -1; + + private void OnPostInit() + { + SetConsoleTitle(); + if (!File.Exists(Path.Combine(SavePath, "auth.lck")) && !File.Exists(Path.Combine(SavePath, "authcode.txt"))) + { + var r = new Random((int) DateTime.Now.ToBinary()); + AuthToken = r.Next(100000, 10000000); + Console.ForegroundColor = ConsoleColor.Yellow; + Console.WriteLine("TShock Notice: To become SuperAdmin, join the game and type /auth " + AuthToken); + Console.WriteLine("This token will display until disabled by verification. (/auth-verify)"); + Console.ForegroundColor = ConsoleColor.Gray; + FileTools.CreateFile(Path.Combine(SavePath, "authcode.txt")); + using (var tw = new StreamWriter(Path.Combine(SavePath, "authcode.txt"))) + { + tw.WriteLine(AuthToken); + } + } + else if (File.Exists(Path.Combine(SavePath, "authcode.txt"))) + { + using (var tr = new StreamReader(Path.Combine(SavePath, "authcode.txt"))) + { + AuthToken = Convert.ToInt32(tr.ReadLine()); + } + Console.ForegroundColor = ConsoleColor.Yellow; + Console.WriteLine( + "TShock Notice: authcode.txt is still present, and the AuthToken located in that file will be used."); + Console.WriteLine("To become superadmin, join the game and type /auth " + AuthToken); + Console.WriteLine("This token will display until disabled by verification. (/auth-verify)"); + Console.ForegroundColor = ConsoleColor.Gray; + } + else + { + AuthToken = 0; + } + Regions.ReloadAllRegions(); + + StatTracker.CheckIn(); + FixChestStacks(); + } + + private void FixChestStacks() + { + foreach (Chest chest in Main.chest) + { + if (chest != null) + { + foreach (Item item in chest.item) + { + if (item != null && item.stack > item.maxStack) + item.stack = item.maxStack; + } + } + } + } + + private DateTime LastCheck = DateTime.UtcNow; + private DateTime LastSave = DateTime.UtcNow; + + private void OnUpdate() + { + UpdateManager.UpdateProcedureCheck(); + StatTracker.CheckIn(); + if (Backups.IsBackupTime) + Backups.Backup(); + //call these every second, not every update + if ((DateTime.UtcNow - LastCheck).TotalSeconds >= 1) + { + OnSecondUpdate(); + LastCheck = DateTime.UtcNow; + } + + if ((DateTime.UtcNow - LastSave).TotalMinutes >= Config.ServerSideInventorySave) + { + foreach (TSPlayer player in Players) + { + // prevent null point exceptions + if (player != null && player.IsLoggedIn && !player.IgnoreActionsForClearingTrashCan) + { + + InventoryDB.InsertPlayerData(player); + } + } + LastSave = DateTime.UtcNow; + } + } + + private void OnSecondUpdate() + { + if (Config.ForceTime != "normal") + { + switch (Config.ForceTime) + { + case "day": + TSPlayer.Server.SetTime(true, 27000.0); + break; + case "night": + TSPlayer.Server.SetTime(false, 16200.0); + break; + } + } + int count = 0; + foreach (TSPlayer player in Players) + { + if (player != null && player.Active) + { + count++; + if (player.TilesDestroyed != null) + { + if (player.TileKillThreshold >= Config.TileKillThreshold) + { + player.Disable("Reached TileKill threshold"); + TSPlayer.Server.RevertTiles(player.TilesDestroyed); + player.TilesDestroyed.Clear(); + } + } + if (player.TileKillThreshold > 0) + { + player.TileKillThreshold = 0; + //We don't want to revert the entire map in case of a disable. + player.TilesDestroyed.Clear(); + } + if (player.TilesCreated != null) + { + if (player.TilePlaceThreshold >= Config.TilePlaceThreshold) + { + player.Disable("Reached TilePlace threshold"); + TSPlayer.Server.RevertTiles(player.TilesCreated); + player.TilesCreated.Clear(); + } + } + if (player.TilePlaceThreshold > 0) + { + player.TilePlaceThreshold = 0; + } + if (player.TileLiquidThreshold >= Config.TileLiquidThreshold) + { + player.Disable("Reached TileLiquid threshold"); + } + if (player.TileLiquidThreshold > 0) + { + player.TileLiquidThreshold = 0; + } + if (player.ProjectileThreshold >= Config.ProjectileThreshold) + { + player.Disable("Reached Projectile threshold"); + } + if (player.ProjectileThreshold > 0) + { + player.ProjectileThreshold = 0; + } + if (player.Dead && (DateTime.Now - player.LastDeath).Seconds >= 3 && player.Difficulty != 2) + { + player.Spawn(); + } + string check = "none"; + foreach (Item item in player.TPlayer.inventory) + { + if (!player.Group.HasPermission(Permissions.ignorestackhackdetection) && item.stack > item.maxStack && + item.type != 0) + { + check = "Remove Item " + item.name + " (" + item.stack + ") exceeds max stack of " + item.maxStack; + } + } + player.IgnoreActionsForCheating = check; + check = "none"; + foreach (Item item in player.TPlayer.armor) + { + if (!player.Group.HasPermission(Permissions.usebanneditem) && Itembans.ItemIsBanned(item.name, player)) + { + player.SetBuff(30, 120); //Bleeding + player.SetBuff(36, 120); //Broken Armor + check = "Remove Armor/Accessory " + item.name; + } + } + player.IgnoreActionsForDisabledArmor = check; + if (CheckIgnores(player)) + { + player.SetBuff(33, 120); //Weak + player.SetBuff(32, 120); //Slow + player.SetBuff(23, 120); //Cursed + } + else if (!player.Group.HasPermission(Permissions.usebanneditem) && + Itembans.ItemIsBanned(player.TPlayer.inventory[player.TPlayer.selectedItem].name, player)) + { + player.SetBuff(23, 120); //Cursed + } + } + } + SetConsoleTitle(); + } + + private void SetConsoleTitle() + { + Console.Title = string.Format("{0} - {1}/{2} @ {3}:{4} (TerrariaShock v{5})", Config.ServerName, Utils.ActivePlayers(), + Config.MaxSlots, Netplay.serverListenIP, Config.ServerPort, Version); + } + + private void OnConnect(int ply, HandledEventArgs handler) + { + var player = new TSPlayer(ply); + if (Config.EnableDNSHostResolution) + { + player.Group = Users.GetGroupForIPExpensive(player.IP); + } + else + { + player.Group = Users.GetGroupForIP(player.IP); + } + + if (Utils.ActivePlayers() + 1 > Config.MaxSlots + 20) + { + Utils.ForceKick(player, Config.ServerFullNoReservedReason); + handler.Handled = true; + return; + } + + var ipban = Bans.GetBanByIp(player.IP); + Ban ban = null; + if (ipban != null && Config.EnableIPBans) + ban = ipban; + + if (ban != null) + { + Utils.ForceKick(player, string.Format("You are banned: {0}", ban.Reason)); + handler.Handled = true; + return; + } + + if (!FileTools.OnWhitelist(player.IP)) + { + Utils.ForceKick(player, "Not on whitelist."); + handler.Handled = true; + return; + } + + if (Geo != null) + { + var code = Geo.TryGetCountryCode(IPAddress.Parse(player.IP)); + player.Country = code == null ? "N/A" : GeoIPCountry.GetCountryNameByCode(code); + if (code == "A1") + { + if (Config.KickProxyUsers) + { + Utils.ForceKick(player, "Proxies are not allowed"); + handler.Handled = true; + return; + } + } + } + Players[ply] = player; + } + + private void OnJoin(int ply, HandledEventArgs handler) + { + var player = Players[ply]; + if (player == null) + { + handler.Handled = true; + return; + } + + Ban ban = null; + if (Config.EnableBanOnUsernames) + { + var newban = Bans.GetBanByName(player.Name); + if (null != newban) + ban = newban; + } + + if (Config.EnableIPBans && null == ban) + { + ban = Bans.GetBanByIp(player.IP); + } + + if (ban != null) + { + Utils.ForceKick(player, string.Format("You are banned: {0}", ban.Reason)); + handler.Handled = true; + return; + } + } + + private void OnLeave(int ply) + { + + var tsplr = Players[ply]; + Players[ply] = null; + + if (tsplr != null && tsplr.ReceivedInfo) + { + if (!tsplr.SilentKickInProgress) + { + Utils.Broadcast(tsplr.Name + " left", Color.Yellow); + } + Log.Info(string.Format("{0} left.", tsplr.Name)); + + if (tsplr.IsLoggedIn && !tsplr.IgnoreActionsForClearingTrashCan) + { + tsplr.PlayerData.CopyInventory(tsplr); + InventoryDB.InsertPlayerData(tsplr); + } + + if ((Config.RememberLeavePos) &&(!tsplr.LoginHarassed)) + { + RememberedPos.InsertLeavePos(tsplr.Name, tsplr.IP, (int) (tsplr.X/16), (int) (tsplr.Y/16)); + } + } + } + + private void OnChat(messageBuffer msg, int ply, string text, HandledEventArgs e) + { + if (e.Handled) + return; + + var tsplr = Players[msg.whoAmI]; + if (tsplr == null) + { + e.Handled = true; + return; + } + + /*if (!Utils.ValidString(text)) + { + e.Handled = true; + return; + }*/ + + if (text.StartsWith("/")) + { + try + { + e.Handled = Commands.HandleCommand(tsplr, text); + } + catch (Exception ex) + { + Log.ConsoleError("Command exception"); + Log.Error(ex.ToString()); + } + } + else if (!tsplr.mute) + { + Utils.Broadcast( + String.Format(Config.ChatFormat, tsplr.Group.Name, tsplr.Group.Prefix, tsplr.Name, tsplr.Group.Suffix, text), + tsplr.Group.R, tsplr.Group.G, tsplr.Group.B); + e.Handled = true; + } + else if (tsplr.mute) + { + tsplr.SendMessage("You are muted!"); + e.Handled = true; + } + } + + /// + /// When a server command is run. + /// + /// + /// + private void ServerHooks_OnCommand(string text, HandledEventArgs e) + { + if (e.Handled) + return; + + // Damn you ThreadStatic and Redigit + if (Main.rand == null) + { + Main.rand = new Random(); + } + if (WorldGen.genRand == null) + { + WorldGen.genRand = new Random(); + } + + if (text.StartsWith("playing") || text.StartsWith("/playing")) + { + int count = 0; + foreach (TSPlayer player in Players) + { + if (player != null && player.Active) + { + count++; + TSPlayer.Server.SendMessage(string.Format("{0} ({1}) [{2}] <{3}>", player.Name, player.IP, + player.Group.Name, player.UserAccountName)); + } + } + TSPlayer.Server.SendMessage(string.Format("{0} players connected.", count)); + } + else if (text == "autosave") + { + Main.autoSave = Config.AutoSave = !Config.AutoSave; + Log.ConsoleInfo("AutoSave " + (Config.AutoSave ? "Enabled" : "Disabled")); + } + else if (text.StartsWith("/")) + { + Commands.HandleCommand(TSPlayer.Server, text); + } + else + { + Commands.HandleCommand(TSPlayer.Server, "/" + text); + } + e.Handled = true; + } + + private void OnGetData(GetDataEventArgs e) + { + if (e.Handled) + return; + + PacketTypes type = e.MsgID; + + Debug.WriteLine("Recv: {0:X}: {2} ({1:XX})", e.Msg.whoAmI, (byte) type, type); + + var player = Players[e.Msg.whoAmI]; + if (player == null) + { + e.Handled = true; + return; + } + + if (!player.ConnectionAlive) + { + e.Handled = true; + return; + } + + if (player.RequiresPassword && type != PacketTypes.PasswordSend) + { + e.Handled = true; + return; + } + + if ((player.State < 10 || player.Dead) && (int) type > 12 && (int) type != 16 && (int) type != 42 && (int) type != 50 && + (int) type != 38 && (int) type != 5 && (int) type != 21) + { + e.Handled = true; + return; + } + + using (var data = new MemoryStream(e.Msg.readBuffer, e.Index, e.Length)) + { + try + { + if (GetDataHandlers.HandlerGetData(type, player, data)) + e.Handled = true; + } + catch (Exception ex) + { + Log.Error(ex.ToString()); + } + } + } + + private void OnGreetPlayer(int who, HandledEventArgs e) + { + var player = Players[who]; + if (player == null) + { + e.Handled = true; + return; + } + player.LoginMS= DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond; + + Utils.ShowFileToUser(player, "motd.txt"); + + if (Config.PvPMode == "always" && !player.TPlayer.hostile) + { + player.SendMessage("PvP is forced! Enable PvP else you can't move or do anything!", Color.Red); + } + + if (!player.IsLoggedIn) + { + if (Config.ServerSideInventory) + { + player.SendMessage( + player.IgnoreActionsForInventory = "Server Side Inventory is enabled! Please /register or /login to play!", + Color.Red); + player.LoginHarassed = true; + } + else if (Config.RequireLogin) + { + player.SendMessage("Please /register or /login to play!", Color.Red); + player.LoginHarassed = true; + } + } + + if (player.Group.HasPermission(Permissions.causeevents) && Config.InfiniteInvasion) + { + StartInvasion(); + } + + player.LastNetPosition = new Vector2(Main.spawnTileX*16f, Main.spawnTileY*16f); + + if (Config.RememberLeavePos) + { + if (RememberedPos.GetLeavePos(player.Name, player.IP) != Vector2.Zero){ + var pos = RememberedPos.GetLeavePos(player.Name, player.IP); + + player.Teleport((int) pos.X, (int) pos.Y + 3); + }} + + e.Handled = true; + } + + private void NpcHooks_OnStrikeNpc(NpcStrikeEventArgs e) + { + if (Config.InfiniteInvasion) + { + IncrementKills(); + if (Main.invasionSize < 10) + { + Main.invasionSize = 20000000; + } + } + } + + private void OnProjectileSetDefaults(SetDefaultsEventArgs e) + { + if (e.Info == 43) + if (Config.DisableTombstones) + e.Object.SetDefaults(0); + if (e.Info == 75) + if (Config.DisableClownBombs) + e.Object.SetDefaults(0); + if (e.Info == 109) + if (Config.DisableSnowBalls) + e.Object.SetDefaults(0); + } + + private void OnNpcSetDefaults(SetDefaultsEventArgs e) + { + if (Itembans.ItemIsBanned(e.Object.name, null)) + { + e.Object.SetDefaults(0); + } + } + + /// + /// Send bytes to client using packetbuffering if available + /// + /// socket to send to + /// bytes to send + /// False on exception + public static bool SendBytes(ServerSock client, byte[] bytes) + { + if (PacketBuffer != null) + { + PacketBuffer.BufferBytes(client, bytes); + return true; + } + + return SendBytesBufferless(client, bytes); + } + + /// + /// Send bytes to a client ignoring the packet buffer + /// + /// socket to send to + /// bytes to send + /// False on exception + public static bool SendBytesBufferless(ServerSock client, byte[] bytes) + { + try + { + if (client.tcpClient.Connected) + client.networkStream.Write(bytes, 0, bytes.Length); + return true; + } + catch (Exception ex) + { + Log.Warn("This is a normal exception"); + Log.Warn(ex.ToString()); + } + return false; + } + + private void NetHooks_SendData(SendDataEventArgs e) + { + if (e.MsgID == PacketTypes.Disconnect) + { + Action senddisconnect = (sock, str) => + { + if (sock == null || !sock.active) + return; + sock.kill = true; + using (var ms = new MemoryStream()) + { + new DisconnectMsg {Reason = str}.PackFull(ms); + SendBytesBufferless(sock, ms.ToArray()); + } + }; + + if (e.remoteClient != -1) + { + senddisconnect(Netplay.serverSock[e.remoteClient], e.text); + } + else + { + for (int i = 0; i < Netplay.serverSock.Length; i++) + { + if (e.ignoreClient != -1 && e.ignoreClient == i) + continue; + + senddisconnect(Netplay.serverSock[i], e.text); + } + } + e.Handled = true; + } + } + + private void OnStartHardMode(HandledEventArgs e) + { + if (Config.DisableHardmode) + e.Handled = true; + } + + /* + * Useful stuff: + * */ + + public static void StartInvasion() + { + Main.invasionType = 1; + if (Config.InfiniteInvasion) + { + Main.invasionSize = 20000000; + } + else + { + Main.invasionSize = 100 + (Config.InvasionMultiplier*Utils.ActivePlayers()); + } + + Main.invasionWarn = 0; + if (new Random().Next(2) == 0) + { + Main.invasionX = 0.0; + } + else + { + Main.invasionX = Main.maxTilesX; + } + } + + private static int KillCount; + + public static void IncrementKills() + { + KillCount++; + Random r = new Random(); + int random = r.Next(5); + if (KillCount%100 == 0) + { + switch (random) + { + case 0: + Utils.Broadcast(string.Format("You call that a lot? {0} goblins killed!", KillCount)); + break; + case 1: + Utils.Broadcast(string.Format("Fatality! {0} goblins killed!", KillCount)); + break; + case 2: + Utils.Broadcast(string.Format("Number of 'noobs' killed to date: {0}", KillCount)); + break; + case 3: + Utils.Broadcast(string.Format("Duke Nukem would be proud. {0} goblins killed.", KillCount)); + break; + case 4: + Utils.Broadcast(string.Format("You call that a lot? {0} goblins killed!", KillCount)); + break; + case 5: + Utils.Broadcast(string.Format("{0} copies of Call of Duty smashed.", KillCount)); + break; + } + } + } + + public static bool CheckProjectilePermission(TSPlayer player, int index, int type) + { + if (type == 43) + { + return true; + } + + if (type == 17 && !player.Group.HasPermission(Permissions.usebanneditem) && Itembans.ItemIsBanned("Dirt Rod", player)) + //Dirt Rod Projectile + { + return true; + } + + if ((type == 42 || type == 65 || type == 68) && !player.Group.HasPermission(Permissions.usebanneditem) && + Itembans.ItemIsBanned("Sandgun", player)) //Sandgun Projectiles + { + return true; + } + + Projectile proj = new Projectile(); + proj.SetDefaults(type); + + if (!player.Group.HasPermission(Permissions.usebanneditem) && Itembans.ItemIsBanned(proj.name, player)) + { + return true; + } + + if (Main.projHostile[type]) + { + //player.SendMessage( proj.name, Color.Yellow); + return true; + } + + return false; + } + + public static bool CheckRangePermission(TSPlayer player, int x, int y, int range = 32) + { + if (Config.RangeChecks && ((Math.Abs(player.TileX - x) > range) || (Math.Abs(player.TileY - y) > range))) + { + return true; + } + return false; + } + + public static bool CheckTilePermission( TSPlayer player, int tileX, int tileY, byte tileType, byte actionType ) + { + if (!player.Group.HasPermission(Permissions.canbuild)) + { + if (TShock.Config.AllowIce && actionType != 1) + { + foreach (Point p in player.IceTiles) + { + if (p.X == tileX && p.Y == tileY && (Main.tile[p.X, p.Y].type == 0 || Main.tile[p.X, p.Y].type == 127)) + { + player.IceTiles.Remove(p); + return false; + } + } + if (((DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond) - player.BPm) > 2000){ + player.SendMessage("You do not have permission to build!", Color.Red); + player.BPm=DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond; + +} + return true; + } + + if (TShock.Config.AllowIce && actionType == 1 && tileType == 127) + { + player.IceTiles.Add(new Point(tileX, tileY)); + return false; + } + + if (((DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond) - player.BPm) > 2000){ + player.SendMessage("You do not have permission to build!", Color.Red); + player.BPm=DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond; + +} + return true; + + } + if (!player.Group.HasPermission(Permissions.editspawn) && !Regions.CanBuild(tileX, tileY, player) && + Regions.InArea(tileX, tileY)) + { + if (((DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond) - player.RPm) > 2000){ + player.SendMessage("Region protected from changes.", Color.Red); + player.RPm=DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond; + +} + return true; + } + if (Config.DisableBuild) + { + if (!player.Group.HasPermission(Permissions.editspawn)) + { + if (((DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond) - player.WPm) > 2000){ + player.SendMessage("World protected from changes.", Color.Red); + player.WPm=DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond; + +} + return true; + } + } + if (Config.SpawnProtection) + { + if (!player.Group.HasPermission(Permissions.editspawn)) + { + var flag = CheckSpawn(tileX, tileY); + if (flag) + { + if (((DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond) - player.SPm) > 2000){ + player.SendMessage("Spawn protected from changes.", Color.Red); + player.SPm=DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond; + } + return true; + } + } + } + return false; + } + + public static bool CheckTilePermission(TSPlayer player, int tileX, int tileY) + { + if (!player.Group.HasPermission(Permissions.canbuild)) + { + + if (((DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond) - player.BPm) > 2000){ + player.SendMessage("You do not have permission to build!", Color.Red); + player.BPm=DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond; + } + return true; + } + + if (!player.Group.HasPermission(Permissions.editspawn) && !Regions.CanBuild(tileX, tileY, player) && + Regions.InArea(tileX, tileY)) + { + + + if (((DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond) - player.RPm) > 2000){ + player.SendMessage("Region protected from changes.", Color.Red); + player.RPm=DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond; + } + return true; + } + + if (Config.DisableBuild) + { + if (!player.Group.HasPermission(Permissions.editspawn)) + { + if (((DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond) - player.WPm) > 2000){ + player.SendMessage("World protected from changes.", Color.Red); + player.WPm=DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond; + } + return true; + } + } + if (Config.SpawnProtection) + { + if (!player.Group.HasPermission(Permissions.editspawn)) + { + var flag = CheckSpawn(tileX, tileY); + if (flag) + { + if (((DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond) - player.SPm) > 1000){ + player.SendMessage("Spawn protected from changes.", Color.Red); + player.SPm=DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond; + + } + + + return true; + } + } + } + return false; + } + public static bool CheckSpawn(int x, int y) + { + Vector2 tile = new Vector2(x, y); + Vector2 spawn = new Vector2(Main.spawnTileX, Main.spawnTileY); + return Distance(spawn, tile) <= Config.SpawnProtectionRadius; + } + + public static float Distance(Vector2 value1, Vector2 value2) + { + float num2 = value1.X - value2.X; + float num = value1.Y - value2.Y; + float num3 = (num2*num2) + (num*num); + return (float) Math.Sqrt(num3); + } + + public static bool HackedHealth(TSPlayer player) + { + return (player.TPlayer.statManaMax > 400) || + (player.TPlayer.statMana > 400) || + (player.TPlayer.statLifeMax > 400) || + (player.TPlayer.statLife > 400); + } + + public static bool HackedInventory(TSPlayer player) + { + bool check = false; + + Item[] inventory = player.TPlayer.inventory; + Item[] armor = player.TPlayer.armor; + for (int i = 0; i < NetItem.maxNetInventory; i++) + { + if (i < 49) + { + Item item = new Item(); + if (inventory[i] != null && inventory[i].netID != 0) + { + item.netDefaults(inventory[i].netID); + item.Prefix(inventory[i].prefix); + item.AffixName(); + if (inventory[i].stack > item.maxStack) + { + check = true; + player.SendMessage( + String.Format("Stack cheat detected. Remove item {0} ({1}) and then rejoin", item.name, inventory[i].stack), + Color.Cyan); + } + } + } + else + { + Item item = new Item(); + if (armor[i - 48] != null && armor[i - 48].netID != 0) + { + item.netDefaults(armor[i - 48].netID); + item.Prefix(armor[i - 48].prefix); + item.AffixName(); + if (armor[i - 48].stack > item.maxStack) + { + check = true; + player.SendMessage( + String.Format("Stack cheat detected. Remove armor {0} ({1}) and then rejoin", item.name, armor[i - 48].stack), + Color.Cyan); + } + } + } + } + + return check; + } + + public static bool CheckInventory(TSPlayer player) + { + PlayerData playerData = player.PlayerData; + bool check = true; + + if (player.TPlayer.statLifeMax > playerData.maxHealth) + { + player.SendMessage("Error: Your max health exceeded (" + playerData.maxHealth + ") which is stored on server", + Color.Cyan); + check = false; + } + + Item[] inventory = player.TPlayer.inventory; + Item[] armor = player.TPlayer.armor; + for (int i = 0; i < NetItem.maxNetInventory; i++) + { + if (i < 49) + { + Item item = new Item(); + Item serverItem = new Item(); + if (inventory[i] != null && inventory[i].netID != 0) + { + if (playerData.inventory[i].netID != inventory[i].netID) + { + item.netDefaults(inventory[i].netID); + item.Prefix(inventory[i].prefix); + item.AffixName(); + player.SendMessage(player.IgnoreActionsForInventory = "Your item (" + item.name + ") needs to be deleted.", + Color.Cyan); + check = false; + } + else if (playerData.inventory[i].prefix != inventory[i].prefix) + { + item.netDefaults(inventory[i].netID); + item.Prefix(inventory[i].prefix); + item.AffixName(); + player.SendMessage(player.IgnoreActionsForInventory = "Your item (" + item.name + ") needs to be deleted.", + Color.Cyan); + check = false; + } + else if (inventory[i].stack > playerData.inventory[i].stack) + { + item.netDefaults(inventory[i].netID); + item.Prefix(inventory[i].prefix); + item.AffixName(); + player.SendMessage( + player.IgnoreActionsForInventory = + "Your item (" + item.name + ") (" + inventory[i].stack + ") needs to have it's stack decreased to (" + + playerData.inventory[i].stack + ").", Color.Cyan); + check = false; + } + } + } + else + { + Item item = new Item(); + Item serverItem = new Item(); + if (armor[i - 48] != null && armor[i - 48].netID != 0) + { + if (playerData.inventory[i].netID != armor[i - 48].netID) + { + item.netDefaults(armor[i - 48].netID); + item.Prefix(armor[i - 48].prefix); + item.AffixName(); + player.SendMessage(player.IgnoreActionsForInventory = "Your armor (" + item.name + ") needs to be deleted.", + Color.Cyan); + check = false; + } + else if (playerData.inventory[i].prefix != armor[i - 48].prefix) + { + item.netDefaults(armor[i - 48].netID); + item.Prefix(armor[i - 48].prefix); + item.AffixName(); + player.SendMessage(player.IgnoreActionsForInventory = "Your armor (" + item.name + ") needs to be deleted.", + Color.Cyan); + check = false; + } + else if (armor[i - 48].stack > playerData.inventory[i].stack) + { + item.netDefaults(armor[i - 48].netID); + item.Prefix(armor[i - 48].prefix); + item.AffixName(); + player.SendMessage( + player.IgnoreActionsForInventory = + "Your armor (" + item.name + ") (" + inventory[i].stack + ") needs to have it's stack decreased to (" + + playerData.inventory[i].stack + ").", Color.Cyan); + check = false; + } + } + } + } + + return check; + } + + public static bool CheckIgnores(TSPlayer player) + { + bool check = false; + if (Config.PvPMode == "always" && !player.TPlayer.hostile) + check = true; + if (player.IgnoreActionsForInventory != "none") + check = true; + if (player.IgnoreActionsForCheating != "none") + check = true; + if (player.IgnoreActionsForDisabledArmor != "none") + check = true; + if (player.IgnoreActionsForClearingTrashCan) + check = true; + if (!player.IsLoggedIn && Config.RequireLogin) + check = true; + return check; + } + + public void OnConfigRead(ConfigFile file) + { + NPC.defaultMaxSpawns = file.DefaultMaximumSpawns; + NPC.defaultSpawnRate = file.DefaultSpawnRate; + + Main.autoSave = file.AutoSave; + if (Backups != null) + { + Backups.KeepFor = file.BackupKeepFor; + Backups.Interval = file.BackupInterval; + } + if (!OverridePort) + { + Netplay.serverPort = file.ServerPort; + } + + if (file.MaxSlots > 235) + file.MaxSlots = 235; + Main.maxNetPlayers = file.MaxSlots + 20; + Netplay.password = ""; + Netplay.spamCheck = false; + + RconHandler.Password = file.RconPassword; + RconHandler.ListenPort = file.RconPort; + + Utils.HashAlgo = file.HashAlgorithm; + } + } +} diff --git a/TShockAPI/UpdateManager.cs b/TShockAPI/UpdateManager.cs index dcc28f20..cf0b375b 100644 --- a/TShockAPI/UpdateManager.cs +++ b/TShockAPI/UpdateManager.cs @@ -1,102 +1,102 @@ -/* -TShock, a server mod for Terraria -Copyright (C) 2011 The TShock Team - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ -using System; -using System.Collections.Generic; -using System.Net; -using System.Threading; -using Newtonsoft.Json; - -namespace TShockAPI -{ - internal class UpdateManager - { - private static string updateUrl = "http://shankshock.com/tshock-update.json"; - public static DateTime lastcheck = DateTime.MinValue; - - /// - /// Check once every X minutes. - /// - private static readonly int CheckXMinutes = 30; - - public static void UpdateProcedureCheck() - { - if ((DateTime.Now - lastcheck).TotalMinutes >= CheckXMinutes) - { - ThreadPool.QueueUserWorkItem(CheckUpdate); - lastcheck = DateTime.Now; - } - } - - public static void CheckUpdate(object o) - { - var updates = ServerIsOutOfDate(); - if (updates != null) - { - NotifyAdministrators(updates); - } - } - - /// - /// Checks to see if the server is out of date. - /// - /// - private static Dictionary ServerIsOutOfDate() - { - using (var client = new WebClient()) - { - client.Headers.Add("user-agent", - "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.0.3705;)"); - try - { - string updatejson = client.DownloadString(updateUrl); - var update = JsonConvert.DeserializeObject>(updatejson); - var version = new Version(update["version"]); - if (TShock.VersionNum.CompareTo(version) < 0) - return update; - } - catch (Exception e) - { - Log.Error(e.ToString()); - } - return null; - } - } - - private static void NotifyAdministrators(Dictionary update) - { - var changes = update["changes"].Split(new[] {'\n'}, StringSplitOptions.RemoveEmptyEntries); - NotifyAdministrator(TSPlayer.Server, changes); - foreach (TSPlayer player in TShock.Players) - { - if (player != null && player.Active && player.Group.HasPermission(Permissions.maintenance)) - { - NotifyAdministrator(player, changes); - } - } - } - - private static void NotifyAdministrator(TSPlayer player, string[] changes) - { - player.SendMessage("The server is out of date.", Color.Red); - for (int j = 0; j < changes.Length; j++) - { - player.SendMessage(changes[j], Color.Red); - } - } - } +/* +TShock, a server mod for Terraria +Copyright (C) 2011 The TShock Team + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ +using System; +using System.Collections.Generic; +using System.Net; +using System.Threading; +using Newtonsoft.Json; + +namespace TShockAPI +{ + internal class UpdateManager + { + private static string updateUrl = "http://shankshock.com/tshock-update.json"; + public static DateTime lastcheck = DateTime.MinValue; + + /// + /// Check once every X minutes. + /// + private static readonly int CheckXMinutes = 30; + + public static void UpdateProcedureCheck() + { + if ((DateTime.Now - lastcheck).TotalMinutes >= CheckXMinutes) + { + ThreadPool.QueueUserWorkItem(CheckUpdate); + lastcheck = DateTime.Now; + } + } + + public static void CheckUpdate(object o) + { + var updates = ServerIsOutOfDate(); + if (updates != null) + { + NotifyAdministrators(updates); + } + } + + /// + /// Checks to see if the server is out of date. + /// + /// + private static Dictionary ServerIsOutOfDate() + { + using (var client = new WebClient()) + { + client.Headers.Add("user-agent", + "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.0.3705;)"); + try + { + string updatejson = client.DownloadString(updateUrl); + var update = JsonConvert.DeserializeObject>(updatejson); + var version = new Version(update["version"]); + if (TShock.VersionNum.CompareTo(version) < 0) + return update; + } + catch (Exception e) + { + Log.Error(e.ToString()); + } + return null; + } + } + + private static void NotifyAdministrators(Dictionary update) + { + var changes = update["changes"].Split(new[] {'\n'}, StringSplitOptions.RemoveEmptyEntries); + NotifyAdministrator(TSPlayer.Server, changes); + foreach (TSPlayer player in TShock.Players) + { + if (player != null && player.Active && player.Group.HasPermission(Permissions.maintenance)) + { + NotifyAdministrator(player, changes); + } + } + } + + private static void NotifyAdministrator(TSPlayer player, string[] changes) + { + player.SendMessage("The server is out of date.", Color.Red); + for (int j = 0; j < changes.Length; j++) + { + player.SendMessage(changes[j], Color.Red); + } + } + } } \ No newline at end of file diff --git a/TShockAPI/Utils.cs b/TShockAPI/Utils.cs index d5caa544..2d2975ae 100644 --- a/TShockAPI/Utils.cs +++ b/TShockAPI/Utils.cs @@ -1,783 +1,783 @@ -/* -TShock, a server mod for Terraria -Copyright (C) 2011 The TShock Team - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Net; -using System.Net.Sockets; -using System.Security.Cryptography; -using System.Text; -using Terraria; - -namespace TShockAPI -{ - public class Utils - { - private readonly static int firstItemPrefix = 1; - private readonly static int lastItemPrefix = 83; - // Utils is a Singleton - private static readonly Utils instance = new Utils(); - private Utils() {} - public static Utils Instance { get { return instance; } } - - public Random Random = new Random(); - //private static List groups = new List(); - - /// - /// Provides the real IP address from a RemoteEndPoint string that contains a port and an IP - /// - /// A string IPv4 address in IP:PORT form. - /// A string IPv4 address. - public string GetRealIP(string mess) - { - return mess.Split(':')[0]; - } - - /// - /// Used for some places where a list of players might be used. - /// - /// String of players seperated by commas. - public string GetPlayers() - { - var sb = new StringBuilder(); - foreach (TSPlayer player in TShock.Players) - { - if (player != null && player.Active) - { - if (sb.Length != 0) - { - sb.Append(", "); - } - sb.Append(player.Name); - } - } - return sb.ToString(); - } - - /// - /// Used for some places where a list of players might be used. - /// - /// String of players and their id seperated by commas. - public string GetPlayersWithIds() - { - var sb = new StringBuilder(); - foreach (TSPlayer player in TShock.Players) - { - if (player != null && player.Active) - { - if (sb.Length != 0) - { - sb.Append(", "); - } - sb.Append(player.Name); - string id = "( " + Convert.ToString(TShock.Users.GetUserID(player.UserAccountName)) + " )"; - sb.Append(id); - } - } - return sb.ToString(); - } - - /// - /// Finds a player and gets IP as string - /// - /// Player name - public string GetPlayerIP(string playername) - { - foreach (TSPlayer player in TShock.Players) - { - if (player != null && player.Active) - { - if (playername.ToLower() == player.Name.ToLower()) - { - return player.IP; - } - } - } - return null; - } - - /// - /// It's a clamp function - /// - /// - /// Value to clamp - /// Maximum bounds of the clamp - /// Minimum bounds of the clamp - /// - public T Clamp(T value, T max, T min) - where T : IComparable - { - T result = value; - if (value.CompareTo(max) > 0) - result = max; - if (value.CompareTo(min) < 0) - result = min; - return result; - } - - /// - /// Saves the map data - /// - public void SaveWorld() - { - SaveManager.Instance.SaveWorld(); - } - - /// - /// Broadcasts a message to all players - /// - /// string message - public void Broadcast(string msg) - { - Broadcast(msg, Color.Green); - } - - public void Broadcast(string msg, byte red, byte green, byte blue) - { - TSPlayer.All.SendMessage(msg, red, green, blue); - TSPlayer.Server.SendMessage(msg, red, green, blue); - Log.Info(string.Format("Broadcast: {0}", msg)); - } - - public void Broadcast(string msg, Color color) - { - Broadcast(msg, color.R, color.G, color.B); - } - - /// - /// Sends message to all users with 'logs' permission. - /// - /// Message to send - /// Color of the message - public void SendLogs(string log, Color color) - { - Log.Info(log); - TSPlayer.Server.SendMessage(log, color); - foreach (TSPlayer player in TShock.Players) - { - if (player != null && player.Active && player.Group.HasPermission(Permissions.logs) && player.DisplayLogs && - TShock.Config.DisableSpewLogs == false) - player.SendMessage(log, color); - } - } - - /// - /// The number of active players on the server. - /// - /// int playerCount - public int ActivePlayers() - { - return Main.player.Where(p => null != p && p.active).Count(); - } - - /// - /// Finds a player ID based on name - /// - /// Player name - /// - public List FindPlayer(string ply) - { - var found = new List(); - // Avoid errors caused by null search - if (null == ply) - return found; - ply = ply.ToLower(); - foreach (TSPlayer player in TShock.Players) - { - if (player == null) - continue; - - string name = player.Name.ToLower(); - if (name.Equals(ply)) - return new List {player}; - if (name.Contains(ply)) - found.Add(player); - } - return found; - } - - /// - /// Gets a random clear tile in range - /// - /// Bound X - /// Bound Y - /// Range on the X axis - /// Range on the Y axis - /// X location - /// Y location - public void GetRandomClearTileWithInRange(int startTileX, int startTileY, int tileXRange, int tileYRange, - out int tileX, out int tileY) - { - int j = 0; - do - { - if (j == 100) - { - tileX = startTileX; - tileY = startTileY; - break; - } - - tileX = startTileX + Random.Next(tileXRange*-1, tileXRange); - tileY = startTileY + Random.Next(tileYRange*-1, tileYRange); - j++; - } while (TileValid(tileX, tileY) && !TileClear(tileX, tileY)); - } - - /// - /// Determines if a tile is valid - /// - /// Location X - /// Location Y - /// If the tile is valid - private bool TileValid(int tileX, int tileY) - { - return tileX >= 0 && tileX <= Main.maxTilesX && tileY >= 0 && tileY <= Main.maxTilesY; - } - - /// - /// Clears a tile - /// - /// Location X - /// Location Y - /// The state of the tile - private bool TileClear(int tileX, int tileY) - { - return !Main.tile[tileX, tileY].active; - } - - /// - /// Gets a list of items by ID or name - /// - /// Item ID or name - /// List of Items - public List GetItemByIdOrName(string idOrName) - { - int type = -1; - if (int.TryParse(idOrName, out type)) - { - return new List {GetItemById(type)}; - } - return GetItemByName(idOrName); - } - - /// - /// Gets an item by ID - /// - /// ID - /// Item - public Item GetItemById(int id) - { - Item item = new Item(); - item.netDefaults(id); - return item; - } - - /// - /// Gets items by name - /// - /// name - /// List of Items - public List GetItemByName(string name) - { - //Method #1 - must be exact match, allows support for different pickaxes/hammers/swords etc - for (int i = 1; i < Main.maxItemTypes; i++) - { - Item item = new Item(); - item.SetDefaults(name); - if (item.name == name) - return new List {item}; - } - //Method #2 - allows impartial matching - var found = new List(); - for (int i = -24; i < Main.maxItemTypes; i++) - { - try - { - Item item = new Item(); - item.netDefaults(i); - if (item.name.ToLower() == name.ToLower()) - return new List {item}; - if (item.name.ToLower().StartsWith(name.ToLower())) - found.Add(item); - } - catch - { - } - } - return found; - } - - /// - /// Gets an NPC by ID or Name - /// - /// - /// List of NPCs - public List GetNPCByIdOrName(string idOrName) - { - int type = -1; - if (int.TryParse(idOrName, out type)) - { - return new List {GetNPCById(type)}; - } - return GetNPCByName(idOrName); - } - - /// - /// Gets an NPC by ID - /// - /// ID - /// NPC - public NPC GetNPCById(int id) - { - NPC npc = new NPC(); - npc.netDefaults(id); - return npc; - } - - /// - /// Gets a NPC by name - /// - /// Name - /// List of matching NPCs - public List GetNPCByName(string name) - { - //Method #1 - must be exact match, allows support for different coloured slimes - for (int i = -17; i < Main.maxNPCTypes; i++) - { - NPC npc = new NPC(); - npc.SetDefaults(name); - if (npc.name == name) - return new List {npc}; - } - //Method #2 - allows impartial matching - var found = new List(); - for (int i = 1; i < Main.maxNPCTypes; i++) - { - NPC npc = new NPC(); - npc.netDefaults(i); - if (npc.name.ToLower() == name.ToLower()) - return new List {npc}; - if (npc.name.ToLower().StartsWith(name.ToLower())) - found.Add(npc); - } - return found; - } - - /// - /// Gets a buff name by id - /// - /// ID - /// name - public string GetBuffName(int id) - { - return (id > 0 && id < Main.maxBuffs) ? Main.buffName[id] : "null"; - } - - /// - /// Gets the description of a buff - /// - /// ID - /// description - public string GetBuffDescription(int id) - { - return (id > 0 && id < Main.maxBuffs) ? Main.buffTip[id] : "null"; - } - - /// - /// Gets a list of buffs by name - /// - /// name - /// Matching list of buff ids - public List GetBuffByName(string name) - { - for (int i = 1; i < Main.maxBuffs; i++) - { - if (Main.buffName[i].ToLower() == name) - return new List {i}; - } - var found = new List(); - for (int i = 1; i < Main.maxBuffs; i++) - { - if (Main.buffName[i].ToLower().StartsWith(name.ToLower())) - found.Add(i); - } - return found; - } - - /// - /// Gets a prefix based on its id - /// - /// ID - /// Prefix name - public string GetPrefixById(int id) - { - var item = new Item(); - item.SetDefaults(0); - item.prefix = (byte) id; - item.AffixName(); - return item.name.Trim(); - } - - /// - /// Gets a list of prefixes by name - /// - /// Name - /// List of prefix IDs - public List GetPrefixByName(string name) - { - Item item = new Item(); - item.SetDefaults(0); - string lowerName = name.ToLower(); - var found = new List(); - for (int i = firstItemPrefix; i <= lastItemPrefix; i++) - { - try - { - item.prefix = (byte)i; - string trimmed = item.AffixName().Trim(); - if (trimmed == name) - { - // Exact match - found.Add(i); - return found; - } - else - { - string trimmedLower = trimmed.ToLower(); - if (trimmedLower == lowerName) - { - // Exact match (caseinsensitive) - found.Add(i); - return found; - } - else if (trimmedLower.StartsWith(lowerName)) // Partial match - found.Add(i); - } - } - catch - { - } - } - return found; - } - - /// - /// Gets a prefix by ID or name - /// - /// ID or name - /// List of prefix IDs - public List GetPrefixByIdOrName(string idOrName) - { - int type = -1; - if (int.TryParse(idOrName, out type) && type >= firstItemPrefix && type <= lastItemPrefix) - { - return new List {type}; - } - return GetPrefixByName(idOrName); - } - - /// - /// Kicks all player from the server without checking for immunetokick permission. - /// - /// int player - /// string reason - public void ForceKickAll(string reason) - { - foreach (TSPlayer player in TShock.Players) - { - if (player != null && player.Active) - { - ForceKick(player, reason); - } - } - } - - /// - /// Stops the server after kicking all players with a reason message, and optionally saving the world - /// - /// bool perform a world save before stop (default: true) - /// string reason (default: "Server shutting down!") - public void StopServer(bool save = true, string reason = "Server shutting down!") - { - ForceKickAll(reason); - if (save) - SaveManager.Instance.SaveWorld(); - - // Save takes a while so kick again - ForceKickAll(reason); - - // Broadcast so console can see we are shutting down as well - TShock.Utils.Broadcast(reason, Color.Red); - - // Disconnect after kick as that signifies server is exiting and could cause a race - Netplay.disconnect = true; - } - - /// - /// Kicks a player from the server without checking for immunetokick permission. - /// - /// int player - /// string reason - /// bool silent (default: false) - public void ForceKick(TSPlayer player, string reason, bool silent = false) - { - Kick(player, reason, true, silent); - } - - /// - /// Kicks a player from the server. - /// - /// int player - /// string reason - /// bool force (default: false) - /// bool silent (default: false) - /// bool silent (default: null) - public bool Kick(TSPlayer player, string reason, bool force = false, bool silent = false, string adminUserName = null) - { - if (!player.ConnectionAlive) - return true; - if (force || !player.Group.HasPermission(Permissions.immunetokick)) - { - string playerName = player.Name; - player.SilentKickInProgress = silent; - player.Disconnect(string.Format("Kicked: {0}", reason)); - Log.ConsoleInfo(string.Format("Kicked {0} for : {1}", playerName, reason)); - string verb = force ? "force " : ""; - if (string.IsNullOrWhiteSpace(adminUserName)) - Broadcast(string.Format("{0} was {1}kicked for {2}", playerName, verb, reason.ToLower())); - else - Broadcast(string.Format("{0} {1}kicked {2} for {3}", adminUserName, verb, playerName, reason.ToLower())); - return true; - } - return false; - } - - /// - /// Bans and kicks a player from the server. - /// - /// int player - /// string reason - /// bool force (default: false) - /// bool silent (default: null) - public bool Ban(TSPlayer player, string reason, bool force = false, string adminUserName = null) - { - if (!player.ConnectionAlive) - return true; - if (force || !player.Group.HasPermission(Permissions.immunetoban)) - { - string ip = player.IP; - string playerName = player.Name; - TShock.Bans.AddBan(ip, playerName, reason); - player.Disconnect(string.Format("Banned: {0}", reason)); - Log.ConsoleInfo(string.Format("Banned {0} for : {1}", playerName, reason)); - string verb = force ? "force " : ""; - if (string.IsNullOrWhiteSpace(adminUserName)) - Broadcast(string.Format("{0} was {1}banned for {1}", playerName, verb, reason.ToLower())); - else - Broadcast(string.Format("{0} {1}banned {1} for {2}", adminUserName, verb, playerName, reason.ToLower())); - return true; - } - return false; - } - - /// - /// Shows a file to the user. - /// - /// int player - /// string filename reletave to savedir - //Todo: Fix this - public void ShowFileToUser(TSPlayer player, string file) - { - string foo = ""; - using (var tr = new StreamReader(Path.Combine(TShock.SavePath, file))) - { - while ((foo = tr.ReadLine()) != null) - { - foo = foo.Replace("%map%", Main.worldName); - foo = foo.Replace("%players%", GetPlayers()); - //foo = SanitizeString(foo); - if (foo.Substring(0, 1) == "%" && foo.Substring(12, 1) == "%") //Look for a beginning color code. - { - string possibleColor = foo.Substring(0, 13); - foo = foo.Remove(0, 13); - float[] pC = {0, 0, 0}; - possibleColor = possibleColor.Replace("%", ""); - string[] pCc = possibleColor.Split(','); - if (pCc.Length == 3) - { - try - { - player.SendMessage(foo, (byte) Convert.ToInt32(pCc[0]), (byte) Convert.ToInt32(pCc[1]), - (byte) Convert.ToInt32(pCc[2])); - continue; - } - catch (Exception e) - { - Log.Error(e.ToString()); - } - } - } - player.SendMessage(foo); - } - } - } - - /// - /// Returns a Group from the name of the group - /// - /// string groupName - public Group GetGroup(string groupName) - { - //first attempt on cached groups - for (int i = 0; i < TShock.Groups.groups.Count; i++) - { - if (TShock.Groups.groups[i].Name.Equals(groupName)) - { - return TShock.Groups.groups[i]; - } - } - return new Group(TShock.Config.DefaultGuestGroupName); - } - - /// - /// Returns an IPv4 address from a DNS query - /// - /// string ip - public string GetIPv4Address(string hostname) - { - try - { - //Get the ipv4 address from GetHostAddresses, if an ip is passed it will return that ip - var ip = Dns.GetHostAddresses(hostname).FirstOrDefault(i => i.AddressFamily == AddressFamily.InterNetwork); - //if the dns query was successful then return it, otherwise return an empty string - return ip != null ? ip.ToString() : ""; - } - catch (SocketException) - { - } - return ""; - } - - public string HashAlgo = "sha512"; - - public readonly Dictionary> HashTypes = new Dictionary> - { - {"sha512", () => new SHA512Managed()}, - {"sha256", () => new SHA256Managed()}, - {"md5", () => new MD5Cng()}, - {"sha512-xp", () => SHA512.Create()}, - {"sha256-xp", () => SHA256.Create()}, - {"md5-xp", () => MD5.Create()}, - }; - - /// - /// Returns a Sha256 string for a given string - /// - /// bytes to hash - /// string sha256 - public string HashPassword(byte[] bytes) - { - if (bytes == null) - throw new NullReferenceException("bytes"); - Func func; - if (!HashTypes.TryGetValue(HashAlgo.ToLower(), out func)) - throw new NotSupportedException("Hashing algorithm {0} is not supported".SFormat(HashAlgo.ToLower())); - - using (var hash = func()) - { - var ret = hash.ComputeHash(bytes); - return ret.Aggregate("", (s, b) => s + b.ToString("X2")); - } - } - - /// - /// Returns a Sha256 string for a given string - /// - /// bytes to hash - /// string sha256 - public string HashPassword(string password) - { - if (string.IsNullOrEmpty(password) || password == "non-existant password") - return "non-existant password"; - return HashPassword(Encoding.UTF8.GetBytes(password)); - } - - /// - /// Checks if the string contains any unprintable characters - /// - /// String to check - /// True if the string only contains printable characters - public bool ValidString(string str) - { - foreach (var c in str) - { - if (c < 0x20 || c > 0xA9) - return false; - } - return true; - } - - /// - /// Checks if world has hit the max number of chests - /// - /// True if the entire chest array is used - public bool MaxChests() - { - for (int i = 0; i < Main.chest.Length; i++) - { - if (Main.chest[i] == null) - return false; - } - return true; - } - - /// - /// Searches for a projectile by identity and owner - /// - /// identity - /// owner - /// projectile ID - public int SearchProjectile(short identity, int owner) - { - for (int i = 0; i < Main.maxProjectiles; i++) - { - if (Main.projectile[i].identity == identity && Main.projectile[i].owner == owner) - return i; - } - return 1000; - } - - /// - /// Sanitizes input strings - /// - /// string - /// sanitized string - public string SanitizeString(string str) - { - var returnstr = str.ToCharArray(); - for (int i = 0; i < str.Length; i++) - { - if (!ValidString(str[i].ToString())) - returnstr[i] = ' '; - } - return new string(returnstr); - } - } +/* +TShock, a server mod for Terraria +Copyright (C) 2011 The TShock Team + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net; +using System.Net.Sockets; +using System.Security.Cryptography; +using System.Text; +using Terraria; + +namespace TShockAPI +{ + public class Utils + { + private readonly static int firstItemPrefix = 1; + private readonly static int lastItemPrefix = 83; + // Utils is a Singleton + private static readonly Utils instance = new Utils(); + private Utils() {} + public static Utils Instance { get { return instance; } } + + public Random Random = new Random(); + //private static List groups = new List(); + + /// + /// Provides the real IP address from a RemoteEndPoint string that contains a port and an IP + /// + /// A string IPv4 address in IP:PORT form. + /// A string IPv4 address. + public string GetRealIP(string mess) + { + return mess.Split(':')[0]; + } + + /// + /// Used for some places where a list of players might be used. + /// + /// String of players seperated by commas. + public string GetPlayers() + { + var sb = new StringBuilder(); + foreach (TSPlayer player in TShock.Players) + { + if (player != null && player.Active) + { + if (sb.Length != 0) + { + sb.Append(", "); + } + sb.Append(player.Name); + } + } + return sb.ToString(); + } + + /// + /// Used for some places where a list of players might be used. + /// + /// String of players and their id seperated by commas. + public string GetPlayersWithIds() + { + var sb = new StringBuilder(); + foreach (TSPlayer player in TShock.Players) + { + if (player != null && player.Active) + { + if (sb.Length != 0) + { + sb.Append(", "); + } + sb.Append(player.Name); + string id = "( " + Convert.ToString(TShock.Users.GetUserID(player.UserAccountName)) + " )"; + sb.Append(id); + } + } + return sb.ToString(); + } + + /// + /// Finds a player and gets IP as string + /// + /// Player name + public string GetPlayerIP(string playername) + { + foreach (TSPlayer player in TShock.Players) + { + if (player != null && player.Active) + { + if (playername.ToLower() == player.Name.ToLower()) + { + return player.IP; + } + } + } + return null; + } + + /// + /// It's a clamp function + /// + /// + /// Value to clamp + /// Maximum bounds of the clamp + /// Minimum bounds of the clamp + /// + public T Clamp(T value, T max, T min) + where T : IComparable + { + T result = value; + if (value.CompareTo(max) > 0) + result = max; + if (value.CompareTo(min) < 0) + result = min; + return result; + } + + /// + /// Saves the map data + /// + public void SaveWorld() + { + SaveManager.Instance.SaveWorld(); + } + + /// + /// Broadcasts a message to all players + /// + /// string message + public void Broadcast(string msg) + { + Broadcast(msg, Color.Green); + } + + public void Broadcast(string msg, byte red, byte green, byte blue) + { + TSPlayer.All.SendMessage(msg, red, green, blue); + TSPlayer.Server.SendMessage(msg, red, green, blue); + Log.Info(string.Format("Broadcast: {0}", msg)); + } + + public void Broadcast(string msg, Color color) + { + Broadcast(msg, color.R, color.G, color.B); + } + + /// + /// Sends message to all users with 'logs' permission. + /// + /// Message to send + /// Color of the message + public void SendLogs(string log, Color color) + { + Log.Info(log); + TSPlayer.Server.SendMessage(log, color); + foreach (TSPlayer player in TShock.Players) + { + if (player != null && player.Active && player.Group.HasPermission(Permissions.logs) && player.DisplayLogs && + TShock.Config.DisableSpewLogs == false) + player.SendMessage(log, color); + } + } + + /// + /// The number of active players on the server. + /// + /// int playerCount + public int ActivePlayers() + { + return Main.player.Where(p => null != p && p.active).Count(); + } + + /// + /// Finds a player ID based on name + /// + /// Player name + /// + public List FindPlayer(string ply) + { + var found = new List(); + // Avoid errors caused by null search + if (null == ply) + return found; + ply = ply.ToLower(); + foreach (TSPlayer player in TShock.Players) + { + if (player == null) + continue; + + string name = player.Name.ToLower(); + if (name.Equals(ply)) + return new List {player}; + if (name.Contains(ply)) + found.Add(player); + } + return found; + } + + /// + /// Gets a random clear tile in range + /// + /// Bound X + /// Bound Y + /// Range on the X axis + /// Range on the Y axis + /// X location + /// Y location + public void GetRandomClearTileWithInRange(int startTileX, int startTileY, int tileXRange, int tileYRange, + out int tileX, out int tileY) + { + int j = 0; + do + { + if (j == 100) + { + tileX = startTileX; + tileY = startTileY; + break; + } + + tileX = startTileX + Random.Next(tileXRange*-1, tileXRange); + tileY = startTileY + Random.Next(tileYRange*-1, tileYRange); + j++; + } while (TileValid(tileX, tileY) && !TileClear(tileX, tileY)); + } + + /// + /// Determines if a tile is valid + /// + /// Location X + /// Location Y + /// If the tile is valid + private bool TileValid(int tileX, int tileY) + { + return tileX >= 0 && tileX <= Main.maxTilesX && tileY >= 0 && tileY <= Main.maxTilesY; + } + + /// + /// Clears a tile + /// + /// Location X + /// Location Y + /// The state of the tile + private bool TileClear(int tileX, int tileY) + { + return !Main.tile[tileX, tileY].active; + } + + /// + /// Gets a list of items by ID or name + /// + /// Item ID or name + /// List of Items + public List GetItemByIdOrName(string idOrName) + { + int type = -1; + if (int.TryParse(idOrName, out type)) + { + return new List {GetItemById(type)}; + } + return GetItemByName(idOrName); + } + + /// + /// Gets an item by ID + /// + /// ID + /// Item + public Item GetItemById(int id) + { + Item item = new Item(); + item.netDefaults(id); + return item; + } + + /// + /// Gets items by name + /// + /// name + /// List of Items + public List GetItemByName(string name) + { + //Method #1 - must be exact match, allows support for different pickaxes/hammers/swords etc + for (int i = 1; i < Main.maxItemTypes; i++) + { + Item item = new Item(); + item.SetDefaults(name); + if (item.name == name) + return new List {item}; + } + //Method #2 - allows impartial matching + var found = new List(); + for (int i = -24; i < Main.maxItemTypes; i++) + { + try + { + Item item = new Item(); + item.netDefaults(i); + if (item.name.ToLower() == name.ToLower()) + return new List {item}; + if (item.name.ToLower().StartsWith(name.ToLower())) + found.Add(item); + } + catch + { + } + } + return found; + } + + /// + /// Gets an NPC by ID or Name + /// + /// + /// List of NPCs + public List GetNPCByIdOrName(string idOrName) + { + int type = -1; + if (int.TryParse(idOrName, out type)) + { + return new List {GetNPCById(type)}; + } + return GetNPCByName(idOrName); + } + + /// + /// Gets an NPC by ID + /// + /// ID + /// NPC + public NPC GetNPCById(int id) + { + NPC npc = new NPC(); + npc.netDefaults(id); + return npc; + } + + /// + /// Gets a NPC by name + /// + /// Name + /// List of matching NPCs + public List GetNPCByName(string name) + { + //Method #1 - must be exact match, allows support for different coloured slimes + for (int i = -17; i < Main.maxNPCTypes; i++) + { + NPC npc = new NPC(); + npc.SetDefaults(name); + if (npc.name == name) + return new List {npc}; + } + //Method #2 - allows impartial matching + var found = new List(); + for (int i = 1; i < Main.maxNPCTypes; i++) + { + NPC npc = new NPC(); + npc.netDefaults(i); + if (npc.name.ToLower() == name.ToLower()) + return new List {npc}; + if (npc.name.ToLower().StartsWith(name.ToLower())) + found.Add(npc); + } + return found; + } + + /// + /// Gets a buff name by id + /// + /// ID + /// name + public string GetBuffName(int id) + { + return (id > 0 && id < Main.maxBuffs) ? Main.buffName[id] : "null"; + } + + /// + /// Gets the description of a buff + /// + /// ID + /// description + public string GetBuffDescription(int id) + { + return (id > 0 && id < Main.maxBuffs) ? Main.buffTip[id] : "null"; + } + + /// + /// Gets a list of buffs by name + /// + /// name + /// Matching list of buff ids + public List GetBuffByName(string name) + { + for (int i = 1; i < Main.maxBuffs; i++) + { + if (Main.buffName[i].ToLower() == name) + return new List {i}; + } + var found = new List(); + for (int i = 1; i < Main.maxBuffs; i++) + { + if (Main.buffName[i].ToLower().StartsWith(name.ToLower())) + found.Add(i); + } + return found; + } + + /// + /// Gets a prefix based on its id + /// + /// ID + /// Prefix name + public string GetPrefixById(int id) + { + var item = new Item(); + item.SetDefaults(0); + item.prefix = (byte) id; + item.AffixName(); + return item.name.Trim(); + } + + /// + /// Gets a list of prefixes by name + /// + /// Name + /// List of prefix IDs + public List GetPrefixByName(string name) + { + Item item = new Item(); + item.SetDefaults(0); + string lowerName = name.ToLower(); + var found = new List(); + for (int i = firstItemPrefix; i <= lastItemPrefix; i++) + { + try + { + item.prefix = (byte)i; + string trimmed = item.AffixName().Trim(); + if (trimmed == name) + { + // Exact match + found.Add(i); + return found; + } + else + { + string trimmedLower = trimmed.ToLower(); + if (trimmedLower == lowerName) + { + // Exact match (caseinsensitive) + found.Add(i); + return found; + } + else if (trimmedLower.StartsWith(lowerName)) // Partial match + found.Add(i); + } + } + catch + { + } + } + return found; + } + + /// + /// Gets a prefix by ID or name + /// + /// ID or name + /// List of prefix IDs + public List GetPrefixByIdOrName(string idOrName) + { + int type = -1; + if (int.TryParse(idOrName, out type) && type >= firstItemPrefix && type <= lastItemPrefix) + { + return new List {type}; + } + return GetPrefixByName(idOrName); + } + + /// + /// Kicks all player from the server without checking for immunetokick permission. + /// + /// int player + /// string reason + public void ForceKickAll(string reason) + { + foreach (TSPlayer player in TShock.Players) + { + if (player != null && player.Active) + { + ForceKick(player, reason); + } + } + } + + /// + /// Stops the server after kicking all players with a reason message, and optionally saving the world + /// + /// bool perform a world save before stop (default: true) + /// string reason (default: "Server shutting down!") + public void StopServer(bool save = true, string reason = "Server shutting down!") + { + ForceKickAll(reason); + if (save) + SaveManager.Instance.SaveWorld(); + + // Save takes a while so kick again + ForceKickAll(reason); + + // Broadcast so console can see we are shutting down as well + TShock.Utils.Broadcast(reason, Color.Red); + + // Disconnect after kick as that signifies server is exiting and could cause a race + Netplay.disconnect = true; + } + + /// + /// Kicks a player from the server without checking for immunetokick permission. + /// + /// int player + /// string reason + /// bool silent (default: false) + public void ForceKick(TSPlayer player, string reason, bool silent = false) + { + Kick(player, reason, true, silent); + } + + /// + /// Kicks a player from the server. + /// + /// int player + /// string reason + /// bool force (default: false) + /// bool silent (default: false) + /// bool silent (default: null) + public bool Kick(TSPlayer player, string reason, bool force = false, bool silent = false, string adminUserName = null) + { + if (!player.ConnectionAlive) + return true; + if (force || !player.Group.HasPermission(Permissions.immunetokick)) + { + string playerName = player.Name; + player.SilentKickInProgress = silent; + player.Disconnect(string.Format("Kicked: {0}", reason)); + Log.ConsoleInfo(string.Format("Kicked {0} for : {1}", playerName, reason)); + string verb = force ? "force " : ""; + if (string.IsNullOrWhiteSpace(adminUserName)) + Broadcast(string.Format("{0} was {1}kicked for {2}", playerName, verb, reason.ToLower())); + else + Broadcast(string.Format("{0} {1}kicked {2} for {3}", adminUserName, verb, playerName, reason.ToLower())); + return true; + } + return false; + } + + /// + /// Bans and kicks a player from the server. + /// + /// int player + /// string reason + /// bool force (default: false) + /// bool silent (default: null) + public bool Ban(TSPlayer player, string reason, bool force = false, string adminUserName = null) + { + if (!player.ConnectionAlive) + return true; + if (force || !player.Group.HasPermission(Permissions.immunetoban)) + { + string ip = player.IP; + string playerName = player.Name; + TShock.Bans.AddBan(ip, playerName, reason); + player.Disconnect(string.Format("Banned: {0}", reason)); + Log.ConsoleInfo(string.Format("Banned {0} for : {1}", playerName, reason)); + string verb = force ? "force " : ""; + if (string.IsNullOrWhiteSpace(adminUserName)) + Broadcast(string.Format("{0} was {1}banned for {1}", playerName, verb, reason.ToLower())); + else + Broadcast(string.Format("{0} {1}banned {1} for {2}", adminUserName, verb, playerName, reason.ToLower())); + return true; + } + return false; + } + + /// + /// Shows a file to the user. + /// + /// int player + /// string filename reletave to savedir + //Todo: Fix this + public void ShowFileToUser(TSPlayer player, string file) + { + string foo = ""; + using (var tr = new StreamReader(Path.Combine(TShock.SavePath, file))) + { + while ((foo = tr.ReadLine()) != null) + { + foo = foo.Replace("%map%", Main.worldName); + foo = foo.Replace("%players%", GetPlayers()); + //foo = SanitizeString(foo); + if (foo.Substring(0, 1) == "%" && foo.Substring(12, 1) == "%") //Look for a beginning color code. + { + string possibleColor = foo.Substring(0, 13); + foo = foo.Remove(0, 13); + float[] pC = {0, 0, 0}; + possibleColor = possibleColor.Replace("%", ""); + string[] pCc = possibleColor.Split(','); + if (pCc.Length == 3) + { + try + { + player.SendMessage(foo, (byte) Convert.ToInt32(pCc[0]), (byte) Convert.ToInt32(pCc[1]), + (byte) Convert.ToInt32(pCc[2])); + continue; + } + catch (Exception e) + { + Log.Error(e.ToString()); + } + } + } + player.SendMessage(foo); + } + } + } + + /// + /// Returns a Group from the name of the group + /// + /// string groupName + public Group GetGroup(string groupName) + { + //first attempt on cached groups + for (int i = 0; i < TShock.Groups.groups.Count; i++) + { + if (TShock.Groups.groups[i].Name.Equals(groupName)) + { + return TShock.Groups.groups[i]; + } + } + return new Group(TShock.Config.DefaultGuestGroupName); + } + + /// + /// Returns an IPv4 address from a DNS query + /// + /// string ip + public string GetIPv4Address(string hostname) + { + try + { + //Get the ipv4 address from GetHostAddresses, if an ip is passed it will return that ip + var ip = Dns.GetHostAddresses(hostname).FirstOrDefault(i => i.AddressFamily == AddressFamily.InterNetwork); + //if the dns query was successful then return it, otherwise return an empty string + return ip != null ? ip.ToString() : ""; + } + catch (SocketException) + { + } + return ""; + } + + public string HashAlgo = "sha512"; + + public readonly Dictionary> HashTypes = new Dictionary> + { + {"sha512", () => new SHA512Managed()}, + {"sha256", () => new SHA256Managed()}, + {"md5", () => new MD5Cng()}, + {"sha512-xp", () => SHA512.Create()}, + {"sha256-xp", () => SHA256.Create()}, + {"md5-xp", () => MD5.Create()}, + }; + + /// + /// Returns a Sha256 string for a given string + /// + /// bytes to hash + /// string sha256 + public string HashPassword(byte[] bytes) + { + if (bytes == null) + throw new NullReferenceException("bytes"); + Func func; + if (!HashTypes.TryGetValue(HashAlgo.ToLower(), out func)) + throw new NotSupportedException("Hashing algorithm {0} is not supported".SFormat(HashAlgo.ToLower())); + + using (var hash = func()) + { + var ret = hash.ComputeHash(bytes); + return ret.Aggregate("", (s, b) => s + b.ToString("X2")); + } + } + + /// + /// Returns a Sha256 string for a given string + /// + /// bytes to hash + /// string sha256 + public string HashPassword(string password) + { + if (string.IsNullOrEmpty(password) || password == "non-existant password") + return "non-existant password"; + return HashPassword(Encoding.UTF8.GetBytes(password)); + } + + /// + /// Checks if the string contains any unprintable characters + /// + /// String to check + /// True if the string only contains printable characters + public bool ValidString(string str) + { + foreach (var c in str) + { + if (c < 0x20 || c > 0xA9) + return false; + } + return true; + } + + /// + /// Checks if world has hit the max number of chests + /// + /// True if the entire chest array is used + public bool MaxChests() + { + for (int i = 0; i < Main.chest.Length; i++) + { + if (Main.chest[i] == null) + return false; + } + return true; + } + + /// + /// Searches for a projectile by identity and owner + /// + /// identity + /// owner + /// projectile ID + public int SearchProjectile(short identity, int owner) + { + for (int i = 0; i < Main.maxProjectiles; i++) + { + if (Main.projectile[i].identity == identity && Main.projectile[i].owner == owner) + return i; + } + return 1000; + } + + /// + /// Sanitizes input strings + /// + /// string + /// sanitized string + public string SanitizeString(string str) + { + var returnstr = str.ToCharArray(); + for (int i = 0; i < str.Length; i++) + { + if (!ValidString(str[i].ToString())) + returnstr[i] = ' '; + } + return new string(returnstr); + } + } } \ No newline at end of file diff --git a/TShockRestTestPlugin/Properties/AssemblyInfo.cs b/TShockRestTestPlugin/Properties/AssemblyInfo.cs index 17cb9a46..f9320bbe 100644 --- a/TShockRestTestPlugin/Properties/AssemblyInfo.cs +++ b/TShockRestTestPlugin/Properties/AssemblyInfo.cs @@ -1,36 +1,36 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("ClassLibrary1")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Multiplay")] -[assembly: AssemblyProduct("ClassLibrary1")] -[assembly: AssemblyCopyright("Copyright © Multiplay 2012")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("c6aed7ee-6282-49a2-8177-b79cad20d6d3")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("ClassLibrary1")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Multiplay")] +[assembly: AssemblyProduct("ClassLibrary1")] +[assembly: AssemblyCopyright("Copyright © Multiplay 2012")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("c6aed7ee-6282-49a2-8177-b79cad20d6d3")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/TShockRestTestPlugin/TShockRestTestPlugin.cs b/TShockRestTestPlugin/TShockRestTestPlugin.cs index 403b6f8f..385ba4fc 100644 --- a/TShockRestTestPlugin/TShockRestTestPlugin.cs +++ b/TShockRestTestPlugin/TShockRestTestPlugin.cs @@ -1,192 +1,192 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Text; -using System.Web; -using System.Web.Script.Serialization; -using System.Text.RegularExpressions; -using Microsoft.VisualStudio.TestTools.WebTesting; -using Microsoft.VisualStudio.TestTools.WebTesting.Rules; -using Rests; - -namespace TshockRestTestPlugin -{ - [DisplayName("JSON Status")] - [Description("Checks to see the that the JSON response has the specified status response")] - public class JsonValidateStatus : JsonValidate - { - public override void Validate(object sender, ValidationEventArgs e) - { - if (null != ValidateJson(sender, e)) - e.IsValid = true; - } - } - - [DisplayName("JSON Regexp Property")] - [Description("Checks to see the that the JSON response contains the specified property and is matches the specified regexp")] - public class JsonValidateRegexpProperty : JsonValidateProperty - { - // The name of the desired JSON property - [DisplayName("Regexp")] - [DefaultValue(true)] - public new bool UseRegularExpression { get { return base.UseRegularExpression; } set { base.UseRegularExpression = value; } } - } - - [DisplayName("JSON Error")] - [Description("Checks to see the that the JSON response contains the specified error")] - public class JsonValidateError : JsonValidateProperty - { - // The status of the JSON request - [DisplayName("JSON Status")] - [DefaultValue("400")] - public new string JSonStatus { get { return base.JSonStatus; } set { base.JSonStatus = value; } } - - // The name of the desired JSON property - [DisplayName("Property")] - [DefaultValue("error")] - public new string PropertyName { get { return base.PropertyName; } set { base.PropertyName = value; } } - } - - [DisplayName("JSON Missing Parameter")] - [Description("Checks to see the that the JSON response indicates a missing or invalid parameter")] - public class JsonValidateMissingParameter : JsonValidateError - { - // The value of the desired JSON property - [DisplayName("Missing Value")] - public new string PropertyValue { get { return base.PropertyValue; } set { base.PropertyValue = String.Format("Missing or empty {0} parameter", value); } } - } - - [DisplayName("JSON Invalid Parameter")] - [Description("Checks to see the that the JSON response indicates a missing or invalid parameter")] - public class JsonValidateInvalidParameter : JsonValidateError - { - // The value of the desired JSON property - [DisplayName("Invalid Value")] - public new string PropertyValue { get { return base.PropertyValue; } set { base.PropertyValue = String.Format("Missing or invalid {0} parameter", value); } } - } - - [DisplayName("JSON Response")] - [Description("Checks to see the that the JSON response contains the specified message")] - public class JsonValidateResponse : JsonValidateProperty - { - // The name of the desired JSON property - [DisplayName("Response")] - [DefaultValue("response")] - public new string PropertyName { get { return base.PropertyName; } set { base.PropertyName = value; } } - } - - [DisplayName("JSON Property")] - [Description("Checks to see the that the JSON response contains the specified property and is set to the specified value")] - public class JsonValidateProperty : JsonValidate - { - // The name of the desired JSON property - [DisplayName("Property")] - public string PropertyName { get; set; } - - // The value of the desired JSON property - [DisplayName("Value")] - public string PropertyValue { get; set; } - - // Is the value a regexp of the desired JSON property - [DisplayName("Regexp")] - [DefaultValue(false)] - public bool UseRegularExpression { get; set; } - - public override void Validate(object sender, ValidationEventArgs e) - { - RestObject response = ValidateJson(sender, e); - if (null == response) - return; - - if (null == response[PropertyName]) - { - e.Message = String.Format("{0} Not Found", PropertyName); - e.IsValid = false; - return; - } - - if (UseRegularExpression) - { - var re = new Regex(PropertyValue); - if (!re.IsMatch((string)response[PropertyName])) - { - e.Message = String.Format("{0} => '{1}' !~ '{2}'", PropertyName, response[PropertyName], PropertyValue); - e.IsValid = false; - return; - } - } - else - { - if (PropertyValue != (string)response[PropertyName]) - { - e.Message = String.Format("{0} => '{1}' != '{2}'", PropertyName, response[PropertyName], PropertyValue); - e.IsValid = false; - return; - } - } - - e.IsValid = true; - //e.WebTest.Context.Add(ContextParameterName, propertyValue); - } - } - - [DisplayName("JSON Has Properties")] - [Description("Checks to see the that the JSON response contains the specified properties (comma seperated)")] - public class JsonHasProperties : JsonValidate - { - // The name of the desired JSON properties to check - [DisplayName("Properties")] - [Description("A comma seperated list of property names to check exist")] - public string PropertyNames { get; set; } - - //--------------------------------------------------------------------- - public override void Validate(object sender, ValidationEventArgs e) - { - RestObject response = ValidateJson(sender, e); - if (null == response) - return; - foreach (var p in PropertyNames.Split(',')) - { - if (null == response[p]) - { - e.Message = String.Format("'{0}' Not Found", p); - e.IsValid = false; - return; - } - } - e.IsValid = true; - - //e.WebTest.Context.Add(ContextParameterName, propertyValue); - } - } - - public abstract class JsonValidate : ValidationRule - { - // The status of the JSON request - [DisplayName("JSON Status")] - [DefaultValue("200")] - public string JSonStatus { get; set; } - - public RestObject ValidateJson(object sender, ValidationEventArgs e) - { - if (string.IsNullOrWhiteSpace(e.Response.BodyString)) - { - e.IsValid = false; - e.Message = String.Format("Empty or null response {0}", e.Response.StatusCode); - return null; - } - JavaScriptSerializer serialiser = new JavaScriptSerializer(); - //dynamic data = serialiser.Deserialize(e.Response.BodyString); - RestObject response = serialiser.Deserialize(e.Response.BodyString); - - if (JSonStatus != response.Status) - { - e.IsValid = false; - e.Message = String.Format("Response Status '{0}' not '{1}'", response.Status, JSonStatus); - return null; - } - - return response; - } - } +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Text; +using System.Web; +using System.Web.Script.Serialization; +using System.Text.RegularExpressions; +using Microsoft.VisualStudio.TestTools.WebTesting; +using Microsoft.VisualStudio.TestTools.WebTesting.Rules; +using Rests; + +namespace TshockRestTestPlugin +{ + [DisplayName("JSON Status")] + [Description("Checks to see the that the JSON response has the specified status response")] + public class JsonValidateStatus : JsonValidate + { + public override void Validate(object sender, ValidationEventArgs e) + { + if (null != ValidateJson(sender, e)) + e.IsValid = true; + } + } + + [DisplayName("JSON Regexp Property")] + [Description("Checks to see the that the JSON response contains the specified property and is matches the specified regexp")] + public class JsonValidateRegexpProperty : JsonValidateProperty + { + // The name of the desired JSON property + [DisplayName("Regexp")] + [DefaultValue(true)] + public new bool UseRegularExpression { get { return base.UseRegularExpression; } set { base.UseRegularExpression = value; } } + } + + [DisplayName("JSON Error")] + [Description("Checks to see the that the JSON response contains the specified error")] + public class JsonValidateError : JsonValidateProperty + { + // The status of the JSON request + [DisplayName("JSON Status")] + [DefaultValue("400")] + public new string JSonStatus { get { return base.JSonStatus; } set { base.JSonStatus = value; } } + + // The name of the desired JSON property + [DisplayName("Property")] + [DefaultValue("error")] + public new string PropertyName { get { return base.PropertyName; } set { base.PropertyName = value; } } + } + + [DisplayName("JSON Missing Parameter")] + [Description("Checks to see the that the JSON response indicates a missing or invalid parameter")] + public class JsonValidateMissingParameter : JsonValidateError + { + // The value of the desired JSON property + [DisplayName("Missing Value")] + public new string PropertyValue { get { return base.PropertyValue; } set { base.PropertyValue = String.Format("Missing or empty {0} parameter", value); } } + } + + [DisplayName("JSON Invalid Parameter")] + [Description("Checks to see the that the JSON response indicates a missing or invalid parameter")] + public class JsonValidateInvalidParameter : JsonValidateError + { + // The value of the desired JSON property + [DisplayName("Invalid Value")] + public new string PropertyValue { get { return base.PropertyValue; } set { base.PropertyValue = String.Format("Missing or invalid {0} parameter", value); } } + } + + [DisplayName("JSON Response")] + [Description("Checks to see the that the JSON response contains the specified message")] + public class JsonValidateResponse : JsonValidateProperty + { + // The name of the desired JSON property + [DisplayName("Response")] + [DefaultValue("response")] + public new string PropertyName { get { return base.PropertyName; } set { base.PropertyName = value; } } + } + + [DisplayName("JSON Property")] + [Description("Checks to see the that the JSON response contains the specified property and is set to the specified value")] + public class JsonValidateProperty : JsonValidate + { + // The name of the desired JSON property + [DisplayName("Property")] + public string PropertyName { get; set; } + + // The value of the desired JSON property + [DisplayName("Value")] + public string PropertyValue { get; set; } + + // Is the value a regexp of the desired JSON property + [DisplayName("Regexp")] + [DefaultValue(false)] + public bool UseRegularExpression { get; set; } + + public override void Validate(object sender, ValidationEventArgs e) + { + RestObject response = ValidateJson(sender, e); + if (null == response) + return; + + if (null == response[PropertyName]) + { + e.Message = String.Format("{0} Not Found", PropertyName); + e.IsValid = false; + return; + } + + if (UseRegularExpression) + { + var re = new Regex(PropertyValue); + if (!re.IsMatch((string)response[PropertyName])) + { + e.Message = String.Format("{0} => '{1}' !~ '{2}'", PropertyName, response[PropertyName], PropertyValue); + e.IsValid = false; + return; + } + } + else + { + if (PropertyValue != (string)response[PropertyName]) + { + e.Message = String.Format("{0} => '{1}' != '{2}'", PropertyName, response[PropertyName], PropertyValue); + e.IsValid = false; + return; + } + } + + e.IsValid = true; + //e.WebTest.Context.Add(ContextParameterName, propertyValue); + } + } + + [DisplayName("JSON Has Properties")] + [Description("Checks to see the that the JSON response contains the specified properties (comma seperated)")] + public class JsonHasProperties : JsonValidate + { + // The name of the desired JSON properties to check + [DisplayName("Properties")] + [Description("A comma seperated list of property names to check exist")] + public string PropertyNames { get; set; } + + //--------------------------------------------------------------------- + public override void Validate(object sender, ValidationEventArgs e) + { + RestObject response = ValidateJson(sender, e); + if (null == response) + return; + foreach (var p in PropertyNames.Split(',')) + { + if (null == response[p]) + { + e.Message = String.Format("'{0}' Not Found", p); + e.IsValid = false; + return; + } + } + e.IsValid = true; + + //e.WebTest.Context.Add(ContextParameterName, propertyValue); + } + } + + public abstract class JsonValidate : ValidationRule + { + // The status of the JSON request + [DisplayName("JSON Status")] + [DefaultValue("200")] + public string JSonStatus { get; set; } + + public RestObject ValidateJson(object sender, ValidationEventArgs e) + { + if (string.IsNullOrWhiteSpace(e.Response.BodyString)) + { + e.IsValid = false; + e.Message = String.Format("Empty or null response {0}", e.Response.StatusCode); + return null; + } + JavaScriptSerializer serialiser = new JavaScriptSerializer(); + //dynamic data = serialiser.Deserialize(e.Response.BodyString); + RestObject response = serialiser.Deserialize(e.Response.BodyString); + + if (JSonStatus != response.Status) + { + e.IsValid = false; + e.Message = String.Format("Response Status '{0}' not '{1}'", response.Status, JSonStatus); + return null; + } + + return response; + } + } } \ No newline at end of file diff --git a/TShockRestTestPlugin/TShockRestTestPlugin.csproj b/TShockRestTestPlugin/TShockRestTestPlugin.csproj index bf2dd997..e315c7d3 100644 --- a/TShockRestTestPlugin/TShockRestTestPlugin.csproj +++ b/TShockRestTestPlugin/TShockRestTestPlugin.csproj @@ -1,62 +1,62 @@ - - - - Debug - AnyCPU - 8.0.30703 - 2.0 - {F2FEDAFB-58DE-4611-9168-A86112C346C7} - Library - Properties - TshockRestTestPlugin - TshockRestTestPlugin - v4.0 - 512 - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - - - - - - - - - - - - - - - {49606449-072B-4CF5-8088-AA49DA586694} - TShockAPI - - - - + + + + Debug + AnyCPU + 8.0.30703 + 2.0 + {F2FEDAFB-58DE-4611-9168-A86112C346C7} + Library + Properties + TshockRestTestPlugin + TshockRestTestPlugin + v4.0 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + + + + {49606449-072B-4CF5-8088-AA49DA586694} + TShockAPI + + + + \ No newline at end of file diff --git a/UnitTests/RestApiTests.webtest b/UnitTests/RestApiTests.webtest index 84057748..29e27981 100644 --- a/UnitTests/RestApiTests.webtest +++ b/UnitTests/RestApiTests.webtest @@ -1,1542 +1,1542 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 6c636d4084e1a15d053652f1125c167a4b60b2d3 Mon Sep 17 00:00:00 2001 From: stevenh Date: Wed, 22 Feb 2012 11:47:09 +0000 Subject: [PATCH 43/73] Refactored IQueryBuilder extracting common code into the GenericQueryCreator Fixed MysqlQueryCreator UpdateValue generating invalid SQL fixes #400 --- TShockAPI/DB/IQueryBuilder.cs | 345 +++++++++++----------------------- 1 file changed, 107 insertions(+), 238 deletions(-) diff --git a/TShockAPI/DB/IQueryBuilder.cs b/TShockAPI/DB/IQueryBuilder.cs index 9157e645..3037b58b 100644 --- a/TShockAPI/DB/IQueryBuilder.cs +++ b/TShockAPI/DB/IQueryBuilder.cs @@ -33,11 +33,12 @@ namespace TShockAPI.DB string InsertValues(string table, List values); string ReadColumn(string table, List wheres); string DeleteRow(string table, List wheres); + string RenameTable(string from, string to); } - public class SqliteQueryCreator : IQueryBuilder + public class SqliteQueryCreator : GenericQueryCreator, IQueryBuilder { - public string CreateTable(SqlTable table) + public override string CreateTable(SqlTable table) { var columns = table.Columns.Select( @@ -45,129 +46,12 @@ namespace TShockAPI.DB "'{0}' {1} {2} {3} {4} {5}".SFormat(c.Name, DbTypeToString(c.Type, c.Length), c.Primary ? "PRIMARY KEY" : "", c.AutoIncrement ? "AUTOINCREMENT" : "", c.NotNull ? "NOT NULL" : "", c.Unique ? "UNIQUE" : "")); - return "CREATE TABLE '{0}' ({1})".SFormat(table.Name, string.Join(", ", columns)); + return "CREATE TABLE {0} ({1})".SFormat(EscapeTableName(table.Name), string.Join(", ", columns)); } - private static Random rand = new Random(); - - /// - /// Alter a table from source to destination - /// - /// Must have name and column names. Column types are not required - /// Must have column names and column types. - /// - public string AlterTable(SqlTable from, SqlTable to) + public override string RenameTable(string from, string to) { - var rstr = rand.NextString(20); - var alter = "ALTER TABLE '{0}' RENAME TO '{1}_{0}'".SFormat(from.Name, rstr); - var create = CreateTable(to); - //combine all columns in the 'from' variable excluding ones that aren't in the 'to' variable. - //exclude the ones that aren't in 'to' variable because if the column is deleted, why try to import the data? - var insert = "INSERT INTO '{0}' ({1}) SELECT {1} FROM {2}_{0}".SFormat(from.Name, - string.Join(", ", - from.Columns.Where( - c => - to.Columns.Any( - c2 => c2.Name == c.Name)).Select - (c => c.Name)), rstr); - var drop = "DROP TABLE '{0}_{1}'".SFormat(rstr, from.Name); - return "{0}; {1}; {2}; {3};".SFormat(alter, create, insert, drop); - /* - ALTER TABLE "main"."Bans" RENAME TO "oXHFcGcd04oXHFcGcd04_Bans" - CREATE TABLE "main"."Bans" ("IP" TEXT PRIMARY KEY ,"Name" TEXT) - INSERT INTO "main"."Bans" SELECT "IP","Name" FROM "main"."oXHFcGcd04oXHFcGcd04_Bans" - DROP TABLE "main"."oXHFcGcd04oXHFcGcd04_Bans" - * - * Twitchy - Oh. I get it! - */ - } - - public string DeleteRow(string table, List wheres) - { - var sbwheres = new StringBuilder(); - int count = 0; - foreach (SqlValue where in wheres) - { - sbwheres.Append(where.Name + "=" + where.Value); - if (count != wheres.Count - 1) - sbwheres.Append(" AND "); - count++; - } - if (wheres.Count > 0) - return "DELETE FROM '{0}' WHERE {1} ".SFormat(table, sbwheres.ToString()); - else - return "DELETE FROM '{0}'".SFormat(table, sbwheres.ToString()); - } - - public string UpdateValue(string table, List values, List wheres) - { - var sbvalues = new StringBuilder(); - var sbwheres = new StringBuilder(); - int count = 0; - foreach (SqlValue value in values) - { - sbvalues.Append(value.Name + "=" + value.Value); - if (count != values.Count - 1) - sbvalues.Append(","); - count++; - } - count = 0; - foreach (SqlValue where in wheres) - { - sbwheres.Append(where.Name + "=" + where.Value); - if (count != wheres.Count - 1) - sbwheres.Append(" AND "); - count++; - } - - if (wheres.Count > 0) - return "UPDATE '{0}' SET {1} WHERE {2}".SFormat(table, sbvalues.ToString(), sbwheres.ToString()); - else - return "UPDATE '{0}' SET {1}".SFormat(table, sbvalues.ToString()); - } - - public string InsertValues(string table, List values) - { - var sbnames = new StringBuilder(); - var sbvalues = new StringBuilder(); - int count = 0; - - foreach (SqlValue name in values) - { - sbnames.Append(name.Name); - - if (count != values.Count - 1) - sbnames.Append(", "); - count++; - } - count = 0; - foreach (SqlValue value in values) - { - sbvalues.Append(value.Value.ToString()); - if (count != values.Count - 1) - sbvalues.Append(", "); - count++; - } - return "INSERT INTO '{0}' ({1}) VALUES ({2})".SFormat(table, sbnames.ToString(), sbvalues.ToString()); - } - - public string ReadColumn(string table, List wheres) - { - var sbwheres = new StringBuilder(); - int count = 0; - - foreach (SqlValue where in wheres) - { - sbwheres.Append(where.Name + "=" + where.Value); - if (count != wheres.Count - 1) - sbwheres.Append(" AND "); - count++; - } - - if (wheres.Count > 0) - return "SELECT * FROM {0} WHERE {1}".SFormat(table, sbwheres.ToString()); - else - return "SELECT * FROM {0}".SFormat(table); + return "ALTER TABLE {0} RENAME TO {1}".SFormat(from, to); } private static readonly Dictionary TypesAsStrings = new Dictionary @@ -189,11 +73,16 @@ namespace TShockAPI.DB return ret; throw new NotImplementedException(Enum.GetName(typeof (MySqlDbType), type)); } + + protected override string EscapeTableName(string table) + { + return table.SFormat("'{0}'", table); + } } - public class MysqlQueryCreator : IQueryBuilder + public class MysqlQueryCreator : GenericQueryCreator, IQueryBuilder { - public string CreateTable(SqlTable table) + public override string CreateTable(SqlTable table) { var columns = table.Columns.Select( @@ -201,125 +90,15 @@ namespace TShockAPI.DB "{0} {1} {2} {3} {4}".SFormat(c.Name, DbTypeToString(c.Type, c.Length), c.Primary ? "PRIMARY KEY" : "", c.AutoIncrement ? "AUTO_INCREMENT" : "", c.NotNull ? "NOT NULL" : "")); var uniques = table.Columns.Where(c => c.Unique).Select(c => c.Name); - return "CREATE TABLE {0} ({1} {2})".SFormat(table.Name, string.Join(", ", columns), + return "CREATE TABLE {0} ({1} {2})".SFormat(EscapeTableName(table.Name), string.Join(", ", columns), uniques.Count() > 0 ? ", UNIQUE({0})".SFormat(string.Join(", ", uniques)) : ""); } - private static Random rand = new Random(); - - /// - /// Alter a table from source to destination - /// - /// Must have name and column names. Column types are not required - /// Must have column names and column types. - /// - public string AlterTable(SqlTable from, SqlTable to) + public override string RenameTable(string from, string to) { - var rstr = rand.NextString(20); - var alter = "RENAME TABLE {0} TO {1}_{0}".SFormat(from.Name, rstr); - var create = CreateTable(to); - //combine all columns in the 'from' variable excluding ones that aren't in the 'to' variable. - //exclude the ones that aren't in 'to' variable because if the column is deleted, why try to import the data? - var insert = "INSERT INTO {0} ({1}) SELECT {1} FROM {2}_{0}".SFormat(from.Name, - string.Join(", ", - from.Columns.Where( - c => - to.Columns.Any( - c2 => c2.Name == c.Name)).Select( - c => c.Name)), rstr); - var drop = "DROP TABLE {0}_{1}".SFormat(rstr, from.Name); - return "{0}; {1}; {2}; {3};".SFormat(alter, create, insert, drop); - } - - public string DeleteRow(string table, List wheres) - { - var sbwheres = new StringBuilder(); - int count = 0; - foreach (SqlValue where in wheres) - { - sbwheres.Append(where.Name + "=" + where.Value); - if (count != wheres.Count - 1) - sbwheres.Append(" AND "); - count++; - } - if (wheres.Count > 0) - return "DELETE FROM {0} WHERE {1} ".SFormat(table, sbwheres.ToString()); - else - return "DELETE FROM {0}".SFormat(table, sbwheres.ToString()); - } - - public string UpdateValue(string table, List values, List wheres) - { - var sbvalues = new StringBuilder(); - var sbwheres = new StringBuilder(); - int count = 0; - foreach (SqlValue value in values) - { - sbvalues.Append(value.Name + "=" + value.Value); - if (count != values.Count - 1) - sbvalues.Append("AND"); - count++; - } - count = 0; - foreach (SqlValue where in wheres) - { - sbwheres.Append(where.Name + "=" + where.Value); - if (count != wheres.Count - 1) - sbwheres.Append(" AND "); - count++; - } - - if (wheres.Count > 0) - return "UPDATE {0} SET {1} WHERE {2}".SFormat(table, sbvalues.ToString(), sbwheres.ToString()); - else - return "UPDATE {0} SET {1}".SFormat(table, sbvalues.ToString()); - } - - public string InsertValues(string table, List values) - { - var sbnames = new StringBuilder(); - var sbvalues = new StringBuilder(); - int count = 0; - - foreach (SqlValue name in values) - { - sbnames.Append(name.Name); - - if (count != values.Count - 1) - sbnames.Append(", "); - count++; - } - count = 0; - foreach (SqlValue value in values) - { - sbvalues.Append(value.Value.ToString()); - if (count != values.Count - 1) - sbvalues.Append(", "); - count++; - } - - return "INSERT INTO {0} ({1}) VALUES ({2})".SFormat(table, sbnames.ToString(), sbvalues.ToString()); - } - - public string ReadColumn(string table, List wheres) - { - var sbwheres = new StringBuilder(); - int count = 0; - - foreach (SqlValue where in wheres) - { - sbwheres.Append(where.Name + "=" + where.Value); - if (count != wheres.Count - 1) - sbwheres.Append(" AND "); - count++; - } - - if (wheres.Count > 0) - return "SELECT * FROM {0} WHERE {1}".SFormat(table, sbwheres.ToString()); - else - return "SELECT * FROM {0}".SFormat(table); + return "RENAME TABLE {0} TO {1}".SFormat(from, to); } private static readonly Dictionary TypesAsStrings = new Dictionary @@ -340,5 +119,95 @@ namespace TShockAPI.DB return ret + (length != null ? "({0})".SFormat((int) length) : ""); throw new NotImplementedException(Enum.GetName(typeof (MySqlDbType), type)); } + + protected override string EscapeTableName(string table) + { + return table.SFormat("`{0}`", table); + } } -} \ No newline at end of file + + public abstract class GenericQueryCreator + { + protected static Random rand = new Random(); + protected abstract string EscapeTableName(string table); + public abstract string CreateTable(SqlTable table); + public abstract string RenameTable(string from, string to); + + /// + /// Alter a table from source to destination + /// + /// Must have name and column names. Column types are not required + /// Must have column names and column types. + /// + public string AlterTable(SqlTable from, SqlTable to) + { + /* + * Any example outpuf from this looks like:- + ALTER TABLE "main"."Bans" RENAME TO "oXHFcGcd04oXHFcGcd04_Bans" + CREATE TABLE "main"."Bans" ("IP" TEXT PRIMARY KEY ,"Name" TEXT) + INSERT INTO "main"."Bans" SELECT "IP","Name" FROM "main"."oXHFcGcd04oXHFcGcd04_Bans" + DROP TABLE "main"."oXHFcGcd04oXHFcGcd04_Bans" + * + * Twitchy - Oh. I get it! + */ + var rstr = rand.NextString(20); + var escapedTable = EscapeTableName(from.Name); + var tmpTable = EscapeTableName("{0}_{1}".SFormat(rstr, from.Name)); + var alter = RenameTable(escapedTable, tmpTable); + var create = CreateTable(to); + // combine all columns in the 'from' variable excluding ones that aren't in the 'to' variable. + // exclude the ones that aren't in 'to' variable because if the column is deleted, why try to import the data? + var columns = string.Join(", ", from.Columns.Where(c => to.Columns.Any(c2 => c2.Name == c.Name)).Select(c => c.Name)); + var insert = "INSERT INTO {0} ({1}) SELECT {1} FROM {2}".SFormat(escapedTable, columns, tmpTable); + var drop = "DROP TABLE {0}".SFormat(tmpTable); + return "{0}; {1}; {2}; {3};".SFormat(alter, create, insert, drop); + } + + public string DeleteRow(string table, List wheres) + { + return "DELETE FROM {0}{1}".SFormat(EscapeTableName(table), BuildWhere(wheres)); + } + + public string UpdateValue(string table, List values, List wheres) + { + if (0 == values.Count) + throw new ArgumentException("No values supplied"); + + return "UPDATE {0} SET {1}{2}".SFormat(EscapeTableName(table), string.Join(", ", values.Select(v => v.Name + " = " + v.Value)), BuildWhere(wheres)); + } + + public string ReadColumn(string table, List wheres) + { + return "SELECT * FROM {0}{1}".SFormat(EscapeTableName(table), BuildWhere(wheres)); + } + + public string InsertValues(string table, List values) + { + var sbnames = new StringBuilder(); + var sbvalues = new StringBuilder(); + int count = 0; + foreach (SqlValue value in values) + { + sbnames.Append(value.Name); + sbvalues.Append(value.Value.ToString()); + + if (count != values.Count - 1) + { + sbnames.Append(", "); + sbvalues.Append(", "); + } + count++; + } + + return "INSERT INTO {0} ({1}) VALUES ({2})".SFormat(EscapeTableName(table), sbnames, sbvalues); + } + + protected static string BuildWhere(List wheres) + { + if (0 == wheres.Count) + return string.Empty; + + return "WHERE {2}".SFormat(string.Join(", ", wheres.Select(v => v.Name + " = " + v.Value))); + } + } +} From d813a600601c26792f8048c9e4b7a775c1b91e20 Mon Sep 17 00:00:00 2001 From: stevenh Date: Wed, 22 Feb 2012 15:45:47 +0000 Subject: [PATCH 44/73] Fixed resource leak in GetUser fixes #404 Multiple user exception is now passed direct to the caller of GetUser instead of being wrapped --- TShockAPI/DB/UserManager.cs | 55 +++++++++++++++++++++++-------------- 1 file changed, 35 insertions(+), 20 deletions(-) diff --git a/TShockAPI/DB/UserManager.cs b/TShockAPI/DB/UserManager.cs index 7aa6a0d3..68ade122 100644 --- a/TShockAPI/DB/UserManager.cs +++ b/TShockAPI/DB/UserManager.cs @@ -254,35 +254,50 @@ namespace TShockAPI.DB public User GetUser(User user) { + bool multiple = false; + string query; + string type; + object arg; + if (0 != user.ID) + { + query = "SELECT * FROM Users WHERE ID=@0"; + arg = user.ID; + type = "id"; + } + else if (string.IsNullOrEmpty(user.Address)) + { + query = "SELECT * FROM Users WHERE Username=@0"; + arg = user.Name; + type = "name"; + } + else + { + query = "SELECT * FROM Users WHERE IP=@0"; + arg = user.Address; + type = "ip"; + } + try { - QueryResult result; - if (0 != user.ID) - result = database.QueryReader("SELECT * FROM Users WHERE ID=@0", user.ID); - else if (string.IsNullOrEmpty(user.Address)) - result = database.QueryReader("SELECT * FROM Users WHERE Username=@0", user.Name); - else - result = database.QueryReader("SELECT * FROM Users WHERE IP=@0", user.Address); - - if (result.Read()) + using (var result = database.QueryReader(query, arg)) { - user = LoadUserFromResult(user, result); - // Check for multiple matches - if (!result.Read()) - return user; - - if (0 != user.ID) - throw new UserManagerException(String.Format("Multiple users found for id '{0}'", user.ID)); - else if (string.IsNullOrEmpty(user.Address)) - throw new UserManagerException(String.Format("Multiple users found for name '{0}'", user.Name)); - else - throw new UserManagerException(String.Format("Multiple users found for ip '{0}'", user.Address)); + if (result.Read()) + { + user = LoadUserFromResult(user, result); + // Check for multiple matches + if (!result.Read()) + return user; + multiple = true; + } } } catch (Exception ex) { throw new UserManagerException("GetUser SQL returned an error (" + ex.Message + ")", ex); } + if (multiple) + throw new UserManagerException(String.Format("Multiple users found for {0} '{1}'", type, arg)); + throw new UserNotExistException(string.IsNullOrEmpty(user.Address) ? user.Name : user.Address); } From b6b5a2f1ca4400d7e0d813bdd3ad24093a012e56 Mon Sep 17 00:00:00 2001 From: stevenh Date: Fri, 24 Feb 2012 11:37:43 +0000 Subject: [PATCH 45/73] Added compatibiliy shims for old method signatures without which existing compiled plugins will error with missing method ... This fixes #410 --- TShockAPI/DB/BanManager.cs | 15 ++++++++++++++- TShockAPI/DB/GroupManager.cs | 25 ++++++++++++++++++++++--- TShockAPI/Group.cs | 11 +++++++++++ TShockAPI/TShockAPI.csproj | 2 +- TShockAPI/Utils.cs | 21 +++++++++++++++++++++ 5 files changed, 69 insertions(+), 5 deletions(-) diff --git a/TShockAPI/DB/BanManager.cs b/TShockAPI/DB/BanManager.cs index 8b3423cc..d00e8264 100644 --- a/TShockAPI/DB/BanManager.cs +++ b/TShockAPI/DB/BanManager.cs @@ -110,6 +110,13 @@ namespace TShockAPI.DB return null; } +#if COMPAT_SIGS + [Obsolete("This method is for signature compatibility for external code only")] + public bool AddBan(string ip, string name, string reason) + { + return AddBan(ip, name, reason, false); + } +#endif public bool AddBan(string ip, string name = "", string reason = "", bool exceptions = false) { try @@ -124,8 +131,14 @@ namespace TShockAPI.DB } return false; } - +#if COMPAT_SIGS + [Obsolete("This method is for signature compatibility for external code only")] + public bool RemoveBan(string ip) + { + return RemoveBan(ip, false, true, false); + } +#endif public bool RemoveBan(string match, bool byName = false, bool casesensitive = true, bool exceptions = false) { try diff --git a/TShockAPI/DB/GroupManager.cs b/TShockAPI/DB/GroupManager.cs index 125a7bad..573f7ac7 100644 --- a/TShockAPI/DB/GroupManager.cs +++ b/TShockAPI/DB/GroupManager.cs @@ -28,7 +28,6 @@ namespace TShockAPI.DB public class GroupManager : IEnumerable { private IDbConnection database; - public readonly List groups = new List(); public GroupManager(IDbConnection db) @@ -101,7 +100,7 @@ namespace TShockAPI.DB /// permissions /// chatcolor /// exceptions true indicates use exceptions for errors false otherwise - public String AddGroup(String name, string parentname, String permissions, String chatcolor = "255,255,255", bool exceptions = false) + public String AddGroup(String name, string parentname, String permissions, String chatcolor = Group.defaultChatColor, bool exceptions = false) { if (GroupExists(name)) { @@ -142,9 +141,22 @@ namespace TShockAPI.DB public String AddGroup(String name, String permissions) { - return AddGroup(name, "", permissions, "255,255,255"); + return AddGroup(name, null, permissions, Group.defaultChatColor, false); } +#if COMPAT_SIGS + [Obsolete("This method is for signature compatibility for external code only")] + public String AddGroup(String name, string parentname, String permissions) + { + return AddGroup(name, parentname, permissions, Group.defaultChatColor, false); + } + + [Obsolete("This method is for signature compatibility for external code only")] + public String AddGroup(String name, string parentname, String permissions, String chatcolor) + { + return AddGroup(name, parentname, permissions, chatcolor, false); + } +#endif /// /// Updates a group including permissions /// @@ -175,6 +187,13 @@ namespace TShockAPI.DB groups.Add(newgroup); } +#if COMPAT_SIGS + [Obsolete("This method is for signature compatibility for external code only")] + public String DeleteGroup(String name) + { + return DeleteGroup(name, false); + } +#endif public String DeleteGroup(String name, bool exceptions = false) { if (!GroupExists(name)) diff --git a/TShockAPI/Group.cs b/TShockAPI/Group.cs index 65747689..264570fe 100644 --- a/TShockAPI/Group.cs +++ b/TShockAPI/Group.cs @@ -23,6 +23,9 @@ namespace TShockAPI { public class Group { + // NOTE: Using a const still suffers from needing to recompile to change the default + // ideally we would use a static but this means it can't be used for the default parameter :( + public const string defaultChatColor = "255.255.255"; public readonly List permissions = new List(); public readonly List negatedpermissions = new List(); @@ -106,6 +109,14 @@ namespace TShockAPI public byte G = 255; public byte B = 255; +#if COMPAT_SIGS + [Obsolete("This constructor is for signature compatibility for external code only")] + public Group(string groupname, Group parentgroup, string chatcolor) + : this(groupname, parentgroup, chatcolor, null) + { + } +#endif + public Group(string groupname, Group parentgroup = null, string chatcolor = "255,255,255", string permissions = null) { Name = groupname; diff --git a/TShockAPI/TShockAPI.csproj b/TShockAPI/TShockAPI.csproj index 2786fff0..de62800c 100644 --- a/TShockAPI/TShockAPI.csproj +++ b/TShockAPI/TShockAPI.csproj @@ -43,7 +43,7 @@ pdbonly true bin\Release\ - TRACE + TRACE;COMPAT_SIGS prompt 4 true diff --git a/TShockAPI/Utils.cs b/TShockAPI/Utils.cs index 2d2975ae..5fa73d26 100644 --- a/TShockAPI/Utils.cs +++ b/TShockAPI/Utils.cs @@ -530,6 +530,13 @@ namespace TShockAPI Netplay.disconnect = true; } +#if COMPAT_SIGS + [Obsolete("This method is for signature compatibility for external code only")] + public bool ForceKick(TSPlayer player, string reason) + { + return Kick(player, reason, true, false, string.Empty); + } +#endif /// /// Kicks a player from the server without checking for immunetokick permission. /// @@ -541,6 +548,13 @@ namespace TShockAPI Kick(player, reason, true, silent); } +#if COMPAT_SIGS + [Obsolete("This method is for signature compatibility for external code only")] + public bool Kick(TSPlayer player, string reason, string adminUserName) + { + return Kick(player, reason, false, false, adminUserName); + } +#endif /// /// Kicks a player from the server. /// @@ -569,6 +583,13 @@ namespace TShockAPI return false; } +#if COMPAT_SIGS + [Obsolete("This method is for signature compatibility for external code only")] + public bool Ban(TSPlayer player, string reason, string adminUserName) + { + return Ban(player, reason, false, adminUserName); + } +#endif /// /// Bans and kicks a player from the server. /// From 38fbf9bbed3dfe78502312b4cb47784b6e827e6b Mon Sep 17 00:00:00 2001 From: Lucas Nicodemus Date: Sat, 25 Feb 2012 20:02:54 -0700 Subject: [PATCH 46/73] Added new documentation, going to compile from Markdown to HTML and ship in the docs folder. Please don't edit this until I'm done styling it and have it ready for prime time. Removed old changelog (wasn't maintained anyhow, or sent with the shipped product). Removed old docs thing that pointed to the wiki (boo). --- release-docs/changes.txt | 128 --------------------------------- release-docs/documentation.txt | 3 - release-docs/installation.txt | 3 - 3 files changed, 134 deletions(-) delete mode 100644 release-docs/changes.txt delete mode 100644 release-docs/documentation.txt delete mode 100644 release-docs/installation.txt diff --git a/release-docs/changes.txt b/release-docs/changes.txt deleted file mode 100644 index 0b4503ce..00000000 --- a/release-docs/changes.txt +++ /dev/null @@ -1,128 +0,0 @@ -For the full list of changes, please take a look at GitHub: -https://github.com/TShock/TShock/commits/master -From now on, all release notes aren't put here. It's too much to track, but new features will be tossed here. - -Changes in API release 3: - - Added support for SQLite - - Added support for MySQL - - Added /user command, supports adding users via in game command - - Added database editor for editing the MySQL + SQLite DB systems - - Fixed /region list and /warp list - - Fixed Jexius's font exploit - - Added /annoy - - Added canbuild permission - - Fixed mysterious chair rotation system - - Added /ip to retrieve a player's IPv4 address - - Removed /buff - - Added command line paramater -worldpath, which changes the location where Terraria checks for worlds - - Fixed save world race conditions - - Added /login - - Fixed an instance where NPC.maxSpawns was incorrectly referenced in favor of NPC.defaultMaxSpawns - - Chests are ignored from kill tile abuse - - Added /reply (/r) to reply to a /whisper - - Fixed /broadcast spacing - - User names and passwords are now accepted. Passwords are hashed with SHA512 - - Added MaximumLoginAttempts to configuration - - Added /tphere * and /tphere all - - Added /auth-verify to verify and turn off the auth code system - - Added the ability to Log/notify admins when commands are executed. - - Added a new Configuration Flag called "DisableBuild". - - Added command to toggle anti-build. - - Added -ip commandline - - Fixed hair exploit - - Added /rules, reads from ./tshock/rules.txt - - Added AdminChatPrefix configuration option. - - Added ForceKillAll to kick all players. - - Added support to spawn all types of slimes (have to use the full exact name) - - Added /king to spawn king slime. - - Adds protected regions. Use /region help ingame for extra help - - Added warps to tshock, edited some region commands - - Added the ability to ban specific items for being in inventory when joining server - - Added /setspawn command,Sets the spawn point of the server - - Added HardcoreOnly - - Sandgun and Dirt Rod no longer triggers a Impossible to place block. - - Added /displaylogs. Toggles log output to player who executed the command. - - Added -configpath command line parameter to set config path. - - Added broadcasting on map saves - - Added /tphere * and /tphere all - -Still Lots More To Add! :) - -Changes in API release 2.0.0.0: - - Added update checker. - -Changes in API release 1.8.0.0: - - Added permissions system for managing different levels of admins - -- Added one time auth system for new permissions. When you start the server and load the map, you get a one time auth code. Use /auth to become superadmin. - - Check the wiki on Github for more information on Permissions. - - Fixed BanExplosives not doing anything. - - All ban lists have been consolidated into one file, where reasons, IPs, and player names are stored together. - - Fixed spawnrate and max spawns - -Changes in API release 1.6.0.0: - - Added spawn protection - - Fixed numerous bugs - - Added a few commands - -Changes in API release 1.5.0.1: - - Fixed cheat detection - -Changes in API release 1.5.0.0: - - Added /time - - Added /kill - - Fixed /item - - Added /slap [dmg] - - Added broadcast event for kill tile abuse - - Fixed teleport somewhat - - More cheat detection - - Extended new cheat protection to mana - - Update player exploit patched - - Fixed /spawn - - Made /invasion a toggle - -Changes in API release 1.4.0.0: - - The configuration file is now located at config.json - - Something else. - -Changes in API release 1.3.0.1: - - Re-coded the entire command system - - Re-coded the help command - - Implemented what seems to be the most recurring blacklist ever - -Changes in API release 1.3.0.0: - - Added /maxspawns - - Added /spawnrate - - Resetup the configuration file to read spawn rate information. - - Patched the ability for clients to spawn NPCs - - Patched the ability for clients to rewrite the server through SendSection - - Make sure to use this Terraria.exe for the server: (http://dl.dropbox.com/u/29760911/Terraria.exe) - -- Allows spawn rates to be changed - -Changes in API release 1.2.0.1: - - New update system - -Changes in API release 1.2: - - Added /butcher - - Added /heal - - /spawnmob now takes another argument for the amount - - /item now adds items to the inventory directly - - This update credit to Deathmax - -Changes in API release 1.1: - - Added /tp - - Added /tphere - - Added /spawnmob - - Added /item - - Fixed /spawn - - Updated /help - - Everything in this update credit to Deathmax, High, and Shank - -Changes in API release 0.1: - - Added /save to save the world - - Added /spawn to teleport to spawn - - Added broken teleport stuff - - Major re-write of the anti-tnt code (now uses a blacklist instead of a whitelist) - - Fixed server crashing bug of the anti-tnt code - - Made the anti-tnt code decrease the threshold instantaniously - - Re added the update checker. \ No newline at end of file diff --git a/release-docs/documentation.txt b/release-docs/documentation.txt deleted file mode 100644 index ebee2aa4..00000000 --- a/release-docs/documentation.txt +++ /dev/null @@ -1,3 +0,0 @@ -Documentation, NPC lists, Spawn lists, and more can be found on GitHub at: - -https://github.com/TShock/TShock/wiki \ No newline at end of file diff --git a/release-docs/installation.txt b/release-docs/installation.txt deleted file mode 100644 index 26b88e24..00000000 --- a/release-docs/installation.txt +++ /dev/null @@ -1,3 +0,0 @@ -For installation instructions, please refer to: - -https://github.com/TShock/TShock/wiki/Installation-instructions \ No newline at end of file From f7f2d2eb34cd47f72ee075f52919d68783bf199e Mon Sep 17 00:00:00 2001 From: Lucas Nicodemus Date: Sat, 25 Feb 2012 20:20:00 -0700 Subject: [PATCH 47/73] Added the initial installation instructions to the documentation. --- docs/src/index.md | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 docs/src/index.md diff --git a/docs/src/index.md b/docs/src/index.md new file mode 100644 index 00000000..41890314 --- /dev/null +++ b/docs/src/index.md @@ -0,0 +1,42 @@ +# TShock Downloaded Documentation + +*Created for TShock version: 3.5.x.x* + +*Last updated: 2/25/2012* + +---- + +## Preface + +Welcome to the official TShock for Terraria downloaded documentation. This guide will walk through the installation and basic configuration of your newly downloaded TShock server, and should provide a basic knowledge as to how to get help from outside resources if needed. + +## Resources + +* [The Confluence wiki](http://develop.tshock.co:8080/) contains the most up to date information compiled by the community members. If your question isn't answered here, you might find it there. +* [The forums](http://tshock.co/xf/) provide an excellent place to ask other TShock users and developers questions. Please refrain from making posts about questions that may be answered here, however. +* [Our Github page](http://github.com/TShock/TShock) is where you'll be able to find the source code and the bug tracker. +* [IRC](irc://irc.shankshock.com/terraria) is our IRC channel, if you prefer that medium for support. +* Lastly, we can be found in the "Nyx" channel on the Teamspeak 3 server: ts3.shankshock.com, port 9987. + +---- + +## Table of contents + +1. [Installation](#Installation) +2. [Configuration](#Configuration) +3. [Basic usage](#Basic usage) +4. [Plugins](#Plugins) + +---- + +### Installation + +1. Assuming you've extracted TShock, you're done as far as files go. Run the TerrariaServer.exe file in the folder you've extracted TShock into. +2. Check to verify that the server window states that some version of TerrariaShock is now running. If this is not the case, stop. Re-download all files and extract them to a new folder, being sure to keep the file structure in tact. +3. Select a world and port to start the server. *TShock now uses its configuration file to control the number of players on the server. You can edit this value in the configuration file, discussed later. If you are generating a new world, you may experience a significantly longer time as the world creates itself. This is normal. +4. Once the server is finished starting, you will be greeted with TShock's main console window. You will see a message in yellow that states "*To become superadmin, join the game and type /auth*" preceding a series of numbers. This set of numbers we will refer to as the "authcode" in succeeding steps. +5. Connect to the server. Your IP address is 127.0.0.1, and the port will by default be on what you entered in the server console. +6. Immediately chat the following: "**/auth [authcode]**". Replace [authcode] with the code given in the server console. Example: /auth 123456. +7. Next, we will create a user account that you can login to. In the game, chat the command "**/user add [username]:[password] superadmin**". Replace [username] and [password] respectively with your appropriate details. You should be able to remeber your password, and it shouldn't be easily guessed. From now on, the phrase "run the command" is synonymous with "chat in the game chat box". In addition, where brackets ([]) are, we will assume you will replace those brackets with information that you have created. +8. Assuming the last step was a success, login. Run the command "**/login [username] [password]**". +9. To finalize installation, run the command "**/auth-verify**". This will disable the authcode, enable any previously disabled functionality, and allow the server to be used in production. \ No newline at end of file From f807187d0b572106f5fb7a6660fdd861bce8c22d Mon Sep 17 00:00:00 2001 From: Lucas Nicodemus Date: Sat, 25 Feb 2012 21:03:46 -0700 Subject: [PATCH 48/73] Added basic usage. --- docs/src/index.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/docs/src/index.md b/docs/src/index.md index 41890314..dd6f49f5 100644 --- a/docs/src/index.md +++ b/docs/src/index.md @@ -39,4 +39,12 @@ Welcome to the official TShock for Terraria downloaded documentation. This guide 6. Immediately chat the following: "**/auth [authcode]**". Replace [authcode] with the code given in the server console. Example: /auth 123456. 7. Next, we will create a user account that you can login to. In the game, chat the command "**/user add [username]:[password] superadmin**". Replace [username] and [password] respectively with your appropriate details. You should be able to remeber your password, and it shouldn't be easily guessed. From now on, the phrase "run the command" is synonymous with "chat in the game chat box". In addition, where brackets ([]) are, we will assume you will replace those brackets with information that you have created. 8. Assuming the last step was a success, login. Run the command "**/login [username] [password]**". -9. To finalize installation, run the command "**/auth-verify**". This will disable the authcode, enable any previously disabled functionality, and allow the server to be used in production. \ No newline at end of file +9. To finalize installation, run the command "**/auth-verify**". This will disable the authcode, enable any previously disabled functionality, and allow the server to be used in production. + +### Basic Usage + +Now that TShock is running, you may be interested in a few other features prior to playing Terraria. + +* You can add admins through two methods. If the user is already registered, you can use "**/user group [username] [group-to-change-to]**". By default, TShock comes with the "vip" group, the "trustedadmin" group, and the "newadmin" group. +* When you join the server and already have an account, the server will ask for your account password, even if the server has no password setup. In the event that you set a password on the server, unregistered users will be required to enter it. Users that already have an account must enter their own password. +* If a user wishes to change accounts but retain their group, a config option exists that will allow you to allow users to login to accounts with any username. \ No newline at end of file From c8ba96f7467ecf53ce60598d8771c4a28339e70f Mon Sep 17 00:00:00 2001 From: Lucas Nicodemus Date: Sat, 25 Feb 2012 21:06:35 -0700 Subject: [PATCH 49/73] Reordered ToC around --- docs/src/index.md | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/docs/src/index.md b/docs/src/index.md index dd6f49f5..6710cd21 100644 --- a/docs/src/index.md +++ b/docs/src/index.md @@ -23,8 +23,8 @@ Welcome to the official TShock for Terraria downloaded documentation. This guide ## Table of contents 1. [Installation](#Installation) -2. [Configuration](#Configuration) -3. [Basic usage](#Basic usage) +2. [Basic usage](#Basics) +3. [Configuration](#Configuration) 4. [Plugins](#Plugins) ---- @@ -41,7 +41,10 @@ Welcome to the official TShock for Terraria downloaded documentation. This guide 8. Assuming the last step was a success, login. Run the command "**/login [username] [password]**". 9. To finalize installation, run the command "**/auth-verify**". This will disable the authcode, enable any previously disabled functionality, and allow the server to be used in production. -### Basic Usage +---- + + +### Basic Usage Now that TShock is running, you may be interested in a few other features prior to playing Terraria. From e10d9f546a59e28235218fa01e19ae8a2b778afd Mon Sep 17 00:00:00 2001 From: Lucas Nicodemus Date: Sat, 25 Feb 2012 21:36:08 -0700 Subject: [PATCH 50/73] Added configuration file docs Added permission documentation --- docs/src/index.md | 369 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 366 insertions(+), 3 deletions(-) diff --git a/docs/src/index.md b/docs/src/index.md index 6710cd21..8ea40eeb 100644 --- a/docs/src/index.md +++ b/docs/src/index.md @@ -25,7 +25,9 @@ Welcome to the official TShock for Terraria downloaded documentation. This guide 1. [Installation](#Installation) 2. [Basic usage](#Basics) 3. [Configuration](#Configuration) -4. [Plugins](#Plugins) +4. [Permissions](#Permissions) +5. [The config file](#Config) +6. [Plugins](#Plugins) ---- @@ -43,11 +45,372 @@ Welcome to the official TShock for Terraria downloaded documentation. This guide ---- - ### Basic Usage Now that TShock is running, you may be interested in a few other features prior to playing Terraria. * You can add admins through two methods. If the user is already registered, you can use "**/user group [username] [group-to-change-to]**". By default, TShock comes with the "vip" group, the "trustedadmin" group, and the "newadmin" group. * When you join the server and already have an account, the server will ask for your account password, even if the server has no password setup. In the event that you set a password on the server, unregistered users will be required to enter it. Users that already have an account must enter their own password. -* If a user wishes to change accounts but retain their group, a config option exists that will allow you to allow users to login to accounts with any username. \ No newline at end of file +* If a user wishes to change accounts but retain their group, a config option exists that will allow you to allow users to login to accounts with any username. + +---- + +### Configuration + +#### Permissions + +Like Bukkit and other administrative modifications, TShock supports adding groups and permissions. In the current implementation, you can only edit groups ingame, adding and removing them isn't supported *yet*. + +##### Permission Nodes: + +###### allowclientsideworldedit +**Description:** Allow unrestricted Send Tile Square usage, for client side world editing +**Commands:** None + +###### annoy +**Description:** None +**Commands:** /annoy + +###### ban +**Description:** User can ban others +**Commands:** /ban /banip /unban /unbanip + +###### buff +**Description:** User can buff self +**Commands:** /buff + +###### buffplayer +**Description:** User can buff other players +**Commands:** /gbuff(/buffplayer) + +###### butcher +**Description:** User can kill all enemy npcs +**Commands:** /butcher + +###### bypassinventorychecks +**Description:** Bypass Server Side Inventory checks +**Commands:** None + +###### canbuild +**Description:** Required to be able to build (modify tiles and liquid) +**Commands:** None + +###### canchangepassword +**Description:** User can change password in game +**Commands:** /password + +###### canlogin +**Description:** User can login in game +**Commands:** /login + +###### canpartychat +**Description:** User can use party chat in game +**Commands:** /p + +###### canregister +**Description:** User can register account in game +**Commands:** /register + +###### cantalkinthird +**Description:** User can talk in third person +**Commands:** /me + +###### causeevents +**Description:** None +**Commands:** /dropmeteor /star /genore /fullmoon /bloodmoon /invade + +###### cfg +**Description:** User can edit sevrer configurations +**Commands:** /setspawn /reload /serverpassword /save /settle /maxspawns /spawnrate /broadcast(/bc /say) /stats /world + +###### clearitems +**Description:** User can clear item drops. +**Commands:** /clear(/clearitems) + +###### converthardmode +**Description:** User can convert hallow into corruption and vice-versa +**Commands:** /convertcorruption /converthallow /removespecial + +###### editspawn +**Description:** Allows you to edit the spawn +**Commands:** /antibuild /protectspawn + +###### grow +**Description:** None +**Commands:** /grow + +###### hardmode +**Description:** User can change hardmode state. +**Commands:** /hardmode /stophardmode(/disablehardmode) + +###### heal +**Description:** None +**Commands:** /heal + +###### ignoredamagecap +**Description:** Prevents your actions from being ignored if damage is too high +**Commands:** None + +###### ignorekilltiledetection +**Description:** Prevents you from being reverted by kill tile abuse detection +**Commands:** None + +###### ignoreliquidsetdetection +**Description:** Prevents you from being disabled by liquid set abuse detection +**Commands:** None + +###### ignorenoclipdetection +**Description:** Prevents you from being reverted by no clip detection +**Commands:** None + +###### ignoreplacetiledetection +**Description:** Prevents you from being reverted by place tile abuse detection +**Commands:** None + +###### ignoreprojectiledetection +**Description:** Prevents you from being disabled by liquid set abuse detection +**Commands:** None + +###### ignorestackhackdetection +**Description:** Prevents you from being disabled by stack hack detection +**Commands:** None + +###### ignorestathackdetection +**Description:** Prevents you from being kicked by hacked health detection +**Commands:** None + +###### immunetoban +**Description:** Prevents you from being banned +**Commands:** None + +###### immunetokick +**Description:** Prevents you from being kicked +**Commands:** None + +###### item +**Description:** User can spawn items +**Commands:** /item(/i) /give(/g) + +###### kick +**Description:** User can kick others +**Commands:** /kick + +###### kill +**Description:** None +**Commands:** /kill + +###### logs +**Description:** Specific log messages are sent to users with this permission +**Commands:** /displaylogs + +###### maintenance +**Description:** User is notified when an update is available +**Commands:** /clearbans /off(/exit) /restart /off-nosave(/exit-nosave) /checkupdates + +###### managegroup +**Description:** User can manage groups +**Commands:** /addgroup /delgroup /modgroup /group + +###### manageitem +**Description:** User can manage item bans +**Commands:** /additem(/banitem) /delitem(/unbanitem) /listitems(/listbanneditems) /additemgroup /delitemgroup + +###### manageregion +**Description:** User can edit regions +**Commands:** /region /debugreg + +###### managewarp +**Description:** User can manage warps +**Commands:** /setwarp /delwarp /hidewarp + +###### movenpc +**Description:** User can change the homes of NPCs. +**Commands:** None + +###### mute +**Description:** User can mute and unmute users +**Commands:** /mute(/unmute) + +###### pvpfun +**Description:** None +**Commands:** /slap + +###### reservedslot +**Description:** Allows you to bypass the max slots for up to 5 slots above your max +**Commands:** None + +###### rootonly +**Description:** Meant for super admins only +**Commands:** /user /userinfo(/ui) /auth-verify + +###### seeids +**Description:** User can see the id of players with /who +**Commands:** None + +###### spawnboss +**Description:** User can spawn bosses +**Commands:** /eater /eye /king /skeletron /wof(/wallofflesh) /twins /destroyer /skeletronp(/prime) /hardcore + +###### spawnmob +**Description:** User can spawn npcs +**Commands:** /spawnmob(/sm) + +###### startinvasion +**Description:** User can start invasions (Goblin/Snow Legion) using items +**Commands:** None + +###### summonboss +**Description:** User can summon bosses using items +**Commands:** None + +###### time +**Description:** None +**Commands:** /time + +###### tp +**Description:** User can teleport +**Commands:** /home /spawn /tp + +###### tpall +**Description:** Users can tp to anyone +**Commands:** None + +###### tpallow +**Description:** Users can stop people from TPing to them +**Commands:** /tpallow + +###### tphere +**Description:** User can teleport people to them +**Commands:** /tphere /sendwarp(/sw) + +###### tphide +**Description:** Users can tp to people without showing a notice +**Commands:** None + +###### usebanneditem +**Description:** Allows you to use banned items +**Commands:** None + +###### warp +**Description:** User can use warps +**Commands:** /warp + +###### whisper +**Description:** User can whisper to others +**Commands:** /whisper(/w /tell) /reply(/r) + +###### whitelist +**Description:** User can modify the whitelist +**Commands:** /whitelist + +##### Adding permissions: + +To add a permission to a given group, use the command "**/modgroup [add|del] [group] [permission]**". Example: */modgroup add trustedadmin tpall* + +---- + +#### The config file + +Each TShock installation automatically generates a configuration file which can edit basic settings when the server starts. + +The file "config.json" is located in the *tshock* folder, in the same directory as TerrariaServer.exe. + +Being a JSON file, it is extremely critical that you edit the file in a standard text editor. Use [Notepad++](http://notepad-plus-plus.org/) to edit your file, or another text editor used for programming. Before restarting TShock, check the syntax of your file using [JSONLint](http://jsonlint.com/), and verify that it contains no errors. + +An example configuration file is below. + + { + "InvasionMultiplier": 1, + "DefaultMaximumSpawns": 0, + "DefaultSpawnRate": 600, + "ServerPort": 7777, + "EnableWhitelist": false, + "InfiniteInvasion": false, + "PvPMode": "normal", + "SpawnProtection": true, + "SpawnProtectionRadius": 5, + "MaxSlots": 8, + "RangeChecks": true, + "DisableBuild": false, + "SuperAdminChatRGB": [ + 255.0, + 0.0, + 0.0 + ], + "SuperAdminChatPrefix": "(Admin) ", + "SuperAdminChatSuffix": "", + "BackupInterval": 0, + "BackupKeepFor": 60, + "RememberLeavePos": false, + "HardcoreOnly": false, + "MediumcoreOnly": false, + "KickOnMediumcoreDeath": false, + "BanOnMediumcoreDeath": false, + "AutoSave": true, + "MaximumLoginAttempts": 3, + "RconPassword": "", + "RconPort": 7777, + "ServerName": "", + "MasterServer": "127.0.0.1", + "StorageType": "sqlite", + "MySqlHost": "localhost:3306", + "MySqlDbName": "", + "MySqlUsername": "", + "MySqlPassword": "", + "MediumcoreBanReason": "Death results in a ban", + "MediumcoreKickReason": "Death results in a kick", + "EnableDNSHostResolution": false, + "EnableIPBans": true, + "EnableBanOnUsernames": false, + "DefaultRegistrationGroupName": "default", + "DefaultGuestGroupName": "guest", + "DisableSpewLogs": true, + "HashAlgorithm": "sha512", + "BufferPackets": true, + "ServerFullReason": "Server is full", + "ServerFullNoReservedReason": "Server is full. No reserved slots open.", + "SaveWorldOnCrash": true, + "EnableGeoIP": false, + "EnableTokenEndpointAuthentication": false, + "ServerNickname": "TShock Server", + "RestApiEnabled": false, + "RestApiPort": 7878, + "DisableTombstones": true, + "DisplayIPToAdmins": false, + "EnableInsecureTileFixes": true, + "KickProxyUsers": true, + "DisableHardmode": false, + "DisableDungeonGuardian": false, + "ServerSideInventory": false, + "ServerSideInventorySave": 15, + "LogonDiscardThreshold": 250, + "DisablePlayerCountReporting": false, + "DisableClownBombs": false, + "DisableSnowBalls": false, + "ChatFormat": "{1}{2}{3}: {4}", + "ForceTime": "normal", + "TileKillThreshold": 60, + "TilePlaceThreshold": 20, + "TileLiquidThreshold": 15, + "ProjectileThreshold": 50, + "ProjIgnoreShrapnel": true, + "RequireLogin": true, + "DisableInvisPvP": false, + "MaxRangeForDisabled": 10, + "ServerPassword": "", + "RegionProtectChests": false, + "DisableLoginBeforeJoin": false, + "AllowRegisterAnyUsername": false, + "AllowLoginAnyUsername": true, + "MaxDamage": 175, + "MaxProjDamage": 175, + "IgnoreProjUpdate": false, + "IgnoreProjKill": false, + "IgnoreNoClip": false, + "AllowIce": true + } + +In this file, if you wanted to change the maximum players to 64, you would edit that the file so that the line referring to max players looked like so: + + "MaxSlots": 64, + From 8ace4079f131ab3693eb0c97a80f0da6b7b1fb37 Mon Sep 17 00:00:00 2001 From: Lucas Nicodemus Date: Sat, 25 Feb 2012 22:39:48 -0700 Subject: [PATCH 51/73] Added a section on plugins Added closing remarks/credits --- docs/src/index.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/docs/src/index.md b/docs/src/index.md index 8ea40eeb..c4172fbc 100644 --- a/docs/src/index.md +++ b/docs/src/index.md @@ -28,6 +28,7 @@ Welcome to the official TShock for Terraria downloaded documentation. This guide 4. [Permissions](#Permissions) 5. [The config file](#Config) 6. [Plugins](#Plugins) +7. [Closing remarks](#Closing) ---- @@ -414,3 +415,29 @@ In this file, if you wanted to change the maximum players to 64, you would edit "MaxSlots": 64, +---- + +### Plugins + +TShock, like most other administration modifications, allows the use of plugins. Logically, all plugins go in the *serverplugins* folder, and can be **either .dll or .dll-plugin** files. TShock is itself a plugin on the TerrariaServerAPI. + +You can find all plugins on the [forums](http://tshock.co/xf/index.php?forums/plugin-releases.15/), and the documentation for creating plugins can be found on the [wiki](http://develop.tshock.co:8080/display/docs/Plugin+Development). + +--- + +## Closing remarks + +Thanks for downloading TShock. Your continued support helps make TShock what it is today. We wouldn't be here without you. + +From everyone at TShock, thank-you. + +## Credits + +TShock wouldn't be possible without: + +* Xenon Servers +* Kerplunc Gaming +* Multiplay UK +* Atlassian +* Github +* You :) \ No newline at end of file From fc5d0413bfd25bfeb2dfa26e019ec1fca3b72dc7 Mon Sep 17 00:00:00 2001 From: Lucas Nicodemus Date: Sat, 25 Feb 2012 22:42:26 -0700 Subject: [PATCH 52/73] Fixed closing remarks not linking right Added anchor to credits --- docs/src/index.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/src/index.md b/docs/src/index.md index c4172fbc..01d2027e 100644 --- a/docs/src/index.md +++ b/docs/src/index.md @@ -29,6 +29,7 @@ Welcome to the official TShock for Terraria downloaded documentation. This guide 5. [The config file](#Config) 6. [Plugins](#Plugins) 7. [Closing remarks](#Closing) +8. [Credits](#Credits) ---- @@ -425,13 +426,13 @@ You can find all plugins on the [forums](http://tshock.co/xf/index.php?forums/pl --- -## Closing remarks +## Closing remarks Thanks for downloading TShock. Your continued support helps make TShock what it is today. We wouldn't be here without you. From everyone at TShock, thank-you. -## Credits +## Credits TShock wouldn't be possible without: From 9ee0fdcc5d01da237f4d66d395437caaec280e47 Mon Sep 17 00:00:00 2001 From: Lucas Nicodemus Date: Sat, 25 Feb 2012 22:51:19 -0700 Subject: [PATCH 53/73] Added links to various people that help out --- docs/src/index.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/src/index.md b/docs/src/index.md index 01d2027e..e10cd81a 100644 --- a/docs/src/index.md +++ b/docs/src/index.md @@ -436,9 +436,9 @@ From everyone at TShock, thank-you. TShock wouldn't be possible without: -* Xenon Servers -* Kerplunc Gaming -* Multiplay UK -* Atlassian -* Github +* [Xenon Servers](http://xns.cc/) +* [Kerplunc Gaming](http://kerpluncgaming.com/) +* [Multiplay UK](http://multiplay.co.uk/) +* [Atlassian](http://www.atlassian.com/) +* [Github](http://github.com/) * You :) \ No newline at end of file From 7dac821f17f582cebe7acbab4df8f4e366f80830 Mon Sep 17 00:00:00 2001 From: Lucas Nicodemus Date: Sat, 25 Feb 2012 23:04:07 -0700 Subject: [PATCH 54/73] Add readme for building the docs --- docs/readme.md | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 docs/readme.md diff --git a/docs/readme.md b/docs/readme.md new file mode 100644 index 00000000..4c1bec64 --- /dev/null +++ b/docs/readme.md @@ -0,0 +1,10 @@ +# Building + +1. Install [Pandoc](http://johnmacfarlane.net/pandoc). +2. cd to docs/src +3. pandoc index.md -o ../index.html + +# Adding stuff + +1. Everything is [Markdown](http://daringfireball.net/projects/markdown/) +2. If you add a new page, include [Markdown-CSS](https://github.com/clownfart/Markdown-CSS) for best results. \ No newline at end of file From 97d86841b8c1ae832ecb7991c63ae0169d00a505 Mon Sep 17 00:00:00 2001 From: Lucas Nicodemus Date: Sat, 25 Feb 2012 23:04:59 -0700 Subject: [PATCH 55/73] Added a link to the github page --- docs/readme.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/readme.md b/docs/readme.md index 4c1bec64..93ab8875 100644 --- a/docs/readme.md +++ b/docs/readme.md @@ -7,4 +7,8 @@ # Adding stuff 1. Everything is [Markdown](http://daringfireball.net/projects/markdown/) -2. If you add a new page, include [Markdown-CSS](https://github.com/clownfart/Markdown-CSS) for best results. \ No newline at end of file +2. If you add a new page, include [Markdown-CSS](https://github.com/clownfart/Markdown-CSS) for best results. + +# Demo + +You can access the docs at the [TShock Github Page](http://tshock.github.com/). \ No newline at end of file From 06d4f4bc3d51203889025532cbd6e2473d813ce9 Mon Sep 17 00:00:00 2001 From: Lucas Nicodemus Date: Sat, 25 Feb 2012 23:14:12 -0700 Subject: [PATCH 56/73] Added the mythical second method for editing groups. --- docs/src/index.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/src/index.md b/docs/src/index.md index e10cd81a..3bcf00f0 100644 --- a/docs/src/index.md +++ b/docs/src/index.md @@ -1,3 +1,5 @@ + + # TShock Downloaded Documentation *Created for TShock version: 3.5.x.x* @@ -51,7 +53,7 @@ Welcome to the official TShock for Terraria downloaded documentation. This guide Now that TShock is running, you may be interested in a few other features prior to playing Terraria. -* You can add admins through two methods. If the user is already registered, you can use "**/user group [username] [group-to-change-to]**". By default, TShock comes with the "vip" group, the "trustedadmin" group, and the "newadmin" group. +* You can add admins through two methods. If the user is already registered, you can use "**/user group [username] [group-to-change-to]**". By default, TShock comes with the "vip" group, the "trustedadmin" group, and the "newadmin" group. If the user has yet to register, you can use "**/user add [username]:[password] [group]**" to generate an account with elevated permissions for them. * When you join the server and already have an account, the server will ask for your account password, even if the server has no password setup. In the event that you set a password on the server, unregistered users will be required to enter it. Users that already have an account must enter their own password. * If a user wishes to change accounts but retain their group, a config option exists that will allow you to allow users to login to accounts with any username. From 93798af5136c1dabaf7cc18ee8f2014abda3204e Mon Sep 17 00:00:00 2001 From: Lucas Nicodemus Date: Sat, 25 Feb 2012 23:20:04 -0700 Subject: [PATCH 57/73] Moved permissions to a seperate file Added link back to the new permissions file --- docs/src/index.md | 248 +--------------------------------------- docs/src/permissions.md | 248 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 253 insertions(+), 243 deletions(-) create mode 100644 docs/src/permissions.md diff --git a/docs/src/index.md b/docs/src/index.md index 3bcf00f0..21b1c1e6 100644 --- a/docs/src/index.md +++ b/docs/src/index.md @@ -65,251 +65,13 @@ Now that TShock is running, you may be interested in a few other features prior Like Bukkit and other administrative modifications, TShock supports adding groups and permissions. In the current implementation, you can only edit groups ingame, adding and removing them isn't supported *yet*. -##### Permission Nodes: - -###### allowclientsideworldedit -**Description:** Allow unrestricted Send Tile Square usage, for client side world editing -**Commands:** None - -###### annoy -**Description:** None -**Commands:** /annoy - -###### ban -**Description:** User can ban others -**Commands:** /ban /banip /unban /unbanip - -###### buff -**Description:** User can buff self -**Commands:** /buff - -###### buffplayer -**Description:** User can buff other players -**Commands:** /gbuff(/buffplayer) - -###### butcher -**Description:** User can kill all enemy npcs -**Commands:** /butcher - -###### bypassinventorychecks -**Description:** Bypass Server Side Inventory checks -**Commands:** None - -###### canbuild -**Description:** Required to be able to build (modify tiles and liquid) -**Commands:** None - -###### canchangepassword -**Description:** User can change password in game -**Commands:** /password - -###### canlogin -**Description:** User can login in game -**Commands:** /login - -###### canpartychat -**Description:** User can use party chat in game -**Commands:** /p - -###### canregister -**Description:** User can register account in game -**Commands:** /register - -###### cantalkinthird -**Description:** User can talk in third person -**Commands:** /me - -###### causeevents -**Description:** None -**Commands:** /dropmeteor /star /genore /fullmoon /bloodmoon /invade - -###### cfg -**Description:** User can edit sevrer configurations -**Commands:** /setspawn /reload /serverpassword /save /settle /maxspawns /spawnrate /broadcast(/bc /say) /stats /world - -###### clearitems -**Description:** User can clear item drops. -**Commands:** /clear(/clearitems) - -###### converthardmode -**Description:** User can convert hallow into corruption and vice-versa -**Commands:** /convertcorruption /converthallow /removespecial - -###### editspawn -**Description:** Allows you to edit the spawn -**Commands:** /antibuild /protectspawn - -###### grow -**Description:** None -**Commands:** /grow - -###### hardmode -**Description:** User can change hardmode state. -**Commands:** /hardmode /stophardmode(/disablehardmode) - -###### heal -**Description:** None -**Commands:** /heal - -###### ignoredamagecap -**Description:** Prevents your actions from being ignored if damage is too high -**Commands:** None - -###### ignorekilltiledetection -**Description:** Prevents you from being reverted by kill tile abuse detection -**Commands:** None - -###### ignoreliquidsetdetection -**Description:** Prevents you from being disabled by liquid set abuse detection -**Commands:** None - -###### ignorenoclipdetection -**Description:** Prevents you from being reverted by no clip detection -**Commands:** None - -###### ignoreplacetiledetection -**Description:** Prevents you from being reverted by place tile abuse detection -**Commands:** None - -###### ignoreprojectiledetection -**Description:** Prevents you from being disabled by liquid set abuse detection -**Commands:** None - -###### ignorestackhackdetection -**Description:** Prevents you from being disabled by stack hack detection -**Commands:** None - -###### ignorestathackdetection -**Description:** Prevents you from being kicked by hacked health detection -**Commands:** None - -###### immunetoban -**Description:** Prevents you from being banned -**Commands:** None - -###### immunetokick -**Description:** Prevents you from being kicked -**Commands:** None - -###### item -**Description:** User can spawn items -**Commands:** /item(/i) /give(/g) - -###### kick -**Description:** User can kick others -**Commands:** /kick - -###### kill -**Description:** None -**Commands:** /kill - -###### logs -**Description:** Specific log messages are sent to users with this permission -**Commands:** /displaylogs - -###### maintenance -**Description:** User is notified when an update is available -**Commands:** /clearbans /off(/exit) /restart /off-nosave(/exit-nosave) /checkupdates - -###### managegroup -**Description:** User can manage groups -**Commands:** /addgroup /delgroup /modgroup /group - -###### manageitem -**Description:** User can manage item bans -**Commands:** /additem(/banitem) /delitem(/unbanitem) /listitems(/listbanneditems) /additemgroup /delitemgroup - -###### manageregion -**Description:** User can edit regions -**Commands:** /region /debugreg - -###### managewarp -**Description:** User can manage warps -**Commands:** /setwarp /delwarp /hidewarp - -###### movenpc -**Description:** User can change the homes of NPCs. -**Commands:** None - -###### mute -**Description:** User can mute and unmute users -**Commands:** /mute(/unmute) - -###### pvpfun -**Description:** None -**Commands:** /slap - -###### reservedslot -**Description:** Allows you to bypass the max slots for up to 5 slots above your max -**Commands:** None - -###### rootonly -**Description:** Meant for super admins only -**Commands:** /user /userinfo(/ui) /auth-verify - -###### seeids -**Description:** User can see the id of players with /who -**Commands:** None - -###### spawnboss -**Description:** User can spawn bosses -**Commands:** /eater /eye /king /skeletron /wof(/wallofflesh) /twins /destroyer /skeletronp(/prime) /hardcore - -###### spawnmob -**Description:** User can spawn npcs -**Commands:** /spawnmob(/sm) - -###### startinvasion -**Description:** User can start invasions (Goblin/Snow Legion) using items -**Commands:** None - -###### summonboss -**Description:** User can summon bosses using items -**Commands:** None - -###### time -**Description:** None -**Commands:** /time - -###### tp -**Description:** User can teleport -**Commands:** /home /spawn /tp - -###### tpall -**Description:** Users can tp to anyone -**Commands:** None - -###### tpallow -**Description:** Users can stop people from TPing to them -**Commands:** /tpallow - -###### tphere -**Description:** User can teleport people to them -**Commands:** /tphere /sendwarp(/sw) - -###### tphide -**Description:** Users can tp to people without showing a notice -**Commands:** None - -###### usebanneditem -**Description:** Allows you to use banned items -**Commands:** None - -###### warp -**Description:** User can use warps -**Commands:** /warp - -###### whisper -**Description:** User can whisper to others -**Commands:** /whisper(/w /tell) /reply(/r) - -###### whitelist -**Description:** User can modify the whitelist -**Commands:** /whitelist - ##### Adding permissions: -To add a permission to a given group, use the command "**/modgroup [add|del] [group] [permission]**". Example: */modgroup add trustedadmin tpall* +To add a permission to a given group, use the command "**/modgroup [add|del] [group] [permission]**". Example: */modgroup add trustedadmin tpall*. + +##### Permission nodes: + +[A list of permission nodes can be found here.](permissions.html) ---- diff --git a/docs/src/permissions.md b/docs/src/permissions.md new file mode 100644 index 00000000..fffb80e8 --- /dev/null +++ b/docs/src/permissions.md @@ -0,0 +1,248 @@ + + +# Intro + +These are the permissions that TShock currently supports, with associated commands. [Back to docs](index.html) + +---- + +## allowclientsideworldedit +**Description:** Allow unrestricted Send Tile Square usage, for client side world editing +**Commands:** None + +## annoy +**Description:** None +**Commands:** /annoy + +## ban +**Description:** User can ban others +**Commands:** /ban /banip /unban /unbanip + +## buff +**Description:** User can buff self +**Commands:** /buff + +## buffplayer +**Description:** User can buff other players +**Commands:** /gbuff(/buffplayer) + +## butcher +**Description:** User can kill all enemy npcs +**Commands:** /butcher + +## bypassinventorychecks +**Description:** Bypass Server Side Inventory checks +**Commands:** None + +## canbuild +**Description:** Required to be able to build (modify tiles and liquid) +**Commands:** None + +## canchangepassword +**Description:** User can change password in game +**Commands:** /password + +## canlogin +**Description:** User can login in game +**Commands:** /login + +## canpartychat +**Description:** User can use party chat in game +**Commands:** /p + +## canregister +**Description:** User can register account in game +**Commands:** /register + +## cantalkinthird +**Description:** User can talk in third person +**Commands:** /me + +## causeevents +**Description:** None +**Commands:** /dropmeteor /star /genore /fullmoon /bloodmoon /invade + +## cfg +**Description:** User can edit sevrer configurations +**Commands:** /setspawn /reload /serverpassword /save /settle /maxspawns /spawnrate /broadcast(/bc /say) /stats /world + +## clearitems +**Description:** User can clear item drops. +**Commands:** /clear(/clearitems) + +## converthardmode +**Description:** User can convert hallow into corruption and vice-versa +**Commands:** /convertcorruption /converthallow /removespecial + +## editspawn +**Description:** Allows you to edit the spawn +**Commands:** /antibuild /protectspawn + +## grow +**Description:** None +**Commands:** /grow + +## hardmode +**Description:** User can change hardmode state. +**Commands:** /hardmode /stophardmode(/disablehardmode) + +## heal +**Description:** None +**Commands:** /heal + +## ignoredamagecap +**Description:** Prevents your actions from being ignored if damage is too high +**Commands:** None + +## ignorekilltiledetection +**Description:** Prevents you from being reverted by kill tile abuse detection +**Commands:** None + +## ignoreliquidsetdetection +**Description:** Prevents you from being disabled by liquid set abuse detection +**Commands:** None + +## ignorenoclipdetection +**Description:** Prevents you from being reverted by no clip detection +**Commands:** None + +## ignoreplacetiledetection +**Description:** Prevents you from being reverted by place tile abuse detection +**Commands:** None + +## ignoreprojectiledetection +**Description:** Prevents you from being disabled by liquid set abuse detection +**Commands:** None + +## ignorestackhackdetection +**Description:** Prevents you from being disabled by stack hack detection +**Commands:** None + +## ignorestathackdetection +**Description:** Prevents you from being kicked by hacked health detection +**Commands:** None + +## immunetoban +**Description:** Prevents you from being banned +**Commands:** None + +## immunetokick +**Description:** Prevents you from being kicked +**Commands:** None + +## item +**Description:** User can spawn items +**Commands:** /item(/i) /give(/g) + +## kick +**Description:** User can kick others +**Commands:** /kick + +## kill +**Description:** None +**Commands:** /kill + +## logs +**Description:** Specific log messages are sent to users with this permission +**Commands:** /displaylogs + +## maintenance +**Description:** User is notified when an update is available +**Commands:** /clearbans /off(/exit) /restart /off-nosave(/exit-nosave) /checkupdates + +## managegroup +**Description:** User can manage groups +**Commands:** /addgroup /delgroup /modgroup /group + +## manageitem +**Description:** User can manage item bans +**Commands:** /additem(/banitem) /delitem(/unbanitem) /listitems(/listbanneditems) /additemgroup /delitemgroup + +## manageregion +**Description:** User can edit regions +**Commands:** /region /debugreg + +## managewarp +**Description:** User can manage warps +**Commands:** /setwarp /delwarp /hidewarp + +## movenpc +**Description:** User can change the homes of NPCs. +**Commands:** None + +## mute +**Description:** User can mute and unmute users +**Commands:** /mute(/unmute) + +## pvpfun +**Description:** None +**Commands:** /slap + +## reservedslot +**Description:** Allows you to bypass the max slots for up to 5 slots above your max +**Commands:** None + +## rootonly +**Description:** Meant for super admins only +**Commands:** /user /userinfo(/ui) /auth-verify + +## seeids +**Description:** User can see the id of players with /who +**Commands:** None + +## spawnboss +**Description:** User can spawn bosses +**Commands:** /eater /eye /king /skeletron /wof(/wallofflesh) /twins /destroyer /skeletronp(/prime) /hardcore + +## spawnmob +**Description:** User can spawn npcs +**Commands:** /spawnmob(/sm) + +## startinvasion +**Description:** User can start invasions (Goblin/Snow Legion) using items +**Commands:** None + +## summonboss +**Description:** User can summon bosses using items +**Commands:** None + +## time +**Description:** None +**Commands:** /time + +## tp +**Description:** User can teleport +**Commands:** /home /spawn /tp + +## tpall +**Description:** Users can tp to anyone +**Commands:** None + +## tpallow +**Description:** Users can stop people from TPing to them +**Commands:** /tpallow + +## tphere +**Description:** User can teleport people to them +**Commands:** /tphere /sendwarp(/sw) + +## tphide +**Description:** Users can tp to people without showing a notice +**Commands:** None + +## usebanneditem +**Description:** Allows you to use banned items +**Commands:** None + +## warp +**Description:** User can use warps +**Commands:** /warp + +## whisper +**Description:** User can whisper to others +**Commands:** /whisper(/w /tell) /reply(/r) + +## whitelist +**Description:** User can modify the whitelist +**Commands:** /whitelist + From 01188a3c7a9d8574b9141bcec2a0f40e124532ef Mon Sep 17 00:00:00 2001 From: Lucas Nicodemus Date: Sat, 25 Feb 2012 23:20:58 -0700 Subject: [PATCH 58/73] Updated readme --- docs/readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/readme.md b/docs/readme.md index 93ab8875..bd824080 100644 --- a/docs/readme.md +++ b/docs/readme.md @@ -2,7 +2,7 @@ 1. Install [Pandoc](http://johnmacfarlane.net/pandoc). 2. cd to docs/src -3. pandoc index.md -o ../index.html +3. pandoc *.md -o ../ # Adding stuff From 3befa63e30d9612a8edacfc73c6bfbea9fc8f787 Mon Sep 17 00:00:00 2001 From: Lucas Nicodemus Date: Sat, 25 Feb 2012 23:25:11 -0700 Subject: [PATCH 59/73] Changed readme to be more effective --- docs/readme.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/readme.md b/docs/readme.md index bd824080..7f29d689 100644 --- a/docs/readme.md +++ b/docs/readme.md @@ -2,7 +2,8 @@ 1. Install [Pandoc](http://johnmacfarlane.net/pandoc). 2. cd to docs/src -3. pandoc *.md -o ../ +3. pandoc index.md -o ../index.html +4. pandoc permissions.md -o ../permissions.html # Adding stuff From c62bd442ec9c5f3f621c8d5adbdf94eec1eca844 Mon Sep 17 00:00:00 2001 From: Lucas Nicodemus Date: Sat, 25 Feb 2012 23:28:18 -0700 Subject: [PATCH 60/73] Permissions now outputs a better markdown dump --- TShockAPI/Permissions.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TShockAPI/Permissions.cs b/TShockAPI/Permissions.cs index fb79bdca..9933b95b 100644 --- a/TShockAPI/Permissions.cs +++ b/TShockAPI/Permissions.cs @@ -200,7 +200,7 @@ namespace TShockAPI c => c.Name + (c.Names.Count > 1 ? "({0})".SFormat(string.Join(" ", c.Names.ToArray(), 1, c.Names.Count - 1)) : "")); - sb.AppendLine("## {0} ".SFormat(name)); + sb.AppendLine("## {0} ".SFormat(name)); sb.AppendLine("**Description:** {0} ".SFormat(desc)); sb.AppendLine("**Commands:** {0} ".SFormat(strs.Count() > 0 ? string.Join(" ", strs) : "None")); sb.AppendLine(); From 6527799ec04190399ad0a6ef081e8e0287e95272 Mon Sep 17 00:00:00 2001 From: Lucas Nicodemus Date: Sun, 26 Feb 2012 03:31:22 -0700 Subject: [PATCH 61/73] Separated out all sections into smaller files for easier browsing :) --- TShockAPI/Properties/AssemblyInfo.cs | 4 +- docs/src/index.md | 173 +-------------------------- docs/src/permissions.md | 4 +- 3 files changed, 8 insertions(+), 173 deletions(-) diff --git a/TShockAPI/Properties/AssemblyInfo.cs b/TShockAPI/Properties/AssemblyInfo.cs index c9e9f598..4a80bb77 100644 --- a/TShockAPI/Properties/AssemblyInfo.cs +++ b/TShockAPI/Properties/AssemblyInfo.cs @@ -48,5 +48,5 @@ using System.Runtime.InteropServices; // Build Number // MMdd of the build -[assembly: AssemblyVersion("3.7.0.0209")] -[assembly: AssemblyFileVersion("3.7.0.0209")] +[assembly: AssemblyVersion("3.7.0.0225")] +[assembly: AssemblyFileVersion("3.7.0.0225")] diff --git a/docs/src/index.md b/docs/src/index.md index 21b1c1e6..c4f7ce0e 100644 --- a/docs/src/index.md +++ b/docs/src/index.md @@ -24,178 +24,13 @@ Welcome to the official TShock for Terraria downloaded documentation. This guide ## Table of contents -1. [Installation](#Installation) -2. [Basic usage](#Basics) -3. [Configuration](#Configuration) -4. [Permissions](#Permissions) -5. [The config file](#Config) -6. [Plugins](#Plugins) -7. [Closing remarks](#Closing) -8. [Credits](#Credits) +1. [Installation & basic usage](install.html) +2. [Permissions](perms.html) +3. [The config file](config.html) +4. [Credits](#Credits) ---- -### Installation - -1. Assuming you've extracted TShock, you're done as far as files go. Run the TerrariaServer.exe file in the folder you've extracted TShock into. -2. Check to verify that the server window states that some version of TerrariaShock is now running. If this is not the case, stop. Re-download all files and extract them to a new folder, being sure to keep the file structure in tact. -3. Select a world and port to start the server. *TShock now uses its configuration file to control the number of players on the server. You can edit this value in the configuration file, discussed later. If you are generating a new world, you may experience a significantly longer time as the world creates itself. This is normal. -4. Once the server is finished starting, you will be greeted with TShock's main console window. You will see a message in yellow that states "*To become superadmin, join the game and type /auth*" preceding a series of numbers. This set of numbers we will refer to as the "authcode" in succeeding steps. -5. Connect to the server. Your IP address is 127.0.0.1, and the port will by default be on what you entered in the server console. -6. Immediately chat the following: "**/auth [authcode]**". Replace [authcode] with the code given in the server console. Example: /auth 123456. -7. Next, we will create a user account that you can login to. In the game, chat the command "**/user add [username]:[password] superadmin**". Replace [username] and [password] respectively with your appropriate details. You should be able to remeber your password, and it shouldn't be easily guessed. From now on, the phrase "run the command" is synonymous with "chat in the game chat box". In addition, where brackets ([]) are, we will assume you will replace those brackets with information that you have created. -8. Assuming the last step was a success, login. Run the command "**/login [username] [password]**". -9. To finalize installation, run the command "**/auth-verify**". This will disable the authcode, enable any previously disabled functionality, and allow the server to be used in production. - ----- - -### Basic Usage - -Now that TShock is running, you may be interested in a few other features prior to playing Terraria. - -* You can add admins through two methods. If the user is already registered, you can use "**/user group [username] [group-to-change-to]**". By default, TShock comes with the "vip" group, the "trustedadmin" group, and the "newadmin" group. If the user has yet to register, you can use "**/user add [username]:[password] [group]**" to generate an account with elevated permissions for them. -* When you join the server and already have an account, the server will ask for your account password, even if the server has no password setup. In the event that you set a password on the server, unregistered users will be required to enter it. Users that already have an account must enter their own password. -* If a user wishes to change accounts but retain their group, a config option exists that will allow you to allow users to login to accounts with any username. - ----- - -### Configuration - -#### Permissions - -Like Bukkit and other administrative modifications, TShock supports adding groups and permissions. In the current implementation, you can only edit groups ingame, adding and removing them isn't supported *yet*. - -##### Adding permissions: - -To add a permission to a given group, use the command "**/modgroup [add|del] [group] [permission]**". Example: */modgroup add trustedadmin tpall*. - -##### Permission nodes: - -[A list of permission nodes can be found here.](permissions.html) - ----- - -#### The config file - -Each TShock installation automatically generates a configuration file which can edit basic settings when the server starts. - -The file "config.json" is located in the *tshock* folder, in the same directory as TerrariaServer.exe. - -Being a JSON file, it is extremely critical that you edit the file in a standard text editor. Use [Notepad++](http://notepad-plus-plus.org/) to edit your file, or another text editor used for programming. Before restarting TShock, check the syntax of your file using [JSONLint](http://jsonlint.com/), and verify that it contains no errors. - -An example configuration file is below. - - { - "InvasionMultiplier": 1, - "DefaultMaximumSpawns": 0, - "DefaultSpawnRate": 600, - "ServerPort": 7777, - "EnableWhitelist": false, - "InfiniteInvasion": false, - "PvPMode": "normal", - "SpawnProtection": true, - "SpawnProtectionRadius": 5, - "MaxSlots": 8, - "RangeChecks": true, - "DisableBuild": false, - "SuperAdminChatRGB": [ - 255.0, - 0.0, - 0.0 - ], - "SuperAdminChatPrefix": "(Admin) ", - "SuperAdminChatSuffix": "", - "BackupInterval": 0, - "BackupKeepFor": 60, - "RememberLeavePos": false, - "HardcoreOnly": false, - "MediumcoreOnly": false, - "KickOnMediumcoreDeath": false, - "BanOnMediumcoreDeath": false, - "AutoSave": true, - "MaximumLoginAttempts": 3, - "RconPassword": "", - "RconPort": 7777, - "ServerName": "", - "MasterServer": "127.0.0.1", - "StorageType": "sqlite", - "MySqlHost": "localhost:3306", - "MySqlDbName": "", - "MySqlUsername": "", - "MySqlPassword": "", - "MediumcoreBanReason": "Death results in a ban", - "MediumcoreKickReason": "Death results in a kick", - "EnableDNSHostResolution": false, - "EnableIPBans": true, - "EnableBanOnUsernames": false, - "DefaultRegistrationGroupName": "default", - "DefaultGuestGroupName": "guest", - "DisableSpewLogs": true, - "HashAlgorithm": "sha512", - "BufferPackets": true, - "ServerFullReason": "Server is full", - "ServerFullNoReservedReason": "Server is full. No reserved slots open.", - "SaveWorldOnCrash": true, - "EnableGeoIP": false, - "EnableTokenEndpointAuthentication": false, - "ServerNickname": "TShock Server", - "RestApiEnabled": false, - "RestApiPort": 7878, - "DisableTombstones": true, - "DisplayIPToAdmins": false, - "EnableInsecureTileFixes": true, - "KickProxyUsers": true, - "DisableHardmode": false, - "DisableDungeonGuardian": false, - "ServerSideInventory": false, - "ServerSideInventorySave": 15, - "LogonDiscardThreshold": 250, - "DisablePlayerCountReporting": false, - "DisableClownBombs": false, - "DisableSnowBalls": false, - "ChatFormat": "{1}{2}{3}: {4}", - "ForceTime": "normal", - "TileKillThreshold": 60, - "TilePlaceThreshold": 20, - "TileLiquidThreshold": 15, - "ProjectileThreshold": 50, - "ProjIgnoreShrapnel": true, - "RequireLogin": true, - "DisableInvisPvP": false, - "MaxRangeForDisabled": 10, - "ServerPassword": "", - "RegionProtectChests": false, - "DisableLoginBeforeJoin": false, - "AllowRegisterAnyUsername": false, - "AllowLoginAnyUsername": true, - "MaxDamage": 175, - "MaxProjDamage": 175, - "IgnoreProjUpdate": false, - "IgnoreProjKill": false, - "IgnoreNoClip": false, - "AllowIce": true - } - -In this file, if you wanted to change the maximum players to 64, you would edit that the file so that the line referring to max players looked like so: - - "MaxSlots": 64, - ----- - -### Plugins - -TShock, like most other administration modifications, allows the use of plugins. Logically, all plugins go in the *serverplugins* folder, and can be **either .dll or .dll-plugin** files. TShock is itself a plugin on the TerrariaServerAPI. - -You can find all plugins on the [forums](http://tshock.co/xf/index.php?forums/plugin-releases.15/), and the documentation for creating plugins can be found on the [wiki](http://develop.tshock.co:8080/display/docs/Plugin+Development). - ---- - -## Closing remarks - -Thanks for downloading TShock. Your continued support helps make TShock what it is today. We wouldn't be here without you. - -From everyone at TShock, thank-you. - ## Credits TShock wouldn't be possible without: diff --git a/docs/src/permissions.md b/docs/src/permissions.md index fffb80e8..10b6c5f3 100644 --- a/docs/src/permissions.md +++ b/docs/src/permissions.md @@ -1,8 +1,8 @@ -# Intro +# Permission Nodes -These are the permissions that TShock currently supports, with associated commands. [Back to docs](index.html) +These are the permissions that TShock currently supports, with associated commands. [Back to permissions](perms.html) ---- From db4130db9ed02f741bd8060d721d234a643e2a06 Mon Sep 17 00:00:00 2001 From: Lucas Nicodemus Date: Sun, 26 Feb 2012 03:32:50 -0700 Subject: [PATCH 62/73] Accidentally forgot to stage new files --- docs/src/config.md | 110 ++++++++++++++++++++++++++++++++++++++++++++ docs/src/install.md | 35 ++++++++++++++ docs/src/perms.md | 17 +++++++ 3 files changed, 162 insertions(+) create mode 100644 docs/src/config.md create mode 100644 docs/src/install.md create mode 100644 docs/src/perms.md diff --git a/docs/src/config.md b/docs/src/config.md new file mode 100644 index 00000000..e4697715 --- /dev/null +++ b/docs/src/config.md @@ -0,0 +1,110 @@ + + +# The config file + +[Back to index](index.html) + +---- + +Each TShock installation automatically generates a configuration file which can edit basic settings when the server starts. + +The file "config.json" is located in the *tshock* folder, in the same directory as TerrariaServer.exe. + +Being a JSON file, it is extremely critical that you edit the file in a standard text editor. Use [Notepad++](http://notepad-plus-plus.org/) to edit your file, or another text editor used for programming. Before restarting TShock, check the syntax of your file using [JSONLint](http://jsonlint.com/), and verify that it contains no errors. + +An example configuration file is below. + + { + "InvasionMultiplier": 1, + "DefaultMaximumSpawns": 0, + "DefaultSpawnRate": 600, + "ServerPort": 7777, + "EnableWhitelist": false, + "InfiniteInvasion": false, + "PvPMode": "normal", + "SpawnProtection": true, + "SpawnProtectionRadius": 5, + "MaxSlots": 8, + "RangeChecks": true, + "DisableBuild": false, + "SuperAdminChatRGB": [ + 255.0, + 0.0, + 0.0 + ], + "SuperAdminChatPrefix": "(Admin) ", + "SuperAdminChatSuffix": "", + "BackupInterval": 0, + "BackupKeepFor": 60, + "RememberLeavePos": false, + "HardcoreOnly": false, + "MediumcoreOnly": false, + "KickOnMediumcoreDeath": false, + "BanOnMediumcoreDeath": false, + "AutoSave": true, + "MaximumLoginAttempts": 3, + "RconPassword": "", + "RconPort": 7777, + "ServerName": "", + "MasterServer": "127.0.0.1", + "StorageType": "sqlite", + "MySqlHost": "localhost:3306", + "MySqlDbName": "", + "MySqlUsername": "", + "MySqlPassword": "", + "MediumcoreBanReason": "Death results in a ban", + "MediumcoreKickReason": "Death results in a kick", + "EnableDNSHostResolution": false, + "EnableIPBans": true, + "EnableBanOnUsernames": false, + "DefaultRegistrationGroupName": "default", + "DefaultGuestGroupName": "guest", + "DisableSpewLogs": true, + "HashAlgorithm": "sha512", + "BufferPackets": true, + "ServerFullReason": "Server is full", + "ServerFullNoReservedReason": "Server is full. No reserved slots open.", + "SaveWorldOnCrash": true, + "EnableGeoIP": false, + "EnableTokenEndpointAuthentication": false, + "ServerNickname": "TShock Server", + "RestApiEnabled": false, + "RestApiPort": 7878, + "DisableTombstones": true, + "DisplayIPToAdmins": false, + "EnableInsecureTileFixes": true, + "KickProxyUsers": true, + "DisableHardmode": false, + "DisableDungeonGuardian": false, + "ServerSideInventory": false, + "ServerSideInventorySave": 15, + "LogonDiscardThreshold": 250, + "DisablePlayerCountReporting": false, + "DisableClownBombs": false, + "DisableSnowBalls": false, + "ChatFormat": "{1}{2}{3}: {4}", + "ForceTime": "normal", + "TileKillThreshold": 60, + "TilePlaceThreshold": 20, + "TileLiquidThreshold": 15, + "ProjectileThreshold": 50, + "ProjIgnoreShrapnel": true, + "RequireLogin": true, + "DisableInvisPvP": false, + "MaxRangeForDisabled": 10, + "ServerPassword": "", + "RegionProtectChests": false, + "DisableLoginBeforeJoin": false, + "AllowRegisterAnyUsername": false, + "AllowLoginAnyUsername": true, + "MaxDamage": 175, + "MaxProjDamage": 175, + "IgnoreProjUpdate": false, + "IgnoreProjKill": false, + "IgnoreNoClip": false, + "AllowIce": true + } + +In this file, if you wanted to change the maximum players to 64, you would edit that the file so that the line referring to max players looked like so: + + "MaxSlots": 64, \ No newline at end of file diff --git a/docs/src/install.md b/docs/src/install.md new file mode 100644 index 00000000..06022404 --- /dev/null +++ b/docs/src/install.md @@ -0,0 +1,35 @@ + + +# Install instructions & basic usage + +[Back to index](index.html) + +---- + +1. Assuming you've extracted TShock, you're done as far as files go. Run the TerrariaServer.exe file in the folder you've extracted TShock into. +2. Check to verify that the server window states that some version of TerrariaShock is now running. If this is not the case, stop. Re-download all files and extract them to a new folder, being sure to keep the file structure in tact. +3. Select a world and port to start the server. *TShock now uses its configuration file to control the number of players on the server. You can edit this value in the configuration file, discussed later. If you are generating a new world, you may experience a significantly longer time as the world creates itself. This is normal. +4. Once the server is finished starting, you will be greeted with TShock's main console window. You will see a message in yellow that states "*To become superadmin, join the game and type /auth*" preceding a series of numbers. This set of numbers we will refer to as the "authcode" in succeeding steps. +5. Connect to the server. Your IP address is 127.0.0.1, and the port will by default be on what you entered in the server console. +6. Immediately chat the following: "**/auth [authcode]**". Replace [authcode] with the code given in the server console. Example: /auth 123456. +7. Next, we will create a user account that you can login to. In the game, chat the command "**/user add [username]:[password] superadmin**". Replace [username] and [password] respectively with your appropriate details. You should be able to remeber your password, and it shouldn't be easily guessed. From now on, the phrase "run the command" is synonymous with "chat in the game chat box". In addition, where brackets ([]) are, we will assume you will replace those brackets with information that you have created. +8. Assuming the last step was a success, login. Run the command "**/login [username] [password]**". +9. To finalize installation, run the command "**/auth-verify**". This will disable the authcode, enable any previously disabled functionality, and allow the server to be used in production. + +---- + +### Basic Usage + +Now that TShock is running, you may be interested in a few other features prior to playing Terraria. + +* You can add admins through two methods. If the user is already registered, you can use "**/user group [username] [group-to-change-to]**". By default, TShock comes with the "vip" group, the "trustedadmin" group, and the "newadmin" group. If the user has yet to register, you can use "**/user add [username]:[password] [group]**" to generate an account with elevated permissions for them. +* When you join the server and already have an account, the server will ask for your account password, even if the server has no password setup. In the event that you set a password on the server, unregistered users will be required to enter it. Users that already have an account must enter their own password. +* If a user wishes to change accounts but retain their group, a config option exists that will allow you to allow users to login to accounts with any username. + +---- + +## Closing remarks + +Thanks for downloading TShock. Your continued support helps make TShock what it is today. We wouldn't be here without you. + +From everyone at TShock, thank-you. \ No newline at end of file diff --git a/docs/src/perms.md b/docs/src/perms.md new file mode 100644 index 00000000..e5cdbdc6 --- /dev/null +++ b/docs/src/perms.md @@ -0,0 +1,17 @@ + + +# Permissions + +[Back to index](index.html) + +## Permissions + +Like Bukkit and other administrative modifications, TShock supports adding groups and permissions. In the current implementation, you can only edit groups ingame, adding and removing them isn't supported *yet*. + +## Adding permissions: + +To add a permission to a given group, use the command "**/modgroup [add|del] [group] [permission]**". Example: */modgroup add trustedadmin tpall*. + +## Permission nodes: + +[A list of permission nodes can be found here.](permissions.html) \ No newline at end of file From 823871dac150e0596d96f7e6eec739c8965eda52 Mon Sep 17 00:00:00 2001 From: Lucas Nicodemus Date: Sun, 26 Feb 2012 12:14:57 -0700 Subject: [PATCH 63/73] Added pandoc generator --- docs/generate.bat | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 docs/generate.bat diff --git a/docs/generate.bat b/docs/generate.bat new file mode 100644 index 00000000..b5bfc3d0 --- /dev/null +++ b/docs/generate.bat @@ -0,0 +1,6 @@ +@echo off +:main +echo Generating Pandoc docs +cd src +for %%F in (*.md) do pandoc %%F > %%F.html +pause \ No newline at end of file From 4d796c727e2e05239224d3aa67b42d7f9f35dcf1 Mon Sep 17 00:00:00 2001 From: Lucas Nicodemus Date: Sun, 26 Feb 2012 12:18:27 -0700 Subject: [PATCH 64/73] Pointing to .md.html files, this will allow generation to happen without any external copying. --- docs/src/config.md | 2 +- docs/src/index.md | 6 +++--- docs/src/install.md | 2 +- docs/src/permissions.md | 2 +- docs/src/perms.md | 4 ++-- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/src/config.md b/docs/src/config.md index e4697715..af47422d 100644 --- a/docs/src/config.md +++ b/docs/src/config.md @@ -2,7 +2,7 @@ # The config file -[Back to index](index.html) +[Back to index](index.md.html) ---- diff --git a/docs/src/index.md b/docs/src/index.md index c4f7ce0e..4c7dd880 100644 --- a/docs/src/index.md +++ b/docs/src/index.md @@ -24,9 +24,9 @@ Welcome to the official TShock for Terraria downloaded documentation. This guide ## Table of contents -1. [Installation & basic usage](install.html) -2. [Permissions](perms.html) -3. [The config file](config.html) +1. [Installation & basic usage](install.md.html) +2. [Permissions](perms.md.html) +3. [The config file](config.md.html) 4. [Credits](#Credits) ---- diff --git a/docs/src/install.md b/docs/src/install.md index 06022404..99d0a349 100644 --- a/docs/src/install.md +++ b/docs/src/install.md @@ -2,7 +2,7 @@ # Install instructions & basic usage -[Back to index](index.html) +[Back to index](index.md.html) ---- diff --git a/docs/src/permissions.md b/docs/src/permissions.md index 10b6c5f3..49242fa9 100644 --- a/docs/src/permissions.md +++ b/docs/src/permissions.md @@ -2,7 +2,7 @@ # Permission Nodes -These are the permissions that TShock currently supports, with associated commands. [Back to permissions](perms.html) +These are the permissions that TShock currently supports, with associated commands. [Back to permissions](perms.md.html) ---- diff --git a/docs/src/perms.md b/docs/src/perms.md index e5cdbdc6..c51fdde0 100644 --- a/docs/src/perms.md +++ b/docs/src/perms.md @@ -2,7 +2,7 @@ # Permissions -[Back to index](index.html) +[Back to index](index.md.html) ## Permissions @@ -14,4 +14,4 @@ To add a permission to a given group, use the command "**/modgroup [add|del] [gr ## Permission nodes: -[A list of permission nodes can be found here.](permissions.html) \ No newline at end of file +[A list of permission nodes can be found here.](permissions.md.html) \ No newline at end of file From 99384180c8f554cff2355b14c263a6fe39e2f355 Mon Sep 17 00:00:00 2001 From: stevenh Date: Tue, 28 Feb 2012 00:16:48 +0000 Subject: [PATCH 65/73] Added -logformat & -logclear command line options to fix #420 --- TShockAPI/TShock.cs | 74 ++++++++++++++++++++++++++++++--------------- 1 file changed, 49 insertions(+), 25 deletions(-) diff --git a/TShockAPI/TShock.cs b/TShockAPI/TShock.cs index 78c56be6..637f061e 100755 --- a/TShockAPI/TShock.cs +++ b/TShockAPI/TShock.cs @@ -40,6 +40,9 @@ namespace TShockAPI [APIVersion(1, 11)] public class TShock : TerrariaPlugin { + private const string LogFormatDefault = "yyyyMMddHHmmss"; + private static string LogFormat = LogFormatDefault; + private static bool LogClear = false; public static readonly Version VersionNum = Assembly.GetExecutingAssembly().GetName().Version; public static readonly string VersionCodename = "Squashing bugs, and adding suggestions"; @@ -111,13 +114,23 @@ namespace TShockAPI if (!Directory.Exists(SavePath)) Directory.CreateDirectory(SavePath); - DateTime now = DateTime.Now; + DateTime now = DateTime.Now; + string logFilename; + try + { + logFilename = Path.Combine(SavePath, now.ToString(LogFormat)+".log"); + } + catch(Exception) + { + // Problem with the log format use the default + logFilename = Path.Combine(SavePath, now.ToString(LogFormatDefault) + ".log"); + } #if DEBUG - Log.Initialize(Path.Combine(SavePath, now.ToString("yyyyMMddHHmmss")+".log"), LogLevel.All, false); + Log.Initialize(logFilename, LogLevel.All, false); #else - Log.Initialize(Path.Combine(SavePath, now.ToString("yyyyMMddHHmmss")+".log"), LogLevel.All & ~LogLevel.Debug, false); + Log.Initialize(logFilename, LogLevel.All & ~LogLevel.Debug, LogClear); #endif - AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; + AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; try { @@ -332,30 +345,41 @@ namespace TShockAPI private void HandleCommandLine(string[] parms) { + string path; for (int i = 0; i < parms.Length; i++) { - if (parms[i].ToLower() == "-configpath") + switch(parms[i].ToLower()) { - var path = parms[++i]; - if (path.IndexOfAny(Path.GetInvalidPathChars()) == -1) - { - SavePath = path; - Log.ConsoleInfo("Config path has been set to " + path); - } - } - if (parms[i].ToLower() == "-worldpath") - { - var path = parms[++i]; - if (path.IndexOfAny(Path.GetInvalidPathChars()) == -1) - { - Main.WorldPath = path; - Log.ConsoleInfo("World path has been set to " + path); - } - } - if (parms[i].ToLower() == "-dump") - { - ConfigFile.DumpDescriptions(); - Permissions.DumpDescriptions(); + case "-configpath": + path = parms[++i]; + if (path.IndexOfAny(Path.GetInvalidPathChars()) == -1) + { + SavePath = path; + Log.ConsoleInfo("Config path has been set to " + path); + } + break; + + case "-worldpath": + path = parms[++i]; + if (path.IndexOfAny(Path.GetInvalidPathChars()) == -1) + { + Main.WorldPath = path; + Log.ConsoleInfo("World path has been set to " + path); + } + break; + + case "-dump": + ConfigFile.DumpDescriptions(); + Permissions.DumpDescriptions(); + break; + + case "-logformat": + LogFormat = parms[++i]; + break; + + case "-logclear": + bool.TryParse(parms[++i], out LogClear); + break; } } } From 18e52d1a25d012f42e9e0f294db2960a0f843053 Mon Sep 17 00:00:00 2001 From: stevenh Date: Tue, 28 Feb 2012 10:58:40 +0000 Subject: [PATCH 66/73] Added protection against downstream exceptions when saving the world --- TShockAPI/SaveManager.cs | 36 ++++++++++++++++++++++++++++-------- 1 file changed, 28 insertions(+), 8 deletions(-) diff --git a/TShockAPI/SaveManager.cs b/TShockAPI/SaveManager.cs index dca8628e..f411a2ef 100644 --- a/TShockAPI/SaveManager.cs +++ b/TShockAPI/SaveManager.cs @@ -31,7 +31,17 @@ namespace TShockAPI ///

public void OnSaveWorld(bool resettime = false, HandledEventArgs e = null) { - TShock.Utils.Broadcast("Saving world. Momentary lag might result from this.", Color.Red); + // Protect against internal errors causing save failures + // These can be caused by an unexpected error such as a bad or out of date plugin + try + { + TShock.Utils.Broadcast("Saving world. Momentary lag might result from this.", Color.Red); + } + catch (Exception ex) + { + Log.Error("World saved notification failed"); + Log.Error(ex.ToString()); + } } /// @@ -88,15 +98,25 @@ namespace TShockAPI return; else { - if (task.direct) + // Ensure that save handler errors don't bubble up and cause a recursive call + // These can be caused by an unexpected error such as a bad or out of date plugin + try { - OnSaveWorld(); - WorldGen.realsaveWorld(task.resetTime); + if (task.direct) + { + OnSaveWorld(); + WorldGen.realsaveWorld(task.resetTime); + } + else + WorldGen.saveWorld(task.resetTime); + TShock.Utils.Broadcast("World saved.", Color.Yellow); + Log.Info(string.Format("World saved at ({0})", Main.worldPathName)); + } + catch (Exception e) + { + Log.Error("World saved failed"); + Log.Error(e.ToString()); } - else - WorldGen.saveWorld(task.resetTime); - TShock.Utils.Broadcast("World saved.", Color.Yellow); - Log.Info(string.Format("World saved at ({0})", Main.worldPathName)); } } } From dbda83b8e7eab771b26f30bedd4842eb3cf54cb4 Mon Sep 17 00:00:00 2001 From: stevenh Date: Tue, 28 Feb 2012 10:57:05 +0000 Subject: [PATCH 67/73] Corrected compat ForceKick method signature --- TShockAPI/Utils.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/TShockAPI/Utils.cs b/TShockAPI/Utils.cs index 5fa73d26..f6ead281 100644 --- a/TShockAPI/Utils.cs +++ b/TShockAPI/Utils.cs @@ -532,9 +532,9 @@ namespace TShockAPI #if COMPAT_SIGS [Obsolete("This method is for signature compatibility for external code only")] - public bool ForceKick(TSPlayer player, string reason) + public void ForceKick(TSPlayer player, string reason) { - return Kick(player, reason, true, false, string.Empty); + Kick(player, reason, true, false, string.Empty); } #endif /// @@ -801,4 +801,4 @@ namespace TShockAPI return new string(returnstr); } } -} \ No newline at end of file +} From fd4880bcfe562d545ac0fd48af26277334039040 Mon Sep 17 00:00:00 2001 From: Zack Piispanen Date: Thu, 1 Mar 2012 16:14:08 -0500 Subject: [PATCH 68/73] Added in handler for TeamChange packet --- TShockAPI/GetDataHandlers.cs | 52 ++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/TShockAPI/GetDataHandlers.cs b/TShockAPI/GetDataHandlers.cs index db514d10..bb595a5c 100644 --- a/TShockAPI/GetDataHandlers.cs +++ b/TShockAPI/GetDataHandlers.cs @@ -135,6 +135,38 @@ namespace TShockAPI return args.Handled; } + /// + /// For use in a PlayerTeam event + /// + public class PlayerTeamEventArgs : HandledEventArgs + { + /// + /// The Terraria player ID of the player + /// + public byte PlayerId { get; set; } + /// + /// Enable/disable pvp? + /// + public byte Team { get; set; } + } + /// + /// TogglePvp - called when a player toggles pvp + /// + public static HandlerList PlayerTeam; + private static bool OnPlayerTeam(byte _id, byte _team) + { + if (PlayerTeam == null) + return false; + + var args = new PlayerTeamEventArgs + { + PlayerId = _id, + Team = _team, + }; + PlayerTeam.Invoke(null, args); + return args.Handled; + } + /// /// For use in a PlayerSlot event /// @@ -1091,6 +1123,7 @@ namespace TShockAPI {PacketTypes.TileSendSquare, HandleSendTileSquare}, {PacketTypes.ProjectileNew, HandleProjectileNew}, {PacketTypes.TogglePvp, HandleTogglePvp}, + {PacketTypes.PlayerTeam, HandlePlayerTeam}, {PacketTypes.TileKill, HandleTileKill}, {PacketTypes.PlayerKillMe, HandlePlayerKillMe}, {PacketTypes.LiquidSet, HandleLiquidSet}, @@ -1774,6 +1807,25 @@ namespace TShockAPI return true; } + private static bool HandlePlayerTeam(GetDataHandlerArgs args) + { + byte id = args.Data.ReadInt8(); + byte team = args.Data.ReadInt8(); + if (OnPlayerTeam(id, team)) + return true; + + if (id != args.Player.Index) + { + return true; + } + + args.TPlayer.team = team; + + NetMessage.SendData((int)PacketTypes.PlayerTeam, -1, -1, "", args.Player.Index); + + return true; + } + private static bool HandlePlayerUpdate(GetDataHandlerArgs args) { var plr = args.Data.ReadInt8(); From 9da170135408ef130cfca0345498ded9d182013b Mon Sep 17 00:00:00 2001 From: Zack Piispanen Date: Sat, 3 Mar 2012 23:57:12 -0500 Subject: [PATCH 69/73] Fixed typo in GenericSQLQuery. --- TShockAPI/DB/IQueryBuilder.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TShockAPI/DB/IQueryBuilder.cs b/TShockAPI/DB/IQueryBuilder.cs index 3037b58b..a865b0c6 100644 --- a/TShockAPI/DB/IQueryBuilder.cs +++ b/TShockAPI/DB/IQueryBuilder.cs @@ -207,7 +207,7 @@ namespace TShockAPI.DB if (0 == wheres.Count) return string.Empty; - return "WHERE {2}".SFormat(string.Join(", ", wheres.Select(v => v.Name + " = " + v.Value))); + return "WHERE {0}".SFormat(string.Join(", ", wheres.Select(v => v.Name + " = " + v.Value))); } } } From 58359edd12540e901d44f14b6cacb2af810758ee Mon Sep 17 00:00:00 2001 From: Zack Piispanen Date: Sun, 4 Mar 2012 00:09:23 -0500 Subject: [PATCH 70/73] More typos.... --- TShockAPI/DB/IQueryBuilder.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/TShockAPI/DB/IQueryBuilder.cs b/TShockAPI/DB/IQueryBuilder.cs index a865b0c6..b5f84105 100644 --- a/TShockAPI/DB/IQueryBuilder.cs +++ b/TShockAPI/DB/IQueryBuilder.cs @@ -165,7 +165,7 @@ namespace TShockAPI.DB public string DeleteRow(string table, List wheres) { - return "DELETE FROM {0}{1}".SFormat(EscapeTableName(table), BuildWhere(wheres)); + return "DELETE FROM {0} {1}".SFormat(EscapeTableName(table), BuildWhere(wheres)); } public string UpdateValue(string table, List values, List wheres) @@ -173,12 +173,12 @@ namespace TShockAPI.DB if (0 == values.Count) throw new ArgumentException("No values supplied"); - return "UPDATE {0} SET {1}{2}".SFormat(EscapeTableName(table), string.Join(", ", values.Select(v => v.Name + " = " + v.Value)), BuildWhere(wheres)); + return "UPDATE {0} SET {1} {2}".SFormat(EscapeTableName(table), string.Join(", ", values.Select(v => v.Name + " = " + v.Value)), BuildWhere(wheres)); } public string ReadColumn(string table, List wheres) { - return "SELECT * FROM {0}{1}".SFormat(EscapeTableName(table), BuildWhere(wheres)); + return "SELECT * FROM {0} {1}".SFormat(EscapeTableName(table), BuildWhere(wheres)); } public string InsertValues(string table, List values) From a3158d631181244b99e8cf69a4a4dbda87fc0595 Mon Sep 17 00:00:00 2001 From: Deathmax Date: Sun, 4 Mar 2012 21:23:15 +0800 Subject: [PATCH 71/73] Don't send another massive tile update after the first one after a teleport. --- TShockAPI/TSPlayer.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TShockAPI/TSPlayer.cs b/TShockAPI/TSPlayer.cs index 5444d876..3610af2f 100644 --- a/TShockAPI/TSPlayer.cs +++ b/TShockAPI/TSPlayer.cs @@ -277,7 +277,7 @@ namespace TShockAPI TPlayer.position.Y = (float)(tiley * 16 - TPlayer.height); //We need to send the tile data again to prevent clients from thinking they *really* destroyed blocks just now. - SendTileSquare(tilex, tiley, 150); + SendTileSquare(tilex, tiley, 10); return true; } From 53cda6036d6771e43060ba16553a062dc65e2441 Mon Sep 17 00:00:00 2001 From: Lucas Nicodemus Date: Sun, 4 Mar 2012 19:03:12 -0700 Subject: [PATCH 72/73] Version tick: 3.8.x.x Changed the improper shutdown message to be a little more informative. --- TShockAPI/Properties/AssemblyInfo.cs | 4 ++-- TShockAPI/TShock.cs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/TShockAPI/Properties/AssemblyInfo.cs b/TShockAPI/Properties/AssemblyInfo.cs index 4a80bb77..ef64ab0f 100644 --- a/TShockAPI/Properties/AssemblyInfo.cs +++ b/TShockAPI/Properties/AssemblyInfo.cs @@ -48,5 +48,5 @@ using System.Runtime.InteropServices; // Build Number // MMdd of the build -[assembly: AssemblyVersion("3.7.0.0225")] -[assembly: AssemblyFileVersion("3.7.0.0225")] +[assembly: AssemblyVersion("3.8.0.0304")] +[assembly: AssemblyFileVersion("3.8.0.0304")] diff --git a/TShockAPI/TShock.cs b/TShockAPI/TShock.cs index 637f061e..9fc3aabb 100755 --- a/TShockAPI/TShock.cs +++ b/TShockAPI/TShock.cs @@ -137,7 +137,7 @@ namespace TShockAPI if (File.Exists(Path.Combine(SavePath, "tshock.pid"))) { Log.ConsoleInfo( - "TShock was improperly shut down. Please avoid this in the future, world corruption may result from this."); + "TShock was improperly shut down. Please use the exit command in the future to prevent this."); File.Delete(Path.Combine(SavePath, "tshock.pid")); } File.WriteAllText(Path.Combine(SavePath, "tshock.pid"), Process.GetCurrentProcess().Id.ToString(CultureInfo.InvariantCulture)); From 7fe224d687e2fb14df4cb0c5c75c679036a478cc Mon Sep 17 00:00:00 2001 From: Lucas Nicodemus Date: Mon, 5 Mar 2012 00:56:23 -0700 Subject: [PATCH 73/73] Update TerrariaServer binary to the latest version from the api's repo --- TerrariaServerBins/TerrariaServer.exe | Bin 1575936 -> 1576448 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/TerrariaServerBins/TerrariaServer.exe b/TerrariaServerBins/TerrariaServer.exe index f52267454591c09e045a71d71afc8661ee5921ab..253a7e1f90193203ccea3c1862254d6ff1691d90 100644 GIT binary patch literal 1576448 zcmeF)2Xs{B+W!9pLJB?fp3oum9*B`9O}g|Z(xkVciS*tCq=__X0@9mElP(|v0wN$C zM4A*qq>KEn`@3ggP7?j=Ip=-XyZ#H8*Js~z?`Q9+nRzm^Csb|tp-*fdA0I#E`Ewti z4O-fNrSPvAsMQHWHYN1=Jm_G?4Zc+lW~|+&ZMV=auFkDp%{qp*Xx6Dy=kB4+TZOuM zbP8?TDfEr%wL&{~ZrLhtf&_81xOZKnoR3cx-`GCycCB6Ab8Z)WV)@4Nji(Eh%Eu?r z>7L7^I#hKjE$z}-9m~1gs<`~N^ckr2>f3*@eM$}U@kz}8FPH9<&JdrG+HWnZwckf} zBSii0om4*Y)vJ*)l~1~;>;CF==!=Was6d^r=rulX_g3$9*Xf^Pxv!U9SNG-i4AUm> zX= z<8ydIBAI|4PKl5!c5jZmih-vP> z$L_PROj=KoAy$qAS{vpQJHM|_L-)C)7^p|2Ur4gC`FwnQ2kK7o3u))najbsLsdYp6 zg%oq@0ILf-wH`2jA<3OONOdZw)TQzZ^YKZV-_K`lG40pKC%AuwSQ?sSdR(Uno*vIB zl1`8B6v?J1aEffxllnPT(dpToBE|Hiah$4yr`3LXQh%q_cY4x*{&po&M#j;#kCikq zI51^{a#wT(brpQn@(ET_D(RKXN=`-B*Qbb5M`@%qQ(7ytl=;doWuJ0LIi}oE9w@&n zv2=|Bm4r$%C5;lQWK(i01(k5+b)|;VOzEcdRt6};lrhQ#WvVhunXfEX_9=&yW6Eje zqH3wz5E3 zs;pMlD_fLZ%0A_ga!fg`+*E#59w~n)etLYyRT3*HlypiaC5Mt%DXf%Gswi(M^_91k zmP$LNi_%l+s|;2~D&v&N%5-IpvQXKee50IEZYj@|#CkBLP|_)xlpIQ4rLa;$DW#NG zswi(M^_91kmP$LNi_%lstn5_|Do2%*%6a9oaznYR1ncK5rIKFBtmIVkDMgeBrLDdUwX$_!<$vPfC3tW`ED+mzkPe&vXALOH8kQm!k% zDEF18im#pn0+a+wQYEz#qGVNaDFu{bN~BU&siag_>L`tr@EL`Cd|Y}EcL{T?!0NtM z>+vu3NSFO%nXzM=<4~_VUHX5nr;+}84Es&*6Yl5Z=hEHXB}YPgT65`M)mYtUvS}Qd zmS>}+LBT;OTr1U>7aWu_I6$Uyopny8_SdO2uItXJ9EsSEZhh@Rw_o&g(~aXfw?mAo z8(?EUGoxL!;(;2hS43U3Q7Xe+zhKiKt8e45xK^LXka$+t!v%O5v&Ogn0X&5r6Zmuq z_H*^q!hO~AC-mtO=z2rC8%I?J$8n`i^rACErOpboCboJIh6Yrkk-6_CDK_v5bZ_} zbfr!I;tW1j8Q|LRve7DojZPe5_Qa?7VW@RdXEb}^YJ4-3byi{P%vK-8tXZrckA<^Z zy#ph%S-luDX197OKE}Q|tdl3F*$wp)tom&k=xQh3H_S}h#dF!MSyj5*>s5xi(&siG zV2(Ui_r--6Kd*IO!=o6H&pI>kwft7klm4y?(!Jxt1*|<3^A)su45lh%^=W*ku+{O3 zm}!cdmvLY*tIy%$aI4SD-~iWCE!_KWUEKPiCCt;9E5hn;u=8tHr;0S!V)@stPFvFa z9vhXix))x=N~Nu{L+U|!NelOR(eaDc@sHYx*3dNIBp78lQ-?@FmB4IKilf1a=C&45?hatR$ucTcI;>M5p3As>WkQA zfYq@F#_*ilR89AD>J*h>u55$M{igc`AbxQC6t2>P?FAq{^WpfZT+N)5HXn|k#?{d| z<(?0()~PU8_8~Exo7e1Vh}MU>3Jx^~no(a`T*-&Mc;V=wGR$=s`wq7{WQ4g16OOdH zB7TfNVUkhSe+QF}W-Ht&H6Q*_3-?tYKgK3K^QF7-`Ukv}kJG~4i5P1;7=kyj&N%C2 z7;k=p`98F|H}1!}6Jod(-c!@P*DqCSx-rq5jVE#XB2|5+VY3-lpTw*)tv)UTU5}*u3?|L8`S4olZj|}N#$CtOv#maYO83RQ zM|;UKyLpdGce}=N8+{K0S6bZ=f50@WtTP#pzt694`0>7eO`3@qILYEcA_^Ev+xcS5{=LPdsNHJ#Y5CU^cyIw)@d+amh^a zlere3T(&y%Rr9-R=IQIE{|z(frkUZE`5af>wz~Z<<~w)Hw0F&)aow+0x4UPy|IO6f zqq6uzv*;sp%VTrS6LZ#6^TF@t*=OdwKg>hV&Ch*&L~9j?QC2Bm zC|@c&m9Ld=mG6~P$_3?$^6$JyTwZhG|KvU5HQN3w<+yTHd91|M`?mj$_lVbNKRcAa zdXG4s-h=)B^LxbMee_9MJ7*{P=cIW=)& z8}%MOH{CA)iGmZQa8(NS)eAr(=EI3nxjH*1Z9beRjjNY)$~_;RrBiyoOcKMndCi_0 zXnmL~R#LMe-j~rXpKr1km#?PEFxP6#ncV6F*foXKEAc#LO=+FhI0KJjg;dtBgXg3s z#SgS_U;k;TeKqr0Al;2JX*48`tFIRBPMoy1gR(dtALEDVtp5P(r?+}2evNNrh~bLW zSJS=MfhzTCj<1DS-32p-T3s1?<3Ws_(fY-)HJ-+dnYg?Iv~chFqDp^P#>_7o5i0#% z9bYtpT&t~iCdKixaFb-$!o7W4r!)0s=dQ|VcaqoL+BK_Pw%>7nHml=hH|wF@=z*?S zIbNJWPn7|#;V&DRbK2N8k4x77pj2{zATo!EKJ(fAF9<+IKW{2;&8 zcd&i|tFL0cf>xixYK5$hUDzy#OYx};bR{VA;&N9|8Rq&y`n#UIY*#C4?W1_0nAL&d zW;>jR>55yYECq!5s=QVQ$#*ei61Xh3D>T@`?q}3Tpu@-NZwt8C`vqM?) zTio%6)pw<)l{w43xDvfphPlGZn*kNf&X}a4)w^+UC95OfG;ia@%2to8Vy3NX7RPD$ z6dP6Jk=R2E_aljppDSv|KWZmhLl-&9MnT?oH&hZ zo^#SO6TYdF?jNvD=uR;Fh*l&uM2~Z*N}fVCL#%hIcm0b}={DA8^5NtG^myP8n&|A7w7Vn^<(TbuMC|F;;IdnF*(HzcU;h z9Q`I8vf(63v7|Kd_(QV|ZY!)tSbbOY!~jRzJa6A6os|gczPv zz1}*UqxE`oXrj5vbiV*32~Lv2m3xvs$0uPXoFtX2v2)U9!b#G&-gQp7XTsxjN^{)F zF`S#%l&P`S>p2=*Pq8}uqZqcRrl$Kj{~MKIu0~T$zmLuJIC7fR*Rb|Qv) zdA&-1m+z7njjSs50so6ekZXd~&P@2ZO5G%dmcAI?N2NNeUv?TVi{ZLFSJQo6;w-mI z@-cQ^VfA^;ywd6)WuPl?)r;XfR0gK^`th~wURGZBYG2xe1&&7}}R&T&FqCqwp-mr2D zn5*hO^UZI}P1tllodb06#6he54w+AJ!(prQA2CyZXEv3ZT=vt#z5jjmmmRgW+rBr8 zA2WZ)1;?#^|Ablf2Q$k_Gvt(+?zFiWcVNyl)>(ix&hmI{sfGKz==iy!cKoAuqBV4p zqihu9-B_cu(4*#@c@I~dw>rfIGu}nB%8#b+C36Xu{K@JASpBlq2Ql9jt7l`Ut5#n# z-A{)}gOh4Le9fK?lg2O~PMXTK+*!$dIB6Q!Y3HP8K3wwpi^ojDpKa&e@ecOBVV$>b zn#FIKhjGm97=G;LtLeUBAF2#<{rZc!_l}wBS2OKBbH#7w#{1@z2j;AY=DUx~0guh@ zPt2-M&D;3&cdPyXFy}ruZ~DZNZDW~3W1DOJ%&l?ECjMrr05f}_nI*`4ihJT(y(pgf zZG5wJLUU&#^J-#qViL1$QuEzp=KAF3=oDtgl;%gN%zCNK!D-APY0cW{%-HG8uklz0 ztKSSYi)A#EWHR5yWtcFtb=G5|ELP7nnGdHe6_+E2lLaSxH6Q*zHy{3Y-Wk5DcZMG- z&y?7DcQ!~#q$F3;DjAjRN*<+8P)GFTa@ zj8i5n)0H{OLS>nACj@Qc*gDJs+N+b^7Qv zcMRt?SWWl2jaI4mwey(M@Xfq2Z1Iko?k$$6)LUWs%$3+PzttHFn2m5L-opw7t=}6r zW8*^BX@`jl$FiwjdM(`hzo0VE6NC_~=C=$aThQXG&MT6gSB`TDXUAbvnPj?6fQ$!*%icHRqPr>m{v>nX0V$ z5&n#JqX)W1yz$};l9Y?3`EUv8KF9Mab--hJ^H=Ou!Rp)<&2^ZllGTkc{+m{J!6uch zK8ty(SUny~RJD3HhE%h8(N*b zkvR_sG`9LVUTI?W*|*KUl%W9>dH(aLjP4 zCyp?ij5NO-WiB6W-Wg*)`@lRk);uxJ>^t79^r4w*f_WWROtiY*Bs1}3GtLzA?T^fw zQ_YGWn-483ofyG1^O>lt?%!}@@b_>j6U%XW}cif(!L27E3SXJWLj#v@&Ebl zx(JOatyEB|D)#ly21-+{&L=so-#uVLsa z>o-Pc%yjDGUY-1_ZA=H;j%n6dr!Lar`lWWRU;M!Tnd?_f4;0rD&htzB7Bj51%kmC> zi4QQx=hlB8KSyUw!gbcKh)!oa^%HFVg{|F+kB|=6FO75k5(NFvT)%ocw8r($dM-6i z#w!@M!TLk-0H)b!o%e7%I%E7dS-%=Ooh8)2VvWtVb_xE9bhv(LOMS1OlUPapg8jIL zy1n_%w!Z)7V?U8;lu#v`l3OXLge$KrZzyjnHI%waW2L#$M(Lz;?r9rv*x{&{kr=4j!zQp^fr=RvaL>Z-wSEeX4l)1_xWx29e*{Ez&b}Rdp zBgzTota3@YuKc3>y9a|+(j!b?h2)^HMp`ygS}PruzxxH^l^VNF*{tkP_9_RJqsmF; zymDE&q1;s-D$kVIdNc(oiIn6@S|y{BU9sCMkCufLJCLlTVqZ3{tk@Th>nTkX`{Hq1 zrL)pQv2UOcQbs6al}XApWwx?FS*om7)+<|-U5Xuic1Ss<{BL|gxvQR)dnx^tA<8Ia zyfQ_Zq0ChlDa)0$%0^|IvRetCtQ*EPn#b`x+>Yn)SB$&U9_1M@9N)qYI1s1f8vGi+ z$D8;B6YjG8WWjJOk1cUDeiqG5bi6%G$J;w};(lfOPlq|M6js5vu^kS^$+!l;!JjbJ zZre{L496PS1_$FzFIQ1-$1~A6Pj2a|lw^~G?kja_gwPR2R76Tiiu@OMnL&-RlI%V2Ztg#G`9 zA24PPejd%8bi6%7=O+4nW9Oa)i((CIhokXh{1m^!3;3ItiTB%n9J5h-Tab?PsD6w3 zT^x!Z;S$`A7w`!tJisMH=kfm4{e_Hh=%c=G6;L^cR}__F|J=4cO}S z_jq}Z+VNLvZ~cC-y*ZEVOw_Mq2ON&maRq*h*U;yrZJP?6pMw0<<)hh{PG6jk3vmyg zL+2&ucj{!Pv}gD45BzVw+%5`kk@;Pj)QR_?nLjGoGWx5V3zaj!OQa04Y4~qFFDhx zm*IDK4wGD94_F_&;9y*cTk#4yFF8pra((d~?2d!+V_bz>@f6;~bU)g*MX@ms#W}bK zkE8RFbB#LjCEF?kmcY8$6G!3-{1#8)&A;LAjLGto?fxxG7kC(dM*qvU zpKMqWotK=3)ctWLe(B{8)Q-2Qz4g0d`*a@LxvAg4chUQ|ocHO>!JT*xe@Ex1Ak9_V zTX;0<(ix6R@C!VHk1)wK+qMk8ZMxqk=va~ZZRMDT+A%k^x3AH09^3Cy_r=d} zCmzS!nBq6vb78E3ozVFy7)SkCH22VXfX;6@$?mfstcK2SInAjDo9<7p>H$<4!z`KjCdm{MgQ=DAvVJI2xDW z0lbC@pV;`q_!f5YawPS~xFVWo=-kA>r?wyGMJE$=VQh?T@IzdP-{Q|0_`7YJ2J_+@ z*a`dMbli!D@d7%(=RBegd}jN}goUvs_Q#KKCtg6mKWuywbY67AsOw`({18{+_jm;Z zpWC)!SO)9<4cjor`7~!7wYT%=c)N+tSLpnn^DXri^z(_W%a8#};hR_=`{H!m;N^GJ zjz3d-8_U=B={&YWsl%}$I&ZCYpdO7&a3`L@-_ZFfh#$-LmL-~{=(IuS_neVVjbGsp z7#Q33kO{eu^htcu{INN}NI&1fDdXm9*-al;`^O9LPto}e6#;$H`|6Jf+u$6*`Wqg( zOF5m~;c3Te3*Y#GDO@GAzj=Wv{XfXB#=O8(uJSZeJ0s@>rg1fAu02h@=qQyL<9UY zL=3h?NTLSig0!xYPBc?mD;*r1$_;POeL z6Q@e(m}@OF*wAA-;UAJKVzp-5{vib#=#TO0xDcIataQ*yOLNt2+^0Kf+1+cMXN+h0 zzSa#?hAST^6BS$cv6kVjIk)=x)BA^1j>xT!e@N|!FqZWr?2p)om$MO}pXowG{w(}M znl~sHqGGT9#QeJAI)XvVqsmF;yt`+8?_75GZ)kZ}d8j;7V(SL9aY0%pa@WbVOzW;Q zYMEWh<34R;3#s-GovcgHpj>k4Io~>3XXoQN4?At~J})~TPv3iK=j}OPJJ0YM+R#6A zrFI`tPW$u^-NgCnA>mU@rz4f{+>Cic2WUjvp9b;|J*BnzYx#%nu+7ftaCrYvI~*nA zB;{e14a(^r_F1IU`*rk>Wx49L%0_o@o7cMCs>AnakbmfHZI-{Lf2cheorhgstt_mJ z(|YfeP_L9yUhxmT!FYR|*)jYsjrAPIAKsB2$I&HkP%e)KEYRUQ%ZvSMma4Z}Ss!KH zmMEvAZfB==Y0N(5kbCSguWe4NzNlPPZYlSa$I5dhj;5pWl)v+5bo@i@=8t$y!^3Ck zJpDu8(dqn!{6i~nz4T1Mmp1xooqch`KeURCx4-`G42@`@GQ2sP+TZw(e5@_}LtC-6 z{uDZY41YjT{o?@ctky2AUhiId`u2zNJ+&=&>9psM=6m{{Kc0Uv%2>~OTVB<=TVCt$ zdDXW5u}(i%;^;n&rvxi0mGnwxC8v^4DWXIur4`$*f|mZF3%On@eF}(TN(-%v)H3{S z75<@X?B=;8{6pYQ5>evPv6Vu_S{nQ_#j8gvWm@wPdpB)z#^?XifKWCLo%5}xF-urkl>;02I zAm-V}KUvxz9kb)iJlp)$@n)Ve|701{KXMWNuCAD?Ij_va@h5!U&t9>+;}ZPQ%QSIp zZEYNkcQBd1^>br+{1|`0gaNkpEgX(tV_=~5>*7${iaCN9kDD+IqVPBc>m+sHT3g=_E}W=LXd+u^5p29qVVzH?A@HR|E`86HOcBQ_dS7~A1UT!la5 zYsqa)f82oaQ&{H>?0}!+VN9IT*4D;3co?5xSSnlF5QpMn`~$;N+uFgn41dQoX{=u! z`{NqChMCgZ+Qv8%x8noMkj~b2z{$81?_jp{Y>S`bZ4Ap`{de&rT!m+%nIgnSRzv5f zqc8O){1MZHG6qND=XeS;Wwf;w(YY@sQXh_HtV}jCKRTCWF!eILf{8P8Uf2^4pkEg2 z7mcQK-?gK^6aR>&^LQwl)%M^#Lb_1T#0&U(Hd{LrA7R1l)~Sud@k_jk&f_Y74ja?K z%X!oXFmX;>TMFOBq4*^x470T*a4@dHAMimmljXAUxlQ-6V@&Mh1-zWt2e>Ep0XDG@ za3=Nv&cr_8&nEV{^*ZMrCidCY46uoPfO}#e;61VT)!G*m```20P-kKv5OrcdNh>X$ ziM`dHiM?lC)MZQ)dmF>Vew>Pc5KZg@+!Ol%_rzXJXJX&MM!cNZ2Y65H&uB&%bz*P5 zsIdvR^*obq@5#3HJrjGYJriuJy(ji|+F}#?fEXtBeYMVeVsED{-sffK`rfoV zHnF$bCib45Ep1}&ecF3s@9BF_>^;4xOV7mK)3=Ger?%z4GqJbrY+@e}!^D2H)-kak zrXt|w#6BQ~iT%VJdRIV+X<~1E?}@!OW{EL89V2;7sqw@ z5F_$f$8iYt5e&#{{SWb5yp8emS-%~AiGKO5(-1$wbC{`s_20t{_y9W;wEoBFSIFv~ zxC+0ce;~h)T?}W?n3WgW8@x#%%re9EJD`x$7a3pTWSmD-x4_DzC z%v;?0jd2xT!7L@L-wr><1E_y|PknF0>2$({cmdPBW+U6+SLhdMoiaEa_h7cyt=|DZ z!msc*3@d4C8)AQ4f{2t?0w0>>uiJ#+-n5>emZH)8qHs*fQ z`fczt`~j0yw!XKu=}brGr{g>7Bvm+H9E{sh|DdAwPzpQXm-sU}_eF_nHfC}(57Y6h z{_--sPTdJt;VBHQVPmS`3cQBNYO<}D&V5&(&I-I4P3Q5D|1I0rd4#m1{uC3|vi?B4 zgSBg0XEJ_?4=}ur^;@FzxH?W9TG#rH&8a`e;~1-+t<8Zo@B_Sq73 zH2cz-XS$EjWnv#c@a4ol&^@saw26J7GqDeJCia1UHnFdjSuaywVPaoRjX;~&2f8Qr zf!-7Q99sKgVxO6z&cr@2>coCiCLbS*XJT))XJYSJ7j+ra#NNg*v0tYm&?feQ?umV% zdt$GqGqIm!BVJDI1HC8qv9&Jh#NK*QV-s%c#Wbz{lCia_kA~5t{ zC-(Y>41K)gJ+b%h+r-}cbWFAP#NO81#NIRRzcsNB^qSb;(0K&9C-#9+CieTa&L;MO zFDLfSP-kMlicMck>;t1r>v*jsHAdr!}nHnI0U?LD#g^t~tco?g_YXJYT^ z+r-{e+w$L;*xPnCu@8)4V!vAJnAk5<5%_Xq9~i^Lexv@eZc9uPd+U2o>^)=uY-tmF z&pOY<-gDZs{7)wKwvRuX*n9TxSw@}Md-~oJd+Ys^iM?kZ|77Wz*n775tBJj5%s*Mi zII;g+S4@9)$6hF}VVj0lAID^ktZsuVynIAmu(7Reho>-M6YJ#0H*p!>#;~_-?QqXfx}~!5=VIbL%w3FYpe&(c-{3OtSp-?dH^Jb_O!V{7a8!hM*$jdd#F2;7GcF=ty_+bEi|=^Vv)?QBdP z9E+E+R(tD@$FrEZgLRtXdCc0;IyG?s&cYM;7}IvLG1YNAUdObZtzQpMVEQiBsf-J7 zKNjd}{XTdIpJG;*^&8-L+=2PJu^$|UCoo=j>$ku$xC0aQuzmzK!R2@rllSCYa4PP@ zw7sk!iS2O#KE|@|+1g=v6|?rXPDh-J2Qkk3*7vqFow4ZrbZnsx>SH4dVQ1Wjsry>L z9QMI2cpjbmqDVg*Ga;JS=|uE@c^T$Y??>MO)-Q(6KD$xx!l#&dppEg?x$m0N{}EFR zvN7H|kB7$eokz%I>H`>eu#NAFKV#h?))|P?@jLV%YW>&Id0c%+{j--DhS`{kI2|<-acf2R| zK~X05SCe^7?0?jWpePgjOzL^Zdt&e1w~4*?>6mKoiM_42iM?mse`{hN`&{8xysm!pldMR#QLMGGY@ZK;nCJ{97??h zA7Q64wsskQi+8Z%2iE@xf5*CGtuqs^VAwe8w8MG$I}RCd{gs&cL#t=tQGAR|CRl$x z-o<7UUygLfJ5Hg$1)pMpNj7o_o<--HCYWsfQFsWSV(}@~AAl)7vbq!w#S55ws`Urr zSD55u>%5KQ@Bqf0W_@p~(0LEHW3uTsrUp*Lz!}!5f=keErgbXfPE0q;I(2b6ev1h| zv3_2xiyz=lOfuWn*1*Y_aE^7_;1WzS*E$7pAg;i3m~fu04ac7NHTuuDesdg%TQSY2 z)_)V1;18H&f%UuK68r{37h1nRuEJmOwMEu<;dkisnRNir{fFiKd|63TiX~{VdCZ1X^5lodwhb0B}0-!^*?&;4yPXKG(KmL0>Yx&2i=^Q%aizihBy@`!~R73`NG;!~EM`F&rVvSaT@ zD&v&tQ8HPl!>0)CC`OJLm zclv8N)LoC(@6?U^}X}d-S@QvYm@{^QYE!w<3hB|>aKHX zS-@Qv(=t*i>ppE`E2$3l^P215*3N%Z&S}LHEq%1~SM0PUzLG>qrDRY%eeY!!^~03> zN>L^Jq|mvn)b1i0Xs4=Q9(ezz8a0&gwazG}`(u3>#i93gHGGF{dRsGh)w`{}=G2E( zJ4fHIQ=_W(VA-sChqBk*JLt9UsOs>F&RH?%uccj{V>fF0cqaD=b;3J#+>~)vVszR)475#-_KvEX?ZR+y|Yfe&5HfQv)+CCM`*oI$5bEGn4`)` z_t^7Z+gw(CL%FLwRGulZbr^k+l1NFeq*XF1*_Av>A*HxdQYoiYR&*8Zeu%Ks;c1*} z#Kga-*1S9jzomBnNLRX@mRiA4_|{Wxqd6i!{ImwB!Q}s`ZZXxZw6a0DLOQWRv+oBw z6Hh*OpWYOuzdg$7JvwdQA^gs(|AXpt%1>TB&wf42pSA9e_j>PIm*aPxj%9DrD+!fk zN*X0p$)@C13M%2s>&hF7?fXqFb;TBP#Z*7XZ(gf3l467l2c`Vy^s~>;<(UevfZ#w$5<8fVsc4 zj$;SvPw_a`-ePM<<0ia@Z)~NHr?Bug>vY1cm}a|mTH?p}Gj`r#{n?m)r_~d1GoHuD zUDlt3`?2^}FGo7#9mmt(hylB8Oi7%9zI&|WT+>3-bMZU|?X|U$*bmcuZJmnP2@l}! zSY@BB?TI@v**DfHgFSIcG=HL#VZV)RjBD^$tb4%vd(iJ7WAHP)g5AEg{x-aY84p>f z7WToZxCO6czQZ=A2QJ0y*z<_>cj9l@@H^}D#P2ZEQR{Tag?Jd#d~f}__#vJ{zhlpS;FHR?~J>3_k-yn)VT zSVDaq{V&?uYB&_vV5}dlUkcxirgPsdr0;jhM!p_R=kYL-zVis#PW=eW|72UuLBGpZ zH^&cg86L;LE4H=_I*+RlsCRn#8+C@OHnI&)#4qtjOnlAO_QYkFipE#M!TL(2x`)Ozu< zzCb7JCEb>m^s4RpgwN3lSE`@6!Eq#>!@@VLKL@`@=Zh#gZd$)TRtvS-`QpkRI=|yv zw_c8UpW69yj`Ot&=PNFb&R0Q}F(%b*+se5N&ewIEFL+d=KM}vj+`rgJFS*ZCmEu0v zS2CRYJivXQ>q`jS=K+6qpMR`5qH{De_j$m-ai8DU{OYe__j%OyQSWnGAN4-Bp65Py zA8>ua?z+qB2e|L^fEe!c)mm@&xh*X(?sNO+yj%mh{XWNEvGyIiMOR>syH>x8&M}Hx zsY8FYzH_{yb4+6=I;$|rJzMLHDMRfXx9J>l=N$d$=o}^3oH1w6xeU&coX)X-8Gf_9 zxo{c&5moN<)XsgbqxG)n+UCy_=)TW&d>Z$8;Gf;+pXwI{=RgiHEn08)xh*X(?(+>g;i`MzZqey@ z4I4kO&No>8q1AKH`S{xJk##zu^HH|*arZZLGCa1mAEGm6E4A~HzVl(M^TD{I^8xa0 z#V_xKC|uHQX9i?(;OxeXb93o%=kDk`- z421hU=-;@{6KEHI6}!))u8(@3+xn>Yx%E8vx%*=p?(=7QHV<;&=Rq;t=l0Jh*nMtG z%ZvN`E1htK{cg9V3%6pqXVzJb75}h$96Il8`aieMY;@k`blwRK@bOc>2|hq)Ot`Q0 zop*bk_vxJXOdXx~7W*z=_U7h+EVxQI?P{`a_;r~ zdWWlY#CA1RG>_Oq;dRF^QDc?zg%WPB`0n3+BbVsbQvLE}y^9(>mA=YgWu!7rnXF7# z<|qr5B-+VeWmybk)~L5Z*{XcyUjL1j_Ri69<&3-cqn6hc&#&lqI^2F8Rf8Ayf-0iF zvhUY0yZ3Erd2#RW(FxZMZpi>YyFHuYS*#bwI%lxFztzsPb`y1YfOVWHt}_k(gw7-E z8E9*rF`rR8Q+;QW=1iC!or&df#xx4Dt(?o?O#Yqe;yU`iacyl`To6qrcs9RF-REEC zcN0@FzYDq6pj>x7*7cnEV!~rLiRY%ssXCwH{oX|do%XyZ@ps>Y$kX-JzY}AR#I%a% z--&tkr~CCDl%BXZDxQBM#{Q1-5#@w(R=K2HSAJ3MD^C?)y&eZB36!KtY9&O;s^n5U ze@DYUxG$?zQmQL;ltxN3rM1#g>8A8n1}MXnG0FsGsxnKNuPjzpD(jTZ$_{0(a!@&{ zoK)<6rpw9=#U>gLm1jz9{a^(tiIn6@S|y|MpZwFdgS7n!WvntunWoHE?61XmACh8+ zp?Du=VuzUgw+=0-;IHQZrIyk_X{xkR+ACd^UP?b@h%!nUuS`*9D07uX%5r6`vQgQl z>{j+GN0bxFS>=*)UHL_^$^28rH$eBll0ZqSq*g+dtV%AWfKp6}RLUxql8$in`Y3~x5z1I)k}^%1 zt=KQ8OO@5idS#2UOWCI!QjRI7m5a(%<(6_!d8|BF;soh6KnYe-D(RKXN=_x8QbdVR zN-Gr<`?RK((m-jdv{KqDU6o!+KV^tAN*S+AQD!J}l|{;O#XdLMsBBYqEBlor$_eGH za!I+a{G!}fo+`fj>?=S?pd?jND`?Y92bH7BN#(q9S-GLyRqQjxXG-jNy8o3#N^&Kw zl2OU7Dn(nM*Yv{gDQJ(NDmAZ3IyR+*$sQ)Vj*l%>jQWxcXR z*`@4L4k^c!)5=BVs&Y%Yr#x1kD{`PjSMn%@l;TQBrJPb( zsj1XcnkX%lwn}HEhtfwGq>NC;DwC9H%4}tUvQ$~Egy+zN%auBwO${TlDGtE}xC<}g zV@w|3#^=K7*bOJ(BHV>1@fl`JU|W^Mn%EZm;0)Z1$M6@7lhC$GkC9j%JL3qPgtKrZ z?!Xgx9iL-6WbmVU~#O4t+5A=$Jw|M58-9JkIylA zumec24~|wyoAp%C<)gBt73Z`hKq3*-oQ9XZF~sk!V1^|hu{ociM#L^KEve6 zxSUuH8(>!)g|l!Y9>HHQD7kH$9ZO>i9E9_62cF0Km?(v9l@&{46YPN#a4~MdllT;a zQrfl|u?SYcRyYFZ<6bev7~;xJrW)R+@XVr8s@ZLtrI$ECOpkKk#%fe$e# zggs*fmcx431Bc;!+>9sjJ|+$2_Q6It2xs9sJcjo$c}5#w92?;PoPq1`5MIUSm?#sM z6ANHH?1M9KGw#Q$_!QG-wrz7^Nvw$-u?G&owRjSL!JsU*ZDuTqt#Am=z_qv!&*OcJ zlhw8j!QxmQTj3y_i#zZH-o<#?*cK~b51fnZa37w>hnOfkTcPtWP3EI6j#aS*4#Ekz z4v*k3m>`GkCp(tLM%Wem;TW8O>+u*~#CsT!)AkdLg|H+x!vVM$kKjE_5N2ED!KOG2 zm*PRZkBM^G$O2du+u|f#jR)}_2Ib~@VL5Dt!*Bua!_#;Ree>8>$uTFE#yZ#vd*fJK ziAV7x=$p^>kQNJJb!>sXaRe^HZMY9F<6}&e-}aLk zb73Kjz^d2?Tj2m4i>q-zKE{*f+evIw!(fm442}5yoafa*tVsy6%NC-cp4vK+M+fx z4_3v_I11V<83(w+HOdDz27RNf+8HeE_+=eIdAqKy0Tjj)>*bT?xV%&!N@iIQev?V!5tb-kK z7|zD^xEHVDQ_NY)wylY+aR^SumADr#;tjlyu}j;wX|Xi6$6h!dm*Xxxi;ppR8QZo1 zR>jsh2J?C#1r@nCMwUh!#da%N8xNdiVrbu1sh)yJL44GjMp(=MH|xuhu{vpig7C0 z+SFJK8)17Kgi~=P9>g0M^rmf_3oBz&?1kfT3tq?Pn7p!WRRk+zQ|yHka5?VBi>CWP z1U{V5zbpK|^x?#Z^ldbdDXZ8tu{5^A@wg7p;(bh1)kbE< z3fK|H<09OF$M7+RRAc{G2is#GoPk^LG(N@P>b6yOtc-QA7mmkSxCl4memsxAVC)*U zpOlyjBd{j6#z8m(*WxZbjknOZrtK#Y7Q;H&7JK7ZoQg|v7aqf3@F^yG%l4KToew7> zsr%qm+=f>%sFsaSj*-|5d*dYBf#)$^ZT63)u`;&BJ~$1R;x0UfH!wjR_JGB)GB(3L zI0cvDZoG&=b#2>xSP%Q)EZlUYEeaza(_7H*2hZD7^ zyW$X>i(BwI#%^p|WyWGy3wz)MT!}~V2F7b*TV=$O*Z}+B6kLyc@jPBf-?wes2u+E!(;0k+2RxDpTHC5+vQYlOwIELO)!xC_tXV@&z3Z54@~aRKha z6ZjB=TieK-SQ;B(HynYpaXlWvTj<-ywoQrouq?K~5x5kO;zJB>Yg=W-2&{mvqxKIH zIv-9nqSFjo0xhCT-8P#v)h&n_z1kgp2S9Ud03* zY};a34?E*{+=n+XK}SYnGwg@6a4qh~8nCwKh?1_PQZ4(99uMLre278aY!4YR7nZ}C*b2wuY+Q{;@EL}5w>=cX3fKg_Kb+`AX9}*y-FO=B zW7;0JpGa(kJ#Y-J#)p*Q*a&b z#j|)H(~h)lOJXY=h0E~}KE~9e7+DUfyW)J@g%|N5rX6h~D_}RAge!3$292>X#jz3g z!{vAcpJLVzY-D?!g*!0bSnKD*>evhip!4CxQtEAZ67OO1akgzSY=C`m209;3Y^FYq zLE~+F5v-1Fola%zkEM1#oS03$4bP+V;e_vp8tMMV93M`^5B%TyaN=IcS07Hi`f%da zhZC>9Iq~Y76R*BG@#>osuf93)>YEe)qu-pktqGSa*d~0gV%P)+;R4);*D>}48<`bL zV_O`Bi*YaB!UPj-d~s}ogK#RY!-IGi6HK!4Ik7Uf$FaB)H{)dtnr!3KVs!~5tv)y9WlS!{u0a4N3F zW9WQ1@t8XO$D9{-!zs8Lx8MzoH;wCpjc^Dqz=L=XlTWvi8L=cb!?Cyk*W*FFfhlL$ zR*_f_d*B3IiAV4TCYovE^I%o%jFWIBUc}_HY-DBZjiYce?!${1=MyeDmc*vm3n$?g zyoJ8A8K2V3PF)t8;sjib;aBbL&Lh+pF<_2uRRC*YSDcN<@E!)wwULF;`Q}7T>fY#l zI5C2H7H-3n_!u+Jvptl zQ*bWsz=L=ZpJB!YwujQ_d^k~=x+9LoUHBB^Ewu4Du`)KnjyMXZ;38a)C-E{q#MFyy zKY6e^4#New4tL=(yo?Vq=rh|kI~Kt@I0~oWdOU)+F!^HJswB3>VYm%1q4Rv`JU2Se zlg@Ld^Ze;Nm&RGbCC5tG7DwSq+=2V?7N%TkTUEkAI3HKzKD>wNm)Xb&Y>T6CIc~&V z7<;*m%!f^I6mG;rcnbqoaG9|tw#HGo5%=R=Ouo{_7r|yY7T4ot3|M7jvSVfJjf?OI z`mVMyX|WjA!)`bUXXC;P_S3qB`Vij31Z!*$WwA9*!1Z_xA7aY2HnJEt#Xji%<^=UD z+>5vHDF%OT+ZMt|Y=PZyIUd7!>o^x|g(Gks-oVsfaG9|!PQvwg0-s{a^)|8r_Qu(` z4Nu@xOuxZKR=`#`0vF>hJdIB=(MB7e9ZO&NhD(=VUn0b?JRT*330Gx(f@G{=R zpv^Wu1an~}Y>T6C0q(_DyMu_F$_skjI?<6b<8m+?M2A5Ns)!ga?A zI0BdA7Ceu!x7x^@=zMdcBz039gKO~^KEtfrY^z#00O#XD4A{;!!dloH=i+{Rig|X} z$ObqTXX8G+iwSnxnDpp;I8lVUD^A6O_zZLHvhg*sA1=nz82c+O8#ciqxEPP%Gt9c% zMpngcI0@I`Sxmmi#zbN_T#7sJEc))XG1;*uw#Gp?1J~gZyoHIrwyi4QFx-t7@foJv zXJZOrRcwu8aS`st>lp7F8=n;`VOt!5i*XlT!r1$5d`2vZ4X_7}#g%vvuVS17wp9q0 z!)7=DXW@Fhh|e+gLEEYr*2DHV0vF&eyoiauwedx;9`?bxxE4?1UCeyQ##hH7I2U)| zNent{V+vps?23!<7~aRsM{HyTY>VS@F>b_Nco83B_U~+~rq~vT;95L{w=nfl8ySI3 za1hSN-S`Wp{@zALVpAM~>v0F3N9UUpv5(pKU@U?Sa1hSGjkp^hW4`0IRcjoD%kcz0 z#q=j^jPuQja?~ww08Yitcmf|{+8=DI2yB4ea6InDs~G2`jm(Nwu_KPhjrbHpPH{=F z2TsAYxC1X^>eDu|0G7jM*bo07dv6{lWpTZK&-BdnFgCvuPCNBAE!9LFNj;zHeRJYA z+7D8nrhY^nGe%3Ly{=k8?N6OV_1>JgMD6%byYbD5+^qkv-kg|R`|X<(-@ZBV?VA(d zzB%#jn-kx@Iq~hA6W_i$@$H)v|5x9fm>@S?Sk9ZjP2Mda^$@k_4ZTh5Pn|}+gnA40 zVd~q|;9m7?qK>C7pst}lO5IP*{hNB$P=`<_Q5R9yQ6HkdNIgi+-N*RU(bQ(@D(Y?2 zjnqe}uTxY1uBD>XA=Fva%c-|fw@{y=zDLb^Q%iYoPIRF?lsbdDkh+|@g}RgaF7-2N z=q>IebtrW_btbi$dO7tL>O)lT&57N#^WWA8jnp~RE2-OYb?lX?~PPU=qT0czF1*aqr+>SF3z z>YdalsjpK%qeef{Qr?>rHMB=j&!^r=-AUa;^?ugr2<`ljwQLR5`{qRQ&pHic`XuTZ z)QhRBsT-+JQ(LLtHzy*8HD(uTf9go8_sxlEv@fTwranM@g!(k~J!Hqvt%bv|`DbshC_>JIA5)FagBe>DDZ>LTh* z)J@c#)C1J)BWyEu6!i@1a_UOzTIz0U=BMi4gF1t{f_g7?7xf6W`ZDz+YDr3lc=n(s|E$vxrp%x&rLLr|r*5O}pdO^= zr)r!b)H&4Ks83T5QbRuV89}|Ax|O<*nwzG%1F2_F*HRy$?x6TYUw zhWd=6UPXPJdWc%$*W6yzDb&lU-Z||q+D}nmq#mN?XKJaT)HA5dsrOPJrS72~qIT<` z{u8L)HzzKpeK~a{bv<<(br1CjHI$`g8>wTcQ>crnE2(!;AE&-ZeUJJ%H7lSIqSRXI zaOzmM zsJBs{q#mSJ1=VK+^?d4T>Ne^DYHp$WG*RbLS5dc7_fpe})MpfRDfLO}VQRNx%^gZT zh1yKLp85cF2lZ`gE48XbOAVn;p)RD}Lw%0=3ALnDJ^NB8P%oygr9ML4Pt6ahXAkNW z>JsWY>UQcuYDri<`%|Y-7gBGdZlk_V{hV4AQU8I|GpLtS@1j0QeUq9|rkKN+z)Ya52)Sc8L)QWQTA55J=T}oX^-AsLsdXO5dV0`LW>Rjq_ z>b=ybsopmy4%4o$)Kaski>d3Vk5XT!rdFv>1+|{qpLz=QV(M+wr>QSf4^o5GTDFlo zn%Ydgp1Os)le(XpRipmBs8gtmsB5TOsqa!hq6Ryve-G*i>MZIC>PG4g>f6+;PU;_` zj;1cAZlUg=zDLdIte#cWAyn_piD|S~Qnyf_rXHkbchOR{)KSzq)FsqAsoSZMuIhOT z^>XS1)cw?oTFo6#y^8uewI;?=)Xmhr)Wg)0ZkjuoI*ob>bp`ca>T}f3sr7a0KaIMG z>iw+KO|&;tcTqp1cB)tZfz)Z#qkqev%J3Q$(Jun-s|#uQ(o`M>!7?2%S)ep`oDR)W#UPdU-yK{ zFMHbLP4dW+b@IAPUi!$@E%MqbuSewdxV)Z{*G_r8D6ie}+AA-84(Wb*9g^24^7>p} zY4VhbEP3V2>)W>{zI}V*+qWmaeS6~Dw_)XmhL)OV@*J=DKHbv$)G zbv5+?>R#$c)S8~^KZ-hyI+uDC^V9f&FZHjdj;79`UQgXZ-9`O~8tTpVQ%6wG zrd~;1OMRTWkDA(~{y}OF>R{>&>JsXD>QmI0s2@>F`e@m{)JfD8)J@bK)C1J4zUo;* z9ZsD|T|!+?eVn?Fn$b`F8>y41XH!>G@1^dgX7p!d>ImvQ>RReO)a}%FshI=Rzm__R zI){1{bt82<^<8S_K=toLoj|>ux`n!%`Z={~ka~`xPN6QOuBC3JzDPYl%^j@%{i(C4 z3#d0yw@`Odk5Ky`qyA@5ucU6GK0w_|%^kv+)G5@Ls2Sf;&mgslI*ICicVZrG z@4FMrX|JVjq;99aM17N*F;b&Nr~|3Z)K%2ms2iydQ=g`K-<{Y)JMDOlP(tlbok=~P zx{`VibqDnjwPKW(8cAJ2-A>(44W6L6{i!plS5mi7cT+P*tItsCBx*Bt1@&I)Bh+2g zkEqcTwbW?p<kD7Y2dPb=I zsZ*#+sVk{v|JAoAHqm~Fx`+A+wc7-ZFot>wbq)1F>RxIqwbMlP98JAArf+8?e|O>% zre9Ben7W<1oBA0w`xK4PgF2LYK6MRsJM|-K=v4I_Or1}?m%5vpJxO!>Q|D4wP#>he zO#O^HaI$*NqpqSpNZm=zp2AwFi>RBZyQz_>nmd#_g}Q{ghPs*h67>^m+BEeKQhQO) zrmmwtPCY=)oUWd|s57XyP#>pyZ%^!`y_dS5dW0I8!8TK8P?uA$r*5V`LfuC_K+QN! zOLd`o-<=pidnR=*bs_aCs`uTATWD{hZl}IPJxC4B)R#5tRhp66nCvs0$ z|Gw0@)D_fwsk^9$sF7LfIh;C&dL{KC>Kk8J^%+V%gSwLXIQ4C6 z=GlxxokCqteTkZTj^>V{UQWG@`XF@|^$;~WS3UbvPoZ8+y`K62^(E?O)V}Ac|19bX z>Rr?w)PvNbd5lS&LA{E)k-C%m3AN@t^&CN+PhCTOl=?O`^L+K`L7hTfOkGFaM%_nE zy+A!{siUa#sH>=3sC%fNQ)}j{|8VO0)D_e%)R(BAQEM(#&!N;as8>?&p*}_Zgj&H_L&>L%(A>bunJi`73$9YwvEx{CS`^>u11wHwqw z`MVRtnKF~wOkGcXk@_a}Gir2!mK{i)KwU(=h57(>C-psQ_IK64i8_V4l)9Pv9Q8A5 z_9g1sjXIt>m%5008}$+Do7B&!72nfRwbV(}%c&1gcTnG>rY%&@8tM?L_x8jL+N-D! zPJCwSRx|5oP#nd~gPg38brnRU~J++y-mHHCZd+NkTv^y0;NBqLvj`38D$D6D*JY%nHy&HIN*_L4 zlo8A*ZJFjvN#7962;mV4AV#=lwfJ1yOB{qE*zP6A3R6-7fdRKmY&tX!jtB7v{fQv{ zL=bV4b%JaIV5t$JjWckc8Yg-~O8gF2x z7n}9ct5=R6xyv#xiWNx1>zKsMUL~}viq&C=bMT|t+3c|Ju%kPyL$E`l!5uh1Bs%6MA1M}(Ril> zBG||BfulPt5REr5;KfevuuNoL{eEv6DNj0}e~p*UYdED7hlx&;di8%?>O3k`BuY<|P`O7s4VbupyY& zro-|Q`GG$6ozmUqZB6X`G#O&B1&OAO8t!Z ziL5AClqg%2C|i_NHr{JR5j@4XMMw8qQKHw1;=z-;EjO5sgVq(+Z>5P-nR?XxAklFG zQyl2Ez?X7?obcsx5NsKcmXcnT-&~|;b9QQI$eq#`{zgAmN|`!;sL79Qw8CP&O)DZ+ z?v z=0~2HCuXOs#TPSF+1Bu|L|fNu8ryn+mbSHOg{Em+$I{ZauB4@HJw!{}I^i1i)3$D< zrENVxi)|gdQnRbHty?`)+xod@YFkgamJZt1&7P@k-KQo-tP*8gBd)FYY8u;mke0SJ z`Xf!#wvM5tZCy=E+q#REwl#CL`nB!XOPI#C?(|G;>&e%tC;RnQ&(ya5)ibrN<=4|e z+j@eUxLK8LEpu&sg-$vLy5FGg+Sb!)XUN+T7!4X>%{4 zrOmyMmNxfOTH4%WZq^do-1}+iGx>JA_A_9Y*N(M0y0x z&Mw17XGd|s+2!&}I|=^^+~e#@yzT6&EL8j?;ZzmC#Rl1U(jW&%4017My(^Q4^#=Jk zVo-qjcR05ot~4mby#__tPSE?(QtWef2z~F=;+h`D6lX^;-`Qoj)7epMadtT#c6J4x za&{#SJ6m==x*<`4?0R2=Y>YL?!F+>UtT4#Kod)@M(4YX@41(BeP>2HtMfk*^7^!!; z=9D1YpcGMq5V{zI(PR+8NP{xWFo1)L@N4N31vK zgsldh@wh>kveRgA?(% z!5Hi_I0>x=V^MRDt8^TO8;r*+gOjnuU;@?|OvEDwr{HCSQ*qc}5=wsV>Y0qb22(J_ zU@Fcqn1)3L({ZoC4D2#E4WAgyMB2Tsp3@ODn1u?1*{C%*1APt7#BhT-7;kVEW*VH0 zMF!{KCWEhJ2y&&76YI;)4k7y&+Gb4;qnooMnBeR(EO&Mk+nimFPn=zW zlFf-Yl^E)5Ik7ey1hC#98!sE=;B$jq48AWBtSS!|8{}h?K>@ZK1o56hAu_kP07d9! zP>dM{C0JoliYE<1*l!R<*8MJ81dRq|m}d~h3WIWNHmJZJgGzjEASc!bT2-SB`x9bPi1#}R`DL?3ja8!^J5JDLr8 z;4Xunc+sF2J~!x%PQP-|nlQ3@ z7QGCzG29>r;|+4-*HxCui(g6!`Iu>L1!y)1Vv#{1t}-aXT7zP2G$_G7gHjYdrwU9i^&H2>#wRv@>cAx?rF|SIjV|#S()URvXAk+znz?9oAb;JsvV>z;=U1>@nz$ zj|_UCgH7>_$Ug0#o94)rg?NN39##M$N8 z=j;l6fIX7>q=r>n&a1T30ZP9Y@iRI)Vd%L!U_2gn8K^s<;i&2)7hb5Mi zhprW_1^HNMIdbD@WeTvzatg5Da)Rjl$3zFn+2{j{R)`UnQ-~P^wyg*m5xq>YZAG}t za*FY;l_|y%%PB$CQ?8y83?(pHDOOlcDQ>fz5T3T25MH*NFjD{IqJ@*|iJ-`GBB&y; zo-$lwIb}f5^;;BISxyvdtV}sNKjTa6X*srAP6aZbb}gtt4T1GkVv6NdVxHwx;U>$e z!abH#jTbGa8n0VU4T8_OdTJ0Qu%3>XX*nG+-*P(P5zFa>otD!XMLS%y&S)esS{KZ) zoGxg#oUVAua=K!_<*JgWTWbN=O)(!gIqjkkcWz0&MhC!1_elY!Q})|ZBU3~ z4T^9k!CS+;!r39b;OsCyc6J2mFKSrzFT)^bM={aa~a#K|X$DP=KEp1o20MLcC&7gufdU;{$^d{KudaftOr!LZ~$O zAFpBdv@+%RjzI;c8dTz^236?rS668@&N8UMtp*)&w?QZT#-KBvFzAxJ+gq-mpb-}sbWiU19=P3ddg6Bmz3`SnZ}?wvl{TTlpbw5S z=!?k){cxi}fBeZ{06s7nh~nKY^dJl}7>u(Fj=>KMhTv|4WAP`0c59d)Sk7?xUv>2y zhf0GH=xy*FOg9*b9~c~upBaq8vj!*Np9Z6mv&YqQB8C}^!372<;bw!e_@lu%d~7ft z)vvi|C*vf83Aof?B7SOc3Z6AM6`vYRLhN-HZ89brOu^L#Q*pb&H2mIRI{s}i10COR z(N4oj1~W0$;B=g0Fbgo4jmr$qz%>T#)-Z3hoU?GZ!P$7i;2iwjU@i*wy0)E*YJ+*` zO7PY&dpkRX3!NRtPn{jX8_q66=f7!GEgJ=#U5?*4y8<6LyAlKTCH&>YdXYf@KQqY2 ze++Wa{qL?!E?Nxo@R&h9(%*D$1sG-!#AODBc*39v9~%^-`&%wR38ovA;&y`&{%R0L z`P;5c1Sc4j;c9~@eq&IMzZ+Db>>U@N5+@o|p~avYzcZ+T?_F1>BaSoZgo_M1<358f z_|Tv$D*xdE)Z%!97_Kqsh9?Z_@P$D=`n=}?G~i5wM%-%99nTo_K;`?cOi!F+&ZHC6LM5VLk5ID{tfKv^!ai&2IE;7iCUst&> zmlwa367q4WxwTuvyxMXKaic*I?lvgKV+JM2`ykQis#2V85W=+vVccvGf$yLzQ--iX z6fuKx3^J&|ID<-DXi$Z#4XQDEN}|tY4O1Vg?A9=UYHpqIOM}kw`$6_j7rbgYUGcs_ zEy_N0t&U-`K{x!wpbqaC)FXDtm1)3*293DepgVqJ&;x%o=!w4=v|Gb`-*TGpZ-YMY z{mWI_7i9+h5F_X+SP1=`9ma*uj^H|Hm*H2=j^b5kmm}{ZtwG~dppUaFG0xdCYfm=_ z;0l9m++dJ{Ul`=#8G}6h!yq3WK2B6wB`0o!Aiir*h@Th~;ZFu~M{H1n%EK;NDJB|( zaD_n_w;Dunzd;!uGl=3HgL3%)?Lt?eqd_Hl8dPDTK{a4dgC81nj2{s3b<1B`PP=u> zKUT7y~yK5@;7q0*pR(tygkWp~S|#|Z`vIL)9DEe73jvq2C1)}SX|HRy#84SFN* zKdw1V=uFUc$PflNJB-tv9l?FhF2lc_9mP3EG?12UyKZ^6ORvDMon47noh?)I1A_np zpC%$zW#d?b9Gqp4iys-};SUBfH9vC!3UIPP5H}hW;x&UJ{Kudeh5wZR=q#GNZrNQ^ z&y;3&md~8YDvzI3ZDktXuZ69J$b0 zPBtc5PBu;_Fj@|-u$&y+XgRs~z2(T6#d7lSU(3lu@o3kAd<0ru+w#$wz+2`ASRL7nA9FpR*qmEms7DZ@_(yMB{<8q0~|Su0bH zXa1VBZuzn0RN(kD*MbU6C$OGM++aDC*kCzT_>1LK;T_AVj$dK8Kh-ErcfC`Ci3H}< z;7rTuh+kSxNBr4xI-z@pYg;EAM_}7J<9^HOj2A4Y3kv+MOc!({uuNB6XE|MQx8>C0 z4a=#8Khw23hVBHmI)-tC_`2o12|9P;>y|fIPChmm6yQFCAXZtKLOf|uhToanSiE_b z3q2XbFLrP`vKBa)jfK3iimzMNTh4i?`mS>Wo?4gyZ{1QKT<T5KMjabp zw~P!+`t0Rj*eq||vTFzSi=6AjxYpSbeBkUd^v+87M6t}-<#^TE73djA_*CLtXUj?G z7X|?oXD7Vmda%qO2TvH}qCCgB<>C7V`S^=L0ZzzuZb6)DP>3HH6yc`?Z{70G&JH1* zr^PirjFX%l!CB6h1JT)0{My;&_>;3M@QSl5QJ$ZODZBn1g8;s7kc}T31s z&ZP$VC@pZI3s7wk#Bm0Nm}nqNwg$z}ht7HXTUCM!Ek{mk1|eKyAQwA>2!3u*h9?Z7 z_^UxV-Z7}ahX$26Dd={g3coO@hQH9|)S$P4{CjQC36l*v<2-{d$-CVZ-?yAv+-MNP z{RZ9ej6og#VNj1ik!wx^8Vnk7fj_-kGmeUhA8uY>w2EFkYgC_jTpbrAYuF}4! zHt2_Q4f^931_SVh!9WB`T!2C7V<7962FKu9gCY2t!Lj(GLA!O!w=AdKXD@xFuF?@G zH24mVHyDY_435X$2C{BxZ~{_7F4}1HF*p$y8jQgm1}EVKgR$_3U4U^IU@#sR7@Ukd z3?|?&1{2|rxB#c1pTVg(*I*KEHJFTN45r{e22+t<=AunQM}z4&*I)*2HaHE>8_dMt z3{J;C4QAm}gW2d1b@iNqQiC&5Z7>Jj4bH-`24`cU!8tg`U@mSjI2U&qwEgVmPnn_1 zL9#&S>@fc8>*7PvhgQ_9K2x^LrU9ilcD}HKF zi$5F0@GpaIDDLE<)uFdRJtiA8;QI!RxY?jPerwPJ9~<;Utg{Q<3uhVh#&rfw_^m-7 z{KKGc{GuFRxAd;Vg#I|TiwivfEd~Se3xh%Ujlp2NPtf(PQdD-;@@j`r=j<>BIXeP< z#AjmN@_3gnA7XKKIa-`ufuA_L68Ae>4uQWK1n|CrEZrOAphInKgizcf^nA96{j22;`;_M z{KB9c{$WsuSe}z%>Sq_`N}QykgJ;ZyB`v?B&On(;F%EuAU}@4f-Hv&=-RY z`r&wju7Z_fva>_D&e>u7+1U|%;cWRxR)f~3WurLO+2#12vn%jpXIJ8v&XyVctU&<( zG{{DvF%eeY)$e1Fi_;DA&|;8}I}8f&XM-UAV^D~2cNe+{{S1n6szC`_3`+4c1No=l zAdI&RBJlTcq03Ne5XB&aa!fa}wnIZD2lh+lyXF1-TNTzVyb@6s#rH`-j$$-=n)iH6EhJnc%z8s=G+6F_uf zq7GS0XtA7Z+)QA!9Ncd?Ie5Wxa?xRct4Ed`2rMJFhnACvBUVp7F0`C{+-zkE@S5cm z;2p~eV$eWWPY~~Z-?h3BCtFS-W)s+gA~fB}|J7x%s*3PS%PGc(R;C#KK^mH6N-%)H zRV{h@+;U3sYs)FcpDZT?-(c6a5K0M*7RH&D6Hcxtg6~>R1Xoy@GQ49sWyn6y?Wr7s zmJ>yXV_d7t@%&p!YnX#9M;5;c+@A_uYdMwpo#j;GdCQRxLk)5JQ-v^r`%{f!mQ#(B zET;xnSWXSDvz(6jgXMI@Uo1y%7LIlGbiyzK>yb4~%jt|~EvE}UwH#T{9P0X@D_RKL z)2_I|a%%B{<<#QemJ>taFxP?@`Viu4n2+D6b0@xrd6DJFnaH33*BAtG*viP#`b{oC z8E!YXu^9Xdmoph}|JK3j&}Y=gE1iuhgR`MetdHlM2YnEI8~}ZWy9eGHras>~&Og-8 zUh0#sHw;+bExv|Xmb`}f8#c>Z!%P{@zLaY~7*m}c!7rR$hJQFaiq6L+{L2An%l)LY zEAby^%SovFh(rN73Eg0jjaLkE5c`gE%f$wRJXDT!Ir9IeK><1)?{b0|YEX!o21Qs% z@YXQzakjkEJW7juYnbOaJAxKxm*E*_NAa4oAmv6ya)vV%%U*g4+#Balb(bzcUEqPX-aZ zW>ALr4WjsuK{;|xbh}W2ut6oZ8C2nWW1L$xvQBbPgT4kGG18zD<{EUyB7-i;yWJJ5 zEvFU_8N{&Lpc{@D$TLsIx)#)9ia`UG8Z=_FLHFd2?}7I$rzbMUxoEvG(4aR?F_3S_ z7_|HT_)5#^hg}B!Q8M0z9)N)c12NNJ5SADW#(INeu+3lyUN<-vsVBS8Ls4Te42=fu z)-Weo&Irsi_zrF{7>VZ$j>lnxQK*^VDm?*{3`S$M!HL*rFa~cLoP?~2F2Gnc8jQmv zgYj5wa5C;Rn1H7YCSt$ADabv=g+3L%3?^ZU!DK8kn1YQ4Q}M9DG`wyw9aX2g&@(W_ z;51xsFca$xPRBh4v#`}*Hntm_ffo(V#6E*LIACxVQYX0<}Jwb{H=^JA$mqTA})vVVbj}*ywEe7Lv2&n@3X;{*^ez*>YmN-atOj zZ;*}9)I<^a_jkBKE|wVN;c)}`e%CZtrU1PRf;hvV5bF(!u*aYnxzk;M5)3pb#d3oX zwitx*l7W2jZH5a_hA{?FTw)+!Jv6Am+Xj^=I?V;B!YG4k++t9JeFhy-Khu@zBtO^c zpflDQbivC8U6FCRbF0M=gBUI`=!Uxt>hPRFJ&IVqT zoGoMRZ25|#vm?+a0VdWkpL6L^yzT6A)XveWHD(3Qc6KEeI$I8b^#%bvWYF&W<4;*m zZv48+g}J==rIe75m&~mIZyN-$-=Gjj42qC>R-&0z#fTV`V2(j4?lF+Bs~N~4U=YEO zvt6_@OfZOImO(id7*t@nK_%`qsKO%#)zD}2x;0FFETdb)e9_!G;Z1|i@a_lMJ6#Yw z$F;31stjr|$3VV)YtRi(8_4&^=ehv(@@u>f8gPk0BOWm5j>ippV243ZylK!2hYfn8 z)u0KXb6q`sP-D;+y$t$c1i@RwoZ##b);K$iC!HO^erJ~(@eB_hd!M1?_){Cu#>$;Cp0JghUw$3q4Mc+Vh+-1A+4Lev@*VW>ed zCK;6A5(7D|4MNy%5XNqU2tF~8ud7|)Dve^eK{+lqsK7>pN^CW#!jlH_-A98Oylv1i zesILsFf-=6N;{*%pbL5!bj28hTFf(u;c|m+umP1d%ypJikH-xfu-BjwB^SCDbVt2G z56m&>iPZ+Z@Q6Wg>@jG<5rVgdS<;w5Lx)ZA+jz#)TdG+mqsCHEJT4CMa8Kz^LVARq4;6hPjYjqitinRtRhA+9u# zuM8U$<6#Bt6ir^ke2FgJ8fMl4jjF3CA)G>67eqo>=+eX3oi%zyxww( zvDcy%<8#X?L8tG#dP*>wz-XmdXE~*Kz;Z(ID+X83LU`M9!l+v0qJ@*|iJ+I|L@=Dd zddhH*<;X|TZ*hAX#p9L}#nV=%9EJZ%TEjeGIqkkbKIBqu4(qAJRRp%W66-9d3eQPFMI^T-&;$l)$#t;sVR5#Wj`_!`+q>!|w_4HOzP4Oe_V;yD4qHKki$q z_0X*VL*H_4L4*tnG2TGljk7XiQ7eyUj|Z5{r)I}NK8G35`znT>4SfQ39L|P5*g6j9 z@p;v80Q6DM9(Ze*`WW0ea}84;h`V9Hqxz+B{r-4#*stvSPY&JN=r&W_;3 zW$b+^D&J^xwtNoQ+2v@sJmFJ;tDRkm$DA!Ep$=Choa7{Qu0b}QF~~u~a_1)B^)txB z^9K2d{lK{u;30z`UNR`eX9h(mx>Cz{Ync6=EkCyG>@apYJA(I|U52I~Cdx)J!rA2* z@9YYk;p|FmbhhmJE(1CL8f2r}Rf({2DV%ALiv_OP5Nh8UD%fsK^^8A)Z==C20U)ii2VlLlRLf# zx~+8e^u%z3URY?*8=DQ9u*aYe4jJ@C+O;lPKg=@dk1YoB8<++I@wveubXw&C48|mb zW3a?v2yQVr77rT?#Y+amu+LyP(thMZABQ4?5vVoz4o)!`i7O3`$HNAr@R7j@s9Nnp zkH!Rp6LG!47(8xp5)K*2Z(v^M0*u21gYj5ya55e=n1HtpCZgzi7vK~OH#ij+8%)Ao z29vSNU<%T1Z~>+wXfO?p2Geng!3;cLa2nn;n2C=J+Ivx66>p;p4&*YnaKO!@S)2l;de<%P$Dtp_OU;N>n&o z4uMey@(Y3n?ba~cd=AsQu5w{6FMcT{eBI|T=UeDPEHWsPA01CLP1Z1PF(|=%2J-vb zcRIHaMi_)~ia|tvVBEQtVY@*TFBz2MU4shw!Esln68Re(RH2)J{0!_My*1{Z)I}uF&J=<%LkIxJW z&|{Nx3u1~vAr=}G;TD5pJYrCSw+%|s>1Qrl2xASxm}4Nn;%Xqj;%X4Zc7t*pFsMNE z9v51E6wsgw{SB(+x4fNO4JH_Lj2|5FHOvK;)9$%&fXW(X z*3VrF>e0=h0fP-1G2fs&t~BU@hYfn-bAw)p-0MR3#$bac%p!PemART21Ph*P>lR75&-q0$!nNRni~Hu`Ngz#-6Moev~{UOR@_~B81K6D zF#h$|#QIVMsrPFf^^c(VGB2?ZLZtMqaz+j6p*2~&y|qngC@%fz`r{YOO`E@J{y>g@pNOf9L%vY z^6h^slZ!=`BfqU;IeA!NIeGZPa`JJD<>cdO0_!P2>MvcZ3$W}}*EU(hw45M5w46dT zT23K`5*V!r`Y>m=hPlpiit)OYDaL-wDM8JHt_39+Nno^6tg@U^+-W(X_!WceY9Z{j zoG`L~<)Vd?>xm#@IdVfoU_E76WjSRyZHMcFC^lP86c1UMay;9bw1&CYaw-to>RM2N zCIaiJ#QByZ3!0Wwg>9Bog%>TS-RCeff32YzO-`r;_CbyO8o0~ph+8bDBQ{x1C!{^( z+SUmX0;6@tQp@R#+bpLG-n5)9IBYpxG4?kuT34JwV6<8+vYcA1vYZ$mw44}r5#no@ z`T+R&I$<8NAJ)*!$w!HS{7|$(5c;6_xLYCg8S!x_Ll1Ks3w_RWJZCcW(YkRs9s0c6 zILwAVCN~aeL!W*dhx4EhwT%P#JXjCBHB5b0W}LZ(sZY(^P#PGpS3Z>4a=)CQ{I@Rd zD$g)m{9ie(58VD`seD{nEGQ4#8o052ev>>9XyEF0scqt_M=Vz!AhbklNX}|L*_Yxk z&8|N#kytD3$h@^JE&lTIo+~3{hNfm`vQXx&i#7d6^LlUgho%PnO#IQjp~bDOt##7I zqMjKkUF8>#CJ~A+;ep+T#k@zg9&qu*`E1^qf zRY+jyHjNw3tO^S(C1ht-=~J(EDELZ;z9|jzRkw;B^NL7%Y47-MaXX@^HJP{p#3(b+*aXcE;qr2YHrhwv?7$8I-&)Us5``&yq^-ls?TU z9r{PzG*$!5xa%6C;BA z6|W$cHA%NTCf)MAV0u*SCbiECrk9I7L+#Up=@nwHQ+r}Cy;AILY9AkzA0ij{Tw$O< zKw$ji0u2J$0*e)@1ah>DLZLvezoQBj7kw08&Zc<4PqCQZ1_w9v;&@;u#G zE>oiJE2czYFvB`5cfhlV-R5q8qkzTO&UVuaV>_H-FHrJl?k{x6LkPC7xaQ zUSbXu`MpVy%eh@7kL;C6FjI;T&`VcP&g=m!QCvn0ORwK0SpQvlY_Hfm)jl^U=k!c` zr1oh+IiY7Fx?Sv(gK{>{#89=r6O>bVCg!U>ASmbYOsrMAA*d(uO!-ZBfhqwV{>UE% z3I%ldXDDP~m28SS{4WN%{woH#D429q6!{12(ZMSn`WM|aR<}LSANA^fPwVy%ctBl3 zO=FXf^x|MK2S?uTOUaX0NM6>0f(=sNP1OqzkBh;Q34Ct_*ulCGfK!^QK zwI>7vI_!JY9vKYiuva`I_P}6(!#-c3K|qIni$axv4m(2?3g}V4PjfO*wL^9{`~S!s z$hHH$DC=wIz;LNl>ONcR&ic|hP#P@#nmKSK3(6dLz%zi)JYycBf7Y1wN6mpyF!WV( zV3b#+5i>laGgf$pd{)CVygATj|AO)3-aT8Br~jfHWbBj%CnY2C>?sQX8^lBV;+up#!(#_2}ZuELwh}|&8Tn0B+uxK#hwwx zR?qM{w9WnnbLuL6u@bqs*LCzQ&XN0!7wRVaJgYiI?x|;`&0eC(b#-21$q2^AV?6X;lU7ox*LMT2sU+oN%i2B1xOlyxJ>E7u+ZRU(|K4 z{_sDotqJ?n{VzLP8=FX9+WMEc-LdM!MB?GYuQ`X-xBlR4ITtv)b^lIhOR}@CssFpP zH`diT`;FgR-H^Ki0O_ijQ&W$vc&jveMF5 zn*Ey}X1nxz?zzX=DQ8(5wmo#dOJA83XVUpSTzc!Z=6_4?KfCmmN&WNQjhDLg)xWbg zoG`@f9^=P5pOj~JIs3;cFFL!mc#X4D9<_d+H*cOxue{FEf7!94OK<)3LuYqfnUtP1 zUa!4o{rR7y3Df$r?c=K(t6iLB%a%DiWtsVGZnggTu+{2qo%bu}zw@-yoINJx3TL+_ z`G5G%wJ!agcRqD?>xYM(ec6Al-qufT9&Uc+9q03*YiGx*za=Kvr=Pyy9IpG|I%mK5 zVp50y`f-=udWQ{S^)G+!(yw~f8n*E2TU`46e|W>$t*w7^c1qGD@4d6POaJskYp|Xn z675`;G?C8PY4xV0*v|fTlC^owMSEP?V;;QN*^AHpz}YFE-s=|^v521%-L5xyWiR8 zO}BBsXqnC1)=zDWQd*Zf|KqQ)gYJc2*#VW}4vOy8uRQvS^KYFq%GtyI_Pnz{xWd|b z_>BkS>6Imk{X2Zv4$9V~Iex2~KQBEIwk9q18!xK2^<{Y5 zw7hiBNKXo$mo8V-f^@GAiQ!#JCkkhDl!-kw_K+^w@#=oOCQ1xT+2G4hT`Z3TPnS)q zxAA$KG}-*Wapc~?=Ijo$vu4*#_m%eWmDYLx%3U zb9|-eS^9Y{W1j4))SsSmj%;NSM*5CLynCeB8fnH79jG?Rm1lVw+NW(YtZKJI-LP-cknh+&yD3U!G&1p7MKXuQbrL*Z)GcwljzAl-6o<($m@53 zq@?u8C@spUFG=g@OIbFiUskmoz$ucDo;F|hD3~D)JuAC|x6P5(DCbH;X%wYraxnUN z!$At_rW>+-1qf2l7fYYqNudkJmuhkUV!QP>xY8by3DSwKj5s$Zb4x9>8Yk1<)4 z4Ah;Tc8RR}`xuFbp^?XH{9~FP$e?~fELB5ycAmG-s(MNA#?}%>LM4^-%kXuc46BzM-6(<}P|*wCKEQ2yo-2 z&`)Q9_~|C@r{g7ly75xpXwiCFo{*DJ_d0G^F|CHo*nX+AJ|p(NY?vfx?%3PfjuTsS zNFDtiz=z-2i~E?enbj-nw6 za`o{NXh?!wfxHA7k|38EFM)OJ@ZL4fskJmO${F?o-GD-XMWo3LR zP11id6}^6IOs!iWC*44HW?FMhwwb;Yo4e^Yz;5+7OKVz8yUZ9Q^CNbWa6~1r(GG=^G#*ss0g;mMLD@1Ib}#anke-Ij;^O&8P@aFWqc{WlKCNH?~M=7 z3De|;KyLj`Y(7DZ%(N4mPtL1k#O9B68{jd{20NB+xbUr)O-tmm7`ux-*A$@O?`)5NdYA1jlzKVMx&#v#}um$2k|j^b8vD!a_x|MG*RlwJG!2BWmwNwm+{W|GTPoe&~t7tIUnme zySJXJ<;awix}LLjM);fi2*?cVE1RTqzKo(bzFNMYZENlBfK$W+cM-(*S4j5=LH=`xe!XRcqzHFk!!7YXG230m|^T z1i1uz2{a@@uDf0W4M~s-u$MqX668wkCD8bi`zL8yuthG>$#YK*Q#oceQRbf9L$;se z?aFZOeMOmZjNOpUjjwsIObGiQU-mrM(z9*da!5(tnkaP_99?(2GOYWn%Xsr%I@GI2 z=iM>V1f91-WUKT3SltHL41e=b0hzbMWOJ(AurHQ_#Opp9k|0Nmmq0@j{td+?82)4+vmOO@X z&6e|rCQ3ib%}4t&Y*&W;_)TSG+67x=2$SoPQ!6$`7pv2)p(TCf z^Q!R(DpGt=%G6AYMySYyGhc5|wcsQ?9q(y_X(R zN%vlga>i&D=cIeJq;)SnG?M%k#ecZ8>dXCgx+eK6w)G#!DJ!Q`out0z<0Mji9OU}! zwNa;4QVd18KlC?`uv*7)qDT~-8ouTQ(tbVReMh6|TXQrdVPqnKM&it4|9|(;ahEnE z&uzH}k~yb|GUw!`r2U+0SB7)$o65))A=o1APp(JCMC#E*sYm{yY+p~iGOXw8%1EBq zf7j{L0@U?Cf%gRZqdwfzSxgt+ngoejPQk+CAD}y z@^*%onJJldWi3}}1;@&izETWd`jQ_i|IoKsQQpnaO;dqyu_g=ZM&82E0~u`yD1LuSY;oopBcxAbS;^B%)56oIdbM|9 z=cFsM6@T?wp4L;20X8SzsXb)Zv|G}92Bkxjy7h~6olW|Agt0Og^v^37-;JKf#ErJm zx_U9<`_(fPH@+mYe%2v9h(4yJZt8V9ZCAaC0?bQdp38i%rH$lJCHT%TGxu}<4O zJ091yS)=zHFU?UyHriV<^c*)2diHW{*KX+9QM}ZU4d+?gs(jwq>pskEzYnZyOj>-8 zzNDreiCtkuHEFCT?W?NcPDvfQUx~WnJJMzcdW>wdw~3wX(LKH+ZFZnXxXs=scG4Sl zZ)~O~_RHIowsj5nu+2{PXz=!=ZAGEvosIA07wPex(rd)WQjh#kq3_#sa8kVS(9atr z4_3D1b39VKj>?JeR-);-iSk~to>}qo^_lUEqVz-rZ(!-65$T~uQHDRWcUoqBs=vtJ zA***qWiD+q4FHm{>Cw;2X|R# zL1LeKx-sq{Pb%d`av^zJgA@Li@6;x{o`+PjJIiY9C=m$pywr7W?8ewfgqAT?LbW~qxyyLxa?c?=n7q4@>czPq$CSKx3NbfwpDACTW z`*+JKf#>C)glJ4Im4Rlt76%$?+NX}wo4B-V)vbBF*mVm|7QOUeEk9~odV-d&Zl5|) zOE;e)x=|y<3-^-`(hQSNFT~!^8!9Eak57&5O_2O6m>TPfWGQGu_9Yg2q63#oEvnI8u#GTo1biO{}{AcH^Ni8aIXWcIje9H|9 z=bg@3lb9ZNX0J2ynuPPS&RLUMRN~GY6gvMn;ryI))}$7dxHHF$&TA9S&pT&LYEg+h zb4clYW5RitbJnC5mAErUoX$5ToL_Lxn$)7=IWN;=VZjvX^6bo{0lGO+@I@^+RR>6u zT2z{+31%h@&@Bn)zc^=2YEg+h+W_5~aDK@-Yf_6!+}Q@`wuJLvowFvjsKlLZfNoDX zzwDefsYNC3e2g3VbqVKJoU7*Cbg(|&dc<46`HJ%pJyiFhj;cT~z82B@iaH54?H>{mQ{N5*Wj(R1)UHU@ z?3EmR4g(dB6&OotI6XK}+x7~C5$ZmNgBT7U?t2i{U3eUMw*CGJ_8aHUn5$jg_LLT(gaG?3y&^S261nY%B4I~gpG`h^1nAySjUPAmkL1s#08`jju z&>3fI4)JXJ7*U}r>-8OUJn1vg_K}R=9`OPAB~oWBH`VZ`QvL#-+s{Rwyy&Eo)I)Bs z~)Z0pnI?D=+`b+YP2Cy_2?S8uuJv9+2&n;6Ijc!sI?WuuRb;7u7bnc zTVm1GB?c~|vBGo}(V(Sden7<4DuN#nagB=Lhu!6ZU#u-at9p5D_zX?3y##s>Ls0q` zh^{I^+^aZ4jP4)$E7`s=m54`JTuh%ULEj9-I8mSt7BSQwY(F~C_H&rV^tE6X;H$3b zpV6bZu!+(fLg~;aimeZkzYlt|qXD~e5O!!V)^<6`5^|oxtGp8D9t3O7!hyPA;i~0% zSb$uDKlV0LYBD1ap4^=g8Hf8~O!h`QtBnvHrPpaWJ1h z`htbsx$QupL~7fxX>1SHT!_*I)^$#bhB{jLyBzrN&EEJfM`u`JZvYD<(QcRyAIG2a zLXD(@e#3N-y^CoD*TGRHqM&mFDLxri=#4=0Tte^WK{-!=5X}iOd|GfI(1u4$r$!1S z=%DHMGo!+FU5muS>IhVFrHl-uNg9ddrAZbjIVK~9&}QE1mU$0_iZX8l>87YCVuergtS1R3*ZN}f@L8bfWSpxM zpYLHQek;;cUl}t?d~ys`z`BE5CF{WX0UiTf7|2wio|sqHp%TqowFJdHaw<|@sZzw! zxNS39P!^l>&d7VZB=bH5;fs$v5U;uHT!{Pr%ULrHY3ZLrFhxp zzWl`V@=|Q38aW@BWaex}&Y3r&$tn@!m@8V*Ra;4=w&&IM{Q+f&mWl*L>r%xrNq~9- z%LQkJ=qM&gbFq?u(_BIl6ta{EIBB&aXHOE$D4~i=y`*Z;6Fb(!n9GcXP--ki>*8B! zv6&?^iRiac3=A%x_Pn~j`>9Z6Lankf7q7GDi$uk-ek=hJWyJNkaUEN#*whOVsRc7_ z>ZGi(7iWzfqZ*D$!A`l{gr;O6ir2-D&_$#i?RoXdRZ&`uBss(R>r!>iQY3t%r{8?B zp()3ULT?TaL!!8Bf+u5pUPIsUBm};yBe)iU_|%ucee;>`O~>ptlsT51>ZYM@hnf7{H(Td?Q)wa4U-6wC6ST-ODl-N*N2+#W7J)*YNs z*OE_wZ>O*~b|!f&Y3d8onP0wU8G2{jLba?LH?%LFV*_al+ObdrpAw4`>=&&$6meZU z28Motym_k*#RMP}?5c{brTEmRmoG>YT0Q<%cr3oy zKs0?PiN|vi`14j|zLkegJ!ZSW>chYzeUmFH{Iq=QW5_cf{?D2f;AV%gKC|W_B(Xyr zv1%3atUVa7T9D3KyOKnz7b$*fAHc6ywuD}6oju6!)=&aYn)nMm(eRo>fd|(`)4wL+ z={t}1{!`wA<5}ERC&&51HAH^OM{sq8+pawp)YYRYt1^OuN_=D zkS467T_&W@#c@&@c+&QBS{k2=1iK4R9Vma$x(PMB70O>j^VBHQf*(xccI6j_I*Qrl zh0t#WqrKlpT3I44WBNWM^F;j0jbJ5-ukWQXxNpd{wHeg%QK=J8lD-4i~%SsVASDGdNIM#A1#gFJ)x)umEc=h7MOAuoCar&K+DK zP>Bep>Gh;)QGMPz;1|?JWUh4=)qwZjB5*i08IjuoQu@ujANY zIG8w$Glnsvq{h;@PgS9cU^N@Wkw!$h)G3=LPl%>pRS+(0yBCab3D)d9VIJMW)PGJ8 zZ8zWgE!xlmwA}!!fhv9O093TRcQ6FxhrKj0KYl(>jw{CSg@{;%p(sdJ zMs?cXMN6G8ArfaO5;ZmREkqQ>CX4zjiVesLY!itH=hmn4h^9DH{fmWfeDD0;{^`?o zx>XHecO=%-1EQ)xOJ;K4Tq$CTuPm~cO_D5q4Es0AaA2w<8TPMp$woxigh9*2F`O^f z4D9`Tzy2D_Eo}BC6|mXGid16t;bhsV8kr5kCJ)Kt6jRXABtW( zZ|RB<;;0GZoRy9%smSAWGB|3yXX1LuKO& z5y81Is8+CO5?5je28;o0*`cm6%N`JGT{~eNY9=m0SZhv0yzeFU{eoxDY^JxT=6E}c z24@vsPBk&i;- z@fgG{L~Fo@TjcsDtueCcWwEg{ zf&9`c93$qgS%^+JATyB3e6XK$kTqWWK(e~Z8mD@766l+3#ZmbQ+7Tf$sOU znC81Q$vVUaA_X!g-%J)PrjO)cG*~kaike)=0gVRHNqLyghl6Xj6!8>9g2jMS`NJWFuNa76mquuIWq(yMKTYqIQ4(j(^-rCMSjt_* z3F&EiR7N48pu4hvY9Q7g<_QwMnG@_S!Qv!7bBk#zN}b>P3Az~0ZqoiL4qA+`Ex;OY zq%kO|s9|th`2Xu0HOwvG|4@DBTbH7~w?$X*R}T%u{_aQzDyc!~K3ggy%+83dJ@mzp z=!27k+!afTD6X_vbVJb_%Yu=7rykskA_d$VMXy1p6`k;X-3e8c?1ax{zSx6CZ0?*m zS?PApU>F}xLr*1{(K!o^&gr3v&RG;@Hxr$+s46HsC&%c@f_0$o+c${LNk;>va;k!| zbIK@*tIp{v2roqElu;577s}4b%ZuTH;@p8yb|moZi|hw(txs|x`Nn%lB8x0X&dS$3re91OsiU06Dg{R6xT#TH85WJ zY)hdxkBx4RXhUEqMe)K678Kh3YD^deS9wUBSx zKaYk;TWvq;n$#LMxsuE7Bn|#_KF|M|p#prA-&+n|o5kewPlzQi% z3PR-tv(_RAmqtS2GSo&WT-1ZRSQvjLQ^mjvtyMk zwny_b268i;8{@vC^vDdArswrbYC?nfcwBL^oEcL2dAtvoVazNGmxT*^yEdSkmI5tB zLoDd60V=))m2ah>`bGb1HkB53$)^4pq0gpbIlvbs`rLIC@Af%u9EEd!I=$7-IepAd zxW}SL9#)mp=1P;8ht49c-aI~f8dzO9vS zT@U>)hW_(##+5B&Nq|NwszoM5j-)b`9>bX1-Sim7O>j49e}&!6&vg}Ock|VZC^^#o zCi{z(C$1DrEYk=$|lec4dFKct8w(=%=y^SB3a#`k^vP;!?kR$PP{R zDkO%htz?wM!^Ie`x(zERl1*zW&+j6WAyD_d>`JcZNnboQJkNJAyvehD`Bt$U-~LaJ zY1pC@W7+~d_{Ox(j408+suBNfh9I1M&OQX;l&~6X+%aYT9d4}05YGE4y~r4XCMoO3 zqsTFoCg&(JC@84bBZkP$Hi~?OhRg<*Ot2V5{y|aMMv)PZT*HnceJ5wI?KmpyK(dcv z_I!@WR!WIlcP;ECs3C+mEabe71`^DHWtWq0NTtSba;tYZSto}Ro|92EE-z?Ux*=v_K%D4n;@K`kSs^nPsVTF-MHNk(CMT!Vg$h|IGg{P?S>Q4u26n88$D(cTgR@#4$9$QMm>h_T zdf$T$!@0>~>#BUq+Mep^f3JqZ5P@pwOPErx_GZ435hZHq@yvLt96R1aM;E+A*bBGE z^}L+pO?S^jIo?d`VJE{|q0DDyPnN3YH?tB)XJfx0u}`+>#ffdQMIWA+oGtpuM18jC zp}uSa=^^s58_B<=l-Pb>_05_Sk z92rjp`PE`-=h3KW=lnI-Skm#8lO|_ft@34q9j>Y2L#FlNf|cPQyChb$?Pu7n2!~dN zi^S2*c2J*|sKMXESvg0ta)$b-DY(iZVfzN8h6~`~Ai;{5zf=Sqx4dS(H$wXGd zxB5nqrDvU0B9!%YypCb2-Z-A?anGrDcq_k)Hg0siodhCx)vw%S;%6$8&7Qzx6~EaFj5=V z!_(46>K$NJWnb4|UJ?kGiF3d>Fa5tbPgxG`G*8(Pp=fJrW-)U{MwBpBc4j;oiukF} zyy$UR<|1}!zwmJd%PD~DI4ZV2P;d4Tj z=#D4QYvH=MJSH!YQ62`9Cdut9m-^&J8Re4JJ$=SRnsv3kMP|82c07s^-HzJ2?0Z<` z)$^mDdDfB6)$2&b7S;O>|GVSVE)apnDc)xD3<@(_btUV8pBIKoGUIuaNcPeBlH4X+ zbuit7=RZX0MYr?x;CVk2FT6c?{<&^!mQFnNXe`!{F=$I+<54c$@N@qmt?JOg^abL_ z$C|~DDb5fcjBs7tL+;I7lcGASio_vzUUkIJFC<}E#|vA_8QP7WejnAe?&;S61C6y0 z@E?(w&Y|R6xO2znx9KMZV(oeC^i9DNmiF+sfEVxx4}>~aKQ~}OG3hA9u z72r^0s1dJ^!&Eyzz<;^Zx7a7I>>cD8Nnq#?c-Pq|-sVVS=BKvMGE{vS^3x-veUv32 z7Q7mfW_;YxQ;5L9EeZmRM7#Gu>c@fe;hKRoJq9@9kk)k<(Z73orxxP;73l(j$V&3f zJco27OCxDa-1DqC{Y(Q#fVmKk6rV*Ttxl~5Lu@?fx2&oJxww8Nzm(Xlb!UG3*r z;*mF&tH#KIW`!JAR@iXO#4Agj#_0;ipDDDgcK%x$Epy%@&-`qVEM7PCBJ?%u1w`aU z^6}XT{NCuKyaw9hTrJjfH;iB=QjGp(KpFMrDg?@_QM7K)ci__cic0?hmzUw$&Bh)^g;geg!#IeKSJS+Im6Y0(CiDI zh_$_b(fOQWfBKJZvT;L%lot(}kL$o z42?EKJI&*UsIp0qy={xJVU^~(7u5?lwn)e$0%3;9V0$W8@ST`cx}cetOV-LDE7G?l zA|5$g`_@4S8HF8{kR(Az8Z$_+R3!8Rrv4=1^)nHfxCC`U@~OO35n^mIV@0#vS|wt7ixSg4 zcvE7$2k+^fpsW^T;whUxDB^(f*uZwl6#Dn19zoj zVzGGcAaihnM%h?nJ-ug;vr7%hRU$3aayBX+a`&p@2`$eW;8T=qdn0`6rZ*yVfPRM? zCG{vE#^M4lAKuUzR~&+Q4Uu6CgY=p+QU}0m4ho$I`E{L}n^Wo6SMck4yr%P@%oaR| zIIu$b6WI;PnBZ0*0>!&yIsHsFz2mGLki?)+*s&e`Z1w`edeG-9enB>L7vK{82p^SR9%-;-XfN(OT&tgHxx)fdV1SgRP= zeTSB521C?uXYT1n7-nl;ZQ zE>~2q@12?mR~T44TxnoclA{=roz)>-qa&`YFcciF6ump?<`?a=!q=N;`g-%MzL#B- z9|?!Uq78~bw86~YTotYo$wZK=H&Ycwga@Shc15DvR6UO;gKioca&etq3_ub5+`Dv; zlF8LZPY*}9Zl}}fdkh~w4#~wb|Hu^>ft`GN?jYzs^<-%;LZQsJi*#iOWzI~hruc1W zlkh}ah0IHE_`aXRtiB`MsBgi<6&*V1>y<;uIG2_vz?OY!x3;+oMcq+zo?0*UHg1Sb z3F&r#tw)F3E%Y0YU5V6$Yea((L9TX#-)lJfUYEF?Rpx?-4#EYkJQ$-jmK;Q-#-#=AFJ5(+qFMpVNK4M&1gTt=cK!pDk+Kx zT5mBI!y@Ct<2t)!5-~fpt3A_0$$)IR$83wlwb|0rVC_lkPBACvEMR1Oc)X|`5eQAW zTREy2v|1)=4jr#=den@k=H2Hm6vE%;iSx~Fu=nyTKl#$>;ac)rW>ILR-YuoP?33>s=L6% z@I=8?1d8iL-c`Ryd$?UB6M-nh5p#avEdwWUTl9401G1!lI6mbr&Ab6eB?`6Yr$46i>patYabmr%HZXRkgKKs1#Q&_m@yj-XFs!f z&>{kFmDKX)i>J$uq-%0L6LDh^UWwh3bZgz`sdsECg%_qG=HZ*uZc+ax)!lFQ<49My zOEgFkaHA8uKcCqlxy?eZDVBN+x87}_YPsT>2c{}*sZy=If0!)2nMP)=nMKrRYw`$L zT-BJdn?nt6Zhs^ZPC$KblTLVQbp%UMVL<_|4=8b?=2oQ`vXR(IFTxoDL?(qNd00>S z)~qLq-UB*h0|&#CGFfk(JV=ScZGa_=bcee=ti_hvw^)GV{3tUuJuBRu$#-Jk!)`l| zOb$;LZA1i~HsblxhNq20ri7=6Y$9NjsG629o8CG_A$T03s#8tt-OP5<*K4+uELk#J zW8VXrS%~e%xnv0D$&!_ekwx~!E%$vZ%hV43DYhRY$#BwBnQFOwq*i$a^7C97A?-H| zhLgfD(s!y<XySR~0r zoUkKjXmq+MbDFNpksNNS;X3li&%`>1XxbNJePm_-bhSGs7SdG_sFZ589cP%-N`~D3 z_U7SJVPZ49<_-FAE1g}VD>OU91oP%WfL(?G+W)|!9)4SidTnC@pW5Z_yC{JVF!ED% zLcX+Xl1=jaGze(15CJU=+I8Z~FfzkdI>XjUkYfc#nWy_F>d8^ja~9f!;@5Mci_|2J zkrS8wQfV4y_4q2{38(DT4RseD5MsWZOZ@w3CZW$*p*c6*_WkHljltz6jhrZoiV3BvRE6T<0Kvzh7Qisp9 z=@V?MW$|gT^U(+KwUNK0JMgE)O8KlMCz$ePkVEV7HkQe6@g&eUop%P)T>9-LwF~?3S=+duEMTrR|D!h zPSoe>Yb>1sw@VB;mcDN!oumC46tzEDlegt-G3Dh%%1V|d{*-kvv_TW1(mNSTCh@Q~% z5wlvJ%ArZ824f1s_1dZc+0?a;s zF=7P0UZmX%$sWhv7=;AW^4*Z0*8}Li(=X`V&$(^<#pjHyVsL%h2NZuOa#5HI{CWI1 z1X z0GSB<&v~Gz-d!dXMju@el{f`Y1mJKyM}mO09$MTOIL%0f96v^mp7*#y<8-FI=UpM+ ztxO3bS!dvn0_R=9{7by0`itWiHy{P1v+&tZ>uQ7w@bW`VqXuPEfESd#rw19F3kAJ8 z2++LFVb()b%Ol{kEC5R4iMk>RV3)(=JXybH^6#>)(#sVmQ5@0%D4qyRb2>^zN zf86i@gogr-0;B;a188630>CAJYXCO^?g0E6@EgEWfENI-0Nw(80QeNJ0Z;%b=?ls= zfF{5=Ko?*dz}X(s$3o6R1hpZj4?$hXnTeo2 z4msr%hC)t|!jh2lHB@ewhMdnREDJdwQdk~x-lni3<&5GQ#d)~Y)#>mkTaLUWXPFLVNb|OP&hl}jHhr; z$Z4io{{uhg=rm5FFQf8NwPs6JQ*m3os2Z2e1IJ1h5-mFTeqSLjlf% z1)vV?+)W|0b2Ej|&d(@>b}pw7+PRQIXy7NQh5Q5L}&oCRAz8oc8l&H1*aI12gFfRh1d0xket0=Ncn6W|WO zuK~XSJOy|G@Cx89zz2X&0UH4RcI#Y;-fLHeoOKk2L(aJrR)w4&P#6h0CsJ4)a=u4l zO~}C){Vf~Eiw~v{jr=L~VWrvr4r|pF*eF#835cZIZ7>wfR>HQJa6H5VeV)zT?__ltR?z zuPEFFc7A+$rMgGf7bDTH>WQwZ%OD1>&#QwZ(Q zcS1=!Q3|0Q`hWsyCrBYm^EEmywaw2cL}@-m7#PB5KJ#Z{H3pC5z{ct3W6#4bJ_Wk# zxz)vSH_+<2(#5GRdd_um+5wge6HIS9@WfG)_zXf0l88gdQi;qY1U~`5d1euU-|%Im zhY7C{2!3jUkv<@F-%3={Tze;;H-_@;4N2Sy%&SQr7;H-H z8f;GN7_^HMi-LA2v2_p=xp_f5nwTB5V~H6-yEZW;Xg4Lgf_8JFEoj?`)}TEh(Hykf z5_Lh_NmK{ziHVA!Jt={&fOjVfg7#!NSrC_gaP=z`q*HQm{IOcVMmvnK2`~k)9bh-W z2>>$2WQ1=4{0e|2EbHF@no7_u^iIGmz+wQk6FM((4&V_0o#p%h@HGGzJ}jz%d4TT$ zP61p9xE^pH;CaBufU&Sg69MFeUIZXJ_8{Ojz&n6X0Tyg#5ugq*7BCSo8PE%$ujgz7 zph?T#fI9%s0_bq^DugEi&H?O-w3`d|g-BPTj051|>;S?oxO9k_o-?1G=Y)Pj&ok(m zcAraXBZd5cNE#imTuUF2roWgRQc%jH0~U18>n(A-AY z{~5F^X_6#}`8&nXvyhE1c91IRXlog?>^$OTAu&pvTipoOu1|vn&N+hQa#Re{9V!?!v&LSh1XczRi%t<1is=I^UGYMdVt`nm;B2wy<>etQ~H<8SFuV@Cs726Udp|=q~j>Y$~q1e z(o1X~5uz*|yFwr|zK+FIFgm_j#`g|NI(k^rvW_HIO<6}r3!UO9>u6=()Mn2ERwKEw zy6`NlMPUoA93`3pL(ohk(u{noz_B5NPpMqzOeVj?tL0gd)}}l7qo3YlZw>$c<-WyP4}Lq#y#n%&-f24TfOy+TZ_(!P@5A0{<&rXPh>P_u-Z;51(8xG0e3U~t)E2rmnpFAV3h@hZ!ROLgF36`3Y|}dFga(U#*F4N0 z%n7Z5eb0~0=`JAuj*}&WsqhU2hhx>3&|081&jb}(2Xvf^)&rgCq76V7x@aTNU0k#Y z=zcER40NT7+Qq;>|G8#thk&Pz_a(qjHSkj4KQZt!;8z)VIq*9SyaM<`23`sLDFY7! zf5pJ7fd9k5Bfvj3@M_={&uYzJPcN8iGVmzyE(4DNpK0Kv*(C-}s@==LX8~Vj;H2x5 z44jmGj)9Z5FEMaZ_bmoa`u??n+rXbT@Hp@{416r`j}5#9_yz-S1s;CRE&o*DV-0)@ z;9Ukj4)_cM9}j$61D^(bsew-izS6*F06*5iCjdXoz}tXdV&D$&@bBIBG!ghs#`~GT z?=$dr;7=KN2XM1~JAuDsyzc`3mVqaLe`4U1fIt7Z%fB0V;q$J(CIhcC@F~Ds4Lk{a znt}HKpJ(8+fiE%eIl%Wa@VUSbHSk{G-!~`X_!|bk5co$1z76p82EHxuvOl`|*$#M}fiD7X_Q%D*&H7pbyu(PpJ@9D; zz60=H1K$z&P6oac@cj&YXW&N}_%3}PRa;i-B#LtWjz>0~wS8XGx%^dKXExG44I_g$2_@)s`3rgO2&m`!KR3$7~3bha8ena&;qC)2se zz{`Q}XW(QyR~dLE@U(%G>D>MkU2vOB=Q+lEGM$$hIGN608#tNHrwp7-=PL$Irt?z+ zC(V}q$t@qLw$;E%w@Cvho@CMrGS%8s9hGlWF|Mz{%7_UUbV#rf!0PlWCh{;AF~{7&w_SQ{QCD28{P) z%9a^;0{9UIPNwWcqkg-ApK81(Q+A$#lPSBzz{!-|VBj=V++pBk`hR2KWcpt=a5DYx z7&w{so%3CNkSX6_yq^WU?$7RfGMy6)oJ?oZz{zwjG;lJVX8R}8xtsBxOy>axPNwr% z11HmYhJlmmyw1SMblzp)WICTPa59~{HRda)%O=xlwjVN`FB|E}bbf5$WIERyIGIkf zKa%M*+ebFjS@x2vKQf)Rfs^U%F>o@SyBIi`&I1g5m%iI8U^<5=%DEnoY&z?Frt_cm znj>}aGhG7Izprpn>fU#`DE00qT$DQZYc5KC`x6(Xu07^2nh~4MXI#d@bQ~>PNs9nz{zx;W#D8wFEMa3owpe{na-yToJ{9y22Q5)V*@AC znfJ0=UeavLz)7_e44ia3!@xl((jOglj%Imz{zx8XW(Qy?=o;Q zoevo}na*booJ{8%22Q4Py@8YItoW;2UNW5x2F|9_z{zy>8aSEGoeZ2zr>So;oqjKH zA0s`P&XopErn7I3D-W5@A>%!n&QlGXOy|W0PNwq~11Hn@fPs_geA>XtbpFl2$#i~V z;AA>aG~^-ES^SDCADPYu11Hlt$-v2U&M|N@ojVvfna+I-oJ{8m11HmYyn&PHJkP+% zbY5rRWIFFKa5A00F>o@SFBv$Q&QA=SOy`(a-SUy?j2SqY&MpHd)7fL-WIE0MNT$AZed zT|(;M_qYV8e?R7;)V*JGQR>|vyC`+;yw@}->f1FgN?qGOVL!)Z%%-!$O>UFvoMGT( zI+qwYna*VfPNs9Ufs^Sx!NAFMo@wA@IxjJBGMzUVIGN7744h2oQwGka)4<7eeqi8a zIyV@2Hq%-2y4IFWx}9j?q}(0@&t^KeHQtkc_b_lWohuETOy`h+lj%Iuz{zx8WZ+~v zZ!mB&o%b0yna)QHoJ{9S22Q5)0|O`1`GtX#>8yCeEkBt~+rY_mn)=RWI=hVYWIAUW zIGN5R22Q4Pz`)6L9%|rZI*&JSGM(obcsA2{h4G$D=WPZ~rt=X4C)4?gfs^U{z`)6L z7QE@|gG^_Gfs^T+VBlmr=NLGd&V>d}rgJ9)C)0VLfs^U{u7Q*3Jl(*_bY5oQWIBIo z;AA=pDawRzS$eO~8kmjId06I_(K_XRFWz55y$ zrOthyi<0Sl%tfhdzvQCqb^h&KS9Kx0f6I7Jrt@$#l*za5A0S8aSEGo$hq$k?CA!yeHFntbvp1Jk!9*bY5cMWIAs# za59~Kuk!)pJ(9h@;Oy@KMC)2sWz{zwjHE=SW zhZ^`I;AVd$(`mL3GM$Dk%Ib9GwL%G~Scxyvo3L0e%bNY%*irxaxyn$H^}V z@}^N64ylAXtI!0IM7(Lk-dm`ou$|M_Cc8vzshK_|;!=+w6PCyDw+)M^q0%CesZM1o z8$qVBVv(sn*)6C>^37be*;&zzgLav|U?k}a!Uf`YNDqSJy$ANp0$lzy=>q5c$Cb`} z6i3g$j;sj<@lnt@*dw=VS09Z+jZ58EmVbD(?YsPZF`i@cc?i$7@_7ZG>*VuJc&?Yv zy?Abr&tvi2D4#c!<{#c9pI^drvwVI8&vvmyt|KHQk#h(sk;rO7N+q%bA!QQjAf#L( zHH1`1 z%4<6Yiko>LPNx?ysKt&hMr`W{z@q>#9?7Tey9V$VHZIRWQrX&*L_y0ty;@N^?R)}(RpBHww7c-0Tb zOVYN>1Vw{KyscFcx4#x7&n1$L!;vfzr0fzYHXV@=V#oWjDJM~#uCZdSWd%% z2C11Z1eb@=Ufm|5889m^ml~-ZCGq*N&63uC1+AlrmTnsxqoveYs_RgoJyfS z7W6El=WQMt1nnA8_$Jvdnk8X6^dtz^36`qtXS;0vCD>d9!|!b#nOw%o%2Wn~PWK4% zQp;6vs!bcZ`A|@!)8v8pZ)toH1CBjWRyQ3sV$otD z{OUv%Rd_5Np`c!z`LRC`B(7i*k8Ki(e+m*LSAZ|!etRk27bNK5aUlNqCQ0$0Ac33a zAo2T6BJmGF;sPe|#3qq=mq~Q&mS;G&+eAw`TGu?umzVR}j)f=ESs5slN^0wahcI6J zYD}E2BTRY0a0>A&D0x&{(KMYh7iY~oCkH!=5iBuNF3H8m!J*SH7Fw5 zb_9Lgwa&BP0*T+p;S=lj!YL6!&)%+Ek&CwDM@+VcxbV-3&YGL~CiTz+d>;iDuPG{7 zj21+!#V_6XQjnC3aR4^|PMQUv+JD&jvBLH@9c_=F$jRm8^>LB6qy_!mWxf2<-tq6qSl zRm6uBL4LA|_<$nFS5^`KqzLktRmA%gK|ZsJc#k5;Z&nfipa}AvRm8i=>OhM8XAu#| z6OB{MRlddnT{tOW@#A=jBJm4G$+7_7@J~0REp(Iw_}ih3pu(x4AfWSp2Kf zN7H-)G@8bp62kCXXcRaiC=mhfol@jv5l~|T)-3|uK_QF}j7HP{6f|*Dj3RNrgo1BG zfUAv!wTob)2--xj1qJZ@Fv{?8(pdTvk*P+!ZxI20tcysn-HfK`;tDYKOQY!u!fMj> zB7o&0tWG4sJzV_W68ZSzXReSdED{up0JkhCIiIJErfUg{iZLUa#w{AcaO+Kp$md~W z>3s2mrwUPFzEK1_unp$Rw*o40H~dJz%YY@g zOM5$DJdE9ifR_NJSTMlI_&z>R>Cm}MOZcnq*7CXrqEzQ%QcHXIpV1~?b+H$WApJ_`WH z0B!(uLRkj@E(N>@sKj-gZ2>0&?gRXXo|`d`1bhV89rKzi0WSlp<0vQK6u{pAbH`fN z6M%hMEbI4x<*k^v0@}8)tkr<~0lSW~tUm+hjmK3>z!!ksCV)Pm4)=}s0(=TMe%eod&FvGHr1-uSe=s=HvR{(7@Ase7` zmSuexP}>8&11<-2&&Ew8z`k=V>odRwbHTe8ae&2rmh~QBr+JojGoWHi%Q_736d*Yt z^#WM3719Du15^QCMBLX1XD+~9bHJm3g&tZ zF<{an=o?V7807)H1K4c|_yBg_-m24vzK>(0W3HI zpLPH&Nr4_BfS#j48}KyX8^EORqQ3#o0z3ftH=yMhv`N6v z0e=D19*ggu0DcH~0MPY4^cleK0RN@uA@Bt_$ALB=n1&q#yb0KG4f+va-0{c{_!6++ zTI2;xIsyF&kbk0OtpxlDFz+PTF+j`rE$ei^zW}?Qj6M(8`V{CCP<<-;Ip9pdH-JM= zgFOLkdpc|)VCfHF69E&?K$`&k88GRGXitF00L^Ej4FR44)c*)}4{!zGWx!EqL0@O1 zT>6fLz5s0(a2;R+VAYRNRzS^9AQRwGK=?w-S^>Bl zu>D2o|9~$5{p(QIfWH7{UJM%#_#CkNPr(}yxddx?fTsanm!i!9IxmCFfX>TN-+<{? zpgjOOuY?SMmaEWD0JT?J)_H)L*T9YfmR<|l0gJDL+<>;9LGOV4>(TxJuLE}YIb;WP z-C$Wi1(e(fy9f9Op#LW54KV!|XpeyEU*bk0;NO7#Znmsv0KKj4Mf zhIRp#EXd2K*H83Sj6F z*c!mZM^P_;^?+5sfvp1U@mts_z>3FUUjQfn4sG~xv|B*s@1YaGC4kl^(B=URPr_aU zt^vFU`0i7%pMWm_bN+xU|A6$<=&yi+XJAtS70*IOz&`=0=g`&wYo13x04(~WW&IXV z{sP(r;8MWUKcT#UmjJK7h&9?jLyv$b0F!~A255Z=b5-~pKXnq}PyNW6}=4Y(K3_y+nK;D9&553uBKkR7ni-_a%kyT64t4T!ys zIs}{n_zhsfJFuUCcLCeIi<`25rhnk}Dxly!tUCi%04@f+3vhOM9|NwtQ2@t{=7i2{ zj(!2t8Zpz03Aawp@6}o|)_ZwrQqKPE+Vscd{Mn7^e^aQ|VA{lTQB3%REtX~ViECK= zr8?mf#@K0h9)(PS)JM7aR>;+nkcV&lOOO;EY)tsV(KP$QcBvGolm&8@GxdV<9Hkm5 z^;mZ5MNGZPPhC2@SU(!WF0ouk@+->@$z>HdAyPfA!jvB#FDgVyd8uA1>^xK~=3AO+ zt*EG4p=-rEEP1Ovfl8^DDp65(g_s!F%RE|)rFpJl*D*(@jaluWS=A|5Kf>jb3$f5S zw+Vmw+KTBnde zuAurQk!$>r105h&rY-hPk{r zDlW33eD*8g+DqqR82>=(AEV-eEval~G7x_^Pd0vMDzo`Uv+?((m{_<-eWu&2k@<5B zR9O0{Q08_7nf30Hb1!F34wpG5)+$T^^me9mG}G8NlZLc=QhG(BxxR$rVL)YhlCzvXe3rXQRF;c4%Voo7`Kz*~&T`Ij zi<`w~dJK~hhjVGAdBqBwnPSPx-jP@3JbQYnPOY>CVXVe5lY2B1={l&Ps7?+=K3~B# z%6fQkcYLK$#%hu|^j-KSsrh+7BQ+ZMjE2wnVz?D;zg$+Q^jUb1K@`Mc`tJ`zUv8^N zTWDxdx+1YOugCeivhy;WyFhA8rRp0}YN;#?$ii8Wj*egWYAJk`6kd(vAtCu1CSInA z*U8nmDPowHK7vw|-#KXZI03d&P_1b1(kX~z=}wH%P9<}jsk!-u^$A%o+y)FrJWAI~ z+2r7z`qf0$32Q~yj{g@6s-j%i!ZQw}cF~-CUa3^ta5Z9AX0MWMnEHXkP)EaIxz*t3 zb(!E1i)N)fEU7j4Bs@6$9e#cwb=2s1luI7XrDIZmsLMV%Q9m2dOnY{LuylO=mY2l4 zGw3`Tn!GBwaVlOG@sg$~wa8>yIZx=LPOt0~O+v?>oWp~LDr%O(rs>LXfI%R^i$4(m&RBc2J<8>l= z>I|2GYHb^9BN$b<=$HfkN!9}tifJy-3^6va=OLT6EMI)bt)&@IMWhv$Ki5M{Ge(T>I93=`+#{CHBlkwEEy9*)ysZ0)s=y^8J#MY;c-I-*0@?C0rSfhb3fCt z)PZ}(L(hZxn-I&-R5c4?aX?EW}SWP z1>cR0jy1j^B`PhiYlt4fVpsXkW7`tYg37~*5;5^Ck0%Iv~JuXdbqtv@Pk%}6bCyk48XtjOX zxNQ|(QCBv&bHA_W(!8&EZ<7AAuTyF@9^$G%p8|BQz*2M|RS?lV#8-K)`^}Q43?ggi zs=l!&6R}+)%4o}#(%JmJL%;ua(-XBosx++}EVrBg6>IB()Iv>PwlFKl&v06#fS6b!re~j$}96Q=H+IEA_V%AHG z`8(|rpF{L9y<{^d&A;jzztmjGByA~7Qj_c&YWg7iL9=%vrsij|OUph7GHQ@cUFo(? zz2t(XJA>@SSJ+FzvskCA6tW?&9t!st13Y{7?jP}cDDwPzr5GJ$QTWqlVihsbdM)>DN^Tt2#dpKT3oB83e+JAB)q8?OaWk~$CB;C z&?f}&nMSui@-ZE?mXYDgu@9H3)YD&kk(lz_@+?#t^(Z5?A*%o-n?V3I%B1>~AWk<4 zkgBQH2FK^Fssg5#t1P4op00h0ZMHyalFq7Do_!M$$<+BRC70uH4!<@GGZMV9W=f17)y7w8SgyRNg*o3ckY2u`ZsK&Z0MBL$ zpjT3PP8v(|S+%&ku=xo#Ua_HD#;bB>Y*1z76NK^j_Nt8gQ${&$lr{xs`E}`O%E?{oAx#)ByOn`0ljcRW zJ=yJ)K~r~tI13QG&gO#efGi7^;MkZ)66VB$3e0;dg==y)>%{a|QPhcv=$gNgyO1!H#YvI(3`BrLIt)Dw_ zvLTR~=h9ND_xCzp2#UX%uc|rC8TZPWQTIBLQ7?QsTXDvta%R-MPGtOJx8hjB8PCa? zQTIBL@n`#~jL-d^%6Prbn7vwtThp!2zNC8;6aV!v#D|%*MuZEd#xA*QT2G|aYDlGA zJgJncAunl;{yi@=apk7)ni=l53HQXa{m%}CUiMHk+JI-roZT0>ymjW|t}x2$>X0&Z zNSW5VGIe^FfVAgQp7zQVlM56)dGg3~`6;Tol1J#Bs7jf>fQyQmd`$H>kx;lwQVDX? zM`~8B_GYZ^L1+FYw~a*}FNqzLG4nv~COsL@ETl!~c{e+f=4%gpm1QR?%y zX=CltoQVWlRK?3xfqa(gF+(cmD}~dGtnvT_?&cP9d+>`@t2^F(RTUNc1D$%|V3Qu7Zz9m;m5!XE3jeR|y4fMYFAj2NXp7#)X}tP@=4 zzDJ36xK>#YU-gbm`qu2U_hH)8Mn`*#?6mWk_HLTC-+}OTL$&BA?Udc*orI^lbpsQ& z#<>cE0Zu|``tH^)-x(QZYgf*YlsBVREYv2Y*q?EFna2g1hjwB7Yp`Ml{nuvI3EXM3 zv;JYoi96`LDq(ker?2;D(lD=R;bKszkRzjST>|SUVuVy(S~{3@Vtd$Km{6y=QYUJq zxqg|N$1h{KLPD;XxXy#}@#?>9W2qOjidUIKJhi^yn?K31!4>av*^^T@ZbZCCAA;H% zJkt4u`$P)|?Fv`Ir!cjU)+ZCv1KIiIS>p)eT5baRNAG#&@)Y<()#4(CZ$gwr^{$BeDru76He}uB(Pz<;1(k zp5`#8q~?S+D4Yi0#6;>ewY^&c{c!^4zYmbOJGeyDnx@YNxU-u;>S#sCxtDUw%2Ew; zK+{6M(etv1)O}nJ8k@G%Ejv`)_3h+iwkfleIunZFYIi>l<)tV zRPY-uir!k5Be$HtHF_tXzx$U32&XC{++BPS_2qiYn46UrMg+&-7ohrc4JzQ{>R zOU0{48zprWld7v%mPd_$)tm2VlUlfUh?T4@)%xXkG1Ljz)HE$f#ze1LbjxNr1eS_X zj4Dy>a;yDcOYd4K?6UVT`J09zKb-81*=2wA z9#YH`!w?@{_O|S@AJ6397&ZBc*~!P5{O7}vA5Jy!Ua}sHeE4qCO{_t6@J(%#?LOg! zrFWJw`Q)g{clgN5ebamcb14$S(X-caUyA8HW6@!k1(h zeic)X;T!!~FLPy|OJ^~ald=n6$>b*wLw;D{OS21q>+Pf(`hkJb3E!Pv_+5y+S}fV` z+i~&F?I#NsYN6P(SQ1DbtUasOZlfX%jgHwASstGonR-~WIfmJs{O#CesrIDgq~<{G zY60yvI$>sWo@V2BIptndlW;lJp>D(F{8~%=+gnL7H{~QHmj|1K%c)2iE~iUsh)F%0 zla!WSj_OxTJhXzST5Ro^p{#R_I8ESnQP-;`Bhqs~O}6%8fO-9j8_y@Mf)= zrql=@QqFI#yM^1TTv6l`Dyh%4SZcPTru}Vl%GxGoW2hD}@p30qa$cbd?@n<@1nH#8 zc||9&P8Bz)Ug-CBGim69db}~5y182VpUxXMgH)4RSKz{=#%aRJ(Uv_ntG(J9;*LF8Bqh`Fbsj(v9yhGvv`Tf4^>|e1>jRf0U=Rky)KFk|L@J zs@q{iFF|E}Bd&YWSsv%VH<56Uj6k^8b5)$$fHV6ns{AVw{d24$hfv}e7MP-dD7>R`ebjF0?S7B$c=8Jmv2B& ztRmNl2AXC@8XVREc2$QSsIr|1joTd|6b8j9)5L|2J){94FWKus>y%2ROX5Q}k zowyKD^n(pr7Li@_19kdT4Vh}$aEj+@m1^-B3q)p%cTX^=Ltv@bm2l1lH?X#ZD22_+ zIzyDTYE@mH_EXJX+MkB3g0xBXwTbOX@AZPXJ|zI1h?W1j>U5D)N`lDRNY$BwU{zk| zq*>@*TT`VI?`W!Y;_JaaQO+Kt7Od>q+WccY<=X?PpDM8+C@%~i_H#&=nyAInL$SEI zt}KpsD=gDO+0(N6kO8}$_otmgX45-rHq*1Raej6^m15DT$Dez0h*+4ZCt5ey#6w1!zY|UBUA9>bm%T?AA&icT}vwl&d zvOaSy>Eq>*XLZl|UBFqN9eLJ&cPOrdoVD0iHgi}t>3w#`=B#x(>!y8kqi&<$+>l>> zxcwT^O^;^fzeapMy_d!@_j$erIzL8+9o2chxHQOWJ4(BzBiL>=7NWx};vSj>HhYDq z*QvIFgsbar?bV9!52m(Jy~BCxYAWVYE)B13QUi`>JJ%vtKQ&dm+@~{*lQj*sGqC?= z*%{z6sJqYZMqxEGy($aSk!;6%-2uISCVegCX7YI`K2Ck@Rivi-G&eQnb1%ASr_4Y5 zQ^%Q-$=kfgNOEo^%_L^N4ak=?YcwQ1w;C%OlA31l)K*;N%b50vwxvc~uaB=p(XJNQ z^NE&UTuJ5rR5RaHi@7Mf#oU3(N8;KPD7Q^c_@p(@obbuBoT=k%HMz}aQj;~QZ+CBI zYbl@7nzGP8hDLeb<6M0OX=3Rn(w{vn{jHe(2?l+++Q2TR+R+>*{Y1G3j9WEXk1@HY znBWA8PyS@wtCXLyR*NRG!hd}^w>{>qe0={T_w~(8 z;#U;<&h*`@>J*KToydtKQ|b=QRdqh;y`w|q?0oWLtVp7lC@REUM)h(3RMNTcGUE2a z{}8t&%2!(z~vq#gR8WFYm8OF`WX zQ%8^G)Ytgt%%hy8qD6HL?GyNB%kG&W=N!&b=Vno(m&_s;C)GiK`nX!|beChCB}`-T zNNH@JjYcuk*hACs4bp0nW8C;oZe-InRxj^ z6bTl|JYI-{TD(>)TTbd7EikJ6LA8$5A_sThsYi6r5zJdaNUa2?{-X8lnOD$qpEH}p z^R1G~Un0Vd4K|~x^;$f=N-7;j^jft#Yvo!cRZF|>giQL{Znrd7No8x7zQ`p%p$5^= zs?3DUs$3=C;+bK{F&221;c>t_b5}^LFt_S5_*R%z$MgFvXmqsv?N}^ahaud?MgVmj z&btg~FOfY?)v}xu#oY^n7r`sWHqGeRY@gjDmK`sU`ms9O?6fnxoisZ=9LPG)rWG+o zy;;+E`vMaAP));UB7Npatw^ZT+B-;D)!bOxcjKdgr!f7aG<`+Ee}LNgw*ohw(;L@>y`&H*OxR`zqytt z8k@yg2F`_3Z`6>p(>curY) z|9YfU4`8aTIjJ^_t30?f&n}H3t5x7^!32795<6F6pJB%C&T^I){6XmO(EF`W-~QTjLzgSsr(@ zC<7wTy@LeTwp!+J7wS^mE50Z_yR=&{t=BSXDfZ>LXvr(5sk!-Tt>n*VQ&B#3X{m)s z)nK_lTkzCUL;YXyQ7c+AzX-jj}=lPuT@M008LxgU~FUdzm>bW)y6Cl_+g&o`Dchfen9oD~x?>Rwqfr6aiuli>7r zW_oqxt5%jyZw#p3^q(`RbpQNqK%QP4*;bJnMAZ2mC62u0AO{oIivu_QQhVzAwaT~- zG2=m-<@KaE_zQ zIPM|`cJ|3qceq4U3zLO0nv&YOcIs49>LyyLXLaVNXgPWUq-eN)!{a z$+zuQV+qq;sdH(@%8t;i6VC5mskdCTQ|F z8Mb(?Jj2o@>s-xBWgEQawe{l<43QYR`s2aHA`Pa@uVDrsz<7Dc+CsMj%= zc~JfGN(34f&M=7$H`Pkjsn2#fzt=z3i6+H9sPfGHvv_A7GhM2gsvhF=Sw(B+E{eys zx%kW90P!5J6FzW4=rWre++DO&%v*proI|!mIXePp_$^|M+(|GykTTGPtR84z7dRs!w)D-D1lczcaXm`ub zqb@os7eUz%-sjFXTT<&H-rZtZX0>yO(pge8X+V$pK9&CkElaLidFshS+*(nqgLYh+ zdwH4Fwd!gMPn}eoEQ)2A(5$ub-bs)~ilElKeCu?nH?*wkl(RH2n9%ToqMh`74@6ZT z%C0u!C2zx)n7vbGPu-}Ej?~p+l1^3MCt3{TeNfGCr|9Yvg&}&bt=)&%I8JLR9I6)Sx~v6 z`A-$Z-Mh%TGpfZV!nI&?c%jaSwHB+@RESDhEaK5#YIpC6Tes_XV2fdmE zA)%Ock# zhgpLh?q>_c*97_;9Hp4T4QGv839b(%Y^yVyMYw*micstSpg|yY>qbPl=Xlb>vzt|f zIw^vog?Be1!gLnllg%nZy%Ztds4JqSLH1zdmuJwAX$8)?Z4GImtX(BQ4yp zSw+AQ>if({Al2NMyFIqD3{P!d8A6#=amYqwxNL~@@ag82p(Ile=Wj%Y29}|sV{`UP zxYrp*`r(bp@RRS69wu*I8Oo##^oz1`p!nBDWQec~OE#|z<(chad{gc=dDgL{hZUPw zhKkJgu;)f(C}A1S+q^PVX10f`HzLES$B-Uw*}O7@GxhM{Mr6oi8J^m_GE_+!y4!V| zY*(AgS;oxcze{@fM9VOuxw6_TR=dsery9if{{y&hCcJ(%U)DP-PMEnBcPdMu50|h5 zKFqh%?VZJZJjy>aKzC*Z8?~@1uKPJR9Ze;gFghNpC^>j+%RCm0jz{gr%kkDxRE`5i z$D?lJJWgO9Cy$Ot{lO0g5VajA6(UkOvs#MElXMVw`t&N3P+uS`mAE8oG~cF^4X2UBC>oI~nMC11e! z-M$YGr_vpuGiMid*e`@sXa7RT*-ZUROH#xLij+VyVChpVXkw~dbD9>Z~TPGvR^jE+tJux#SY=IPO~85ow$J%^Ff zULGBr!C~3#%xvBt9h;?sjq+lYc~XZK^?@Ge?}t*M#!OQEe3ROqoC=JC<7 z`A!ZtuF@V}K}vgTbZlfxXp|ndza{A9Zf95K_QmM9?VqDi`Z|L1!9i50itbUFJ^9nR z$}}i9SACgeYvJRb$gEm73oA7X^0SgZ<{M*H9iwBlw^W|Ggr&xe{($t_1F1pnNL+Iu z=`pD}ZqjPFGIr{8k=hh+SLD^blj+Q^N3+|c(dvL4t)p{{nwC7hoJzH1bZnLn%jO_v zvvhQ94wP(iG>LrXae(HrSt>|vnOu%zXktlHo&ZRt!kMdr&e{V=oyTh#HmTO+PcbVW zL#>&pqtv(zA?K7;%9f}T{>G4n_+%|>UyDiyERK-5B(dsI~_{>RMb9)k_j zSJy7p85HkK-Z;;t*18YRUeoHkPLr6;i<*sIV2}$!@@fMd|G*Sn@H}=&&RoBiYhOKEMVW zgE^v+IZOfuV}oGKEj$c2Bq5MM5>N;@PIhyjB%5TDENs{uo4_xGB%381n~-b>Asa$i zauMM7eXpvzt9xcF*|PWZ`{Sq2N7JugRlWD>)vH%`H7V(TN|MDvLvfZy9!M%e_ahEn zKG(~1^Gr9~r(B6wTzSkX7Aq<4(+=6h@07Spne2j+WYxhPL(GmTX?OfqnP@g=(|YDi z%KEV-X~|Ct;e04>5mmJ8b4dOyA3^5qzME;CSCW>zTpk;`T%~jAm+jJ-XR20IoK9h~ zgG~0il4K#9D4hi*>Hg(Y*!JDRdriJ=XZ^V|DC-ZDq$}?@#aY-=;-27$`*)k{JDBX3 zOOnN`xe&L`T|9T5WvgM^|EQuKW@1m3CZ1 zHt3e@{57gr4kpP3_jdNPNx0R@!Q}XfslpKYOz> z`P7HUNq;w$lv4Wo8A>TH|Ku+adjwtM7Ia2B^k+Y23;MSV3HqT@g32$zK~BvC?H1Up zO?gTiOC;`s9&!u$^M9C0LGNJ6{=JlBavFYy8kBd1#J@_|h2^mrW!g?zeEc}=YE6Cd)tcu{Be_nssjD5b7)$+;_5=$d{I0JMiF5Qm z`>MD5nZ~&#X(*Shf5}MDu&;~rXZe5&H}zYY+`eha{b7@17J}RbN+f^wPaUfD^f9@c zrX^P>oqd0_UtB51(tRF{8+N@NIyrUX*1mdMr@Eb~e&42AypX3^1k1{PvsyM(GtExU zvcFXtO1*Fj<>M8bqrHMC3tkmkp_bRw+x;`X9h=oM#pD`Ss9IO5m)q{{M>*89Ifv}0 z?8>~3$&QvJi>nkwKWbq~x?geVHmI+Grd~Xma(`|~x~liQs3h4c`wKqVTYsx;?QSM} zQ%SN=vJlsFcl#dxv1%!@>lNM9u}tj2(!?TmAJWw=*ZPoq6fu96_qcOWy|j(;{**&k z9YB|JopM*aGyv^WMcHKunNiIjr1mqpKilM#zbzcm?sxp{!>XC^9*|mGq?r)?yR~kA z>*TVizm2d|%`0ttES^c}-m;I|igG+%>f0xgqPlDvGpdwD#&y(9I?5$*K&-X(ok{WKCmVhaDQxp)$F@X=;1P)h^mlw}qjLCm% z*5t1!PX6Jol>O&tP5#Q_NXO#QssQjZp={`?k_{jS+kZzxXvHm3fy*-~#TPCd!g|7*6?OMIvOvCYtoG{kIq zN|`2l=(VzkF8wBYu{=8(+aR2??ORmWqu>xBXpBhTuLkaFUa;tSLgz9*f3{X_W=eJH z0yfV?z+?U|1U$tS@EymKZLP2+JKS15S-jeH68Yj^gH^?Lyv;kdQRdyd)*)BJP>6GQ zCPjY9R}Q;mvzpznGUfNj>5`E}l{}{u5;IFU^z1pXk-FnJ%KO)>#`>-!$lANNr;v50&ibQAkhNOPFP-bpZ`5-A&=F*n!&bo3yIpgU(%JddKUv5Y7vUYX?eCrs_b+LP& zB0YwTWMTA>>SbU@_^{x$t z0!5{djf&Z)?A}8ZNZ!Q>E)Di1nfQv2J`hS#SvUguL`$1`eLa^WPq&r+EWvwik-$aW z$Q|3{X*fM6u{~{vU0y;qdt-I#Y7!y)aht_-=F2vxCdJgk;ItbCaD7W9RFJA-ZvT3; zxe0HXx_=$z?Wv>9O*qKZGUoQ`(dH(6V(Ob~DR0K$Ox@05mYZ;csZ*F+*U{!CJYVY9 zqm;LGN1I!#u*oZ#+xDZ)4JT;13WS;6Wk;P|M6jD0Azi-rsI#jS?2^px^GBUsm0rrP{C)l+yyYr4ZJ5#WGa1G_|hNI4Io?y40**$R7+0_enKUqz=`|43=Cl02h zb~3vk9d&kMD4Y88Am#4Wqs~tD!ER-Cm1~Z+SCO5tMrPM_)Y-{i*e3=^nH!EeJJ}6e z&Fs!P>g;4c?9mkE?uw(%PIko3V0O13b#}5R_WM$UAyK|e_jTr z_MH(tQIp+UAcAM25_jWXUTUv~nv>MG^zmK|CBm(^1XnB*$qztXN+M)$FJM}@H?L&A z)e=#`4Z4cy=DR&i-|PWX8JhjL&D*=vOPzxxDsSCH|F@ zSicUI@6Nk|X?)+NF{3HaB1XPX8o4Fs+0`9D&NeT(b1=vZ|9jR9a~_83s%txksr$M~ zJ+IlEY~8xI6ggj;&^8dsqDhT0je)fC0i|esLVdA9qmgRn#Ld$tzO+bUCBRR+C=;g^ z(C}Oq`kX@|-xQSgE!Ip^cQc6#XG7v7A|aPx)mAF+w>EEb7^st8a#}vNSxnbAiW^q4vBgXJyaOLksfbU#n;a{d=8`7}$2``YzZC;d-R~W*@Mn!MXwJt+>;5t6Vow zn-P_OEpqjzVAY>j3_xMObT`?ia<$kKcche8aVJSUS*Pa<>C{OrCDxa9u}0*gN$kXF z#4_YMjUm=)BnzoWsWb?wHri)T(S%%EV|zQ&A$>2*CmsG|l5Fccwn(;d+si3p2kZ3? zIcE_}8rLeO@w`prF#Sh7Ptu1;K>O|{vBI4CNe4;!n$1CO5D@$E=TeGUUHU3Fji@g{ z+55y&XE5KTBdY2vzPt!JlP@=WZi7)L)ui{4eB;h??(cB61?{iR5T}R4nx(qvOcHdG zpy6aE{sm5Xo}Kb=3*kDa5Ioy5;v+GXPm;7Pc@8tr8*HBTE*rJNnh?8Gov(l+CEb7| zzh;nnJwe%he`x|yx%bcZ=pF)JX9AxsO~8_S|4I>rJbID+jzitMf_$p1 zv~rOahq1(#P<5L<`ar|-i^hBcfjyA&aQ2lE%B!lyzCip%=pgm& z#WQA9Hmd4wp=T3}IuF9=3}TdRwrR{LbA>&l`1MYuQe~v}&e(TssLZ{vhcLeOYOw^$0KW*WDgh&YG!J!OomPIeW+Ma#J z7Fn5-JR(0|be-fJfY%Si&J>x_KDGj0d1*4j1o)dN*|{O*lBAfL>GT)Mhb>6lJH<9e zZWXeBEf7#1;__~EED-UmVj`+i0q4h6*L2%KM7(nWnOFT<+aapbldZL8MA}Cxl$qYF zD5o|uo!-Nw^Ie;ckLhf2=qT6d?d#ZI=2T5#wxU9oMCxmC%G7x_k?B12^t;c*T)f|| zV#-n5yU$>TqUAWvmSP1Ot4bzT8`!juNGq$}W=n7u6WQVrQOAu{ zo9;~PWG_{zAOVjUg_BM-6AgF&+U<_BZ*%B-yVu?gnw7G9?R*nk`9RgD{`p-2*TjcE z`xRTTY{PG%TRLe*17OuEi`F=`w*_))o>VmIu zXChKsyGz1dgY2J_(5a`I$qH_9xGIBER-lzZN2RnKPZ_+QX?%7@G_JO3*dkGJrcP!W z-?3>Z{j|tw33X0=>fYOACP~Mt>)}02r@CeZ6ST3jMN21{$DNxzWC^>!_VtY>($4d? zREJw(Z!KA2ov&uAs9)$q#y|oX!>B_0ru;v5#`AZqj=!%I^y{Ywui@){HwRZPm<7_6eoF)NxEF zv_VzHL!(nwrJ8p?(`i3UI>*^`{<)s=mA2_9$81T*Y{^?C`uiVLj`^`iA62E~bdN~Zf&M-AR? zo_#;7KO3+Gb9eKWGmW2?rlE~sF1Bf8pH*ey>9PEG9kQyN-b)TuwX!%vr+1&tNjkmT zb-Fco#-C< zR7cS1<_g10eY2L>{%E#r)oIF^vOS*J{&}`+)k(^kvi)%l<+k})hPl&6ce?H91qZ*D>1{ zX3JJhm(7%IgxU6NoTVkp(?ouIs#MNNl=K(xsUj_(F>Ai!SkcV+HZk8DX3bZeFPb^u z1C^BDf1Nd7anPuMubdXvy2{cocQD`QZNA=~pWe@Q*1ps%^V4>-@?3=EFW;o>#9PoR zMPH5T(iF;aKhtQmY0SuLY67ZO>Ya8gWlzG%jR|XrgL`@_X3CzoDNod{viZ+!1E1PR zR`{`Ir*~X(1K%gZq_*ugOEnyj=Z@tX2>J@O&W)D$sL_Dx_{qu2nCw1?t1iT)eU`jg z@Kkv#vFbnU7CjDC{dR13Zu%`89-uGtCeL>6QH7U!r2=xxfpB)WE&kz_*zKiC4ByhV zd0wmYyl&P!-&LCDb2iUPo#*>!&GU}ZJez7|#YnwBR>9B^HAgvK9U@}o@tc$>WK=#>R@%FRE{FkF8AEW|0#Dom-i z4K>PLKLsft3s9D>D4nuFZucojiFE;_yu(g;xaxjSNp<%!hi}Z519k}%RreERlz|s! zOFn*A$qZb~9NwHYhr3I1n9CgMkDsN@<3{qLD*CLSRJ3BYhVla=QAojH`xvyLE7<+e)mJehf3Ve|BO12o-YS@#dNgTquZq z$NrZ?NbwC$@qIhR!N15+@EMK<^^ps?A2E5cU*19@-9z>lHtE=eoKsOdGUeKQgIwkF z9NUoHQ#o6cJ^R0>7D%j>7(^6N(h~7HA$&e_ncw$mC~C~-GyIXVre*8> ziz++QA^xO5;wqmn($x~m(uMuvB^t^;_Iyyj)FrL#lkI_vBgwhhm-rdXh8N!Ne!1@In<~BOpWp)?60weG|`<$p)^OM-_u4VOmnEOeP{jNG=sZ za3)hJLr6*$LU1NiB}2$~R0zSDOm)!e@mmpr?G=wmh;Wr64-!{dLAa_4PAzd&VZv31 zbzF52SyCA?mzDXxf&65UA1h*2T2)qcirSpqd;GpYcxv($)cAqChIkE#K>sDd=vbsK z03Tomd_fuc8aU0syH_FG2pb;D&+mpB&Re!e`GD0Zg z_pMtV2t~&#`DNq!<$;RmSXDSWhJ28jq<6ge=9{6$o=8PYPcRsZybtBn{j5jO~imZbx}= z5Xp+5KWahMxjR6sB0RCP%oprh3`&sQf6X5dh2edq0sWn5_$Pmd@Xjj4*gsO)7WwIi zhfs@Ensj0_)JVqoSH!Yns1lES2{{uP0Xt-(t-pV7dR)sNWB0UU zYdQYDnqIy{#CD?}T3M@W!_m&7Nz#lY%1UA-GS(qF`k*a^JLI8t_u3&s@kAqaqm2~w zgJb)=v_pGVqI^mDAua4k=W&t@NLZCHpaj$%G-36fA@osx&!GizP(Hx{w8AJ!vY5g3 z4E_&+3kbw2I=vX>gSb@GXPLp&e{hCvLxw6I9?29p-*!aBUwkC9doNX7AziF$EY=WP zfP_9D|5$Y`Z`9KW*=WIgKAq?%!9%$_VfRL8>YB$PfGj-PSd(ETdP3P=h?TGx6^fm$ z|CrwQV-Qdne7Nst+G}**k0^WaFYpkk-RT9W?J-lUsk^ki?TRM$L$(w?F#%mv94TG2 z>$;dPbunMlMOa85_UPi_w5|&~w5Tq^Q(j$!r(C)SPf1aBq%At;)8g6&E~8+bcRL4qG)kSdEAL1$1HEWPTcZCMGp zkKjJWi&{*X-cuJ5zM#7fjfI2PT?kc9ipS6H0XrVOvtcC{&5Z3N)u@5}umtJDaFLR4 z1V|q@0@2ksQINHdS_V9*A@gU0pTzf$xLa%OD?{sGnUyJ82+Z9@wq7|k`I$1f?aS@g zFW@z1^`FZm8~Qt9E%o(G#HeiZt!X(1HWDATV}A~@&)sb$J_g+=WV~hxS2J%k%bNHx zqAeCGPCO3Ss6@$E8kM5i+eM{cFWHqj7Rr#|kvhPIMa>*Hcq24LAhm(re7@D!JMY7I z@4ie1ej51h^X1ED=w-Wn`7FJlZ%9L`u4ATCAFHJ^HjS8)G&NEq*MWX6MOqz?O-xKs zHvp|;`uCj=dqf0+hUSjbSNn$P z`PieIhwu~{;>j4HA?h$pD^Sf55QsWyMvc@Eo>TWWrtvNW`Y%W!i;Vjz)7cREA9nM2 zxJAYS)k+QF$wgKx1ve4>DpKwJ82d=F+dHLVS$uo zSdD#O^E3~lNtI1yVwy$)gB)ugjbmiZriqJ@yef>A2@_4j;P2TtQr*#eAF)*sNA_L0 zt@KaQ&|JvKeb=byuSKU8O+Jpq?B{sQwU1t%KK~#s+qOz3RjN_Gl%#dt90(_?K&7@f;VAe1Be6Y-}l%Isc({!>(7Qp8K z4&hUfc;}Hw7EwtzKC?kQ8pT6R0(}BeGiI~V9PO`XTSh#pEoLJg?@XIbMsou~D7PH) z=n#kCfsjTHk+czk(uj~IgzVh8lhQErM)8I;%^dQN6hfm4q~QlbTAVbT)RuJCg=I7t zjYg9wqqF@=SFxr2=SVGWCS(DdJ!6O3KcJEtNka=&vZP*dN~Q^5zZ&9c9iv0!LRJ7S zFh0lbZg;q#7kR|E5Cdi5Z@%F2#EGF(VcLSxiZ5M2Hh_9AWh%K-aNn{~N>_Ard> z*YvYfa7mu2Ty_5`v!>5#;$k7|=Ugc2BVRxkgb!|HU)XhGk#=BEYX_hX_%W?D5D3vG z#AKTg)7k_87iMrTX4{Fp_7=gql%y#S}I2n~l zG5h8O_$U7t!Pc@l9f&|6CfDfEVJ-{%cKgMgFRQ34viD*%MtK^wEC%4)0V ztk@l=Gwa#usx+;cIE{dnj{b}wg)L?*OY z{~3GP6^jIz8xV7yVE{CI>)(91)V(rj*^Ba=fh24R1IOLV>uJ_M|4?@z99kX@ zSNbbBUo`74Rx{FzG4&xb9_+p}$Xe>JkTs=MEQ!eXhVHp6QBY*N>lnK@N_h&J4#JFu zbn1fN=4s2BGg$#0-iiOA0j)r-wD^w8>I{zN@#=Iyx?VQwVdB+aLFR`_}GNUgy%EMD9ZgfI2`Rv;lZ9PxTnvOV{Hq=Hvm zhir7xv~NUWLKCOJKG{Xa=Jow&Fnzat>G6+ihC@N?~{FgRYa6Hp^W851C_!;Lj=murl9N|M`*pN5_$ZX@%@;U(6V zKb0Pd{3&=OsY{wqi;y}I66FxKLAKMW$(v9SI%&a4#>^3+Jo-HWfBrQ5mgV1q-#~s0 zzvcN1eshG*5r<5EfGlLJkCo*ub*#B(f9kK7b~un5OlY#1Li1Gx`)Fy*;Hl%yFHRgh@m>Z!JX>#j|<M($mLvP zE^;|#Af;K2-(_$2W?`2r54+OGQ$ZC-KE{$;W(|p5tHiD`YK7P}(J`aeD>j9)*xpc< zmO=&KPHWUc>{_Fi#YRfA#;75U_1!X!?mSM%qWMp49aPp z%4wZph@1k5X1qD2P|m40lru=73eeLUb;wFYwjj; zx$cm42)T3cY)ZlouAV7o42!9WvSN0lXoJ0EHxSt-4@E-8>PK)vB3k}Exo-I9(K&@_ zM-h!jLTi47(wK(%@?_BnP9rZHbIlKz%m`?4v3Vjm-2@jcE<;aLwggrRXcdd#^fPo? zYWg%st!;W7BV{!=o1=z1y#|;hnsU35%pD6fhN*k^p>;8%Msy+v0FP_&SZw9V#YXcn z6l&shY8F7e#Nqn>$Gv(F?ND_-tFzkRrKTgYKy>cY&lrT`QZ)b0tEG=wi)3QQRW3n6YBC z&A3ok%!ms++0Fd#S#H_*oJ47wv}5nFW3z^V&qY@-!gZ8chR z7a?ByQ?Rd`0c)|+-y@gqR62Ja1QClPc+ZRX3_630 zc=q0;jaL#&v3z2FkyBBuCB`B#VP!5d76Zbxg1OjO!fD45+HNLNk0P0|z+9U8B9$d~ z;1bf&E!7;Iv1oZq(NJTNR#rt*E=Ec&F;A$mSSvSA7~6-j1Sz@nJfX%CQHD!VhD(j5 zM%(Z@_ox}ew2NRBX!u=2fB6!|{> z?dRX+{JVmGSMu*F{MP3mBLdvGG_ZFv8%6Wd#NLbjLr3Zhuo$?Aq}Jqg7|9Y%jvb;k zIb0GQvLupPNqCzaJF(v6xR9#JNftCYb~I0ub8zNx?ZqOLXmYsdOJ)SLibW{VT_hLNILRS033qxCq+oTPlPP$K3)=Cn%RH_IVOT;nxB#& z)e9t}M+zlC1Xqk;%?{s*a3 zMk*;KRY9brM+y^xV8UrG%xs|eBnkb~=2)zf+AzIiDu~~c8*@~rL4+QuF9EF!=*s;) z-asv7GG{E0(*~*Tr9uck#FN>eWMHj~=g5nI7d?`jJ%zW0dV&l4R#@f=PsmmZsoQR@ zOja2yV3RA1l?@qlC4PHeGFAxZb0alR+*!4)iakf?(jwUS4J2tzjyoLPMo(09I4&ze zV_*W4Kw{v3>O4S&Y|K^0s@TxbPzYtPDrOD+o{Di*Q+E_^#%crFC-iE%wL8@YVr|q$ znJHe~H3xW|%^dX5Wqqt&^GZ_zN7je6-CS*~j`lZ!7RoopZ5e3sTIXO2XD@ul>IM#G zR=jRXtgw7KnEEdcZgf(!Kz8uM9NdIpUMEcn9z+}qu7jx$ad0ySV}Ug#nA*Ir=irw9 zs7lSr1_Y78tIu6 z1Eyhpxd)w8px;|J?<)y zWKa9=PWnpgO)vh!rLv``*T|AmwTV@`r~RfEDfUyYV*OL%>EWWqiYkr2N7AEz#4>^- z4lT6{mHiBOs&ykjqzHxOJNQ+?yGxfcqnECoIlEd2E1-hWjn6J9TM!ZNlA%a?^dy&n zgc1S{2myOn|0C)WBpn)AQe4vbomAN(h2joHembm+OYcHiF3q+rJ$C;(KZ)wXbiDa+&-oTZ&W>80mbsnJ5-0pMw4j!9kolW$a$^kA8Z*3 zQ5+?UU`+ba1+?|$u~^!Df_O@5RNG${t5@W6hesc%(`6x)5abr%W&3rq=(~}!zk>f% zhaX7_D_N{=WE&CN4n+@cB*-Pcb6iKy1L<9;N{P#PRgs@`*)k#*%gCN~;UIpQ9{nL! zNZpzhx%n#Li;2A595#j1JZ44Vo<2xPH5Y^68bl0-cucKHqYBM{f%;%@KE2 zjS=pJjB5?DLKVrYF`{=iMnnu%DOnpxOnMq0{bQ|`J%trH{3(Kr;pUMa;3@iAqaL9~ z^0%&4M)YO;*CK@KG(G8` zMsxK1GM=eQ0G`qk{r;hsYYIZRhw&ugUFL?unNjPl;;9_-dy(uie)JOJqsqpKn#vT) zMG_B=7UEgnrH3u=o^~7zym%<`lB;I??xZV=d3jYcUQCaE8H@jpD!_w&?_S)b#@rNFf>5|cIXj89M7s$xk{UzZKQ^Ld3;w8k1ZB^X-Bin&irhET=)F#c~rEc!nWl{58{AEfx? zjoz%{R0a6TF>|f$Ib3f1t7&8H9^J2qwsP%wk&32l_D7s%^iAw?adN|L zrA(Ik6$KSF-S1I|%P?{Yv`TVKWqFewrlW-{$`7#oIW%=zDix-qi{v1;)JZj(*5%hj zMD>do&qHT-v5c+kjuu1j!RQ*5WyoAl9%)4Xw--GGJLl_;4ZrXU;MBNR8(h!t_ zMe6lPtuV&==~JtEDN=73{Wr{f*`{M`n3h25E+mjOWcB%E|JMt|JCV87*o;7d?*%+^ z0Z}frye=+>VN*Y#|j!CX75;s-{&4O0iJVr#5v5#fVVq%8gp6~rS~G0 zlMK?;2-16z>c|Ql{W3-pwqT4B74QMVyIjSdb{fZ?^p$^c3310aUoGBI6~o@oyChk9 z`W-T|QUz;wPy6INOsQP`*NGufMrO_)@?$PXLb6tk9HWo&Bd zUJKAz{ZF(}4!Dt@0C4AoEok%`I-XG?=l?+XLL-i?UGolC3hGFS6nlXOtBxTo_yh1x zZgnD9|EDH}-cQ2wI_>{Kz^P~P!`2bgC%4eD99NKsM~98$#zy}Ha&{0^8Nv#=o}!?_ zoD4qVO5)_>lf~m>7U}tDNGN zgKyZOPyHuHML8~xCGC+nbrFtt%Vr!u+OIP*ju(a3D!6P}{UOjKb|Y03tx#t)?Z26H z>@&9*n;ZIv^$v)6f^h=EFt(SFGhh=T&VUW?<`yg;Y;NukiP_>U9!a;1-bPce$}1RK zgrt}1NTEM+IisiRc=k#n{(9hzO>r{)p$|e^vc_m5p{)oCBG¨i*)S*nrYg!}#&2 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 z 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

OnSEehc{T#v~*m%@5dI9F5HU?_B43L8OT z%B3)g2I~;&5#}N^AUFtsN~Zi2)(VBSD5$N;=H#WB_CO%j6Abi1b~u&bq!an2Qv*02 z7uh@UUWlW^F)5zC3-$*y?UBrIA|mJ8`tDAnI_k#*H(~_*2=z0GbZsMECg-E!bX__X zPN!<}?SjLp(I}hTq&W6i+8;)%a~;r@s&Q%*=I^Cbk%4Q0T)`S@E_Rbrb$S2JOs$(G zE-OT1Zg%rHlO){~jbELcqB`K=^yT2TxxdXls^>(2qw=7h1HMxcM{z#19bFme2t_;R zv^NH2Gk9mbdD}4JTnOxR!boJ7sQ&ZI{gazTpJGN*L0pN+-A@xhc-2h9|!3KC%(nv(eNl3ZrJl3y6=`{SNq@u#`{yyP0-Bz z^5DcZKoq?()SnJcTr1IV-yE0_iHC1eM7H+*B!5ygcJE%2j(t?bZg&lB2E3#U@X@OAw-(G-lrfV zp_^2b5j06T+ybr|MGhn+ltwWzB7(7Tx`w^6BcZF`*tr?%Sesv?3D4j=S&AE7G0Ggp zs%|N2a3Uf-(c1SF8OrnfZuYcm7J?Ld7tRX=uvzH@LzC>8pco4bhTz1Pk(55mwL+6S zl5j$CJF+I3ADs9p{yW;IelJ4h7~ZR3lZ1slA3*aSAdDVm6pQO84{!qoNT9qrke;J{+9* zFesL6VvNhfb3)rvIwa%O_rsjNk-iIy}jEehVCuFp|BfC>d%t z4NiO>dENCWt)XpNS7!a-5(jC+gTT z3L-HivAt?a?>SW`GpdZHI@7gLXSU58iT}x@L0)d{wHXS>@pd-r)4ko*iT_eNAsUM9d+`2C&j`C3U$GWeUx`Edy%nBagrCkUh0Wr zRB?_+KYkpS$#1GSzd1UIX@L13VEh}5=N3Q`S`HokTdmD(e3p*$YV)>T_>N@5wkqs5 z6r=?2uA5VeL&#EFh=H^c;$$7Vz8+(C)O5#=J$OkIPo1+ z>V$K(@A5h}Jw>UwO_N#%8fsICsa24^6L%70=V4CiTuIsj5U4!8l*Az>pd(|ix1%PyaTyeqMB}7T=A)8Nv%^S>yklQE4Q5Or0N%>=4Mh2 zCev$Ym&tPV-QwCB1*=0%x_W4@Q}4_jbsBv3siVa;Pa&s%Q~*ZRBE@|h#1(LM(M?Vg zil20nvUD2yDt4Zg&ab&W#@kLVaeZRO=Ncm^$8iR)25-Q4wE+AG|D986^60!!&rtZN zq1)1poo5BJ&26_p@aY`B>4MSjmVpYmgcLo5tK9E$Z~4l0G}>fT?*=NFBGfW4sEX6 z3dK?VVQbpJY;ri;oL!8HhV8}`>So!|j&FH8oNAKCr%uz}OZaqL*$&hx71Vi`vQnA~ zl(rQ{#1NTMSkre6O)dojlaoDX@(?Sj9BW>0F=6Dr79t&ZbC9BD zbnqHRWnx)w4iE)~RJUR@5F|Ju3c8(uT0xc0Yb9-dwuJ6e(wr80&Jucy5_(IS(EUp4 zmR1#dONG!|{6cRrLT`r9o1NxoUrFabTk`TL=^Q*JM)-rkdmDDY*DzDZG zdA0iG)oSE5AM%>-%zqY?R1~w5OF=bFh)M39ix#=<=`wiDdtPA$YrQ_W&b+H;w+z*&$Rz)Ud7 zlBxADg&k&5l=#Wgb!tf^SfILCQ}XCZYLUH~YFsEoZC6)Iqn)o7bs0sNI;ke>HGs?2 z0%uw^l$jI;6t$DLlGx=!xw9y@f>e@=fnz<}y0!n}#;j#c%~E-E*qT<%iga{XUJuD8 zQ*8)~8?(wtIBoFLsZJR(i_|!aC5zFZlT}i5+MLCij3=!8%KuQRm$2)U>}+{<@qSmj zQvryyG=RhfU>Z3oQaxGamuezyVU`2w$^Q9zrH_pbu3j^}Cm5~a)T@LToM5NqHlQy$ z@SImnc31yO<<2%O*6n7M$RP2}O*+v`rhf8gyvg?KggS*?v_owt?L1KCxn4V+{dA7iaLZ$BHhz56Z ziVhMyi2XxN;ox40lJ8s#mT*mLuau0R366X5-;c3-kEHHn3g7F#RK3GQAN6eky<@S2^OVrpsrjNk-Q&eChS+iVhDbyX?3IeR*7c|5&dK{r?|CcmnLgawzfei)Y|)l7w>vA7df zd{O3K0pZQupS|QO&{L7IpwUDYiwRvqiJKC}i$&baOC8GJlrUZ_Vk1LJ*c+yV@nW$q zlE&9D@mPpYAv7C_DD$x6Z{^j-n3pVLka=}}HY4CiaYG#n1-^m(X55}RxgX;ON_L5} zjeA$9h+`rt6PafsD@kdYKzqzw?VdmkO0G6g#7&Z2Fa~J(rOZKLSlhQ zyq4%aq!&C`Sbc6-lvwGGLrEf4@6@|kuoWE0FTlxO z3IPnpS+mxp{_P-@G^sxzrS_gLiFRb2NJp!MwX;53X8^xOKsGpE-Udm{b>?mfX<4wr zMQpS^TW{cRWHWP3>Xl42nAAl~IVSaDV)g{|^8mO{Pwebu5uJI1S|@OB>i9gQcv}A_(xCOewuV>a$2`v)ovygA7D|gLgsz zw!YOt-*(v<)X!Z@vse7?#7{5!&CtlItu`^(F)Js=RnVi@ysK$znQ~RF6Dhk}uxC}R zTU>2?3VNG$73@z;xf=FMrm{u^KSau+u(N6E%^ZLA*){|55kNRKT4R)2pm?zRU|ZOzLw;&6+aw^Tz9_7}UFkia6|tZNWRZVnxtNcr=)oFV4NN#ePs;Nwmf&Vt(v%Mzu zd8YbI>O)NRo7Bxn>5-8tti-}gRHmb8>Z`a{gleoYfG-7LRI7&SGL)`0rNwHc>rCld zl*Y^Jt~aF%QR?cXi+Y18#_^yk#Y3j}7bsTNu*{ki1OgUlqXGRmK`m>7UAyuDe7J#q zHDI%wOzL8$Hk;Hgq_oWD6^^FN-o#;6W`?&I@bv(%7&S+j(kx1i33mtNk*0JGN}X`| zh}>$5AH?Ag#r%jcrqv_kWU8shQKs7aQ7wD4NxhA!V@&E=rj9kK%h&)#rbj9E+@>3) z$C*0E5ySB&HN@0&Osbcu6HIC;Qzx2K6H;2N%L`o;D`)r)pUrJ?TFSfZBvb$H1h75V zq`tw_$tLv~q-+Zy3y%)8(KpY|Rtt`9pD?j)R!x|v7}RI5p;Jxj1g1_isl%BXHmOx4 zg2L3@)atZW!(24*Vb&foslUaM+GbL}W$JX3x(6vOx)p`nT#an9w7oNyeV%}?PzvJ{ zD|XGw#d?OpJ;j#JG^yQ8on=yIBV|V+otMy6h5QdhD8OYavsi>A~2ouT0VO`M3fC3-bgpFPjO{y7S|#ejtEFb#s4x_9X`5t%M-63)F0vb+TJvqZt9(bdf7cD zbt+Tmo77gOE- z-<$Zu|Y zg;nh~;<>`gcsny*X=Pl)j8|D1lgxOvm9YyMy2oDJ@5s)ZVdO-wXjkES+;r(qdzp}` zZ+vQ<+D@nKH5SJCsOHpW`j^^@dKDBEaIdxC{(==E;T-vBf@$<#$!#wD2-mi&EpV)1 ze5y~39ZRr;U1X^{nz+WQb8YoHHRW}#wd!oEUME^!hs#Ps^vWuAIu}<|x!$VsSKhc- zBUuEr1S(p_&J9)_9HpzQvp8N}g>SVR%C2S=PQ9JOcCTT7Q;aLRDv(B4i7@bdz_#6J zRX%|kbV+8g4Kd>lRz?@mTc#D;n$s!n8?9=8hcdNsN5mk0h#7CTGVW#u_p=Se*O{%kCoBMjQ3g@3y`5@pDuhF1xgwx z+KuF#TzMn!vrzmD@wWF{8Q)~a2ds=wA+EIAY5Sm+&#ti>I>b4|ZHTve`2}qs^1$!*6{}d6FZf1-~O7Fm5JIDtH^fp8Y|9o#KCOt>h%!%Mp~yVOOV&oxc*u^DRIr!MOG*$}nnHB(RUZl2F=wg)i<#)1>4 zJ-W(y4Wr25_kV4?x+$7a9^eCpxwokL2Wpaduwc zPa~zr0MU*IfTce%vIA^BOfrznBb(Amee9A(0jMre1C% znrk0dNP?l_+SJc)(}-$!$_eBy722PgiH|4|;2T|Y8Bsj~QQ6!%v{hw_mtp@LFF7(T2~GcFaH zRPiNG5J>*znf#LM6{9%I)5&M@6Z=utu|Snh17p{h(;yS`&NF9$mQP@905ohuJuH{> z@`EYbj1A%As7OI+ z==`ZU=#usgP|&A=AQ+wuF#XEl1e0^;$fX}onwgCxFZ<`Tr`u)xz#CrxkDfqB=mP8x z20QA4p<5Zr9fS50k@mBLmk>|RnG?VxHCC4Bu<#KH450o`P(L?@ft!eozbzTv-ORh6 zIknNWsv5~PqVB$EMpZY-+-?r_6>|e2X{vqi+<=ebc}V+6PJ`-9d*7vGcYhOU6dFRZ zvim7$mM4dN3x9vu#j!OTUjPc+U6j+JF*hOf^yoL!OKJbeA4 z%G{RW>vM0xlhNEp2(6;d{9)C6YjNyVC{N;HXKonnwx23p)KMpwU?@CxI&*2qyFlkB zU4FWj2gjPhYqq7oH8{2iu|%*jkQ)K?Sc-}m8Ow?&q%Scf0$9STe(7l0b0*qMNGAdA zEYyjNO(6>^KYuEQUcx1=E(vw1RhOi?)bVmLhEo_345u1iY9=GR)Q2adEPhuIBZ*c` z0U<%Vs6fLCv_?T*2t=%ci(m*TAcbA^<*A_G9z$Qi7@F^mA(9cv%`;<&QzofK*#6)IF@Qu~`n!S?#DF9({Wx4j3`p`qGeHbU@}kT{g`L;{^%6V5NbXz+ z7_UG6KS$pwBGvzhB2oR13@ZxNKU2h^{zvel z=C0gY^zCT-gU=9yrehoExEFN5=vdM!CXlwoRjftYl2fC zAY2LoK{Aw16GEs1gi9PCNP*IGLI`1iaOpDrIh_o9W+y`d69Oq}m%?%x3YbtyFqh17 z848$?N-&q!8D-dWKp7HZW*HJlX0J9 zs<@eHY6(RWdqPpE!8kJ2eBCFRDsJYYWDGS(a!)8GH5f;xn$r6uQ^n0}RToDMvd|NX zOAW@6sb>8?$y9N;!H=i`6OO785soR9564BP9o*1x{q_U!%{j+#7#1Za*AW#>M3jD$ zXC2kkUTrk&G7MnFuU2`m3t-7oJmQlCF0TMqtZMBCrvR2L#U4IW;Iau|#ibqyU=qNR zRijv}Q5@DN25S_5YHWl9mxI4*_C*_&Vi>pE9JZpyq*r&C9tl#;?DEl|hk%rm^73Jz zbzjO!tkVB*;3c4kKlsdGvr4uq?$UxXHmT&N;w~L1V{=MeD(=#NGB%~8qvCG+N**JZiu&DKP>W8Lkg&efP5bB4QO0m9iE^UB#c}x5KPLx{cU$6@QlBCbJ6JF_P3( z{8^TLt_gfbBpV3SYvI=Tq|5qBrM0+q&l8%Y1DY2tZw2kk5RM26$;EPghz@a z4Y=FVy;jz(|F`v=JN^7U6CQN;`FhXLuRF`vS1gkr{Ex;)ByeI-t=sCu_2H33eK;}# zmob#Bycb^366HFM17^D(B~Yu8Vd()~z&^Rzg)SmhDri_N@)TFah^+Sn4*&`-I58om zRCJ`M!H02cqL!j%1d(mCup~iD`v?*MLy#m~f+R(P7|{eVy4?_@01QErB0-EOf*30! zh+}{R@k)Yt^${chh9F6}1WAenF`@}#)Fns(7=k24f*4T*F;+$phZzatl?3tXBS-)Y zL6UF@k`xJIL=(iQOOOIE1WAenF`@`!Os~5mfn`B;k7DUpeGMvW{Zg8NTOZL1WvV<% zwMGb`8dA}z07r&vq#mi%7=$bhs?+)yD2P{FIBf-ysdD%Dg-0#xwo>5Sa73H zFR?bW^aYgyg{ZRn5ykY-u*?d#ySc-4Q2|4FeHc3#(MT~>(-_g#DK?^w3wAlQMRQ=l zptV#xc>d7qA;PnN1fCHE&zOdnDB&3q{FJ1?Gos)b)9?}{JR<^6o&}x}1<#myv|7ArMweLD>%l>yv?6!vzD_zVol)w)@v-+x=^=?f!MucD-i$vA%CtmGy1As;ckW zRYiT%uBypB`$&2FT92x)q_uuRPY1%YUT|rHY^||Ef$4ZC`b7!4*rP?iL^TgZzhE^FMJ->oXHb;~)rgM= z)q;-)h2F=5!fo#Rr{h7d6ewE~uX#|LSLOFHY7?vc?nP~8&DamB5g!k#1s@Lzy^jaI zQHFlyUfJQe`tCuLxsao*KQla?BF|k$PZ4d`BpB<@i>W;agUQj}JY4_|!vBCBNx( z>)EuI?5FA4c{Xj@Ozo77TrK;u@vD2FY!vH$Fk|`Iwha~dl$r!xij|p1TH6{mNg=Im zjhdd2mf@kt#dPw1Hf;vw{ofeZA-s#bPwV=ne7L&53Cjv~-a*E>_qS&!o)nh&G3=S**3ib_W9-8_? zEe&(RP5tqyhf%$yh|Q4NfyZz%Bbe^p9*!1A!=YkkcywDb7Q~-=Dod|T>8U}SipaL^ z-RCrB#K9>d&9PleNiBSj7DjaJv7zCeSMf|6%3H?q*{j`%TTzU4- zH5oO{sYny@YErR*J8^iKiO!FL5y!eJvI%^Q*P! zR;t=!S!sb>Pj_ncG>9F~CeU z92%Ut9gCdWmfjYpRz_4yvAbTYW=nBs!BbB^?Zlkgu6WeJhbQHDqERgAAg5ls)ljZ_ z&8ZtZ6^fxVGp-y&1$)<476o)C?RBqUhYw_SyD7=R zxuzP0Iv@L^)6~!<Ovw71akc*oH~k zl9{I3H#pZ%TTbdL3e{+0QQ@nYxhl#{`&2oZG}m#0^QKQ*0c_afXl=9tnP-tkS1+8Y zw6=PoQr{?MT+d8bA;5s?NxA};rn4g7lZ6<3KjsuUnly?55zV)kxrm2 zvDwoaDQM}2zvpOt@YQ@zAUt>(FExWdOX3n4ybBk&SIVT~7KWBe-G5HG?)zbs*xJi= zzX}kQI+lO_w5=JL#qzdH{D@{DlbGFrPoSa&mF)OnremiPi0s7u?D&8TJ8?fdKA2gs z6L(^RZ^5>Q6Cb=07mK+{LueQJ+955&R;k}wRFuwG*WV%Kbz5evTdttPSleU1$1?bV z!nR#G>^~(&YjI;{k?P~p%C}KbjNYx5f41``vFKf0tNdlXngX%F3l=@(&;--*`C~l4g*S!C66)U1xeJ`9^`}wm&-!Z5;p5;)A;5 zQgvpFa=I?}%~S`4(kO7be0*ATaEzO(G^`Y_3+HfiD0eow9GcD%Hno#J@l+pFB**csAQNX;m<8ms+%mP`s(- zW^Zb-DY5m(%D3_Sm**Ai!1*O-Gk7p0+4ZzWxKo|oN{(`1(gvJ6n{~F=K1| z!J#x=Q%?PL1x?wwMo%-z@o^fhF1Oo zDXoy}fk%X))K(0uNgpYdl=}M0s&*hsef4Ik!hIHgUwuuM61gcUA2b$48h+rV@Rx#H z@@G+VE97tMwMBt&?9G+`UvqtGHd}qrW9%7fuH9FbX4$<|%^Extr zksYd7C)9ajG`>IihZ>;z(L(8S-9+` zs_8G)__Qfi)g?OPf5CdL(f3H#Hx`bPmZ;ff7$vrAzaWlP*1l+xT>;g`}1UqtC>Z zS{a8g%Wy|x{0TTG$z|wH1?MEffiH#v0l2);erWog?4ptbz_#50DWzC1j|SGvp^8bf zM@_M3-q($~w)2!ju+nbHEW%{&e~`!<*PZI+@SOC$gL2 zd<Grq_LY!NWKTT;e0>k#yRFIC)NdKTQ+)&cX;9O5yENU>7mc(IJs*e2 z+NUxA=}Zb+ZFhpj-dLu@0}JGc*QsXwWrj<l;#;yZji5@C{Kx0-_vCP&u(Zo)nE zke0{J4p_#C!Kf4I`%wNuo*c}-SoBs^z^9IR=inyX+GEed;OLxd3Z&J%I_F~Yrm3mh z)t}2nyVrS=7?N*YDqg8*_=ZnBzfd8>hekLST6&{SJO{6KIJL%NC!X%UUx`~}&T7RX zjv*#QOM9boNhPpBl|NB&_Gf^k_fG8RsX-lo8gW^#q{og2Vh9UFN&nQ|Ckn#v{Y?Z7lALaEu2FR;T!GW!yx5PS)GtteH{m8@X`99oM*%N%0x(? zwB%RiTl>PH)^51vlMO&sgI@Zqq|8ptlVMK*XNr9>xWu~>BJe?Gl;Eh80=!q5F6ld! z5u9{YNo9m4sZJJzI^1Kouarf=AvqyJTxRt*NuKn3%eL+)C_0k;W|PiGeS@E+L{_k; z?IL-?*QpJ(78Pfo!PgReWmWKw@d_04`&)c@&jkwc(b*4)(QfcfhWL@% zJ)XI0$vXN=X6fK)h~J)qQIs#zqHAHNqk*%qXrjM4g)LLmBy)mF_coQ~l97(nb>?tY zP?Ia5y_!aIv`MgT*y=7TLZ*Pw>O-H2Dou8_Yw`QYgAYd$yvbC@hRcW}Vz0U(P8KMp zy3Vw#`{;73ySa9Clc}mlvTZ|fi026nR z;xY0nw>t}bala`DhBL*M+-5+Vabh2FN^hV`XN}nuh#W31%Oqi)+x;|Dr^;VZ@d|I2 z!)3G%XL263{k1}>CNu>*aswnoUHgx12Am@vE`uA+5jpaMSP{`YAjxqb>TlCYZ7Hk) zs*XLiivvX&=zX8`#`^&*Pz4&Ff#DQlWlU$2#28x!XN4{QF*!uAdpfhy;e(YSws|_6 zl0P_Oz_YCrdjSgF31*^d}|8TaYo00@d6PABxSSnmgeolajAXY) zWR(fiM=AV9<3%&ly<6PeN<@cLlo3&9Bh^lrVEdKa&=3sblP`EyE{B}~o*eiyCj$_F!<&2Ty}SJmzq!vB=fSFF0~BsWuDvLDYWX$^w?E?&9WLWgWvfZHg!+k${LMEGKkTFXTt5m~*dC9qoN z(Tp3b=B^uI?%X>Ny;4_JP#|TBPzKRkY6kb(WvuP3I{jsw8sv6+YN1&G8cmc@)4P=9+m~e0doJTGyH4v1JXg1&KD{~`#KS}Y*GZ{;g8?Vf z=55&4@sJ^@5X_%iiPCn!5~_2)YOAwR)$N40GFIXXxoL3^E6u0|;2xHB=pL5z!9DD9 z;YL$5tVmie2sB~Cin0qeWXJ~t2L?j--%M%I#sD`0LjH0gG}H{&7Sj515l)zCq2kAi z@=#AZd@l&KN~qmnjR?X$4g@NwlvwwN=@uHg844JG1FE9tqi3Ct_|f5HIFV?^dNMjv z4K;9w1IJPU@I&LIDkQzuvqoM0sFy1wA?eGWjJlQ~&d*7o)J~eu60CgngJ?koFFnuE z5nL!G^t~mD9(+Vw)6PrJ55qUC6h1EO>z_JPUw1Zr z7!n`68Y;vo`hC+qDuO2jBLcxlswNVpTg5q%6lOL$Kb#Z8epbW@_x58~tERWJG3F?v zf=G=FJw#AmlwpTBpo%i&oLGBfEG=V|SEA>Y+Q2JS3LxYk{>u5?2KY;~v@zk6EZ*oM z0&Vh=K3Ue;Jwb<*!Ze(E^2#qrv!<%SQl{uwl-C*f?G%1jV!KgTfEOQOA?z`W?LxzA zdss1w3(?|2HgOT#LmvObFWBX4zN!m1gMCK_}out%m}gfV1zAM- z;sczK+})Uf;R9S`6bY33Gd~Tx?Up}tvTQyAfNuhj5R-&Ib5dZE@Mlg6Oj7wXhof;~ z&>tjVZS_F{Rn^2<&wQw$%)bX~8$r;&hb;;E_pn7l`&1!|GXEYnKKl2t@zKABjgS64 zeE7^q4Y>5!-$Y@y|0|el#+s-ju@v%@Uwbgu!kqeGZa%J^q42Ku&@OBPt_txIUd@c4 zI{A)Hpq{p(;{CKQnR6~2O+@H2tTa@t4Miild(l}tgJ&v#*VqS8{?`RA6d7rl6N+s2 zfQ}CZnT6`?XI4G8eT_ef_JRR;I0!r>?G0znNrWP2cFYR}&y4g(*zlLI0NHU?!<>8# z@*3s{O|_v5N2A-?yCf$RJpIB^uJv*dgRDm-f{a5OAoUM-g9KCmwqO478K5+6y}~YY{3$T9ArvaZ4}#x7F8Xb(zZ;_xYZuIN{Y@ zx@oyIixgXzHOPs;`G_TVC4QGcMdvjB<1NhMAD&1xZr4BjGoTqaDi&s>EW9H7GeGmB z7R_pWxiqWs1)9ZY6;aW06(S>gq>L1m!qY<)QG2CKp;X!vy$lDQi>jWUSM8pJ?mLY~ z!>C5|U~r497L@Hh0r)v4#RnN_)kMnrg=tx%GNMPRUv&hGNCk`$J$iZ1um!mJ^XV3s z6oMB^3Ky*=Qz;xF1SKF`j1Y(D;B@qgtM&uaD_{pjFPE+}(@ThH=nV!g1l^W?i!XMf zGrrgv7hmj*7+>s?sRdn2U+hG0e6cf*Or>SU7rSIO1|zDIf>G%O4g$`LJ3)hID-!TR zZYa=E`b9VG>!>ze^owp92e4{eca!pqE?Mwi&ie3P&ZO$AaNuyXTTQpX8KK3WHzT5Z ztf-mNoJ%>g;SUe4k_oBERB^XD$_S;XQgOE`#%oRBMdftR9XHV#Lg>UAQub&0^_^9O zL^WoOpKyPctNS(X{W5)G5-+@F^P)*tUbB4}(j1|Q641P8W)!q9!zX9z80Ab$QW|;& zKDLE%zewN-)GvTC{#j0nIJa{z;#|qWvq-Kiq1?JB#3Dr zK>`4rH`AN8BwT_dMS>X71Tm^y@*41ALy)Sh!4*Nwf^neiu*w(PV9Cz!HCVV)Y{6@= zFlBiSmQo>8G3@#-mI64FVU38|Hq=--d$q z@u64UY8?fw_siV94b#}&`>+d*eEcY_HT-n+Zu57emdQ5Vn|^u~tdCv=sO3&wc@$%i z1Kafn%g%*AR$gSSP01t8i}Ckr?h{Qt&5W+4+tYQ}2G>h%<+7PZAFt6ffmQ)=#AQTO|F ze9f#|s;y_DGrVs(68+Dg>~oa3ha=h}e|sLo-baZWIwlW}K_!p7JIFH*KP6ALdbmV_ zUeyG?g1Pqh&|&$?b!TEv0h>f6e$`z+K@O(d#cLWrBMgU|D8PZ=H9*@LjwbR+JbbQ= z3P9h35xMpUaVm>&k-gILij<2WYso}*Yj?GTvrgB%aCUvy+;Db7S0bDp>Z%E6UjPrHN*3wKwWy14 z+Nxwmk~$%1C)c5zs8G%6@6kosb9`js!`nlO5?8|bh&3h54rPD78U2cTD@V@41SiN- zk>?&S-Lwt2Ph=iVn3&T)f9{-I2;VEM#kB@kJV(mmvj~y8{4!lK8X4JXN*Om0jMo7s z4rtvD&ts>%;W!6ZX}>or7knZi7I(sX;G!(j-labKO-ahfdnuNnCjtF{KF|tYa27A{ z2k@fJRj7H}DA#ADjoWtet6&_GcxdhB)#?Rqy`7oVi_H2O3$iW}E9UUvJ&~%3#&s+b ziSU|nDkEA@NCN9I)M8Q_vqs{a;{-e&Q^J6 znB2oTQo2UYR`E23caBJK{uV9!aOz`B3g@?3YU8v^*L(n_14JB+cN1-GK8#lN!8P|N zjx=+bzZthsn(5eKwc#)7JVqbWF(-tGt;0UzWX`S0Ntf$7>?2NPMQ1Bi`aGMEb=H0y zU-3?b=_1AZW|mpJs{=hsnmLr^Tj4{^38$j>w}}=ak}(muBn{smS;2qYmbN?5_Kgc5 z0sMI0#(*$c2J)H7XE9(ov@X# zl4nd6m6iNAk0~G97|`iU;0IK#Rd@PwsKzE|;z_`m`cEOghmGa#z+VTjD{Ct+QS8M_ z7-vikpe4LW08gf>C6&J9ok)v8+^Hc{j%rEQc{gB8eY_A;){-11Qg(fB#>^E@Lmqz; zdDtV;9*H^5FxfS*gRrP8U?c}_AC?+59MxaypVt^r zo3R+c3yPy^jjNl|;~odPOxy0bZ^k!RJe;%+INe{PbHX-Q1aCA1({*@LoVa*QrQ66&(nJXYu-sNm3mv#FO5b=-uECE3(uXw+%cR-xznI(3nxR zl7OEnNw5pD4XH$%JN8|4QnxtDHyrxGT;6K`V}$&L;;#zn@f zhjf-si{yq^9fDl89uq*uR;P6q0GW0Yqr8|rqD7*JAb_mFEtJurT>iqzFuy`73SrD9E~cvC9T z1mk5^fHgiF3)?C-HsUDbYHTdL?5C0g4+cRkT;mUX8xhsNNx1huj|;4iRAk9Z0)ua6 zzPn6t47^%$bguSR31vltXH_EP+eK@(BEJz{$vwTOcj{cdz-dPHLZE7aG%GFs* zxHcW$$Y~M9%Rv=vYu6?r7Hcr^Gb0=~X~f zU$dr!i<87_dUf>1?!?xPu>r6qba*YPeV~C8Rr7x44n1SqhC4R_c?`($ejr@7w+Lp| z24;;!-QTnA!s8eUfKc1TauYr90J9VT-)4SH zv+a}oVa4ei+>nv6W8^3evK!q7nNSkMi;D67dTEf%$b9eAVU*T6bxw4slg{n&RR+Fq z=+q1~A*t@w!hvy!{xAP)HWe#dv8g<9S7uYcRFS2|95*T zd@tk=1$9CRZ5eBWoT*%u){Jd%nx;u9jCdBgZbB8!hX#EYXcHZe~15N=FJZ1uT1OQ*Gb zPtyaM_9`J}W%XvArPEFv(^ZdU1r^w#3+uz3G#M)CmFuD8tvmz%mFI6Uz3Dxxa3HSd zxBsW-G`z*F=Cmz{l+9@!67Y$y`irhrwrk%7g#^qe+MU6O-?HM~9 zT=&*;t{57lB9Oz5F}KVrEsPHzdZ@lRrJ0M0P!3ySZkbhD17c!#BAJYO^&GKbI-GFA zLt@1AL=+o(6gCXc1ml5s!mAU$v+4x@_jJ_);YjH}fYDv%9FHci)=vrB1_&ZeE8C+YXtEFU3m;Tt1s{xX|rR&UUR2|#3 zwOaP>F7>v)r$&P0{I2=cpeG8S4Z;9Tt77oQUZon>%-OcCx%l7G#rO$@APr}^K5pXV zQB5T`ZdL`xuq!Rx)aB*w(we$!=~th~oqlbwr!c&6E{gH_Fw+b-!nNWrK`(3^UIjn) ziEIL^deGG$$vSXVBGmPV7D#4W7hHm%=vWHJ=VBq#KTyUeH$yv@%G0Avf2-?%VZKu{ z>O^EoqCGHRyUB@-%5$oAU_Z303IDrAIOmISCJIyqL$%y-1`0(@`Q|mA;K)V6VhJ~4 zhqtO?&yuOCOmF4}D$p|SR@DhseE`K7Y`*DUsVc78>^w-O*5klHyQ1C9CowwLlQ!{} zRDmW<_t#vY(cOBaw79!)>9>j7WH|ddU z8L6lE*(cXXJ&aUi-To#XwRY;b*B1{w3R(W|-KXq8>)iV}0avAK=DuU_u!<~YsOA|kN z=kE211`Nl`SgdY;nlG7jo^*%Q3d`Hyy*rnx5^-1b)i0zkz0ock9y-q;={X^?vUR@ zL#wx_N7#$T<^rhmFtvhFOBb<}d;pbQBt5CRvoW^6sg`4vyN;!y+&$3q70T9X)9Nip zKF6MRNBXTuvCfy|PXVj@;@1l!Sf60gmuU~lqOT7zZ0+H{Mz&>{4kq$D!?pQsGAi{8 z-FygUr)5BPtn!w2{ujUPM}zj0zD}T*r(Gbo@9kg#$AJ;MKJC834H|hqWhJgyW;#S3PFWpkXPP=k&)Xk)4))LY z+=elh+lN1W=7KwDmhYo|z(Ums zj%@?|?XBDs1P*LBI8$S|rOYh^k1HfP{tmiE#CeWHB67{nTJieW8Hu*`23u?KDE_>u zU3?TDiS6B|VtZTmw4ricd`}-P+-5-!g^U=O*qNQ_z3akg_KoUvBw+0TK3?vwbM~T35 zt_;vA7tS<<1KW{O~}Y5B3-%`(n}Vg;P737DlB+rT6B( zA^`OG*xL7!->^~3$ig`3}YXPbdLEAEF| z6e{gt`>mK?ZwUqh`ytnm2yF08NQU-c&6G$C>_I#_)`j?j-j&hxg0XHy$F9NO_~ULn z_0a`m*CHz!EBzKY6?|*&q0w}!1wW_W@VOw`D)4pj+;>oogRQg>c2yKf)y~##_!OiT zO=sg4iaLX0a4!o{#%B3=RUyJIPP%W>iL~}ylxu@N(ES0=XKaZ89GnEGpoqO-V^4MZj$!|caglv`SVHuJtwFKMoZ7P~!LBSO8>_|ZhY#tJQc`%T$7+7o= z=s<;pq8^W^OVlFGcx9!-s#L=5erZ3n!<81sJEc`?HFlh-H^}vG6lEeU_yb*@N)FzL zJSXXCWM>Cbt}b@2K+4s)&Q(acdewP&ene?+{-o(OHov-US}o1bpqV1T$QbNQVtMVF z681~)PeeK}S&6M}-*^t_#_uHv4#MRK*yxfoV7LT6gTQ?!x`ej#vD6Ffh6=n2!Q>-~ z`vsNvW+b!$4q$9hkK1vjjN2DwN^g~PrnHaOi$kTo$PbmKkeXsN=WrRHDLp{&<1?ia z3Noe38VA;BY~psTQ1+>_ zXs-jieRmIB21K586#tYOVSSdsd05G~mE%D&5|Yt@lhZM~ z&CVMoUyMfX1?W66Bk+Mn6OhAQBtB3Y%P*gL3)^^#<65xIlX%I?rHV|kPBzhXm+E^y z;a_ndjhmV4Fs(rw@t+>zds1t2a1`gx~<-+ z$5VN@GEX@5GE=8h$#RJ&JFk{CuT#5M*iP4Zq7m5mnm1sta*CF9uw-Ihqic2{&#S_F z*@)ud#jXYPo2A)Gaw(P;9Y69=&y02aXJCD*6?LZGhkodfjz70CusffStg%Z%pJ?3XzBak$6rq& z)vy$uD8H1GPBp5EDJLah19zbWRc=6)U8#A_JjWS!8aCs876+g4B&*SJkk?QgPC0UJ8OrXtVu zrk!-Ax6MiCKwLsFbT(S7WfM}Mix;7R!DTo_&>om`Gns$coM>r|+(!fgADnYpS5U`$ zgNe1l2=6bj%N=~dDIuLd9EzT4;@=HLe`w;J;lyEK4S!>}{~KWq|Lt(}2PXb-IQmBu zUmyPD<0d}8Cc3yr!(UJny+p-#U}Iqn64-+UNFt*&0qcmw3fu&>V*fo}2lD3xoPmF0 ze2i8EBU!dc6Bfe0_e}VWS9e)JzY+NTE zXCk2!SmN%^*6KuxiKI>}Wui_J`%@*-ui0=K8&kP&gYLmjtbCl*7MQ>QZr}oVttBvw za4o{u5nu}g*enhVA)J7)4dJC&v%enUV+h|x7>J1V%!7yolm`&OC1! zG0$5@%xf9nu8OT?#5+j4TEUEejJVx7P@{!Tr^g?WdQBeMCJ${>%lO|_v4>XIh5o0< zI~z$-+N+!P>ZV)92UW3Gcl@QuF(h4&cm+vZf{p)N>P@%&8h=<7TWC`$4{a~v9@_Ce zR?)ToqC2djU;2yY%<~W~M%+VaFYKr(Gc4@3pdyMrI(6L^rv+k%{_S&GJkhmyqHAgS zKb*Y>U{po>Jv{ervgu_>vgz5SFN6e0C@J>s^*6*VI|sv#{#r{s zzqnF18iv|?q;N7{mkor>3}Hx$3QtQR3o76F2m#Ke_%5aaFF!?4mWF8F|Nqh6!vGeU z+qieC{x7-RhG>zw-Mah#6m1rBlUcQFlB6J;!<`wT;k2-!tRHCYCAch=7?heP1*J8L z6617(jQgspI?3>?pQ_F<%~V!ZlVoT?Raz9@6&!73plY-e9xd0&Nk^46q@w~=UEQ^- zB+IyIY0+_>=ovh#GARtjllU{_ENf*COrn8~*iLd8$9P**bxP(n3r`G>tl*0FC3Ym@ zB_dBWUiM5(i_Tjm#|LRmJx$S(k<%tm(@amaIcIH}RePJZWqV@a$*H{!NA@7Ov4Du~ zQ;2D(_5<{m;MX{k)ARfalt*`-B=H^>Z^Q9mgZFz(X@7U1S@woF5;9E}3~a+O)ceoF zhWq`of#;C=`wv68Yuif@9*w8!Q-FJ6ZuS1{bXGXd@@LV^-n2M;CBASbUqti7*DwBE z-ekjLqBtCkGdoZ-Pcv`WzaRcho@SY~?-WVJn`QC7gv30K{xW+xN-_Ha09@I%2X&Z+ zcF|ve_r&vE(UQwNaYZS$gPaPL{p`Y2AD3C0QhQ$5_7QDtz}lO{+R#or;BrTt1z;U! zXcpPPWwJ~fO?A^}O%-hvo7PvjLU zDU>f8gJ*=1y`-7E&`6un!dnBAsZSjt|)L_EoQ^&_Saoe4!r&Y$kd6zTfeg9YiE%SZ z3LUE47<{CG%1BK_jB0~h1umZ{|Nk(khL$RX%M>q{l&H{bk9T}Aui9Fph|X*{~5@kpepNQxX% z?2z^jsdPw{LwY)-mqU6xq>n?UJ7k7KW;^73hb(f)xgZ57vwsMbAjlD^m216n!E^k$(ox zUro}*{C=kq?fsoF`x>!`A1^iHe1ErwICWeR#&~A>1I@#6W<`qmk>cD)vA|!23*IJy z>HbF>DmNptptJp_(Ib6dMmqWR$*{E{AT2ULlgPY95-#@Xj%Bz*WN2d;8QMr>L?e;$i$sPk zl9>*X0f-hEfP^@M4!P;L(&^=JLw;pukl%dsEB#nBr(F^$EQw6AB;hd9RJ6ze1xdgm zogGr<5Sd9CMrKkHnMq0JIAp#IAs-y}&6k?ETjnZ8M6`X-TnN+Q!Y zi5x$Y$n;GjM}j0y=Du+5vf1d8?M5PfoJ9IKiS%(2>Ek5Q$4R7XlgRW`x-IKZ(r#Br^Mx)Hvh} zhsZ8M*I0*)bBOFKbWL!G%>J~<-a{g@KZ#8GBr@rf$fQp))gdzJ(<1vEiOl{avm7$l zA#yxGSDiy-cNB|1q~{TGIZAZw7e;V1bTN!M9w0Zz1LWq2G7o7=7nNV1^cNE89VC8- zlscr7Lu5NMOb>_jb%<PUWpwllB{GZMfjgcccZXc0n-3_P?5p+yEz zT7=Lt%ey{UEa^zW+B<|U8Lk*u2rcs+ix6650Am;-w8%(Cix665WTHg~Ei!1)B7_zh z&u9@siwt$N2%$wrL0ZDZX*#d*$gc#=G+KT|OOKJ5@+&&qR9d=})LDMTo@4AX5Q*LS zWtWoxxdvlHhZQv*R*Yl@m+|g9)Llr{fYrmk_#oIW8e|38AaE z;}Sxb5W4y}E+KRYp=*%i5<<&h$0CH5lO2l?_M8$B_DLbQ{vYL&4NW53mn6J>ozBi4 z$Sv;de?Di&^vUSUp4`MC$qq?%NG%96O?Qa&c3P4gBC%*mafn2x#p4jkf|hXf49Ak| z5Xmbb^^ychBo>LpA_7VIHEE0)DBC$v$7Ky|n3CEJ-09xc&fhClB zkx0F`O~pbIwuEbO23(9Tgyk9IScK3r*0Bg_g^eP^uKfB+9pZR=P64w`9NC~uU&c(5 z1cxL#L^=;$vaLy^^N>jAA(75QBHe&Qx&evwMv`z|d5$IDA%2H6bx1RZGcgO&T40OmT4ms5!!yIxBh##$-X?~^EMN2j1 zS86H0oT*5pX-TAMNu>Qqr2R;w{Ya$!NTmHpWG^I((qh>7HMpf z0*Cl;SvRq;ORy$bvVcD2cR~9}M zw}J1X`1~a=>d{WN9)~??Y!Yc>5@}HqX;G5X9CErthC5`IL*}AjNrg>=xceCuXRbHP zNE^4NU2L$ekj(Y`2(Et}4(V{cS!}*E%=RQ`XL;5*-Cn!}c6^Is*UrI}8^ezc-w0#L z$KJH)!n9y#2@pN+0Pa|9a^8{jzlMtxC7*cH+z8NB0=Va0%>d?|O8?7}D+0t6Hse~F zo)|tgy~&7rPfQ(_O~A(iagzfNU*Hp|ji+EH>QVAW z;7tUWCUu$tPrGV)iOuZ|osATk9Cz|yH6&l7^VZMaiU9Mm58Ipg2AsD(G)Dr< zyAv4!T*Y(;a3$N_5U+mrJ<#&rvdwQWV7(9zZ>M27k3btdjf-_E0&Ve|7~@MRNsRR+ zmd0d;Eo~ov@zXLhbl1tW)>;)%4j{b%5u@z+)+r0Bd!Tn_$5|3 zmkw33Ri==hI;l2#*p9Bp8zIS3CM3pzJX#OrNQ`gb7kd5@u<&zFG_Tl~JSr1TI5|D< z)MIUPc`7XxHch2;*hx6Tm zXa?0E04R(0w)WC9Sq~uoKPz)Ltp+%cb?$=>b0_RItu9JXCtq#ODNbUFQ z#Ie(b!f{)*I#AGx_ErZnw7=>TG%tgcy#vO$<#MM=X3#=CP-FRPEZL5!CBxAzX~-O1 zCw6CM)dTp>11(U0nOr%@$C*K%4>oz?%piXN4^H4#QT+7Kqq5^Z4!~0YN_A=CaC|W| zB<8|Vbc7xgK1iOKGKIpEPmKx{U*EV;X0kSgDqO8wuPPVQSD6?+u{( zSPwU5ZvZa?fW+<%#Dci@#_WyVivplI-TIRU^8JoMvbpdt1^=<7rn_pKBw&d~;OSAY z=(J#AlSIQJi87WXI33@)+8c-mv-O;CAs&7~WREwVLn`N*`o)Rp`M${=?M!^OBhrrL zC9$X2nF*PR-Xsiw7`QOlU_`(Uh5e!oZ)ND^>PK9`rUc}SG_+MOdd{=vV zs`DxnmT!*C&`DtS|43l&|4IPwT1v_PK6N>Y#5XyH|6R`XB^HH8DdLq zY-=SpkH;M4bH1+($Os*a!8x-!BtNn3dTCkl6K=ngW;M|42Ab1Aa~o(LX>7Z+xS~`K zo|R?-zJ!XekXURxUtGI9ShKV>qv8W63!k^*07JlyBQz<9&sQOj18eTD*bnY@(rZ)k z8f1(k+g9wNOvNM4Cda~x7h&?m(L=zbM=A6j{09NoWS3jIYmXLoF; zR*V%}Y*7oAk7wAWSxmOb!;%)oGw<>$gwtWb@LH6}apKU@IOQDvFV4KM^DA-c z1}OK0t@2z)X;YnEPUKE1BfajG-y@>VJXZo2=)jqgfiZ93DpZd>;gFJTX=fd>I5K27 z*^<9Wpt~$Eud~XR1OiN;T~jtf(TT;A2iq#=hT|0cU*nvFOA{s^-~Ty|FC51&ak6yT zJi2q3c6EotG?g%2beQ%!On{pdwUK`FH?>(Kwb?BbrR;M4X8&&~oFuDa=oFg&Kc+A- zoI;EL#}wLzQ)nqE#IwrX@KCrZS*r-EtWB)TD-R#_ICd1nKS#f^!=SYv{ix=I#-c&m z)_!;-Oke#eOuPRQra8ZcY0Ph7dQk)IbTn*j{d<`H+Cb+Y3tN9_pzj?ITc7wNOmR@_ zlTuJTw&`IQDJ&=beMk7KsUL=)>C4_G(I*=A8VlF;=+O z)9np3DJN`wB}`>)wNaSiqcK`W4ki!cDAHAL&t8iYQ2C4zo}l*Ie+}TSH~!4Fe5(4d z{wt=H{FmRJiBdh$6>*%5W8T6R|Co;39l9Ca@t@M#Ve^V)MroeSi;o$lX*Mq`W|ZRV zXwz^&S!CO7?F197xbm;%!L^(nrC$mvH z-IEv^qTn}(M+O-M#tT(>w4A96@Z$~NIx-ESDD$D=H zJD_{+-+O1E9sefDnJ`y*8_gjq`1zWZMjiovA}iI7=c_jmE!^Co#b5Hc8 zSKf$)H00bhP6efrIG)4zyaOm!)c+N)r*V0MKRlB7N{Btm8>;7v9spd%+OG3-B z1u{zueSY)8>R-1;%=Bgm#>M^2O0xf&cjKP&&t+)nH0MWjn*Hb~PNzADvrVk47R_(< zdAP57W!=3Fd^f}|*RA+|Nc>-P!e4ZvJGMHens*C3zTl40S9SDN8W{_s)qYeDmtH)< ztE4kt37Fn&_4DVRR8t+IMF4FOs_dG|A6hd)5|B}5G}jlRKCbMX%4=W@kl7Fb#_N03 z;96K|Wp(`0UlC7V4r1(@y$RaH>p{kps7<^eWK2oOdueZX&ECjQYlePv3K5wHKb%?} zx*9$`-bE?B<~Zso3+lR}^rHD(J6EOyKFZR_CClfoDSuUb@^r$9zHS(-_1er%YFu$Q zzM}qb?OiIC|DD}`8LY+UG)f+K3*Gv=n@-BO2Z&W(aYs7W?Q2pJy(i>(Lt!D}bl?G2Kbx`Jn~Ufb#`D2Fxh6 z+OiwPN7%Y_qj1j{9b&+S(4Cv;ShO?Q!qbE2A)U<8A^9on8<9+>GLua8Uz6#2Vls)5 z$&hObHmklct5H7r^@TC?WY@=Yn-rzF{r96}zCpZ98(4-GZ>zT! zmSdGyNcBZsv~_!VWprIHz|!9Oy-}`jDvyiHT*Q33ErSZmrYc(Gl`kK+;XsJN^mojd z?er-zRKr;^k25*j>3dka-QJFsHn+L&RA0c2;e$Pjt;sPdOE2-9(i~awAGcClF19>F zbD1L-;#3t^fIY!4WiwZYIc?}`C@)C^ruBH>`U9czKPl(op=OWIH_G%>Dq z$V#+02;YSm`k+}}QZL!b%x36P`d3y3y5r7BxXh*JXC?%{M(VhnTsT?Z!{aS6`HCNI zzVW6MjwNw(KB}F5h5`x?27eW~Sjs^Yp}mO@li;TpA%Rco7nB9~;X|O7RJj zn4;@rLz1K1zB^6d^uj>`Gw2?c;T-Vw1|Cp!MGPz-$ESa)?bD(yTLqVMV5 zhD+mRKgdWR?c#|x&D7J8Ef?b=f*b_NPY{bQMHRJle02Fv3SNLrYdR)7X1%m8%OmN@ zMkv2ba*z_j((r*;w19lZG=Ot%cbdMO8}=6=E61N9ez|s!n}DNnTWcg9G{Gl93#&YF z-jdF^q4fmY(OWoT6{!zPTikqO2^W2u_gH@ zRM+uWDv(&XfE7q8oZw0HmW=Qu>Iw|@Bza5vd6IMmdN?WQ3gCM?x&m1BTt4*|=!-`2 zB}lo3;019pO_whpBu&>{s^MEYsM2-eFSAJnmxmwx`4hFQwBDL zH2R&~K6KaXpUlzqi=V=wYMsCd9=Q+5JCP@Nwu(nUzAf$ccDUPBl#S0gMB|dBB=4=~ z(-90&m~Kq2sAxX9K&!FY4Hq-jL)}n8=|N*#mPil5-^Xc1+|iraBpzy`lby zuWvzzha*SmQT{~zOLI<7RB#^@SsCvDRqC`STC z863p3^&p;?8CZ&PVk^CmRDCJh>eklCTJ5gFcaqvmQ(1UCLx?PN;0Bj6M})*eDZSg< z7zQJ%sS_{JiR(M$nZ-%ER5;X-)OaDY+fg)}E_B8Bpgd46=cd8n%duad??W}rVChZ( zeUZ3hRAxe9V#HG!&%~5(l60kpy4u~Yl*HvWVqrkvG{FFS7a9j6y*zRu*f_az2-bgi6>O{L7Iz=W#rQqPJBmna7=A41{s8zn;m# zY%`s+3wL{5$|@T=rvlHL=wjpfqZABv-PVgi(#))o*GA>(4Sn(38J62+voS+rRVXr5Xc?|TLH$41;II7|gO79QS@7@uRo4m! zl|gwl107#}$o+mSaL^vTj<4LmL{O>pX z@bH^AEu(Cfj3ev-8RoX%$ViKHiSj;?7T%C+S?mo*dRz9e7*9sPExVtSlnz$v)+2ah zvj=8$R(y4-QRpTx^Oj{}a~jNi9I~-F9cE5{jm=(|`FLbwb1RsWk)^qbh`O?XU0~)j ziH$=~hnY_tHa5?IITeYRyN*sGOJL^Wi;Y72IBB zp}pR;OmAA2H!a(nmg7y!EsL?SVR*2SYYsoY$7b-R<(2(MHizTkE#tiU^gk@`AJ$*3 zy!PY$!yaFL!QaH;r6*s%(j1Rj90(biP6s@p36=aFJUQ(=IEd|-h#eQcRuR55CsvAhx-|0O zb|+4du=~O@y^-ez?MW5Sj7FaI+S5clOB#9Pk^oXmgC{7@Y2r|TJ2nIHcoPo_^Lm7h zSuIqlr~Sje)Y&*2kDt!ZLe^B*#JkOhUFBM;O9c=IGq=Z{;WACD4p!FSxYA4}hblWc zr)`HS`2N?Q#7o5=>Ja|LWK1qT90oBB z3FG{^j7`Eh-1(LKoN$qOi(menIC!E_$sg`n$}xQS&j}}KNL@tBuTw7xD>f-xWE!Gl z@h5po82J^Oq%UcSO}P9?86y9ja85qB-oQAK<&Wf&hLj=F7Re0sbITIK_N@v8=-IH7YR_<{(2UIfQ2ig0*bc}ALxh>MAMfCLsi!wSSDJbl?Wgadu# z7XtG9GK5P_@Z%9!pzO}x(1k?YW&*z$h!Pb^i7wH+gK#{v0`H~7%ZPYc0G5?RJmC`M z>k+yFKS6<2jI+A2T+>*tZ7i>ZY=*X0p{u~Wp{t440QtCgXkD0H3zo?b0Az;n#Eq#| zJ*{$%=nrALh1Lu6W9x-(6!rkNX=sD6YHab)O<>3^R2kX`hFg2YO+eqI&@J*aDs(G; zbct>g!<<#Pl4ON$7v4s5E{kP2SF38H8}2S0hK-0vhtQy*d+-w!&>`+^Ebj|THr!^& z%n%+z0;1qiS)naJZ|FhdLqMm~$dX?Ue+1k-ZytIKoQGJU$0fw1&=dI44TN{~Zxi1kzDs7%uY}2|Oz3N2vb2xxF5f_AhQ0;rrut6Y z@&=i9e-Fv`c~)Usv_pr)D{t?t!b7}v=rE+$d^Y1p@*}{^&`-plfqG#0CCq*W^K#`f zU7DlRzY~vzLmdyZKj`@rsIOu)N6C~L_ljPpRbRjGhFmzz@`j>_(L^~HblgW9Qzyhg#>V2=|r&1P?Gp2hm!FV6bPjN^kzy8GY^<=GDam-U*0Lp45b0Rp>!Pr zyM0EOdBJ?ix_@VCYgJ_^E9}n(({0WDpXtQuy(WQ5EZa1e@-QHCqqF@l$Xdqbtbd3b!<9qI(ecN$l9lr1T*fbcTQs$7v> zM9K?|t6GSZE9P2u5hfOjT-8~myy1clQZ8IxEA*wW>MC4bBIHXgt6GZe z9+t%-dx+$mQYnlxNmZE1g-ma#7qK@mKO~o5^}f{?j4w~D!eN9RI+=m`0nOmua!)jt zjSm#!y{J%sItKtVLj%bN5eE~85QhTuL#F`saC~Z*4GXi=z_4SWGoKEY85$1c%Y)L( z?9hlvX@y3HB}e*Ekls)=&@YEdtI%?GNKVzfp&H^DKwY;nVK$bYam4Y&3B-xSGl`Rc zy3CWQ&jRXnrhsMgRkU24-BcKI^$0hOVb1~jKbMWjsdai|IfG$l0&}_gF)mT(242IF z`X+Z~5LJ%X-|2B@)gHYOtNyyPBaJz=+dN|AD!-vwNF+!I$E!`;V7?H;k5&EEn-liV zky6Raow|^7MK+A&wUGMOsvacKeR=Q9Yi_scOU37fBgweYa*sRQITkYh`9QuK99l%Z zIINd|&3h4t!l61aew#^urAgLk4q)Dl4=rVs5OEn%E-m^NhAzNQZs_TCe2wNd+g|L;vE)}*$*k!`j3%gv{Mqw+3Z5Fml*n`5Z5ca6B)xx$4TO;ggVQazk z!v}gyzY1EjtHHdXYl!QJ*AlNIUQetC>dtfn^?IN$Idmh1yf&$O-c4XS*hYG8CT=3$ z0`%4S>NxZ9)%Rehcpf z1e1SuM%}FlW6vwXHmSQ!DC!xith>E|-qAqs6pFz@hNZf@C?;{XsJlB-+|v-_-UfPK z1Kr#}?{ASku#2^AX1nT03hcmmsi9K6P9NCI;@P6&$0`?e zD(+BR+M%=~<_FVAg zu{`f>-fzT!KJYyS9fg)`-fPBeryXtV@S{F>v@lLiXpgomRbCiCm*ejg{9!0iIK@(j zqESBRVmRg68j8Sh7#-!hio&fk<-=bZ{yxIr7}z8ox$c5I!eJ#F9DAx9{7H%uM$V+S zxt?;xtAnmrTyFInxLdiR1XGF4fbps)Zk4#zSX#~`?s1EKPTttOcy%GrtvuOeO!Om?^iHxLMV7&Ug zx1_(mk5~dH3qCVk?6+56RUNNRope>TTX|-Ree28{X1Z0^+4-~GYR2qSfh&mD&c3Sp zCUwtjsqZ_px59oDn5&3$9r=3l|IU$Gyh+PXw7BMqC5c!_ z>_V(0P9)aNm6Vs0Zy|qz_$=|Yxi8K|Yu5^v*XGr_)d1ocVjb}^;`6nV&JV<%^Q6q* zEfC8Q;!&b?o>-ckCnfJpKIlAYjfuo%=gq)(W;W9P81ZT1LE^8#c$L0Twne{%!XH_9 z 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�+ZgPH>yd?V5WS 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

{)idcU`^TECI~`sR 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 nEtz%R~r>`>qb_GvYHN4l7=kbnNjq~ zY29rwMIc%!mD}6tgaRg%lb$P%&5k;SnmG`(X5Rd;sP&uw;kE|I^ee3m)iVibeZ@I5 z&`S~ate_$Yg`{mER$Zi&yBhKtGzhWKw@V%U(4P?#OJcEkPbHhIlu<_OOfiiFF+Gm# ztnX>@$gD4e0x-kr2YQRfSpS#{xNT*y=saic%XA{xq77w2SpGnIX-lzEF=MB#la9^` zawrbg0CP}0YirsEnJ}9AfAzB*NWh$^IPlr=U78VkQb{26;2F|O&aX@)v0>yiorig9 zW**wf2wn<6OVep&_>CyjUEpjOmk`|neU9Uze)}Y@3I`+2I(a+j@fw)R&am%N*N-={ z;m}F3V;!s6utrEfR7$Aey_J?PmqRdMY+4Ybx}Y8)fAo61!?Uc)(2{=RX+aCCm(>G* zS>3s)4Q>}j?Tp0D_Ic<;LF#*c84M6U5iwW%Fh|X02Uis80m<{Cow=rk8!lhLmE#M+ z?L?zm=j*SmdeaK_Ib}CdwHjfkM-n54SjTcHJ4=}ukN{G$Qpap z%*gDvZ@|(YqO}h%Xo85A+z*cmP}*ZABKv>^tkAi0?lC+T-yiGw1iLyPzZ=0!y1hkj z*|M6f8*WprXf^3!uw^XSn}cU$eLu(R)*_D^r!KK!fSMZSPD0=;D%W7srB&yON!!a1 z(`Jn&tp$CtWoQ5PGKdYWUe*8oN(&%l|AE~?MV%Z^_eG7M|GpGrUB+j!&vx;#0{HM$6eN+Rsx)3Y5vP>cG*fB`8ZpFcy0J z0znN$V;v+m@>=O`ss(*r(X#-l`JU*+Y_Zwg5=5Zyf&_|3U;J0z{Mkw{j~#?&P%fZX zJgSE3mXY$JIwhwViYYSnP=Nl*3%)^IeR@b$L-`X^nVqJKY&-@^kDL5|dubOh53 z5MtR70C9AIf3^BMrYC-%W>k>qy+ny~=yw~y)#B5z#N|=$#H3R_bA1A1Y+a&p+0HW+ zFw-l{7xt1A*4iE|h{;f&zhWwFG67U#lvboxb?QWoOX+NkA$7XGTPIy}`D8O;8`@G+ zpOh{VwFz6cOf}s?om|~v>&gTcGI*mEbDZ4HK?4?7 zx7?%1)>YzS&@9WLO#H7_f@|qnvh&&iS&*fmR%Q~DXVP%n8E%_8W|ffae5+lup!yT_ zY7lUpCuPn!$@<){V>xD+kB($zHT|F%btVOYK4dEFdCZ32u_MoX3MQ$Qj+7!}x1&ub zVD~cmf?&X_XV0R7aAiDW_v==b559^zAYyzP0ylR&KX{kNO482gMJDwZCWHq7cjqdt z7_61Rpu0u>L`HN^wqT*4iD(K4)fZC#dF!nEY#j@^2u=x2LV)@D5`DI9Af7b0y!n@R zL_pOECsE8hxl!FTCeo@o^XExcR&lYZ;y4s0<`l1@eQtTFsmZWMlUdoebz#ihsYh1 zGeU~a)*zk~*M%MYCRoe_s>imn<%U!&ukJ#2WW*D015)^nIh@KryR6HJP!4t-*BcC+ z0y&0wD53y)1GzmL0TXJ47fa_3VJ@NPYAciD`8HEWLh#(Y_f(i_-Md?3${BI7+jznpvyQI1UihRUkADi?EW|2_wI13sx9-_{SH5v^2mJ zH*@kn0sDRXA$u~X($+cv)P~vW*W0|}bnay20mVE`NcvZRQR~gEYu@2<=D6OfSx3b zaWJ0^t_ULK&9<2S=BeI|?r%#^a8bsj8>z%1`k|42RX463Jj`#daV2eg^G zYov$&|BmF)U*o)*3^8qn)jSj4(L5`KSER9>3^zd*M_u-H)RTEOxq!sTeH;M^_GfO3 zs|1|f!F5$gLbfK5m5mNdTF#oJZg0ccHc zRaKDFuB=82m;hXGKm*4JY?h>_(wD1!SVPyaG60i zJ@gk292VG2YO;YkG9-$OeE}#~F;1WblQ!gJ;yi&r;=evAquX;KiWFd~Iz6UB!$Mr- z{fO&~8a5dqvi&WW%r5ZvKlkDaJWXC@=m<#kC+Is))vEAAke>Ai6G~ha&M~R%ZTB%wP!f6nUKmvqRp(k!a zxPy2m#Gn)wKtwzgPu+>nX;#KoRw8`TJiKNJp5U;ZsFn9&j9LwE8g00T-)-%dAdSv! zL-2ylF&>iZPc>kD4=c&5t3_;zBxFGqmnXVDI!B|qIGnU{oz^AVSoUEGf8VZ6Y&bI zy-#?pH@|m954jKp*?uF+v6VqJg*+?H(l!3x9A?T8n$xYZrOEU2OdZ1Oaz1gJQx#-H zf6Co|ctwA0BM=O{lQ`Qs5Et}=P~?ORy88RUo496ezjh&C;~{a#@Y0h<>Y+tuid z-)q%^`Pe0)rWQ^zbw;l;UJ%G%7xgQ;%WBv6l}TZzjDA7uTuVA`>4vUdi2HZ+?|iga z(SEggwUTz-pVOSt*`(Oc!5EQ9nrg5Syhzzuud6rkQ%39R8sn|u)eIM`D(UpR(&GI; zPz>s1%$BB$dS-FLvOwORB^HEHYaX|MQ~W_ieOg?WeAD@+i6nJ5G-q5U0F%x#|I+uZ z;5*j$$1ui1%dOpHbP(Z{F1xX05lRZ;c;HlKu%|6YVE|@Aii`R`Ok0xJ>Y^nelU13- zy3x*RN`BqWK$2s&8G|!Ul&xZ1xedrOSu@+W$tv{D7L0wvHmttlLuxJBz(#JLoCH#1d2*qb z(Rm9BI#biIe2EIEeqhNc`^CC5qu*LZF zGzf-?3~wO-P+U)oz(=4h87S~H%=N2UE1E(&08b@zb5AZ^Y*if#o4aO0O`+)-A>xOi z+#CK4Q$QCHG6&D-ZIfz3NZ;>G;0x@9r}I3?w1My}2m&FbBq=>}J*9`ydb(f@q_L`& zXoMDUjh-@|fC@7LzrmV;&hT20{Z{*CxKvNNPjs=1paW09;dI7Om1BIuwBQxP=YW<< zn+eqjOIw6fIfx_?w`~ws8#vHh_=mnB3X7+1jvC+KE2;__%&HZ{;`c9@~lln)1x=^c#o_M_C1jA+Rn{+dUP zTjY`!0;VPz+2ou5btRMsgHDIh@-H>lnHPFcC&q*r-0?<*mK+eR@@f)K8bM)D zo47NU$G|Hv;q>UwVoGQV(}Pt|iVixbVY2x1|MyO)O%-XvrpW-PaTv@ue~{J^#LH%m zXVt?qBO|}Ggx#5>v_Jal_u&MXBn-(qd}MDe@Zl6I!x*SwicUZ(ZMoKqk%784qEur3 z){qzWFi*lr<})J|{f|Q^fn*daVG_TaT(3~lN-q6Nwy6b2Km~B3G>zPi0w%*nOEyjb zUdU%zpRrR$ugg1Rkkw;PV^d`_3t6ds8ApJq6k3FvKhs`nct&Eky~p0oEr^|RJ#QGOnhaRjXAp@BL;_I28%ZXw|F;#wY9@99HjEt8 zqU!frgBRlg+Jn?#kX@5a2beVkdNCc}kvPH%OhLtt_r8iH? zyFwX~?(FoeN6s0u=hRS)D1V2s#v>-q?_pWLteZ@*y3bVmzrC*c^|wK!ysL&(vf;C9 z$oW*Y_93)p%#1AT^#N;S1K*GV24XX?w!y;$<|<)YXSHiMffje5%$xR%n;r*7P~x*U znvsP5k7;~#G>qy&T)z=AXtxtpbwhmt$+Y^`jRHQvlV!K4eqDDSW><{36x3KGQ@2HZVf|n&%{Y0bghx>PmmktwvgO7_MF!nHzVFf~9IY^sNeN6z_ML zi{LN~`MaoOJ9cpcQ>fSh3v6dtI#VK4DsTS%Eq!zr(i(K-D`d14bKD?Y^$r>!!O?!7 zc-s*qSZPtzbX#^HHUS7nS=osQsAZk>?NaFjM~(s1VD~l(gQb(cf87s#`iRSqlffxN zeqy)-6f3B^a^1r!krJw_`sr!0(3~iiXZ5iaV~180v#hGzH?gN(qsg5@n-UA5&c%$T zP@$X#!#diY3>2%kG`R8<0&wvy!l&C z+hCHQf@=EAJUSen?@iFV{R9Wy!O9cI$r4~z6-d<>vzdsG z=WSBehhXg_RaktQ2j*4BLv!9+&;W)HBLMo7lBF0xAZwL{w5s&P_uiHQyU>VsK;&nq zl?0)go^*AKw7{=39xV(@z#88$KO#Q6ON5Z4FpUhP&^xA2I1i)RQ^H%_L7&Z#)D-Bj zPtQn?IrxeTU+Bcw{17Qq@5`@Bfg%qE)aPv~B9R*LO%Bc{$eh#jkZwj%-!Z~4`BrXD zcM%OP261qlh2u)M0Fx>;wHnll5g`zx)VM5#kyJC)|1%LcaXdNYfhzZG#ST4eP2MY1 z6%9V3AAWx)Wk+UdLb77%o?ysQFc@7-L*gFF>Y&Hra`sfy+GJd%4k}1~KoX|)*L|RI zISGkP^M}cozGWh%B&+f|RXf}CeG0rb@kq$FO0Tp6wGR~zC_z6+k{o_w0$%t+4W|Xb zDGGF<=JkJYNzG6kro@|D2?x_)rkzZil2pdH75q;(W^geJs=p=yVW)QMw{@68pWm2S z8g4zXhFTe5VmTmo@YXA`Xgelpm~KflN6_TD%M?CkojPSy<89{_u|MX`U)~Xy$WZ%? zWz`{JIA`cCF-zAbAc?pHP*3fL*J+eaqAgyoK{_H{8OKIdZE7ZJOtPb}s^rEjtBdgw z&4-2P@}Ex&gDoy^WXAsOzfx2BuNc`}cm`GgqU`EQQXw1j!RMj1hI<$U4q10y-i36h z_OQk$<}gJ@g+UPeFK_6^i{JpiwpT4RS8(iFlgC>T4E$!j8Mty5;7POhi{TuZWWm}a zIj+fyVV2Ge#Kw81=U|V19T{|dz9J4-sLVPooNMNbqdq2;I@juHCZh0lPXEIrl!IYV zAo_%(Xn*p0XnuV+S#jOdGP4}o{?oZmY^-wUIuE2FO#3#7Mu09@4uhDQB7pcU_o(L? zlq`W15G4Gzz8#!k@i^&GQhJ4kCCC);MO*(5O7+L$7kw4(#K8 zGHy$)oarPXw6!9*R|6JtvV&42u~le5KPZ*87#XuK0zd0m3@N2IMV$aVP@Jkfvv3`z zY6471eDKE-|&@+fb4D?pP3(z^=y{v*sIy88evqqk~XMxt(^*5TPbu z0WJSNhs{tW9hLJfr#HxnRNI3mIytEI9vLP|&#{Q6l<;iJ|1V7Ogc)g z6%%WbeZ|(q%=8W=d-U-z4Q3;quJ#m}{we@ER^6GM9NVXQ~g?N>bC)5hNj~P09=6u>x8r-qtz| zmI}%{>PtKI)(KC4l7bxNsoD({baMIzr0m)1iH^_<%3QHxE5Nc!{%KloKZJ(U1Xy(E zc&W{Wl9@o6wIibdCJkuR;vzl#*QFnSXcFPGV?Kt&@8Hy3-hLj+r;y5zK zLE>;fr#wW%3S98p4uw(Sr>Clwqo0k4dQwZQZ<>cCj7drou(CNlVDByiZW!c4F*J1ba_ z;R!f4UN5LNGmH^Xk#ymtGwV4MLj#CXVb!JR4{J0C zRb^!QeZ{sV@f_5UE-|71dqp20D9=tpJ}3^?hNgzR`sbhyJwiQihVlr(8J3h2tFm-l z44>`x&GItspd6(lM8qqHr+$ojI#tLP5~QaNJot`fZTs>t`GTJamT4j)(`TBSIv2z z^4SjdE!95QvOrMG1{2p;+xiVP3)kA*PYdLbPGSaf5^1)U1Hs+)AoDlz4MHraVKh*& zK6MkBpc<}**%tct#O66n8IwlSfri9OLoYU%K$AA)sZhTssX&pO>kSP%Hrvxd4F#P_ zxYS{lVM26~{u(iJ4Md?(0{Gd)jXW4MoHD>d3O0n6FQ|?8Cy_J12$b_{v*`%vx9$kv zYIjZF<6NBFr;@U0eT{iC36b_zOfPd{<4r#}nZ_XGk!F_?VCuO?#v^)4^bg~lzo(q2 zmE#7GDk+cIl<(xUuSV37V5T)CnKljgxM!M&2t92kDD(fa7`%tj8oqi8ZFHT=jYdqm zze;ApaAx4he_2F1GRz>h1q^GOx4s$yJvt2an$}bG(Ki5MmKhQMKhZTM8*D6xPEV3Z z#64SHYvjqx^e!2u+F7QP_TB`SC~TpGP%it>ueHTB612|IJJQaD8~dncv*y(+YUQlX z|DsQ@H_H{UB4Zwp@PW(-MqX5}STiQ{n(Q|f95Oy$wR2?sXR5*4RgPK93JpmBG zyw0nwi!PoElH`-?V$-Tn(%eP79P}r&AW8ZL?161OPgSHlUgtcxi`wq#UEGIU7c6UlGXzKg?M) zhdFv>4A0Fffm_(K@{Yn^ENEf`ItbHMP?QYE?|)Hp00kAkqQ6gckB+g$42$W3&!{fX zU5qJ_k|JvQvtn?TBQOXv!GElEKH6fKPL}5MmsaU<{Fh!GT`>}1^z+-@U`XD0>=S?t zPYkfC>k#VhZpL$T0>0VnF-d$dPqGN_jj~tuonNS+C+w46+7T!=tm;1^AXq}+kiAef z1EV=H7aENA#*}2wWj$f4S!*!6VH}gBX6|-%Hdr|VfS#*Ct&jDgSL-n?aJIpkwdLr+ z^v`upMqeG?0#sZM+20CgK8!J3D+M$GBK z=fOTqpPh%WIo+S1fyEf1&BrI||*gx?vs-4TNznJU_HNuL1(Vg~?0Ka6uRsLENw zDb$r&ENTG%vX5VEBZD)kR!EN9fj~5g=aEl4cPnkHzBUV9c0@zyi|Me{{SPmwbC`5J zD6~B=XBYM{L`O{MJ%9x(eN+J5Kr|3?QGeM(FkYraF@;5*r`=m zze;JQ!#Xn@mN6tG@&nu~iPD8V{ zNw%U8)DPz3dB#gh(DxNRg?;kb8cW!KsLA)B7Hcs>QhL6R)qC7>hCW{iT+nbIqD>DU z#DDI|3`NSG<$cNQk8CKASydk=^;q9=ipelP$I9-e1{tyf&hr)v#sk4lR6$A0-#>+H zX1PiTvB&g0dH_R#DE8F;6Lz~>u<)t>jn3#khasLZGy}(U#kc%raSvzHp$(c{Cxnl4 zD30oYaZH;i$Xut;$yh_ol)=4BMQ_JP$KX8L1H{{&a4FEiTv~Q|7dm6L?6PmRsT+e* z-eS#rD;>oc$wH@jsq{MbcV~4MWu8+#;0@Rd&*%*yqhoN7G9se%J!=!R+Au>~UtUoQ zTaFEEKKdf&sd}|MzJ{jRmBGc-y9?0=8VA&Y@62~jW7{KH@8KIX2t|H?H!;5~Wm-Tr z)R=y#hs(qnmNDrVI^WlGaBWFXF(*E&c79zGrU}hc%dHZGRrudcU59b#Ze?y7U%l=N`(U;lgUj@>T84x=ni+=3dx6$=1-y zG%UuwpcYsxR}v(FzN-7^9DNz<>C5p8ea}eSe*dBx(-~4{k{AYr(}<+j;T98k8B<@0 z38DuML9Xdp{2$L-Zyj|)QaUrdZ5}AK(UF2S5V8=y5w4dve|jN4y7J2`tW+zC{GUhn zwvrYtj9?7yG?W&cbPZzEI1P!~fE;5&T1yb^?UDGDsF3_5TKkFG&xpi7Nl{UbwnH>0 z5G{=f^Q`|2N??;ope+z(gEUkol`01$Ey#Wx(ij}v^XF>G2x&!3iJBJhH&cpEr0xUZ zWsU7f#_$ETc}}1eks#xdvtwiq66pX!jF7q}IxV?=~dEb1<(Q zyWP#w5!&OfE%OG|Y#=-vCjjWD+cPx17jXi-fTJY8u8bL{Z4Ia>ct*hFIady$ z$YbA@CtNl&-u&rM%l<#w-Uigt^s4jShsz)$VUTbUkuZH2LL0o*!5bvxh7eAlI$c$E zeRZAsz(@#XC0*%srF)V}+jc_8E+hmI86?OMBuEemVURG$AR&k&GB}b65<~{M44Uf| zQx~rn#~CDq%f0LO{La7D^X|P*b&oSc({;|-`+c8hef-ydt!F*YyLXuWTn(b_$RuJ) zAD*qhWf<)t9=sYKVJm!NMnTEYfLCfy3_&*Wlu(*7pRBPlP}Ut~;W`y8?q03;7~N5r z36zX)N+W2{8dm~ZcB!N;SRbotk)sg|u2Oz>_##2TP*5f7G}tCkS6Ie9H(sZI!e~@m z5I~+60;t@r(!NVDAToi4;HAv?dUeAeB{4#A5Lnl4SUoY7loqP<3Kodzd{e5R92P&Q zJ0VyKb81}`Kva#x!ehx6*puju;bMxUz7qFJY;U~*ls4-Z?soNqLe>;qcWbyIk;Kmv zU*RRyeQI20ZA}Y=iy%XTo{3P*;ENxyJVT>iNR0agh3gm%LLtQF!kPLo5`^qZJ@938 zqs7r*tZ{w%3##B-do^O(qyo-}vs!l*%Ix-h;%lUoq{@hQ4{ClsDQ&J`Ls>}~S_Fx3 z0~+y)%OHa9T>aIUwhscXtfa?ExW2{dsOlKLy`AfC)E(FB_x<`Sn!r!Y;Ytk5chw)v z=bD*Qj;o^0U8T|b52*261kxG6rNI(|y86N_OhHv3o1432nS=WI{0T3M&E}GX zl~s&xPOhC7x!|um0765qnismI$YTTX}!7}53+S5)($pyV8DwDm8XuNP?eb#OJbRko8W#4+c20(4twDl~8`Mo77ciJ$2XSaDn} zSLkQ{9+mC>>$z=p2%@EmV8){pm^E0lHfwx7Rrg#fxp}{w@zbfybr#q)b?}=cnV?Ob z2Wd);A@62hMq`b!?ei1*3}SzT}|tDo86I3Wr!e2Z_;wVy=*kOz0DCE_T2 zEnQddI$H)6e>39|IIJ6KW_Eu8XEC#t`|pO-^gPL67A2EE9`cDqN+hdswx3?A;F7(x zB{1z-V)J=68x8mg0HYFVDx4U$ScKZUSW9ena7BzbmESH7)*y5_axuQP=N<2>`^fwT zk54Gki~!*nS;<&NS`(DNKNc+E2=tj(d7T8DKS@|ObB7E@y}`ZMh@Xupmv|x~D9>yBln%|UdmW510O13Vk@eVGWT;-x! z`yeOe(yLm22j1*xzE*|9QC;!D8mZb~k2V!zo2B-xMQe<;lIwZbK0HOZI0iUzFL%he+{#aPq`TL=dR69bheHkZSi=t5;)(Mzch35^~)ohPIm& z)a#zKWOfUQQ2LFUMRr6&I9mS0PgVDQ3QWe&mdSiUVC)kTauX;rTJO`vXAE^9lGHkj zt@dSbA8ep`*{{l?<;s-==Bjoxd$eA$EVw)_Z4${nJLndZ#0QpN{a7TYm)DUU2DUPi zi&sBIJuDit{#W}HhN1#K(U#h1`<~h3W6QX{q%1{cEOox*?<{8y12bj^qUEEHR@}@e z_hAhSTOPV$1U>O6Km8c7g0H!<(LN*ak!^07LM&?H_eLS(kSOv5zE+ZrX6BHQvVbn{ zzCHGubp|Wou@Ux2j`ahmik>hDl07}(;@(`qoF$Go31kGqFez<2O^`0U6Ehs2fDHjQ zoyBYHSk)Gh`pq(1R%MH1-pxV)YvX8vg;_CYYHC!=K|bZ1>|@??^9|vAqyUs^)AkXg zH!sMnFs>5JC{8Jgr}0z{#F*C8((HU|%+f|BQz;+aYFZIUv|pz9om*qDP6tVmh=sFB z06BB2=&EC(gc^Y8g}U0+VwMAE2e^SRz+yt7(+X}Tuxal> zXqa~zCmn#@F6E#nAL+?e^MWakda7Q(R5GIxb+mP}i zbz;cMkt;~D%>L{E6NzRt_SRozFpZ;ulOydREET&}x54~W9|%h?*^i3$u0*-T9Md0- z{B0%YJwNAOn(Txf$9-H`(fGL{h&fK4V7i`5VBYv|GUS=fZ%3x z38zpP1e7X?&xK8?KUJIG4^&4Y& z2XY~$0U=nMGAX^XjY5Gj`xH;l!Q|-9qK;jvHN%8ZwE=}ZZmjaNBXfK`if&dI zE!+~ED$svL!kn8M2o;sL&sGQ^4eQHzPgQP} zLbe>juATmfVc9}CNt+mrpJWrfexm#>uM5{8MREaJrW;W$2NsCYPt>fJ98)**0W}V2^2%*I-b03i~#{~&Eem^dw zdBP6!V;=BmBrFTR+$Dl>Zz?RDsT#*MgIg&vV^$^-z8lZVh@!}Y0$+^&ghkjT7?>^Z zzNexDFHBB&VwFTkLOWvwpB?NdK*q~vz>G_9MCAn9%agYgn=xQew0Wp1X=N8r&XPkB z#^K2fuU$HE3K6Pr$*^FzEi&6d1kC4@FlJ)Ftl~8~z>Q}dPQr89DDnJ(;oa2iXMfzQ zOH(y7EQum1AoX?-!LYL_z0WNL?g^&ajFP)%+-0n!B^qqfQhF;^_O0k6C*^Dz%s_)f zc&R<@rdUUClSN|LaGER^rNGCgFJ=!gGXKNQHv6fZ2n9T+Z9jM6B=yqW-aN$`fJyY0 ztBAtQ(uPTw-{+z@8!b|>unJg`fgC56U)AT`6PH{yuZXd{BXfGzXyn9K&PL)vBDBv$ zB%C@WVP-nSgbcVKm;H*6f_hNK=7*Pf;DRj*l?!TNN!K$xUlY4hx8q5KK-kv{r@X*;LhESbF}&L+GtXP!1%nsP4`c0uTe>x~ zk?{7pxQfk0;>jDpNVLm zL_~mQ#kr)Cetd5cb4LLrQRWPNjE8&RPURwQPzCfTkFV^nR&P44SJGBry$d;XnC(q8 z^Z5kJi;mT}8<}dH^}jw}VjuuaIQtwL3W;MR%e13<6)r|;i(f3S31U9j8Iz}pz~5b( z=PEr)p^9sm-IE{A!+eY?KgYAixuXQl;{=G7c4k6=` z_PHKeQ)B^?#9bDhb8k=$&`}$KMz8m8V+Yp%(i~cIeS=6$6K3sIgR1}nO{nh@PM%5# z_zVshOz7h{Hf-=c0qXvlO3xX-!tlYHnR?bdp6)_Yf(A5)2ku(K!%MW$0r zUS%fU72w{b&0I$5IX@Ba!=q2+)hGcvF<9{9a!%HvmcUamJZQ+=?RnTAvuM;d{FS=P zT3rl`2e6(yeWxw0UU`*e31Q6Kei*j%``w9PjlavxpQg^^_c`$kfwnVJYa1;i6rhOo zWrJz&oY@!`XR96yh;6J_vmacmE%Y13lIN>Gbh+NWP-~p)_49oFc2ryE*z&@7pI3S1 z;<)4Kx@sSqcx@M}14C*wGYj$DOGy00E6>&yL4Zf9o~^$vz1ur8wGxTRteu`% z{b*&08&&sQDg(W(M$GF#YV%|=vn*HTOR|**05c$ex_%mTdAg^ZNHPD~uqL7_Txi|q zS9YOk)$&9ab_9V8Nw&42oT@iA1}$gm|4uyd*K%*AV?2ArdmlX>CN#08;E7BaS^6_3 zU<+qbeo}FcWo7YkgIYk4opWo5=PB`T#s7w$RkR=sQ*Rz%+%Kt)hI^8|bKI789ig>f zTiZ?0k(Q?skq0>lGNjNFqS*?95bXLSMrR`tE8HJV>1x~XYG@29?~E=_DM$Kn)E8P#*nt**+hY*p zLT0pA)(@y_7Ebz@{z=c1AiAz9{%e3T4PmlQsh`R17`BBui7c-~0a8!Y5C&SQs zs>F`5C_hqm!G`v{Z`E&v@yTlY!Ht<`Iuiy?B;@oLjAWF!RIg?&G*3zMdp?D-OfDV& zX~3cmmPSxj^Y6{Rbytd1I-alq;`nfG{2~kV!I&Y}&+Y8rDEiHMB( z$XfFn>w_f;pvO>B+bk(4Qj;t7J_yCQ7~TwuvfsX3!}2mib>g)ujgQ^dVTe3t2r2hq z)VGv0F^0?d&|J4F<|+%aQ#^3M1Ct_xQQ?Za<6l3ah1E!MosX4sYE|a-%NMN5;dbh4 zxd91F#rwxKHfBKnu=N~-tPM2}oJ3WJHkvD|d&xHI_SVdCmb*3kW!AqtEi^MR#Vyec zKAtME*vig^OUSF;fk286N#3jLLE!VHR7`JxG@`nc#$_aF#sE#YHmMG2R1_KDm(({n zgO3u|%|Ik5!<3ALo4}mGR)&6e*h?wgPlSxbU=x(Nf?%bD7**I?&)0ABlLJYvbG})< z49@+wZ5lwcL#@3mM&{SE34&{t1Q3M%VOBIjTT7l4_ikr><5o?hvhg&lY~q01S|yA? z5vjRSJkG(W$r0hjf#w)%rW4{P<|55NF{xG@xo0=llnwC-_OuEunO-U+OAn(ud+?7q zv#~t|HpN4(4Hzn@O54^!5<1sv6e^VPN!aY-5P;7RAtRD{2y80}Hy*&)*?M)(p{-^V zkD>d_{pO6ly3yo5kU%_a&y7~fLr51&kB^78mLnPtql=k7oJ$h`%-{k}=-V>Lb;orF zHNXja*I&i76lNKqhh$(eWLZb(T8kfzY4M!FhnZb)qn3NNsfohGbM_Vy1fwTg_&3W) zjHq&R4-kQ0ptr)gczi_sxy5z#6OfefpttMy7g z_k(p2bASORPP8ZK@___@u~{v2%8lljSQ`SgE}oYG-GVSBOIEB*zL_l=TdO<-){BRi z>PpBZ?P+t6HeObrTq#KNE`>RCiE1wu4Ea~<7vR>vf1?EH1O=tQIyesY%@&6%CWa(N zHw{C67lSjYFbNA5?9V;itzYNn^}#S8^|_zdWxR`Bo>LLWQA*&fo#aQ@jgo@`M9U)vE)EC4Z&~RO`g263U`o7LRuEg{L+_i#&}euMaJisN zMQ842k%MQ17_8Yv4NCmw445+~!r)jOxeGdmB;kyGh_SAgxgJIBG6UY9EYW$knnk%0 z)|lQ@L`L8YS>Tiu_@~ag{>9K|di|&ubyNbhO4yvhbM4DV3|UL@ zN%3@I%|nPg zA~W%foV~KO5y3jn^;v^NU`BH_hcCw5qQ_nh?{#+a#Me?0K#}} z!|kbhg;g#B#%Ex_^FSz=V$CaAoP-rLaT5ILGtWtdES<&`zr|qO%_>-#G32(n22-!U zI4`mz3d2Yd9m5`c0WMT?)H{G*YU(XBwpCmN_u_meG(=Hoa6pxUxAO_`KQoNso}z~u zzLGfXHId$lMmbO;h#ELYB_>l)+=zC2%|SVQo3#vRC!*47WzKwZM_V1=GP2Bo znZ_sotbecD8_@DmO>5PM+tD@cs}>SBWp&a!u0{yX!=(hddkbAV1gIH_nXFid6&McH zawaZxq1bE?<%r}gU&Y2}SRr68XUb#f94EB=lHZZf&JlXXLDsjp#Xdk}BcQC4Q|a=) z^|GB$Tp<`gM=rC?gxUdN`yQiE4}_2qrQ;Gg@^jQ99iI_gG_|_ zjASr}Uh*@f87-cw`;o@tWPJM0D=Et$L{SEgoq;&eQQUR;kxj%bk&_c2koL26wE^t= z@D{A0`!5t)S!DF_W~3AdlB{UXQhZrIL~>%z2qLS{%b4pDK7x_6c>8rCHUhHE96Ll)KK}y5sSH*kzV})G`O<5Bzwc{Dn7}CCl6L(GMKgjGmoXy`5RIIXi1Q z-(!U0wbf6dQD{%}?Y0SALVOc^O^+nM_>UQqN+~G+i1ffiTmd)HoE=X~N;gdqS?4Y5 z6h0k*)!d6U3V_iSh@CdP*eOtIR}UO84lNL0tM!5FBZicf|OXz@_;*33#fCAs~T!% z#O6#J2H;WE4vXi6Y_TvvDICU>$B{)-4duU1lZ<)}{+mQ&7cLoB3HkcGuYya}*~ z1nd-FZzCEy)!NWKwQL&#@xCEk=uOJCSi?)u9~&~n<+6^LW;Q4CA$bW~%+ z+No}rybhvMz$3J)lgx%p=622!GBy%HEUtMW8Ki_*C`C?y@=uP(-;xyDKp0KbFvser zknP-%l=1X?1GbHaJW|K$i~U}15dMF5;pB#F;-zw8P#KZn#|W}6pp+B2A}K*=hvzVQ z9`4{;j7sf|>Zo$M>pDL;8|j6)lhQDl^DeQ8DH)yrnVIj<8_9qDA1{?KAR@Vm+ZCxl z<$`rA@U|jziug3@3s&hMB%FNiy^RJ+N!XHva`9x`Id6hHKLj+j#><5eBm?piNK7RI z$32`4jh8D79_(vN${%7Ctpz{8q)DHt9wDt~>ODUg zGjh=!B@7_M{et+PY!X=yqaP5=+6*Sagm@y`%^DQaqLTF~C$7(Q@2lT9k(}J;XnuTE zRHmJpst~0SUVyX9PKyqo_n2VSP(VVjH-*7=pCq|Fcwl{`r?}{-e0^9yUaSL<|Bm>RoZ!~#@I9&9@s3w+s7a)X5**jFEYiKj>uf@8q%3U&Q_F+3HDH2 z+T6r6E|3SP2iZG7dS*GUyFibomuhD@3}{mYnu|O+iyb`fkbKdR^hiozotT|)5~d@% z>_yhqgEPB>FK6D_Z?kZ<%ZaccCufD)fc->8I4IXr^iVLS$Zd`>Byf}~jW+crB2kA* zg4q%LX8lItV@WBxqVRIPl8R33b3fs!>*i4#x!m#miEA4Oqa1qh-c3{~a_S2IqP!I3 zsj3i`Ae>RQ3maC;=>{RJRNo61AM*H_;a&J7jzB3Kb39N4wz|n^m^M!R0t6PIy$77m zLCf9-*_@N{nEU*2LZcKq0eNvF*FYLNemrr#{xY70qA%3NSQqlfkNlHi3S>zq_Ug z2BY&YB-ND}2^KJuE@${|=N2mxeAW=)ck)9%-m%khSOPG%S&$+ApS!9W3G=38PZrZy z$wk@dfJy;o>(dFD;N*Qa%`x|WdAkmF%guxM7RDWfAhJa`UP;sWO9<;S-4$A+0ZH?;9{xmdJ>tCHO!BS*Y-pryX;v5Z; z6#x#*$`On41*A{m@Ao(Ztlzjk;W3LrW@e5u5Gj5Hd-peCCFion1h(lC$%*&Uc*^|*OPiJZ0ES_plPqq~5+_-F zv$E~YU-0&uZ4xefe%K$s!n_oQ5(=UVS|<|9cv_rE6)_p2k<7(0N*tefdeelxM#t~s z$v!)$ACsDth3ajYvUq(?TCaz2B-sQ;jK)~VErP)+MxEUcX@YEmm|DYc`=dPOHKGiw z7_CqV`uK!cfRgeIo5EsUjl|MeiuRgRq{aQHz41Lg55DiHCP09E++14KIFE%hYswhT zc9;bX!JMVKqzS>M<*vI?&`>1oU?w60<>p$Gkr3VN1THZKf zEKvjij23#=Ic~b*3ev>*jZb(>3jvjxUPX13V<{Isv2Yda|LEAo`^Ur)pAe|8G?Ri$z?r90tR1BL>+Z_x)i40f?hs=f+Qwa)< z!`w6hbO1#~`&;aC7cyi$+Af8HL=5;)t8<)_>E zbFMq1L>q_@;C~DZB2+qvkU4=fz60324-T%>Z`7ukqe!R6|`H&dr{grI$$I zNX~2J3Th*kQhVz^+oVE5V{ZRwpf1exKO%HJqvDD5?V!3};-ZF&g5)Q0=t|>UDaG;t z<@pRjlSR%@vrJ&dq?x(d4I1p+VGb!7b85=^&gN~7z@{Aj!TxTs=mEThsK6(YzEow2sO7ti9vN~u#rCBBZW`7M(t8$uQ{To_Zt<1fJImWcP_ zEoewGnI9$){j$BST5CG_jNk+vUMB#ANxbRL?EevLaa@}6rDlVZ`z`fEq^((>fA zA%X41g{+M>g38OhL6cPh1`vY~J z?dF)mn#*BQ?-;P&N^@NPvQ>n4HWlN8Iq(J$!WT3RQ5|2Ip#cu-g#@Qn5#5zM*aX#} zP!!>D1HlrtPS~O2Z>+f+LMUq` zNfK1`z8bGIkvqa>qDNg$VF9|VFY#Ho{CK{i6aKP_XAkZFyD*$f!JHi25B<3m*BY)( zXy#%&pD4hh^XXBcrx#qjCVj$#td{_ec2z7rHLn^_&|5=j5&)(skv8rXOYp8Dm?WrGd}!5@ZpLNTD>Dl$gH+W(9EOm1RayCzi+TV_%raS% zg>#TpnbeA{R&}0ZNWyMVoEUEXy|bnCE_5P5QjcbUmstS7&ht}PuC^34A}D}mL{F-b zbk*DyZc`DqV6F3ut8T|bXlCax3~3pYMhVywr(S1T0R76bi~&OVM~olaTQ= zXU%ekIa6IA$=Na6rraQSml4|*M~D;o2-W(qqQq};V@ zYlUEZU%>;@CP9+wzh`)`B+Dr*y^Zh$AmtISprqlJ%oDE4_b@0DCPRUMdk(VwdKG_A z(`yv$O;9jqhc5HsZ)?cSxn-m`iawK)j zw2wf}k8GrXR(0tcl?>91lRX7K?1&M`BzT5>!kjb!8K=*LOiRAN-;9=Sxch^y_e06J ziaQ-Qb#3T4;r9Au?I?zhWa2BEf%BJA>8`RM8D-8rs+1Kr`;9P*ej=c#eO-5MJ~bn6 zWo3?+G3!zNn}sc6Qg&bh5XHDwfb%jL<6NxwFa;&ku1$n4McsX_hiA_|8q}JCUfq03Zkg&!4Ag6_!#%ctC5vE6CQIoVh~5% z#MtV=kDMJ75=V&#sDkK$P_WXjqAJyjg>gRm#490)xl)YB$S*m)$X8o+6^n}0GMgB$lmf6|J#S+) z^(Ha<9n6R~j_SQcDoF+)k~aJtClmt-e&7&6Feg7_nori`7zSUJib-s@hU9jiSiM$P zBXKGNWW-GSx9Vm0nO@KOvQoC)j8=s2EV|3o7%J%mPt7UCRVs4 zop+`F2G-2NSzOQRQ7`ifRg$Q{BYjTjnR-0|K|x~sODaQxxzY{)PdV@kfn}f7e=#X6 zL{F+olLk6$gaq);Q{z9vjqg>W!s7#N_E)P5S4(GX#oSppvRd!swk)W?LvY9uA1gun z7;K`9@2Gi}Q1g2QkLwObgP65}b!`~&)z$wwY)QctE4hP*_3OLG*I$ws5DG=C-W4Pm z60GOyir_(WF?Ar!oiEj77{M^PS&D<+OzVmP^-#kx$rYAb+=~M87jA_G$NuRDK>5sF z1RV>d7@e``-E)78hfyf5?V931u98*f^ihHKY6996khR5AHNu6HF^LGkI-61Jn1~YA zEU3EdMvHk-hm1J{Rr7u*deIobqO*(Od$cjhgagvfXYP4dhb9Ii7{BDY_}B?~l`|%L>#xE-TmXzs?`9}`!7#ka`}{^GQTQl>XZdIouf}iB zjH|H*c}g$XRYCwpyHnS*NMj_(hWTDteRuqPd8}_yl6&u*%*RO7P$lrEqy}&#nxPq5 zbml}xi)qaQ=NTbU`1<=b+}t%`9-S zE2Bv1?tef@*qQNawwIqic^@hCB$_fFcm^EK`ea?FhdH|g3or^64kYmj(%v2(q3jcI zfRGA?k@jBI2G~;&ausRknOTa}pIZFNUjq7XukIZ-w8SpQ6lQMa|Ec~v6 z3Q@G-ZfzgVlb^MNpPiV*!3?WQ30q`^w;hpWCM(9TTGQ4QlKgD_Cjvm50lm7rjAv%R zx^O+CJzi_R!VN#FE2{_TOS<4>09Y9KU4Qo4FfXC^$$A;pbKJ{8bRdq?*#?K z_ixflm&U*YU_`aJ0{0R8yju>xaH0O1=lf3m1#B@iG64eMFq=U_KyF^w+V*8MO0rmn1T&0XqyMy~v&ebKs~1!(jo1weE*Yew}>0^$ORZ zW3Et3*E_(GAZYj!a;qyxW0dv-^PxNBWB_9u+!tEqTC^wh&(-U+f6$Y^_tsy&T+`S- z6A$52y1O!~Ns7U#U07`xjsK~B;#`cP7@7yyDG-d0c;sasOY7JtcAD3ii7{U;xFkw_ zI*;*3%-_0RKXDO;{$O1<8wS@ir!FTFgayt`4r+b|vPKf$T`<1Ol27ZzPV{(u9?kO& zY!mw>V?0=oU9l>r;A%*Rdr%M4NJ`iqiuBV-@XHe=?%_g|ZQ2EQte2n$6n=8GS04pI zKr_?o3jf+*&~rwZ=?)x=T*|!=3Ci<6Qd3pvMhIlTKC^Acds6A0nicfu4z7eItZNtv zWK#IxMllU!Ld3Yw^jH!5>Wz9G%>@P}1%Kfs9M z`9hg~Z~g0+>TUF}`$b`eo$!`xH3;5~!iL^+L8Sj zknk#ZfM7;rF8o1v3Rt4|G1R$FW!i3)2po z&1o4Hk%SQ8jOF-g0fj{oBH-=d6fUwEfySyspb&tloqL*E>?)Ow-*vXG2Gm@|+ys;} zVO)%`EX1G)sJ%W^1`C671c%Iwj+E(fxp4|3h54};Wjj=g&B=*QnZd1f#IALTigBk^ z7Gko5tL4Ufu8uLtNevP*i~g1=VU!RsSAm|tE|Bd#i>LU?Psuvbr+=-P*aRUu!5ecl zq+yJdEG5Yc#1J35b)~L4tR}`$^~kOi8<4>;8+QwLWQTLCP!qAX3Y{Yrb+C)Y46Sn8 z`d3^d3P)%Jm@=TL!3<}p3uSJm9Pp~FMY*HVfr#`lL?I)_EcyH(%>pW{sVqmq-Y9uL z6z0G^6h#={(33w@UX!6F*SRYGZq2n!AUy+DcIMo>eOzWUl9mYocL=1+26kB~V_@81 zc{KByafl6+V=&K;!AyL5sjNna4H+QRfEQPgw^xT}$7|3(6vA~#&N*HxN+~|T#v@sc zQH?+-Rla}fpsa-qCUd;<;V}}k0X@bukOVIg=zD04h4HQ&V&6tj87!MzVWbnX1*JEG zBr1KZBq&!;hAQ=}D^Yj_AJN`@rT(jXFI*q9Vt1kJvd{TKut}(31YWv4q&2m{H^br| z>s){y_&0SK9s-r1&dh)xU0UhA+4g7wbFm^x`5WTCKkUueW%GBi=rQwvLRYya2+IuS zva=Kz9Wez)rrZ2R}(uKJh@+a}1AY=}|#d+FdZ#P}wGUhynhEG?N( zOM(>_29}I!6NxUsAdjCoC|i7dWCd&l*V1oK z#l*rKhB)u;-KGw;#>FQP6bozY4}u_zWeFFJKmy5Orc@|S>th8xQGR;w%`v|1w*9(Z zeZ(?r@?^!132YF$UHvfjFvz)w_5goX-v4nV>xw{PPW2!ASe-!oRq!05&xIPLv8G?q z9m)>!=DR>pVzo%8zRNEwY2=(qADJaXn#hS#ESjXQUeqmk3Q|mOt@Qbki=|gmZqxUW z{GbyGb&-BzG?%l{R@|c#sgFCc%80Tv&(&`hq{wf2U8Xq@VVv%b51c$GZR9C5FbTMZ z%6zetB_>x{mL#=19#^@YRrdP~t!#TTu_N=QzrpW#0S%EqQ5er`mbk$QC?>AK$kLa0 zYHkW5%ci~cFI=i$rJ|I6z+DxYGSf>**>DkFW*1;|x$Xc+mc@j!WAJzG#1WW4!xGd0 z#8P>`a?x+x9Fj40Eb0Udz(xfz2-nk3aB;!4`VKX~rr$@yCtxJ|T&ht!E;2IWA+Q+1 z9ta(eV@G|9S71glR=B*|E1`@L&v7Nv*p(oH8CBl6IFzUJg_POgK{KLFV`WEr#PhSH zbGDJ>Ck@N>7%;5N3`h-QV=D}5$uHhS;RpMz%D`21mhG>umJ7kN(_#`q>UJZDrWD#iH>obT!FIK!2oQ2gBl8lSfbePt|A%!mE)QU4t>4ts2_P-h z&=tye3IO>0w|ASsPW8M=(v&m_&;645co;IFWq5)s8%hvAqz7hFg47K43E;B_aS+y_ z?iD+Y6Vr|E6-k7)$p9DP@aP3YN%=+#ck%afDO;#r|BD!FR;L}n1Y*iIJ)#+EiC`C4 zM7}jfOtLu!s<9*%gCYo_2yDV3@z3`-6tvgBa8PebL)h;Ah{qmWlrT)w5H_dWYAaa2 z0LhL*w#i(J#%7|-bR%)&MN?Oaa_el}tyd^=WOTy{ksLh5&foRAlEx-Rkt9D{zguXa>#`Ilz3$hyj9(}N&LwABK-`J$I1)Q@ZiMB< z!$qOg=?WCh(b(zAtS6p`8*Exy+&wIr?iXW{OqLo;?9sxKL=+~zU51fqwf=JX!i=1V zU_)hZ{cC4S1yrHh%A=|%$NCF%;k3Bax)ciMxD9t%QJ5!90A?dX-_2yr|72Cl%at1L zfw;X(HK_V@5}jH$#rD>pO(<DQ9UNZ<)IE57j)4~^ikOc3A%&D(27bc`#gpqiE$xXm%myvuV zD@Fpe4RfT4!3kF?8TWDsH5B-@>vco(Iea3wa{-=4v^ksiGTaY;;5Ch~ zx(n8^LGm0j6PUbaeS}H5ADOWR-6~#bI)J#Pir(<~B&eEqc5CNKH)ONq2N=`R3YXs4>gq#FlP#m8}`r z0{r5(pxbtZ1_OJvg@~T9gy4e-_?4-;@J}HIu_>t3$c;%oDbtf^Q5*!!1wHDrcBRH$ zmS3Sb!ou{Q?noy#WCDvAiNwc|xUp?~(Ce$vdNO#6vuT~%=Q>FMQZ-3};$f?X+ zkL++CTAjnxVFFJwlF5qf_mAtRYN4Ph>@q*uj|AgrZAZq%@GO|w6gL&219oJ566fF|@LtglplqSxVg(t}Q%?hO@Wdv#f*D~bw z!;&q_IM-R?8U3HEnfKoH@9L_KTH1UAe4D0 zZZ+&En&i7DRzF%F>x+r@S8uC{^J+Fyfot!d1S*UMq%ceXpWMP37#W!;d2sQOogi%T zFZKbkW;b48kR11e8Q=iDEP}%li3HW$)fBc?#FLi2#TFlU+*wn35yKH-FN_r?=_%gk zeRueFV`IOHkl(_^ZnFYVgrgW;(lVC1ds2kpLI@U`W7w3rFg_(8N@GRy0MNid2#Hwy z4he+xH6t}XDoEqWp1BvV&n3j_e*D}eFU!dQQL|)Y*fX(Y-*iNgp-*`!KcvzJEbk2x z>C;KT^~=xH6jV7VoyCJ3VuXo{hBM|!-Ayn0M#Zb&4(5~q6P$1rv35{^%qbBgszZQz zF`z7Kl!-113e3$u?qIn0KUZ#C9*KhEd@@5WgOAh&qghpAWPophLNeiXuqdNx^40ne z&y7oLb>T-S&E-jldc5n<3_??Zp+&{AHirtg7rQpyL?#KFAcKrB0hGmEyn^RCWt$v8 zlF`l8N|A;GCZ=9my?SXV$NMPDzqu9%!90$kX$+?2OmQ&jC%Wmn6ee&Nq<|4E0BYGI ztC-c86kxV;4SW2?O$Ldm0V7NY6TPr{ciox7mPx=Situx@{viVqhFM^76~O-OYxN6L zb@DG_6o`!T3%JJQ1Eh>9?2diA^3eM2NbYt$ z^V^q8*5nUtxQ%8wkB|ciCVZ@hZyg;C>1pu4OX3pqu9~zzCfNus0}{@e(S8F@otG3`a@J zD{~vrIe4|JE+M4yKm{1t3kfuV4C4~QCI{03|Jrr&IJBz;5df&_nR)4z$)sHdXA zc`})0PPzXzYKsMM4Z87VTwtUa+PwezD(V1pFyp$8^}AI6<&_%X_GBX=z(tZ3!OG&5 zjAWN*R-UhaGdYvqi3r9rPFVRTW`r9LsN!EwM?$d)U`0%TWCX)n?-eQEKCC<4_2SN! zPtzoQh!F}EONX4qbPixHFQDU$rTwaS{&qL)c|MRBLs@|xv*C9$(7gTUx;ycgl|DTx z30t3$JJPqp$n-uDD$ti`$e)P58BWAF%Np(oz~KukBt`={%*6k~T%xj;J6Y(y{pyec z@=}lRHY25!G5iLzzSD(Hsx0Q=Uf2tFAxruORCHOBuCCyQ^Ysd+8ThZeX8=Wu=|W`} z1n&9=`(z?uNQdmJz2aK>bi1M<2v6Hb5k;7X$uSjz9**B+evKC9>y-|MS1`I3MuB}* z5Kj3c+J($&{l6cU?zd|aXwt1+5n#fe{m3g?fAfd~uM@C&dWwnCu`vTeYA*PsPOQl? z-d%S6_1BLiK;SSLSY~{fi`OtKf1@%#Nv57;Th3I}c=y5xEAJ825~J(Qa3Xses*K{S>lPJ-C2A z1yE&bjJLT;B^!7!1~Y&qLKJ~@RB|4B^R?Z5T$hMjFH8Q%_HIBjU2onHGp0WT&};aB zs{+b1BNkaD;c@F_De%d<5=9XU7?UU&hY_-E8oud+56tL+1g!e?3w6WHg@iM@vH~F| znur{>ryvzUIoVIZ>R9+{2_W^Di*>TG!nj%*$}=0Fs3NA&q4q*ab5p`!5DHkRc%1%S zf9;^ABuE_sanigp)+~`pE;(RKvXXTgC=9+d0b;&XuXajAbnpmZ5RZHK6e<*Caj#d6 zKMe77z2{jeUW2dM2w}u=@_qePp%NZ}#vj((Ow47eUin>WCqdvgh@>eU_R+?TOJMSP z8TjfDJ+m6HQM$`=svz4cd+WdT^k0^YI4(^)KmtHwZA$?VhqzcDCGgRV{r!6Nxktgo zHK|jWQnW`T9G?ap>QQb0M)`ppm*223S7$; z&pD1Ip&-#b9|X zljRI>z|wQs4EA9BYYH93ET$ zeD}E{Iw2~$yRl_@AyiNSK`ijZB!t_%Bk5WoxJA{ybsvkpTw_pKT^R=*SMO;VQg%>n zL6SgEvIZ3W#KLs<`d3LYsax#6$mg4hgaJH*3G%@`3V}7wuk-u%(vPAcCmszp*@S-) zjx2zW_{2c|+fZ#hNWpcGF+YPa=Ib;^NrCzCt5PA;l0AbEbG%F%v+AS5`hf9-A zL=smsnk}d#2+Y4#iftO4gyu1tGYL30VqT22mqm^b7Sj zBSU+XlV6(|cE2t-8ejx0_#a<)p@O%xs0b&rumM*gbk`1I!J^Y55Su7ELi!p)W*gCf z==G5R$G`YKcUu+m_}kvgy{PQ=pKAMbDmq{e?nPlt=o&YAA~!N+)HEtEp_LFgyH1@-~C{4H|TyO~GC@exkEQ!SKNAd2K+uOknk4fe>k zL(c%RkQ+RLdKy7ebhBVz1DP;ZB)?y$s7lKZTrS$bT(4iMjgBjI&hDtTJFXXO0MDhd zZArKHu(mnQ))j1V^2uzS8-_^M z%}?gMTBhPWDKrQ&CWENI&IL&P?J4WeRCNtZ3&L#u>!p|mJ5d~2dm^ie^+ubG9P~s|R@HElcF-nZH zn-~!h@)R=U#=kf|xy{402qE7@UjZFPPZECop0r?2uT_h|gLne!kl~@Jd3zT;!D)Sj z+j=Ypfxuh^Vy?)C7cDc*61+!{i(bOGj{0^Q?FFV$8{5N>z3px)>(3Yhyg7#=oDiL9 zNO!W*af#FiIEY(>Rb50A7+rFp0470rO@%}NYsm?vz-NxfX!3ZM8kmRUojNRYHHW#- zv*6v5^VVOcz_%QnIttN zSGyW9fuI5gvf&B6IzEchFo&u~N%w<{hu|p0sH=A}i>!g+jY!ARV7O5Ay^E@gIQ-M& z8WLfX0m7{h2~Es;h^ph^0pZ*0NL=v*5V07DOqSTS6!kuh-E>5Lr$ zWO0S*903~a1~>~x<35r`Dt0^7ag^xmZ%GFI=)`H>ATFegfF%7+1;8|xJtzbkth$9H zapqF0jkGjG_MHvRJMO``*6}xyRb+*u7IAs;7Z?K0wPNbK$7Bz zzYTFVIH@H~-Kg}uecG2e^l07!bS3-8hs5l6+0Y2mX=71r-7Mu>P9kpD-l64I;Y3xBw;}gt`8+4kvP)iedKx1oIv7ZXaz zO8u8>kp^S=H{*bzAHFd>zMCnN4w7%<{ZJruldhxM6-q<}jo8w$iDk;`57ID`n|0YAGsh_-t0 zmgAb-GDjZ5u{sOwA{bVsOls#MoSDGT#TSXQkbCZ4s?|YCBS?yAPdOR_vo_bR`YR1) zfP{kBI~2`tz%i?$loDMB#{`VooY(VaZ6rAnjb)zow=L~3%Cc>8DpP7Nb&4S*iOBjG!l8Pr&)$ zoZ#H0Li}f0JXa72abOF2`dG*5aNhR&thN!2Nl7^vEOTrspK+X%l`P}nH*o7&@DLp= z&Pq$zXG9;B;8k4W$uh2FR!#G;{$kl-3zloh&6t;*pmgr*u-E{5d+Y!Aur8W|1{xB8 zFr?;_8Qa&G7(hc@2!s+d9t=TV1@N7MxE7Hd*%EIVCZri$!zT(57|Ir=*1Wb5-~;)G znmJMsFw6;>T~8w=f7_o$>ReswKR7T`r4-KXl2OWd#C1><=PwrzumG>;u1tzocDLO$ zWUj{}#I-tqp=)%CvjbU>&DbYZ}1q2ofL(q>)b>TdXAGr-YLJzH6oLGZM z-*K@F2jVf|59EUk#7FxcF|a*q&H*<2zz~3gn9^|OTFtEwLBfTh6rBsuhJi5?Dsv@f zv1!z*=;gp)($8i{4h@1DO+iQnPnZ_DNFH|E)WH7xdS@(9k!PY^jk9rD< zj>WM(zRt2A_$TZz8=OY2S&nI-VYZY#hGc4iVo6k_m`W%TU zKoK1k`3#~Y2=Wy7yAwPg&>W@dz3L(IjT6u<%=fC*cKOkPH8j`mxmq^qPMO*?oA@qg=?x{S2WEw(A) z6T*|t3DdSKcH?3e*j9_Hk$^~tr%>P?0@kvWnRq1-GzCy1lAp+&i5a9}p8((4qco1J zeE#^LUSud9`C`CWmfK8q`LF_B$#ji)AcDOFO1cHu|3-;x-%RqJGY2-4qgqf#>2YHO zd-aH}zgQJX?3l-cRvOqs1W)|>g&JyklyhDW1-n?u1ZnWQ;L^se>Sh8bOCdT}0E=ZJ zH!q!(d3^Y%UR=s!H+2 z`%Ich5*=hX@6x>FJ@&m&ok^9GNF?HM7U7UMfSey{XsX{7vl$eRC({b^rP6Q!@$F1jCtiU(jWt{soXujV327l=lV##tX^k$SLS91rVrHY5*@bp2w#+o0pTy~=P8+t+o#zsICPVj8{Vwv4L zWKgoJBP6!$llKWXu6Rt<^x*wx>ynfLGqs_7R)RR2MAaWuV1lAJ5X3HViC_x`A!0HE zHhfvE<>KspYh}K04nxndB5d$s{C#mK(lY7YrA+e9rs+=Son1!l)hfDYSz;l~>|vMy zzm1PxGr^t|rJ*hGgqKkafMOKQtwD(9T`S4>?v1sPLv=~)%juhpxwk1U*0GQo$cMS}w6 zhJ42{Mc*v&6W>(>q#}!|Y*Vmz$UWccIjFK>&k++@hcYjEtM$&+D z3CjK*T}O?rZ=vl0eEAL0K*sDW~`Ai6^~^Jhh8E$Dk4W?dlQ z;a#7g$*WjCg};VK=7uUZt1o8f4wuF5524~5+Q^YHi0kFY*0BQm`>2K9vkeh|=i+(@ zSc}1pAJ?a-pJ9RJtSA88%~G3UX32pJnjo&o@9BNHB`mpP- z?0Fg~9bwuQSYb^lfPkhHxLU%;3zz|~&QyX8nGth^P&%H7 zls`PI;jmw76qB|&1;M*s(RNfUOlsIW{2WQziVT4o-Oa{B%+$&NPpqr|QUyBV?lVW$ zM^Z?-G}wQ9M)Ud`7ivmXajA+b>3)$rz!s%8vE$ULBq`z#6gEtyOrpZEaQjRqh+-)U zAh{YVkM#=!v>H*D6Py_flVsSmLgcgaSf3&e(0EVOkA#*1>> zpK?dzhFL)$W{W}`i6p~%KIHcf>W#U`1+XbPJLo-rh)2?aPHyKFeWRa!J+Kp62v1PB z;ht4JNge~y&a|^9{SpviLDinO;J6ku*Z?V?JZI<2#~l2ZyTaJ?8wrY(TWyFu%W_mQ z+^st<4{7#StAoQ6=f-4GSMSTBDRNlyVPI!K%W-u1!r_TCV|<=0IV}BIF6LZS91gxI zGfg~Lnt;WQ9D@GJ@pv1RfjyxGz&i*Lj#msCIXuOKN@%rU#C2`T$H<+ z*-<5cr7|FUd0IPe?x zLztA*rXFmaZ3{wRu0H3dm!r0;V#m-Vg|GVbdIK|lavK`chHOEsxR+D%Q2}|KKn4An z%pl$z15f|fwYmW7!Yr&#&WxZ*haMG4cz}|={U_=-DzE$XGa1G_l4o`xI>yp8Aji=5 zHPp##B-T&V!Btk5T#w-p^~u%oo}}(8hjrD5>#lp_UkLHPT&qi6m2pW6jZmf|hBDQt znClUQaZv8|a}8Q>e5r8msC}}ojxt&rBk=WLex=0bwU8(ZeSGzQ4MPDnG6$ZFkx0Te z^eAIdJrcoxFb244ImrZ!TWa6<$#FF~#Vdd@_XGWhbq}wjKZpez4@b>zFP+y|>i^8R z&ck~=AilT$+{Jq1VGZ(d+)5Fom!V1o>3y>{RbrECh%`)cFsX`55XV?k$?uHOI5hN; z5(KxfNWrt#z2Ce!US>)?fz9y&9^+Lkq|f*Zc6%dtNK$X~4x^FJxL}zUJTMm#-yWa6 z#Mn?{&LE60koycZjY$vnlK|r#JpIxzIdRG^kcK~V;=u&jb^U^3a_oN|uOc`-DPj;&01m346m-MAnjfc_EHl*$tDmc@05ZTA9qggs ztKWkoLCJ`y&RA5Xm}qbP#r7W-=%|bK_&`|F{6d*D(1ethMc_L_U}M`@b3$wchZ9E% z>GFW_P|-7M1OTd`h;&rq-MLYJJ@E*v7$-<1wz$q-2jg%*Gf*Hik0vukk}Sb8gr^K) zmA&;Z5!74`&HNd`{K#`=*iz=2n}L>-)*cOsgq;9kRd&puk$4@&!-g zkzc?gubqe^!6O2+%)eNX-*mAHafAOShySp2Y&5ekV&l_~Pmp5V*&{>*c17V5nY4dHD7`fqA#2pu!{+o>=YI|7fSQ z`kXQMz8{bygWrZKBAJhli5Nsa0s^T@r~3yLgyt)PNd$7PhC0m@_ldgBhoX}9$RBx4 zn}AfxFM^fv_)YEU3cvsXQSrb}9S$jxr!4{wJ4ElVzE}6TsCzsUov*9lEv#GL>UF6S zUEl%NTr9CtEim122}nSthG500+kk>;QWVB{bar4IOphrU{i(YDp#GMXm|9-ag(#b? z|4@CI`lDBefkAi|3jDQ>OXGg1J;EOY8kbfOj40$kwA@5Id?Jv;2~#|gbyx6;qT zGcVQ+m+HN{Lk$oHCdk%A(!*iNzpCr49fRo<*8j3z-%P8lX^6Aa*`K=4=bsc1;fWV! z2GxGN^b@PE*DI*PqdI*T3Fen%# zp<=>0QzFop$q(oR?NXO}=9!339$^@4t_9Bw?TmWz`q>Q}Si7}-Hmgx}I1V;g?7b3g?-c0y>O-$8b zwH*OxCPN`(3a=QWcrK+9Gs2L(wn+;5Op~N;MJ4$i4*2A%&K-WBM)MdNyWD z-f|SiGfrU+@|Am&LUUB{FFsSR24_ggDls%A+iP}hmHJBi@-Nq?Ou)&wRO&Ww1AdTK zdGZ3d{bxn}u52jvXE_PAncfK<=VnYgBFHeLt}ltklYRHRq~t!hj)el?!TNJS>eo{{ zHY`HPT4DLF=jx8lYC8ToooOpm9%_9n(e#&MDGFpb6bbn*q9s#V`#}o7`nc&^(OD6o z4D|uNO@oAB+Hjafp)d%6Z-YxScd-Gz@ac{khB9XFO~@9Yuhw6?IdlPCjY+E!QB6}m zwH^b_>t*}~F`6=oJ-w^@fv>@Nedc71!1$Q-3}4zj1+p91QqR#$p3!kcV;2XDFFmH|IH^3NDa@tDmgv{EcN2w16}<=gC*< zxh_N>JG7cUCj7{7GIO#tMi*1w!x{s4kj|iI$tF;`Q#02`&0^BS62<3@!eIFAVKr#SSa0aUV&A+}w_q|U-fjR5GbTlh?&E>9 zZpsjh#+pI>aEyY2!Fu<6j28^Lj3&m`U7*eiB5Av;vm~UZq0Ed7O$MdTYrCA<)g3Ot zQAvP)kq8pN%V$Qyg?3oq08jOsn~q7yX&yWR!uppEO1&&}IukZ7L=V=N#w|)?(ysjQ z9Tgr1F}EX7cn};vEE8Kn!?(?aET}+08RFJq{j_c}=!uoCteD%dPfrOWG&1;Wo79Sr z&m9#Y(1dxshHI@#S^M&rIp$9N2I6=HLrW<9MK`+4mBNLIJ~^-!1`1&?5Wk-$F2OQ$ z5`&|JNP~pny0G+8;n2}2bbf+WrzPAHq04(5AM_C!t0Vrk&_IXOxu!P9gMD4oIy!eC z9~6NBc~IrEe^5fs43d(;Rs6kr4>3>#9&1G9I&G{V<#+SgNbP-^A18b1p))&DN8vQJKRlE1$e0Y%@chC3qk|WG>FWU#2VvaNd)VU zOW>~}$@g48@hr+P3Wi7|e_}M^QO`z=oRRoNy+0))<~6MVU~uE43kI@;7{-cNje(L6 zgarKj^7y*$2d)^V6iJ78|u;~w+fv4H8!gmy51Jw5Q&`KL#++9snjTJne7pxiOE;H_C+0y_w;8ZbC`9{_H%I-7`AwR$fG(!QQls;DJYT zUJGF26i7>Ey(=@vtY@$Bv-)(&7C?)O9phrjrX#Tzn0D&6z{eCI4J z$-h}6WFQH~TFEvJVupT#U=_^975BVQ(=oXrZV8eV0>rhwii4=Cw*TP_t5i)57}!<1)eG1)xZZAAR`8EU^JzQwaB|GTaHke5w#I-a)m0 zie_0Ab~(Y8q|{aZeNvQhkKGyqC6WSjU9>uUs$M-TZLIeIvY8H<2rVsVQ01-}t(Dh4 z%9WsuakW}P3QXbyP{T}TPi9I(wH9LuykRd<)PztD<@FYdhj^U0R<}ujuRJTiGEJxzK zy?->)+WMCbRrYhGrsS6hCm{yd*dj1vQ1iCog@dt{tYlNT7dMQPEDpggd)s!1$I^TK zCyBXKwQ*TvsvGYZ-7YB<$nT%B6ewi zQ(5Y3LD9gP{R`$P;cZ6KLHF~ivHW~pJS*@pCmY`Y5ScEP?3gVN2a|b#EUyvavJ8pQ z?DBkR3Ajf=aCohL;||N!`u#>I*|fCsn2(|Pfn{Eib1}JOZm(S4F`%%=Az5{of5K%0Y`8JW{8PK6u$Lv zTm=hshU{ulQe3TnTTrW%RebEiBn*#84DC?(CK=9Lkfp{)i$CQo9=qqkdow3~?-I|2 zhvgkAvObcK!0>E7)An4+Sm}&FdGpm1$(lh|>u;Jw@DG+dQ(~vHB3-B1ka$Ee)C>#8 z(n61P1RDw~y^Tuj@XN+7GNAW_7{JtkO2K=G2<4jyHvz1XEGGJtPzBBUo4WvLBi89o zYs8+$3wR-iQLwa;u7^?YaShoNa2JFyT42yo`kuNAWfQ`#D zu`2fx7vjGOk=%59^*80I0E&C@og_gVF2PhxQ!$pP~dQP_|s}Ci7?rw*>A2h zxQb2!gg{pn@Z77(^$AL3VMT!oOY+>VfZBVor;Vav3a^-UI~nx86Nq=^72=Guu>-l9 z0Ja&iwDerk0S0WPg;2s#dmd8?%5z;qYI~Mg8D0Z6_|XbnO4gV5DntUko-drO%dotn z&KU!)rdC48&4jCu=tL4`Ayh5PlVsF)D1*?Lk#Sgx(!J#PE)gYMW*?;x7?k>A1K4_a z+Z{8t$8_7&pj49lE&{LYQ(Itt;HGO=Bm~^oOIm0j7qfLwEW3=c`t4dEP9UTG=EV~O z;E!|@68M{^3DnDs7yS=%t6{^4K! z%<%`7h=^_N5Cn-C(uUaS)uJmmX^8Z~4m)FOMCKK-1SV=z(ekRCY$E#K>NSpfT(4_Q zQp)3bsRk~deRtZF`I})QLh*pokno(otzB9H~0mRp{rgs8u zxj$|7gh61Cc>UqvDQMFGE`I*NwHnL(?3fxV+@bMs9%1~jt_8gWcgyB);24=^oof91 zm+D@^1v&nvX4drTqpdoxJTaDtUI7#s8C#%D%LN)CqPW4tn%aY$^NpKzqeR=)d9L zwaQtVnE)Mnp1cdmAawaKrAnr7U;3?cJi%nRHf}pS@mzfUuzo}8^31E0wj_yv_Q-qN zShpzvmIzjm19fC+;yJ=>ip@@APMyv<3GM}xqn!P8QcJD?rQB<43Dy&lmcyn;-Z#Er zMhf$`G0W*7zUQ5b>3P-p%iI`qki#Sa&|qQ)1q2vFx=iu;V-g9>$E$7n|8{ileVQr& zH@H+@9wrfo=1)(dD<$hke#>gcKyA5f<)V}C?1m6Y;tR(EJrr(jy{M_f| zkCX|Sg6lT13vMzo3Ecf%4D8x334-UH?5uRh9fWr3?^-J3En~rv%!Mr{2%~ssu|*)u z`f6f6-ChX5S>FO9!Z#Mqfnb-WT`rI;<|^uO3t3D=*O34+V_hBde0&hA^ zMepU+t3!jP7-I#iM7P4#g}O9dBH>7OVHgCarXkGu9Sl*H@Vf_rW`8OeC7>VlMEIo& z!W5W=Fl4bI*bNsDqBsN*2x6A<@B5dFdWxMeUw5oxCS*oE47picgDS|u6XCe2M*o36 z61?|rq?@lv!G*kxh>R{%mum`2*snASAx9o%Nswqp`(Yq8!%}#p2kq;6%`Ds3v86*0 z=kavft#fMY{4CqVJO&u00x7_SPO1FjOb)z?!BIQ~%17#V-GS1LIYy#jH8CnHrU4kb z(gbv;?vnWHeExRO%u5kNL_o?FQYeO@I!1t~GYcYDD2N>tJU?d<6z)c2t=}HJ>9};A z^#OS15vUJ|@eHp;??4n!c@VH`aY4T=oX;I&7e);jdG)17MVc!}XKb~snotd3$0r#9 zhG5l)Y|fo`FjOD-@qG)&PXC&ff2q_91?L*CO2BAHY&oc7EF;WQyiePTM*`X7Cj2WS z-H(IAL~~OTnR9${$-FQVqmy0|5ALL#8QPd(#Vz<|g#)jSIp2Gs9&Wl`2L!Iwp38-b z1-|>vZ^V0Me976RdhcTWcU0G(9sfR4AC1SW*Gl)*`tuiSS`D>Hz|j7@wAXNQ)Xaj( zs)!GAak!kaeFENVKUkF;bB5_)&^&!p4tdWU(gqjv;mB0z%TflQm@Vt>_3vA#A%^y3 znza0y7mNU7oh!{6*3upSeGK47>pQov4BJsGzpboiXZ~#Yf)#xp31}2sIEbaqlYPuM z=UMpaK%Hfv`db)UqJT0{S4q?n%mI z)bOsZ+Wp&*!&uF77?S%jk0vlk>``eUUwak6Z9A(5a`#h zmJ)c*{16_d6TquxB|Gk91Hnqzz+vvdq(ykoe${%M||p3}$>Cd#?m)O6sD-+(`+w7ZHy*r7z7W!1ww z%s?&#r3tA`)qG4bXyUqXA2W#)s<<-nQDTC~5NXW9IV*D}ODQ!7lQ#7~>PNigXh_@d z=thc{Itl+Q=D%1Py-+_P2$SQo$1C8n?(r|bbp@+fNwSvt_EDK>c_J>N$D5ml077go znX(;60D@$M5}_I-G!T;`IOdV6jS;ctR-#XMgLssj^KUq^JNckp14;AL0T>zQluI7` zU{kUe@^6~7Gg(G)1B4-1+ATXIgrz4CP$dPZY1VugdN(k^l|+%dK(n*sUk)CLZwgA3 zmD(xY;37CLS#^7?8PS*%nO;xAGRbQe9TX=JjNK(-!CH_?kBp66rZ&dqO8A^IR$ZV7 zqXAQMFINB?lgNi2m1L~(hBMZ`cV+mLq45^e^u(!)LjV?-%fkYSAtIoQOT%mkh?zsw zIkf0&CiyuaEdvnSr{={^b0M=Z=A7O6n~?eP+ycot9;eqr{!0$j^T7#dA_o~9MmLF; zeHYht1Oj&xuYMAFP9b-)7LyvK54`2B>=l%k*MEHRM2jUKqerjvsZwwv#55m3<_Zr7 zN;3EhfLZ~wkY=2uUKg>37wXdCz=lA}CZU-SF>Me?(>+2mr3@020VWGS3P_at7E@at z%IPUpLMe0~099-sS8f}D0vgrl3IK1Iye-~PIzoC3aTygrD;p9Djaf*dAifV3@+$es z@rV#Un#`E^lj9Q|Hz{0NK@pfTg-5m!rstUO{kD?QZxNR4Ho zheu7UCNV#~_QNCSxyDp9nl0<^O8u@h?N-Z|5H<`#_{AbBAXxA&ejo<80=vOO+Skuo z$Z~o1R}MXJ%p0F#0&7B=nvUh7uG^_#MGsrEx?t*Q2&EMB1_9Pwb_p4}`b({b?FOCG%M&OhSC31X-L= z(KHYe!GMq5)=5_99ZaCZY=EagW*oA#$%+X5#qC-z?UE#XGNsv%qqorbVZDOFEUyrN z-(^VCJ8RKiDToMG60SQ^JSSRR6P7SPbZICBk*hM}*7Fi~pR0L2S(tbJpPG}oJZ|wu zbfEU)QDZ^`Q@VD*yinVQ*? zp1Ml&n-_?6i)lit8NpSj$KG)o?vRFkOeSH(9R}W9Yl2MNQ91R^PmlTM#=z>*e!Zvp zAYfNlSurK=bWUdu9Fj38V*C(1v-a=a9O@dy^X^Z~A<3b>2Ll++&%=fx{$|8I=!mV! zwBI@5nD81#w8A&c@~G=@_;s!9I1Z`^xSuqG$NFD=in#cNv zq5vduWq*gYInCA%cqho9>6BvpZ6aqy>8izMf@KE8K$=fEjw@i?BqmG%T3lYe_r|z5 zamU4i&dzy2n!Yx-;`sp6HJf{AFO&(~IMGwNYIhGlK{o^4RFYMItV6AYiQSxVOcdqX zD?|1a-QX12!c4nOyOb*WY0w;k=$r@zbn9|cTWI>X{>_+jv*R(dgad?NHRY0<0Hl$O zUkE?~Btdbr)DP90rKn^aM^q#LG%5(lc?m<8V!=SM41e?~U38g<1N`ommY`Gs{OOQ@ zRIwW3*v1I*G#%FxKzT+4&?WLo{&3Qi zKB6w^4KYx}bcoHOmLLDYl@MOnC`4kc3}q2zSpgD-S^p!{FCLuyiIcMLwD~kR*77Et zl|XiZ$9Zhj+1vue>WBmgxTim8gT?}u%M*6;IKn(=VQ|&_=@8xC6W#^{-4oUS`%4Adn*#^l4aAgmzG5IZq$cP7=wrJ+t8lYUlIcWxm&rhI{9p z4jT0gsRrc$WbN&N80hgQQZ0O_7y371fJdv87{aoeyL+Kv34YsLWEq1SLlVMn4H+i< zy?IwR1au?Ff`Fv<%}RvOn^QwjW$8r&aONf+51J*(~VL2;_qxge1;&rZSC*D~%KC&Z{Hj+ktTTF3u((|HH)^SdNgK^|`B4 zJ`&e*7L7?p9)m{vY(mE}BnkwJE!+g+HOp=L8j?Q3$ELe$QOktBiuuGS;b3|~CQ-|i z3t*9JEYnu&zdSo4%1d^irk*Wtu|P#e7-WH^-8^-bEQlzW40G@fe$hz6nbo6FYk>?O zxrl-{ItWr=@v8I6XE=bdv!T5G+@awx4l=KQ<+!Gw5j@i&z5rGh8`jDY6H_+k0iO$M zuWpb2`M5F)V_`9ZQSnU#LE-i@vce9K5iTd&cuhZYJ>U_x)aMwcME{|uhg|7eQ^_Fx>bUbt<3pG-=i}krUT?GW zaOp`)w-c2o>vvsFsfEbh+&~c{sRsp&+e-4jk%E`tA+E!hyb715YPJf#Sy#Ed*>si3 z4pRYf)b6~)YsPvO0V!kQT}nnivxB=p$RA%R0ibL19-s^7rKAqrw(H1cBQ~VJ+YI2z zga;*oJH+-CnG_?4K9QIbCm*y9&GWwJYOUx0f9CEkP~&RdctHwnh7_nf`=^Q@2m z`mgn@{p@{~b!F5or9OOaSS~(nVwcCH`;l`A+nK}~q}vHgipb6*p4f*i3K~L#=)gjc z%g@QO%Te{Oqf$)4$H9RggliKdjkrFnpm${5FJSmE#aP0}CL#U!l+b-+##%C0WR!80 zWHtIna$;n+t;9bS}*8J}e=Uu~OB~Nze z!)1bfgmtzM#9Uk@-XtkkhVNR|4&!{=GqudUY#bmkf|{w@@__WiORLuYlxnn zWdaN0Bua%yeyova!vX-PJ)65s!+iM*t)9cBsD7Hx_3fNq!M))a%Qd&7;Wq0Uh$nT$uG<$b2`#!xg) zjk)BCUK;crg>^2frSDLh9h#u5-xMhP0(`k#=<VRS$J6|$HjI|YBy<*+fmuIe(=@Pq zo3KM%F{6+iKH<~XXL1+iQGkb9aiXP|;LjdEyK7F5qjX|AmeyRkoV~-S5s~<{k12e> ztMfwW!!PWXxVyQGJuQ=DEN(Vr+t12AF?`y`vsBHhZSD6|Hpz9om*n1nUZWz$ zi$ez8B-86Y?3-F7FOA&`HvOS&1WWWX;Oq5WO!2qif*`wUQaTT!hq1c^re=CAS(`DG zNN#3N%yk!nSC2oHan`8XH4bTuB!LoKJ>bhX)(X)g?Ytr|;l4z-d2X z5)(#8Ix{A+>|o{$n4+T zREAO|MaeQG)#QPGNDZHiqSc5=mF`H6P!*I>f%&>YWBJ#=cN2pxtI&qXC|F~XIL+v( zO<-4Kby=mM#~hrQw4m=Ic1}+W49_agT#|tIR`s$m6vULj_WV3K1ElNG!Y_Bg^adT? zT+(%~Fmi(^%dK9fC}f+Nr00~#)NTYYF#4cQFKrsVrYcn^JlQnUMyFjF1hq$as1}9|ccK3xk7?1C^l@h)| zx8$E)IKEBSv)f0Fhq07u%r+hMizkN@;MUC0k+mhm>Zv4G5-{lPbq$TXhN_w9NCTpZsh8bL0M_wshYp57{}5@iH9p2IPt7NVRc(v6x%7EDkPK29+0P|8BE zi-`^|qlc~dQTfx|9is&e%#|lO)9oP{lX)pBH1?)D#@@fWWuW^0h}#n8+W&YOqp`jc zW%&~?pQLtUWi0vk%Zs&-8TRx_uAa%+O}OKRTVh29V)M{VZu5#VkVwpS-F$O@w*Ask z$ofAC)=0??V-qBw^^yEODWy`?BPp`l zuNj~Ic=a`Lh#xzA;0EZJnJM z9hPs!hSK9$a@437Ln%h-0;LNVUgEg~LC1FH;#RIN}{N_2J*#O*qTNcA(kBK~P?YidIj~!a)xUE<5uI)uypAqe8!db?WlVVkFP55sGy#%;IXzL0x>c&O{tlk zF-;kV8|nQV^yXSUM7pky;RJUk5wsyRsruH&joEY->KMn(3Wg2ZLmx!RH!%zfSoi9> zI)LTm1(+0|H#g}LX-mFt7BuTzL0{Mkz{|o&%*O+nkbNkiou2C1S)D)gqPozcZP?*k-4r{HzX62xy!NM`ZBUj`XL>weG{m~ zBT%wuZhD1zQo~C>pZ&H^{Vd4KB`8qx)Q#D*Z_L?hWF+0LJYb_POY$6T7FbGvglrFI zA3@V8*vMV~b!h=#*@-c)l0KZ@P8hvUuT^k; z(UOQe&m?z_Ql*hL$`xd}ea5w6w}kg6!7MBBb*;K<-1SyWXp70SV8shB%!YiYatX8U zh5>nQ+L-(Bix;j1 zP|dBCEUcH+7U+8}j5>f=O7zZ-kTK_GS6lj9NGM5~{aGOH^;ZXeI*9#P4WCfe@<$gW zFk6$EITZL*?(#i7i9=)c%t?D={un!POEE{XzSFWrXQ>v+ncQroPB!D)PBQ#5HbedbEwwxHZM&%?-@&W3G;|(8@BRcny&$Xqw0SMqW4d z2it>gH(tR0%B)R*Y@9HI&tvYeFAdjs&xg6qm#hHU%hhMb9J$Hoo9iu%{=?B681cjI zhB1k6RQrq^I^oIY(oqz2-cKlG>QBq3OOk74!?iHOkucS{BFmY>k3uDiydqP7M5@i% zl>OHiYA|B{!5s7c+HI^1|25>hemq=fna()Obfb{b-L4pe`Md=r=L|OJtE{TKSrWms zU2fEnA|T;DIEYEIF)DY?OSQ{S6}sG|9{){3?4sGd0CmPFos9}3{rJXl#f~S~o~<)q zpUzCv@#Xpp{l-qN2Z4UYY48@!+!^_xdGu9{BCq9aOr9OgBEi#ve{ZzeIRRxDE+u*>xtoJR4S5q@fC}c<=TBYg zCddV6>I_EcK1OdwND9%NCAtvqLam!i#LY^lTjk}XS9E@JCSvGBWMPoI2Azm99_c!L zwHvL1!>|Yl8F;3^QOy3K7-Z zCCr;c$vn2~{ER%(M@lL`krfOo65g8I1&3E*%g2X$6rTTQ$2F-CX7|B0DZ|)Ff6`sL zl<7c;N&dM0E2*a{#^P$dL!+iejE zqU!lN2PFt}ob-2JE-~G-?TRhw(&x9Q>osW7vVlA>nIe0LmvtaG#kW^x(WsESK!hZ$ zZ}b(ES$x=IQwOM`l-WeFvk-2NyLnBu6@?imqs4#%jlmnxaNta%Mhm{pPh8|PdGxCS zZgZHgu=DCi)yH&>F`x!xa+0|ty=&!o^PQ=`&rg4JqE}i+Ez8xJ4KwoQH$L7j4!O|i zv8ttF#(H;t_0Y%D*SDWBsSsmVeD(2sFElvTTmHk7BP`Cwz-3(HNt3;IgWFUeh4m;L5F*2}Q&v>DL^}={I@vTx= zoEz(>^Y!G*SU;?Q%j}Ujl1sLu}yHj{&KZ( z0$ayIaroAZ2y7qnKpl=aFLx-nbvtPb9d*;nq0o7RECw-}o z`N@_%JIeBHh)lrG3c-*D|M2FU^^Nj_67OtL5Y=OBWXp&Yr0_3pAGb}ePw2Q-&Xs>~ zwy^lc8f&`q<7&rrMpPI<)aGd@`)Gc^lNEkW3x%SsTUX&5ggTEVVJsGA~`CCF9 za!7bEqNG;r3`Kc@!Sl!nodc4_ySyOO=Gs3Gt^ILLhVVc&Y_0klc1eutANh7zNgW?6 z|CJ)?_9&YrJA?#P68VgQUYmXBx2#~X8@!yX3rW{#yUA!iXcUEu5=?o6q%hiq%{%Gs+yk(A8C@~_ETy3y|-IoU) z1CL^eNdqnZjwY!{B1ZtWdG7LT0unR3%3V-3bc2LAM17Oj)R48qV6fcW;(PK!ofVd0 zH!LR8#VMfA7MMsT@!!~Hj3T>Lpw=&nkJ>6_IgLq4LZQzh0_w+eFzCr8)SU%r^ssmW zuX)UeKb~H#??~S;yiuR&dWc#op&UIspBeoj0O*V##sPD zQB8;k4Hh%D8@VY;XUG^au()2=#8gW|3B3TL$LM8Vc7qVrbzL!o*2Mzn4{P=~se<*^ zkBUG4WdY>538DX;fu!BUPL$xT7dsJ@2a#ZYmmWq!nC$}uAAb1p)_X#Zy3g0YsaTBL zHXLPLV$ae^Qh~p@s<~Cd7sl7?s#+AMh7SuE+GMdVx9cRL&qd);7{$!3vHimkgaHb&P8S+{5s+CXLafK@hK=3(_}Fe^j-% zU!%NS=Uke8e-1X`9`JRl>YuA&Y@;<103`^?t^fFinK^i)5j851RLCx)iWPB}iQK@j zxyrFjJ(zWX4-R2DYgAo5;RKxBAoNzpLeG1H}HiT>>?HSS0N%$_KOM>kV? zHP|trqw&*HIt!O1jRsM!RZXQWnG~~mm!Uhs&|@S`92`gI+9XqEW|!Q7&_+K~e?K)} zxg@~Ed;o62Xf)6%y&kv7YHP+Gt$j<23$oh)V9b}=r5N{EQUat%1ypS9Ep(EM^E&Zm z;V`1|t+EbJ7r;L_nlnm((lAQa86GyndiiQ5OaVwhw@Gu<@R0IhYIti|U2H*$te9vC8lC6HW;}wrk=c zHD(+A{^#fGXq>Q0G2|NAaMtG9Z>=*@fWh_cyg*7wsHH(zaJ(~vbY#vPX->ccX}d+t z^uIYSu1*&f1n||5x%1qUHEx1&aEV)F#>pBy07^gnA3r;zB%X?hos*VW4I_j(GIirK zy|aP$_#pL&*kE%Q=GonI_ebsQ+beVuv3t+f=Bd~@zu%{1bV{mW?9||C*fcj3_QLzU z!s0uO^~g~jVLC;g|4B;UncWgw?Bb@bIlees43;5}F^$h!OX^*xDhvrLc}YhVcbD)W z&BzPGL0@7?oVFzZNF0;rt@^huk(CU4lr0_|RY2NJP5*!ZG-<2Hs(|OJ>9P2JKepL~ ztdSpp89oGP%m$=8@LFjUw5W>>-q(Fxl<(j66(uUtP0^=l=*gf&n*-&n$ zT%YGw!py>aB}$~u9wFHdVYbj70ycyr;%wB$7Eu8hzYb+kR=|ciJEofqj;2n!|6DPB@rBYg%OMV5Lm|Z)$?<$5 zEq5e>?)ahaAQ;J+!SV9iUXfHJzM*IWla6~8OCL7_n2w_ZI!eH`FMOsqjg9hGN{_5` zW{}0k37*DgTxq+R>6AD3}Z#LhT zyX3$$?_)zLBO8w!gTtyBJ3jB!LIW0Ax1y!5q%L^CVC9EvzcuKmqkNd%^k7Y7hWGpJ zKdr!t*c1R{f=5szq_rn*8-{T!a54DD+jGYn!MB@VyEM-N)(jO9xfDzyZf1!*NKnVb z(mAZ4Fmtx+0WhF%qDBb7+6JVJQGYmD{{Dl@^XjP&4j;jw7^hgg6efoip85!J8PUtAD=sf_XKmM4rhRscS=^tp<3af;8w zrE;Bmj*(Og%y_Z>4TsSJaVu_;Nz4*Ai=CSNvNlzJ<2vIQ!+_-a%(bgQ*eMIE|z`d>$5;W zgPN|CD9b=trq6wv8m!QXdQg1r2^dZvH7I?9DSB}WceZI*b|2SOsGYq7<82eys$_+hZAk zQ0+x_9oguuI=Tc7ufDpyA~Df-Ovhqi82tJ?su4wxtqPQl=bXh1=0_vRvW(W5p<}<4 z|MsY++V{-R;b8Ppax?>nN6Zt$W}TNxn8ry1oc_a^=>NmC+7{4i3wW7<#94PBmByn5)qziMF+J4SR@@j=z*_WQv4=1343!!omh29tZw3 z?2+@|KVGS52&U~q#m;y%;G$6&8$P+2;5Rpl{i5Kez#%#=Mem^{s*Sj0)+e1{M*f}q3U=5~XE5alsV*A|jG!4Ip(1}5WMg-+{ZRcFy8{Kk*nkQ}2SC3C- zaioz0OPjsBH`U1f-b9i1OEnTi__uo$%lm*?QcCP`L&vcc zoT3*(*{6Ov>OzUsB+eiKolAv%!k~@PHy~r8;dw#;QLYsth^33JCX^1TLqRgvAHTA% z=Eqxij3v}y(w0Wcka34Rkp&*R6g(6PmBN1X(aF8bVZbvrmVJwZr`u83HV?M=AzoY> zQVcEJn6*X}8R1I()%6q8YYPRKm6m>u-KDU|2zrMAhjL@>^yLE3H|92}t7!^3mvrw2EDrA!Cy_(MHuEs#6X+PN;8cD^qH4l>v45 zGoB`c?_!W;G1e$+ckY%!?@WcbJ3gu#bm|PWZ0OuWDp%*q*08q7cVP4_ zGG@A7BEm;wRKXTALO~1|Ce=w%1)FG4inE3=t`z1Wm*Ch97=@j26EhW1zqXI_-IaRc zCn0W@B)WCl8@W6@uuj5+El11 zq@7DygZC)@4Fg^Skv4^bMNyLF z*3b{@2E9VV}HOvg;*J zOM+2IqXf;eE>7>lEP2V|SIH1Bu!r~n+}W;=eYEH(FW3CNJ$mFx^JyogHTc^Cym{J5 z){2RzkkkFse^ZI^tFww{rY~+O%l6bX>4H=7m)MBQJ}%+XFNs5X0VK{i#~jHh-pM`( z{kJb{9V|vckL&&IOhn-PTnFm8DcYX{??5@QOV&s=7h0{F>iy$_zuK%bL^oyx_Y-Rm|oAqTK0ep(F0d)^s!0lOnvuJ?I8$8Q#g!k7(@%h_B&QM;xU6CBpLFO)FEwy_}_6Jm~-ZGehv$ci`vrKr1mUFgEv0i4Qo z-@H^;Se#|%<=qKq<;Fp$>~yHI#E2^cuF;evmyFBI%GAGhaTW*y!ivIiscr^PVcADJ zcr^GAQC!`&jGFnWXrf;8G~tC!#iBW!#YJKv?D%i8@ur_H0P^fZPlTs6lq}zYV~{}C zau&(!+-n?y%$fS8Q+KM4Wk3+)r!(&fC0BxI7*?Ps!5IU5`8vkQ8Ex|z!uh(=k%pP< z?XV7ol(O`17hWE>M{m1G>oTM~c0x8jb+^Kko9vngxi?v&2Gw;?H2v@yqr3xj8mM z%*$>ayhW9y3czO)KFjw+PLY-)y_7NPm09(5?HMkxnF9J4w0$3>rr3ZJ`Bcz!!eA=% zj*U>8Yyaer`Ak(a6ZiP@pwpex0Pv8y{EgrWQk(W{UJFP7_k$kr*N&hUeg* zrRe2pTfiMOGLPP|D(9b_2K1ahmTV2cz7yC69)N9wbd>}z?d9wr;eWG4ACu z@&3xOp{s?E?qfrjQ^GA}tcTCnXs^wyh=H91DARRE5?(mGu6QsjkuH_T+BmCxfn1f# zH?l6iQoA1dO!R6@|7J@;AQQF&l<*2rwdQeM9I11f=jQ*#=!P)la%t5>rV>fzF_r;w z3Xd+!AA-gRP|=P_v6meN`(yT5`B&0jZU!Pg6E@OA+|Y`Acjrf#|LbuDOQ_H(y?$Ja zBb|Y@V1j}U1opF=psPUv+f&1c^BY~xRV@>*gEwZP%4l4rO5lY?EF&cFcIS(FyEA6d z{#TDnlmHilrv6Iwfr6=*iKXqjwCEZNJ`rFjBqX9D4qymjB8&pO&9#5}eCg(EY)np* z(mshiLWHOW;!^{s#YXU0qy@~C_As(!E1^B&a|4MzV>2Ugf1aRjQp~Ys`XghAF)L#Y zyT5x}7c0VPN^B}vG&pg%b{Q&53n|=F-Vw_YqY0&i}gJ6uCTmN0^k&R zkj)s#)%{SWIT@-wpEOSjrV~-|pifJv#js>i0g)wg2;VjXPcwp4@IPOk?X19(|5z@d z86HE8RtIaY=rCU97G_HYVmc~})wim2jGo0~*SP`T0MR;Bf4Rny8A%pHG3sclh*R72 z=S>Tk+ZSU6(bj3E*e{BbkOQk_s&CNkC;R7Tb97W?=|s4h6g8qyzo9xTgrUk2fa1#Z zOU5IL92aP1Wy)=5>bv7oCOnbkH(VM^kLFd*YN0L5q)=8n3i+^_%~MMs5WCwwdD`ALu4!sCanf8?b%gJ3 zGLcj9^|fWyd%Y7N{kb6GdzH?dIhVK9^68@uUzFi^->O0;KZ|Cgg##5Z!#p2;(nN!0 z_{t~d0&52Pd?L&q`t?JFJRC7`ASs1*AB&Sd-kN?{$OAPesTHNue9rY4y*t$jCJEac zKQ?#i%Ek@Y7^2OvdE)+AzfmnN=ZcHDV|0X@ZOm2UKF&Iy`RZ%Gz2Agy(t+CkyVHVF zSqP>blZ5QQO5E$SA@f}-N{pU$XNulu>uP_6ajw^2i&f%t`;v6n0YbQ4PDm+|js6)g zTMv!=a-D~fu*pA^c=}$&s1R9QKy~^~{le1AqLv!^2Ota~DG_*%r+F{eq2W*&TsqOVvrDH1gr8cCoT{dO z%~~!edKMi5fWiu~tQTXpR7X7-*6DTT+6SW?PZ$UapiRE$dP+X%yT)du9)Xj`pe^g% zi?dwI@QJa;EJ=q(ALixp>o3)ilydRt@2H&m-lHiS)C6lHP6~7@F!_bGf(I+T1{=SA zRQGmxW$gbuQ{RF%&XRv(%I1_P0v*j8WbB4si~!z|JO=DiHc6soD;3{;xyCnB0!#w+ z7rO4%WL}8Ez_c@7_AqwxX?G@+-&^%f!?;7Uyd~gwk7rK_h2d3!z++whsXK&(|K6yH z8DT83mk$z$IKv=Bghl@*AOzOoJ-LiOmJulcB#C!R1yv!VrjGb~yV-(=j>}512p_R& zi%!(8#sjE<5v5X6F7L&f>_3WA`6AS3)L;uE;DQb;zVM`{e*qr%lsDfWIYIPBzUFt8 zyu?m6r2}6;-^H14n0AaB#O2)18I6Z9g|WAl%6z{g3vu?yacJn`IVEswH6(6QNL+kS z5?gwe9>3-Z`+%Xl7(cDg*_vKnJq(xuFC}#(%r$0SJCKuBZHKbt#u4+3*!t#=-tdzEPz>R`P!;1hm*9 zW`W#9&0Md}N5KFd{Z}?hmtZiT+|q5S5VQpTZn-ZqFi5%V8@YwGy!E$)BcnEx4ERO1 zx9V8O3_b`CWXUjRp4Ue;G{(%TELP~NIlc85JrWEbo(w3YC3d5!@JLja(SN;{K(^E4 zJLmVxvFF&8a3rjDdtUi*X`2l`9kZ1MKfL|&JZVQ_PZ*W@_3ePbshuqipKpk~dy}0= z%MG#f0}kVtaM>jOp6D1`z#BP1GH(oQ+Uo#u$^u?p~N&F8zUZ*wgW zXVll{Go*$x$+eF=L{kCvnriKze-3}Pk)>ep<*+;}!RE5InnVWoRa$576G^-?F%;-yR zr22`gGp_T2R4xxumfh|U3X~Gx*=sgEW?ri)5#AMcs-L_YgC?y-gB6wj@5ePn=Yj!< zG!|eU_XnSScQhPLk#1$i_3aH@-SiOJZI4oo(1eYs>(L3^qqruUX?Qv^@NEjK-N>cG zjnag?V3+%MnX7vE7wSUHDU_BIh=!(!RD0A4W%PMb7yD=HCXUp<#wA&Lahq#@_=+@? z-8DqU(!${aqcq4d0Co9(CYlfb20z;BVA$ib-}(A?_)IJSX)Z}lF^B=R(|zxJG@{?X z+#RBLU*@tHM0FOk9jbJf;xS?ytCu^HfI9IK? z`@E9paEP`81|n&fLGUF0!|EYA?q}XC)y>u+nh>Io0_4XfbM$6SFC=Dfl8Tn06`bva zR%oVEamWil?Bb+<(*iac7fW*n6-z}?S^tD4MO$>>hsMq)5mN3LRGETbhJ|{H7(s0+ z#FJ+k);KgU6Qz9@cr|&{t+o%VvZqipD9d*MHC~z$O=JM6r+vLt69PKfM5tb#4xvV9 z@I~ijUhw}OmA5IC?_t4b;drUk5<|gL%71qqfAjeoG=$lL z`;;HNi%|xQz;OH6QEr_ z#5$e5<>F;;Fog!CdsHbSy9|=2hiO7U0l^XwyZ&jT+$g00ZeT(zX2#uh&Cn`^Cp4gw z|7D%2GxQ-k8J8twDYT2wly=K_3*eSLVgetPk!|An;~B~^LwGqLmA=-s+ddbzQ`QVm zrQdqCE?%xWJIBVWs>|_+)Uf`|pwt#;+c4SEhrWsUfSl}0klN^))0a~^IjgjRWVT#7 zJcISpMl8rdxF*Ru9vBVaUQ;&2h>49AO4w;XxRF4*}!}K6=}gsvpP*NiU(0T z8X^w+q+`K7BOeSkf-yumcwA8XO^Sp#+c=gHq|W^06y?(UPQFlmEOEW23!y^XXH|*Ee9m_!}E(O1V20_j5;GR~r5CHm`(E*X4ER^c)k6V~u#Z##ts$pdC-{ zsyx?TmvxeclL`aUU}ypS2k zgdb=SBXvwSaLHrM{|r|K)|QfZS6Oc=itGs^O)vy9!IFdz*vbd4Aj7|(T?9*Fza zMG`wl<+XJlg%$>8#2Owp?Q@eKTV!=+g6sM`E~HUEb>%Qp9NRLEB}pm#;nBz=eL@dI zLF8i!;$?48N50{yM#xSesro1s3#>(B-S^FUwu1yyd z3_ln;Ib*%J?~b^MgC@!|MQ4+UhP_lh)NLa)23*lbT8|!uQqNtlvplr3)quS9EdXbxmYW;^&M3bHm_N({r-jebG_h_tK-;A6lH|JGkp>>8JzP+?bRV2S9h^5DpLK4Km|Az0-ECz z!}0KL>Z+g4bA;-Wm2+Pyxgq{&3TjWcZ~nzm4S0A3F!m+#7pym%t{-en?DUU=MogKq zr%FW~ld*Zqg|;e#bX*0D;wIlwyl0KCV&Kl=>1X9eS}XK>FU&;n;|eLm29rR*k^W`9 z*yJ>I29@v~%jxDMu6$z*UI4QQy1a?d@uNr(#DJOmf1RzdU1V6-K~Y@9{JkgZVm7DM za>zYI`2Ca;w>idq7P57`yWju;!Oz z#f>9@5)jR=N51w)Pt{k}a(Q6BEdZaX@d!)AsHWOaIAw~?>N!85Z6dbha(5bjx&9We zMrqup57I$OxG`gDh%5{65wQbNIRB&V0*yqDN|$XAGTHQ!Yq&w-zFt_Cw?2F&sj@8- z@TAqBU3ex8crsM17UvtbnTx{VEZl>u&~?HwO*P~6N|UjSv;Cz8^U zVxK8FZ0P`IKbp^O^ThZ`u1rOi$TaStKn%#Y(_?r@%esqp0)iyYOM95JguzZLc$|R9 zC4oUY@|~~`iG=7A4k9scooG~H%H~2TgsK|3Mx#iYPDeG~X$&59C^uY5g)|lXl|*Ci z+`0(kkdN75ka3xx)EFTu|Hq5Z zNg1wWl$cLN=&zWsL#yQ)o;yvlm}(smhfLL>*F2V^?qikwKCDjjS^azkPlWXB3Pbe@@7N=Msi$k}_ zfw?H=!_E2nGn>L&jOFv?*XIz&SCUX-G?CDQibK!)2mGT?piq*wB0K?KtaErm^R!{S zEJ2*x>t#x;i#0y?U0{}dX3oMd=D1OYFv19{gvdzXnRA`I`Q%?+nTHM;Ei0(c0)hR~ zg4gog7w;_rD@ys0(qZ9vm#WGUFZ)RJp09tA-^0_R_1{Bq&SEL!Ustt#_|U}~0-+e% zYSpJ$(d#z}x&&XsJ&;>w*RHKH8bNl8mM(ur9yDvVW_6b$#F)x3Tp#ZU0P3`4%Nj7U zIxmu^7b3m)MS2ttGRQk}G1lcy63JJfJ zXY0zpiLQ`ITNaTR!iFr>PG@-H2L6Gx&+_K_^^xoS)=<|yt{`H(&qt*8B5Tb&*?waD zv6k<|D}Yll_bUD$Us(B!8d;6gzbotgSVtTb7zA!Q-`y+)v~3f~`2@23`+TV?v;^OP ze4lQ=8?*K|Ic6oyL|0yYI}$s9@cnJ7bE|>BDcHFAGC@rjHG8Y&{{H_TVjE zPZj?lcB=4L6p{dZ=7H-qZajIK(SE6pGe{cS@m<4isZ7j=b8|~QT%1*#DCtyZEbzQi z#*D-$Wt1gclJYb+=7PA^Y0Q|b^50O)vZjulL1V(`5Fp@XOFxX&O&@?<^J0e$_in2yHe=Gs>{M+vz)q!P+ zFBXYF&<5KGgY3oE@qn<-zI{zRDIik98D}gGvU4Cd9{0|M8H_gGUn&fol|>yR_DUI- z%CHBvSby`W85@|0qW-(&f4v|kN{Ghz%b%Eoh;BK>sUD`tvwml$=~0o@QW(44BoAZ- zZe)v|#^Mvx^h7_vY-9fObyP2cjpM8yBlQl4(OjJJfUVxYb7>yFjSSijzg~wu_0i!R z&Q8i|N@e_IX*D`32`R#uGMOaqTB{gpMxXml&HlZB>NW%&o|{49RX*L;qkRT^C?3#%%?I+eap0>wx_uA^;tiCwLdAbMw-zS0`~ z`5Hg4maTqV*V8T`&~iZMd-Hf`W_sk|>9P5$<1H=l-?KIT_v%;X^LX@kOCxjf11wLE zWxnWh*n)fjr{>~Gd40(F=YDoMA8#EWov%IQwOy$X%^Y1t_NTVctC{h52PgNJeZ&%f z#Xc~+E5o@;sb>4`wjPNcfck6$iWOl1$ zEhT1EJQz(fe1GOsmZw3u#;lIMF>StlesLa+u`PS<6vuN-Fgm>ReeT-@QHk`_eu(!mmH5|M}e3yjo-9+q#4C&3!MhRsST9XKK3Y>-%f} z=X~wWJkmD&{5t=+=zP2{Wo$h3Wc^RT$LIFIW0B??iS+Y}I=L;6P1qa4x(4ed-o9`4 zW&ZpY`*LLb=HR_UQKnLOe_r@ECREGn`A;R~T#xE~xyH}6O%57m)le4=Soa(FB>c3jYx~9ur>fwvdKvqqu>!$h*^g}h9m=4QzKQims zbnd%$3)ft)^}DWbuiL{-%egUVGD*vl(X@XuR(c1i*;J!8YHgl)vE;;H;o4+;oU8(9 ze5uB+?^#6Mws~fk;qn_MVoEz^UHPoPk$uUbc2u=)Zt8*7EnSY&J%A7O3v@Dm9$KpJ zHs9XG1}k<=elt`ALtRI$^Q$v*2MpPWSj&NsX9GGx5_)KYgm`>Z(yb`_qlCpq)*^jQ>S!a@SWYI$tkc zFVBe3=@HS>y%+0y>$t2mcaPdKD*m){FIRs9`m_0}x;}UGm|vaa9`{W3+gf^OdQ5r? z_y9MKbB||~&U4?ro_l%ZFBRjEv8A$>#pl!Aug)@H>hNUMJ_@@_fznPU-oh(&Wjy(pnWeEXKTb{9X2|w~O@E{+&B$HMSNyWR0WK z9T)1G+;ebO*FD?m)~}ZycK$&7bZ@@ZWdCkmd%kR_5&qWv-|4~2b&j1K7@Tzvo>gOD z0cZ9Zm+Q>DNMX923~p|-%It$XpRBoi#8>KwdtK9g`=jKTeck2FyD!z5q{}=DEpNXx zf7jLfd((8wv-51K_35sod3+T!Nz&gaE8cRUzSqGm1l6mHc5rsflQn{lgAt5Rzuepm zK3(;-I)hH`De5jx_j>)ZC(q**zWBjbV&gnnBj}ksni~YLI^Dhg{z_fJH{Y%C)<<3` zY26W!^GbvJ)<@ag!#C^`JEv;3e$QhtZdtGg#L#^eEq7g*M}M=vJzsyx`SU1uo3*{W z(&uhBNwQ;KSC0+(yyhr`4tuIPO3T}xt0T@!4|uw#vB@62@<>-|y1S#;sHAY;6auGP zpPIE4;q~c`j0M{*<8=2+btb>@tl3z5*5nti)Zc})TX;!-s3Pv3^YeJw{Tlu_Id;oa zHHNwCyxZAC4v8ge?mM5EM-IPrJWhA6SwzIwxp!ZvS@Ij@Vx+ahQM_$bk^lYrU&&W< z;Tl+ngYtCYQ;qXpjS>7$XLjX=1@?7w_1!vax(%=BV!czJu9m#2$lRY<#LjKd%xC)K zCFyN`&(@ukM5`!i27&J8n7_2W>PKU~dz;7Zuh-ON%*D}La5QVaS=M-Y)>Jo7mAIJU z3+HEvzco!~F3diXF`$Qi#;s{OO}D|Z9Fhufx)V0vm~pp2d!a0>-s3EEzlT2Q@`(t) zbHlo1-;K%3WqAx%7W#q=xt(``9bLwZA6N7|F_Gw zVkmt)Y&O*_Kbp}$f4XDI-&=&=vBu-fPq$u}_1R|q;t}751HM-ClVFzYHh2$X&Y!mo zC4Y(*EIT8*_>Ogx9S>ma_E+XB+%*#m#h){e@IPIbY`H$-_l@#AcX@S(RdI&wOqN-? zvc=-;TN0}uu+n`?)(dK(;v{D8SxVpz;o{gGx*lCIz;Pk%9?UB?JFEHyc$H0g`p)K! zr?&XU=hH10>v*;zP4_L?|9HL<68PSzQ+Y8gk9Tx%OZSR!D385lJ+i~gjEXtWuD+S; zAKZngPLRc9m~mj z(_PDNv0b`#v14+AITGvJYUrM}BNmeL$fiyzP40cV>@+qeByLXl|IFc|i`XoFFq&O@ z(|z4XHw(ESa&X3UxBK9@29A!}!`k<`qIDGpz_ld6- zdc<>Qabxnk`=R)!uN_QTSKRwzT|qu5Nkz@`kyri2c5mz-shPqv`0?FE=9l@B*NpLI zT`ddZ*ov0BpDA5lo5$QaQuWr=*%sNYn)%Bg^?fAR`Tl_mHM((|>Ak?q=Zufj$bpT$ z17zpOT`!hYgW#(_j}it&z4unt+U;W0kZQ>A8C082}QTQ z=H8K=(V8o9SfgQgEcvDLHfzJojHWYIg8p(JKOD7N^J8t-h=Ehjx<_4>{MNgQPyAH* z-LiWu7y&kBjyKTu=h2wj_R!3P>&LX9?mc1SG+!Y&Rh2Xdy7(bAK?vUxy zw>h_6C2VF-cV>2OJW`yz%01_1e!w2Gfq6Eo6~wu!oOtS6_2U@J%yMpG2}k(3u3D`x z&eiXo>T%6S?mS;QTrF8e=ZO?|zEXd`SKqASb*`j_HF?70nzR0Qv26Q)G15K3G;{_H ze8z&MYpt+Y55G)>rXS3o@Ruw#m}|Q4nUx%ks&HL-s*s?rSTNOnywM1Vx6IV?O=s*s z@Tz7y$TR2aecSRP9+>U2MOWrB!t`J;or>jK^$iKx&baiO&#Gz~BUmx8%=7@+-~>jY z#=jZE+|A?b=;c3Gnd9|ob9SHI4vsUgG2WcD*jZy#Z$MO?Nz7=ZeCtujscwUTjM9)Zd#sMa|#`zEhj6V_d|L1M(`yZ=p|Sn$Emfc1WZq zBSQXIj~AP5*CI1Ui;dW+S<<~s49kKtVDwykdoU6b14D;&YsRP~OH5C94Nic$ll93x zU$0L#jMFFMVQ*c%>Gr2*nN%>Mv}%Fdj%TU6N||maEA*aZm9hdYQq3HUn5wyr-!bj) z={DTg5v%6t-1P2@cRI}H6-H>Qi&>VcxR4F~ZA<#hZ*wotSa}Na1eY~~5l+@955TpZ zy{S+;?=HPPojrWc(qgkzJNe_vtjl*xF0vL%Zr{7&i|ai1tu2b0J;`sMUg`M7r9|iE z9tN-OpSijFc#F2S84SfHd>ZA8`Zr^@Z*vs`zR(LQ3yQdskt#`IaEZ>VntDF;bR(n$5qnwr zZ0=qje`dCVTI{vT@XI4A|7gGdo)=}x-SaVQ@VTiR9@~iNoUG3UEJ zk*?-)cN4ne@9ECxwx6=sBzs+_it90N?_^UkHA>1}56V$3f!R`#?3{IWtSNI(HCocl zi_;(>S})Jb7|yIcuZ1eB29aZDZlvG+{#WaattD!GIL;3v)!D0WPu4WIS(SN5m23CM zR)?S~p?-wVhvl72dw~V_L(*wI_+tanPdO3rM-Lc4c2hKQq zY4+yY#_Z}`evX~==<-k=FDBN@V>5oNT3FH;s;MnDZaQ-GGRxWt3x zK3!wWCuU6TbG597pKxEFH>A&b)4Y~p!?wIQS>jst-Mjy%2d~sIQ7T$u2l~OgT$|O$ zRCTBkSvK*(CVf7}wYD#h757DAqv6v&#)>8Vs*cgw3Qwxa>gv^6C3nVIr;eOi<{!3~ zn{qeAzh+*aK_hm3y^g`~R2}MM;poX8B6gcU?i*38hUaw^VB)o|egM1bpynHvfdR2( zufi-rtz(An->IErP@JlC^FXZ36G1!Avm_s7SF7&3%+u#g=ZUXRB1UqgUdA7a>g)Ob?1|wSJ>Ncdf0Lpc&77ziJAd z->g;0Q+{}G_nXKOe^`UKZo1{DM!>)&*CTk)-|e&TRy1w44x~uRUKkdZCFnDUUwma zGANY=3S(b7eEmWD71oCSiCUg@hi7{Dlk9o6W^87`+?zX&>dM46Tg-ke7U?xs$#y6G z?et+Ek37!|KHnQ1-$v(>pzc`rYOM4>xz`7A=_%zAzdCk%=gAY)KeT(Vr*i`&xL%DT ztB0d>&Y%%)VZ=FGY}ftk5s%nO^zbPJ&~wK5!Tfq)o_nmTpd~&`UfXj2gKO@IN3F=r z5OkFd>%NNU#yoSbtUJiqbnxj^vg~qoR~35dKd!lrHr?9yhvxXH4s7l%`LyJut7ZH3 zu~-?y)v@C0HHLO#wB&2lrXIryu9X|2Lu!^C9;RfiMxpwXnv8)q~E>@O2swnk4RxIJFO;ws~VjSaHy<9C8J)X5yo5W{y?;NqnJuHSf@kICy_W1pW#h2L=8-WhYpoF2PZ z*Sz;$s_U%F4j)x{WL>v=ZOwe|x+ESOzN& zY_UGf@81tIX4WZtE6F>@Rpz66Nk4aRNb4oo;s9ss56IH;z5Dd5BNd<72}#2Ah9E3^ zpK@N-Orcqj-cM4=XCdr z8^}xC`|piH7{6@pT_0Jm3^#jw*?3dUUNYE?1MSKfA2(ktBF6UvzsS26(L4+ zoz<6~F8}h;%k?>)6ou=f)_Chx-QF2BGsJgp+B?48!C;2Axr%4I#w-5XwFsR=k6ibD z-4|0Y<<3^-pu-7z3+?vvwbvlSKC}1h9-Ey@e^6(d7vs5q&z`WooKr^9(^BK;c|o!+ zcKYB`)iA*`ds#hfW4mU??5Ye1i?4Ch=GOF1x7>7w^yv-KD(8*y>-_DiF5{AwJ>RP} zo#^eIo}1c9;vNs5*{|DwcP&Z_J02?@Yeyc;Ik$MCb|A5Ko;NvH@`d~8vZ?MV7QlQR z?OwES+WGB2xLUK+rq&a>4bU1b7dz_aZl&`b8~)(o8x_A-YP4joT#L;~m6ckM&LVYg z$*Zne`oRkA@Y(y8*_>IjS~D)h^vY}V@Tbv!bw$<2tSd{>-2S{1{;O&;Pm@7SR%mq8 zC0-xlJ?Ct0eX;%vowJ|o4q}gmg@a-9Y-*R2yffbqdq8z%?Ze-(*ZVWh;M!Xo3NdvD zEArthzMj8b#U{L%xj91}+Ng-<9 z?2vNStZ%KgmXR4&j80)u7A{QJ-LiB=>hFrL{<~%H#G&u7Aoe_TMk=W-bKkqvH0z#4 zJk`zvQ4Zbn>{T0*hIBMov&(evPwMO&bu7;th3hbc?>2WlU2weVO+gBQX@n)DDIj%;p-2);;m;VQ2{JNLJ6RW7X^V#`3=b9UG3cJ-gf+{j^WvhEW zK^=QI%e|N-rn7>g%cfQi=J`P}m#W$oh16{iu=7oxPockADyGXjyX?+3i!%z}%Zw$C zBK62yI<@Ojvi~!hVBL53kTulgOynD0iI_2oh3Zy-Bu0PfZV6mN`g0NNVa4}cpslwIhp3Q`G=Y}XO3&8rH`%PoMR1)^>y<_Kr)Q) z^Ma<6<8|+BjF|P`{#kZLEl0_EDKiuUJ#c7@^*NilyTQL%ohOgWCwYP0v~xUN42;pM z$gE)ddRVru%KhpwuGlB3o>{MY`x=(l@2n&BOqJaN)=%H6&wc%-z8|0Z9^d{*iw@M{ ziaaZk`KQ~KBgwhT&wT7HKy^3%p6BLlpDY;W`e_}NSvGg|v7Oab<#^~C_vc_~=bWm5 z^Sls!MI&w~InG!c@PTSPv#vd*OSL>>r#o2H%@|kIh*uW2uawuW@7i>6KaST6FLxZ* zRp}_>so5iEugw2??jpRGIwClcm$vfH_vBcJhc`9SF8-%4klz`bGk8t4rQa*#TTzd@ zaTOi4!t6C#kk&TIdIny^kXc3toHSjx8P94%hUlCl8s?{Zw|o8idlk65aPzTRAuq3a zef}h~vq#N&W_?_4mtk0Edq(ZlkV|RCN>)HDH~XUW+K=L~Msp7BzgDx7&J$X2E91&6 z&=uaTvueM{Qv3D@iLcJNBR>eluBoa#o1j{PVAn4BX{-JG)QJivILuvQ87+0zR>S$e z-SX<;9n8_IrEQO{#%!i+>kp)6?UvfIuv+<*o|z{m=WVKwv*w%E>?^C8)sJm{#J;#QLL%v`zL2IpZ-I_4R}ai`#fWpBGu*VrAl#ox?g<2vg! zorXW2@592RJdwBOO{@E8*XvmOF|mi2maoL!-2GHZk{*+qCcW_)k(C2FVpWKFj;N&m z(rK1SJS|7}bOGMTJ)u1&sy+NmRvQhJGn*B6Eqs44_TWAhO8A(i zXZAi>+m$D)&du7cnW;OZSSR=RMGSeS+GBk9TwU`YS7oub%zoU}e7ED6AI!*win8aK zOEtQ+UL$#zm!>nhh76>{-JNyv-E^0zPgfdm!rsi8cf3^RVqrG*SIt-VUSTp-fxPPe z-l6zk=Tg~gyd@#=HQkjw2sx|l`h|=2&0G`1kH)Cka_qoH2b0}+>e z*z2~IId?ecnJdG{eC~a`J#%e*V@;Ge<{7^sBtu@E^Hp*ruj_A)^<2%fy65#rB}?wF zZ_Zq*GrwJN)4t!eoqqHB3=9mHEQBMVQ5~}N^ITKx<~Ha3sOGF1sqlw4@kY>_@9lX^ z?Z+$2BajnJveI%Sc_I07`TeLaWkI8D^XNUXXetO1m9^I_)hU^2+~Z1Rv0Lr0kCzwD z9M!mFYzDDvaqVkWxy_Yb?M8_IX!Bm#Ay0J`V^yXS3D@g;t1e#LJS0~BaQ1-nlUq{9 z9J-6Ox!X*CINNKz8!{_^tT|*)wl>0ai&$~h{neNIi}hd8k>`7P=ohEy&-`Njh>X~C z#Qw~5OQ71C%bId}3N;VYm}$!TOA2Ct7^=@I=wHKq-09Qa@R{r&I?bidp{6{V|5kb{>N5XZ|@J(#P6i{QCkl9!e``g|P&W*eql zk2-U$vA$YIx#ZjP&EDzwrFq1DZIAO69X5vd>_C7PGg~COJev$Sj6NNG@+fX;-sB~x z=RbLbuhm>=<6?ufI}EC*3I_EVDu{At-*BE_v|P&zTO7 z#D?(*qViKS=rP~FIM3*B^EKi2VV(cF6C3pYnHE(}c9e(UBqv^usD z$e#6qL;!fIzE?H+FJTN!AfNS`?U>FT7uWeVd&Es2W3;QwwU4(P#^7#7d2%*yo*M~3 z<=#BYEg~_gI>ghUYcRUnK5%hUrY;7?X~KuW;k?gXQ~7v!%V=u1PgNX?tHq?a%V1mFAw4R@qFKSmV>Bu69N=^EpL_Ly&_ z;S*=K&*J5$2(j%udy4sg&pbiTlx(P-Y>X0|4G-cpV2uu#!F`_tBl|d&e;|U z*4Pf!#fI>co*W>5ygd8esBg{K zHDX)ms3b6FGPyW0LRHc4yBbEGn!gFr@HkH)t{&m(`I@)qXbZuJIwQdjf1azeo96cC z3vGqCHeWisl@^srFn!$`sb|>d&9ievtv%Z8A^*k_qKj6v&J#w_#b=d@RFb3E3!c+Y zFmtR?bN$NMZLUmu**|C4LzEwuX&}*)QrNQPBEeFYn(@n_e0h6t!B@BEr6)y$tA%RZ zrskz_#p+${ch9QyQ(f5QVtqENc~il-LL~Pbss`VQ>+z28j#?a3 zkB-s>cx5`@h#ZfE{rNeWO4zKZq*)U+~ z`PgyIHHwf!Z=J?uVNKRmmDXMNM+Uzo&hMYTUNLHpmV)h9eD?Thd<0b_j};QrzDwC8 z7eLKvSHrD*c<3pl`N|h=c4cSOw`S>+sgrwQ5GvibOYM3RGnZ08<&Eo5H7rQ$CZR{ty~os&7SBqW<++e(%U>ROlTk*Pu^Cz)IpZ zCGXCBUygivCp*7brF6mTI;@Cg{ol%3FP~h~*(FNi-9uiQ9vkPapH$o5Be_J>=4cna zjYXVlh2-C4@|F)JXat}`d%=FbBvxio-VH|hh(0?cgerc%Z*7v{WPIb%fJP<3qdG+C;KkEn z!DJCExXu_`6h3~rMi}+`pP%psLaaq!n z+6P8Cw=0`b>?UGy5&l}qPF|m|IfEe!?{nvYrL|zgV*c5ttxx%o52Z zSt`Xs|EZAj-I9+DHjm=PaN7sdf2u2!iyTuk>u)6!U##;iXVt5l$6l^~^K*3=1Vc0) z)MBZyU^BA#hVQ2@KRJKXnU9}SQR`r5l(r2Wvhv4E(^m$sbcR{Ku_ zHz<;Pcb5CTIYy$jJUlp)^wuCh-i|A z@^_fZI>_p|s8Q9mf_$6%fZ~p=vbye7;MZ$Z878QzUi5Qp zk@~cA>5~7RF1eOn%eIm}MS2{&X2RB|tyiP!JQ}>3}BTdg_9Fk=P*DKl7YUIgk`BRK_Fdxbj%a(Jz zxtkBCbI;XGT?4RCq;}qug={Tyt4sIMEAu|Kdv<5&v6|`pIj$O3&!{lCNoXuKu5ngYnwWjwJJ|71Tws zfH90p7F=ZY^UL%9s#<--x>F57n^XMAF%bneq+u!|+-y#J$iGeKnMN4Yg?g_7ed zEI4YMn^$OEVdmF`ria!m7k*%C$hcTGiC=vaY)lXB&ed5{$4Qj3OwaKb_Nr0-r?<@N z9alq(!;!ncqTgjFcwOg;o;`1;pB{}*AwSisHRclem+Mn%4Vd57u}?4S6{t5)?*~&O z8KEnJo*$LcIAj?~=-U>NZcBJ$%+9TW@6tkUH|Unm?6(__3|k zR>|k-7=qUoqxBArmbX{ecvLH;rh|{l2hZ%v|NJaLGGTjf_+Tx=4l?Sl0o_x(wr=~i zX?uBCYL?_H%^C31cZHgn=p621IdNgF$A=M&a!8>`5db;5jY+9{RBv%kGEF( zD>W+?*Ie$K}jK0&>2|SyM!W+ky zx9B%VK@gtmYBB!4`8~;zL8o(Pr{@X-u-;j}v6j8&{kGUy-jm<{JiNA)RmAo3X8wY; zPJZw8@ap>$bJ7#?&CoQv+FjLA8f#chq{Z^8U+2g8!;jQtK9mpWE-n zKnIVuH^PrW&G3S69gzWPXY;U26r>1VgO6`x&mKd)cBJ-nLx1Ux)4yz$f=b*W+HAXcUq z->$k1Up_94m(_%fyX>8tQ&h>}OGcd@+K-jB*U|$^4OsWEj^zK{tsaLFkWD#!K<5Fm-t_X*dbgW!dpdLwjZ#aQ}z>O__) zd|&-q{S}R!8Ri_PP=tO!? zFpta8Q|a;ai~+foyrQ6Mi{Z05Qnsu8!&R;vw`;qR_quB{y)9 zpaVOs`;>b9;?Wc8c&sbmI21Ku z&M?>R2CJ-j5+y9vHOEr6*rlt7AYuBIr$~1cUmPuUWBs{h}ao>7J>asw0V8^jc#{ofWG=pXN9{!Qy%q;f$1br)(GAGXgTYek=ck&7GP)i5yxgnP^;#?bJz1@8QI+*H#JUHPOw`DPe0s{I@_e3+ zwdPnx7vu~JK2^GjFFvtqh<%JcJ$<3Rg}zuI>3HAXNR&rC<@ z#^ecGcLnty$kc0u^bCR}Ghk?=%1SfqoVp<~IUu{ANfe&n+V}BwU3R(VG^(*PH*DB> zn0`B(jaqB^(u;K-3y-xpg+PD_y<8Rilhwmd)3+_$51#pb#Wfz4Fu$>HoiB7a?@$lr+$83sSc)9jT#;Jh|@C0r`g z?)Ma9oz&>6Lz!#28;pF}ea9F0wIh3adyM<5_5J!Nu8a&%&vw||Po~C6g`4`fSu%)# z?No1F%S|tg*@Ao-k-xh#AQ^m+WL!J+*_Cj4$LUgC#ap>AlsvstF`j9LTQkpsVODp4 z+GkmP^CI6&59afFHGXAA*>`LH?O9d1@a#ZaS4w$yO*F@9Re{y7ov@u)NX?i0SUL1J z^i+M@Yfy|OZyL>C;h+3XEAf)MzN#I3CC2Q@m$UW9{AI2%nQ=0nb5bLbO^sO3gS_pX z1a{7)((|u;CqCb*|N4xPc-YllHRQfko?sSfvTyuJs-7QTx~|{wIX$i$Yxb4|8(A$U zR%K0gh!*Kd&@S83r_0N$!;4vKd%iGZ?0$ysn~r(B9Fw*%K@)Q3X;iWP38Osye9e+w z)8bPGB~N^Vkz+kxiGMw#fT7LfyOuFK3c}Qm#Ct5tN?C6@*Xa86c|OaG_RE>c$bH?g zzVm73Dw$ih_Y7HG_xqyro`T2KzT;;cfgZ#zOs{`Th)^WC^zq_fpmXv*OIN!xi z-bc|$X!M5*&(`;Pv&LWno#A2m!D=LlpW|Kgoif5#UMh`6lUhe?Ld00lBtq0@zHQ6P zx>xJ&#d3D~C*po~?ZVS}uW{^SUANQ>`z5wxBbf@~_}mJ?b9hit9(x8mo~^%JI zL-qnp?;jek?HYMJh$6;d6()>9$C1&S8PXSkF3g`ehShyr$4BX+L4 z-ga&(!_->ryv$XR=yXi5LF8sv_-j29ovQ2TRz7*-Pjj|p(Jdw)!$_=?x$(*_3yS@> zW-KM2@VaNR521#yojBcnlTYB(_kiJs9$Bm&hNWC{YLGCwqA0a%+TRqybvuiW|+b%B({UL>GF&9Um1~o zTVGgYmHwAh;Sb}Iyx#`ynnZh;Yra$Y^wBJD=T@V_srY8^k-dD1j)yA=@0A!l$nPRb zq{D4VUpv50XDClRz%4r@CPj`sssK7S)tKLSzK)%ag~kyZCOeA6u>Wq2#6R)X{gZz2=G?l@I=!ND_VmHN=Q3hy z9j`LYS1lTu~cp#^^W0B2c=V$8#=kyHQ2F38{&R5v3wX^r! zn|cR6d5s~Rn6{8Vq-eSFs*og+w2I&#Ky_LFt=Zg-Mj`|X=Mwha)+f{D;# zuys%*$U-JL7oa{J2#8WJcwlWPquAW6pfbAfm>ztwW>%g`U5+^-`KIh8)uZ)r-01<( z$%GbJ-X~>rVjKkrr=ixQu?m3~G;aoV8R7JRAgu*V9Nn}S8qc=Hf>aekpszu+q|)7_ zPg^7u$6lUCHX`}yGn2(5$2C`PGIu`vt;v3wkZ3(U{&bxuILNRpcT$S7EiJRDJjG1t zO5)X!6XLJUp|idoYL=Gn5%_5_!ns3`Gug&Ji33y z`70$kpRt}Wj{o|TMTsDidSe~rO?Qb)d${aUo>&Gv+iC_t16^E~WH+{)A6lSA^ImL6 zf-Hl`6mp%OzEpoD5<=ldPkGpsZhojvLe2816S2sWK+0At`jMXFZ~93EZIL86%T3W& z4Utz4m6@(rKuazu??cPtiER`C%kN(x9>r#Ied?dN3pxtk8S z^t0+SZ%qG<=S%L>nGG(Lj1ak->Y-bVIOnuXaWf0JeYg4C7O*M7%V|e34deVDTOyRz04T?R6sA$p2*Cr+Tj9M7H^z^_%5@<$ZYB1G`Xr6 z@XRNT?Qt6AN}6)U2-3xmA_mrcD-U&xX?kMapu!+&(Tie{ujCJ(^Z9Oxym@v1`d*UY zD>^AemKF&A8B<{%$&%NzK#qm{bc+ZNOUWCZ11%ZEbhBc9kfJQ~8RK}~kp5o~_dlP= zcawPf)Wx)IR#W-zv&MSIG5q@f;4yM+=2ub<-*rWj8YZ<>`Rlb^-VJiF%O^2V7+2F{ zuq!5o^3mMX(A+$2>1mmiAB|boDv*>IglrqM)~H;Mq|IzI;fVQOjxKZ166v2}%r7nL z1<}Bknq{%7@?Gs9W~VP|u7t(t=>AKAByVUp7!-uXiw@n@vWx2xn{;qkd@pE~rol$u$HQq1H^I|*Kn3aU# z1We!)y_<*ptrqI)KM$(-1~+)MRMqYGoUQG0I5d{cd{?L3jwVSk)Ao$suFd(WSIHT6 zeyujjTMg_YSGLDVYJQCGbMqC+!<(!EX;~~Tn~a-P-PqEwK9;08I~f&UV#}*leeE-3 zB8Z){PD<_LYLTICmH(2X#g2N>Y$HciJ#;pkh#Selmj9~A(uSTh(xX|wsD~RF$%-8p zB=;CY^c8DYr|IWbG0pYDmoCg1>a?6i>eQWHCi-IOsX?PsVWXB)ohII<=YC$*T(+)n zzWid%)V??0a-9Xa8V~JXeo38LlAPN`SUk&*n(ZC&uBk2T=MSF^w@ZE7qm8GmXtsX& zjJM#nTi72y&2o_1)kYX7jJtVZUC(Har1|2CwWPEZi6VziSfN)s@g!#B-*Abev95UR z*ezt&M)YMp0r{dZ&7+PIw^;c^HMd+}t?^=9(P%CVWQAp%8RM6C{gKQ^c8@7wfkfom zJ3U@!GNX%EYp|)Bmg5#huWrPn+p=sktkZ2QjXYy!K7JPI)6x0)TWr7=K?AF@yjxzW z*^HXJXf?lLtE>Co&L}-c_{w#xmQ577v6v`WuY=4@XLt;rHjnS3!*!_)23KXyF!;(= zPwq2gJP>=xF!(x+w#*z!*)lf|RlXjF`f7capTZEq73?+N!?gU8+ozQqzVx+O=k%0# zpmSHUuNJcr*?sy9ZN<5A`;3+DyrE>i0Y?I;YTjnqo8{f`PG0TIlG{A^(AnB%yBj01 zv}k}kHvWEXW12JWGl%>Famhiw+JJ|3?bY!zZY*x<2fMqI0j2EOU8itP&|P@{ijCC# z8dkxbY7LJ_btXJpuYuRRU!PUpe03k`jZ|3rEbH8d3*%KI|J-uTwuAbm^Ce9-Y$WT7 znC`{-n}xPD*rR7_+iupeJj;5xE4Thc)!-Ku1l}rJ9384v`Jm%GoHl%9oUs+*YOP_< z*0yu!XC>+{a%CgPT(7-EGIF{Zd!vqGFa4-6iw;p^mdA|Hea@^16JMe(>x}s(?>Dmb zy-{@Y6-Lh(u1L$j=WL{Qeya7w{Mh1d2k7&4Lgp3W3s28_2b0-85&PnLJ|R;$I^0F` zbo6)|hv&Auj3i>G*Y~p$%jQ;wYmM2pf4&_VB2k@ho#n4(tsB{9hN&09tM)UNxx;+B z=$Ib8JZGF>&DmHWc|9ZNx+R8c)%fV8IxoGoNYU$~UJJr+EV4lSS4MQ0#cbw_T;Y$%4gm#CQPZbr z8{S;`xqVXi?$@n?hKhtDl}AD*Ta`nP?FLrLCDiGc3$k0R%`E*mQp@yt&ujy$;m@gd znzL|1X1Qnp6qcz#_?4IHFW?dQz1;JeO>;A7S)}&v7GuVG_7o{Ve|Xa5OGA#m!6tV! z**_t?dAnx}DS@wZKihm=LY+F>n?2jlrr*HUVLcCOc2Z2ZMrg8q-yd#oN{^en&(>S{ za(5gKMaUZoyT?-a4H9YeG*R#kS~fC*W8w1SYUyvT=VoteUJVSa_qK29ElBI7T~l5! zWkV^DGMZ$S0$zBst;+Wgb%V?-M1{+`#XvUzIdoap&7e7pMAv8^mx4G zNOlKyD&>3e(Wp1Gh@~CBlXQBR{pmx~Mof~DHXjY&64g&OltWvXTh zdt1z;bmrAtI-$5`wL9cE@M`KErsH?gurMcN5d{jym+BX&ebieF27nRNQ%;UzC@bj#Tyw3emy zRN3X(`zf#oVnzhA^KxHew=XM3o=ABX%;0X@E9^dJvwRM(D`D~*kH*b!%y|R)mHB+T zzQ~m}f0r;c$t_w73b{c^CuVkkq3-@U>jY=Am1TT#JvQ;z=1t|!jruFO(Z4be%fzILXHk&Q^i^Ls zb1_%-O`5qG@>`7Srcwi0P*h*_^u;{C^~Cz`m)LR6k<(c<7$2Pzv19MG*UPhB_KqEo zgGTqv?)aeS9j8>**Q7VoBTLC|s?Z<0z|0+gnUClz*v>`*VdufkYJ6k`6{KueS^DUYO))WEWve*WZINA&ZB68qFDG}GTQx*R%W z?SwY-9-bm$Gz$FDR}}TGJ4Jn?yj!tMMAT%Dzyb<TSS`6o!p858jnF8Pai}&YS_>*xNzeGbv|{`XWAc;v z&Oh9yx#j{Ij9d}zb0u+Ct_z5or8wvE#U?p1zCIF=C%=F9W zLgzR_9haF7C@CoBhxuF%vnXx>CyBeL(`Vcw;hI;8=9ga!i95tadL^VGJmnLbTr+10 zJ{{r+R6c)Cl%cKkma{<*kvIIH7y>VHpM5F$> z8WDqKez-k2jZ`ymnJ@S7nPc(UCIATT=#%maTyKh6^V_+V@DW_UjbU(hOKNP3sfD}eQf2kN_oT+ATnTkA{V zZQ=sfife}Z8TeS@FR2ez-=1#+KDbuK!Rk{(+(pwX7y zf1WY}2sjND%tk@$jS;V)hc-Su23<`K7y3P)+%o@PZ-)9JN`n*7Py}-P^dhV#Fc$Av<~iSq@(`5h{qg;4##(JayX z?aR}D(>+I~xL)LhgvgCuC*gTGoMC}g3gJ78h4)wWoFPE;U9V3T8Mz#c&1XJ3mbC&vX(TbMw)ks1m zxJ0%)AGEara}m43Cg3j)-@k(iMhYA*nGrTP|NORi%C<=U@&=N$iyjGTNq~QL*9Pd~ zM6o%fYAd3htD4k1t%n-*`X2`8v3dW;H`SwS!qy@OX0{;4&1|Qx9ieR_R4zPTobwOU zQ?y7AhGva8an_dZ?D!aH{|C-JHu`^+)IGT$Gk+ZZ8GUP{YeSYAYp`Ou{67L;{>(kU z-0HGD+OI;(G7NzCXm6YN&GL%O1P^Hp1&h~DB4dzsn4Rjq@64CcY$Fbm26qw%u?+kX zwk|Dx1Eqeb9}i>xTyvL|9wa`r zIHPR2qFpeOJRviagQ%V&&E3R0C)8i># z7s3+pcj(DlPxE={=JP}ir91<+9Nr#0=fl^JJ{;E#)hyhAOWyHeX%4-5yUdR~c7b+FtVZm3toRF`n zthYVVk5?N(0BFQZgAJ~aD&kQF@|LcfPU0o7@=x{mKSf(_d;$UBc=9FtWPO6z@c#{( z=!0_?$q!<4|9Mu|@~k!1>97F!8|$$uVf;YPk`q0<%!=QT0psNiOCf_i3ob|Bf89oZ z^jhzwC{KINMmS>1Hc~`7rl7?6K5^N3Tgjl13#FHo1aomTHUG`XE=bnF>4*B4(cwS1 z&m2vu5t_fznOyzIjd3Y?N%-pPx(_{h&3PDc1M}o8HCMgqf7TbG)8!)+zp@Jlio_&Vr z>B?2Xq&hm8W5ueD;^B^KImk0LpBW;3qzLckzq_e_$9W*K^3_3%FSKez+Y8?089xZz4j2dXb2H1CKpJ{2J9Ywb-+l=y6 z3%iyTn2ZN3tvcVajktHkLpp7ow>3g*&3lekkqgv7RP2g<5MXzuS_yGGFn2+Vs@-LhoI}_?e!><1SRn zCb#SWJ1Vtl`h|m7PsyDeB^kYW$ssWJZw~7dyBVSAar$2{{jF^sG$q)%ZQn1Hf-Kfh z=4#Hv(OECE6x}E*-e7e`I=s|s&Pw~=!fHmbdf7A3O3#{JY%-&q`4SRhHG$m(<|>pC z<0WosJiQw6c4%Z)vh8WX?XPtGi-><~=_aDmXNkI)3sPTX9$y7OQb{W#GDrMcUi(H% zp4WdM&02fbT93B%XUT7G_tDH@bs6MIi~}!|N>k#uNe>jdLUx==$ynDwA;~Kl{ zvCt{Bzvd+tTJ*!d13ufnr{O-W~OU8iP>wSsF#omh}wX9-8Gsp@rXpIC%o*ymxRHJ~VZVSHN&^1fvp&|w7 zh5tpai>>L!jIw}Q^BTdVL=*s$7 zM|#W-^hK{cYxW$yC8`Tbp&_6ZE!ks9ECGM1Ekd93W;ke>2&42KMm@uEt-H7SGS@#> zua~q1p|*m8;<-9z*`ytS&x+yVmB`|YECCR~+6fPg`{_5c0;s6u$HznRj2D?X{lhKqMJEi;)D6)?4792 zE4z$!{NB-KXv4BI!n3s_mue(^v-Y_2aJ%tr(tBC1RsVVcomj{;++8-G7*CLO@r6(a z%8*^bZ;+Am65owhXg|Cla)smkoiQs``G0FYH+4c9D-Y9VU#V|!rA0gbc0Pwhr~+Uu zNCX?9B1XMh5%p?!D>2CJ+3nr`b+x4a@oD^=UwAL<=CL^J8kg~-)g-P#)lxrr=XFu= zt7V2p8+-+`;ioCG&f^X5>)AZJ*1R*qW%Mvzzo}Mb9%(Pe82Ymm;4FWE*~wq$5~{^0 zm%!^&!Lx<1HObn*+>nMnk15CsqvWt!i_Pcgo7pihd(vsC$&6wz>oLexP^(18a~up+ zS8vTxW=71wjIdBfnyy@5u6hj@8M`&e0qS7KA#cTR|5r%HIzv`r9)XQ;*{|jGC}Wvn zCCmhl6@~S9lkyUA(2Aj(FgXY3GeV#vubx8|@_iZ*dQes^cW`RnHo2Ay+h~ z(Z>>*WK<}-y3(R5SO^th`xn#KdInUWGCqHWzPsv#4DF>DA6g48u=a^O85!MXWisuU z*$|)jJsRd~ALe=5ICtE=0&vb{_iYGiCT7vC)izL_6V;G^J zzZ&1da5V zvl5!WbTdZq`>XDmXU!F?6e>&&zr!(fW4g9}&VJq!NW0`cLwKSm{(c?1GbjE(T>DHF zI?WvaHDrWl_&Mfck3*dfEvzMh=2LT=b@Ub1M={IoY@ij z6?)@3bXuGFjeN~7_>RxXCsW610SR`p1F0R#z!Yl26$6Q|Gq;w!@B|B5MgsgAwffW)R_sGnlFIh_X7c|14+SLuOg8MStjb#Q`Q+i+#tZ#>5meII>COW#mGjOV|n zTZcg@oHx8cNewdQyCrI1E}uv6EFJ~DH89iLYr1NE@%te3dK>^Y?cfRhei7Vbboj)q zu(|%N5bmh&5Bty!`2dB?X-nte8Jd;ajtl>N$jxDvWr0R5A56H`k77BZ#|~asPdpeu zG14@^8T4>i>6gaS#W-~^Zov&WP79=!qqDJRq}8~EqR%dpf34?gTKQnY-09N|Y0p@e z(+inSr{>Y}hQ=``L0j+=d%Y{HMuO8TJtrKD5Vm*$(b`W>g~spbGh_d&{<|{GzxhA< z4lEcS!DU$gLj{goNp>cKEaJmWalYC!BUq|M8w_>|tLwK-sbL%E%u zg%Rt!0qImw10Wd?Vhq3#1*BAJI3#*0FG<)yO-cX4h00;)`T`D7J}{s@F5!GB%ejw~ z5XxSajGjACD;9mA#N+V1<2IWB&ts_bjd!Bd15{#&L}pon;u&ugNi%g{m|PpnPd9p+ znLi~d`ZHJB@)9PRnE=^wz=KX|9G8IY*x-Aa53w#>pT409@JhuYCQ#e=w-H*Kbw|Wj z-;xQ$#}Tgerrj$-jb)AjdPTm3;(uJRR{j?v?OJ=ey~6Tk=mvXYEB z5-EHwstf@0l>-?8=9m?E#-^sp6>|Yvrj zf2)UNs6s~UtAQpWX&hl)=0eh@1U^O{>+onreTFp*({| zyIf|zq&>o4dW7>l9}(eDR{17{?V)IlN2S)E0f#N!y8+}7pYOTrnbIoXoj_;Yk3Q?L zDp$BY`cm_wV425rK=k!AAN1q(o~B?Hy47+mqS#kl+Jq+rF6=Wsnv>TR!yA)9y08u@Te&O*}ffilx&V-&i(w(X!Tk=tPQyU2XYlQnpV|&TEWDcSW5o z!kqIu4R6D?Yp~{f_G@28X_#D}9>AOVUjLN2?R`Pm8ahR01`j>n;gX~b#ZyKD7BOb6 z+}S_4Xb7hr0>UeLcWC!mSHTh9%V!M!GA8l#{M{ab=*L{PPJ^N8l{|~o^6B&SEa~0+ zWRLwN{gwP$+ZyuhwJ>>)7xSJ=*9Z7})<+JXOoP&MwwxQ!8eDe348>rtDbF_~_SmVt zk=8ht6VNN?&1p064~;_xr7~bIYK@jRx^P`H@jeePl6dc+wL<>;8y8L^M*N1sHWE{? z9edwP+JrZ99Uyt)b=mz2;Z^+f9Z51*dC@NP0I!LR;SmxDfBpWGp}#e}jq1{3NZdd_ zMNZd@O?9kdoI$^kBidB3NE#rj-_+Br!83+G1CbQ_9f7|rL4_kEaqZxyTIDJ}9OD`95#~2jT%^bq?FHxE2$oMrpzZF7K8k&yK}}3{x5r3p zPMx`qr1=DTqn&KUT1(|LwUP)I?6PmeClX)SPklPAKfLGC12Q~p8N^tTJoTRVn^BIQFH*S?6qK8-jnbS4RZ^B1g7EzTOE<@zd=k0-&s;eE^96J>IC=& zvfJx>Txdqy?&@O_WtWXdMYr<(hp(d*SeO($J^)9q>uKtu$js#rQ!vobcMkMCRJyDJ zt@Ma@1|uAMTVva$D>wy~X1?N@^!&ZCb*z17Qq6psIodEqh6M`xJ)dk-EHV?yhP zdpmNB&$9h^t6*egh9VZnQ*J~vaI%jE(I_a#TG8?)`qM7s>*67tw*=4tcDy^vq?`sf z9w`bX9&#ljmS~l2w~<{xFKaWJXSqNT*KC{Ck*JpFT~oX{awUhYH5bmJM?|Q}-+lb_ zQcpqZ4VsYAsO_;7*HmD<)#EDL3%sz|kAcQxZ^WAXw#FJh{aLScn0w`I1V^~JYR5dh zm!7_mT<%4Kc2LH-DqNrMy%BT~3m}o>^w~#GmR@?7!5ER(n>uXb@R5wz^&CJc-eUP5 z`e_ZU=P>Ids%V_|MG-w?x9}7sB2LD}eN}QfS0W*_7@2T(LRgXZ-a?&G!&1TO6PeI3 zZ!MTs6(+`dCsuJ%y4Tfvd1GLTPYc#rVA@h<#U91z1r^>T;))Z!gRfBA?u>jKv&7zf zW)G3Dxse<|x9vmc7uR`&^&Xor!adZ}Si;wVV$62d+q39$jmTIR?e0gFgiRK?zb$KAm)9r|dtudIBz7653sUW3GMc;N$yn+He|Dy9#&pURj8+viF0O&`;2 z>ql>Gown8W20oTLVicVsIHrxA2>1;oMQ=zRT>M)9x=u?@uoX$M@{5kbbD|pPnoiUf zJ)OzF;F~f3u1*!S*YXId4PL1z+#+96O-_3@-_sZm#YKNu6`y9^$R|PXU#tH_V|ve> z{^=7H$?9tA<~haS>_uT(qPe2}=X+x(DZEy%fHc89(n4 zTs7}USnJz#ft3{O!kZ@1T=E_)BK*R?iOyad$ft0d$ak$D$Kdwuw`CQy!?yUBpGK3k zJA4b6-y-#2wN`T0l)0B#5?btE`( z!l&{Dv;i&uRKI~dzV@!JK%HwJ&kCiW*vN}N;lrW6`>AEK*yWRG_p$6!bw_qLIa(rK zA)^5I_;MRw4eT^mi4xKSJc_w|Aq>%MzqJo;#|F(u?`l+^!jtuNzDZMZ z4^W~|G#bu=@y?l$G8*qZnmaik-i(Ve_1!t*aXcck#rx!!weSw`!%<-G8Hg^jZ=OVg z&_&ee+>Ga$2Y=&%<=6i1@EPKV#vfN?1ZKKD|E-y(xA^0HZZ=kO?rqKLFp8~dU=ZBu zB~@!49%=q~YYe1*IByOgsp!PBQ&hYE`kRl`&!X-d`<-tS)un`q8l4$nYY!JbcrNAd zR<4=#^PD}@^uPTf^xC$LYcY(7X6%S3h_^q>i>9K>d5c|X_2|{?Mi;fZiqsN z-Qs(jN7%?=I%TaXv>jja*Tl_UJ|O-dCLes-^!?jmxA4UkN8)vS2UptJ;C;yAp&RV6 zUn+Ps1!kiyt})^#+(%X$$hYu@&MeCeGWQf_e@--S{`0i+M7-1I;iA~rBlE8 z&)1`CCmw_$kZiG$?DJbXvrNQjK}(!7%=UGzq&rNL%>q(?SXLQlAw!=$C82=@WlFR{ z5ZtlyC3P@)?D$MeVSpDWDLbGZnDg|TKhl>hQu2iz42iC-5>W1!hs znxJjS^OrXl;Sj6Aq^!LkE!LKPY;TKti{CxI>~Vkdzkl0q^Jh zIo6_ly3kCjkN(=GzE+Awod5r0>vBHX!FamIncRzJSnMpwb1bM_Bzlo0xo*dbD<{3A zALg9_d<8xvRxyhyw_JBJ^yxP?g_N30CE($4CWf01Bm9tU*{?-taMIq`?Gw z_ALY-{O0%P`~;j&hs=!Gruju|@D(pU=mUvTO3OlH7NcEghmWLGY)eRe8*FFz`@Y{a z4GaceWis0Kg>O#JjQe4Xl7KQc*YNFI?_5R#`c)>Nrm$Z6hN~_{ejV~Bu*$_2`|H|G zn5$pMm_F{7GCp>NoO4+T?SO6_GVz=L^lePMpCGHsFzV>jPU5AFIDIIC38qKPo4HMz z2;`y;Fcrk&U#}xt1u{-&Ev95nFuz=xAAK9MZP%vzxz`FAS?j->YW>^n?T?sywL`X* zpk-4u;t3@7@5VhUw?2=&*39utJloirpuHQfO5>;+qRE~qEAQ!D(N1R|g0p{b^NWOc zQ+Qd91(Cmz@T#=8Y-s}Boz&JQ%ov#z!=gk|ZwJ$|?m_xcHXT5XQLuzD=|i~#j?yC| z@LO#Dzw0F|kPmOr`j$V{6}(Q~&9wKsx{klaTc#p_r7rRL^$3#K7~$U-Uc&S)Q>3P> zY(H=_D1(D8T(i8!_N3{`2l@@)gfAfS*lc-`rD^-W%{Euqh5@kVvgc;YOYey{PNNSQ z^YW`PB0U~T+cV$Ss4VO;E4JQvi^6oazD`Q!vb;7>oUZTiB}Vb$Vtwrs_4tL#9UZ?e z)or|48SUs=?dn$EFz}`Nf`WUoJUBgbJGhB_T8iuIEyeYnq`1DeMRDC`o8r3FkmA#C zh_9c@Mk@ZE$!iUzC-dq;<%RrvgTh_j-=yw*wir@&;YMgMS~t9}1#@f_&UQS645VzBZ|OiiMg_CC_PBT5rtlnbM-+(FqO^w=QVQ!c%VsZ`I?e(thDybp>5f zn?`q+YkQt&n_8ZEt=7t)OB=C+y4`YZ-`Dc@nLDD@i(>SYS5qd$!E8@~|E!O32)KByu<4(^cmpW@ZmDh2o(NePlTafK9MI8(9(+N0BVFp~BF5iydx$A3q z3^phtSrTHNl9rq&)naUn5JJP8ZGEk8|>M-N6sI-|2Lr4xHuc^b}jugJ1i* z^a^LyYsC)`3wr~fr&C}xWk|Rb)SdM#$OV3_tAr5F-lnHPYiQOBK>IN&%iUiyYVzE4 z)|49~KU?rL?tJeDF*5$uTR8EO_ru>2)Oc3t2y?>Ag4P7p;P9klDS3{36u*GI?GgI& z_k(ISd$8CB4%<&74;Itmm#}$}SK2YXxE&**pNu3P?cUcNWDMQV2*;k)YZUN1=JGU4 z4scqOUH(AVynyQsxMaR$mTc5}wD6gi*lxuLDL?mlTO8tP#z1PXX;#iqdA)Hz-q{<` z8*Shek%aYhy83~h_*C*FazI+S-0S{3Jvxtek|8tCt6H>227ZN02N6GK39-1zYfiLu z>78vXUMR9o-w#TQJn&w$7OtGH<;3;I8ii5WF13Nbe-h8LoPIZE27)momLuUe{oV+Q z(8jdN3UN<)>n6NedXR5KQ&Lx0R$$hpXR=oog%ZR09gXl(`?Pycf5A`WpR#1LQ*NA{ z&J-H!tDYB!lX4YWZFNKf4>S`t$S~>$y3dtQL`P~*i+segQ1om4oMfeN!cuAO?EPnR z_3XQ9jg~Nn=FT~!4%gu&mci?BeEtSquF;*bZ2z=^77&6br%N|<2VB4oH(SZx3eAVK zyI8!yW?#FSGIS#khsOpVfX$T$AKu^9)C^nfBZT2y$vc-4@xru0j)fEDsp*0-75>BP ziR9-6XvywY;dk;?~~325XkJP!gRnPnS!&*y)n`DGpiu2{}^ z7FoyB-;aO8Zkt#i-w!Imt=u4Fd#WY2*=m;(+-xC^-}<7(_Yj8?LJ6|L+F zKA^dbbyuFqNFGtpnb(7UC_fMWC)`jntcNVJQi-uI~%Ds&q z&mmdl=NJjAg*V7^5@MHH!HQP-m2!8Z_h*=ow`i^BxxT)i=ickGePYk!y$7kU?w@IV zc->;!)%IWCDbLpEU$>ZcTX*))p2VUvMJCwPsP zPp9A3ZmNCy`4@dM^Dt4`pTCdiBNp1erTc#c-4tLSIJUhs@6oOK!vdR4sf zc14YU65XTZkL`&=;!Dj*5GZoEOZimECvGqJliXDl_)O7tMq=eH@bu)nLEqkwo~`AB zH%tVZo_z z_0{E5YWBDfruqCk;=?1gX626_Tf6V?ny+A`Yt)?j<+8)i9Z zwT}mhtM+xzDuaM-UWtHTVIdcbj@LEWX4bpnLvHF>`?{vZCAbAL(C2nPL=WimW{XR8 zWqPxf`~>sIsy5pwvMMpj)!2HC=22^y&w?pvmNo8%sCp2;w@8boE!X8GeMC%kO%)DH zut)@4f;-cWxE##|$BblPY=!Aj*FmqKBJe>d0(a1bXB7>?Cv$X)gLmksWGn@@cnZ{r zyjAfxqp;cBS4uqv?}Ak%HPa<%gpWkGj!c+cr?rY5T@(MLnhQ3?c=RRz6zdM=MIXO` z$I18ULSJiQyvmmKdG)^yn&8{7WM9@zIESQWA!Ml$EP4NheiqCTgtb*oCqW?a#`T#= znwqhuZNZ!ZdEOSSRB421@~qAgCZP~i!p-Tru_ifb?WwCtAX&a_0AH;c(7(r(=by0s z*|nD8BZZ#>{bT&dn1oZkZo*m1zUDzIFSr0cM*e!OaH?&E&mBb#(~E~aVcklq9G}3g z>3nUe)tTHFLnJZ%{ncq zT*sgBu~qKeSL=np8lk$R?|}%Lo^@?z1-Q zwT@}CO{J4nwriQ9i>#NBvtmIUYA0{rxaLzqBW@%bnK}uK;x`i#FPewbQs^)R! zecdOHw^ouhqC*+2R4pU2hMw%Tx_5zi!aX2Kk6PVVeVEvYRio-^tSGr!((<;>F&!H= z&+W)G(H$sfRCq;%wwKN`f2r|Y`DkVvh)Q&eoYCjp`(IJD$2G1k>u49i7)E5xEUSu) zzF39)I$rpvx&l4v|ChVkSyJ?ySk9>bsic~AHERSP`tMcP)am{GUCk3{fO_;|-{K-# zVcRo}&I!of_HAONyPwCToY2(U6M{lhw5HAWYafXa z+1b-Yt0&0-S=t+#o71_sq(Lb+^qE-OdBSx0K!4HBsDtPBEB4qm+VPS87xw8p7|sFM zmxY%4dn)OJ@DU)XFjuj*{Y1$w@czFR&(Q*BJsxeNg)#+@((wqR=PS9c0qrvi*%dlt zc_zv%dbeO|xo7?AdRSp%or@DWqM6f$b)5W276~UA)vNF3__9tPeu((a@}5rNXQ;J- z5^#1pO$~(^dX$i(s=#IE(`&lNDx#kd6}vin#viX*TzFMnL;vCP=>8kJV{bRSf9|H9 zcBBG5UgtMzP0G5k3cMXs#)GjM>ex-$-BUziNM^cxJ#d8{K*zLe=isIH=@h;i`R%i= z6L*56?2VJg?N{5f@?pzGAA(z|$TL%G{~+3( zG1+tqjIbrS%8KrQxXcOdf-~W7(0XAK8g3BpUjUsDfXJ^psMC`+dGR`k9<{h zf~bLGiVb?Mexf_XqN!=Iespf#Zf}9-*Y|8eM9PznrSC@|zge#}O_$a!LEhFHjVbsX zqYVFM3?mF4&_dkiBO9j+$t^4gf4~kQ_(xxQT6K5+Vz1T;krm za(v<)3;p$d1|8nkV`YDJWRl(l$y?U;ctlD+iWw8Bie`P`5TwEr5{;NI9d(U$HluXb z+1$Ilo^gGDZwdMo6cqH7wsiKb*YpniZqRwy;$n+0!!{AGLSNZ6@PYW{C{q}9kvtE5 zKBSE*edaR}L%Wxl*c?xRrrCcHBfCA3x6vIdEmaTV40wS4xxTfJvtnf%o#?K|9s$}D z8+G@dxf!$*{Sc+?`#OilV=Z{$?%vrFD|UC9y?~6@#DSL&L^ZJkmWlNleaPG%M663p zAr3UM14kd~e_QK<*`4f$ZM1)zx7Nr9$%?=f`Q%v7#p3XYRa~^>3yxw~QK;^nPYJ@2 z2f>x1jSkRLyz} zv+JVKSbG_*a`{5O$5=>B+T?9vzKma!tDFRsI$~N@X3J$8%P^k{+Yw zS@UY{#fk)3LVK0m$k9jDk1~Ct6=$q?T~}8-3d75xMWB4s>v>}QyyGak>OEH5(I8h=k+G+YDMsdZS853vJ^>KD-P(fnVYhN{w6{BB8pHzU51^;GG&Kj6= zbx&*g^!`)*Z*4$Rz?U0Ut63Eo?ov;&oIg@~kY|Z=lr7?6tz+Fial}>O#8cKPh~C2w zspjHd>UR&YM11UY@~ocL|XHOUM4vw*XpO!*EJTI4b)|3++Kr=$`+n!ukItybM5N8b94ODc`Dh;1qGT&~;oi0+1Z}ECP z=ZKb~&HE)7^QOkMJkStk6jhX6&r9x_pO)Yh?^Tqj4|%>DTEn$zwKJCc?EGPFsv52A z2kdYhG+puvnKhNx8PR3r3!Y3nytzGnsgx4S`3cq96i2o#prNcNOc#$HXS+>eJ$k)` zNkmGHar#^y?@SJk?5B&Yst^N|d0<(@)xNGaiYu|IT-CcBvqT%vC#vdY-pqf0XO~q| zxR0gcq3V5#?A%VRn|8Sy(v-k2G#)K=uao?ewbDp~H^J}4N}cw%vpZ9Wp$pa^N2?D*fASi1@l$=9n1$`3Qk8| zXvx%wADoSS650!YM@Yb%pt|#ly)ii_$io3e-&x)O^if|N*6i4r!|Zv+$1r0ME6FQf7!QTRU>WSlQ#J)c|>o1w<_?((~2ag})df9ekSIvT5? zCf=nvtaYJmUOYcNcXMj)co(Frf?19AGxZ(!i^rbyZV<5qk;LMKE|5o&tuY7m_P+ji zwn=Szx^Tam2zGjNijwk*)eLB_b9up9sW}#oa?%vCAK6 z+|y6yJnoB~B*e;xw@D1y?gzTjd-WsB9FOIy0QSHxMb?49RNfFFO4W>a_@1ov!>LsZ zRY<^KX12Pg?5B)N|MWCyx2Mlp?5ZDC{gFC7SYtaXRZl7OUk-|`3)EX@t!1s}uxh2X zta=`+``R16HJ4S}y=)7;>o)5-t=gPv=LP>XpUB&LnOqL;>aN}tYUi;$wWkUGx3btj ztLVaWtm$5!k9tolgZ*>6^<2;*XUEVy#SRRxt=2O8NOX$%06wr&jV z_5ri+GoE7IEopU6T^wmg*X9)UXmA$l!ZKrj>v9aaw6ErP_pJKI3t_Jy1XyM5t+*pA z8@JipVN|dBUiSQt)!Ox4w7#-~-8-Q_@EN=s*s^y0Ag#8=N-OoA&ZyO*CyHc<%7~MR z^0`{(oF7*~zu*D~(&I6_rpyy?XFo5kJ+yb=?VcyQ{_cuW;mZ2?itp;bXo;nQgi@}o zg|~=R-zA!X4=K+^TlIDtYkT(AclG%?`XahX%c9C-4pFgT-e`bnqZM46E?(Eaa5F27 zWwhLH=(o;mIx4HuUMl-8YP)z&Q4;$Oi4JNsujVByV)Qs*U;H79sj%gDJ~U64-wCTSub|LpmqE2xap2C!+F^WCe|w+IB#%?jo+m1rcHZ%g zrEXE(w=my-E^6@0aGE^_^Z->!H>-1gkHr}XYvzTDtiUoR7%{!nVgmBbRrAzx#~$2) z*Gq&U`r!{&>&PUvi%JYfBTuSBq8nv~jE(Mz?x%_57N38WtQjk_P1$n1lAB0T^wAN5 zd(Bxt2s-e);AuZ9`3vX5fh4R{Ky~P>VkCG-Mb9I9CfH_HqUELZhV0Kn3wSP1av?W` z50$pc#`zlyv3A%>Z)hyy6GgH*?~MKXj?O)X`$L+Jd_f`aXvvwQF>rPzH;vaKM%%(X zMpt64VINfbEG6vJ6>(^uB+K+ic^@616_J@}dam_)HG=TOWzh#U=m%@J(BiSUL;a6> z*BiQqPSGRt;)EA^A~RrL4|OkH)tmPqj;#V3QvYHm&w)>Q)(gBLTcR~uZ@b{H(7;Q5 zTV(Pm^gHJ!KApX;5qO^h3qqH$7VL?v&$e9r!Y_2i5}mYSfj2E$TiufvG=2`F$X$PT zBbJMcMcrSKBEZ&zF+h9VQlnNYcLWw+JT;;qK_E38yavF~9u1MOy5 zw=tH^^1L92aUPz7pw3DxLu+B>L0>rT6BU&&9_N`A-B*wI)H0Kk@5L;w#o~Nq!)UB^ z+89vLBtMTd%G@18P-ln#*baOEMZiOP2~CuL#cnd@MCY(D?q}pOoom||N09+GwZ2zV z)!tq4L@Q18=zCq%?xHrbsQlZNcSRr6A=&zLWAmhH`8+LckH%PL2S+oa_QwS8sh{v2 zv11=zP=BR=@m-c~{VCS?K-argD}P+^V5P6#(STH@Yk1HH`pv69jKTl(p0WfXswWzb zRoAuW3Jph&8Hc3TL7K!U_?G!39CuX*o=lf+>L=dQdI7?vzptz$K598?wUX#=tG~T$ zr7?_xT+G=-M|5t|Cl1>v5$;&$nTPobje*%OwjMt5JUMWyE~#e>s0a?dte0id};=f8&Kz{5qclHs2u)E>ja&`xCiP!$xC)D1?nMk0 z7^hPx5>1-xLYej{;&Ea}^{9Oh`Al_H(q~q-Gsh=*b;fc0mnU9;9oCPfz7&;T=P1jS z%UFsdX>tvCXX~|JO{^!oX{mHHfZwgDtggz(w@-Km;;;~|ofTZ~Tl<_mdJrEf-Zj^w zW?+o;Jk1Bk0?V`NIY%4ZjWzPR2je$VMb9S9BA@Q=#JiUEQTB@k&r&9-Z*!bz>Ge(C z^Z-@u+rSFVzVU5X2eYBQD7g5pewsq4G8%MkRxwX~U%Ia|I~R?TwK`KQ_=>zi1J;MwQ$cMl9y6%E9bq_vOA~PlXL%fM+sb2N*@5I@HC}4Z)ItWRehwQ3o z?j*hmZ)r`Qw2#^SSW}%N5le*a?&`brLS}@AdA=38|y-z zUo-dpIXG&kcXcg&A{FeUJqbrGR(1+5f|;BO8@~SOALu!96>;bkKC!MQj-N+1Xh+QE zwB=g%t5ke@mI(K{!TBB&>tQj`qZ#;$U6Q~={w1p1kTQ5J}2H2cbRAS4($fO zo~*&})+bsNq@7M3EFLJmvN?<$CPF!P@_1AmSVwaIftEVY2RRr6Ii-Uf5bTBzw%*+B zDn7m77{r*zY82}SSR-0VMhi!vx600+hPUkG)AQnU8zc0Uq)C3SZQ+^d*?oPtrp$RH zehMwf+`CxWbwz~iErKSkd}|H0#aGYJ_S9&^l{+z?wvOUYh7(`#92_=XCAUp4zR36G zI`1`?OZE$Ylk-`N;5qooI)1C!DGju7sqyVn8tJi+TlN^bu6KDd8ZA5-!~)`NTR-`Q zw19esv8}z=VVkh8zYiCfMXY4T$?sV3Ve>_kTM152{XjepjM%mJKp}Jud1IZz>ML-9 zYJsyT+f0t0n723DP^Z=Pc2-$2z9t z4^b8;Zkc{$wU76f&(hP6y)*QsHc;U}vmfZ^bcGnlF|IAM)-U33M}O$=t(9F^Eljh8hW-u*1a?L&FgJ-sNPS4RA9JN&1nRRWI z%NmQ(RX70+hxC1hzB9hxYeBq=G>T|Klk_G7^f)3(3<9Te)whm32KKL$z?_j{rRIaP z4}OA0)md!uo zQ>!lC7teL;j?;kNtUY`I}ao9*@P1v-=%lRA4>kwkx|%E0y-QfmM<>yv|= zb=3Tl};f5x(tDs{+#aX@_D{>SIgldA@kDxu8Q*#n3Qzp<=URZd)kvl-VF zJc8REUn88jx&KR?mIuLhtrd9Eh*Nic~J!t+K3uid}vbty}~ia(WS`dqZdbH9Al z2xH$O`h)B3EQ#l^OU84opmwX3==9emB1#;pBJ@=pfHYX8v=<`|;R-sju42~mN2bJm z^c}1J(#JMiam^mNkY$hhTT@(BoLBSfDXpU!V!n{D9l5SvEVTyNZ`%ehj2@t4 zqJGr}F^}&#I#nC(_G$ZYUW&A*gZ>^fB8!C!#L-X>f}m0C1i^-zdd7-E`!%G^Q>;6* zqtkODFF8oGTJ=JG(>YA=YFRDFylG#9*G{O+HnSFvHX>bmj=I6Fw7D&b*@9?=#fQek zZhGeG^IN>Lly~Ft#n3_P(1B`|_=fJlZRaq~%*sfmQcNXlFN=znnqJ~sdmg?*W7=2q z(8|}4`U{}lAv9}0?TS+EEX!(KLtnhD3+EWUqDt~X6W|uO45#YPqfb%QAfLOtps#U3 z@{g)4-oS6O@I0|F)}XerYDr{^ZKTh1|G6S&J4I@EBK7!!eVQY0w`DXU=j;L58ky5~ zUk@J9S4M3{0`G~zCr(;7I&LpzPL@C&Qcd>TEiR<#t1)X!9RRM}{& z!vn;Qy_dEW$D7O!y3o)n57XH~;L)-os&{3e5*x^Bs<^l0Q;*crekyn>`Oy;FoX$Ig z<#$HoCwjhASybOJmU1U+oOti0Iy}5zMU<+ote;=%sJqcUTVciysq5HCP_8$j;Y`XE ztsn=QPT+m<7wEwhHsWZbtWh|offH149gSFnrW5E3RFk(%J4UUaz8Z6|Rzu0G(eQ%{ zO~K<*%g?HPsSKE3;`K=)3rG7wXPlU2svTQNFI6$7iinPJP7-pVM!INre9wt-)l!ib z)TA9uyY}z2T)y8xR>%0BHQi5x`rNF7F9ia2(SVk;Kdk?=lb10bxr^$n%zH&?$)^roTBGyPLf`! zd>H4t7E#Y^v31<;x_Y(-vCatJhwY;3!-@0wldP0(wvMXLx;ns2R=n?aXAIj!)v~Qd zn95aeFW+jYa|H)oK+@Pp&TsXkPTgZ}<}y@ljG(xJHs)Ej>bS4naqBkg5pRk2=)0|^ z(AM>)TKu@(sz+u1Sb{Mf{mW>5gU)M5wO@^(H{!;$4D3bT_;6|l&u9;JuB%{6cNK*n zNOr7h*{2jPt!NwWI~a_y+Ii!sIkIY@F12Xa+duTxro20mNb z(XWyYTD^#8A@VVj@GmHYBwg#ctiQ=0(mN3?&(Du`ToMO(*Mfbev*GXyvTNQ?w4Q)H z9s&IyaIULNY_yV&7@bO7XI>0?6jF@wXVCTU9j?^iWvqjWmJXRo zwVJ!y7ttZ!t{-h}>wRpz!85H%wJ|jE&UwI>(L5wK@uhvP?!TIe_DQzw`u?r?-TaQE zYQy*FO`*)q&?K}_+M}I$c@_DAW2R8|;>#sP|In0L2ho{aH6ZHCEY1j%wi2T(`{Rti z+_z78BpN_$^EC7?&iO5I_Y%RY%8Y)d?q*&f8oN7HMzFdA0*1w?GF|sZ`^;&554O&;*}?RdSwr>1Jk%}1P9g8S;;r@Dkyd2j>J;Fd@%{>mV0OcxU#+jf=11= z>#vF8SN)}@V|}e23EKGI`eS-TYxg|pXME}N5BP`FTtCs1ySD#~eaW5B&~*!V$UWyA zp}F1Y&e|dhQPfvckA0E_qK)){HuMzUR}0p6Kaa0w2peN(dEvEl-Th9ij(&8}aSyad zrqNMHY~XlxJu>=-Hh2e9e;>WA^O&A8JX)z{_IG*Knl++|%m=*Dd^pj=P$Ur9sxc(E(p!; zw2CK}IHJ>6Y!Qz$t_Og!Xx)A_TjwU%^aUjym$=4rLC0z|_vh1Ls1>H41%*H>X&q z8NCw^&Jj&7wJy=i0%qx+ol(G5M;6e8 zjOORYPk7Z5+hlD1Rqrnx))tL4cA}}qXhmCk%P!+{C^1F$%hF%Hvt8fyDg#zPTX|kp ztU)AZ!hFyu<}f{vPlY44(R!YVH)NIYfm~?TJ7#@*JT;tmbO0h~hLN)*x@P@8b>(gK zhCjeg)mFQa;U*N(OI%y6U14+1@{DB8G9CFdV%W}V?TWdgAH&wMYEr-HWep@QL_?;l z=DDYCsz)+V)^F;_5`2a}o&Tn~4YuR484=nKk;m%oP<*Ouj_hIPEGRhS zUW!eiyLZ&HSA>iehm5jgy(zhG+oDI%0=|f|y912_9$Vf<5q@X=EMkC*TP@&K_EN^- zS$eC-5$ASy)VkyjgBE&ol@`pJadTD!e2-J~Y7d-kS24A;-hCRG!2+xr4bSV7c(k@7 zBb)uzq_3;2TUgunTvDYBP9u@jJZExfFzaE7U}(t_&pd@Sgl5Y75hFn*nh*9B{N_v_ z|842eig8j_pd()@ESky6acu?IAeMq>2S1PvCp{9+6y%`4XX6AN@Fj3gZ~q#NkqTFn z)19Y0`&RU0Khk89i(e;`anwN%=|iTcnHk*B435pgD!UX8ACK$hjheghuEFu1LQC;!~v<7soGYpW!b4lHT2HLaR zmN~%ZF}Fd&j6kr8fkd>&ZCxF$XdJF!?~%CMWyVQVnL)p%-yDr4-FqyEiV~c~jyWIf zjb)C-iX0h%A-2XVLP+A{`YB>w+c_Gj77;<$E#B63Be3qOBG*2DN6&)|SibH@J*ndC=25ZVBGyOucGD zW))+_3VS`Pw=@shTZS?7LuM4GudU>Dd;j!!nq*EV%%+?Tb?WEr-1*vH@ovkUckAgqk!QUXWtnlyOY*U=s z-zmMYyR^ScUIt!SgOLRzL^h&a8BX(r--mHr{A_%K6m-y>H``EOhQs$Hg{^+jQ7{UL zPrL0_=(}2Mjs?X&X?437=;18VJi&%N=Js1Z7ZtyVS=we@gQJ=}Y@;s+fJ5Z{!~4(u zR(kw6?qV@W6MY`FovXI+pZv%t>aA&;cf>_#-R8*4SpYc_lJqW7cy}u#3nlf;nl^)( zHTNrOM>DJ29yPP3?Qmvwi%DMMqQTh3~^+wA@+ zcgg?uwy3wT`yRZDbXK&ozEkT9EwCn{ldwCW41}_&7hU_249DsW}e#V#%xLpRSrN7G?^*N#=jnM2k zC5`NoGnMf|YOR$*{0_h86MNeAMMq<*t4rt>UTM`%-$=ms5WkZ_OecP;G2H9N)4aS9 zo)r_$$GxdmXw069s9)Y&_pEmhKb72Dtxx)9RUZ1gAL)wgHF$;j#rI~$U_F3ut6?G3 zq2K_%g6Nc(AE^-8arIX^cQO(1r}8b%H1ONJpHH7P-Wfm2iDz)f*Pw%V1uMhjLhEB) z!_#F8zhC`3QKEiT8>?r7##>uv?YH!o7(zpGX!-c_ql^*=QD9DH;e zo+ocTo%o6k{l*z(-{)R=Ntz<5MQwWT(rlY0kqQh ziPbdj=^q5Gw4$%5DC)f=+Ce`WOz*A|AY<8I)X6!mu;$hJoHJ_()l%f0t>FWR$BfjM ze2cwN>Kk<^MrZsshpY9QN<~ z9a_g8?(%ecf%X}Xi#1{s@OC~AK4B3?Jy-XvXS#ct?_aa3%*b#MonV$7ZM*Gu_85ot z)OelqeNQ``jUd4KbGql7QlS)o{fcV)n%C!I#wJyzayLSTNg!_9_TI-M_;F|#ag0y zN{q3wrDyzf!wc2AY6{$c%sX~ag1)|%{)>#+ddWAoY3WK`*J_78W96B>J*%^1;fM8C z{z`9vVr@BlG7#4~tl!2;{8-awIdeIwTJ+#buZu=(c*?4y_gjPvUOotl;cZ&y<3?ti zPew%|sZE{kdKZS(85p`ieIC3-`&mQ9G8aD<@0)wSyknG*xZXQp&Sc#}GVP$YH{r=d z|D1h|I)}GxWG*{Y9qb8oBri-^kF@g_P=zXXVL3A0x-6+ z8iGX({X#?-8TnW%kh=18Rrugr>eM<;cy;>6&_It{qHBDFee!(a9sPzUD-vzu8?6IB zRv(W=Ash*xD9;Z+Q-gT+!Mc@JJ@I~)zO=jXf3_BOg+M(%a?(C_aK`UVJgfe)Mv!_# zL?J$gWo5sq2~AH!O|2#w4qY#Z9MQ3TL5iZ^gO|YI~Ge%EzDLqd=l4BU2C?k#M zQd(*xeG#(oD^EE9cap2)KHvwL$(pBBe~IfQ)gyRXT1tNuZP#?vcolu=^i)fEOi$ll zJu0rPdn{NP{lzzP(3)|7ZEN+W=-YX0a5%pGnHWtUmo;B-&1bqTwZa`W5$lE9Kqb)u zm6xER^S)g5Dj6{(UKR_5*Tiwv-3udsSKa?#-a#^vq2Pat-|%e76@H@LsZmff#Reb7 zNNAdKMn|5Dr&>;TD_ZEC5#*>KxT^?P)hCqV?U2>1^OLh~4E@E1(&yzWp{O|VrrNR_ zD6mkn^OMl?x8e$t1nGlo@|&(L(+|-?*w?8(;+U2%s)E{$j2io8ghv|9Jxy`;nz5ZX z>A>UkS#74obMOtkj#%!@JL&^8XMKZDNSUi*`W(MNl&drCUk z)&t>waN_Cr^e>r!bl}u)BR)g#$d+W4QK-U*oAW^R&4&PdOXL zh+qyun`b~3=4av-UKb7bR~y&WS7aV?j#FJ+&o$?XT2eNeqp%nqqr&BgB>iRW$(Q&> zJ3uo^qdEsooLZjODzwuc)N(Z`$G=P$-_z)Lh(qS|)N4VL>WH#BqoSS+J>pGutOE~@ zb#fZLD>l-H9rAMI0B>yF)PNY7D2X>C?4fE3urJ4(Ac;oO&ahVQP z5vk!90`=lsi_}k+TIK%xHa+K?m`$;4TQTfvf>EWhKOlBxOmLBLluKz}8DoPx@Qa)a z4GdgT+zCRv+6BEv9pd=VtT>M_5fU9C+T+f=dreO=zgjDKE^8yxpWIYi@muGrpljmk zb^K&+tIz?qAV(xu?wg)2Q;14XY2(qi`ru@hI)klgZ7fJ{SM?rsv+dQ9f8A<53t?&s z(7`<2Zi(%eoVoVqgI0&saB5wd<-dw|tnF7alb$%+MHBGz#m7oI=Wj|9bq$-S0?CD@ zs19krno)O3-WuilJNyR8*yV~mvkiER=C~qFodl0g4v;NMwP4!)V9|(z58XLttCJhD zm#*DXjj5@jh8eZjkc&?`!yjZ1Xo1n+r=ev&-d3x;Pr?;7EY4r~w1>=|R&8|h4Bie+ z_bS|G%MIEb>wuiI&TO#N6w0f++UqwSscIvfBu|7E`vlO>aTIoqS6Iu^`3ydSoR?X6 zonXG)(zDr4*1M)`v$b{#qF3+?Y+$aHMh@9Ff);paA*7y$POdmIL^GD!@3ql-hHD(DKV9sn-r%v(*>$yy zVCO(jPJej-u(^?6t;uwD~;&ZZafIjhGfY?V28zf+q+vS4aC^Mo7r6dY&(OQeJ(hJ;t5-Uod+p6z ztQ|(m8y<8_;5`B~z-OZN(L+tMH8?c#d!s(LRwa|? znR(2^D(FK|>2D{28mpS5qLB40c!rsx(b(RyB0X$N)$Fm_bm+Wlds#h>PAQXAH#v!I z6&+`9_L^2Qf~;8@t66gc*+T1wvcxX%iSA!<$SUK*XIB|nylKI;beJgMZOW?Sn4s+~~-H>Mz$8j%1By z#Px|o;FIHPM*o@qic$4t?t%^FN%X>WWnWwgu77v@1icWC(T3T9*WUGmH1N5S#Vg}y z;kL7`ME#Oeqt#jUnKtJMtts((7W-P+^W%}>P&-fiLa+ND!8`4R+2oSW={^QO;so_$ z&0OB7o@0^9eufthf&*YpN*YPvtMGtGhI7{T79T6e_L0_I`!75d(fcjYpV2C#p*8qn zsvmp>9GQZbey5ZkQs=B$>9e6_+P$lmUWc}Hh??OKkze@IE=p%K;s~#?ho%mr^g+AR z*ENI3%kxWhI3gmld`Eqauhu>_x390x%jpX_E3m(=^xN{*HMqGtYpvG9QH=#2;71ZM z_{(^pdZt!%kO#UCU)kkm-!sJ-Uuj!QHWd*Dv0lbVbp@0>jc4n-C9)meEtSsE-Jhv9 zW5KNIsB3qAhbpO|7G2QOdco}CWHp^f1} zvCvP%LUF!Y?ofJFRKh)S@h|n%@0RFuj&s)jyXK`a{)7ljvyaMtMwpHuiKR8l=~B(l z{CIlqO+Cd~Fl0%^-tOy~=W$ifE_77qu(_pu(F1WHX8H1OgO^w^viRxVdVB9l{7%&6 z^ z#Tb4rdL!KIdt!#n244bQzCW+_6j9+rFBaU)~K@4_W4mw+9*HlJ8BB)sqkdTj@S*PheyhlwdaKK*->vh z+ZbC&)K}>&ODYJUh$=6tKOBbI^bZAiOX=ADE&ifKmS>G1Rr`1=w5`4peHbN_smZ?W zW0)H<&3>C!dYi7qjM;*`6S_7=)+&1a4Dpm}XS`Que|y~dptl~!Ygie*CM7k(Q4^}i zwUu@_bp7yM5q{=~`5h5ekLN4h`Nm^cTsUG^$H0&1bZO$HA6)h&bfj21Yh@N_cvCp(|woZMY(XbFBazA3pANqccu2l_I)oSlr zbCe8X;3?oGYdx$-xdxhYnRQx@YoqMihxZws*7`nQ-fGoKbB^~&iX5JuSfwP32wWLN z+2nMfJNM_odjYxAZeBeLrPbTt+9^YZOts50=4Ts=*QZXEHq>xy?>0R@>IuofMPz(c zN6^aH;dj>=e?B~P^ZsmH8TI(eA4i>(Fo@W7IKcU56qk#Hv->+>JQv8iW19m`_N^dD8ek*$I@B zF^xtbwko?brXdx`3vU@{GUQ)cs74vyhYB=VdvAs#V0+jrh%;B`gPF5fDiJXCkhLDe z0eFCi0w;80+mHs@Et)c<0h`XM&bkL;IwK|Z!eSC(#u{o{ZFfl3XV@jjZ^xTl+oNO@yPgL<+?#ICSlb%4 zOeK;STN;SRlf*}k;_FlWOdUV1Pir~(o@2f(org=-6(r`9D2it$D=7X(@j~q4!bj9` z7TSb9aFTEDBQ~Sv>iyfzHhL2yS3uWM#C)N@+xZyTIGX0z_II)c_~B|h(Q@dPcG+MDM1ND2MO|&21Z??s(wD{5; zjR2OrikdX{5~X*lC|D<&hW?-*&L=>)|1<98^Y$@W{hwEN(Y$=qc8+(3v-iI5K9+As zo-Wrr{I)9s)1@044;{;QKHRp&zDb%3_Tf3oOk7!6)_CvAx`5F%Rsb}pi!YB_l9y~4U%2fuWO8-A9@(P^QdP2VapR_SPNDcp8Ri#I8*Q*MN*PQ6c{sZ(0 zfAxh{KD=*|QR^L2Xo4_9d%3KU>95G>*mX&3B2HEx$k(Rj3}<5jt*`=cUskSnjg6Sz zH;K&6bz&LUpyb25lhnXFW0&`jrw6j%zeg*_v)-o@SYIEJHM)$5qx$D}r-}~|^$w!rzI6_mzALwSSNSfdi zdNrN2lrzgw$wfgU9thyh_RQn)^cxNc1S^8+0SOnbIpXP@wL#G zeA@o2!-LyIPX8SG?mZgt9gEDTzBB!0NY0TZ*5!JPds}<%E7Sb)(S6?5D4?11VJ!Sp zonb}|^C)VlDP!Ggts3T0t?xuz`adpRXeri@-GE)6@ua@#ebh*_070LP^V*K{#9wNp ze7`_rXgB;}V|+)aa5?)TCII1(yqo zA@)95k;`bw5&u6f9_Fg74Gc#kBV$+9^jG4!Js@0{-`%l3WsjT41lr<99m`WQ$$Sco zFjZZfIPIHwD19I8F6(bcB1D1sOylG{Y)#)U=>N8@DBNuQ;;6NFoY5;01tZp{&^gZN zuYyZx;-vE(yy6cXLaoK;&!sEt!qDnUS2?{c=bH3XZO)Sgx^gwRtFz+$Mm8&@ z&i>Faez(M{p1QVhj(Y8|ZJc+;vx9z?^XSSwM_FMF7l}Qfpr29IW-z1bZbv0Fv@_an zyPi?ib~U5w-ZR9G^=uha^40rYSVay|AQ z)|7ikwc~fPZ!D|odv^WoGOqllzorY?6^{URQ{~4uQ~v-l^cH7i=R}lX zb3w$M1G)S9ZpDM$xJ5;&&P5pY(eOHUWfI#=yH?+fV#G6h*(!2jEw4p|riFH@W4CZ2 z?WNJ_ldtNYy-T20>_MmQiN1oOcv45DyorNnCjW;g^TsJF=KP_qdf)4X zcY^xTx7RrA6VV%XeGr9`Z=gx={XnA>nw_8iUU#@QUtD`#q?PYZLQl{FZal?(JuCQW3j*XJon#`w~e7KNVTj&+Ezua>L|Uxa$QNh z(7vO!_pEUw^^Mc_ke_CD>2}Pb)>BL2Uc}neD1WN`yl-g!&`Tbz81d@Oc%JY5wwR6P zG9opPq-(lFt)2L|NRW13qstlljViuLQ^#q3F0<~vPMszf%(fsIaqAt8!I#N+o~(~} z0KQ2sJ8DG8qV^cn>A^8$6?@Onp5#$|SA17wg+0QJG7Dt1c-G+WQp`;~b9m zZbQ}J>54~7jkq3r;mIHtU|!5SqExL`FgK)^@7b4GH!Zct+3V8SX=!6Tp*J`xtJQi5 zRUO9wUm6XC$lNPWJy^HVxq(;)l_tN5^o5`8yd>xPWcDB{ic?d1E#HvV_j*kNvr^I} z+Sqtndf3Z%qory#ZKec|z$GGzCFa`Q+;hV_Y(b%dzS5_ssLeA1*!;D$j;a_kqdvjE z{}R6^wkK}Q$7o$NXVyt=NA+z@+KM{Skt0leGJ-W-dAEsQRWat78h1hWM1May z@F%g70X1n~WD>+E(gUqHpq=oSv8sq<$6G-7jT)hvc=(xjbl(w&$G)k4e;u04?zRur zzn|AQ;ul)l=PJZgT}!>GUC?M9lXxU+16?P0g!8n|Mzf-E>?~Y-in8D7iZjzZ~stM0EN>q34AD6#Qgv@Ma|M zItFC6#KRG($Lp@Q-d1NWa>S^Cv__vPZpoIA@h%gv! zU%@-pX#3WuUyoU0QSM!`k2mVtc~+H1eUI*FzEtf8v@%yP?sz=jw~oEfEnSX3k&5Wn z8uQVVHBZDDh;5IFcdSK3ui6cCbg!$Yc3^hfGn(f*H&H6<+ei1?J@Y5;PX9ws&1Vzu zQ`=bs!D@I<(Viete;)cG`0on7D--m26bow39j=#irSb9F69Bed~p^%-~`^fIavG0RdhdiY>me;g!B`op8k2E?FJJOn- z@(F~$kGCv1v5C>qli}svi61wqvGw2bGLfM@kv} zk{ROBsU6g36uNF=n$RX;z;kQdvISu&oetL_o4{iAq@dN86i|N-%+Odtv1qY{>N`0}c)@Qts+*-$Td<%&B9NK{- z?x|v-s*^I%yy|iH2)?=l#XLFf-qVwKi5!hPUWK=mr<0BxKUT~Y>o|HN>oal2HJiPZ zcaF5-Scyc5=aDq%HeCieIN1~*VBN?uy?+$1ApFrjp070{R!xicGv2Tc`qGwN9f63u z>+1by;u{|1qmUrgP$)AUv*zvhSeDpOUJy=W>mymUasIp;VVQecGL6fx1$RJrJO=SG z+UDHqb=3*U!}ZpG?5Ra(EEoGa?NwOLhGgv>j;}n$Vx8&TlGk8C74cqqO(VjC)Ko?R zv)~34!4Y!eNvEkpMI(w|-)VJEUeeq`MAP_P$GrtT(;j_jq}@#tGma;hz}#N*d^ zw$jyz$(XSWuZMy1pm9K(l zSV~zxT-*J0hA4^J7gAzQ&^sv;u-0O2NH4WX{h!4y+m)Q9+Pu5H^aaE@+fsxI(39#DTIp2VZL(Fc%$5+8qK>LU+;ly-x%|AZ@r(6;I*U)+RII9i}qGhG9aB|ps!)gxcU*~uy!WGRF$D8Yw zPabfrTHzaVth#?F$EtQ(b#uldO7vD~)|1l?97*WjN%BE^u!xjnFI?`JuWg3k@yFT^ z9(!{68x&2QLkrYjoEF)yfr1Iv>H&)HsAEDwW=DnB*u3N&r~Us+XaHLF3-$I>WwRa` zG#fJ)9=E7T5Nw|)T zu<7|^X5dSGEmn#T8>R9N!nS^9Xbv_9{y}xCi1>-fdWEy5v7ZR>%>}_1tpZ#8KYwb$!-( z0yQ3#r!)JtM(|f4%ps$pW$c~x6Qj{*MF->2&_(D>%Zb{?wXN3F zntZx=z)9yk9)oB49;>tYjyG{iFyxx60U zWgYeDch$mnKWXpO*9-PZ3$)W=6whKA_{CXgr&x!6zgT1$16kmushe@tn4uk)FCEAR z@a~VI1*V=Qg?@}zCD)CH`s*guhovd@iZ0C}w1>Re|u3tNIOJdf?& zRqV31DWm*qm0xRqbszM!(Ng%r+_2k}0xjD$1MAJ&r)BNPG!|~rLsJ#e`Gd@qk*I-^ z4S80?!u41DD(QDbd#=-gA%L$V)14kQ*1GVo6x`{^}!+^WyCtR@C;$&1PrWGel zvab*h+R{C1BF?(b>D-M7)|@3?ZR=TJ5^D``lAN3VsWI8&_$wkTeXGX!K53UFv@&Zj zpNc(HF+xOe`Ytf`iMD*<7+E!ZqVYv`K|%hNv&5R1>2wlYa2*pVPJ_L;j-RYmP}%Od zgEnk1S5>B0pqF;`r#T|`p#m{4U*6d*{78 zkt5I}++9|KHd=u()v1yCF3qSf+cxt;qn5Rm*y+R-;w5P04zrXd>dlVcCm~hOm-&Ge znvLGWqP=s~q@2EJi*{KHAID6HVdmXB|L$hGLpQUs8G=+g5XAJlIcC(cWhb z&>39DL0j#h2OHv~eRMS2b-W+Y-M3iJy=!spx@fZPc;-l^)x7SBi=+K&U7O~M$VPmA zcKq0A)%7I}gFAf`ts7-1iWUjq3a z^e{SJ&DB0|CpEUJEgZ6fyyb(*-JK1X(m}f`<|ENd9an<~oj(@(z&)>+xIf-j1Z5`m zLRMtTWhC_?YhJ-_zh6SXGns%H#Ot7 zZZhmk7=hk+HNfvhc;-}J@GOoLLEta-JNfzXP}&%W_Kb1eo-^0MOY4XmrJ;ReYwg17+OMTz8H!ZcI&df_>l=^!p1%n+fNYU%`L+qF7f8Z9t!7YSv`HIzUo+n+PX6x;(G2DjJ8Gccd12a{6QqXkL?Hdhr1B zg0HiN^^JDUu)g1{YhPU7Z!-!}ereqXdt;ocuKV)qvVhzrnkb449D5e)Lyw96 zXd5ffSKiYVkO2E}9+|B>y*Q+0uLrD;5k-?l(;Hp_kFpiBgQWG|g(-GdfqiXkZ^T`= zyU_-(jZccKWur|U`yVz|`pYTy&adh58}9J)vF3-yD?VP{f9Pq4$J%?l&m`NK!D}*z zTw|MJcf@)`IN(?veu5TTEurVxiG6GMl*pxa*vq<4X7RIVwbhsRQX#{Aei6Gy)_vWV zm(CS_#V{LuyQR^f&l%yTioDczqep*P2D=V@-IxOs_ZsdthZzq{^7~y|?b=LA7Pz59 zL}f_+FseMq$cpzBhF_xwU8~FVjN;1_BtHJUvv$+^+wqSO<$>>&lZa*Ri1X{ zcCtXXk{%m?n-7Gt$2HpzLwZ&gK8|| zt4+Cc*ZK99j>11iVb#&+dhkq%me3`zBO^vm`pdd%#*Sb*8mhTG|DJvudn6-2bFZo( z!+m7KmZ2kUys*llhiy9lrZ?cd-t6_u^q0ssB&(A!sr_R8Q=Cs@EcRUQX_h4qWTnzs zNcIBOx^@C)|9`x_Yl~i2mgl+8i^K#%h(HJ-gs>ijMk$<1jYbIJ5yph2uoSj#R!DX` zlcI=}ZP{h{(w1zO+%GzZVO}*&Gatdshv?5x-=f?UOseS|sHtI~diuruf9rqNv-i0? zPlPkG8e==2bM{_)?R8&kUk*7GRvFud#b@r>l57FlM0%ke8OVG~VlP_2m;KtIzu@qb z=F%yG0r$*#hEWG6JBII1M=$5qUEKTtwcFJ^BxHDQ1@A+YVjVkcI>%+#*SvKT+OcDS>}Ekwu~Dw zho^gLZ2ESL@FXm+W60#&NCM98YFzl6+{t#(?uGtEd&^=jI~%lEo1G0>YNZDa!Y{cp z#q3lI)Sf4(OoZ$G1;{WF$6nOq@&3poa;erA-_qN0<#3n*Ve3s}&ENoMer;!(K1c3r zJaB^F!eVq6=1;-{iT2l4XqU7b(KznYv$oKN8MWETjreUj_(^X(&n|XXQcccGd?vbv{6CGZ45&l*$So65Ome#vXfo zxqZ~0bo0Ji;PJ32tj7=~GiM?uI9Ie|krOZAP^-5O)sFoDva{#z>Me4I{{YXNG2=9A z2*-DN7#ShCUQiYfV{D(L%)am&TMj0iKyXE_^t;p6(Y5Bd^^3?Ar!g1MBz#t<^V0iq z4EY21h?-B_i!2+BK{ug{Z5ZiQyf0aA(D^ zXYT$8Oea-+$Ar)j-#A@aVK)}C3h(Ayh$pc-EZ0fKFeImXPi(+Usl_4-to2~q!hW3K z^bRvijzf*uUla0%m9x%H=sQ{^oV=Gjwe{N>+;kHF))%X6sUNqIRxZFF+9TD8;~+mj zaU&#$ndSRl`?v9Tt^N8!wQ)3`5xGN=8!OR3pNl6`sG9XrWR$uy@Y?=R&@VUz4n!`l zfvB(aWIYCV)dM+*yDTO9>svn*PUIbMOwcdy*Pi)tiiOCn@3Ze1@2D*&n@;=A%YA3S z8lg`l2qS$HZT$?)&0%Jyevkf?ezwcG6KQ6y`*QAf$iZ8h0c)Dbg}s6>`WbYJTP}C^ zo56IHeewSpIK=IilURT~r{=uxS6rnFoOH*pwY7HBB&&p+atOZ{dv3;=)mU$3ccj~B zHGU6Yg#EE^YqEEpSZVLQny&Wu+2svL8` zN;A7!(M_nAB;b+wZGy+k;h2`#ax`k^LS|#;P+Wa%X%)%^t)7 z+<>o&@u~W^cPF)yUM}8UwruH`a8h!YRm)>p^~a0y7VlIx?Q?R+km#t)&XK0&7A|E^ zZXln&!}C@RWLNYstFL&LqrXvGJfioQ#W}7G@+~-3j-Azi@kKSl`?XHt@)YeO8sK{g zdUk63>{o#$@+CMIPnUN^KeA%J@W+4IWx`CTQWN)_797U;yeza{$SOFs1Zt#UVwuc4 z2ENb}-VrS!sTyA+e5n54>J9h0@)tP@<9rhm4!)L;Z)m^iIdUH=Cl7_=ab{3sO=@}1 zX&KM)#nx@4IG&%S{rI`RU&y#URLz8F+mZH`Fu=lL$)L~o{ohC~cz?y*&z~;aF=ujs zk2M!?MDFnJ{EdAH3|>2}xWjn@bVAPD$}ue8euZ*h0(Eg(_ujgNa|>W#6={L4biX*u zY)`ly`io9C@6Rw_IL0XRFv_b~5;Pra&HDSE+9N;D%6}0So#u8sVE7r(sCaNkIU_lK z{un%7_m{)I(;T2Y@ZcEs7YmET+9wzv^zF0q&+6G}rtVQCmx=~AQTq<_PFQA(_I_%< zfXyBL-NG}4)+zfV2%5)mo~)+0wZA}dTHi_C1Dk7blQ`M8-y=J4{&9TkhZyWoo`WwHq@4vDxF#<)OOGwJeM@cp)pIE7ok;MY?2U0S1+k>`s=gf_GNZ(Ze&`-h z5+nOq+x$D~OK-l}JLS=?`l0jODB|yrKz+~t^HM&T>ysms@w!*i*Eui}#YkWSm1uAJ zBfUYN@8{s|3J-fc-=Iyl^|`P@Zit1@WXmA70hst7c*rP^^j}~zZgONx@>i*HrH}jO z<&>86eJHyz9KU;W4qH=!(R23TXsh+T{(oC@!KSFXy))OJ9Eep;{0Y7kX}GPwzS5lS zmC;@xpuNNaid*&7XCMys%s29<1XQjpO1V1M9y~2i=p*0RWWM-8dwlh~KG$zoE%0g3 zn)o6mG4-5X0OoJ_!#i^@xDyj@J&8H|PJdBTAeyj!cuO$6b^+J3)nbK4*AZK6pBGwt(AaaZJE!H9E>s2Jrab6;KLk6&5*rHiWG&}bj(H0um5?K?GP^1Xk z{83Qds|Lh!jtrp?vITu@tICtPxxcIVBqh@(n0FtC1hp|^?#d?)w;ov{q1AIifljhO zH|NH=(Z9FdMm8!Hw}j=hUK7$Qi&u~4;M|JYG7`0AqU&?&Yiginr$gqz4lL1x3!w!_ z$WtPQ59gr1AJ~zhGj}3n`*moH&)}K0))x450cR@dWFyq4R1u%`KCBD7F5qt&fNSz{ zvBD?bQV+%@a<c}lA$_lm9Y->#oV|z0ymF&y4(}a%mW%>Bf#mo{w8h$#t>AnPg4{K!c7tNZ=`GB=I;LXYETC<&+_ z$b?0xoLLD$QD>LNU65gM86l#FQ%}qw6M_DYBNDcmJLV4-}(Q}16WqXbegw0Q5Rs@wSEkZcN%3{H1&ocDDJk2Z1wt5gu z!4?~yy|O6f-rR^&GgH;T3ylZ~n70Nd;LV1MztMP~qA3`tQiG#Csh{w$;cBhpRM zH(*?jaZ;{~72%S{hmuGui5wC{;UW!@<~|A7jXQ1{8Z&Pc+#g&`%2OZ!cRmH=;*5%> z69L=6iyMztuZ9%fdM=XzRJ5Wl3W{ zNo%F>XTtNOt2u-#M)Kh=5GjE&2A_`PH!_zN4ed}#YLWmL;;wK)0>Pc0i8HC&r~QYn z#OH|(ac>-hKY@+iVtEe=;PQcI>0`++6G7w@noOPPX^oBil0w5Bid5E?|5MP=e}_f3 z4s)TL`%mo}dT3c7)PPRRb8Ox6qs)Rl3B?Wh9nBRk+8)6%;6OdYM=SH`*J_KL3|stK ziH3?vua9MmdH)y-C{PYKcsmyAZ7niH>Lxaho(T<_;cH%o?&4Fs*%a}|0*%l&pg&g$ z3~Qr#Pb38B+iGd*GdEik^wau^k7C@tQr=BGvP5Q^ouxDc|KM}5E05LlzJ9YrF-@t#@QzwBAG8=5pb(ZC|C64jJ%eHyY9-!DMJyg= zQ>3B${r@&ch_^)UT%!W0!I_MXejUW*zNB9UFpL9x5^F#MDeSn2eT}GL*_8cbOk6A2 zvjG!9kHZAlW)lw^u8bq+bBnveC8K6Yfn#=-XDl*^0$Yj0#Nk0~@7AgFC%}N{kNY_y zocZL__*-jhvw0rM+p-MPj!|V^QmoxM9{da*9B{9! zgPSvk2889vTFg@Q4r54d3(gV3-PT(w6b=Bh?^3O}Y87WU*J_bE8*a1+V@UF2r)8Ujgc3}!T8ex+xwNFQNBY}@ z`JQ3oh1;2sToIg{cJv8t2HOG)kLm#32b?4?69XFYXk@CXsPE2exA+PMq_)hjhvgrE-kbI z{vZMXtf!^N`t6lY#wo{c=p8i%dE6>OqVAsZ!5i$bLW0V|sebyX>yjZj z#prk~ttcJ7q5m@)zstrgy@Oi7U|gW>3VUF4Ukg499r2qxYE55muOXD{e{BMV^bGDm z`Jy|XkiyS2gD>h+VU9##C;E1WAE>82^cRBKVqdn#Pzm40^Kp#fBt2L7a@R`Pox@@^ z6ubOhyCFZcObF&_X#}RX=#4IA++4zlP9D#_f^td2uG61Y+on>>Dz0~+Nq=<{95R+N{z1$Mf5NG=3Z*_D^ge!5?N65v zL{G~d@ei8l=bVoAiYet7$6)2y1N}uj=kk@KkFv=O(Je=Xe_P6yPbv_%V>8eqfyc__d^|oP1A|gBEDdizqm-mV>3Adv~kHx4b&-*J^D!F@2A%{a$j; z8W5VG5#ok*$K3dVX6A?A4=VUvYuV%tGJ>why7=+Ll7g7M>OHk6x}m_>x6k2Yee<@)XIImHUc z_nPDETXCA*P+&IyPkHr0&%60H<p$fb z(qKxRR)qewLz^t$5jZNAn4J{Yd|OBe+B~vV=Oz zyQ;_ipx*Ong*|28h9$L)zlr>R5Imxyf!65^5LS`rtZCW~>X&ZT!v?wsp3rfO`=bj` zU%%q6U!>h7cemt!|A)*WKDa*wHN!GCmdyU7xFmZhhvPBfKH229~`EnKjf# zLV`yZ=kei=c6$!u2V0(X?V$s=C17g??X?elZob?Nm2oBbR-c(Tnb&K(4+Fl&CZ8<#KUblX=qqm%#fiC|vq#tdth%r~4 z78t(uNhtVFm2D~QlXhed#7B7xKnK%cllC(h@?Mu-#-r?7v6Pa4{iPQeru+&tz z%w7b?Th!C2;$fGgeSCkoZR^|t_|Tci!OI3k=c+B4=2O)NXWdAVc%_@QEPEAad|cbw z=Q)>fb#Iij!tBwuC7(~oSZFY>76n@bRV~NFc3;LkvG>T{`n*zAobzu7ZCmL}h@S*! zp<2*Mr{pb{)mpNw2`#+)R^wgV3aUA4#4kHXs`W~wBjebG{KRdwKy%br_m?JoGn-87n$1S^s<{Wt2AR)L8a$n=ku$u`G#~ zfe%Ay>ZQG3*=zVNtGD!p%2b|QT|lbwnRw|qd((_O4+Ghx@=h=45WV7N=vrsXdOMs$ z`YkoYOeIbVVxy_trxeo8)+?=CIaKecU#X)Q zz+nF6q}S(|CEA%)UuE z<=jr_55J)eQb5+hJm|;V1K(HQ*Z-YQ&AvbO_FOMzw6sbjocdgE?HRJVN(MEBjV2SPu!D8d<6Nc6+IFWtSO?|I zm`XDvEs$#RUR#Qp7Oz!Y;NIG{SLSBAZ?8owE3@=aWzfEX3Wnpla{PV$O+-#zhfRI9 zmYmWfhQiDD-ttwX7u$os-V-m7R;;zHsZZ<8JYSwqbUh5u-}KsiAUMnoI~87fBjfV2 zfj>e@%ElwLiMRR!5YJL;?WM6$(pr7F4-R0V>DkY4lbEFSYDMSNyb%Z+$1I45@Lp&o z5NN@8SkKH3M=ds?#z6Cr@TAd|IK7xNK(BkNc-ZZnoBNz6T8Osc+hen1^qrBSI3I@} zr3V^D#5frBB+#vUwp|TI(rMQ)$n_kN+jBBHddQkG{Ef&?-$UaR)#&M__0yh>h^qt# z!Q3Zx1u?7^^TqQxW(Ue}twtVj3yE!gr0-H`IYETX42g8o|Jr}VDZH)p=tPtss~y(D zo(;=PEL_*avp<#+`o(F~kH-+OB8=F2entm6*(|ip?Igr0P!cRN9-AHIil0tBI(^%@ z4RG7MD5?>kywEsUma@1WlFD4o`Fu~mi1!a&j5$X+qA#PRK0(*}qThX5oXHk=cc^2X8??FPxkFbr1VJx6Cw3rd*N!W>xSUXP4bgr! zxxnlh0f{oM>T`8{AF5I41M?j8yRyC?^Fhi-ySQbQ0lUUN8LVA*dD@G!xT$5} z1QhEN@Sp2`w|n9&(hi?(e{)5toZ8V$*uG7S;`w;v7n<$wHo$M*wwhgz?nVs8tawMR zRu0`1d`oQE+);ZZN_(C-(X`O0qEAC2m&no;DC-AaJ@*;pn9PBk z9ZFCw(`Z-b`kG(fwS)&@mjSwC4yxDThoU5uiu~?mjnY|tgSJ`i;G6N_WeSg}YFgPE z)EXAw#icf6UMZvB`Jc-FSk7vE=rNurRsgOLi?$vai)LMDe4w&?_~Ce2wsAnEr)&%RX*bYGOE_FVJ9DPC~HT%h-muB?u_hCx*Gm0&?VtWdeq+QJ%h zBVTLaZN4RV&MS>8H^sFa0h6Kag+FjN3WRgPP3_mSB+|I0~pkbo~=pbM7sSBtKpqr)X>;vinf-}K6v5GE$K$>2rmy; z(Py+-E8a(MMK2j-j{Hf@JrjFpZ~+n&V3w*y$M>aNTOuCX(FoAQXAMj2 z>4I}3t9kUk+CU|;A9y6Ketk#3bGFnP;1m@kw8A_4tj)v?kM-34NHKuyQO3knwV)=J zp&Z&$Pi$aTJ;58UZ0QO4joQ3&7kj}gpEb1;V(Cf=q^xtcw& zu!$zvxetk1Qhp$m|eT%Lmy9Tqp9hl=ko*8+V?AS7Pq$bvxRUefk&^ zyFBQPWkp}WoQe@V&beA6{InnAUFZrPVCN{nR-o#jqju=vnKKt+LQ{xUKB%yehdDSb zj<#TXu+KytGtk~UI5gJ(sbSc1*^bRX{QZAO|1JyS#Ws?*Pp@wTU{jB)wAc?bi@3;O~ESmP%Ur@7}#Sn_adw#{{@wns{482)|ckWrvzpFOzV7M*Y@`D+3Fs6B&+>Ul^ zhQh3Q0gaGMZZ@uWM!iPQ`#zRgf_L*Y=%P=wIT-3O(RG)&cKG{w%oLeVL&TU4|Geah zF<_PfDYj^byH`lS6H`_`viX4(0ysXKlA(Le2=qO4*HYE5EdCbHgvzOk$b+ZX$39u zW>8}_tOsgk4_D5wZpF3X-r^nhVX#>n8OMK+k|2HBy0PLtlEqxg8MbLaUo@uncK~Cn zQ_jw}p`?lBu-291zlm8Q9i-(;y2J-7zy_<#2o#;rrd|EE55}W~ojjL#6YNkp#}}EO z^n*tPL2QZi{MNM#={qxRiA=f7(L+1CUz>n5*e-q{PNI9eI2iG{Tky2U8@{D?cX^%k zlOSUGhtl6^D`JMs!_CjrU*5LJ@?cuCX`6gfF5DKbl(*5C{r)KzkW0(`{_V?ayV5u$ z0)C=#tKpZ|&nG-Qj8ex16d zzfw0C4OxJ0l%v_?xaw_efxqxUlnhK6C4<+tCG6x`Cn(-4YWLy^QBIN6DTZJGVnptx3#%I2U^2{cL&g(V70!qefVg z$*c2H@Ofw;b1`kv)Ec|4?q?lx{taG}e)on?%pL5nWh`yOct%s%=qYh!9{-f$8@&|R z>YDq)UdJ^V35vIe?Og0dKAwg&45>QBVJV+mc;2VtFY~aR&dJys2-l4fQ~;w^8Z1#` ziEQ<&r^U5|;V7Vmv068??@eKjb;Dj;qW0J8zVEiJHkl<9v%ZZvxGx4O=DGl9sWtuJ zBiK9=Z0k8AP*oBaUx)Y3s;b28uSM#qkAY_ms9MkuddO5r><3~y(-v_shipC_=)ib> zYk2!Qo|1flIWePgU*Hp&dghIF*xruzE~(mgO?&T4+1GBy=w7UDZGA0k+M0_pZxU%C zaafIvRkB@`L62#UR8OY<7w?NZ#La2z%*TXKmnnFz_UGq#Xul0~w5o4;6-#N^BIm+u zK{MxNP-Sdo`+oai-IS^rb%pG~ zj6A-*DOo+U;6sSbSXbF3Lr&?s$JB?c=y%PFAoR3ejjaS0W<}pC*hh4NxD#9|P1f{M zL}^`b+cO{fumEFNJ#93vKZzdFKl{e1_U%Ja&cta+MjzNt))XWkxIfge& zjVY8X0fw6qo8;|g%`1pFI1pxO7(*ClFmrGmHy{iAOO}>Zrk0APtNVjLvfRw^YWf;- zC*BitP9>$SJA}u(gKTAnUzerE&{zwp5&)jF-sSSR-#iw`_)_n-9|>Em@Hdi0=X#kt z(*}w-_WdX_HL@QpHB_rLtM0XfR^WdvkFqO{)8AA|Pf|x|YiU|Xh{KcUBr))R>m?~I zFPe=sS*E*jR@}a#wI3Ecf zKSS@R>0&d0Q8s@QJ*sEpN}S(?RN}jQ=nb!qAIL*DT+fnz7s{0Wh?^y(9Cj@V2@!;o zch%Qcm;bgFz1(4R;@;J5>LCN?nwGX4y^S}@y)EHFBuf+nzf)?6Zg}oPO~^Y~z&G<6 z9VA8@Mn2S1yv@fR;2TjO{TbPNYf;4ELn+;=wSM+iz_$$}>f|pt3KjR8$FJ1FR2kx( zpDL;|6y;T^2XfVPX2OSzU74V*e(O*Jb7Ri^k%gl-^`=GytdW%XY%`HpR<#|yrZ?oW z3wvkY<0mbjf`7^p4tholu<^DXGOBXuH+s(4qLOM}NNv*5l~rm$$f~*E8Ek1*U`r$> z$-8(%Gr+##2hcIbu-;K^wqEk2_gmMzBJG;aR1b!lYl#8-*fM?dhOj5b$aP?FK+d5I z76wfR11z;Q(fE(_PjGBQ=(i3B>y2r|xcoMC1D~y*1E=zol{G3czt(No$pNIoqq!aa z49=wF^A0~^y4Xrz~ge2a)QPZO*#J%iaL@X8iP2>2u5FvwG%y z2QA2!ta(BwuaZF7*H*Bv*-oI%G7Gv7deUy}d~ z)wi48_IG^t4Qj9ry&kypmVP3-e7n2EB6A%$3l&)_N{$fmA)~ZGK9CaG)2l<+#xA3I z({Hw4>_~79cHlm`DuB5j0J<*zNcw=o8a%WG+iM3{61Y8!tzw?anFF-HJf_M4`dplo zku^AJKZvy#uD}s81bKB`>gH<`sLz{|T5CGO`d<@0#HaThg%i_bACvpeTkLm`^{tSe zTq$@SvhU4dB@U_G3MnJIVigb16n*1>u)U5v*rLWLQ^5Xmkn?}8vc+GfW0mx6V#I`1b z_wgx5OXku>#1X=W>eXw}3Fw&f`#f}~x1Q0P+_|oFlsFv7!G*7unGqJU(aL}~E2+^J zJI&m)Vq|-s8VxREYuUh-mB+FoTNh&HL&^xk*@ zXq=i*y=04##(N_%a%52B5K}wHd8RR#_o%my9l|Ft0gEq{&#;HgwY7{FZ3Eom8{)vD z7sUz7K7Ksn#FN7(%n)4gT;;N9QmJQ-U{Bow9Y@01_XRZ<+VOzB0g4YG619StFDHN} zk*A#>w?g}7TgI_W;O#dy`GqaHsCzxB3tX^7g9)~Z8-s~SxRj3hH-2oMc<92Yk3n$ z*lDPX)H;gaiYIxbai~Fg01}9+`V;k9QipwW&ji{S{ZEh+qIKvcRsqSPnpGC{(4#dT zilLde)glf)>QVtT$a7(i=+f`h8w*w97$|dwCYE_YRTNDhWKGy>zaHG>@8!60Ef?PI zg5ul?-@efH8V-1rPCng7&+tP_539={5-)lXA^uRx3#=c~OeF7mg%2&6@|N^njY%Zz z9LZ4?PlofT2Pu=2_1ND>8UxyA)Sw77Dj{f>t&K0hNlPyeA3NLNf~};z?~-OZGU~Wh zbI{&Xuh0Msy}rHdl^HO{CtbZjrpWwci_UEet6UedtkqU^WGVugCvY9bxDRwSHSmCB zKpdL1-_h2Zx{&Xy z;1^j06hvw~uEu)rQFwqnUI~|5Iv@}CDw35f2PD>V{nd5}+Fgp}nM-cBm z&Uz5zz%ycZYf8$-Za{U+Ri*Uj$WUnxr4VnnnHciyoeWRoXi|FERx<3D(FMm-U+AyW z$Bn=uE{(WRYgbr-%z^M`XbQNebXF^MTTg94$%c>uGzYGbV|X+_D|c!I~8VZ@{P1W!mUJkaEA0=JT%UjJ#Wq=!8{vS>&E;G!^;~5rUOtd0FpQ&~(`iRhxlCD?i~B16I@fWso)L zzMjg#qAZ-9q2+P+(Fi zShSZNE@s83T&jG8`zaalAiYNQW z*NuVY*ErAz-wLgW5g3PO#)D^QcgYVDx$*-=}(Cf;7vuya{|u08>XW8Xm}1Z;3X z+tAa0&@W_y*4_1;_#0mGo4G;*A{6Vn<8QwQU!KBIXDD!#Q$^JJZ9nw;(5^<~RDx>q zS}Ecik$sI$*YW*>emmo2rNGsw?md6j5*|`p#G7%r4*7yZtjxkQc#xk3MPF#cT!2TE zP92g@=I9%1A3uuL&~AU2%oa#sLsa*j{=rT$BL0+%PQZq@K1@#AMJap#Qlo%(jBx$u zi~w!m3=&GlU}|)Ch%xZC=&|#CxM=FKM(R5I!D!okI1dduCfl*>{7KY&^p}LZq+mo? z)7e*iS5WP`v2o@D{Y)>fj=CaLXUXmZU$<;&=~tMZ?20PrB=UuI0FEnD$R#V0JR!p5 z@=wQ^Jh6UqM7)(uMuopf;$WQ5EhXONz@^{t!TteRpdy0*NO(wwvl?4}=HzNTGonso zOo79?A=oW1somPqTO`Yt2#NDp*dOElB;*Vn!GrkksalyP%FaIA(Qo>E8}DrojPqE# zu`1Xctdq4H+Sq>Ze=;|$NU!z3{mVf1$}g0|>ilJ4lj{(jLLImppZI#VBYMCKf3Ma& zhY#Rj8L;#@I);9X?#UdWqqD}(#0U24msf4|OmW8cXO5RvT#ro!OUpv{F0#b6b<{$thEVgx&hpIFD5zy!F&!Spe3%gwiqo%` zfdyUAEH0)1D)fL->~|o#1tP0S#1VUOJuL7oQM5$H^iAI_%aMJDb%dInW7mvYE579A zwQd|&lONfN*&3ooiX9!`&J!#y7ZMRgBwj_HmqIt{f{&W+Vy6^dt?o`@^m z!HnxHY(LDI&orVhLKam{)sGn2SGBFV?8-F(`|9MdIHv1hjcr+67xq+V;WX5-R$yBV zu^ibJ?bzSV$a~@hGovjMB3Os+1@FkAxK;z}8B(Dg6Yv2W$2`grGBoyNCmdoe;uqvg zaZsEChUe^#$fwdg#pJ^ir+OARAf>joTzTtR6xp=-nXq1EZ%|=#X&P5Mr5!*9T)*@j z;6?IV82)CikMp&R4`y8c z0z}UbFEo%DU76IrManHFT&C2%NjaN`*kHLB_QPY0a2~b53gJ_l8AxZ_v60>7e6G&f z8@LMR=ehP3t1`M0HTA1{?(*7tXtkvvY`!h(Vr|i4YDloIYLC3& z{Zi*ezhm%>{wztT%kZ(BU*8rk^}gof`j*6e_)K6E>6LTs zncBY>*TI#F4$|Sc0t~vrN1U>qY2U>MbbyED@w>Ds>N)ckj{*;QJCs|zx$St^Rq3}RT-pTim1x+nT^^Tp5W6DRHTxe8~~aBhwwJ@oSjX%`SL5y_wj)rMIj z;6r|_!tr(wJ3f1R@E$SB>+>393A9IBp?msZ04vZ3|EFBS%m4Gw=+TLP*aJs;=;{8W zmAJ$x?Z^J@rCGg{*e)ET2Ytu^(Ka;Wpnb4}L}a$bL{ji}-9P2h^^kDJpeOc#-CC>r zl#BQU4C`%1~NF za9GwM-fZE){aW!ril9&WznoLz8FaeV_BTF6n#65Tfsq_nv~YVYXZlvywJ&fg%)alr z>9|my8F;+D-PxpsSAdXPN1d4^dD=scLIwd8S6dFpTQ02}={E(FcUjilg6ZC+Ct(8Gz z_;?@IjkpJyezvri{Hpv`+eOO@QxACrF8Zhz{cc3YfTQ&Taq)H_pOyOdcb06%G=+T% zH?(7BTs$QFVW$h2-PJE$v8SCzY_DLG`%iw1u7$pHgX>S6>Z= zUR#U)T7!q$$Ub@rj%W$Km>i{-vEDvgiY#f^9zG{W7X(`^Bn0X)Q)mmeeXGT= z6_VkK?XpGO?^EFzm#P!P{)wr5S&m`dZ1K%=-+ha?C8&;pO}8{9gyAT@4{u;sU%#zB zS!;F`(Nct_JF6#)G^ZRDL1%IMGPZ_R_$w$i=CXAJ`r)I)+FTn}18rNVu0vUJPHPs? zj%z>o5zmEtU})zWGkw5{_A?Qh?z?KMn?SRNt(LZ@P+V(`{vioKTMPHmbQ#Ck;otN z3{|J-mGP+vmP=$y#3-vgJ9~lfvCGc{UVfzC@D0A#Gn2sgx`Lw@-*d@KbtP_m#u*ur z)WoOp>?N2pu{81v7UkHE{sLD=n{Y)f7Ps`@JfVQ?XJy$@AJkNf(J9Kw`^~N3j^#68 zo_!GXCBASj&-mtH(@JNYtdG<Z1>Y!^_p|ZCzPNy?Mx?Ey;)bWoVC9> zA9+L2vj=*SJme{r6h5Zdwt)}G3Er+;J*ytJ6>yg7LX8J#!3QB37ks@c##5gwvM`vkn9Jfr~X+_hVob4GOH+R*02JZRy)pv{&Gcezpiup{-kNdNh zjN7z~4?7NFIupfSX{L*o+tA7W6)$Qz_brO}p?re1@wrZOi(SfKDT!2^^|h$nw#Dw` z43OMqTYbuX+;;F@C&CpM>jD<11xwzF$m&WxB613q*5meN=j zL#u3i4W@V>+ihgLi4M-BT+=FdLog@&M9-P{pdzy0ws8!BS1fVXa{L~g@dLJC!dz8I zY^EcrvXOad*?bh(p-qn6i*5$`w*23c5!+E)AuPl=#z0cK-= zp<_Ntsc7Nsef4uynpvYiwmq)(&_k`X)-`Q~jljRyr$!d0yF1K%Vxsi%UQ01xQgxSYG$|7|MZ=hDZ*1+1}S?2EF*$h^IMIXw7vHD^qH6A1SF%qpeEJg36v zGnHg$rPa7MGbNJsmBX$hx}n}_Gx`F`44@tdsMPK^C=dJ@vcH^$DNMW zt>Z+Xu45<0WC7R!qMo1E&pgFPso&*;k4H}VEqz`;cptc%5xIKm8wT*v**Kb=vn%o8 zN2u?pkO+l&m6N9Sv#>0lt+}XouekP5E+>uM*3q5U)zOltQ5mrGU}u5cT^ROxCf;N= znjEK6)JvvnO!hO#kf~nJLhi{rP}3pjVQ!g&AWdKhCPlT~JjsCG?6nbcoEvFln@*n| zqYV=7{IaN$Rxz;cbL}tk>B!}&P%!=wdgC8XrVmA%{CpXIE;4IJqQTr_AhGy8S;a4G zS-lq}KLv~%uH(V(!8j|0|Sd^rQl z2$itRsJiPd-=^HM)FU(I5?DaR0Sw*o|{9#>f|ya6h;OjwY<+390jymC z$u&&x@<3`D`O()E*tKdIUDjMKp{J~VGf$+~l96$dAuz%+K3&`qPDrgi3Gax3Y79|+ zdp9JISOBPwkg)saLV6WPk{PFZ-slbTX4uRtqf=!6v(o9)kyH1-#r-a#=ve4)f;uSaT|u zd&^U?$OJZsHmvhI?z47x$L+ze1>kI|Y3vP7FhZ+x>5<;ioA|@jLk=^N$5%Pb6;uD9hJ_ez^|2UevP52+NKlsuB)LR_Sr={ zEpyj0xMber>SJre%&Vn5$38b!rl_5YGUx6DhHY-(2&n34NXnH58pZxOWe(kPO~>mZ zGg-#Iv_lhHX%_9`ds2=tuy*CIG9P3nL;_yz^1RSk?@u8$R!d3mV2sm z+}3~XfveOLshVo(LuuQ^$^^EV5qTe6`{I_~fe-vAcfc>WmgkRqTa#=LvvtR}GEp&nb1qZD3gS_$BgQH{8_>xtdB3MsU1AFR zfl9lP6;tHYT6G{S<$bZG{>T_s94W9J&Yii^fNS(-RTkPL-@X%uL^jnUz#$-mm3g!$ z3y1V@+asDl1dvrZpUuE>L)(z!lQ;Ah9pM*xo@@S+yPIAgLl$1fTWmBZJAFM*a21u*cX@JgRbOKWb&(6=DeBj7WK0=B((!6n4=y8Bcs=HcP4T)Nvqd^y_U{~DS&v>yBfTqyR>(izgxrgJXwXGlV{utG_+meZ zJF!5Hi`qVxIkb`}2TEJ(u$Idm5BF}w%+Wr>!A=sz7;8iJ-}a!`6yPP_632c`{RJ~8 zJ^+8~q$y@9@?UfU>UrLNYi(ifj9j4u$8%#$dO!{LVP-@rXuGoFfAimOr zKK!9?f%?%V4J7@Zmj4vYM39BV$y6ak8!>f&`jU62fSG+K#`Q$@Y?Uu2rUj{IGMV|_ zr7h!O$NN}N!Q~r`!av>b|J@BefhbHq-RX$PMA5Hd<{MGw5xG+Jl?zg3o2weij_wfnNxd_U&Ln+!CCU`dDT2_es3R zP83DT#6;`bct@LMgD9bkFFBqLF5|1gmGgnD?ZZj9zkI&=Kv;RFEWU(0GvCu&6wbEH zJ9&YdxMKhLWt)vBq-UqS;I49_u24XuDyv{m0_yawR_)5hhs(c+u9z>k@%-l)E2$MKR$(AyS9@CuTAI~wKL!XI0Bdxx}5D8%Vw8eYz1p^yq47N2FX@h9bh4}xDYOEWu zb~9CLf`&>R6dhXPT&z;I^c8YNNG45N*il6$i8y!+CRMp~ltR5a*TM`A z<q}ODcEkPH=TneH}1sA=}+l$c)nleR4OtPAN5>Wb?}~RgBO{8uHEk z;3N)}D1lIv`FGkB_fp&@33QnNiRiXTN4%khh1$cPk;IGOXjT=Wp*R`K=RK2vQZmmIL z`3s*ifvv*_bFF3}D$Gc424!*RscX=f4L2UEV&A=fus+lAIvvKFY6gq7Sj34QoxRo1 zk%N4z{_(XC_?mV9a4iHhvERM=uw zd32BN9Ncb0OnV6X0ZIn$(P;z6I5pu@G%posKw)H(KF;-#Zp?YLkgW z9=@Cg@z|P9*ZEtI69P1?iOpQ_AKpeskmjNZb1;)M_a6C`*vfAE#Kv-Lu60g6r$35` z$K}^sL18f0FO?EaW&IsngNb8okK(;jFmPw%7{0>Mqyq89_&GFp^kd4F3sYW_?osx^ z+WWsQ-^v2%kR~3$3nJx}dxE9~iC3^Vif0ynimr*cLTT-ukW1f07Z3I(dwPB*fQ_Xy3 zZ(=aKAv~om1#m1F%kX}(uD2I;9ha@_eRCf3`S#e(ly~P5OA5q+zp*^R`@fM4AjMEC zW_xXJ#B=5UiWZE^Wr?{EgUx7U?)q4gX-_Q7#WQ^5&$8y|n+Op5%~4Ap()ezvOy2@#FnUUb8!x5>S~Vrf$y?q-~Nqpd!z`T1O+`q%OF0CxshluwQ`oa z*rC=sqRF4AA2?(LCP}(99QmADKno-YjmfcHR0v+m3Xz$4yI7X6GOB4ulr7zv<2w|a zO0|1p7SD>k_+=U(=+bLVdl%JrUt`z~_u>}PV@h0_CXbxwtM@wK+0*7KPj+VP~ z>S3RQRhWludIQJX9w`~6&Me!G>lfr$%vt7@ywyIart@6Z^FDb1`du(SQfa4(9j^6|qZykaQ;vSMiI* zz_thk=b2-A?_NH(R*&Qj?m3b*-yQ^il;f}CIME(86Mvp7xObHjU`Eg`d^-+w#A&GD zO4N$>_O|V+@pJ?}mS9)y(zg+FEc^BHIPGVh^D0HQ?s~el(G%%$}m z*3Y(XIEcC8La%9FPcO#xmXGv~EnG)LA;&9WfSoO^H;`Dahkmq|>FZ=DSs6{sWSe?m zJnp?8yjgGEO=Zi_a2(n9~p3rNi1Vp649hz^~}a2 zme;0!7QLdXNWB63lZTA?G^KMVOOEQkakU8YWjgZ~ugzz=yVy2nZ6qF{euV$RKN3^( zZ!VJ^+CJiTjIOpN%YzCQNDQOhH!O#6-(9~ zzAjkLvd(tImIdvFU*#9~G6uz+QH!f6;RWNX^^RdMHe7V&w`xC2 zsVo{f>vz@990A?{()N7S%d!aHv31xUXXR*FYo~0@%d7VWo|92%kDUt6AF4W1p3LD6 zwUIZZ%5l|n27Hn(?S$u@Ix~l7r^PZ>y=*IyL0u7l_`ZJsq32n*JdB){6y71RPxLPl zmR3AYJrv!UF_xQZIICIU2?pJX`WE@bJHv6kInGE)^IF^D!gpkgdT~%jbqf2vw!#We zT^BMHQ|HRzmd@om8y&nQ<-6ryUVH>PStGg&ELS{PRTk`P}N1b^trs`Z;i`{-8VZvX^_W=yV(8Z2zC& zbUFaQ$A{oD5}8Z*w$JvvWCYUfjla`dq_yi0GryD-LK_mBP8;D}DJ`-kwT>d`-NbTX zsm|&D$W?ckqs-PTYKwoj#E+GQaWoADr%^Pv&D-LiYDM5~jNmOoXajRfPN%=hyhRwD z%V+4v6YWuHcfNd~^(S%+QT?^~c1Q%XH$-Re-99kUUufCAel~i8pCdN+&ykQEpD+4Iew2t zK^x^2&W_(z3~Hz4Vo6eOe9MVB4K7%Bw_P z34i*Y)tqd*4tw|P7Hw-j4~#}2uSDq3vmC8DmziXzOBmZsvuapuD>L%)vr zm!qjYStu+bTI4lgwTNSF_OSS_Z(=TKhqRiyJo=og#+Df@=P+jIPUg{OEDDlx#$+j&akxCbb%KZ*VSo!2Z&bB*M;W|QZ*HX%r z`W9-n_Qr5+Wy#=d{n2Y5$o6|^)$3eb-H@2h!E$^uw(i|)`{B^q=(mDmjyUSfy)sn& zQ^YmmDtgdXywY;TdmSaL@2M=7%OCG~1sBl8qmn-n!KP6zDc3>G_a@IIDdcyjPQejW*JL5j&V({@dbw8_Pc9zeKBhmPyinb*7gM z*a{-Z^a9;+4ie*2UuqQBR*fIe81qIw?3lc=)dGvG&^SM6upM|=TiIV_J~z%tq&mJhe|?nz+hxVnWi^z}$Q zd?2m@T3T__%>D=5n1yy_9sWDDMY5r2w;&Fpl1v0wIoRZYclP6Q<*K>EtnI6;<+fja zMtS_9#^x=#8KZdg?yKAS3s1xhz|5Ls-k|%)QyX2GKRl)WPF02(@EZ=cl(P*r#W}8h zx||ioud97}dAL{hR?V}@ujM(VyUrVG+Pd2FC9m4U+LFLKkJJvW$n}|_o~6yhE2UH# zYfI2b5_QcH88@0qJZ$SjKjzC-GjIV~f=%j8N_8J!pS>H@a#mU?3e=P%$;j^AfP&{q zJx+gSJ+AS%`OcU_7&$I2p;kFc4$~gn7JXuMGUM)pX-;{4jN35k0UzXnIM=k#%*mgx zw6(-aEtGBSh>J+CrLR1h)4`N6*LTqT)HCy{M!ak?$1_Z4gd8`SnGR&zM|x*3(ugMW zX(q-!v+Ys1x$a%s#rd~)@IwjkAViVFP>QyC9Opa~SSrhFSYyXI+hCCaj*>l6Cq70P}Yw)k~I+SN^Ho zY9*@YRi6Wc6Vj3L$ZX(P`50SZ&9!u6|IPGqff2awFgF7}1a!T4$AdPWIMF7NR$s{{y zVydn9HE~2etFqe&q(VBSt8XCnj9ml9cYoH(oF!#&SJ^E2!8Ri+O7lAlJ%tnV4 z0&lHy$p@i?)+h+Dvy~SE2;_LC1AI zL&M+xJm@4MNC-t9xHE;`P;c}d+*R|R&`tLp0Gm+Di{LH_6I7yQm_FWnq@VN`@8JdS zkiUN8%wO*=+tW5}ky9QZAZxs#pORTc zBJZ6lF{9}cFYvojm>U3ZbcuO?1e5$A$D;M z3Q=HQm@Y%_#aSjBW)ii-Zht_Enf+J&B3feJh?d2i9NyJr1Pfem>^!V?tM zB8xI0s#b2Q4k!qCsdBE1t}$)oHUU{XFM#@!V30AxKi*s6%JpqM_v$Ct;Q-mV9TXFd z7@x0XeHsi>@x~bUoH>JwHm?~A`D8>e#oc^^F!vwW^>5=tKmotZ4PbLpqe^Dchg6_1 zk_Dfc!@hlvJrcIwGoP+boX`nL)-X{ncB?jTL|LBLX)7kz*%k1IYMfie05gM>A!lcM zAthw0v~(UBeAyrd#Q>I#duoHW6+J^@wSv0wAZD!PPw#&mxCuV{4gj@x@{gMz+v-hG|6-E#Wr8@C6+tkFXn( z1=w2;o0?l5akqW4!H4dQYWemmfpN5?5a_{m&0fL8I_w!CDFNnV_~c+{AR$`HVFO*e za^M3Rid>_c<}Lla2gy=`-C?&DyFtl8_hN-Je_?C%BtEukXAj32SKL1G8@+>u@JGM3 zFVA&QWXO^ZXXr8a?yHoV*?zqo#d&EURG7B+=-d)xohKQOJZ{y`L?5o3woE?2Ip*8U zaTc=MW0jlPzcIB$@GvFc6tP8xYpt|uXQ9@JtNzshpvX#(?b|%m+DFi?>;%1#?EAtp zXO%R8gHB)k2H6n*F6`IKyK7P=9)uJ?O=?>Xs=GLGZ@=AJj^EnK*qWo2q(Jaz50DC~o4BlhKA>C|<(w?FJTs8D(q-r1d)OTvSx!0c3=6P6>*Ajoc zB6ccyjAa{2MY*)P?Ytb7%jf`p4}IV-bug~0Q>iOEPMqpJGDa&LA z3qG7lXk2_?cdqR`Z0YEmb6Que?VPT+THEP-Sr&Mh_kRBrwI`*(zwg(U_k1|@hrU(@ z1>oble&yngo>DFxt!o?bi?t4Pv>f zyI8EBB7U3Bzq@cJ@cBtFYpYcwbQiZ{=PS?;)Lz<=sq_KoJBk!s8kpA-#s8PA&0c9j zrim7jbR?F%BzNfAhD%}(6QvUI5cPWRe#V(Zy6=RxfNQxq^>sumKz9^l-16)=k;OE# zP&|Ka3TK$bfa`o;R%5YA6p4@)Bmf`vk0Aruul2Q^_FLy=l6dBFh{zXxksns>@`L90 zl)vKxUr>TPi{E#Y&Dp+3-gAn*ewlp?ZH1toY2Sj!)L#~T=7f1AwH&8q9>=&yGP5a% zciLb2r0*YP@ouW8BTDqe*`qmXONNZjQGmM%$o7B_1owoa{8|=J&dy3vc<2Pex0r{4T!O7enUym#kEC>-=(aCI(tFrDa}*~6hvtl6Y9OOz z(B#tizRyB?owM}3yEX@js6SF_ELvH{0?T&~XHg5C}1!z}kg zV*7r&6$cHg+JWDqq{*zafGB$FCYh<6*9Z;SHpMKFVT zL+v-0j60Ty-8Jw{FqT;Wm52 z(Dp0aJ&xW$v3;ogay2b<>fx6z%(WqBLmFI! zZ(3iQYu!Rj-XqQS*3}Xmw6A5Z%I7@&UGamn{cLqp#+07a9oxE$?IxOO5B7ul1ovjS zLH7DhWI^x&zvZ27cq!*H;=4Yc#B4LSwoTz?QI-{m6;gxe+u8S%uee>FwjRQBgu+ZS zi|SkV_XG@E|0JwgEH#e(__HnZ1S?VhdJNi@uK)EI=;IC3`C~z_SI+G4;tl*+irEj) zXNiX@t6AH`o1_GT@Kn@^tiC~i-*})_@OWGs9?MWhMO0Ub9Yc>I z3Pu0Cl%5{K(tsuOUqnrx$QC$i=s6>wU-RI^8OmXY(gIBE@CV5IepTZd!!b)J$1daf z*skYiQ_nsyF5BROE@Cy1rR<5GKvO&yb9PLRbl|g*3I5Am6~$bkCh_yC;@Z2ry)9^u z)e{{+&T?#9MD8ES{gT+E`LT;UIJ~Ji+D9M_z7aA{DDxTQ^ta>BAdh?Ft$q+)>|O0^ zUB#z5g5BgzF8X_&33^a(sUJW#b;`z;S|Z71<4(--C*5m7mBtZr_3L@Y7g`Q;PUe)K zLAE6{?Ypg?2L~Dds*gc?2>KiolI6GvjEg>{O~&JKc#;^>s%_cnqc9a`=z-L8Dw(st z@CzL+ha4xMW91P1#)^v?ac`M5%u$qb%X`RUdPp)mI5w=(6YqoDANAZ(B^Uy62n#6P zr8|MsP`+qOBnn1osU-`Gq73fbJ>l1S9&~`#wl|)mtd2e=jDC%5(K>g8N20sVDS=DXg-)MSX!v?!SM5@IoHg6J6>Y7_ zC3vJVm%v#MpiV)at;2>Uj8n3@a@Y>z=Ikg0C)k>O!K&b_chf~`8N32X^sRu{a^WXqf5nM+{9Joa=O z;`^Hau#NX2FV`dDTzJbRuX9sDv=6KND^W9L=8iJK)oTyf%bE6TX6C$)42pGhKD7>~ zEeA*da)R_oO7*$$T+_*CUbTe_!|`8+_UJ6SZsMHwA$#|{mhE1hYsZ?9`PePy-eZrJ z^qXzreJI`($yuG%xC~lGTs)jT*5e!X_dLfGAM~Cb$2>&NT)PO()BXlz3OU7AIgT#p zTbo}c7yctpSRd>wo4fJBQPlEtSj@a@C(j2%7u09;JS6f^&a1W zVw-Nc^v9KvygjxHDuqqI;Jn-s2Nrj2>%+_%tg&N0cTAKq)ZP*wqXtv#6f-dH%Xw}B1#82T zfD~uLr;xIzZ5OA!yizC29A}=9x}hxk4ESnDM00q3=z|oXG{x191|%L_Gr(ipbc_{j8>=BFbL`%y(Fe`PuKJLfIt z82Keu%5ehmo?*c=dh^@QQc}RV-7BWJD?Z(r5sE9hS)uhF5TwZbW1T6pO2?%3@5XEj zySqG&yv8$~>9ffRVEY6|KxL8ZSj-a&qi@`%z^{m84_%Zj5Vh`!XZe?J7HSOLs4III`+7G=lLotU| zVIuBdfkuv*omnNnk`u%>rdOpuJ15MYeipCTrj$2Kb+nn7>7PU|MnP9oi;3mj8ty;u zs{vS+?n?5ESlDqTHzj2}io9iCdto9pK7-6$;0;+b8beI!NVzO_G>ZK&{6Vv=mVQCKt@!&LeT=!S0aRY# zdGYH>kvWgyG5IgGENB$*q3%y|{THwBPl5x##le$M8-D~BhH<$+C`wiYrM$zr9K%we z@jq!stSSJhJ3_q%e`-pTZ!sEj5IMZ|y&={9omm@rxn`0wLew02lkVOGa?%M3jj56` z3OiqsGq5ZtAI9I%(o{o!$ju~mifzzG>w!GiX0Fy`RoI^pt)m`{JIu-U!B#bS;|zp1 zcp2?-eDj_#!AlM$rXEJH$8z?BM5BS0e)g7kaSuE;5uGbn?nl;x-q?$o?{Lz;;j_Ja zjs7{k@7&ULPxm46qe?_gRJ)vYH!VkXs{ERgrnfa34+B(2C&qFlf+pG%@Qm}VNZ??f z@oP8KgU`T2HLpk|y&j9-j-h*cy@8}THXKHvStGBRue}q}loc*+qz4{aCtMD_C2aeu z(33kcKYPZMy!EjaTgwNMfrM%78JOlMa>$G_ znrN+@q~zqbV4$DW3Tb0m!wZzYZf?KS<_@%La}X?9N^E8l_z5foax7Svch$%7BQ3$l z)Up4Vji&osk>{jrwZ)u;bZwoy?n8A|De>XYo#p)YfpE7?M1ovPG==bWS<@%N@@}{E zxVDJZp4F45)^u5x(Ye!JzCO18wDcz%s~N5Rh`H@-k#!(jbaXo7SGeZNm8F45aOnwE zNp+T=d7Wb{I zG`u?64fUOm{z}iVnvM~vZrD4TgY>5Do@|yezODDJf$N#>Yd`|Af38y7F5?}EV77Ye zA68j+4!jgBOK;9SXOxoOow^g)quthHTUe~FBwj1OP#kQN11IhrCES|vQNTfZ$e`^tpd@Vq&IxLYe(U`k_5vC~ z_0fb_=LF>}ZBI3~($EkbZLuxiSTjL+9Vv1C&XG4(e$h|(@%E z62PKOg#ae5K>PL@A`tr(C~6uq3UABBIu{}{=*v8x_7y>RkIf?fGuFv7qJAi4t;J3c zImfJlMeT~7-8uJUSHMRBJ!xpm;%{)M-8HvE?u-jK`?M4O2YhXnkPcQXsFs>%-Bz8A zpAtPmA7}y{p)bB2Ni#J*(Qn^oj$D+p6@q6+?Zzx6gKuH*AnHl78otBj81Kwp5( zd17hdC-&@n^-8WGeOUI70;i(NdhLO(SJ=$9ylMK7V-UYFJMR*4_CZAUsh%Ya{Pi>a zGR;KazCW=EZEMT1uA!q9NB9OcyLUZ4G_%Gs<0ooK#njSOVb=8@OO!2l&Zv|0IR?sc ztOH1lXEx+P*&w&anwM9M1-GE$X{_hwaH|VQp(IMytnGejnes1qo zZ>VnBMqjyWD0&FL??eBfH1k6j(Ro|R^bJ`n^Q!KrF$-Oi5VBs|fIU%}{fXX(6|L`o zi1}HDXsZ^XueC+B13l?Va~ZV4Wo24iX-Xg~x1J^By>)E>NN z9JmioJNmCBfj54JMj;t^KgR`V4DYDix3p=!0Ao>AS<-QqK161ZHA`DjaP^FwBV&h% z?k&4Twf}ZBYzSC9Q7==IXxCCMYP~URO)gaD&A62t?v2l9ra$aMYg6T2aR$DuptUH2 zR8)v?#WKNsp!GvR2tC!jm^oIZ%D8bt#_&|kl3vy`w4K(b5^qw5i1av?&wC^xdi>Uw zk{-@@nITcF@xcZXty;67rE49((_i?1q&IPXJ20hf4_jK8xLd1?Emk1LzF6P4V^=t2 zaCzgpW+%&(@H{WZLa(1{W2gQym-bAw_=DcTN$5|+kXZoLt4{W2{Qg<+kody3SFIEuj9Zbt zpt<}PybXO0p0g#OnW};(`!$AFEgcbS4^5OGw=-6FA%7F9lcbK@Frwpp=9?0Z+|P{+ zZHMu!Fx<9$4)Zgt4Soq5=4cnn0@tJ9%dnnUeE5gHk8x}5k+p$dz_Dd=ZU(1_{^;%5 zAZINP&2jUR8Za}ZrK>5v$*`0E8;_6lFcNh{%LAB#$#dQ3H`jwviDt>rW_n0Az#Z&N z72rV?!-W>SvFws#f;qJro?6bK8MRm}C3rz!>j_rH^GaH|B4j)~Us_uypnBi;3OIl{ zy}`l#`MXvkpcd3HS2d!%KlJi^E3F`Z(7&&9T|kkQotQ#4Ok;MP7$) zBoAB>MQh`&WV^maMqTT+1odsMrxd!f3biT+s6RUYwmjk^!Gt;U-#!Ks=EMZ}H26cU znF^{Yg>|QwGsdOW2v2b?D1(i`hoNuWYMA*mRRVBD|DGxSgo?wqV+#?jLt5rqvm3)U z!umxdJP&thDFUkO$$VS#Ik-h^AY4N#=0+!<%yT+;A-IfP;5PP7ne9AuXo$?&_taI5 z=kZl-SsQ8ad{1Ueue{9ruVs+9MTMywDX6g}guwT%|8k@zW+ffgCk-#6_Y z6OtdV#;CPRxeo>91xCm;-sq+N#xq&&=_g&3A4JkKM|u)}dtHm&@kEV=!I*{t z|H;XD0tGGag0*99ar|RH09R;3U$}#{^u2f9SCcqfTA*B5IAP^cp)WV)CGD_s8cA4T zF^S-@k?;daW;C#IRgHXDGf*}LEHXag)A$a`O5L=*;lHWJ8tqL(Ko+s)U}GBK-Juw~ zr9SVvMQdq-#)@l@04yzZMmxwzQ?}clv_OxS7Du+y>#M-9oP!;ak1C26J@2%Jj`j0q zmZWX&6%Z|C4_qxp4zRfYr178*)nnU)u)%`MSX5*u`HeBTXsYb2z5^TkF z?by~%YMb~vQ&p{G*$jie$#=hng8aqIQ^y;xB3>hj_!D5-)8?KIdL(6LyoH5psstKsk9!&)8o|)!^-D>3WDD#qMsZR?9Irw=~M9?UNHX z)Q5}#EOvz@`6cu#T7_~Y3Q0w88#wy%6gH4=TI{KB&X*O??|5- zb6|e7#4ah?ei_(m^rJhP1GoW=c;a(C z+g5L$HFVYvd3sR=YMvf`TfLw*63y*6*`~orI~0(6*98Z?kAtgYuI~kRDJT6M=j1ie z8LCB1CGOmU+wi2pLU%G5-=ze_SImJdioCKV{Pcg_?E|is*m7uFPw~2XbLd??w?*-{ zNU$50Unu6cJb58}$_72LdF<(6p8}QuNbJ7`Q^R~mFkJ60M{enF;~g@4)DV#gyaD#W zdjjwb9@nEbzYpCKHToF^Mt&C<>1HXU20j0DiSMU^9dF~Sc#d!Su>_0RfS>37Lccs8 zM!@?)`Eqzy@VJKy$mK9q3HvYMtFKW3&E5pfM*F{#eCXYwoI6x!rI=d97ctshK_Vv5 z8_|)`1bKrsak$EeR6dBO^gQ;vvyTlddRoT!-I1rjzF*mN3%*)NPdLC^aOR1vhJK0X zj2JyPkSgk(w88Q*g4)Omz!mC}P}n#nwV2z(c#r?jd&7d?aVCe+dZ_VxOECQn1AmR~ zo8Hq)SM(lPf%o9#ugO8({j>kcvIeBIlztnvav^Q z>Th$<&~60&0WB!{x01KyF1F4q?d%AF>(NKrlJt^o4!yQCqc86UJYl3e<(R9mJc6dN z9s&f~>;@!BZO9K+Q%{4wv?m5*Zodhv)k<`5e<(!@IEf{D7!ctW7Q(Bo>KVAAoBVAG z1!aXdnvA@n7yLqg^tWsza^!jIw|MC4Xta!-P_{Tk9(+^Eb_?&09pb({WS9AY4G^{k z-8ZP~mvs8OUINPoUI$N5bk8>3qm2m1QBdtfOoZATp*-dtWVQZi$(h9W{ zy-2!|@{jZ$3t-uz5@7x09o8v+>)t_TBnaXn@UhCk!$yA*W9Q%4V!kct*cS-yhXwY@ zBKjfKuJZAn%I_L{i6dAGvNq&si8Jv=u0fQz!w~BY)r;&c)DTAx;iXx7!0J2_H0Xw$ zS?i&Its@eJpGDWfnBPI;u;cW5tT)IPYm_lce5IC|goO~t*}dQ$oElB~gmwq|0oiJ_rp&1Ck^CB7!9d;qV_~`{=y!7u~+FM zh`TOX zym>RTw^YAHb&j=CCbYe*jcunKc>co{kX!1N&Mp}LGUjw$L|!I=k;nwHoI!m$iYGxy zbqBhMexj`C^Km>WWpYZn0|xnV=22Zn{{>Ij_UMeHs~x`Whn9&xv-GUkSpN2mWBbE^ zabJgHUhJ2(c+_FG;<(hn{sG^ZnN{m`Wl9OqC*nB{HGnfAM*~L!@?ZfSg*#DFiMx*W9%i4dCHG9Bn zXF!kml9c6~EncE1w4zACN>WbJL*jGs42+|LBb)OP`;oID?V#Es_A|$s`23iCNSEhu zw28Dl+%IM71n{|Pr9ILWj+78vq3o<5M)#9eb*1KM zz|EkJG3tz38uF!n!{c(^CBB)n@rPB*f=JyLcC~Vhat5Hbksrz}p?OoRq>d3s>y({W zIZn)7pEI8`AII;~K8OE$^%5XwB)$)E{+Wl@&nK@e_kJn&ti<=ba{C?!r+l(S{SiJf zkd9c+oVtHVpO>;8#~v(u!HsFoDddl{ILAjXwmd;Fbu-R5*Uy03^BE4=Gt@7hhm-Gw z*TMTx|BK**mX&et3DN$$CwVAuQ%c~2FG|}4A5dE|zt5OFMnoQ(Ur8}0K$EADoC6Ra z;z^sH;Bp0Um9UW%n>)4Sx)(}siuM}NP4w(2KYi{}B?dU&Do(q?U1xd+v?yxh&5lzj zNsp1U39YiTJZc%B19{Aq@EluciL=(ywh`_Y9tJIXL+Vd`5H(R3*=Ovl9(??=hkNAe z$z*f*23+Hln!*26;@radiQ{LchnCr}8_)+(WYjbUHNjoWlB!!W`p(v`%&txum|XKiq~<^QP5LQ!u_gT_xrQbcm(6hwGo=~ z0q)0Aes0XNH*Zg>rsm4HJ~Rh7MySg#f+A0KSkvkra^9*EsYzUqla^K_^#Gz_}*5;CR=3+CfK$y~ z>>X+krL8B#s2%TO;Jzs2zNMFstRDYP3nTO7_R`rG0O}!mlXNiHk|5iNoTWFNITV>{KJmtpuHS2Q$3tGmx*I8MPEcOa_R;X3dEBmuP z7_F(&qIITaW`Cu#iCO{vVwkIW=auT(l2$|Jp~}-TN^ELpmIE!{&jsHU=B%dK;Pl4U zb^i(J2M1NV>&}9?s&c=(Kzr}mXIq%^rna{qPdRW{Z1b9USj|v+IxEwnsZMa0LG@1B zJD6&o+2OeDwFpjz;1MU2y?H_dK4LEvHW9y@>W9ss-#9LGpHJ*+prgv%{fy*rcYzew z8EZ0gvro;?VHtI9J`pQiayHuB+e^*CS6f#znC6*#oDJu`Q`Tl@XD-MfP+QI4c)C$e zp4YSBrsQ(WJ!;3x#}xEi_o(UJ^!pOvq4W1=pjdqLhZCL~I%;aQo2h`#Z&rVmB{!VnlrIAVJ5c!E_2>WWLtp#!*PgyM_2`dG_!qx+_Vktq-}<6I z67SBHiX(9?R~rlD)_L3B-_?7!VDDA080L$O&@1|0(esLRuUN?!<9oeg1h7{q*1FZA z$$McK;+Dg$U~;+8Hy+}MdW<4BZ%mFkbp~E&e3p z2+}K-{bD2Tyu!v75CtyUj`r8a3QaUNGT!^_ER?GN$_^T8Rbz{YfXeD%!h#`OLunn4hW#T z7ZB9o6(1QGo~q5{3{hxvxDlng5 z5aJC1Dw`4qMifHn(TRCTNxBrwLeGojvB**W1!4VVW&Pz4!w4{rC#qlvtQVybFAo%l zYn_)xc>>z34pd{e-o0WGAPnL!b4KWVIfs_zFf4P`Tr+nh*AZ*zL7k$Awi!kjGN(@Q zk|_drQDRtG2pSs408KXq2;UTZ21Nz|gOEXq!61V&g9?L)!3G9Z1~mpTgCPdP3`Q7i zWUz_BW(HdrY-O;GL7hQ^!FC3BF=#T_!C;iZP6oRe+|A&94DMmDn*si>mMPrF;C=>U z4E8X<%x?-0Fxblg`;n%A`QH@wGkB1}0R|5-c$mRK28S46JH-?}z~C?g>?lGcapyYp zA3b)R@mDqeD&wzd{58g3*ZAurrsToI@Gru*EPv>Vf>-t9V}uVNZdFKBY(`aV2KprZ z(=A&gQx*s&IjfeqQ|Fp~qJgDqGk|@v`lw1;>wJs-X|{3&>3mtPPSQ0_hygJTB5yHr z$cy3@TF~9i5z)Y0h_-fjW30!mdOS<(5jE;^i!TBN^I+j^s13%@XE8r7V^W~)q71&r z;FS%g6v|wUQ2|4T*$<|HEgj0`i$f?kl;gC6M0`~S;Z-|sOUbyU-M~ODS% z5sYL+Wu{tlmO-dK0E{eVw{8^(%n!q+UqPPd$(X2!LBynpF&KA^ir8>0A%(Go5Q7gP z`UO-ll|?eb-o}8ab>8L}#jV77s`EBJFsumK(s#7W-(mdc8rNGFMmV4IK}p&-L#b7x z0K=ZJ!KNP{U<92>HmXrv8l>4_B!wN|Fn?E=c$XFf4J?de>CNbzk7lt!mflk8ymP!&zyj+4a zW#VHp&W}OikCCNgQh$}&X?ql&EgaJ>$XCG&dm6Qr6`(!btunJJJuGO0FiDL=94A`pRkM>m{{O*4kB$^R4*)G!S6r_DVAvg_k5d)E_Zgj&=!)bG zOZ}>OZZg@zfJVL62&agh|5s+GRa>_Qc@K3weg-pf6et8CQ`J#J8?FQ3tW0Z}lf^C*MwYAemIBf0l< z$p60HzA63@#Gj9F1wkQfz+K|R!mA#{oIRieGLKZCVTeQs@d*OBcDP1@A^KB2mlx&( z_<=zY+J+1aY=ng-K$T#Sam-cx)`MZ8NxDKC;N((ydYD@Bdb`YdOp_O zm}jMDrk%r#J;TIXNH@X+1I6uvVU##G<=VchvKilYcz z*v?lOd>h}D$g4Nt^Lm(Ly<#4fNA>%HCUQ{V-&}2e1ZNk`Cl*;K*OnV7M&dgxFCv1Z zRVoopcE1#KzW|xYCFRk(4g9%_VzQS|f#?!YnQ}}oZGV!hc;ys5#iSQv%l4803L26@ zTtDgvYkfVekN~zC)+#I5mc^7)U}^@+WGR77{E?7CZJykSDmB=qBm`KoBC_DxY)HYL zptelK1iBQ$Eec36N%}z^$%5?l1U|E%kwMPe5OAJNuUfDH37;6GgfG;lQfUO+QXGxZ zTjNzOSBe;QxH?}6I$tEf<`8!COPRGeJ&CkjpYkbR%w7XO18UT_1Vga;9P*e{damuk zFmv!_9=|=6Yz|_VN4-vq9t|dts4z1Ht`*Dh(VKlJcxWxYdy&>i)t1Y_02X_$Fzk{D zU@#~NHY*f!h6sBDx1pfMtR7Z`h!j8oWk4n=5l0lnS9M6s0H;`lo)oD$9*SqO3|yUR zFi^2hjgl4p(XnL(2Nsh;U=8u2R7!kQm*g>xCNNzDGq_tz%M4tlK$I7;fgov>=)6_A za%5A24l6Gsz$S`C)ohzYo4s%}*xFOOSR6u_C2>7^RTa*0`}6dwx8^9}_M zJ8ZoRN6L)NND`J=3r2@(HN&rR()KB!$IT*r2}D}Ll>7V*g^q<*RCCCNo);Mwmg+el7%4)C_ZuL1|;jDw|!6^kTDPU495br+}ujSf{F|JsNr|N z8g%cG)~f(OO(L$Aq#i)w!H6k@q~Hn0o$vRgdlD#?#qCXzCP?(s>PsTKpkC$bFlli% zVi`q;gcZ1ixB$T>8t6*%v_?chIQcZt*D{$2H*A-~wj3+f3~!mJh&!8xMEZqtCm@g_ zH8^8_98`FiB5kmZ+(-kjK!qr4Zb~5Pc(9qBFH9s6a)htS0sWT#K^;|(Q7f7b^%u_` zgMo2L3P^Y94~GByjn2}}uXF*FJLO6mha|MM}L2F-8y5q1yaZmr=r{J|zS+L5Sr zw~Pc>0CoYS+uSY1UF?ScFx(iF)_{7L4iZ-QcBo~z)}Re+Bl)Y>R_VQZB%;BvyhGLd#sR#a3UmYQk-gW z1;IW21Xa$ukSlktHhAh507=QlF+n}>dMa@V$;XC8+&!S5ay6IVZmQc2 z{{{xIz}ADWtwG*J`|l}Mlww5|E4i2CB!UV!OkQwC!FUo$vZG8k3M-zTm~|%$K@Mj% zL7{}pN4)dyP*5$YALaU|HZ~9hL@1Rw?ZY}w;oJ*7ejKYV5I_J4mwfKJr!8Cw6W-H9 zC~d<^n6z*uZQ+V-S$Z!F;MgmKRvzRZQ-_&4%sl}zhdk2DX5X)cy&Jqc@eRK#&v zJ+6ni;jF8>SC-G+PrNUOQyLtWm{VTm=-k}Gi^rGemS!)_wE!qh%|G8-oLy?oa3??h ztdF2O%~deZ`|@GX%wxj9@WBy9o%_i+Ud2g;7wWBy8y2W?_5u7T?EZ1k{RWqtFvs~& z7T+9{x(auqPwqa~rOcIq>%d7V2f)@#isrAH9A#js{c<&dBB{Vlvo)uMd@*RC!V>)R zL%&ERD`sG><_3)-Xkc%HdkspyNQUtNSB^#*RRJp$e5n^%wxl%C5nS_5COK={OF4&Z zL@L?hR$8`AYJ0&N3gaRNMYfY^L?TO)zAExa4BtjQ3ga>ksr|u|0mWwX`%lf1!P> z)tcd&lLE8*w;xxQGw!f{!sl_2<}-qeCp72JkIm z0W~;?$Y2>yQ^ehuLVkf(AacV`tiz4ehNOq7YC~=$L;Oa@0uW1v_>FK&&K$v5&aE2D zaP6>pBohWnv$_nSQ6ZNz5~*1CTI(lL<+uckgUu{Pd42^>B`iu<{`{q&`x!9InY{lG142O($z&%P zX^Bj(146}IG?Z)~`=hJy5143m?N=V1X7u>s;55KwcHdt2isiMcLO#{y61?IdF?}#Q|xL!;E?{wLlg#0w$Wm zwl~?TpTLzT=qCip5etqH_5|?lrHQcaZ{i^U@E*n!@kQYQi1;+>u2h){7Plbk7K}F^ zGilT@L-C}cffi!A$m4z_{wQm#b^l#zu`%9yfi?w6TTF{Dm}Q&Wds8o( z%Op-aS2^um<)53dN^ZgeBA;i_5IPezqMgAe8L$X&3e{LUfRTVd*{I(g3=6UzwyYO! z54MWC42tprRnSeY`-5#XO0qPxKpH5BISH9BIQxPfGz96AUCjeSb=K020LEYpx?6(I z&yu>*os-l=(Zt}R<$;N~-~%8?!bq}Nu3HYwOJkON7GUFQri3_4D56xLH4r@Mg+v|GUlU#v^FV7$#e^yF9&?w%Uvm!KpeL&`+wxlu>&5n8@069 zwI0i?*cA76M8|&@5pvpW(oZI_;8tInYtla9N zfH>y+iXunpu7P{GWAT8+nw6DSf|n=7qlT?#6f;zCsH0N0*G8`%uj zug!s&&?VAs$u4k$N*VI%mm`Z)0qj;fwl0+qpdt&^TDFujyIwjUNyKf%LfBzuYD9L1 z?RCe8l^VEkmEU48pgva{%G{FfEy+3t5=0BormqTD0j!J!zB&^uDsat+_Dd>s%2GNq zGYXT|syG#yLQuLa;=?KDkqUmXkh<{UeZekkqG;`%3J~93#Fnn4Kc67%2)3<(iy{u4 zdu^zjo;ePiXj0xVOZ*eR}I-uAQ@97pTI6Js7Yx_)d!T z=Or0^O5TsxM<2ylGT{-4TgH3!^M9j)Y-4^A>1XvSY0FJ4L4O;w+a6cE4a_MQ7 z=C2)M6N@K|c+LsOjd*aATXFBmrrJA*;3JTq3*_hceFA@?5a36YV-a?3u!F|~7Ce2< zM|$vsJvcmo<>3k9@p{ce4CnXE6)3zEX5tAK8MeX{92<|PLEMkP15|z)Ct~!C0D@E; z-*9xWW#+LGJQ|NPR9S+8s#b_c-buP!O>65`2e`wigVZimSr-b3gN4U-fS=OmQ{k>Y zW|X%D8*ooP4paIZ)o2>oBf(%l64Fs%bpv=v;;|ouNg0U%Pz_31u@m-Vv~_Nd%i!@kF#M*uu@h&I=({9(1VcJXzr5a8RQ3+7aB<3rMn5h4FLDfIrf$br0gi z3tPc2)jsbtdH9K(**bn=^3>yt(-&JWE-bz8mGzS!J1KlGA)J%<=c4xDe4t*0ay{a6G?^^Y*LbPq!8?&bC=Uk0lkD!j3L2EzX`>UTTdsFSgGwEY8iI z8*4g#!7l&CnvdZie|fPrG2dEVTAZF6Yd*bvZf^GcldY?#7G7x0Pn>)B;pqeC4?MK* z(EbNodk-EO$({15CtsMo1WL2d&7Pkom-2uEnzQgk^CN5)8#j&b>vwH7uje+KkDWYr z@|(+lcOm%OXP^Ai#OdGswbGyb5r19y*du43X+wf%PtPtcx6fXfT{?TJwYWIFI6Hmx z>8U*@TZ@-li)RalUG{Dr)TGlNT}5spP9qELvg)#w`m@c*e`=$1POSCKT2)lHz3pk{IIiwTjt{M zGI-n1+VJPsfU|IiLC-}h#=L^>^&^|jjE-V~g^z7EKh1n(;;!_AG@%EXM zcw6E}%n78Y5I&ALukRFo_Fp`W@4p_kfCBFQxyJ-{8e?n`bok1S7HH1nMHLHDYL{Ut zzGGG2^u#yR@NGWwwlTr@R^j^~ngdUKtD?SNW;Lbjg0mOzM%2Ft@m`X>C_jb~o=a-h zw=?qfAbhKCww@+%_wvz)1oyQ3HZ^(kndFZH$9;|YFkVcMlh*Lfa(rVf-{*4zA>W0> zRuP)M&oBFH*Ky=s5iEl@+mT1UzJu?6n!~$|_&*HveZLp*GLI$DYU2B})b|nLUf%^o zY$pr%?!nuy_d#hd-z&v8#qu5XOXz=nSC8v~w7qOM^_4O@iXS%d=WX?lKUdTwF9H8Fa% z)gFEHgO!29)9rTa;<>r2O%RxGPmC@v&Og#V|9tD>bbHT5_Z-Zg^9vUrnQmVkzr1g> zd2xDv_PJJj$xS3u8%Q;q39+e}*8CFYryhd9>03@(j`nXGIxwmU%E8< zfKph(EU+{+|J=fD^7H;tDTlh-cKWkvKo(n{T?U`6nWqvC(ZImd8fbh

%^OLUkvm)$~GIXz#KkX&6>mY52BPW556 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'~jy7KU7|mp(fY4D*l_AYnecL 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≻t^3=T=ntL$HtY^Kh2;?M_?N%SOdrG(WKrDJ?X!-TpaSFP8VFIqBuy_i{%Y{F zzRhD+RS95*`=;_Nm}ondF+k! zmc}r|j!H~zY^b9I@pve$oz^W8j%_?+fIT~*h%`dqbz)$vHKrE6$C(uNX{di0hjmbH&JbcgRXUhpdpGV|QdB?`w z(@dXl!XKbRx*=k{$)oOXtjK)e3_i;IQTxMazG8j%T3GMl+}@m29IVycl|V&sol{&R zk8E)ygTl_9pW^P2<@;Q1o9!BwW*@e+&&V7Cyw!5OJ0xlIvuO`Xq=0o6sN0RAuSaa5 zC$^)?^3HZkCA-6}P9uM7it|wr5!fbJm$j0XayL||mg}*CUa|q8?qE~EwU5DD! zn|DONO-&^32*x0bKw#dXC#xj zPwNJU>nFCjabk7+lZBqZ<97;e;nXO?lq1ya||~W{6pviyA)Xm!lrUU zgeX-QAMpBF>4%e>7OIe7gTZX`PT5bHm+={C&~Am#S?p#Ut+B&(-|GXnJ1A98Dezwk zh%F1$TW76hZE@JN(ppxH$L78EhVS9BX}j{a;InPB#c9(3OF><| z)k&cikEPcN6ZCI+vG!GTVH|6?m;O=jX?d{rJ8W@5ikuw-v%gA-9jK+uo*Y>t`>>s; z-#-@DiS^uK3tKmbcKcwnKV?3}x_jK}dR-VvN7v>IJA1LSKo^=B`&(I`*Ibgmn&Mqw zjZf@~zG5MY^j6f7mW|u2dKlHKew3B|v0A%*i_}+oaJU=t1D&x~16|gxAGp=F*hr<$ z>5N(}a-v9vsEmA`D4(YVXU<@;djk1FhrgZvkMJ0|#%|lN;-$5R_6@XMX>#b_ZXlIi z+4isKuJMbM*rvdtb!=d(kktx%KbX5vH_3x9TFYX*1WVN^29K zU#^FLuRwzY@DvzQ{sI$yuY=xyjB%k2 z*%Gahdg}#$g#=#g+rpC;H_=Hq(UPY<*0`1>bQZ}X>$5Hwi{W`A;?#---n2+<^-f;U z_H!6T9{RT%f1q7wZU5EN$V<0xY>ALgc$wC)P>mRh=shu^a^uQwE2+g>jo(+cQZ>bX zgbfDT&9H4_TRO}0VmWN*p*a@RS&4a=+Oxu>8)ToZM+N1Lr|GkSTX&pn|Ys+3-^TA zZIFwVe!6G4e^*1*zTMD7D@}Fp6??50w2?*S-!9)1d_V_heFo!^eoM|)Ew9niw#GJ= zR!}q}YT|SIyzm{dV;@>je`S1Z<~@y_UdmK|q~~3$jX$nvu#wlomFZ>tIM93b2l)7( z(UX^0h^j|JvFf?@Tp{7`G2;+hw@Z5N7zN)l>)Ts!-@faC@VleGku%E$7Or^QmCKj+ zT5ULb*l)S$XxvO~zL>IU9g(@|Y9A#+9m_m;n6AJWHv2~F;nSX*uj~;pHH*!%&mx!c z2q`rg{a~9Ny;DO&mbxh5Ks0BWN;;zt%)p*cVGy|ib&lFXud$2j0j+nXx9wDY*UfaA z8YSK$?Cx@g+MWwoBfdFg>|S`zXcaEH6RedA_f30}dOw(7UrWPtw^nn|PF@3DG3?ea z_+_gLT#5oN9SIZP-9cR9wLeF;X|HI{EzHQFV=`-M(O$2;Ia6>P1hv1{f99DjLQ;ad z7rQya#_1M{v?k4SS(&yMQ8%%pM%2EC>{C4z_lZcYXO2&tVInKon7r`<+hO@w>PtFN zkmD^+E}EJs9UKcReKm54buZl0PeTY)wgz3BP0Uljm+b4#&PAf6tR}uxvrX`J9P6O2l4jMBV3OjS8L8>0fd{Y&UeU_U3L^ z(doKl5U7Hc2R5%IAeCgaPy~3Z>^#2e%uYV_7oCrI?4oo@&ua!}xzSwwUXy4ID#N~GbpVXG5#h|6&D!FZX@rA#y*6%W^ zOQ;#M#65UCbRP`ljlxRTlARDBjZ2O1klaX*1>bVSkaeBq$!N6DWDpAk4t3S&kAj7I zh9pF`t*xz)pHL}sTrdybLj|yimCU&L9SuGXUnIHZ;B@MJQ6y}{p?!xHLe}6n+9_Lo z8A?zsF#oMHIUjWddpBY8@-_-giXp>9O_pTrZP>?G#xirF?u$EUQf;?c!*wie-D6*& z;}1a=H*OXAUE{ro;BEiyoq;c4d=Y;;DwH*A>M3dS*BZ=K zDz|(wtZ1>vGIX_l6zz4d1alVo!XhKhj;p2%uj?K5tcAy3jyOS(M}^dS$=wRrR6YG= zZwoS-_*|9%%2@_HHa4@%F`_Qi;(%n*v+q9%XLdAW(}25&w$;w*3azoDaQ6hsRxaDe z)h#8uv9+_aWY((`#95?KL=%#vlMKM)h$L+gc~GwU){)0R|8*0XGg5Fd9h`me6PqV) z#7!8kVpH`+$0SLIQf;;_f*Yf((xk7f?ok#h!$U^GA2KRF9od1OAL)%WL*I4osqGoi zCeE{CHHrDQbY@>c)h22&Etk`hP}MhIc~89>-dYZr%@KZDn7VB(F|@>wAk|csO+VYG zR$g{mDvRD?VTumMJ&b6}$Z&`K?~by!Gq3N5RP%gm8&%^S!xULZ#?Tepw-S>|;)a?8 zOxOiiXdGKc1f;K#F)Gxijb|RV+|i@mk#+V0$td+1%j^S1tNoiQ16w7emH_OgZw_+S zQPZ<}rV&tXh z)Z>^bEf0{IE;W5=|46zNw&5_MaA|=zq6L|j`3FShJ^H|n2JGdw58bSg=$-@UhhJsJ z)>7kXu)!K9ZdFLHOq~zR7H_6X9eiLOJPD`&@j3WeR}CgrLc!MA191%WX0A63yte>45moU7 znb=k_>lli*#C?n%tN)V6Hd~?oV7{;tIT~*Zv9&Iwe}i8SX&ucF^96pJ%Ijl6g~YHo z84aK%Q3f^^*=u3uDYsB$&WF4OEn=;#o{{{{9H}jMKOPcAEKdAEE{hioYRR6oGuPD% zS9Q_fwhdkwIY93O{bmee9=~&Rsy5o~(~jZ1G%Uzb{|=0Zm7xN0G|*!~kSKP7pu=sx z(~n?p1-Bz2+E9&=)AEv0MXL>-)Hj{O1g)0Ug3O!N^%d=e%4{=h;YcIgWn^@DI+Ql# z%+?@Uq46Oxv6~)TeTS-dmU1>8odFJ7hYVD!#JBVYYCDH#h@m0~JcD=#WoYIuoj z?RoeLjbY#55obFG(4WKF9RsuW({3Qu&a%u{8~Eb1E|g>T3M%mjNq}0|WhnJz$#}!2 zM^yv+`CzfWwhPkusLJ9Eu#C{su`t@8wy|nSWQ%U3&-D1N0NVH211}Nrb^A2@M8d*s zM9w(^ytQRc-+fcFc`W9opDls+#NZPrtvq2t&?|5vQW>_>Dx&wepog@8UTEC|Wv$FZ z)WYc1s+MArx=-~+m5sJKJh0fY_tKiee2#*c0SPTtl1X<9@orfW)ma(aeDBh7^#pHd z2-8o69T5L)r-g&QZ{v)s&Zpg&J8NOa z4k_#CNI5bPo#nzXgZDe#a|!?Q|O4Jjj~38L=&^?y(+klMl3=8njlbR|5x2HIU4j4L`WR6f`ci{H)rS%7E!5TF2Lj9qk94abuRDc5EfNRK=JoA~ME3 zN!U+nq>E(7_neqlEfr}2P3pmPX#YlbkZHc(Kvu{6#v90y8>(B#F$2h?EiyM5%`MP&M>32m>I`;Px_;`&0m)ITI44|J8bivWs>g_#`J&;}#-NR0?sosw zIRTVtcK;~4+vYAga)pz)XFYV3J7^L0%+|J=!`QQGq=+XiL98=cuLt8ruF45_Y-LtT zcUwo*XImX$+zsu!-5J9+QMGKV5yoaS+N*Ch(7A#G-{Ca+k#f1|sayBJ&9niEof#BY z(8e^&RvlHfJ8s)%JL6m81@dmKDX?{;sTMzOw;55HKbm0wi2P-=z60mWC$-WRN^}8(qKec z3NQo5*8U9IzKqq|w?Ts*k_c=tt1IY#@(>T{XpXAq1KH?385@i#ib1>dd(agOEFnA-;(&ZNGZ_3KQ*?zbjdS-W}R^*iy1|GCHC*wa{(y zR79N}fFm^x=WUKCiB7?nObyzgkBaku@tXc3zBEOk)3%+dhun1%|I44&d!rAr12e0f zK#f&LW~EJ$R{^Obci>C@@)d|Ws;B;Ao40*~1&x|#H(nFPZ^lbc$NE}56R`2WsbzQs zYu6v^XZzCUAJ7l3i{ znJxDaeySF%?|vO$&7j`Vj^SK)-HFvfhb%ho0rto=I_QWE9ItL?#&aMIKIPHBM{esp zriToVR;ro(Tl!kEMo^LYU~hzPCnv}b)zi>HIEMFFPte2@a-* z@8t(7T6cRa-U}_?lRJ9ZQuT5R=b00mSJ9}$72f%N1>v+nZ0*AWTPOH!D-}@I(ZYzj z)ZLaHGpbD16y&Q4%t@31{rL;3ZfAhbjtfGvJE@}Qq75CT(M3GYxE_F&Me5eoY~7n& z!xxZrRN@)^0*=jW9?!SKP%BJ7ixqM#3wMEsyJVOf&tb2`t{PV&^j4=5dQHz(gZNH% zDsA8~tq$8(oked>;_mo!-TU+?IE4*yOr4h5JJ5nMIunnbvo(Wr$fVaoYJWmJhGZgp z(Mq>y`S)yvOsn_Hx592fAuIt{dRAu?P}Pw|+Qs?GxQACQ(M{&&UyXkKxVA{7Z6}gy z8?9(dr|dF52NFYMzbyIHneFW zU<$Pujh|JEIA>zXvi*U&n^yXMgnbvIu)3U3Qp4nTI30R%D*4V@cwIw>&hTZa;4a^; zK!zOSvF3(!07YhIrVrK^{y`h!H#kZDC{Dg|a(lQ-rrq>Abw?xOpIE=CBTMWvl^@-R zq`D2dykSRTIl2|Ex?+26RUxJk6ZL= z51ef`F}0-LW0qX9v*{nezet880X+E`@_DydQirQt|Qo-;WlnDwx< zU`WXl&zwRVLNew3h>?I2$;b8;`^}v`{@dK474syou#SAGut+8=$F&xqgJ=q#9s2=q zxapC2rdSTfJ0Cab;DN%<>GZFyF_?hRa`EeAGLAYJA$`d7446R; zVer%xtg=hl;isc|IZ^W<&Kf*jFQgRDxJ2)VyW&hno`rlwi%UlVALB#&lp3EnE|TeU^0X>-vC1ZG&Ijf@+2Q82Up@zZ zw2w#z3NbrUgLSPl3@nFnN!bDh+UHl?p!1m8Si+1z(24;^w8w2*9j#y-u3)d0xZ7pM zO;njdzpmdLjV0WxEr^N|ltquZ!R?I&$D&1!jIbfr#>=vh#K(0nVqWVx5~vmtLDwzb z)^l56y;Vi7?flqU1=t>in(Hiy~gUc@SweU7?>Y}QQW?^;n)4O_ju-$MvYt6 z6cP8H)jI~E^K`n#+!h{Ark6lZ>#7#^@oDQziTeX-<~@y5R+ErdByQ5K5$Z(t2}DPq zFFT1Go7oH5f`lfpQ)}W5RoE9JZM_MpiJ^75ddhbPt+wnhNXiwtjbRr5;*`{s%p~A5kZj6rZ8q#2GFw7KwP(HBLWDxA z>BSln`zYwc8~hDC%L@N`vQ2Sj|E7$>?zH|bc^US~5)3bx0h)5V8I-1n&%-z_J|Ev8 z#X1P*-8R&hq42}Vi^t<2qu3}oJ{|UEGyH0?I~Nf9rq%sXfQP$C^9CFCnA>mtK~VfL zu(Zy)21k{6*hXItzz&i358q$;i{$vnc#FosP2_phcCOk&fAS;WsJDe}J`finb-Ob! zcLC%~aMHU(q1{`8dW%`pW`J4qzJhjyS>5&|%$l}C%<2}CzA8YTk(d!%aQ6~zpl!{o zc&9txdmhE}3&-<@HgnZx#FJOh;2y!`@n`K~;7nt+dcc6)ZHd+Lw%Pqt-je^Vx~Nmw{Ro!=idoUh_DwA>v_PAPPR5!?WVUTl zk1=WfZHwTsq>(izJm6oKIp+A9jcdT)2DS<7oq(0~20sU$22bsD1Dn!X#37RA)D`VF7 z&i13+cm{R+3^<5a&@wzOu>PoLc)D!iGZlZ;Y#LX!u^JmB-qJFkzA5p(G6T@z8Ileu`qV%3_2v3 zFS6H$5nHL~WK1X9Gy5P5Vma$o?3mW|AE2x;3M166!@^*jtb!bJeSNWir(7$auVtxJZ}8TCBY0O$zcLE z-63K7obx~j;tTel3-;JEfK>WDv6|+6?)`w3R*V(3GM!7J9q=Q;jP5D{JeK}Not)bW zYg%pZIkSXNErs9N8aiO{z(`}sx7Zt{yitc@cIKb-RYhxZ%CzIhNp-K%%JmRn&AvWm zE!xMBEL}%{D{y4iDLKnJS{yQe zAe-{3iy}*p^cIdIuT$4z%h9|g#n>U7VfmH6(g{$sEwLv9ajnDhZCi;SYuYS#E+MGoWy9(W3|XK)kG(|tSwlrL7e5x~&AngV zF-mY;=MKP`tXq~$JE-kV=$Y0(v9GPp@huykOQ!b64Bo4LI*Qf6Au2JU0#*cy!iiA&;=ZBstLG*pJZKYLDyq~!*>2Ca=wS`?F zK#z}{w2vJ-<8u?|HD1;TQf`PSM90vq95*GQ8EGh~HG~=^PTiuPU|X>7T50bfyD^YO zVyB`TZ97Fnhg%C@iyi3Vsi-~VT$eO15iB`4IJL1BbhD1wgOEqQChB~?JY{X)@+l3` zu4VKlDS@rccEDR&ZbxCBr7EmOaVae|lfDR9=#{q|V0V(L<1wHInaP%>RDX%<#nlsNT3Ske z6m8dV)b=XI((S3{@)(}Jy+%}ATaQ?5WsDc!%t30#F#{cPmopoe|`ySa4Snu4+sm#oNKFStqEn zZVdcIhtlWeDxsh_{ifQo8z^j{c;}wL^O>juC$aQFHTg}~mKld=A@u7^A8|~}7ge#^ z4UZcAWd_zxJkk_*ui3V9k`8;EKC8`?=m*`f*AdG-e^+B*%~{{$IsI}?zV#MF4YXLI zM%@$&?zKO89AmW4x?Zw0Z9Nd`2PK|)NB@!uNCwXQCG0zLN46xbj7lArm#=zJH?=MQ zOe-zU%4VHcz|OQ)LhoxUvFV?eib+cNd}!lj%L{0nWxTeX*%g{7+VBW2-u7PRhZw4T6kR~++S_nR$t+H@HuXEaXr_RCu&LF z2uImsWQ+=zBa-x&wI^TV8|?tiD2?hIFmY>nKC7&q_Mn!h2|4~{y6}!>$3q;0)2Y`3 zCe;z8b+(G?8FIu)b+iKyj&^bzy(>17hXed_io)k1#DHGD5V+oB8m%dV*gq zmGsNn$n^Jj)K>J?y(-9>XnGSr+3PBBU|ZlLoGb4QPnRh~C8)IV?0aKyvr3)8*044j zq|;TsN8N3Eb>v_7TF|yKR5*q zSry~VM4=Kkakj;i&!kJggO1u8BPugEp>U zAv=u8Zc-vaqPt}sXh6%lRcMf`Apdd#C##ipn`I>VG9czFsJ6IeC4{vzX7w9lgLeht zSAyX~jf%F+>n?QQ#BOEvmHR*NgRagJ%NH98C+zub9l;oS;nQmyhvo2UhU7svdgfn~ zA}0EOsGsOtME;r~t54h5dDb_{OXNr8vp+AD@fq^t2+!v;3|G%QC9fE8Wk%_2#Xu9Y)GK9(-rDPja!H1?pg>$)>`Z%Oh-C!FO|ka|B4h zBtO4xSHo-x4vGB5sO{dWWYRn{k9k-HeXQC2?If(mrY5-q9dzeA+QfD1iuAB8RkI(} zrnAnQwwE;G=$0~Zb(fOpR*`Y`W^XA;Mv!rhZ8d9dShkS*AurJje4@u!9J0yy@Yz*H z7AI}`2oSpG4ij{nIi2lUOXm#@;54Jq4l9Wj^%(O8PV6FHk4O$H$LPL`t%rk(B0KmO zxzs-Bvd)c+ELQ#1TEpS2tr>BB+9B+d<7;OBz5a?>^_}fv8%j^)!f@qSJPE4*eB6Uk zh{tFHcGzq0`hgqxT=C+Ufv>^?!kOurd&1XMcq$!O zv8?-$!Q;R1R7CG@>9>qlnGLDI4^#c%E8y@Hd+9T!%#<=`$x5FMEYpFxybf*d5H&*| zBERsZU6jsj#1UR&4@n(H>4SF9-4q5tF8!D4a70A8Kcw^3+Nb9BwFjS<+ZPfmY=2fL zjloXcrn+mbmcvnv1sa$Gwix_nd!TxzR&?M8vJYL^$1cRoXv&`^sm*3)tUc5$Z1t#)()c?pMnlO5C*u^;l>7R=xhZM4xlqv-W=rFU|4y zL}0>RRaO2?8AJYvr8UcQ%mRg~Jz-bg)HCjaAxkRy_Nks3kE`mtz){`9=9czFk2HQ@ z`RZSSmS`}%_-KUz{ja?z@jFqM*MqfN>dO1m{~3L;16XyW-1P;hhy}5SRHf)ys{NL5 zezNP={=pt6@qQRHV0WmdjoUm@#Ta@nawEIhj|7HbgD(Ltzn?dIim31*7mM9lZ(d7i zN`0Ou-lOza^DT0dZ8f5S|A180b`$!yEqcqkX`y%lTGkaD>rgY!u!6H~NAwNMxi=v3 z>?k_S&AK)kX_R?(tzNk)ezx@uc(V1*UB6@YRkSTxze8$~J^=C$KGlCJe6^u0s(*Q z%5*3b3;LB8L^ORn%H))Ie^y=UpBSoy>`7l*=Z-4*jkmHw%0~AX@RpLX^%Q@R zBJ;DhAXR&Pg9V7;eD)yvu$54zCjGXL0XKL$Y^Bq5C1%VPpsL&uAOnN z&i?jk@d0|z<29^|UK5hWVv2wDyw=iA%WodPE5dzF!0&{pdW^4R=f8XIiV7#}>ezZt zZkI;4lVU`ONyQS|cT{@*mSlshUmMBG3y>olaFmObn3&K@KUD?_|bzC=!v`>tAF z`bk7C^KxsqCDii)-C9jpZ$XzzNDaqNg5V+h^FgTc>`{ zY-orrazA6qANp}^U8@?bs@2}L<|rA9fv13$to5)S(EdjW7IKaU56qkM5|TX zJd7yoGboF%A3_d?oF~8$E(MXkb@qT=UsUf;t< zqJ`&!Z|JL|)A`W9FX#7`7H9hwsmbUx=L226DsfWf)n9DiqD9yM;THQi*qI4T*g1B2 z*lSGMIak&k%?lvDs7jRBdlNOB3>x_#X_32+Fhd6=@}{q<{>)~Tw6y9@t?)_`{bHEkSk=+ z5=lTt{q@Z{!)r4OxQWJm5^K?(J-OJngjZE-ecOu~fu(rT_i9Rf361e)%J8H?&e(T# zOgjhabD>SNAK!1b#%!ec;=7swTka}q!rXI|(W#=Kok$w;gM2ujz{36S@hQf@}%t?XNGh1e(XM$Z)ct^)jRwgS&u3L)5Tkw4;jldA8y;)zDbgc?Za~vOk7!6 z)_8TMoKYa^jBnb?7E~i5htq; zcldxLCJ@AH>qLomKv7q021WY1^W%O*YT0# zuvy>K&S*t?@{|;=GRddx!K#L1H+BX*4HuD9$7`a*OL?k&kRf&_=3Dvh_dC{FH@#SN zj@ZtTC*GjfH=^&dFJpeG^g~|iT@CZg#3H#alXB*G#&T;vg9TgGGB1p3bKR;&ch;l4 zb#2<`zPw8ENhKwY&=m29b+c3?Owb9rnqHzhM(j19ZJg!HUF(DQu?|~mp9L=IfNI3( zOKNL*H!nM+fUfLkv*x*GLe%(r$V>LN|LW|)eIlp-9P;iJSLlvLX0M-3zYfkhvP8RF zkMU?*&wY8CUp;xu`yrLByrOH4qov`wuu&?-n<*n-;WuH7V7vqz4Olf za`ca|#D6)5QVFk9nez84%`^F$xK(nqaiuPr0M zYh>)WcCI)QU#p#JrF-KUQ)rd9(m|6RLhxYU-*Ig?smBiYyqB)53j?bwUFG(+#5HHC z+MFc|bmeOBR(HkwL^dm>&i;@vemBRfk-D}}j(Y8|ZQOT8-@!P`eRSoWqpZ+|3&b8k z&|_4!8DLbs?VtpP7Nh;PTa2o<8;q)VFAzJ{*fOX1tMgrBY?k-yJ!yr8%bQCl@nzg@ zi^0-Pw}U#HOMWcRWA9-Nxp!1Mekc1zCtJS)Z!%IDw{YIi3E2m-!Yw9S2%8zTXOKM2 zHP(Nf{)=>T?nc;hv>9PNdDlx&)9TDoSS_ev-Qbp1^c&0s^?K)F;Y`zCa!Qou)@A2d z)8;U41N@8rHn-uGQ5N3p^snUZ>^p)04*hzUGWImZmRtF zX6heU44vYP?3{=a+gxm2;y~`ceOuAsFm6#ns(TSeV>GmmU75r-)1j3&TQTC9mA8sq zSnF%8LeoM!)zMq1kowZd^s}$&oxMv~t=NN3-4l7misDHfm2wgX&y1IZCiBiME99b3 zlwI=u+>OR*Zd021)m}36v21ve(*_gO0GXA!srOqacG@0(8@z3`y`i$~L3+!i3zdDm z;RAcL_%0_^?h-RtZjcRbR5y+0sQ$UaNDZgApA8NNYH;+%GUU8X3!QeYTR=Y~)RBpN zv1smf%)}q)s`Fmg?*{Z`Y_D_k+M z4kJl*E5|aK{U_#V0klP$*b9p`BBgw_))8x=56_7J(?+e7f623cykPuj`a$jN8|IFV z)*behe_~5~pf3_nWxmYygJxka)%*`+%B+}D@uEUl%c|wu@>@&Dn`-MDr6dd50pm*L zH-Zdp0tfFcU}kL6tozMd>q{G;H5beyN&KbWa_qE=J>JOi_r`Pmj=XgYX@RR{71FvY zXjMn){gvxVqJ{PyZM|o0M^fIneGmQ#vy1lwi&{?2g@+MqQ=|My`+46G{=iEftr+p@ zo#@Z^ep{Q3%G7h@g4q^JM%?P% zlHW&vvOeMg=qA1#s1d=7+G9|s$Bx-nvG)w=NgCB}MR!G3=p)o9Siqyjvku=^K1H_# zZ~HGkOTK;kF8e}DVW3sFmSRZAgXwPpkM}wQe=X$|bO+AB^zR!>8@r|Z774=xQFk=L z0{?Q;U7-uM(tJ&7RqM1>R`?q}2*=gL`?-zF^(7)E;NAOQWZyjqM4e zK~ZU~)=Q}BI0pFE)=(Ciccs^(Z5!Pih-Oe}@=2s`+_&?R-0PFsgS04aP3fh4hg-ks zB?+6AoG#JEPH)L!&)=PvvG!8)0vchLh$xnr>u_hKhIiOvg^KkRXHHR@X9jHZ50W~n zV(^Um1poeP{GPTw?biGht&8N$x~c7?u`Nk^Q71C;mBwJ*iz-n@u!bw&Hu0+}#`LM} zF4jG*zk3e+Nvvc5P3jk!1Tl)_Kr0SNC-h~mDk3>>3JAYZTc{=;e&Md(JL2%%cQo$z zA<67+`&i?ZEqDM%$RgGg%s-l6G;Yjpyw6_z{=?jI%3Hd4Z z6WpN9h~IS#2)4w-aA1nv4UQC`E~DiNBzFZfW}TIR#ZK$NNNe5gsYY5`%l>WSI3NMv z#Uc!5TPt`^HQUL;z%DKbJqRr|I&718Cc0RzS4c& ziw1s<`cwN@!N7i7&zvz#&m8I5V@DVVYzcP2IT|+B84p==Q1ReBJkC&o5)5d^O!SiVea{Ua%`ii420~=UL(63W8c^2qnlnjvAl(aC!vX_f2Y}r z*x}Z6$~O@HElyc*V-vF@Cqa{E-&LE(`rBS&I&&1>0bg!9?wtgG))hmy>!e445ksj#Q8CQt2TG~NYEn9ksri;6(uI>t9tC4+mD&%15h$o z9Vun>OJ;~ir*=@^QRupfVM3Z@1FmfCmNf`X>104B)m$|p>Pb3m+s!whrpkaGC8b<} zsyQ?N{HKn=N+D6AtmSTvo_GQ5;D;j~uK^@3@T=y$;x6rP+tRtL1um;-$F{Pq(Tv@y zOIj+gD^?!#@^N#L9RYtx{jn`S6g|*hvY39Iq@CL~x!A$!l~P|UtMwT#B(=8j9Nz+> zK8JL`iHE9KsOqE)G@p9j)q-!{05LtM!#nDUm&n<8gGEm+PtQ7X{9KjBSjW+ctgl2F z*KAfU9~@~zu@Z?A&%HVX41=%0%I92;xT(>9FS_ADJ_!y|4Fxj8F$-^>V_9NDc|jt;FWQ;jEoqG{s3P9WuWLqV zkdn$Q*es|4L{NmBc+zcZmS1j+H20@hN467Q!9Ox?MkuxyNv7^58y(q8dE?pldUC5R zSmN<(d$y6)h{?d%5?w6cre(ymP#z3jCxnW}^iYIUU}(9`7yIxxK-azLDuDG{Mw_mB zUFEx=8Jbeo54UJ+eP?cfK^gUv<85_ZRg ztcnoRQHg&;KfNC>+fZXOG+tGa%?bJH@ffs=9BmJiL3{0n@$7}VdB>ynYDL`M&sx3T z+|XnGnr>CQ(?}nYC6t)1Zt3S9P|6j-{}M6}9cR^nv1nN-ER-C!-qD(4#@9XGY2k`w zisH@l$|nyfR;}<2DOSBdmSR;qt-3j55hOZQn)T$=14j~i_bmCKJy=A_u@^3P%-1@@ z@AzZw2ai3u{EZb&nL`RRUfdShuYqC{EY$-mei&DL;SM@4e#dS9|Ej-i9sj7&K2kR8 znXx8s=*i#IlGC@vf|+Nm3L-gzt)s2|32-E{A$VfeO!5C;g@;O7+tw4+;Dzv<%%eRH%iX($D_LE55Eh_b zTSi}@FbP*oG%e&^hcMP={bd~NQ zbjY*U6jMf#Jmf;W?RK3Qezb`AiRi1c*784F`XF0*2Ey@mO8hMAv29-}F`~_I#lZUY ztvoEY&XG8~U`JzF_RXDf8{-0$!M~0h(8l@!y^%z(@OcH86-1;jGnsiv0pcb&U1~z; zAog$!5p$x!%%)g0?vw2K?|2+7vGpLk%AFd?#l@=sqSfe<|6rrxBa&;}a^1vH-rw|m z)_nrCJt)01`?W;yS6G;1W<$!@JL?{!*=I!u`6qtI7;L1Knv zqCv|#>NEG$!g@bx@6->A?UNK}r^6_oMKkb=v+ho@4E=4<$TA1Kz)Mp%J;fhL*O~ynI5*WwB^f_*2z*Au)L!GMAgbZccKCKv1zM&osleb3A)f9 z-Fu+eWvf%R@|#tDt@+hsFw#y-*%xp_Z<7nOY}X7dH(Q^UwIjn=sKp3PRYdm>f+;gm z10@?WRzaO-hys@V=%@Le_>A|Q6epfEFX=<>@3Z`|m;5k(5AA$s*t9dkTJetR*LDWy z?pb?Mymz{+P(4s=bR>AqTh}R{FpR~&oSiu^b zPsJXnm?0uKeHR%0L|VRajI0_y(fGoxa$4{0jplo;C z0UJ7)t18nkftPmnr#U0u5iKyKk|@y=(FEO~GW{G0bqLmAtOUh0%Vsu1)hrWLtcG zc6jcz>c*0U0U@%S`;7`kx)G0U+l{MR1HjZ?q10x&5qDa3W9c5WeHe$jaAiFEux;$+ zCAz{U0x5mJmaVcE;pQ#yKzH#Eg*qLS%9D{iYCiTj=J;?<$rcvVGZY(PABSJXu70B$ z1K;QgOD&(|Y9DqdCAO+99J7MF=Yz@Joedb$LA%SQBhgD8S7Q%4e=O?*^}J%@@i?uB zm6-0nj^2Ub|C5Zo5uNYhy z&D~j|-FBUpzX8_B|H-lMvDiJ;-kc4-`r^pb&fZW#t4L4VucOOP=-E+9cP8b2IAX?J zeUmim6kxvb?UGBpxwD7D`B_#^A8V{S7NNH8OozChx5Y+VBl)}3A~gRX5?^Ec!8^1$ zG6(I^?IZX)YuLUeuS9I`IX|&)4WAOZ)B%0jjtLgOk5+qQc`p?_T=R?A zHL@M+Q+erJ;a9e~L$|jy8}KvVpiEcT|49l6iU5fl5IRYB8#4#+`Zr4Kgbc%V1f!OPC5`B?1;MR$<9hkn;IA1Lq zQ>r{I=6LO(-;T~1-e!l_j*c&0V}}pS;YwxHoR4XR2U*VB?XCbeI*e~SBQY>SQSLt$C+ zK!543evhqn?F5@06*ggrZNuV&d(KC;fNUbY(2fjb+>+Rf7VzbycIYoK{2*LrMKHjY zIZqpPaI&L)e?EFSub$)P2dG`I<{=^NxfQ$*QHpgCDN*%T_jdtDuJ?i|a70uU=Qtc) z6k5Ek7I`bC=&*is7+~TUpZ_uAZ)#9EDWCF%&+ZC)#urJnh%)Zx1i|m z!u&ySAkqHX3hk119gX8YJ!=bXz^KknUXQ;m2S4bI@tk9KCDr82#CJy5Sr6tm6)j8b z?6&lZQqlyz?Ove6QYaP-?WvzvdoUJW_$@!nh@3m>vy!gGasy_&nuzw$uCkpMM)w+Y z)-LusKxLpy3SjB1u{@_*K3(0Hc%pIZT&|)|hyB(Ib#x0Z+JxlhtnBMU_VO&A^EBBM z?JG40tVO;b6l=v=w`B*cu^@s})n`+o;KQhO1_IZJQdz-6f~)n$*kg|`w~u-t-Mpt3 zcsy(h>oG*h;7r5>=O*n~n(DJ{{YU!n0cx-gcoivV`PNn zdckyfH|F+P%IpijvE@L*2?ST3;Dwjbd%@-Y8#hH4S<*pS?=|mKfe~2X|JqJ#+U*K)R{w zJ0^sN_{QzZ3cIn8Rd_dUA)dtUuv{nU$B>-rJrN_AQj0|vSnI*Ih5dMu(>q|69ETdQ zzb51jD`%bE(6?J9+`N}O)%Du}Y`O^m>x)&k)c0+ql?UL5_DFTY*yQIgz8;bTX8C^6 z{#*FF+I~G!Z5+*KM($AL#!58M=iHb415sb;$?*`p ztsclh++``*Kfd+5f{DBXj%oDkC$$GZPO%WVEqzX$i6D%Pe0q`+=(>6^+e9y2|0L87_g>^T-YlJqMtygxaIQxNf>NrIT8M! z07KkvxrqhXb861}e#Jdq;G{c#t**73CRruqltcKv*mKioR=wWJ?nt-MYWyC)2>WB- zR%P!xu~OfA$z3S2Xo?lESZI?yQ);y%C@e+9@Y>@(Zimex&Wu+2svJ0ArNORLbaT{~ zCFw+f&-G0o!F^({8>3!L1Z*2kt>#N%Pdt%OJ`_%o8y}D};QUVS{5!ge z7r_E)4RGCAU+m#My?rcOdw#;+AQ61YgmD}vFb)wLl;c!vzQJa+D>S9obdz3i1ItfK z?-22Bm>%x@+c~_ekMj1n-dEqc2dkR)cfK7X`#s#uRWK%UXMT^GJ%|Ii0bdp4v*ma1 zPO2q+y7ulajkuEuYV-KVFo#c&F)%eNOHe5*?M z*%gg^7q3^~oSyrgp5qa{$1Kiqog&{tVy5RW>LckzY+b&iuuAHKiOphCRC}3d(LYd=J{eeXuXhCaB2zENP)yMnRg64(i7eh zEg`9zUo-qx{r{jh-0RA3lV%}7z3+F3v^}vyNh7^qT8Xr z=ydh|0{Fr)W*Lt$ox_r#=~!#l-;p`w=gIVc35r>`-H9>$jM1oga7Q^aIez{aI9~Oa z!~Q57oDF@h_g<~T!XmNu35ExK`+WL;)N>Z5?olL{iUv1P`wsJ2P-ctzermpe%^m*p z!I(npl>Kf5;nCvBYKmL?3l!(|ozw?F^K-aKob220ksUbyFurvJ6>TYyacd|meb^gg zf+WBTPLDAI7QiqCl_XurHL~ONvL51mYOf_JzqakM^|`==E~@<{Xn}`lDX|$>ko>cx zkxD9&f@dKL`cV+$?`_xFy$%kNg&Qg7X{9Z3^hK}18sBZt;y74xaUHoJlR;uk7_Dq=}qBbbJ{vj0NKz7Vh7x53xQvb5HM(Sh(V62Vp(xaVuo(;nI#-#_itJ zh)@i@|4tBSyq}N8vj@ah*xKG*tPixuGAv&BpZdPQY%I^~K5cNpRzkOT^pmKbDhTH} z_)Ze+uPJ-`IaKO&^T<*g`h%ih=tH(%OJLaG4Vg}kXhc-PsV26&VwDqrf-glH?&!C#g|odf+RF%N zFL8k4R(4}NP1ruXrZK#B0oSwDVMn8EFFb;|_qxU<8M|b3Y3<;tjnu1u}kN7O&xX)IQ>}zPu?)XHTAJ{D-6Qp=fV| zoPF7gSZ8d5$Su;hScjmmSCNe4SR(I-3}C^qMMFz8#QpVX3k__Etcge{QiN^(D5&mL z17bNxhENFEg1)v@)2AcceXRXKhon(RD7|rwg z^4@kE*(g*z5|mFCO-QdSUcEOO=gq*DnW!xjU0+gPQv)qKA2J7YK#3+?4J|-Iz9eG! z?P%2Z13EHva3?~xUx&u{44zqQZGq2Ez)U5bY=ruhD&j-$!@98R0{)f(uqH1LJ3jGE z^1hy!&luX&{k@$d&!nYCs$Vm8Y{*V9b2#tFJkK<=337{azghi;F zSqVW=XP3rZkYRBdA)<#l(|5Tw&O76{A3oEnQL-lT7gaXscq zxiVCQOP(J}BCRBHNDzgKG(^IE6R;b0+%z->Zxq}gTusVTAOLng1?1w4il!R}lOr*2 zoz|J3P@tG5|7E_I);3MF@zXR-)7N{{z7(3~q8L(>1rbI97YB#m#=ICPnMK6E8MZ)}Kr z;~4x2Z0r`xdr$zE&v=$Tmi#giL{6c})|sBy+{iB}G~A&`Wo`LS8V&t-SY+!k3gz5? zYuC_2%L1VWbOO)by5&ciHS#7D_sG8%u5i)z2#zrh)bsdgWj=kZw#Z4_;vbY~sF?I> zFI(XK&#{04UYzM}ubgnjb@V@u~ALMf~Rp8li8D{;f)2SR3KJ zkq}0|rIw~XxY?SZpVn7=6!Siqrr#tSSt7H|&Qh9_M2|)vtQ-^sVn${b3QQE_w$cG4 z?`aG6@ z|M7nt5#lwGJJ+Zfv?imYUk5R{FX?A77{-A;i6x+c6n0$1z6R7|*_8cjAg&ecVZcPt z<1oRs*@VM}E91y7$IW+RZnS!`}V1Z7;|H! zzz8^g5N}b=Z-q(L-7^cb(c`D7h4ZMniQz>u1oP36dgE5$2Eqgk>>Wf=$S{GCY!vY~ z=g5RTZ{&m@95;eZBl6?`)4S-Ihics?nu+xi%#-WVRI`!HgEEx=FUNIVIL5tk+_;G` zG$1TT)&fh_I}9PUEjULAcSmojP{7frq}Km*@;Ltnn*IMUdPO;D_tVl~LqAn;-Pbm$ zt?6gw8HzhF`!rmrR&nmE9^u+tkn9qjQE!DWNdgrEp7Vkza7dW;SOaS z8Uy>sj4bDEnc%s1!Z|fEeSyG%wAZJwPoJs>nrBOjJ%YZ}8KD~5T3ahP0&lTm%j*9N zN!Pw-6-Lypb=ShG8sz>*k$ zU^k|{AHhB%OJ4EyD*ZblQ&@OQxNVSEW0_}qo=QD_mp9CazniY#*KfY{1Sxq(f8l|t zJX+ofT#z(NC<$W1R)aH-uim!)}r3+}lAZbRwU5wapsH4UeABI?o+U>-v^< zPE(K}pl20oeI7TbP>gU-#TlpAMTT@v2bVL_58n(qBqo5`;4__mUH>v0e^000)H|rn z7_5ph+I>OK*xX5jUq=7@<}J0RFE{iMt}cI_VH8qOxC`ed-D3r1J{Ja$%2Pp(L}3e; zcBkJ_Pe&n-G-?g~bkvV(o5)NBA0(W4kk(wq%$+&Y{Sg%VqhJ|XfwM)h<+L25d(iYV zm9=^tP9Bfg3W+C%*^H-qJIxO`WL#W!b2%=Gch9g!2$#g+=idu@!OQX;XznzEj@YLu zTC>MZzdxV+wQYu*;ML&nMTLr!SP5o9BlS6io|#4>loco@*X_T{pWT4wA>NnaRaBHa{?Tni=|=~ z?D6#cJNlQH)g?MdSkoCWL>3+S{&|{?d>Vt?1e=2vAy0QDnXH=qY+Y|>JaoW&Zh!+A zE^B3ZZv;I4&%!D+D69xlKmBo~`m{+rGs4W`t26_l_7#K->6a+YuL zRb;lyyQU{K0PE!PHts@qUT9C8W9IwhtYZn<*j_L154I34H#<7Q&k`lrhfk+|EqubO zzCa<&8QcFL=+fs;`pQ+YUTws3Tdi3C{Yd|Pqj8CdWC?X%d9TO4px(F93VX`l6iaFy z+mqdVukkdNyoUX`Vkdp6x_Iv??iJ=X0^$YmbQH#VuI(ee$)hNd>G#ukNXIw)MHJ&Q zl>Ul)j?n@yH@MZJ1G>e;QBwadG(g`LuKgtO5RoP}Cm_>(dEJx0|E+q+2mT!~*mRv8 z9e80ZcE(O^rsD{S_wY&3>NFD+w?!qAW(Icc^53K{5sya1Q`>_q?R4)hmc(<~!#nmS zwx=~?mgkyRcgKLA%V|_5&=;siv_tz+p#VBYTjtvI%=dl2GUC#+!`1t`zsqrTlQ-Xy zNlHK?drzt*NEaFrGI?!G74F?fSJ76lz8~Kn{4H}``&ahHr|gfuIp;2OEcoe6z=&Ji z6NVfCzbOBUaVwTMi0_Nskjq#GKhkf@9IEBi^1`AlF&eaXT?xP7N&whrub$iVLn4ml zbjL3=j9g(E^Fj-WBSkMGuJd*y5C^f8vW%enPtorhXKO1ORBVW7cDbF))ec&b`%+mU zIuF^5z6nFzS32l7lv+Zupcy(Ywt3YO5C1kk48t)@Bz-|yzIjiQk{~+v% zdrZ-O3|denKx^=x&gY4A1nr@3?YHc_T{v_gE(3PYN1Oz9ET-|B#<zLQccz`5Fgcgpfv4OlJ z!bSeD?7@q;+k|K)y(&JEombAhSUq6P0=h^0_}Y5i_A|AmUcovN7HX}Wip$n`%YU(R z_-AYYd+@mx5Uv(~Xq~TH`}F!cu5QV5eJHW4+two!s{wf#8(Jf+R2k83wu68tTtKIf zuP`Z2x%{i3ZIRkC;wPelsTOqV?BNs5fkZB{_{<0T>l?v9roFYWZ1;d_K9wNIt{nw^ zU1_4H>ndes!ZPCA_n;W^j#^;5)K~X9Ti2rIatgmeEI&PWTmQEC!K8a+s8L~O@i{<& zw}ytu_w-WxzImrxiIFY5C$PJ1`TP7tzJV?&!&Ro}x+BrI@j)J^XC3Lo5oFTwFR>f^ znohr|XPk+L4%3;(`aOLKS<-ZhYE{tmw0$_(QKuu%C%2Bj;y&kMk*1$p!yM~Cn^Luc zzVxw8rq;plRbSnlPsCPi6z_qTxri{KIWR)Y!05s|dSkysTl8k5W2cZqti|-37B+N@ z(SXS`*+NKs0z`(jz(T%`gp!Xg9Mbo3as$hB>PTaw!PG1nK^0f!0YqCseR(wEAXi)Ktk2vIjEEK{-Tr|L5yvFmH#K*y-+rc1 zp)PRN66UA)0LK~jP10MPrp-QXgEj&`+cmHR@Sz<|y|gDbd$sS75ay>ZT*QyLB8gOE z!HCo1Oky?jcnoBd)hc?y+2|EF=9k)ju0z5(q~B6QCN#wfYGjuc&9sQcDy2P~o+)?t z@{KoV&G6bhp=OO$(}>DB9iu_nDZZgZHHeJW`X|ZIQ*=L`%9f=}x<%;fwK89Bg8(`* zKkP|LFWiL_oSQ|zGKzw_XqB@ZB2IfH#sL56CGT6nn)41k(G6_obQal1llco;HE*LQ zEvasF?_R#BCq#Qtg7@HJsCb4Ix;bq!|t z{`p^xdZ`L#8)nR!5mo(#c4+!|9@DmaubaE5l_9lAk|7?pl)mC8;6XFPi{{i9dTY;+ zQ8`tY?bv8Cks>?$H$5&DsvO(y><7nlGf^r zrf>iYP0t0xGjHkl+N(`Ezv~T>*f_8tB0{IpN=Bds^I<)+=F_z}12r1Wf0ieeuEeSC z!~nfstm0|6b3M=J-;po04a*hlNYQs7MR9HzKT3~`Et^?iVsz`CZC3@6blP=KvVF(y z_MFU)9+Ee~--zt=ok&iXc2Cb(KkeCwxTfGBkoyJ$jTlx7eDOSv?irhQNsY0vdM@W75+SzMvr|cj=?0^)YVncq zVnZ3%Ej~EQBct@@_J@bafx5Q3oZmT^K@S&q=c^vi@)p~fD)7Lt@T+t_~wX$cHYA@ zJ@@wdJL@rj(iqcK#wD@@M?4o2fLG6bPdO(zkh4Px>Xn-9#;C9P<=vck5OzJGJLaHz zoqku8gi`QldZ|R|tk^@_tcy(7YYO*NHLYw7N)?gsg;PZ`uawc>{>SNmoGxm9=+Wbe z6@V+mqP0iHqFEOzAE+!JemEYOw8sF9ppL!D;{V^MVLnbOptyYrR40ol;|cDYM|wsK z;C#UGK2+m$C9-JmhTp}fqhH7n`jfn4_ks_ez`KZZRQs}RaeU41$WxINYBPL46^&01 zbzi>`xvjc(+mTfIJIl9YCoq9_-wAf0272Y= z-)S^c7KyYLby4sc+i#*JEQ+GeXUMI9Ky$tfzp*X;J2QD|I_VFRe&6ZY9~1-K6J@FX zmwa#w7u+xx=-twl9TmjD%*gQ-ZqQw_#~ZaREHO9obXB>ZtUmlUL)gy)CT=r|g#oioq98NJ8` zhy{YWYotsoxP}kRn2Nd!x`j1Ma@wx0N_J+c_&XPWN@BiiP z?SB2b&iuZ$Nm1nS(Gg7%1Vhk-ct8+G9GapzG>74E7|juRL>`M2DZW^KnZbaTY)T_a zazt6OUT%>4DO;uBs<~F)N|qjZ{{3hv=j>FI~}dXkrf>xhc4w>gDYD-Y3G* zZz1y>8G5i+_IY>r)}qJe5Re=D9pDQz0fAVI*EUAj8InbtIKT4yfqJurscH|jZAK|t z1b)PPVIkgtvEL%%x%T*^#b&%I_on*i7}o{6p4jkiGDao>lJQi2kavCAa}VD9?ocZ~ zMljDz!5m_kc$+uneD=V%V++#fJU(wyJ)tn^lXrqCc5Gx`_UxvqN01AIwOQI@zeTw1@Ym zapyjGCFY*du0>mBq^Z-K#PGXjuop0=iiC`lR$GMc_G7#XU%>Nd@bjtUR$5TT{aUq_ zt-muyKQZ&zIQ-qjV@0bf(Ob9VxYlPFV3;tVZm(zgT? zu6ZFlmZG&l`fh9|WKjrpH_Wp42O8V21&Rf>{i`z8d|fo^uMr0aK~8DHJcOP+fS;H< z+w;2EAd^Kmn=w?|0rb4o$0b?lq6c!fyRjO=ab(Z0IK&b!LY7U)-3JG0|~&E!wfE61V0>HBvH#*?1K`<~6$C_p#2B&|9X#7k$ps$xx4pwl)#k zk?*@fDLS8yh%uf1c^MRE0F?nLj(SA6S4zN(gz8;fciES(WkMg(sj{C$pH?iW+vZA4 zR46jc?&w9VXqFu+cj>tnR3eEPMmMen-t~~kDQ(jp(^B2B->qP&q499dXSIRa-6xU8 ziQ+h!WTI;uK}3>i;iObJU=l$mYrykik1XFnbN9nLYJtW4U7%kTYzk?fz9la@*%xwQ zu@K7O8Ob#koiC-L4}QlQo3a8^O=$Mt6NcdZVMsUbNxq~f6j2PF7g6b#lJ5J#d8jj2 z%Ymu^&E05;E)4H^%;w&a`O%xFI&xw>{Pu|)vEtOU)$6^-8bF#z%0FfC<@p*6tr2jM zG{C;KtmN~Ag8tZY(f9NmWf`4C3trLP8ZAg)(0&yGj%N!WAMjgpkfbe&chYJVp%_B!SGbQ{W?cn(`#IrxL167BHz;hrz?aUZb3D>DLx zD6Hv@eme#e(ZWxzB;J(dD5evOEKm9&Bc^X`lr?>uwF~V#Hs2DRa_OUoc6_Tg0cmjT zC8KN8l%=Yc@n~^fZpr zoO&Zl3Fa6agnyor@~>?nx!&y^{w}+|BZ-tn{HX1#TqMguYq22ywsdm7R=I_g@TJa{ zV_{kHvPQr?qAFCl*oSUljV=?okT5GDoM*ws1!FYr6J5JJgqgIsb617e##(%(*8+QEOJCUQI5;E0@%AvU zi@@l|!_bBySLbn<>E|jD`JsFubXZTPbZip{myHoz0HanLtWjf)Z0)P(#l?i-?4X6Q zv2AAGtHK;lhaa~_ZEe?m-!*%4W}I-$_BNK_mKdnW>%yG1*8Ia8fz3U^ww*Hq)h08}G2T7VTYXbxfP@y(MQ)5}$HmyS4IK?zA@-XI>%$L*wuonZsnes)HWW z5~-0){ZD%vIeIiTQeD1)7ixb3`yI>B@f_$_Rp0VFp3=I-T#Tp%&pcm)D`PL)_uB#^ zXE#1f6&NXduJRz_0B2kpMwXfLh>A;__hDvC1&Jta4?O7Ie@w_4FhAmy51WAU(&jk4 zAx@>0JetCyKjO5JDqXg+95S zCJ3jj)8x<9;)iur1Jp$`i)hSl>% zbp1~Jko`F}&U-G#VWS|{FpH&kpoJ&QFwqdWkuObPX_>i)H&%@~lq&>=n;Dz5 zoql-?jWv?00o9w0usA#JH;n~4KC`>Ed%_kk{GqhUv!0w&XRLPa`&P{0m|5bf;aaU_ zbtku5nSW6c<&Gpye{(5muA{UyHmxtjQCDn|9Qbd0O-j#;Wur~j=`J>jAO~K`(8geo zWsi#QLQkbf+KlgP?1t_jH|CpUP2R@9zsTHP0e-|{-cpTRg0Zj~J=s>jF1h2gvd&PB z;rZ&JI6v|H%y5P2=-`}nj13d4AL;pi@)fdtc<%_#ht|jUusdqK_zYl_eLsjEHL~%_ zt{;W26T5ssj;Kx?$OAf}VkzS;oGJZrIBQ5*a*YZN5ro69sjs~*f43gJ++cL_-i_PT z0|}mM0&_a*mz%4?g-n(#26?B}klk?K2cXb*ut08>HI_||Hq3mev3UEBXR92i%y`D^ zz4a)Pu<8f4f7M{$c{$+Qhmm!1g+$@vR&;z*EzFf6-ubz=N})Kf3O`9YGaT%U7S7PT z^;J(7f1vw}EiS1R#{J}@E3VXr&{a#p6s(FWuq6|d=AFJG3h-~l0c?yhY)^EJ&mfFnM2YYi?QO>8OA{U~e*P+K*0g`3KJTt?hBSHA7x22QJ z*U7Jv+m4jwm{+OL>J8f*ckP!w1MbcE8L2Ynmb1ro&+{FuAX~B)3ZJ}+<_*&Dn#`yi zhh}Qh=p|Sqf7UnPTH0pOr&M!ZGJ2xw;h^O)Y|dk3OXT5~T+mW=@V(bHCYc+NMRB2l z?szzRqAl(9@ScwcH2oS6l5-&>50_bEN{NvXqQkU7fBLHI`5|m$o7ukkJJ~OGGI)-* z?LK-z0km%ex?aSS`~rtf@X&T{uQ}jp(1uBDl@nFTZKM6!F;}+H=k$~gZGw~bk=VMC z3KC%kp{TEyO8R9D)b%Y%tx@e|-LT0n;`64?(#iSppDBIMYaExbh1JlWTw(YqY{Q$% zN*s8*7W&8Ri`73OSM-g;#*RvgaLY9(bFR$lqNyX(6yDDht-UToEp-DZ*bf_48@%#s$M?IQ+&UoP=n7`nu?QI6n<8!&z z%$W~~fE+t0J9BQ6oZs$0UGzN5!dg}-yasm^ucwajL*n8&MTjrDY0dDajdE)-ll7w}i zI8SB193I|*LU19nm9yqa<(?&iKXnVdDjLpyF}S&`c!|FOiVriA^@5jQbbw4^9(Q8g z3hSF}8Am*Ux7FCpKkUiH-OI_{^h8*k?Q)2*^FnJOm1XC=?}uiMVYoUAx9v$<$~S?t zHiko%kCgvzP{^d%mGeYUbf64>!!a@r7Qiud72cLZz?$U5KAzChK2rQ$NWPYrfP|lh zyJ)Sm{MERV$0LUpl!qySxKV$yVr%NKZ|=3g8l(Rq=8RY!c8OO&v#55J<$8e977xdu zmh37HQR)Q+SdeLfMr`Rv>WzmgaikQQ;fZx#P?crV$DCuIAJPTxY}|Os8`18R^56>J zvC#e+33!xFG2O@5h(ogos~1ZoUi2Vi{H&Bu@qXAGnLZpxtJB(3B6l<0l&Z@XG zq@y0n%zpI<;ah?W?=x#qMjDk8tjpfUFVjg+uLvJI;*f&9q@(YQXIkrb-YOcjXVoh> zz{0Mt&wAwynWLDwri2zSW?5MiR=I9uU8}9?$W#n+9>J?E#(m(cxj_VEhQt9(#~tme z)XTxCL)pU1A@a7Y^xJ0fo6=fsD$irAV{X+-gFQKMu!WNq2jtW1uwMN6LCA|)1{_3d zJg&xi{hqY#Xvw3R_|TRQ=))~VKy5E@|e_7>0-?Tx+QinxXvKi{W$AIjDyU` z-EAqU8+QV#bFQkTPohJmIm|-7+0N9^XYX`)7)P2i!nT^>xQs10pL$PMrOz9IMP3?t zqt>?Y0y#q>nqev6p4wTx)OFpp2W2*d7GOC@g*k>t^SyGT=A$+K`4znIz0JsLB%)e| zyjZ7s@SyefP2m#odtVFO3T)kk~gfYhT{v-W6M3um6>EMp%W3=VIs$h*HujhcMsCaWtPg@P0&q=+b0zI#u71-F0 zIYuqf@h0mCgE`J}-B)D(kP(8Fb9s61-B>#F_qBjTE8k%!GG5dBY0x#2&9Je>7L%c0J z`}(v%_3djQIlC`6e;?dV`$0o*2v>OKsBDc4y6;y`k(K&+^@??$Dz%f=LjWC*f>jN@ zH=H%!Vg&7nh5y`f?j(HPd##a*dBSt+GxB}6{0IH2d1Pu0_VZ=m4qHf1nDa|#neVH2 z&Ya{+mZ8zFns8k7>=9VbG0LSYp&7$EL9N6RFTB4SdWp%NuUQ+*zBOTlH^jfPhFIS7 zynud;g1+Kmo%yYaI_$^!N7_clI;is85UT zZokwobb{91<@LBmmi&fRctFNtyLUeB=itj-B|e|vL%CJWr^?d z_BA`b>hDYa_6(Gj1y`rK*ZnDBWJv9i=*A&E^a}~Gl8elcL4JxEd!Y@q0FSJlIwhYe z(|0X@d@owVyRBhDEs(&5Ebn9e!EZ4l@s*dTfDKQ5Je{`7rQH9|H41pg2$!E^1bBmF z&`@R&=0VCN5VrhJj=27hbC9&p@_PTF$E6m zj9@o=RqpD#o}yXyL};AH!v7fW2cc)+2p;5v57o*%(QNJe>-tTfpT%?g1LHilZlW1J z2k&I-hBx*f{L4%ZFVb864}U+9y;2P4@H)R=*vx&%R^blPjn67RS{FZ%g})JQnIi{q zunt)JoGl|sOVix(?ki*mXKaJ`GWUcA_~=_TJUOfwZYZNWfF?~mU)q3REVH@EkNX}(5i)}61^YF|| zRLk7E8q^x1Mv5IE;LaU9E-lC+60f32Ooo7*j1yXr7!Tp&i}1G4MSEkYQCC)VP3%Gk zrrPv==`61`F+J#_eH4Ar9=OOevWASs%c{h-eaQ5@ZbNOA^Jn!}g{hPaK~1`oZiu| z>|N6c><4G$`;r8d(H0F6ti_ulJLXipo&)b0TA>{l$N?V*W@RrkHmZ~fhg^&N1^rT9 z6z7SNIlC$Ht}IVE`S9eb?gb8LseLW4(=`=EK5d#3_LMjpRM@zLZ7=&kjH7d5p{QqQI#HdrnX`w=llIFDLTEhMHi6v$@VvC-WbJ?E$V z4N^t&(^C6@RT{l+HSMcL?s9T-Xtkvv?0ZGr#oJ=V`0(6IgtgMr6@TY1va^G?)gFBz z`lZc_e+Q5m{q5OZkz@xbcbv;pOTpK$Hi8boU-ohNblnSK%}ASA*v7vTTBF$x9DL;q z;_3!4&JahyI(yO9<;-G1sHULkIH2`^S+A@dI1m5<7eqp)N|q~5d|6Ybf~vPbNlh|tFmX~ zftQh;YDWj-IL=f*KZP^8byNJ~4H{3@Cr;++0~?-ABe^M#^w3Xir(HliLnebAR3B!I zKo0rI4CmWD?D*99_It!A7p5)98t90&f$iyI1guDJ|4%tXl>d)U(4&+5@CVNHu+yza zEAcX<^dDQdmu2-@V!yDR9`s=jh_zuE+wFrVBqOsgCX+(8oBb(gE{BFQ20ify?C#pQ zPdQBt^DJ#UJ@_OF`w-ZPu$}gz{mgBRK(>W!wxR$`*}o0$?7MXa0tM4n676*coT@w= zLXwOF2RuI>XD)nf0FI&`<;YF-05eOIah%(QUtB{1<4hXpcne1ROn;!rpY5BGkNE&DFEn!5q;5bkgZ>R^DD)Pm7gh%^k8by$UeS zTeq?#(!yuYNbu@p?c}RPyWX2$yY7_#t8}MpmXLJ_ECQ}4zXv&i-j?9}oH?MSN+jSt zMA%+GZ_!IaoqMzzmi`hPW>t!pT6pM2t%smv@F$~V(v)}xpDwojjSqP!a)Jwt}{2aElZaJrSKJM&d_Mt81rj{lBm?NQ2XqWKTYcc2L>@hME zG!4XXM@nE|Dfp3|N9X5xi51wVSqI>rM`lj9vHVyO^enZ?4?U`K?fV{^AG7w|7{2`` z`H?9=Co^lr=4ZH_oQIE};e~SKWrov_vz%N+7M3-6Q(C|HJkV5I$(udrsm|Hrnc4H& z(aif;IZ$842e3`44E@@;rWqdVLgLeEPODw%8C@B~gZGq7+PxzHv@-+UnEyQWUZTFu zVOF5v2NG<(3>L%3K=E#5Md{h+;+GGi-W5Qm0(BT2GmaGtr&~f(g5hH^_t*{N-WZWHBB=X!7{xi59FH>!y zr^csNn&&l=gP~X6qQ6$`;WoODU4kRNh*-=Frq{9FKU<5eY4{#Kc}G0XR>XdLEi?q~ zL8<4uGn-!?wn8&p&z-f1w+K}@#--ZCuzzCeSk_~*Y};({wZ_fHh<6dyG4Scuri3sY zWx}ssAWz6jv}=skGc4V6e&(2#lyfHdER8seub~z33QmosY#V`p#OUxg7l*Y%`xa{N z=m9fQTNc@lD?@0OY2j@%v~vZTK43-riTq7()k3a5|3*9kf9R>6w&zg1P#gP06M(iU z+_2QSa9io|IM$N2pbf7b@%v=Rdb}!wPhGlIXPO*w(`jfuR`tz12 zFc{}*=077byT}t+opM>mr(RgjFqa}n*(kEJbBGu_`#|B@d-@F@k$XLX34E_QID7Hi zG@(>4-i?pW_kJ=y%I7En&1BZ-FIbcV>$(D0XPZbxEtaq8?>x_d?`PfFSs&a~i_w|P zx##;4JiwF7x-BYfE6@mQq~?r^-WBr~+HoILz0wjDJDi zM&6Xoq^n`eaH0<-5r#iJsZ!$!(6=c!Q>iJ9uIS>8iJrB3ujJc&($; zcgSs@<$~*Q18Q@vuAHSNXbon(u?DA2+N-%=cX6ve$POFFp7FN$HN3@(@>E;(r4N$8 zliNmFi?W@n|Ap=J$8TBY$$9nEObD#-W>_Ou%r*W1&yAl#B19!T=dj*Uy}ES{PSD#P zyc}vj#+H%~y_Y>(|FGLCF+aN#BZjucr*81k;GT9Wz0-Okxfhs4AAOJko1qqf-mAqT zTJsNeN4W338vkMs@$AABUX16s4DIL{`=RhpjUT$$S|YxH@$F@>`GjDS14jWT`IHe1H}Y z`*Fb+%X2@ULUJs~>>=e#y*f|bflswWx9koR6KunC&$QlYNly0E&TD);zHtKXiSMfK z7$+#O+?sm&M9UxdCo_TEw2V(m4qZZklZJpI#Pwt*7?r)z7>znTej3SEhk1y zjRBu2drNIB%R{ehe+{PANBlNA-ed>IQm<*1dnKTWIMGWcKIMq+w{4t55YI}S%p5-l zXX1c8m@ror5})b#R~B+!TK3%w?64;1?nUnz`dRsZBy;;wdm%i8qgwhd`-1Ku{*O5o zQH{!<^JuTuGCuZ5gpl6o+$1|J@iVq7udm_#grVNwK77i|!CZ(;G|os?58;n7j%}%n zlaAm-d_dE|itMq(6S!}0RwIN@aE~EnUhT>@tMi%LKudQ3$&K}|oZ#*}B&-9Dryu>G zbn$uF`IgW-?L)ixbepAM?qQEUcd2aQ_$~Ew%^Iq)ANwBHdg!56S_zwPg^wV#q7hykL6wa!=%poRvMGbNGk;zkThyLMhwrG7i=+3k2{NEh6R z-0G<>B_Kyz7M7jVmH6Z&+y^ft&lBnIVRQRYcotJ@DeBp7*B;8*4(P%LD7-%eUPhRmodsgpM$&U~c(egxJ&bA%VECtUlJf5Y6_O-O;NVX@uE>_j) zsD$N=s=M6EZC+Z|dUVE80t>h}fT1^rdH-P12c*zTctr#p zX8+81z1N%U4$9~0fHrI#f9A89opx@4uX|vfV8TogtenSbx7_P39h>PN-qk)1Ki=vd z9>0Nji8W{2OKS~a?FvY)VR{b;TGQx{zTv>0R_iGG0_NomcFO8EbfUf1jLeG+fe~i; z>GBQrMQa^Nct#FXbBOZ8*Yul+WxwkT3BPYCWK^-;Wu9ufu^aTwu%RonQ*{5G(&?j> zR1dh@&kAD&BlA}7CAO_4Sc10bnMK9^MQG+JBZ?odZV&fyPBMjkry8c$MeUWBmGk2# zZS@-KP49^v&YP!m&3V1NKRZK(z7Y>YjvAn zV`!SS={&ycYS@QkcF{h}+|vv$Iqz}xvGrk=)l8pb7aS{7)K0~jl^cO!J2!9!RBbdg zW$}7&B(Bfh)`*VPsejm+>pNZ}nV4~?F5S%Gx8y1|+UmKu8sD>W?tvdHf1Wc%Xe3AQ zI+!WOmWlc1Kl=dTE>g#nJ=8N>KkeWI7BTRus)o`Qf1$BHNJ|;p_q1)~x}yD0js*s( zHOQW8=5_GW-eNXeJc3W>mm?k;i!OoXeN{lN>u<;AY7gYF=2}Kq+IF#Kf!Ah4o`($I zyQXL0gJ$Gh)m1)!aNIU#Pno?_%f6|8;EUILQ(R+Y;3Q6PlzDAo z9w2uENbjzCQ4 zwS+d}hrS;H7GwdIzu{utSfb+{&wmqC^()zLemA6yRuK=O6QAN0J*Y)H9{10jdD)I0 z%ObsBg;wZ4afVqL@3X-c9akh}y(t*~K}L!Pa>ms5vCd(Ys$KYQI5O|os=$o{*Os7?8IC+ zLS+2rF3g3om34MQ91*vm5O}iHfdYjmefUk^0`sFyI!O9GEdMryi6RS$!;D26R2wyQ z>iU>xM-Y7WopY{-vS(|2L70}R9?50qa~HjghXe1Mf(kAlY83u-pZ~X4bPEpQ*M?R{ zocmdzMm$7A?fZ%ILw&p(AU$t%TqbX^-UIb7^^3l|=Lb0H9kLonRw86hzoK?PMpj(e zhY+RFapM4F+h@^9{l{vZEq~tk>Rv^>_9gZJ6%$u}VE}9a58EBT(zcxA13|UkeXAM) zOY%FK^_~;0Eua9VuRS3NRNj|_=%KUXjAd^)!fAY_`I(s;xKK5%J`4(apP}~PX20O` z+_j$-hiBjy%A_4Vco4S)r{q3f+46l5&!N94Qzj?ctc~}&SvSZMy7-dh(U3B+8eBP7 zm}exB{_Os~+rr9wXo)4fd-HWY#o+AAyvG-~i7Wn}U-sEVLV9-ECGL0TVXkmMqiVjv zZUxNgXIjrI3*VnzkzGMAZ}s_iF;;R-IOxs2>^kL6(HniqkK#Jsn=#ydRhC{;TW8C> zJA%2MbA0vH4w;9dk31TUM+-WwnPcMM*M0s!p&m}&s((Q}tdO`Xdm<}4Ppp<#1a623 zX>ppwJbP-0wyL6jOiD6OHDw`JpFA^ERp0@K)Rz}n4RtrIj%YP;yrlHg*KvZt?*D?)N<+T4yQ zLL}(oPNuJeX)R=j zn+ln6+N4k6Mz3K?i)XU=ez+<|=%fw# zw5yugO}1gN30$nL-Sbm$;E|UZy5*_o*vqE@LA)Fs?1cXI@Mt&qaBM!cRS}}P!G~k> zIda5GoU}~C$So`ch3`rZa8Jum(rUC6o42+?C(~ghKq}-#-LfC8c5?AmXn+Ejj(qm*DjSU(M@lzqKQB@B(sH}4294#4m@)@j#}cMmO+r+fk{71CW z;iRc-!V=6$ntPAp$|C76zC^EYiw*DgRV6+lYd>GK6&+t}TU0FS4{s8Q`So&e9*Xo! zB}Q{!*Rh$H{KkGNo@;6bO>8wIhB(Vqg1$Vyk1U)Ond9Zuyo{L!QVt>t_-~hW<(YJ> z6YRZ&Qg+`IG%aE5#uF*;QT9b#uopGH<_?zT4Li1e$>i8-KY^*42a%1~!{n4d9D$yP z=Zup$h6I4e9rx&N;$!f^ZN_aIGBuQ#nH)JMb8#`N2;&yQ^3{#t;fZPqm1qJ)c*E5Y zQcul>u-IHwv8pgk>2Q=D)`)wV9h1!^_qt2d+^f?`FeQf@PN29e$~WvyZf4C+Nl*$$ zzLv!1y}b^Ga#ay7lmoz$ed92B_Cr9Q*Hhg5zy5_8$%n-lM;Y=)KYu&Ier3G1YtBzoysXf!W zK@aT29;$D1dJ1RiZJrMR-{s7{{iShxw1`**2Th@Mkk|%oOu%PWImuo8Q0q0Z+CD*8IURo_Pxa1kV1ogy@WTA7mI{#aR|vnV@B`3 z_v*$Yc}skbWXpF1As*%Un@OB3kXnjA4;IopPiZhSYZt_wA375?RB$Dm#d>?+cHVe8 zGaqZPt9cpQ$T?>HdVQSlXHV$Wi)`KXe4lDv=`coY8$(9(ZIKeQRA!XWY7fLq-;xtK zUfC8mur7PESwC%G*?4TCpndbK{e{ii6aU5$Z`SiB8wP$99)E0`Xb>|b&!!VPS*X7#wF^Zl|z{Vd#JyT3=}(^ZFhP#Qaht*V~6dtttSq0u6RM% z{CuBYjO(o+868`=&WJ*fH-rIp_O#wuV!a+lwO*$$Gjqv`X?iC6)NSK&^SdFN&Aq$1 zY#kboLtaA8^kz^lUwCd+{C%>e4pnq7-j(#x0cVNiGUg>2O~zGIHXgB@oR72Uwl|%i z`Pfs>F?|}-b0=$#>cR0c67CBe4kFv9l~p#kdf5bfhQtXsM)SdX&)rk5Zg zEv%P(tL(Zd>Uot>T?Z)Y!3^|c-BSxKcJXRUWWo4qy>1wcjTBuGuGY^ID~n042Dln% zi2!c^X>Gb1W?e+?_&R)#XXRK~>!<9^%kwt}k&{tqkDm(3FIF2V52kR3+vpowMI4x- zfKT3~pD^8NGgEkWT0~}15Z9#&~8WvDrg)qv^Kj@q7=@ z7Kw{x!=C7wXA6(zg?=q4-YRD<%TMa{z0+f6PbwyO59-`}dO@RIx-QBSA8^Yhefuzb zHg7{fbK2gr){8_*EQ_W3+ya$;06*ErIdH4-pxgVn*L$z@bPLSc{$IiAbYy^!8zE&h zGMD!GbTR8Ojz-{87XC_4(bld%{`@$e*IH$#t@Ey+@1x)Ps9bjHKKEucvoBQWTXbyUYrZ~!_mn+Mx ztDqasv~$Y}mf+m1)5j}@Es*GMf(LDNn#0t?cJ0%mBgn(2%*N~bPdPk(jz_^76%~$; zpH&QMtM2T$RUYB}cOl^_<)+UZWLF}*J(d_m#i%>v>S%HkJ-|C^Gef*C%h&09K9r;x ztBz;yv-nmpv|GSP5XqG=H}S0z4TRSeYy?bVBeiB%JXDi34i`Mt326u zGwj{7TW(wPd15RAeI-LjQe}U&xtvLMdZ}YO)2tR2+f5E8PqCRMkBH;1_C$EPItuoh zeW=3a7T9vSTENCV$f&Uo=~R4{d8-kK)o``n2otZK$r*rPEV=*3!b89I`j@k*`|?nD zM6Aeb!)g%+;T&O!T^|N5>4&t+Iy)?#tI5_GJm)ZH=nm&$XgmsD{E~v2@#>kW8hEW9WVcB)ojeAgS$+RJhL2+clPQu0DlZt-mo` zds$|1_WszYk8t}ryy|T(UiOffPQh}1GWPD>$*pi`ee}!0F=rf=a<3TG_!N1Kq>3H1 z6|eMM@mz-w>vJj#_R#Q9^ANp8qMcJw6@YeZi`V%;HTzARa|gV5^-h%lb?Vl4BO%W* zz*9NGDo3k{i|9~BdDpJJ5gkrh)9?b+;)$w{)tVm4Ozvzq`(nMGtbque8e)reuE@Lu z$^`R4h55clYcp-HU70R$A;Up7cvNrh_Hhw(IuA+{*?2lP&Y8@f&ueof}T{9Ni zLtC41iG$1V#iKHRBFjN@^02j9tk43w@zB=V$#&ysg73DlcUwxd(IB(x?M_vr*MrNmrO(6dwtx8xft?bmUcAe4OpgkVdVB; zcn<%u0sK5vbjMi1hB|0)#TOWU+V8s2>yTNqfCI!>uy(A-=w$2TZzNKbnULE)R{Nnx z=`?fCxgS1RQA0<0u^+H$)NmK>?WAax5Ec-}A%qEReg@->J$#0l$%8%Q^c{bDRU-N6T?>{Ic3- zl#k5d{zi0G{k1-)c2~OLroF3UWy-2O-YpHhaZl~Aid>%=+FANMqEc$5v9<<{G*K@` zV#bYSk`LSa&<}cfISo>Pmtd22lUm*9*T-KAZh2PfXK)axsYlY0J2`77)36<9JhL6w zeB5$p%pr^%mzHp=>}L+s9`qJ}Vs$d}?(JDlxiH3UnDu}U`aqs*-sjB8pTo4b#7iw} zwy`cLqP^C>@?gpaQ^#E2Av;Msv#e^y%jR<;!#qXg56#R>N4Om$z2g^c#FF{+E%S}; z7^qo6%V^_=2Dzw^|`xb5SLUX*L9seE`fBrRZwS8JixFoK5wUqH__7`5Ko32oeN?euC2mFbGP;F=p~hU=6}?xu_O559Xx&IZPk(;THr>q zORt4?G2S~GpURbIT+Tu3>PGqepVtY9lRGvHa(X(aR1f=%Pe_6%;`Amgx0 znorV%Slk+6_`J7*QLrq7k&UPiK!;X^87>lIG-M|yOHX@~ zKbcyyk%6g^mpnRss|;fVD@H|Gx`Q}%cnuWP0O7u0x_iIUSBtsF)QdzMC1#^TDuK6F zx#WXV!fOl!*xAa90VHzV(*oz4zbX#;+l6XMks@@k^Z;)hPBBR1%{R_*Ha}*J`~P{y zXhyiS5e+_}PO?jIHAkGlKBzocv&rG|m{k0Av~AC)Z;O+EJ_W_P)WX_`e|9czKf%Kv zJ{fc-B4`Lj9;7o5z2V;IySf|EKgTz{2LafmT3!TqQJAC>D?^)k?vcLG70;0c&(Obq z&nYE{F`XWzxfPk*?gnnMCagYZVVVgEiBtM9x4caNH^_v9lkKuza+TfyDhCX8o z&zP?LL@<7xyRq9X2W{v>m%XePsF1t328Aj> z7p}|Ddv%t}Mwn#nh}$2eg0lalUt~*!B51UlGlzFI8C3=sa#JgZvA7#|;U~|6<>%I- ziV254DqnE@}en10m0i}MWdm4M}{J}}v@%N@%Ms{Vc8$LIt!?qIN1S&RWy zwQ*B*z(BxDm2ic#ctK+i8#w02W{o#I=ce?aE)1vVEi@+6% zyEsygTSp^&h#Z_!KX|22#j_}2+WlJRTYT{tq>(Lj?%`U|L~FR6Fmk~LnMXJb$phTq z95yw#Jo;|`WQXrp2q6{p+p7e|(V9Y{htx&Al8Mc*XN2TL4JZ{pb1*EB6fO0zfv#OS z$N>vQudz+bmVVxYWG%t(uv?4Wpv*z<#|mfu!q@0de7x1c9*Hxqq`mhCdIk@XkA7=k zp6j6KkTo62&|~V^2dOoa{dzr$bJRenFdd|^xf#YfPcj~P+^VNUpSqiGnQ}m1ptqrM z60+Oll^g0W&3htbn3`{n;4S90RXYo{MqKT$CICfVdhFk(q1HZvc5XfRg=XIpmPu9e z1POZj;wR{a2!3?}$)p6`vh;eIGfrW8M;1h)cwBDiU1Zk8{%Y+vWt=c|r+?8gDAQnr~+hg1;X> zdrjk{PxA-l8L^H*&6#zzq8+op4f_`M%at!x!<}{EkLBm~GTBE*EWP&hHuuAmoJ{c7i zlz&J`SX_LtcdG3)Y}x2bQ&v~K?Ub#zR@>=(Sr&Mpd#gW1?U_;#-?wVZb3VlSSzjw7 zHX+B&`jyjHqye@^XVsgv7W{aVgmsvRu=Ss!*95^8y!Cc^6xn006x(MJJvSSt=q(%M za@BV6SYOD`+j@q5yHhs;pDzTnw%TZf?(|yhdkJ=ns&xTv!Sjmt+&7QQQ+Uo171~2XPDTJXOosN5`nhr@mr4Y4g+R?z^9#iB4K{b z3Mwb2;1lbJI?hP?IoHanu!I-*ZJs1d<~V2^)*%k+EbRQa#8{#xIW*ep9H{N-Q96Bu zc)oYruJ#93h1>T(G1VWc(Oe2^Gs-VbQO<6MoEbU4Bt8#kKaZgD+*EHOE)@XNNrvft z6Hr92?(EjRh9|%^(&ec>%yXQZ^t$? zy@$O%#c?unc+Lp!k99DkCcY30-w8YQ9Hy7u#VJV40#bK3(VIzaN9MMX&9uX-Lg)q( z?^~Xq!Uek<(gT(ELu31XdV3BQR;`0LMu`)uv!Ez`>y0z>dR{X&IBt$vBf}Rd!ja3N z^X6c+YkQNy2ro^^ywweS5HpapYSS^}z_BqU-b>5r>1;FYV;%@D{w!N{$F2tb-qBGx zQ+*LyeqFLMRkejVFtmP4$++W**lmN{1Y z=G;Bv(y6I7%;C@m7v-DQ7pGdc5L5POv!i$Q1l#RvovZpe&3{(_k!(+`-kdSd&vBi` zeiO@d1p7>Vf>)E$U^e?<%!-f$amzd3h*F;0h|Bu?64d5g+dhRikh07`u8FXgpXDm>fv#P#z|K5OM>o0^gi>Jo1AAhoCo@iwjusH^8OV=TB$}iKZ|ds@A2!Y&Kppx(SLLa&lUaR;wOqQbR>*i< zD<10*-h=#-YAd;9*imGq*q@iyGeTG!@Pxi1Yx;?NfwP8QGK%?iUYt0?Is8z107e}6 z;WyCtt*Xd1hl5Hu$FAe)+^&~rQ{Ub;E^FX|E#fuMrR<5Fz*8a@G<*Kx_~5*azoAuG z%sFZlPgW(@Uf#7e!GBXdu>tff$F@i0eI&Vm5}!0Zc2RzZY$}e95om+o9GNGU`H*tP z+wq5#$GwSGpNTJyu8y^?>QgPjZ}KEJ0eFTCKd8UdPbix^B~I0$$z|b2Q2B-4b3xU{ z8FG#5dFB^h4(FiIlpj*ICp7Q7)hC04j(^bSpgjbA&N^{Md=wn7mW_n0$ShXkL z2e;qqzOza&1mX}DP`WcW0;i#V(UwdUjIdH`79K@2xRsm2uU#R)254=6V;bdk^f_Ye zgV{mMCx1ANIhusNz#VLA8vC5LXD&I!uv48M`((}1>jqdOGg@rNzFK_Oxg~I^w$SOb z3yoY4-RU`(^L)G%`dYNrCYR*V%3KoHlf%?4m?!yutCfB!F?K6%9BDnFS9=)^A408h z$kVcNS6J6oU!(wk;U`*|+Y^f3L+9Lxs`ya%kQ%bX_E=%89$cO!YX01r>gO5q@7kMe z*JHCfi)Ip^&_gUmD^#0~&8Y5&9kiKy-}~ydfX^Jxxe6ZwHBT57{c-k-&(3JzbxAaV zO+ld>=Wpv5UJc%$-xX+pcTGW41srAO4Dl4Cg zKjBxjMu;8YC+#D!1?)$^W6cwa1yyS+*f;N5td!#g;2!s&3)-<)uFW>BoF^Rad$Z9PB(&=a&r9!(z{&o!RBhbFNOG9LeNSkFVP>`e6` zr!!r%cF#|>V~xmi?3SmV*`0a(6PH2D$cu;6<2^o9fAe|F@j>s& zaV$ghj1ldjiuOC8Q|Kwa%6W7-(fa(VxyT=V!mez)WuKom8AE(T8S6k3vR%R;9)Uqw zv8_zEA})BoQBG~v4yoHFT<`HaQS8&Lm;O96yebQ{X72*;LMQfGZaBWE93&)A1w|ltkY7?BO-Q~=Os73Y9wF;n-8<>ZYRa~tfY)*Z!=Y<J=1V}H)iv&yR+lWD46bi>IXv zWUcolv%Io)mvg@=&N9r^FQT{c$lQXRfSfDH+3d37toe*30}q`rm(S?VnX)WT<`(v@ zo3wk$Ja7iSH~n(edc+)y|5HkmpKz$ zo?tX)+fjWkxRSyplI3Wj^XvP4{&aCPU*x%Fu#rm^Cv) zBBuoUefg?&{p&cKvbU}AH(JK|Vd`Aq=~$M&qmwtfFV6=&4vUcIlR0@kOmoR*WLlsz zVB#5zbC4;x83ktXL&rOqW73mI_k~93^HhDA!u1k#)??s_oriUw-U@vn>tq+rZT(r7 zWLNbI?ybi4cl0^uwgymTLF6T_r}vqP7#@?q*~tZuB0tpolwAKMD*UzJAa6aa};*MqGw=P4&RMycxkTTJD8hE>y+DIkG2Cvu6?;$lT~4V zYP62JJ?TJ`{e!(~%EmJgo)BfU>+z+V!h|R})R=lW!4b=|Co~!hL{H55F5U}|#$$8k z+^v}PU^k9pmOGO4Z{+OgUS}Vi=J(vv5z2kY{HPL9Khdsdy{nd^J5_(pN%PwlO@sj| zqmyHK#z<^&B;X$BUD3e7zT=Zu)PoPn!!@r+CBNPjoz9_qeqBP-oEr`^(5#Vl#s@^mTK`rFQN>yLJwOCrgdZ znFMhH4}l&F*4aDiKGpW6<{n)nD%7U3$o!vU7 zSn{4ZvL-LCfUJe=m-g0h zB*|~lw{KNfj1A{PL*BrSz!CkRA6AOR5#O*XEFJE9Zu(8#!-Lx1sB}0|T7vYZ?S1(# zV|-oDT@Tkiy~_b@#22Kni&5vRv;2fg9=%?Px;fSCSR4Yx0l_of6ZF?x%O2b2NwD-1tquGLT0WI-d zp5t(=0%M=Z<-OnnIV!l-G0eB}s>k;iCxAtp3IR;e6Qlw+$wnMw;HY_+Ps`~_3t1Zc zh0ce4br9L(v&aRFb;^tx0GzVb;~955MOF6N16!}Kp|-qa z{Zdx%-}t7eWGLdO)pSTD?yrKjdmFFg<7k z9?e$aSjCK6?WL{cuKur=bs9#OCcKGd5)1%qzTa z2NimOLg;#J1NLNSjwgB^UbH^{EauIQEk7&r!tlcSR98La*|YIqVV9AhLJtl?(z7 zt_mKK24m_USU>~+b^4G4)E+!%9Hb9U>-yW8z!TrYqRd z?oG^x($BWwwYl=DB!gTw;I%k|R#b>c#X12!@cOPGgq?~mq=Z+gI&PfMF(MUI(#v*+ zwbR;M;z{ZdnI1>>d5$JTk007o(!;Y~C?u;jKKMYgRa+Lkblu}ex+4Cgy@~THfhlc! z*s{XJ-Bx96@d7dS>H54KyTV~Mmv3Vib@EIJ&vY>scKuM4^)N?TXF6z&OvyK`vGG>Y zi^(Nt(R-Gk*RkWJrEt->X*255}#Sy-61<$i3pqZ62l@OGHb3hJ8mb2vZ4+Yp!VVa|5pEO0#vu?+8t$47qH z`xv*@AK4n{1sr=O*Uy47c_(_C8uYA{p(SovQV)hwTDr30w;Xngf8+7d9!8?3Xng=v zF!@OD`kU&(sARLu&?b6FH^3e2%oX6l6~l!WJhARF#{_fgG~BhG!!zo#cuMesziKZ# z!K;|A4c|+BN~#`@ZME0nF(Q4(`u&twg{rxM8VkL`8r2Yc|DNtvTx_ zcs*CSfo`7Tv#BRDBC!Z6*fqtx4%xH^i}##8BbeTt5{?rja~+gwf#xXKE*JSuci zi}d{4`bdlf6Q1#Rp92YVaspx+@}cfbHPxH~3cWmIoOz9i6f40Qd<-!Rd*h9VIe(@~ z0It~IBjulPaoBe3A)<9?%T#N2X4psAzQ}~9;SN1TK$Sn4Zp(a*DkG6xxQ13tjm~^B z&+HI|kTQOOH??<~*-k@;hv-~-ck`V*(=X~`{x;ncYU!14`ok7n&4Q1_IN+*cdDAmI zznly^2!lsiKoaVw5*X`f21|p^~UiNsdWs{H3aaooGM(8xr=&`PeOxAn)$rcp{ z(e#`nJ&0?saj{dLtkEzS(=d=fb8_y$LF>CEJE>PCW0iNt~@M za4tNYu=1$zm$&I9@9=UONm$`A$>8yk$OBDgG_Y}1jrp)B&}al%7_+Y_hEb1nl zuwgDu%X!H|i#Q~H!dW}tE58I=d0jiUt&`d&vCdpoD|t40-} zQlz?{kv8{t&?7lB5nayzqWnT@$bYQAzg7NgwY?hGXX5(hxc)Lo_^nJ z`h9=aFP^V&{QPKnBcw|egK-W2nmEc_lMI}@vyt`@Ti?^V_NT!Wt;NO45p^AEmhcuo zMRxz5YSs2*aImbrq84Zek@_zL0Un;$zgX{jaQUo8FV9~OjlrVLDWvN?DM;F1sB&)2 zjH>LvB1rZ)=mI=1OLugSD35JYF-Ml{h~*1det+*rqM$6?4c*YyzPoDKt}B#7PIdzk%c76VZUd?4Jf1Z1j*YA1MPapYa-FsH*mNgTA+LDp)jy_bQ#6Q2lYX6aO2ir%$C zeG003%=MmEB*)thKAnwuL)XX@zsneS04lM3uiQ8{5EhYR|9s!NaK_i**+TMnY5 zTkw&9DPYa|b=?8ecY}{eg=a-?t#XbZzv7#0xysUOv*=;Zzytjuj!M=G*EKd$V*QL7 z5Njg6mMp%eXYfo<^<8=}vc8}_%*}g#>HSOSDgHTl8SB^9jH|k1E$LxOcd%S|Xt}*H ze7?kUyeHE4SGllRutloZ1rNG~(b9L+3Q7Wwc!mYQQLF%3sDnY*4c)`f+IveTvN|Ns zY7g>+Tj+R?;R0TaS1$7IFz6STq=Co{oO?Ud+houP`i4ZqPQZn{0E)p7YqtlJ#t9ER z9r>uEiNEQX{-+$cs@^{-U#i82f=jEnOLqY8MvUiga1IL-T|$vZeNWPCK59TUdmOZ7FyU5}ByK+zrx z=08Y7%LM zAN0<;5E4CbBdEd0SH11zl|K|5u<90G5k?W`q%B_t2Lt-T%j$`>bKVO-Fr)LpcLN%9 zS=XVLm`wCy6~vOIkLgCj${h~h?sdBAAS>5oliiYS+?ba|;ubSJ^-?x~e%s5L+D_+x zI2GGlLeCex^JnFhUNMav$uqG&=$3v&q{@8_AQutDRyNGq@HnNyu()hhzXZm<=X}Ds;oBgaQWNMZTk^7GB`dq$a7WY=g zWA>}yckz1MBig%u20qv#-W8vMbld{?NX~m1i6-nZhmU$5Hs@7AIH;!w@%gOk`OSGq zHQ@GI$P;HJv5PX^zLW7?y%kr9RJszrAM1~OglkJBw9b)4W9#dB_-EHzXSB!uODL?_ z8&V_c;H$Vs@3Dsb79691CG_0X^8vMeCWoasj|0w~pdKxcIiRTUT(YNC;}~yvLi;so zh@(M_A}fdQZi9yjZ1ff%w8`|8{p&rSc;3U6$M(D$Ex`x%d>LeM8c$g@e(yiZ7qmH? zC~oq%;J;3Eq7}px^a`u(VM>RFIh=aS&doorZwJjmkKQT^j$m(n>tQHw@{F!(7rqEt zg^ZP#;OPT~&VC{>^qNedEZ));xrpcyFR+%HH)woGKO-R?7q6t2ks)R+-!m0_MX#;e zLCH!x*f>HU8|WZL^mu5$7o##aq6X|S$!O6#q?7!~T%CKpoMV1KAM4UE-(xH?K4z-D zJY$9v6!s@~9p!-s6u)Z^Txv}m|B5di(9mRmjB-o(XZ8n_lp40*V}A(j&A;>j{gXZ` zBG##|PHtllXcP9|w~_v0F>uv>$h;@FW6l?{U1Fv{MZwm5R~V7?0IRpgkZPM9YP>jQ zUgfMik&QTCMF(cRrSo9s3|jgSeyd8tb0efoj%NMD>(T>RqjyM^Seo-x?pzkt=>1Ga zF-x<5pt_QAZOmJR>zr>BHJZ&)?*k&= za2aNE$zjh;mCs2|kHt&w15p{t%(L};+>JI$_OfT>32f}w^62zUR3u=Z-qRHxjjUeq z53K1q9*3L;3wa!4khOXx1qo8iz|LAY7&X!SP2`3W z=LYDRpE%Aw4!qE*~RQB2S45kF6I}xyj~Uj3d}t7aG&@FUc_t0v+fYr{%vp- zy+d;Nw*OQA2akmv>%+O5gRBW^t*!5b6uX%(;~VTmFxkn0v|anHzNIVyzx7xxbYi&4 z@{C{3ZZiUq-#Obv)56ax`ygY$Yq3WFo@Q2ulznoDx%})}{B%Av%j=?ULnJyXTUwQ* zkpr6Qd}dvgXIA%_Mi_do9*-uYBXiFP494hNK$15jilhJXMT?>OK%o>^UYrf1%%*y)m1jC%(xwIM23{ zyEmFs{=!SSTlHh2A!b)l=rLN)Mzp#s$d0RwfgS}P`i$&9^(c z2YH|z15EqY@$Fg99_W)WY*lEha9H>^L94V&9tX>ayYlXidg#4cDXsy5IZ;aPs^Fok zF}sXhIX$e}>q}znnbLrv+*W>MA9HJaIa`#YIGO%TXXS;g6`5OA@8T!O9BO)s zW|dGPkh3e^)af=ozRHBMo|f2jdK0?y%dnLAc#ku4ybbu2@R;^BITmoLw~5S4dCyOx zJ(ZrB6yuFG(Af9XS#9J<6&z2}-<8I|;XENo4uxISbn3=q(nAhNVA| zCd!}Gnd2-E>ivoHAgrQ!$HPup_b%SUU3Thi+d4@{rt2B0cP-Hi?B$scT@`o93m(ZQ zcn^f<1DpZ#`V}kBmm~JDE+>w5oBbp?m`n_92#9jL9zAjzGE zchLcKL3a<5d7_iv1#hZ#U*CTqA7l-X3N~7R@0M>^zN^2TjWZ^``%c_Jf^f9#R8F%0 zHU0WTzupMkg1!T+4*iK>Av0IG{y}60*ot*`&|aE?#IZBh@+u_WRbF-ht?27_*16oj z-oh$-Ul2!5Ys3>;y#h1Ub$7m|n$i$5`8hS8XmcEkNZD6TdbJM@M62~7%_$MI9EqUI z=nVRjux!akwbtc7Jx&YxyPQZrNw3sZq;Rxf2V@0~HNdj-4|MY8u4uz2qw`dx9_rVM ze&skwhM0}#%~d&krE^IFWKSD6&Z^3eF5D8_p*<9 z20O5cz*L6ILBILuBURmKMU+N&x`n)77V=(MnCaaCGGJmLzRut2mA_a>&X>K`zpNjW zC8WUY5r0@#sN;AyNcw!QE4JMDW7$^HC~diTw2-k-Gx3;6bbDMa`?62Uv7EzB(C1GC z5x>Jo^AgH_*pld5;`}5U9+o8-`1<^vFpw&>1kYI6+sdd!{7)p|vY31oP1 zqg@FHsq&5l+p(iC-p=w7q(cd5D7mAt<72yU!HyA`;i8#_Z$5!-jwfujyW>tjdc~62 zJa!13_&t1!`W<;!aH*=|V_Gi$1KlaBN6V}I^OR!S2CE@Ucu#GoxFPt5iCJ)K0=o8v z5P^_^HRK6lOIwIB?9+!L>8o}|q_z+Thfjsg^W%HQ%kAV_9w`5`Xp%UT}Cu8)Ig z4yP9WWX8uwMZ8#smyAoqz<$vl*A2*FHM-uELw+W{Yky;l{S9RkcjX1t=1{hogMWC; z>!z19cqoVD6ngf7a7o{(5w>ibK6N{7(-W)h*{yIGdua7JZk}b91K*rqv6kS7rdHB2 z;%|Ccv>&NZaYL&@DrehV3U6vycxOB_@~Y9qUZCt+)gJA#>lS~e8j^fv`7C%EDZUYE_TP$=5$9?wULKjWUcHTN;=yivbI$04XX3n(k1q@Pq^#J}BdbkESYDR}kaOVq zXgSQigv00m>-QyEwrdg+^Vq7Lu|o>0MW%e=sZMPV z!W`iQ5vDXQzB)X-sJoOde9Q?~$+kDA8Q!G%s1Mi#TaW1E7HmlCM9wK2H-=5IozhWa zfz!jp?CzMjmZguC%Dx!?YmyTMC?08?ijaq(_|q=((oh)d}eL&NuY`s{X&D z|F0;GV5y`p`|rG~-fI#x%Ro_Z*?CQ^XtpC^g0u9s?bj^oy?d?Tv zN&Cb8_qWO)$vN>Fy?eVRQ&u+VBrfI^7UCdJP({l`m4Y)N3to6b892V>;BXI9W_;83 zmY&$M9GX%F$TPzgP&i76<$Ik-<;YO7NEHh()@5(D_rH1YY8*h!7c^8H`1~JJS!zY&w+>{sJd8bN{AsZT1)6#W z(TD(crwTF!;lLRCme(J;@;1^XT0#o&oaxNANSu@2D^98??Ko zYeqmJRHxC-oBAt9p)c8n$MvYqZ>@mMC<=`HEHH|FQyxqE(t3PR@OY{{8D#&sk$$Y$ zLyF@RH9`BQ8rAf`Gk6(uY^|1JNudTYnP+%n|7~AgP#dZXjG#7>KQh9Y;jnQ+_Kb(#+>PgOlVIS0Cu*X4YJNq{ zB7U!`54&*Cq8n=aVehsGG>q>RRd6cW&&Ig4jop%pmG@ls9MIcw;4vP<`atvd?+6Q~74sEz?ry+? z3;MPAhFW7)vi=3y#XebK3%w36-hUI20w%M1WQaG4ep*rR*)wrDU_f*3FU8rjmgjW| zp5Qsajs8EDF(_(5J1VWxQq09w*W_t$f>W5e4u= zeA^e@g+pKigf&5D*SN=86K>YP61xYf;jt@(5z$|)m=Vifc3+__a2hV+ivps&5@X>5 zutV+wJN!ZHpy7$vB;l~bx_6VqG4)zl4}8GaYcx~>45ci7FXU!=vCoIn7E^>Bux{dr zR%9WzIwdpGZr5zkeY`EY<-8wl;u&%VFTQaMMaaSMy@tmAY-|iZ`hS5v^rAv+I4>5j=ZKe}lPo&RI|i-^*ywZVUAO7O+LH99?Ap zVRJrb1ukpqG2@AN`Ig4E6|V`Bbw~CgIl-&<(Z7Dh(y6R7JorcCv2I9yyV=(-`SuaX ztM2S3#8Xm92+4+z^$we&wN)2I_bklC(6l+vW?65VmJ1ogQ8~MX2 zSzj+(PUO%B`zPXscJ5|XSLcG%mzWK|j2XLwi7ce|p9ZbS9g7YwX=LmJZv|J-Oir=I zG$-UYqdIaqP867X;0hPu9x%`!{65|feh{l3f@jFR*Ceg!I!g8v+wgfwgS`)SfENB- z_*=7ewflRz3(Yq)D!!Hc54&e~3SLyd6iMJyNGNhH-l>6gVA;eY7U$3b>yFg->x4gNv!@dIDH#Y29AgYrCc_i-&;MdiF1zl*&ZT>`f54cFwm84sPYrvWeL4X?!h6z6JqE+Vt&Rg?xl@&V4(q^|yCi)ShLYJP$2EmXCp$i$THO$~{@O%b)gXc5&C)Nbr7M1n!wp`MTv}McL zm|M1-jjl;6*&3WBcSYBl5jS|+>-#ar!+uzkt>? z7>@1}jY5w{_h(}r9>U4{M>VN08$LT572S6HiWf20yGsY!rX8d0{Tzp#r0x9*2Oo}h zkF-`hw%hv^&hY*W&M|vvN|HX!>2p@h-j0?v@la7G_G2J5VgvI_JR9#KT33Y`4pIuD z{Y;93yE7aHcV`$JBrf6|kCq<@2k+O?sK@ULCZl4bL;$qStHG?n^_IA4tJxR_64u>5 zu2Ll8%rU-~ET+CU>?h(k-kFk+$G0t$ad>ABZ%&x+$1YARK6?QNp8{Wb(k;78>GBqZ zK*n+55L;S~H5ShYiB?&Xf_4gv#Jm?{)rvR+{&+I{9dRrG7G(;6#VD=}&`Ku56K8QJCe4PdMVMOckTm zwZn3lQS%uzHP1f(7ferEv=DPD3#%Zg5oY3J%On-^HR_|sG9mf zfaiY~cwf_^aLep839lZRbJf`(VwAU>O(p-h$ILkLssL6j;GkuYw50 z-{YY=gpia2ZpG^sj9vM%RKC`a&Xp5V)ZhJ`82@o`D=_1V&Ex5KN#Eh5$~HQFLXg3r zEqg;F(S2D`;t5W;-CmgC(9nDghV<7PK!Q#kxkEEZky!z;mI~$}f@-E{j6|!LC}>LK zWT=61*b^*XG{D*%EgeJzNfRu#S2wLS0d;V8*hB+eOteF|BMRXW^zfpFABlck!`!Gx zG9;2H!++Cz%lvx&R^UNUAX%I19h7^s5G`i7=#V28fD3`+@J^GU15oH!DbUtIo??#! zDn|%t`+i_6X=yVmMNZnHk*clr0Wnc(-UnMCuF-EN>b8KhLoVC#0FTXNM?LfAIpI{8Mv!H=$j_F_b9I!Lh2^+ zM|(C~Z)58UTYfY6n2y=H+v~p@)K%%4y+K;)45B^``@7(IJLvG*8Fo7dSH~_1x9^Kv zE=WjbM_7l$R=tgoa6}U2*Ey6Wo|25=Bgt>p7M$3DA*wDgvS#` zbwa_jmNq^dt;AHR92Tns<@%5>-i6?ZRwR^~ut7UddCt@5FON^;ar=y5crFS<(C^Ux zmagz<(dQ&(I#M$GN8r&4TQ#rHupYlN(^&CY2-^LgR{5ZM&_T{8) zKIP8jA|n^E109*k{q#^r9HrXLnd}sy@c+;{b=*ZV?qH!6`;14SdHT#c(nQ}93tLj^ zCwglOW9pgK)oa!=*$q##FB-^bObr75@jHT!HPqpOh@(k=w4cp)YdFC7kt_)hA8Mbb%VS^s0hdo;PPU54; zKjbH^h~7O-{YT#`zkd|?;ycm@Z`6|bL1guW2&?Z~UUp=35nyZ+&TGgKDIV7R6(8y; zSR7nkII6umVc)tsZ~Ka?y!ZEK_x}E@-G$k`3%+-fXpP^iGRufXAwRQT|L^kt= z-|H5hKJeUuZr?X{$3LI{_x->Bga7^IH~W9Twe#ucPV73`b^N`f+p}la(em8qUp>v8 z&%fHKjoME=t&3eRaCgVkdv-p348Z%=t@-#2)!(H3~1;rHy}udgkXoob>#YP=)<)d0`x|2-OH$2Ww8?&?uI z+xbG-rT-V6+M}UG{0qB^NPR(9-;68&{q5alXSZwLH=d1qZ|mv1;Op7lXPdjvYMk!tduYqWvs`57ym(fK|7jrpr@FclS66g(Ev~NV>UvyV zKTsBSe0@*+c~*Zv6MyzRQ=Z!K^<6@f2cmJup0DZ7bHChkWEa{d#=X68bmw!Yo_jkP z`ECFHwthb?mhO3O;cIYI|LV>&M|X97=jRr_ess4w8dN+@BEM=#|7ymNuNu<7f~>oN z_+4FnFRs3q?D#6#@zrx>w^;dA(6i_3JM?GiX%V4YJ%7I1lNVADQS)cU{?C${XZ-sa z{gz5T^OV{=ql+C}?9jy$7fU;yerCthOOoC*`hSQ1U)p0;`226aR(dV@{BJa}%<^w! zyHcOe|E8z*m!(px>z)Q(g(USaBRngZko?nK!1yW9FYSP}0X;6CjuF-07%gKC8cEjb*3!qSk@tFZT$|fGdA=q1&_A07I;T8Dh1agl7M8 z&(}f|ez`}?T09CG|J9EDWq-Gq+xbJ!a4sF(-rwzfdVkUX9Zn{E)ju(l{t2e>PksGQ z!EpzJ?&t^AzbT&u%ZJ}jb*23O?VW#!T-SBS-@Kif_hxryv^)A?N#0e)D<^SnX}yl+ z_(!c;swF3jEys-{H=#<*Xm@OFvcEjDYgOXZq-*fMM^JaEsDUd>co8Qh|y9rvy=PLZB*86Q~R95||X25@-nQ7T6=OS74vOEdu)m4hS3+ zxK&_UU`F7Oz`F#R0=Egw3LF-=UEtjU?-6*fz#Re{07b<+1@00!B5+iIy+l;x(qL5N z2ZK?OON3GJeFFCi922-tfcvUZ@qU2^1RfN4NZ@A$xc3c*X#ib~&R18|U zTB+D@^|~9bUe_4d=)E4RMP9dI>U9lXpQmPl5XE>EjnBQ$3(d&f`@ATwz=ojM2rqI_ zah#?VSWbeQq*ayuibq_Tj3<}_dRN?c7o#|2SHhnYqC^`rov15y?EG}xSdh6k&P)%Y zzo2M3SwQ_WhoWS%P&gDd&M*a*u#A~fIZ{IEyx4gjS$45;=P_c4QqvP2;~r|6@9>&r zN{ur>SLBMMtXp52-Z4RItd@&MZ&x zP1iDSisVg92DB#lH^<6T)1~qZvj79rG|ft<1~Tgc@m#j=()rKx_fguYe}urtz-!*E zMdcVwni{}3$P!oRQ5LUie6Y~2NEzK1invBk8N?@|BFhLRr)fPZ%vmDo%7-t)?soAXi+Rs}jpV ze3+K^RO5(Ifk12lc+r-Axk6i}DP=3kgOe5`)W9@ts{m4}u%M&BzBoxAE%J$q-&P;` zT>%6|#U+K_7I=%Hr+5KzMQ#^F#orP55$CtTpm|8k=EDG*eD3w^9}eb?IV zpA3FKE|)FvbsD+9--6#3>`z+ws=@CVCbICi4E}?`uNuB;;jdV@XyI$Jm}|&v7t1qK z(;D`*vQp#I5Uhr%bsQ+wpr#T$zL=htV8uecRHE|~QjHeWNbzmTY@FZ1c(RF|X+Ek@ zpK0ByREsfNEyy65U2MGw7nilqQmE1UGn889Z&lpuu%y+kovWGyoV~aPZkB4aSIqhf zZZ)_1jA=Gmnnso~dc|=))(W(i#&w1km4!caF4XC*q_XIxFZZr#u9J6AyTkD4L3^LU zqX$j3&qMS%1y0BH#ulBlFym&)-kUILY)v;VYb>bG$ZY7rFGIqJB&$??%D~i&MU}L# zq48Dpmig09%h+_GtiISxnlVLf+S0Ml;zfb?+!Wft!T%%X3Dzw^@ zfyo8{;>yYdP<4nJ>P-@~KYFdFWA@0{t-eW7NBrI%jyefENs#ysW@- zx{8~36*W(~uc&z>%ul+C653akp{=5XtdJt_D(W>+eO$7??2&kxetEhQ~skh(8#(Lir zc%<;Q8-t_UPaGWlT4eC=5#8@73QrUmU9@!hg7aQ;-q+q!&?&{xkV_sbO!8BAW5vBG4W_PNs}>+Tr<<} zPWD*7ndx`>FqAN+BYm+zFy|eB7M|6b&fR0-!X(1jRC`2dl3fty7 zX!1~`PjQ^RJY{a&p^sum6g#4iiTk&tIab$PQcf7~r|Xopj@(8?wD*bjK7G=0zcJsF zjJX|p9*!&3?Wzwd-33Se0ablKRrgex&nE4c-TacoAsGCSR&Qi!?4YOL?2(0t7%peNl{5``)q+hDaF&Fq~?Xj1$os*wc=Z)ckLG6EWK-fE9||X zDVyFjz%0t|VCJ?kS8YJRN?+xj_p^r(lO{__@kl)pMFL64hQ%)mTv)46HQ%bgB zKCJXCwsTOjHzj*hA5G@k{BoRR{_c49m}xF#3DVvx6VUcvabLrH#xS2@=gXIsP^@FJ zT8-XZtzzm`0u=?cZBnmGsMy{cGt;#s>!+-x$CIqn#_W4o;Vew`{-ZXuODfS%cSo?< zjdHfrXRnlz*v<*8`C8IwBgOK^Hdu^I)7m%rWHv6-vhUm$EJQ53hJ_N{)((vDZ7E0@ z#!+FWq#j(MSQ8TjCaSC?8vWZ?&fG>3lA?P0ObJ5ze2Jlul?t_5uYa@E-TLYvt_b*3$C&-07v|&Gk-q?reK=b9wE#?x}Wn`MI@rCqtYCyV8Dad8Pe< zHux6Q={@sv_R%sO1vryBnj}RV@Jwu4O~$i2W&gpU)=@M8HDSYbqxW@vRqs_7rWsQG zC1tI5s#V`6WQmhxOet8ert-j6!D`ly7P~dsg`a%`rR~oq65q%q?@cB~iHO$|znLN* z(S1oB=y-$xelg;hb~331lx?^)w6jKKaXNkoC2c#doQ>YM^Iu4QC3(0?;*kQC#Z@y_Ljj>(e6wPph~Ryr=P(fbbH1IaD6^k(s`X3`2gxTI{e zVqM3$tmpl*o`rNwkC@zDfLYAWg@%W&>Z+OQL4`Y$rWW%=jHl`htaB1UqP9@_NF%Bw z@q156BG|P?1u!24T-ShoD=OB+b5Ffhw4wPFgya+%v)=m;HLd zN>bJwPqKyZRS>!zn?JWKiT5Y$IS^z{)~qdsmL&BA1xjoJV%r*ESB3hnL>q^J(`KuG zoSjoVL)B`4#3oPEo$Pd_q(w=if3neEK&T?r8jvMLJ!Qq!XxmDq|FK3=YxK{+2lZD0kgQOR;`O8e~nhH=75y9jQv$@i0e8xAy-KU zEq%fM)_uugq>!P;){b4R6V3AN9T#JVlLLdIyO1`ba?Dh89=Dnyq`)QQDiP7bjZ>BkCmwP$ zvTt}$v)0yDkTMYVF;rmK;5&X5~Q7&@kjr}WUg^cP_hSKnpky$PMg-XaJLf+kn|%CMh#X!^?cI* z1leaw+dtHdLs}q5kR=TA(FPI2lWHckux>6QxX6wtQOPw4;a&X;$tJ_tQ~7r7yn4Jg$Ssw-^;I&bqM93af$v zGqB)n^%pb#5pDE;yONaTpXZS_b4g>BV_;4IzTk$|B188__aqakhHN>9CS57#nM>FP zkBw`}tH+I(XU1%%n;FCS8>@CM*nf>jg3(N46*$%ZeU^G`FnAwgIk*ybOP3H1JJDQh6GX@(+%g_=+j-L$_bnoC(M$uROvNB@| zU&AR$j@-t;aWOK_SabgX8&u0OlN1=pH@Q0qQ+@CqFq-xlFU7S+;BM;;TT^(B8n4K! zHFB&qG?JWPTir+~fA$p#e=eNkw_W&%F1bRQZX?MfQPWovvD$Z(vRy8ip!`TyQXJpy z_#N4dkc~to#|y#)t(h{2n7k=SaF&~hlNNHjTp^~}ETg5Na;-0}j#$NzeEHTeG>J7E zwiqaUKy@fLT93*uLwD;E3_8mw&WQDDInEMdmO+%T7i^3JWu_dgRD7IcaozsmYYi=e z@EddnsycmqDdl8;$hBthBB=9kD9G z@l}?R4l2@JNuq`cBYb*ia=Ra*Sif2~5^c_j+L}^heMWFwa%(V`94)~>UT3yIwl-?D zYPvVs9ms5|pq#i*|6cN{9+JpHuj;f)8PssL%^8XeTe{57%o?~;UZv-=-%Q;2`Qc7% zhZy9U{a*?X6;ie2_UFK%lzfqg5_YKAjFvRQie^lS+%P=EKVwG2TrX^ml}{Dn^@wi< z?-&}q8S*^M{|~Flm-xpGU$gM@fpK|Av>lN7APWzur`tLOb0FH?T+$*FddVd2Ng6q`bTZT4my_OS zeK@bJ*^uF}8V%rB9EC9@NKr+d=h9<4f<>pi3@mo z_;}6kVmA6;(-F=D59bUfXGm)AIv*-d?$v-)*K)M2(Dki;_vkMpwa(c!pTpg|3-b1 z3!%E&btu}~=>IdG9>MnC;ISvyz4~vALv0E6JBZypT83+#)NlukhnEOyY;iWGQ=$bO zD=nb=bYp=h3jWfV9!2mpL1{1Z^w;TkU^3=`Y5(5`qLso0h(dYX3J@sk!;~&Vp0W-l zx~s5F72`)d%@yiLLfM5qo`W1sc(7|_;;`%uF0i3&%5##JO$P}1&P<0~RXrbTY*Dvc zoQdh)3Z-erGZc%Hw=w**@iUS(^(p;2BsCun`xEY(i&a1bpKY3&=dR>dGtius%3_0Q z%0QK5$@e5Yia3&;Y?!X;mIN`e)i~>A8P2 zeZCMqb!xfOUfgV+TwH8-yUq1yo9B3Nf2y_FYA$!1YwIsIm)aXpEHAdWbJgS$R;$}? zZt=Hyscp2)^^2bnhvl{IX1le-&uY28wXoUdEmLNg{XLHtqQ}mY<0rvfw+48&nNBAS z6*>&bHD}g!XXAEML5cH@C@0a@p0#8`iLw;_rg`8R`i1q4d@hxML6m2&M(&di^Vl$q z!%Q=}CEDnH70}nDbG07x*z&HVNt~g2!AauqM$hkP2t6RRwu7;IzW&zJqF&@oa_gvoFj!Qpwcc+gyq!`F~|D(5(%0(r|ONf;yz zco9cc#mgMj;``xEggC~0PsDjj|URlM6T+W8KY>eCMMt_&&AiuHD z{S5Drz*qGV#}6j=53mZE_{?)@d7KYh)2sJgOg^5UXtQL;%Ax@I`6S0T!w)5ST2(Y9 zrHgyRGopRTq_>S+XVE;hkHQ42@kxQ}o}?Z+SwJxzY1Z;+j|IgK(p)=v76+3(d0XV9 zpD~9t09V@Nt1XJ{b_-<5n&D_Ihq5-eXX3+Yh9)D^H^HY@2qeH+!gyn{2GP(-}`>C)7p4)eeLv1 zi|vg~7@xb;S%0xx=zVdn(0k?VWtL{ET+m$H;_Ce6xu@El)#a|_>l&v+4sa(oH#^H0 zw>H~HnycN#_0G!j#Ust2FY4-Zr1>a!^0zwe<7@4$%}#6ONb{+!iz~~EkGC(MTmNKx z?fAv}?{D3=c;EZ)dGOw2?fC~D+*>#oPoDkc@&=ripVe{_@pg@!;ynBOxeuvWD%>>4 zmD~15D`Wek51&1Cc5~y`X8+)|yH0)j(ZBp~`mx8K5zXR57g$hsx)+|hSwx-RJUDDjf(nV?XKi7R_RzHn(?(Y?DhS;$GS2;SD^30>_ozpM1&$O1;B5UDx zdv0lkS6t!Ves|P7VWFRbo2h{~(hr%N{OU!m!H5J>n5X{L$1?hI^V9bade3UfHq0i#+tI5xLtVqd;Q0DPG2&bd0rdhKF4@9%{&Z_Fha1I^pf2hOZD0qz3VbBrwQ%6 zu9|1GPutHA^}?y3%g8@|i9X0nI11E|-WIB#D(Y>SE7X^J8Hq|2UI69ZxS0Pz;~Z%( z@h5kO>G%XOy<>WX|5m5}>*3yk{T#1_;`Mh?lfS1--iJ(ky%F8X3uRMGuU5NxxyP)$ z?uBJ~FS=f&I9lq_GCyE>^r}0(=0)#>)qC2TH_V4x(GUOPn-4$o(&|c+fz+n5*?Z>Z zXPfP{#q}kA0dRcw{JF=DJ}}$tZZaOXR@T?r$7e6MyR(n{Ty6Z}R=3+;y|{9@34^un z@!74;+C$yNOYPNG_vmW)-NDht_0@-3-PO4l?wM__w$_%PZFe`rL}b!n)ofuD2W-TAGyMFrg zaWI|s^IPcIUV5st`~qhw&$YWZ$@SjAwTT<>VW?i*(ro#J=CtOD;PKg3cVX=XX4=kd zb8Fe1-W;EOwzbl2`$8F$yLZqgsDAg5?hoIcRRRPL-yK?rh+6xnE~|m&{zxyh_`co? L@l*Hzt_J=Kb6jtU literal 1575936 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