From 0d566aa3856f90bf6de13d206b85e1b6150ff70c Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Fri, 6 Apr 2012 21:52:48 -0700 Subject: [PATCH 001/547] Better Suitcase Inventory Service. --- .../HGSuitcaseInventoryService.cs | 103 ++++++++++-------- 1 file changed, 55 insertions(+), 48 deletions(-) diff --git a/OpenSim/Services/HypergridService/HGSuitcaseInventoryService.cs b/OpenSim/Services/HypergridService/HGSuitcaseInventoryService.cs index b6ec558b80..6a6181a5a0 100644 --- a/OpenSim/Services/HypergridService/HGSuitcaseInventoryService.cs +++ b/OpenSim/Services/HypergridService/HGSuitcaseInventoryService.cs @@ -109,7 +109,7 @@ namespace OpenSim.Services.HypergridService XInventoryFolder suitcase = GetSuitcaseXFolder(principalID); XInventoryFolder root = GetRootXFolder(principalID); - List tree = GetFolderTree(suitcase.folderID); + List tree = GetFolderTree(principalID, suitcase.folderID); if (tree == null || (tree != null && tree.Count == 0)) return null; @@ -119,7 +119,7 @@ namespace OpenSim.Services.HypergridService folders.Add(ConvertToOpenSim(x)); } - SetAsRootFolder(suitcase, root); + SetAsNormalFolder(suitcase, root); folders.Add(ConvertToOpenSim(suitcase)); return folders; @@ -136,10 +136,10 @@ namespace OpenSim.Services.HypergridService XInventoryFolder suitcase = GetSuitcaseXFolder(userID); XInventoryFolder root = GetRootXFolder(userID); - List tree = GetFolderTree(suitcase.folderID); + List tree = GetFolderTree(userID, suitcase.folderID); if (tree == null || (tree != null && tree.Count == 0)) { - SetAsRootFolder(suitcase, root); + SetAsNormalFolder(suitcase, root); userInventory.Folders.Add(ConvertToOpenSim(suitcase)); return userInventory; } @@ -164,7 +164,7 @@ namespace OpenSim.Services.HypergridService userInventory.Items.AddRange(items); } - SetAsRootFolder(suitcase, root); + SetAsNormalFolder(suitcase, root); userInventory.Folders.Add(ConvertToOpenSim(suitcase)); m_log.DebugFormat("[HG SUITCASE INVENTORY SERVICE]: GetUserInventory for user {0} returning {1} folders and {2} items", @@ -175,8 +175,6 @@ namespace OpenSim.Services.HypergridService public override InventoryFolderBase GetRootFolder(UUID principalID) { m_log.DebugFormat("[HG SUITCASE INVENTORY SERVICE]: GetRootFolder for {0}", principalID); - if (m_Database == null) - m_log.ErrorFormat("[XXX]: m_Database is NULL!"); // Let's find out the local root folder XInventoryFolder root = GetRootXFolder(principalID); ; @@ -202,7 +200,7 @@ namespace OpenSim.Services.HypergridService CreateSystemFolders(principalID, suitcase.folderID); } - SetAsRootFolder(suitcase, root); + SetAsNormalFolder(suitcase, root); return ConvertToOpenSim(suitcase); } @@ -271,9 +269,8 @@ namespace OpenSim.Services.HypergridService public override InventoryCollection GetFolderContent(UUID principalID, UUID folderID) { InventoryCollection coll = null; - XInventoryFolder suitcase = GetSuitcaseXFolder(principalID); - if (!IsWithinSuitcaseTree(folderID, suitcase)) + if (!IsWithinSuitcaseTree(principalID, folderID)) return new InventoryCollection(); coll = base.GetFolderContent(principalID, folderID); @@ -290,9 +287,7 @@ namespace OpenSim.Services.HypergridService { // Let's do a bit of sanity checking, more than the base service does // make sure the given folder exists under the suitcase tree of this user - XInventoryFolder suitcase = GetSuitcaseXFolder(principalID); - - if (!IsWithinSuitcaseTree(folderID, suitcase)) + if (!IsWithinSuitcaseTree(principalID, folderID)) return new List(); return base.GetFolderItems(principalID, folderID); @@ -303,21 +298,27 @@ namespace OpenSim.Services.HypergridService m_log.WarnFormat("[HG SUITCASE INVENTORY SERVICE]: AddFolder {0} {1}", folder.Name, folder.ParentID); // Let's do a bit of sanity checking, more than the base service does // make sure the given folder's parent folder exists under the suitcase tree of this user - XInventoryFolder suitcase = GetSuitcaseXFolder(folder.Owner); - if (!IsWithinSuitcaseTree(folder.ParentID, suitcase)) + if (!IsWithinSuitcaseTree(folder.Owner, folder.ParentID)) return false; // OK, it's legit - return base.AddFolder(folder); + if (base.AddFolder(folder)) + { + List tree; + if (m_SuitcaseTrees.TryGetValue(folder.Owner, out tree)) + tree.Add(ConvertFromOpenSim(folder)); + + return true; + } + + return false; } public override bool UpdateFolder(InventoryFolderBase folder) { - XInventoryFolder suitcase = GetSuitcaseXFolder(folder.Owner); - m_log.DebugFormat("[HG SUITCASE INVENTORY SERVICE]: Update folder {0}, version {1}", folder.ID, folder.Version); - if (!IsWithinSuitcaseTree(folder.ID, suitcase)) + if (!IsWithinSuitcaseTree(folder.Owner, folder.ID)) { m_log.DebugFormat("[HG SUITCASE INVENTORY SERVICE]: folder {0} not within Suitcase tree", folder.Name); return false; @@ -329,9 +330,8 @@ namespace OpenSim.Services.HypergridService public override bool MoveFolder(InventoryFolderBase folder) { - XInventoryFolder suitcase = GetSuitcaseXFolder(folder.Owner); - - if (!IsWithinSuitcaseTree(folder.ID, suitcase) || !IsWithinSuitcaseTree(folder.ParentID, suitcase)) + if (!IsWithinSuitcaseTree(folder.Owner, folder.ID) || + !IsWithinSuitcaseTree(folder.Owner, folder.ParentID)) return false; return base.MoveFolder(folder); @@ -353,9 +353,7 @@ namespace OpenSim.Services.HypergridService { // Let's do a bit of sanity checking, more than the base service does // make sure the given folder's parent folder exists under the suitcase tree of this user - XInventoryFolder suitcase = GetSuitcaseXFolder(item.Owner); - - if (!IsWithinSuitcaseTree(item.Folder, suitcase)) + if (!IsWithinSuitcaseTree(item.Owner, item.Folder)) return false; // OK, it's legit @@ -365,9 +363,7 @@ namespace OpenSim.Services.HypergridService public override bool UpdateItem(InventoryItemBase item) { - XInventoryFolder suitcase = GetSuitcaseXFolder(item.Owner); - - if (!IsWithinSuitcaseTree(item.Folder, suitcase)) + if (!IsWithinSuitcaseTree(item.Owner, item.Folder)) return false; return base.UpdateItem(item); @@ -377,9 +373,7 @@ namespace OpenSim.Services.HypergridService { // Principal is b0rked. *sigh* - XInventoryFolder suitcase = GetSuitcaseXFolder(items[0].Owner); - - if (!IsWithinSuitcaseTree(items[0].Folder, suitcase)) + if (!IsWithinSuitcaseTree(items[0].Owner, items[0].Folder)) return false; return base.MoveItems(principalID, items); @@ -400,15 +394,8 @@ namespace OpenSim.Services.HypergridService item.Name, item.ID, item.Folder); return null; } - XInventoryFolder suitcase = GetSuitcaseXFolder(it.Owner); - if (suitcase == null) - { - m_log.DebugFormat("[HG SUITCASE INVENTORY SERVICE]: Root or Suitcase are null for user {0}", - it.Owner); - return null; - } - if (!IsWithinSuitcaseTree(it.Folder, suitcase)) + if (!IsWithinSuitcaseTree(it.Owner, it.Folder)) { m_log.DebugFormat("[HG SUITCASE INVENTORY SERVICE]: Item {0} (folder {1}) is not within Suitcase", it.Name, it.Folder); @@ -431,9 +418,7 @@ namespace OpenSim.Services.HypergridService if (f != null) { - XInventoryFolder suitcase = GetSuitcaseXFolder(f.Owner); - - if (!IsWithinSuitcaseTree(f.ID, suitcase)) + if (!IsWithinSuitcaseTree(f.Owner, f.ID)) return null; } @@ -481,22 +466,37 @@ namespace OpenSim.Services.HypergridService if (folders != null && folders.Length > 0) return folders[0]; + + // check to see if we have the old Suitcase folder + folders = m_Database.GetFolders( + new string[] { "agentID", "folderName", "parentFolderID" }, + new string[] { principalID.ToString(), "My Suitcase", UUID.Zero.ToString() }); + if (folders != null && folders.Length > 0) + { + // Move it to under the root folder + XInventoryFolder root = GetRootXFolder(principalID); + folders[0].parentFolderID = root.folderID; + folders[0].type = 100; + m_Database.StoreFolder(folders[0]); + return folders[0]; + } + return null; } - private void SetAsRootFolder(XInventoryFolder suitcase, XInventoryFolder root) + private void SetAsNormalFolder(XInventoryFolder suitcase, XInventoryFolder root) { suitcase.type = (short)AssetType.Folder; } - private List GetFolderTree(UUID folder) + private List GetFolderTree(UUID principalID, UUID folder) { List t = null; - if (m_SuitcaseTrees.TryGetValue(folder, out t)) + if (m_SuitcaseTrees.TryGetValue(principalID, out t)) return t; t = GetFolderTreeRecursive(folder); - m_SuitcaseTrees.AddOrUpdate(folder, t, 120); + m_SuitcaseTrees.AddOrUpdate(principalID, t, 5*60); // 5minutes return t; } @@ -528,11 +528,18 @@ namespace OpenSim.Services.HypergridService /// /// /// - private bool IsWithinSuitcaseTree(UUID folderID, XInventoryFolder suitcase) + private bool IsWithinSuitcaseTree(UUID principalID, UUID folderID) { + XInventoryFolder suitcase = GetSuitcaseXFolder(principalID); + if (suitcase == null) + { + m_log.WarnFormat("[HG SUITCASE INVENTORY SERVICE]: User {0} does not have a Suitcase folder", principalID); + return false; + } + List tree = new List(); tree.Add(suitcase); // Warp! the tree is the real root folder plus the children of the suitcase folder - tree.AddRange(GetFolderTree(suitcase.folderID)); + tree.AddRange(GetFolderTree(principalID, suitcase.folderID)); XInventoryFolder f = tree.Find(delegate(XInventoryFolder fl) { if (fl.folderID == folderID) return true; From 7c534e558ddedc66be21efa72bfa9aa7087e6f8c Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Sat, 7 Apr 2012 14:38:32 -0700 Subject: [PATCH 002/547] Added gatekeeper and uas addresses to grid info, so that viewers can take advantage of that info. --- bin/Robust.HG.ini.example | 8 ++++++++ bin/config-include/StandaloneCommon.ini.example | 8 ++++++++ 2 files changed, 16 insertions(+) diff --git a/bin/Robust.HG.ini.example b/bin/Robust.HG.ini.example index 2fd9f11ba6..0eb8291679 100644 --- a/bin/Robust.HG.ini.example +++ b/bin/Robust.HG.ini.example @@ -318,6 +318,14 @@ ServiceConnectors = "8003/OpenSim.Server.Handlers.dll:AssetServiceConnector,8003 ; password help: optional: page providing password assistance for users of your grid ;password = http://127.0.0.1/password + + ; HG address of the gatekeeper, if you have one + ; this is the entry point for all the regions of the world + ; gatekeeper = http://127.0.0.1:8002/ + + ; HG user domain, if you have one + ; this is the entry point for all user-related HG services + ; uas = http://127.0.0.1:8002/ [GatekeeperService] LocalServiceModule = "OpenSim.Services.HypergridService.dll:GatekeeperService" diff --git a/bin/config-include/StandaloneCommon.ini.example b/bin/config-include/StandaloneCommon.ini.example index 8d9842cc5a..4f4f4005d0 100644 --- a/bin/config-include/StandaloneCommon.ini.example +++ b/bin/config-include/StandaloneCommon.ini.example @@ -231,6 +231,14 @@ ; currently unused ;password = http://127.0.0.1/password + ; HG address of the gatekeeper, if you have one + ; this is the entry point for all the regions of the world + ; gatekeeper = http://127.0.0.1:9000/ + + ; HG user domain, if you have one + ; this is the entry point for all user-related HG services + ; uas = http://127.0.0.1:9000/ + [MapImageService] ; Set this if you want to change the default ; TilesStoragePath = "maptiles" From d4a370a5f2b010727b1a2fdcc6526b7b13c72962 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Sat, 7 Apr 2012 14:52:15 -0700 Subject: [PATCH 003/547] A few more minor improvements on Suitcase inventory service. --- .../HypergridService/HGSuitcaseInventoryService.cs | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/OpenSim/Services/HypergridService/HGSuitcaseInventoryService.cs b/OpenSim/Services/HypergridService/HGSuitcaseInventoryService.cs index 6a6181a5a0..53fbea6436 100644 --- a/OpenSim/Services/HypergridService/HGSuitcaseInventoryService.cs +++ b/OpenSim/Services/HypergridService/HGSuitcaseInventoryService.cs @@ -107,7 +107,6 @@ namespace OpenSim.Services.HypergridService public override List GetInventorySkeleton(UUID principalID) { XInventoryFolder suitcase = GetSuitcaseXFolder(principalID); - XInventoryFolder root = GetRootXFolder(principalID); List tree = GetFolderTree(principalID, suitcase.folderID); if (tree == null || (tree != null && tree.Count == 0)) @@ -119,7 +118,7 @@ namespace OpenSim.Services.HypergridService folders.Add(ConvertToOpenSim(x)); } - SetAsNormalFolder(suitcase, root); + SetAsNormalFolder(suitcase); folders.Add(ConvertToOpenSim(suitcase)); return folders; @@ -134,12 +133,11 @@ namespace OpenSim.Services.HypergridService userInventory.Items = new List(); XInventoryFolder suitcase = GetSuitcaseXFolder(userID); - XInventoryFolder root = GetRootXFolder(userID); List tree = GetFolderTree(userID, suitcase.folderID); if (tree == null || (tree != null && tree.Count == 0)) { - SetAsNormalFolder(suitcase, root); + SetAsNormalFolder(suitcase); userInventory.Folders.Add(ConvertToOpenSim(suitcase)); return userInventory; } @@ -164,7 +162,7 @@ namespace OpenSim.Services.HypergridService userInventory.Items.AddRange(items); } - SetAsNormalFolder(suitcase, root); + SetAsNormalFolder(suitcase); userInventory.Folders.Add(ConvertToOpenSim(suitcase)); m_log.DebugFormat("[HG SUITCASE INVENTORY SERVICE]: GetUserInventory for user {0} returning {1} folders and {2} items", @@ -181,6 +179,7 @@ namespace OpenSim.Services.HypergridService if (root == null) { m_log.WarnFormat("[HG SUITCASE INVENTORY SERVICE]: Unable to retrieve local root folder for user {0}", principalID); + return null; } // Warp! Root folder for travelers is the suitcase folder @@ -200,7 +199,7 @@ namespace OpenSim.Services.HypergridService CreateSystemFolders(principalID, suitcase.folderID); } - SetAsNormalFolder(suitcase, root); + SetAsNormalFolder(suitcase); return ConvertToOpenSim(suitcase); } @@ -484,7 +483,7 @@ namespace OpenSim.Services.HypergridService return null; } - private void SetAsNormalFolder(XInventoryFolder suitcase, XInventoryFolder root) + private void SetAsNormalFolder(XInventoryFolder suitcase) { suitcase.type = (short)AssetType.Folder; } From 0f277dfa179ea220b6714d0659632bb3cf2724d0 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Sun, 8 Apr 2012 17:54:59 -0700 Subject: [PATCH 004/547] Addresses mantis #5846 --- OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs index 4d98f00458..b8616e8346 100644 --- a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs +++ b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs @@ -156,7 +156,9 @@ namespace OpenSim.Region.Framework.Scenes // that the region position is cached or performance will degrade Utils.LongToUInts(regionHandle, out x, out y); GridRegion dest = m_scene.GridService.GetRegionByPosition(UUID.Zero, (int)x, (int)y); -// bool v = true; + if (dest == null) + continue; + if (!simulatorList.Contains(dest.ServerURI)) { // we havent seen this simulator before, add it to the list From 78c0028179923710949fea349baad2e6bebc49bd Mon Sep 17 00:00:00 2001 From: Talun Date: Mon, 9 Apr 2012 19:58:07 +0100 Subject: [PATCH 005/547] Mantis5502 implementation of some of the new constants Signed-off-by: Melanie --- .../Framework/Interfaces/IEntityInventory.cs | 10 ++++ .../Framework/Interfaces/IScriptModule.cs | 6 +++ .../Framework/Scenes/SceneObjectGroup.cs | 28 +++++++++- .../Scenes/SceneObjectPartInventory.cs | 51 ++++++++++++++++++- .../Region/Framework/Scenes/ScenePresence.cs | 38 ++++++++++++++ .../Shared/Api/Implementation/LSL_Api.cs | 42 ++++++++------- 6 files changed, 155 insertions(+), 20 deletions(-) diff --git a/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs b/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs index 1334905f35..f5dda34d72 100644 --- a/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs +++ b/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs @@ -225,6 +225,16 @@ namespace OpenSim.Region.Framework.Interfaces /// bool ContainsScripts(); + /// + /// Returns the count of scripts contained + /// + int ScriptCount(); + + /// + /// Returns the count of running scripts contained + /// + int RunningScriptCount(); + /// /// Get the uuids of all items in this inventory /// diff --git a/OpenSim/Region/Framework/Interfaces/IScriptModule.cs b/OpenSim/Region/Framework/Interfaces/IScriptModule.cs index 9cab2e185b..c0616ed2de 100644 --- a/OpenSim/Region/Framework/Interfaces/IScriptModule.cs +++ b/OpenSim/Region/Framework/Interfaces/IScriptModule.cs @@ -69,6 +69,12 @@ namespace OpenSim.Region.Framework.Interfaces ArrayList GetScriptErrors(UUID itemID); + /// + /// Returns true if a script is running. + /// + /// The item ID of the script. + bool GetScriptState(UUID itemID); + void SaveAllState(); /// diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs index 17f3be7d83..7d14814ffc 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs @@ -3255,7 +3255,33 @@ namespace OpenSim.Region.Framework.Scenes for (int i = 0; i < parts.Length; i++) parts[i].TriggerScriptChangedEvent(val); } - + + /// + /// Returns a count of the number of scripts in this groups parts. + /// + public int ScriptCount() + { + int count = 0; + SceneObjectPart[] parts = m_parts.GetArray(); + for (int i = 0; i < parts.Length; i++) + count += parts[i].Inventory.ScriptCount(); + + return count; + } + + /// + /// Returns a count of the number of running scripts in this groups parts. + /// + public int RunningScriptCount() + { + int count = 0; + SceneObjectPart[] parts = m_parts.GetArray(); + for (int i = 0; i < parts.Length; i++) + count += parts[i].Inventory.RunningScriptCount(); + + return count; + } + public override string ToString() { return String.Format("{0} {1} ({2})", Name, UUID, AbsolutePosition); diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs index f7e123b97b..9a04c65107 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs @@ -1081,10 +1081,59 @@ namespace OpenSim.Region.Framework.Scenes } } } - + return false; } + /// + /// Returns the count of scripts in this parts inventory. + /// + /// + public int ScriptCount() + { + int count = 0; + lock (m_items) + { + foreach (TaskInventoryItem item in m_items.Values) + { + if (item.InvType == (int)InventoryType.LSL) + { + count++; + } + } + } + + return count; + } + /// + /// Returns the count of running scripts in this parts inventory. + /// + /// + public int RunningScriptCount() + { + IScriptModule[] engines = m_part.ParentGroup.Scene.RequestModuleInterfaces(); + if (engines.Length == 0) + return 0; + + int count = 0; + List scripts = GetInventoryScripts(); + + foreach (TaskInventoryItem item in scripts) + { + foreach (IScriptModule engine in engines) + { + if (engine != null) + { + if (engine.GetScriptState(item.ItemID)) + { + count++; + } + } + } + } + return count; + } + public List GetInventoryList() { List ret = new List(); diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index a21c66ff26..8863df116f 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs @@ -3418,6 +3418,44 @@ namespace OpenSim.Region.Framework.Scenes return m_attachments.Count > 0; } + /// + /// Returns the total count of scripts in all parts inventories. + /// + public int ScriptCount() + { + int count = 0; + lock (m_attachments) + { + foreach (SceneObjectGroup gobj in m_attachments) + { + if (gobj != null) + { + count += gobj.ScriptCount(); + } + } + } + return count; + } + + /// + /// Returns the total count of running scripts in all parts. + /// + public int RunningScriptCount() + { + int count = 0; + lock (m_attachments) + { + foreach (SceneObjectGroup gobj in m_attachments) + { + if (gobj != null) + { + count += gobj.RunningScriptCount(); + } + } + } + return count; + } + public bool HasScriptedAttachments() { lock (m_attachments) diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index 291f52e496..c38a52e62d 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -10358,19 +10358,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api break; // For the following 8 see the Object version below case ScriptBaseClass.OBJECT_RUNNING_SCRIPT_COUNT: - ret.Add(new LSL_Integer(0)); + ret.Add(new LSL_Integer(av.RunningScriptCount())); break; case ScriptBaseClass.OBJECT_TOTAL_SCRIPT_COUNT: - ret.Add(new LSL_Integer(0)); + ret.Add(new LSL_Integer(av.ScriptCount())); break; case ScriptBaseClass.OBJECT_SCRIPT_MEMORY: - ret.Add(new LSL_Integer(0)); + ret.Add(new LSL_Integer(av.RunningScriptCount() * 16384)); break; case ScriptBaseClass.OBJECT_SCRIPT_TIME: ret.Add(new LSL_Float(0)); break; case ScriptBaseClass.OBJECT_PRIM_EQUIVALENCE: - ret.Add(new LSL_Integer(0)); + ret.Add(new LSL_Integer(1)); break; case ScriptBaseClass.OBJECT_SERVER_COST: ret.Add(new LSL_Float(0)); @@ -10422,24 +10422,21 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api case ScriptBaseClass.OBJECT_CREATOR: ret.Add(new LSL_String(obj.CreatorID.ToString())); break; - // The following 8 I have intentionaly coded to return zero. They are part of - // "Land Impact" calculations. These calculations are probably not applicable - // to OpenSim, required figures (cpu/memory usage) are not currently tracked - // I have intentionally left these all at zero rather than return possibly - // missleading numbers case ScriptBaseClass.OBJECT_RUNNING_SCRIPT_COUNT: - // in SL this currently includes crashed scripts - ret.Add(new LSL_Integer(0)); + ret.Add(new LSL_Integer(obj.ParentGroup.RunningScriptCount())); break; case ScriptBaseClass.OBJECT_TOTAL_SCRIPT_COUNT: - ret.Add(new LSL_Integer(0)); + ret.Add(new LSL_Integer(obj.ParentGroup.ScriptCount())); break; case ScriptBaseClass.OBJECT_SCRIPT_MEMORY: // The value returned in SL for mono scripts is 65536 * number of active scripts - ret.Add(new LSL_Integer(0)); + // and 16384 * number of active scripts for LSO. since llGetFreememory + // is coded to give the LSO value use it here + ret.Add(new LSL_Integer(obj.ParentGroup.RunningScriptCount() * 16384)); break; case ScriptBaseClass.OBJECT_SCRIPT_TIME: - // Average cpu time per simulator frame expended on all scripts in the objetc + // Average cpu time per simulator frame expended on all scripts in the object + // Not currently available at Object level ret.Add(new LSL_Float(0)); break; case ScriptBaseClass.OBJECT_PRIM_EQUIVALENCE: @@ -10447,18 +10444,27 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api // equivalent of the number of prims in a linkset if it does not // contain a mesh anywhere in the link set or is not a normal prim // The value returned in SL for normal prims is prim count - ret.Add(new LSL_Integer(0)); + ret.Add(new LSL_Integer(obj.ParentGroup.PrimCount)); break; + // The following 3 costs I have intentionaly coded to return zero. They are part of + // "Land Impact" calculations. These calculations are probably not applicable + // to OpenSim and are not yet complete in SL case ScriptBaseClass.OBJECT_SERVER_COST: - // The value returned in SL for normal prims is prim count + // The linden calculation is here + // http://wiki.secondlife.com/wiki/Mesh/Mesh_Server_Weight + // The value returned in SL for normal prims looks like the prim count ret.Add(new LSL_Float(0)); break; case ScriptBaseClass.OBJECT_STREAMING_COST: - // The value returned in SL for normal prims is prim count * 0.06 + // The linden calculation is here + // http://wiki.secondlife.com/wiki/Mesh/Mesh_Streaming_Cost + // The value returned in SL for normal prims looks like the prim count * 0.06 ret.Add(new LSL_Float(0)); break; case ScriptBaseClass.OBJECT_PHYSICS_COST: - // The value returned in SL for normal prims is prim count + // The linden calculation is here + // http://wiki.secondlife.com/wiki/Mesh/Mesh_physics + // The value returned in SL for normal prims looks like the prim count ret.Add(new LSL_Float(0)); break; default: From f9dd4ed89c7aff63191c3be0bfa9d24d15d1d4bc Mon Sep 17 00:00:00 2001 From: Snoopy Pfeffer Date: Tue, 10 Apr 2012 15:51:26 +0200 Subject: [PATCH 006/547] Do not timeout group member cache entry, as long as there are frequent group membership requests. These are caused by movements within the parcel boundaries. --- OpenSim/Region/CoreModules/World/Land/LandObject.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/OpenSim/Region/CoreModules/World/Land/LandObject.cs b/OpenSim/Region/CoreModules/World/Land/LandObject.cs index ced7b523b2..7f44613d5e 100644 --- a/OpenSim/Region/CoreModules/World/Land/LandObject.cs +++ b/OpenSim/Region/CoreModules/World/Land/LandObject.cs @@ -429,7 +429,10 @@ namespace OpenSim.Region.CoreModules.World.Land { bool isMember; if (m_groupMemberCache.TryGetValue(avatar, out isMember)) + { + m_groupMemberCache.Update(avatar, isMember, m_groupMemberCacheTimeout); return isMember; + } IGroupsModule groupsModule = m_scene.RequestModuleInterface(); if (groupsModule == null) From 2b339bfd9702d2d1c988b87bc806b7fe3bdbed69 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Tue, 10 Apr 2012 17:22:02 +0100 Subject: [PATCH 007/547] Correct max_listeners_per_region in OpenSimDefaults.ini to max_listens_per_region Value for this setting in OpenSimDefaults.ini (1000) is same as setting in code (1000) so this should have no effect Thanks to Ovi Chris Rouly for pointing this out. --- bin/OpenSimDefaults.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/OpenSimDefaults.ini b/bin/OpenSimDefaults.ini index 45d604f829..68a2ea307f 100644 --- a/bin/OpenSimDefaults.ini +++ b/bin/OpenSimDefaults.ini @@ -1129,7 +1129,7 @@ ; Maximum number of llListen events we allow over the entire region. ; Set this to 0 to have no limit imposed - max_listeners_per_region = 1000 + max_listens_per_region = 1000 ; Maximum number of llListen events we allow per script ; Set this to 0 to have no limit imposed. From fb44e7b636f35a773c016dcfbd56318d6d337c57 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Tue, 10 Apr 2012 17:46:34 +0100 Subject: [PATCH 008/547] minor: convert tabs to spaces in config example files from recent 7c534e5 --- bin/Robust.HG.ini.example | 12 ++++++------ bin/config-include/StandaloneCommon.ini.example | 12 ++++++------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/bin/Robust.HG.ini.example b/bin/Robust.HG.ini.example index 0eb8291679..4ea5ffd051 100644 --- a/bin/Robust.HG.ini.example +++ b/bin/Robust.HG.ini.example @@ -319,13 +319,13 @@ ServiceConnectors = "8003/OpenSim.Server.Handlers.dll:AssetServiceConnector,8003 ; password help: optional: page providing password assistance for users of your grid ;password = http://127.0.0.1/password - ; HG address of the gatekeeper, if you have one - ; this is the entry point for all the regions of the world - ; gatekeeper = http://127.0.0.1:8002/ + ; HG address of the gatekeeper, if you have one + ; this is the entry point for all the regions of the world + ; gatekeeper = http://127.0.0.1:8002/ - ; HG user domain, if you have one - ; this is the entry point for all user-related HG services - ; uas = http://127.0.0.1:8002/ + ; HG user domain, if you have one + ; this is the entry point for all user-related HG services + ; uas = http://127.0.0.1:8002/ [GatekeeperService] LocalServiceModule = "OpenSim.Services.HypergridService.dll:GatekeeperService" diff --git a/bin/config-include/StandaloneCommon.ini.example b/bin/config-include/StandaloneCommon.ini.example index 4f4f4005d0..8fe64df93e 100644 --- a/bin/config-include/StandaloneCommon.ini.example +++ b/bin/config-include/StandaloneCommon.ini.example @@ -231,13 +231,13 @@ ; currently unused ;password = http://127.0.0.1/password - ; HG address of the gatekeeper, if you have one - ; this is the entry point for all the regions of the world - ; gatekeeper = http://127.0.0.1:9000/ + ; HG address of the gatekeeper, if you have one + ; this is the entry point for all the regions of the world + ; gatekeeper = http://127.0.0.1:9000/ - ; HG user domain, if you have one - ; this is the entry point for all user-related HG services - ; uas = http://127.0.0.1:9000/ + ; HG user domain, if you have one + ; this is the entry point for all user-related HG services + ; uas = http://127.0.0.1:9000/ [MapImageService] ; Set this if you want to change the default From 4ab479bf58652573606fa08136e182260b180a0b Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Tue, 10 Apr 2012 20:40:59 +0100 Subject: [PATCH 009/547] Add uri to various log messages when region registration fails. Upgrade some debug log messages to error. --- .../Connectors/Grid/GridServiceConnector.cs | 23 ++++++++++++------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/OpenSim/Services/Connectors/Grid/GridServiceConnector.cs b/OpenSim/Services/Connectors/Grid/GridServiceConnector.cs index 1599a56b1b..34ed0d75a3 100644 --- a/OpenSim/Services/Connectors/Grid/GridServiceConnector.cs +++ b/OpenSim/Services/Connectors/Grid/GridServiceConnector.cs @@ -113,29 +113,36 @@ namespace OpenSim.Services.Connectors } else if (replyData.ContainsKey("Result")&& (replyData["Result"].ToString().ToLower() == "failure")) { - m_log.DebugFormat("[GRID CONNECTOR]: Registration failed: {0}", replyData["Message"].ToString()); + m_log.ErrorFormat( + "[GRID CONNECTOR]: Registration failed: {0} when contacting {1}", replyData["Message"], uri); + return replyData["Message"].ToString(); } else if (!replyData.ContainsKey("Result")) { - m_log.DebugFormat("[GRID CONNECTOR]: reply data does not contain result field"); + m_log.ErrorFormat( + "[GRID CONNECTOR]: reply data does not contain result field when contacting {0}", uri); } else { - m_log.DebugFormat("[GRID CONNECTOR]: unexpected result {0}", replyData["Result"].ToString()); - return "Unexpected result "+replyData["Result"].ToString(); + m_log.ErrorFormat( + "[GRID CONNECTOR]: unexpected result {0} when contacting {1}", replyData["Result"], uri); + + return "Unexpected result " + replyData["Result"].ToString(); } - } else - m_log.DebugFormat("[GRID CONNECTOR]: RegisterRegion received null reply"); + { + m_log.ErrorFormat( + "[GRID CONNECTOR]: RegisterRegion received null reply when contacting grid server at {0}", uri); + } } catch (Exception e) { - m_log.DebugFormat("[GRID CONNECTOR]: Exception when contacting grid server at {0}: {1}", uri, e.Message); + m_log.ErrorFormat("[GRID CONNECTOR]: Exception when contacting grid server at {0}: {1}", uri, e.Message); } - return "Error communicating with grid service"; + return string.Format("Error communicating with the grid service at {0}", uri); } public bool DeregisterRegion(UUID regionID) From 78fd487a705c91720991a7572b860567f36366c4 Mon Sep 17 00:00:00 2001 From: Snoopy Pfeffer Date: Tue, 10 Apr 2012 21:49:43 +0200 Subject: [PATCH 010/547] New OS scripting functions osSetTerrainTexture and osSetTerrainHeight as originally proposed in SL Jira (https://jira.secondlife.com/browse/SVC-244). --- .../World/Estate/EstateManagementModule.cs | 15 ++++- .../Framework/Interfaces/IEstateModule.cs | 3 + .../Shared/Api/Implementation/OSSL_Api.cs | 55 +++++++++++++++++++ .../Shared/Api/Interface/IOSSL_Api.cs | 3 + .../Shared/Api/Runtime/OSSL_Stub.cs | 10 ++++ 5 files changed, 84 insertions(+), 2 deletions(-) diff --git a/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs b/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs index fc217b0d4b..124f01c9e5 100644 --- a/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs +++ b/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs @@ -157,12 +157,18 @@ namespace OpenSim.Region.CoreModules.World.Estate sendRegionInfoPacketToAll(); } - public void setEstateTerrainBaseTexture(IClientAPI remoteClient, int corner, UUID texture) + public void setEstateTerrainBaseTexture(int level, UUID texture) + { + setEstateTerrainBaseTexture(null, level, texture); + sendRegionHandshakeToAll(); + } + + public void setEstateTerrainBaseTexture(IClientAPI remoteClient, int level, UUID texture) { if (texture == UUID.Zero) return; - switch (corner) + switch (level) { case 0: Scene.RegionInfo.RegionSettings.TerrainTexture1 = texture; @@ -182,6 +188,11 @@ namespace OpenSim.Region.CoreModules.World.Estate sendRegionInfoPacketToAll(); } + public void setEstateTerrainTextureHeights(int corner, float lowValue, float highValue) + { + setEstateTerrainTextureHeights(null, corner, lowValue, highValue); + } + public void setEstateTerrainTextureHeights(IClientAPI client, int corner, float lowValue, float highValue) { switch (corner) diff --git a/OpenSim/Region/Framework/Interfaces/IEstateModule.cs b/OpenSim/Region/Framework/Interfaces/IEstateModule.cs index 721f0eedea..15cd23830d 100644 --- a/OpenSim/Region/Framework/Interfaces/IEstateModule.cs +++ b/OpenSim/Region/Framework/Interfaces/IEstateModule.cs @@ -45,5 +45,8 @@ namespace OpenSim.Region.Framework.Interfaces /// Tell all clients about the current state of the region (terrain textures, water height, etc.). /// void sendRegionHandshakeToAll(); + + void setEstateTerrainBaseTexture(int level, UUID texture); + void setEstateTerrainTextureHeights(int corner, float lowValue, float highValue); } } diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs index a5dcba47c8..339166b6b7 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs @@ -3049,5 +3049,60 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api return ScriptBaseClass.TRUE; } + + /// + /// Sets terrain estate texture + /// + /// + /// + /// + public void osSetTerrainTexture(int level, LSL_Key texture) + { + CheckThreatLevel(ThreatLevel.High, "osSetTerrainTexture"); + + m_host.AddScriptLPS(1); + //Check to make sure that the script's owner is the estate manager/master + //World.Permissions.GenericEstatePermission( + if (World.Permissions.IsGod(m_host.OwnerID)) + { + if (level < 0 || level > 3) + return; + + UUID textureID = new UUID(); + if (!UUID.TryParse(texture, out textureID)) + return; + + // estate module is required + IEstateModule estate = World.RequestModuleInterface(); + if (estate != null) + estate.setEstateTerrainBaseTexture(level, textureID); + } + } + + /// + /// Sets terrain heights of estate + /// + /// + /// + /// + /// + public void osSetTerrainTextureHeight(int corner, double low, double high) + { + CheckThreatLevel(ThreatLevel.High, "osSetTerrainTextureHeight"); + + m_host.AddScriptLPS(1); + //Check to make sure that the script's owner is the estate manager/master + //World.Permissions.GenericEstatePermission( + if (World.Permissions.IsGod(m_host.OwnerID)) + { + if (corner < 0 || corner > 3) + return; + + // estate module is required + IEstateModule estate = World.RequestModuleInterface(); + if (estate != null) + estate.setEstateTerrainTextureHeights(corner, (float)low, (float)high); + } + } } } \ No newline at end of file diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs index 30bd3ef9eb..545bbeea70 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs @@ -234,5 +234,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces LSL_Integer osInviteToGroup(LSL_Key agentId); LSL_Integer osEjectFromGroup(LSL_Key agentId); + + void osSetTerrainTexture(int level, LSL_Key texture); + void osSetTerrainTextureHeight(int corner, double low, double high); } } diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs index 680cefb4e0..b94b9bffe0 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs @@ -878,5 +878,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase { return m_OSSL_Functions.osEjectFromGroup(agentId); } + + public void osSetTerrainTexture(int level, LSL_Key texture) + { + m_OSSL_Functions.osSetTerrainTexture(level, texture); + } + + public void osSetTerrainTextureHeight(int corner, double low, double high) + { + m_OSSL_Functions.osSetTerrainTextureHeight(corner, low, high); + } } } From f2ede8c7e09487436261b249ec093bfd01c3f971 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Wed, 11 Apr 2012 08:11:05 -0700 Subject: [PATCH 011/547] HGFriendsModule: add the scaffolding for supporting permissions pertaining to HG friendships. Snoopy take it from here. --- .../Avatar/Friends/FriendsModule.cs | 4 +-- .../Avatar/Friends/HGFriendsModule.cs | 30 +++++++++++++++++++ 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs b/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs index f64c161271..fc6325dc3d 100644 --- a/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs @@ -162,7 +162,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends } } - protected void InitModule(IConfigSource config) + protected virtual void InitModule(IConfigSource config) { IConfig friendsConfig = config.Configs["Friends"]; if (friendsConfig != null) @@ -546,7 +546,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends } } - private void OnInstantMessage(IClientAPI client, GridInstantMessage im) + protected virtual void OnInstantMessage(IClientAPI client, GridInstantMessage im) { if ((InstantMessageDialog)im.dialog == InstantMessageDialog.FriendshipOffered) { diff --git a/OpenSim/Region/CoreModules/Avatar/Friends/HGFriendsModule.cs b/OpenSim/Region/CoreModules/Avatar/Friends/HGFriendsModule.cs index 9a6d277252..ddb6a71ace 100644 --- a/OpenSim/Region/CoreModules/Avatar/Friends/HGFriendsModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Friends/HGFriendsModule.cs @@ -87,6 +87,19 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends m_StatusNotifier = new HGStatusNotifier(this); } + protected override void InitModule(IConfigSource config) + { + base.InitModule(config); + + // Additionally to the base method + IConfig friendsConfig = config.Configs["HGFriendsModule"]; + if (friendsConfig != null) + { + // TODO: read in all config variables pertaining to + // HG friendship permissions + } + } + #endregion #region IFriendsSimConnector @@ -105,6 +118,23 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends #endregion + protected override void OnInstantMessage(IClientAPI client, GridInstantMessage im) + { + if ((InstantMessageDialog)im.dialog == InstantMessageDialog.FriendshipOffered) + { + // we got a friendship offer + UUID principalID = new UUID(im.fromAgentID); + UUID friendID = new UUID(im.toAgentID); + + // TODO: CHECK IF friendID is foreigner and if principalID has the permission + // to request these kinds of friendships. If not, return immediately. + // Maybe you want to let the client know too with + // client.SendAlertMessage + } + + base.OnInstantMessage(client, im); + } + protected override void OnApproveFriendRequest(IClientAPI client, UUID friendID, List callingCardFolders) { // Update the local cache. Yes, we need to do it right here From 1f4d3d35822c5ad3dbdd5f363014f1bf9afebdc6 Mon Sep 17 00:00:00 2001 From: Snoopy Pfeffer Date: Wed, 11 Apr 2012 18:52:07 +0200 Subject: [PATCH 012/547] HGFriendsModule: Added optional user level based restriction to send friendship invitations to foreign users. --- .../Avatar/Friends/HGFriendsModule.cs | 24 +++++++++++++++---- bin/config-include/GridCommon.ini.example | 4 ++++ .../StandaloneCommon.ini.example | 4 ++++ 3 files changed, 28 insertions(+), 4 deletions(-) diff --git a/OpenSim/Region/CoreModules/Avatar/Friends/HGFriendsModule.cs b/OpenSim/Region/CoreModules/Avatar/Friends/HGFriendsModule.cs index ddb6a71ace..f8fbbbbbd4 100644 --- a/OpenSim/Region/CoreModules/Avatar/Friends/HGFriendsModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Friends/HGFriendsModule.cs @@ -50,6 +50,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends { private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + private int m_levelHGFriends = 0; + IUserManagement m_uMan; public IUserManagement UserManagementModule { @@ -95,6 +97,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends IConfig friendsConfig = config.Configs["HGFriendsModule"]; if (friendsConfig != null) { + m_levelHGFriends = friendsConfig.GetInt("LevelHGFriends", 0); + // TODO: read in all config variables pertaining to // HG friendship permissions } @@ -126,10 +130,22 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends UUID principalID = new UUID(im.fromAgentID); UUID friendID = new UUID(im.toAgentID); - // TODO: CHECK IF friendID is foreigner and if principalID has the permission - // to request these kinds of friendships. If not, return immediately. - // Maybe you want to let the client know too with - // client.SendAlertMessage + // Check if friendID is foreigner and if principalID has the permission + // to request friendships with foreigners. If not, return immediately. + if (!UserManagementModule.IsLocalGridUser(friendID)) + { + ScenePresence avatar = null; + client.Scene.TryGetScenePresence(principalID, out avatar); + + if (avatar == null) + return; + + if (avatar.UserLevel < m_levelHGFriends) + { + client.SendAgentAlertMessage("Unable to send friendship invitation to foreigner. Insufficient permissions.", false); + return; + } + } } base.OnInstantMessage(client, im); diff --git a/bin/config-include/GridCommon.ini.example b/bin/config-include/GridCommon.ini.example index fa6f5258c5..8d7f6fc427 100644 --- a/bin/config-include/GridCommon.ini.example +++ b/bin/config-include/GridCommon.ini.example @@ -137,6 +137,10 @@ ;; uncomment the next line. You may want to do this on sims that have licensed content. ; OutboundPermission = False +[HGFriendsModule] + ; User level required to be able to send friendship invitations to foreign users + ;LevelHGFriends = 0; + [UserAgentService] ; ; === HG ONLY === diff --git a/bin/config-include/StandaloneCommon.ini.example b/bin/config-include/StandaloneCommon.ini.example index 8fe64df93e..e4bc548967 100644 --- a/bin/config-include/StandaloneCommon.ini.example +++ b/bin/config-include/StandaloneCommon.ini.example @@ -61,6 +61,10 @@ ;; uncomment the next line. You may want to do this on sims that have licensed content. ; OutboundPermission = False +[HGFriendsModule] + ; User level required to be able to send friendship invitations to foreign users + ;LevelHGFriends = 0; + [GridService] ;; For in-memory region storage (default) StorageProvider = "OpenSim.Data.Null.dll:NullRegionData" From 8be14095fed0d1d9f448d51fede20d13231c02db Mon Sep 17 00:00:00 2001 From: Snoopy Pfeffer Date: Wed, 11 Apr 2012 18:56:28 +0200 Subject: [PATCH 013/547] HGFriendsModule: Type casts to fix compile error --- OpenSim/Region/CoreModules/Avatar/Friends/HGFriendsModule.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Region/CoreModules/Avatar/Friends/HGFriendsModule.cs b/OpenSim/Region/CoreModules/Avatar/Friends/HGFriendsModule.cs index f8fbbbbbd4..3728b85a16 100644 --- a/OpenSim/Region/CoreModules/Avatar/Friends/HGFriendsModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Friends/HGFriendsModule.cs @@ -135,7 +135,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends if (!UserManagementModule.IsLocalGridUser(friendID)) { ScenePresence avatar = null; - client.Scene.TryGetScenePresence(principalID, out avatar); + ((Scene)client.Scene).TryGetScenePresence(principalID, out avatar); if (avatar == null) return; From 30d8506bc2f04028c1bbdcf57cf5f45fedb3ae7a Mon Sep 17 00:00:00 2001 From: nebadon Date: Thu, 12 Apr 2012 18:27:14 -0700 Subject: [PATCH 014/547] make changes to FlotsamCache.ini.example as noted in mantis #5960 http://opensimulator.org/mantis/view.php?id=5960 --- bin/config-include/FlotsamCache.ini.example | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/config-include/FlotsamCache.ini.example b/bin/config-include/FlotsamCache.ini.example index cd39f8c740..b9c6d84808 100644 --- a/bin/config-include/FlotsamCache.ini.example +++ b/bin/config-include/FlotsamCache.ini.example @@ -36,7 +36,7 @@ ; How often {in hours} should the disk be checked for expired filed ; Specify 0 to disable expiration checking - FileCleanupTimer = .166 ;roughly every 10 minutes + FileCleanupTimer = 1.0 ;every hour ; If WAIT_ON_INPROGRESS_REQUESTS has been defined then this specifies how ; long (in miliseconds) to block a request thread while trying to complete @@ -60,4 +60,4 @@ ; cache, and request all assets that are found that are not already cached (this ; will cause those assets to be cached) ; - ; DeepScanBeforePurge = false + DeepScanBeforePurge = true From 08e509978d81cb3451c205ed59648e3f5da91344 Mon Sep 17 00:00:00 2001 From: Talun Date: Tue, 10 Apr 2012 21:25:05 +0100 Subject: [PATCH 015/547] Mantis 55025 Implement script time. Signed-off-by: nebadon --- .../Framework/Interfaces/IEntityInventory.cs | 12 ++- .../Framework/Interfaces/IScriptModule.cs | 8 ++ .../Framework/Scenes/SceneObjectGroup.cs | 39 +++++++++ .../Scenes/SceneObjectPartInventory.cs | 14 ++-- .../Region/Framework/Scenes/ScenePresence.cs | 19 +++++ .../Shared/Api/Implementation/LSL_Api.cs | 7 +- .../Region/ScriptEngine/XEngine/XEngine.cs | 84 +++++++++++-------- 7 files changed, 136 insertions(+), 47 deletions(-) diff --git a/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs b/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs index f5dda34d72..30ed7d100d 100644 --- a/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs +++ b/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs @@ -172,7 +172,17 @@ namespace OpenSim.Region.Framework.Interfaces /// If no inventory item has that name then an empty list is returned. /// List GetInventoryItems(string name); - + + /// + /// Get inventory items by type. + /// + /// + /// + /// A list of inventory items of that type. + /// If no inventory items of that type then an empty list is returned. + /// + List GetInventoryItems(InventoryType type); + /// /// Get the scene object referenced by an inventory item. /// diff --git a/OpenSim/Region/Framework/Interfaces/IScriptModule.cs b/OpenSim/Region/Framework/Interfaces/IScriptModule.cs index c0616ed2de..0d488dffd7 100644 --- a/OpenSim/Region/Framework/Interfaces/IScriptModule.cs +++ b/OpenSim/Region/Framework/Interfaces/IScriptModule.cs @@ -82,6 +82,14 @@ namespace OpenSim.Region.Framework.Interfaces /// void StartProcessing(); + /// + /// Get the execution times of all scripts in the given array if they are currently running. + /// + /// + /// A float the value is a representative execution time in milliseconds of all scripts in that Array. + /// + float GetScriptExecutionTime(List itemIDs); + /// /// Get the execution times of all scripts in each object. /// diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs index 7d14814ffc..a49ed13ed2 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs @@ -3269,6 +3269,45 @@ namespace OpenSim.Region.Framework.Scenes return count; } + /// + /// A float the value is a representative execution time in milliseconds of all scripts in the link set. + /// + public float ScriptExecutionTime() + { + IScriptModule[] engines = Scene.RequestModuleInterfaces(); + + if (engines.Length == 0) // No engine at all + return 0.0f; + + float time = 0.0f; + + // get all the scripts in all parts + SceneObjectPart[] parts = m_parts.GetArray(); + List scripts = new List(); + for (int i = 0; i < parts.Length; i++) + { + scripts.AddRange(parts[i].Inventory.GetInventoryItems(InventoryType.LSL)); + } + // extract the UUIDs + List ids = new List(scripts.Count); + foreach (TaskInventoryItem script in scripts) + { + if (!ids.Contains(script.ItemID)) + { + ids.Add(script.ItemID); + } + } + // Offer the list of script UUIDs to each engine found and accumulate the time + foreach (IScriptModule e in engines) + { + if (e != null) + { + time += e.GetScriptExecutionTime(ids); + } + } + return time; + } + /// /// Returns a count of the number of running scripts in this groups parts. /// diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs index 9a04c65107..aacad98369 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs @@ -222,7 +222,7 @@ namespace OpenSim.Region.Framework.Scenes /// public void CreateScriptInstances(int startParam, bool postOnRez, string engine, int stateSource) { - List scripts = GetInventoryScripts(); + List scripts = GetInventoryItems(InventoryType.LSL); foreach (TaskInventoryItem item in scripts) CreateScriptInstance(item, startParam, postOnRez, engine, stateSource); } @@ -255,7 +255,7 @@ namespace OpenSim.Region.Framework.Scenes /// public void RemoveScriptInstances(bool sceneObjectBeingDeleted) { - List scripts = GetInventoryScripts(); + List scripts = GetInventoryItems(InventoryType.LSL); foreach (TaskInventoryItem item in scripts) RemoveScriptInstance(item.ItemID, sceneObjectBeingDeleted); } @@ -1116,7 +1116,7 @@ namespace OpenSim.Region.Framework.Scenes return 0; int count = 0; - List scripts = GetInventoryScripts(); + List scripts = GetInventoryItems(InventoryType.LSL); foreach (TaskInventoryItem item in scripts) { @@ -1157,14 +1157,14 @@ namespace OpenSim.Region.Framework.Scenes return ret; } - public List GetInventoryScripts() + public List GetInventoryItems(InventoryType type) { List ret = new List(); lock (m_items) { foreach (TaskInventoryItem item in m_items.Values) - if (item.InvType == (int)InventoryType.LSL) + if (item.InvType == (int)type) ret.Add(item); } @@ -1183,7 +1183,7 @@ namespace OpenSim.Region.Framework.Scenes if (engines.Length == 0) // No engine at all return ret; - List scripts = GetInventoryScripts(); + List scripts = GetInventoryItems(InventoryType.LSL); foreach (TaskInventoryItem item in scripts) { @@ -1211,7 +1211,7 @@ namespace OpenSim.Region.Framework.Scenes if (engines.Length == 0) return; - List scripts = GetInventoryScripts(); + List scripts = GetInventoryItems(InventoryType.LSL); foreach (TaskInventoryItem item in scripts) { diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index 8863df116f..641d742f95 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs @@ -3437,6 +3437,25 @@ namespace OpenSim.Region.Framework.Scenes return count; } + /// + /// A float the value is a representative execution time in milliseconds of all scripts in all attachments. + /// + public float ScriptExecutionTime() + { + float time = 0.0f; + lock (m_attachments) + { + foreach (SceneObjectGroup gobj in m_attachments) + { + if (gobj != null) + { + time += gobj.ScriptExecutionTime(); + } + } + } + return time; + } + /// /// Returns the total count of running scripts in all parts. /// diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index c38a52e62d..078a22a142 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -10367,7 +10367,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api ret.Add(new LSL_Integer(av.RunningScriptCount() * 16384)); break; case ScriptBaseClass.OBJECT_SCRIPT_TIME: - ret.Add(new LSL_Float(0)); + ret.Add(new LSL_Float(av.ScriptExecutionTime() / 1000.0f)); break; case ScriptBaseClass.OBJECT_PRIM_EQUIVALENCE: ret.Add(new LSL_Integer(1)); @@ -10435,9 +10435,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api ret.Add(new LSL_Integer(obj.ParentGroup.RunningScriptCount() * 16384)); break; case ScriptBaseClass.OBJECT_SCRIPT_TIME: - // Average cpu time per simulator frame expended on all scripts in the object - // Not currently available at Object level - ret.Add(new LSL_Float(0)); + // Average cpu time in seconds per simulator frame expended on all scripts in the object + ret.Add(new LSL_Float(obj.ParentGroup.ScriptExecutionTime() / 1000.0f)); break; case ScriptBaseClass.OBJECT_PRIM_EQUIVALENCE: // according to the SL wiki A prim or linkset will have prim diff --git a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs index 7712076a1b..b7903d5a20 100644 --- a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs +++ b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs @@ -1907,47 +1907,61 @@ namespace OpenSim.Region.ScriptEngine.XEngine if (!topScripts.ContainsKey(si.LocalID)) topScripts[si.RootLocalID] = 0; -// long ticksElapsed = tickNow - si.MeasurementPeriodTickStart; -// float framesElapsed = ticksElapsed / (18.1818 * TimeSpan.TicksPerMillisecond); - - // Execution time of the script adjusted by it's measurement period to make scripts started at - // different times comparable. -// float adjustedExecutionTime -// = (float)si.MeasurementPeriodExecutionTime -// / ((float)(tickNow - si.MeasurementPeriodTickStart) / ScriptInstance.MaxMeasurementPeriod) -// / TimeSpan.TicksPerMillisecond; - - long ticksElapsed = tickNow - si.MeasurementPeriodTickStart; - - // Avoid divide by zerp - if (ticksElapsed == 0) - ticksElapsed = 1; - - // Scale execution time to the ideal 55 fps frame time for these reasons. - // - // 1) XEngine does not execute scripts per frame, unlike other script engines. Hence, there is no - // 'script execution time per frame', which is the original purpose of this value. - // - // 2) Giving the raw execution times is misleading since scripts start at different times, making - // it impossible to compare scripts. - // - // 3) Scaling the raw execution time to the time that the script has been running is better but - // is still misleading since a script that has just been rezzed may appear to have been running - // for much longer. - // - // 4) Hence, we scale execution time to an idealised frame time (55 fps). This is also not perfect - // since the figure does not represent actual execution time and very hard running scripts will - // never exceed 18ms (though this is a very high number for script execution so is a warning sign). - float adjustedExecutionTime - = ((float)si.MeasurementPeriodExecutionTime / ticksElapsed) * 18.1818f; - - topScripts[si.RootLocalID] += adjustedExecutionTime; + topScripts[si.RootLocalID] += CalculateAdjustedExectionTime(si, tickNow); } } return topScripts; } + public float GetScriptExecutionTime(List itemIDs) + { + if (itemIDs == null|| itemIDs.Count == 0) + { + return 0.0f; + } + float time = 0.0f; + long tickNow = Util.EnvironmentTickCount(); + IScriptInstance si; + // Calculate the time for all scripts that this engine is executing + // Ignore any others + foreach (UUID id in itemIDs) + { + si = GetInstance(id); + if (si != null && si.Running) + { + time += CalculateAdjustedExectionTime(si, tickNow); + } + } + return time; + } + + private float CalculateAdjustedExectionTime(IScriptInstance si, long tickNow) + { + long ticksElapsed = tickNow - si.MeasurementPeriodTickStart; + + // Avoid divide by zero + if (ticksElapsed == 0) + ticksElapsed = 1; + + // Scale execution time to the ideal 55 fps frame time for these reasons. + // + // 1) XEngine does not execute scripts per frame, unlike other script engines. Hence, there is no + // 'script execution time per frame', which is the original purpose of this value. + // + // 2) Giving the raw execution times is misleading since scripts start at different times, making + // it impossible to compare scripts. + // + // 3) Scaling the raw execution time to the time that the script has been running is better but + // is still misleading since a script that has just been rezzed may appear to have been running + // for much longer. + // + // 4) Hence, we scale execution time to an idealised frame time (55 fps). This is also not perfect + // since the figure does not represent actual execution time and very hard running scripts will + // never exceed 18ms (though this is a very high number for script execution so is a warning sign). + return ((float)si.MeasurementPeriodExecutionTime / ticksElapsed) * 18.1818f; + } + public void SuspendScript(UUID itemID) { // m_log.DebugFormat("[XEngine]: Received request to suspend script with ID {0}", itemID); From ab7c0e75472b354e34325fdf6280b77edb0567fe Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 13 Apr 2012 22:32:33 +0100 Subject: [PATCH 016/547] Remove hardcoded god requirement from osSetRegionWaterHeight, osSetRegionSunSettings and, osSetEstateSunSettings no matter the threat level. Change threat level on osSetRegionSunSettings and osSetEstateSunSettings from nuisance to high to match similar functions. If you had enabled these functions but had relied on the hardcoded god check in the code, then please adjust your OSSL permissions config. Thanks to Oren Hurvitz for pointing this out. --- .../Shared/Api/Implementation/OSSL_Api.cs | 61 ++++++++----------- 1 file changed, 25 insertions(+), 36 deletions(-) diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs index a5dcba47c8..2c0de93ea6 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs @@ -1179,12 +1179,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api CheckThreatLevel(ThreatLevel.High, "osSetRegionWaterHeight"); m_host.AddScriptLPS(1); - //Check to make sure that the script's owner is the estate manager/master - //World.Permissions.GenericEstatePermission( - if (World.Permissions.IsGod(m_host.OwnerID)) - { - World.EventManager.TriggerRequestChangeWaterHeight((float)height); - } + + World.EventManager.TriggerRequestChangeWaterHeight((float)height); } /// @@ -1195,27 +1191,23 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api /// The "Sun Hour" that is desired, 0...24, with 0 just after SunRise public void osSetRegionSunSettings(bool useEstateSun, bool sunFixed, double sunHour) { - CheckThreatLevel(ThreatLevel.Nuisance, "osSetRegionSunSettings"); + CheckThreatLevel(ThreatLevel.High, "osSetRegionSunSettings"); m_host.AddScriptLPS(1); - //Check to make sure that the script's owner is the estate manager/master - //World.Permissions.GenericEstatePermission( - if (World.Permissions.IsGod(m_host.OwnerID)) - { - while (sunHour > 24.0) - sunHour -= 24.0; - while (sunHour < 0) - sunHour += 24.0; + while (sunHour > 24.0) + sunHour -= 24.0; + while (sunHour < 0) + sunHour += 24.0; - World.RegionInfo.RegionSettings.UseEstateSun = useEstateSun; - World.RegionInfo.RegionSettings.SunPosition = sunHour + 6; // LL Region Sun Hour is 6 to 30 - World.RegionInfo.RegionSettings.FixedSun = sunFixed; - World.RegionInfo.RegionSettings.Save(); + World.RegionInfo.RegionSettings.UseEstateSun = useEstateSun; + World.RegionInfo.RegionSettings.SunPosition = sunHour + 6; // LL Region Sun Hour is 6 to 30 + World.RegionInfo.RegionSettings.FixedSun = sunFixed; + World.RegionInfo.RegionSettings.Save(); - World.EventManager.TriggerEstateToolsSunUpdate(World.RegionInfo.RegionHandle, sunFixed, useEstateSun, (float)sunHour); - } + World.EventManager.TriggerEstateToolsSunUpdate( + World.RegionInfo.RegionHandle, sunFixed, useEstateSun, (float)sunHour); } /// @@ -1225,26 +1217,23 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api /// The "Sun Hour" that is desired, 0...24, with 0 just after SunRise public void osSetEstateSunSettings(bool sunFixed, double sunHour) { - CheckThreatLevel(ThreatLevel.Nuisance, "osSetEstateSunSettings"); + CheckThreatLevel(ThreatLevel.High, "osSetEstateSunSettings"); m_host.AddScriptLPS(1); - //Check to make sure that the script's owner is the estate manager/master - //World.Permissions.GenericEstatePermission( - if (World.Permissions.IsGod(m_host.OwnerID)) - { - while (sunHour > 24.0) - sunHour -= 24.0; - while (sunHour < 0) - sunHour += 24.0; + while (sunHour > 24.0) + sunHour -= 24.0; - World.RegionInfo.EstateSettings.UseGlobalTime = !sunFixed; - World.RegionInfo.EstateSettings.SunPosition = sunHour; - World.RegionInfo.EstateSettings.FixedSun = sunFixed; - World.RegionInfo.EstateSettings.Save(); + while (sunHour < 0) + sunHour += 24.0; - World.EventManager.TriggerEstateToolsSunUpdate(World.RegionInfo.RegionHandle, sunFixed, World.RegionInfo.RegionSettings.UseEstateSun, (float)sunHour); - } + World.RegionInfo.EstateSettings.UseGlobalTime = !sunFixed; + World.RegionInfo.EstateSettings.SunPosition = sunHour; + World.RegionInfo.EstateSettings.FixedSun = sunFixed; + World.RegionInfo.EstateSettings.Save(); + + World.EventManager.TriggerEstateToolsSunUpdate( + World.RegionInfo.RegionHandle, sunFixed, World.RegionInfo.RegionSettings.UseEstateSun, (float)sunHour); } /// From eced0916894709e20c16ffc260599772913d7ff3 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 13 Apr 2012 22:52:24 +0100 Subject: [PATCH 017/547] Change threat level of osNpcStopMoveToTarget from Low to High to match other NPC functions, and change OSSL permissions name to osNpcStopMoveToTarget instead of osNpcStopMoveTo Thanks to Oren Hurvitz for pointing out these mistakes. --- .../Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs index 72c1bf6dbf..2680ad0667 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs @@ -2514,7 +2514,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public void osNpcStopMoveToTarget(LSL_Key npc) { - CheckThreatLevel(ThreatLevel.VeryLow, "osNpcStopMoveTo"); + CheckThreatLevel(ThreatLevel.High, "osNpcStopMoveToTarget"); m_host.AddScriptLPS(1); INPCModule module = World.RequestModuleInterface(); From a366c05ae2fdfbcce1bc592166f89e3e286bcae4 Mon Sep 17 00:00:00 2001 From: Kevin Cozens Date: Fri, 10 Feb 2012 14:09:46 -0500 Subject: [PATCH 018/547] Added ability to exclude inventory items or folders when saving IAR files. --- .../Archiver/InventoryArchiveWriteRequest.cs | 88 +++++++++---- .../Archiver/InventoryArchiverModule.cs | 124 ++++++++++-------- 2 files changed, 128 insertions(+), 84 deletions(-) diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveWriteRequest.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveWriteRequest.cs index a26c73a07c..0ee7606a13 100644 --- a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveWriteRequest.cs +++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveWriteRequest.cs @@ -91,7 +91,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver /// Constructor /// public InventoryArchiveWriteRequest( - Guid id, InventoryArchiverModule module, Scene scene, + Guid id, InventoryArchiverModule module, Scene scene, UserAccount userInfo, string invPath, string savePath) : this( id, @@ -107,7 +107,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver /// Constructor /// public InventoryArchiveWriteRequest( - Guid id, InventoryArchiverModule module, Scene scene, + Guid id, InventoryArchiverModule module, Scene scene, UserAccount userInfo, string invPath, Stream saveStream) { m_id = id; @@ -125,7 +125,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver { Exception reportedException = null; bool succeeded = true; - + try { m_archiveWriter.Close(); @@ -146,6 +146,21 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver protected void SaveInvItem(InventoryItemBase inventoryItem, string path, Dictionary options, IUserAccountService userAccountService) { + if (options.ContainsKey("exclude")) + { + if (((List)options["exclude"]).Contains(inventoryItem.Name) || + ((List)options["exclude"]).Contains(inventoryItem.ID.ToString())) + { + if (options.ContainsKey("verbose")) + { + m_log.InfoFormat( + "[INVENTORY ARCHIVER]: Skipping inventory item {0} {1} at {2}", + inventoryItem.Name, inventoryItem.ID, path); + } + return; + } + } + if (options.ContainsKey("verbose")) m_log.InfoFormat( "[INVENTORY ARCHIVER]: Saving item {0} {1} with asset {2}", @@ -175,12 +190,27 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver /// /// protected void SaveInvFolder( - InventoryFolderBase inventoryFolder, string path, bool saveThisFolderItself, + InventoryFolderBase inventoryFolder, string path, bool saveThisFolderItself, Dictionary options, IUserAccountService userAccountService) { + if (options.ContainsKey("excludefolders")) + { + if (((List)options["excludefolders"]).Contains(inventoryFolder.Name) || + ((List)options["excludefolders"]).Contains(inventoryFolder.ID.ToString())) + { + if (options.ContainsKey("verbose")) + { + m_log.InfoFormat( + "[INVENTORY ARCHIVER]: Skipping folder {0} at {1}", + inventoryFolder.Name, path); + } + return; + } + } + if (options.ContainsKey("verbose")) m_log.InfoFormat("[INVENTORY ARCHIVER]: Saving folder {0}", inventoryFolder.Name); - + if (saveThisFolderItself) { path += CreateArchiveFolderName(inventoryFolder); @@ -189,7 +219,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver m_archiveWriter.WriteDir(path); } - InventoryCollection contents + InventoryCollection contents = m_scene.InventoryService.GetFolderContent(inventoryFolder.Owner, inventoryFolder.ID); foreach (InventoryFolderBase childFolder in contents.Folders) @@ -216,16 +246,16 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver InventoryFolderBase inventoryFolder = null; InventoryItemBase inventoryItem = null; InventoryFolderBase rootFolder = m_scene.InventoryService.GetRootFolder(m_userInfo.PrincipalID); - + bool saveFolderContentsOnly = false; - + // Eliminate double slashes and any leading / on the path. string[] components = m_invPath.Split( new string[] { InventoryFolderImpl.PATH_DELIMITER }, StringSplitOptions.RemoveEmptyEntries); - + int maxComponentIndex = components.Length - 1; - + // If the path terminates with a STAR then later on we want to archive all nodes in the folder but not the // folder itself. This may get more sophisicated later on if (maxComponentIndex >= 0 && components[maxComponentIndex] == STAR_WILDCARD) @@ -233,13 +263,13 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver saveFolderContentsOnly = true; maxComponentIndex--; } - + m_invPath = String.Empty; for (int i = 0; i <= maxComponentIndex; i++) { m_invPath += components[i] + InventoryFolderImpl.PATH_DELIMITER; } - + // Annoyingly Split actually returns the original string if the input string consists only of delimiters // Therefore if we still start with a / after the split, then we need the root folder if (m_invPath.Length == 0) @@ -249,25 +279,25 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver else { m_invPath = m_invPath.Remove(m_invPath.LastIndexOf(InventoryFolderImpl.PATH_DELIMITER)); - List candidateFolders + List candidateFolders = InventoryArchiveUtils.FindFolderByPath(m_scene.InventoryService, rootFolder, m_invPath); if (candidateFolders.Count > 0) inventoryFolder = candidateFolders[0]; } - + // The path may point to an item instead if (inventoryFolder == null) inventoryItem = InventoryArchiveUtils.FindItemByPath(m_scene.InventoryService, rootFolder, m_invPath); - + if (null == inventoryFolder && null == inventoryItem) { - // We couldn't find the path indicated + // We couldn't find the path indicated string errorMessage = string.Format("Aborted save. Could not find inventory path {0}", m_invPath); Exception e = new InventoryArchiverException(errorMessage); m_module.TriggerInventoryArchiveSaved(m_id, false, m_userInfo, m_invPath, m_saveStream, e); throw e; } - + m_archiveWriter = new TarArchiveWriter(m_saveStream); m_log.InfoFormat("[INVENTORY ARCHIVER]: Adding control file to archive."); @@ -281,10 +311,10 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver { m_log.DebugFormat( "[INVENTORY ARCHIVER]: Found folder {0} {1} at {2}", - inventoryFolder.Name, - inventoryFolder.ID, + inventoryFolder.Name, + inventoryFolder.ID, m_invPath == String.Empty ? InventoryFolderImpl.PATH_DELIMITER : m_invPath); - + //recurse through all dirs getting dirs and files SaveInvFolder(inventoryFolder, ArchiveConstants.INVENTORY_PATH, !saveFolderContentsOnly, options, userAccountService); } @@ -293,10 +323,10 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver m_log.DebugFormat( "[INVENTORY ARCHIVER]: Found item {0} {1} at {2}", inventoryItem.Name, inventoryItem.ID, m_invPath); - + SaveInvItem(inventoryItem, ArchiveConstants.INVENTORY_PATH, options, userAccountService); } - + // Don't put all this profile information into the archive right now. //SaveUsers(); @@ -355,7 +385,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver /// /// These names are prepended with an inventory folder's UUID so that more than one folder can have the /// same name - /// + /// /// /// public static string CreateArchiveFolderName(InventoryFolderBase folder) @@ -369,7 +399,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver /// /// These names are prepended with an inventory item's UUID so that more than one item can have the /// same name - /// + /// /// /// public static string CreateArchiveItemName(InventoryItemBase item) @@ -415,7 +445,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver public string CreateControlFile(Dictionary options) { int majorVersion, minorVersion; - + if (options.ContainsKey("home")) { majorVersion = 1; @@ -425,10 +455,10 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver { majorVersion = 0; minorVersion = 3; - } - + } + m_log.InfoFormat("[INVENTORY ARCHIVER]: Creating version {0}.{1} IAR", majorVersion, minorVersion); - + StringWriter sw = new StringWriter(); XmlTextWriter xtw = new XmlTextWriter(sw); xtw.Formatting = Formatting.Indented; @@ -450,4 +480,4 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver return s; } } -} \ No newline at end of file +} diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiverModule.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiverModule.cs index ac22c3f079..cf870100a4 100644 --- a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiverModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiverModule.cs @@ -47,18 +47,18 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver public class InventoryArchiverModule : IRegionModule, IInventoryArchiverModule { private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - + public string Name { get { return "Inventory Archiver Module"; } } - + public bool IsSharedModule { get { return true; } } /// - /// Enable or disable checking whether the iar user is actually logged in + /// Enable or disable checking whether the iar user is actually logged in /// // public bool DisablePresenceChecks { get; set; } - + public event InventoryArchiveSaved OnInventoryArchiveSaved; - + /// /// The file to load and save inventory if no filename has been specified /// @@ -68,7 +68,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver /// Pending save completions initiated from the console /// protected List m_pendingConsoleSaves = new List(); - + /// /// All scenes that this module knows about /// @@ -106,7 +106,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver { scene.RegisterModuleInterface(this); OnInventoryArchiveSaved += SaveInvConsoleCommandCompleted; - + scene.AddCommand( "Archiving", this, "load iar", "load iar [-m|--merge] []", @@ -119,11 +119,11 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver + " is the filesystem path or URI from which to load the IAR." + string.Format(" If this is not given then the filename {0} in the current directory is used", DEFAULT_INV_BACKUP_FILENAME), HandleLoadInvConsoleCommand); - + scene.AddCommand( "Archiving", this, "save iar", - "save iar [-h|--home=] [--noassets] [] [-c|--creators] [-v|--verbose]", - "Save user inventory archive (IAR).", + "save iar [-h|--home=] [--noassets] [] [-c|--creators] [-e|--exclude=] [-f|--excludefolder=] [-v|--verbose]", + "Save user inventory archive (IAR).", " is the user's first name.\n" + " is the user's last name.\n" + " is the path inside the user's inventory for the folder/item to be saved.\n" @@ -131,32 +131,34 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver + string.Format(" If this is not given then the filename {0} in the current directory is used.\n", DEFAULT_INV_BACKUP_FILENAME) + "-h|--home= adds the url of the profile service to the saved user information.\n" + "-c|--creators preserves information about foreign creators.\n" + + "-e|--exclude= don't save the inventory item in archive" + Environment.NewLine + + "-f|--excludefolder= don't save contents of the folder in archive" + Environment.NewLine + "-v|--verbose extra debug messages.\n" + "--noassets stops assets being saved to the IAR.", HandleSaveInvConsoleCommand); m_aScene = scene; } - + m_scenes[scene.RegionInfo.RegionID] = scene; } public void PostInitialise() {} public void Close() {} - + /// /// Trigger the inventory archive saved event. /// protected internal void TriggerInventoryArchiveSaved( - Guid id, bool succeeded, UserAccount userInfo, string invPath, Stream saveStream, + Guid id, bool succeeded, UserAccount userInfo, string invPath, Stream saveStream, Exception reportedException) { InventoryArchiveSaved handlerInventoryArchiveSaved = OnInventoryArchiveSaved; if (handlerInventoryArchiveSaved != null) handlerInventoryArchiveSaved(id, succeeded, userInfo, invPath, saveStream, reportedException); } - + public bool ArchiveInventory( Guid id, string firstName, string lastName, string invPath, string pass, Stream saveStream) { @@ -164,7 +166,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver } public bool ArchiveInventory( - Guid id, string firstName, string lastName, string invPath, string pass, Stream saveStream, + Guid id, string firstName, string lastName, string invPath, string pass, Stream saveStream, Dictionary options) { if (m_scenes.Count > 0) @@ -188,7 +190,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver return false; } - + return true; // } // else @@ -202,15 +204,15 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver return false; } - + public bool ArchiveInventory( - Guid id, string firstName, string lastName, string invPath, string pass, string savePath, + Guid id, string firstName, string lastName, string invPath, string pass, string savePath, Dictionary options) { if (m_scenes.Count > 0) { UserAccount userInfo = GetUserInfo(firstName, lastName, pass); - + if (userInfo != null) { // if (CheckPresence(userInfo.PrincipalID)) @@ -228,7 +230,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver return false; } - + return true; // } // else @@ -239,7 +241,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver // } } } - + return false; } @@ -247,9 +249,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver { return DearchiveInventory(firstName, lastName, invPath, pass, loadStream, new Dictionary()); } - + public bool DearchiveInventory( - string firstName, string lastName, string invPath, string pass, Stream loadStream, + string firstName, string lastName, string invPath, string pass, Stream loadStream, Dictionary options) { if (m_scenes.Count > 0) @@ -295,22 +297,22 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver return false; } - + public bool DearchiveInventory( - string firstName, string lastName, string invPath, string pass, string loadPath, + string firstName, string lastName, string invPath, string pass, string loadPath, Dictionary options) { if (m_scenes.Count > 0) { UserAccount userInfo = GetUserInfo(firstName, lastName, pass); - + if (userInfo != null) { // if (CheckPresence(userInfo.PrincipalID)) // { InventoryArchiveReadRequest request; bool merge = (options.ContainsKey("merge") ? (bool)options["merge"] : false); - + try { request = new InventoryArchiveReadRequest(m_aScene, userInfo, invPath, loadPath, merge); @@ -324,7 +326,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver return false; } - + UpdateClientWithLoadedNodes(userInfo, request.Execute()); return true; @@ -340,7 +342,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver return false; } - + /// /// Load inventory from an inventory file archive /// @@ -351,26 +353,26 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver { Dictionary options = new Dictionary(); OptionSet optionSet = new OptionSet().Add("m|merge", delegate (string v) { options["merge"] = v != null; }); - + List mainParams = optionSet.Parse(cmdparams); - + if (mainParams.Count < 6) { m_log.Error( - "[INVENTORY ARCHIVER]: usage is load iar [-m|--merge] []"); + "[INVENTORY ARCHIVER]: usage is load iar [-m|--merge] []"); return; } - + string firstName = mainParams[2]; string lastName = mainParams[3]; string invPath = mainParams[4]; string pass = mainParams[5]; string loadPath = (mainParams.Count > 6 ? mainParams[6] : DEFAULT_INV_BACKUP_FILENAME); - + m_log.InfoFormat( "[INVENTORY ARCHIVER]: Loading archive {0} to inventory path {1} for {2} {3}", loadPath, invPath, firstName, lastName); - + if (DearchiveInventory(firstName, lastName, invPath, pass, loadPath, options)) m_log.InfoFormat( "[INVENTORY ARCHIVER]: Loaded archive {0} for {1} {2}", @@ -381,7 +383,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver m_log.ErrorFormat("[INVENTORY ARCHIVER]: {0}", e.Message); } } - + /// /// Save inventory to a file archive /// @@ -398,6 +400,18 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver ops.Add("v|verbose", delegate(string v) { options["verbose"] = v; }); ops.Add("c|creators", delegate(string v) { options["creators"] = v; }); ops.Add("noassets", delegate(string v) { options["noassets"] = v != null; }); + ops.Add("e|exclude=", delegate(string v) + { + if (!options.ContainsKey("exclude")) + options["exclude"] = new List(); + ((List)options["exclude"]).Add(v); + }); + ops.Add("f|excludefolder=", delegate(string v) + { + if (!options.ContainsKey("excludefolders")) + options["excludefolders"] = new List(); + ((List)options["excludefolders"]).Add(v); + }); List mainParams = ops.Parse(cmdparams); @@ -406,10 +420,10 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver if (mainParams.Count < 6) { m_log.Error( - "[INVENTORY ARCHIVER]: usage is save iar [-h|--home=] [--noassets] [] [-c|--creators] [-v|--verbose]"); + "[INVENTORY ARCHIVER]: save iar [-h|--home=] [--noassets] [] [-c|--creators] [-e|--exclude=] [-f|--excludefolder=] [-v|--verbose]"); return; } - + if (options.ContainsKey("home")) m_log.WarnFormat("[INVENTORY ARCHIVER]: Please be aware that inventory archives with creator information are not compatible with OpenSim 0.7.0.2 and earlier. Do not use the -home option if you want to produce a compatible IAR"); @@ -418,7 +432,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver string invPath = mainParams[4]; string pass = mainParams[5]; string savePath = (mainParams.Count > 6 ? mainParams[6] : DEFAULT_INV_BACKUP_FILENAME); - + m_log.InfoFormat( "[INVENTORY ARCHIVER]: Saving archive {0} using inventory path {1} for {2} {3}", savePath, invPath, firstName, lastName); @@ -433,9 +447,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver m_log.ErrorFormat("[INVENTORY ARCHIVER]: {0}", e.Message); } } - + private void SaveInvConsoleCommandCompleted( - Guid id, bool succeeded, UserAccount userInfo, string invPath, Stream saveStream, + Guid id, bool succeeded, UserAccount userInfo, string invPath, Stream saveStream, Exception reportedException) { lock (m_pendingConsoleSaves) @@ -445,7 +459,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver else return; } - + if (succeeded) { m_log.InfoFormat("[INVENTORY ARCHIVER]: Saved archive for {0} {1}", userInfo.FirstName, userInfo.LastName); @@ -453,11 +467,11 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver else { m_log.ErrorFormat( - "[INVENTORY ARCHIVER]: Archive save for {0} {1} failed - {2}", + "[INVENTORY ARCHIVER]: Archive save for {0} {1} failed - {2}", userInfo.FirstName, userInfo.LastName, reportedException.Message); } } - + /// /// Get user information for the given name. /// @@ -467,13 +481,13 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver /// protected UserAccount GetUserInfo(string firstName, string lastName, string pass) { - UserAccount account + UserAccount account = m_aScene.UserAccountService.GetUserAccount(m_aScene.RegionInfo.ScopeID, firstName, lastName); - + if (null == account) { m_log.ErrorFormat( - "[INVENTORY ARCHIVER]: Failed to find user info for {0} {1}", + "[INVENTORY ARCHIVER]: Failed to find user info for {0} {1}", firstName, lastName); return null; } @@ -488,7 +502,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver else { m_log.ErrorFormat( - "[INVENTORY ARCHIVER]: Password for user {0} {1} incorrect. Please try again.", + "[INVENTORY ARCHIVER]: Password for user {0} {1} incorrect. Please try again.", firstName, lastName); return null; } @@ -499,7 +513,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver return null; } } - + /// /// Notify the client of loaded nodes if they are logged in /// @@ -508,22 +522,22 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver { if (loadedNodes.Count == 0) return; - + foreach (Scene scene in m_scenes.Values) { ScenePresence user = scene.GetScenePresence(userInfo.PrincipalID); - + if (user != null && !user.IsChildAgent) { foreach (InventoryNodeBase node in loadedNodes) { // m_log.DebugFormat( -// "[INVENTORY ARCHIVER]: Notifying {0} of loaded inventory node {1}", +// "[INVENTORY ARCHIVER]: Notifying {0} of loaded inventory node {1}", // user.Name, node.Name); - + user.ControllingClient.SendBulkUpdateInventory(node); } - + break; } } @@ -538,7 +552,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver // { // if (DisablePresenceChecks) // return true; -// +// // foreach (Scene scene in m_scenes.Values) // { // ScenePresence p; From eeec1f32c6a8396b7714fc7448e56c4d4cc9b3ba Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Sat, 14 Apr 2012 01:01:28 +0100 Subject: [PATCH 019/547] Add very basic TestGetRootPartPosition() test --- .../Scenes/Tests/SceneObjectSpatialTests.cs | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 OpenSim/Region/Framework/Scenes/Tests/SceneObjectSpatialTests.cs diff --git a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectSpatialTests.cs b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectSpatialTests.cs new file mode 100644 index 0000000000..10c78b5609 --- /dev/null +++ b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectSpatialTests.cs @@ -0,0 +1,65 @@ +/* + * Copyright (c) Contributors, http://opensimulator.org/ + * See CONTRIBUTORS.TXT for a full list of copyright holders. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the OpenSimulator Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using System; +using System.Reflection; +using System.Threading; +using NUnit.Framework; +using OpenMetaverse; +using OpenSim.Framework; +using OpenSim.Framework.Communications; +using OpenSim.Region.Framework.Scenes; +using OpenSim.Tests.Common; +using OpenSim.Tests.Common.Mock; + +namespace OpenSim.Region.Framework.Scenes.Tests +{ + /// + /// Spatial scene object tests (will eventually cover root and child part position, rotation properties, etc.) + /// + [TestFixture] + public class SceneObjectSpatialTests + { + [Test] + public void TestGetRootPartPosition() + { + TestHelpers.InMethod(); + + Scene scene = SceneHelpers.SetupScene(); + UUID ownerId = TestHelpers.ParseTail(0x1); + Vector3 partPosition = new Vector3(10, 20, 30); + + SceneObjectGroup so + = SceneHelpers.CreateSceneObject(1, ownerId, "obj1", 0x10); + so.AbsolutePosition = partPosition; + scene.AddNewSceneObject(so, false); + + Assert.That(so.AbsolutePosition, Is.EqualTo(partPosition)); + Assert.That(so.RootPart.AbsolutePosition, Is.EqualTo(partPosition)); + } + } +} \ No newline at end of file From 4bdd9d51bc0ccfa5b15a6e77228f69dafada03b7 Mon Sep 17 00:00:00 2001 From: Melanie Date: Sat, 14 Apr 2012 01:04:26 +0100 Subject: [PATCH 020/547] Correct whitespace error introduced by previous commit --- OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs index 11b21d4af2..69df392322 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs @@ -148,7 +148,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces LSL_Rotation llGetLocalRot(); LSL_Float llGetMass(); LSL_Integer llGetMemoryLimit(); - void llGetNextEmail(string address, string subject); + void llGetNextEmail(string address, string subject); LSL_String llGetNotecardLine(string name, int line); LSL_Key llGetNumberOfNotecardLines(string name); LSL_Integer llGetNumberOfPrims(); From 4d652c704186e9e399ffc6fc1bdf1f1dca056370 Mon Sep 17 00:00:00 2001 From: Talun Date: Sat, 14 Apr 2012 00:37:55 +0100 Subject: [PATCH 021/547] Missing or unimplemented LSL memory functions. Implemented to behave as if scripts were LSO. Signed-off-by: nebadon --- .../Shared/Api/Implementation/LSL_Api.cs | 52 ++++++++++++------- .../Shared/Api/Interface/ILSL_Api.cs | 7 ++- .../Shared/Api/Runtime/LSL_Constants.cs | 3 ++ .../Shared/Api/Runtime/LSL_Stub.cs | 25 +++++++++ 4 files changed, 68 insertions(+), 19 deletions(-) diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index 078a22a142..a19427da73 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -10949,6 +10949,40 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api return 1; } + public LSL_Integer llGetMemoryLimit() + { + m_host.AddScriptLPS(1); + // The value returned for LSO scripts in SL + return 16384; + } + + public LSL_Integer llSetMemoryLimit(LSL_Integer limit) + { + m_host.AddScriptLPS(1); + // Treat as an LSO script + return ScriptBaseClass.FALSE; + } + + public LSL_Integer llGetSPMaxMemory() + { + m_host.AddScriptLPS(1); + // The value returned for LSO scripts in SL + return 16384; + } + + public LSL_Integer llGetUsedMemory() + { + m_host.AddScriptLPS(1); + // The value returned for LSO scripts in SL + return 16384; + } + + public void llScriptProfiler(LSL_Integer flags) + { + m_host.AddScriptLPS(1); + // This does nothing for LSO scripts in SL + } + #region Not Implemented // // Listing the unimplemented lsl functions here, please move @@ -10961,24 +10995,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api NotImplemented("llGetEnv"); } - public void llGetSPMaxMemory() - { - m_host.AddScriptLPS(1); - NotImplemented("llGetSPMaxMemory"); - } - - public void llGetUsedMemory() - { - m_host.AddScriptLPS(1); - NotImplemented("llGetUsedMemory"); - } - - public void llScriptProfiler(LSL_Integer flags) - { - m_host.AddScriptLPS(1); - NotImplemented("llScriptProfiler"); - } - public void llSetSoundQueueing(int queue) { m_host.AddScriptLPS(1); diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs index 0f53bc3210..11b21d4af2 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs @@ -147,7 +147,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces LSL_Vector llGetLocalPos(); LSL_Rotation llGetLocalRot(); LSL_Float llGetMass(); - void llGetNextEmail(string address, string subject); + LSL_Integer llGetMemoryLimit(); + void llGetNextEmail(string address, string subject); LSL_String llGetNotecardLine(string name, int line); LSL_Key llGetNumberOfNotecardLines(string name); LSL_Integer llGetNumberOfPrims(); @@ -185,6 +186,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces LSL_String llGetScriptName(); LSL_Integer llGetScriptState(string name); LSL_String llGetSimulatorHostname(); + LSL_Integer llGetSPMaxMemory(); LSL_Integer llGetStartParameter(); LSL_Integer llGetStatus(int status); LSL_String llGetSubString(string src, int start, int end); @@ -198,6 +200,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces LSL_String llGetTimestamp(); LSL_Vector llGetTorque(); LSL_Integer llGetUnixTime(); + LSL_Integer llGetUsedMemory(); LSL_Vector llGetVel(); LSL_Float llGetWallclock(); void llGiveInventory(string destination, string inventory); @@ -319,6 +322,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces void llSay(int channelID, string text); void llScaleTexture(double u, double v, int face); LSL_Integer llScriptDanger(LSL_Vector pos); + void llScriptProfiler(LSL_Integer flag); LSL_Key llSendRemoteData(string channel, string dest, int idata, string sdata); void llSensor(string name, string id, int type, double range, double arc); void llSensorRemove(); @@ -342,6 +346,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces void llSetLinkTexture(int linknumber, string texture, int face); void llSetLinkTextureAnim(int linknum, int mode, int face, int sizex, int sizey, double start, double length, double rate); void llSetLocalRot(LSL_Rotation rot); + LSL_Integer llSetMemoryLimit(LSL_Integer limit); void llSetObjectDesc(string desc); void llSetObjectName(string name); void llSetObjectPermMask(int mask, int value); diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs index f58f9d6e49..fd7c41e682 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs @@ -381,6 +381,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase public const int PRIM_SCULPT_FLAG_INVERT = 64; public const int PRIM_SCULPT_FLAG_MIRROR = 128; + public const int PROFILE_NONE = 0; + public const int PROFILE_SCRIPT_MEMORY = 1; + public const int MASK_BASE = 0; public const int MASK_OWNER = 1; public const int MASK_GROUP = 2; diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs index f8e3c367bc..3c2f7bdf44 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs @@ -569,6 +569,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase return m_LSL_Functions.llGetMass(); } + public LSL_Integer llGetMemoryLimit() + { + return m_LSL_Functions.llGetMemoryLimit(); + } + public void llGetNextEmail(string address, string subject) { m_LSL_Functions.llGetNextEmail(address, subject); @@ -759,6 +764,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase return m_LSL_Functions.llGetSimulatorHostname(); } + public LSL_Integer llGetSPMaxMemory() + { + return m_LSL_Functions.llGetSPMaxMemory(); + } + public LSL_Integer llGetStartParameter() { return m_LSL_Functions.llGetStartParameter(); @@ -824,6 +834,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase return m_LSL_Functions.llGetUnixTime(); } + public LSL_Integer llGetUsedMemory() + { + return m_LSL_Functions.llGetUsedMemory(); + } + public LSL_Vector llGetVel() { return m_LSL_Functions.llGetVel(); @@ -1423,6 +1438,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase return m_LSL_Functions.llScriptDanger(pos); } + public void llScriptProfiler(LSL_Integer flags) + { + m_LSL_Functions.llScriptProfiler(flags); + } + public LSL_Key llSendRemoteData(string channel, string dest, int idata, string sdata) { return m_LSL_Functions.llSendRemoteData(channel, dest, idata, sdata); @@ -1533,6 +1553,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase m_LSL_Functions.llSetLocalRot(rot); } + public LSL_Integer llSetMemoryLimit(LSL_Integer limit) + { + return m_LSL_Functions.llSetMemoryLimit(limit); + } + public void llSetObjectDesc(string desc) { m_LSL_Functions.llSetObjectDesc(desc); From 2254a718c83df18746be1c9ccfad48928eb48cb3 Mon Sep 17 00:00:00 2001 From: nebadon Date: Fri, 13 Apr 2012 17:09:23 -0700 Subject: [PATCH 022/547] Add Talun to the CONTRIBUTORS.txt, Thank you for the great patches Talun --- CONTRIBUTORS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CONTRIBUTORS.txt b/CONTRIBUTORS.txt index 287073bbf8..1370449405 100644 --- a/CONTRIBUTORS.txt +++ b/CONTRIBUTORS.txt @@ -144,6 +144,7 @@ what it is today. * SignpostMarv * SpotOn3D * Strawberry Fride +* Talun * tglion * tlaukkan/Tommil (Tommi S. E. Laukkanen, Bubble Cloud) * tyre From 3ae98611f2efd7c8fb7acc172f9252241dd5c918 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Sat, 14 Apr 2012 01:43:03 +0100 Subject: [PATCH 023/547] Add simple RelativePosition and OffsetPosition checks to TestGetRootPartPosition --- .../Region/Framework/Scenes/Tests/SceneObjectSpatialTests.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectSpatialTests.cs b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectSpatialTests.cs index 10c78b5609..19526c02fb 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectSpatialTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectSpatialTests.cs @@ -60,6 +60,8 @@ namespace OpenSim.Region.Framework.Scenes.Tests Assert.That(so.AbsolutePosition, Is.EqualTo(partPosition)); Assert.That(so.RootPart.AbsolutePosition, Is.EqualTo(partPosition)); + Assert.That(so.RootPart.OffsetPosition, Is.EqualTo(Vector3.Zero)); + Assert.That(so.RootPart.RelativePosition, Is.EqualTo(partPosition)); } } } \ No newline at end of file From 317aebcce6618cacbe3afd831c3e100b96665be2 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Sat, 14 Apr 2012 01:47:56 +0100 Subject: [PATCH 024/547] refactor: put SOG position test in a separate TestSceneObjectGroupPosition() --- .../Scenes/Tests/SceneObjectSpatialTests.cs | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectSpatialTests.cs b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectSpatialTests.cs index 19526c02fb..3509de1309 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectSpatialTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectSpatialTests.cs @@ -44,6 +44,23 @@ namespace OpenSim.Region.Framework.Scenes.Tests [TestFixture] public class SceneObjectSpatialTests { + [Test] + public void TestSceneObjectGroupPosition() + { + TestHelpers.InMethod(); + + Scene scene = SceneHelpers.SetupScene(); + UUID ownerId = TestHelpers.ParseTail(0x1); + Vector3 position = new Vector3(10, 20, 30); + + SceneObjectGroup so + = SceneHelpers.CreateSceneObject(1, ownerId, "obj1", 0x10); + so.AbsolutePosition = position; + scene.AddNewSceneObject(so, false); + + Assert.That(so.AbsolutePosition, Is.EqualTo(position)); + } + [Test] public void TestGetRootPartPosition() { @@ -58,7 +75,6 @@ namespace OpenSim.Region.Framework.Scenes.Tests so.AbsolutePosition = partPosition; scene.AddNewSceneObject(so, false); - Assert.That(so.AbsolutePosition, Is.EqualTo(partPosition)); Assert.That(so.RootPart.AbsolutePosition, Is.EqualTo(partPosition)); Assert.That(so.RootPart.OffsetPosition, Is.EqualTo(Vector3.Zero)); Assert.That(so.RootPart.RelativePosition, Is.EqualTo(partPosition)); From f61b2342524023b89725e3473b8332fe6a8e71ca Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Sat, 14 Apr 2012 01:52:16 +0100 Subject: [PATCH 025/547] refactor: move common init code into SetUp() in SceneObjectSpatialTests --- .../Scenes/Tests/SceneObjectSpatialTests.cs | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectSpatialTests.cs b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectSpatialTests.cs index 3509de1309..69b5b1f3be 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectSpatialTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectSpatialTests.cs @@ -44,19 +44,26 @@ namespace OpenSim.Region.Framework.Scenes.Tests [TestFixture] public class SceneObjectSpatialTests { + TestScene m_scene; + UUID m_ownerId = TestHelpers.ParseTail(0x1); + + [SetUp] + public void SetUp() + { + m_scene = SceneHelpers.SetupScene(); + } + [Test] public void TestSceneObjectGroupPosition() { TestHelpers.InMethod(); - Scene scene = SceneHelpers.SetupScene(); - UUID ownerId = TestHelpers.ParseTail(0x1); Vector3 position = new Vector3(10, 20, 30); SceneObjectGroup so - = SceneHelpers.CreateSceneObject(1, ownerId, "obj1", 0x10); + = SceneHelpers.CreateSceneObject(1, m_ownerId, "obj1", 0x10); so.AbsolutePosition = position; - scene.AddNewSceneObject(so, false); + m_scene.AddNewSceneObject(so, false); Assert.That(so.AbsolutePosition, Is.EqualTo(position)); } @@ -66,14 +73,12 @@ namespace OpenSim.Region.Framework.Scenes.Tests { TestHelpers.InMethod(); - Scene scene = SceneHelpers.SetupScene(); - UUID ownerId = TestHelpers.ParseTail(0x1); Vector3 partPosition = new Vector3(10, 20, 30); SceneObjectGroup so - = SceneHelpers.CreateSceneObject(1, ownerId, "obj1", 0x10); + = SceneHelpers.CreateSceneObject(1, m_ownerId, "obj1", 0x10); so.AbsolutePosition = partPosition; - scene.AddNewSceneObject(so, false); + m_scene.AddNewSceneObject(so, false); Assert.That(so.RootPart.AbsolutePosition, Is.EqualTo(partPosition)); Assert.That(so.RootPart.OffsetPosition, Is.EqualTo(Vector3.Zero)); From da342d0b21b867061a3f3a502256331c609e1564 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Sat, 14 Apr 2012 01:53:40 +0100 Subject: [PATCH 026/547] minor: make test names consistent --- .../Region/Framework/Scenes/Tests/SceneObjectSpatialTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectSpatialTests.cs b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectSpatialTests.cs index 69b5b1f3be..c38a22dd24 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectSpatialTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectSpatialTests.cs @@ -54,7 +54,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests } [Test] - public void TestSceneObjectGroupPosition() + public void TestGetSceneObjectGroupPosition() { TestHelpers.InMethod(); From 2c74e1bba8d93a1c3b95da913bc3de0aae6dca4a Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Sat, 14 Apr 2012 01:57:09 +0100 Subject: [PATCH 027/547] Add GroupPosition and GetWorldPosition() checks to TestGetRootPartPosition() --- .../Region/Framework/Scenes/Tests/SceneObjectSpatialTests.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectSpatialTests.cs b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectSpatialTests.cs index c38a22dd24..7a3b3627e0 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectSpatialTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectSpatialTests.cs @@ -81,8 +81,10 @@ namespace OpenSim.Region.Framework.Scenes.Tests m_scene.AddNewSceneObject(so, false); Assert.That(so.RootPart.AbsolutePosition, Is.EqualTo(partPosition)); - Assert.That(so.RootPart.OffsetPosition, Is.EqualTo(Vector3.Zero)); + Assert.That(so.RootPart.GroupPosition, Is.EqualTo(partPosition)); + Assert.That(so.RootPart.GetWorldPosition(), Is.EqualTo(partPosition)); Assert.That(so.RootPart.RelativePosition, Is.EqualTo(partPosition)); + Assert.That(so.RootPart.OffsetPosition, Is.EqualTo(Vector3.Zero)); } } } \ No newline at end of file From f213f55586b9af66955fdfccdd50237febaf98ca Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Tue, 17 Apr 2012 00:02:58 +0100 Subject: [PATCH 028/547] Fix bug in WebStatsModule where an exception would always be output on update if the user teleported to another region on that simulator. This was because update was looking for an existing stats record unique in session id, agent id and region id. But if the user teleports to another region then region id changes. WebStatsModule promptly doesn't find the existing record and tries to insert a new one, but only session id is the primary key and that's still the same, which makes things go bang. This makes the update search only on the unique session id. This is only an issue with simulators that have multiple regions where the webstats module is enabled. --- OpenSim/Region/UserStatistics/WebStatsModule.cs | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/OpenSim/Region/UserStatistics/WebStatsModule.cs b/OpenSim/Region/UserStatistics/WebStatsModule.cs index b9ba4bc797..dbe9b3fd4f 100644 --- a/OpenSim/Region/UserStatistics/WebStatsModule.cs +++ b/OpenSim/Region/UserStatistics/WebStatsModule.cs @@ -446,7 +446,7 @@ namespace OpenSim.Region.UserStatistics { // m_log.DebugFormat("[WEB STATS MODULE]: Received viewer starts report from {0}", agentID); - UpdateUserStats(ParseViewerStats(request,agentID), dbConn); + UpdateUserStats(ParseViewerStats(request, agentID), dbConn); return String.Empty; } @@ -654,8 +654,6 @@ namespace OpenSim.Region.UserStatistics updatecmd.Parameters.Add(new SqliteParameter(":f_send_packet", uid.session_data.f_send_packet)); updatecmd.Parameters.Add(new SqliteParameter(":session_key", uid.session_data.session_id.ToString())); - updatecmd.Parameters.Add(new SqliteParameter(":agent_key", uid.session_data.agent_id.ToString())); - updatecmd.Parameters.Add(new SqliteParameter(":region_key", uid.session_data.region_id.ToString())); // m_log.DebugFormat("[WEB STATS MODULE]: Database stats update for {0}", uid.session_data.agent_id); @@ -667,11 +665,18 @@ namespace OpenSim.Region.UserStatistics updatecmd.CommandText = SQL_STATS_TABLE_INSERT; +// StringBuilder parameters = new StringBuilder(); +// SqliteParameterCollection spc = updatecmd.Parameters; +// foreach (SqliteParameter sp in spc) +// parameters.AppendFormat("{0}={1},", sp.ParameterName, sp.Value); +// +// m_log.DebugFormat("[WEB STATS MODULE]: Parameters {0}", parameters); + try { updatecmd.ExecuteNonQuery(); } - catch (Exception e) + catch (SqliteExecutionException e) { m_log.WarnFormat( "[WEB STATS MODULE]: failed to write stats for {0}, storage Execution Exception {1}{2}", @@ -801,7 +806,7 @@ set session_id=:session_id, f_off_circuit=:f_off_circuit, f_resent=:f_resent, f_send_packet=:f_send_packet -WHERE session_id=:session_key AND agent_id=:agent_key AND region_id=:region_key"; +WHERE session_id=:session_key"; #endregion } From 1bb387333868e223c90519d18fa18b84bd1a4324 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Tue, 17 Apr 2012 00:19:36 +0100 Subject: [PATCH 029/547] Simplify WebStatsModule by removing the uncompleted migrations section. Use "create table if not exists" instead. Client stats data is transitory data that it is not worth migrating. --- .../Region/UserStatistics/WebStatsModule.cs | 32 ++----------------- 1 file changed, 3 insertions(+), 29 deletions(-) diff --git a/OpenSim/Region/UserStatistics/WebStatsModule.cs b/OpenSim/Region/UserStatistics/WebStatsModule.cs index dbe9b3fd4f..e593ecd15f 100644 --- a/OpenSim/Region/UserStatistics/WebStatsModule.cs +++ b/OpenSim/Region/UserStatistics/WebStatsModule.cs @@ -90,7 +90,7 @@ namespace OpenSim.Region.UserStatistics dbConn = new SqliteConnection("URI=file:LocalUserStatistics.db,version=3"); dbConn.Open(); - CheckAndUpdateDatabase(dbConn); + CreateTables(dbConn); Prototype_distributor protodep = new Prototype_distributor(); Updater_distributor updatedep = new Updater_distributor(); @@ -237,36 +237,12 @@ namespace OpenSim.Region.UserStatistics return responsedata; } - - public void CheckAndUpdateDatabase(SqliteConnection db) - { - lock (db) - { - // TODO: FIXME: implement stats migrations - const string SQL = @"SELECT * FROM migrations LIMIT 1"; - - using (SqliteCommand cmd = new SqliteCommand(SQL, db)) - { - try - { - cmd.ExecuteNonQuery(); - } - catch (SqliteSyntaxException) - { - CreateTables(db); - } - } - } - } public void CreateTables(SqliteConnection db) { using (SqliteCommand createcmd = new SqliteCommand(SQL_STATS_TABLE_CREATE, db)) { createcmd.ExecuteNonQuery(); - - createcmd.CommandText = SQL_MIGRA_TABLE_CREATE; - createcmd.ExecuteNonQuery(); } } @@ -688,9 +664,7 @@ namespace OpenSim.Region.UserStatistics } #region SQL - private const string SQL_MIGRA_TABLE_CREATE = @"create table migrations(name varchar(100), version int)"; - - private const string SQL_STATS_TABLE_CREATE = @"CREATE TABLE stats_session_data ( + private const string SQL_STATS_TABLE_CREATE = @"CREATE TABLE IF NOT EXISTS stats_session_data ( session_id VARCHAR(36) NOT NULL PRIMARY KEY, agent_id VARCHAR(36) NOT NULL DEFAULT '', region_id VARCHAR(36) NOT NULL DEFAULT '', @@ -807,8 +781,8 @@ set session_id=:session_id, f_resent=:f_resent, f_send_packet=:f_send_packet WHERE session_id=:session_key"; - #endregion } + #endregion public static class UserSessionUtil { From 572440cd23cdd5737979a2140b9d782b836fb952 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Tue, 17 Apr 2012 00:33:23 +0100 Subject: [PATCH 030/547] correct bug where f_invalid was being inserted on a webstats update for an existing session rather than d_world_kb --- OpenSim/Region/UserStatistics/WebStatsModule.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/OpenSim/Region/UserStatistics/WebStatsModule.cs b/OpenSim/Region/UserStatistics/WebStatsModule.cs index e593ecd15f..cc041d1f51 100644 --- a/OpenSim/Region/UserStatistics/WebStatsModule.cs +++ b/OpenSim/Region/UserStatistics/WebStatsModule.cs @@ -718,7 +718,7 @@ namespace OpenSim.Region.UserStatistics session_id, agent_id, region_id, last_updated, remote_ip, name_f, name_l, avg_agents_in_view, min_agents_in_view, max_agents_in_view, mode_agents_in_view, avg_fps, min_fps, max_fps, mode_fps, a_language, mem_use, meters_traveled, avg_ping, min_ping, max_ping, mode_ping, regions_visited, run_time, avg_sim_fps, min_sim_fps, max_sim_fps, mode_sim_fps, start_time, client_version, s_cpu, s_gpu, s_os, s_ram, -d_object_kb, d_texture_kb, n_in_kb, n_in_pk, n_out_kb, n_out_pk, f_dropped, f_failed_resends, f_invalid, f_invalid, f_off_circuit, +d_object_kb, d_texture_kb, d_world_kb, n_in_kb, n_in_pk, n_out_kb, n_out_pk, f_dropped, f_failed_resends, f_invalid, f_off_circuit, f_resent, f_send_packet ) VALUES @@ -726,7 +726,7 @@ VALUES :session_id, :agent_id, :region_id, :last_updated, :remote_ip, :name_f, :name_l, :avg_agents_in_view, :min_agents_in_view, :max_agents_in_view, :mode_agents_in_view, :avg_fps, :min_fps, :max_fps, :mode_fps, :a_language, :mem_use, :meters_traveled, :avg_ping, :min_ping, :max_ping, :mode_ping, :regions_visited, :run_time, :avg_sim_fps, :min_sim_fps, :max_sim_fps, :mode_sim_fps, :start_time, :client_version, :s_cpu, :s_gpu, :s_os, :s_ram, -:d_object_kb, :d_texture_kb, :n_in_kb, :n_in_pk, :n_out_kb, :n_out_pk, :f_dropped, :f_failed_resends, :f_invalid, :f_invalid, :f_off_circuit, +:d_object_kb, :d_texture_kb, :d_world_kb, :n_in_kb, :n_in_pk, :n_out_kb, :n_out_pk, :f_dropped, :f_failed_resends, :f_invalid, :f_off_circuit, :f_resent, :f_send_packet ) "; From e6ec83125b9d77db833e18bbbdb396a31fb7b871 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Tue, 17 Apr 2012 00:46:43 +0100 Subject: [PATCH 031/547] Use INSERT OR REPLACE INTO sql in WebStatsModule for session update rather than separate insert and update statements --- .../Region/UserStatistics/WebStatsModule.cs | 84 ++----------------- 1 file changed, 7 insertions(+), 77 deletions(-) diff --git a/OpenSim/Region/UserStatistics/WebStatsModule.cs b/OpenSim/Region/UserStatistics/WebStatsModule.cs index cc041d1f51..a00955a05f 100644 --- a/OpenSim/Region/UserStatistics/WebStatsModule.cs +++ b/OpenSim/Region/UserStatistics/WebStatsModule.cs @@ -575,7 +575,7 @@ namespace OpenSim.Region.UserStatistics lock (db) { - using (SqliteCommand updatecmd = new SqliteCommand(SQL_STATS_TABLE_UPDATE, db)) + using (SqliteCommand updatecmd = new SqliteCommand(SQL_STATS_TABLE_INSERT, db)) { updatecmd.Parameters.Add(new SqliteParameter(":session_id", uid.session_data.session_id.ToString())); updatecmd.Parameters.Add(new SqliteParameter(":agent_id", uid.session_data.agent_id.ToString())); @@ -624,22 +624,9 @@ namespace OpenSim.Region.UserStatistics updatecmd.Parameters.Add(new SqliteParameter(":f_dropped", uid.session_data.f_dropped)); updatecmd.Parameters.Add(new SqliteParameter(":f_failed_resends", uid.session_data.f_failed_resends)); updatecmd.Parameters.Add(new SqliteParameter(":f_invalid", uid.session_data.f_invalid)); - updatecmd.Parameters.Add(new SqliteParameter(":f_off_circuit", uid.session_data.f_off_circuit)); updatecmd.Parameters.Add(new SqliteParameter(":f_resent", uid.session_data.f_resent)); updatecmd.Parameters.Add(new SqliteParameter(":f_send_packet", uid.session_data.f_send_packet)); - - updatecmd.Parameters.Add(new SqliteParameter(":session_key", uid.session_data.session_id.ToString())); - -// m_log.DebugFormat("[WEB STATS MODULE]: Database stats update for {0}", uid.session_data.agent_id); - - int result = updatecmd.ExecuteNonQuery(); - - if (result == 0) - { -// m_log.DebugFormat("[WEB STATS MODULE]: Database stats insert for {0}", uid.session_data.agent_id); - - updatecmd.CommandText = SQL_STATS_TABLE_INSERT; // StringBuilder parameters = new StringBuilder(); // SqliteParameterCollection spc = updatecmd.Parameters; @@ -648,17 +635,9 @@ namespace OpenSim.Region.UserStatistics // // m_log.DebugFormat("[WEB STATS MODULE]: Parameters {0}", parameters); - try - { - updatecmd.ExecuteNonQuery(); - } - catch (SqliteExecutionException e) - { - m_log.WarnFormat( - "[WEB STATS MODULE]: failed to write stats for {0}, storage Execution Exception {1}{2}", - uid.session_data.agent_id, e.Message, e.StackTrace); - } - } +// m_log.DebugFormat("[WEB STATS MODULE]: Database stats update for {0}", uid.session_data.agent_id); + + updatecmd.ExecuteNonQuery(); } } } @@ -714,7 +693,7 @@ namespace OpenSim.Region.UserStatistics f_send_packet INT NOT NULL DEFAULT '0' );"; - private const string SQL_STATS_TABLE_INSERT = @"INSERT INTO stats_session_data ( + private const string SQL_STATS_TABLE_INSERT = @"INSERT OR REPLACE INTO stats_session_data ( session_id, agent_id, region_id, last_updated, remote_ip, name_f, name_l, avg_agents_in_view, min_agents_in_view, max_agents_in_view, mode_agents_in_view, avg_fps, min_fps, max_fps, mode_fps, a_language, mem_use, meters_traveled, avg_ping, min_ping, max_ping, mode_ping, regions_visited, run_time, avg_sim_fps, min_sim_fps, max_sim_fps, mode_sim_fps, start_time, client_version, s_cpu, s_gpu, s_os, s_ram, @@ -731,59 +710,10 @@ VALUES ) "; - private const string SQL_STATS_TABLE_UPDATE = @" -UPDATE stats_session_data -set session_id=:session_id, - agent_id=:agent_id, - region_id=:region_id, - last_updated=:last_updated, - remote_ip=:remote_ip, - name_f=:name_f, - name_l=:name_l, - avg_agents_in_view=:avg_agents_in_view, - min_agents_in_view=:min_agents_in_view, - max_agents_in_view=:max_agents_in_view, - mode_agents_in_view=:mode_agents_in_view, - avg_fps=:avg_fps, - min_fps=:min_fps, - max_fps=:max_fps, - mode_fps=:mode_fps, - a_language=:a_language, - mem_use=:mem_use, - meters_traveled=:meters_traveled, - avg_ping=:avg_ping, - min_ping=:min_ping, - max_ping=:max_ping, - mode_ping=:mode_ping, - regions_visited=:regions_visited, - run_time=:run_time, - avg_sim_fps=:avg_sim_fps, - min_sim_fps=:min_sim_fps, - max_sim_fps=:max_sim_fps, - mode_sim_fps=:mode_sim_fps, - start_time=:start_time, - client_version=:client_version, - s_cpu=:s_cpu, - s_gpu=:s_gpu, - s_os=:s_os, - s_ram=:s_ram, - d_object_kb=:d_object_kb, - d_texture_kb=:d_texture_kb, - d_world_kb=:d_world_kb, - n_in_kb=:n_in_kb, - n_in_pk=:n_in_pk, - n_out_kb=:n_out_kb, - n_out_pk=:n_out_pk, - f_dropped=:f_dropped, - f_failed_resends=:f_failed_resends, - f_invalid=:f_invalid, - f_off_circuit=:f_off_circuit, - f_resent=:f_resent, - f_send_packet=:f_send_packet -WHERE session_id=:session_key"; - } #endregion + } + public static class UserSessionUtil { public static UserSessionData newUserSessionData() From 5655239f440dce36cdf9288db70be567aef2d565 Mon Sep 17 00:00:00 2001 From: Talun Date: Mon, 16 Apr 2012 20:24:56 +0100 Subject: [PATCH 032/547] Null reference in llGetObjectMass on a seated avatar. --- .../Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index a19427da73..55817273b5 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -9255,7 +9255,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api // child agents have a mass of 1.0 return 1; else - return (double)avatar.PhysicsActor.Mass; + return (double)avatar.GetMass(); } catch (KeyNotFoundException) { From 24a0cc5261f1fd1a1d8779c8fb5e7d7fba98ed68 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Tue, 17 Apr 2012 01:25:41 +0100 Subject: [PATCH 033/547] refactor: Rename EstateSettings.IsEstateManager() to EstateSettings.IsEstateManagerOrOwner() to reflect what it actually does. This makes it consistent with other parts of OpenSimulator that are treating ESTATE_MANAGER and ESTATE_OWNER as different entities. As per opensim-dev mailing list. --- OpenSim/Framework/EstateSettings.cs | 4 ++-- OpenSim/Framework/Tests/MundaneFrameworkTests.cs | 4 ++-- .../CoreModules/World/Estate/EstateManagementModule.cs | 2 +- OpenSim/Region/CoreModules/World/Land/LandObject.cs | 4 ++-- .../CoreModules/World/Permissions/PermissionsModule.cs | 2 +- OpenSim/Region/Framework/Scenes/ScenePresence.cs | 6 +++--- .../ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | 2 +- .../Region/ScriptEngine/Shared/Api/Implementation/LS_Api.cs | 6 +++--- .../ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs | 2 +- 9 files changed, 16 insertions(+), 16 deletions(-) diff --git a/OpenSim/Framework/EstateSettings.cs b/OpenSim/Framework/EstateSettings.cs index 98604f27ba..a92abbf026 100644 --- a/OpenSim/Framework/EstateSettings.cs +++ b/OpenSim/Framework/EstateSettings.cs @@ -322,7 +322,7 @@ namespace OpenSim.Framework l_EstateManagers.Remove(avatarID); } - public bool IsEstateManager(UUID avatarID) + public bool IsEstateManagerOrOwner(UUID avatarID) { if (IsEstateOwner(avatarID)) return true; @@ -368,7 +368,7 @@ namespace OpenSim.Framework public bool HasAccess(UUID user) { - if (IsEstateManager(user)) + if (IsEstateManagerOrOwner(user)) return true; return l_EstateAccess.Contains(user); diff --git a/OpenSim/Framework/Tests/MundaneFrameworkTests.cs b/OpenSim/Framework/Tests/MundaneFrameworkTests.cs index 76de6be267..672847dfed 100644 --- a/OpenSim/Framework/Tests/MundaneFrameworkTests.cs +++ b/OpenSim/Framework/Tests/MundaneFrameworkTests.cs @@ -227,10 +227,10 @@ namespace OpenSim.Framework.Tests es.AddEstateManager(UUID.Zero); es.AddEstateManager(bannedUserId); - Assert.IsTrue(es.IsEstateManager(bannedUserId), "bannedUserId should be EstateManager but isn't."); + Assert.IsTrue(es.IsEstateManagerOrOwner(bannedUserId), "bannedUserId should be EstateManager but isn't."); es.RemoveEstateManager(bannedUserId); - Assert.IsFalse(es.IsEstateManager(bannedUserId), "bannedUserID is estateManager but shouldn't be"); + Assert.IsFalse(es.IsEstateManagerOrOwner(bannedUserId), "bannedUserID is estateManager but shouldn't be"); Assert.IsFalse(es.HasAccess(bannedUserId), "bannedUserID has access but shouldn't"); diff --git a/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs b/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs index 124f01c9e5..58bbd2405a 100644 --- a/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs +++ b/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs @@ -967,7 +967,7 @@ namespace OpenSim.Region.CoreModules.World.Estate { RegionHandshakeArgs args = new RegionHandshakeArgs(); - args.isEstateManager = Scene.RegionInfo.EstateSettings.IsEstateManager(remoteClient.AgentId); + args.isEstateManager = Scene.RegionInfo.EstateSettings.IsEstateManagerOrOwner(remoteClient.AgentId); if (Scene.RegionInfo.EstateSettings.EstateOwner != UUID.Zero && Scene.RegionInfo.EstateSettings.EstateOwner == remoteClient.AgentId) args.isEstateManager = true; diff --git a/OpenSim/Region/CoreModules/World/Land/LandObject.cs b/OpenSim/Region/CoreModules/World/Land/LandObject.cs index 7f44613d5e..0536f6ec6e 100644 --- a/OpenSim/Region/CoreModules/World/Land/LandObject.cs +++ b/OpenSim/Region/CoreModules/World/Land/LandObject.cs @@ -469,7 +469,7 @@ namespace OpenSim.Region.CoreModules.World.Land if (m_scene.Permissions.IsAdministrator(avatar)) return false; - if (m_scene.RegionInfo.EstateSettings.IsEstateManager(avatar)) + if (m_scene.RegionInfo.EstateSettings.IsEstateManagerOrOwner(avatar)) return false; if (avatar == LandData.OwnerID) @@ -499,7 +499,7 @@ namespace OpenSim.Region.CoreModules.World.Land if (m_scene.Permissions.IsAdministrator(avatar)) return false; - if (m_scene.RegionInfo.EstateSettings.IsEstateManager(avatar)) + if (m_scene.RegionInfo.EstateSettings.IsEstateManagerOrOwner(avatar)) return false; if (avatar == LandData.OwnerID) diff --git a/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs b/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs index 64759a7e12..2032905c5f 100644 --- a/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs +++ b/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs @@ -503,7 +503,7 @@ namespace OpenSim.Region.CoreModules.World.Permissions { if (user == UUID.Zero) return false; - return m_scene.RegionInfo.EstateSettings.IsEstateManager(user); + return m_scene.RegionInfo.EstateSettings.IsEstateManagerOrOwner(user); } #endregion diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index 641d742f95..b5f789b52a 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs @@ -3832,7 +3832,7 @@ namespace OpenSim.Region.Framework.Scenes land.LandData.UserLocation != Vector3.Zero && land.LandData.OwnerID != m_uuid && (!m_scene.Permissions.IsGod(m_uuid)) && - (!m_scene.RegionInfo.EstateSettings.IsEstateManager(m_uuid))) + (!m_scene.RegionInfo.EstateSettings.IsEstateManagerOrOwner(m_uuid))) { float curr = Vector3.Distance(AbsolutePosition, pos); if (Vector3.Distance(land.LandData.UserLocation, pos) < curr) @@ -3852,7 +3852,7 @@ namespace OpenSim.Region.Framework.Scenes { if (GodLevel < 200 && ((!m_scene.Permissions.IsGod(m_uuid) && - !m_scene.RegionInfo.EstateSettings.IsEstateManager(m_uuid)) || + !m_scene.RegionInfo.EstateSettings.IsEstateManagerOrOwner(m_uuid)) || (m_teleportFlags & TeleportFlags.ViaLocation) != 0 || (m_teleportFlags & Constants.TeleportFlags.ViaHGLogin) != 0)) { @@ -3920,7 +3920,7 @@ namespace OpenSim.Region.Framework.Scenes GodLevel < 200 && ((land.LandData.OwnerID != m_uuid && !m_scene.Permissions.IsGod(m_uuid) && - !m_scene.RegionInfo.EstateSettings.IsEstateManager(m_uuid)) || + !m_scene.RegionInfo.EstateSettings.IsEstateManagerOrOwner(m_uuid)) || (m_teleportFlags & TeleportFlags.ViaLocation) != 0 || (m_teleportFlags & Constants.TeleportFlags.ViaHGLogin) != 0)) { diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index 55817273b5..36c9d5e74e 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -10887,7 +10887,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api bool isAccount = false; bool isGroup = false; - if (!estate.IsEstateOwner(m_host.OwnerID) || !estate.IsEstateManager(m_host.OwnerID)) + if (!estate.IsEstateOwner(m_host.OwnerID) || !estate.IsEstateManagerOrOwner(m_host.OwnerID)) return 0; UUID id = new UUID(); diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LS_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LS_Api.cs index 77a784d077..df20126ff2 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LS_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LS_Api.cs @@ -449,7 +449,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api LSShoutError("LightShare functions are not enabled."); return 0; } - if (!World.RegionInfo.EstateSettings.IsEstateManager(m_host.OwnerID) && World.GetScenePresence(m_host.OwnerID).GodLevel < 200) + if (!World.RegionInfo.EstateSettings.IsEstateManagerOrOwner(m_host.OwnerID) && World.GetScenePresence(m_host.OwnerID).GodLevel < 200) { LSShoutError("lsSetWindlightScene can only be used by estate managers or owners."); return 0; @@ -477,7 +477,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api LSShoutError("LightShare functions are not enabled."); return; } - if (!World.RegionInfo.EstateSettings.IsEstateManager(m_host.OwnerID) && World.GetScenePresence(m_host.OwnerID).GodLevel < 200) + if (!World.RegionInfo.EstateSettings.IsEstateManagerOrOwner(m_host.OwnerID) && World.GetScenePresence(m_host.OwnerID).GodLevel < 200) { LSShoutError("lsSetWindlightScene can only be used by estate managers or owners."); return; @@ -500,7 +500,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api LSShoutError("LightShare functions are not enabled."); return 0; } - if (!World.RegionInfo.EstateSettings.IsEstateManager(m_host.OwnerID) && World.GetScenePresence(m_host.OwnerID).GodLevel < 200) + if (!World.RegionInfo.EstateSettings.IsEstateManagerOrOwner(m_host.OwnerID) && World.GetScenePresence(m_host.OwnerID).GodLevel < 200) { LSShoutError("lsSetWindlightSceneTargeted can only be used by estate managers or owners."); return 0; diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs index 2680ad0667..fe94b79b74 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs @@ -369,7 +369,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api if (m_FunctionPerms[function].AllowedOwnerClasses.Contains("ESTATE_MANAGER")) { //Only Estate Managers may use the function - if (World.RegionInfo.EstateSettings.IsEstateManager(ownerID) && World.RegionInfo.EstateSettings.EstateOwner != ownerID) + if (World.RegionInfo.EstateSettings.IsEstateManagerOrOwner(ownerID) && World.RegionInfo.EstateSettings.EstateOwner != ownerID) { return; } From 7e1ab216e3c8b7ade3f007d352451c9d9d742b5c Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Tue, 17 Apr 2012 01:33:55 +0100 Subject: [PATCH 034/547] Move some public methods on WebStatsModule to private to reduce some static analysis complexity. There's no obvious reason for these methods to be public. --- .../Region/UserStatistics/WebStatsModule.cs | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/OpenSim/Region/UserStatistics/WebStatsModule.cs b/OpenSim/Region/UserStatistics/WebStatsModule.cs index a00955a05f..4248035904 100644 --- a/OpenSim/Region/UserStatistics/WebStatsModule.cs +++ b/OpenSim/Region/UserStatistics/WebStatsModule.cs @@ -131,7 +131,7 @@ namespace OpenSim.Region.UserStatistics } } - public void ReceiveClassicSimStatsPacket(SimStats stats) + private void ReceiveClassicSimStatsPacket(SimStats stats) { if (!enabled) { @@ -163,7 +163,7 @@ namespace OpenSim.Region.UserStatistics } } - public Hashtable HandleUnknownCAPSRequest(Hashtable request) + private Hashtable HandleUnknownCAPSRequest(Hashtable request) { //string regpath = request["uri"].ToString(); int response_code = 200; @@ -178,7 +178,7 @@ namespace OpenSim.Region.UserStatistics return responsedata; } - public Hashtable HandleStatsRequest(Hashtable request) + private Hashtable HandleStatsRequest(Hashtable request) { lastHit = System.Environment.TickCount; Hashtable responsedata = new Hashtable(); @@ -238,7 +238,7 @@ namespace OpenSim.Region.UserStatistics return responsedata; } - public void CreateTables(SqliteConnection db) + private void CreateTables(SqliteConnection db) { using (SqliteCommand createcmd = new SqliteCommand(SQL_STATS_TABLE_CREATE, db)) { @@ -277,7 +277,7 @@ namespace OpenSim.Region.UserStatistics get { return true; } } - public void OnRegisterCaps(UUID agentID, Caps caps) + private void OnRegisterCaps(UUID agentID, Caps caps) { // m_log.DebugFormat("[WEB STATS MODULE]: OnRegisterCaps: agentID {0} caps {1}", agentID, caps); @@ -292,7 +292,7 @@ namespace OpenSim.Region.UserStatistics })); } - public void OnDeRegisterCaps(UUID agentID, Caps caps) + private void OnDeRegisterCaps(UUID agentID, Caps caps) { } @@ -312,7 +312,7 @@ namespace OpenSim.Region.UserStatistics } } - public void OnMakeRootAgent(ScenePresence agent) + private void OnMakeRootAgent(ScenePresence agent) { UUID regionUUID = GetRegionUUIDFromHandle(agent.RegionHandle); @@ -341,11 +341,11 @@ namespace OpenSim.Region.UserStatistics } } - public void OnMakeChildAgent(ScenePresence agent) + private void OnMakeChildAgent(ScenePresence agent) { } - public void OnClientClosed(UUID agentID, Scene scene) + private void OnClientClosed(UUID agentID, Scene scene) { lock (m_sessions) { @@ -356,7 +356,7 @@ namespace OpenSim.Region.UserStatistics } } - public string readLogLines(int amount) + private string readLogLines(int amount) { Encoding encoding = Encoding.ASCII; int sizeOfChar = encoding.GetByteCount("\n"); @@ -394,7 +394,7 @@ namespace OpenSim.Region.UserStatistics return encoding.GetString(buffer); } - public UUID GetRegionUUIDFromHandle(ulong regionhandle) + private UUID GetRegionUUIDFromHandle(ulong regionhandle) { lock (m_scenes) { @@ -417,7 +417,7 @@ namespace OpenSim.Region.UserStatistics /// /// /// - public string ViewerStatsReport(string request, string path, string param, + private string ViewerStatsReport(string request, string path, string param, UUID agentID, Caps caps) { // m_log.DebugFormat("[WEB STATS MODULE]: Received viewer starts report from {0}", agentID); @@ -427,7 +427,7 @@ namespace OpenSim.Region.UserStatistics return String.Empty; } - public UserSessionID ParseViewerStats(string request, UUID agentID) + private UserSessionID ParseViewerStats(string request, UUID agentID) { UserSessionID uid = new UserSessionID(); UserSessionData usd; @@ -568,7 +568,7 @@ namespace OpenSim.Region.UserStatistics return uid; } - public void UpdateUserStats(UserSessionID uid, SqliteConnection db) + private void UpdateUserStats(UserSessionID uid, SqliteConnection db) { if (uid.session_id == UUID.Zero) return; From 2f2181683c9b3963da5e1cfd7fa1c6491d8a2ac0 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Tue, 17 Apr 2012 01:51:13 +0100 Subject: [PATCH 035/547] Add test TestGetChildPartPosition() --- .../Scenes/Tests/SceneObjectSpatialTests.cs | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectSpatialTests.cs b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectSpatialTests.cs index 7a3b3627e0..fffa3bd152 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectSpatialTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectSpatialTests.cs @@ -86,5 +86,33 @@ namespace OpenSim.Region.Framework.Scenes.Tests Assert.That(so.RootPart.RelativePosition, Is.EqualTo(partPosition)); Assert.That(so.RootPart.OffsetPosition, Is.EqualTo(Vector3.Zero)); } + + [Test] + public void TestGetChildPartPosition() + { + TestHelpers.InMethod(); + + Vector3 rootPartPosition = new Vector3(10, 20, 30); + Vector3 childOffsetPosition = new Vector3(2, 3, 4); + + SceneObjectGroup so + = SceneHelpers.CreateSceneObject(2, m_ownerId, "obj1", 0x10); + so.AbsolutePosition = rootPartPosition; + so.Parts[1].OffsetPosition = childOffsetPosition; + + m_scene.AddNewSceneObject(so, false); + + // Calculate child absolute position. + Vector3 childPosition = new Vector3(rootPartPosition + childOffsetPosition); + + SceneObjectPart childPart = so.Parts[1]; + Assert.That(childPart.AbsolutePosition, Is.EqualTo(childPosition)); + Assert.That(childPart.GroupPosition, Is.EqualTo(rootPartPosition)); + Assert.That(childPart.GetWorldPosition(), Is.EqualTo(childPosition)); + Assert.That(childPart.RelativePosition, Is.EqualTo(childOffsetPosition)); + Assert.That(childPart.OffsetPosition, Is.EqualTo(childOffsetPosition)); + + // TODO: Write test for child part position after rotation. + } } } \ No newline at end of file From cca6b6bd0d679e817cbcb8b51de82577a15e2ff0 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Tue, 17 Apr 2012 02:14:10 +0100 Subject: [PATCH 036/547] Add TestGetChildPartPositionAfterObjectRotation() --- .../Scenes/Tests/SceneObjectSpatialTests.cs | 38 ++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectSpatialTests.cs b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectSpatialTests.cs index fffa3bd152..9fea3c63a7 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectSpatialTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectSpatialTests.cs @@ -111,8 +111,44 @@ namespace OpenSim.Region.Framework.Scenes.Tests Assert.That(childPart.GetWorldPosition(), Is.EqualTo(childPosition)); Assert.That(childPart.RelativePosition, Is.EqualTo(childOffsetPosition)); Assert.That(childPart.OffsetPosition, Is.EqualTo(childOffsetPosition)); + } - // TODO: Write test for child part position after rotation. + [Test] + public void TestGetChildPartPositionAfterObjectRotation() + { + TestHelpers.InMethod(); + + Vector3 rootPartPosition = new Vector3(10, 20, 30); + Vector3 childOffsetPosition = new Vector3(2, 3, 4); + + SceneObjectGroup so + = SceneHelpers.CreateSceneObject(2, m_ownerId, "obj1", 0x10); + so.AbsolutePosition = rootPartPosition; + so.Parts[1].OffsetPosition = childOffsetPosition; + + m_scene.AddNewSceneObject(so, false); + + so.UpdateGroupRotationR(Quaternion.CreateFromEulers(0, 0, -90 * Utils.DEG_TO_RAD)); + + // Calculate child absolute position. + Vector3 rotatedChildOffsetPosition + = new Vector3(childOffsetPosition.Y, -childOffsetPosition.X, childOffsetPosition.Z); + + Vector3 childPosition = new Vector3(rootPartPosition + rotatedChildOffsetPosition); + + SceneObjectPart childPart = so.Parts[1]; + + // FIXME: Should be childPosition after rotation? + Assert.That(childPart.AbsolutePosition, Is.EqualTo(rootPartPosition + childOffsetPosition)); + + Assert.That(childPart.GroupPosition, Is.EqualTo(rootPartPosition)); + Assert.That(childPart.GetWorldPosition(), Is.EqualTo(childPosition)); + + // Relative to root part as (0, 0, 0) + Assert.That(childPart.RelativePosition, Is.EqualTo(childOffsetPosition)); + + // Relative to root part as (0, 0, 0) + Assert.That(childPart.OffsetPosition, Is.EqualTo(childOffsetPosition)); } } } \ No newline at end of file From 4bb72c9ffef9a54a46b7059ba4785c939c791ac4 Mon Sep 17 00:00:00 2001 From: Mic Bowman Date: Tue, 17 Apr 2012 13:45:03 -0700 Subject: [PATCH 037/547] make the namespace for the ScriptModuleComms consistent with its file system location --- .../Scripting/ScriptModuleComms/ScriptModuleCommsModule.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Region/OptionalModules/Scripting/ScriptModuleComms/ScriptModuleCommsModule.cs b/OpenSim/Region/OptionalModules/Scripting/ScriptModuleComms/ScriptModuleCommsModule.cs index cab30dec25..74a85e2cd5 100644 --- a/OpenSim/Region/OptionalModules/Scripting/ScriptModuleComms/ScriptModuleCommsModule.cs +++ b/OpenSim/Region/OptionalModules/Scripting/ScriptModuleComms/ScriptModuleCommsModule.cs @@ -38,7 +38,7 @@ using OpenMetaverse; using System.Linq; using System.Linq.Expressions; -namespace OpenSim.Region.CoreModules.Scripting.ScriptModuleComms +namespace OpenSim.Region.OptionalModules.Scripting.ScriptModuleComms { [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "ScriptModuleCommsModule")] class ScriptModuleCommsModule : INonSharedRegionModule, IScriptModuleComms From 5ff2bda587a50b73f470ba778348645953b6b4b0 Mon Sep 17 00:00:00 2001 From: Mic Bowman Date: Tue, 17 Apr 2012 13:45:27 -0700 Subject: [PATCH 038/547] This commit adds a new optional region module, JsonStore, that provides structured storage (dictionaries and arrays of string values) for scripts and region modules. In addition, there are operations on the storage that enable "real" distributed computation between scripts through operations similar to those of a tuple space. Scripts can share task queues, implement shared locks or semaphores, etc. The structured store is limited to the current region and is not currently persisted. However, script operations are defined to initialize a store from a notecard and to serialize the store to a notecard. Documentation will be posted to the opensim wiki soon. --- .../Framework/Interfaces/IJsonStoreModule.cs | 48 ++ .../Scripting/JsonStore/JsonStore.cs | 498 ++++++++++++++++++ .../Scripting/JsonStore/JsonStoreModule.cs | 429 +++++++++++++++ .../JsonStore/JsonStoreScriptModule.cs | 489 +++++++++++++++++ 4 files changed, 1464 insertions(+) create mode 100644 OpenSim/Region/Framework/Interfaces/IJsonStoreModule.cs create mode 100644 OpenSim/Region/OptionalModules/Scripting/JsonStore/JsonStore.cs create mode 100644 OpenSim/Region/OptionalModules/Scripting/JsonStore/JsonStoreModule.cs create mode 100644 OpenSim/Region/OptionalModules/Scripting/JsonStore/JsonStoreScriptModule.cs diff --git a/OpenSim/Region/Framework/Interfaces/IJsonStoreModule.cs b/OpenSim/Region/Framework/Interfaces/IJsonStoreModule.cs new file mode 100644 index 0000000000..baac6e827f --- /dev/null +++ b/OpenSim/Region/Framework/Interfaces/IJsonStoreModule.cs @@ -0,0 +1,48 @@ +/* + * Copyright (c) Contributors + * See CONTRIBUTORS.TXT for a full list of copyright holders. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the OpenSim Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using System; +using System.Reflection; +using OpenMetaverse; + +namespace OpenSim.Region.Framework.Interfaces +{ + public delegate void TakeValueCallback(string s); + + public interface IJsonStoreModule + { + bool CreateStore(string value, out UUID result); + bool DestroyStore(UUID storeID); + bool TestPath(UUID storeID, string path, bool useJson); + bool SetValue(UUID storeID, string path, string value, bool useJson); + bool RemoveValue(UUID storeID, string path); + bool GetValue(UUID storeID, string path, bool useJson, out string value); + + void TakeValue(UUID storeID, string path, bool useJson, TakeValueCallback cback); + void ReadValue(UUID storeID, string path, bool useJson, TakeValueCallback cback); + } +} diff --git a/OpenSim/Region/OptionalModules/Scripting/JsonStore/JsonStore.cs b/OpenSim/Region/OptionalModules/Scripting/JsonStore/JsonStore.cs new file mode 100644 index 0000000000..49556b601d --- /dev/null +++ b/OpenSim/Region/OptionalModules/Scripting/JsonStore/JsonStore.cs @@ -0,0 +1,498 @@ +/* + * Copyright (c) Contributors + * See CONTRIBUTORS.TXT for a full list of copyright holders. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the OpenSim Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +using Mono.Addins; + +using System; +using System.Reflection; +using System.Threading; +using System.Text; +using System.Net; +using System.Net.Sockets; +using log4net; +using Nini.Config; +using OpenMetaverse; +using OpenMetaverse.StructuredData; +using OpenSim.Framework; +using OpenSim.Region.Framework.Interfaces; +using OpenSim.Region.Framework.Scenes; +using System.Collections.Generic; +using System.Text.RegularExpressions; + +namespace OpenSim.Region.OptionalModules.Scripting.JsonStore +{ + public class JsonStore + { + private static readonly ILog m_log = + LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + + private OSD m_ValueStore; + + protected class TakeValueCallbackClass + { + public string Path { get; set; } + public bool UseJson { get; set; } + public TakeValueCallback Callback { get; set; } + + public TakeValueCallbackClass(string spath, bool usejson, TakeValueCallback cback) + { + Path = spath; + UseJson = usejson; + Callback = cback; + } + } + + protected List m_TakeStore; + protected List m_ReadStore; + + + // ----------------------------------------------------------------- + /// + /// + /// + // ----------------------------------------------------------------- + public JsonStore(string value = "") + { + m_TakeStore = new List(); + m_ReadStore = new List(); + + if (String.IsNullOrEmpty(value)) + m_ValueStore = new OSDMap(); + else + m_ValueStore = OSDParser.DeserializeJson(value); + } + + // ----------------------------------------------------------------- + /// + /// + /// + // ----------------------------------------------------------------- + public bool TestPath(string expr, bool useJson) + { + Stack path = ParsePathExpression(expr); + OSD result = ProcessPathExpression(m_ValueStore,path); + + if (result == null) + return false; + + if (useJson || result.Type == OSDType.String) + return true; + + return false; + } + + // ----------------------------------------------------------------- + /// + /// + /// + // ----------------------------------------------------------------- + public bool GetValue(string expr, out string value, bool useJson) + { + Stack path = ParsePathExpression(expr); + OSD result = ProcessPathExpression(m_ValueStore,path); + return ConvertOutputValue(result,out value,useJson); + } + + + // ----------------------------------------------------------------- + /// + /// + /// + // ----------------------------------------------------------------- + public bool RemoveValue(string expr) + { + return SetValueFromExpression(expr,null); + } + + // ----------------------------------------------------------------- + /// + /// + /// + // ----------------------------------------------------------------- + public bool SetValue(string expr, string value, bool useJson) + { + OSD ovalue = useJson ? OSDParser.DeserializeJson(value) : new OSDString(value); + return SetValueFromExpression(expr,ovalue); + } + + // ----------------------------------------------------------------- + /// + /// + /// + // ----------------------------------------------------------------- + public bool TakeValue(string expr, bool useJson, TakeValueCallback cback) + { + Stack path = ParsePathExpression(expr); + string pexpr = PathExpressionToKey(path); + + OSD result = ProcessPathExpression(m_ValueStore,path); + if (result == null) + { + m_TakeStore.Add(new TakeValueCallbackClass(pexpr,useJson,cback)); + return false; + } + + string value = String.Empty; + if (! ConvertOutputValue(result,out value,useJson)) + { + // the structure does not match the request so i guess we'll wait + m_TakeStore.Add(new TakeValueCallbackClass(pexpr,useJson,cback)); + return false; + } + + SetValueFromExpression(expr,null); + cback(value); + + return true; + } + + // ----------------------------------------------------------------- + /// + /// + /// + // ----------------------------------------------------------------- + public bool ReadValue(string expr, bool useJson, TakeValueCallback cback) + { + Stack path = ParsePathExpression(expr); + string pexpr = PathExpressionToKey(path); + + OSD result = ProcessPathExpression(m_ValueStore,path); + if (result == null) + { + m_ReadStore.Add(new TakeValueCallbackClass(pexpr,useJson,cback)); + return false; + } + + string value = String.Empty; + if (! ConvertOutputValue(result,out value,useJson)) + { + // the structure does not match the request so i guess we'll wait + m_ReadStore.Add(new TakeValueCallbackClass(pexpr,useJson,cback)); + return false; + } + + cback(value); + + return true; + } + + // ----------------------------------------------------------------- + /// + /// + /// + // ----------------------------------------------------------------- + protected bool SetValueFromExpression(string expr, OSD ovalue) + { + Stack path = ParsePathExpression(expr); + if (path.Count == 0) + { + m_ValueStore = ovalue; + return true; + } + + string pkey = path.Pop(); + string pexpr = PathExpressionToKey(path); + if (pexpr != "") + pexpr += "."; + + OSD result = ProcessPathExpression(m_ValueStore,path); + if (result == null) + return false; + + Regex aPattern = new Regex("\\[([0-9]+|\\+)\\]"); + MatchCollection amatches = aPattern.Matches(pkey,0); + + if (amatches.Count > 0) + { + if (result.Type != OSDType.Array) + return false; + + OSDArray amap = result as OSDArray; + + Match match = amatches[0]; + GroupCollection groups = match.Groups; + string akey = groups[1].Value; + + if (akey == "+") + { + string npkey = String.Format("[{0}]",amap.Count); + + amap.Add(ovalue); + InvokeNextCallback(pexpr + npkey); + return true; + } + + int aval = Convert.ToInt32(akey); + if (0 <= aval && aval < amap.Count) + { + if (ovalue == null) + amap.RemoveAt(aval); + else + { + amap[aval] = ovalue; + InvokeNextCallback(pexpr + pkey); + } + return true; + } + + return false; + } + + Regex hPattern = new Regex("{([^}]+)}"); + MatchCollection hmatches = hPattern.Matches(pkey,0); + + if (hmatches.Count > 0) + { + Match match = hmatches[0]; + GroupCollection groups = match.Groups; + string hkey = groups[1].Value; + + if (result is OSDMap) + { + OSDMap hmap = result as OSDMap; + if (ovalue != null) + { + hmap[hkey] = ovalue; + InvokeNextCallback(pexpr + pkey); + } + else if (hmap.ContainsKey(hkey)) + hmap.Remove(hkey); + + return true; + } + + return false; + } + + // Shouldn't get here if the path was checked correctly + m_log.WarnFormat("[JsonStore] invalid path expression"); + return false; + } + + // ----------------------------------------------------------------- + /// + /// + /// + // ----------------------------------------------------------------- + protected bool InvokeNextCallback(string pexpr) + { + // Process all of the reads that match the expression first + List reads = + m_ReadStore.FindAll(delegate(TakeValueCallbackClass tb) { return pexpr.StartsWith(tb.Path); }); + + foreach (TakeValueCallbackClass readcb in reads) + { + m_ReadStore.Remove(readcb); + ReadValue(readcb.Path,readcb.UseJson,readcb.Callback); + } + + // Process one take next + TakeValueCallbackClass takecb = + m_TakeStore.Find(delegate(TakeValueCallbackClass tb) { return pexpr.StartsWith(tb.Path); }); + + if (takecb != null) + { + m_TakeStore.Remove(takecb); + TakeValue(takecb.Path,takecb.UseJson,takecb.Callback); + + return true; + } + + return false; + } + + // ----------------------------------------------------------------- + /// + /// Parse the path expression and put the components into a stack. We + /// use a stack because we process the path in inverse order later + /// + // ----------------------------------------------------------------- + protected static Stack ParsePathExpression(string path) + { + Stack m_path = new Stack(); + + // add front and rear separators + path = "." + path + "."; + + // add separators for quoted paths + Regex pass1 = new Regex("{[^}]+}"); + path = pass1.Replace(path,".$0.",-1,0); + + // add separators for array references + Regex pass2 = new Regex("(\\[[0-9]+\\]|\\[\\+\\])"); + path = pass2.Replace(path,".$0.",-1,0); + + // add quotes to bare identifier + Regex pass3 = new Regex("\\.([a-zA-Z]+)"); + path = pass3.Replace(path,".{$1}",-1,0); + + // remove extra separators + Regex pass4 = new Regex("\\.+"); + path = pass4.Replace(path,".",-1,0); + + Regex validate = new Regex("^\\.(({[^}]+}|\\[[0-9]+\\]|\\[\\+\\])\\.)+$"); + if (validate.IsMatch(path)) + { + Regex parser = new Regex("\\.({[^}]+}|\\[[0-9]+\\]|\\[\\+\\]+)"); + MatchCollection matches = parser.Matches(path,0); + foreach (Match match in matches) + m_path.Push(match.Groups[1].Value); + } + + return m_path; + } + + // ----------------------------------------------------------------- + /// + /// + /// + /// path is a stack where the top level of the path is at the bottom of the stack + // ----------------------------------------------------------------- + protected static OSD ProcessPathExpression(OSD map, Stack path) + { + if (path.Count == 0) + return map; + + string pkey = path.Pop(); + + OSD rmap = ProcessPathExpression(map,path); + if (rmap == null) + return null; + + // ---------- Check for an array index ---------- + Regex aPattern = new Regex("\\[([0-9]+)\\]"); + MatchCollection amatches = aPattern.Matches(pkey,0); + + if (amatches.Count > 0) + { + if (rmap.Type != OSDType.Array) + { + m_log.WarnFormat("[JsonStore] wrong type for key {2}, expecting {0}, got {1}",OSDType.Array,rmap.Type,pkey); + return null; + } + + OSDArray amap = rmap as OSDArray; + + Match match = amatches[0]; + GroupCollection groups = match.Groups; + string akey = groups[1].Value; + int aval = Convert.ToInt32(akey); + + if (aval < amap.Count) + return (OSD) amap[aval]; + + return null; + } + + // ---------- Check for a hash index ---------- + Regex hPattern = new Regex("{([^}]+)}"); + MatchCollection hmatches = hPattern.Matches(pkey,0); + + if (hmatches.Count > 0) + { + if (rmap.Type != OSDType.Map) + { + m_log.WarnFormat("[JsonStore] wrong type for key {2}, expecting {0}, got {1}",OSDType.Map,rmap.Type,pkey); + return null; + } + + OSDMap hmap = rmap as OSDMap; + + Match match = hmatches[0]; + GroupCollection groups = match.Groups; + string hkey = groups[1].Value; + + if (hmap.ContainsKey(hkey)) + return (OSD) hmap[hkey]; + + return null; + } + + // Shouldn't get here if the path was checked correctly + m_log.WarnFormat("[JsonStore] Path type (unknown) does not match the structure"); + return null; + } + + // ----------------------------------------------------------------- + /// + /// + /// + // ----------------------------------------------------------------- + protected static bool ConvertOutputValue(OSD result, out string value, bool useJson) + { + value = String.Empty; + + // If we couldn't process the path + if (result == null) + return false; + + if (useJson) + { + // The path pointed to an intermediate hash structure + if (result.Type == OSDType.Map) + { + value = OSDParser.SerializeJsonString(result as OSDMap); + return true; + } + + // The path pointed to an intermediate hash structure + if (result.Type == OSDType.Array) + { + value = OSDParser.SerializeJsonString(result as OSDArray); + return true; + } + + value = "'" + result.AsString() + "'"; + return true; + } + + if (result.Type == OSDType.String) + { + value = result.AsString(); + return true; + } + + return false; + } + + // ----------------------------------------------------------------- + /// + /// + /// + // ----------------------------------------------------------------- + protected static string PathExpressionToKey(Stack path) + { + if (path.Count == 0) + return ""; + + string pkey = ""; + foreach (string k in path) + pkey = (pkey == "") ? k : (k + "." + pkey); + + return pkey; + } + } +} diff --git a/OpenSim/Region/OptionalModules/Scripting/JsonStore/JsonStoreModule.cs b/OpenSim/Region/OptionalModules/Scripting/JsonStore/JsonStoreModule.cs new file mode 100644 index 0000000000..6dae9566d0 --- /dev/null +++ b/OpenSim/Region/OptionalModules/Scripting/JsonStore/JsonStoreModule.cs @@ -0,0 +1,429 @@ +/* + * Copyright (c) Contributors + * See CONTRIBUTORS.TXT for a full list of copyright holders. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the OpenSim Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +using Mono.Addins; + +using System; +using System.Reflection; +using System.Threading; +using System.Text; +using System.Net; +using System.Net.Sockets; +using log4net; +using Nini.Config; +using OpenMetaverse; +using OpenMetaverse.StructuredData; +using OpenSim.Framework; +using OpenSim.Region.Framework.Interfaces; +using OpenSim.Region.Framework.Scenes; +using System.Collections.Generic; +using System.Text.RegularExpressions; + + +namespace OpenSim.Region.OptionalModules.Scripting.JsonStore +{ + [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "JsonStoreModule")] + + public class JsonStoreModule : INonSharedRegionModule, IJsonStoreModule + { + private static readonly ILog m_log = + LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + + private IConfig m_config = null; + private bool m_enabled = false; + private Scene m_scene = null; + + private Dictionary m_JsonValueStore; + private UUID m_sharedStore; + +#region IRegionModule Members + + // ----------------------------------------------------------------- + /// + /// Name of this shared module is it's class name + /// + // ----------------------------------------------------------------- + public string Name + { + get { return this.GetType().Name; } + } + + // ----------------------------------------------------------------- + /// + /// Initialise this shared module + /// + /// this region is getting initialised + /// nini config, we are not using this + // ----------------------------------------------------------------- + public void Initialise(IConfigSource config) + { + try + { + if ((m_config = config.Configs["JsonStore"]) == null) + { + // There is no configuration, the module is disabled + m_log.InfoFormat("[JsonStore] no configuration info"); + return; + } + + m_enabled = m_config.GetBoolean("Enabled", m_enabled); + } + catch (Exception e) + { + m_log.ErrorFormat("[JsonStore] initialization error: {0}",e.Message); + return; + } + + m_log.InfoFormat("[JsonStore] module {0} enabled",(m_enabled ? "is" : "is not")); + } + + // ----------------------------------------------------------------- + /// + /// everything is loaded, perform post load configuration + /// + // ----------------------------------------------------------------- + public void PostInitialise() + { + } + + // ----------------------------------------------------------------- + /// + /// Nothing to do on close + /// + // ----------------------------------------------------------------- + public void Close() + { + } + + // ----------------------------------------------------------------- + /// + /// + // ----------------------------------------------------------------- + public void AddRegion(Scene scene) + { + if (m_enabled) + { + m_scene = scene; + m_scene.RegisterModuleInterface(this); + + m_sharedStore = UUID.Zero; + m_JsonValueStore = new Dictionary(); + m_JsonValueStore.Add(m_sharedStore,new JsonStore("")); + } + } + + // ----------------------------------------------------------------- + /// + /// + // ----------------------------------------------------------------- + public void RemoveRegion(Scene scene) + { + // need to remove all references to the scene in the subscription + // list to enable full garbage collection of the scene object + } + + // ----------------------------------------------------------------- + /// + /// Called when all modules have been added for a region. This is + /// where we hook up events + /// + // ----------------------------------------------------------------- + public void RegionLoaded(Scene scene) + { + if (m_enabled) {} + } + + /// ----------------------------------------------------------------- + /// + /// + // ----------------------------------------------------------------- + public Type ReplaceableInterface + { + get { return null; } + } + +#endregion + +#region ScriptInvocationInteface + + // ----------------------------------------------------------------- + /// + /// + /// + // ----------------------------------------------------------------- + public bool CreateStore(string value, out UUID result) + { + result = UUID.Zero; + + if (! m_enabled) return false; + + UUID uuid = UUID.Random(); + JsonStore map = null; + + try + { + map = new JsonStore(value); + } + catch (Exception e) + { + m_log.InfoFormat("[JsonStore] Unable to initialize store from {0}; {1}",value,e.Message); + return false; + } + + lock (m_JsonValueStore) + m_JsonValueStore.Add(uuid,map); + + result = uuid; + return true; + } + + // ----------------------------------------------------------------- + /// + /// + /// + // ----------------------------------------------------------------- + public bool DestroyStore(UUID storeID) + { + if (! m_enabled) return false; + + lock (m_JsonValueStore) + m_JsonValueStore.Remove(storeID); + + return true; + } + + // ----------------------------------------------------------------- + /// + /// + /// + // ----------------------------------------------------------------- + public bool TestPath(UUID storeID, string path, bool useJson) + { + if (! m_enabled) return false; + + JsonStore map = null; + lock (m_JsonValueStore) + { + if (! m_JsonValueStore.TryGetValue(storeID,out map)) + { + m_log.InfoFormat("[JsonStore] Missing store {0}",storeID); + return true; + } + } + + try + { + lock (map) + return map.TestPath(path,useJson); + } + catch (Exception e) + { + m_log.InfoFormat("[JsonStore] Path test failed for {0} in {1}; {2}",path,storeID,e.Message); + } + + return false; + } + + // ----------------------------------------------------------------- + /// + /// + /// + // ----------------------------------------------------------------- + public bool SetValue(UUID storeID, string path, string value, bool useJson) + { + if (! m_enabled) return false; + + JsonStore map = null; + lock (m_JsonValueStore) + { + if (! m_JsonValueStore.TryGetValue(storeID,out map)) + { + m_log.InfoFormat("[JsonStore] Missing store {0}",storeID); + return false; + } + } + + try + { + lock (map) + if (map.SetValue(path,value,useJson)) + return true; + } + catch (Exception e) + { + m_log.InfoFormat("[JsonStore] Unable to assign {0} to {1} in {2}; {3}",value,path,storeID,e.Message); + } + + return false; + } + + // ----------------------------------------------------------------- + /// + /// + /// + // ----------------------------------------------------------------- + public bool RemoveValue(UUID storeID, string path) + { + if (! m_enabled) return false; + + JsonStore map = null; + lock (m_JsonValueStore) + { + if (! m_JsonValueStore.TryGetValue(storeID,out map)) + { + m_log.InfoFormat("[JsonStore] Missing store {0}",storeID); + return false; + } + } + + try + { + lock (map) + if (map.RemoveValue(path)) + return true; + } + catch (Exception e) + { + m_log.InfoFormat("[JsonStore] Unable to remove {0} in {1}; {2}",path,storeID,e.Message); + } + + return false; + } + + // ----------------------------------------------------------------- + /// + /// + /// + // ----------------------------------------------------------------- + public bool GetValue(UUID storeID, string path, bool useJson, out string value) + { + value = String.Empty; + + if (! m_enabled) return false; + + JsonStore map = null; + lock (m_JsonValueStore) + { + if (! m_JsonValueStore.TryGetValue(storeID,out map)) + return false; + } + + try + { + lock (map) + { + return map.GetValue(path, out value, useJson); + } + } + catch (Exception e) + { + m_log.InfoFormat("[JsonStore] unable to retrieve value; {0}",e.Message); + } + + return false; + } + + // ----------------------------------------------------------------- + /// + /// + /// + // ----------------------------------------------------------------- + public void TakeValue(UUID storeID, string path, bool useJson, TakeValueCallback cback) + { + if (! m_enabled) + { + cback(String.Empty); + return; + } + + JsonStore map = null; + lock (m_JsonValueStore) + { + if (! m_JsonValueStore.TryGetValue(storeID,out map)) + { + cback(String.Empty); + return; + } + } + + try + { + lock (map) + { + map.TakeValue(path, useJson, cback); + return; + } + } + catch (Exception e) + { + m_log.InfoFormat("[JsonStore] unable to retrieve value; {0}",e.ToString()); + } + + cback(String.Empty); + } + + // ----------------------------------------------------------------- + /// + /// + /// + // ----------------------------------------------------------------- + public void ReadValue(UUID storeID, string path, bool useJson, TakeValueCallback cback) + { + if (! m_enabled) + { + cback(String.Empty); + return; + } + + JsonStore map = null; + lock (m_JsonValueStore) + { + if (! m_JsonValueStore.TryGetValue(storeID,out map)) + { + cback(String.Empty); + return; + } + } + + try + { + lock (map) + { + map.ReadValue(path, useJson, cback); + return; + } + } + catch (Exception e) + { + m_log.InfoFormat("[JsonStore] unable to retrieve value; {0}",e.ToString()); + } + + cback(String.Empty); + } + +#endregion + } +} diff --git a/OpenSim/Region/OptionalModules/Scripting/JsonStore/JsonStoreScriptModule.cs b/OpenSim/Region/OptionalModules/Scripting/JsonStore/JsonStoreScriptModule.cs new file mode 100644 index 0000000000..7aba860a89 --- /dev/null +++ b/OpenSim/Region/OptionalModules/Scripting/JsonStore/JsonStoreScriptModule.cs @@ -0,0 +1,489 @@ +/* + * Copyright (c) Contributors + * See CONTRIBUTORS.TXT for a full list of copyright holders. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the OpenSim Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +using Mono.Addins; + +using System; +using System.Reflection; +using System.Threading; +using System.Text; +using System.Net; +using System.Net.Sockets; +using log4net; +using Nini.Config; +using OpenMetaverse; +using OpenMetaverse.StructuredData; +using OpenSim.Framework; +using OpenSim.Region.Framework.Interfaces; +using OpenSim.Region.Framework.Scenes; +using System.Collections.Generic; +using System.Text.RegularExpressions; + +namespace OpenSim.Region.OptionalModules.Scripting.JsonStore +{ + [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "JsonStoreScriptModule")] + + public class JsonStoreScriptModule : INonSharedRegionModule + { + private static readonly ILog m_log = + LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + + private IConfig m_config = null; + private bool m_enabled = false; + private Scene m_scene = null; + + private IScriptModuleComms m_comms; + private IJsonStoreModule m_store; + +#region IRegionModule Members + + // ----------------------------------------------------------------- + /// + /// Name of this shared module is it's class name + /// + // ----------------------------------------------------------------- + public string Name + { + get { return this.GetType().Name; } + } + + // ----------------------------------------------------------------- + /// + /// Initialise this shared module + /// + /// this region is getting initialised + /// nini config, we are not using this + // ----------------------------------------------------------------- + public void Initialise(IConfigSource config) + { + try + { + if ((m_config = config.Configs["JsonStore"]) == null) + { + // There is no configuration, the module is disabled + m_log.InfoFormat("[JsonStoreScripts] no configuration info"); + return; + } + + m_enabled = m_config.GetBoolean("Enabled", m_enabled); + } + catch (Exception e) + { + m_log.ErrorFormat("[JsonStoreScripts] initialization error: {0}",e.Message); + return; + } + + m_log.InfoFormat("[JsonStoreScripts] module {0} enabled",(m_enabled ? "is" : "is not")); + } + + // ----------------------------------------------------------------- + /// + /// everything is loaded, perform post load configuration + /// + // ----------------------------------------------------------------- + public void PostInitialise() + { + } + + // ----------------------------------------------------------------- + /// + /// Nothing to do on close + /// + // ----------------------------------------------------------------- + public void Close() + { + } + + // ----------------------------------------------------------------- + /// + /// + // ----------------------------------------------------------------- + public void AddRegion(Scene scene) + { + } + + // ----------------------------------------------------------------- + /// + /// + // ----------------------------------------------------------------- + public void RemoveRegion(Scene scene) + { + // need to remove all references to the scene in the subscription + // list to enable full garbage collection of the scene object + } + + // ----------------------------------------------------------------- + /// + /// Called when all modules have been added for a region. This is + /// where we hook up events + /// + // ----------------------------------------------------------------- + public void RegionLoaded(Scene scene) + { + if (m_enabled) + { + m_scene = scene; + m_comms = m_scene.RequestModuleInterface(); + if (m_comms == null) + { + m_log.ErrorFormat("[JsonStoreScripts] ScriptModuleComms interface not defined"); + m_enabled = false; + return; + } + + m_store = m_scene.RequestModuleInterface(); + if (m_store == null) + { + m_log.ErrorFormat("[JsonStoreScripts] JsonModule interface not defined"); + m_enabled = false; + return; + } + + m_comms.RegisterScriptInvocation(this,"JsonCreateStore"); + m_comms.RegisterScriptInvocation(this,"JsonDestroyStore"); + + m_comms.RegisterScriptInvocation(this,"JsonReadNotecard"); + m_comms.RegisterScriptInvocation(this,"JsonWriteNotecard"); + + m_comms.RegisterScriptInvocation(this,"JsonTestPath"); + m_comms.RegisterScriptInvocation(this,"JsonTestPathJson"); + + m_comms.RegisterScriptInvocation(this,"JsonGetValue"); + m_comms.RegisterScriptInvocation(this,"JsonGetValueJson"); + + m_comms.RegisterScriptInvocation(this,"JsonTakeValue"); + m_comms.RegisterScriptInvocation(this,"JsonTakeValueJson"); + + m_comms.RegisterScriptInvocation(this,"JsonReadValue"); + m_comms.RegisterScriptInvocation(this,"JsonReadValueJson"); + + m_comms.RegisterScriptInvocation(this,"JsonSetValue"); + m_comms.RegisterScriptInvocation(this,"JsonSetValueJson"); + + m_comms.RegisterScriptInvocation(this,"JsonRemoveValue"); + } + } + + /// ----------------------------------------------------------------- + /// + /// + // ----------------------------------------------------------------- + public Type ReplaceableInterface + { + get { return null; } + } + +#endregion + +#region ScriptInvocationInteface + // ----------------------------------------------------------------- + /// + /// + /// + // ----------------------------------------------------------------- + protected void GenerateRuntimeError(string msg) + { + throw new Exception("JsonStore Runtime Error: " + msg); + } + + // ----------------------------------------------------------------- + /// + /// + /// + // ----------------------------------------------------------------- + protected UUID JsonCreateStore(UUID hostID, UUID scriptID, string value) + { + UUID uuid = UUID.Zero; + if (! m_store.CreateStore(value, out uuid)) + GenerateRuntimeError("Failed to create Json store"); + + return uuid; + } + + // ----------------------------------------------------------------- + /// + /// + /// + // ----------------------------------------------------------------- + protected int JsonDestroyStore(UUID hostID, UUID scriptID, UUID storeID) + { + return m_store.DestroyStore(storeID) ? 1 : 0; + } + + // ----------------------------------------------------------------- + /// + /// + /// + // ----------------------------------------------------------------- + protected UUID JsonReadNotecard(UUID hostID, UUID scriptID, UUID storeID, string path, UUID assetID) + { + UUID reqID = UUID.Random(); + Util.FireAndForget(delegate(object o) { DoJsonReadNotecard(reqID,hostID,scriptID,storeID,path,assetID); }); + return reqID; + } + + // ----------------------------------------------------------------- + /// + /// + /// + // ----------------------------------------------------------------- + protected UUID JsonWriteNotecard(UUID hostID, UUID scriptID, UUID storeID, string path, string name) + { + UUID reqID = UUID.Random(); + Util.FireAndForget(delegate(object o) { DoJsonWriteNotecard(reqID,hostID,scriptID,storeID,path,name); }); + return reqID; + } + + // ----------------------------------------------------------------- + /// + /// + /// + // ----------------------------------------------------------------- + protected int JsonTestPath(UUID hostID, UUID scriptID, UUID storeID, string path) + { + return m_store.TestPath(storeID,path,false) ? 1 : 0; + } + + protected int JsonTestPathJson(UUID hostID, UUID scriptID, UUID storeID, string path) + { + return m_store.TestPath(storeID,path,true) ? 1 : 0; + } + + // ----------------------------------------------------------------- + /// + /// + /// + // ----------------------------------------------------------------- + protected int JsonSetValue(UUID hostID, UUID scriptID, UUID storeID, string path, string value) + { + return m_store.SetValue(storeID,path,value,false) ? 1 : 0; + } + + protected int JsonSetValueJson(UUID hostID, UUID scriptID, UUID storeID, string path, string value) + { + return m_store.SetValue(storeID,path,value,true) ? 1 : 0; + } + + // ----------------------------------------------------------------- + /// + /// + /// + // ----------------------------------------------------------------- + protected int JsonRemoveValue(UUID hostID, UUID scriptID, UUID storeID, string path) + { + return m_store.RemoveValue(storeID,path) ? 1 : 0; + } + + // ----------------------------------------------------------------- + /// + /// + /// + // ----------------------------------------------------------------- + protected string JsonGetValue(UUID hostID, UUID scriptID, UUID storeID, string path) + { + string value = String.Empty; + m_store.GetValue(storeID,path,false,out value); + return value; + } + + protected string JsonGetValueJson(UUID hostID, UUID scriptID, UUID storeID, string path) + { + string value = String.Empty; + m_store.GetValue(storeID,path,true, out value); + return value; + } + + // ----------------------------------------------------------------- + /// + /// + /// + // ----------------------------------------------------------------- + protected UUID JsonTakeValue(UUID hostID, UUID scriptID, UUID storeID, string path) + { + UUID reqID = UUID.Random(); + Util.FireAndForget(delegate(object o) { DoJsonTakeValue(scriptID,reqID,storeID,path,false); }); + return reqID; + } + + protected UUID JsonTakeValueJson(UUID hostID, UUID scriptID, UUID storeID, string path) + { + UUID reqID = UUID.Random(); + Util.FireAndForget(delegate(object o) { DoJsonTakeValue(scriptID,reqID,storeID,path,true); }); + return reqID; + } + + private void DoJsonTakeValue(UUID scriptID, UUID reqID, UUID storeID, string path, bool useJson) + { + try + { + m_store.TakeValue(storeID,path,useJson,delegate(string value) { DispatchValue(scriptID,reqID,value); }); + return; + } + catch (Exception e) + { + m_log.InfoFormat("[JsonStoreScripts] unable to retrieve value; {0}",e.ToString()); + } + + DispatchValue(scriptID,reqID,String.Empty); + } + + + // ----------------------------------------------------------------- + /// + /// + /// + // ----------------------------------------------------------------- + protected UUID JsonReadValue(UUID hostID, UUID scriptID, UUID storeID, string path) + { + UUID reqID = UUID.Random(); + Util.FireAndForget(delegate(object o) { DoJsonReadValue(scriptID,reqID,storeID,path,false); }); + return reqID; + } + + protected UUID JsonReadValueJson(UUID hostID, UUID scriptID, UUID storeID, string path) + { + UUID reqID = UUID.Random(); + Util.FireAndForget(delegate(object o) { DoJsonReadValue(scriptID,reqID,storeID,path,true); }); + return reqID; + } + + private void DoJsonReadValue(UUID scriptID, UUID reqID, UUID storeID, string path, bool useJson) + { + try + { + m_store.ReadValue(storeID,path,useJson,delegate(string value) { DispatchValue(scriptID,reqID,value); }); + return; + } + catch (Exception e) + { + m_log.InfoFormat("[JsonStoreScripts] unable to retrieve value; {0}",e.ToString()); + } + + DispatchValue(scriptID,reqID,String.Empty); + } + +#endregion + + // ----------------------------------------------------------------- + /// + /// + /// + // ----------------------------------------------------------------- + protected void DispatchValue(UUID scriptID, UUID reqID, string value) + { + m_comms.DispatchReply(scriptID,1,value,reqID.ToString()); + } + + // ----------------------------------------------------------------- + /// + /// + /// + // ----------------------------------------------------------------- + private void DoJsonReadNotecard(UUID reqID, UUID hostID, UUID scriptID, UUID storeID, string path, UUID assetID) + { + AssetBase a = m_scene.AssetService.Get(assetID.ToString()); + if (a == null) + GenerateRuntimeError(String.Format("Unable to find notecard asset {0}",assetID)); + + if (a.Type != (sbyte)AssetType.Notecard) + GenerateRuntimeError(String.Format("Invalid notecard asset {0}",assetID)); + + m_log.DebugFormat("[JsonStoreScripts] read notecard in context {0}",storeID); + + try + { + System.Text.UTF8Encoding enc = new System.Text.UTF8Encoding(); + string jsondata = SLUtil.ParseNotecardToString(enc.GetString(a.Data)); + int result = m_store.SetValue(storeID,path,jsondata,true) ? 1 : 0; + m_comms.DispatchReply(scriptID,result,"",reqID.ToString()); + return; + } + catch (Exception e) + { + m_log.WarnFormat("[JsonStoreScripts] Json parsing failed; {0}",e.Message); + } + + GenerateRuntimeError(String.Format("Json parsing failed for {0}",assetID.ToString())); + m_comms.DispatchReply(scriptID,0,"",reqID.ToString()); + } + + // ----------------------------------------------------------------- + /// + /// + /// + // ----------------------------------------------------------------- + private void DoJsonWriteNotecard(UUID reqID, UUID hostID, UUID scriptID, UUID storeID, string path, string name) + { + string data; + if (! m_store.GetValue(storeID,path,true, out data)) + { + m_comms.DispatchReply(scriptID,0,UUID.Zero.ToString(),reqID.ToString()); + return; + } + + SceneObjectPart host = m_scene.GetSceneObjectPart(hostID); + + // Create new asset + UUID assetID = UUID.Random(); + AssetBase asset = new AssetBase(assetID, name, (sbyte)AssetType.Notecard, host.OwnerID.ToString()); + asset.Description = "Json store"; + + int textLength = data.Length; + data = "Linden text version 2\n{\nLLEmbeddedItems version 1\n{\ncount 0\n}\nText length " + + textLength.ToString() + "\n" + data + "}\n"; + + asset.Data = Util.UTF8.GetBytes(data); + m_scene.AssetService.Store(asset); + + // Create Task Entry + TaskInventoryItem taskItem = new TaskInventoryItem(); + + taskItem.ResetIDs(host.UUID); + taskItem.ParentID = host.UUID; + taskItem.CreationDate = (uint)Util.UnixTimeSinceEpoch(); + taskItem.Name = asset.Name; + taskItem.Description = asset.Description; + taskItem.Type = (int)AssetType.Notecard; + taskItem.InvType = (int)InventoryType.Notecard; + taskItem.OwnerID = host.OwnerID; + taskItem.CreatorID = host.OwnerID; + taskItem.BasePermissions = (uint)PermissionMask.All; + taskItem.CurrentPermissions = (uint)PermissionMask.All; + taskItem.EveryonePermissions = 0; + taskItem.NextPermissions = (uint)PermissionMask.All; + taskItem.GroupID = host.GroupID; + taskItem.GroupPermissions = 0; + taskItem.Flags = 0; + taskItem.PermsGranter = UUID.Zero; + taskItem.PermsMask = 0; + taskItem.AssetID = asset.FullID; + + host.Inventory.AddInventoryItem(taskItem, false); + + m_comms.DispatchReply(scriptID,1,assetID.ToString(),reqID.ToString()); + } + } +} From 2d45ba47ac91646901701df8eec4eb86a0fddabf Mon Sep 17 00:00:00 2001 From: Mic Bowman Date: Tue, 17 Apr 2012 13:55:00 -0700 Subject: [PATCH 039/547] add configuration for jsonstore module, disabled by default --- bin/OpenSimDefaults.ini | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/bin/OpenSimDefaults.ini b/bin/OpenSimDefaults.ini index 68a2ea307f..3f2f1318ac 100644 --- a/bin/OpenSimDefaults.ini +++ b/bin/OpenSimDefaults.ini @@ -1560,6 +1560,12 @@ MaptileURL = "http://www.mygrid.com/Grid/" RefreshTime = 3600 +;; +;; JsonStore module provides structured store for scripts +;; +[JsonStore] +Enabled = False + ;; ;; These are defaults that are overwritten below in [Architecture]. ;; These defaults allow OpenSim to work out of the box with From 4db518b9a30122f662a40252d3674ea272d6dcc1 Mon Sep 17 00:00:00 2001 From: Mic Bowman Date: Tue, 17 Apr 2012 14:15:17 -0700 Subject: [PATCH 040/547] Fix the Csharp 3.0 vs 4.0 problem in JsonStore initialization. Cut down on the logging spam. --- .../Region/OptionalModules/Scripting/JsonStore/JsonStore.cs | 4 +++- .../OptionalModules/Scripting/JsonStore/JsonStoreModule.cs | 4 ++-- .../Scripting/JsonStore/JsonStoreScriptModule.cs | 4 ++-- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/OpenSim/Region/OptionalModules/Scripting/JsonStore/JsonStore.cs b/OpenSim/Region/OptionalModules/Scripting/JsonStore/JsonStore.cs index 49556b601d..34894badf7 100644 --- a/OpenSim/Region/OptionalModules/Scripting/JsonStore/JsonStore.cs +++ b/OpenSim/Region/OptionalModules/Scripting/JsonStore/JsonStore.cs @@ -74,7 +74,9 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore /// /// // ----------------------------------------------------------------- - public JsonStore(string value = "") + public JsonStore() : this("") {} + + public JsonStore(string value) { m_TakeStore = new List(); m_ReadStore = new List(); diff --git a/OpenSim/Region/OptionalModules/Scripting/JsonStore/JsonStoreModule.cs b/OpenSim/Region/OptionalModules/Scripting/JsonStore/JsonStoreModule.cs index 6dae9566d0..26bc615110 100644 --- a/OpenSim/Region/OptionalModules/Scripting/JsonStore/JsonStoreModule.cs +++ b/OpenSim/Region/OptionalModules/Scripting/JsonStore/JsonStoreModule.cs @@ -85,7 +85,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore if ((m_config = config.Configs["JsonStore"]) == null) { // There is no configuration, the module is disabled - m_log.InfoFormat("[JsonStore] no configuration info"); + // m_log.InfoFormat("[JsonStore] no configuration info"); return; } @@ -97,7 +97,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore return; } - m_log.InfoFormat("[JsonStore] module {0} enabled",(m_enabled ? "is" : "is not")); + m_log.DebugFormat("[JsonStore] module {0} enabled",(m_enabled ? "is" : "is not")); } // ----------------------------------------------------------------- diff --git a/OpenSim/Region/OptionalModules/Scripting/JsonStore/JsonStoreScriptModule.cs b/OpenSim/Region/OptionalModules/Scripting/JsonStore/JsonStoreScriptModule.cs index 7aba860a89..c619d0d252 100644 --- a/OpenSim/Region/OptionalModules/Scripting/JsonStore/JsonStoreScriptModule.cs +++ b/OpenSim/Region/OptionalModules/Scripting/JsonStore/JsonStoreScriptModule.cs @@ -84,7 +84,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore if ((m_config = config.Configs["JsonStore"]) == null) { // There is no configuration, the module is disabled - m_log.InfoFormat("[JsonStoreScripts] no configuration info"); + // m_log.InfoFormat("[JsonStoreScripts] no configuration info"); return; } @@ -96,7 +96,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore return; } - m_log.InfoFormat("[JsonStoreScripts] module {0} enabled",(m_enabled ? "is" : "is not")); + m_log.DebugFormat("[JsonStoreScripts] module {0} enabled",(m_enabled ? "is" : "is not")); } // ----------------------------------------------------------------- From 84891930aa73a013493ec511b13f7c8954d20770 Mon Sep 17 00:00:00 2001 From: Mic Bowman Date: Tue, 17 Apr 2012 14:23:43 -0700 Subject: [PATCH 041/547] clean up some more logging spam in the jsonstore modules --- .../OptionalModules/Scripting/JsonStore/JsonStoreModule.cs | 3 ++- .../Scripting/JsonStore/JsonStoreScriptModule.cs | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/OpenSim/Region/OptionalModules/Scripting/JsonStore/JsonStoreModule.cs b/OpenSim/Region/OptionalModules/Scripting/JsonStore/JsonStoreModule.cs index 26bc615110..311531c8d4 100644 --- a/OpenSim/Region/OptionalModules/Scripting/JsonStore/JsonStoreModule.cs +++ b/OpenSim/Region/OptionalModules/Scripting/JsonStore/JsonStoreModule.cs @@ -97,7 +97,8 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore return; } - m_log.DebugFormat("[JsonStore] module {0} enabled",(m_enabled ? "is" : "is not")); + if (m_enabled) + m_log.DebugFormat("[JsonStore] module is enabled"); } // ----------------------------------------------------------------- diff --git a/OpenSim/Region/OptionalModules/Scripting/JsonStore/JsonStoreScriptModule.cs b/OpenSim/Region/OptionalModules/Scripting/JsonStore/JsonStoreScriptModule.cs index c619d0d252..eda2aef9ed 100644 --- a/OpenSim/Region/OptionalModules/Scripting/JsonStore/JsonStoreScriptModule.cs +++ b/OpenSim/Region/OptionalModules/Scripting/JsonStore/JsonStoreScriptModule.cs @@ -96,7 +96,8 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore return; } - m_log.DebugFormat("[JsonStoreScripts] module {0} enabled",(m_enabled ? "is" : "is not")); + if (m_enabled) + m_log.DebugFormat("[JsonStoreScripts] module is enabled"); } // ----------------------------------------------------------------- From 859646ef5cf016eecfefb53b2b388fe880c39a3a Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Tue, 17 Apr 2012 23:54:51 +0100 Subject: [PATCH 042/547] minor: Add some method doc. Add warnings since calling SOG link/delink methods directly rather than through Scene may allow race conditions. --- OpenSim/Region/Framework/Scenes/SceneGraph.cs | 3 +++ .../Framework/Scenes/SceneObjectGroup.cs | 19 +++++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs index 0098addb42..67eb0fe128 100644 --- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs +++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs @@ -91,6 +91,9 @@ namespace OpenSim.Region.Framework.Scenes /// protected internal Dictionary SceneObjectGroupsByLocalPartID = new Dictionary(); + /// + /// Lock to prevent object group update, linking and delinking operations from running concurrently. + /// private Object m_updateLock = new Object(); #endregion diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs index a49ed13ed2..8e786c150e 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs @@ -1962,6 +1962,10 @@ namespace OpenSim.Region.Framework.Scenes /// /// Link the prims in a given group to this group /// + /// + /// Do not call this method directly - use Scene.LinkObjects() instead to avoid races between threads. + /// FIXME: There are places where scripts call these methods directly without locking. This is a potential race condition. + /// /// The group of prims which should be linked to this group public void LinkToGroup(SceneObjectGroup objectGroup) { @@ -2045,6 +2049,11 @@ namespace OpenSim.Region.Framework.Scenes /// Delink the given prim from this group. The delinked prim is established as /// an independent SceneObjectGroup. /// + /// + /// FIXME: This method should not be called directly since it bypasses update locking, allowing a potential race + /// condition. But currently there is no + /// alternative method that does take a lonk to delink a single prim. + /// /// /// The object group of the newly delinked prim. Null if part could not be found public SceneObjectGroup DelinkFromGroup(uint partID) @@ -2056,6 +2065,11 @@ namespace OpenSim.Region.Framework.Scenes /// Delink the given prim from this group. The delinked prim is established as /// an independent SceneObjectGroup. /// + /// + /// FIXME: This method should not be called directly since it bypasses update locking, allowing a potential race + /// condition. But currently there is no + /// alternative method that does take a lonk to delink a single prim. + /// /// /// /// The object group of the newly delinked prim. Null if part could not be found @@ -2081,6 +2095,11 @@ namespace OpenSim.Region.Framework.Scenes /// Delink the given prim from this group. The delinked prim is established as /// an independent SceneObjectGroup. /// + /// + /// FIXME: This method should not be called directly since it bypasses update locking, allowing a potential race + /// condition. But currently there is no + /// alternative method that does take a lonk to delink a single prim. + /// /// /// /// The object group of the newly delinked prim. From c85f9d681a7e9cb09e8cf4de97643eadc7a9d4d8 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Wed, 18 Apr 2012 00:39:39 +0100 Subject: [PATCH 043/547] On "show part" command, show link number. This replaces the Parts count which was rather pointless for a prim (it was either 1 if a child or the number of parts if the root). This information is still avaliable on the "show object" command. --- .../CoreModules/World/Objects/Commands/ObjectCommandsModule.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Region/CoreModules/World/Objects/Commands/ObjectCommandsModule.cs b/OpenSim/Region/CoreModules/World/Objects/Commands/ObjectCommandsModule.cs index f5a5c92c4a..06fea58ea3 100644 --- a/OpenSim/Region/CoreModules/World/Objects/Commands/ObjectCommandsModule.cs +++ b/OpenSim/Region/CoreModules/World/Objects/Commands/ObjectCommandsModule.cs @@ -282,7 +282,7 @@ namespace OpenSim.Region.CoreModules.World.Objects.Commands sb.AppendFormat("Location: {0} @ {1}\n", sop.AbsolutePosition, sop.ParentGroup.Scene.RegionInfo.RegionName); sb.AppendFormat("Parent: {0}", sop.IsRoot ? "Is Root\n" : string.Format("{0} {1}\n", sop.ParentGroup.Name, sop.ParentGroup.UUID)); - sb.AppendFormat("Parts: {0}\n", !sop.IsRoot ? "1" : sop.ParentGroup.PrimCount.ToString());; + sb.AppendFormat("Link number: {0}\n", sop.LinkNum); return sb; } From ea73a035531a0e957f54fe897f3a3ff7ca3dc22d Mon Sep 17 00:00:00 2001 From: Melanie Date: Wed, 18 Apr 2012 20:01:41 +0100 Subject: [PATCH 044/547] Don't re-add the assembly resolver for each script if not creating the appdomain --- OpenSim/Region/ScriptEngine/XEngine/XEngine.cs | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs index b7903d5a20..ad2f12e2ed 100644 --- a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs +++ b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs @@ -1021,11 +1021,18 @@ namespace OpenSim.Region.ScriptEngine.XEngine AppDomain sandbox; if (m_AppDomainLoading) + { sandbox = AppDomain.CreateDomain( m_Scene.RegionInfo.RegionID.ToString(), evidence, appSetup); + m_AppDomains[appDomain].AssemblyResolve += + new ResolveEventHandler( + AssemblyResolver.OnAssemblyResolve); + } else + { sandbox = AppDomain.CurrentDomain; + } //PolicyLevel sandboxPolicy = PolicyLevel.CreateAppDomainLevel(); //AllMembershipCondition sandboxMembershipCondition = new AllMembershipCondition(); @@ -1037,9 +1044,6 @@ namespace OpenSim.Region.ScriptEngine.XEngine m_AppDomains[appDomain] = sandbox; - m_AppDomains[appDomain].AssemblyResolve += - new ResolveEventHandler( - AssemblyResolver.OnAssemblyResolve); m_DomainScripts[appDomain] = new List(); } catch (Exception e) @@ -1984,4 +1988,4 @@ namespace OpenSim.Region.ScriptEngine.XEngine // m_log.DebugFormat("[XEngine]: Could not find script with ID {0} to resume", itemID); } } -} \ No newline at end of file +} From c2be894330385ac55d3c62349ba9af4b2c9e86b4 Mon Sep 17 00:00:00 2001 From: Melanie Date: Wed, 18 Apr 2012 23:23:01 +0100 Subject: [PATCH 045/547] Fx up estate settings --- OpenSim/Framework/EstateSettings.cs | 2 +- prebuild.xml | 192 ++++++++++++++-------------- 2 files changed, 97 insertions(+), 97 deletions(-) diff --git a/OpenSim/Framework/EstateSettings.cs b/OpenSim/Framework/EstateSettings.cs index 1caf04af50..9020761cad 100644 --- a/OpenSim/Framework/EstateSettings.cs +++ b/OpenSim/Framework/EstateSettings.cs @@ -368,7 +368,7 @@ namespace OpenSim.Framework if (ban.BannedUserID == avatarID) return true; - if (!IsEstateManager(avatarID) && !HasAccess(avatarID)) + if (!IsEstateManagerOrOwner(avatarID) && !HasAccess(avatarID)) { if (DenyMinors) { diff --git a/prebuild.xml b/prebuild.xml index f9b26eff82..b9086491b8 100644 --- a/prebuild.xml +++ b/prebuild.xml @@ -34,7 +34,7 @@ - + ../../bin/ @@ -77,7 +77,7 @@ - + ../../bin/ @@ -112,7 +112,7 @@ - + ../../../../bin/ @@ -150,7 +150,7 @@ - + ../../../bin/ @@ -177,7 +177,7 @@ - + ../../../bin/ @@ -205,7 +205,7 @@ - + ../../../bin/ @@ -234,7 +234,7 @@ - + ../../../bin/ @@ -258,7 +258,7 @@ - + ../../bin/ @@ -287,7 +287,7 @@ - + ../../../../bin/ @@ -312,7 +312,7 @@ - + ../../../../bin/ @@ -339,7 +339,7 @@ - + ../../../../bin/ @@ -364,7 +364,7 @@ - + ../../../../bin/ @@ -390,7 +390,7 @@ - + ../../../../bin/ @@ -416,7 +416,7 @@ - + ../../../bin/ @@ -448,7 +448,7 @@ - + ../../../../bin/ @@ -476,7 +476,7 @@ - + ../../../../bin/Physics/ @@ -499,7 +499,7 @@ - + ../../../../bin/Physics/ @@ -522,7 +522,7 @@ - + ../../../../bin/Physics/ @@ -552,7 +552,7 @@ - + ../../../../bin/ @@ -577,7 +577,7 @@ - + ../../../../bin/Physics/ @@ -608,7 +608,7 @@ - + ../../../../bin/Physics/ @@ -639,7 +639,7 @@ - + ../../../../bin/Physics/ @@ -672,7 +672,7 @@ - + ../../../../bin/Physics/ @@ -703,7 +703,7 @@ - + ../../../../bin/Physics/ @@ -735,7 +735,7 @@ - + ../../bin/ @@ -770,7 +770,7 @@ - + ../../../bin/ @@ -811,7 +811,7 @@ - + ../../../bin/ @@ -864,7 +864,7 @@ - + ../../../bin/ @@ -894,7 +894,7 @@ - + ../../../bin/ @@ -921,7 +921,7 @@ - + ../../../bin/ @@ -952,7 +952,7 @@ - + ../../../bin/ @@ -983,7 +983,7 @@ - + ../../../bin/ @@ -1022,7 +1022,7 @@ - + ../../../bin/ @@ -1053,7 +1053,7 @@ - + ../../../bin/ @@ -1084,7 +1084,7 @@ - + ../../../bin/ @@ -1116,7 +1116,7 @@ - + ../../../bin/ @@ -1149,7 +1149,7 @@ - + ../../../bin/ @@ -1183,7 +1183,7 @@ - + ../../../bin/ @@ -1214,7 +1214,7 @@ - + ../../../bin/ @@ -1245,7 +1245,7 @@ - + ../../../bin/ @@ -1278,7 +1278,7 @@ - + ../../../bin/ @@ -1311,7 +1311,7 @@ - + ../../../bin/ @@ -1349,7 +1349,7 @@ - + ../../../bin/ @@ -1379,7 +1379,7 @@ - + ../../../bin/ @@ -1418,7 +1418,7 @@ - + ../../../bin/ @@ -1459,7 +1459,7 @@ - + ../../bin/ @@ -1492,7 +1492,7 @@ - + ../../bin/ @@ -1524,7 +1524,7 @@ - + ../../../bin/ @@ -1589,7 +1589,7 @@ - + ../../../bin/ @@ -1627,7 +1627,7 @@ - + ../../../bin/ @@ -1662,7 +1662,7 @@ - + ../../../../../bin/ @@ -1705,7 +1705,7 @@ - + ../../../../../bin/ @@ -1747,7 +1747,7 @@ - + ../../../bin/ @@ -1804,7 +1804,7 @@ - + ../../../bin/ @@ -1832,7 +1832,7 @@ - + ../../../bin/ @@ -1876,7 +1876,7 @@ - + ../../../bin/ @@ -1911,7 +1911,7 @@ - + ../../../bin/ @@ -1941,7 +1941,7 @@ - + ../../../bin/ @@ -1982,7 +1982,7 @@ - + ../../../bin/ @@ -2017,7 +2017,7 @@ - + ../../../../bin/ @@ -2054,7 +2054,7 @@ - + ../../../../bin/ @@ -2098,7 +2098,7 @@ - + ../../../bin/ @@ -2135,7 +2135,7 @@ - + ../../../bin/ @@ -2173,7 +2173,7 @@ - + ../../../bin/ @@ -2207,7 +2207,7 @@ - + ../../../bin/ @@ -2248,7 +2248,7 @@ - + ../../../../bin/ @@ -2286,7 +2286,7 @@ - + ../../../../../../bin/ @@ -2319,7 +2319,7 @@ - + ../../../../../../../bin/ @@ -2351,7 +2351,7 @@ - + ../../../../../../bin/ @@ -2390,7 +2390,7 @@ - + ../../../../../bin/ @@ -2421,7 +2421,7 @@ - + ../../../../../bin/ @@ -2459,7 +2459,7 @@ - + ../../../../bin/ @@ -2502,7 +2502,7 @@ - + ../../../bin/ @@ -2553,7 +2553,7 @@ - + ../../../bin/ @@ -2580,7 +2580,7 @@ - + ../../../bin/ @@ -2607,7 +2607,7 @@ - + ../../../bin/ @@ -2631,7 +2631,7 @@ - + ../../../../bin/ @@ -2658,7 +2658,7 @@ - + ../../../../bin/ @@ -2685,7 +2685,7 @@ - + ../../../../bin/ @@ -2712,7 +2712,7 @@ - + ../../../../bin/ @@ -2740,7 +2740,7 @@ - + ../../../bin/ @@ -2784,7 +2784,7 @@ - + ../../bin/ @@ -2807,7 +2807,7 @@ - + ../../../bin/ @@ -2857,7 +2857,7 @@ - + ../../../bin/ @@ -2899,7 +2899,7 @@ - + ../../../bin/ @@ -2930,7 +2930,7 @@ - + ../../../../bin/ @@ -2961,7 +2961,7 @@ - + ../../../../bin/ @@ -2991,7 +2991,7 @@ - + ../../../bin/ @@ -3062,7 +3062,7 @@ - + ../../../bin/ @@ -3121,7 +3121,7 @@ - + ../../../bin/ @@ -3179,7 +3179,7 @@ - + ../../../../../bin/ @@ -3216,7 +3216,7 @@ - + ../../../../../../bin/ @@ -3252,7 +3252,7 @@ - + ../../../bin/ @@ -3306,7 +3306,7 @@ TODO: this is kind of lame, we basically build a duplicate assembly but with tests added in, just because we can't resolve cross-bin-dir-refs. --> - + ../../../../../bin/ @@ -3336,7 +3336,7 @@ - + ../../../bin/ From beb7b8d189a99b4385392b2209930e20b489a0c9 Mon Sep 17 00:00:00 2001 From: Melanie Date: Wed, 18 Apr 2012 23:23:37 +0100 Subject: [PATCH 046/547] Fix a logic error in app domain creation --- OpenSim/Region/ScriptEngine/XEngine/XEngine.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs index ad2f12e2ed..23a4cf92c0 100644 --- a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs +++ b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs @@ -1025,7 +1025,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine sandbox = AppDomain.CreateDomain( m_Scene.RegionInfo.RegionID.ToString(), evidence, appSetup); - m_AppDomains[appDomain].AssemblyResolve += + sandbox.AssemblyResolve += new ResolveEventHandler( AssemblyResolver.OnAssemblyResolve); } From 2b98e2f106f8a017cbaefcb2c21cc1bc9addde81 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 20 Apr 2012 02:50:36 +0100 Subject: [PATCH 047/547] Stop teleports from dropping tall avatars through or embedding them in the floor when lured by short avatars. This involves giving the ceiling of the Z-component in a lure rather than the floor. Ideally we would give the exact float compensating for relative avatar height but it looks like that isn't possible with the parcel id format used in lures --- OpenSim/Region/CoreModules/Avatar/Lure/LureModule.cs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/OpenSim/Region/CoreModules/Avatar/Lure/LureModule.cs b/OpenSim/Region/CoreModules/Avatar/Lure/LureModule.cs index d295384279..2d4cffd224 100644 --- a/OpenSim/Region/CoreModules/Avatar/Lure/LureModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Lure/LureModule.cs @@ -151,11 +151,17 @@ namespace OpenSim.Region.CoreModules.Avatar.Lure Scene scene = (Scene)(client.Scene); ScenePresence presence = scene.GetScenePresence(client.AgentId); + // Round up Z co-ordinate rather than round-down by casting. This stops tall avatars from being given + // a teleport Z co-ordinate by short avatars that drops them through or embeds them in thin floors on + // arrival. + // + // Ideally we would give the exact float position adjusting for the relative height of the two avatars + // but it looks like a float component isn't possible with a parcel ID. UUID dest = Util.BuildFakeParcelID( scene.RegionInfo.RegionHandle, (uint)presence.AbsolutePosition.X, (uint)presence.AbsolutePosition.Y, - (uint)presence.AbsolutePosition.Z); + (uint)Math.Ceiling(presence.AbsolutePosition.Z)); m_log.DebugFormat("TP invite with message {0}", message); From f3dda2d85d5b72aa880a399805d052b241d3abef Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 20 Apr 2012 03:12:25 +0100 Subject: [PATCH 048/547] Add more exception detail to Exception and IOException throws in BaseHttpServer.HandleRequest() --- OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs b/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs index 9d8561b69e..0fbf90aac4 100644 --- a/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs +++ b/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs @@ -662,11 +662,11 @@ namespace OpenSim.Framework.Servers.HttpServer } catch (IOException e) { - m_log.ErrorFormat("[BASE HTTP SERVER]: HandleRequest() threw {0}", e); + m_log.ErrorFormat("[BASE HTTP SERVER]: HandleRequest() threw {0}{1}", e.Message, e.StackTrace); } catch (Exception e) { - m_log.ErrorFormat("[BASE HTTP SERVER]: HandleRequest() threw {0}", e.StackTrace); + m_log.ErrorFormat("[BASE HTTP SERVER]: HandleRequest() threw {0}{1}", e.Message, e.StackTrace); SendHTML500(response); } finally From 63cda3a6d0910b74680cd343ab7bc07a6651f1cb Mon Sep 17 00:00:00 2001 From: Garmin Kawaguichi Date: Thu, 19 Apr 2012 15:47:56 +0200 Subject: [PATCH 049/547] concerns GenericSystemDrawing.cs in OpenSim\Region\CoreModules\World\Terrain\FileLoaders\GenericSystemDrawing.cs Ln 67 Apply Justin's solution Signed-off-by: Garmin Kawaguichi --- .../FileLoaders/GenericSystemDrawing.cs | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/GenericSystemDrawing.cs b/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/GenericSystemDrawing.cs index da81dc16a9..cd46276eb0 100644 --- a/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/GenericSystemDrawing.cs +++ b/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/GenericSystemDrawing.cs @@ -64,18 +64,19 @@ namespace OpenSim.Region.CoreModules.World.Terrain.FileLoaders public virtual ITerrainChannel LoadFile(string filename, int offsetX, int offsetY, int fileWidth, int fileHeight, int w, int h) { - Bitmap bitmap = new Bitmap(filename); - ITerrainChannel retval = new TerrainChannel(true); - - for (int x = 0; x < retval.Width; x++) + using (Bitmap bitmap = new Bitmap(filename)) { - for (int y = 0; y < retval.Height; y++) - { - retval[x, y] = bitmap.GetPixel(offsetX * retval.Width + x, (bitmap.Height - (retval.Height * (offsetY + 1))) + retval.Height - y - 1).GetBrightness() * 128; - } - } + ITerrainChannel retval = new TerrainChannel(true); - return retval; + for (int x = 0; x < retval.Width; x++) + { + for (int y = 0; y < retval.Height; y++) + { + retval[x, y] = bitmap.GetPixel(offsetX * retval.Width + x, (bitmap.Height - (retval.Height * (offsetY + 1))) + retval.Height - y - 1).GetBrightness() * 128; + } + } + return retval; + } } public virtual ITerrainChannel LoadStream(Stream stream) From 4ac2f839bdba84569877f5ab8c2e9ea0cfe87413 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 20 Apr 2012 03:32:38 +0100 Subject: [PATCH 050/547] Remember to dispose of the bitmap opened from a file in GatekeeperServiceConnector.GetMapImage() --- .../Hypergrid/GatekeeperServiceConnector.cs | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/OpenSim/Services/Connectors/Hypergrid/GatekeeperServiceConnector.cs b/OpenSim/Services/Connectors/Hypergrid/GatekeeperServiceConnector.cs index 0430ef60d7..19dffc35ac 100644 --- a/OpenSim/Services/Connectors/Hypergrid/GatekeeperServiceConnector.cs +++ b/OpenSim/Services/Connectors/Hypergrid/GatekeeperServiceConnector.cs @@ -154,7 +154,7 @@ namespace OpenSim.Services.Connectors.Hypergrid UUID mapTile = m_HGMapImage; string filename = string.Empty; - Bitmap bitmap = null; + try { WebClient c = new WebClient(); @@ -167,11 +167,18 @@ namespace OpenSim.Services.Connectors.Hypergrid c.DownloadFile(imageURL, filename); } else + { m_log.DebugFormat("[GATEKEEPER SERVICE CONNECTOR]: using cached image"); + } - bitmap = new Bitmap(filename); - //m_log.Debug("Size: " + m.PhysicalDimension.Height + "-" + m.PhysicalDimension.Width); - byte[] imageData = OpenJPEG.EncodeFromImage(bitmap, true); + byte[] imageData = null; + + using (Bitmap bitmap = new Bitmap(filename)) + { + //m_log.Debug("Size: " + m.PhysicalDimension.Height + "-" + m.PhysicalDimension.Width); + imageData = OpenJPEG.EncodeFromImage(bitmap, true); + } + AssetBase ass = new AssetBase(UUID.Random(), "region " + name, (sbyte)AssetType.Texture, regionID.ToString()); // !!! for now From cba64ebc79eaec9cd432d90b8cc48e22272d31f0 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 20 Apr 2012 03:46:09 +0100 Subject: [PATCH 051/547] Explicitly dispose of bitmaps opened from files in GenericSystemDrawing and JPEG.cs --- .../FileLoaders/GenericSystemDrawing.cs | 28 ++++++++++++------- .../World/Terrain/FileLoaders/JPEG.cs | 21 ++++++++------ 2 files changed, 31 insertions(+), 18 deletions(-) diff --git a/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/GenericSystemDrawing.cs b/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/GenericSystemDrawing.cs index cd46276eb0..3921bf952e 100644 --- a/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/GenericSystemDrawing.cs +++ b/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/GenericSystemDrawing.cs @@ -59,7 +59,8 @@ namespace OpenSim.Region.CoreModules.World.Terrain.FileLoaders /// A terrain channel generated from the image. public virtual ITerrainChannel LoadFile(string filename) { - return LoadBitmap(new Bitmap(filename)); + using (Bitmap b = new Bitmap(filename)) + return LoadBitmap(b); } public virtual ITerrainChannel LoadFile(string filename, int offsetX, int offsetY, int fileWidth, int fileHeight, int w, int h) @@ -75,13 +76,15 @@ namespace OpenSim.Region.CoreModules.World.Terrain.FileLoaders retval[x, y] = bitmap.GetPixel(offsetX * retval.Width + x, (bitmap.Height - (retval.Height * (offsetY + 1))) + retval.Height - y - 1).GetBrightness() * 128; } } + return retval; } } public virtual ITerrainChannel LoadStream(Stream stream) { - return LoadBitmap(new Bitmap(stream)); + using (Bitmap b = new Bitmap(stream)) + return LoadBitmap(b); } protected virtual ITerrainChannel LoadBitmap(Bitmap bitmap) @@ -227,16 +230,21 @@ namespace OpenSim.Region.CoreModules.World.Terrain.FileLoaders /// A System.Drawing.Bitmap containing a coloured image protected static Bitmap CreateBitmapFromMap(ITerrainChannel map) { - Bitmap gradientmapLd = new Bitmap("defaultstripe.png"); + int pallete; + Bitmap bmp; + Color[] colours; - int pallete = gradientmapLd.Height; - - Bitmap bmp = new Bitmap(map.Width, map.Height); - Color[] colours = new Color[pallete]; - - for (int i = 0; i < pallete; i++) + using (Bitmap gradientmapLd = new Bitmap("defaultstripe.png")) { - colours[i] = gradientmapLd.GetPixel(0, i); + pallete = gradientmapLd.Height; + + bmp = new Bitmap(map.Width, map.Height); + colours = new Color[pallete]; + + for (int i = 0; i < pallete; i++) + { + colours[i] = gradientmapLd.GetPixel(0, i); + } } for (int y = 0; y < map.Height; y++) diff --git a/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/JPEG.cs b/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/JPEG.cs index 699d67a440..9cc767a43e 100644 --- a/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/JPEG.cs +++ b/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/JPEG.cs @@ -99,16 +99,21 @@ namespace OpenSim.Region.CoreModules.World.Terrain.FileLoaders private static Bitmap CreateBitmapFromMap(ITerrainChannel map) { - Bitmap gradientmapLd = new Bitmap("defaultstripe.png"); + int pallete; + Bitmap bmp; + Color[] colours; - int pallete = gradientmapLd.Height; - - Bitmap bmp = new Bitmap(map.Width, map.Height); - Color[] colours = new Color[pallete]; - - for (int i = 0; i < pallete; i++) + using (Bitmap gradientmapLd = new Bitmap("defaultstripe.png")) { - colours[i] = gradientmapLd.GetPixel(0, i); + pallete = gradientmapLd.Height; + + bmp = new Bitmap(map.Width, map.Height); + colours = new Color[pallete]; + + for (int i = 0; i < pallete; i++) + { + colours[i] = gradientmapLd.GetPixel(0, i); + } } for (int y = 0; y < map.Height; y++) From 75f117484b8e45d0db4273f37cc993bf02f00fcb Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 20 Apr 2012 03:57:22 +0100 Subject: [PATCH 052/547] Always dispose of existing opened bitmap from file in SaveFile(), instead of simply dropping the reference if the existing file didn't contain a bitmap of the same size. --- .../FileLoaders/GenericSystemDrawing.cs | 61 ++++++++++++------- 1 file changed, 38 insertions(+), 23 deletions(-) diff --git a/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/GenericSystemDrawing.cs b/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/GenericSystemDrawing.cs index 3921bf952e..039c3fa4f8 100644 --- a/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/GenericSystemDrawing.cs +++ b/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/GenericSystemDrawing.cs @@ -138,35 +138,50 @@ namespace OpenSim.Region.CoreModules.World.Terrain.FileLoaders // "Saving the image to the same file it was constructed from is not allowed and throws an exception." string tempName = Path.GetTempFileName(); - Bitmap entireBitmap = null; - Bitmap thisBitmap = null; - if (File.Exists(filename)) + Bitmap existingBitmap = null; + Bitmap thisBitmap; + Bitmap newBitmap; + + try { - File.Copy(filename, tempName, true); - entireBitmap = new Bitmap(tempName); - if (entireBitmap.Width != fileWidth * regionSizeX || entireBitmap.Height != fileHeight * regionSizeY) + if (File.Exists(filename)) { - // old file, let's overwrite it - entireBitmap = new Bitmap(fileWidth * regionSizeX, fileHeight * regionSizeY); + File.Copy(filename, tempName, true); + existingBitmap = new Bitmap(tempName); + if (existingBitmap.Width != fileWidth * regionSizeX || existingBitmap.Height != fileHeight * regionSizeY) + { + // old file, let's overwrite it + newBitmap = new Bitmap(fileWidth * regionSizeX, fileHeight * regionSizeY); + } + else + { + newBitmap = existingBitmap; + } } + else + { + newBitmap = new Bitmap(fileWidth * regionSizeX, fileHeight * regionSizeY); + } + + thisBitmap = CreateGrayscaleBitmapFromMap(m_channel); + // Console.WriteLine("offsetX=" + offsetX + " offsetY=" + offsetY); + for (int x = 0; x < regionSizeX; x++) + for (int y = 0; y < regionSizeY; y++) + newBitmap.SetPixel(x + offsetX * regionSizeX, y + (fileHeight - 1 - offsetY) * regionSizeY, thisBitmap.GetPixel(x, y)); + + Save(newBitmap, filename); } - else + finally { - entireBitmap = new Bitmap(fileWidth * regionSizeX, fileHeight * regionSizeY); + if (existingBitmap != null) + existingBitmap.Dispose(); + + thisBitmap.Dispose(); + newBitmap.Dispose(); + + if (File.Exists(tempName)) + File.Delete(tempName); } - - thisBitmap = CreateGrayscaleBitmapFromMap(m_channel); -// Console.WriteLine("offsetX=" + offsetX + " offsetY=" + offsetY); - for (int x = 0; x < regionSizeX; x++) - for (int y = 0; y < regionSizeY; y++) - entireBitmap.SetPixel(x + offsetX * regionSizeX, y + (fileHeight - 1 - offsetY) * regionSizeY, thisBitmap.GetPixel(x, y)); - - Save(entireBitmap, filename); - thisBitmap.Dispose(); - entireBitmap.Dispose(); - - if (File.Exists(tempName)) - File.Delete(tempName); } protected virtual void Save(Bitmap bmp, string filename) From 566327a9482506f2965e06b37172dc42f66cd6e5 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 20 Apr 2012 23:24:24 +0100 Subject: [PATCH 053/547] If a physical prim is manually moved (e.g. by a user) then set the geometry position as well as the body position This is necessary to stop the moved prim snapping back to the original position on deselection if moved only once This resolves http://opensimulator.org/mantis/view.php?id=5966 --- OpenSim/Region/Physics/OdePlugin/ODEPrim.cs | 26 ++++++++++----------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs index 1f79cd8e83..7d67da3c8e 100644 --- a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs +++ b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs @@ -1579,23 +1579,21 @@ Console.WriteLine(" JointCreateFixed"); //m_log.Debug("[BUG]: race!"); //} } - else + + // string primScenAvatarIn = _parent_scene.whichspaceamIin(_position); + // int[] arrayitem = _parent_scene.calculateSpaceArrayItemFromPos(_position); +// _parent_scene.waitForSpaceUnlock(m_targetSpace); + + IntPtr tempspace = _parent_scene.recalculateSpaceForGeom(prim_geom, _position, m_targetSpace); + m_targetSpace = tempspace; + +// _parent_scene.waitForSpaceUnlock(m_targetSpace); + if (prim_geom != IntPtr.Zero) { - // string primScenAvatarIn = _parent_scene.whichspaceamIin(_position); - // int[] arrayitem = _parent_scene.calculateSpaceArrayItemFromPos(_position); -// _parent_scene.waitForSpaceUnlock(m_targetSpace); - - IntPtr tempspace = _parent_scene.recalculateSpaceForGeom(prim_geom, _position, m_targetSpace); - m_targetSpace = tempspace; - -// _parent_scene.waitForSpaceUnlock(m_targetSpace); - if (prim_geom != IntPtr.Zero) - { - d.GeomSetPosition(prim_geom, _position.X, _position.Y, _position.Z); + d.GeomSetPosition(prim_geom, _position.X, _position.Y, _position.Z); // _parent_scene.waitForSpaceUnlock(m_targetSpace); - d.SpaceAdd(m_targetSpace, prim_geom); - } + d.SpaceAdd(m_targetSpace, prim_geom); } changeSelectedStatus(); From c8307cdf1e1f06f68fdf3f36d1facd295c77e88d Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 20 Apr 2012 23:35:11 +0100 Subject: [PATCH 054/547] Improve bitmap disposal to do null checks and not to potentially try disposal of uninitialized variables. This issue doesn't cause the mono 2.10.5 compiler to fail but appears to cause the windows compiler to fail. Resolves http://opensimulator.org/mantis/view.php?id=5973 --- .../World/Terrain/FileLoaders/GenericSystemDrawing.cs | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/GenericSystemDrawing.cs b/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/GenericSystemDrawing.cs index 039c3fa4f8..d78ade5fa7 100644 --- a/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/GenericSystemDrawing.cs +++ b/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/GenericSystemDrawing.cs @@ -139,8 +139,8 @@ namespace OpenSim.Region.CoreModules.World.Terrain.FileLoaders string tempName = Path.GetTempFileName(); Bitmap existingBitmap = null; - Bitmap thisBitmap; - Bitmap newBitmap; + Bitmap thisBitmap = null; + Bitmap newBitmap = null; try { @@ -176,8 +176,11 @@ namespace OpenSim.Region.CoreModules.World.Terrain.FileLoaders if (existingBitmap != null) existingBitmap.Dispose(); - thisBitmap.Dispose(); - newBitmap.Dispose(); + if (thisBitmap != null) + thisBitmap.Dispose(); + + if (newBitmap != null) + newBitmap.Dispose(); if (File.Exists(tempName)) File.Delete(tempName); From 7a574be3fd28ffbd9bce4cfa08451d705728fa20 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Sat, 21 Apr 2012 00:12:07 +0100 Subject: [PATCH 055/547] Remove redundant prim_geom != IntPtr.Zero checks in ODEPrim. prim_geom == IntPtr.Zero only before a new add prim taint is processed (which is the first taint) or in operations such as scale change which are done in taint or under lock. Therefore, we can remove these checks which were not consistently applied anyway. If there is a genuine problem, better to see it quickly in a NullReferenceException than hide the bug. --- OpenSim/Region/Physics/OdePlugin/ODEPrim.cs | 224 +++++++++----------- 1 file changed, 98 insertions(+), 126 deletions(-) diff --git a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs index 7d67da3c8e..0a8cf75bcd 100644 --- a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs +++ b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs @@ -156,7 +156,15 @@ namespace OpenSim.Region.Physics.OdePlugin /// public IntPtr m_targetSpace = IntPtr.Zero; + /// + /// The prim geometry, used for collision detection. + /// + /// + /// This is never null except for a brief period when the geometry needs to be replaced (due to resizing or + /// mesh change) or when the physical prim is being removed from the scene. + /// public IntPtr prim_geom { get; private set; } + public IntPtr _triMeshData { get; private set; } private IntPtr _linkJointGroup = IntPtr.Zero; @@ -325,14 +333,11 @@ namespace OpenSim.Region.Physics.OdePlugin { prim_geom = geom; //Console.WriteLine("SetGeom to " + prim_geom + " for " + Name); - if (prim_geom != IntPtr.Zero) - { - d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories); - d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags); - _parent_scene.geom_name_map[prim_geom] = Name; - _parent_scene.actor_name_map[prim_geom] = this; - } + d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories); + d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags); + + _parent_scene.geom_name_map[prim_geom] = Name; if (childPrim) { @@ -765,11 +770,8 @@ namespace OpenSim.Region.Physics.OdePlugin m_collisionCategories &= ~CollisionCategories.Body; m_collisionFlags &= ~(CollisionCategories.Wind | CollisionCategories.Land); - if (prim_geom != IntPtr.Zero) - { - d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories); - d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags); - } + d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories); + d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags); d.BodyDestroy(Body); lock (childrenPrim) @@ -793,11 +795,8 @@ namespace OpenSim.Region.Physics.OdePlugin m_collisionCategories &= ~CollisionCategories.Body; m_collisionFlags &= ~(CollisionCategories.Wind | CollisionCategories.Land); - if (prim_geom != IntPtr.Zero) - { - d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories); - d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags); - } + d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories); + d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags); Body = IntPtr.Zero; } @@ -864,10 +863,7 @@ namespace OpenSim.Region.Physics.OdePlugin // _parent_scene.waitForSpaceUnlock(m_targetSpace); try { - if (prim_geom == IntPtr.Zero) - { - SetGeom(d.CreateTriMesh(m_targetSpace, _triMeshData, parent_scene.triCallback, null, null)); - } + SetGeom(d.CreateTriMesh(m_targetSpace, _triMeshData, parent_scene.triCallback, null, null)); } catch (AccessViolationException) { @@ -890,73 +886,67 @@ namespace OpenSim.Region.Physics.OdePlugin #if SPAM Console.WriteLine("ZProcessTaints for " + Name); #endif + + // This must be processed as the very first taint so that later operations have a prim_geom to work with + // if this is a new prim. if (m_taintadd) - { changeadd(); - } - - if (prim_geom != IntPtr.Zero) - { - if (!_position.ApproxEquals(m_taintposition, 0f)) - changemove(); - if (m_taintrot != _orientation) - { - if (childPrim && IsPhysical) // For physical child prim... - { - rotate(); - // KF: ODE will also rotate the parent prim! - // so rotate the root back to where it was - OdePrim parent = (OdePrim)_parent; - parent.rotate(); - } - else - { - //Just rotate the prim - rotate(); - } + if (!_position.ApproxEquals(m_taintposition, 0f)) + changemove(); + + if (m_taintrot != _orientation) + { + if (childPrim && IsPhysical) // For physical child prim... + { + rotate(); + // KF: ODE will also rotate the parent prim! + // so rotate the root back to where it was + OdePrim parent = (OdePrim)_parent; + parent.rotate(); + } + else + { + //Just rotate the prim + rotate(); } - - if (m_taintPhysics != IsPhysical && !(m_taintparent != _parent)) - changePhysicsStatus(); - - if (!_size.ApproxEquals(m_taintsize, 0f)) - changesize(); - - if (m_taintshape) - changeshape(); - - if (m_taintforce) - changeAddForce(); - - if (m_taintaddangularforce) - changeAddAngularForce(); - - if (!m_taintTorque.ApproxEquals(Vector3.Zero, 0.001f)) - changeSetTorque(); - - if (m_taintdisable) - changedisable(); - - if (m_taintselected != m_isSelected) - changeSelectedStatus(); - - if (!m_taintVelocity.ApproxEquals(Vector3.Zero, 0.001f)) - changevelocity(); - - if (m_taintparent != _parent) - changelink(); - - if (m_taintCollidesWater != m_collidesWater) - changefloatonwater(); - - if (!m_angularlock.ApproxEquals(m_taintAngularLock,0f)) - changeAngularLock(); - } - else - { - m_log.ErrorFormat("[PHYSICS]: The scene reused a disposed PhysActor for {0}! *waves finger*, Don't be evil. A couple of things can cause this. An improper prim breakdown(be sure to set prim_geom to zero after d.GeomDestroy! An improper buildup (creating the geom failed). Or, the Scene Reused a physics actor after disposing it.)", Name); } + + if (m_taintPhysics != IsPhysical && !(m_taintparent != _parent)) + changePhysicsStatus(); + + if (!_size.ApproxEquals(m_taintsize, 0f)) + changesize(); + + if (m_taintshape) + changeshape(); + + if (m_taintforce) + changeAddForce(); + + if (m_taintaddangularforce) + changeAddAngularForce(); + + if (!m_taintTorque.ApproxEquals(Vector3.Zero, 0.001f)) + changeSetTorque(); + + if (m_taintdisable) + changedisable(); + + if (m_taintselected != m_isSelected) + changeSelectedStatus(); + + if (!m_taintVelocity.ApproxEquals(Vector3.Zero, 0.001f)) + changevelocity(); + + if (m_taintparent != _parent) + changelink(); + + if (m_taintCollidesWater != m_collidesWater) + changefloatonwater(); + + if (!m_angularlock.ApproxEquals(m_taintAngularLock,0f)) + changeAngularLock(); } /// @@ -1093,18 +1083,10 @@ Console.WriteLine("ZProcessTaints for " + Name); prm.m_collisionCategories |= CollisionCategories.Body; prm.m_collisionFlags |= (CollisionCategories.Land | CollisionCategories.Wind); - if (prm.prim_geom == IntPtr.Zero) - { - m_log.WarnFormat( - "[PHYSICS]: Unable to link one of the linkset elements {0} for parent {1}. No geom yet", - prm.Name, prim.Name); - continue; - } //Console.WriteLine(" GeomSetCategoryBits 1: " + prm.prim_geom + " - " + (int)prm.m_collisionCategories + " for " + Name); d.GeomSetCategoryBits(prm.prim_geom, (int)prm.m_collisionCategories); d.GeomSetCollideBits(prm.prim_geom, (int)prm.m_collisionFlags); - d.Quaternion quat = new d.Quaternion(); quat.W = prm._orientation.W; quat.X = prm._orientation.X; @@ -1303,11 +1285,8 @@ Console.WriteLine("ZProcessTaints for " + Name); disableBodySoft(); } - if (prim_geom != IntPtr.Zero) - { - d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories); - d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags); - } + d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories); + d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags); if (IsPhysical) { @@ -1328,11 +1307,8 @@ Console.WriteLine("ZProcessTaints for " + Name); if (m_collidesWater) m_collisionFlags |= CollisionCategories.Water; - if (prim_geom != IntPtr.Zero) - { - d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories); - d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags); - } + d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories); + d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags); if (IsPhysical) { @@ -1472,6 +1448,9 @@ Console.WriteLine("CreateGeom:"); } else { + m_log.WarnFormat( + "[ODE PRIM]: Called RemoveGeom() on {0} {1} where geometry was already null.", Name, LocalID); + return false; } } @@ -1505,16 +1484,13 @@ Console.WriteLine("changeadd 1"); #endif CreateGeom(m_targetSpace, mesh); - if (prim_geom != IntPtr.Zero) - { - d.GeomSetPosition(prim_geom, _position.X, _position.Y, _position.Z); - d.Quaternion myrot = new d.Quaternion(); - myrot.X = _orientation.X; - myrot.Y = _orientation.Y; - myrot.Z = _orientation.Z; - myrot.W = _orientation.W; - d.GeomSetQuaternion(prim_geom, ref myrot); - } + d.GeomSetPosition(prim_geom, _position.X, _position.Y, _position.Z); + d.Quaternion myrot = new d.Quaternion(); + myrot.X = _orientation.X; + myrot.Y = _orientation.Y; + myrot.Z = _orientation.Z; + myrot.W = _orientation.W; + d.GeomSetQuaternion(prim_geom, ref myrot); if (IsPhysical && Body == IntPtr.Zero) enableBody(); @@ -1588,13 +1564,11 @@ Console.WriteLine(" JointCreateFixed"); m_targetSpace = tempspace; // _parent_scene.waitForSpaceUnlock(m_targetSpace); - if (prim_geom != IntPtr.Zero) - { - d.GeomSetPosition(prim_geom, _position.X, _position.Y, _position.Z); + + d.GeomSetPosition(prim_geom, _position.X, _position.Y, _position.Z); // _parent_scene.waitForSpaceUnlock(m_targetSpace); - d.SpaceAdd(m_targetSpace, prim_geom); - } + d.SpaceAdd(m_targetSpace, prim_geom); changeSelectedStatus(); @@ -2045,18 +2019,16 @@ Console.WriteLine(" JointCreateFixed"); { m_collidesWater = m_taintCollidesWater; - if (prim_geom != IntPtr.Zero) + if (m_collidesWater) { - if (m_collidesWater) - { - m_collisionFlags |= CollisionCategories.Water; - } - else - { - m_collisionFlags &= ~CollisionCategories.Water; - } - d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags); + m_collisionFlags |= CollisionCategories.Water; } + else + { + m_collisionFlags &= ~CollisionCategories.Water; + } + + d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags); } /// From 06552f217ebd9301fd487c788a13fd75d61a46de Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Sat, 21 Apr 2012 00:54:48 +0100 Subject: [PATCH 056/547] Add TestSetPhysics() to SOP status tests --- .../Framework/Scenes/SceneObjectPart.cs | 9 ++++++--- .../Scenes/Tests/SceneObjectStatusTests.cs | 20 +++++++++++++++++++ OpenSim/Tests/Common/Helpers/SceneHelpers.cs | 2 +- 3 files changed, 27 insertions(+), 4 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index 046553ba6a..d2cd37dc8d 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs @@ -1706,6 +1706,9 @@ namespace OpenSim.Region.Framework.Scenes /// public void DoPhysicsPropertyUpdate(bool UsePhysics, bool isNew) { + if (ParentGroup.Scene == null) + return; + if (!ParentGroup.Scene.PhysicalPrims && UsePhysics) return; @@ -4161,7 +4164,7 @@ namespace OpenSim.Region.Framework.Scenes // For now, we use the NINJA naming scheme for identifying joints. // In the future, we can support other joint specification schemes such as a // custom checkbox in the viewer GUI. - if (ParentGroup.Scene.PhysicsScene.SupportsNINJAJoints) + if (ParentGroup.Scene != null && ParentGroup.Scene.PhysicsScene.SupportsNINJAJoints) { string hingeString = "hingejoint"; return (Name.Length >= hingeString.Length && Name.Substring(0, hingeString.Length) == hingeString); @@ -4177,7 +4180,7 @@ namespace OpenSim.Region.Framework.Scenes // For now, we use the NINJA naming scheme for identifying joints. // In the future, we can support other joint specification schemes such as a // custom checkbox in the viewer GUI. - if (ParentGroup.Scene.PhysicsScene.SupportsNINJAJoints) + if (ParentGroup.Scene != null && ParentGroup.Scene.PhysicsScene.SupportsNINJAJoints) { string ballString = "balljoint"; return (Name.Length >= ballString.Length && Name.Substring(0, ballString.Length) == ballString); @@ -4193,7 +4196,7 @@ namespace OpenSim.Region.Framework.Scenes // For now, we use the NINJA naming scheme for identifying joints. // In the future, we can support other joint specification schemes such as a // custom checkbox in the viewer GUI. - if (ParentGroup.Scene.PhysicsScene.SupportsNINJAJoints) + if (ParentGroup.Scene != null && ParentGroup.Scene.PhysicsScene.SupportsNINJAJoints) { return IsHingeJoint() || IsBallJoint(); } diff --git a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectStatusTests.cs b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectStatusTests.cs index 2a342d50c8..16e8b63378 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectStatusTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectStatusTests.cs @@ -62,5 +62,25 @@ namespace OpenSim.Region.Framework.Scenes.Tests Assert.That(rootPart.Flags, Is.EqualTo(PrimFlags.None)); } + + [Test] + public void TestSetPhysics() + { + TestHelpers.InMethod(); + +// Scene scene = SceneSetupHelpers.SetupScene(); + SceneObjectGroup so = SceneHelpers.CreateSceneObject(1, UUID.Zero); + SceneObjectPart rootPart = so.RootPart; + Assert.That(rootPart.Flags, Is.EqualTo(PrimFlags.None)); + + so.ScriptSetPhysicsStatus(true); + +// Console.WriteLine("so.RootPart.Flags [{0}]", so.RootPart.Flags); + Assert.That(rootPart.Flags, Is.EqualTo(PrimFlags.Physics)); + + so.ScriptSetPhysicsStatus(false); + + Assert.That(rootPart.Flags, Is.EqualTo(PrimFlags.None)); + } } } \ No newline at end of file diff --git a/OpenSim/Tests/Common/Helpers/SceneHelpers.cs b/OpenSim/Tests/Common/Helpers/SceneHelpers.cs index 318758d984..7a6b1cf8d5 100644 --- a/OpenSim/Tests/Common/Helpers/SceneHelpers.cs +++ b/OpenSim/Tests/Common/Helpers/SceneHelpers.cs @@ -153,7 +153,7 @@ namespace OpenSim.Tests.Common PhysicsPluginManager physicsPluginManager = new PhysicsPluginManager(); physicsPluginManager.LoadPluginsFromAssembly("Physics/OpenSim.Region.Physics.BasicPhysicsPlugin.dll"); testScene.PhysicsScene - = physicsPluginManager.GetPhysicsScene("basicphysics", "ZeroMesher", new IniConfigSource(), "test"); + = physicsPluginManager.GetPhysicsScene("basicphysics", "ZeroMesher", new IniConfigSource(), "test"); testScene.RegionInfo.EstateSettings = new EstateSettings(); testScene.LoginsDisabled = false; From 71900968b221b89860d1cef162f3b0d1236e1c73 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Sat, 21 Apr 2012 01:01:24 +0100 Subject: [PATCH 057/547] refactor: extract common setup code in SceneObjectStatusTests --- .../Scenes/Tests/SceneObjectStatusTests.cs | 26 ++++++++++++------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectStatusTests.cs b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectStatusTests.cs index 16e8b63378..b8e1b92c21 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectStatusTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectStatusTests.cs @@ -43,22 +43,30 @@ namespace OpenSim.Region.Framework.Scenes.Tests [TestFixture] public class SceneObjectStatusTests { + private TestScene m_scene; + private SceneObjectGroup m_so1; + + [SetUp] + public void Init() + { + m_scene = SceneHelpers.SetupScene(); + SceneObjectGroup m_so1 = SceneHelpers.CreateSceneObject(1, UUID.Zero); + } + [Test] public void TestSetPhantom() { TestHelpers.InMethod(); -// Scene scene = SceneSetupHelpers.SetupScene(); - SceneObjectGroup so = SceneHelpers.CreateSceneObject(1, UUID.Zero); - SceneObjectPart rootPart = so.RootPart; + SceneObjectPart rootPart = m_so1.RootPart; Assert.That(rootPart.Flags, Is.EqualTo(PrimFlags.None)); - so.ScriptSetPhantomStatus(true); + m_so1.ScriptSetPhantomStatus(true); // Console.WriteLine("so.RootPart.Flags [{0}]", so.RootPart.Flags); Assert.That(rootPart.Flags, Is.EqualTo(PrimFlags.Phantom)); - so.ScriptSetPhantomStatus(false); + m_so1.ScriptSetPhantomStatus(false); Assert.That(rootPart.Flags, Is.EqualTo(PrimFlags.None)); } @@ -68,17 +76,15 @@ namespace OpenSim.Region.Framework.Scenes.Tests { TestHelpers.InMethod(); -// Scene scene = SceneSetupHelpers.SetupScene(); - SceneObjectGroup so = SceneHelpers.CreateSceneObject(1, UUID.Zero); - SceneObjectPart rootPart = so.RootPart; + SceneObjectPart rootPart = m_so1.RootPart; Assert.That(rootPart.Flags, Is.EqualTo(PrimFlags.None)); - so.ScriptSetPhysicsStatus(true); + m_so1.ScriptSetPhysicsStatus(true); // Console.WriteLine("so.RootPart.Flags [{0}]", so.RootPart.Flags); Assert.That(rootPart.Flags, Is.EqualTo(PrimFlags.Physics)); - so.ScriptSetPhysicsStatus(false); + m_so1.ScriptSetPhysicsStatus(false); Assert.That(rootPart.Flags, Is.EqualTo(PrimFlags.None)); } From 17bf2a62db39ba58ca691a6754bf79fe6b3ee474 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Sat, 21 Apr 2012 01:09:19 +0100 Subject: [PATCH 058/547] Add test for correct physics status on linking two physics objects Also fixes last build break. --- .../Scenes/Tests/SceneObjectStatusTests.cs | 28 +++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectStatusTests.cs b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectStatusTests.cs index b8e1b92c21..6270ac148d 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectStatusTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectStatusTests.cs @@ -26,6 +26,7 @@ */ using System; +using System.Collections.Generic; using System.Reflection; using NUnit.Framework; using OpenMetaverse; @@ -44,13 +45,16 @@ namespace OpenSim.Region.Framework.Scenes.Tests public class SceneObjectStatusTests { private TestScene m_scene; + private UUID m_ownerId = TestHelpers.ParseTail(0x1); private SceneObjectGroup m_so1; + private SceneObjectGroup m_so2; [SetUp] public void Init() { m_scene = SceneHelpers.SetupScene(); - SceneObjectGroup m_so1 = SceneHelpers.CreateSceneObject(1, UUID.Zero); + m_so1 = SceneHelpers.CreateSceneObject(1, m_ownerId, "so1", 0x10); + m_so2 = SceneHelpers.CreateSceneObject(1, m_ownerId, "so2", 0x20); } [Test] @@ -86,7 +90,27 @@ namespace OpenSim.Region.Framework.Scenes.Tests m_so1.ScriptSetPhysicsStatus(false); - Assert.That(rootPart.Flags, Is.EqualTo(PrimFlags.None)); + Assert.That(rootPart.Flags, Is.EqualTo(PrimFlags.None)); + } + + /// + /// Test that linking results in the correct physical status for all linkees. + /// + [Test] + public void TestLinkPhysicsBothPhysical() + { + TestHelpers.InMethod(); + + m_scene.AddSceneObject(m_so1); + m_scene.AddSceneObject(m_so2); + + m_so1.ScriptSetPhysicsStatus(true); + m_so2.ScriptSetPhysicsStatus(true); + + m_scene.LinkObjects(m_ownerId, m_so1.LocalId, new List() { m_so2.LocalId }); + + Assert.That(m_so1.RootPart.Flags, Is.EqualTo(PrimFlags.Physics)); + Assert.That(m_so1.Parts[1].Flags, Is.EqualTo(PrimFlags.Physics)); } } } \ No newline at end of file From 9ac48b2aff2ddd00821b7e6ecd71ce134f7a0f25 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Sat, 21 Apr 2012 01:43:09 +0100 Subject: [PATCH 059/547] Fix a bug where linking a non-physical prim with a physical prim as root would make the non-physical prim phantom rather than part of the physics object. On region restart, the whole object would become physical as expected. Observed behaviour from elsewhere is that all prims in a new linkset should take on the status of the root prim. Add regression test for this behaviour. --- .../Framework/Scenes/SceneObjectGroup.cs | 3 +++ .../Scenes/Tests/SceneObjectStatusTests.cs | 19 +++++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs index 8e786c150e..49a3485183 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs @@ -2010,6 +2010,7 @@ namespace OpenSim.Region.Framework.Scenes linkPart.CreateSelected = true; linkPart.LinkNum = linkNum++; + linkPart.UpdatePrimFlags(UsesPhysics, IsTemporary, IsPhantom, IsVolumeDetect); SceneObjectPart[] ogParts = objectGroup.Parts; Array.Sort(ogParts, delegate(SceneObjectPart a, SceneObjectPart b) @@ -2220,6 +2221,8 @@ namespace OpenSim.Region.Framework.Scenes oldRot = part.RotationOffset; Quaternion newRot = Quaternion.Inverse(parentRot) * oldRot; part.RotationOffset = newRot; + + part.UpdatePrimFlags(UsesPhysics, IsTemporary, IsPhantom, IsVolumeDetect); } /// diff --git a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectStatusTests.cs b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectStatusTests.cs index 6270ac148d..91f4a3433d 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectStatusTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectStatusTests.cs @@ -112,5 +112,24 @@ namespace OpenSim.Region.Framework.Scenes.Tests Assert.That(m_so1.RootPart.Flags, Is.EqualTo(PrimFlags.Physics)); Assert.That(m_so1.Parts[1].Flags, Is.EqualTo(PrimFlags.Physics)); } + + /// + /// Test that linking results in the correct physical status for all linkees. + /// + [Test] + public void TestLinkPhysicsRootPhysicalOnly() + { + TestHelpers.InMethod(); + + m_scene.AddSceneObject(m_so1); + m_scene.AddSceneObject(m_so2); + + m_so1.ScriptSetPhysicsStatus(true); + + m_scene.LinkObjects(m_ownerId, m_so1.LocalId, new List() { m_so2.LocalId }); + + Assert.That(m_so1.RootPart.Flags, Is.EqualTo(PrimFlags.Physics)); + Assert.That(m_so1.Parts[1].Flags, Is.EqualTo(PrimFlags.Physics)); + } } } \ No newline at end of file From d5c724e5b8cc15ce278b80070238e72a2e4ea0e8 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Sat, 21 Apr 2012 01:51:57 +0100 Subject: [PATCH 060/547] Add regression test for prim status when root prim in a new linkset is non-physical --- .../Framework/Scenes/SceneObjectPart.cs | 2 +- .../Scenes/Tests/SceneObjectStatusTests.cs | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index d2cd37dc8d..1592131dc2 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs @@ -1708,7 +1708,7 @@ namespace OpenSim.Region.Framework.Scenes { if (ParentGroup.Scene == null) return; - + if (!ParentGroup.Scene.PhysicalPrims && UsePhysics) return; diff --git a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectStatusTests.cs b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectStatusTests.cs index 91f4a3433d..8cdd64507e 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectStatusTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectStatusTests.cs @@ -131,5 +131,24 @@ namespace OpenSim.Region.Framework.Scenes.Tests Assert.That(m_so1.RootPart.Flags, Is.EqualTo(PrimFlags.Physics)); Assert.That(m_so1.Parts[1].Flags, Is.EqualTo(PrimFlags.Physics)); } + + /// + /// Test that linking results in the correct physical status for all linkees. + /// + [Test] + public void TestLinkPhysicsChildPhysicalOnly() + { + TestHelpers.InMethod(); + + m_scene.AddSceneObject(m_so1); + m_scene.AddSceneObject(m_so2); + + m_so2.ScriptSetPhysicsStatus(true); + + m_scene.LinkObjects(m_ownerId, m_so1.LocalId, new List() { m_so2.LocalId }); + + Assert.That(m_so1.RootPart.Flags, Is.EqualTo(PrimFlags.None)); + Assert.That(m_so1.Parts[1].Flags, Is.EqualTo(PrimFlags.None)); + } } } \ No newline at end of file From 77a7de87e1c89385bc906d1b409ec1c94c41b9e6 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Sat, 21 Apr 2012 02:45:16 +0100 Subject: [PATCH 061/547] Add test for setting physics in a linkset --- .../Scenes/Tests/SceneObjectStatusTests.cs | 30 +++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectStatusTests.cs b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectStatusTests.cs index 8cdd64507e..882031c782 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectStatusTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectStatusTests.cs @@ -58,7 +58,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests } [Test] - public void TestSetPhantom() + public void TestSetPhantomSinglePrim() { TestHelpers.InMethod(); @@ -76,7 +76,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests } [Test] - public void TestSetPhysics() + public void TestSetPhysicsSinglePrim() { TestHelpers.InMethod(); @@ -92,6 +92,32 @@ namespace OpenSim.Region.Framework.Scenes.Tests Assert.That(rootPart.Flags, Is.EqualTo(PrimFlags.None)); } + + [Test] + public void TestSetPhysicsLinkset() + { + TestHelpers.InMethod(); + + m_scene.AddSceneObject(m_so1); + m_scene.AddSceneObject(m_so2); + + m_scene.LinkObjects(m_ownerId, m_so1.LocalId, new List() { m_so2.LocalId }); + + m_so1.ScriptSetPhysicsStatus(true); + + Assert.That(m_so1.RootPart.Flags, Is.EqualTo(PrimFlags.Physics)); + Assert.That(m_so1.Parts[1].Flags, Is.EqualTo(PrimFlags.Physics)); + + m_so1.ScriptSetPhysicsStatus(false); + + Assert.That(m_so1.RootPart.Flags, Is.EqualTo(PrimFlags.None)); + Assert.That(m_so1.Parts[1].Flags, Is.EqualTo(PrimFlags.None)); + + m_so1.ScriptSetPhysicsStatus(true); + + Assert.That(m_so1.RootPart.Flags, Is.EqualTo(PrimFlags.Physics)); + Assert.That(m_so1.Parts[1].Flags, Is.EqualTo(PrimFlags.Physics)); + } /// /// Test that linking results in the correct physical status for all linkees. From f60959459574b1473dbe35d780aa0fbe4d688580 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Sat, 21 Apr 2012 03:23:51 +0100 Subject: [PATCH 062/547] refactor: Simplify ODEPrim.AddChildPrim() by returning early where appropriate. --- OpenSim/Region/Physics/OdePlugin/ODEPrim.cs | 224 ++++++++++---------- 1 file changed, 113 insertions(+), 111 deletions(-) diff --git a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs index 0a8cf75bcd..cbb49ace54 100644 --- a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs +++ b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs @@ -1042,142 +1042,144 @@ Console.WriteLine("ZProcessTaints for " + Name); /// Child prim private void AddChildPrim(OdePrim prim) { -//Console.WriteLine("AddChildPrim " + Name); - if (LocalID != prim.LocalID) + if (LocalID == prim.LocalID) + return; + + if (Body == IntPtr.Zero) { - if (Body == IntPtr.Zero) - { - Body = d.BodyCreate(_parent_scene.world); - setMass(); - } - if (Body != IntPtr.Zero) - { - lock (childrenPrim) - { - if (!childrenPrim.Contains(prim)) - { + Body = d.BodyCreate(_parent_scene.world); + setMass(); + } + + lock (childrenPrim) + { + if (childrenPrim.Contains(prim)) + return; + //Console.WriteLine("childrenPrim.Add " + prim); - childrenPrim.Add(prim); - - foreach (OdePrim prm in childrenPrim) - { - d.Mass m2; - d.MassSetZero(out m2); - d.MassSetBoxTotal(out m2, prim.CalculateMass(), prm._size.X, prm._size.Y, prm._size.Z); + childrenPrim.Add(prim); - d.Quaternion quat = new d.Quaternion(); - quat.W = prm._orientation.W; - quat.X = prm._orientation.X; - quat.Y = prm._orientation.Y; - quat.Z = prm._orientation.Z; + foreach (OdePrim prm in childrenPrim) + { + d.Mass m2; + d.MassSetZero(out m2); + d.MassSetBoxTotal(out m2, prim.CalculateMass(), prm._size.X, prm._size.Y, prm._size.Z); - d.Matrix3 mat = new d.Matrix3(); - d.RfromQ(out mat, ref quat); - d.MassRotate(ref m2, ref mat); - d.MassTranslate(ref m2, Position.X - prm.Position.X, Position.Y - prm.Position.Y, Position.Z - prm.Position.Z); - d.MassAdd(ref pMass, ref m2); - } - - foreach (OdePrim prm in childrenPrim) - { - prm.m_collisionCategories |= CollisionCategories.Body; - prm.m_collisionFlags |= (CollisionCategories.Land | CollisionCategories.Wind); + d.Quaternion quat = new d.Quaternion(); + quat.W = prm._orientation.W; + quat.X = prm._orientation.X; + quat.Y = prm._orientation.Y; + quat.Z = prm._orientation.Z; + + d.Matrix3 mat = new d.Matrix3(); + d.RfromQ(out mat, ref quat); + d.MassRotate(ref m2, ref mat); + d.MassTranslate(ref m2, Position.X - prm.Position.X, Position.Y - prm.Position.Y, Position.Z - prm.Position.Z); + d.MassAdd(ref pMass, ref m2); + } + + foreach (OdePrim prm in childrenPrim) + { + prm.m_collisionCategories |= CollisionCategories.Body; + prm.m_collisionFlags |= (CollisionCategories.Land | CollisionCategories.Wind); //Console.WriteLine(" GeomSetCategoryBits 1: " + prm.prim_geom + " - " + (int)prm.m_collisionCategories + " for " + Name); - d.GeomSetCategoryBits(prm.prim_geom, (int)prm.m_collisionCategories); - d.GeomSetCollideBits(prm.prim_geom, (int)prm.m_collisionFlags); + d.GeomSetCategoryBits(prm.prim_geom, (int)prm.m_collisionCategories); + d.GeomSetCollideBits(prm.prim_geom, (int)prm.m_collisionFlags); - d.Quaternion quat = new d.Quaternion(); - quat.W = prm._orientation.W; - quat.X = prm._orientation.X; - quat.Y = prm._orientation.Y; - quat.Z = prm._orientation.Z; + d.Quaternion quat = new d.Quaternion(); + quat.W = prm._orientation.W; + quat.X = prm._orientation.X; + quat.Y = prm._orientation.Y; + quat.Z = prm._orientation.Z; - d.Matrix3 mat = new d.Matrix3(); - d.RfromQ(out mat, ref quat); - if (Body != IntPtr.Zero) - { - d.GeomSetBody(prm.prim_geom, Body); - prm.childPrim = true; - d.GeomSetOffsetWorldPosition(prm.prim_geom, prm.Position.X , prm.Position.Y, prm.Position.Z); - //d.GeomSetOffsetPosition(prim.prim_geom, - // (Position.X - prm.Position.X) - pMass.c.X, - // (Position.Y - prm.Position.Y) - pMass.c.Y, - // (Position.Z - prm.Position.Z) - pMass.c.Z); - d.GeomSetOffsetWorldRotation(prm.prim_geom, ref mat); - //d.GeomSetOffsetRotation(prm.prim_geom, ref mat); - d.MassTranslate(ref pMass, -pMass.c.X, -pMass.c.Y, -pMass.c.Z); - d.BodySetMass(Body, ref pMass); - } - else - { - m_log.DebugFormat("[PHYSICS]: {0} ain't got no boooooooooddy, no body", Name); - } + d.Matrix3 mat = new d.Matrix3(); + d.RfromQ(out mat, ref quat); + if (Body != IntPtr.Zero) + { + d.GeomSetBody(prm.prim_geom, Body); + prm.childPrim = true; + d.GeomSetOffsetWorldPosition(prm.prim_geom, prm.Position.X , prm.Position.Y, prm.Position.Z); + //d.GeomSetOffsetPosition(prim.prim_geom, + // (Position.X - prm.Position.X) - pMass.c.X, + // (Position.Y - prm.Position.Y) - pMass.c.Y, + // (Position.Z - prm.Position.Z) - pMass.c.Z); + d.GeomSetOffsetWorldRotation(prm.prim_geom, ref mat); + //d.GeomSetOffsetRotation(prm.prim_geom, ref mat); + d.MassTranslate(ref pMass, -pMass.c.X, -pMass.c.Y, -pMass.c.Z); + d.BodySetMass(Body, ref pMass); + } + else + { + m_log.DebugFormat("[PHYSICS]: {0} ain't got no boooooooooddy, no body", Name); + } - prm.m_interpenetrationcount = 0; - prm.m_collisionscore = 0; - prm.m_disabled = false; + prm.m_interpenetrationcount = 0; + prm.m_collisionscore = 0; + prm.m_disabled = false; - // The body doesn't already have a finite rotation mode set here - if ((!m_angularlock.ApproxEquals(Vector3.Zero, 0f)) && _parent == null) - { - prm.createAMotor(m_angularlock); - } - prm.Body = Body; - _parent_scene.ActivatePrim(prm); - } + // The body doesn't already have a finite rotation mode set here + if ((!m_angularlock.ApproxEquals(Vector3.Zero, 0f)) && _parent == null) + { + prm.createAMotor(m_angularlock); + } + prm.Body = Body; + _parent_scene.ActivatePrim(prm); + } - m_collisionCategories |= CollisionCategories.Body; - m_collisionFlags |= (CollisionCategories.Land | CollisionCategories.Wind); + m_collisionCategories |= CollisionCategories.Body; + m_collisionFlags |= (CollisionCategories.Land | CollisionCategories.Wind); //Console.WriteLine("GeomSetCategoryBits 2: " + prim_geom + " - " + (int)m_collisionCategories + " for " + Name); - d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories); + d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories); //Console.WriteLine(" Post GeomSetCategoryBits 2"); - d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags); + d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags); - d.Quaternion quat2 = new d.Quaternion(); - quat2.W = _orientation.W; - quat2.X = _orientation.X; - quat2.Y = _orientation.Y; - quat2.Z = _orientation.Z; + d.Quaternion quat2 = new d.Quaternion(); + quat2.W = _orientation.W; + quat2.X = _orientation.X; + quat2.Y = _orientation.Y; + quat2.Z = _orientation.Z; - d.Matrix3 mat2 = new d.Matrix3(); - d.RfromQ(out mat2, ref quat2); - d.GeomSetBody(prim_geom, Body); - d.GeomSetOffsetWorldPosition(prim_geom, Position.X - pMass.c.X, Position.Y - pMass.c.Y, Position.Z - pMass.c.Z); - //d.GeomSetOffsetPosition(prim.prim_geom, - // (Position.X - prm.Position.X) - pMass.c.X, - // (Position.Y - prm.Position.Y) - pMass.c.Y, - // (Position.Z - prm.Position.Z) - pMass.c.Z); - //d.GeomSetOffsetRotation(prim_geom, ref mat2); - d.MassTranslate(ref pMass, -pMass.c.X, -pMass.c.Y, -pMass.c.Z); - d.BodySetMass(Body, ref pMass); + d.Matrix3 mat2 = new d.Matrix3(); + d.RfromQ(out mat2, ref quat2); + d.GeomSetBody(prim_geom, Body); + d.GeomSetOffsetWorldPosition(prim_geom, Position.X - pMass.c.X, Position.Y - pMass.c.Y, Position.Z - pMass.c.Z); + //d.GeomSetOffsetPosition(prim.prim_geom, + // (Position.X - prm.Position.X) - pMass.c.X, + // (Position.Y - prm.Position.Y) - pMass.c.Y, + // (Position.Z - prm.Position.Z) - pMass.c.Z); + //d.GeomSetOffsetRotation(prim_geom, ref mat2); + d.MassTranslate(ref pMass, -pMass.c.X, -pMass.c.Y, -pMass.c.Z); + d.BodySetMass(Body, ref pMass); - d.BodySetAutoDisableFlag(Body, true); - d.BodySetAutoDisableSteps(Body, body_autodisable_frames); + d.BodySetAutoDisableFlag(Body, true); + d.BodySetAutoDisableSteps(Body, body_autodisable_frames); - m_interpenetrationcount = 0; - m_collisionscore = 0; - m_disabled = false; + m_interpenetrationcount = 0; + m_collisionscore = 0; + m_disabled = false; - // The body doesn't already have a finite rotation mode set here - if ((!m_angularlock.ApproxEquals(Vector3.Zero, 0f)) && _parent == null) - { - createAMotor(m_angularlock); - } - d.BodySetPosition(Body, Position.X, Position.Y, Position.Z); - if (m_vehicle.Type != Vehicle.TYPE_NONE) - m_vehicle.Enable(Body, _parent_scene); - - _parent_scene.ActivatePrim(this); - } - } + // The body doesn't already have a finite rotation mode set here + if ((!m_angularlock.ApproxEquals(Vector3.Zero, 0f)) && _parent == null) + { + createAMotor(m_angularlock); } + + d.BodySetPosition(Body, Position.X, Position.Y, Position.Z); + + if (m_vehicle.Type != Vehicle.TYPE_NONE) + m_vehicle.Enable(Body, _parent_scene); + + _parent_scene.ActivatePrim(this); } } private void ChildSetGeom(OdePrim odePrim) { +// m_log.DebugFormat( +// "[ODE PRIM]: ChildSetGeom {0} {1} for {2} {3}", odePrim.Name, odePrim.LocalID, Name, LocalID); + //if (IsPhysical && Body != IntPtr.Zero) lock (childrenPrim) { From ae2b8f70074e4dfe2cbbd03dd543c7468fc50cc1 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Sat, 21 Apr 2012 03:42:54 +0100 Subject: [PATCH 063/547] Comment out spurious Body != IntPtr.Zero code after disableBody(), since disableBody() sets Body == IntPtr.Zero on all code paths. --- OpenSim/Region/Physics/OdePlugin/ODEPrim.cs | 27 +++++++++++++------- OpenSim/Region/Physics/OdePlugin/OdeScene.cs | 3 ++- 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs index cbb49ace54..3f88353453 100644 --- a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs +++ b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs @@ -1056,7 +1056,9 @@ Console.WriteLine("ZProcessTaints for " + Name); if (childrenPrim.Contains(prim)) return; -//Console.WriteLine("childrenPrim.Add " + prim); +// m_log.DebugFormat( +// "[ODE PRIM]: Linking prim {0} {1} to {2} {3}", prim.Name, prim.LocalID, Name, LocalID); + childrenPrim.Add(prim); foreach (OdePrim prm in childrenPrim) @@ -1194,12 +1196,14 @@ Console.WriteLine("ZProcessTaints for " + Name); //prm.childPrim = false; } } + disableBody(); - if (Body != IntPtr.Zero) - { - _parent_scene.DeactivatePrim(this); - } + // Spurious - Body == IntPtr.Zero after disableBody() +// if (Body != IntPtr.Zero) +// { +// _parent_scene.DeactivatePrim(this); +// } lock (childrenPrim) { @@ -1213,6 +1217,9 @@ Console.WriteLine("ZProcessTaints for " + Name); private void ChildDelink(OdePrim odePrim) { +// m_log.DebugFormat( +// "[ODE PRIM]: Delinking prim {0} {1} from {2} {3}", odePrim.Name, odePrim.LocalID, Name, LocalID); + // Okay, we have a delinked child.. need to rebuild the body. lock (childrenPrim) { @@ -1227,6 +1234,7 @@ Console.WriteLine("ZProcessTaints for " + Name); //prm.childPrim = false; } } + disableBody(); lock (childrenPrim) @@ -1235,10 +1243,11 @@ Console.WriteLine("ZProcessTaints for " + Name); childrenPrim.Remove(odePrim); } - if (Body != IntPtr.Zero) - { - _parent_scene.DeactivatePrim(this); - } + // Spurious - Body == IntPtr.Zero after disableBody() +// if (Body != IntPtr.Zero) +// { +// _parent_scene.DeactivatePrim(this); +// } lock (childrenPrim) { diff --git a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs index 842ff916dc..409b27be02 100644 --- a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs +++ b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs @@ -2226,7 +2226,8 @@ namespace OpenSim.Region.Physics.OdePlugin /// internal void RemovePrimThreadLocked(OdePrim prim) { -//Console.WriteLine("RemovePrimThreadLocked " + prim.m_primName); +// m_log.DebugFormat("[ODE SCENE]: Removing physical prim {0} {1}", prim.Name, prim.LocalID); + lock (prim) { RemoveCollisionEventReporting(prim); From 8205fe79ceaeebd31509a044005bf27d226dbe07 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Sun, 22 Apr 2012 19:51:51 +0100 Subject: [PATCH 064/547] Fix bug where setting phantom on a prim would result in a server log message rather than setting phantom. This was an oversight when removing some race conditions from PhysicsActor setting recently. Regression tests extended to probe this code path. Extending regression tests required implementation of a BasicPhysicsPrim (there was none before). However, BasicPhysics plugin is still of no current practical use other than to fill in as a component for other parts of regression testing. --- .../World/Archiver/Tests/ArchiverTests.cs | 4 +- OpenSim/Region/Framework/Scenes/Scene.cs | 14 +- .../Framework/Scenes/SceneObjectPart.cs | 9 +- .../Scenes/Tests/SceneObjectStatusTests.cs | 2 + .../BasicPhysicsPlugin/BasicPhysicsPrim.cs | 344 ++++++++++++++++++ .../BasicPhysicsPlugin/BasicPhysicsScene.cs | 43 ++- 6 files changed, 383 insertions(+), 33 deletions(-) create mode 100644 OpenSim/Region/Physics/BasicPhysicsPlugin/BasicPhysicsPrim.cs diff --git a/OpenSim/Region/CoreModules/World/Archiver/Tests/ArchiverTests.cs b/OpenSim/Region/CoreModules/World/Archiver/Tests/ArchiverTests.cs index 63f1363729..e05e8f677a 100644 --- a/OpenSim/Region/CoreModules/World/Archiver/Tests/ArchiverTests.cs +++ b/OpenSim/Region/CoreModules/World/Archiver/Tests/ArchiverTests.cs @@ -102,9 +102,9 @@ namespace OpenSim.Region.CoreModules.World.Archiver.Tests PrimitiveBaseShape shape = PrimitiveBaseShape.CreateSphere(); Vector3 groupPosition = new Vector3(10, 20, 30); Quaternion rotationOffset = new Quaternion(20, 30, 40, 50); - Vector3 offsetPosition = new Vector3(5, 10, 15); +// Vector3 offsetPosition = new Vector3(5, 10, 15); - return new SceneObjectPart(ownerId, shape, groupPosition, rotationOffset, offsetPosition) { Name = partName }; + return new SceneObjectPart(ownerId, shape, groupPosition, rotationOffset, Vector3.Zero) { Name = partName }; } protected SceneObjectPart CreateSceneObjectPart2() diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index e488fe151a..a87dfb7d0f 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -684,8 +684,8 @@ namespace OpenSim.Region.Framework.Scenes //Animation states m_useFlySlow = startupConfig.GetBoolean("enableflyslow", false); - PhysicalPrims = startupConfig.GetBoolean("physical_prim", true); - CollidablePrims = startupConfig.GetBoolean("collidable_prim", true); + PhysicalPrims = startupConfig.GetBoolean("physical_prim", PhysicalPrims); + CollidablePrims = startupConfig.GetBoolean("collidable_prim", CollidablePrims); m_maxNonphys = startupConfig.GetFloat("NonphysicalPrimMax", m_maxNonphys); if (RegionInfo.NonphysPrimMax > 0) @@ -800,13 +800,11 @@ namespace OpenSim.Region.Framework.Scenes StatsReporter.OnStatsIncorrect += m_sceneGraph.RecalculateStats; } - /// - /// Mock constructor for scene group persistency unit tests. - /// SceneObjectGroup RegionId property is delegated to Scene. - /// - /// public Scene(RegionInfo regInfo) { + PhysicalPrims = true; + CollidablePrims = true; + BordersLocked = true; Border northBorder = new Border(); northBorder.BorderLine = new Vector3(float.MinValue, float.MaxValue, (int)Constants.RegionSize); //<--- @@ -833,8 +831,6 @@ namespace OpenSim.Region.Framework.Scenes m_eventManager = new EventManager(); m_permissions = new ScenePermissions(this); - -// m_lastUpdate = Util.EnvironmentTickCount(); } #endregion diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index 1592131dc2..4bec2d4157 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs @@ -4290,7 +4290,10 @@ namespace OpenSim.Region.Framework.Scenes AddFlag(PrimFlags.Phantom); if (PhysActor != null) + { RemoveFromPhysics(); + pa = null; + } } else // Not phantom { @@ -4356,7 +4359,7 @@ namespace OpenSim.Region.Framework.Scenes { pa.SetVolumeDetect(1); AddFlag(PrimFlags.Phantom); // We set this flag also if VD is active - this.VolumeDetectActive = true; + VolumeDetectActive = true; } } else @@ -4364,9 +4367,9 @@ namespace OpenSim.Region.Framework.Scenes // Remove VolumeDetect in any case. Note, it's safe to call SetVolumeDetect as often as you like // (mumbles, well, at least if you have infinte CPU powers :-)) if (pa != null) - PhysActor.SetVolumeDetect(0); + pa.SetVolumeDetect(0); - this.VolumeDetectActive = false; + VolumeDetectActive = false; } if (SetTemporary) diff --git a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectStatusTests.cs b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectStatusTests.cs index 882031c782..51751ef92b 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectStatusTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectStatusTests.cs @@ -62,6 +62,8 @@ namespace OpenSim.Region.Framework.Scenes.Tests { TestHelpers.InMethod(); + m_scene.AddSceneObject(m_so1); + SceneObjectPart rootPart = m_so1.RootPart; Assert.That(rootPart.Flags, Is.EqualTo(PrimFlags.None)); diff --git a/OpenSim/Region/Physics/BasicPhysicsPlugin/BasicPhysicsPrim.cs b/OpenSim/Region/Physics/BasicPhysicsPlugin/BasicPhysicsPrim.cs new file mode 100644 index 0000000000..ba7fe1e7bb --- /dev/null +++ b/OpenSim/Region/Physics/BasicPhysicsPlugin/BasicPhysicsPrim.cs @@ -0,0 +1,344 @@ +/* + * Copyright (c) Contributors, http://opensimulator.org/ + * See CONTRIBUTORS.TXT for a full list of copyright holders. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the OpenSimulator Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using System; +using System.Collections.Generic; +using Nini.Config; +using OpenMetaverse; +using OpenSim.Framework; +using OpenSim.Region.Physics.Manager; + +namespace OpenSim.Region.Physics.BasicPhysicsPlugin +{ + public class BasicPhysicsPrim : PhysicsActor + { + private Vector3 _position; + private Vector3 _velocity; + private Vector3 _acceleration; + private Vector3 _size; + private PrimitiveBaseShape _shape; + private Vector3 m_rotationalVelocity; + private bool flying; + private bool iscolliding; + + public BasicPhysicsPrim( + string name, uint localId, Vector3 position, Vector3 size, Quaternion orientation, PrimitiveBaseShape shape) + { + Name = name; + LocalID = localId; + Position = position; + Size = size; + Orientation = orientation; + Shape = shape; + } + + public override int PhysicsActorType + { + get { return (int) ActorTypes.Agent; } + set { return; } + } + + public override Vector3 RotationalVelocity + { + get { return m_rotationalVelocity; } + set { m_rotationalVelocity = value; } + } + + public override bool SetAlwaysRun + { + get { return false; } + set { return; } + } + + public override uint LocalID + { + set { return; } + } + + public override bool Grabbed + { + set { return; } + } + + public override bool Selected + { + set { return; } + } + + public override float Buoyancy + { + get { return 0f; } + set { return; } + } + + public override bool FloatOnWater + { + set { return; } + } + + public override bool IsPhysical + { + get { return false; } + set { return; } + } + + public override bool ThrottleUpdates + { + get { return false; } + set { return; } + } + + public override bool Flying + { + get { return flying; } + set { flying = value; } + } + + public override bool IsColliding + { + get { return iscolliding; } + set { iscolliding = value; } + } + + public override bool CollidingGround + { + get { return false; } + set { return; } + } + + public override bool CollidingObj + { + get { return false; } + set { return; } + } + + public override bool Stopped + { + get { return false; } + } + + public override Vector3 Position + { + get { return _position; } + set { _position = value; } + } + + public override Vector3 Size + { + get { return _size; } + set { + _size = value; + _size.Z = _size.Z / 2.0f; + } + } + + public override PrimitiveBaseShape Shape + { + set { _shape = value; } + } + + public override float Mass + { + get { return 0f; } + } + + public override Vector3 Force + { + get { return Vector3.Zero; } + set { return; } + } + + public override int VehicleType + { + get { return 0; } + set { return; } + } + + public override void VehicleFloatParam(int param, float value) + { + + } + + public override void VehicleVectorParam(int param, Vector3 value) + { + + } + + public override void VehicleRotationParam(int param, Quaternion rotation) + { + + } + + public override void VehicleFlags(int param, bool remove) + { + + } + + public override void SetVolumeDetect(int param) + { + + } + + public override Vector3 CenterOfMass + { + get { return Vector3.Zero; } + } + + public override Vector3 GeometricCenter + { + get { return Vector3.Zero; } + } + + public override Vector3 Velocity + { + get { return _velocity; } + set { _velocity = value; } + } + + public override Vector3 Torque + { + get { return Vector3.Zero; } + set { return; } + } + + public override float CollisionScore + { + get { return 0f; } + set { } + } + + public override Quaternion Orientation { get; set; } + + public override Vector3 Acceleration + { + get { return _acceleration; } + set { _acceleration = value; } + } + + public override bool Kinematic + { + get { return true; } + set { } + } + + public override void link(PhysicsActor obj) + { + } + + public override void delink() + { + } + + public override void LockAngularMotion(Vector3 axis) + { + } + + public override void AddForce(Vector3 force, bool pushforce) + { + } + + public override void AddAngularForce(Vector3 force, bool pushforce) + { + } + + public override void SetMomentum(Vector3 momentum) + { + } + + public override void CrossingFailure() + { + } + + public override Vector3 PIDTarget + { + set { return; } + } + + public override bool PIDActive + { + set { return; } + } + + public override float PIDTau + { + set { return; } + } + + public override float PIDHoverHeight + { + set { return; } + } + + public override bool PIDHoverActive + { + set { return; } + } + + public override PIDHoverType PIDHoverType + { + set { return; } + } + + public override float PIDHoverTau + { + set { return; } + } + + public override Quaternion APIDTarget + { + set { return; } + } + + public override bool APIDActive + { + set { return; } + } + + public override float APIDStrength + { + set { return; } + } + + public override float APIDDamping + { + set { return; } + } + + public override void SubscribeEvents(int ms) + { + } + + public override void UnSubscribeEvents() + { + } + + public override bool SubscribedEvents() + { + return false; + } + } +} diff --git a/OpenSim/Region/Physics/BasicPhysicsPlugin/BasicPhysicsScene.cs b/OpenSim/Region/Physics/BasicPhysicsPlugin/BasicPhysicsScene.cs index 2e1421649f..f5826edd2c 100644 --- a/OpenSim/Region/Physics/BasicPhysicsPlugin/BasicPhysicsScene.cs +++ b/OpenSim/Region/Physics/BasicPhysicsPlugin/BasicPhysicsScene.cs @@ -34,9 +34,17 @@ using OpenSim.Region.Physics.Manager; namespace OpenSim.Region.Physics.BasicPhysicsPlugin { + /// + /// This is an incomplete extremely basic physics implementation + /// + /// + /// Not useful for anything at the moment apart from some regression testing in other components where some form + /// of physics plugin is needed. + /// public class BasicScene : PhysicsScene { private List _actors = new List(); + private List _prims = new List(); private float[] _heightMap; //protected internal string sceneIdentifier; @@ -50,10 +58,19 @@ namespace OpenSim.Region.Physics.BasicPhysicsPlugin { } - public override void Dispose() - { + public override void Dispose() {} + public override PhysicsActor AddPrimShape(string primName, PrimitiveBaseShape pbs, Vector3 position, + Vector3 size, Quaternion rotation, bool isPhysical, uint localid) + { + BasicPhysicsPrim prim = new BasicPhysicsPrim(primName, localid, position, size, rotation, pbs); + prim.IsPhysical = isPhysical; + + _prims.Add(prim); + + return prim; } + public override PhysicsActor AddAvatar(string avName, Vector3 position, Vector3 size, bool isFlying) { BasicActor act = new BasicActor(size); @@ -63,30 +80,18 @@ namespace OpenSim.Region.Physics.BasicPhysicsPlugin return act; } - public override void RemovePrim(PhysicsActor prim) + public override void RemovePrim(PhysicsActor actor) { + BasicPhysicsPrim prim = (BasicPhysicsPrim)actor; + if (_prims.Contains(prim)) + _prims.Remove(prim); } public override void RemoveAvatar(PhysicsActor actor) { - BasicActor act = (BasicActor) actor; + BasicActor act = (BasicActor)actor; if (_actors.Contains(act)) - { _actors.Remove(act); - } - } - -/* - public override PhysicsActor AddPrim(Vector3 position, Vector3 size, Quaternion rotation) - { - return null; - } -*/ - - public override PhysicsActor AddPrimShape(string primName, PrimitiveBaseShape pbs, Vector3 position, - Vector3 size, Quaternion rotation, bool isPhysical, uint localid) - { - return null; } public override void AddPhysicsActorTaint(PhysicsActor prim) From 58c890df5d82cef6e5d648b6e3a299b058b309dc Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Sun, 22 Apr 2012 20:03:34 +0100 Subject: [PATCH 065/547] Make TestSetPhysicsSinglePrim() actually add the object to the scene in order to test more code paths. --- OpenSim/Region/Framework/Scenes/Tests/SceneObjectStatusTests.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectStatusTests.cs b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectStatusTests.cs index 51751ef92b..360566db4b 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectStatusTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectStatusTests.cs @@ -82,6 +82,8 @@ namespace OpenSim.Region.Framework.Scenes.Tests { TestHelpers.InMethod(); + m_scene.AddSceneObject(m_so1); + SceneObjectPart rootPart = m_so1.RootPart; Assert.That(rootPart.Flags, Is.EqualTo(PrimFlags.None)); From 49ed68e98c34c752fac407aa9359201e244df19f Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Sun, 22 Apr 2012 20:28:12 +0100 Subject: [PATCH 066/547] refactor: simply some properties code in BasicPhysicsPlugin --- .../BasicPhysicsPlugin/BasicPhysicsActor.cs | 42 +++---------------- .../BasicPhysicsPlugin/BasicPhysicsPrim.cs | 42 +++---------------- 2 files changed, 12 insertions(+), 72 deletions(-) diff --git a/OpenSim/Region/Physics/BasicPhysicsPlugin/BasicPhysicsActor.cs b/OpenSim/Region/Physics/BasicPhysicsPlugin/BasicPhysicsActor.cs index b1a3ff9df5..e43136a258 100644 --- a/OpenSim/Region/Physics/BasicPhysicsPlugin/BasicPhysicsActor.cs +++ b/OpenSim/Region/Physics/BasicPhysicsPlugin/BasicPhysicsActor.cs @@ -36,13 +36,7 @@ namespace OpenSim.Region.Physics.BasicPhysicsPlugin { public class BasicActor : PhysicsActor { - private Vector3 _position; - private Vector3 _velocity; - private Vector3 _acceleration; private Vector3 _size; - private Vector3 m_rotationalVelocity; - private bool flying; - private bool iscolliding; public BasicActor(Vector3 size) { @@ -55,11 +49,7 @@ namespace OpenSim.Region.Physics.BasicPhysicsPlugin set { return; } } - public override Vector3 RotationalVelocity - { - get { return m_rotationalVelocity; } - set { m_rotationalVelocity = value; } - } + public override Vector3 RotationalVelocity { get; set; } public override bool SetAlwaysRun { @@ -105,17 +95,9 @@ namespace OpenSim.Region.Physics.BasicPhysicsPlugin set { return; } } - public override bool Flying - { - get { return flying; } - set { flying = value; } - } + public override bool Flying { get; set; } - public override bool IsColliding - { - get { return iscolliding; } - set { iscolliding = value; } - } + public override bool IsColliding { get; set; } public override bool CollidingGround { @@ -134,11 +116,7 @@ namespace OpenSim.Region.Physics.BasicPhysicsPlugin get { return false; } } - public override Vector3 Position - { - get { return _position; } - set { _position = value; } - } + public override Vector3 Position { get; set; } public override Vector3 Size { @@ -206,11 +184,7 @@ namespace OpenSim.Region.Physics.BasicPhysicsPlugin get { return Vector3.Zero; } } - public override Vector3 Velocity - { - get { return _velocity; } - set { _velocity = value; } - } + public override Vector3 Velocity { get; set; } public override Vector3 Torque { @@ -230,11 +204,7 @@ namespace OpenSim.Region.Physics.BasicPhysicsPlugin set { } } - public override Vector3 Acceleration - { - get { return _acceleration; } - set { _acceleration = value; } - } + public override Vector3 Acceleration { get; set; } public override bool Kinematic { diff --git a/OpenSim/Region/Physics/BasicPhysicsPlugin/BasicPhysicsPrim.cs b/OpenSim/Region/Physics/BasicPhysicsPlugin/BasicPhysicsPrim.cs index ba7fe1e7bb..b89eeed329 100644 --- a/OpenSim/Region/Physics/BasicPhysicsPlugin/BasicPhysicsPrim.cs +++ b/OpenSim/Region/Physics/BasicPhysicsPlugin/BasicPhysicsPrim.cs @@ -36,14 +36,8 @@ namespace OpenSim.Region.Physics.BasicPhysicsPlugin { public class BasicPhysicsPrim : PhysicsActor { - private Vector3 _position; - private Vector3 _velocity; - private Vector3 _acceleration; private Vector3 _size; private PrimitiveBaseShape _shape; - private Vector3 m_rotationalVelocity; - private bool flying; - private bool iscolliding; public BasicPhysicsPrim( string name, uint localId, Vector3 position, Vector3 size, Quaternion orientation, PrimitiveBaseShape shape) @@ -62,11 +56,7 @@ namespace OpenSim.Region.Physics.BasicPhysicsPlugin set { return; } } - public override Vector3 RotationalVelocity - { - get { return m_rotationalVelocity; } - set { m_rotationalVelocity = value; } - } + public override Vector3 RotationalVelocity { get; set; } public override bool SetAlwaysRun { @@ -112,17 +102,9 @@ namespace OpenSim.Region.Physics.BasicPhysicsPlugin set { return; } } - public override bool Flying - { - get { return flying; } - set { flying = value; } - } + public override bool Flying { get; set; } - public override bool IsColliding - { - get { return iscolliding; } - set { iscolliding = value; } - } + public override bool IsColliding { get; set; } public override bool CollidingGround { @@ -141,11 +123,7 @@ namespace OpenSim.Region.Physics.BasicPhysicsPlugin get { return false; } } - public override Vector3 Position - { - get { return _position; } - set { _position = value; } - } + public override Vector3 Position { get; set; } public override Vector3 Size { @@ -213,11 +191,7 @@ namespace OpenSim.Region.Physics.BasicPhysicsPlugin get { return Vector3.Zero; } } - public override Vector3 Velocity - { - get { return _velocity; } - set { _velocity = value; } - } + public override Vector3 Velocity { get; set; } public override Vector3 Torque { @@ -233,11 +207,7 @@ namespace OpenSim.Region.Physics.BasicPhysicsPlugin public override Quaternion Orientation { get; set; } - public override Vector3 Acceleration - { - get { return _acceleration; } - set { _acceleration = value; } - } + public override Vector3 Acceleration { get; set; } public override bool Kinematic { From 679da63da617d031e5e7ae3f2d2a29db1a23ace3 Mon Sep 17 00:00:00 2001 From: Talun Date: Sun, 22 Apr 2012 23:07:50 +0100 Subject: [PATCH 067/547] Mantis 5977 Corrections to llRegionSayTo Signed-off-by: BlueWall --- OpenSim/Framework/OSChatMessage.cs | 20 +++++ .../CoreModules/Avatar/Chat/ChatModule.cs | 52 ++++++++----- .../Scripting/WorldComm/WorldCommModule.cs | 76 +++++++++---------- .../Region/Framework/Interfaces/IWorldComm.cs | 2 +- .../Framework/Scenes/Scene.PacketHandlers.cs | 26 ++++++- .../Shared/Api/Implementation/LSL_Api.cs | 8 +- 6 files changed, 123 insertions(+), 61 deletions(-) diff --git a/OpenSim/Framework/OSChatMessage.cs b/OpenSim/Framework/OSChatMessage.cs index 54fa2756d2..455756db71 100644 --- a/OpenSim/Framework/OSChatMessage.cs +++ b/OpenSim/Framework/OSChatMessage.cs @@ -51,10 +51,12 @@ namespace OpenSim.Framework protected object m_senderObject; protected ChatTypeEnum m_type; protected UUID m_fromID; + protected UUID m_toID; public OSChatMessage() { m_position = new Vector3(); + m_toID = UUID.Zero; } /// @@ -102,6 +104,15 @@ namespace OpenSim.Framework set { m_from = value; } } + /// + /// The name of the sender (needed for scripts) + /// + public string To + { + get { return m_from; } + set { m_from = value; } + } + #region IEventArgs Members /// TODO: Sender and SenderObject should just be Sender and of @@ -131,6 +142,15 @@ namespace OpenSim.Framework set { m_fromID = value; } } + /// + /// The single recipient or all if not set. + /// + public UUID TargetUUID + { + get { return m_toID; } + set { m_toID = value; } + } + /// /// /// diff --git a/OpenSim/Region/CoreModules/Avatar/Chat/ChatModule.cs b/OpenSim/Region/CoreModules/Avatar/Chat/ChatModule.cs index 10b4c37f05..e4452fbb87 100644 --- a/OpenSim/Region/CoreModules/Avatar/Chat/ChatModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Chat/ChatModule.cs @@ -186,6 +186,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Chat { string fromName = c.From; UUID fromID = UUID.Zero; + UUID targetID = c.TargetUUID; string message = c.Message; IScene scene = c.Scene; Vector3 fromPos = c.Position; @@ -221,24 +222,38 @@ namespace OpenSim.Region.CoreModules.Avatar.Chat message = message.Substring(0, 1000); // m_log.DebugFormat( -// "[CHAT]: DCTA: fromID {0} fromName {1}, region{2}, cType {3}, sType {4}", -// fromID, fromName, scene.RegionInfo.RegionName, c.Type, sourceType); +// "[CHAT]: DCTA: fromID {0} fromName {1}, region{2}, cType {3}, sType {4}, targetID {5}", +// fromID, fromName, scene.RegionInfo.RegionName, c.Type, sourceType, targetID); HashSet receiverIDs = new HashSet(); - + foreach (Scene s in m_scenes) { - // This should use ForEachClient, but clients don't have a position. - // If camera is moved into client, then camera position can be used - s.ForEachRootScenePresence( - delegate(ScenePresence presence) + if (targetID == UUID.Zero) + { + // This should use ForEachClient, but clients don't have a position. + // If camera is moved into client, then camera position can be used + s.ForEachRootScenePresence( + delegate(ScenePresence presence) + { + if (TrySendChatMessage(presence, fromPos, regionPos, fromID, fromName, c.Type, message, sourceType, false)) + receiverIDs.Add(presence.UUID); + } + ); + } + else + { + // This is a send to a specific client eg from llRegionSayTo + // no need to check distance etc, jand send is as say + ScenePresence presence = s.GetScenePresence(targetID); + if (presence != null && !presence.IsChildAgent) { - if (TrySendChatMessage(presence, fromPos, regionPos, fromID, fromName, c.Type, message, sourceType)) - receiverIDs.Add(presence.UUID); + if (TrySendChatMessage(presence, fromPos, regionPos, fromID, fromName, ChatTypeEnum.Say, message, sourceType, true)) + receiverIDs.Add(presence.UUID); } - ); + } } - + (scene as Scene).EventManager.TriggerOnChatToClients( fromID, receiverIDs, message, c.Type, fromPos, fromName, sourceType, ChatAudibleLevel.Fully); } @@ -315,7 +330,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Chat /// precondition protected virtual bool TrySendChatMessage(ScenePresence presence, Vector3 fromPos, Vector3 regionPos, UUID fromAgentID, string fromName, ChatTypeEnum type, - string message, ChatSourceType src) + string message, ChatSourceType src, bool ignoreDistance) { // don't send stuff to child agents if (presence.IsChildAgent) return false; @@ -326,12 +341,15 @@ namespace OpenSim.Region.CoreModules.Avatar.Chat presence.Scene.RegionInfo.RegionLocY * Constants.RegionSize, 0); int dis = (int)Util.GetDistanceTo(toRegionPos, fromRegionPos); - - if (type == ChatTypeEnum.Whisper && dis > m_whisperdistance || - type == ChatTypeEnum.Say && dis > m_saydistance || - type == ChatTypeEnum.Shout && dis > m_shoutdistance) + + if (!ignoreDistance) { - return false; + if (type == ChatTypeEnum.Whisper && dis > m_whisperdistance || + type == ChatTypeEnum.Say && dis > m_saydistance || + type == ChatTypeEnum.Shout && dis > m_shoutdistance) + { + return false; + } } // TODO: should change so the message is sent through the avatar rather than direct to the ClientView diff --git a/OpenSim/Region/CoreModules/Scripting/WorldComm/WorldCommModule.cs b/OpenSim/Region/CoreModules/Scripting/WorldComm/WorldCommModule.cs index 176c86de12..8358bc0c64 100644 --- a/OpenSim/Region/CoreModules/Scripting/WorldComm/WorldCommModule.cs +++ b/OpenSim/Region/CoreModules/Scripting/WorldComm/WorldCommModule.cs @@ -308,56 +308,56 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm /// /// Message. /// - public bool DeliverMessageTo(UUID target, int channel, Vector3 pos, string name, UUID id, string msg, out string error) + public void DeliverMessageTo(UUID target, int channel, Vector3 pos, string name, UUID id, string msg) { - error = null; // Is id an avatar? ScenePresence sp = m_scene.GetScenePresence(target); if (sp != null) { - // Send message to avatar + // ignore if a child agent this is restricted to inside one region + if (sp.IsChildAgent) + return; + + // Send message to the avatar. + // Channel zero only goes to the avatar + // non zero channel messages only go to the attachments if (channel == 0) { - m_scene.SimChatBroadcast(Utils.StringToBytes(msg), ChatTypeEnum.Broadcast, 0, pos, name, id, false); - } - - List attachments = sp.GetAttachments(); - - if (attachments.Count == 0) - return true; - - // Get uuid of attachments - List targets = new List(); - foreach (SceneObjectGroup sog in attachments) + m_scene.SimChatToAgent(target, Utils.StringToBytes(msg), pos, name, id, false); + } + else { - if (!sog.IsDeleted) - targets.Add(sog.UUID); + List attachments = sp.GetAttachments(); + if (attachments.Count == 0) + return; + + // Get uuid of attachments + List targets = new List(); + foreach (SceneObjectGroup sog in attachments) + { + if (!sog.IsDeleted) + targets.Add(sog.UUID); + } + + // Need to check each attachment + foreach (ListenerInfo li in m_listenerManager.GetListeners(UUID.Zero, channel, name, id, msg)) + { + if (li.GetHostID().Equals(id)) + continue; + + if (m_scene.GetSceneObjectPart(li.GetHostID()) == null) + continue; + + if (targets.Contains(li.GetHostID())) + QueueMessage(new ListenerInfo(li, name, id, msg)); + } } - // Need to check each attachment - foreach (ListenerInfo li in m_listenerManager.GetListeners(UUID.Zero, channel, name, id, msg)) - { - if (li.GetHostID().Equals(id)) - continue; - - if (m_scene.GetSceneObjectPart(li.GetHostID()) == null) - continue; - - if (targets.Contains(li.GetHostID())) - QueueMessage(new ListenerInfo(li, name, id, msg)); - } - - return true; - } - - // Need to toss an error here - if (channel == 0) - { - error = "Cannot use llRegionSayTo to message objects on channel 0"; - return false; + return; } + // No avatar found so look for an object foreach (ListenerInfo li in m_listenerManager.GetListeners(UUID.Zero, channel, name, id, msg)) { // Dont process if this message is from yourself! @@ -375,7 +375,7 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm } } - return true; + return; } protected void QueueMessage(ListenerInfo li) diff --git a/OpenSim/Region/Framework/Interfaces/IWorldComm.cs b/OpenSim/Region/Framework/Interfaces/IWorldComm.cs index e8e375e037..4e74781b9b 100644 --- a/OpenSim/Region/Framework/Interfaces/IWorldComm.cs +++ b/OpenSim/Region/Framework/Interfaces/IWorldComm.cs @@ -103,7 +103,7 @@ namespace OpenSim.Region.Framework.Interfaces /// /// Message. /// - bool DeliverMessageTo(UUID target, int channel, Vector3 pos, string name, UUID id, string msg, out string error); + void DeliverMessageTo(UUID target, int channel, Vector3 pos, string name, UUID id, string msg); /// /// Are there any listen events ready to be dispatched? diff --git a/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs b/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs index 87ffc74acd..2701d6ef8a 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs @@ -38,8 +38,9 @@ namespace OpenSim.Region.Framework.Scenes { public partial class Scene { + protected void SimChat(byte[] message, ChatTypeEnum type, int channel, Vector3 fromPos, string fromName, - UUID fromID, bool fromAgent, bool broadcast) + UUID fromID, UUID targetID, bool fromAgent, bool broadcast) { OSChatMessage args = new OSChatMessage(); @@ -63,14 +64,20 @@ namespace OpenSim.Region.Framework.Scenes } args.From = fromName; - //args. + args.TargetUUID = targetID; if (broadcast) EventManager.TriggerOnChatBroadcast(this, args); else EventManager.TriggerOnChatFromWorld(this, args); } - + + protected void SimChat(byte[] message, ChatTypeEnum type, int channel, Vector3 fromPos, string fromName, + UUID fromID, bool fromAgent, bool broadcast) + { + SimChat(message, type, channel, fromPos, fromName, fromID, UUID.Zero, fromAgent, broadcast); + } + /// /// /// @@ -108,6 +115,19 @@ namespace OpenSim.Region.Framework.Scenes { SimChat(message, type, channel, fromPos, fromName, fromID, fromAgent, true); } + /// + /// + /// + /// + /// + /// + /// + /// + /// + public void SimChatToAgent(UUID targetID, byte[] message, Vector3 fromPos, string fromName, UUID fromID, bool fromAgent) + { + SimChat(message, ChatTypeEnum.Say, 0, fromPos, fromName, fromID, targetID, fromAgent, false); + } /// /// Invoked when the client requests a prim. diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index 36c9d5e74e..a2176ba8a6 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -839,13 +839,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api m_host.AddScriptLPS(1); + if (channel == ScriptBaseClass.DEBUG_CHANNEL) + { + return; + } + UUID TargetID; UUID.TryParse(target, out TargetID); IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface(); if (wComm != null) - if (!wComm.DeliverMessageTo(TargetID, channel, m_host.AbsolutePosition, m_host.Name, m_host.UUID, msg, out error)) - LSLError(error); + wComm.DeliverMessageTo(TargetID, channel, m_host.AbsolutePosition, m_host.Name, m_host.UUID, msg); } public LSL_Integer llListen(int channelID, string name, string ID, string msg) From 60065f06b3fd6f680202405e117402b22d62f902 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Mon, 23 Apr 2012 22:23:47 +0100 Subject: [PATCH 068/547] refactor: Replace calls to InventorySelf() with existing m_itemID in LSL_Api There's no point look up an item ID that we already have. --- .../Shared/Api/Implementation/LSL_Api.cs | 136 ++++++------------ 1 file changed, 42 insertions(+), 94 deletions(-) diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index 36c9d5e74e..60002935c0 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -85,7 +85,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api protected IScriptEngine m_ScriptEngine; protected SceneObjectPart m_host; protected uint m_localID; + + /// + /// The UUID of the item that hosts this script + /// protected UUID m_itemID; + protected bool throwErrorOnNotImplemented = true; protected AsyncCommandManager AsyncCommands = null; protected float m_ScriptDelayFactor = 1.0f; @@ -267,25 +272,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api } } - protected UUID InventorySelf() - { - UUID invItemID = new UUID(); - - lock (m_host.TaskInventory) - { - foreach (KeyValuePair inv in m_host.TaskInventory) - { - if (inv.Value.Type == 10 && inv.Value.ItemID == m_itemID) - { - invItemID = inv.Key; - break; - } - } - } - - return invItemID; - } - protected UUID InventoryKey(string name, int type) { m_host.AddScriptLPS(1); @@ -2697,17 +2683,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public LSL_Integer llGiveMoney(string destination, int amount) { - UUID invItemID=InventorySelf(); - if (invItemID == UUID.Zero) - return 0; - m_host.AddScriptLPS(1); - TaskInventoryItem item = m_host.TaskInventory[invItemID]; + TaskInventoryItem item; lock (m_host.TaskInventory) { - item = m_host.TaskInventory[invItemID]; + item = m_host.TaskInventory[m_itemID]; } if (item.PermsGranter == UUID.Zero) @@ -2955,10 +2937,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api lock (m_host.TaskInventory) { - if (!m_host.TaskInventory.ContainsKey(InventorySelf())) + if (!m_host.TaskInventory.ContainsKey(m_itemID)) return; else - item = m_host.TaskInventory[InventorySelf()]; + item = m_host.TaskInventory[m_itemID]; } if (item.PermsGranter != UUID.Zero) @@ -2983,10 +2965,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api lock (m_host.TaskInventory) { - if (!m_host.TaskInventory.ContainsKey(InventorySelf())) + if (!m_host.TaskInventory.ContainsKey(m_itemID)) return; else - item = m_host.TaskInventory[InventorySelf()]; + item = m_host.TaskInventory[m_itemID]; } m_host.AddScriptLPS(1); @@ -3026,10 +3008,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api lock (m_host.TaskInventory) { - if (!m_host.TaskInventory.ContainsKey(InventorySelf())) + if (!m_host.TaskInventory.ContainsKey(m_itemID)) return; else - item = m_host.TaskInventory[InventorySelf()]; + item = m_host.TaskInventory[m_itemID]; } if (item.PermsGranter != m_host.OwnerID) @@ -3058,10 +3040,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api lock (m_host.TaskInventory) { - if (!m_host.TaskInventory.ContainsKey(InventorySelf())) + if (!m_host.TaskInventory.ContainsKey(m_itemID)) return; else - item = m_host.TaskInventory[InventorySelf()]; + item = m_host.TaskInventory[m_itemID]; } if (item.PermsGranter != m_host.OwnerID) @@ -3313,18 +3295,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api { m_host.AddScriptLPS(1); - UUID invItemID = InventorySelf(); - if (invItemID == UUID.Zero) - return; - TaskInventoryItem item; lock (m_host.TaskInventory) { - if (!m_host.TaskInventory.ContainsKey(InventorySelf())) + if (!m_host.TaskInventory.ContainsKey(m_itemID)) return; else - item = m_host.TaskInventory[InventorySelf()]; + item = m_host.TaskInventory[m_itemID]; } if (item.PermsGranter == UUID.Zero) @@ -3350,18 +3328,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api { m_host.AddScriptLPS(1); - UUID invItemID=InventorySelf(); - if (invItemID == UUID.Zero) - return; - TaskInventoryItem item; lock (m_host.TaskInventory) { - if (!m_host.TaskInventory.ContainsKey(InventorySelf())) + if (!m_host.TaskInventory.ContainsKey(m_itemID)) return; else - item = m_host.TaskInventory[InventorySelf()]; + item = m_host.TaskInventory[m_itemID]; } if (item.PermsGranter == UUID.Zero) @@ -3417,21 +3391,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public void llRequestPermissions(string agent, int perm) { - UUID agentID = new UUID(); + UUID agentID; if (!UUID.TryParse(agent, out agentID)) return; - UUID invItemID = InventorySelf(); - - if (invItemID == UUID.Zero) - return; // Not in a prim? How?? - TaskInventoryItem item; lock (m_host.TaskInventory) { - item = m_host.TaskInventory[invItemID]; + item = m_host.TaskInventory[m_itemID]; } if (agentID == UUID.Zero || perm == 0) // Releasing permissions @@ -3466,8 +3435,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api { lock (m_host.TaskInventory) { - m_host.TaskInventory[invItemID].PermsGranter = agentID; - m_host.TaskInventory[invItemID].PermsMask = perm; + m_host.TaskInventory[m_itemID].PermsGranter = agentID; + m_host.TaskInventory[m_itemID].PermsMask = perm; } m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams( @@ -3490,8 +3459,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api { lock (m_host.TaskInventory) { - m_host.TaskInventory[invItemID].PermsGranter = agentID; - m_host.TaskInventory[invItemID].PermsMask = perm; + m_host.TaskInventory[m_itemID].PermsGranter = agentID; + m_host.TaskInventory[m_itemID].PermsMask = perm; } m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams( @@ -3515,8 +3484,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api { lock (m_host.TaskInventory) { - m_host.TaskInventory[invItemID].PermsGranter = agentID; - m_host.TaskInventory[invItemID].PermsMask = 0; + m_host.TaskInventory[m_itemID].PermsGranter = agentID; + m_host.TaskInventory[m_itemID].PermsMask = 0; } presence.ControllingClient.OnScriptAnswer += handleScriptAnswer; @@ -3524,7 +3493,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api } presence.ControllingClient.SendScriptQuestion( - m_host.UUID, m_host.ParentGroup.RootPart.Name, ownerName, invItemID, perm); + m_host.UUID, m_host.ParentGroup.RootPart.Name, ownerName, m_itemID, perm); return; } @@ -3541,20 +3510,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api if (taskID != m_host.UUID) return; - UUID invItemID = InventorySelf(); - - if (invItemID == UUID.Zero) - return; - - client.OnScriptAnswer-=handleScriptAnswer; - m_waitingForScriptAnswer=false; + client.OnScriptAnswer -= handleScriptAnswer; + m_waitingForScriptAnswer = false; if ((answer & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) == 0) llReleaseControls(); lock (m_host.TaskInventory) { - m_host.TaskInventory[invItemID].PermsMask = answer; + m_host.TaskInventory[m_itemID].PermsMask = answer; } m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams( @@ -3627,7 +3591,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public void llCreateLink(string target, int parent) { m_host.AddScriptLPS(1); - UUID invItemID = InventorySelf(); + UUID targetID; if (!UUID.TryParse(target, out targetID)) @@ -3636,7 +3600,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api TaskInventoryItem item; lock (m_host.TaskInventory) { - item = m_host.TaskInventory[invItemID]; + item = m_host.TaskInventory[m_itemID]; } if ((item.PermsMask & ScriptBaseClass.PERMISSION_CHANGE_LINKS) == 0 @@ -3688,11 +3652,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public void llBreakLink(int linknum) { m_host.AddScriptLPS(1); - UUID invItemID = InventorySelf(); lock (m_host.TaskInventory) { - if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_CHANGE_LINKS) == 0 + if ((m_host.TaskInventory[m_itemID].PermsMask & ScriptBaseClass.PERMISSION_CHANGE_LINKS) == 0 && !m_automaticLinkPermission) { ShoutError("Script trying to link but PERMISSION_CHANGE_LINKS permission not set!"); @@ -9691,17 +9654,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public LSL_Vector llGetCameraPos() { m_host.AddScriptLPS(1); - UUID invItemID = InventorySelf(); - - if (invItemID == UUID.Zero) - return new LSL_Vector(); lock (m_host.TaskInventory) { - if (m_host.TaskInventory[invItemID].PermsGranter == UUID.Zero) + if (m_host.TaskInventory[m_itemID].PermsGranter == UUID.Zero) return new LSL_Vector(); - if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_TRACK_CAMERA) == 0) + if ((m_host.TaskInventory[m_itemID].PermsMask & ScriptBaseClass.PERMISSION_TRACK_CAMERA) == 0) { ShoutError("No permissions to track the camera"); return new LSL_Vector(); @@ -9720,16 +9679,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public LSL_Rotation llGetCameraRot() { m_host.AddScriptLPS(1); - UUID invItemID = InventorySelf(); - if (invItemID == UUID.Zero) - return new LSL_Rotation(); lock (m_host.TaskInventory) { - if (m_host.TaskInventory[invItemID].PermsGranter == UUID.Zero) + if (m_host.TaskInventory[m_itemID].PermsGranter == UUID.Zero) return new LSL_Rotation(); - if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_TRACK_CAMERA) == 0) + if ((m_host.TaskInventory[m_itemID].PermsMask & ScriptBaseClass.PERMISSION_TRACK_CAMERA) == 0) { ShoutError("No permissions to track the camera"); return new LSL_Rotation(); @@ -9907,10 +9863,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api { m_host.AddScriptLPS(1); - // our key in the object we are in - UUID invItemID = InventorySelf(); - if (invItemID == UUID.Zero) return; - // the object we are in UUID objectID = m_host.ParentUUID; if (objectID == UUID.Zero) return; @@ -9919,10 +9871,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api lock (m_host.TaskInventory) { // we need the permission first, to know which avatar we want to set the camera for - agentID = m_host.TaskInventory[invItemID].PermsGranter; + agentID = m_host.TaskInventory[m_itemID].PermsGranter; if (agentID == UUID.Zero) return; - if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_CONTROL_CAMERA) == 0) return; + if ((m_host.TaskInventory[m_itemID].PermsMask & ScriptBaseClass.PERMISSION_CONTROL_CAMERA) == 0) return; } ScenePresence presence = World.GetScenePresence(agentID); @@ -9963,10 +9915,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api { m_host.AddScriptLPS(1); - // our key in the object we are in - UUID invItemID=InventorySelf(); - if (invItemID == UUID.Zero) return; - // the object we are in UUID objectID = m_host.ParentUUID; if (objectID == UUID.Zero) return; @@ -9975,9 +9923,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api UUID agentID; lock (m_host.TaskInventory) { - agentID = m_host.TaskInventory[invItemID].PermsGranter; + agentID = m_host.TaskInventory[m_itemID].PermsGranter; if (agentID == UUID.Zero) return; - if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_CONTROL_CAMERA) == 0) return; + if ((m_host.TaskInventory[m_itemID].PermsMask & ScriptBaseClass.PERMISSION_CONTROL_CAMERA) == 0) return; } ScenePresence presence = World.GetScenePresence(agentID); From 1f8d1bcdcf7ae48ad0b3609e532ad87859f6300b Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Mon, 23 Apr 2012 22:52:46 +0100 Subject: [PATCH 069/547] Replace common code to fetch self inventory item (as opposed to uuid) with GetSelfInventoryItem() However, at some point it would be far more convenient to receive the TaskInventoryItem in the constructor rather than just the item UUID, so we don't have to constantly refetch our self item. --- .../Shared/Api/Implementation/LSL_Api.cs | 231 ++++++------------ 1 file changed, 76 insertions(+), 155 deletions(-) diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index 60002935c0..a353b255be 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -272,6 +272,20 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api } } + /// + /// Get the inventory item that hosts ourselves. + /// + /// + /// FIXME: It would be far easier to pass in TaskInventoryItem rather than just m_itemID so that we don't need + /// to keep looking ourselves up. + /// + /// + protected TaskInventoryItem GetSelfInventoryItem() + { + lock (m_host.TaskInventory) + return m_host.TaskInventory[m_itemID]; + } + protected UUID InventoryKey(string name, int type) { m_host.AddScriptLPS(1); @@ -2685,12 +2699,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api { m_host.AddScriptLPS(1); - TaskInventoryItem item; - - lock (m_host.TaskInventory) - { - item = m_host.TaskInventory[m_itemID]; - } + TaskInventoryItem item = GetSelfInventoryItem(); if (item.PermsGranter == UUID.Zero) return 0; @@ -2933,15 +2942,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public void llTakeControls(int controls, int accept, int pass_on) { - TaskInventoryItem item; - - lock (m_host.TaskInventory) - { - if (!m_host.TaskInventory.ContainsKey(m_itemID)) - return; - else - item = m_host.TaskInventory[m_itemID]; - } + TaskInventoryItem item = GetSelfInventoryItem(); if (item.PermsGranter != UUID.Zero) { @@ -2961,18 +2962,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public void llReleaseControls() { - TaskInventoryItem item; - - lock (m_host.TaskInventory) - { - if (!m_host.TaskInventory.ContainsKey(m_itemID)) - return; - else - item = m_host.TaskInventory[m_itemID]; - } - m_host.AddScriptLPS(1); + TaskInventoryItem item = GetSelfInventoryItem(); + if (item.PermsGranter != UUID.Zero) { ScenePresence presence = World.GetScenePresence(item.PermsGranter); @@ -3004,15 +2997,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api // if (m_host.ParentGroup.RootPart.AttachmentPoint == 0) // return; - TaskInventoryItem item; - - lock (m_host.TaskInventory) - { - if (!m_host.TaskInventory.ContainsKey(m_itemID)) - return; - else - item = m_host.TaskInventory[m_itemID]; - } + TaskInventoryItem item = GetSelfInventoryItem(); if (item.PermsGranter != m_host.OwnerID) return; @@ -3036,15 +3021,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api if (m_host.ParentGroup.AttachmentPoint == 0) return; - TaskInventoryItem item; - - lock (m_host.TaskInventory) - { - if (!m_host.TaskInventory.ContainsKey(m_itemID)) - return; - else - item = m_host.TaskInventory[m_itemID]; - } + TaskInventoryItem item = GetSelfInventoryItem(); if (item.PermsGranter != m_host.OwnerID) return; @@ -3295,15 +3272,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api { m_host.AddScriptLPS(1); - TaskInventoryItem item; - - lock (m_host.TaskInventory) - { - if (!m_host.TaskInventory.ContainsKey(m_itemID)) - return; - else - item = m_host.TaskInventory[m_itemID]; - } + TaskInventoryItem item = GetSelfInventoryItem(); if (item.PermsGranter == UUID.Zero) return; @@ -3328,15 +3297,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api { m_host.AddScriptLPS(1); - TaskInventoryItem item; - - lock (m_host.TaskInventory) - { - if (!m_host.TaskInventory.ContainsKey(m_itemID)) - return; - else - item = m_host.TaskInventory[m_itemID]; - } + TaskInventoryItem item = GetSelfInventoryItem(); if (item.PermsGranter == UUID.Zero) return; @@ -3396,12 +3357,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api if (!UUID.TryParse(agent, out agentID)) return; - TaskInventoryItem item; - - lock (m_host.TaskInventory) - { - item = m_host.TaskInventory[m_itemID]; - } + TaskInventoryItem item = GetSelfInventoryItem(); if (agentID == UUID.Zero || perm == 0) // Releasing permissions { @@ -3531,39 +3487,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api { m_host.AddScriptLPS(1); - lock (m_host.TaskInventory) - { - foreach (TaskInventoryItem item in m_host.TaskInventory.Values) - { - if (item.Type == 10 && item.ItemID == m_itemID) - { - return item.PermsGranter.ToString(); - } - } - } - - return UUID.Zero.ToString(); + return GetSelfInventoryItem().PermsGranter.ToString(); } public LSL_Integer llGetPermissions() { m_host.AddScriptLPS(1); - lock (m_host.TaskInventory) - { - foreach (TaskInventoryItem item in m_host.TaskInventory.Values) - { - if (item.Type == 10 && item.ItemID == m_itemID) - { - int perms = item.PermsMask; - if (m_automaticLinkPermission) - perms |= ScriptBaseClass.PERMISSION_CHANGE_LINKS; - return perms; - } - } - } + int perms = GetSelfInventoryItem().PermsMask; - return 0; + if (m_automaticLinkPermission) + perms |= ScriptBaseClass.PERMISSION_CHANGE_LINKS; + + return perms; } public LSL_Integer llGetLinkNumber() @@ -3597,11 +3533,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api if (!UUID.TryParse(target, out targetID)) return; - TaskInventoryItem item; - lock (m_host.TaskInventory) - { - item = m_host.TaskInventory[m_itemID]; - } + TaskInventoryItem item = GetSelfInventoryItem(); if ((item.PermsMask & ScriptBaseClass.PERMISSION_CHANGE_LINKS) == 0 && !m_automaticLinkPermission) @@ -3653,14 +3585,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api { m_host.AddScriptLPS(1); - lock (m_host.TaskInventory) + if ((GetSelfInventoryItem().PermsMask & ScriptBaseClass.PERMISSION_CHANGE_LINKS) == 0 + && !m_automaticLinkPermission) { - if ((m_host.TaskInventory[m_itemID].PermsMask & ScriptBaseClass.PERMISSION_CHANGE_LINKS) == 0 - && !m_automaticLinkPermission) - { - ShoutError("Script trying to link but PERMISSION_CHANGE_LINKS permission not set!"); - return; - } + ShoutError("Script trying to link but PERMISSION_CHANGE_LINKS permission not set!"); + return; } if (linknum < ScriptBaseClass.LINK_THIS) @@ -4537,23 +4466,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public LSL_String llGetScriptName() { - string result = String.Empty; - m_host.AddScriptLPS(1); - lock (m_host.TaskInventory) - { - foreach (TaskInventoryItem item in m_host.TaskInventory.Values) - { - if (item.Type == 10 && item.ItemID == m_itemID) - { - result = item.Name != null ? item.Name : String.Empty; - break; - } - } - } + TaskInventoryItem item = GetSelfInventoryItem(); - return result; + return item.Name != null ? item.Name : String.Empty; } public LSL_Integer llGetLinkNumberOfSides(int link) @@ -9655,16 +9572,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api { m_host.AddScriptLPS(1); - lock (m_host.TaskInventory) - { - if (m_host.TaskInventory[m_itemID].PermsGranter == UUID.Zero) - return new LSL_Vector(); + TaskInventoryItem item = GetSelfInventoryItem(); - if ((m_host.TaskInventory[m_itemID].PermsMask & ScriptBaseClass.PERMISSION_TRACK_CAMERA) == 0) - { - ShoutError("No permissions to track the camera"); - return new LSL_Vector(); - } + if (item.PermsGranter == UUID.Zero) + return new LSL_Vector(); + + if ((item.PermsMask & ScriptBaseClass.PERMISSION_TRACK_CAMERA) == 0) + { + ShoutError("No permissions to track the camera"); + return new LSL_Vector(); } ScenePresence presence = World.GetScenePresence(m_host.OwnerID); @@ -9680,16 +9596,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api { m_host.AddScriptLPS(1); - lock (m_host.TaskInventory) - { - if (m_host.TaskInventory[m_itemID].PermsGranter == UUID.Zero) - return new LSL_Rotation(); + TaskInventoryItem item = GetSelfInventoryItem(); - if ((m_host.TaskInventory[m_itemID].PermsMask & ScriptBaseClass.PERMISSION_TRACK_CAMERA) == 0) - { - ShoutError("No permissions to track the camera"); - return new LSL_Rotation(); - } + if (item.PermsGranter == UUID.Zero) + return new LSL_Rotation(); + + if ((item.PermsMask & ScriptBaseClass.PERMISSION_TRACK_CAMERA) == 0) + { + ShoutError("No permissions to track the camera"); + return new LSL_Rotation(); } ScenePresence presence = World.GetScenePresence(m_host.OwnerID); @@ -9865,17 +9780,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api // the object we are in UUID objectID = m_host.ParentUUID; - if (objectID == UUID.Zero) return; + if (objectID == UUID.Zero) + return; - UUID agentID; - lock (m_host.TaskInventory) - { - // we need the permission first, to know which avatar we want to set the camera for - agentID = m_host.TaskInventory[m_itemID].PermsGranter; + TaskInventoryItem item = GetSelfInventoryItem(); - if (agentID == UUID.Zero) return; - if ((m_host.TaskInventory[m_itemID].PermsMask & ScriptBaseClass.PERMISSION_CONTROL_CAMERA) == 0) return; - } + // we need the permission first, to know which avatar we want to set the camera for + UUID agentID = item.PermsGranter; + + if (agentID == UUID.Zero) + return; + + if ((item.PermsMask & ScriptBaseClass.PERMISSION_CONTROL_CAMERA) == 0) + return; ScenePresence presence = World.GetScenePresence(agentID); @@ -9917,21 +9834,25 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api // the object we are in UUID objectID = m_host.ParentUUID; - if (objectID == UUID.Zero) return; + if (objectID == UUID.Zero) + return; + + TaskInventoryItem item = GetSelfInventoryItem(); // we need the permission first, to know which avatar we want to clear the camera for - UUID agentID; - lock (m_host.TaskInventory) - { - agentID = m_host.TaskInventory[m_itemID].PermsGranter; - if (agentID == UUID.Zero) return; - if ((m_host.TaskInventory[m_itemID].PermsMask & ScriptBaseClass.PERMISSION_CONTROL_CAMERA) == 0) return; - } + UUID agentID = item.PermsGranter; + + if (agentID == UUID.Zero) + return; + + if ((item.PermsMask & ScriptBaseClass.PERMISSION_CONTROL_CAMERA) == 0) + return; ScenePresence presence = World.GetScenePresence(agentID); // we are not interested in child-agents - if (presence.IsChildAgent) return; + if (presence.IsChildAgent) + return; presence.ControllingClient.SendClearFollowCamProperties(objectID); } From 40e37d8b78379db08de541c8c7a9fed1d22ec5ef Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Tue, 24 Apr 2012 00:03:57 +0100 Subject: [PATCH 070/547] Add osForceAttachToAvatar() and osForceDetachFromAvatar() These behave identically to llAttachToAvatar() and llDetachFromAvatar() except that they do not enforce the PERMISSION_ATTACH check Intended for use in completely controlled dedicated environments where these checks are more a UI hinderance than a help. Threat level high. --- .../Shared/Api/Implementation/ApiManager.cs | 41 ++++++----- .../Shared/Api/Implementation/LSL_Api.cs | 73 ++++++++++++------- .../Shared/Api/Implementation/OSSL_Api.cs | 28 +++++++ .../Shared/Api/Interface/IOSSL_Api.cs | 14 ++++ .../Shared/Api/Runtime/OSSL_Stub.cs | 13 +++- .../Shared/Instance/ScriptInstance.cs | 7 ++ 6 files changed, 127 insertions(+), 49 deletions(-) diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/ApiManager.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/ApiManager.cs index 47ed6ba42a..684138f79c 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/ApiManager.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/ApiManager.cs @@ -29,42 +29,43 @@ using System; using System.Collections; using System.Collections.Generic; using System.Reflection; +using log4net; using OpenSim.Region.ScriptEngine.Interfaces; namespace OpenSim.Region.ScriptEngine.Shared.Api { public class ApiManager { +// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + private Dictionary m_Apis = new Dictionary(); public string[] GetApis() { - if (m_Apis.Count > 0) + if (m_Apis.Count <= 0) { - List l = new List(m_Apis.Keys); - return l.ToArray(); - } + Assembly a = Assembly.GetExecutingAssembly(); - Assembly a = Assembly.GetExecutingAssembly(); + Type[] types = a.GetExportedTypes(); - Type[] types = a.GetExportedTypes(); - - foreach (Type t in types) - { - string name = t.ToString(); - int idx = name.LastIndexOf('.'); - if (idx != -1) - name = name.Substring(idx+1); - - if (name.EndsWith("_Api")) + foreach (Type t in types) { - name = name.Substring(0, name.Length - 4); - m_Apis[name] = t; + string name = t.ToString(); + int idx = name.LastIndexOf('.'); + if (idx != -1) + name = name.Substring(idx+1); + + if (name.EndsWith("_Api")) + { + name = name.Substring(0, name.Length - 4); + m_Apis[name] = t; + } } } - List ret = new List(m_Apis.Keys); - return ret.ToArray(); +// m_log.DebugFormat("[API MANAGER]: Found {0} apis", m_Apis.Keys.Count); + + return new List(m_Apis.Keys).ToArray(); } public IScriptApi CreateApi(string api) @@ -76,4 +77,4 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api return ret; } } -} +} \ No newline at end of file diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index 9cb97f933e..d4c872cd00 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -2994,7 +2994,49 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api m_UrlModule.ReleaseURL(url); } - public void llAttachToAvatar(int attachment) + /// + /// Attach the object containing this script to the avatar that owns it. + /// + /// The attachment point (e.g. ATTACH_CHEST) + /// true if the attach suceeded, false if it did not + public bool AttachToAvatar(int attachmentPoint) + { + SceneObjectGroup grp = m_host.ParentGroup; + ScenePresence presence = World.GetScenePresence(m_host.OwnerID); + + IAttachmentsModule attachmentsModule = m_ScriptEngine.World.AttachmentsModule; + + if (attachmentsModule != null) + return attachmentsModule.AttachObject(presence, grp, (uint)attachmentPoint, false); + else + return false; + } + + /// + /// Detach the object containing this script from the avatar it is attached to. + /// + /// + /// Nothing happens if the object is not attached. + /// + public void DetachFromAvatar() + { + Util.FireAndForget(DetachWrapper, m_host); + } + + private void DetachWrapper(object o) + { + SceneObjectPart host = (SceneObjectPart)o; + + SceneObjectGroup grp = host.ParentGroup; + UUID itemID = grp.FromItemID; + ScenePresence presence = World.GetScenePresence(host.OwnerID); + + IAttachmentsModule attachmentsModule = m_ScriptEngine.World.AttachmentsModule; + if (attachmentsModule != null) + attachmentsModule.DetachSingleAttachmentToInv(presence, itemID); + } + + public void llAttachToAvatar(int attachmentPoint) { m_host.AddScriptLPS(1); @@ -3007,15 +3049,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api return; if ((item.PermsMask & ScriptBaseClass.PERMISSION_ATTACH) != 0) - { - SceneObjectGroup grp = m_host.ParentGroup; - - ScenePresence presence = World.GetScenePresence(m_host.OwnerID); - - IAttachmentsModule attachmentsModule = m_ScriptEngine.World.AttachmentsModule; - if (attachmentsModule != null) - attachmentsModule.AttachObject(presence, grp, (uint)attachment, false); - } + AttachToAvatar(attachmentPoint); } public void llDetachFromAvatar() @@ -3031,24 +3065,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api return; if ((item.PermsMask & ScriptBaseClass.PERMISSION_ATTACH) != 0) - { - IAttachmentsModule attachmentsModule = m_ScriptEngine.World.AttachmentsModule; - if (attachmentsModule != null) - Util.FireAndForget(DetachWrapper, m_host); - } - } - - private void DetachWrapper(object o) - { - SceneObjectPart host = (SceneObjectPart)o; - - SceneObjectGroup grp = host.ParentGroup; - UUID itemID = grp.FromItemID; - ScenePresence presence = World.GetScenePresence(host.OwnerID); - - IAttachmentsModule attachmentsModule = m_ScriptEngine.World.AttachmentsModule; - if (attachmentsModule != null) - attachmentsModule.DetachSingleAttachmentToInv(presence, itemID); + DetachFromAvatar(); } public void llTakeCamera(string avatar) diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs index fe94b79b74..3f261ea3d9 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs @@ -209,6 +209,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api throw new Exception("OSSL Runtime Error: " + msg); } + /// + /// Initialize the LSL interface. + /// + /// + /// FIXME: This is an abomination. We should be able to set this up earlier but currently we have no + /// guarantee the interface is present on Initialize(). There needs to be another post initialize call from + /// ScriptInstance. + /// private void InitLSL() { if (m_LSL_Api != null) @@ -3093,5 +3101,25 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api estate.setEstateTerrainTextureHeights(corner, (float)low, (float)high); } } + + public void osForceAttachToAvatar(int attachmentPoint) + { + CheckThreatLevel(ThreatLevel.High, "osForceAttachToAvatar"); + + m_host.AddScriptLPS(1); + + InitLSL(); + ((LSL_Api)m_LSL_Api).AttachToAvatar(attachmentPoint); + } + + public void osForceDetachFromAvatar() + { + CheckThreatLevel(ThreatLevel.High, "osForceDetachFromAvatar"); + + m_host.AddScriptLPS(1); + + InitLSL(); + ((LSL_Api)m_LSL_Api).DetachFromAvatar(); + } } } \ No newline at end of file diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs index 545bbeea70..d0c852bc13 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs @@ -98,6 +98,20 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces void osAvatarPlayAnimation(string avatar, string animation); void osAvatarStopAnimation(string avatar, string animation); + // Attachment commands + + /// + /// Attach the object containing this script to the avatar that owns it without checking for PERMISSION_ATTACH + /// + /// The attachment point. For example, ATTACH_CHEST + void osForceAttachToAvatar(int attachment); + + /// + /// Detach the object containing this script from the avatar it is attached to without checking for PERMISSION_ATTACH + /// + /// Nothing happens if the object is not attached. + void osForceDetachFromAvatar(); + //texture draw functions string osMovePen(string drawList, int x, int y); string osDrawLine(string drawList, int startX, int startY, int endX, int endY); diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs index b94b9bffe0..36ac0e3257 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs @@ -289,8 +289,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase m_OSSL_Functions.osAvatarStopAnimation(avatar, animation); } + // Avatar functions - //Texture Draw functions + public void osForceAttachToAvatar(int attachmentPoint) + { + m_OSSL_Functions.osForceAttachToAvatar(attachmentPoint); + } + + public void osForceDetachFromAvatar() + { + m_OSSL_Functions.osForceDetachFromAvatar(); + } + + // Texture Draw functions public string osMovePen(string drawList, int x, int y) { diff --git a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs index 6e367421c0..2c8af81d5e 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs @@ -964,7 +964,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance public IScriptApi GetApi(string name) { if (m_Apis.ContainsKey(name)) + { +// m_log.DebugFormat("[SCRIPT INSTANCE]: Found api {0} in {1}@{2}", name, ScriptName, PrimName); + return m_Apis[name]; + } + +// m_log.DebugFormat("[SCRIPT INSTANCE]: Did not find api {0} in {1}@{2}", name, ScriptName, PrimName); + return null; } From 6c21e15cb9542c06e69fd8acd6d4c04aad2cd7da Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Tue, 24 Apr 2012 00:32:01 +0100 Subject: [PATCH 071/547] Add online/offline indicator to "friends show" region console command. Improve output table formatting. --- .../Avatar/Friends/FriendsCommandsModule.cs | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/OpenSim/Region/OptionalModules/Avatar/Friends/FriendsCommandsModule.cs b/OpenSim/Region/OptionalModules/Avatar/Friends/FriendsCommandsModule.cs index e68f9d07a3..2602050de4 100644 --- a/OpenSim/Region/OptionalModules/Avatar/Friends/FriendsCommandsModule.cs +++ b/OpenSim/Region/OptionalModules/Avatar/Friends/FriendsCommandsModule.cs @@ -58,6 +58,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.Friends private Scene m_scene; private IFriendsModule m_friendsModule; private IUserManagement m_userManagementModule; + private IPresenceService m_presenceService; // private IAvatarFactoryModule m_avatarFactory; @@ -99,8 +100,9 @@ namespace OpenSim.Region.OptionalModules.Avatar.Friends m_friendsModule = m_scene.RequestModuleInterface(); m_userManagementModule = m_scene.RequestModuleInterface(); + m_presenceService = m_scene.RequestModuleInterface(); - if (m_friendsModule != null && m_userManagementModule != null) + if (m_friendsModule != null && m_userManagementModule != null && m_presenceService != null) { m_scene.AddCommand( "Friends", this, "friends show", @@ -162,7 +164,8 @@ namespace OpenSim.Region.OptionalModules.Avatar.Friends MainConsole.Instance.OutputFormat("Friends for {0} {1} {2}:", firstName, lastName, userId); - MainConsole.Instance.OutputFormat("UUID, Name, MyFlags, TheirFlags"); + MainConsole.Instance.OutputFormat( + "{0,-36} {1,-36} {2,-7} {3,7} {4,10}", "UUID", "Name", "Status", "MyFlags", "TheirFlags"); foreach (FriendInfo friend in friends) { @@ -175,14 +178,22 @@ namespace OpenSim.Region.OptionalModules.Avatar.Friends UUID friendId; string friendName; + string onlineText; if (UUID.TryParse(friend.Friend, out friendId)) friendName = m_userManagementModule.GetUserName(friendId); else friendName = friend.Friend; + OpenSim.Services.Interfaces.PresenceInfo[] pi = m_presenceService.GetAgents(new string[] { friend.Friend }); + if (pi.Length > 0) + onlineText = "online"; + else + onlineText = "offline"; + MainConsole.Instance.OutputFormat( - "{0} {1} {2} {3}", friend.Friend, friendName, friend.MyFlags, friend.TheirFlags); + "{0,-36} {1,-36} {2,-7} {3,-7} {4,-10}", + friend.Friend, friendName, onlineText, friend.MyFlags, friend.TheirFlags); } } } From fd279889788420a63d7454833ab33cb4060edf38 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Mon, 23 Apr 2012 21:29:18 -0700 Subject: [PATCH 072/547] Changed the Map-related messages from Info to Debug. They're debug messages. --- OpenSim/Region/CoreModules/World/LegacyMap/MapImageModule.cs | 4 ++-- .../CoreModules/World/LegacyMap/ShadedMapTileRenderer.cs | 4 ++-- .../CoreModules/World/LegacyMap/TexturedMapTileRenderer.cs | 4 ++-- OpenSim/Region/CoreModules/World/Warp3DMap/MapImageModule.cs | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/OpenSim/Region/CoreModules/World/LegacyMap/MapImageModule.cs b/OpenSim/Region/CoreModules/World/LegacyMap/MapImageModule.cs index f86c7906a4..aa306c7db5 100644 --- a/OpenSim/Region/CoreModules/World/LegacyMap/MapImageModule.cs +++ b/OpenSim/Region/CoreModules/World/LegacyMap/MapImageModule.cs @@ -225,7 +225,7 @@ namespace OpenSim.Region.CoreModules.World.LegacyMap int tc = 0; double[,] hm = whichScene.Heightmap.GetDoubles(); tc = Environment.TickCount; - m_log.Info("[MAPTILE]: Generating Maptile Step 2: Object Volume Profile"); + m_log.Debug("[MAPTILE]: Generating Maptile Step 2: Object Volume Profile"); EntityBase[] objs = whichScene.GetEntities(); Dictionary z_sort = new Dictionary(); //SortedList z_sort = new SortedList(); @@ -541,7 +541,7 @@ namespace OpenSim.Region.CoreModules.World.LegacyMap g.Dispose(); } // lock entities objs - m_log.Info("[MAPTILE]: Generating Maptile Step 2: Done in " + (Environment.TickCount - tc) + " ms"); + m_log.Debug("[MAPTILE]: Generating Maptile Step 2: Done in " + (Environment.TickCount - tc) + " ms"); return mapbmp; } diff --git a/OpenSim/Region/CoreModules/World/LegacyMap/ShadedMapTileRenderer.cs b/OpenSim/Region/CoreModules/World/LegacyMap/ShadedMapTileRenderer.cs index eb1a27f9ec..992bff3290 100644 --- a/OpenSim/Region/CoreModules/World/LegacyMap/ShadedMapTileRenderer.cs +++ b/OpenSim/Region/CoreModules/World/LegacyMap/ShadedMapTileRenderer.cs @@ -54,7 +54,7 @@ namespace OpenSim.Region.CoreModules.World.LegacyMap public void TerrainToBitmap(Bitmap mapbmp) { int tc = Environment.TickCount; - m_log.Info("[MAPTILE]: Generating Maptile Step 1: Terrain"); + m_log.Debug("[MAPTILE]: Generating Maptile Step 1: Terrain"); double[,] hm = m_scene.Heightmap.GetDoubles(); bool ShadowDebugContinue = true; @@ -238,7 +238,7 @@ namespace OpenSim.Region.CoreModules.World.LegacyMap } } } - m_log.Info("[MAPTILE]: Generating Maptile Step 1: Done in " + (Environment.TickCount - tc) + " ms"); + m_log.Debug("[MAPTILE]: Generating Maptile Step 1: Done in " + (Environment.TickCount - tc) + " ms"); } } } diff --git a/OpenSim/Region/CoreModules/World/LegacyMap/TexturedMapTileRenderer.cs b/OpenSim/Region/CoreModules/World/LegacyMap/TexturedMapTileRenderer.cs index 1d2141e5e1..d13c2ef91d 100644 --- a/OpenSim/Region/CoreModules/World/LegacyMap/TexturedMapTileRenderer.cs +++ b/OpenSim/Region/CoreModules/World/LegacyMap/TexturedMapTileRenderer.cs @@ -278,7 +278,7 @@ namespace OpenSim.Region.CoreModules.World.LegacyMap public void TerrainToBitmap(Bitmap mapbmp) { int tc = Environment.TickCount; - m_log.Info("[MAPTILE]: Generating Maptile Step 1: Terrain"); + m_log.Debug("[MAPTILE]: Generating Maptile Step 1: Terrain"); // These textures should be in the AssetCache anyway, as every client conneting to this // region needs them. Except on start, when the map is recreated (before anyone connected), @@ -412,7 +412,7 @@ namespace OpenSim.Region.CoreModules.World.LegacyMap } } } - m_log.Info("[MAPTILE]: Generating Maptile Step 1: Done in " + (Environment.TickCount - tc) + " ms"); + m_log.Debug("[MAPTILE]: Generating Maptile Step 1: Done in " + (Environment.TickCount - tc) + " ms"); } } } diff --git a/OpenSim/Region/CoreModules/World/Warp3DMap/MapImageModule.cs b/OpenSim/Region/CoreModules/World/Warp3DMap/MapImageModule.cs index 6163fd12fe..4f4e296b27 100644 --- a/OpenSim/Region/CoreModules/World/Warp3DMap/MapImageModule.cs +++ b/OpenSim/Region/CoreModules/World/Warp3DMap/MapImageModule.cs @@ -88,11 +88,11 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap if (renderers.Count > 0) { m_primMesher = RenderingLoader.LoadRenderer(renderers[0]); - m_log.Info("[MAPTILE]: Loaded prim mesher " + m_primMesher.ToString()); + m_log.Debug("[MAPTILE]: Loaded prim mesher " + m_primMesher.ToString()); } else { - m_log.Info("[MAPTILE]: No prim mesher loaded, prim rendering will be disabled"); + m_log.Debug("[MAPTILE]: No prim mesher loaded, prim rendering will be disabled"); } m_scene.RegisterModuleInterface(this); From c6f30e044b6cd2ed8493ad0e2914786eef4f7890 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Tue, 24 Apr 2012 19:49:52 +0100 Subject: [PATCH 073/547] Restore _parent_scene.actor_name_map[prim_geom] = this; accidentally removed from ODEPrim.SetGeom. This occurred in 7a574be3fd from Sat 21 Apr 2012. This should fix collision detection. Mnay thanks to tglion for the spot and the fix in http://opensimulator.org/mantis/view.php?id=5988 --- OpenSim/Region/Physics/OdePlugin/ODEPrim.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs index 3f88353453..071621495a 100644 --- a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs +++ b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs @@ -338,6 +338,7 @@ namespace OpenSim.Region.Physics.OdePlugin d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags); _parent_scene.geom_name_map[prim_geom] = Name; + _parent_scene.actor_name_map[prim_geom] = this; if (childPrim) { From 0e3053e4c97670e897496ffa98d7039bf686e6d2 Mon Sep 17 00:00:00 2001 From: "Olivier van Helden and Gudule Lapointe (Speculoos.net)" Date: Thu, 19 Apr 2012 01:17:56 +0200 Subject: [PATCH 074/547] DST settings to match client default Pacific Time (mantis #5972) --- .../Services/LLLoginService/LLLoginResponse.cs | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/OpenSim/Services/LLLoginService/LLLoginResponse.cs b/OpenSim/Services/LLLoginService/LLLoginResponse.cs index 844c5aeb41..8fdcf4ea07 100644 --- a/OpenSim/Services/LLLoginService/LLLoginResponse.cs +++ b/OpenSim/Services/LLLoginService/LLLoginResponse.cs @@ -349,7 +349,21 @@ namespace OpenSim.Services.LLLoginService private void SetDefaultValues() { - DST = TimeZone.CurrentTimeZone.IsDaylightSavingTime(DateTime.Now) ? "Y" : "N"; + TimeZoneInfo gridTimeZone; + try + { + // First try to fetch DST from Pacific Standard Time, because this is + // the one expected by the viewer. "US/Pacific" is the string to search + // on linux and mac, and should work also on Windows (to confirm) + gridTimeZone = TimeZoneInfo.FindSystemTimeZoneById("US/Pacific"); + } + catch (Exception e) + { + m_log.WarnFormat("[TIMEZONE]: {0} Falling back to system time. System time should be set to Pacific Standard Time to provide the expected time", e.Message); + gridTimeZone = TimeZoneInfo.Local; + } + DST = gridTimeZone.IsDaylightSavingTime(DateTime.Now) ? "Y" : "N"; + StipendSinceLogin = "N"; Gendered = "Y"; EverLoggedIn = "Y"; From cbe889e10bc06f0a3e31b4094c88bf022635dff9 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Tue, 24 Apr 2012 20:30:19 +0100 Subject: [PATCH 075/547] minor: formatting changes to top of LLLoginResponse.SetDefaultValues(), chiefly some break up of the long line. --- OpenSim/Services/LLLoginService/LLLoginResponse.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/OpenSim/Services/LLLoginService/LLLoginResponse.cs b/OpenSim/Services/LLLoginService/LLLoginResponse.cs index 8fdcf4ea07..10a44edc52 100644 --- a/OpenSim/Services/LLLoginService/LLLoginResponse.cs +++ b/OpenSim/Services/LLLoginService/LLLoginResponse.cs @@ -350,6 +350,7 @@ namespace OpenSim.Services.LLLoginService private void SetDefaultValues() { TimeZoneInfo gridTimeZone; + try { // First try to fetch DST from Pacific Standard Time, because this is @@ -359,9 +360,13 @@ namespace OpenSim.Services.LLLoginService } catch (Exception e) { - m_log.WarnFormat("[TIMEZONE]: {0} Falling back to system time. System time should be set to Pacific Standard Time to provide the expected time", e.Message); + m_log.WarnFormat( + "[TIMEZONE]: {0} Falling back to system time. System time should be set to Pacific Standard Time to provide the expected time", + e.Message); + gridTimeZone = TimeZoneInfo.Local; } + DST = gridTimeZone.IsDaylightSavingTime(DateTime.Now) ? "Y" : "N"; StipendSinceLogin = "N"; From 6011bfa5e36d77ad58cf50ddd99b8c6289144f57 Mon Sep 17 00:00:00 2001 From: Oren Hurvitz Date: Mon, 23 Apr 2012 19:19:08 +0300 Subject: [PATCH 076/547] OSSL: fixed the threat level check for osParseJSONNew --- .../Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs index 3f261ea3d9..7fc73375ce 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs @@ -1617,7 +1617,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public Object osParseJSONNew(string JSON) { - CheckThreatLevel(ThreatLevel.None, "osParseJSON"); + CheckThreatLevel(ThreatLevel.None, "osParseJSONNew"); m_host.AddScriptLPS(1); From c70e85a3271aaa9e6d892240964cb55cbc2960c7 Mon Sep 17 00:00:00 2001 From: Oren Hurvitz Date: Mon, 23 Apr 2012 18:38:21 +0300 Subject: [PATCH 077/547] When reading a region, use null objects to represent NULL fields. Previously NULL fields were converted to an empty string due to the use of ToString(). But if the field was an Int (e.g., "locZ"), then the subsequent attempt to convert an empty string to an int caused an exception. Now the field is null so we don't try to convert it, so there's no exception. --- OpenSim/Data/MySQL/MySQLRegionData.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/OpenSim/Data/MySQL/MySQLRegionData.cs b/OpenSim/Data/MySQL/MySQLRegionData.cs index c20c39263a..948cdf330f 100644 --- a/OpenSim/Data/MySQL/MySQLRegionData.cs +++ b/OpenSim/Data/MySQL/MySQLRegionData.cs @@ -187,7 +187,11 @@ namespace OpenSim.Data.MySQL if (s == "locY") continue; - ret.Data[s] = result[s].ToString(); + object value = result[s]; + if (value is DBNull) + ret.Data[s] = null; + else + ret.Data[s] = result[s].ToString(); } retList.Add(ret); From da5fd53702ce97d13da2cb50da0753d507e6c11b Mon Sep 17 00:00:00 2001 From: Oren Hurvitz Date: Mon, 23 Apr 2012 18:39:23 +0300 Subject: [PATCH 078/547] Fixed problem with MySQL: it was possible for one thread to use an incomplete list of column names if another thread was creating the list at the same time. Now this is thread-safe. --- OpenSim/Data/MySQL/MySQLAuthenticationData.cs | 23 ++++++++++----- .../Data/MySQL/MySQLGenericTableHandler.cs | 6 ++-- OpenSim/Data/MySQL/MySQLRegionData.cs | 29 ++++++++++++------- 3 files changed, 37 insertions(+), 21 deletions(-) diff --git a/OpenSim/Data/MySQL/MySQLAuthenticationData.cs b/OpenSim/Data/MySQL/MySQLAuthenticationData.cs index 8d82f61bda..664ce84f7c 100644 --- a/OpenSim/Data/MySQL/MySQLAuthenticationData.cs +++ b/OpenSim/Data/MySQL/MySQLAuthenticationData.cs @@ -79,14 +79,7 @@ namespace OpenSim.Data.MySQL { ret.PrincipalID = principalID; - if (m_ColumnNames == null) - { - m_ColumnNames = new List(); - - DataTable schemaTable = result.GetSchemaTable(); - foreach (DataRow row in schemaTable.Rows) - m_ColumnNames.Add(row["ColumnName"].ToString()); - } + CheckColumnNames(result); foreach (string s in m_ColumnNames) { @@ -105,6 +98,20 @@ namespace OpenSim.Data.MySQL } } + private void CheckColumnNames(IDataReader result) + { + if (m_ColumnNames != null) + return; + + List columnNames = new List(); + + DataTable schemaTable = result.GetSchemaTable(); + foreach (DataRow row in schemaTable.Rows) + columnNames.Add(row["ColumnName"].ToString()); + + m_ColumnNames = columnNames; + } + public bool Store(AuthenticationData data) { if (data.Data.ContainsKey("UUID")) diff --git a/OpenSim/Data/MySQL/MySQLGenericTableHandler.cs b/OpenSim/Data/MySQL/MySQLGenericTableHandler.cs index 754cf725f0..da8e958b07 100644 --- a/OpenSim/Data/MySQL/MySQLGenericTableHandler.cs +++ b/OpenSim/Data/MySQL/MySQLGenericTableHandler.cs @@ -91,15 +91,17 @@ namespace OpenSim.Data.MySQL if (m_ColumnNames != null) return; - m_ColumnNames = new List(); + List columnNames = new List(); DataTable schemaTable = reader.GetSchemaTable(); foreach (DataRow row in schemaTable.Rows) { if (row["ColumnName"] != null && (!m_Fields.ContainsKey(row["ColumnName"].ToString()))) - m_ColumnNames.Add(row["ColumnName"].ToString()); + columnNames.Add(row["ColumnName"].ToString()); } + + m_ColumnNames = columnNames; } public virtual T[] Get(string field, string key) diff --git a/OpenSim/Data/MySQL/MySQLRegionData.cs b/OpenSim/Data/MySQL/MySQLRegionData.cs index 948cdf330f..d1f1932dd8 100644 --- a/OpenSim/Data/MySQL/MySQLRegionData.cs +++ b/OpenSim/Data/MySQL/MySQLRegionData.cs @@ -162,17 +162,7 @@ namespace OpenSim.Data.MySQL ret.sizeX = Convert.ToInt32(result["sizeX"]); ret.sizeY = Convert.ToInt32(result["sizeY"]); - if (m_ColumnNames == null) - { - m_ColumnNames = new List(); - - DataTable schemaTable = result.GetSchemaTable(); - foreach (DataRow row in schemaTable.Rows) - { - if (row["ColumnName"] != null) - m_ColumnNames.Add(row["ColumnName"].ToString()); - } - } + CheckColumnNames(result); foreach (string s in m_ColumnNames) { @@ -202,6 +192,23 @@ namespace OpenSim.Data.MySQL return retList; } + private void CheckColumnNames(IDataReader result) + { + if (m_ColumnNames != null) + return; + + List columnNames = new List(); + + DataTable schemaTable = result.GetSchemaTable(); + foreach (DataRow row in schemaTable.Rows) + { + if (row["ColumnName"] != null) + columnNames.Add(row["ColumnName"].ToString()); + } + + m_ColumnNames = columnNames; + } + public bool Store(RegionData data) { if (data.Data.ContainsKey("uuid")) From d3a4d67a207976cd0d116bb9021f7dfc896784e8 Mon Sep 17 00:00:00 2001 From: Oren Hurvitz Date: Mon, 23 Apr 2012 17:26:37 +0300 Subject: [PATCH 079/547] Refactored how asset/inventory types are associated with content types: gathered all the knowledge into a single class. Added the Mesh content type. --- OpenSim/Framework/SLUtil.cs | 386 ++++++++++++---------------- OpenSim/Framework/Tests/UtilTest.cs | 23 +- 2 files changed, 179 insertions(+), 230 deletions(-) diff --git a/OpenSim/Framework/SLUtil.cs b/OpenSim/Framework/SLUtil.cs index db4541ef1a..537de7ab15 100644 --- a/OpenSim/Framework/SLUtil.cs +++ b/OpenSim/Framework/SLUtil.cs @@ -38,239 +38,189 @@ namespace OpenSim.Framework public static class SLUtil { // private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - + #region SL / file extension / content-type conversions + private class TypeMapping + { + private sbyte assetType; + private InventoryType inventoryType; + private string contentType; + private string contentType2; + private string extension; + + public sbyte AssetTypeCode + { + get { return assetType; } + } + + public object AssetType + { + get { + if (Enum.IsDefined(typeof(OpenMetaverse.AssetType), assetType)) + return (OpenMetaverse.AssetType)assetType; + else + return OpenMetaverse.AssetType.Unknown; + } + } + + public InventoryType InventoryType + { + get { return inventoryType; } + } + + public string ContentType + { + get { return contentType; } + } + + public string ContentType2 + { + get { return contentType2; } + } + + public string Extension + { + get { return extension; } + } + + private TypeMapping(sbyte assetType, InventoryType inventoryType, string contentType, string contentType2, string extension) + { + this.assetType = assetType; + this.inventoryType = inventoryType; + this.contentType = contentType; + this.contentType2 = contentType2; + this.extension = extension; + } + + public TypeMapping(AssetType assetType, InventoryType inventoryType, string contentType, string contentType2, string extension) + : this((sbyte)assetType, inventoryType, contentType, contentType2, extension) + { + } + + public TypeMapping(AssetType assetType, InventoryType inventoryType, string contentType, string extension) + : this((sbyte)assetType, inventoryType, contentType, null, extension) + { + } + } + + /// + /// Maps between AssetType, InventoryType and Content-Type. + /// Where more than one possibility exists, the first one takes precedence. E.g.: + /// AssetType "AssetType.Texture" -> Content-Type "image-xj2c" + /// Content-Type "image/x-j2c" -> InventoryType "InventoryType.Texture" + /// + private static TypeMapping[] MAPPINGS = new TypeMapping[] { + new TypeMapping(AssetType.Unknown, InventoryType.Unknown, "application/octet-stream", "bin"), + new TypeMapping(AssetType.Texture, InventoryType.Texture, "image/x-j2c", "image/jp2", "j2c"), + new TypeMapping(AssetType.Texture, InventoryType.Snapshot, "image/x-j2c", "image/jp2", "j2c"), + new TypeMapping(AssetType.TextureTGA, InventoryType.Texture, "image/tga", "tga"), + new TypeMapping(AssetType.ImageTGA, InventoryType.Texture, "image/tga", "tga"), + new TypeMapping(AssetType.ImageJPEG, InventoryType.Texture, "image/jpeg", "jpg"), + new TypeMapping(AssetType.Sound, InventoryType.Sound, "audio/ogg", "application/ogg", "ogg"), + new TypeMapping(AssetType.SoundWAV, InventoryType.Sound, "audio/x-wav", "wav"), + new TypeMapping(AssetType.CallingCard, InventoryType.CallingCard, "application/vnd.ll.callingcard", "application/x-metaverse-callingcard", "callingcard"), + new TypeMapping(AssetType.Landmark, InventoryType.Landmark, "application/vnd.ll.landmark", "application/x-metaverse-landmark", "landmark"), + new TypeMapping(AssetType.Clothing, InventoryType.Wearable, "application/vnd.ll.clothing", "application/x-metaverse-clothing", "clothing"), + new TypeMapping(AssetType.Object, InventoryType.Object, "application/vnd.ll.primitive", "application/x-metaverse-primitive", "primitive"), + new TypeMapping(AssetType.Object, InventoryType.Attachment, "application/vnd.ll.primitive", "application/x-metaverse-primitive", "primitive"), + new TypeMapping(AssetType.Notecard, InventoryType.Notecard, "application/vnd.ll.notecard", "application/x-metaverse-notecard", "notecard"), + new TypeMapping(AssetType.Folder, InventoryType.Folder, "application/vnd.ll.folder", "folder"), + new TypeMapping(AssetType.RootFolder, InventoryType.RootCategory, "application/vnd.ll.rootfolder", "rootfolder"), + new TypeMapping(AssetType.LSLText, InventoryType.LSL, "application/vnd.ll.lsltext", "application/x-metaverse-lsl", "lsl"), + new TypeMapping(AssetType.LSLBytecode, InventoryType.LSL, "application/vnd.ll.lslbyte", "application/x-metaverse-lso", "lso"), + new TypeMapping(AssetType.Bodypart, InventoryType.Wearable, "application/vnd.ll.bodypart", "application/x-metaverse-bodypart", "bodypart"), + new TypeMapping(AssetType.TrashFolder, InventoryType.Folder, "application/vnd.ll.trashfolder", "trashfolder"), + new TypeMapping(AssetType.SnapshotFolder, InventoryType.Folder, "application/vnd.ll.snapshotfolder", "snapshotfolder"), + new TypeMapping(AssetType.LostAndFoundFolder, InventoryType.Folder, "application/vnd.ll.lostandfoundfolder", "lostandfoundfolder"), + new TypeMapping(AssetType.Animation, InventoryType.Animation, "application/vnd.ll.animation", "application/x-metaverse-animation", "animation"), + new TypeMapping(AssetType.Gesture, InventoryType.Gesture, "application/vnd.ll.gesture", "application/x-metaverse-gesture", "gesture"), + new TypeMapping(AssetType.Simstate, InventoryType.Snapshot, "application/x-metaverse-simstate", "simstate"), + new TypeMapping(AssetType.FavoriteFolder, InventoryType.Unknown, "application/vnd.ll.favoritefolder", "favoritefolder"), + new TypeMapping(AssetType.Link, InventoryType.Unknown, "application/vnd.ll.link", "link"), + new TypeMapping(AssetType.LinkFolder, InventoryType.Unknown, "application/vnd.ll.linkfolder", "linkfolder"), + new TypeMapping(AssetType.CurrentOutfitFolder, InventoryType.Unknown, "application/vnd.ll.currentoutfitfolder", "currentoutfitfolder"), + new TypeMapping(AssetType.OutfitFolder, InventoryType.Unknown, "application/vnd.ll.outfitfolder", "outfitfolder"), + new TypeMapping(AssetType.MyOutfitsFolder, InventoryType.Unknown, "application/vnd.ll.myoutfitsfolder", "myoutfitsfolder"), + new TypeMapping(AssetType.Mesh, InventoryType.Mesh, "application/vnd.ll.mesh", "llm") + }; + + private static Dictionary asset2Content; + private static Dictionary asset2Extension; + private static Dictionary inventory2Content; + private static Dictionary content2Asset; + private static Dictionary content2Inventory; + + static SLUtil() + { + asset2Content = new Dictionary(); + asset2Extension = new Dictionary(); + inventory2Content = new Dictionary(); + content2Asset = new Dictionary(); + content2Inventory = new Dictionary(); + + foreach (TypeMapping mapping in MAPPINGS) + { + sbyte assetType = mapping.AssetTypeCode; + if (!asset2Content.ContainsKey(assetType)) + asset2Content.Add(assetType, mapping.ContentType); + if (!asset2Extension.ContainsKey(assetType)) + asset2Extension.Add(assetType, mapping.Extension); + if (!inventory2Content.ContainsKey(mapping.InventoryType)) + inventory2Content.Add(mapping.InventoryType, mapping.ContentType); + if (!content2Asset.ContainsKey(mapping.ContentType)) + content2Asset.Add(mapping.ContentType, assetType); + if (!content2Inventory.ContainsKey(mapping.ContentType)) + content2Inventory.Add(mapping.ContentType, mapping.InventoryType); + + if (mapping.ContentType2 != null) + { + if (!content2Asset.ContainsKey(mapping.ContentType2)) + content2Asset.Add(mapping.ContentType2, assetType); + if (!content2Inventory.ContainsKey(mapping.ContentType2)) + content2Inventory.Add(mapping.ContentType2, mapping.InventoryType); + } + } + } + public static string SLAssetTypeToContentType(int assetType) { - switch ((AssetType)assetType) - { - case AssetType.Texture: - return "image/x-j2c"; - case AssetType.Sound: - return "audio/ogg"; - case AssetType.CallingCard: - return "application/vnd.ll.callingcard"; - case AssetType.Landmark: - return "application/vnd.ll.landmark"; - case AssetType.Clothing: - return "application/vnd.ll.clothing"; - case AssetType.Object: - return "application/vnd.ll.primitive"; - case AssetType.Notecard: - return "application/vnd.ll.notecard"; - case AssetType.Folder: - return "application/vnd.ll.folder"; - case AssetType.RootFolder: - return "application/vnd.ll.rootfolder"; - case AssetType.LSLText: - return "application/vnd.ll.lsltext"; - case AssetType.LSLBytecode: - return "application/vnd.ll.lslbyte"; - case AssetType.TextureTGA: - case AssetType.ImageTGA: - return "image/tga"; - case AssetType.Bodypart: - return "application/vnd.ll.bodypart"; - case AssetType.TrashFolder: - return "application/vnd.ll.trashfolder"; - case AssetType.SnapshotFolder: - return "application/vnd.ll.snapshotfolder"; - case AssetType.LostAndFoundFolder: - return "application/vnd.ll.lostandfoundfolder"; - case AssetType.SoundWAV: - return "audio/x-wav"; - case AssetType.ImageJPEG: - return "image/jpeg"; - case AssetType.Animation: - return "application/vnd.ll.animation"; - case AssetType.Gesture: - return "application/vnd.ll.gesture"; - case AssetType.Simstate: - return "application/x-metaverse-simstate"; - case AssetType.FavoriteFolder: - return "application/vnd.ll.favoritefolder"; - case AssetType.Link: - return "application/vnd.ll.link"; - case AssetType.LinkFolder: - return "application/vnd.ll.linkfolder"; - case AssetType.CurrentOutfitFolder: - return "application/vnd.ll.currentoutfitfolder"; - case AssetType.OutfitFolder: - return "application/vnd.ll.outfitfolder"; - case AssetType.MyOutfitsFolder: - return "application/vnd.ll.myoutfitsfolder"; - case AssetType.Unknown: - default: - return "application/octet-stream"; - } + string contentType; + if (!asset2Content.TryGetValue((sbyte)assetType, out contentType)) + contentType = asset2Content[(sbyte)AssetType.Unknown]; + return contentType; } public static string SLInvTypeToContentType(int invType) { - switch ((InventoryType)invType) - { - case InventoryType.Animation: - return "application/vnd.ll.animation"; - case InventoryType.CallingCard: - return "application/vnd.ll.callingcard"; - case InventoryType.Folder: - return "application/vnd.ll.folder"; - case InventoryType.Gesture: - return "application/vnd.ll.gesture"; - case InventoryType.Landmark: - return "application/vnd.ll.landmark"; - case InventoryType.LSL: - return "application/vnd.ll.lsltext"; - case InventoryType.Notecard: - return "application/vnd.ll.notecard"; - case InventoryType.Attachment: - case InventoryType.Object: - return "application/vnd.ll.primitive"; - case InventoryType.Sound: - return "audio/ogg"; - case InventoryType.Snapshot: - case InventoryType.Texture: - return "image/x-j2c"; - case InventoryType.Wearable: - return "application/vnd.ll.clothing"; - default: - return "application/octet-stream"; - } + string contentType; + if (!inventory2Content.TryGetValue((InventoryType)invType, out contentType)) + contentType = inventory2Content[InventoryType.Unknown]; + return contentType; } public static sbyte ContentTypeToSLAssetType(string contentType) { - switch (contentType) - { - case "image/x-j2c": - case "image/jp2": - return (sbyte)AssetType.Texture; - case "application/ogg": - case "audio/ogg": - return (sbyte)AssetType.Sound; - case "application/vnd.ll.callingcard": - case "application/x-metaverse-callingcard": - return (sbyte)AssetType.CallingCard; - case "application/vnd.ll.landmark": - case "application/x-metaverse-landmark": - return (sbyte)AssetType.Landmark; - case "application/vnd.ll.clothing": - case "application/x-metaverse-clothing": - return (sbyte)AssetType.Clothing; - case "application/vnd.ll.primitive": - case "application/x-metaverse-primitive": - return (sbyte)AssetType.Object; - case "application/vnd.ll.notecard": - case "application/x-metaverse-notecard": - return (sbyte)AssetType.Notecard; - case "application/vnd.ll.folder": - return (sbyte)AssetType.Folder; - case "application/vnd.ll.rootfolder": - return (sbyte)AssetType.RootFolder; - case "application/vnd.ll.lsltext": - case "application/x-metaverse-lsl": - return (sbyte)AssetType.LSLText; - case "application/vnd.ll.lslbyte": - case "application/x-metaverse-lso": - return (sbyte)AssetType.LSLBytecode; - case "image/tga": - // Note that AssetType.TextureTGA will be converted to AssetType.ImageTGA - return (sbyte)AssetType.ImageTGA; - case "application/vnd.ll.bodypart": - case "application/x-metaverse-bodypart": - return (sbyte)AssetType.Bodypart; - case "application/vnd.ll.trashfolder": - return (sbyte)AssetType.TrashFolder; - case "application/vnd.ll.snapshotfolder": - return (sbyte)AssetType.SnapshotFolder; - case "application/vnd.ll.lostandfoundfolder": - return (sbyte)AssetType.LostAndFoundFolder; - case "audio/x-wav": - return (sbyte)AssetType.SoundWAV; - case "image/jpeg": - return (sbyte)AssetType.ImageJPEG; - case "application/vnd.ll.animation": - case "application/x-metaverse-animation": - return (sbyte)AssetType.Animation; - case "application/vnd.ll.gesture": - case "application/x-metaverse-gesture": - return (sbyte)AssetType.Gesture; - case "application/x-metaverse-simstate": - return (sbyte)AssetType.Simstate; - case "application/vnd.ll.favoritefolder": - return (sbyte)AssetType.FavoriteFolder; - case "application/vnd.ll.link": - return (sbyte)AssetType.Link; - case "application/vnd.ll.linkfolder": - return (sbyte)AssetType.LinkFolder; - case "application/vnd.ll.currentoutfitfolder": - return (sbyte)AssetType.CurrentOutfitFolder; - case "application/vnd.ll.outfitfolder": - return (sbyte)AssetType.OutfitFolder; - case "application/vnd.ll.myoutfitsfolder": - return (sbyte)AssetType.MyOutfitsFolder; - case "application/octet-stream": - default: - return (sbyte)AssetType.Unknown; - } + sbyte assetType; + if (!content2Asset.TryGetValue(contentType, out assetType)) + assetType = (sbyte)AssetType.Unknown; + return (sbyte)assetType; } public static sbyte ContentTypeToSLInvType(string contentType) { - switch (contentType) - { - case "image/x-j2c": - case "image/jp2": - case "image/tga": - case "image/jpeg": - return (sbyte)InventoryType.Texture; - case "application/ogg": - case "audio/ogg": - case "audio/x-wav": - return (sbyte)InventoryType.Sound; - case "application/vnd.ll.callingcard": - case "application/x-metaverse-callingcard": - return (sbyte)InventoryType.CallingCard; - case "application/vnd.ll.landmark": - case "application/x-metaverse-landmark": - return (sbyte)InventoryType.Landmark; - case "application/vnd.ll.clothing": - case "application/x-metaverse-clothing": - case "application/vnd.ll.bodypart": - case "application/x-metaverse-bodypart": - return (sbyte)InventoryType.Wearable; - case "application/vnd.ll.primitive": - case "application/x-metaverse-primitive": - return (sbyte)InventoryType.Object; - case "application/vnd.ll.notecard": - case "application/x-metaverse-notecard": - return (sbyte)InventoryType.Notecard; - case "application/vnd.ll.folder": - return (sbyte)InventoryType.Folder; - case "application/vnd.ll.rootfolder": - return (sbyte)InventoryType.RootCategory; - case "application/vnd.ll.lsltext": - case "application/x-metaverse-lsl": - case "application/vnd.ll.lslbyte": - case "application/x-metaverse-lso": - return (sbyte)InventoryType.LSL; - case "application/vnd.ll.trashfolder": - case "application/vnd.ll.snapshotfolder": - case "application/vnd.ll.lostandfoundfolder": - return (sbyte)InventoryType.Folder; - case "application/vnd.ll.animation": - case "application/x-metaverse-animation": - return (sbyte)InventoryType.Animation; - case "application/vnd.ll.gesture": - case "application/x-metaverse-gesture": - return (sbyte)InventoryType.Gesture; - case "application/x-metaverse-simstate": - return (sbyte)InventoryType.Snapshot; - case "application/octet-stream": - default: - return (sbyte)InventoryType.Unknown; - } + InventoryType invType; + if (!content2Inventory.TryGetValue(contentType, out invType)) + invType = InventoryType.Unknown; + return (sbyte)invType; + } + + public static string SLAssetTypeToExtension(int assetType) + { + string extension; + if (!asset2Extension.TryGetValue((sbyte)assetType, out extension)) + extension = asset2Extension[(sbyte)AssetType.Unknown]; + return extension; } #endregion SL / file extension / content-type conversions @@ -377,4 +327,4 @@ namespace OpenSim.Framework return output; } } -} \ No newline at end of file +} diff --git a/OpenSim/Framework/Tests/UtilTest.cs b/OpenSim/Framework/Tests/UtilTest.cs index 1ca35dfcb5..f0d2a3f7a7 100644 --- a/OpenSim/Framework/Tests/UtilTest.cs +++ b/OpenSim/Framework/Tests/UtilTest.cs @@ -214,16 +214,13 @@ namespace OpenSim.Framework.Tests for (int i = 0; i < contenttypes.Length; i++) { - if (SLUtil.ContentTypeToSLAssetType(contenttypes[i]) == 18) - { - Assert.That(contenttypes[i] == "image/tga"); - } + int expected; + if (contenttypes[i] == "image/tga") + expected = 12; // if we know only the content-type "image/tga", then we assume the asset type is TextureTGA; not ImageTGA else - { - Assert.That(SLUtil.ContentTypeToSLAssetType(contenttypes[i]) == assettypes[i], - "Expecting {0} but got {1}", assettypes[i], - SLUtil.ContentTypeToSLAssetType(contenttypes[i])); - } + expected = assettypes[i]; + Assert.AreEqual(expected, SLUtil.ContentTypeToSLAssetType(contenttypes[i]), + String.Format("Incorrect AssetType mapped from Content-Type {0}", contenttypes[i])); } int[] inventorytypes = new int[] {-1,0,1,2,3,6,7,8,9,10,15,17,18,20}; @@ -237,7 +234,7 @@ namespace OpenSim.Framework.Tests "application/vnd.ll.primitive", "application/vnd.ll.notecard", "application/vnd.ll.folder", - "application/octet-stream", + "application/vnd.ll.rootfolder", "application/vnd.ll.lsltext", "image/x-j2c", "application/vnd.ll.primitive", @@ -247,7 +244,8 @@ namespace OpenSim.Framework.Tests for (int i=0;i Date: Mon, 23 Apr 2012 15:31:45 +0300 Subject: [PATCH 080/547] Minor improvements to logging Eliminated an extra newline in the console if the log line doesn't contain a category (example of a category: "[ASSETS]"). --- OpenSim/Framework/Console/LocalConsole.cs | 4 ++++ .../Avatar/Attachments/AttachmentsModule.cs | 4 +++- .../Avatar/AvatarFactory/AvatarFactoryModule.cs | 11 ++++++----- OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs | 4 ++-- OpenSim/Region/ScriptEngine/XEngine/XEngine.cs | 8 +++++--- OpenSim/Server/Base/ServerUtils.cs | 5 ++++- 6 files changed, 24 insertions(+), 12 deletions(-) diff --git a/OpenSim/Framework/Console/LocalConsole.cs b/OpenSim/Framework/Console/LocalConsole.cs index 7c8626dac0..f65813b9ee 100644 --- a/OpenSim/Framework/Console/LocalConsole.cs +++ b/OpenSim/Framework/Console/LocalConsole.cs @@ -296,6 +296,10 @@ namespace OpenSim.Framework.Console matches[0].Groups["Category"].Value); System.Console.Write("]:"); } + else + { + outText = outText.Trim(); + } } if (level == "error") diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs index faa413e811..0618addd6d 100644 --- a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs @@ -143,7 +143,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments } catch (Exception e) { - m_log.ErrorFormat("[ATTACHMENTS MODULE]: Unable to rez attachment: {0}{1}", e.Message, e.StackTrace); + UUID agentId = (sp.ControllingClient == null) ? (UUID)null : sp.ControllingClient.AgentId; + m_log.ErrorFormat("[ATTACHMENTS MODULE]: Unable to rez attachment with itemID {0}, assetID {1}, point {2} for {3}: {4}\n{5}", + attach.ItemID, attach.AssetID, p, agentId, e.Message, e.StackTrace); } } } diff --git a/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs b/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs index b0cee03e34..bf5609f0f1 100644 --- a/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs @@ -248,10 +248,10 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory if (bakedTextureFace == null) { - m_log.WarnFormat( - "[AV FACTORY]: No texture ID set for {0} for {1} in {2} not found when trying to save permanently", - bakeType, sp.Name, m_scene.RegionInfo.RegionName); - + // This can happen legitimately, since some baked textures might not exist + //m_log.WarnFormat( + // "[AV FACTORY]: No texture ID set for {0} for {1} in {2} not found when trying to save permanently", + // bakeType, sp.Name, m_scene.RegionInfo.RegionName); continue; } @@ -417,7 +417,8 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory // acd.AgentID, i, acd.Appearance.Texture.FaceTextures[i]); int ftIndex = (int)AppearanceManager.BakeTypeToAgentTextureIndex(bakeType); - bakedTextures[bakeType] = faceTextures[ftIndex]; + Primitive.TextureEntryFace texture = faceTextures[ftIndex]; // this will be null if there's no such baked texture + bakedTextures[bakeType] = texture; } return bakedTextures; diff --git a/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs b/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs index 2b8379dba9..435a683f21 100644 --- a/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs +++ b/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs @@ -157,7 +157,7 @@ namespace OpenSim.Region.OptionalModules.World.NPC sp.CompleteMovement(npcAvatar, false); m_avatars.Add(npcAvatar.AgentId, npcAvatar); - m_log.DebugFormat("[NPC MODULE]: Created NPC with id {0}", npcAvatar.AgentId); + m_log.DebugFormat("[NPC MODULE]: Created NPC {0} {1}", npcAvatar.AgentId, sp.Name); return npcAvatar.AgentId; } @@ -299,7 +299,7 @@ namespace OpenSim.Region.OptionalModules.World.NPC scene.RemoveClient(agentID, false); m_avatars.Remove(agentID); -// m_log.DebugFormat("[NPC MODULE]: Removed {0} {1}", agentID, av.Name); + m_log.DebugFormat("[NPC MODULE]: Removed NPC {0} {1}", agentID, av.Name); return true; } } diff --git a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs index 23a4cf92c0..a9b6e6754f 100644 --- a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs +++ b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs @@ -1812,9 +1812,11 @@ namespace OpenSim.Region.ScriptEngine.XEngine // if there already exists a file at that location, it may be locked. m_log.ErrorFormat("[XEngine]: File {0} already exists! {1}", path, ex.Message); } + + string textpath = path + ".text"; try { - using (FileStream fs = File.Create(path + ".text")) + using (FileStream fs = File.Create(textpath)) { using (StreamWriter sw = new StreamWriter(fs)) { @@ -1827,7 +1829,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine catch (IOException ex) { // if there already exists a file at that location, it may be locked. - m_log.ErrorFormat("[XEngine]: File {0} already exists! {1}", path, ex.Message); + m_log.ErrorFormat("[XEngine]: File {0} already exists! {1}", textpath, ex.Message); } } } @@ -1876,7 +1878,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine catch (IOException ex) { // if there already exists a file at that location, it may be locked. - m_log.ErrorFormat("[XEngine]: File {0} already exists! {1}", statepath, ex.Message); + m_log.ErrorFormat("[XEngine]: File {0} already exists! {1}", mappath, ex.Message); } } diff --git a/OpenSim/Server/Base/ServerUtils.cs b/OpenSim/Server/Base/ServerUtils.cs index 8effdd2d1b..0cc2a4b57f 100644 --- a/OpenSim/Server/Base/ServerUtils.cs +++ b/OpenSim/Server/Base/ServerUtils.cs @@ -117,7 +117,10 @@ namespace OpenSim.Server.Base catch (Exception e) { if (!(e is System.MissingMethodException)) - m_log.ErrorFormat("Error loading plugin from {0}, exception {1}", dllName, e.InnerException); + { + m_log.ErrorFormat("Error loading plugin {0} from {1}. Exception: {2}", + interfaceName, dllName, e.InnerException == null ? e.Message : e.InnerException.Message); + } return null; } From ef1668adb3f1fe2294d1ce824752e0bc73ef67ac Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Tue, 24 Apr 2012 21:42:32 +0100 Subject: [PATCH 081/547] Revert "Refactored how asset/inventory types are associated with content types: gathered all the knowledge into a single class. Added the Mesh content type." This reverts commit d3a4d67a207976cd0d116bb9021f7dfc896784e8. Accidentally committed this when I didn't mean to yet. --- OpenSim/Framework/SLUtil.cs | 386 ++++++++++++++++------------ OpenSim/Framework/Tests/UtilTest.cs | 23 +- 2 files changed, 230 insertions(+), 179 deletions(-) diff --git a/OpenSim/Framework/SLUtil.cs b/OpenSim/Framework/SLUtil.cs index 537de7ab15..db4541ef1a 100644 --- a/OpenSim/Framework/SLUtil.cs +++ b/OpenSim/Framework/SLUtil.cs @@ -38,189 +38,239 @@ namespace OpenSim.Framework public static class SLUtil { // private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - + #region SL / file extension / content-type conversions - private class TypeMapping - { - private sbyte assetType; - private InventoryType inventoryType; - private string contentType; - private string contentType2; - private string extension; - - public sbyte AssetTypeCode - { - get { return assetType; } - } - - public object AssetType - { - get { - if (Enum.IsDefined(typeof(OpenMetaverse.AssetType), assetType)) - return (OpenMetaverse.AssetType)assetType; - else - return OpenMetaverse.AssetType.Unknown; - } - } - - public InventoryType InventoryType - { - get { return inventoryType; } - } - - public string ContentType - { - get { return contentType; } - } - - public string ContentType2 - { - get { return contentType2; } - } - - public string Extension - { - get { return extension; } - } - - private TypeMapping(sbyte assetType, InventoryType inventoryType, string contentType, string contentType2, string extension) - { - this.assetType = assetType; - this.inventoryType = inventoryType; - this.contentType = contentType; - this.contentType2 = contentType2; - this.extension = extension; - } - - public TypeMapping(AssetType assetType, InventoryType inventoryType, string contentType, string contentType2, string extension) - : this((sbyte)assetType, inventoryType, contentType, contentType2, extension) - { - } - - public TypeMapping(AssetType assetType, InventoryType inventoryType, string contentType, string extension) - : this((sbyte)assetType, inventoryType, contentType, null, extension) - { - } - } - - /// - /// Maps between AssetType, InventoryType and Content-Type. - /// Where more than one possibility exists, the first one takes precedence. E.g.: - /// AssetType "AssetType.Texture" -> Content-Type "image-xj2c" - /// Content-Type "image/x-j2c" -> InventoryType "InventoryType.Texture" - /// - private static TypeMapping[] MAPPINGS = new TypeMapping[] { - new TypeMapping(AssetType.Unknown, InventoryType.Unknown, "application/octet-stream", "bin"), - new TypeMapping(AssetType.Texture, InventoryType.Texture, "image/x-j2c", "image/jp2", "j2c"), - new TypeMapping(AssetType.Texture, InventoryType.Snapshot, "image/x-j2c", "image/jp2", "j2c"), - new TypeMapping(AssetType.TextureTGA, InventoryType.Texture, "image/tga", "tga"), - new TypeMapping(AssetType.ImageTGA, InventoryType.Texture, "image/tga", "tga"), - new TypeMapping(AssetType.ImageJPEG, InventoryType.Texture, "image/jpeg", "jpg"), - new TypeMapping(AssetType.Sound, InventoryType.Sound, "audio/ogg", "application/ogg", "ogg"), - new TypeMapping(AssetType.SoundWAV, InventoryType.Sound, "audio/x-wav", "wav"), - new TypeMapping(AssetType.CallingCard, InventoryType.CallingCard, "application/vnd.ll.callingcard", "application/x-metaverse-callingcard", "callingcard"), - new TypeMapping(AssetType.Landmark, InventoryType.Landmark, "application/vnd.ll.landmark", "application/x-metaverse-landmark", "landmark"), - new TypeMapping(AssetType.Clothing, InventoryType.Wearable, "application/vnd.ll.clothing", "application/x-metaverse-clothing", "clothing"), - new TypeMapping(AssetType.Object, InventoryType.Object, "application/vnd.ll.primitive", "application/x-metaverse-primitive", "primitive"), - new TypeMapping(AssetType.Object, InventoryType.Attachment, "application/vnd.ll.primitive", "application/x-metaverse-primitive", "primitive"), - new TypeMapping(AssetType.Notecard, InventoryType.Notecard, "application/vnd.ll.notecard", "application/x-metaverse-notecard", "notecard"), - new TypeMapping(AssetType.Folder, InventoryType.Folder, "application/vnd.ll.folder", "folder"), - new TypeMapping(AssetType.RootFolder, InventoryType.RootCategory, "application/vnd.ll.rootfolder", "rootfolder"), - new TypeMapping(AssetType.LSLText, InventoryType.LSL, "application/vnd.ll.lsltext", "application/x-metaverse-lsl", "lsl"), - new TypeMapping(AssetType.LSLBytecode, InventoryType.LSL, "application/vnd.ll.lslbyte", "application/x-metaverse-lso", "lso"), - new TypeMapping(AssetType.Bodypart, InventoryType.Wearable, "application/vnd.ll.bodypart", "application/x-metaverse-bodypart", "bodypart"), - new TypeMapping(AssetType.TrashFolder, InventoryType.Folder, "application/vnd.ll.trashfolder", "trashfolder"), - new TypeMapping(AssetType.SnapshotFolder, InventoryType.Folder, "application/vnd.ll.snapshotfolder", "snapshotfolder"), - new TypeMapping(AssetType.LostAndFoundFolder, InventoryType.Folder, "application/vnd.ll.lostandfoundfolder", "lostandfoundfolder"), - new TypeMapping(AssetType.Animation, InventoryType.Animation, "application/vnd.ll.animation", "application/x-metaverse-animation", "animation"), - new TypeMapping(AssetType.Gesture, InventoryType.Gesture, "application/vnd.ll.gesture", "application/x-metaverse-gesture", "gesture"), - new TypeMapping(AssetType.Simstate, InventoryType.Snapshot, "application/x-metaverse-simstate", "simstate"), - new TypeMapping(AssetType.FavoriteFolder, InventoryType.Unknown, "application/vnd.ll.favoritefolder", "favoritefolder"), - new TypeMapping(AssetType.Link, InventoryType.Unknown, "application/vnd.ll.link", "link"), - new TypeMapping(AssetType.LinkFolder, InventoryType.Unknown, "application/vnd.ll.linkfolder", "linkfolder"), - new TypeMapping(AssetType.CurrentOutfitFolder, InventoryType.Unknown, "application/vnd.ll.currentoutfitfolder", "currentoutfitfolder"), - new TypeMapping(AssetType.OutfitFolder, InventoryType.Unknown, "application/vnd.ll.outfitfolder", "outfitfolder"), - new TypeMapping(AssetType.MyOutfitsFolder, InventoryType.Unknown, "application/vnd.ll.myoutfitsfolder", "myoutfitsfolder"), - new TypeMapping(AssetType.Mesh, InventoryType.Mesh, "application/vnd.ll.mesh", "llm") - }; - - private static Dictionary asset2Content; - private static Dictionary asset2Extension; - private static Dictionary inventory2Content; - private static Dictionary content2Asset; - private static Dictionary content2Inventory; - - static SLUtil() - { - asset2Content = new Dictionary(); - asset2Extension = new Dictionary(); - inventory2Content = new Dictionary(); - content2Asset = new Dictionary(); - content2Inventory = new Dictionary(); - - foreach (TypeMapping mapping in MAPPINGS) - { - sbyte assetType = mapping.AssetTypeCode; - if (!asset2Content.ContainsKey(assetType)) - asset2Content.Add(assetType, mapping.ContentType); - if (!asset2Extension.ContainsKey(assetType)) - asset2Extension.Add(assetType, mapping.Extension); - if (!inventory2Content.ContainsKey(mapping.InventoryType)) - inventory2Content.Add(mapping.InventoryType, mapping.ContentType); - if (!content2Asset.ContainsKey(mapping.ContentType)) - content2Asset.Add(mapping.ContentType, assetType); - if (!content2Inventory.ContainsKey(mapping.ContentType)) - content2Inventory.Add(mapping.ContentType, mapping.InventoryType); - - if (mapping.ContentType2 != null) - { - if (!content2Asset.ContainsKey(mapping.ContentType2)) - content2Asset.Add(mapping.ContentType2, assetType); - if (!content2Inventory.ContainsKey(mapping.ContentType2)) - content2Inventory.Add(mapping.ContentType2, mapping.InventoryType); - } - } - } - public static string SLAssetTypeToContentType(int assetType) { - string contentType; - if (!asset2Content.TryGetValue((sbyte)assetType, out contentType)) - contentType = asset2Content[(sbyte)AssetType.Unknown]; - return contentType; + switch ((AssetType)assetType) + { + case AssetType.Texture: + return "image/x-j2c"; + case AssetType.Sound: + return "audio/ogg"; + case AssetType.CallingCard: + return "application/vnd.ll.callingcard"; + case AssetType.Landmark: + return "application/vnd.ll.landmark"; + case AssetType.Clothing: + return "application/vnd.ll.clothing"; + case AssetType.Object: + return "application/vnd.ll.primitive"; + case AssetType.Notecard: + return "application/vnd.ll.notecard"; + case AssetType.Folder: + return "application/vnd.ll.folder"; + case AssetType.RootFolder: + return "application/vnd.ll.rootfolder"; + case AssetType.LSLText: + return "application/vnd.ll.lsltext"; + case AssetType.LSLBytecode: + return "application/vnd.ll.lslbyte"; + case AssetType.TextureTGA: + case AssetType.ImageTGA: + return "image/tga"; + case AssetType.Bodypart: + return "application/vnd.ll.bodypart"; + case AssetType.TrashFolder: + return "application/vnd.ll.trashfolder"; + case AssetType.SnapshotFolder: + return "application/vnd.ll.snapshotfolder"; + case AssetType.LostAndFoundFolder: + return "application/vnd.ll.lostandfoundfolder"; + case AssetType.SoundWAV: + return "audio/x-wav"; + case AssetType.ImageJPEG: + return "image/jpeg"; + case AssetType.Animation: + return "application/vnd.ll.animation"; + case AssetType.Gesture: + return "application/vnd.ll.gesture"; + case AssetType.Simstate: + return "application/x-metaverse-simstate"; + case AssetType.FavoriteFolder: + return "application/vnd.ll.favoritefolder"; + case AssetType.Link: + return "application/vnd.ll.link"; + case AssetType.LinkFolder: + return "application/vnd.ll.linkfolder"; + case AssetType.CurrentOutfitFolder: + return "application/vnd.ll.currentoutfitfolder"; + case AssetType.OutfitFolder: + return "application/vnd.ll.outfitfolder"; + case AssetType.MyOutfitsFolder: + return "application/vnd.ll.myoutfitsfolder"; + case AssetType.Unknown: + default: + return "application/octet-stream"; + } } public static string SLInvTypeToContentType(int invType) { - string contentType; - if (!inventory2Content.TryGetValue((InventoryType)invType, out contentType)) - contentType = inventory2Content[InventoryType.Unknown]; - return contentType; + switch ((InventoryType)invType) + { + case InventoryType.Animation: + return "application/vnd.ll.animation"; + case InventoryType.CallingCard: + return "application/vnd.ll.callingcard"; + case InventoryType.Folder: + return "application/vnd.ll.folder"; + case InventoryType.Gesture: + return "application/vnd.ll.gesture"; + case InventoryType.Landmark: + return "application/vnd.ll.landmark"; + case InventoryType.LSL: + return "application/vnd.ll.lsltext"; + case InventoryType.Notecard: + return "application/vnd.ll.notecard"; + case InventoryType.Attachment: + case InventoryType.Object: + return "application/vnd.ll.primitive"; + case InventoryType.Sound: + return "audio/ogg"; + case InventoryType.Snapshot: + case InventoryType.Texture: + return "image/x-j2c"; + case InventoryType.Wearable: + return "application/vnd.ll.clothing"; + default: + return "application/octet-stream"; + } } public static sbyte ContentTypeToSLAssetType(string contentType) { - sbyte assetType; - if (!content2Asset.TryGetValue(contentType, out assetType)) - assetType = (sbyte)AssetType.Unknown; - return (sbyte)assetType; + switch (contentType) + { + case "image/x-j2c": + case "image/jp2": + return (sbyte)AssetType.Texture; + case "application/ogg": + case "audio/ogg": + return (sbyte)AssetType.Sound; + case "application/vnd.ll.callingcard": + case "application/x-metaverse-callingcard": + return (sbyte)AssetType.CallingCard; + case "application/vnd.ll.landmark": + case "application/x-metaverse-landmark": + return (sbyte)AssetType.Landmark; + case "application/vnd.ll.clothing": + case "application/x-metaverse-clothing": + return (sbyte)AssetType.Clothing; + case "application/vnd.ll.primitive": + case "application/x-metaverse-primitive": + return (sbyte)AssetType.Object; + case "application/vnd.ll.notecard": + case "application/x-metaverse-notecard": + return (sbyte)AssetType.Notecard; + case "application/vnd.ll.folder": + return (sbyte)AssetType.Folder; + case "application/vnd.ll.rootfolder": + return (sbyte)AssetType.RootFolder; + case "application/vnd.ll.lsltext": + case "application/x-metaverse-lsl": + return (sbyte)AssetType.LSLText; + case "application/vnd.ll.lslbyte": + case "application/x-metaverse-lso": + return (sbyte)AssetType.LSLBytecode; + case "image/tga": + // Note that AssetType.TextureTGA will be converted to AssetType.ImageTGA + return (sbyte)AssetType.ImageTGA; + case "application/vnd.ll.bodypart": + case "application/x-metaverse-bodypart": + return (sbyte)AssetType.Bodypart; + case "application/vnd.ll.trashfolder": + return (sbyte)AssetType.TrashFolder; + case "application/vnd.ll.snapshotfolder": + return (sbyte)AssetType.SnapshotFolder; + case "application/vnd.ll.lostandfoundfolder": + return (sbyte)AssetType.LostAndFoundFolder; + case "audio/x-wav": + return (sbyte)AssetType.SoundWAV; + case "image/jpeg": + return (sbyte)AssetType.ImageJPEG; + case "application/vnd.ll.animation": + case "application/x-metaverse-animation": + return (sbyte)AssetType.Animation; + case "application/vnd.ll.gesture": + case "application/x-metaverse-gesture": + return (sbyte)AssetType.Gesture; + case "application/x-metaverse-simstate": + return (sbyte)AssetType.Simstate; + case "application/vnd.ll.favoritefolder": + return (sbyte)AssetType.FavoriteFolder; + case "application/vnd.ll.link": + return (sbyte)AssetType.Link; + case "application/vnd.ll.linkfolder": + return (sbyte)AssetType.LinkFolder; + case "application/vnd.ll.currentoutfitfolder": + return (sbyte)AssetType.CurrentOutfitFolder; + case "application/vnd.ll.outfitfolder": + return (sbyte)AssetType.OutfitFolder; + case "application/vnd.ll.myoutfitsfolder": + return (sbyte)AssetType.MyOutfitsFolder; + case "application/octet-stream": + default: + return (sbyte)AssetType.Unknown; + } } public static sbyte ContentTypeToSLInvType(string contentType) { - InventoryType invType; - if (!content2Inventory.TryGetValue(contentType, out invType)) - invType = InventoryType.Unknown; - return (sbyte)invType; - } - - public static string SLAssetTypeToExtension(int assetType) - { - string extension; - if (!asset2Extension.TryGetValue((sbyte)assetType, out extension)) - extension = asset2Extension[(sbyte)AssetType.Unknown]; - return extension; + switch (contentType) + { + case "image/x-j2c": + case "image/jp2": + case "image/tga": + case "image/jpeg": + return (sbyte)InventoryType.Texture; + case "application/ogg": + case "audio/ogg": + case "audio/x-wav": + return (sbyte)InventoryType.Sound; + case "application/vnd.ll.callingcard": + case "application/x-metaverse-callingcard": + return (sbyte)InventoryType.CallingCard; + case "application/vnd.ll.landmark": + case "application/x-metaverse-landmark": + return (sbyte)InventoryType.Landmark; + case "application/vnd.ll.clothing": + case "application/x-metaverse-clothing": + case "application/vnd.ll.bodypart": + case "application/x-metaverse-bodypart": + return (sbyte)InventoryType.Wearable; + case "application/vnd.ll.primitive": + case "application/x-metaverse-primitive": + return (sbyte)InventoryType.Object; + case "application/vnd.ll.notecard": + case "application/x-metaverse-notecard": + return (sbyte)InventoryType.Notecard; + case "application/vnd.ll.folder": + return (sbyte)InventoryType.Folder; + case "application/vnd.ll.rootfolder": + return (sbyte)InventoryType.RootCategory; + case "application/vnd.ll.lsltext": + case "application/x-metaverse-lsl": + case "application/vnd.ll.lslbyte": + case "application/x-metaverse-lso": + return (sbyte)InventoryType.LSL; + case "application/vnd.ll.trashfolder": + case "application/vnd.ll.snapshotfolder": + case "application/vnd.ll.lostandfoundfolder": + return (sbyte)InventoryType.Folder; + case "application/vnd.ll.animation": + case "application/x-metaverse-animation": + return (sbyte)InventoryType.Animation; + case "application/vnd.ll.gesture": + case "application/x-metaverse-gesture": + return (sbyte)InventoryType.Gesture; + case "application/x-metaverse-simstate": + return (sbyte)InventoryType.Snapshot; + case "application/octet-stream": + default: + return (sbyte)InventoryType.Unknown; + } } #endregion SL / file extension / content-type conversions @@ -327,4 +377,4 @@ namespace OpenSim.Framework return output; } } -} +} \ No newline at end of file diff --git a/OpenSim/Framework/Tests/UtilTest.cs b/OpenSim/Framework/Tests/UtilTest.cs index f0d2a3f7a7..1ca35dfcb5 100644 --- a/OpenSim/Framework/Tests/UtilTest.cs +++ b/OpenSim/Framework/Tests/UtilTest.cs @@ -214,13 +214,16 @@ namespace OpenSim.Framework.Tests for (int i = 0; i < contenttypes.Length; i++) { - int expected; - if (contenttypes[i] == "image/tga") - expected = 12; // if we know only the content-type "image/tga", then we assume the asset type is TextureTGA; not ImageTGA + if (SLUtil.ContentTypeToSLAssetType(contenttypes[i]) == 18) + { + Assert.That(contenttypes[i] == "image/tga"); + } else - expected = assettypes[i]; - Assert.AreEqual(expected, SLUtil.ContentTypeToSLAssetType(contenttypes[i]), - String.Format("Incorrect AssetType mapped from Content-Type {0}", contenttypes[i])); + { + Assert.That(SLUtil.ContentTypeToSLAssetType(contenttypes[i]) == assettypes[i], + "Expecting {0} but got {1}", assettypes[i], + SLUtil.ContentTypeToSLAssetType(contenttypes[i])); + } } int[] inventorytypes = new int[] {-1,0,1,2,3,6,7,8,9,10,15,17,18,20}; @@ -234,7 +237,7 @@ namespace OpenSim.Framework.Tests "application/vnd.ll.primitive", "application/vnd.ll.notecard", "application/vnd.ll.folder", - "application/vnd.ll.rootfolder", + "application/octet-stream", "application/vnd.ll.lsltext", "image/x-j2c", "application/vnd.ll.primitive", @@ -244,8 +247,7 @@ namespace OpenSim.Framework.Tests for (int i=0;i Date: Tue, 24 Apr 2012 23:00:50 +0100 Subject: [PATCH 082/547] Go back to always using the local timezone for now - not all machines have US/Pacific or Olsen Amercia/Los_Angeles and this introduces variability that the server operator cannot control Please see http://opensimulator.org/mantis/view.php?id=5972 soon for more comments. --- .../LLLoginService/LLLoginResponse.cs | 31 +++++++++++-------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/OpenSim/Services/LLLoginService/LLLoginResponse.cs b/OpenSim/Services/LLLoginService/LLLoginResponse.cs index 10a44edc52..01de15990d 100644 --- a/OpenSim/Services/LLLoginService/LLLoginResponse.cs +++ b/OpenSim/Services/LLLoginService/LLLoginResponse.cs @@ -351,21 +351,26 @@ namespace OpenSim.Services.LLLoginService { TimeZoneInfo gridTimeZone; - try - { - // First try to fetch DST from Pacific Standard Time, because this is - // the one expected by the viewer. "US/Pacific" is the string to search - // on linux and mac, and should work also on Windows (to confirm) - gridTimeZone = TimeZoneInfo.FindSystemTimeZoneById("US/Pacific"); - } - catch (Exception e) - { - m_log.WarnFormat( - "[TIMEZONE]: {0} Falling back to system time. System time should be set to Pacific Standard Time to provide the expected time", - e.Message); + // Disabled for now pending making timezone a config value, which can at some point have a default of + // a ; separated list of possible timezones. + // The problem here is that US/Pacific (or even the Olsen America/Los_Angeles) is not universal across + // windows, mac and various distributions of linux, introducing another element of consistency. + // The server operator needs to be able to control this setting +// try +// { +// // First try to fetch DST from Pacific Standard Time, because this is +// // the one expected by the viewer. "US/Pacific" is the string to search +// // on linux and mac, and should work also on Windows (to confirm) +// gridTimeZone = TimeZoneInfo.FindSystemTimeZoneById("US/Pacific"); +// } +// catch (Exception e) +// { +// m_log.WarnFormat( +// "[TIMEZONE]: {0} Falling back to system time. System time should be set to Pacific Standard Time to provide the expected time", +// e.Message); gridTimeZone = TimeZoneInfo.Local; - } +// } DST = gridTimeZone.IsDaylightSavingTime(DateTime.Now) ? "Y" : "N"; From 0f470326aad70fd763911dab831f05191d8542f1 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Wed, 25 Apr 2012 00:19:38 +0100 Subject: [PATCH 083/547] Improve teleport log debug and error messages to tell us who is teleporting. --- .../EntityTransfer/EntityTransferModule.cs | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs index fa9cd551ad..feb783f74a 100644 --- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs +++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs @@ -172,13 +172,17 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer // Reset animations; the viewer does that in teleports. sp.Animator.ResetAnimations(); + string destinationRegionName = "(not found)"; + try { if (regionHandle == sp.Scene.RegionInfo.RegionHandle) { + destinationRegionName = sp.Scene.RegionInfo.RegionName; + m_log.DebugFormat( - "[ENTITY TRANSFER MODULE]: RequestTeleportToLocation {0} within {1}", - position, sp.Scene.RegionInfo.RegionName); + "[ENTITY TRANSFER MODULE]: RequestTeleportToLocation for {0} to {1} within existing region {2}", + sp.Name, position, destinationRegionName); // Teleport within the same region if (IsOutsideRegion(sp.Scene, position) || position.Z < 0) @@ -188,6 +192,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer m_log.WarnFormat( "[ENTITY TRANSFER MODULE]: RequestTeleportToLocation() was given an illegal position of {0} for avatar {1}, {2}. Substituting {3}", position, sp.Name, sp.UUID, emergencyPos); + position = emergencyPos; } @@ -233,6 +238,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer return; } + destinationRegionName = finalDestination.RegionName; + // check if HyperGrid teleport is allowed, based on user level int flags = m_aScene.GridService.GetRegionFlags(sp.Scene.RegionInfo.ScopeID, reg.RegionID); @@ -307,7 +314,11 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer } catch (Exception e) { - m_log.WarnFormat("[ENTITY TRANSFER MODULE]: Exception on teleport: {0} {1}", e.Message, e.StackTrace); + m_log.ErrorFormat( + "[ENTITY TRANSFER MODULE]: Exception on teleport of {0} from {1}@{2} to {3}@{4}: {5}{6}", + sp.Name, sp.AbsolutePosition, sp.Scene.RegionInfo.RegionName, position, destinationRegionName, + e.Message, e.StackTrace); + sp.ControllingClient.SendTeleportFailed("Internal error"); } } From 39a6d7cab45597ab9b91e0af6ce378bad7fc8146 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Wed, 25 Apr 2012 00:47:32 +0100 Subject: [PATCH 084/547] Comment out the noisier AVFACTORY log messages for now. Permanently comment out warnings about ScenePresence not being found - this is entirely expected if the avatar has alraedy logged out or left the scene. --- .../Avatar/AvatarFactory/AvatarFactoryModule.cs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs b/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs index bf5609f0f1..0ed10d2864 100644 --- a/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs @@ -158,7 +158,7 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory // Process the baked texture array if (textureEntry != null) { - m_log.InfoFormat("[AVFACTORY]: Received texture update for {0} {1}", sp.Name, sp.UUID); +// m_log.DebugFormat("[AVFACTORY]: Received texture update for {0} {1}", sp.Name, sp.UUID); // WriteBakedTexturesReport(sp, m_log.DebugFormat); @@ -208,7 +208,8 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory ScenePresence sp = m_scene.GetScenePresence(agentId); if (sp == null) { - m_log.WarnFormat("[AVFACTORY]: Agent {0} no longer in the scene", agentId); + // This is expected if the user has gone away. +// m_log.DebugFormat("[AVFACTORY]: Agent {0} no longer in the scene", agentId); return false; } @@ -337,7 +338,7 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory return false; } - m_log.DebugFormat("[AVFACTORY]: Completed texture check for {0} {1}", sp.Name, sp.UUID); +// m_log.DebugFormat("[AVFACTORY]: Completed texture check for {0} {1}", sp.Name, sp.UUID); // If we only found default textures, then the appearance is not cached return (defonly ? false : true); @@ -483,7 +484,8 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory ScenePresence sp = m_scene.GetScenePresence(agentid); if (sp == null) { - m_log.WarnFormat("[AVFACTORY]: Agent {0} no longer in the scene", agentid); + // This is expected if the user has gone away. +// m_log.DebugFormat("[AVFACTORY]: Agent {0} no longer in the scene", agentid); return; } From 6b299a428708a92865c7a49cb7ab808485761560 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Wed, 25 Apr 2012 00:52:33 +0100 Subject: [PATCH 085/547] Comment out some debug ATTACHMENTS log messages for now. --- .../Avatar/Attachments/AttachmentsModule.cs | 29 +++++++++---------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs index 0618addd6d..7200c4bc00 100644 --- a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs @@ -391,7 +391,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments lock (sp.AttachmentsSyncLock) { // Save avatar attachment information - m_log.Debug("[ATTACHMENTS MODULE]: Detaching from UserID: " + sp.UUID + ", ItemID: " + itemID); +// m_log.Debug("[ATTACHMENTS MODULE]: Detaching from UserID: " + sp.UUID + ", ItemID: " + itemID); bool changed = sp.Appearance.DetachAttachment(itemID); if (changed && m_scene.AvatarFactory != null) @@ -471,9 +471,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments if (grp.HasGroupChanged || (saveAllScripted && grp.ContainsScripts())) { - m_log.DebugFormat( - "[ATTACHMENTS MODULE]: Updating asset for attachment {0}, attachpoint {1}", - grp.UUID, grp.AttachmentPoint); +// m_log.DebugFormat( +// "[ATTACHMENTS MODULE]: Updating asset for attachment {0}, attachpoint {1}", +// grp.UUID, grp.AttachmentPoint); string sceneObjectXml = SceneObjectSerializer.ToOriginalXmlFormat(grp); @@ -504,12 +504,12 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments } grp.HasGroupChanged = false; // Prevent it being saved over and over } - else - { - m_log.DebugFormat( - "[ATTACHMENTS MODULE]: Don't need to update asset for unchanged attachment {0}, attachpoint {1}", - grp.UUID, grp.AttachmentPoint); - } +// else +// { +// m_log.DebugFormat( +// "[ATTACHMENTS MODULE]: Don't need to update asset for unchanged attachment {0}, attachpoint {1}", +// grp.UUID, grp.AttachmentPoint); +// } } /// @@ -891,13 +891,12 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments // Calls attach with a Zero position if (AttachObject(sp, part.ParentGroup, AttachmentPt, false)) { - m_scene.EventManager.TriggerOnAttach(objectLocalID, part.ParentGroup.FromItemID, remoteClient.AgentId); +// m_log.Debug( +// "[ATTACHMENTS MODULE]: Saving avatar attachment. AgentID: " + remoteClient.AgentId +// + ", AttachmentPoint: " + AttachmentPt); // Save avatar attachment information - m_log.Debug( - "[ATTACHMENTS MODULE]: Saving avatar attachment. AgentID: " + remoteClient.AgentId - + ", AttachmentPoint: " + AttachmentPt); - + m_scene.EventManager.TriggerOnAttach(objectLocalID, part.ParentGroup.FromItemID, remoteClient.AgentId); } } catch (Exception e) From f24289c47f81caf92c7cb91428008ce1bd038301 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Wed, 25 Apr 2012 01:09:23 +0100 Subject: [PATCH 086/547] Comment out AvatarService.SetAvatar debug log line for now --- OpenSim/Services/AvatarService/AvatarService.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Services/AvatarService/AvatarService.cs b/OpenSim/Services/AvatarService/AvatarService.cs index c59a9e0263..423c7818f0 100644 --- a/OpenSim/Services/AvatarService/AvatarService.cs +++ b/OpenSim/Services/AvatarService/AvatarService.cs @@ -93,7 +93,7 @@ namespace OpenSim.Services.AvatarService if (kvp.Key.StartsWith("_")) count++; - m_log.DebugFormat("[AVATAR SERVICE]: SetAvatar for {0}, attachs={1}", principalID, count); +// m_log.DebugFormat("[AVATAR SERVICE]: SetAvatar for {0}, attachs={1}", principalID, count); m_Database.Delete("PrincipalID", principalID.ToString()); AvatarBaseData av = new AvatarBaseData(); From a65ca24701ac34415bf76f4d9094ab42ae721c9a Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Wed, 25 Apr 2012 01:51:40 +0100 Subject: [PATCH 087/547] Add regression test TestSameRegionTeleport() --- .../EntityTransfer/EntityTransferModule.cs | 2 +- .../Region/Framework/Scenes/ScenePresence.cs | 6 ++++ .../Tests/ScenePresenceTeleportTests.cs | 36 +++++++++++++++++++ 3 files changed, 43 insertions(+), 1 deletion(-) diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs index feb783f74a..221e0bdfc5 100644 --- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs +++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs @@ -192,7 +192,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer m_log.WarnFormat( "[ENTITY TRANSFER MODULE]: RequestTeleportToLocation() was given an illegal position of {0} for avatar {1}, {2}. Substituting {3}", position, sp.Name, sp.UUID, emergencyPos); - + position = emergencyPos; } diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index b5f789b52a..9005acdebe 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs @@ -990,6 +990,8 @@ namespace OpenSim.Region.Framework.Scenes /// public void Teleport(Vector3 pos) { +// m_log.DebugFormat("[SCENE PRESENCE]: Moving {0} to {1} in {2}", Name, pos, Scene.RegionInfo.RegionName); + bool isFlying = Flying; RemoveFromPhysicalScene(); Velocity = Vector3.Zero; @@ -1002,6 +1004,10 @@ namespace OpenSim.Region.Framework.Scenes public void TeleportWithMomentum(Vector3 pos) { +// m_log.DebugFormat( +// "[SCENE PRESENCE]: Moving {0} to {1} with existing momentum {2} in {3} ", +// Name, pos, Velocity, Scene.RegionInfo.RegionName); + bool isFlying = Flying; RemoveFromPhysicalScene(); CheckLandingPoint(ref pos); diff --git a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTeleportTests.cs b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTeleportTests.cs index bebc10ca25..eb7bfbd802 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTeleportTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTeleportTests.cs @@ -33,6 +33,7 @@ using OpenMetaverse; using OpenSim.Framework; using OpenSim.Framework.Communications; using OpenSim.Framework.Servers; +using OpenSim.Region.CoreModules.Framework.EntityTransfer; using OpenSim.Region.Framework.Interfaces; using OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation; using OpenSim.Tests.Common; @@ -47,6 +48,41 @@ namespace OpenSim.Region.Framework.Scenes.Tests [TestFixture] public class ScenePresenceTeleportTests { + [Test] + public void TestSameRegionTeleport() + { + TestHelpers.InMethod(); +// log4net.Config.XmlConfigurator.Configure(); + + EntityTransferModule etm = new EntityTransferModule(); + + IConfigSource config = new IniConfigSource(); + config.AddConfig("Modules"); + // Not strictly necessary since FriendsModule assumes it is the default (!) + config.Configs["Modules"].Set("EntityTransferModule", etm.Name); + + TestScene scene = SceneHelpers.SetupScene("sceneA", TestHelpers.ParseTail(0x100), 1000, 1000); + SceneHelpers.SetupSceneModules(scene, config, etm); + + Vector3 teleportPosition = new Vector3(10, 11, 12); + Vector3 teleportLookAt = new Vector3(20, 21, 22); + + ScenePresence sp = SceneHelpers.AddScenePresence(scene, TestHelpers.ParseTail(0x1)); + sp.AbsolutePosition = new Vector3(30, 31, 32); + scene.RequestTeleportLocation( + sp.ControllingClient, + scene.RegionInfo.RegionHandle, + teleportPosition, + teleportLookAt, + (uint)TeleportFlags.ViaLocation); + + Assert.That(sp.AbsolutePosition, Is.EqualTo(teleportPosition)); + + // Lookat is sent to the client only - sp.Lookat does not yield the same thing (calculation from camera + // position instead). +// Assert.That(sp.Lookat, Is.EqualTo(teleportLookAt)); + } + /// /// Test a teleport between two regions that are not neighbours and do not share any neighbours in common. /// From 683cfc6f827c15ee70e4651cbcc7b94a01d2f8e3 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Wed, 25 Apr 2012 02:07:55 +0100 Subject: [PATCH 088/547] refactor: Combine ScenePresence.Teleport() and TeleportWithMomentum() These are identical apart from setting Velocity = zero, which has no practical effect anyway since this is zeroed when the avatar is added back to the physics scene. --- OpenSim/Region/Framework/Scenes/ScenePresence.cs | 16 ---------------- .../Scripting/Minimodule/SPAvatar.cs | 2 +- 2 files changed, 1 insertion(+), 17 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index 9005acdebe..8cb49216f7 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs @@ -992,22 +992,6 @@ namespace OpenSim.Region.Framework.Scenes { // m_log.DebugFormat("[SCENE PRESENCE]: Moving {0} to {1} in {2}", Name, pos, Scene.RegionInfo.RegionName); - bool isFlying = Flying; - RemoveFromPhysicalScene(); - Velocity = Vector3.Zero; - CheckLandingPoint(ref pos); - AbsolutePosition = pos; - AddToPhysicalScene(isFlying); - - SendTerseUpdateToAllClients(); - } - - public void TeleportWithMomentum(Vector3 pos) - { -// m_log.DebugFormat( -// "[SCENE PRESENCE]: Moving {0} to {1} with existing momentum {2} in {3} ", -// Name, pos, Velocity, Scene.RegionInfo.RegionName); - bool isFlying = Flying; RemoveFromPhysicalScene(); CheckLandingPoint(ref pos); diff --git a/OpenSim/Region/OptionalModules/Scripting/Minimodule/SPAvatar.cs b/OpenSim/Region/OptionalModules/Scripting/Minimodule/SPAvatar.cs index 922eaafeda..d192309dea 100644 --- a/OpenSim/Region/OptionalModules/Scripting/Minimodule/SPAvatar.cs +++ b/OpenSim/Region/OptionalModules/Scripting/Minimodule/SPAvatar.cs @@ -68,7 +68,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule public Vector3 WorldPosition { get { return GetSP().AbsolutePosition; } - set { GetSP().TeleportWithMomentum(value); } + set { GetSP().Teleport(value); } } public bool IsChildAgent From af86e2939c54837d47303668266ca314d405fb37 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Wed, 25 Apr 2012 03:47:26 +0100 Subject: [PATCH 089/547] zero out SP velocity before calling SP.Teleport(), as the client expects (though this is also effectively done by physics at the moment) --- .../CoreModules/Framework/EntityTransfer/EntityTransferModule.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs index 221e0bdfc5..f0943463a7 100644 --- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs +++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs @@ -215,6 +215,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer sp.ControllingClient.SendTeleportStart(teleportFlags); sp.ControllingClient.SendLocalTeleport(position, lookAt, teleportFlags); + sp.Velocity = Vector3.Zero; sp.Teleport(position); foreach (SceneObjectGroup grp in sp.GetAttachments()) From 3be3189ee067b26fa6486535a65a0c0e99a9ef5b Mon Sep 17 00:00:00 2001 From: Melanie Date: Wed, 25 Apr 2012 04:00:01 +0100 Subject: [PATCH 090/547] Commit the avination Teleport() methods (adaptedto justincc's changes) --- OpenSim/Region/Framework/Scenes/ScenePresence.cs | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index 8cb49216f7..e8178ce905 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs @@ -990,13 +990,24 @@ namespace OpenSim.Region.Framework.Scenes /// public void Teleport(Vector3 pos) { -// m_log.DebugFormat("[SCENE PRESENCE]: Moving {0} to {1} in {2}", Name, pos, Scene.RegionInfo.RegionName); + TeleportWithMomentum(pos, null); + } + public void TeleportWithMomentum(Vector3 pos, Vector3? v) + { bool isFlying = Flying; + Vector3 vel = Velocity; RemoveFromPhysicalScene(); CheckLandingPoint(ref pos); AbsolutePosition = pos; AddToPhysicalScene(isFlying); + if (PhysicsActor != null) + { + if (v.HasValue) + PhysicsActor.SetMomentum((Vector3)v); + else + PhysicsActor.SetMomentum(vel); + } SendTerseUpdateToAllClients(); } From cf1c34605bf58ee783c2a7d0c63f51ecf6d3288a Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Tue, 24 Apr 2012 22:17:10 -0700 Subject: [PATCH 091/547] HG: Moved User-level code down to the HGEntityTransferModule where it belongs. --- .../EntityTransfer/EntityTransferModule.cs | 15 +-------------- .../EntityTransfer/HGEntityTransferModule.cs | 13 +++++++++++++ 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs index 221e0bdfc5..8d810fc4e2 100644 --- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs +++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs @@ -61,8 +61,6 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer set { m_MaxTransferDistance = value; } } - private int m_levelHGTeleport = 0; - protected bool m_Enabled = false; protected Scene m_aScene; protected List m_Scenes = new List(); @@ -106,7 +104,6 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer if (transferConfig != null) { MaxTransferDistance = transferConfig.GetInt("max_distance", 4095); - m_levelHGTeleport = transferConfig.GetInt("LevelHGTeleport", 0); } m_agentsInTransit = new List(); @@ -240,16 +237,6 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer destinationRegionName = finalDestination.RegionName; - // check if HyperGrid teleport is allowed, based on user level - int flags = m_aScene.GridService.GetRegionFlags(sp.Scene.RegionInfo.ScopeID, reg.RegionID); - - if (((flags & (int)OpenSim.Data.RegionFlags.Hyperlink) != 0) && (sp.UserLevel < m_levelHGTeleport)) - { - m_log.WarnFormat("[ENTITY TRANSFER MODULE]: Final destination link is non permitted hypergrid region. Unable to teleport agent."); - sp.ControllingClient.SendTeleportFailed("HyperGrid teleport not permitted"); - return; - } - uint curX = 0, curY = 0; Utils.LongToUInts(sp.Scene.RegionInfo.RegionHandle, out curX, out curY); int curCellX = (int)(curX / Constants.RegionSize); @@ -413,7 +400,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer bool logout = false; if (!CreateAgent(sp, reg, finalDestination, agentCircuit, teleportFlags, out reason, out logout)) { - sp.ControllingClient.SendTeleportFailed(String.Format("Destination refused: {0}", + sp.ControllingClient.SendTeleportFailed(String.Format("Teleport refused: {0}", reason)); return; } diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs index 7f9175d2fc..6a92e61f12 100644 --- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs +++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs @@ -50,6 +50,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); private bool m_Initialized = false; + private int m_levelHGTeleport = 0; private GatekeeperServiceConnector m_GatekeeperConnector; @@ -68,6 +69,10 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer string name = moduleConfig.GetString("EntityTransferModule", ""); if (name == Name) { + IConfig transferConfig = source.Configs["EntityTransfer"]; + if (transferConfig != null) + m_levelHGTeleport = transferConfig.GetInt("LevelHGTeleport", 0); + InitialiseCommon(source); m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: {0} enabled.", Name); } @@ -164,6 +169,14 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer if (flags == -1 /* no region in DB */ || (flags & (int)OpenSim.Data.RegionFlags.Hyperlink) != 0) { // this user is going to another grid + // check if HyperGrid teleport is allowed, based on user level + if (sp.UserLevel < m_levelHGTeleport) + { + m_log.WarnFormat("[ENTITY TRANSFER MODULE]: Final destination link is non permitted hypergrid region. Unable to teleport agent."); + reason = "HyperGrid teleport not permitted"; + return false; + } + if (agentCircuit.ServiceURLs.ContainsKey("HomeURI")) { string userAgentDriver = agentCircuit.ServiceURLs["HomeURI"].ToString(); From 7aa25c6762e40ee9254e2982a9fca89913fa0279 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Tue, 24 Apr 2012 22:40:07 -0700 Subject: [PATCH 092/547] Slight rewording of output messages. --- .../Framework/EntityTransfer/HGEntityTransferModule.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs index 6a92e61f12..634fb4315e 100644 --- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs +++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs @@ -172,7 +172,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer // check if HyperGrid teleport is allowed, based on user level if (sp.UserLevel < m_levelHGTeleport) { - m_log.WarnFormat("[ENTITY TRANSFER MODULE]: Final destination link is non permitted hypergrid region. Unable to teleport agent."); + m_log.WarnFormat("[HG ENTITY TRANSFER MODULE]: Unable to HG teleport agent due to insufficient UserLevel."); reason = "HyperGrid teleport not permitted"; return false; } From bec100a662f2734b5da0cc8d4fb731da019b4304 Mon Sep 17 00:00:00 2001 From: Mic Bowman Date: Wed, 25 Apr 2012 09:51:30 -0700 Subject: [PATCH 093/547] Add try/catch around Json script method registration to avoild some issues with .NET 3.5 vs 4.0 differences. See http://opensimulator.org/mantis/view.php?id=5971 --- .../JsonStore/JsonStoreScriptModule.cs | 39 ++++++++++++------- 1 file changed, 24 insertions(+), 15 deletions(-) diff --git a/OpenSim/Region/OptionalModules/Scripting/JsonStore/JsonStoreScriptModule.cs b/OpenSim/Region/OptionalModules/Scripting/JsonStore/JsonStoreScriptModule.cs index eda2aef9ed..4949097632 100644 --- a/OpenSim/Region/OptionalModules/Scripting/JsonStore/JsonStoreScriptModule.cs +++ b/OpenSim/Region/OptionalModules/Scripting/JsonStore/JsonStoreScriptModule.cs @@ -163,28 +163,37 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore return; } - m_comms.RegisterScriptInvocation(this,"JsonCreateStore"); - m_comms.RegisterScriptInvocation(this,"JsonDestroyStore"); + try + { + m_comms.RegisterScriptInvocation(this,"JsonCreateStore"); + m_comms.RegisterScriptInvocation(this,"JsonDestroyStore"); - m_comms.RegisterScriptInvocation(this,"JsonReadNotecard"); - m_comms.RegisterScriptInvocation(this,"JsonWriteNotecard"); + m_comms.RegisterScriptInvocation(this,"JsonReadNotecard"); + m_comms.RegisterScriptInvocation(this,"JsonWriteNotecard"); - m_comms.RegisterScriptInvocation(this,"JsonTestPath"); - m_comms.RegisterScriptInvocation(this,"JsonTestPathJson"); + m_comms.RegisterScriptInvocation(this,"JsonTestPath"); + m_comms.RegisterScriptInvocation(this,"JsonTestPathJson"); - m_comms.RegisterScriptInvocation(this,"JsonGetValue"); - m_comms.RegisterScriptInvocation(this,"JsonGetValueJson"); + m_comms.RegisterScriptInvocation(this,"JsonGetValue"); + m_comms.RegisterScriptInvocation(this,"JsonGetValueJson"); - m_comms.RegisterScriptInvocation(this,"JsonTakeValue"); - m_comms.RegisterScriptInvocation(this,"JsonTakeValueJson"); + m_comms.RegisterScriptInvocation(this,"JsonTakeValue"); + m_comms.RegisterScriptInvocation(this,"JsonTakeValueJson"); - m_comms.RegisterScriptInvocation(this,"JsonReadValue"); - m_comms.RegisterScriptInvocation(this,"JsonReadValueJson"); + m_comms.RegisterScriptInvocation(this,"JsonReadValue"); + m_comms.RegisterScriptInvocation(this,"JsonReadValueJson"); - m_comms.RegisterScriptInvocation(this,"JsonSetValue"); - m_comms.RegisterScriptInvocation(this,"JsonSetValueJson"); + m_comms.RegisterScriptInvocation(this,"JsonSetValue"); + m_comms.RegisterScriptInvocation(this,"JsonSetValueJson"); - m_comms.RegisterScriptInvocation(this,"JsonRemoveValue"); + m_comms.RegisterScriptInvocation(this,"JsonRemoveValue"); + } + catch (Exception e) + { + // See http://opensimulator.org/mantis/view.php?id=5971 for more information + m_log.WarnFormat("[JsonStroreScripts] script method registration failed; {0}",e.Message); + m_enabled = false; + } } } From 88c9fdfa3adda4984aed39bf800832adef883ecc Mon Sep 17 00:00:00 2001 From: Melanie Date: Wed, 25 Apr 2012 18:36:29 +0100 Subject: [PATCH 094/547] Adapt some TeleportWithMomentum calls --- OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs | 2 +- .../Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs b/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs index 02ac091d21..06d5587ca8 100644 --- a/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs +++ b/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs @@ -1771,7 +1771,7 @@ namespace OpenSim.Region.CoreModules.World.Land Vector3 pos = m_scene.GetNearestAllowedPosition(targetAvatar, land); - targetAvatar.TeleportWithMomentum(pos); + targetAvatar.TeleportWithMomentum(pos, null); targetAvatar.ControllingClient.SendAlertMessage("You have been ejected by " + parcelManager.Firstname + " " + parcelManager.Lastname); parcelManager.ControllingClient.SendAlertMessage("Avatar Ejected."); diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index 8637df7281..5a5f2e1304 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -6115,7 +6115,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api if (m_host.OwnerID == land.LandData.OwnerID) { Vector3 pos = World.GetNearestAllowedPosition(presence, land); - presence.TeleportWithMomentum(pos); + presence.TeleportWithMomentum(pos, null); presence.ControllingClient.SendAlertMessage("You have been ejected from this land"); } } From 88553bb884c5c8849ec61362e65fe0950c1e3080 Mon Sep 17 00:00:00 2001 From: Melanie Date: Wed, 25 Apr 2012 19:09:22 +0100 Subject: [PATCH 095/547] Port Avination link order to make OpenSim behave like SL. Make Primstar scripts work. Fixes Mantis #5990 --- .../Framework/Scenes/SceneObjectGroup.cs | 42 ++++++++++++++++++- .../Shared/Api/Implementation/LSL_Api.cs | 12 +++--- 2 files changed, 47 insertions(+), 7 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs index 49a3485183..268600409f 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs @@ -1969,6 +1969,11 @@ namespace OpenSim.Region.Framework.Scenes /// The group of prims which should be linked to this group public void LinkToGroup(SceneObjectGroup objectGroup) { + LinkToGroup(objectGroup, false); + } + + public void LinkToGroup(SceneObjectGroup objectGroup, bool insert) + { // m_log.DebugFormat( // "[SCENE OBJECT GROUP]: Linking group with root part {0}, {1} to group with root part {2}, {3}", // objectGroup.RootPart.Name, objectGroup.RootPart.UUID, RootPart.Name, RootPart.UUID); @@ -1979,6 +1984,10 @@ namespace OpenSim.Region.Framework.Scenes SceneObjectPart linkPart = objectGroup.m_rootPart; + // physics flags from group to be applied to linked parts + bool grpusephys = UsesPhysics; + bool grptemporary = IsTemporary; + Vector3 oldGroupPosition = linkPart.GroupPosition; Quaternion oldRootRotation = linkPart.RotationOffset; @@ -2002,15 +2011,35 @@ namespace OpenSim.Region.Framework.Scenes lock (m_parts.SyncRoot) { - int linkNum = PrimCount + 1; + int linkNum; + if (insert) + { + linkNum = 2; + foreach (SceneObjectPart part in Parts) + { + if (part.LinkNum > 1) + part.LinkNum++; + } + } + else + { + linkNum = PrimCount + 1; + } m_parts.Add(linkPart.UUID, linkPart); linkPart.SetParent(this); linkPart.CreateSelected = true; + // let physics know preserve part volume dtc messy since UpdatePrimFlags doesn't look to parent changes for now + linkPart.UpdatePrimFlags(grpusephys, grptemporary, (IsPhantom || (linkPart.Flags & PrimFlags.Phantom) != 0), linkPart.VolumeDetectActive); + if (linkPart.PhysActor != null && m_rootPart.PhysActor != null && m_rootPart.PhysActor.IsPhysical) + { + linkPart.PhysActor.link(m_rootPart.PhysActor); + this.Scene.PhysicsScene.AddPhysicsActorTaint(linkPart.PhysActor); + } + linkPart.LinkNum = linkNum++; - linkPart.UpdatePrimFlags(UsesPhysics, IsTemporary, IsPhantom, IsVolumeDetect); SceneObjectPart[] ogParts = objectGroup.Parts; Array.Sort(ogParts, delegate(SceneObjectPart a, SceneObjectPart b) @@ -2022,7 +2051,16 @@ namespace OpenSim.Region.Framework.Scenes { SceneObjectPart part = ogParts[i]; if (part.UUID != objectGroup.m_rootPart.UUID) + { LinkNonRootPart(part, oldGroupPosition, oldRootRotation, linkNum++); + // let physics know + part.UpdatePrimFlags(grpusephys, grptemporary, (IsPhantom || (part.Flags & PrimFlags.Phantom) != 0), part.VolumeDetectActive); + if (part.PhysActor != null && m_rootPart.PhysActor != null && m_rootPart.PhysActor.IsPhysical) + { + part.PhysActor.link(m_rootPart.PhysActor); + this.Scene.PhysicsScene.AddPhysicsActorTaint(part.PhysActor); + } + } part.ClearUndoState(); } } diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index d4c872cd00..d641958daf 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -832,8 +832,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public void llRegionSayTo(string target, int channel, string msg) { - string error = String.Empty; - if (msg.Length > 1023) msg = msg.Substring(0, 1023); @@ -3548,7 +3546,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public void llCreateLink(string target, int parent) { m_host.AddScriptLPS(1); - UUID targetID; if (!UUID.TryParse(target, out targetID)) @@ -3572,11 +3569,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api if (targetPart.ParentGroup.AttachmentPoint != 0) return; // Fail silently if attached + + if (targetPart.ParentGroup.RootPart.OwnerID != m_host.ParentGroup.RootPart.OwnerID) + return; + SceneObjectGroup parentPrim = null, childPrim = null; if (targetPart != null) { - if (parent != 0) { + if (parent != 0) + { parentPrim = m_host.ParentGroup; childPrim = targetPart.ParentGroup; } @@ -3588,7 +3590,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api // Required for linking childPrim.RootPart.ClearUpdateSchedule(); - parentPrim.LinkToGroup(childPrim); + parentPrim.LinkToGroup(childPrim, true); } parentPrim.TriggerScriptChangedEvent(Changed.LINK); From a2d544c9383391f483bdfb82026e2ebc9c88388f Mon Sep 17 00:00:00 2001 From: Mic Bowman Date: Wed, 25 Apr 2012 11:54:57 -0700 Subject: [PATCH 096/547] Add a configuration switch to turn on/off the use of the trash folder when deleting objects from a scene. The use of the trash folder causes assets to be created and stored everytime you delete an object from the scene (slows down the delete and adds mostly useless assets to your database). Default is on (use the trash folder) which is the standard behavior. --- OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | 2 +- OpenSim/Region/Framework/Scenes/Scene.cs | 2 ++ bin/OpenSimDefaults.ini | 7 +++++++ 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs index 10b25edac1..816d3b64ce 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs @@ -1988,7 +1988,7 @@ namespace OpenSim.Region.Framework.Scenes } } - if (permissionToTake) + if (permissionToTake && (action != DeRezAction.Delete || this.m_useTrashOnDelete)) { m_asyncSceneObjectDeleter.DeleteToInventory( action, destinationID, deleteGroups, remoteClient, diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index a87dfb7d0f..7a2b2edd81 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -103,6 +103,7 @@ namespace OpenSim.Region.Framework.Scenes public bool m_trustBinaries; public bool m_allowScriptCrossings; public bool m_useFlySlow; + public bool m_useTrashOnDelete = true; /// /// Temporarily setting to trigger appearance resends at 60 second intervals. @@ -709,6 +710,7 @@ namespace OpenSim.Region.Framework.Scenes m_clampPrimSize = true; } + m_useTrashOnDelete = startupConfig.GetBoolean("UseTrashOnDelete",m_useTrashOnDelete); m_trustBinaries = startupConfig.GetBoolean("TrustBinaries", m_trustBinaries); m_allowScriptCrossings = startupConfig.GetBoolean("AllowScriptCrossing", m_allowScriptCrossings); m_dontPersistBefore = diff --git a/bin/OpenSimDefaults.ini b/bin/OpenSimDefaults.ini index 3f2f1318ac..cb9ef224fb 100644 --- a/bin/OpenSimDefaults.ini +++ b/bin/OpenSimDefaults.ini @@ -337,6 +337,13 @@ ; OpenJPEG if false ; UseCSJ2K = true + + ; Use "Trash" folder for items deleted from the scene + ; When set to True (the default) items deleted from the scene will be + ; stored in the user's trash or lost and found folder. When set to + ; False items will be removed from the scene permanently + UseTrashOnDelete = True + ; Persist avatar baked textures ; Persisting baked textures can speed up login and region border ; crossings especially with large numbers of users, though it From 74dbfe6bb5cebf0ea2af5cb80ff03a15a12e125e Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Wed, 25 Apr 2012 23:46:42 +0100 Subject: [PATCH 097/547] Comment out avatar move to target message for now. --- OpenSim/Region/Framework/Scenes/ScenePresence.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index e8178ce905..7a9421571e 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs @@ -1690,9 +1690,9 @@ namespace OpenSim.Region.Framework.Scenes if (pos.Z - terrainHeight < 0.2) pos.Z = terrainHeight; - m_log.DebugFormat( - "[SCENE PRESENCE]: Avatar {0} set move to target {1} (terrain height {2}) in {3}", - Name, pos, terrainHeight, m_scene.RegionInfo.RegionName); +// m_log.DebugFormat( +// "[SCENE PRESENCE]: Avatar {0} set move to target {1} (terrain height {2}) in {3}", +// Name, pos, terrainHeight, m_scene.RegionInfo.RegionName); if (noFly) Flying = false; From e52fe03fffc908c4a3387ba77a204ec19f9ed9d4 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 26 Apr 2012 00:42:37 +0100 Subject: [PATCH 098/547] minor: Add avatar name to removing agent log message --- OpenSim/Region/Framework/Scenes/Scene.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 7a2b2edd81..a46c827cde 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -3217,8 +3217,8 @@ namespace OpenSim.Region.Framework.Scenes try { m_log.DebugFormat( - "[SCENE]: Removing {0} agent {1} from region {2}", - (isChildAgent ? "child" : "root"), agentID, RegionInfo.RegionName); + "[SCENE]: Removing {0} agent {1} {2} from region {2}", + (isChildAgent ? "child" : "root"), avatar.Name, agentID, RegionInfo.RegionName); m_sceneGraph.removeUserCount(!isChildAgent); From 4c4ffb986897dfc66d296aa30f6111393eb02710 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 26 Apr 2012 00:43:31 +0100 Subject: [PATCH 099/547] Add request verb and url to error messages in WebUtil that lack this. Make exception printing consistent across windows and mono. --- OpenSim/Framework/WebUtil.cs | 55 +++++++++++++++++++++++++----------- 1 file changed, 38 insertions(+), 17 deletions(-) diff --git a/OpenSim/Framework/WebUtil.cs b/OpenSim/Framework/WebUtil.cs index ead8f463f7..d2aa538ce1 100644 --- a/OpenSim/Framework/WebUtil.cs +++ b/OpenSim/Framework/WebUtil.cs @@ -86,8 +86,7 @@ namespace OpenSim.Framework return eplock; } } - - + #region JSONRequest /// @@ -216,7 +215,9 @@ namespace OpenSim.Framework reqnum,url,method,tickdiff,tickdata); } - m_log.DebugFormat("[WEB UTIL]: <{0}> osd request for {1}, method {2} FAILED: {3}", reqnum, url, method, errorMessage); + m_log.DebugFormat( + "[WEB UTIL]: <{0}> osd request for {1}, method {2} FAILED: {3}", reqnum, url, method, errorMessage); + return ErrorResponseMap(errorMessage); } @@ -357,7 +358,8 @@ namespace OpenSim.Framework reqnum,url,method,tickdiff,tickdata); } - m_log.WarnFormat("[WEB UTIL]: <{0}> form request failed: {1}",reqnum,errorMessage); + m_log.WarnFormat("[WEB UTIL]: <{0}> form request to {1} failed: {2}", reqnum, url, errorMessage); + return ErrorResponseMap(errorMessage); } @@ -771,12 +773,16 @@ namespace OpenSim.Framework } else { - m_log.ErrorFormat("[ASYNC REQUEST]: Request {0} {1} failed with status {2} and message {3}", verb, requestUrl, e.Status, e.Message); + m_log.ErrorFormat( + "[ASYNC REQUEST]: Request {0} {1} failed with status {2} and message {3}", + verb, requestUrl, e.Status, e.Message); } } catch (Exception e) { - m_log.ErrorFormat("[ASYNC REQUEST]: Request {0} {1} failed with exception {2}", verb, requestUrl, e); + m_log.ErrorFormat( + "[ASYNC REQUEST]: Request {0} {1} failed with exception {2}{3}", + verb, requestUrl, e.Message, e.StackTrace); } // m_log.DebugFormat("[ASYNC REQUEST]: Received {0}", deserial.ToString()); @@ -788,7 +794,8 @@ namespace OpenSim.Framework catch (Exception e) { m_log.ErrorFormat( - "[ASYNC REQUEST]: Request {0} {1} callback failed with exception {2}", verb, requestUrl, e); + "[ASYNC REQUEST]: Request {0} {1} callback failed with exception {2}{3}", + verb, requestUrl, e.Message, e.StackTrace); } }, null); @@ -841,7 +848,8 @@ namespace OpenSim.Framework } catch (Exception e) { - m_log.DebugFormat("[FORMS]: exception occured on sending request to {0}: " + e.ToString(), requestUrl); + m_log.DebugFormat( + "[FORMS]: exception occured {0} {1}: {2}{3}", verb, requestUrl, e.Message, e.StackTrace); } finally { @@ -867,7 +875,9 @@ namespace OpenSim.Framework } catch (Exception e) { - m_log.DebugFormat("[FORMS]: exception occured on receiving reply " + e.ToString()); + m_log.DebugFormat( + "[FORMS]: Exception occured on receiving {0} {1}: {2}{3}", + verb, requestUrl, e.Message, e.StackTrace); } finally { @@ -880,7 +890,7 @@ namespace OpenSim.Framework catch (System.InvalidOperationException) { // This is what happens when there is invalid XML - m_log.DebugFormat("[FORMS]: InvalidOperationException on receiving request"); + m_log.DebugFormat("[FORMS]: InvalidOperationException on receiving {0} {1}", verb, requestUrl); } } return respstring; @@ -938,7 +948,10 @@ namespace OpenSim.Framework } catch (Exception e) { - m_log.DebugFormat("[SynchronousRestObjectRequester]: exception in sending data to {0}: {1}", requestUrl, e); + m_log.DebugFormat( + "[SynchronousRestObjectRequester]: Exception in making request {0} {1}: {2}{3}", + verb, requestUrl, e.Message, e.StackTrace); + return deserial; } finally @@ -960,7 +973,11 @@ namespace OpenSim.Framework respStream.Close(); } else - m_log.DebugFormat("[SynchronousRestObjectRequester]: Oops! no content found in response stream from {0} {1}", requestUrl, verb); + { + m_log.DebugFormat( + "[SynchronousRestObjectRequester]: Oops! no content found in response stream from {0} {1}", + verb, requestUrl); + } } } catch (WebException e) @@ -971,20 +988,24 @@ namespace OpenSim.Framework return deserial; else m_log.ErrorFormat( - "[SynchronousRestObjectRequester]: WebException {0} {1} {2} {3}", - requestUrl, typeof(TResponse).ToString(), e.Message, e.StackTrace); + "[SynchronousRestObjectRequester]: WebException for {0} {1} {2}: {3} {4}", + verb, requestUrl, typeof(TResponse).ToString(), e.Message, e.StackTrace); } catch (System.InvalidOperationException) { // This is what happens when there is invalid XML - m_log.DebugFormat("[SynchronousRestObjectRequester]: Invalid XML {0} {1}", requestUrl, typeof(TResponse).ToString()); + m_log.DebugFormat( + "[SynchronousRestObjectRequester]: Invalid XML from {0} {1} {2}", + verb, requestUrl, typeof(TResponse).ToString()); } catch (Exception e) { - m_log.DebugFormat("[SynchronousRestObjectRequester]: Exception on response from {0} {1}", requestUrl, e); + m_log.DebugFormat( + "[SynchronousRestObjectRequester]: Exception on response from {0} {1}: {2}{3}", + verb, requestUrl, e.Message, e.StackTrace); } return deserial; } } -} +} \ No newline at end of file From b0cbf16c19495814920e138deba4d1bb47615582 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 26 Apr 2012 16:04:49 +0100 Subject: [PATCH 100/547] minor: Add region name to dropped inbound packet message --- OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs index fb6b11e209..d05f72ff8e 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs @@ -1350,7 +1350,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP } else { - m_log.DebugFormat("[LLUDPSERVER]: Dropping incoming {0} packet for dead client {1}", packet.Type, udpClient.AgentID); + m_log.DebugFormat( + "[LLUDPSERVER]: Dropped incoming {0} for dead client {1} in {2}", + packet.Type, udpClient.AgentID, m_scene.RegionInfo.RegionName); } } From f49912f92abfae79ba00da74fc7665548266f7cd Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 26 Apr 2012 16:10:24 +0100 Subject: [PATCH 101/547] minor: Add more detail to unauthorized caps client message --- .../ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs b/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs index 8ec2f200bb..e20c24f334 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs @@ -235,7 +235,10 @@ namespace OpenSim.Region.ClientStack.Linden if (!m_Scene.CheckClient(m_HostCapsObj.AgentID, httpRequest.RemoteIPEndPoint)) { - m_log.DebugFormat("[CAPS]: Unauthorized CAPS client"); + m_log.DebugFormat( + "[CAPS]: Unauthorized CAPS client {0} from {1}", + m_HostCapsObj.AgentID, httpRequest.RemoteIPEndPoint); + return string.Empty; } From ca228c4770660096bde98fb603e7e295808a2133 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 26 Apr 2012 16:20:53 +0100 Subject: [PATCH 102/547] Comment out old Scene.HandleLogOffUserFromGrid() to reduce client closing analysis complexity --- OpenSim/Region/Framework/Scenes/Scene.cs | 70 ++++++++++++------------ 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index a46c827cde..dacd9b694f 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -3796,41 +3796,41 @@ namespace OpenSim.Region.Framework.Scenes return m_authenticateHandler.TryChangeCiruitCode(oldcc, newcc); } - /// - /// The Grid has requested that we log-off a user. Log them off. - /// - /// Unique ID of the avatar to log-off - /// SecureSessionID of the user, or the RegionSecret text when logging on to the grid - /// message to display to the user. Reason for being logged off - public void HandleLogOffUserFromGrid(UUID AvatarID, UUID RegionSecret, string message) - { - ScenePresence loggingOffUser = GetScenePresence(AvatarID); - if (loggingOffUser != null) - { - UUID localRegionSecret = UUID.Zero; - bool parsedsecret = UUID.TryParse(m_regInfo.regionSecret, out localRegionSecret); - - // Region Secret is used here in case a new sessionid overwrites an old one on the user server. - // Will update the user server in a few revisions to use it. - - if (RegionSecret == loggingOffUser.ControllingClient.SecureSessionId || (parsedsecret && RegionSecret == localRegionSecret)) - { - m_sceneGridService.SendCloseChildAgentConnections(loggingOffUser.UUID, loggingOffUser.KnownRegionHandles); - loggingOffUser.ControllingClient.Kick(message); - // Give them a second to receive the message! - Thread.Sleep(1000); - loggingOffUser.ControllingClient.Close(); - } - else - { - m_log.Info("[USERLOGOFF]: System sending the LogOff user message failed to sucessfully authenticate"); - } - } - else - { - m_log.InfoFormat("[USERLOGOFF]: Got a logoff request for {0} but the user isn't here. The user might already have been logged out", AvatarID.ToString()); - } - } +// /// +// /// The Grid has requested that we log-off a user. Log them off. +// /// +// /// Unique ID of the avatar to log-off +// /// SecureSessionID of the user, or the RegionSecret text when logging on to the grid +// /// message to display to the user. Reason for being logged off +// public void HandleLogOffUserFromGrid(UUID AvatarID, UUID RegionSecret, string message) +// { +// ScenePresence loggingOffUser = GetScenePresence(AvatarID); +// if (loggingOffUser != null) +// { +// UUID localRegionSecret = UUID.Zero; +// bool parsedsecret = UUID.TryParse(m_regInfo.regionSecret, out localRegionSecret); +// +// // Region Secret is used here in case a new sessionid overwrites an old one on the user server. +// // Will update the user server in a few revisions to use it. +// +// if (RegionSecret == loggingOffUser.ControllingClient.SecureSessionId || (parsedsecret && RegionSecret == localRegionSecret)) +// { +// m_sceneGridService.SendCloseChildAgentConnections(loggingOffUser.UUID, loggingOffUser.KnownRegionHandles); +// loggingOffUser.ControllingClient.Kick(message); +// // Give them a second to receive the message! +// Thread.Sleep(1000); +// loggingOffUser.ControllingClient.Close(); +// } +// else +// { +// m_log.Info("[USERLOGOFF]: System sending the LogOff user message failed to sucessfully authenticate"); +// } +// } +// else +// { +// m_log.InfoFormat("[USERLOGOFF]: Got a logoff request for {0} but the user isn't here. The user might already have been logged out", AvatarID.ToString()); +// } +// } /// /// Triggered when an agent crosses into this sim. Also happens on initial login. From b8114d2b67c8ae8d7551a2ece2177f8b7e958112 Mon Sep 17 00:00:00 2001 From: Talun Date: Tue, 24 Apr 2012 21:54:13 +0100 Subject: [PATCH 103/547] Add a version of osNpcSay that takes a channel number Mantis 5747 osNpcSay(UUID npc, string message) left untouched New functions:- osNpcSay(UUID npc, int channel, string message) osNpcShout(UUID npc, int channel, string message) osNpcWhisper(UUID npc, int channel, string message) Signed-off-by: BlueWall --- .../Region/Framework/Interfaces/INPCModule.cs | 30 +++++++++++++ .../OptionalModules/World/NPC/NPCAvatar.cs | 21 +++++---- .../OptionalModules/World/NPC/NPCModule.cs | 43 ++++++++++++++++++- .../Shared/Api/Implementation/OSSL_Api.cs | 41 +++++++++++++++++- .../Shared/Api/Interface/IOSSL_Api.cs | 3 ++ .../Shared/Api/Runtime/OSSL_Stub.cs | 16 +++++++ 6 files changed, 144 insertions(+), 10 deletions(-) diff --git a/OpenSim/Region/Framework/Interfaces/INPCModule.cs b/OpenSim/Region/Framework/Interfaces/INPCModule.cs index dc3ff89303..b4dc3c3c11 100644 --- a/OpenSim/Region/Framework/Interfaces/INPCModule.cs +++ b/OpenSim/Region/Framework/Interfaces/INPCModule.cs @@ -134,6 +134,36 @@ namespace OpenSim.Region.Framework.Interfaces /// True if the operation succeeded, false if there was no such agent or the agent was not an NPC bool Say(UUID agentID, Scene scene, string text); + /// + /// Get the NPC to say something. + /// + /// The UUID of the NPC + /// + /// + /// + /// True if the operation succeeded, false if there was no such agent or the agent was not an NPC + bool Say(UUID agentID, Scene scene, string text, int channel); + + /// + /// Get the NPC to shout something. + /// + /// The UUID of the NPC + /// + /// + /// + /// True if the operation succeeded, false if there was no such agent or the agent was not an NPC + bool Shout(UUID agentID, Scene scene, string text, int channel); + + /// + /// Get the NPC to whisper something. + /// + /// The UUID of the NPC + /// + /// + /// + /// True if the operation succeeded, false if there was no such agent or the agent was not an NPC + bool Whisper(UUID agentID, Scene scene, string text, int channel); + /// /// Sit the NPC. /// diff --git a/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs b/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs index 5ea5af74a2..e57e5e6f97 100644 --- a/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs +++ b/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs @@ -76,22 +76,27 @@ namespace OpenSim.Region.OptionalModules.World.NPC public void Say(string message) { - SendOnChatFromClient(message, ChatTypeEnum.Say); + SendOnChatFromClient(0, message, ChatTypeEnum.Say); } - public void Shout(string message) + public void Say(int channel, string message) { - SendOnChatFromClient(message, ChatTypeEnum.Shout); + SendOnChatFromClient(channel, message, ChatTypeEnum.Say); } - public void Whisper(string message) + public void Shout(int channel, string message) { - SendOnChatFromClient(message, ChatTypeEnum.Whisper); + SendOnChatFromClient(channel, message, ChatTypeEnum.Shout); + } + + public void Whisper(int channel, string message) + { + SendOnChatFromClient(channel, message, ChatTypeEnum.Whisper); } public void Broadcast(string message) { - SendOnChatFromClient(message, ChatTypeEnum.Broadcast); + SendOnChatFromClient(0, message, ChatTypeEnum.Broadcast); } public void GiveMoney(UUID target, int amount) @@ -146,10 +151,10 @@ namespace OpenSim.Region.OptionalModules.World.NPC #region Internal Functions - private void SendOnChatFromClient(string message, ChatTypeEnum chatType) + private void SendOnChatFromClient(int channel, string message, ChatTypeEnum chatType) { OSChatMessage chatFromClient = new OSChatMessage(); - chatFromClient.Channel = 0; + chatFromClient.Channel = channel; chatFromClient.From = Name; chatFromClient.Message = message; chatFromClient.Position = StartPos; diff --git a/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs b/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs index 2b8379dba9..adc6f9c765 100644 --- a/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs +++ b/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs @@ -211,6 +211,11 @@ namespace OpenSim.Region.OptionalModules.World.NPC } public bool Say(UUID agentID, Scene scene, string text) + { + return Say(agentID, scene, text, 0); + } + + public bool Say(UUID agentID, Scene scene, string text, int channel) { lock (m_avatars) { @@ -219,7 +224,25 @@ namespace OpenSim.Region.OptionalModules.World.NPC ScenePresence sp; scene.TryGetScenePresence(agentID, out sp); - m_avatars[agentID].Say(text); + m_avatars[agentID].Say(channel, text); + + return true; + } + } + + return false; + } + + public bool Shout(UUID agentID, Scene scene, string text, int channel) + { + lock (m_avatars) + { + if (m_avatars.ContainsKey(agentID)) + { + ScenePresence sp; + scene.TryGetScenePresence(agentID, out sp); + + m_avatars[agentID].Shout(channel, text); return true; } @@ -246,6 +269,24 @@ namespace OpenSim.Region.OptionalModules.World.NPC return false; } + public bool Whisper(UUID agentID, Scene scene, string text, int channel) + { + lock (m_avatars) + { + if (m_avatars.ContainsKey(agentID)) + { + ScenePresence sp; + scene.TryGetScenePresence(agentID, out sp); + + m_avatars[agentID].Whisper(channel, text); + + return true; + } + } + + return false; + } + public bool Stand(UUID agentID, Scene scene) { lock (m_avatars) diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs index fe94b79b74..890115df07 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs @@ -2530,6 +2530,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api } public void osNpcSay(LSL_Key npc, string message) + { + osNpcSay(npc, 0, message); + } + + public void osNpcSay(LSL_Key npc, int channel, string message) { CheckThreatLevel(ThreatLevel.High, "osNpcSay"); m_host.AddScriptLPS(1); @@ -2542,7 +2547,24 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api if (!module.CheckPermissions(npcId, m_host.OwnerID)) return; - module.Say(npcId, World, message); + module.Say(npcId, World, message, channel); + } + } + + public void osNpcShout(LSL_Key npc, int channel, string message) + { + CheckThreatLevel(ThreatLevel.High, "osNpcShout"); + m_host.AddScriptLPS(1); + + INPCModule module = World.RequestModuleInterface(); + if (module != null) + { + UUID npcId = new UUID(npc.m_string); + + if (!module.CheckPermissions(npcId, m_host.OwnerID)) + return; + + module.Shout(npcId, World, message, channel); } } @@ -2627,6 +2649,23 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api } } + public void osNpcWhisper(LSL_Key npc, int channel, string message) + { + CheckThreatLevel(ThreatLevel.High, "osNpcWhisper"); + m_host.AddScriptLPS(1); + + INPCModule module = World.RequestModuleInterface(); + if (module != null) + { + UUID npcId = new UUID(npc.m_string); + + if (!module.CheckPermissions(npcId, m_host.OwnerID)) + return; + + module.Whisper(npcId, World, message, channel); + } + } + /// /// Save the current appearance of the script owner permanently to the named notecard. /// diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs index 545bbeea70..2d3e8e8bff 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs @@ -203,11 +203,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces void osNpcSetRot(LSL_Key npc, rotation rot); void osNpcStopMoveToTarget(LSL_Key npc); void osNpcSay(key npc, string message); + void osNpcSay(key npc, int channel, string message); + void osNpcShout(key npc, int channel, string message); void osNpcSit(key npc, key target, int options); void osNpcStand(LSL_Key npc); void osNpcRemove(key npc); void osNpcPlayAnimation(LSL_Key npc, string animation); void osNpcStopAnimation(LSL_Key npc, string animation); + void osNpcWhisper(key npc, int channel, string message); LSL_Key osOwnerSaveAppearance(string notecard); LSL_Key osAgentSaveAppearance(key agentId, string notecard); diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs index b94b9bffe0..e8369597c2 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs @@ -569,6 +569,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase m_OSSL_Functions.osNpcSay(npc, message); } + public void osNpcSay(key npc, int channel, string message) + { + m_OSSL_Functions.osNpcSay(npc, channel, message); + } + + + public void osNpcShout(key npc, int channel, string message) + { + m_OSSL_Functions.osNpcShout(npc, channel, message); + } + public void osNpcSit(LSL_Key npc, LSL_Key target, int options) { m_OSSL_Functions.osNpcSit(npc, target, options); @@ -594,6 +605,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase m_OSSL_Functions.osNpcStopAnimation(npc, animation); } + public void osNpcWhisper(key npc, int channel, string message) + { + m_OSSL_Functions.osNpcWhisper(npc, channel, message); + } + public LSL_Key osOwnerSaveAppearance(string notecard) { return m_OSSL_Functions.osOwnerSaveAppearance(notecard); From cb6791fb30ce0fbe416f42d95b9737f9f30e02a7 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 26 Apr 2012 22:35:25 +0100 Subject: [PATCH 104/547] Tweak log messages on local region to region teleport path to help with problem resolution. --- .../ClientStack/Linden/UDP/LLUDPServer.cs | 4 +- .../EntityTransfer/EntityTransferModule.cs | 51 ++++++++++++------- .../EntityTransfer/HGEntityTransferModule.cs | 3 +- .../Simulation/LocalSimulationConnector.cs | 10 ++-- .../Region/Framework/Scenes/ScenePresence.cs | 5 +- 5 files changed, 48 insertions(+), 25 deletions(-) diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs index d05f72ff8e..edf91cb685 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs @@ -916,7 +916,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP UDPPacketBuffer buffer = (UDPPacketBuffer)array[0]; UseCircuitCodePacket uccp = (UseCircuitCodePacket)array[1]; - m_log.DebugFormat("[LLUDPSERVER]: Handling UseCircuitCode request from {0}", buffer.RemoteEndPoint); + m_log.DebugFormat( + "[LLUDPSERVER]: Handling UseCircuitCode request for circuit {0} from {1}", + uccp.CircuitCode.Code, buffer.RemoteEndPoint); remoteEndPoint = (IPEndPoint)buffer.RemoteEndPoint; diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs index a36d0fe7c6..0f3ed273a2 100644 --- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs +++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs @@ -178,7 +178,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer destinationRegionName = sp.Scene.RegionInfo.RegionName; m_log.DebugFormat( - "[ENTITY TRANSFER MODULE]: RequestTeleportToLocation for {0} to {1} within existing region {2}", + "[ENTITY TRANSFER MODULE]: Teleport for {0} to {1} within {2}", sp.Name, position, destinationRegionName); // Teleport within the same region @@ -231,7 +231,10 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer GridRegion finalDestination = GetFinalDestination(reg); if (finalDestination == null) { - m_log.WarnFormat("[ENTITY TRANSFER MODULE]: Final destination is having problems. Unable to teleport agent."); + m_log.WarnFormat( + "[ENTITY TRANSFER MODULE]: Final destination is having problems. Unable to teleport {0} {1}", + sp.Name, sp.UUID); + sp.ControllingClient.SendTeleportFailed("Problem at destination"); return; } @@ -320,10 +323,17 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer } if (IsInTransit(sp.UUID)) // Avie is already on the way. Caller shouldn't do this. + { + m_log.DebugFormat( + "[ENTITY TRANSFER MODULE]: Ignoring teleport request of {0} {1} to {2} ({3}) {4}/{5} - agent is already in transit.", + sp.Name, sp.UUID, reg.ServerURI, finalDestination.ServerURI, finalDestination.RegionName, position); + return; + } m_log.DebugFormat( - "[ENTITY TRANSFER MODULE]: Request Teleport to {0} ({1}) {2}/{3}", + "[ENTITY TRANSFER MODULE]: Teleporting {0} {1} from {2} to {3} ({4}) {5}/{6}", + sp.Name, sp.UUID, sp.Scene.RegionInfo.RegionName, reg.ServerURI, finalDestination.ServerURI, finalDestination.RegionName, position); uint newRegionX = (uint)(reg.RegionHandle >> 40); @@ -444,7 +454,6 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer capsPath = finalDestination.ServerURI + CapsUtil.GetCapsSeedPath(agentCircuit.CapsPath); } - SetInTransit(sp.UUID); // Let's send a full update of the agent. This is a synchronous call. @@ -656,7 +665,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer public virtual void TeleportHome(UUID id, IClientAPI client) { - m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Request to teleport {0} {1} home", client.FirstName, client.LastName); + m_log.DebugFormat( + "[ENTITY TRANSFER MODULE]: Request to teleport {0} {1} home", client.Name, client.AgentId); //OpenSim.Services.Interfaces.PresenceInfo pinfo = m_aScene.PresenceService.GetAgent(client.SessionId); GridUserInfo uinfo = m_aScene.GridUserService.GetGridUserInfo(client.AgentId.ToString()); @@ -671,14 +681,20 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer return; } - m_log.DebugFormat("[ENTITY TRANSFER MODULE]: User's home region is {0} {1} ({2}-{3})", - regionInfo.RegionName, regionInfo.RegionID, regionInfo.RegionLocX / Constants.RegionSize, regionInfo.RegionLocY / Constants.RegionSize); + m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Home region of {0} is {1} ({2}-{3})", + client.Name, regionInfo.RegionName, regionInfo.RegionCoordX, regionInfo.RegionCoordY); // a little eekie that this goes back to Scene and with a forced cast, will fix that at some point... ((Scene)(client.Scene)).RequestTeleportLocation( client, regionInfo.RegionHandle, uinfo.HomePosition, uinfo.HomeLookAt, (uint)(Constants.TeleportFlags.SetLastToTarget | Constants.TeleportFlags.ViaHome)); } + else + { + m_log.ErrorFormat( + "[ENTITY TRANSFER MODULE]: No grid user information found for {0} {1}. Cannot send home.", + client.Name, client.AgentId); + } } #endregion @@ -1362,19 +1378,17 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer // after a cross here Thread.Sleep(500); - Scene m_scene = sp.Scene; + Scene scene = sp.Scene; - uint x, y; - Utils.LongToUInts(reg.RegionHandle, out x, out y); - x = x / Constants.RegionSize; - y = y / Constants.RegionSize; - m_log.Debug("[ENTITY TRANSFER MODULE]: Starting to inform client about neighbour " + x + ", " + y + "(" + endPoint + ")"); + m_log.DebugFormat( + "[ENTITY TRANSFER MODULE]: Informing {0} {1} about neighbour {2} {3} at ({4},{5})", + sp.Name, sp.UUID, reg.RegionName, endPoint, reg.RegionCoordX, reg.RegionCoordY); string capsPath = reg.ServerURI + CapsUtil.GetCapsSeedPath(a.CapsPath); string reason = String.Empty; - bool regionAccepted = m_scene.SimulationService.CreateAgent(reg, a, (uint)TeleportFlags.Default, out reason); + bool regionAccepted = scene.SimulationService.CreateAgent(reg, a, (uint)TeleportFlags.Default, out reason); if (regionAccepted && newAgent) { @@ -1391,7 +1405,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer m_log.DebugFormat("[ENTITY TRANSFER MODULE]: {0} is sending {1} EnableSimulator for neighbour region {2} @ {3} " + "and EstablishAgentCommunication with seed cap {4}", - m_scene.RegionInfo.RegionName, sp.Name, reg.RegionName, reg.RegionHandle, capsPath); + scene.RegionInfo.RegionName, sp.Name, reg.RegionName, reg.RegionHandle, capsPath); eq.EnableSimulator(reg.RegionHandle, endPoint, sp.UUID); eq.EstablishAgentCommunication(sp.UUID, endPoint, capsPath); @@ -1402,10 +1416,13 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer // TODO: make Event Queue disablable! } - m_log.Debug("[ENTITY TRANSFER MODULE]: Completed inform client about neighbour " + endPoint.ToString()); + m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Completed inform {0} {1} about neighbour {2}", sp.Name, sp.UUID, endPoint); } + if (!regionAccepted) - m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Region {0} did not accept agent: {1}", reg.RegionName, reason); + m_log.WarnFormat( + "[ENTITY TRANSFER MODULE]: Region {0} did not accept {1} {2}: {3}", + reg.RegionName, sp.Name, sp.UUID, reason); } /// diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs index 634fb4315e..66969971e7 100644 --- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs +++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs @@ -201,7 +201,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer public override void TeleportHome(UUID id, IClientAPI client) { - m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: Request to teleport {0} {1} home", client.FirstName, client.LastName); + m_log.DebugFormat( + "[ENTITY TRANSFER MODULE]: Request to teleport {0} {1} home", client.Name, client.AgentId); // Let's find out if this is a foreign user or a local user IUserManagement uMan = m_aScene.RequestModuleInterface(); diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/LocalSimulationConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/LocalSimulationConnector.cs index 85e7e94c1e..90f27c4806 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/LocalSimulationConnector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/LocalSimulationConnector.cs @@ -191,7 +191,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation { if (s.RegionInfo.RegionHandle == destination.RegionHandle) { - m_log.DebugFormat("[LOCAL SIMULATION CONNECTOR]: Found region {0} to send SendCreateChildAgent", destination.RegionName); +// m_log.DebugFormat("[LOCAL SIMULATION CONNECTOR]: Found region {0} to send SendCreateChildAgent", destination.RegionName); return s.NewUserConnection(aCircuit, teleportFlags, out reason); } } @@ -209,9 +209,9 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation { if (s.RegionInfo.RegionHandle == destination.RegionHandle) { - m_log.DebugFormat( - "[LOCAL SIMULATION CONNECTOR]: Found region {0} {1} to send AgentUpdate", - s.RegionInfo.RegionName, destination.RegionHandle); +// m_log.DebugFormat( +// "[LOCAL SIMULATION CONNECTOR]: Found region {0} {1} to send AgentUpdate", +// s.RegionInfo.RegionName, destination.RegionHandle); s.IncomingChildAgentDataUpdate(cAgentData); return true; @@ -281,7 +281,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation { if (s.RegionInfo.RegionID == origin) { - m_log.Debug("[LOCAL COMMS]: Found region to SendReleaseAgent"); +// m_log.Debug("[LOCAL COMMS]: Found region to SendReleaseAgent"); AgentTransferModule.AgentArrivedAtDestination(id); return true; // return s.IncomingReleaseAgent(id); diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index 7a9421571e..6b38027c44 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs @@ -1142,7 +1142,10 @@ namespace OpenSim.Region.Framework.Scenes if ((m_callbackURI != null) && !m_callbackURI.Equals("")) { - m_log.DebugFormat("[SCENE PRESENCE]: Releasing agent in URI {0}", m_callbackURI); + m_log.DebugFormat( + "[SCENE PRESENCE]: Releasing {0} {1} with callback to {2}", + client.Name, client.AgentId, m_callbackURI); + Scene.SimulationService.ReleaseAgent(m_originRegionID, UUID, m_callbackURI); m_callbackURI = null; } From ee13d817f128c294dc05bddaa0bc9a643c48fe8d Mon Sep 17 00:00:00 2001 From: Oren Hurvitz Date: Mon, 23 Apr 2012 18:33:50 +0300 Subject: [PATCH 105/547] When creating an OAR, objects where the user is the Creator are always included, regardless of their permissions. The purpose of the permission checks is to prevent the unauthorized copying of assets, but users can always copy assets that they created. --- .../World/Archiver/ArchiveWriteRequestPreparation.cs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestPreparation.cs b/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestPreparation.cs index 4d459bf2d6..ab3cc412ab 100644 --- a/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestPreparation.cs +++ b/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestPreparation.cs @@ -297,10 +297,15 @@ namespace OpenSim.Region.CoreModules.World.Archiver if (checkPermissions.Contains("T") && !canTransfer) partPermitted = false; + // If the user is the Creator of the object then it can always be included in the OAR + bool creator = (obj.CreatorID.Guid == user.Guid); + if (creator) + partPermitted = true; + //string name = (objGroup.PrimCount == 1) ? objGroup.Name : string.Format("{0} ({1}/{2})", obj.Name, primNumber, objGroup.PrimCount); - //m_log.DebugFormat("[ARCHIVER]: Object permissions: {0}: Base={1:X4}, Owner={2:X4}, Everyone={3:X4}, permissionClass={4}, checkPermissions={5}, canCopy={6}, canTransfer={7}, permitted={8}", + //m_log.DebugFormat("[ARCHIVER]: Object permissions: {0}: Base={1:X4}, Owner={2:X4}, Everyone={3:X4}, permissionClass={4}, checkPermissions={5}, canCopy={6}, canTransfer={7}, creator={8}, permitted={9}", // name, obj.BaseMask, obj.OwnerMask, obj.EveryoneMask, - // permissionClass, checkPermissions, canCopy, canTransfer, permitted); + // permissionClass, checkPermissions, canCopy, canTransfer, creator, partPermitted); if (!partPermitted) { From 0da8fe3124402581883f87b2f7036727905038db Mon Sep 17 00:00:00 2001 From: Oren Hurvitz Date: Mon, 23 Apr 2012 17:26:37 +0300 Subject: [PATCH 106/547] Refactored how asset/inventory types are associated with content types: gathered all the knowledge into a single class. Added the Mesh content type. --- OpenSim/Framework/SLUtil.cs | 386 ++++++++++++---------------- OpenSim/Framework/Tests/UtilTest.cs | 23 +- 2 files changed, 179 insertions(+), 230 deletions(-) diff --git a/OpenSim/Framework/SLUtil.cs b/OpenSim/Framework/SLUtil.cs index db4541ef1a..537de7ab15 100644 --- a/OpenSim/Framework/SLUtil.cs +++ b/OpenSim/Framework/SLUtil.cs @@ -38,239 +38,189 @@ namespace OpenSim.Framework public static class SLUtil { // private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - + #region SL / file extension / content-type conversions + private class TypeMapping + { + private sbyte assetType; + private InventoryType inventoryType; + private string contentType; + private string contentType2; + private string extension; + + public sbyte AssetTypeCode + { + get { return assetType; } + } + + public object AssetType + { + get { + if (Enum.IsDefined(typeof(OpenMetaverse.AssetType), assetType)) + return (OpenMetaverse.AssetType)assetType; + else + return OpenMetaverse.AssetType.Unknown; + } + } + + public InventoryType InventoryType + { + get { return inventoryType; } + } + + public string ContentType + { + get { return contentType; } + } + + public string ContentType2 + { + get { return contentType2; } + } + + public string Extension + { + get { return extension; } + } + + private TypeMapping(sbyte assetType, InventoryType inventoryType, string contentType, string contentType2, string extension) + { + this.assetType = assetType; + this.inventoryType = inventoryType; + this.contentType = contentType; + this.contentType2 = contentType2; + this.extension = extension; + } + + public TypeMapping(AssetType assetType, InventoryType inventoryType, string contentType, string contentType2, string extension) + : this((sbyte)assetType, inventoryType, contentType, contentType2, extension) + { + } + + public TypeMapping(AssetType assetType, InventoryType inventoryType, string contentType, string extension) + : this((sbyte)assetType, inventoryType, contentType, null, extension) + { + } + } + + /// + /// Maps between AssetType, InventoryType and Content-Type. + /// Where more than one possibility exists, the first one takes precedence. E.g.: + /// AssetType "AssetType.Texture" -> Content-Type "image-xj2c" + /// Content-Type "image/x-j2c" -> InventoryType "InventoryType.Texture" + /// + private static TypeMapping[] MAPPINGS = new TypeMapping[] { + new TypeMapping(AssetType.Unknown, InventoryType.Unknown, "application/octet-stream", "bin"), + new TypeMapping(AssetType.Texture, InventoryType.Texture, "image/x-j2c", "image/jp2", "j2c"), + new TypeMapping(AssetType.Texture, InventoryType.Snapshot, "image/x-j2c", "image/jp2", "j2c"), + new TypeMapping(AssetType.TextureTGA, InventoryType.Texture, "image/tga", "tga"), + new TypeMapping(AssetType.ImageTGA, InventoryType.Texture, "image/tga", "tga"), + new TypeMapping(AssetType.ImageJPEG, InventoryType.Texture, "image/jpeg", "jpg"), + new TypeMapping(AssetType.Sound, InventoryType.Sound, "audio/ogg", "application/ogg", "ogg"), + new TypeMapping(AssetType.SoundWAV, InventoryType.Sound, "audio/x-wav", "wav"), + new TypeMapping(AssetType.CallingCard, InventoryType.CallingCard, "application/vnd.ll.callingcard", "application/x-metaverse-callingcard", "callingcard"), + new TypeMapping(AssetType.Landmark, InventoryType.Landmark, "application/vnd.ll.landmark", "application/x-metaverse-landmark", "landmark"), + new TypeMapping(AssetType.Clothing, InventoryType.Wearable, "application/vnd.ll.clothing", "application/x-metaverse-clothing", "clothing"), + new TypeMapping(AssetType.Object, InventoryType.Object, "application/vnd.ll.primitive", "application/x-metaverse-primitive", "primitive"), + new TypeMapping(AssetType.Object, InventoryType.Attachment, "application/vnd.ll.primitive", "application/x-metaverse-primitive", "primitive"), + new TypeMapping(AssetType.Notecard, InventoryType.Notecard, "application/vnd.ll.notecard", "application/x-metaverse-notecard", "notecard"), + new TypeMapping(AssetType.Folder, InventoryType.Folder, "application/vnd.ll.folder", "folder"), + new TypeMapping(AssetType.RootFolder, InventoryType.RootCategory, "application/vnd.ll.rootfolder", "rootfolder"), + new TypeMapping(AssetType.LSLText, InventoryType.LSL, "application/vnd.ll.lsltext", "application/x-metaverse-lsl", "lsl"), + new TypeMapping(AssetType.LSLBytecode, InventoryType.LSL, "application/vnd.ll.lslbyte", "application/x-metaverse-lso", "lso"), + new TypeMapping(AssetType.Bodypart, InventoryType.Wearable, "application/vnd.ll.bodypart", "application/x-metaverse-bodypart", "bodypart"), + new TypeMapping(AssetType.TrashFolder, InventoryType.Folder, "application/vnd.ll.trashfolder", "trashfolder"), + new TypeMapping(AssetType.SnapshotFolder, InventoryType.Folder, "application/vnd.ll.snapshotfolder", "snapshotfolder"), + new TypeMapping(AssetType.LostAndFoundFolder, InventoryType.Folder, "application/vnd.ll.lostandfoundfolder", "lostandfoundfolder"), + new TypeMapping(AssetType.Animation, InventoryType.Animation, "application/vnd.ll.animation", "application/x-metaverse-animation", "animation"), + new TypeMapping(AssetType.Gesture, InventoryType.Gesture, "application/vnd.ll.gesture", "application/x-metaverse-gesture", "gesture"), + new TypeMapping(AssetType.Simstate, InventoryType.Snapshot, "application/x-metaverse-simstate", "simstate"), + new TypeMapping(AssetType.FavoriteFolder, InventoryType.Unknown, "application/vnd.ll.favoritefolder", "favoritefolder"), + new TypeMapping(AssetType.Link, InventoryType.Unknown, "application/vnd.ll.link", "link"), + new TypeMapping(AssetType.LinkFolder, InventoryType.Unknown, "application/vnd.ll.linkfolder", "linkfolder"), + new TypeMapping(AssetType.CurrentOutfitFolder, InventoryType.Unknown, "application/vnd.ll.currentoutfitfolder", "currentoutfitfolder"), + new TypeMapping(AssetType.OutfitFolder, InventoryType.Unknown, "application/vnd.ll.outfitfolder", "outfitfolder"), + new TypeMapping(AssetType.MyOutfitsFolder, InventoryType.Unknown, "application/vnd.ll.myoutfitsfolder", "myoutfitsfolder"), + new TypeMapping(AssetType.Mesh, InventoryType.Mesh, "application/vnd.ll.mesh", "llm") + }; + + private static Dictionary asset2Content; + private static Dictionary asset2Extension; + private static Dictionary inventory2Content; + private static Dictionary content2Asset; + private static Dictionary content2Inventory; + + static SLUtil() + { + asset2Content = new Dictionary(); + asset2Extension = new Dictionary(); + inventory2Content = new Dictionary(); + content2Asset = new Dictionary(); + content2Inventory = new Dictionary(); + + foreach (TypeMapping mapping in MAPPINGS) + { + sbyte assetType = mapping.AssetTypeCode; + if (!asset2Content.ContainsKey(assetType)) + asset2Content.Add(assetType, mapping.ContentType); + if (!asset2Extension.ContainsKey(assetType)) + asset2Extension.Add(assetType, mapping.Extension); + if (!inventory2Content.ContainsKey(mapping.InventoryType)) + inventory2Content.Add(mapping.InventoryType, mapping.ContentType); + if (!content2Asset.ContainsKey(mapping.ContentType)) + content2Asset.Add(mapping.ContentType, assetType); + if (!content2Inventory.ContainsKey(mapping.ContentType)) + content2Inventory.Add(mapping.ContentType, mapping.InventoryType); + + if (mapping.ContentType2 != null) + { + if (!content2Asset.ContainsKey(mapping.ContentType2)) + content2Asset.Add(mapping.ContentType2, assetType); + if (!content2Inventory.ContainsKey(mapping.ContentType2)) + content2Inventory.Add(mapping.ContentType2, mapping.InventoryType); + } + } + } + public static string SLAssetTypeToContentType(int assetType) { - switch ((AssetType)assetType) - { - case AssetType.Texture: - return "image/x-j2c"; - case AssetType.Sound: - return "audio/ogg"; - case AssetType.CallingCard: - return "application/vnd.ll.callingcard"; - case AssetType.Landmark: - return "application/vnd.ll.landmark"; - case AssetType.Clothing: - return "application/vnd.ll.clothing"; - case AssetType.Object: - return "application/vnd.ll.primitive"; - case AssetType.Notecard: - return "application/vnd.ll.notecard"; - case AssetType.Folder: - return "application/vnd.ll.folder"; - case AssetType.RootFolder: - return "application/vnd.ll.rootfolder"; - case AssetType.LSLText: - return "application/vnd.ll.lsltext"; - case AssetType.LSLBytecode: - return "application/vnd.ll.lslbyte"; - case AssetType.TextureTGA: - case AssetType.ImageTGA: - return "image/tga"; - case AssetType.Bodypart: - return "application/vnd.ll.bodypart"; - case AssetType.TrashFolder: - return "application/vnd.ll.trashfolder"; - case AssetType.SnapshotFolder: - return "application/vnd.ll.snapshotfolder"; - case AssetType.LostAndFoundFolder: - return "application/vnd.ll.lostandfoundfolder"; - case AssetType.SoundWAV: - return "audio/x-wav"; - case AssetType.ImageJPEG: - return "image/jpeg"; - case AssetType.Animation: - return "application/vnd.ll.animation"; - case AssetType.Gesture: - return "application/vnd.ll.gesture"; - case AssetType.Simstate: - return "application/x-metaverse-simstate"; - case AssetType.FavoriteFolder: - return "application/vnd.ll.favoritefolder"; - case AssetType.Link: - return "application/vnd.ll.link"; - case AssetType.LinkFolder: - return "application/vnd.ll.linkfolder"; - case AssetType.CurrentOutfitFolder: - return "application/vnd.ll.currentoutfitfolder"; - case AssetType.OutfitFolder: - return "application/vnd.ll.outfitfolder"; - case AssetType.MyOutfitsFolder: - return "application/vnd.ll.myoutfitsfolder"; - case AssetType.Unknown: - default: - return "application/octet-stream"; - } + string contentType; + if (!asset2Content.TryGetValue((sbyte)assetType, out contentType)) + contentType = asset2Content[(sbyte)AssetType.Unknown]; + return contentType; } public static string SLInvTypeToContentType(int invType) { - switch ((InventoryType)invType) - { - case InventoryType.Animation: - return "application/vnd.ll.animation"; - case InventoryType.CallingCard: - return "application/vnd.ll.callingcard"; - case InventoryType.Folder: - return "application/vnd.ll.folder"; - case InventoryType.Gesture: - return "application/vnd.ll.gesture"; - case InventoryType.Landmark: - return "application/vnd.ll.landmark"; - case InventoryType.LSL: - return "application/vnd.ll.lsltext"; - case InventoryType.Notecard: - return "application/vnd.ll.notecard"; - case InventoryType.Attachment: - case InventoryType.Object: - return "application/vnd.ll.primitive"; - case InventoryType.Sound: - return "audio/ogg"; - case InventoryType.Snapshot: - case InventoryType.Texture: - return "image/x-j2c"; - case InventoryType.Wearable: - return "application/vnd.ll.clothing"; - default: - return "application/octet-stream"; - } + string contentType; + if (!inventory2Content.TryGetValue((InventoryType)invType, out contentType)) + contentType = inventory2Content[InventoryType.Unknown]; + return contentType; } public static sbyte ContentTypeToSLAssetType(string contentType) { - switch (contentType) - { - case "image/x-j2c": - case "image/jp2": - return (sbyte)AssetType.Texture; - case "application/ogg": - case "audio/ogg": - return (sbyte)AssetType.Sound; - case "application/vnd.ll.callingcard": - case "application/x-metaverse-callingcard": - return (sbyte)AssetType.CallingCard; - case "application/vnd.ll.landmark": - case "application/x-metaverse-landmark": - return (sbyte)AssetType.Landmark; - case "application/vnd.ll.clothing": - case "application/x-metaverse-clothing": - return (sbyte)AssetType.Clothing; - case "application/vnd.ll.primitive": - case "application/x-metaverse-primitive": - return (sbyte)AssetType.Object; - case "application/vnd.ll.notecard": - case "application/x-metaverse-notecard": - return (sbyte)AssetType.Notecard; - case "application/vnd.ll.folder": - return (sbyte)AssetType.Folder; - case "application/vnd.ll.rootfolder": - return (sbyte)AssetType.RootFolder; - case "application/vnd.ll.lsltext": - case "application/x-metaverse-lsl": - return (sbyte)AssetType.LSLText; - case "application/vnd.ll.lslbyte": - case "application/x-metaverse-lso": - return (sbyte)AssetType.LSLBytecode; - case "image/tga": - // Note that AssetType.TextureTGA will be converted to AssetType.ImageTGA - return (sbyte)AssetType.ImageTGA; - case "application/vnd.ll.bodypart": - case "application/x-metaverse-bodypart": - return (sbyte)AssetType.Bodypart; - case "application/vnd.ll.trashfolder": - return (sbyte)AssetType.TrashFolder; - case "application/vnd.ll.snapshotfolder": - return (sbyte)AssetType.SnapshotFolder; - case "application/vnd.ll.lostandfoundfolder": - return (sbyte)AssetType.LostAndFoundFolder; - case "audio/x-wav": - return (sbyte)AssetType.SoundWAV; - case "image/jpeg": - return (sbyte)AssetType.ImageJPEG; - case "application/vnd.ll.animation": - case "application/x-metaverse-animation": - return (sbyte)AssetType.Animation; - case "application/vnd.ll.gesture": - case "application/x-metaverse-gesture": - return (sbyte)AssetType.Gesture; - case "application/x-metaverse-simstate": - return (sbyte)AssetType.Simstate; - case "application/vnd.ll.favoritefolder": - return (sbyte)AssetType.FavoriteFolder; - case "application/vnd.ll.link": - return (sbyte)AssetType.Link; - case "application/vnd.ll.linkfolder": - return (sbyte)AssetType.LinkFolder; - case "application/vnd.ll.currentoutfitfolder": - return (sbyte)AssetType.CurrentOutfitFolder; - case "application/vnd.ll.outfitfolder": - return (sbyte)AssetType.OutfitFolder; - case "application/vnd.ll.myoutfitsfolder": - return (sbyte)AssetType.MyOutfitsFolder; - case "application/octet-stream": - default: - return (sbyte)AssetType.Unknown; - } + sbyte assetType; + if (!content2Asset.TryGetValue(contentType, out assetType)) + assetType = (sbyte)AssetType.Unknown; + return (sbyte)assetType; } public static sbyte ContentTypeToSLInvType(string contentType) { - switch (contentType) - { - case "image/x-j2c": - case "image/jp2": - case "image/tga": - case "image/jpeg": - return (sbyte)InventoryType.Texture; - case "application/ogg": - case "audio/ogg": - case "audio/x-wav": - return (sbyte)InventoryType.Sound; - case "application/vnd.ll.callingcard": - case "application/x-metaverse-callingcard": - return (sbyte)InventoryType.CallingCard; - case "application/vnd.ll.landmark": - case "application/x-metaverse-landmark": - return (sbyte)InventoryType.Landmark; - case "application/vnd.ll.clothing": - case "application/x-metaverse-clothing": - case "application/vnd.ll.bodypart": - case "application/x-metaverse-bodypart": - return (sbyte)InventoryType.Wearable; - case "application/vnd.ll.primitive": - case "application/x-metaverse-primitive": - return (sbyte)InventoryType.Object; - case "application/vnd.ll.notecard": - case "application/x-metaverse-notecard": - return (sbyte)InventoryType.Notecard; - case "application/vnd.ll.folder": - return (sbyte)InventoryType.Folder; - case "application/vnd.ll.rootfolder": - return (sbyte)InventoryType.RootCategory; - case "application/vnd.ll.lsltext": - case "application/x-metaverse-lsl": - case "application/vnd.ll.lslbyte": - case "application/x-metaverse-lso": - return (sbyte)InventoryType.LSL; - case "application/vnd.ll.trashfolder": - case "application/vnd.ll.snapshotfolder": - case "application/vnd.ll.lostandfoundfolder": - return (sbyte)InventoryType.Folder; - case "application/vnd.ll.animation": - case "application/x-metaverse-animation": - return (sbyte)InventoryType.Animation; - case "application/vnd.ll.gesture": - case "application/x-metaverse-gesture": - return (sbyte)InventoryType.Gesture; - case "application/x-metaverse-simstate": - return (sbyte)InventoryType.Snapshot; - case "application/octet-stream": - default: - return (sbyte)InventoryType.Unknown; - } + InventoryType invType; + if (!content2Inventory.TryGetValue(contentType, out invType)) + invType = InventoryType.Unknown; + return (sbyte)invType; + } + + public static string SLAssetTypeToExtension(int assetType) + { + string extension; + if (!asset2Extension.TryGetValue((sbyte)assetType, out extension)) + extension = asset2Extension[(sbyte)AssetType.Unknown]; + return extension; } #endregion SL / file extension / content-type conversions @@ -377,4 +327,4 @@ namespace OpenSim.Framework return output; } } -} \ No newline at end of file +} diff --git a/OpenSim/Framework/Tests/UtilTest.cs b/OpenSim/Framework/Tests/UtilTest.cs index 1ca35dfcb5..f0d2a3f7a7 100644 --- a/OpenSim/Framework/Tests/UtilTest.cs +++ b/OpenSim/Framework/Tests/UtilTest.cs @@ -214,16 +214,13 @@ namespace OpenSim.Framework.Tests for (int i = 0; i < contenttypes.Length; i++) { - if (SLUtil.ContentTypeToSLAssetType(contenttypes[i]) == 18) - { - Assert.That(contenttypes[i] == "image/tga"); - } + int expected; + if (contenttypes[i] == "image/tga") + expected = 12; // if we know only the content-type "image/tga", then we assume the asset type is TextureTGA; not ImageTGA else - { - Assert.That(SLUtil.ContentTypeToSLAssetType(contenttypes[i]) == assettypes[i], - "Expecting {0} but got {1}", assettypes[i], - SLUtil.ContentTypeToSLAssetType(contenttypes[i])); - } + expected = assettypes[i]; + Assert.AreEqual(expected, SLUtil.ContentTypeToSLAssetType(contenttypes[i]), + String.Format("Incorrect AssetType mapped from Content-Type {0}", contenttypes[i])); } int[] inventorytypes = new int[] {-1,0,1,2,3,6,7,8,9,10,15,17,18,20}; @@ -237,7 +234,7 @@ namespace OpenSim.Framework.Tests "application/vnd.ll.primitive", "application/vnd.ll.notecard", "application/vnd.ll.folder", - "application/octet-stream", + "application/vnd.ll.rootfolder", "application/vnd.ll.lsltext", "image/x-j2c", "application/vnd.ll.primitive", @@ -247,7 +244,8 @@ namespace OpenSim.Framework.Tests for (int i=0;i Date: Mon, 23 Apr 2012 19:18:28 +0300 Subject: [PATCH 107/547] OSSL: Removed check for CanRunConsoleCommand() in osKickAvatar. OSSL permissions are now controlled in OpenSim.ini. --- .../Shared/Api/Implementation/OSSL_Api.cs | 25 +++++++++---------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs index 893fda1ad9..0d4ea198e9 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs @@ -351,7 +351,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api UUID ownerID = ti.OwnerID; - //OSSL only may be used if objet is in the same group as the parcel + //OSSL only may be used if object is in the same group as the parcel if (m_FunctionPerms[function].AllowedOwnerClasses.Contains("PARCEL_GROUP_MEMBER")) { ILandObject land = World.LandChannel.GetLandObject(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y); @@ -729,11 +729,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api m_host.AddScriptLPS(1); + // For safety, we add another permission check here, and don't rely only on the standard OSSL permissions if (World.Permissions.CanRunConsoleCommand(m_host.OwnerID)) { MainConsole.Instance.RunCommand(command); return true; } + return false; } @@ -2825,21 +2827,18 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api CheckThreatLevel(ThreatLevel.Severe, "osKickAvatar"); m_host.AddScriptLPS(1); - if (World.Permissions.CanRunConsoleCommand(m_host.OwnerID)) + World.ForEachRootScenePresence(delegate(ScenePresence sp) { - World.ForEachRootScenePresence(delegate(ScenePresence sp) + if (sp.Firstname == FirstName && sp.Lastname == SurName) { - if (sp.Firstname == FirstName && sp.Lastname == SurName) - { - // kick client... - if (alert != null) - sp.ControllingClient.Kick(alert); + // kick client... + if (alert != null) + sp.ControllingClient.Kick(alert); - // ...and close on our side - sp.Scene.IncomingCloseAgent(sp.UUID); - } - }); - } + // ...and close on our side + sp.Scene.IncomingCloseAgent(sp.UUID); + } + }); } public void osCauseDamage(string avatar, double damage) From 07e62df5582e28675275b3f5143ec37e5697d283 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 27 Apr 2012 00:58:54 +0100 Subject: [PATCH 108/547] Add regression test for teleporting an agent between separated regions on the same simulator. This involves a large amount of change in test scene setup code to allow test scenes to share shared modules SetupScene is now an instance method that requires an instantiation of SceneHelpers, though other SceneHelpers methods are still static May split these out into separate classes in the future. --- .../Tests/GetTextureHandlerTests.cs | 2 +- .../Caps/EventQueue/Tests/EventQueueTests.cs | 2 +- .../Linden/UDP/Tests/BasicCircuitTests.cs | 2 +- .../Linden/UDP/Tests/LLImageManagerTests.cs | 2 +- .../Asset/Tests/FlotsamAssetCacheTests.cs | 2 +- .../Tests/AttachmentsModuleTests.cs | 2 +- .../Tests/AvatarFactoryModuleTests.cs | 4 +- .../Avatar/Friends/Tests/FriendModuleTests.cs | 2 +- .../Tests/InventoryArchiveTestCase.cs | 2 +- .../Archiver/Tests/InventoryArchiverTests.cs | 2 +- .../Inventory/Archiver/Tests/PathTests.cs | 14 +- .../EntityTransfer/EntityTransferModule.cs | 3 +- .../Tests/InventoryAccessModuleTests.cs | 2 +- .../World/Archiver/Tests/ArchiverTests.cs | 6 +- .../World/Land/Tests/PrimCountModuleTests.cs | 2 +- .../World/Media/Moap/Tests/MoapTests.cs | 2 +- .../World/Serialiser/Tests/SerialiserTests.cs | 2 +- OpenSim/Region/Framework/Scenes/Scene.cs | 8 +- .../Scenes/Tests/EntityManagerTests.cs | 2 +- .../Framework/Scenes/Tests/SceneGraphTests.cs | 2 +- .../Scenes/Tests/SceneObjectBasicTests.cs | 10 +- .../Scenes/Tests/SceneObjectDeRezTests.cs | 4 +- .../Scenes/Tests/SceneObjectLinkingTests.cs | 10 +- .../Scenes/Tests/SceneObjectResizeTests.cs | 4 +- .../Scenes/Tests/SceneObjectScriptTests.cs | 2 +- .../Scenes/Tests/SceneObjectSpatialTests.cs | 2 +- .../Scenes/Tests/SceneObjectStatusTests.cs | 2 +- .../Scenes/Tests/SceneObjectUserGroupTests.cs | 2 +- .../Scenes/Tests/ScenePresenceAgentTests.cs | 18 +- .../Tests/ScenePresenceAnimationTests.cs | 2 +- .../Tests/ScenePresenceAutopilotTests.cs | 2 +- .../Scenes/Tests/ScenePresenceSitTests.cs | 2 +- .../Tests/ScenePresenceTeleportTests.cs | 165 ++++--------- .../Framework/Scenes/Tests/SceneTests.cs | 2 +- .../Scenes/Tests/TaskInventoryTests.cs | 8 +- .../Scenes/Tests/UserInventoryTests.cs | 4 +- .../Scenes/Tests/UuidGathererTests.cs | 2 +- .../XmlRpcGroups/Tests/GroupsModuleTests.cs | 2 +- .../World/NPC/Tests/NPCModuleTests.cs | 2 +- .../Shared/Tests/LSL_ApiInventoryTests.cs | 2 +- .../ScriptEngine/Shared/Tests/LSL_ApiTest.cs | 4 +- .../Shared/Tests/OSSL_ApiAppearanceTest.cs | 2 +- .../Shared/Tests/OSSL_ApiNpcTests.cs | 2 +- .../ScriptEngine/XEngine/Tests/XEngineTest.cs | 2 +- OpenSim/Tests/Common/Helpers/SceneHelpers.cs | 216 ++++++++++-------- OpenSim/Tests/Common/Mock/TestLandChannel.cs | 17 +- OpenSim/Tests/Torture/NPCTortureTests.cs | 2 +- OpenSim/Tests/Torture/ObjectTortureTests.cs | 2 +- OpenSim/Tests/Torture/ScriptTortureTests.cs | 2 +- 49 files changed, 261 insertions(+), 300 deletions(-) diff --git a/OpenSim/Capabilities/Handlers/GetTexture/Tests/GetTextureHandlerTests.cs b/OpenSim/Capabilities/Handlers/GetTexture/Tests/GetTextureHandlerTests.cs index fd152c35d2..85e5cc65f1 100644 --- a/OpenSim/Capabilities/Handlers/GetTexture/Tests/GetTextureHandlerTests.cs +++ b/OpenSim/Capabilities/Handlers/GetTexture/Tests/GetTextureHandlerTests.cs @@ -50,7 +50,7 @@ namespace OpenSim.Capabilities.Handlers.GetTexture.Tests TestHelpers.InMethod(); // Overkill - we only really need the asset service, not a whole scene. - Scene scene = SceneHelpers.SetupScene(); + Scene scene = new SceneHelpers().SetupScene(); GetTextureHandler handler = new GetTextureHandler(null, scene.AssetService); TestOSHttpRequest req = new TestOSHttpRequest(); diff --git a/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/Tests/EventQueueTests.cs b/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/Tests/EventQueueTests.cs index a5209b7aec..c25b58cf8f 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/Tests/EventQueueTests.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/Tests/EventQueueTests.cs @@ -60,7 +60,7 @@ namespace OpenSim.Region.ClientStack.Linden.Tests CapabilitiesModule capsModule = new CapabilitiesModule(); EventQueueGetModule eqgModule = new EventQueueGetModule(); - m_scene = SceneHelpers.SetupScene(); + m_scene = new SceneHelpers().SetupScene(); SceneHelpers.SetupSceneModules(m_scene, config, capsModule, eqgModule); } diff --git a/OpenSim/Region/ClientStack/Linden/UDP/Tests/BasicCircuitTests.cs b/OpenSim/Region/ClientStack/Linden/UDP/Tests/BasicCircuitTests.cs index a575e3616d..1321470c28 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/Tests/BasicCircuitTests.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/Tests/BasicCircuitTests.cs @@ -158,7 +158,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP.Tests TestHelpers.InMethod(); // XmlConfigurator.Configure(); - TestScene scene = SceneHelpers.SetupScene(); + TestScene scene = new SceneHelpers().SetupScene(); uint myCircuitCode = 123456; UUID myAgentUuid = TestHelpers.ParseTail(0x1); UUID mySessionUuid = TestHelpers.ParseTail(0x2); diff --git a/OpenSim/Region/ClientStack/Linden/UDP/Tests/LLImageManagerTests.cs b/OpenSim/Region/ClientStack/Linden/UDP/Tests/LLImageManagerTests.cs index 1b68d68765..221f02bda9 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/Tests/LLImageManagerTests.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/Tests/LLImageManagerTests.cs @@ -79,7 +79,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP.Tests J2KDecoderModule j2kdm = new J2KDecoderModule(); - scene = SceneHelpers.SetupScene(); + scene = new SceneHelpers().SetupScene(); SceneHelpers.SetupSceneModules(scene, j2kdm); tc = new TestClient(SceneHelpers.GenerateAgentData(userId), scene); diff --git a/OpenSim/Region/CoreModules/Asset/Tests/FlotsamAssetCacheTests.cs b/OpenSim/Region/CoreModules/Asset/Tests/FlotsamAssetCacheTests.cs index 5adb84596c..c91b25fac2 100644 --- a/OpenSim/Region/CoreModules/Asset/Tests/FlotsamAssetCacheTests.cs +++ b/OpenSim/Region/CoreModules/Asset/Tests/FlotsamAssetCacheTests.cs @@ -65,7 +65,7 @@ namespace OpenSim.Region.CoreModules.Asset.Tests config.Configs["AssetCache"].Set("MemoryCacheEnabled", "true"); m_cache = new FlotsamAssetCache(); - m_scene = SceneHelpers.SetupScene(); + m_scene = new SceneHelpers().SetupScene(); SceneHelpers.SetupSceneModules(m_scene, config, m_cache); } diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs index bfe5e4a37f..42d07fd2d6 100644 --- a/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs +++ b/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs @@ -72,7 +72,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests config.AddConfig("Modules"); config.Configs["Modules"].Set("InventoryAccessModule", "BasicInventoryAccessModule"); - scene = SceneHelpers.SetupScene(); + scene = new SceneHelpers().SetupScene(); m_attMod = new AttachmentsModule(); SceneHelpers.SetupSceneModules(scene, config, m_attMod, new BasicInventoryAccessModule()); } diff --git a/OpenSim/Region/CoreModules/Avatar/AvatarFactory/Tests/AvatarFactoryModuleTests.cs b/OpenSim/Region/CoreModules/Avatar/AvatarFactory/Tests/AvatarFactoryModuleTests.cs index 11a0a86bde..848b3bfc08 100644 --- a/OpenSim/Region/CoreModules/Avatar/AvatarFactory/Tests/AvatarFactoryModuleTests.cs +++ b/OpenSim/Region/CoreModules/Avatar/AvatarFactory/Tests/AvatarFactoryModuleTests.cs @@ -53,7 +53,7 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory UUID userId = TestHelpers.ParseTail(0x1); AvatarFactoryModule afm = new AvatarFactoryModule(); - TestScene scene = SceneHelpers.SetupScene(); + TestScene scene = new SceneHelpers().SetupScene(); SceneHelpers.SetupSceneModules(scene, afm); ScenePresence sp = SceneHelpers.AddScenePresence(scene, userId); @@ -81,7 +81,7 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory CoreAssetCache assetCache = new CoreAssetCache(); AvatarFactoryModule afm = new AvatarFactoryModule(); - TestScene scene = SceneHelpers.SetupScene(assetCache); + TestScene scene = new SceneHelpers(assetCache).SetupScene(); SceneHelpers.SetupSceneModules(scene, afm); ScenePresence sp = SceneHelpers.AddScenePresence(scene, userId); diff --git a/OpenSim/Region/CoreModules/Avatar/Friends/Tests/FriendModuleTests.cs b/OpenSim/Region/CoreModules/Avatar/Friends/Tests/FriendModuleTests.cs index 45b4264c91..7a197f7cd5 100644 --- a/OpenSim/Region/CoreModules/Avatar/Friends/Tests/FriendModuleTests.cs +++ b/OpenSim/Region/CoreModules/Avatar/Friends/Tests/FriendModuleTests.cs @@ -78,7 +78,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends.Tests config.AddConfig("FriendsService"); config.Configs["FriendsService"].Set("StorageProvider", "OpenSim.Data.Null.dll"); - m_scene = SceneHelpers.SetupScene(); + m_scene = new SceneHelpers().SetupScene(); m_fm = new FriendsModule(); SceneHelpers.SetupSceneModules(m_scene, config, m_fm); } diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiveTestCase.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiveTestCase.cs index 19ef571e7e..90ae69d6ff 100644 --- a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiveTestCase.cs +++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiveTestCase.cs @@ -100,7 +100,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests // log4net.Config.XmlConfigurator.Configure(); InventoryArchiverModule archiverModule = new InventoryArchiverModule(); - Scene scene = SceneHelpers.SetupScene(); + Scene scene = new SceneHelpers().SetupScene(); SceneHelpers.SetupSceneModules(scene, archiverModule); UserAccountHelpers.CreateUserWithInventory(scene, m_uaLL1, "hampshire"); diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiverTests.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiverTests.cs index e409c8e051..b112b6db52 100644 --- a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiverTests.cs +++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiverTests.cs @@ -61,7 +61,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests SerialiserModule serialiserModule = new SerialiserModule(); m_archiverModule = new InventoryArchiverModule(); - m_scene = SceneHelpers.SetupScene(); + m_scene = new SceneHelpers().SetupScene(); SceneHelpers.SetupSceneModules(m_scene, serialiserModule, m_archiverModule); } diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/PathTests.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/PathTests.cs index 417c20c097..6eb3605235 100644 --- a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/PathTests.cs +++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/PathTests.cs @@ -62,7 +62,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests InventoryArchiverModule archiverModule = new InventoryArchiverModule(); - Scene scene = SceneHelpers.SetupScene(); + Scene scene = new SceneHelpers().SetupScene(); SceneHelpers.SetupSceneModules(scene, archiverModule); // Create user @@ -179,7 +179,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests InventoryArchiverModule archiverModule = new InventoryArchiverModule(); // Annoyingly, we have to set up a scene even though inventory loading has nothing to do with a scene - Scene scene = SceneHelpers.SetupScene(); + Scene scene = new SceneHelpers().SetupScene(); SceneHelpers.SetupSceneModules(scene, serialiserModule, archiverModule); @@ -222,7 +222,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests SerialiserModule serialiserModule = new SerialiserModule(); InventoryArchiverModule archiverModule = new InventoryArchiverModule(); - Scene scene = SceneHelpers.SetupScene(); + Scene scene = new SceneHelpers().SetupScene(); SceneHelpers.SetupSceneModules(scene, serialiserModule, archiverModule); UserAccountHelpers.CreateUserWithInventory(scene, m_uaMT, "password"); @@ -247,7 +247,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests InventoryArchiverModule archiverModule = new InventoryArchiverModule(); - Scene scene = SceneHelpers.SetupScene(); + Scene scene = new SceneHelpers().SetupScene(); SceneHelpers.SetupSceneModules(scene, archiverModule); // Create user @@ -326,7 +326,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests TestHelpers.InMethod(); // log4net.Config.XmlConfigurator.Configure(); - Scene scene = SceneHelpers.SetupScene(); + Scene scene = new SceneHelpers().SetupScene(); UserAccount ua1 = UserAccountHelpers.CreateUserWithInventory(scene); Dictionary foldersCreated = new Dictionary(); @@ -393,7 +393,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests TestHelpers.InMethod(); //log4net.Config.XmlConfigurator.Configure(); - Scene scene = SceneHelpers.SetupScene(); + Scene scene = new SceneHelpers().SetupScene(); UserAccount ua1 = UserAccountHelpers.CreateUserWithInventory(scene); string folder1ExistingName = "a"; @@ -444,7 +444,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests TestHelpers.InMethod(); // log4net.Config.XmlConfigurator.Configure(); - Scene scene = SceneHelpers.SetupScene(); + Scene scene = new SceneHelpers().SetupScene(); UserAccount ua1 = UserAccountHelpers.CreateUserWithInventory(scene); string folder1ExistingName = "a"; diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs index 0f3ed273a2..a318a3c8db 100644 --- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs +++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs @@ -597,7 +597,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer protected virtual void AgentHasMovedAway(ScenePresence sp, bool logout) { - sp.Scene.AttachmentsModule.DeleteAttachmentsFromScene(sp, true); + if (sp.Scene.AttachmentsModule != null) + sp.Scene.AttachmentsModule.DeleteAttachmentsFromScene(sp, true); } protected void KillEntity(Scene scene, uint localID) diff --git a/OpenSim/Region/CoreModules/Framework/InventoryAccess/Tests/InventoryAccessModuleTests.cs b/OpenSim/Region/CoreModules/Framework/InventoryAccess/Tests/InventoryAccessModuleTests.cs index e74310c849..d6afaa9e75 100644 --- a/OpenSim/Region/CoreModules/Framework/InventoryAccess/Tests/InventoryAccessModuleTests.cs +++ b/OpenSim/Region/CoreModules/Framework/InventoryAccess/Tests/InventoryAccessModuleTests.cs @@ -65,7 +65,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess.Tests config.AddConfig("Modules"); config.Configs["Modules"].Set("InventoryAccessModule", "BasicInventoryAccessModule"); - m_scene = SceneHelpers.SetupScene(); + m_scene = new SceneHelpers().SetupScene(); SceneHelpers.SetupSceneModules(m_scene, config, m_iam); // Create user diff --git a/OpenSim/Region/CoreModules/World/Archiver/Tests/ArchiverTests.cs b/OpenSim/Region/CoreModules/World/Archiver/Tests/ArchiverTests.cs index e05e8f677a..053c6f59d4 100644 --- a/OpenSim/Region/CoreModules/World/Archiver/Tests/ArchiverTests.cs +++ b/OpenSim/Region/CoreModules/World/Archiver/Tests/ArchiverTests.cs @@ -68,7 +68,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver.Tests SerialiserModule serialiserModule = new SerialiserModule(); TerrainModule terrainModule = new TerrainModule(); - m_scene = SceneHelpers.SetupScene(); + m_scene = new SceneHelpers().SetupScene(); SceneHelpers.SetupSceneModules(m_scene, m_archiverModule, serialiserModule, terrainModule); } @@ -463,7 +463,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver.Tests SerialiserModule serialiserModule = new SerialiserModule(); TerrainModule terrainModule = new TerrainModule(); - TestScene scene2 = SceneHelpers.SetupScene(); + TestScene scene2 = new SceneHelpers().SetupScene(); SceneHelpers.SetupSceneModules(scene2, archiverModule, serialiserModule, terrainModule); // Make sure there's a valid owner for the owner we saved (this should have been wiped if the code is @@ -607,7 +607,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver.Tests SerialiserModule serialiserModule = new SerialiserModule(); TerrainModule terrainModule = new TerrainModule(); - Scene scene = SceneHelpers.SetupScene(); + Scene scene = new SceneHelpers().SetupScene(); SceneHelpers.SetupSceneModules(scene, archiverModule, serialiserModule, terrainModule); m_scene.AddNewSceneObject(new SceneObjectGroup(part2), false); diff --git a/OpenSim/Region/CoreModules/World/Land/Tests/PrimCountModuleTests.cs b/OpenSim/Region/CoreModules/World/Land/Tests/PrimCountModuleTests.cs index e553ffa571..b5ee4d2cae 100644 --- a/OpenSim/Region/CoreModules/World/Land/Tests/PrimCountModuleTests.cs +++ b/OpenSim/Region/CoreModules/World/Land/Tests/PrimCountModuleTests.cs @@ -64,7 +64,7 @@ namespace OpenSim.Region.CoreModules.World.Land.Tests { m_pcm = new PrimCountModule(); LandManagementModule lmm = new LandManagementModule(); - m_scene = SceneHelpers.SetupScene(); + m_scene = new SceneHelpers().SetupScene(); SceneHelpers.SetupSceneModules(m_scene, lmm, m_pcm); int xParcelDivider = (int)Constants.RegionSize - 1; diff --git a/OpenSim/Region/CoreModules/World/Media/Moap/Tests/MoapTests.cs b/OpenSim/Region/CoreModules/World/Media/Moap/Tests/MoapTests.cs index 4326606d5a..0545250db7 100644 --- a/OpenSim/Region/CoreModules/World/Media/Moap/Tests/MoapTests.cs +++ b/OpenSim/Region/CoreModules/World/Media/Moap/Tests/MoapTests.cs @@ -53,7 +53,7 @@ namespace OpenSim.Region.CoreModules.World.Media.Moap.Tests public void SetUp() { m_module = new MoapModule(); - m_scene = SceneHelpers.SetupScene(); + m_scene = new SceneHelpers().SetupScene(); SceneHelpers.SetupSceneModules(m_scene, m_module); } diff --git a/OpenSim/Region/CoreModules/World/Serialiser/Tests/SerialiserTests.cs b/OpenSim/Region/CoreModules/World/Serialiser/Tests/SerialiserTests.cs index d1d2020587..7825e3e7c7 100644 --- a/OpenSim/Region/CoreModules/World/Serialiser/Tests/SerialiserTests.cs +++ b/OpenSim/Region/CoreModules/World/Serialiser/Tests/SerialiserTests.cs @@ -343,7 +343,7 @@ namespace OpenSim.Region.CoreModules.World.Serialiser.Tests public void Init() { m_serialiserModule = new SerialiserModule(); - m_scene = SceneHelpers.SetupScene(); + m_scene = new SceneHelpers().SetupScene(); SceneHelpers.SetupSceneModules(m_scene, m_serialiserModule); } diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index dacd9b694f..4d0aa6f32c 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -437,6 +437,7 @@ namespace OpenSim.Region.Framework.Scenes { if (m_simulationService == null) m_simulationService = RequestModuleInterface(); + return m_simulationService; } } @@ -3217,7 +3218,7 @@ namespace OpenSim.Region.Framework.Scenes try { m_log.DebugFormat( - "[SCENE]: Removing {0} agent {1} {2} from region {2}", + "[SCENE]: Removing {0} agent {1} {2} from region {3}", (isChildAgent ? "child" : "root"), avatar.Name, agentID, RegionInfo.RegionName); m_sceneGraph.removeUserCount(!isChildAgent); @@ -3879,7 +3880,10 @@ namespace OpenSim.Region.Framework.Scenes ILandObject nearestParcel = GetNearestAllowedParcel(cAgentData.AgentID, Constants.RegionSize / 2, Constants.RegionSize / 2); if (nearestParcel == null) { - m_log.DebugFormat("[SCENE]: Denying root agent entry to {0}: no allowed parcel", cAgentData.AgentID); + m_log.DebugFormat( + "[SCENE]: Denying root agent entry to {0} in {1}: no allowed parcel", + cAgentData.AgentID, RegionInfo.RegionName); + return false; } diff --git a/OpenSim/Region/Framework/Scenes/Tests/EntityManagerTests.cs b/OpenSim/Region/Framework/Scenes/Tests/EntityManagerTests.cs index a5d2b2304a..ea9fc9386e 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/EntityManagerTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/EntityManagerTests.cs @@ -45,7 +45,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests { static public Random random; SceneObjectGroup found; - Scene scene = SceneHelpers.SetupScene(); + Scene scene = new SceneHelpers().SetupScene(); [Test] public void T010_AddObjects() diff --git a/OpenSim/Region/Framework/Scenes/Tests/SceneGraphTests.cs b/OpenSim/Region/Framework/Scenes/Tests/SceneGraphTests.cs index 9a60e50eb9..1c33a5f27a 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/SceneGraphTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/SceneGraphTests.cs @@ -44,7 +44,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests public void TestDuplicateObject() { TestHelpers.InMethod(); - Scene scene = SceneHelpers.SetupScene(); + Scene scene = new SceneHelpers().SetupScene(); UUID ownerId = new UUID("00000000-0000-0000-0000-000000000010"); string part1Name = "part1"; diff --git a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectBasicTests.cs b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectBasicTests.cs index 7737d8ea83..453e077c8a 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectBasicTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectBasicTests.cs @@ -88,7 +88,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests { TestHelpers.InMethod(); - Scene scene = SceneHelpers.SetupScene(); + Scene scene = new SceneHelpers().SetupScene(); int partsToTestCount = 3; SceneObjectGroup so @@ -118,7 +118,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests { TestHelpers.InMethod(); - Scene scene = SceneHelpers.SetupScene(); + Scene scene = new SceneHelpers().SetupScene(); string obj1Name = "Alfred"; string obj2Name = "Betty"; @@ -152,7 +152,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests { TestHelpers.InMethod(); - Scene scene = SceneHelpers.SetupScene(); + Scene scene = new SceneHelpers().SetupScene(); int partsToTestCount = 3; SceneObjectGroup so @@ -185,7 +185,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests { TestHelpers.InMethod(); - TestScene scene = SceneHelpers.SetupScene(); + TestScene scene = new SceneHelpers().SetupScene(); SceneObjectPart part = SceneHelpers.AddSceneObject(scene); scene.DeleteSceneObject(part.ParentGroup, false); @@ -204,7 +204,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests UUID agentId = UUID.Parse("00000000-0000-0000-0000-000000000001"); - TestScene scene = SceneHelpers.SetupScene(); + TestScene scene = new SceneHelpers().SetupScene(); // Turn off the timer on the async sog deleter - we'll crank it by hand for this test. AsyncSceneObjectGroupDeleter sogd = scene.SceneObjectGroupDeleter; diff --git a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectDeRezTests.cs b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectDeRezTests.cs index 654b1a2cc6..0076f41225 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectDeRezTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectDeRezTests.cs @@ -61,7 +61,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests UUID userId = UUID.Parse("10000000-0000-0000-0000-000000000001"); - TestScene scene = SceneHelpers.SetupScene(); + TestScene scene = new SceneHelpers().SetupScene(); IConfigSource configSource = new IniConfigSource(); IConfig config = configSource.AddConfig("Startup"); config.Set("serverside_object_permissions", true); @@ -100,7 +100,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests UUID userId = UUID.Parse("10000000-0000-0000-0000-000000000001"); UUID objectOwnerId = UUID.Parse("20000000-0000-0000-0000-000000000001"); - TestScene scene = SceneHelpers.SetupScene(); + TestScene scene = new SceneHelpers().SetupScene(); IConfigSource configSource = new IniConfigSource(); IConfig config = configSource.AddConfig("Startup"); config.Set("serverside_object_permissions", true); diff --git a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectLinkingTests.cs b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectLinkingTests.cs index be5b4a8986..1add3ddb8c 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectLinkingTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectLinkingTests.cs @@ -55,7 +55,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests UUID ownerId = TestHelpers.ParseTail(0x1); int nParts = 3; - TestScene scene = SceneHelpers.SetupScene(); + TestScene scene = new SceneHelpers().SetupScene(); SceneObjectGroup sog1 = SceneHelpers.CreateSceneObject(nParts, ownerId, "TestLinkToSelf_", 0x10); scene.AddSceneObject(sog1); scene.LinkObjects(ownerId, sog1.LocalId, new List() { sog1.Parts[1].LocalId }); @@ -71,7 +71,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests bool debugtest = false; - Scene scene = SceneHelpers.SetupScene(); + Scene scene = new SceneHelpers().SetupScene(); SceneObjectPart part1 = SceneHelpers.AddSceneObject(scene); SceneObjectGroup grp1 = part1.ParentGroup; SceneObjectPart part2 = SceneHelpers.AddSceneObject(scene); @@ -153,7 +153,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests bool debugtest = false; - Scene scene = SceneHelpers.SetupScene(); + Scene scene = new SceneHelpers().SetupScene(); SceneObjectPart part1 = SceneHelpers.AddSceneObject(scene); SceneObjectGroup grp1 = part1.ParentGroup; SceneObjectPart part2 = SceneHelpers.AddSceneObject(scene); @@ -286,7 +286,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests TestHelpers.InMethod(); //log4net.Config.XmlConfigurator.Configure(); - TestScene scene = SceneHelpers.SetupScene(); + TestScene scene = new SceneHelpers().SetupScene(); string rootPartName = "rootpart"; UUID rootPartUuid = new UUID("00000000-0000-0000-0000-000000000001"); @@ -325,7 +325,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests TestHelpers.InMethod(); //log4net.Config.XmlConfigurator.Configure(); - TestScene scene = SceneHelpers.SetupScene(); + TestScene scene = new SceneHelpers().SetupScene(); string rootPartName = "rootpart"; UUID rootPartUuid = new UUID("00000000-0000-0000-0000-000000000001"); diff --git a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectResizeTests.cs b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectResizeTests.cs index b49c6e7a98..0a94c1900d 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectResizeTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectResizeTests.cs @@ -52,7 +52,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests TestHelpers.InMethod(); // log4net.Config.XmlConfigurator.Configure(); - Scene scene = SceneHelpers.SetupScene(); + Scene scene = new SceneHelpers().SetupScene(); SceneObjectGroup g1 = SceneHelpers.AddSceneObject(scene).ParentGroup; g1.GroupResize(new Vector3(2, 3, 4)); @@ -75,7 +75,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests TestHelpers.InMethod(); //log4net.Config.XmlConfigurator.Configure(); - Scene scene = SceneHelpers.SetupScene(); + Scene scene = new SceneHelpers().SetupScene(); SceneObjectGroup g1 = SceneHelpers.CreateSceneObject(2, UUID.Zero); g1.RootPart.Scale = new Vector3(2, 3, 4); diff --git a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectScriptTests.cs b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectScriptTests.cs index c582cf66fb..d2361f8667 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectScriptTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectScriptTests.cs @@ -52,7 +52,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests // UUID itemId = TestHelpers.ParseTail(0x2); string itemName = "Test Script Item"; - Scene scene = SceneHelpers.SetupScene(); + Scene scene = new SceneHelpers().SetupScene(); SceneObjectGroup so = SceneHelpers.CreateSceneObject(1, userId); scene.AddNewSceneObject(so, true); diff --git a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectSpatialTests.cs b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectSpatialTests.cs index 9fea3c63a7..6d255aa2d9 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectSpatialTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectSpatialTests.cs @@ -50,7 +50,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests [SetUp] public void SetUp() { - m_scene = SceneHelpers.SetupScene(); + m_scene = new SceneHelpers().SetupScene(); } [Test] diff --git a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectStatusTests.cs b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectStatusTests.cs index 360566db4b..742c7691e9 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectStatusTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectStatusTests.cs @@ -52,7 +52,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests [SetUp] public void Init() { - m_scene = SceneHelpers.SetupScene(); + m_scene = new SceneHelpers().SetupScene(); m_so1 = SceneHelpers.CreateSceneObject(1, m_ownerId, "so1", 0x10); m_so2 = SceneHelpers.CreateSceneObject(1, m_ownerId, "so2", 0x20); } diff --git a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectUserGroupTests.cs b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectUserGroupTests.cs index c13d82e16d..c7eaff9d00 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectUserGroupTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectUserGroupTests.cs @@ -58,7 +58,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests UUID userId = UUID.Parse("10000000-0000-0000-0000-000000000001"); - TestScene scene = SceneHelpers.SetupScene(); + TestScene scene = new SceneHelpers().SetupScene(); IConfigSource configSource = new IniConfigSource(); IConfig startupConfig = configSource.AddConfig("Startup"); diff --git a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAgentTests.cs b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAgentTests.cs index ed9b179286..2e46377901 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAgentTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAgentTests.cs @@ -67,10 +67,12 @@ namespace OpenSim.Region.Framework.Scenes.Tests public void Init() { TestHelpers.InMethod(); - - scene = SceneHelpers.SetupScene("Neighbour x", UUID.Random(), 1000, 1000); - scene2 = SceneHelpers.SetupScene("Neighbour x+1", UUID.Random(), 1001, 1000); - scene3 = SceneHelpers.SetupScene("Neighbour x-1", UUID.Random(), 999, 1000); + + SceneHelpers sh = new SceneHelpers(); + + scene = sh.SetupScene("Neighbour x", UUID.Random(), 1000, 1000); + scene2 = sh.SetupScene("Neighbour x+1", UUID.Random(), 1001, 1000); + scene3 = sh.SetupScene("Neighbour x-1", UUID.Random(), 999, 1000); ISharedRegionModule interregionComms = new LocalSimulationConnectorModule(); interregionComms.Initialise(new IniConfigSource()); @@ -101,7 +103,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests TestHelpers.InMethod(); // log4net.Config.XmlConfigurator.Configure(); - TestScene scene = SceneHelpers.SetupScene(); + TestScene scene = new SceneHelpers().SetupScene(); ScenePresence sp = SceneHelpers.AddScenePresence(scene, TestHelpers.ParseTail(0x1)); Assert.That(scene.AuthenticateHandler.GetAgentCircuitData(sp.UUID), Is.Not.Null); @@ -126,7 +128,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests IConfig config = configSource.AddConfig("Modules"); config.Set("SimulationServices", "LocalSimulationConnectorModule"); - TestScene scene = SceneHelpers.SetupScene(); + TestScene scene = new SceneHelpers().SetupScene(); SceneHelpers.SetupSceneModules(scene, configSource, lsc); UUID agentId = TestHelpers.ParseTail(0x01); @@ -176,8 +178,8 @@ namespace OpenSim.Region.Framework.Scenes.Tests // UUID agent1Id = UUID.Parse("00000000-0000-0000-0000-000000000001"); - TestScene myScene1 = SceneHelpers.SetupScene("Neighbour y", UUID.Random(), 1000, 1000); - TestScene myScene2 = SceneHelpers.SetupScene("Neighbour y + 1", UUID.Random(), 1001, 1000); + TestScene myScene1 = new SceneHelpers().SetupScene("Neighbour y", UUID.Random(), 1000, 1000); + TestScene myScene2 = new SceneHelpers().SetupScene("Neighbour y + 1", UUID.Random(), 1001, 1000); IConfigSource configSource = new IniConfigSource(); IConfig config = configSource.AddConfig("Startup"); diff --git a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAnimationTests.cs b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAnimationTests.cs index 89f8007d0f..646e5fa61a 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAnimationTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAnimationTests.cs @@ -59,7 +59,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests TestHelpers.InMethod(); // log4net.Config.XmlConfigurator.Configure(); - TestScene scene = SceneHelpers.SetupScene(); + TestScene scene = new SceneHelpers().SetupScene(); ScenePresence sp = SceneHelpers.AddScenePresence(scene, TestHelpers.ParseTail(0x1)); sp.Flying = true; sp.PhysicsCollisionUpdate(new CollisionEventUpdate()); diff --git a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAutopilotTests.cs b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAutopilotTests.cs index cfea10d710..1d1ff88420 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAutopilotTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAutopilotTests.cs @@ -64,7 +64,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests [SetUp] public void Init() { - m_scene = SceneHelpers.SetupScene(); + m_scene = new SceneHelpers().SetupScene(); } [Test] diff --git a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceSitTests.cs b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceSitTests.cs index b7b8db445e..313e350cbc 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceSitTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceSitTests.cs @@ -50,7 +50,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests [SetUp] public void Init() { - m_scene = SceneHelpers.SetupScene(); + m_scene = new SceneHelpers().SetupScene(); m_sp = SceneHelpers.AddScenePresence(m_scene, TestHelpers.ParseTail(0x1)); } diff --git a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTeleportTests.cs b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTeleportTests.cs index eb7bfbd802..19542ffffe 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTeleportTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTeleportTests.cs @@ -61,7 +61,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests // Not strictly necessary since FriendsModule assumes it is the default (!) config.Configs["Modules"].Set("EntityTransferModule", etm.Name); - TestScene scene = SceneHelpers.SetupScene("sceneA", TestHelpers.ParseTail(0x100), 1000, 1000); + TestScene scene = new SceneHelpers().SetupScene("sceneA", TestHelpers.ParseTail(0x100), 1000, 1000); SceneHelpers.SetupSceneModules(scene, config, etm); Vector3 teleportPosition = new Vector3(10, 11, 12); @@ -83,145 +83,58 @@ namespace OpenSim.Region.Framework.Scenes.Tests // Assert.That(sp.Lookat, Is.EqualTo(teleportLookAt)); } - /// - /// Test a teleport between two regions that are not neighbours and do not share any neighbours in common. - /// - /// Does not yet do what is says on the tin. - /// Commenting for now - //[Test, LongRunning] - public void TestSimpleNotNeighboursTeleport() + [Test] + public void TestSameSimulatorSeparatedRegionsTeleport() { TestHelpers.InMethod(); - ThreadRunResults results = new ThreadRunResults(); - results.Result = false; - results.Message = "Test did not run"; - TestRunning testClass = new TestRunning(results); +// log4net.Config.XmlConfigurator.Configure(); - Thread testThread = new Thread(testClass.run); + UUID userId = TestHelpers.ParseTail(0x1); - // Seems kind of redundant to start a thread and then join it, however.. We need to protect against - // A thread abort exception in the simulator code. - testThread.Start(); - testThread.Join(); + EntityTransferModule etm = new EntityTransferModule(); + LocalSimulationConnectorModule lscm = new LocalSimulationConnectorModule(); - Assert.That(testClass.results.Result, Is.EqualTo(true), testClass.results.Message); - // Console.WriteLine("Beginning test {0}", MethodBase.GetCurrentMethod()); - } + IConfigSource config = new IniConfigSource(); + config.AddConfig("Modules"); + // Not strictly necessary since FriendsModule assumes it is the default (!) + config.Configs["Modules"].Set("EntityTransferModule", etm.Name); + config.Configs["Modules"].Set("SimulationServices", lscm.Name); - [TearDown] - public void TearDown() - { - try - { - if (MainServer.Instance != null) MainServer.Instance.Stop(); - } - catch (NullReferenceException) - { } - } + SceneHelpers sh = new SceneHelpers(); + TestScene sceneA = sh.SetupScene("sceneA", TestHelpers.ParseTail(0x100), 1000, 1000); + TestScene sceneB = sh.SetupScene("sceneB", TestHelpers.ParseTail(0x200), 1002, 1000); - } + SceneHelpers.SetupSceneModules(new Scene[] { sceneA, sceneB }, config, etm, lscm); - public class ThreadRunResults - { - public bool Result = false; - public string Message = string.Empty; - } + Vector3 teleportPosition = new Vector3(10, 11, 12); + Vector3 teleportLookAt = new Vector3(20, 21, 22); - public class TestRunning - { - public ThreadRunResults results; - public TestRunning(ThreadRunResults t) - { - results = t; - } - public void run(object o) - { - - //results.Result = true; - log4net.Config.XmlConfigurator.Configure(); + ScenePresence sp = SceneHelpers.AddScenePresence(sceneA, userId); + sp.AbsolutePosition = new Vector3(30, 31, 32); - UUID sceneAId = UUID.Parse("00000000-0000-0000-0000-000000000100"); - UUID sceneBId = UUID.Parse("00000000-0000-0000-0000-000000000200"); + // XXX: A very nasty hack to tell the client about the destination scene without having to crank the whole + // UDP stack (?) + ((TestClient)sp.ControllingClient).TeleportTargetScene = sceneB; - // shared module - ISharedRegionModule interregionComms = new LocalSimulationConnectorModule(); + sceneA.RequestTeleportLocation( + sp.ControllingClient, + sceneB.RegionInfo.RegionHandle, + teleportPosition, + teleportLookAt, + (uint)TeleportFlags.ViaLocation); + Assert.That(sceneA.GetScenePresence(userId), Is.Null); - Scene sceneB = SceneHelpers.SetupScene("sceneB", sceneBId, 1010, 1010); - SceneHelpers.SetupSceneModules(sceneB, new IniConfigSource(), interregionComms); - sceneB.RegisterRegionWithGrid(); + ScenePresence sceneBSp = sceneB.GetScenePresence(userId); + Assert.That(sceneBSp, Is.Not.Null); + Assert.That(sceneBSp.Scene.RegionInfo.RegionName, Is.EqualTo(sceneB.RegionInfo.RegionName)); + Assert.That(sceneBSp.AbsolutePosition, Is.EqualTo(teleportPosition)); - Scene sceneA = SceneHelpers.SetupScene("sceneA", sceneAId, 1000, 1000); - SceneHelpers.SetupSceneModules(sceneA, new IniConfigSource(), interregionComms); - sceneA.RegisterRegionWithGrid(); + // TODO: Add assertions to check correct circuit details in both scenes. - UUID agentId = UUID.Parse("00000000-0000-0000-0000-000000000041"); - TestClient client = (TestClient)SceneHelpers.AddScenePresence(sceneA, agentId).ControllingClient; - - ICapabilitiesModule sceneACapsModule = sceneA.RequestModuleInterface(); - - results.Result = (sceneACapsModule.GetCapsPath(agentId) == client.CapsSeedUrl); - - if (!results.Result) - { - results.Message = "Incorrect caps object path set up in sceneA"; - return; - } - - /* - Assert.That( - sceneACapsModule.GetCapsPath(agentId), - Is.EqualTo(client.CapsSeedUrl), - "Incorrect caps object path set up in sceneA"); - */ - // FIXME: This is a hack to get the test working - really the normal OpenSim mechanisms should be used. - - - client.TeleportTargetScene = sceneB; - client.Teleport(sceneB.RegionInfo.RegionHandle, new Vector3(100, 100, 100), new Vector3(40, 40, 40)); - - results.Result = (sceneB.GetScenePresence(agentId) != null); - if (!results.Result) - { - results.Message = "Client does not have an agent in sceneB"; - return; - } - - //Assert.That(sceneB.GetScenePresence(agentId), Is.Not.Null, "Client does not have an agent in sceneB"); - - //Assert.That(sceneA.GetScenePresence(agentId), Is.Null, "Client still had an agent in sceneA"); - - results.Result = (sceneA.GetScenePresence(agentId) == null); - if (!results.Result) - { - results.Message = "Client still had an agent in sceneA"; - return; - } - - ICapabilitiesModule sceneBCapsModule = sceneB.RequestModuleInterface(); - - - results.Result = ("http://" + sceneB.RegionInfo.ExternalHostName + ":" + sceneB.RegionInfo.HttpPort + - "/CAPS/" + sceneBCapsModule.GetCapsPath(agentId) + "0000/" == client.CapsSeedUrl); - if (!results.Result) - { - results.Message = "Incorrect caps object path set up in sceneB"; - return; - } - - // Temporary assertion - caps url construction should at least be doable through a method. - /* - Assert.That( - "http://" + sceneB.RegionInfo.ExternalHostName + ":" + sceneB.RegionInfo.HttpPort + "/CAPS/" + sceneBCapsModule.GetCapsPath(agentId) + "0000/", - Is.EqualTo(client.CapsSeedUrl), - "Incorrect caps object path set up in sceneB"); - */ - // This assertion will currently fail since we don't remove the caps paths when no longer needed - //Assert.That(sceneACapsModule.GetCapsPath(agentId), Is.Null, "sceneA still had a caps object path"); - - // TODO: Check that more of everything is as it should be - - // TODO: test what happens if we try to teleport to a region that doesn't exist + // Lookat is sent to the client only - sp.Lookat does not yield the same thing (calculation from camera + // position instead). +// Assert.That(sp.Lookat, Is.EqualTo(teleportLookAt)); } } -} +} \ No newline at end of file diff --git a/OpenSim/Region/Framework/Scenes/Tests/SceneTests.cs b/OpenSim/Region/Framework/Scenes/Tests/SceneTests.cs index 5c9a77db67..d722a0990a 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/SceneTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/SceneTests.cs @@ -60,7 +60,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests { TestHelpers.InMethod(); - Scene scene = SceneHelpers.SetupScene(); + Scene scene = new SceneHelpers().SetupScene(); scene.Update(1); Assert.That(scene.Frame, Is.EqualTo(1)); diff --git a/OpenSim/Region/Framework/Scenes/Tests/TaskInventoryTests.cs b/OpenSim/Region/Framework/Scenes/Tests/TaskInventoryTests.cs index 55c80f5af1..d15141b3b2 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/TaskInventoryTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/TaskInventoryTests.cs @@ -58,7 +58,7 @@ namespace OpenSim.Region.Framework.Tests TestHelpers.InMethod(); // log4net.Config.XmlConfigurator.Configure(); - Scene scene = SceneHelpers.SetupScene(); + Scene scene = new SceneHelpers().SetupScene(); UserAccount user1 = UserAccountHelpers.CreateUserWithInventory(scene); SceneObjectGroup sog1 = SceneHelpers.CreateSceneObject(1, user1.PrincipalID); SceneObjectPart sop1 = sog1.RootPart; @@ -81,7 +81,7 @@ namespace OpenSim.Region.Framework.Tests TestHelpers.InMethod(); // log4net.Config.XmlConfigurator.Configure(); - Scene scene = SceneHelpers.SetupScene(); + Scene scene = new SceneHelpers().SetupScene(); UserAccount user1 = UserAccountHelpers.CreateUserWithInventory(scene); SceneObjectGroup sog1 = SceneHelpers.CreateSceneObject(1, user1.PrincipalID); SceneObjectPart sop1 = sog1.RootPart; @@ -124,7 +124,7 @@ namespace OpenSim.Region.Framework.Tests TestHelpers.InMethod(); // log4net.Config.XmlConfigurator.Configure(); - Scene scene = SceneHelpers.SetupScene(); + Scene scene = new SceneHelpers().SetupScene(); UserAccount user1 = UserAccountHelpers.CreateUserWithInventory(scene); SceneObjectGroup sog1 = SceneHelpers.CreateSceneObject(1, user1.PrincipalID); SceneObjectPart sop1 = sog1.RootPart; @@ -153,7 +153,7 @@ namespace OpenSim.Region.Framework.Tests TestHelpers.InMethod(); // log4net.Config.XmlConfigurator.Configure(); - Scene scene = SceneHelpers.SetupScene(); + Scene scene = new SceneHelpers().SetupScene(); UserAccount user1 = UserAccountHelpers.CreateUserWithInventory(scene); SceneObjectGroup sog1 = SceneHelpers.CreateSceneObject(1, user1.PrincipalID); SceneObjectPart sop1 = sog1.RootPart; diff --git a/OpenSim/Region/Framework/Scenes/Tests/UserInventoryTests.cs b/OpenSim/Region/Framework/Scenes/Tests/UserInventoryTests.cs index 55fc1e73f8..44d2d452d5 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/UserInventoryTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/UserInventoryTests.cs @@ -58,7 +58,7 @@ namespace OpenSim.Region.Framework.Tests TestHelpers.InMethod(); // log4net.Config.XmlConfigurator.Configure(); - Scene scene = SceneHelpers.SetupScene(); + Scene scene = new SceneHelpers().SetupScene(); UserAccount user1 = UserAccountHelpers.CreateUserWithInventory(scene, TestHelpers.ParseTail(1001)); UserAccount user2 = UserAccountHelpers.CreateUserWithInventory(scene, TestHelpers.ParseTail(1002)); InventoryItemBase item1 = UserInventoryHelpers.CreateInventoryItem(scene, "item1", user1.PrincipalID); @@ -85,7 +85,7 @@ namespace OpenSim.Region.Framework.Tests TestHelpers.InMethod(); // log4net.Config.XmlConfigurator.Configure(); - Scene scene = SceneHelpers.SetupScene(); + Scene scene = new SceneHelpers().SetupScene(); UserAccount user1 = UserAccountHelpers.CreateUserWithInventory(scene, TestHelpers.ParseTail(1001)); UserAccount user2 = UserAccountHelpers.CreateUserWithInventory(scene, TestHelpers.ParseTail(1002)); InventoryFolderBase folder1 diff --git a/OpenSim/Region/Framework/Scenes/Tests/UuidGathererTests.cs b/OpenSim/Region/Framework/Scenes/Tests/UuidGathererTests.cs index d9fe87c0bf..198e487d1b 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/UuidGathererTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/UuidGathererTests.cs @@ -47,7 +47,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests public void Init() { // FIXME: We don't need a full scene here - it would be enough to set up the asset service. - Scene scene = SceneHelpers.SetupScene(); + Scene scene = new SceneHelpers().SetupScene(); m_assetService = scene.AssetService; m_uuidGatherer = new UuidGatherer(m_assetService); } diff --git a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/Tests/GroupsModuleTests.cs b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/Tests/GroupsModuleTests.cs index d2f63272bd..ac638f1053 100644 --- a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/Tests/GroupsModuleTests.cs +++ b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/Tests/GroupsModuleTests.cs @@ -50,7 +50,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups.Tests TestHelpers.InMethod(); // log4net.Config.XmlConfigurator.Configure(); - TestScene scene = SceneHelpers.SetupScene(); + TestScene scene = new SceneHelpers().SetupScene(); IConfigSource configSource = new IniConfigSource(); IConfig config = configSource.AddConfig("Groups"); config.Set("Enabled", true); diff --git a/OpenSim/Region/OptionalModules/World/NPC/Tests/NPCModuleTests.cs b/OpenSim/Region/OptionalModules/World/NPC/Tests/NPCModuleTests.cs index eea0b2e6ad..a39257e1d0 100644 --- a/OpenSim/Region/OptionalModules/World/NPC/Tests/NPCModuleTests.cs +++ b/OpenSim/Region/OptionalModules/World/NPC/Tests/NPCModuleTests.cs @@ -85,7 +85,7 @@ namespace OpenSim.Region.OptionalModules.World.NPC.Tests m_attMod = new AttachmentsModule(); m_npcMod = new NPCModule(); - m_scene = SceneHelpers.SetupScene(); + m_scene = new SceneHelpers().SetupScene(); SceneHelpers.SetupSceneModules(m_scene, config, m_afMod, m_umMod, m_attMod, m_npcMod, new BasicInventoryAccessModule()); } diff --git a/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiInventoryTests.cs b/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiInventoryTests.cs index e2d0db267f..49266e91ea 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiInventoryTests.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiInventoryTests.cs @@ -63,7 +63,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests IConfig config = initConfigSource.AddConfig("XEngine"); config.Set("Enabled", "true"); - m_scene = SceneHelpers.SetupScene(); + m_scene = new SceneHelpers().SetupScene(); SceneHelpers.SetupSceneModules(m_scene, initConfigSource); m_engine = new XEngine.XEngine(); diff --git a/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiTest.cs b/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiTest.cs index 9cf9258571..92a63bf497 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiTest.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiTest.cs @@ -58,7 +58,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests IConfig config = initConfigSource.AddConfig("XEngine"); config.Set("Enabled", "true"); - Scene scene = SceneHelpers.SetupScene(); + Scene scene = new SceneHelpers().SetupScene(); SceneObjectPart part = SceneHelpers.AddSceneObject(scene); XEngine.XEngine engine = new XEngine.XEngine(); @@ -261,7 +261,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests TestHelpers.InMethod(); // Create Prim1. - Scene scene = SceneHelpers.SetupScene(); + Scene scene = new SceneHelpers().SetupScene(); string obj1Name = "Prim1"; UUID objUuid = new UUID("00000000-0000-0000-0000-000000000001"); SceneObjectPart part1 = diff --git a/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiAppearanceTest.cs b/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiAppearanceTest.cs index 7573dfff5f..c51227b77c 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiAppearanceTest.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiAppearanceTest.cs @@ -67,7 +67,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests config = initConfigSource.AddConfig("NPC"); config.Set("Enabled", "true"); - m_scene = SceneHelpers.SetupScene(); + m_scene = new SceneHelpers().SetupScene(); SceneHelpers.SetupSceneModules(m_scene, initConfigSource, new AvatarFactoryModule(), new NPCModule()); m_engine = new XEngine.XEngine(); diff --git a/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiNpcTests.cs b/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiNpcTests.cs index 9d9fc514a3..9c36108da3 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiNpcTests.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiNpcTests.cs @@ -68,7 +68,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests config = initConfigSource.AddConfig("NPC"); config.Set("Enabled", "true"); - m_scene = SceneHelpers.SetupScene(); + m_scene = new SceneHelpers().SetupScene(); SceneHelpers.SetupSceneModules(m_scene, initConfigSource, new AvatarFactoryModule(), new NPCModule()); m_engine = new XEngine.XEngine(); diff --git a/OpenSim/Region/ScriptEngine/XEngine/Tests/XEngineTest.cs b/OpenSim/Region/ScriptEngine/XEngine/Tests/XEngineTest.cs index 7d7bd82778..a3f848cfd4 100644 --- a/OpenSim/Region/ScriptEngine/XEngine/Tests/XEngineTest.cs +++ b/OpenSim/Region/ScriptEngine/XEngine/Tests/XEngineTest.cs @@ -73,7 +73,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine.Tests // to AssemblyResolver.OnAssemblyResolve fails. xEngineConfig.Set("AppDomainLoading", "false"); - m_scene = SceneHelpers.SetupScene("My Test", UUID.Random(), 1000, 1000, null, configSource); + m_scene = new SceneHelpers().SetupScene("My Test", UUID.Random(), 1000, 1000, configSource); SceneHelpers.SetupSceneModules(m_scene, configSource, m_xEngine, wcModule); m_scene.StartScripts(); } diff --git a/OpenSim/Tests/Common/Helpers/SceneHelpers.cs b/OpenSim/Tests/Common/Helpers/SceneHelpers.cs index 7a6b1cf8d5..8e547077fc 100644 --- a/OpenSim/Tests/Common/Helpers/SceneHelpers.cs +++ b/OpenSim/Tests/Common/Helpers/SceneHelpers.cs @@ -58,57 +58,67 @@ namespace OpenSim.Tests.Common /// public class SceneHelpers { - public static TestScene SetupScene() + private AgentCircuitManager m_acm = new AgentCircuitManager(); + private ISimulationDataService m_simDataService + = OpenSim.Server.Base.ServerUtils.LoadPlugin("OpenSim.Tests.Common.dll", null); + private IEstateDataService m_estateDataService; + + private LocalAssetServicesConnector m_assetService; + private LocalAuthenticationServicesConnector m_authenticationService; + private LocalInventoryServicesConnector m_inventoryService; + private LocalGridServicesConnector m_gridService; + private LocalUserAccountServicesConnector m_userAccountService; + private LocalPresenceServicesConnector m_presenceService; + + private CoreAssetCache m_cache; + + public SceneHelpers() : this(null) {} + + public SceneHelpers(CoreAssetCache cache) { - return SetupScene(null); + m_assetService = StartAssetService(cache); + m_authenticationService = StartAuthenticationService(); + m_inventoryService = StartInventoryService(); + m_gridService = StartGridService(); + m_userAccountService = StartUserAccountService(); + m_presenceService = StartPresenceService(); + + m_inventoryService.PostInitialise(); + m_assetService.PostInitialise(); + m_userAccountService.PostInitialise(); + m_presenceService.PostInitialise(); + + m_cache = cache; } /// /// Set up a test scene /// /// - /// Automatically starts service threads, as would the normal runtime. + /// Automatically starts services, as would the normal runtime. /// /// - public static TestScene SetupScene(CoreAssetCache cache) + public TestScene SetupScene() { - return SetupScene("Unit test region", UUID.Random(), 1000, 1000, cache); + return SetupScene("Unit test region", UUID.Random(), 1000, 1000); } - public static TestScene SetupScene(string name, UUID id, uint x, uint y) + public TestScene SetupScene(string name, UUID id, uint x, uint y) { - return SetupScene(name, id, x, y, null); + return SetupScene(name, id, x, y, new IniConfigSource()); } /// - /// Set up a scene. If it's more then one scene, use the same CommunicationsManager to link regions - /// or a different, to get a brand new scene with new shared region modules. + /// Set up a scene. /// /// Name of the region /// ID of the region /// X co-ordinate of the region /// Y co-ordinate of the region - /// - /// - public static TestScene SetupScene( - string name, UUID id, uint x, uint y, CoreAssetCache cache) - { - return SetupScene(name, id, x, y, cache, new IniConfigSource()); - } - - /// - /// Set up a scene. If it's more then one scene, use the same CommunicationsManager to link regions - /// or a different, to get a brand new scene with new shared region modules. - /// - /// Name of the region - /// ID of the region - /// X co-ordinate of the region - /// Y co-ordinate of the region - /// /// /// - public static TestScene SetupScene( - string name, UUID id, uint x, uint y, CoreAssetCache cache, IConfigSource configSource) + public TestScene SetupScene( + string name, UUID id, uint x, uint y, IConfigSource configSource) { Console.WriteLine("Setting up test scene {0}", name); @@ -119,30 +129,47 @@ namespace OpenSim.Tests.Common regInfo.RegionName = name; regInfo.RegionID = id; - AgentCircuitManager acm = new AgentCircuitManager(); SceneCommunicationService scs = new SceneCommunicationService(); - ISimulationDataService simDataService = OpenSim.Server.Base.ServerUtils.LoadPlugin("OpenSim.Tests.Common.dll", null); - IEstateDataService estateDataService = null; - TestScene testScene = new TestScene( - regInfo, acm, scs, simDataService, estateDataService, null, false, configSource, null); + regInfo, m_acm, scs, m_simDataService, m_estateDataService, null, false, configSource, null); IRegionModule godsModule = new GodsModule(); godsModule.Initialise(testScene, new IniConfigSource()); testScene.AddModule(godsModule.Name, godsModule); - LocalAssetServicesConnector assetService = StartAssetService(testScene, cache); - StartAuthenticationService(testScene); - LocalInventoryServicesConnector inventoryService = StartInventoryService(testScene); - StartGridService(testScene); - LocalUserAccountServicesConnector userAccountService = StartUserAccountService(testScene); - LocalPresenceServicesConnector presenceService = StartPresenceService(testScene); + // Add scene to services + m_assetService.AddRegion(testScene); - inventoryService.PostInitialise(); - assetService.PostInitialise(); - userAccountService.PostInitialise(); - presenceService.PostInitialise(); + if (m_cache != null) + { + m_cache.AddRegion(testScene); + m_cache.RegionLoaded(testScene); + testScene.AddRegionModule(m_cache.Name, m_cache); + } + + m_assetService.RegionLoaded(testScene); + testScene.AddRegionModule(m_assetService.Name, m_assetService); + + m_authenticationService.AddRegion(testScene); + m_authenticationService.RegionLoaded(testScene); + testScene.AddRegionModule(m_authenticationService.Name, m_authenticationService); + + m_inventoryService.AddRegion(testScene); + m_inventoryService.RegionLoaded(testScene); + testScene.AddRegionModule(m_inventoryService.Name, m_inventoryService); + + m_gridService.AddRegion(testScene); + m_gridService.RegionLoaded(testScene); + testScene.AddRegionModule(m_gridService.Name, m_gridService); + + m_userAccountService.AddRegion(testScene); + m_userAccountService.RegionLoaded(testScene); + testScene.AddRegionModule(m_userAccountService.Name, m_userAccountService); + + m_presenceService.AddRegion(testScene); + m_presenceService.RegionLoaded(testScene); + testScene.AddRegionModule(m_presenceService.Name, m_presenceService); testScene.RegionInfo.EstateSettings.EstateOwner = UUID.Random(); testScene.SetModuleInterfaces(); @@ -162,19 +189,17 @@ namespace OpenSim.Tests.Common return testScene; } - private static LocalAssetServicesConnector StartAssetService(Scene testScene, CoreAssetCache cache) + private static LocalAssetServicesConnector StartAssetService(CoreAssetCache cache) { - LocalAssetServicesConnector assetService = new LocalAssetServicesConnector(); IConfigSource config = new IniConfigSource(); - config.AddConfig("Modules"); config.Configs["Modules"].Set("AssetServices", "LocalAssetServicesConnector"); config.AddConfig("AssetService"); config.Configs["AssetService"].Set("LocalServiceModule", "OpenSim.Services.AssetService.dll:AssetService"); config.Configs["AssetService"].Set("StorageProvider", "OpenSim.Tests.Common.dll"); - + + LocalAssetServicesConnector assetService = new LocalAssetServicesConnector(); assetService.Initialise(config); - assetService.AddRegion(testScene); if (cache != null) { @@ -184,56 +209,43 @@ namespace OpenSim.Tests.Common cacheConfig.AddConfig("AssetCache"); cache.Initialise(cacheConfig); - cache.AddRegion(testScene); - cache.RegionLoaded(testScene); - testScene.AddRegionModule(cache.Name, cache); } - - assetService.RegionLoaded(testScene); - testScene.AddRegionModule(assetService.Name, assetService); return assetService; } - private static void StartAuthenticationService(Scene testScene) + private static LocalAuthenticationServicesConnector StartAuthenticationService() { - ISharedRegionModule service = new LocalAuthenticationServicesConnector(); IConfigSource config = new IniConfigSource(); - config.AddConfig("Modules"); config.AddConfig("AuthenticationService"); config.Configs["Modules"].Set("AuthenticationServices", "LocalAuthenticationServicesConnector"); config.Configs["AuthenticationService"].Set( "LocalServiceModule", "OpenSim.Services.AuthenticationService.dll:PasswordAuthenticationService"); config.Configs["AuthenticationService"].Set("StorageProvider", "OpenSim.Data.Null.dll"); - + + LocalAuthenticationServicesConnector service = new LocalAuthenticationServicesConnector(); service.Initialise(config); - service.AddRegion(testScene); - service.RegionLoaded(testScene); - testScene.AddRegionModule(service.Name, service); - //m_authenticationService = service; + + return service; } - private static LocalInventoryServicesConnector StartInventoryService(Scene testScene) + private static LocalInventoryServicesConnector StartInventoryService() { - LocalInventoryServicesConnector inventoryService = new LocalInventoryServicesConnector(); - IConfigSource config = new IniConfigSource(); config.AddConfig("Modules"); config.AddConfig("InventoryService"); config.Configs["Modules"].Set("InventoryServices", "LocalInventoryServicesConnector"); config.Configs["InventoryService"].Set("LocalServiceModule", "OpenSim.Services.InventoryService.dll:InventoryService"); config.Configs["InventoryService"].Set("StorageProvider", "OpenSim.Tests.Common.dll"); - + + LocalInventoryServicesConnector inventoryService = new LocalInventoryServicesConnector(); inventoryService.Initialise(config); - inventoryService.AddRegion(testScene); - inventoryService.RegionLoaded(testScene); - testScene.AddRegionModule(inventoryService.Name, inventoryService); return inventoryService; } - private static LocalGridServicesConnector StartGridService(Scene testScene) + private static LocalGridServicesConnector StartGridService() { IConfigSource config = new IniConfigSource(); config.AddConfig("Modules"); @@ -245,8 +257,6 @@ namespace OpenSim.Tests.Common LocalGridServicesConnector gridService = new LocalGridServicesConnector(); gridService.Initialise(config); - gridService.AddRegion(testScene); - gridService.RegionLoaded(testScene); return gridService; } @@ -256,7 +266,7 @@ namespace OpenSim.Tests.Common /// /// /// - private static LocalUserAccountServicesConnector StartUserAccountService(Scene testScene) + private static LocalUserAccountServicesConnector StartUserAccountService() { IConfigSource config = new IniConfigSource(); config.AddConfig("Modules"); @@ -268,10 +278,6 @@ namespace OpenSim.Tests.Common LocalUserAccountServicesConnector userAccountService = new LocalUserAccountServicesConnector(); userAccountService.Initialise(config); - - userAccountService.AddRegion(testScene); - userAccountService.RegionLoaded(testScene); - testScene.AddRegionModule(userAccountService.Name, userAccountService); return userAccountService; } @@ -280,7 +286,7 @@ namespace OpenSim.Tests.Common /// Start a presence service /// /// - private static LocalPresenceServicesConnector StartPresenceService(Scene testScene) + private static LocalPresenceServicesConnector StartPresenceService() { IConfigSource config = new IniConfigSource(); config.AddConfig("Modules"); @@ -292,10 +298,6 @@ namespace OpenSim.Tests.Common LocalPresenceServicesConnector presenceService = new LocalPresenceServicesConnector(); presenceService.Initialise(config); - - presenceService.AddRegion(testScene); - presenceService.RegionLoaded(testScene); - testScene.AddRegionModule(presenceService.Name, presenceService); return presenceService; } @@ -313,10 +315,37 @@ namespace OpenSim.Tests.Common /// /// Setup modules for a scene. /// - /// + /// + /// If called directly, then all the modules must be shared modules. + /// + /// /// /// public static void SetupSceneModules(Scene scene, IConfigSource config, params object[] modules) + { + SetupSceneModules(new Scene[] { scene }, config, modules); + } + + /// + /// Setup modules for a scene using their default settings. + /// + /// + /// + public static void SetupSceneModules(Scene[] scenes, params object[] modules) + { + SetupSceneModules(scenes, new IniConfigSource(), modules); + } + + /// + /// Setup modules for scenes. + /// + /// + /// If called directly, then all the modules must be shared modules. + /// + /// + /// + /// + public static void SetupSceneModules(Scene[] scenes, IConfigSource config, params object[] modules) { List newModules = new List(); foreach (object module in modules) @@ -324,8 +353,13 @@ namespace OpenSim.Tests.Common if (module is IRegionModule) { IRegionModule m = (IRegionModule)module; - m.Initialise(scene, config); - scene.AddModule(m.Name, m); + + foreach (Scene scene in scenes) + { + m.Initialise(scene, config); + scene.AddModule(m.Name, m); + } + m.PostInitialise(); } else if (module is IRegionModuleBase) @@ -345,15 +379,19 @@ namespace OpenSim.Tests.Common foreach (IRegionModuleBase module in newModules) { - module.AddRegion(scene); - scene.AddRegionModule(module.Name, module); + foreach (Scene scene in scenes) + { + module.AddRegion(scene); + scene.AddRegionModule(module.Name, module); + } } // RegionLoaded is fired after all modules have been appropriately added to all scenes foreach (IRegionModuleBase module in newModules) - module.RegionLoaded(scene); + foreach (Scene scene in scenes) + module.RegionLoaded(scene); - scene.SetModuleInterfaces(); + foreach (Scene scene in scenes) { scene.SetModuleInterfaces(); } } /// diff --git a/OpenSim/Tests/Common/Mock/TestLandChannel.cs b/OpenSim/Tests/Common/Mock/TestLandChannel.cs index 0e4dfb9eee..4b4d52d77e 100644 --- a/OpenSim/Tests/Common/Mock/TestLandChannel.cs +++ b/OpenSim/Tests/Common/Mock/TestLandChannel.cs @@ -46,6 +46,14 @@ namespace OpenSim.Tests.Common.Mock { m_scene = scene; m_parcels = new List(); + SetupDefaultParcel(); + } + + private void SetupDefaultParcel() + { + ILandObject obj = new LandObject(UUID.Zero, false, m_scene); + obj.LandData.Name = "Your Parcel"; + m_parcels.Add(obj); } public List ParcelsNearPoint(Vector3 position) @@ -63,11 +71,7 @@ namespace OpenSim.Tests.Common.Mock m_parcels.Clear(); if (setupDefaultParcel) - { - ILandObject obj = new LandObject(UUID.Zero, false, m_scene); - obj.LandData.Name = "Your Parcel"; - m_parcels.Add(obj); - } + SetupDefaultParcel(); } protected ILandObject GetNoLand() @@ -102,6 +106,5 @@ namespace OpenSim.Tests.Common.Mock public void Join(int start_x, int start_y, int end_x, int end_y, UUID attempting_user_id) {} public void Subdivide(int start_x, int start_y, int end_x, int end_y, UUID attempting_user_id) {} - } -} +} \ No newline at end of file diff --git a/OpenSim/Tests/Torture/NPCTortureTests.cs b/OpenSim/Tests/Torture/NPCTortureTests.cs index 02245056c4..731df6808c 100644 --- a/OpenSim/Tests/Torture/NPCTortureTests.cs +++ b/OpenSim/Tests/Torture/NPCTortureTests.cs @@ -98,7 +98,7 @@ namespace OpenSim.Tests.Torture umm = new UserManagementModule(); am = new AttachmentsModule(); - scene = SceneHelpers.SetupScene(); + scene = new SceneHelpers().SetupScene(); SceneHelpers.SetupSceneModules(scene, config, afm, umm, am, new BasicInventoryAccessModule(), new NPCModule()); } diff --git a/OpenSim/Tests/Torture/ObjectTortureTests.cs b/OpenSim/Tests/Torture/ObjectTortureTests.cs index d0d2199b0c..195d47bd52 100644 --- a/OpenSim/Tests/Torture/ObjectTortureTests.cs +++ b/OpenSim/Tests/Torture/ObjectTortureTests.cs @@ -126,7 +126,7 @@ namespace OpenSim.Tests.Torture // Using a local variable for scene, at least on mono 2.6.7, means that it's much more likely to be garbage // collected when we teardown this test. If it's done in a member variable, even if that is subsequently // nulled out, the garbage collect can be delayed. - TestScene scene = SceneHelpers.SetupScene(); + TestScene scene = new SceneHelpers().SetupScene(); // Process process = Process.GetCurrentProcess(); // long startProcessMemory = process.PrivateMemorySize64; diff --git a/OpenSim/Tests/Torture/ScriptTortureTests.cs b/OpenSim/Tests/Torture/ScriptTortureTests.cs index 2ef55b34b3..24f278f3f8 100644 --- a/OpenSim/Tests/Torture/ScriptTortureTests.cs +++ b/OpenSim/Tests/Torture/ScriptTortureTests.cs @@ -84,7 +84,7 @@ namespace OpenSim.Tests.Torture // to AssemblyResolver.OnAssemblyResolve fails. xEngineConfig.Set("AppDomainLoading", "false"); - m_scene = SceneHelpers.SetupScene("My Test", UUID.Random(), 1000, 1000, null, configSource); + m_scene = new SceneHelpers().SetupScene("My Test", UUID.Random(), 1000, 1000, configSource); SceneHelpers.SetupSceneModules(m_scene, configSource, m_xEngine, wcModule); m_scene.EventManager.OnChatFromWorld += OnChatFromWorld; From e4e754ee93de0e0b6fde3b3ccd20085d3d4a09a1 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Fri, 27 Apr 2012 09:23:56 -0700 Subject: [PATCH 109/547] MapImageService: added an additional security check for OSGrid and other grids like it. --- .../Handlers/Map/MapAddServerConnector.cs | 48 +++++++++++++++++-- bin/Robust.HG.ini.example | 4 ++ bin/Robust.ini.example | 4 ++ 3 files changed, 51 insertions(+), 5 deletions(-) diff --git a/OpenSim/Server/Handlers/Map/MapAddServerConnector.cs b/OpenSim/Server/Handlers/Map/MapAddServerConnector.cs index 75dd711ed2..c87de921f4 100644 --- a/OpenSim/Server/Handlers/Map/MapAddServerConnector.cs +++ b/OpenSim/Server/Handlers/Map/MapAddServerConnector.cs @@ -33,17 +33,24 @@ using System.Xml; using Nini.Config; using log4net; +using OpenMetaverse; +using OpenSim.Framework; using OpenSim.Server.Base; using OpenSim.Services.Interfaces; using OpenSim.Framework.Servers.HttpServer; using OpenSim.Server.Handlers.Base; +using GridRegion = OpenSim.Services.Interfaces.GridRegion; + namespace OpenSim.Server.Handlers.MapImage { public class MapAddServiceConnector : ServiceConnector { + private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + private IMapImageService m_MapService; + private IGridService m_GridService; private string m_ConfigName = "MapImageService"; public MapAddServiceConnector(IConfigSource config, IHttpServer server, string configName) : @@ -53,16 +60,26 @@ namespace OpenSim.Server.Handlers.MapImage if (serverConfig == null) throw new Exception(String.Format("No section {0} in config file", m_ConfigName)); - string gridService = serverConfig.GetString("LocalServiceModule", + string mapService = serverConfig.GetString("LocalServiceModule", String.Empty); - if (gridService == String.Empty) + if (mapService == String.Empty) throw new Exception("No LocalServiceModule in config file"); Object[] args = new Object[] { config }; - m_MapService = ServerUtils.LoadPlugin(gridService, args); + m_MapService = ServerUtils.LoadPlugin(mapService, args); + + string gridService = serverConfig.GetString("GridService", String.Empty); + if (gridService != string.Empty) + m_GridService = ServerUtils.LoadPlugin(gridService, args); + + if (m_GridService != null) + m_log.InfoFormat("[MAP IMAGE HANDLER]: GridService check is ON"); + else + m_log.InfoFormat("[MAP IMAGE HANDLER]: GridService check is OFF"); + + server.AddStreamHandler(new MapServerPostHandler(m_MapService, m_GridService)); - server.AddStreamHandler(new MapServerPostHandler(m_MapService)); } } @@ -70,11 +87,13 @@ namespace OpenSim.Server.Handlers.MapImage { private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); private IMapImageService m_MapService; + private IGridService m_GridService; - public MapServerPostHandler(IMapImageService service) : + public MapServerPostHandler(IMapImageService service, IGridService grid) : base("POST", "/map") { m_MapService = service; + m_GridService = grid; } public override byte[] Handle(string path, Stream requestData, IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) @@ -105,6 +124,25 @@ namespace OpenSim.Server.Handlers.MapImage // if (request.ContainsKey("TYPE")) // type = request["TYPE"].ToString(); + if (m_GridService != null) + { + GridRegion r = m_GridService.GetRegionByPosition(UUID.Zero, x * (int)Constants.RegionSize, y * (int)Constants.RegionSize); + if (r != null) + { + if (r.ExternalEndPoint.Address != httpRequest.RemoteIPEndPoint.Address) + { + m_log.WarnFormat("[MAP IMAGE HANDLER]: IP address {0} may be rogue", httpRequest.RemoteIPEndPoint.Address); + return FailureResult("IP address of caller does not match IP address of registered region"); + } + + } + else + { + m_log.WarnFormat("[MAP IMAGE HANDLER]: IP address {0} may be rogue", httpRequest.RemoteIPEndPoint.Address); + return FailureResult("Region not found at given coordinates"); + } + } + byte[] data = Convert.FromBase64String(request["DATA"].ToString()); string reason = string.Empty; diff --git a/bin/Robust.HG.ini.example b/bin/Robust.HG.ini.example index 4ea5ffd051..1b5d37cf93 100644 --- a/bin/Robust.HG.ini.example +++ b/bin/Robust.HG.ini.example @@ -279,6 +279,10 @@ ServiceConnectors = "8003/OpenSim.Server.Handlers.dll:AssetServiceConnector,8003 LocalServiceModule = "OpenSim.Services.MapImageService.dll:MapImageService" ; Set this if you want to change the default ; TilesStoragePath = "maptiles" + ; + ; If for some reason you have the AddMapTile service outside the firewall (e.g. 8002), + ; you may want to set this. Otherwise, don't set it, because it's already protected. + ; GridService = "OpenSim.Services.GridService.dll:GridService" [GridInfoService] ; These settings are used to return information on a get_grid_info call. diff --git a/bin/Robust.ini.example b/bin/Robust.ini.example index 69e94a584a..40b8d833bc 100644 --- a/bin/Robust.ini.example +++ b/bin/Robust.ini.example @@ -254,6 +254,10 @@ ServiceConnectors = "8003/OpenSim.Server.Handlers.dll:AssetServiceConnector,8003 LocalServiceModule = "OpenSim.Services.MapImageService.dll:MapImageService" ; Set this if you want to change the default ; TilesStoragePath = "maptiles" + ; + ; If for some reason you have the AddMapTile service outside the firewall (e.g. 8002), + ; you may want to set this. Otherwise, don't set it, because it's already protected. + ; GridService = "OpenSim.Services.GridService.dll:GridService" [GridInfoService] From c84f63f4dc98613ff286b9d959c71b738e8bc5ed Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Fri, 27 Apr 2012 09:24:50 -0700 Subject: [PATCH 110/547] Minor change in error message (HG teleport failures) --- .../Framework/EntityTransfer/HGEntityTransferModule.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs index 634fb4315e..1854b4aa3d 100644 --- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs +++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs @@ -173,7 +173,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer if (sp.UserLevel < m_levelHGTeleport) { m_log.WarnFormat("[HG ENTITY TRANSFER MODULE]: Unable to HG teleport agent due to insufficient UserLevel."); - reason = "HyperGrid teleport not permitted"; + reason = "Hypergrid teleport not allowed"; return false; } From ac64fe03d8992a041933c303fa12933393cf1713 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Fri, 27 Apr 2012 09:59:46 -0700 Subject: [PATCH 111/547] Amend to last commit: account for the existence of proxies. --- .../Handlers/Map/MapAddServerConnector.cs | 35 +++++++++++++++++-- bin/Robust.HG.ini.example | 3 ++ bin/Robust.ini.example | 4 +++ 3 files changed, 39 insertions(+), 3 deletions(-) diff --git a/OpenSim/Server/Handlers/Map/MapAddServerConnector.cs b/OpenSim/Server/Handlers/Map/MapAddServerConnector.cs index c87de921f4..cc7ef9d73b 100644 --- a/OpenSim/Server/Handlers/Map/MapAddServerConnector.cs +++ b/OpenSim/Server/Handlers/Map/MapAddServerConnector.cs @@ -78,7 +78,8 @@ namespace OpenSim.Server.Handlers.MapImage else m_log.InfoFormat("[MAP IMAGE HANDLER]: GridService check is OFF"); - server.AddStreamHandler(new MapServerPostHandler(m_MapService, m_GridService)); + bool proxy = serverConfig.GetBoolean("HasProxy", false); + server.AddStreamHandler(new MapServerPostHandler(m_MapService, m_GridService, proxy)); } } @@ -88,12 +89,14 @@ namespace OpenSim.Server.Handlers.MapImage private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); private IMapImageService m_MapService; private IGridService m_GridService; + bool m_Proxy; - public MapServerPostHandler(IMapImageService service, IGridService grid) : + public MapServerPostHandler(IMapImageService service, IGridService grid, bool proxy) : base("POST", "/map") { m_MapService = service; m_GridService = grid; + m_Proxy = proxy; } public override byte[] Handle(string path, Stream requestData, IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) @@ -129,7 +132,7 @@ namespace OpenSim.Server.Handlers.MapImage GridRegion r = m_GridService.GetRegionByPosition(UUID.Zero, x * (int)Constants.RegionSize, y * (int)Constants.RegionSize); if (r != null) { - if (r.ExternalEndPoint.Address != httpRequest.RemoteIPEndPoint.Address) + if (r.ExternalEndPoint.Address != GetCallerIP(httpRequest)) { m_log.WarnFormat("[MAP IMAGE HANDLER]: IP address {0} may be rogue", httpRequest.RemoteIPEndPoint.Address); return FailureResult("IP address of caller does not match IP address of registered region"); @@ -221,5 +224,31 @@ namespace OpenSim.Server.Handlers.MapImage return ms.ToArray(); } + + private System.Net.IPAddress GetCallerIP(IOSHttpRequest request) + { + if (!m_Proxy) + return request.RemoteIPEndPoint.Address; + + // We're behind a proxy + string xff = "X-Forwarded-For"; + string xffValue = request.Headers[xff.ToLower()]; + if (xffValue == null || (xffValue != null && xffValue == string.Empty)) + xffValue = request.Headers[xff]; + + if (xffValue == null || (xffValue != null && xffValue == string.Empty)) + { + m_log.WarnFormat("[MAP IMAGE HANDLER]: No XFF header"); + return request.RemoteIPEndPoint.Address; + } + + System.Net.IPEndPoint ep = Util.GetClientIPFromXFF(xffValue); + if (ep != null) + return ep.Address; + + // Oops + return request.RemoteIPEndPoint.Address; + } + } } diff --git a/bin/Robust.HG.ini.example b/bin/Robust.HG.ini.example index 1b5d37cf93..be7540750d 100644 --- a/bin/Robust.HG.ini.example +++ b/bin/Robust.HG.ini.example @@ -283,6 +283,9 @@ ServiceConnectors = "8003/OpenSim.Server.Handlers.dll:AssetServiceConnector,8003 ; If for some reason you have the AddMapTile service outside the firewall (e.g. 8002), ; you may want to set this. Otherwise, don't set it, because it's already protected. ; GridService = "OpenSim.Services.GridService.dll:GridService" + ; + ; Additionally, if you run this server behind a proxy, set this to true + ; HasProxy = false [GridInfoService] ; These settings are used to return information on a get_grid_info call. diff --git a/bin/Robust.ini.example b/bin/Robust.ini.example index 40b8d833bc..582af2737f 100644 --- a/bin/Robust.ini.example +++ b/bin/Robust.ini.example @@ -258,6 +258,10 @@ ServiceConnectors = "8003/OpenSim.Server.Handlers.dll:AssetServiceConnector,8003 ; If for some reason you have the AddMapTile service outside the firewall (e.g. 8002), ; you may want to set this. Otherwise, don't set it, because it's already protected. ; GridService = "OpenSim.Services.GridService.dll:GridService" + ; + ; Additionally, if you run this server behind a proxy, set this to true + ; HasProxy = false + [GridInfoService] From 292752bb78984c84b4305f32226d7f226092a08a Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Fri, 27 Apr 2012 10:22:43 -0700 Subject: [PATCH 112/547] MapImage security issue: better error messages --- OpenSim/Server/Handlers/Map/MapAddServerConnector.cs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/OpenSim/Server/Handlers/Map/MapAddServerConnector.cs b/OpenSim/Server/Handlers/Map/MapAddServerConnector.cs index cc7ef9d73b..a612114130 100644 --- a/OpenSim/Server/Handlers/Map/MapAddServerConnector.cs +++ b/OpenSim/Server/Handlers/Map/MapAddServerConnector.cs @@ -132,16 +132,18 @@ namespace OpenSim.Server.Handlers.MapImage GridRegion r = m_GridService.GetRegionByPosition(UUID.Zero, x * (int)Constants.RegionSize, y * (int)Constants.RegionSize); if (r != null) { - if (r.ExternalEndPoint.Address != GetCallerIP(httpRequest)) + System.Net.IPAddress ipAddr = GetCallerIP(httpRequest); + if (r.ExternalEndPoint.Address != ipAddr) { - m_log.WarnFormat("[MAP IMAGE HANDLER]: IP address {0} may be rogue", httpRequest.RemoteIPEndPoint.Address); + m_log.WarnFormat("[MAP IMAGE HANDLER]: IP address {0} may be trying to impersonate region in IP {1}", ipAddr, r.ExternalEndPoint.Address); return FailureResult("IP address of caller does not match IP address of registered region"); } } else { - m_log.WarnFormat("[MAP IMAGE HANDLER]: IP address {0} may be rogue", httpRequest.RemoteIPEndPoint.Address); + m_log.WarnFormat("[MAP IMAGE HANDLER]: IP address {0} may be rogue. Region not found at coordinates {1}-{2}", + httpRequest.RemoteIPEndPoint.Address, x, y); return FailureResult("Region not found at given coordinates"); } } From a9dbe393194b58447f20984eff03d366c03a01e4 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Fri, 27 Apr 2012 10:39:20 -0700 Subject: [PATCH 113/547] MapImage security issue. Compare strings instead of IPAddresses. --- OpenSim/Server/Handlers/Map/MapAddServerConnector.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Server/Handlers/Map/MapAddServerConnector.cs b/OpenSim/Server/Handlers/Map/MapAddServerConnector.cs index a612114130..8ba188d834 100644 --- a/OpenSim/Server/Handlers/Map/MapAddServerConnector.cs +++ b/OpenSim/Server/Handlers/Map/MapAddServerConnector.cs @@ -133,7 +133,7 @@ namespace OpenSim.Server.Handlers.MapImage if (r != null) { System.Net.IPAddress ipAddr = GetCallerIP(httpRequest); - if (r.ExternalEndPoint.Address != ipAddr) + if (r.ExternalEndPoint.Address.ToString() != ipAddr.ToString()) { m_log.WarnFormat("[MAP IMAGE HANDLER]: IP address {0} may be trying to impersonate region in IP {1}", ipAddr, r.ExternalEndPoint.Address); return FailureResult("IP address of caller does not match IP address of registered region"); From 9bc94c502a8e30b0d727f15d0e4b4bb22d163d6c Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Fri, 27 Apr 2012 11:05:40 -0700 Subject: [PATCH 114/547] MapImageService: changed the event at which the map tiles are uploaded, because they were being uploaded before the region was registered with the grid --- .../MapImage/MapImageServiceModule.cs | 15 ++++++++++++--- .../Server/Handlers/Map/MapAddServerConnector.cs | 4 ++-- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/MapImage/MapImageServiceModule.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/MapImage/MapImageServiceModule.cs index 6d3ace92a2..322a9f8c86 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/MapImage/MapImageServiceModule.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/MapImage/MapImageServiceModule.cs @@ -146,9 +146,10 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.MapImage lock (m_scenes) m_scenes[scene.RegionInfo.RegionID] = scene; - scene.EventManager.OnPrimsLoaded += new EventManager.PrimsLoaded(EventManager_OnPrimsLoaded); + scene.EventManager.OnLoginsEnabled += OnLoginsEnabled; } + /// /// /// @@ -163,9 +164,17 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.MapImage #endregion ISharedRegionModule - void EventManager_OnPrimsLoaded(Scene s) + void OnLoginsEnabled(string regionName) { - UploadMapTile(s); + Scene scene = null; + foreach (Scene s in m_scenes.Values) + if (s.RegionInfo.RegionName == regionName) + { + scene = s; + break; + } + if (scene != null) + UploadMapTile(scene); } diff --git a/OpenSim/Server/Handlers/Map/MapAddServerConnector.cs b/OpenSim/Server/Handlers/Map/MapAddServerConnector.cs index 8ba188d834..4a619698bc 100644 --- a/OpenSim/Server/Handlers/Map/MapAddServerConnector.cs +++ b/OpenSim/Server/Handlers/Map/MapAddServerConnector.cs @@ -129,10 +129,10 @@ namespace OpenSim.Server.Handlers.MapImage if (m_GridService != null) { + System.Net.IPAddress ipAddr = GetCallerIP(httpRequest); GridRegion r = m_GridService.GetRegionByPosition(UUID.Zero, x * (int)Constants.RegionSize, y * (int)Constants.RegionSize); if (r != null) { - System.Net.IPAddress ipAddr = GetCallerIP(httpRequest); if (r.ExternalEndPoint.Address.ToString() != ipAddr.ToString()) { m_log.WarnFormat("[MAP IMAGE HANDLER]: IP address {0} may be trying to impersonate region in IP {1}", ipAddr, r.ExternalEndPoint.Address); @@ -143,7 +143,7 @@ namespace OpenSim.Server.Handlers.MapImage else { m_log.WarnFormat("[MAP IMAGE HANDLER]: IP address {0} may be rogue. Region not found at coordinates {1}-{2}", - httpRequest.RemoteIPEndPoint.Address, x, y); + ipAddr, x, y); return FailureResult("Region not found at given coordinates"); } } From b35a1d56818386fc70a4a71e3cd8f6dd6d0e2193 Mon Sep 17 00:00:00 2001 From: Stefan_Boom Date: Sat, 14 Apr 2012 22:05:16 +0200 Subject: [PATCH 115/547] Fixing wrong position of llSensor, SensePoint wasnt following the rotation of the root prim. --- .../Implementation/Plugins/SensorRepeat.cs | 30 ++++++++++++++----- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs index 1c272f8a39..57f741caef 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs @@ -308,7 +308,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins } SceneObjectPart SensePoint = ts.host; - Vector3 fromRegionPos = SensePoint.AbsolutePosition; + Vector3 fromRegionPos = SensePoint.GetWorldPosition(); // pre define some things to avoid repeated definitions in the loop body Vector3 toRegionPos; @@ -319,14 +319,21 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins float dy; float dz; - Quaternion q = SensePoint.RotationOffset; + Quaternion q = SensePoint.GetWorldRotation(); if (SensePoint.ParentGroup.IsAttachment) { - // In attachments, the sensor cone always orients with the + // In attachments, rotate the sensor cone with the // avatar rotation. This may include a nonzero elevation if // in mouselook. + // This will not include the rotation and position of the + // attachment point (e.g. your head when a sensor is in your + // hair attached to your scull. Your hair will turn with + // your head but the sensor will stay with your (global) + // avatar rotation and position. + // Position of a sensor in a child prim attached to an avatar + // will be still wrong. ScenePresence avatar = m_CmdManager.m_ScriptEngine.World.GetScenePresence(SensePoint.ParentGroup.AttachedAvatar); - q = avatar.Rotation; + q = avatar.Rotation*q; } LSL_Types.Quaternion r = new LSL_Types.Quaternion(q.X, q.Y, q.Z, q.W); LSL_Types.Vector3 forward_dir = (new LSL_Types.Vector3(1, 0, 0) * r); @@ -439,16 +446,23 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins return sensedEntities; SceneObjectPart SensePoint = ts.host; - Vector3 fromRegionPos = SensePoint.AbsolutePosition; + Vector3 fromRegionPos = SensePoint.GetWorldPosition(); - Quaternion q = SensePoint.RotationOffset; + Quaternion q = SensePoint.GetWorldRotation(); if (SensePoint.ParentGroup.IsAttachment) { - // In attachments, the sensor cone always orients with the + // In attachments, rotate the sensor cone with the // avatar rotation. This may include a nonzero elevation if // in mouselook. + // This will not include the rotation and position of the + // attachment point (e.g. your head when a sensor is in your + // hair attached to your scull. Your hair will turn with + // your head but the sensor will stay with your (global) + // avatar rotation and position. + // Position of a sensor in a child prim attached to an avatar + // will be still wrong. ScenePresence avatar = m_CmdManager.m_ScriptEngine.World.GetScenePresence(SensePoint.ParentGroup.AttachedAvatar); - q = avatar.Rotation; + q = avatar.Rotation*q; } LSL_Types.Quaternion r = new LSL_Types.Quaternion(q.X, q.Y, q.Z, q.W); From e39e4f6bfb9d28317c2547094f5fe79969f4ede9 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 27 Apr 2012 19:40:19 +0100 Subject: [PATCH 116/547] minor: style adjustments in SensorRepeat, mainly related to patch from stoehr --- .../Shared/Api/Implementation/Plugins/SensorRepeat.cs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs index 57f741caef..3844753126 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs @@ -222,7 +222,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins // Is the sensor type is AGENT and not SCRIPTED then include agents if ((ts.type & (AGENT | AGENT_BY_USERNAME | NPC)) != 0 && (ts.type & SCRIPTED) == 0) { - sensedEntities.AddRange(doAgentSensor(ts)); + sensedEntities.AddRange(doAgentSensor(ts)); } // If SCRIPTED or PASSIVE or ACTIVE check objects @@ -333,8 +333,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins // Position of a sensor in a child prim attached to an avatar // will be still wrong. ScenePresence avatar = m_CmdManager.m_ScriptEngine.World.GetScenePresence(SensePoint.ParentGroup.AttachedAvatar); - q = avatar.Rotation*q; + q = avatar.Rotation * q; } + LSL_Types.Quaternion r = new LSL_Types.Quaternion(q.X, q.Y, q.Z, q.W); LSL_Types.Vector3 forward_dir = (new LSL_Types.Vector3(1, 0, 0) * r); double mag_fwd = LSL_Types.Vector3.Mag(forward_dir); @@ -462,7 +463,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins // Position of a sensor in a child prim attached to an avatar // will be still wrong. ScenePresence avatar = m_CmdManager.m_ScriptEngine.World.GetScenePresence(SensePoint.ParentGroup.AttachedAvatar); - q = avatar.Rotation*q; + q = avatar.Rotation * q; } LSL_Types.Quaternion r = new LSL_Types.Quaternion(q.X, q.Y, q.Z, q.W); From 9d1791def83469a10ba62ca475e934d5547bc2d8 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 27 Apr 2012 19:42:12 +0100 Subject: [PATCH 117/547] Add Stefan_Boom / stoehr to contributors --- CONTRIBUTORS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CONTRIBUTORS.txt b/CONTRIBUTORS.txt index 1370449405..ad95cf72c8 100644 --- a/CONTRIBUTORS.txt +++ b/CONTRIBUTORS.txt @@ -143,6 +143,7 @@ what it is today. * sempuki * SignpostMarv * SpotOn3D +* Stefan_Boom / stoehr * Strawberry Fride * Talun * tglion From 37d770f814321b461fc3380345d7ffcd1e00acc9 Mon Sep 17 00:00:00 2001 From: Oren Hurvitz Date: Mon, 23 Apr 2012 18:30:25 +0300 Subject: [PATCH 118/547] Use DotNetZip to compress OARs and IARs. DotNetZip provides much better compression than standard .NET. --- .../Archiver/InventoryArchiveWriteRequest.cs | 5 +- .../ArchiveWriteRequestPreparation.cs | 5 +- ThirdPartyLicenses/DotNetZip-bzip2.txt | 29 ++++++++ ThirdPartyLicenses/DotNetZip-zlib.txt | 70 ++++++++++++++++++ ThirdPartyLicenses/DotNetZip.txt | 33 +++++++++ bin/Ionic.Zip.dll | Bin 0 -> 462336 bytes prebuild.xml | 1 + 7 files changed, 141 insertions(+), 2 deletions(-) create mode 100644 ThirdPartyLicenses/DotNetZip-bzip2.txt create mode 100644 ThirdPartyLicenses/DotNetZip-zlib.txt create mode 100644 ThirdPartyLicenses/DotNetZip.txt create mode 100644 bin/Ionic.Zip.dll diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveWriteRequest.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveWriteRequest.cs index 0ee7606a13..6587eadf57 100644 --- a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveWriteRequest.cs +++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveWriteRequest.cs @@ -39,6 +39,9 @@ using OpenSim.Framework.Serialization.External; using OpenSim.Region.CoreModules.World.Archiver; using OpenSim.Region.Framework.Scenes; using OpenSim.Services.Interfaces; +using Ionic.Zlib; +using GZipStream = Ionic.Zlib.GZipStream; +using CompressionMode = Ionic.Zlib.CompressionMode; namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver { @@ -99,7 +102,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver scene, userInfo, invPath, - new GZipStream(new FileStream(savePath, FileMode.Create), CompressionMode.Compress)) + new GZipStream(new FileStream(savePath, FileMode.Create), CompressionMode.Compress, CompressionLevel.BestCompression)) { } diff --git a/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestPreparation.cs b/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestPreparation.cs index ab3cc412ab..eabe46e936 100644 --- a/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestPreparation.cs +++ b/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestPreparation.cs @@ -40,6 +40,9 @@ using OpenSim.Framework.Serialization; using OpenSim.Region.CoreModules.World.Terrain; using OpenSim.Region.Framework.Interfaces; using OpenSim.Region.Framework.Scenes; +using Ionic.Zlib; +using GZipStream = Ionic.Zlib.GZipStream; +using CompressionMode = Ionic.Zlib.CompressionMode; namespace OpenSim.Region.CoreModules.World.Archiver { @@ -82,7 +85,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver { try { - m_saveStream = new GZipStream(new FileStream(savePath, FileMode.Create), CompressionMode.Compress); + m_saveStream = new GZipStream(new FileStream(savePath, FileMode.Create), CompressionMode.Compress, CompressionLevel.BestCompression); } catch (EntryPointNotFoundException e) { diff --git a/ThirdPartyLicenses/DotNetZip-bzip2.txt b/ThirdPartyLicenses/DotNetZip-bzip2.txt new file mode 100644 index 0000000000..f8b4346fe9 --- /dev/null +++ b/ThirdPartyLicenses/DotNetZip-bzip2.txt @@ -0,0 +1,29 @@ + +The managed BZIP2 code included in Ionic.BZip2.dll and Ionic.Zip.dll is +modified code, based on the bzip2 code in the Apache commons compress +library. + +The original BZip2 was created by Julian Seward, and is licensed under +the BSD license. + +The following license applies to the Apache code: +----------------------------------------------------------------------- + +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ diff --git a/ThirdPartyLicenses/DotNetZip-zlib.txt b/ThirdPartyLicenses/DotNetZip-zlib.txt new file mode 100644 index 0000000000..801e941903 --- /dev/null +++ b/ThirdPartyLicenses/DotNetZip-zlib.txt @@ -0,0 +1,70 @@ + +The following licenses govern use of the accompanying software, the +DotNetZip library ("the software"). If you use the software, you accept +these licenses. If you do not accept the license, do not use the software. + +The managed ZLIB code included in Ionic.Zlib.dll and Ionic.Zip.dll is +modified code, based on jzlib. + + + +The following notice applies to jzlib: +----------------------------------------------------------------------- + +Copyright (c) 2000,2001,2002,2003 ymnk, JCraft,Inc. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in +the documentation and/or other materials provided with the distribution. + +3. The names of the authors may not be used to endorse or promote products +derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, +INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT, +INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, +OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +----------------------------------------------------------------------- + +jzlib is based on zlib-1.1.3. + +The following notice applies to zlib: + +----------------------------------------------------------------------- + +Copyright (C) 1995-2004 Jean-loup Gailly and Mark Adler + + The ZLIB software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + Jean-loup Gailly jloup@gzip.org + Mark Adler madler@alumni.caltech.edu + + +----------------------------------------------------------------------- diff --git a/ThirdPartyLicenses/DotNetZip.txt b/ThirdPartyLicenses/DotNetZip.txt new file mode 100644 index 0000000000..c3103fd07d --- /dev/null +++ b/ThirdPartyLicenses/DotNetZip.txt @@ -0,0 +1,33 @@ +Microsoft Public License (Ms-PL) + +This license governs use of the accompanying software, the DotNetZip library ("the software"). If you use the software, you accept this license. If you do not accept the license, do not use the software. + +1. Definitions + +The terms "reproduce," "reproduction," "derivative works," and "distribution" have the same meaning here as under U.S. copyright law. + +A "contribution" is the original software, or any additions or changes to the software. + +A "contributor" is any person that distributes its contribution under this license. + +"Licensed patents" are a contributor's patent claims that read directly on its contribution. + +2. Grant of Rights + +(A) Copyright Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free copyright license to reproduce its contribution, prepare derivative works of its contribution, and distribute its contribution or any derivative works that you create. + +(B) Patent Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free license under its licensed patents to make, have made, use, sell, offer for sale, import, and/or otherwise dispose of its contribution in the software or derivative works of the contribution in the software. + +3. Conditions and Limitations + +(A) No Trademark License- This license does not grant you rights to use any contributors' name, logo, or trademarks. + +(B) If you bring a patent claim against any contributor over patents that you claim are infringed by the software, your patent license from such contributor to the software ends automatically. + +(C) If you distribute any portion of the software, you must retain all copyright, patent, trademark, and attribution notices that are present in the software. + +(D) If you distribute any portion of the software in source code form, you may do so only under this license by including a complete copy of this license with your distribution. If you distribute any portion of the software in compiled or object code form, you may only do so under a license that complies with this license. + +(E) The software is licensed "as-is." You bear the risk of using it. The contributors give no express warranties, guarantees or conditions. You may have additional consumer rights under your local laws which this license cannot change. To the extent permitted under your local laws, the contributors exclude the implied warranties of merchantability, fitness for a particular purpose and non-infringement. + + diff --git a/bin/Ionic.Zip.dll b/bin/Ionic.Zip.dll new file mode 100644 index 0000000000000000000000000000000000000000..95fa92885578745360df875d90d9231a7e618e78 GIT binary patch literal 462336 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%0Dw=HETThS}>vO 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%0Dx)4q>+mQbyTqfus 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 + From 9622e8ac72d29b75b96d2dd481671b57d0a204bf Mon Sep 17 00:00:00 2001 From: Oren Hurvitz Date: Mon, 23 Apr 2012 19:20:46 +0300 Subject: [PATCH 119/547] If a Grid God teleports then include the Godlike teleport flag. This can affect the starting position in the destination region. --- .../EntityTransfer/EntityTransferModule.cs | 6 ++++ .../World/Permissions/PermissionsModule.cs | 31 +++++++++++++------ .../Framework/Scenes/Scene.Permissions.cs | 17 ++++++++++ 3 files changed, 45 insertions(+), 9 deletions(-) diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs index a318a3c8db..779fd6b012 100644 --- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs +++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs @@ -161,6 +161,12 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer public void Teleport(ScenePresence sp, ulong regionHandle, Vector3 position, Vector3 lookAt, uint teleportFlags) { + if (sp.Scene.Permissions.IsGridGod(sp.UUID)) + { + // This user will be a God in the destination scene, too + teleportFlags |= (uint)TeleportFlags.Godlike; + } + if (!sp.Scene.Permissions.CanTeleport(sp.UUID)) return; diff --git a/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs b/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs index 2032905c5f..7d75fad332 100644 --- a/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs +++ b/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs @@ -166,6 +166,7 @@ namespace OpenSim.Region.CoreModules.World.Permissions m_scene.Permissions.OnDeedParcel += CanDeedParcel; m_scene.Permissions.OnDeedObject += CanDeedObject; m_scene.Permissions.OnIsGod += IsGod; + m_scene.Permissions.OnIsGridGod += IsGridGod; m_scene.Permissions.OnIsAdministrator += IsAdministrator; m_scene.Permissions.OnDuplicateObject += CanDuplicateObject; m_scene.Permissions.OnDeleteObject += CanDeleteObject; //MAYBE FULLY IMPLEMENTED @@ -466,22 +467,34 @@ namespace OpenSim.Region.CoreModules.World.Permissions if (IsEstateManager(user) && m_RegionManagerIsGod) return true; + if (IsGridGod(user, null)) + return true; + + return false; + } + + ///

+ /// Is the given user a God throughout the grid (not just in the current scene)? + /// + /// The user + /// Unused, can be null + /// + protected bool IsGridGod(UUID user, Scene scene) + { + DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); + if (m_bypassPermissions) return m_bypassPermissionsValue; + + if (user == UUID.Zero) return false; + if (m_allowGridGods) { ScenePresence sp = m_scene.GetScenePresence(user); if (sp != null) - { - if (sp.UserLevel >= 200) - return true; - return false; - } + return (sp.UserLevel >= 200); UserAccount account = m_scene.UserAccountService.GetUserAccount(m_scene.RegionInfo.ScopeID, user); if (account != null) - { - if (account.UserLevel >= 200) - return true; - } + return (account.UserLevel >= 200); } return false; diff --git a/OpenSim/Region/Framework/Scenes/Scene.Permissions.cs b/OpenSim/Region/Framework/Scenes/Scene.Permissions.cs index e1fedf4bd0..535d87a341 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.Permissions.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.Permissions.cs @@ -67,6 +67,7 @@ namespace OpenSim.Region.Framework.Scenes public delegate bool RunConsoleCommandHandler(UUID user, Scene requestFromScene); public delegate bool IssueEstateCommandHandler(UUID user, Scene requestFromScene, bool ownerCommand); public delegate bool IsGodHandler(UUID user, Scene requestFromScene); + public delegate bool IsGridGodHandler(UUID user, Scene requestFromScene); public delegate bool IsAdministratorHandler(UUID user); public delegate bool EditParcelHandler(UUID user, ILandObject parcel, Scene scene); public delegate bool EditParcelPropertiesHandler(UUID user, ILandObject parcel, GroupPowers p, Scene scene); @@ -134,6 +135,7 @@ namespace OpenSim.Region.Framework.Scenes public event RunConsoleCommandHandler OnRunConsoleCommand; public event IssueEstateCommandHandler OnIssueEstateCommand; public event IsGodHandler OnIsGod; + public event IsGridGodHandler OnIsGridGod; public event IsAdministratorHandler OnIsAdministrator; // public event EditParcelHandler OnEditParcel; public event EditParcelPropertiesHandler OnEditParcelProperties; @@ -728,6 +730,21 @@ namespace OpenSim.Region.Framework.Scenes return true; } + public bool IsGridGod(UUID user) + { + IsGridGodHandler handler = OnIsGridGod; + if (handler != null) + { + Delegate[] list = handler.GetInvocationList(); + foreach (IsGridGodHandler h in list) + { + if (h(user, m_scene) == false) + return false; + } + } + return true; + } + public bool IsAdministrator(UUID user) { IsAdministratorHandler handler = OnIsAdministrator; From 6473674bbf6ce006512083902e8ff1796d8c8b22 Mon Sep 17 00:00:00 2001 From: Oren Hurvitz Date: Mon, 23 Apr 2012 19:07:36 +0300 Subject: [PATCH 120/547] Fixed: custom walking animations didn't stop when the avatar stopped walking. This happened because the scripts were notified about control changes (e.g., the user stopped pressing the Forward key) when the animation was still WALK, so the script didn't stop the walking animation. Fixing this required: a) Update the movement animation *before* notifying the script; b) Add locking to prevent clashes with the Heartbeat thread (which also updates the animations); c) Handle the case of a user who stops walking just as the avatar is in the air: the avatar should STAND in that case, not WALK. This reverts commit feef1dd73243cfdd5322632fb67e64cabc1ad4bc. --- .../Scenes/Animation/ScenePresenceAnimator.cs | 19 +++++++---- .../Region/Framework/Scenes/ScenePresence.cs | 33 +++++++++++-------- 2 files changed, 32 insertions(+), 20 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs b/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs index f5623bdf69..14ae2872bb 100644 --- a/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs +++ b/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs @@ -1,4 +1,4 @@ -/* +/* * Copyright (c) Contributors, http://opensimulator.org/ * See CONTRIBUTORS.TXT for a full list of copyright holders. * @@ -278,6 +278,10 @@ namespace OpenSim.Region.Framework.Scenes.Animation return "FALLDOWN"; } + // Check if the user has stopped walking just now + if (CurrentMovementAnimation == "WALK" && (move == Vector3.Zero)) + return "STAND"; + return CurrentMovementAnimation; } @@ -402,13 +406,16 @@ namespace OpenSim.Region.Framework.Scenes.Animation ///
public void UpdateMovementAnimations() { - CurrentMovementAnimation = DetermineMovementAnimation(); + lock (m_animations) + { + CurrentMovementAnimation = DetermineMovementAnimation(); -// m_log.DebugFormat( -// "[SCENE PRESENCE ANIMATOR]: Determined animation {0} for {1} in UpdateMovementAnimations()", -// CurrentMovementAnimation, m_scenePresence.Name); +// m_log.DebugFormat( +// "[SCENE PRESENCE ANIMATOR]: Determined animation {0} for {1} in UpdateMovementAnimations()", +// CurrentMovementAnimation, m_scenePresence.Name); - TrySetMovementAnimation(CurrentMovementAnimation); + TrySetMovementAnimation(CurrentMovementAnimation); + } } public UUID[] GetAnimationArray() diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index 6b38027c44..64fe7a8e36 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs @@ -1,4 +1,4 @@ -/* +/* * Copyright (c) Contributors, http://opensimulator.org/ * See CONTRIBUTORS.TXT for a full list of copyright holders. * @@ -45,6 +45,7 @@ using TeleportFlags = OpenSim.Framework.Constants.TeleportFlags; namespace OpenSim.Region.Framework.Scenes { + [Flags] enum ScriptControlled : uint { CONTROL_ZERO = 0, @@ -1220,7 +1221,7 @@ namespace OpenSim.Region.Framework.Scenes { // m_log.DebugFormat( // "[SCENE PRESENCE]: In {0} received agent update from {1}, flags {2}", -// Scene.RegionInfo.RegionName, remoteClient.Name, agentData.ControlFlags); +// Scene.RegionInfo.RegionName, remoteClient.Name, (AgentManager.ControlFlags)agentData.ControlFlags); if (IsChildAgent) { @@ -1320,14 +1321,8 @@ namespace OpenSim.Region.Framework.Scenes } } - lock (scriptedcontrols) - { - if (scriptedcontrols.Count > 0) - { - SendControlToScripts((uint)flags); - flags = RemoveIgnoredControls(flags, IgnoredControls); - } - } + uint flagsForScripts = (uint)flags; + flags = RemoveIgnoredControls(flags, IgnoredControls); if ((flags & AgentManager.ControlFlags.AGENT_CONTROL_SIT_ON_GROUND) != 0) HandleAgentSitOnGround(); @@ -1420,7 +1415,7 @@ namespace OpenSim.Region.Framework.Scenes MovementFlag |= (byte)nudgehack; } -// m_log.DebugFormat("[SCENE PRESENCE]: Updating MovementFlag for {0} with {1}", Name, DCF); + //m_log.DebugFormat("[SCENE PRESENCE]: Updating MovementFlag for {0} with {1}", Name, DCF); MovementFlag += (byte)(uint)DCF; update_movementflag = true; } @@ -1433,7 +1428,7 @@ namespace OpenSim.Region.Framework.Scenes && ((MovementFlag & (byte)nudgehack) == nudgehack)) ) // This or is for Nudge forward { -// m_log.DebugFormat("[SCENE PRESENCE]: Updating MovementFlag for {0} with lack of {1}", Name, DCF); + //m_log.DebugFormat("[SCENE PRESENCE]: Updating MovementFlag for {0} with lack of {1}", Name, DCF); MovementFlag -= ((byte)(uint)DCF); update_movementflag = true; @@ -1514,8 +1509,18 @@ namespace OpenSim.Region.Framework.Scenes // } // } -// if (update_movementflag && ParentID == 0) -// Animator.UpdateMovementAnimations(); + if (update_movementflag && ParentID == 0) + Animator.UpdateMovementAnimations(); + + lock (scriptedcontrols) + { + if (scriptedcontrols.Count > 0) + { + // Notify the scripts only after calling UpdateMovementAnimations(), so that if a script + // (e.g., a walking script) checks which animation is active it will be the correct animation. + SendControlToScripts(flagsForScripts); + } + } } m_scene.EventManager.TriggerOnClientMovement(this); From db566fbb0958bb054b778a7008e407d8a3fa3e9e Mon Sep 17 00:00:00 2001 From: BlueWall Date: Fri, 27 Apr 2012 16:17:46 -0400 Subject: [PATCH 121/547] Fix prebuild.xml adding a reference to a dll requires 'path="..."' --- prebuild.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/prebuild.xml b/prebuild.xml index 0c90ac0345..5003ae7661 100644 --- a/prebuild.xml +++ b/prebuild.xml @@ -1472,7 +1472,7 @@ - + From e31e7c68c8abfd61fed6dabac5403d8adf42ae87 Mon Sep 17 00:00:00 2001 From: Oren Hurvitz Date: Mon, 23 Apr 2012 15:27:04 +0300 Subject: [PATCH 122/547] Log the full exception when errors occur in BaseHttpServer --- .../Servers/HttpServer/BaseHttpServer.cs | 38 +++++++++---------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs b/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs index 0fbf90aac4..7d31a89126 100644 --- a/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs +++ b/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs @@ -356,7 +356,7 @@ namespace OpenSim.Framework.Servers.HttpServer } catch (Exception e) { - m_log.ErrorFormat("[BASE HTTP SERVER]: OnRequest() failed with {0}{1}", e.Message, e.StackTrace); + m_log.Error(String.Format("[BASE HTTP SERVER]: OnRequest() failed: {0}", e.Message), e); } } @@ -551,11 +551,11 @@ namespace OpenSim.Framework.Servers.HttpServer catch (SocketException e) { // This has to be here to prevent a Linux/Mono crash - m_log.WarnFormat("[BASE HTTP SERVER]: XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux.", e); + m_log.Warn(String.Format("[BASE HTTP SERVER]: XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux.", e.Message), e); } catch (IOException e) { - m_log.Warn("[BASE HTTP SERVER]: XmlRpcRequest issue: " + e.Message); + m_log.Warn(String.Format("[BASE HTTP SERVER]: XmlRpcRequest issue {0}.", e.Message), e); } return; @@ -658,15 +658,15 @@ namespace OpenSim.Framework.Servers.HttpServer // // An alternative may be to turn off all response write exceptions on the HttpListener, but let's go // with the minimum first - m_log.WarnFormat("[BASE HTTP SERVER]: HandleRequest threw {0}.\nNOTE: this may be spurious on Linux", e); + m_log.Warn(String.Format("[BASE HTTP SERVER]: HandleRequest threw {0}.\nNOTE: this may be spurious on Linux", e.Message), e); } catch (IOException e) { - m_log.ErrorFormat("[BASE HTTP SERVER]: HandleRequest() threw {0}{1}", e.Message, e.StackTrace); + m_log.Error(String.Format("[BASE HTTP SERVER]: HandleRequest() threw {0}", e.Message), e); } catch (Exception e) { - m_log.ErrorFormat("[BASE HTTP SERVER]: HandleRequest() threw {0}{1}", e.Message, e.StackTrace); + m_log.Error(String.Format("[BASE HTTP SERVER]: HandleRequest() threw {0}", e.Message), e); SendHTML500(response); } finally @@ -925,11 +925,11 @@ namespace OpenSim.Framework.Servers.HttpServer catch (SocketException e) { // This has to be here to prevent a Linux/Mono crash - m_log.WarnFormat("[BASE HTTP SERVER]: XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux.", e); + m_log.Warn(String.Format("[BASE HTTP SERVER]: XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux.", e.Message), e); } catch (IOException e) { - m_log.Warn("[BASE HTTP SERVER]: XmlRpcRequest issue: " + e.Message); + m_log.Warn(String.Format("[BASE HTTP SERVER]: XmlRpcRequest issue {0}", e.Message), e); } } return; @@ -962,11 +962,11 @@ namespace OpenSim.Framework.Servers.HttpServer catch (SocketException e) { // This has to be here to prevent a Linux/Mono crash - m_log.WarnFormat("[BASE HTTP SERVER]: XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux.", e); + m_log.Warn(String.Format("[BASE HTTP SERVER]: XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux.", e.Message), e); } catch (IOException e) { - m_log.Warn("[BASE HTTP SERVER]: XmlRpcRequest issue: " + e.Message); + m_log.Warn(String.Format("[BASE HTTP SERVER]: XmlRpcRequest issue {0}", e.Message), e); } } } @@ -1077,12 +1077,12 @@ namespace OpenSim.Framework.Servers.HttpServer } catch (IOException e) { - m_log.WarnFormat("[BASE HTTP SERVER]: LLSD IOException {0}.", e); + m_log.Warn(String.Format("[BASE HTTP SERVER]: LLSD IOException {0}", e.Message), e); } catch (SocketException e) { // This has to be here to prevent a Linux/Mono crash - m_log.WarnFormat("[BASE HTTP SERVER]: LLSD issue {0}.\nNOTE: this may be spurious on Linux.", e); + m_log.Warn(String.Format("[BASE HTTP SERVER]: LLSD issue {0}.\nNOTE: this may be spurious on Linux.", e.Message), e); } } } @@ -1334,8 +1334,8 @@ namespace OpenSim.Framework.Servers.HttpServer catch (SocketException f) { // This has to be here to prevent a Linux/Mono crash - m_log.WarnFormat( - "[BASE HTTP SERVER]: XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux.", f); + m_log.Warn( + String.Format("[BASE HTTP SERVER]: XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux.", f.Message), f); } } catch(Exception) @@ -1630,11 +1630,11 @@ namespace OpenSim.Framework.Servers.HttpServer catch (SocketException e) { // This has to be here to prevent a Linux/Mono crash - m_log.WarnFormat("[BASE HTTP SERVER]: XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux.", e); + m_log.Warn(String.Format("[BASE HTTP SERVER]: XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux.", e.Message), e); } catch (IOException e) { - m_log.Warn("[BASE HTTP SERVER]: XmlRpcRequest issue: " + e.Message); + m_log.Warn(String.Format("[BASE HTTP SERVER]: XmlRpcRequest issue {0}", e.Message), e); } } } @@ -1671,7 +1671,7 @@ namespace OpenSim.Framework.Servers.HttpServer catch (SocketException e) { // This has to be here to prevent a Linux/Mono crash - m_log.WarnFormat("[BASE HTTP SERVER]: XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux.", e); + m_log.Warn(String.Format("[BASE HTTP SERVER]: XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux.", e.Message), e); } } } @@ -1707,7 +1707,7 @@ namespace OpenSim.Framework.Servers.HttpServer catch (SocketException e) { // This has to be here to prevent a Linux/Mono crash - m_log.WarnFormat("[BASE HTTP SERVER] XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux.", e); + m_log.Warn(String.Format("[BASE HTTP SERVER] XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux.", e.Message), e); } } } @@ -1786,7 +1786,7 @@ namespace OpenSim.Framework.Servers.HttpServer public void httpServerException(object source, Exception exception) { - m_log.ErrorFormat("[BASE HTTP SERVER]: {0} had an exception {1}", source.ToString(), exception.ToString()); + m_log.Error(String.Format("[BASE HTTP SERVER]: {0} had an exception: {1}", source.ToString(), exception.Message), exception); /* if (HTTPDRunning)// && NotSocketErrors > 5) { From d25469f66e0f78f42cc6b77b169047e451e11bdb Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 27 Apr 2012 23:38:25 +0100 Subject: [PATCH 123/547] Add flags information (phantom, physics, etc.) to "show object" and "show part" console commands --- .../CoreModules/World/Objects/Commands/ObjectCommandsModule.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/OpenSim/Region/CoreModules/World/Objects/Commands/ObjectCommandsModule.cs b/OpenSim/Region/CoreModules/World/Objects/Commands/ObjectCommandsModule.cs index 06fea58ea3..8da913954e 100644 --- a/OpenSim/Region/CoreModules/World/Objects/Commands/ObjectCommandsModule.cs +++ b/OpenSim/Region/CoreModules/World/Objects/Commands/ObjectCommandsModule.cs @@ -271,6 +271,7 @@ namespace OpenSim.Region.CoreModules.World.Objects.Commands sb.AppendFormat("Description: {0}\n", so.Description); sb.AppendFormat("Location: {0} @ {1}\n", so.AbsolutePosition, so.Scene.RegionInfo.RegionName); sb.AppendFormat("Parts: {0}\n", so.PrimCount); + sb.AppendFormat("Flags: {0}\n", so.RootPart.Flags); return sb; } @@ -283,6 +284,7 @@ namespace OpenSim.Region.CoreModules.World.Objects.Commands sb.AppendFormat("Parent: {0}", sop.IsRoot ? "Is Root\n" : string.Format("{0} {1}\n", sop.ParentGroup.Name, sop.ParentGroup.UUID)); sb.AppendFormat("Link number: {0}\n", sop.LinkNum); + sb.AppendFormat("Flags: {0}\n", sop.Flags); return sb; } From a90b0e302c110068cec0ee7109e796d2d5fdab4d Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 27 Apr 2012 23:46:33 +0100 Subject: [PATCH 124/547] Revert "Implement bulk inventory update over CAPS (not recursive by design," This reverts commit 6e7f13a72d4e43f8ca564247e0b56bf5706bbdb1. --- .../ClientStack/Linden/UDP/LLClientView.cs | 48 +------------------ 1 file changed, 1 insertion(+), 47 deletions(-) diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs index ae5cbfff55..36ef28162b 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs @@ -12296,7 +12296,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP ItemData.Add(ItemDataMap); } - llsd.Add("InventoryData", ItemData); + llsd.Add("ItemData", ItemData); eq.Enqueue(BuildEvent("RemoveInventoryItem", llsd), AgentId); @@ -12340,14 +12340,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP llsd), AgentId); } - private byte[] EncodeU32(uint val) - { - byte[] ret = BitConverter.GetBytes(val); - if (BitConverter.IsLittleEndian) - Array.Reverse(ret); - return ret; - } - public void SendBulkUpdateInventory(InventoryFolderBase[] folders, InventoryItemBase[] items) { IEventQueue eq = Scene.RequestModuleInterface(); @@ -12363,7 +12355,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP OSDMap AgentDataMap = new OSDMap(1); AgentDataMap.Add("AgentID", OSD.FromUUID(AgentId)); AgentDataMap.Add("SessionID", OSD.FromUUID(SessionId)); - AgentDataMap.Add("TransactionID", OSD.FromUUID(UUID.Random())); OSDArray AgentData = new OSDArray(1); AgentData.Add(AgentDataMap); @@ -12391,47 +12382,10 @@ namespace OpenSim.Region.ClientStack.LindenUDP foreach (InventoryItemBase item in items) { OSDMap ItemDataMap = new OSDMap(); - - ItemDataMap.Add("ItemID", OSD.FromUUID(item.ID)); - ItemDataMap.Add("FolderID", OSD.FromUUID(item.Folder)); - - ItemDataMap.Add("CreatorID", OSD.FromUUID(item.CreatorIdAsUuid)); - ItemDataMap.Add("OwnerID", OSD.FromUUID(item.Owner)); - ItemDataMap.Add("GroupID", OSD.FromUUID(item.GroupID)); - ItemDataMap.Add("BaseMask", OSD.FromBinary(EncodeU32((uint)item.BasePermissions))); - ItemDataMap.Add("OwnerMask", OSD.FromBinary(EncodeU32((uint)item.CurrentPermissions))); - ItemDataMap.Add("GroupMask", OSD.FromBinary(EncodeU32((uint)item.GroupPermissions))); - ItemDataMap.Add("EveryoneMask", OSD.FromBinary(EncodeU32((uint)item.EveryOnePermissions))); - ItemDataMap.Add("NextOwnerMask", OSD.FromBinary(EncodeU32((uint)item.NextPermissions))); - ItemDataMap.Add("GroupOwned", OSD.FromBoolean(item.GroupOwned)); - ItemDataMap.Add("AssetID", OSD.FromUUID(item.AssetID)); - ItemDataMap.Add("Type", OSD.FromInteger(item.AssetType)); - ItemDataMap.Add("InvType", OSD.FromInteger(item.InvType)); - ItemDataMap.Add("Flags", OSD.FromBinary(EncodeU32((uint)item.Flags))); - ItemDataMap.Add("SaleType", OSD.FromInteger((byte)item.SaleType)); - ItemDataMap.Add("SalePrice", OSD.FromInteger(item.SalePrice)); - ItemDataMap.Add("Name", OSD.FromString(item.Name)); - ItemDataMap.Add("Description", OSD.FromString(item.Description)); - ItemDataMap.Add("CreationDate", OSD.FromInteger(item.CreationDate)); - - ItemDataMap.Add("CRC", OSD.FromBinary(EncodeU32( - Helpers.InventoryCRC(1000, 0, (sbyte)item.InvType, - (sbyte)item.AssetType, item.AssetID, - item.GroupID, 100, - item.Owner, item.CreatorIdAsUuid, - item.ID, item.Folder, - (uint)PermissionMask.All, 1, (uint)PermissionMask.All, (uint)PermissionMask.All, - (uint)PermissionMask.All) - ))); - ItemDataMap.Add("CallbackID", 0); - ItemData.Add(ItemDataMap); } llsd.Add("ItemData", ItemData); - - eq.Enqueue(BuildEvent("BulkUpdateInventory", - llsd), AgentId); } } } From 737e1771635061c1f7104499d282bcc279823f98 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 27 Apr 2012 23:46:46 +0100 Subject: [PATCH 125/547] Revert "Log the full exception when errors occur in BaseHttpServer" This reverts commit e31e7c68c8abfd61fed6dabac5403d8adf42ae87. Applied for patch assessment and accidentally committed too early. --- .../Servers/HttpServer/BaseHttpServer.cs | 38 +++++++++---------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs b/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs index 7d31a89126..0fbf90aac4 100644 --- a/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs +++ b/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs @@ -356,7 +356,7 @@ namespace OpenSim.Framework.Servers.HttpServer } catch (Exception e) { - m_log.Error(String.Format("[BASE HTTP SERVER]: OnRequest() failed: {0}", e.Message), e); + m_log.ErrorFormat("[BASE HTTP SERVER]: OnRequest() failed with {0}{1}", e.Message, e.StackTrace); } } @@ -551,11 +551,11 @@ namespace OpenSim.Framework.Servers.HttpServer catch (SocketException e) { // This has to be here to prevent a Linux/Mono crash - m_log.Warn(String.Format("[BASE HTTP SERVER]: XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux.", e.Message), e); + m_log.WarnFormat("[BASE HTTP SERVER]: XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux.", e); } catch (IOException e) { - m_log.Warn(String.Format("[BASE HTTP SERVER]: XmlRpcRequest issue {0}.", e.Message), e); + m_log.Warn("[BASE HTTP SERVER]: XmlRpcRequest issue: " + e.Message); } return; @@ -658,15 +658,15 @@ namespace OpenSim.Framework.Servers.HttpServer // // An alternative may be to turn off all response write exceptions on the HttpListener, but let's go // with the minimum first - m_log.Warn(String.Format("[BASE HTTP SERVER]: HandleRequest threw {0}.\nNOTE: this may be spurious on Linux", e.Message), e); + m_log.WarnFormat("[BASE HTTP SERVER]: HandleRequest threw {0}.\nNOTE: this may be spurious on Linux", e); } catch (IOException e) { - m_log.Error(String.Format("[BASE HTTP SERVER]: HandleRequest() threw {0}", e.Message), e); + m_log.ErrorFormat("[BASE HTTP SERVER]: HandleRequest() threw {0}{1}", e.Message, e.StackTrace); } catch (Exception e) { - m_log.Error(String.Format("[BASE HTTP SERVER]: HandleRequest() threw {0}", e.Message), e); + m_log.ErrorFormat("[BASE HTTP SERVER]: HandleRequest() threw {0}{1}", e.Message, e.StackTrace); SendHTML500(response); } finally @@ -925,11 +925,11 @@ namespace OpenSim.Framework.Servers.HttpServer catch (SocketException e) { // This has to be here to prevent a Linux/Mono crash - m_log.Warn(String.Format("[BASE HTTP SERVER]: XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux.", e.Message), e); + m_log.WarnFormat("[BASE HTTP SERVER]: XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux.", e); } catch (IOException e) { - m_log.Warn(String.Format("[BASE HTTP SERVER]: XmlRpcRequest issue {0}", e.Message), e); + m_log.Warn("[BASE HTTP SERVER]: XmlRpcRequest issue: " + e.Message); } } return; @@ -962,11 +962,11 @@ namespace OpenSim.Framework.Servers.HttpServer catch (SocketException e) { // This has to be here to prevent a Linux/Mono crash - m_log.Warn(String.Format("[BASE HTTP SERVER]: XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux.", e.Message), e); + m_log.WarnFormat("[BASE HTTP SERVER]: XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux.", e); } catch (IOException e) { - m_log.Warn(String.Format("[BASE HTTP SERVER]: XmlRpcRequest issue {0}", e.Message), e); + m_log.Warn("[BASE HTTP SERVER]: XmlRpcRequest issue: " + e.Message); } } } @@ -1077,12 +1077,12 @@ namespace OpenSim.Framework.Servers.HttpServer } catch (IOException e) { - m_log.Warn(String.Format("[BASE HTTP SERVER]: LLSD IOException {0}", e.Message), e); + m_log.WarnFormat("[BASE HTTP SERVER]: LLSD IOException {0}.", e); } catch (SocketException e) { // This has to be here to prevent a Linux/Mono crash - m_log.Warn(String.Format("[BASE HTTP SERVER]: LLSD issue {0}.\nNOTE: this may be spurious on Linux.", e.Message), e); + m_log.WarnFormat("[BASE HTTP SERVER]: LLSD issue {0}.\nNOTE: this may be spurious on Linux.", e); } } } @@ -1334,8 +1334,8 @@ namespace OpenSim.Framework.Servers.HttpServer catch (SocketException f) { // This has to be here to prevent a Linux/Mono crash - m_log.Warn( - String.Format("[BASE HTTP SERVER]: XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux.", f.Message), f); + m_log.WarnFormat( + "[BASE HTTP SERVER]: XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux.", f); } } catch(Exception) @@ -1630,11 +1630,11 @@ namespace OpenSim.Framework.Servers.HttpServer catch (SocketException e) { // This has to be here to prevent a Linux/Mono crash - m_log.Warn(String.Format("[BASE HTTP SERVER]: XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux.", e.Message), e); + m_log.WarnFormat("[BASE HTTP SERVER]: XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux.", e); } catch (IOException e) { - m_log.Warn(String.Format("[BASE HTTP SERVER]: XmlRpcRequest issue {0}", e.Message), e); + m_log.Warn("[BASE HTTP SERVER]: XmlRpcRequest issue: " + e.Message); } } } @@ -1671,7 +1671,7 @@ namespace OpenSim.Framework.Servers.HttpServer catch (SocketException e) { // This has to be here to prevent a Linux/Mono crash - m_log.Warn(String.Format("[BASE HTTP SERVER]: XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux.", e.Message), e); + m_log.WarnFormat("[BASE HTTP SERVER]: XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux.", e); } } } @@ -1707,7 +1707,7 @@ namespace OpenSim.Framework.Servers.HttpServer catch (SocketException e) { // This has to be here to prevent a Linux/Mono crash - m_log.Warn(String.Format("[BASE HTTP SERVER] XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux.", e.Message), e); + m_log.WarnFormat("[BASE HTTP SERVER] XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux.", e); } } } @@ -1786,7 +1786,7 @@ namespace OpenSim.Framework.Servers.HttpServer public void httpServerException(object source, Exception exception) { - m_log.Error(String.Format("[BASE HTTP SERVER]: {0} had an exception: {1}", source.ToString(), exception.Message), exception); + m_log.ErrorFormat("[BASE HTTP SERVER]: {0} had an exception {1}", source.ToString(), exception.ToString()); /* if (HTTPDRunning)// && NotSocketErrors > 5) { From ab71779221d580410e8b1c07e94f89ca933f9855 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 27 Apr 2012 23:54:45 +0100 Subject: [PATCH 126/547] Revert "Revert "Implement bulk inventory update over CAPS (not recursive by design,"" This reverts commit a90b0e302c110068cec0ee7109e796d2d5fdab4d. Sorry, accidentally reverted this completely by mistake, reverting the revert. --- .../ClientStack/Linden/UDP/LLClientView.cs | 48 ++++++++++++++++++- 1 file changed, 47 insertions(+), 1 deletion(-) diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs index 36ef28162b..ae5cbfff55 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs @@ -12296,7 +12296,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP ItemData.Add(ItemDataMap); } - llsd.Add("ItemData", ItemData); + llsd.Add("InventoryData", ItemData); eq.Enqueue(BuildEvent("RemoveInventoryItem", llsd), AgentId); @@ -12340,6 +12340,14 @@ namespace OpenSim.Region.ClientStack.LindenUDP llsd), AgentId); } + private byte[] EncodeU32(uint val) + { + byte[] ret = BitConverter.GetBytes(val); + if (BitConverter.IsLittleEndian) + Array.Reverse(ret); + return ret; + } + public void SendBulkUpdateInventory(InventoryFolderBase[] folders, InventoryItemBase[] items) { IEventQueue eq = Scene.RequestModuleInterface(); @@ -12355,6 +12363,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP OSDMap AgentDataMap = new OSDMap(1); AgentDataMap.Add("AgentID", OSD.FromUUID(AgentId)); AgentDataMap.Add("SessionID", OSD.FromUUID(SessionId)); + AgentDataMap.Add("TransactionID", OSD.FromUUID(UUID.Random())); OSDArray AgentData = new OSDArray(1); AgentData.Add(AgentDataMap); @@ -12382,10 +12391,47 @@ namespace OpenSim.Region.ClientStack.LindenUDP foreach (InventoryItemBase item in items) { OSDMap ItemDataMap = new OSDMap(); + + ItemDataMap.Add("ItemID", OSD.FromUUID(item.ID)); + ItemDataMap.Add("FolderID", OSD.FromUUID(item.Folder)); + + ItemDataMap.Add("CreatorID", OSD.FromUUID(item.CreatorIdAsUuid)); + ItemDataMap.Add("OwnerID", OSD.FromUUID(item.Owner)); + ItemDataMap.Add("GroupID", OSD.FromUUID(item.GroupID)); + ItemDataMap.Add("BaseMask", OSD.FromBinary(EncodeU32((uint)item.BasePermissions))); + ItemDataMap.Add("OwnerMask", OSD.FromBinary(EncodeU32((uint)item.CurrentPermissions))); + ItemDataMap.Add("GroupMask", OSD.FromBinary(EncodeU32((uint)item.GroupPermissions))); + ItemDataMap.Add("EveryoneMask", OSD.FromBinary(EncodeU32((uint)item.EveryOnePermissions))); + ItemDataMap.Add("NextOwnerMask", OSD.FromBinary(EncodeU32((uint)item.NextPermissions))); + ItemDataMap.Add("GroupOwned", OSD.FromBoolean(item.GroupOwned)); + ItemDataMap.Add("AssetID", OSD.FromUUID(item.AssetID)); + ItemDataMap.Add("Type", OSD.FromInteger(item.AssetType)); + ItemDataMap.Add("InvType", OSD.FromInteger(item.InvType)); + ItemDataMap.Add("Flags", OSD.FromBinary(EncodeU32((uint)item.Flags))); + ItemDataMap.Add("SaleType", OSD.FromInteger((byte)item.SaleType)); + ItemDataMap.Add("SalePrice", OSD.FromInteger(item.SalePrice)); + ItemDataMap.Add("Name", OSD.FromString(item.Name)); + ItemDataMap.Add("Description", OSD.FromString(item.Description)); + ItemDataMap.Add("CreationDate", OSD.FromInteger(item.CreationDate)); + + ItemDataMap.Add("CRC", OSD.FromBinary(EncodeU32( + Helpers.InventoryCRC(1000, 0, (sbyte)item.InvType, + (sbyte)item.AssetType, item.AssetID, + item.GroupID, 100, + item.Owner, item.CreatorIdAsUuid, + item.ID, item.Folder, + (uint)PermissionMask.All, 1, (uint)PermissionMask.All, (uint)PermissionMask.All, + (uint)PermissionMask.All) + ))); + ItemDataMap.Add("CallbackID", 0); + ItemData.Add(ItemDataMap); } llsd.Add("ItemData", ItemData); + + eq.Enqueue(BuildEvent("BulkUpdateInventory", + llsd), AgentId); } } } From 2bad430ed860987f82e9f074b2a467749d9fddc6 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Sat, 28 Apr 2012 00:08:04 +0100 Subject: [PATCH 127/547] Put scene object related console commands into new "Objects" help category rather than "Regions" --- OpenSim/Region/Application/OpenSim.cs | 8 +++---- .../Objects/Commands/ObjectCommandsModule.cs | 22 +++++++++++-------- 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/OpenSim/Region/Application/OpenSim.cs b/OpenSim/Region/Application/OpenSim.cs index 59b6b2197e..4ec64eeb55 100644 --- a/OpenSim/Region/Application/OpenSim.cs +++ b/OpenSim/Region/Application/OpenSim.cs @@ -225,7 +225,7 @@ namespace OpenSim ///
private void RegisterConsoleCommands() { - m_console.Commands.AddCommand("Regions", false, "force update", + m_console.Commands.AddCommand("Objects", false, "force update", "force update", "Force the update of all objects on clients", HandleForceUpdate); @@ -306,7 +306,7 @@ namespace OpenSim + " If this is not given then the oar is saved to region.oar in the current directory.", SaveOar); - m_console.Commands.AddCommand("Regions", false, "edit scale", + m_console.Commands.AddCommand("Objects", false, "edit scale", "edit scale ", "Change the scale of a named prim", HandleEditScale); @@ -349,7 +349,7 @@ namespace OpenSim "show ratings", "Show rating data", HandleShow); - m_console.Commands.AddCommand("Regions", false, "backup", + m_console.Commands.AddCommand("Objects", false, "backup", "backup", "Persist currently unsaved object changes immediately instead of waiting for the normal persistence call.", RunCommand); @@ -410,7 +410,7 @@ namespace OpenSim "modules unload ", "Unload a module", HandleModules); - m_console.Commands.AddCommand("Regions", false, "kill uuid", + m_console.Commands.AddCommand("Objects", false, "kill uuid", "kill uuid ", "Kill an object by UUID", KillUUID); } diff --git a/OpenSim/Region/CoreModules/World/Objects/Commands/ObjectCommandsModule.cs b/OpenSim/Region/CoreModules/World/Objects/Commands/ObjectCommandsModule.cs index 8da913954e..5e928f3e8f 100644 --- a/OpenSim/Region/CoreModules/World/Objects/Commands/ObjectCommandsModule.cs +++ b/OpenSim/Region/CoreModules/World/Objects/Commands/ObjectCommandsModule.cs @@ -78,45 +78,49 @@ namespace OpenSim.Region.CoreModules.World.Objects.Commands m_scene = scene; m_console = MainConsole.Instance; - m_console.Commands.AddCommand("Regions", false, "delete object owner", + m_console.Commands.AddCommand("Objects", false, "delete object owner", "delete object owner ", "Delete a scene object by owner", HandleDeleteObject); - m_console.Commands.AddCommand("Regions", false, "delete object creator", + + m_console.Commands.AddCommand("Objects", false, "delete object creator", "delete object creator ", "Delete a scene object by creator", HandleDeleteObject); - m_console.Commands.AddCommand("Regions", false, "delete object uuid", + + m_console.Commands.AddCommand("Objects", false, "delete object uuid", "delete object uuid ", "Delete a scene object by uuid", HandleDeleteObject); - m_console.Commands.AddCommand("Regions", false, "delete object name", + + m_console.Commands.AddCommand("Objects", false, "delete object name", "delete object name ", "Delete a scene object by name", HandleDeleteObject); - m_console.Commands.AddCommand("Regions", false, "delete object outside", + + m_console.Commands.AddCommand("Objects", false, "delete object outside", "delete object outside", "Delete all scene objects outside region boundaries", HandleDeleteObject); m_console.Commands.AddCommand( - "Regions", + "Objects", false, "show object uuid", "show object uuid ", "Show details of a scene object with the given UUID", HandleShowObjectByUuid); m_console.Commands.AddCommand( - "Regions", + "Objects", false, "show object name", "show object name ", "Show details of scene objects with the given name", HandleShowObjectByName); m_console.Commands.AddCommand( - "Regions", + "Objects", false, "show part uuid", "show part uuid ", "Show details of a scene object parts with the given UUID", HandleShowPartByUuid); m_console.Commands.AddCommand( - "Regions", + "Objects", false, "show part name", "show part name ", From 133f05dc41ce3520c0069407106fef5a83b2e96e Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Sat, 28 Apr 2012 00:29:08 +0100 Subject: [PATCH 128/547] Add text about using double quotes to surround console command arguments containing spaces to "help" text. e.g. show object name "My long object name" --- OpenSim/Framework/Console/CommandConsole.cs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/OpenSim/Framework/Console/CommandConsole.cs b/OpenSim/Framework/Console/CommandConsole.cs index c5d6b78686..87bdacd2da 100644 --- a/OpenSim/Framework/Console/CommandConsole.cs +++ b/OpenSim/Framework/Console/CommandConsole.cs @@ -79,7 +79,11 @@ namespace OpenSim.Framework.Console public List fn; } - public const string GeneralHelpText = "For more information, type 'help ' where is one of the following categories:"; + public const string GeneralHelpText + = "To enter an argument that contains spaces, surround the argument with double quotes.\nFor example, show object name \"My long object name\"\n"; + + public const string ItemHelpText + = "For more information, type 'help ' where is one of the following:"; /// /// Commands organized by keyword in a tree @@ -108,7 +112,9 @@ namespace OpenSim.Framework.Console // General help if (helpParts.Count == 0) { + help.Add(""); // Will become a newline. help.Add(GeneralHelpText); + help.Add(ItemHelpText); help.AddRange(CollectModulesHelp(tree)); } else @@ -132,7 +138,7 @@ namespace OpenSim.Framework.Console // Check modules first to see if we just need to display a list of those commands if (TryCollectModuleHelp(originalHelpRequest, help)) { - help.Insert(0, GeneralHelpText); + help.Insert(0, ItemHelpText); return help; } From cd755fe5983b1960f771bf6f6bf3fa15b338182b Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Sat, 28 Apr 2012 00:31:11 +0100 Subject: [PATCH 129/547] Remove mono compiler warning. Adjust message log to error from info --- .../XmlRpcGroups/SimianGroupsServicesConnectorModule.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/SimianGroupsServicesConnectorModule.cs b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/SimianGroupsServicesConnectorModule.cs index 130513d4c0..5d57f70733 100644 --- a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/SimianGroupsServicesConnectorModule.cs +++ b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/SimianGroupsServicesConnectorModule.cs @@ -1401,9 +1401,9 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups { response = WebUtil.PostToService(m_groupsServerURI, requestArgs); } - catch (Exception e) + catch (Exception) { - m_log.InfoFormat("[SIMIAN GROUPS CONNECTOR] request failed {0}",CacheKey); + m_log.ErrorFormat("[SIMIAN GROUPS CONNECTOR]: request failed {0}", CacheKey); } // and cache the response From 838016625174ae2f56194a61d7139d0ed7aed8cc Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Sat, 28 Apr 2012 00:39:40 +0100 Subject: [PATCH 130/547] Comment out debug [ASYNC DELETER] messages for now. --- .../Framework/Scenes/AsyncSceneObjectGroupDeleter.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/AsyncSceneObjectGroupDeleter.cs b/OpenSim/Region/Framework/Scenes/AsyncSceneObjectGroupDeleter.cs index f678d07805..834464b2c8 100644 --- a/OpenSim/Region/Framework/Scenes/AsyncSceneObjectGroupDeleter.cs +++ b/OpenSim/Region/Framework/Scenes/AsyncSceneObjectGroupDeleter.cs @@ -117,7 +117,7 @@ namespace OpenSim.Region.Framework.Scenes private void InventoryRunDeleteTimer(object sender, ElapsedEventArgs e) { - m_log.Debug("[ASYNC DELETER]: Starting send to inventory loop"); +// m_log.Debug("[ASYNC DELETER]: Starting send to inventory loop"); // We must set appearance parameters in the en_US culture in order to avoid issues where values are saved // in a culture where decimal points are commas and then reloaded in a culture which just treats them as @@ -147,9 +147,9 @@ namespace OpenSim.Region.Framework.Scenes { x = m_inventoryDeletes.Dequeue(); - m_log.DebugFormat( - "[ASYNC DELETER]: Sending object to user's inventory, action {1}, count {2}, {0} item(s) remaining.", - left, x.action, x.objectGroups.Count); +// m_log.DebugFormat( +// "[ASYNC DELETER]: Sending object to user's inventory, action {1}, count {2}, {0} item(s) remaining.", +// left, x.action, x.objectGroups.Count); try { @@ -185,7 +185,7 @@ namespace OpenSim.Region.Framework.Scenes e.StackTrace); } - m_log.Debug("[ASYNC DELETER]: No objects left in inventory send queue."); +// m_log.Debug("[ASYNC DELETER]: No objects left in inventory send queue."); return false; } From 522eff61383e9a8acfdf34289cd64a8fdc27bb19 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Mon, 30 Apr 2012 15:54:35 +0100 Subject: [PATCH 131/547] Consistently use using() to make sure we dispose of used MySqlCommands where this is not already being done. --- OpenSim/Data/MySQL/MySQLAssetData.cs | 180 ++++++------ OpenSim/Data/MySQL/MySQLAuthenticationData.cs | 165 ++++++----- OpenSim/Data/MySQL/MySQLAvatarData.cs | 17 +- OpenSim/Data/MySQL/MySQLFriendsData.cs | 36 +-- OpenSim/Data/MySQL/MySQLInventoryData.cs | 130 ++++----- OpenSim/Data/MySQL/MySQLPresenceData.cs | 36 +-- OpenSim/Data/MySQL/MySQLRegionData.cs | 13 +- OpenSim/Data/MySQL/MySQLSimulationData.cs | 267 +++++++++--------- OpenSim/Data/MySQL/MySQLUserAccountData.cs | 33 +-- 9 files changed, 446 insertions(+), 431 deletions(-) diff --git a/OpenSim/Data/MySQL/MySQLAssetData.cs b/OpenSim/Data/MySQL/MySQLAssetData.cs index a743479dd3..73de64b404 100644 --- a/OpenSim/Data/MySQL/MySQLAssetData.cs +++ b/OpenSim/Data/MySQL/MySQLAssetData.cs @@ -163,52 +163,51 @@ namespace OpenSim.Data.MySQL { dbcon.Open(); - MySqlCommand cmd = + using (MySqlCommand cmd = new MySqlCommand( "replace INTO assets(id, name, description, assetType, local, temporary, create_time, access_time, asset_flags, CreatorID, data)" + "VALUES(?id, ?name, ?description, ?assetType, ?local, ?temporary, ?create_time, ?access_time, ?asset_flags, ?CreatorID, ?data)", - dbcon); - - string assetName = asset.Name; - if (asset.Name.Length > 64) + dbcon)) { - assetName = asset.Name.Substring(0, 64); - m_log.Warn("[ASSET DB]: Name field truncated from " + asset.Name.Length + " to " + assetName.Length + " characters on add"); - } - - string assetDescription = asset.Description; - if (asset.Description.Length > 64) - { - assetDescription = asset.Description.Substring(0, 64); - m_log.Warn("[ASSET DB]: Description field truncated from " + asset.Description.Length + " to " + assetDescription.Length + " characters on add"); - } - - // need to ensure we dispose - try - { - using (cmd) + string assetName = asset.Name; + if (asset.Name.Length > 64) { - // create unix epoch time - int now = (int)Utils.DateTimeToUnixTime(DateTime.UtcNow); - cmd.Parameters.AddWithValue("?id", asset.ID); - cmd.Parameters.AddWithValue("?name", assetName); - cmd.Parameters.AddWithValue("?description", assetDescription); - cmd.Parameters.AddWithValue("?assetType", asset.Type); - cmd.Parameters.AddWithValue("?local", asset.Local); - cmd.Parameters.AddWithValue("?temporary", asset.Temporary); - cmd.Parameters.AddWithValue("?create_time", now); - cmd.Parameters.AddWithValue("?access_time", now); - cmd.Parameters.AddWithValue("?CreatorID", asset.Metadata.CreatorID); - cmd.Parameters.AddWithValue("?asset_flags", (int)asset.Flags); - cmd.Parameters.AddWithValue("?data", asset.Data); - cmd.ExecuteNonQuery(); - cmd.Dispose(); + assetName = asset.Name.Substring(0, 64); + m_log.Warn("[ASSET DB]: Name field truncated from " + asset.Name.Length + " to " + assetName.Length + " characters on add"); + } + + string assetDescription = asset.Description; + if (asset.Description.Length > 64) + { + assetDescription = asset.Description.Substring(0, 64); + m_log.Warn("[ASSET DB]: Description field truncated from " + asset.Description.Length + " to " + assetDescription.Length + " characters on add"); + } + + try + { + using (cmd) + { + // create unix epoch time + int now = (int)Utils.DateTimeToUnixTime(DateTime.UtcNow); + cmd.Parameters.AddWithValue("?id", asset.ID); + cmd.Parameters.AddWithValue("?name", assetName); + cmd.Parameters.AddWithValue("?description", assetDescription); + cmd.Parameters.AddWithValue("?assetType", asset.Type); + cmd.Parameters.AddWithValue("?local", asset.Local); + cmd.Parameters.AddWithValue("?temporary", asset.Temporary); + cmd.Parameters.AddWithValue("?create_time", now); + cmd.Parameters.AddWithValue("?access_time", now); + cmd.Parameters.AddWithValue("?CreatorID", asset.Metadata.CreatorID); + cmd.Parameters.AddWithValue("?asset_flags", (int)asset.Flags); + cmd.Parameters.AddWithValue("?data", asset.Data); + cmd.ExecuteNonQuery(); + } + } + catch (Exception e) + { + m_log.ErrorFormat("[ASSET DB]: MySQL failure creating asset {0} with name \"{1}\". Error: {2}", + asset.FullID, asset.Name, e.Message); } - } - catch (Exception e) - { - m_log.ErrorFormat("[ASSET DB]: MySQL failure creating asset {0} with name \"{1}\". Error: {2}", - asset.FullID, asset.Name, e.Message); } } } @@ -221,33 +220,31 @@ namespace OpenSim.Data.MySQL using (MySqlConnection dbcon = new MySqlConnection(m_connectionString)) { dbcon.Open(); - MySqlCommand cmd = - new MySqlCommand("update assets set access_time=?access_time where id=?id", - dbcon); - // need to ensure we dispose - try + using (MySqlCommand cmd + = new MySqlCommand("update assets set access_time=?access_time where id=?id", dbcon)) { - using (cmd) + try { - // create unix epoch time - int now = (int)Utils.DateTimeToUnixTime(DateTime.UtcNow); - cmd.Parameters.AddWithValue("?id", asset.ID); - cmd.Parameters.AddWithValue("?access_time", now); - cmd.ExecuteNonQuery(); - cmd.Dispose(); + using (cmd) + { + // create unix epoch time + int now = (int)Utils.DateTimeToUnixTime(DateTime.UtcNow); + cmd.Parameters.AddWithValue("?id", asset.ID); + cmd.Parameters.AddWithValue("?access_time", now); + cmd.ExecuteNonQuery(); + } + } + catch (Exception e) + { + m_log.ErrorFormat( + "[ASSETS DB]: " + + "MySql failure updating access_time for asset {0} with name {1}" + Environment.NewLine + e.ToString() + + Environment.NewLine + "Attempting reconnection", asset.FullID, asset.Name); } - } - catch (Exception e) - { - m_log.ErrorFormat( - "[ASSETS DB]: " + - "MySql failure updating access_time for asset {0} with name {1}" + Environment.NewLine + e.ToString() - + Environment.NewLine + "Attempting reconnection", asset.FullID, asset.Name); } } } - } /// /// + /// /// /// - public void HandleTaskItemUpdateFromTransaction(IClientAPI remoteClient, - SceneObjectPart part, UUID transactionID, - TaskInventoryItem item) + public void HandleTaskItemUpdateFromTransaction( + IClientAPI remoteClient, SceneObjectPart part, UUID transactionID, TaskInventoryItem item) { -// m_log.DebugFormat( -// "[TRANSACTIONS MANAGER] Called HandleTaskItemUpdateFromTransaction with item {0}", -// item.Name); + m_log.DebugFormat( + "[TRANSACTIONS MANAGER] Called HandleTaskItemUpdateFromTransaction with item {0} in {1} for {2} in {3}", + item.Name, part.Name, remoteClient.Name, m_Scene.RegionInfo.RegionName); AgentAssetTransactions transactions = GetUserTransactions(remoteClient.AgentId); diff --git a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs index 69767c1b99..7d51eedfd9 100644 --- a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs +++ b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs @@ -216,7 +216,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess } else { - IAgentAssetTransactions agentTransactions = m_Scene.RequestModuleInterface(); + IAgentAssetTransactions agentTransactions = m_Scene.AgentTransactionsModule; if (agentTransactions != null) { agentTransactions.HandleItemCreationFromTransaction( diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs index 79c9309be8..b59fd05578 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs @@ -440,10 +440,9 @@ namespace OpenSim.Region.Framework.Scenes } else { - IAgentAssetTransactions agentTransactions = this.RequestModuleInterface(); - if (agentTransactions != null) + if (AgentTransactionsModule != null) { - agentTransactions.HandleItemUpdateFromTransaction(remoteClient, transactionID, item); + AgentTransactionsModule.HandleItemUpdateFromTransaction(remoteClient, transactionID, item); } } } @@ -1532,21 +1531,17 @@ namespace OpenSim.Region.Framework.Scenes // Only look for an uploaded updated asset if we are passed a transaction ID. This is only the // case for updates uploded through UDP. Updates uploaded via a capability (e.g. a script update) // will not pass in a transaction ID in the update message. - if (transactionID != UUID.Zero) + if (transactionID != UUID.Zero && AgentTransactionsModule != null) { - IAgentAssetTransactions agentTransactions = this.RequestModuleInterface(); - if (agentTransactions != null) - { - agentTransactions.HandleTaskItemUpdateFromTransaction( - remoteClient, part, transactionID, currentItem); - - if ((InventoryType)itemInfo.InvType == InventoryType.Notecard) - remoteClient.SendAgentAlertMessage("Notecard saved", false); - else if ((InventoryType)itemInfo.InvType == InventoryType.LSL) - remoteClient.SendAgentAlertMessage("Script saved", false); - else - remoteClient.SendAgentAlertMessage("Item saved", false); - } + AgentTransactionsModule.HandleTaskItemUpdateFromTransaction( + remoteClient, part, transactionID, currentItem); + + if ((InventoryType)itemInfo.InvType == InventoryType.Notecard) + remoteClient.SendAgentAlertMessage("Notecard saved", false); + else if ((InventoryType)itemInfo.InvType == InventoryType.LSL) + remoteClient.SendAgentAlertMessage("Script saved", false); + else + remoteClient.SendAgentAlertMessage("Item saved", false); } // Base ALWAYS has move diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index f291022e0f..939c8fa68c 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -499,6 +499,7 @@ namespace OpenSim.Region.Framework.Scenes public IAttachmentsModule AttachmentsModule { get; set; } public IEntityTransferModule EntityTransferModule { get; private set; } + public IAgentAssetTransactions AgentTransactionsModule { get; private set; } public IAvatarFactoryModule AvatarFactory { @@ -1241,6 +1242,7 @@ namespace OpenSim.Region.Framework.Scenes m_capsModule = RequestModuleInterface(); EntityTransferModule = RequestModuleInterface(); m_groupsModule = RequestModuleInterface(); + AgentTransactionsModule = RequestModuleInterface(); } #endregion @@ -3297,12 +3299,10 @@ namespace OpenSim.Region.Framework.Scenes catch (NullReferenceException) { } }); } - - IAgentAssetTransactions agentTransactions = this.RequestModuleInterface(); - if (agentTransactions != null) - { - agentTransactions.RemoveAgentAssetTransactions(agentID); - } + + // It's possible for child agents to have transactions if changes are being made cross-border. + if (AgentTransactionsModule != null) + AgentTransactionsModule.RemoveAgentAssetTransactions(agentID); } finally { From b56673c920603022fce9cb479b714f6fbd0f1311 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 8 Jun 2012 00:18:25 +0100 Subject: [PATCH 343/547] Fix bug with "kick user" reducing agent counts by 2 instead of 1. This is done by making the kick user command call IClientAPI.Close() rather than routing through Scene.IncomingCloseAgent(), which also called IClientAPI.Close() DisableSimulator for child agents is moved from IncomingCloseAgent() to RemoveClient(), this is not a functional change since IncomingCloseAgent() always ends up calling RemoveClient() --- OpenSim/Region/Application/OpenSim.cs | 4 +-- OpenSim/Region/Framework/Scenes/Scene.cs | 31 ++++++++++--------- .../Scenes/SceneCommunicationService.cs | 11 +++---- 3 files changed, 24 insertions(+), 22 deletions(-) diff --git a/OpenSim/Region/Application/OpenSim.cs b/OpenSim/Region/Application/OpenSim.cs index caba236a9c..1d0052290b 100644 --- a/OpenSim/Region/Application/OpenSim.cs +++ b/OpenSim/Region/Application/OpenSim.cs @@ -486,10 +486,10 @@ namespace OpenSim else presence.ControllingClient.Kick("\nThe OpenSim manager kicked you out.\n"); - // ...and close on our side - presence.Scene.IncomingCloseAgent(presence.UUID); + presence.ControllingClient.Close(); } } + MainConsole.Instance.Output(""); } diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 939c8fa68c..17503b1e23 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -940,7 +940,7 @@ namespace OpenSim.Region.Framework.Scenes else { m_log.InfoFormat( - "[INTERGRID]: Got notice about far away Region: {0} at ({1}, {2})", + "[SCENE]: Got notice about far away Region: {0} at ({1}, {2})", otherRegion.RegionName, otherRegion.RegionLocX, otherRegion.RegionLocY); } } @@ -3235,6 +3235,22 @@ namespace OpenSim.Region.Framework.Scenes { isChildAgent = avatar.IsChildAgent; + // Don't do this to root agents, it's not nice for the viewer + if (closeChildAgents && isChildAgent) + { + // Tell a single agent to disconnect from the region. + IEventQueue eq = RequestModuleInterface(); + if (eq != null) + { + eq.DisableSimulator(RegionInfo.RegionHandle, avatar.UUID); + } + else + { + avatar.ControllingClient.SendShutdownConnectionNotice(); + } + } + + // Only applies to root agents. if (avatar.ParentID != 0) { avatar.StandUp(); @@ -4033,19 +4049,6 @@ namespace OpenSim.Region.Framework.Scenes m_sceneGraph.removeUserCount(true); } - // Don't do this to root agents on logout, it's not nice for the viewer - if (presence.IsChildAgent) - { - // Tell a single agent to disconnect from the region. - IEventQueue eq = RequestModuleInterface(); - if (eq != null) - { - eq.DisableSimulator(RegionInfo.RegionHandle, agentID); - } - else - presence.ControllingClient.SendShutdownConnectionNotice(); - } - presence.ControllingClient.Close(); return true; } diff --git a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs index b8616e8346..eff635b30f 100644 --- a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs +++ b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs @@ -84,16 +84,16 @@ namespace OpenSim.Region.Framework.Scenes if (neighbourService != null) neighbour = neighbourService.HelloNeighbour(regionhandle, region); else - m_log.DebugFormat("[SCS]: No neighbour service provided for informing neigbhours of this region"); + m_log.DebugFormat("[SCENE COMMUNICATION SERVICE]: No neighbour service provided for informing neigbhours of this region"); if (neighbour != null) { - m_log.DebugFormat("[INTERGRID]: Successfully informed neighbour {0}-{1} that I'm here", x / Constants.RegionSize, y / Constants.RegionSize); + m_log.DebugFormat("[SCENE COMMUNICATION SERVICE]: Successfully informed neighbour {0}-{1} that I'm here", x / Constants.RegionSize, y / Constants.RegionSize); m_scene.EventManager.TriggerOnRegionUp(neighbour); } else { - m_log.InfoFormat("[INTERGRID]: Failed to inform neighbour {0}-{1} that I'm here.", x / Constants.RegionSize, y / Constants.RegionSize); + m_log.InfoFormat("[SCENE COMMUNICATION SERVICE]: Failed to inform neighbour {0}-{1} that I'm here.", x / Constants.RegionSize, y / Constants.RegionSize); } } @@ -102,7 +102,7 @@ namespace OpenSim.Region.Framework.Scenes //m_log.Info("[INTER]: " + debugRegionName + ": SceneCommunicationService: Sending InterRegion Notification that region is up " + region.RegionName); List neighbours = m_scene.GridService.GetNeighbours(m_scene.RegionInfo.ScopeID, m_scene.RegionInfo.RegionID); - m_log.DebugFormat("[INTERGRID]: Informing {0} neighbours that this region is up", neighbours.Count); + m_log.DebugFormat("[SCENE COMMUNICATION SERVICE]: Informing {0} neighbours that this region is up", neighbours.Count); foreach (GridRegion n in neighbours) { InformNeighbourThatRegionUpDelegate d = InformNeighboursThatRegionIsUpAsync; @@ -196,8 +196,7 @@ namespace OpenSim.Region.Framework.Scenes GridRegion destination = m_scene.GridService.GetRegionByPosition(m_regionInfo.ScopeID, (int)x, (int)y); m_log.DebugFormat( - "[INTERGRID]: Sending close agent {0} to region at {1}-{2}", - agentID, destination.RegionCoordX, destination.RegionCoordY); + "[SCENE COMMUNICATION SERVICE]: Sending close agent ID {0} to {1}", agentID, destination.RegionName); m_scene.SimulationService.CloseAgent(destination, agentID); } From d547bcf8d15bdcb8604cf170dc8ec1e14ad4cdc0 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 8 Jun 2012 00:40:38 +0100 Subject: [PATCH 344/547] Remove duplicate update of user count in Scene.IncomingCloseAgent() This is already done in Scene.RemoveClient() which IncomingCloseAgent() always ends up calling. --- OpenSim/Region/Framework/Scenes/Scene.cs | 10 -------- OpenSim/Region/Framework/Scenes/SceneGraph.cs | 8 +++---- .../Tests/ScenePresenceTeleportTests.cs | 23 +++++++++++++++++++ 3 files changed, 27 insertions(+), 14 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 17503b1e23..9048f00888 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -4039,16 +4039,6 @@ namespace OpenSim.Region.Framework.Scenes ScenePresence presence = m_sceneGraph.GetScenePresence(agentID); if (presence != null) { - // Nothing is removed here, so down count it as such - if (presence.IsChildAgent) - { - m_sceneGraph.removeUserCount(false); - } - else - { - m_sceneGraph.removeUserCount(true); - } - presence.ControllingClient.Close(); return true; } diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs index ddf1550c0a..82a4f64040 100644 --- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs +++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs @@ -703,10 +703,10 @@ namespace OpenSim.Region.Framework.Scenes public int GetChildAgentCount() { // some network situations come in where child agents get closed twice. - if (m_numChildAgents < 0) - { - m_numChildAgents = 0; - } +// if (m_numChildAgents < 0) +// { +// m_numChildAgents = 0; +// } return m_numChildAgents; } diff --git a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTeleportTests.cs b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTeleportTests.cs index ccfe4ff218..a407f01d63 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTeleportTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTeleportTests.cs @@ -97,6 +97,9 @@ namespace OpenSim.Region.Framework.Scenes.Tests Assert.That(sp.AbsolutePosition, Is.EqualTo(teleportPosition)); + Assert.That(scene.GetRootAgentCount(), Is.EqualTo(1)); + Assert.That(scene.GetChildAgentCount(), Is.EqualTo(0)); + // Lookat is sent to the client only - sp.Lookat does not yield the same thing (calculation from camera // position instead). // Assert.That(sp.Lookat, Is.EqualTo(teleportLookAt)); @@ -158,6 +161,11 @@ namespace OpenSim.Region.Framework.Scenes.Tests Assert.That(sceneBSp.Scene.RegionInfo.RegionName, Is.EqualTo(sceneB.RegionInfo.RegionName)); Assert.That(sceneBSp.AbsolutePosition, Is.EqualTo(teleportPosition)); + Assert.That(sceneA.GetRootAgentCount(), Is.EqualTo(0)); + Assert.That(sceneA.GetChildAgentCount(), Is.EqualTo(0)); + Assert.That(sceneB.GetRootAgentCount(), Is.EqualTo(1)); + Assert.That(sceneB.GetChildAgentCount(), Is.EqualTo(0)); + // TODO: Add assertions to check correct circuit details in both scenes. // Lookat is sent to the client only - sp.Lookat does not yield the same thing (calculation from camera @@ -235,6 +243,11 @@ namespace OpenSim.Region.Framework.Scenes.Tests Assert.That(sceneASp.Scene.RegionInfo.RegionName, Is.EqualTo(sceneA.RegionInfo.RegionName)); Assert.That(sceneASp.AbsolutePosition, Is.EqualTo(preTeleportPosition)); + Assert.That(sceneA.GetRootAgentCount(), Is.EqualTo(1)); + Assert.That(sceneA.GetChildAgentCount(), Is.EqualTo(0)); + Assert.That(sceneB.GetRootAgentCount(), Is.EqualTo(0)); + Assert.That(sceneB.GetChildAgentCount(), Is.EqualTo(0)); + // TODO: Add assertions to check correct circuit details in both scenes. // Lookat is sent to the client only - sp.Lookat does not yield the same thing (calculation from camera @@ -306,6 +319,11 @@ namespace OpenSim.Region.Framework.Scenes.Tests Assert.That(sceneASp.Scene.RegionInfo.RegionName, Is.EqualTo(sceneA.RegionInfo.RegionName)); Assert.That(sceneASp.AbsolutePosition, Is.EqualTo(preTeleportPosition)); + Assert.That(sceneA.GetRootAgentCount(), Is.EqualTo(1)); + Assert.That(sceneA.GetChildAgentCount(), Is.EqualTo(0)); + Assert.That(sceneB.GetRootAgentCount(), Is.EqualTo(0)); + Assert.That(sceneB.GetChildAgentCount(), Is.EqualTo(0)); + // TODO: Add assertions to check correct circuit details in both scenes. // Lookat is sent to the client only - sp.Lookat does not yield the same thing (calculation from camera @@ -382,6 +400,11 @@ namespace OpenSim.Region.Framework.Scenes.Tests Assert.That(afterSceneBSp.Scene.RegionInfo.RegionName, Is.EqualTo(sceneB.RegionInfo.RegionName)); Assert.That(afterSceneBSp.AbsolutePosition, Is.EqualTo(teleportPosition)); + Assert.That(sceneA.GetRootAgentCount(), Is.EqualTo(0)); + Assert.That(sceneA.GetChildAgentCount(), Is.EqualTo(1)); + Assert.That(sceneB.GetRootAgentCount(), Is.EqualTo(1)); + Assert.That(sceneB.GetChildAgentCount(), Is.EqualTo(0)); + // TODO: Add assertions to check correct circuit details in both scenes. // Lookat is sent to the client only - sp.Lookat does not yield the same thing (calculation from camera From 5c162ccd57639f0c711d9940ecdd3e2804d26304 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 8 Jun 2012 00:59:39 +0100 Subject: [PATCH 345/547] Go back to calling IncomingCloseAgent() in the "kick user" command for consistency instead of IClientAPI.Close() directly. This no longer double counts child agent removals --- OpenSim/Region/Application/OpenSim.cs | 2 +- OpenSim/Region/Framework/Scenes/SceneGraph.cs | 6 ------ 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/OpenSim/Region/Application/OpenSim.cs b/OpenSim/Region/Application/OpenSim.cs index 1d0052290b..9c38ebedbe 100644 --- a/OpenSim/Region/Application/OpenSim.cs +++ b/OpenSim/Region/Application/OpenSim.cs @@ -486,7 +486,7 @@ namespace OpenSim else presence.ControllingClient.Kick("\nThe OpenSim manager kicked you out.\n"); - presence.ControllingClient.Close(); + presence.Scene.IncomingCloseAgent(presence.UUID); } } diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs index 82a4f64040..a59758f5dc 100644 --- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs +++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs @@ -702,12 +702,6 @@ namespace OpenSim.Region.Framework.Scenes public int GetChildAgentCount() { - // some network situations come in where child agents get closed twice. -// if (m_numChildAgents < 0) -// { -// m_numChildAgents = 0; -// } - return m_numChildAgents; } From 30f4a33f01751d151ae3923b48e6e98083791140 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 8 Jun 2012 01:24:44 +0100 Subject: [PATCH 346/547] Don't make duplicate call to ScenePresence.Close() separately in ETM.DoTeleport() if an agent needs closing. This is always done as part of Scene.RemoveClient() Also refactors try/catching in Scene.RemoveClient() to log NREs instead of silently discarding, since these are useful symptoms of problems. --- .../EntityTransfer/EntityTransferModule.cs | 1 - OpenSim/Region/Framework/Scenes/Scene.cs | 155 +++++++++--------- .../Region/Framework/Scenes/ScenePresence.cs | 2 +- .../Scenes/Tests/ScenePresenceAgentTests.cs | 4 +- 4 files changed, 77 insertions(+), 85 deletions(-) diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs index f2926eaf1f..7d82060835 100644 --- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs +++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs @@ -644,7 +644,6 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer // an agent cannot teleport back to this region if it has teleported away. Thread.Sleep(2000); - sp.Close(); sp.Scene.IncomingCloseAgent(sp.UUID); } else diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 9048f00888..7afde38c23 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -3231,10 +3231,23 @@ namespace OpenSim.Region.Framework.Scenes // CheckHeartbeat(); bool isChildAgent = false; ScenePresence avatar = GetScenePresence(agentID); - if (avatar != null) + + if (avatar == null) + { + m_log.WarnFormat( + "[SCENE]: Called RemoveClient() with agent ID {0} but no such presence is in the scene.", agentID); + + return; + } + + try { isChildAgent = avatar.IsChildAgent; + m_log.DebugFormat( + "[SCENE]: Removing {0} agent {1} {2} from {3}", + (isChildAgent ? "child" : "root"), avatar.Name, agentID, RegionInfo.RegionName); + // Don't do this to root agents, it's not nice for the viewer if (closeChildAgents && isChildAgent) { @@ -3256,99 +3269,77 @@ namespace OpenSim.Region.Framework.Scenes avatar.StandUp(); } - try + m_sceneGraph.removeUserCount(!isChildAgent); + + // TODO: We shouldn't use closeChildAgents here - it's being used by the NPC module to stop + // unnecessary operations. This should go away once NPCs have no accompanying IClientAPI + if (closeChildAgents && CapsModule != null) + CapsModule.RemoveCaps(agentID); + + // REFACTORING PROBLEM -- well not really a problem, but just to point out that whatever + // this method is doing is HORRIBLE!!! + avatar.Scene.NeedSceneCacheClear(avatar.UUID); + + if (closeChildAgents && !isChildAgent) { - m_log.DebugFormat( - "[SCENE]: Removing {0} agent {1} {2} from region {3}", - (isChildAgent ? "child" : "root"), avatar.Name, agentID, RegionInfo.RegionName); + List regions = avatar.KnownRegionHandles; + regions.Remove(RegionInfo.RegionHandle); + m_sceneGridService.SendCloseChildAgentConnections(agentID, regions); + } - m_sceneGraph.removeUserCount(!isChildAgent); + m_eventManager.TriggerClientClosed(agentID, this); + m_eventManager.TriggerOnRemovePresence(agentID); - // TODO: We shouldn't use closeChildAgents here - it's being used by the NPC module to stop - // unnecessary operations. This should go away once NPCs have no accompanying IClientAPI - if (closeChildAgents && CapsModule != null) - CapsModule.RemoveCaps(agentID); - - // REFACTORING PROBLEM -- well not really a problem, but just to point out that whatever - // this method is doing is HORRIBLE!!! - avatar.Scene.NeedSceneCacheClear(avatar.UUID); - - if (closeChildAgents && !avatar.IsChildAgent) + if (!isChildAgent) + { + if (AttachmentsModule != null && avatar.PresenceType != PresenceType.Npc) { - List regions = avatar.KnownRegionHandles; - regions.Remove(RegionInfo.RegionHandle); - m_sceneGridService.SendCloseChildAgentConnections(agentID, regions); + IUserManagement uMan = RequestModuleInterface(); + // Don't save attachments for HG visitors, it + // messes up their inventory. When a HG visitor logs + // out on a foreign grid, their attachments will be + // reloaded in the state they were in when they left + // the home grid. This is best anyway as the visited + // grid may use an incompatible script engine. + if (uMan == null || uMan.IsLocalGridUser(avatar.UUID)) + AttachmentsModule.SaveChangedAttachments(avatar, false); } - m_eventManager.TriggerClientClosed(agentID, this); - } - catch (NullReferenceException) - { - // We don't know which count to remove it from - // Avatar is already disposed :/ - } - - try - { - m_eventManager.TriggerOnRemovePresence(agentID); - - if (!isChildAgent) - { - if (AttachmentsModule != null && avatar.PresenceType != PresenceType.Npc) + ForEachClient( + delegate(IClientAPI client) { - IUserManagement uMan = RequestModuleInterface(); - // Don't save attachments for HG visitors, it - // messes up their inventory. When a HG visitor logs - // out on a foreign grid, their attachments will be - // reloaded in the state they were in when they left - // the home grid. This is best anyway as the visited - // grid may use an incompatible script engine. - if (uMan == null || uMan.IsLocalGridUser(avatar.UUID)) - AttachmentsModule.SaveChangedAttachments(avatar, false); - } - - ForEachClient( - delegate(IClientAPI client) - { - //We can safely ignore null reference exceptions. It means the avatar is dead and cleaned up anyway - try { client.SendKillObject(avatar.RegionHandle, new List { avatar.LocalId }); } - catch (NullReferenceException) { } - }); - } - - // It's possible for child agents to have transactions if changes are being made cross-border. - if (AgentTransactionsModule != null) - AgentTransactionsModule.RemoveAgentAssetTransactions(agentID); - } - finally - { - // Always clean these structures up so that any failure above doesn't cause them to remain in the - // scene with possibly bad effects (e.g. continually timing out on unacked packets and triggering - // the same cleanup exception continually. - // TODO: This should probably extend to the whole method, but we don't want to also catch the NRE - // since this would hide the underlying failure and other associated problems. - m_sceneGraph.RemoveScenePresence(agentID); - m_clientManager.Remove(agentID); + //We can safely ignore null reference exceptions. It means the avatar is dead and cleaned up anyway + try { client.SendKillObject(avatar.RegionHandle, new List { avatar.LocalId }); } + catch (NullReferenceException) { } + }); } - try - { - avatar.Close(); - } - catch (NullReferenceException) - { - //We can safely ignore null reference exceptions. It means the avatar are dead and cleaned up anyway. - } - catch (Exception e) - { - m_log.ErrorFormat("[SCENE] Scene.cs:RemoveClient exception {0}{1}", e.Message, e.StackTrace); - } + // It's possible for child agents to have transactions if changes are being made cross-border. + if (AgentTransactionsModule != null) + AgentTransactionsModule.RemoveAgentAssetTransactions(agentID); + + avatar.Close(); m_authenticateHandler.RemoveCircuit(avatar.ControllingClient.CircuitCode); -// CleanDroppedAttachments(); - //m_log.InfoFormat("[SCENE] Memory pre GC {0}", System.GC.GetTotalMemory(false)); - //m_log.InfoFormat("[SCENE] Memory post GC {0}", System.GC.GetTotalMemory(true)); } + catch (Exception e) + { + m_log.Error( + string.Format("[SCENE]: Exception removing {0} from {1}, ", avatar.Name, RegionInfo.RegionName), e); + } + finally + { + // Always clean these structures up so that any failure above doesn't cause them to remain in the + // scene with possibly bad effects (e.g. continually timing out on unacked packets and triggering + // the same cleanup exception continually. + // TODO: This should probably extend to the whole method, but we don't want to also catch the NRE + // since this would hide the underlying failure and other associated problems. + m_sceneGraph.RemoveScenePresence(agentID); + m_clientManager.Remove(agentID); + } + + //m_log.InfoFormat("[SCENE] Memory pre GC {0}", System.GC.GetTotalMemory(false)); + //m_log.InfoFormat("[SCENE] Memory post GC {0}", System.GC.GetTotalMemory(true)); } /// diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index 3adafc1b74..029e0d7994 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs @@ -3416,7 +3416,7 @@ namespace OpenSim.Region.Framework.Scenes public void Close() { - if (!IsChildAgent) + if (!IsChildAgent && m_scene.AttachmentsModule != null) m_scene.AttachmentsModule.DeleteAttachmentsFromScene(this, false); // Clear known regions diff --git a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAgentTests.cs b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAgentTests.cs index 1aa48d7520..02c45ef11c 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAgentTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAgentTests.cs @@ -101,7 +101,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests public void TestCloseAgent() { TestHelpers.InMethod(); -// log4net.Config.XmlConfigurator.Configure(); +// TestHelpers.EnableLogging(); TestScene scene = new SceneHelpers().SetupScene(); ScenePresence sp = SceneHelpers.AddScenePresence(scene, TestHelpers.ParseTail(0x1)); @@ -114,6 +114,8 @@ namespace OpenSim.Region.Framework.Scenes.Tests Assert.That(scene.GetScenePresence(sp.UUID), Is.Null); Assert.That(scene.AuthenticateHandler.GetAgentCircuitData(sp.UUID), Is.Null); Assert.That(scene.AuthenticateHandler.GetAgentCircuits().Count, Is.EqualTo(0)); + +// TestHelpers.DisableLogging(); } [Test] From d71c6dea7e5bfe827a9d723d972a9eec4cb77826 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 8 Jun 2012 01:43:58 +0100 Subject: [PATCH 347/547] Store already retrieve IClientAPI in IncomingPacket structure for later use rather than doing another retrieve on dequeue. Instead of checking whether the client still exists by trying to retrieve again from the client manager, this patch gets it back from IncomingPacket and checks the IClientAPI.IsActive state. --- .../ClientStack/Linden/UDP/IncomingPacket.cs | 5 ++-- .../ClientStack/Linden/UDP/LLUDPServer.cs | 26 +++++++++---------- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/OpenSim/Region/ClientStack/Linden/UDP/IncomingPacket.cs b/OpenSim/Region/ClientStack/Linden/UDP/IncomingPacket.cs index 90b3ede57c..1b8535cacb 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/IncomingPacket.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/IncomingPacket.cs @@ -39,7 +39,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP public sealed class IncomingPacket { /// Client this packet came from - public LLUDPClient Client; + public LLClientView Client; + /// Packet data that has been received public Packet Packet; @@ -48,7 +49,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP /// /// Reference to the client this packet came from /// Packet data - public IncomingPacket(LLUDPClient client, Packet packet) + public IncomingPacket(LLClientView client, Packet packet) { Client = client; Packet = packet; diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs index 09bb52c046..55bda63756 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs @@ -879,7 +879,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP #endregion Ping Check Handling // Inbox insertion - packetInbox.Enqueue(new IncomingPacket(udpClient, packet)); + packetInbox.Enqueue(new IncomingPacket((LLClientView)client, packet)); } #region BinaryStats @@ -1386,22 +1386,19 @@ namespace OpenSim.Region.ClientStack.LindenUDP #endregion - private void ProcessInPacket(object state) + private void ProcessInPacket(IncomingPacket incomingPacket) { - IncomingPacket incomingPacket = (IncomingPacket)state; Packet packet = incomingPacket.Packet; - LLUDPClient udpClient = incomingPacket.Client; - IClientAPI client; + LLClientView client = incomingPacket.Client; // Sanity check - if (packet == null || udpClient == null) + if (packet == null || client == null) { - m_log.WarnFormat("[LLUDPSERVER]: Processing a packet with incomplete state. Packet=\"{0}\", UDPClient=\"{1}\"", - packet, udpClient); + m_log.WarnFormat("[LLUDPSERVER]: Processing a packet with incomplete state. Packet=\"{0}\", Client=\"{1}\"", + packet, client); } - // Make sure this client is still alive - if (m_scene.TryGetClient(udpClient.AgentID, out client)) + if (client.IsActive) { m_currentIncomingClient = client; @@ -1419,8 +1416,11 @@ namespace OpenSim.Region.ClientStack.LindenUDP catch (Exception e) { // Don't let a failure in an individual client thread crash the whole sim. - m_log.ErrorFormat("[LLUDPSERVER]: Client packet handler for {0} for packet {1} threw an exception", udpClient.AgentID, packet.Type); - m_log.Error(e.Message, e); + m_log.Error( + string.Format( + "[LLUDPSERVER]: Client packet handler for {0} for packet {1} threw ", + client.Name, packet.Type), + e); } finally { @@ -1431,7 +1431,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP { m_log.DebugFormat( "[LLUDPSERVER]: Dropped incoming {0} for dead client {1} in {2}", - packet.Type, udpClient.AgentID, m_scene.RegionInfo.RegionName); + packet.Type, client.Name, m_scene.RegionInfo.RegionName); } } From d73805d7f488e45a00a2d25c08876d400083d27f Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 8 Jun 2012 01:51:28 +0100 Subject: [PATCH 348/547] Remove null checks at top of LLUDPServer.ProcessInPacket(). Neither packet nor client are ever null. --- OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs index 55bda63756..a292a6c1cf 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs @@ -1391,13 +1391,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP Packet packet = incomingPacket.Packet; LLClientView client = incomingPacket.Client; - // Sanity check - if (packet == null || client == null) - { - m_log.WarnFormat("[LLUDPSERVER]: Processing a packet with incomplete state. Packet=\"{0}\", Client=\"{1}\"", - packet, client); - } - if (client.IsActive) { m_currentIncomingClient = client; @@ -1442,4 +1435,4 @@ namespace OpenSim.Region.ClientStack.LindenUDP RemoveClient(((LLClientView)client).UDPClient); } } -} +} \ No newline at end of file From 5f4f9f02309b7df4d1bdcc560cee96d266c48a07 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 8 Jun 2012 03:12:23 +0100 Subject: [PATCH 349/547] Add regression test for client logout due to ack timeout. --- OpenSim/Framework/Statistics/StatsManager.cs | 17 +- OpenSim/Region/Application/OpenSimBase.cs | 2 - .../ClientStack/Linden/UDP/LLUDPServer.cs | 10 +- .../Linden/UDP/Tests/BasicCircuitTests.cs | 193 +++++++++--------- .../Linden/UDP/Tests/TestLLUDPServer.cs | 9 + 5 files changed, 114 insertions(+), 117 deletions(-) diff --git a/OpenSim/Framework/Statistics/StatsManager.cs b/OpenSim/Framework/Statistics/StatsManager.cs index 43159ef235..436ce2fa04 100644 --- a/OpenSim/Framework/Statistics/StatsManager.cs +++ b/OpenSim/Framework/Statistics/StatsManager.cs @@ -34,14 +34,12 @@ namespace OpenSim.Framework.Statistics { private static AssetStatsCollector assetStats; private static UserStatsCollector userStats; - private static SimExtraStatsCollector simExtraStats; + private static SimExtraStatsCollector simExtraStats = new SimExtraStatsCollector(); public static AssetStatsCollector AssetStats { get { return assetStats; } } public static UserStatsCollector UserStats { get { return userStats; } } public static SimExtraStatsCollector SimExtraStats { get { return simExtraStats; } } - private StatsManager() {} - /// /// Start collecting statistics related to assets. /// Should only be called once. @@ -63,16 +61,5 @@ namespace OpenSim.Framework.Statistics return userStats; } - - /// - /// Start collecting extra sim statistics apart from those collected for the client. - /// Should only be called once. - /// - public static SimExtraStatsCollector StartCollectingSimExtraStats() - { - simExtraStats = new SimExtraStatsCollector(); - - return simExtraStats; - } } -} +} \ No newline at end of file diff --git a/OpenSim/Region/Application/OpenSimBase.cs b/OpenSim/Region/Application/OpenSimBase.cs index 045e8d2f4a..9a0fa70d35 100644 --- a/OpenSim/Region/Application/OpenSimBase.cs +++ b/OpenSim/Region/Application/OpenSimBase.cs @@ -223,8 +223,6 @@ namespace OpenSim base.StartupSpecific(); - m_stats = StatsManager.StartCollectingSimExtraStats(); - // Create a ModuleLoader instance m_moduleLoader = new ModuleLoader(m_config.Source); diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs index a292a6c1cf..58a3b1c6c8 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs @@ -147,11 +147,13 @@ namespace OpenSim.Region.ClientStack.LindenUDP private int m_elapsed500MSOutgoingPacketHandler; /// Flag to signal when clients should check for resends - private bool m_resendUnacked; + protected bool m_resendUnacked; + /// Flag to signal when clients should send ACKs - private bool m_sendAcks; + protected bool m_sendAcks; + /// Flag to signal when clients should send pings - private bool m_sendPing; + protected bool m_sendPing; private int m_defaultRTO = 0; private int m_maxRTO = 0; @@ -1244,7 +1246,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP Watchdog.RemoveThread(); } - private void ClientOutgoingPacketHandler(IClientAPI client) + protected void ClientOutgoingPacketHandler(IClientAPI client) { m_currentOutgoingClient = client; diff --git a/OpenSim/Region/ClientStack/Linden/UDP/Tests/BasicCircuitTests.cs b/OpenSim/Region/ClientStack/Linden/UDP/Tests/BasicCircuitTests.cs index 1321470c28..45d0e2ab32 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/Tests/BasicCircuitTests.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/Tests/BasicCircuitTests.cs @@ -45,6 +45,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP.Tests [TestFixture] public class BasicCircuitTests { + private Scene m_scene; + private TestLLUDPServer m_udpServer; + [TestFixtureSetUp] public void FixtureInit() { @@ -61,83 +64,18 @@ namespace OpenSim.Region.ClientStack.LindenUDP.Tests Util.FireAndForgetMethod = Util.DefaultFireAndForgetMethod; } -// /// -// /// Add a client for testing -// /// -// /// -// /// -// /// -// /// Agent circuit manager used in setting up the stack -// protected void SetupStack( -// IScene scene, out TestLLUDPServer testLLUDPServer, out TestLLPacketServer testPacketServer, -// out AgentCircuitManager acm) -// { -// IConfigSource configSource = new IniConfigSource(); -// ClientStackUserSettings userSettings = new ClientStackUserSettings(); -// testLLUDPServer = new TestLLUDPServer(); -// acm = new AgentCircuitManager(); -// -// uint port = 666; -// testLLUDPServer.Initialise(null, ref port, 0, false, configSource, acm); -// testPacketServer = new TestLLPacketServer(testLLUDPServer, userSettings); -// testLLUDPServer.LocalScene = scene; -// } - -// /// -// /// Set up a client for tests which aren't concerned with this process itself and where only one client is being -// /// tested -// /// -// /// -// /// -// /// -// /// -// protected void AddClient( -// uint circuitCode, EndPoint epSender, TestLLUDPServer testLLUDPServer, AgentCircuitManager acm) -// { -// UUID myAgentUuid = UUID.Parse("00000000-0000-0000-0000-000000000001"); -// UUID mySessionUuid = UUID.Parse("00000000-0000-0000-0000-000000000002"); -// -// AddClient(circuitCode, epSender, myAgentUuid, mySessionUuid, testLLUDPServer, acm); -// } - -// /// -// /// Set up a client for tests which aren't concerned with this process itself -// /// -// /// -// /// -// /// -// /// -// /// -// /// -// protected void AddClient( -// uint circuitCode, EndPoint epSender, UUID agentId, UUID sessionId, -// TestLLUDPServer testLLUDPServer, AgentCircuitManager acm) -// { -// AgentCircuitData acd = new AgentCircuitData(); -// acd.AgentID = agentId; -// acd.SessionID = sessionId; -// -// UseCircuitCodePacket uccp = new UseCircuitCodePacket(); -// -// UseCircuitCodePacket.CircuitCodeBlock uccpCcBlock -// = new UseCircuitCodePacket.CircuitCodeBlock(); -// uccpCcBlock.Code = circuitCode; -// uccpCcBlock.ID = agentId; -// uccpCcBlock.SessionID = sessionId; -// uccp.CircuitCode = uccpCcBlock; -// -// acm.AddNewCircuit(circuitCode, acd); -// -// testLLUDPServer.LoadReceive(uccp, epSender); -// testLLUDPServer.ReceiveData(null); -// } + [SetUp] + public void SetUp() + { + m_scene = new SceneHelpers().SetupScene(); + } /// /// Build an object name packet for test purposes /// /// /// - protected ObjectNamePacket BuildTestObjectNamePacket(uint objectLocalId, string objectName) + private ObjectNamePacket BuildTestObjectNamePacket(uint objectLocalId, string objectName) { ObjectNamePacket onp = new ObjectNamePacket(); ObjectNamePacket.ObjectDataBlock odb = new ObjectNamePacket.ObjectDataBlock(); @@ -148,29 +86,31 @@ namespace OpenSim.Region.ClientStack.LindenUDP.Tests return onp; } - - /// - /// Test adding a client to the stack - /// - [Test] - public void TestAddClient() - { - TestHelpers.InMethod(); -// XmlConfigurator.Configure(); - TestScene scene = new SceneHelpers().SetupScene(); - uint myCircuitCode = 123456; + private void AddUdpServer() + { + AddUdpServer(new IniConfigSource()); + } + + private void AddUdpServer(IniConfigSource configSource) + { + uint port = 0; + AgentCircuitManager acm = m_scene.AuthenticateHandler; + + m_udpServer = new TestLLUDPServer(IPAddress.Any, ref port, 0, false, configSource, acm); + m_udpServer.AddScene(m_scene); + } + + /// + /// Used by tests that aren't testing this stage. + /// + private ScenePresence AddClient() + { UUID myAgentUuid = TestHelpers.ParseTail(0x1); UUID mySessionUuid = TestHelpers.ParseTail(0x2); + uint myCircuitCode = 123456; IPEndPoint testEp = new IPEndPoint(IPAddress.Loopback, 999); - uint port = 0; - AgentCircuitManager acm = scene.AuthenticateHandler; - - TestLLUDPServer llUdpServer - = new TestLLUDPServer(IPAddress.Any, ref port, 0, false, new IniConfigSource(), acm); - llUdpServer.AddScene(scene); - UseCircuitCodePacket uccp = new UseCircuitCodePacket(); UseCircuitCodePacket.CircuitCodeBlock uccpCcBlock @@ -185,26 +125,67 @@ namespace OpenSim.Region.ClientStack.LindenUDP.Tests upb.DataLength = uccpBytes.Length; // God knows why this isn't set by the constructor. Buffer.BlockCopy(uccpBytes, 0, upb.Data, 0, uccpBytes.Length); - llUdpServer.PacketReceived(upb); + AgentCircuitData acd = new AgentCircuitData(); + acd.AgentID = myAgentUuid; + acd.SessionID = mySessionUuid; + + m_scene.AuthenticateHandler.AddNewCircuit(myCircuitCode, acd); + + m_udpServer.PacketReceived(upb); + + return m_scene.GetScenePresence(myAgentUuid); + } + + /// + /// Test adding a client to the stack + /// + [Test] + public void TestAddClient() + { + TestHelpers.InMethod(); +// XmlConfigurator.Configure(); + + AddUdpServer(); + + UUID myAgentUuid = TestHelpers.ParseTail(0x1); + UUID mySessionUuid = TestHelpers.ParseTail(0x2); + uint myCircuitCode = 123456; + IPEndPoint testEp = new IPEndPoint(IPAddress.Loopback, 999); + + UseCircuitCodePacket uccp = new UseCircuitCodePacket(); + + UseCircuitCodePacket.CircuitCodeBlock uccpCcBlock + = new UseCircuitCodePacket.CircuitCodeBlock(); + uccpCcBlock.Code = myCircuitCode; + uccpCcBlock.ID = myAgentUuid; + uccpCcBlock.SessionID = mySessionUuid; + uccp.CircuitCode = uccpCcBlock; + + byte[] uccpBytes = uccp.ToBytes(); + UDPPacketBuffer upb = new UDPPacketBuffer(testEp, uccpBytes.Length); + upb.DataLength = uccpBytes.Length; // God knows why this isn't set by the constructor. + Buffer.BlockCopy(uccpBytes, 0, upb.Data, 0, uccpBytes.Length); + + m_udpServer.PacketReceived(upb); // Presence shouldn't exist since the circuit manager doesn't know about this circuit for authentication yet - Assert.That(scene.GetScenePresence(myAgentUuid), Is.Null); + Assert.That(m_scene.GetScenePresence(myAgentUuid), Is.Null); AgentCircuitData acd = new AgentCircuitData(); acd.AgentID = myAgentUuid; acd.SessionID = mySessionUuid; - acm.AddNewCircuit(myCircuitCode, acd); + m_scene.AuthenticateHandler.AddNewCircuit(myCircuitCode, acd); - llUdpServer.PacketReceived(upb); + m_udpServer.PacketReceived(upb); // Should succeed now - ScenePresence sp = scene.GetScenePresence(myAgentUuid); + ScenePresence sp = m_scene.GetScenePresence(myAgentUuid); Assert.That(sp.UUID, Is.EqualTo(myAgentUuid)); - Assert.That(llUdpServer.PacketsSent.Count, Is.EqualTo(1)); + Assert.That(m_udpServer.PacketsSent.Count, Is.EqualTo(1)); - Packet packet = llUdpServer.PacketsSent[0]; + Packet packet = m_udpServer.PacketsSent[0]; Assert.That(packet, Is.InstanceOf(typeof(PacketAckPacket))); PacketAckPacket ackPacket = packet as PacketAckPacket; @@ -212,6 +193,26 @@ namespace OpenSim.Region.ClientStack.LindenUDP.Tests Assert.That(ackPacket.Packets[0].ID, Is.EqualTo(0)); } + [Test] + public void TestLogoutClientDueToAck() + { + TestHelpers.InMethod(); + TestHelpers.EnableLogging(); + + IniConfigSource ics = new IniConfigSource(); + IConfig config = ics.AddConfig("ClientStack.LindenUDP"); + config.Set("AckTimeout", -1); + AddUdpServer(ics); + + ScenePresence sp = AddClient(); + m_udpServer.ClientOutgoingPacketHandler(sp.ControllingClient, true, false, false); + + ScenePresence spAfterAckTimeout = m_scene.GetScenePresence(sp.UUID); + Assert.That(spAfterAckTimeout, Is.Null); + + TestHelpers.DisableLogging(); + } + // /// // /// Test removing a client from the stack // /// diff --git a/OpenSim/Region/ClientStack/Linden/UDP/Tests/TestLLUDPServer.cs b/OpenSim/Region/ClientStack/Linden/UDP/Tests/TestLLUDPServer.cs index 0302385ad2..27b9e5b3f3 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/Tests/TestLLUDPServer.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/Tests/TestLLUDPServer.cs @@ -59,6 +59,15 @@ namespace OpenSim.Region.ClientStack.LindenUDP.Tests PacketsSent.Add(packet); } + public void ClientOutgoingPacketHandler(IClientAPI client, bool resendUnacked, bool sendAcks, bool sendPing) + { + m_resendUnacked = resendUnacked; + m_sendAcks = sendAcks; + m_sendPing = sendPing; + + ClientOutgoingPacketHandler(client); + } + //// /// //// /// The chunks of data to pass to the LLUDPServer when it calls EndReceive //// /// From c215b1ad169cb8c3add70622f610e980ee9cfa31 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 8 Jun 2012 03:53:03 +0100 Subject: [PATCH 350/547] If logging a client out due to ack timeout, do this asynchronously rather than synchronously on the outgoing packet loop. This is the same async behaviour as normal logouts. This is necessary because the event queue will sleep the thread for 5 seconds on an ack timeout logout as the client isn't around to pick up the final event queue messages. --- .../ClientStack/Linden/UDP/LLUDPServer.cs | 26 +++++++++++++------ .../Linden/UDP/Tests/BasicCircuitTests.cs | 4 +-- OpenSim/Tools/pCampBot/Bot.cs | 3 +++ 3 files changed, 23 insertions(+), 10 deletions(-) diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs index 58a3b1c6c8..e1fccb58a6 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs @@ -539,8 +539,10 @@ namespace OpenSim.Region.ClientStack.LindenUDP SendPacket(udpClient, completePing, ThrottleOutPacketType.Unknown, false, null); } - public void HandleUnacked(LLUDPClient udpClient) + public void HandleUnacked(LLClientView client) { + LLUDPClient udpClient = client.UDPClient; + if (!udpClient.IsConnected) return; @@ -553,12 +555,13 @@ namespace OpenSim.Region.ClientStack.LindenUDP if (udpClient.IsPaused) timeoutTicks = m_pausedAckTimeout; - if ((Environment.TickCount & Int32.MaxValue) - udpClient.TickLastPacketReceived > timeoutTicks) + if (!client.IsLoggingOut && + (Environment.TickCount & Int32.MaxValue) - udpClient.TickLastPacketReceived > timeoutTicks) { m_log.Warn("[LLUDPSERVER]: Ack timeout, disconnecting " + udpClient.AgentID); StatsManager.SimExtraStats.AddAbnormalClientThreadTermination(); - RemoveClient(udpClient); + return; } @@ -1113,8 +1116,13 @@ namespace OpenSim.Region.ClientStack.LindenUDP IClientAPI client; if (m_scene.TryGetClient(udpClient.AgentID, out client)) { + // We must set IsLoggingOut synchronously so that we can stop the packet loop reinvoking this method. client.IsLoggingOut = true; - client.Close(); + + // Fire this out on a different thread so that we don't hold up outgoing packet processing for + // everybody else if this is being called due to an ack timeout. + // This is the same as processing as the async process of a logout request. + Util.FireAndForget(o => client.Close()); } else { @@ -1254,12 +1262,13 @@ namespace OpenSim.Region.ClientStack.LindenUDP { if (client is LLClientView) { - LLUDPClient udpClient = ((LLClientView)client).UDPClient; + LLClientView llClient = (LLClientView)client; + LLUDPClient udpClient = llClient.UDPClient; if (udpClient.IsConnected) { if (m_resendUnacked) - HandleUnacked(udpClient); + HandleUnacked(llClient); if (m_sendAcks) SendAcks(udpClient); @@ -1308,7 +1317,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP { if (client is LLClientView) { - LLUDPClient udpClient = ((LLClientView)client).UDPClient; + LLClientView llClient = (LLClientView)client; + LLUDPClient udpClient = llClient.UDPClient; if (udpClient.IsConnected) { @@ -1317,7 +1327,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP nticksUnack++; watch2.Start(); - HandleUnacked(udpClient); + HandleUnacked(llClient); watch2.Stop(); avgResendUnackedTicks = (nticksUnack - 1)/(float)nticksUnack * avgResendUnackedTicks + (watch2.ElapsedTicks / (float)nticksUnack); diff --git a/OpenSim/Region/ClientStack/Linden/UDP/Tests/BasicCircuitTests.cs b/OpenSim/Region/ClientStack/Linden/UDP/Tests/BasicCircuitTests.cs index 45d0e2ab32..109a8e1914 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/Tests/BasicCircuitTests.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/Tests/BasicCircuitTests.cs @@ -197,7 +197,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP.Tests public void TestLogoutClientDueToAck() { TestHelpers.InMethod(); - TestHelpers.EnableLogging(); +// TestHelpers.EnableLogging(); IniConfigSource ics = new IniConfigSource(); IConfig config = ics.AddConfig("ClientStack.LindenUDP"); @@ -210,7 +210,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP.Tests ScenePresence spAfterAckTimeout = m_scene.GetScenePresence(sp.UUID); Assert.That(spAfterAckTimeout, Is.Null); - TestHelpers.DisableLogging(); +// TestHelpers.DisableLogging(); } // /// diff --git a/OpenSim/Tools/pCampBot/Bot.cs b/OpenSim/Tools/pCampBot/Bot.cs index b6cd287202..daaa3c0070 100644 --- a/OpenSim/Tools/pCampBot/Bot.cs +++ b/OpenSim/Tools/pCampBot/Bot.cs @@ -480,6 +480,9 @@ namespace pCampBot public void Objects_NewPrim(object sender, PrimEventArgs args) { +// if (Name.EndsWith("4")) +// throw new Exception("Aaargh"); + Primitive prim = args.Prim; if (prim != null) From f94b92df4646162c0a8f37dd3373c6c2a20c66e3 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 8 Jun 2012 04:12:22 +0100 Subject: [PATCH 351/547] Instead of retrieving the known client again in LLUDPServer.RemoveClient(), check the IsLoggingOut flag instead. This is slightly better thread-race wise --- .../ClientStack/Linden/UDP/LLUDPServer.cs | 31 ++++++------------- 1 file changed, 10 insertions(+), 21 deletions(-) diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs index e1fccb58a6..7f86491f4c 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs @@ -560,7 +560,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP { m_log.Warn("[LLUDPSERVER]: Ack timeout, disconnecting " + udpClient.AgentID); StatsManager.SimExtraStats.AddAbnormalClientThreadTermination(); - RemoveClient(udpClient); + RemoveClient(client); return; } @@ -1110,26 +1110,15 @@ namespace OpenSim.Region.ClientStack.LindenUDP return client; } - private void RemoveClient(LLUDPClient udpClient) + private void RemoveClient(IClientAPI client) { - // Remove this client from the scene - IClientAPI client; - if (m_scene.TryGetClient(udpClient.AgentID, out client)) - { - // We must set IsLoggingOut synchronously so that we can stop the packet loop reinvoking this method. - client.IsLoggingOut = true; + // We must set IsLoggingOut synchronously so that we can stop the packet loop reinvoking this method. + client.IsLoggingOut = true; - // Fire this out on a different thread so that we don't hold up outgoing packet processing for - // everybody else if this is being called due to an ack timeout. - // This is the same as processing as the async process of a logout request. - Util.FireAndForget(o => client.Close()); - } - else - { - m_log.WarnFormat( - "[LLUDPSERVER]: Tried to remove client with id {0} but not such client in {1}", - udpClient.AgentID, m_scene.RegionInfo.RegionName); - } + // Fire this out on a different thread so that we don't hold up outgoing packet processing for + // everybody else if this is being called due to an ack timeout. + // This is the same as processing as the async process of a logout request. + Util.FireAndForget(o => client.Close()); } private void IncomingPacketHandler() @@ -1443,8 +1432,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP protected void LogoutHandler(IClientAPI client) { client.SendLogoutPacket(); - if (client.IsActive) - RemoveClient(((LLClientView)client).UDPClient); + if (!client.IsLoggingOut) + RemoveClient(client); } } } \ No newline at end of file From 794d184c253d1967535e4040682a70b729dc3ccb Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 8 Jun 2012 04:32:51 +0100 Subject: [PATCH 352/547] Stop sending a DisableSimulator packet in LLClientView.Close(), which is a duplicate for child agents and unnecessary for root agents. Close() already calls Scene.RemoveClient() which sends the right eq or udp DisableSimulator message to child agents. --- OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs | 4 ---- 1 file changed, 4 deletions(-) diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs index 4d6081c447..74b9c6d773 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs @@ -494,10 +494,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP "[CLIENT]: Close has been called for {0} attached to scene {1}", Name, m_scene.RegionInfo.RegionName); - // Send the STOP packet - DisableSimulatorPacket disable = (DisableSimulatorPacket)PacketPool.Instance.GetPacket(PacketType.DisableSimulator); - OutPacket(disable, ThrottleOutPacketType.Unknown); - IsActive = false; // Shutdown the image manager From 817f2d341d30c7df1556071c9cc8b4c4a5588cb5 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 8 Jun 2012 23:36:53 +0100 Subject: [PATCH 353/547] Fix regression in 5f4f9f0 (Fri Jun 8 2012) which stopped "show stats" and json stats from working --- OpenSim/Region/Application/OpenSimBase.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/OpenSim/Region/Application/OpenSimBase.cs b/OpenSim/Region/Application/OpenSimBase.cs index 9a0fa70d35..3271555730 100644 --- a/OpenSim/Region/Application/OpenSimBase.cs +++ b/OpenSim/Region/Application/OpenSimBase.cs @@ -223,6 +223,8 @@ namespace OpenSim base.StartupSpecific(); + m_stats = StatsManager.SimExtraStats; + // Create a ModuleLoader instance m_moduleLoader = new ModuleLoader(m_config.Source); From 08cd5d2503d23bda54622d9110c7146b6a8648ff Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Sat, 9 Jun 2012 00:33:17 +0100 Subject: [PATCH 354/547] Add documentation to AllowGodFunctions setting in [LL-Functions] --- bin/OpenSimDefaults.ini | 2 ++ 1 file changed, 2 insertions(+) diff --git a/bin/OpenSimDefaults.ini b/bin/OpenSimDefaults.ini index c67e45a0ff..0e1a3af525 100644 --- a/bin/OpenSimDefaults.ini +++ b/bin/OpenSimDefaults.ini @@ -1153,6 +1153,8 @@ ; currently unused ; AllowosConsoleCommand=false + ; Are god functions such as llSetObjectPermMask() allowed? If true then gods and only gods have access to these functions. + ; If false then gods cannot execute these functions either. AllowGodFunctions = false ; Maximum number of llListen events we allow over the entire region. From 1f3218e53f01ee20eefbd484810f8d5ec8190a31 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Sat, 9 Jun 2012 01:11:15 +0100 Subject: [PATCH 355/547] Create avatar entries necessary to stop new v3 avatars being clouds (pants, shape, etc.) by default in grid mode. This only affects avatars created through the "create user" console command or createuser XMLRPC. This matches the default setting for standalone --- bin/Robust.ini.example | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/Robust.ini.example b/bin/Robust.ini.example index 1c04ab5c12..f70d13bd96 100644 --- a/bin/Robust.ini.example +++ b/bin/Robust.ini.example @@ -166,7 +166,7 @@ ServiceConnectors = "8003/OpenSim.Server.Handlers.dll:AssetServiceConnector,8003 ;; This switch creates the minimum set of body parts and avatar entries for a viewer 2 ;; to show a default "Ruth" avatar rather than a cloud for a newly created user. ;; Default is false - ; CreateDefaultAvatarEntries = false + CreateDefaultAvatarEntries = true ;; Allow the service to process HTTP createuser calls. ;; Default is false. From a8a9d13dc07bc9e23ebf439cbea5ece6ae002315 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Sat, 9 Jun 2012 05:11:08 +0100 Subject: [PATCH 356/547] Bind ~ and ! operators in LSL tighter in order to resolve issues in LSL where these aren't evaluated propertly. Addresses http://opensimulator.org/mantis/view.php?id=3268 --- .../Shared/CodeTools/lsl.parser.cs | 8316 ++++++++--------- 1 file changed, 4147 insertions(+), 4169 deletions(-) diff --git a/OpenSim/Region/ScriptEngine/Shared/CodeTools/lsl.parser.cs b/OpenSim/Region/ScriptEngine/Shared/CodeTools/lsl.parser.cs index ca56cd6c0d..8428c96f59 100644 --- a/OpenSim/Region/ScriptEngine/Shared/CodeTools/lsl.parser.cs +++ b/OpenSim/Region/ScriptEngine/Shared/CodeTools/lsl.parser.cs @@ -6338,250 +6338,327 @@ public yyLSLSyntax 16,0,488,1,74, 1253,1,328,1302,1, 1048,2014,16,0,488, -1,82,2015,16,0, -488,1,1840,2016,16, -0,488,1,1591,2017, -16,0,488,1,1341, -2018,16,0,488,1, -1096,1312,1,93,1318, -1,352,1349,1,107, -2019,16,0,488,1, -1114,1343,1,118,2020, -16,0,488,1,1123, -2021,16,0,488,1, -371,1365,1,1628,2022, -16,0,488,1,375, -1376,1,1882,2023,16, -0,488,1,377,1381, -1,379,1386,1,380, -1391,1,883,2024,16, -0,488,1,373,1409, -1,130,2025,16,0, -488,1,143,2026,16, -0,488,1,387,2027, -16,0,488,1,2664, -2028,16,0,488,1, -1159,2029,16,0,488, -1,157,2030,16,0, -488,1,1413,2031,16, -0,488,1,1665,2032, -16,0,488,1,412, -2033,16,0,488,1, -1377,2034,16,0,488, -1,172,2035,16,0, -488,1,1939,2036,16, -0,488,1,437,2037, -16,0,488,1,188, -2038,16,0,488,1, -942,2039,16,0,488, -1,1195,2040,16,0, -488,1,1449,2041,16, -0,488,1,1701,2042, -16,0,488,1,447, -1511,1,205,2043,16, -0,488,1,827,2044, -16,0,488,1,223, -2045,16,0,488,1, -476,1543,1,477,1549, -1,1231,2046,16,0, -488,1,479,1559,1, -480,1564,1,1485,2047, -16,0,488,1,1737, -2048,16,0,488,1, -242,2049,16,0,488, -1,478,1583,1,1001, -1588,1,1002,1593,1, -19,2050,19,225,1, -19,2051,5,176,1, -256,2052,16,0,223, -1,1261,2053,16,0, -223,1,1011,1102,1, -1012,2054,16,0,455, -1,2458,876,1,262, -1119,1,1267,2055,16, -0,455,1,2021,718, -1,1521,2056,16,0, -455,1,1775,2057,16, -0,223,1,2029,725, -1,2030,731,1,2031, -736,1,2032,741,1, -2033,746,1,277,2058, -16,0,223,1,2035, -752,1,2037,757,1, -2039,762,1,32,2059, -16,0,223,1,2464, -899,1,2293,2060,16, -0,223,1,2043,774, -1,2045,779,1,2299, -2061,16,0,455,1, -41,2062,16,0,223, -1,42,2063,16,0, -455,1,40,1177,1, -44,1183,1,43,2064, -16,0,223,1,1804, -2065,16,0,223,1, -48,1190,1,49,1196, -1,47,1184,1,51, -1206,1,52,2066,16, -0,223,1,50,1201, -1,305,1211,1,1096, -1312,1,1515,2067,16, -0,223,1,2318,2068, -16,0,223,1,283, -1172,1,63,1222,1, -66,1228,1,67,1233, -1,68,1238,1,69, -1243,1,70,1248,1, -71,2069,16,0,223, -1,73,2070,16,0, -455,1,74,1253,1, -1013,1258,1,76,2071, -16,0,223,1,1834, -2072,16,0,223,1, -2337,2073,16,0,223, -1,79,2074,16,0, -223,1,1335,2075,16, -0,223,1,299,2076, -16,0,223,1,82, -2077,16,0,455,1, -1840,2078,16,0,455, -1,1297,2079,16,0, -223,1,85,2080,16, -0,223,1,1341,2081, -16,0,455,1,89, -2082,16,0,223,1, -1303,2083,16,0,455, -1,509,2084,16,0, -223,1,93,1318,1, -322,2085,16,0,223, -1,97,2086,16,0, -223,1,2041,768,1, -1555,2087,16,0,455, -1,827,2088,16,0, -455,1,102,2089,16, -0,223,1,1860,821, -1,1803,787,1,2364, -827,1,107,2090,16, -0,455,1,1114,1343, -1,112,2091,16,0, -223,1,1117,2092,16, -0,223,1,352,1349, -1,1873,835,1,118, -2093,16,0,455,1, -1123,2094,16,0,455, -1,371,1365,1,515, -2095,16,0,455,1, -1377,2096,16,0,455, -1,124,2097,16,0, -223,1,1882,2098,16, -0,455,1,377,1381, -1,379,1386,1,380, -1391,1,130,2099,16, -0,455,1,346,2100, -16,0,223,1,2075, -2101,16,0,223,1, -373,1409,1,387,2102, -16,0,455,1,137, -2103,16,0,223,1, -143,2104,16,0,455, -1,1901,2105,16,0, -223,1,1048,2106,16, -0,455,1,2658,2107, -16,0,223,1,1153, -2108,16,0,223,1, -375,1376,1,151,2109, -16,0,223,1,1407, -2110,16,0,223,1, -1659,2111,16,0,223, -1,2413,2112,16,0, -223,1,1159,2113,16, -0,455,1,381,2114, -16,0,223,1,157, -2115,16,0,455,1, -1413,2116,16,0,455, -1,883,2117,16,0, -455,1,1371,2118,16, -0,223,1,328,1302, -1,2105,814,1,2106, -2119,16,0,223,1, -166,2120,16,0,223, -1,525,2121,16,0, -223,1,1622,2122,16, -0,223,1,406,2123, -16,0,223,1,1574, -799,1,172,2124,16, -0,455,1,1931,861, -1,412,2125,16,0, -455,1,1933,2126,16, -0,223,1,1876,2127, -16,0,223,1,431, -2128,16,0,223,1, -1585,2129,16,0,223, -1,182,2130,16,0, -223,1,1628,2131,16, -0,455,1,1189,2132, -16,0,223,1,437, -2133,16,0,455,1, -1591,2134,16,0,455, -1,188,2135,16,0, -455,1,1695,2136,16, -0,223,1,2198,2137, -16,0,223,1,1195, -2138,16,0,455,1, -1449,2139,16,0,455, -1,1701,2140,16,0, -455,1,447,2141,16, -0,223,1,199,2142, -16,0,223,1,2459, -882,1,1958,2143,16, -0,223,1,2462,889, -1,1657,894,1,205, -2144,16,0,455,1, -459,2145,16,0,223, -1,462,2146,16,0, -223,1,1665,2147,16, -0,455,1,217,2148, -16,0,223,1,2227, -908,1,942,2149,16, -0,455,1,1225,2150, -16,0,223,1,223, -2151,16,0,455,1, -1479,2152,16,0,223, -1,1731,2153,16,0, -223,1,477,1549,1, -1231,2154,16,0,455, +1,82,1280,1,1840, +2015,16,0,488,1, +1591,2016,16,0,488, +1,1341,2017,16,0, +488,1,1096,1312,1, +93,1318,1,352,1349, +1,107,1338,1,1114, +1343,1,118,2018,16, +0,488,1,1123,2019, +16,0,488,1,371, +1365,1,1628,2020,16, +0,488,1,375,1376, +1,1882,2021,16,0, +488,1,377,1381,1, +379,1386,1,380,1391, +1,883,2022,16,0, +488,1,373,1409,1, +130,2023,16,0,488, +1,143,2024,16,0, +488,1,387,2025,16, +0,488,1,2664,2026, +16,0,488,1,1159, +2027,16,0,488,1, +157,2028,16,0,488, +1,1413,2029,16,0, +488,1,1665,2030,16, +0,488,1,412,2031, +16,0,488,1,1377, +2032,16,0,488,1, +172,2033,16,0,488, +1,1939,2034,16,0, +488,1,437,2035,16, +0,488,1,188,2036, +16,0,488,1,942, +2037,16,0,488,1, +1195,2038,16,0,488, +1,1449,2039,16,0, +488,1,1701,2040,16, +0,488,1,447,1511, +1,205,2041,16,0, +488,1,827,2042,16, +0,488,1,223,2043, +16,0,488,1,476, +1543,1,477,1549,1, +1231,2044,16,0,488, 1,479,1559,1,480, -1564,1,1485,2155,16, -0,455,1,1737,2156, -16,0,455,1,1989, -916,1,1990,2157,16, -0,223,1,1443,2158, -16,0,223,1,236, -2159,16,0,223,1, -2136,842,1,2664,2160, -16,0,455,1,476, -1543,1,242,2161,16, -0,455,1,478,1583, -1,1939,2162,16,0, -455,1,1001,1588,1, -1002,1593,1,1756,2163, -16,0,223,1,20, -2164,19,442,1,20, -2165,5,84,1,1011, -1102,1,1012,2166,16, -0,440,1,1013,1258, +1564,1,1485,2045,16, +0,488,1,1737,2046, +16,0,488,1,242, +2047,16,0,488,1, +478,1583,1,1001,1588, +1,1002,1593,1,19, +2048,19,225,1,19, +2049,5,176,1,256, +2050,16,0,223,1, +1261,2051,16,0,223, +1,1011,1102,1,1012, +2052,16,0,455,1, +2458,876,1,262,1119, +1,1267,2053,16,0, +455,1,2021,718,1, +1521,2054,16,0,455, +1,1775,2055,16,0, +223,1,2029,725,1, +2030,731,1,2031,736, +1,2032,741,1,2033, +746,1,277,2056,16, +0,223,1,2035,752, +1,2037,757,1,2039, +762,1,32,2057,16, +0,223,1,2464,899, +1,2293,2058,16,0, +223,1,2043,774,1, +2045,779,1,2299,2059, +16,0,455,1,41, +2060,16,0,223,1, +42,2061,16,0,455, +1,40,1177,1,44, +1183,1,43,2062,16, +0,223,1,1804,2063, +16,0,223,1,48, +1190,1,49,1196,1, +47,1184,1,51,1206, +1,52,2064,16,0, +223,1,50,1201,1, +305,1211,1,1096,1312, +1,1515,2065,16,0, +223,1,2318,2066,16, +0,223,1,283,1172, +1,63,1222,1,66, +1228,1,67,1233,1, +68,1238,1,69,1243, +1,70,1248,1,71, +2067,16,0,223,1, +73,2068,16,0,455, +1,74,1253,1,1013, +1258,1,76,2069,16, +0,223,1,1834,2070, +16,0,223,1,2337, +2071,16,0,223,1, +79,2072,16,0,223, +1,1335,2073,16,0, +223,1,299,2074,16, +0,223,1,82,1280, +1,1840,2075,16,0, +455,1,1297,2076,16, +0,223,1,85,2077, +16,0,223,1,1341, +2078,16,0,455,1, +89,2079,16,0,223, +1,1303,2080,16,0, +455,1,509,2081,16, +0,223,1,93,1318, +1,322,2082,16,0, +223,1,97,2083,16, +0,223,1,2041,768, +1,1555,2084,16,0, +455,1,827,2085,16, +0,455,1,102,2086, +16,0,223,1,1860, +821,1,1803,787,1, +2364,827,1,107,1338, +1,1114,1343,1,112, +2087,16,0,223,1, +1117,2088,16,0,223, +1,352,1349,1,1873, +835,1,118,2089,16, +0,455,1,1123,2090, +16,0,455,1,371, +1365,1,515,2091,16, +0,455,1,1377,2092, +16,0,455,1,124, +2093,16,0,223,1, +1882,2094,16,0,455, +1,377,1381,1,379, +1386,1,380,1391,1, +130,2095,16,0,455, +1,346,2096,16,0, +223,1,2075,2097,16, +0,223,1,373,1409, +1,387,2098,16,0, +455,1,137,2099,16, +0,223,1,143,2100, +16,0,455,1,1901, +2101,16,0,223,1, +1048,2102,16,0,455, +1,2658,2103,16,0, +223,1,1153,2104,16, +0,223,1,375,1376, +1,151,2105,16,0, +223,1,1407,2106,16, +0,223,1,1659,2107, +16,0,223,1,2413, +2108,16,0,223,1, +1159,2109,16,0,455, +1,381,2110,16,0, +223,1,157,2111,16, +0,455,1,1413,2112, +16,0,455,1,883, +2113,16,0,455,1, +1371,2114,16,0,223, +1,328,1302,1,2105, +814,1,2106,2115,16, +0,223,1,166,2116, +16,0,223,1,525, +2117,16,0,223,1, +1622,2118,16,0,223, +1,406,2119,16,0, +223,1,1574,799,1, +172,2120,16,0,455, +1,1931,861,1,412, +2121,16,0,455,1, +1933,2122,16,0,223, +1,1876,2123,16,0, +223,1,431,2124,16, +0,223,1,1585,2125, +16,0,223,1,182, +2126,16,0,223,1, +1628,2127,16,0,455, +1,1189,2128,16,0, +223,1,437,2129,16, +0,455,1,1591,2130, +16,0,455,1,188, +2131,16,0,455,1, +1695,2132,16,0,223, +1,2198,2133,16,0, +223,1,1195,2134,16, +0,455,1,1449,2135, +16,0,455,1,1701, +2136,16,0,455,1, +447,2137,16,0,223, +1,199,2138,16,0, +223,1,2459,882,1, +1958,2139,16,0,223, +1,2462,889,1,1657, +894,1,205,2140,16, +0,455,1,459,2141, +16,0,223,1,462, +2142,16,0,223,1, +1665,2143,16,0,455, +1,217,2144,16,0, +223,1,2227,908,1, +942,2145,16,0,455, +1,1225,2146,16,0, +223,1,223,2147,16, +0,455,1,1479,2148, +16,0,223,1,1731, +2149,16,0,223,1, +477,1549,1,1231,2150, +16,0,455,1,479, +1559,1,480,1564,1, +1485,2151,16,0,455, +1,1737,2152,16,0, +455,1,1989,916,1, +1990,2153,16,0,223, +1,1443,2154,16,0, +223,1,236,2155,16, +0,223,1,2136,842, +1,2664,2156,16,0, +455,1,476,1543,1, +242,2157,16,0,455, +1,478,1583,1,1939, +2158,16,0,455,1, +1001,1588,1,1002,1593, +1,1756,2159,16,0, +223,1,20,2160,19, +442,1,20,2161,5, +84,1,1011,1102,1, +1012,2162,16,0,440, +1,1013,1258,1,262, +1119,1,1267,2163,16, +0,440,1,515,2164, +16,0,440,1,1521, +2165,16,0,440,1, +525,1216,1,283,1172, +1,2299,2166,16,0, +440,1,42,2167,16, +0,440,1,40,1177, +1,44,1183,1,47, +1184,1,1303,2168,16, +0,440,1,1555,2169, +16,0,440,1,50, +1201,1,48,1190,1, +49,1196,1,51,1206, +1,63,1222,1,305, +1211,1,66,1228,1, +67,1233,1,68,1238, +1,69,1243,1,70, +1248,1,73,2170,16, +0,440,1,74,1253, +1,328,2171,16,0, +440,1,1048,2172,16, +0,440,1,82,1280, +1,1840,2173,16,0, +440,1,1591,2174,16, +0,440,1,1341,2175, +16,0,440,1,1096, +1312,1,93,1318,1, +352,2176,16,0,440, +1,107,1338,1,1114, +1343,1,118,2177,16, +0,440,1,1123,2178, +16,0,440,1,371, +1365,1,1628,2179,16, +0,440,1,375,1376, +1,1882,2180,16,0, +440,1,377,1381,1, +379,1386,1,380,1391, +1,883,2181,16,0, +440,1,373,1409,1, +130,2182,16,0,440, +1,143,2183,16,0, +440,1,387,2184,16, +0,440,1,2664,2185, +16,0,440,1,1159, +2186,16,0,440,1, +157,2187,16,0,440, +1,1413,2188,16,0, +440,1,1665,2189,16, +0,440,1,412,2190, +16,0,440,1,1377, +2191,16,0,440,1, +172,2192,16,0,440, +1,1939,2193,16,0, +440,1,437,2194,16, +0,440,1,188,2195, +16,0,440,1,942, +2196,16,0,440,1, +1195,2197,16,0,440, +1,1449,2198,16,0, +440,1,1701,2199,16, +0,440,1,447,1511, +1,205,2200,16,0, +440,1,827,2201,16, +0,440,1,223,2202, +16,0,440,1,476, +1543,1,477,1549,1, +1231,2203,16,0,440, +1,479,1559,1,480, +1564,1,1485,2204,16, +0,440,1,1737,2205, +16,0,440,1,242, +2206,16,0,440,1, +478,1583,1,1001,1588, +1,1002,1593,1,21, +2207,19,432,1,21, +2208,5,84,1,1011, +1102,1,1012,2209,16, +0,430,1,1013,1258, 1,262,1119,1,1267, -2167,16,0,440,1, -515,2168,16,0,440, -1,1521,2169,16,0, -440,1,525,1216,1, -283,1172,1,2299,2170, -16,0,440,1,42, -2171,16,0,440,1, +2210,16,0,430,1, +515,2211,16,0,430, +1,1521,2212,16,0, +430,1,525,1216,1, +283,1172,1,2299,2213, +16,0,430,1,42, +2214,16,0,430,1, 40,1177,1,44,1183, 1,47,1184,1,1303, -2172,16,0,440,1, -1555,2173,16,0,440, +2215,16,0,430,1, +1555,2216,16,0,430, 1,50,1201,1,48, 1190,1,49,1196,1, 51,1206,1,63,1222, @@ -6589,243 +6666,160 @@ public yyLSLSyntax 1228,1,67,1233,1, 68,1238,1,69,1243, 1,70,1248,1,73, -2174,16,0,440,1, -74,1253,1,328,2175, -16,0,440,1,1048, -2176,16,0,440,1, -82,2177,16,0,440, -1,1840,2178,16,0, -440,1,1591,2179,16, -0,440,1,1341,2180, -16,0,440,1,1096, -1312,1,93,1318,1, -352,2181,16,0,440, -1,107,2182,16,0, -440,1,1114,1343,1, -118,2183,16,0,440, -1,1123,2184,16,0, -440,1,371,1365,1, -1628,2185,16,0,440, -1,375,1376,1,1882, -2186,16,0,440,1, -377,1381,1,379,1386, -1,380,1391,1,883, -2187,16,0,440,1, -373,1409,1,130,2188, -16,0,440,1,143, -2189,16,0,440,1, -387,2190,16,0,440, -1,2664,2191,16,0, -440,1,1159,2192,16, -0,440,1,157,2193, -16,0,440,1,1413, -2194,16,0,440,1, -1665,2195,16,0,440, -1,412,2196,16,0, -440,1,1377,2197,16, -0,440,1,172,2198, -16,0,440,1,1939, -2199,16,0,440,1, -437,2200,16,0,440, -1,188,2201,16,0, -440,1,942,2202,16, -0,440,1,1195,2203, -16,0,440,1,1449, -2204,16,0,440,1, -1701,2205,16,0,440, -1,447,1511,1,205, -2206,16,0,440,1, -827,2207,16,0,440, -1,223,2208,16,0, -440,1,476,1543,1, -477,1549,1,1231,2209, -16,0,440,1,479, -1559,1,480,1564,1, -1485,2210,16,0,440, -1,1737,2211,16,0, -440,1,242,2212,16, -0,440,1,478,1583, -1,1001,1588,1,1002, -1593,1,21,2213,19, -432,1,21,2214,5, -84,1,1011,1102,1, -1012,2215,16,0,430, -1,1013,1258,1,262, -1119,1,1267,2216,16, -0,430,1,515,2217, -16,0,430,1,1521, -2218,16,0,430,1, -525,1216,1,283,1172, -1,2299,2219,16,0, -430,1,42,2220,16, -0,430,1,40,1177, -1,44,1183,1,47, -1184,1,1303,2221,16, -0,430,1,1555,2222, -16,0,430,1,50, -1201,1,48,1190,1, -49,1196,1,51,1206, -1,63,1222,1,305, -1211,1,66,1228,1, -67,1233,1,68,1238, -1,69,1243,1,70, -1248,1,73,2223,16, -0,430,1,74,1253, -1,328,2224,16,0, -430,1,1048,2225,16, -0,430,1,82,2226, -16,0,430,1,1840, -2227,16,0,430,1, -1591,2228,16,0,430, -1,1341,2229,16,0, -430,1,1096,1312,1, -93,1318,1,352,2230, -16,0,430,1,107, +2217,16,0,430,1, +74,1253,1,328,2218, +16,0,430,1,1048, +2219,16,0,430,1, +82,1280,1,1840,2220, +16,0,430,1,1591, +2221,16,0,430,1, +1341,2222,16,0,430, +1,1096,1312,1,93, +1318,1,352,2223,16, +0,430,1,107,1338, +1,1114,1343,1,118, +2224,16,0,430,1, +1123,2225,16,0,430, +1,371,1365,1,1628, +2226,16,0,430,1, +375,1376,1,1882,2227, +16,0,430,1,377, +1381,1,379,1386,1, +380,1391,1,883,2228, +16,0,430,1,373, +1409,1,130,2229,16, +0,430,1,143,2230, +16,0,430,1,387, 2231,16,0,430,1, -1114,1343,1,118,2232, -16,0,430,1,1123, -2233,16,0,430,1, -371,1365,1,1628,2234, -16,0,430,1,375, -1376,1,1882,2235,16, -0,430,1,377,1381, -1,379,1386,1,380, -1391,1,883,2236,16, -0,430,1,373,1409, -1,130,2237,16,0, -430,1,143,2238,16, -0,430,1,387,2239, -16,0,430,1,2664, -2240,16,0,430,1, -1159,2241,16,0,430, -1,157,2242,16,0, -430,1,1413,2243,16, -0,430,1,1665,2244, -16,0,430,1,412, -2245,16,0,430,1, -1377,2246,16,0,430, -1,172,2247,16,0, -430,1,1939,2248,16, -0,430,1,437,2249, -16,0,430,1,188, -2250,16,0,430,1, -942,2251,16,0,430, -1,1195,2252,16,0, -430,1,1449,2253,16, -0,430,1,1701,2254, -16,0,430,1,447, -1511,1,205,2255,16, -0,430,1,827,2256, -16,0,430,1,223, -2257,16,0,430,1, -476,1543,1,477,1549, -1,1231,2258,16,0, -430,1,479,1559,1, -480,1564,1,1485,2259, -16,0,430,1,1737, -2260,16,0,430,1, -242,2261,16,0,430, -1,478,1583,1,1001, -1588,1,1002,1593,1, -22,2262,19,383,1, -22,2263,5,84,1, -1011,1102,1,1012,2264, -16,0,381,1,1013, -1258,1,262,1119,1, -1267,2265,16,0,381, -1,515,2266,16,0, -381,1,1521,2267,16, -0,381,1,525,1216, -1,283,1172,1,2299, -2268,16,0,381,1, -42,2269,16,0,381, -1,40,1177,1,44, -1183,1,47,1184,1, -1303,2270,16,0,381, -1,1555,2271,16,0, -381,1,50,1201,1, -48,1190,1,49,1196, -1,51,1206,1,63, -1222,1,305,1211,1, -66,1228,1,67,1233, -1,68,1238,1,69, -1243,1,70,1248,1, -73,2272,16,0,381, -1,74,1253,1,328, -2273,16,0,381,1, -1048,2274,16,0,381, -1,82,2275,16,0, -381,1,1840,2276,16, -0,381,1,1591,2277, -16,0,381,1,1341, -2278,16,0,381,1, -1096,1312,1,93,1318, -1,352,2279,16,0, -381,1,107,2280,16, -0,381,1,1114,1343, -1,118,2281,16,0, -381,1,1123,2282,16, +2664,2232,16,0,430, +1,1159,2233,16,0, +430,1,157,2234,16, +0,430,1,1413,2235, +16,0,430,1,1665, +2236,16,0,430,1, +412,2237,16,0,430, +1,1377,2238,16,0, +430,1,172,2239,16, +0,430,1,1939,2240, +16,0,430,1,437, +2241,16,0,430,1, +188,2242,16,0,430, +1,942,2243,16,0, +430,1,1195,2244,16, +0,430,1,1449,2245, +16,0,430,1,1701, +2246,16,0,430,1, +447,1511,1,205,2247, +16,0,430,1,827, +2248,16,0,430,1, +223,2249,16,0,430, +1,476,1543,1,477, +1549,1,1231,2250,16, +0,430,1,479,1559, +1,480,1564,1,1485, +2251,16,0,430,1, +1737,2252,16,0,430, +1,242,2253,16,0, +430,1,478,1583,1, +1001,1588,1,1002,1593, +1,22,2254,19,383, +1,22,2255,5,84, +1,1011,1102,1,1012, +2256,16,0,381,1, +1013,1258,1,262,1119, +1,1267,2257,16,0, +381,1,515,2258,16, +0,381,1,1521,2259, +16,0,381,1,525, +1216,1,283,1172,1, +2299,2260,16,0,381, +1,42,2261,16,0, +381,1,40,1177,1, +44,1183,1,47,1184, +1,1303,2262,16,0, +381,1,1555,2263,16, +0,381,1,50,1201, +1,48,1190,1,49, +1196,1,51,1206,1, +63,1222,1,305,1211, +1,66,1228,1,67, +1233,1,68,1238,1, +69,1243,1,70,1248, +1,73,2264,16,0, +381,1,74,1253,1, +328,2265,16,0,381, +1,1048,2266,16,0, +381,1,82,1280,1, +1840,2267,16,0,381, +1,1591,2268,16,0, +381,1,1341,2269,16, +0,381,1,1096,1312, +1,93,1318,1,352, +2270,16,0,381,1, +107,1338,1,1114,1343, +1,118,2271,16,0, +381,1,1123,2272,16, 0,381,1,371,1365, -1,1628,2283,16,0, +1,1628,2273,16,0, 381,1,375,1376,1, -1882,2284,16,0,381, +1882,2274,16,0,381, 1,377,1381,1,379, 1386,1,380,1391,1, -883,2285,16,0,381, +883,2275,16,0,381, 1,373,1409,1,130, -2286,16,0,381,1, -143,2287,16,0,381, -1,387,2288,16,0, -381,1,2664,2289,16, -0,381,1,1159,2290, +2276,16,0,381,1, +143,2277,16,0,381, +1,387,2278,16,0, +381,1,2664,2279,16, +0,381,1,1159,2280, 16,0,381,1,157, -2291,16,0,381,1, -1413,2292,16,0,381, -1,1665,2293,16,0, -381,1,412,2294,16, -0,381,1,1377,2295, +2281,16,0,381,1, +1413,2282,16,0,381, +1,1665,2283,16,0, +381,1,412,2284,16, +0,381,1,1377,2285, 16,0,381,1,172, -2296,16,0,381,1, -1939,2297,16,0,381, -1,437,2298,16,0, -381,1,188,2299,16, -0,381,1,942,2300, +2286,16,0,381,1, +1939,2287,16,0,381, +1,437,2288,16,0, +381,1,188,2289,16, +0,381,1,942,2290, 16,0,381,1,1195, -2301,16,0,381,1, -1449,2302,16,0,381, -1,1701,2303,16,0, +2291,16,0,381,1, +1449,2292,16,0,381, +1,1701,2293,16,0, 381,1,447,1511,1, -205,2304,16,0,381, -1,827,2305,16,0, -381,1,223,2306,16, +205,2294,16,0,381, +1,827,2295,16,0, +381,1,223,2296,16, 0,381,1,476,1543, 1,477,1549,1,1231, -2307,16,0,381,1, +2297,16,0,381,1, 479,1559,1,480,1564, -1,1485,2308,16,0, -381,1,1737,2309,16, -0,381,1,242,2310, +1,1485,2298,16,0, +381,1,1737,2299,16, +0,381,1,242,2300, 16,0,381,1,478, 1583,1,1001,1588,1, -1002,1593,1,23,2311, -19,504,1,23,2312, -5,38,1,1901,2313, +1002,1593,1,23,2301, +19,504,1,23,2302, +5,38,1,1901,2303, 16,0,502,1,2075, -2314,16,0,502,1, +2304,16,0,502,1, 1860,821,1,1803,787, -1,1804,2315,16,0, -502,1,2413,2316,16, -0,502,1,2198,2317, +1,1804,2305,16,0, +502,1,2413,2306,16, +0,502,1,2198,2307, 16,0,502,1,1873, 835,1,1657,894,1, -1989,916,1,1990,2318, +1989,916,1,1990,2308, 16,0,502,1,1775, -2319,16,0,502,1, -32,2320,16,0,502, +2309,16,0,502,1, +32,2310,16,0,502, 1,2105,814,1,2106, -2321,16,0,502,1, +2311,16,0,502,1, 2364,827,1,2227,908, -1,2337,2322,16,0, +1,2337,2312,16,0, 502,1,2021,718,1, 2458,876,1,2459,882, 1,2462,889,1,2136, @@ -6838,1207 +6832,1195 @@ public yyLSLSyntax 861,1,2041,768,1, 2043,774,1,2045,779, 1,1574,799,1,1958, -2323,16,0,502,1, -24,2324,19,177,1, -24,2325,5,5,1, -44,2326,16,0,175, -1,377,2327,16,0, -540,1,40,2328,16, -0,674,1,63,2329, +2313,16,0,502,1, +24,2314,19,177,1, +24,2315,5,5,1, +44,2316,16,0,175, +1,377,2317,16,0, +540,1,40,2318,16, +0,674,1,63,2319, 16,0,196,1,373, -2330,16,0,536,1, -25,2331,19,291,1, -25,2332,5,177,1, -256,2333,16,0,545, -1,1261,2334,16,0, +2320,16,0,536,1, +25,2321,19,291,1, +25,2322,5,177,1, +256,2323,16,0,545, +1,1261,2324,16,0, 545,1,1011,1102,1, -1012,2335,16,0,289, +1012,2325,16,0,289, 1,2458,876,1,262, -1119,1,1267,2336,16, +1119,1,1267,2326,16, 0,289,1,2021,718, -1,1521,2337,16,0, -289,1,1775,2338,16, +1,1521,2327,16,0, +289,1,1775,2328,16, 0,545,1,2029,725, 1,2030,731,1,2031, 736,1,2032,741,1, -2033,746,1,277,2339, +2033,746,1,277,2329, 16,0,545,1,2035, 752,1,2037,757,1, -2039,762,1,32,2340, +2039,762,1,32,2330, 16,0,545,1,2464, -899,1,2293,2341,16, +899,1,2293,2331,16, 0,545,1,2043,774, 1,2045,779,1,2299, -2342,16,0,289,1, -41,2343,16,0,545, -1,42,2344,16,0, +2332,16,0,289,1, +41,2333,16,0,545, +1,42,2334,16,0, 289,1,40,1177,1, -44,1183,1,43,2345, +44,1183,1,43,2335, 16,0,545,1,1804, -2346,16,0,545,1, +2336,16,0,545,1, 48,1190,1,49,1196, 1,47,1184,1,51, -1206,1,52,2347,16, +1206,1,52,2337,16, 0,545,1,50,1201, 1,305,1211,1,1096, -1312,1,1515,2348,16, -0,545,1,2318,2349, +1312,1,1515,2338,16, +0,545,1,2318,2339, 16,0,545,1,62, -2350,16,0,545,1, +2340,16,0,545,1, 63,1222,1,66,1228, 1,67,1233,1,68, 1238,1,69,1243,1, -70,1248,1,71,2351, +70,1248,1,71,2341, 16,0,545,1,283, -1172,1,73,2352,16, +1172,1,73,2342,16, 0,289,1,74,1253, 1,1013,1258,1,76, -2353,16,0,545,1, -1834,2354,16,0,545, -1,2337,2355,16,0, -545,1,79,2356,16, -0,545,1,1335,2357, +2343,16,0,545,1, +1834,2344,16,0,545, +1,2337,2345,16,0, +545,1,79,2346,16, +0,545,1,1335,2347, 16,0,545,1,299, -2358,16,0,545,1, -82,2359,16,0,289, -1,1840,2360,16,0, -289,1,1297,2361,16, -0,545,1,85,2362, -16,0,545,1,1341, -2363,16,0,289,1, -89,2364,16,0,545, -1,1303,2365,16,0, -289,1,509,2366,16, -0,545,1,93,1318, -1,322,2367,16,0, -545,1,97,2368,16, -0,545,1,2041,768, -1,1555,2369,16,0, -289,1,827,2370,16, -0,289,1,102,2371, -16,0,545,1,1860, -821,1,1803,787,1, -2364,827,1,107,2372, -16,0,289,1,1114, -1343,1,112,2373,16, -0,545,1,1117,2374, -16,0,545,1,352, -1349,1,1873,835,1, -118,1355,1,1123,2375, -16,0,289,1,371, -1365,1,515,2376,16, -0,289,1,1377,2377, -16,0,289,1,124, -2378,16,0,545,1, -1882,2379,16,0,289, -1,377,1381,1,379, -1386,1,380,1391,1, -130,1414,1,346,2380, -16,0,545,1,2075, +2348,16,0,545,1, +82,1280,1,1840,2349, +16,0,289,1,1297, +2350,16,0,545,1, +85,2351,16,0,545, +1,1341,2352,16,0, +289,1,89,2353,16, +0,545,1,1303,2354, +16,0,289,1,509, +2355,16,0,545,1, +93,1318,1,322,2356, +16,0,545,1,97, +2357,16,0,545,1, +2041,768,1,1555,2358, +16,0,289,1,827, +2359,16,0,289,1, +102,2360,16,0,545, +1,1860,821,1,1803, +787,1,2364,827,1, +107,1338,1,1114,1343, +1,112,2361,16,0, +545,1,1117,2362,16, +0,545,1,352,1349, +1,1873,835,1,118, +1355,1,1123,2363,16, +0,289,1,371,1365, +1,515,2364,16,0, +289,1,1377,2365,16, +0,289,1,124,2366, +16,0,545,1,1882, +2367,16,0,289,1, +377,1381,1,379,1386, +1,380,1391,1,130, +1414,1,346,2368,16, +0,545,1,2075,2369, +16,0,545,1,373, +1409,1,387,2370,16, +0,289,1,137,2371, +16,0,545,1,143, +2372,16,0,289,1, +1901,2373,16,0,545, +1,1048,1344,1,2658, +2374,16,0,545,1, +1153,2375,16,0,545, +1,375,1376,1,151, +2376,16,0,545,1, +1407,2377,16,0,545, +1,1659,2378,16,0, +545,1,2413,2379,16, +0,545,1,1159,2380, +16,0,289,1,381, 2381,16,0,545,1, -373,1409,1,387,2382, -16,0,289,1,137, -2383,16,0,545,1, -143,2384,16,0,289, -1,1901,2385,16,0, -545,1,1048,1344,1, -2658,2386,16,0,545, -1,1153,2387,16,0, -545,1,375,1376,1, -151,2388,16,0,545, -1,1407,2389,16,0, -545,1,1659,2390,16, -0,545,1,2413,2391, -16,0,545,1,1159, -2392,16,0,289,1, -381,2393,16,0,545, -1,157,2394,16,0, -289,1,1413,2395,16, -0,289,1,883,2396, -16,0,289,1,1371, -2397,16,0,545,1, -328,1302,1,2105,814, -1,2106,2398,16,0, -545,1,166,2399,16, -0,545,1,525,2400, -16,0,545,1,1622, -2401,16,0,545,1, -406,2402,16,0,545, -1,1574,799,1,172, -1469,1,1931,861,1, -412,2403,16,0,289, -1,1933,2404,16,0, -545,1,1876,2405,16, -0,545,1,431,2406, -16,0,545,1,1585, -2407,16,0,545,1, -182,2408,16,0,545, -1,1628,2409,16,0, -289,1,1189,2410,16, -0,545,1,437,2411, -16,0,289,1,1591, -2412,16,0,289,1, -188,1518,1,1695,2413, -16,0,545,1,2198, -2414,16,0,545,1, -1195,2415,16,0,289, -1,1449,2416,16,0, -289,1,1701,2417,16, -0,289,1,447,2418, -16,0,545,1,199, -2419,16,0,545,1, -2459,882,1,1958,2420, -16,0,545,1,2462, -889,1,1657,894,1, -205,2421,16,0,289, -1,459,2422,16,0, -545,1,462,2423,16, -0,545,1,1665,2424, -16,0,289,1,217, -2425,16,0,545,1, -2227,908,1,942,1490, -1,1225,2426,16,0, -545,1,223,2427,16, -0,289,1,1479,2428, -16,0,545,1,1731, -2429,16,0,545,1, -477,1549,1,1231,2430, -16,0,289,1,479, -1559,1,480,1564,1, -1485,2431,16,0,289, -1,1737,2432,16,0, -289,1,1989,916,1, -1990,2433,16,0,545, -1,1443,2434,16,0, -545,1,236,2435,16, -0,545,1,2136,842, -1,2664,2436,16,0, -289,1,476,1543,1, -242,2437,16,0,289, -1,478,1583,1,1939, -2438,16,0,289,1, -1001,1588,1,1002,1593, -1,1756,2439,16,0, -545,1,26,2440,19, -308,1,26,2441,5, -84,1,1011,1102,1, -1012,2442,16,0,306, -1,1013,1258,1,262, -1119,1,1267,2443,16, -0,306,1,515,2444, -16,0,660,1,1521, -2445,16,0,306,1, -525,1216,1,283,1172, -1,2299,2446,16,0, -306,1,42,2447,16, -0,306,1,40,1177, -1,44,1183,1,47, -1184,1,1303,2448,16, -0,306,1,1555,2449, -16,0,306,1,50, -1201,1,48,1190,1, -49,1196,1,51,1206, -1,63,1222,1,305, -1211,1,66,1228,1, -67,1233,1,68,1238, -1,69,1243,1,70, -1248,1,73,2450,16, -0,306,1,74,1253, -1,328,1302,1,1048, -1344,1,82,2451,16, -0,306,1,1840,2452, -16,0,306,1,1591, -2453,16,0,306,1, -1341,2454,16,0,306, -1,1096,1312,1,93, -1318,1,352,1349,1, -107,2455,16,0,306, -1,1114,1343,1,118, -1355,1,1123,2456,16, -0,306,1,371,1365, -1,1628,2457,16,0, -306,1,375,1376,1, -1882,2458,16,0,306, -1,377,1381,1,379, -1386,1,380,1391,1, -883,2459,16,0,306, -1,373,1409,1,130, -1414,1,143,2460,16, -0,306,1,387,2461, -16,0,306,1,2664, -2462,16,0,306,1, -1159,2463,16,0,306, -1,157,2464,16,0, -306,1,1413,2465,16, -0,306,1,1665,2466, -16,0,306,1,412, -2467,16,0,306,1, -1377,2468,16,0,306, -1,172,1469,1,1939, -2469,16,0,306,1, -437,2470,16,0,588, -1,188,1518,1,942, -1490,1,1195,2471,16, -0,306,1,1449,2472, -16,0,306,1,1701, -2473,16,0,306,1, -447,1511,1,205,2474, -16,0,306,1,827, -2475,16,0,306,1, -223,2476,16,0,306, -1,476,1543,1,477, -1549,1,1231,2477,16, -0,306,1,479,1559, +157,2382,16,0,289, +1,1413,2383,16,0, +289,1,883,2384,16, +0,289,1,1371,2385, +16,0,545,1,328, +1302,1,2105,814,1, +2106,2386,16,0,545, +1,166,2387,16,0, +545,1,525,2388,16, +0,545,1,1622,2389, +16,0,545,1,406, +2390,16,0,545,1, +1574,799,1,172,1469, +1,1931,861,1,412, +2391,16,0,289,1, +1933,2392,16,0,545, +1,1876,2393,16,0, +545,1,431,2394,16, +0,545,1,1585,2395, +16,0,545,1,182, +2396,16,0,545,1, +1628,2397,16,0,289, +1,1189,2398,16,0, +545,1,437,2399,16, +0,289,1,1591,2400, +16,0,289,1,188, +1518,1,1695,2401,16, +0,545,1,2198,2402, +16,0,545,1,1195, +2403,16,0,289,1, +1449,2404,16,0,289, +1,1701,2405,16,0, +289,1,447,2406,16, +0,545,1,199,2407, +16,0,545,1,2459, +882,1,1958,2408,16, +0,545,1,2462,889, +1,1657,894,1,205, +2409,16,0,289,1, +459,2410,16,0,545, +1,462,2411,16,0, +545,1,1665,2412,16, +0,289,1,217,2413, +16,0,545,1,2227, +908,1,942,1490,1, +1225,2414,16,0,545, +1,223,2415,16,0, +289,1,1479,2416,16, +0,545,1,1731,2417, +16,0,545,1,477, +1549,1,1231,2418,16, +0,289,1,479,1559, 1,480,1564,1,1485, -2478,16,0,306,1, -1737,2479,16,0,306, -1,242,2480,16,0, -306,1,478,1583,1, -1001,1588,1,1002,1593, -1,27,2481,19,598, -1,27,2482,5,95, -1,256,2483,16,0, -596,1,1261,2484,16, -0,596,1,509,2485, -16,0,596,1,1515, -2486,16,0,596,1, -2021,718,1,1775,2487, -16,0,596,1,2029, -725,1,2030,731,1, -2031,736,1,2032,741, -1,2033,746,1,277, -2488,16,0,596,1, -2035,752,1,2037,757, -1,2039,762,1,32, -2489,16,0,596,1, -2041,768,1,2293,2490, -16,0,596,1,2043, -774,1,2045,779,1, -41,2491,16,0,596, -1,1297,2492,16,0, -596,1,43,2493,16, -0,596,1,1803,787, -1,1804,2494,16,0, -596,1,299,2495,16, -0,596,1,52,2496, -16,0,596,1,2318, -2497,16,0,596,1, -62,2498,16,0,596, -1,2075,2499,16,0, -596,1,1574,799,1, -71,2500,16,0,596, -1,76,2501,16,0, -596,1,1834,2502,16, -0,596,1,2337,2503, -16,0,596,1,79, -2504,16,0,596,1, -1335,2505,16,0,596, -1,322,2506,16,0, -596,1,85,2507,16, -0,596,1,89,2508, -16,0,596,1,346, -2509,16,0,596,1, -2105,814,1,2106,2510, -16,0,596,1,97, -2511,16,0,596,1, -1860,821,1,2364,827, -1,102,2512,16,0, -596,1,112,2513,16, -0,596,1,1117,2514, -16,0,596,1,1873, -835,1,1876,2515,16, -0,596,1,124,2516, -16,0,596,1,2136, -842,1,381,2517,16, -0,596,1,525,2518, -16,0,596,1,137, +2419,16,0,289,1, +1737,2420,16,0,289, +1,1989,916,1,1990, +2421,16,0,545,1, +1443,2422,16,0,545, +1,236,2423,16,0, +545,1,2136,842,1, +2664,2424,16,0,289, +1,476,1543,1,242, +2425,16,0,289,1, +478,1583,1,1939,2426, +16,0,289,1,1001, +1588,1,1002,1593,1, +1756,2427,16,0,545, +1,26,2428,19,308, +1,26,2429,5,84, +1,1011,1102,1,1012, +2430,16,0,306,1, +1013,1258,1,262,1119, +1,1267,2431,16,0, +306,1,515,2432,16, +0,660,1,1521,2433, +16,0,306,1,525, +1216,1,283,1172,1, +2299,2434,16,0,306, +1,42,2435,16,0, +306,1,40,1177,1, +44,1183,1,47,1184, +1,1303,2436,16,0, +306,1,1555,2437,16, +0,306,1,50,1201, +1,48,1190,1,49, +1196,1,51,1206,1, +63,1222,1,305,1211, +1,66,1228,1,67, +1233,1,68,1238,1, +69,1243,1,70,1248, +1,73,2438,16,0, +306,1,74,1253,1, +328,1302,1,1048,1344, +1,82,1280,1,1840, +2439,16,0,306,1, +1591,2440,16,0,306, +1,1341,2441,16,0, +306,1,1096,1312,1, +93,1318,1,352,1349, +1,107,1338,1,1114, +1343,1,118,1355,1, +1123,2442,16,0,306, +1,371,1365,1,1628, +2443,16,0,306,1, +375,1376,1,1882,2444, +16,0,306,1,377, +1381,1,379,1386,1, +380,1391,1,883,2445, +16,0,306,1,373, +1409,1,130,1414,1, +143,2446,16,0,306, +1,387,2447,16,0, +306,1,2664,2448,16, +0,306,1,1159,2449, +16,0,306,1,157, +2450,16,0,306,1, +1413,2451,16,0,306, +1,1665,2452,16,0, +306,1,412,2453,16, +0,306,1,1377,2454, +16,0,306,1,172, +1469,1,1939,2455,16, +0,306,1,437,2456, +16,0,588,1,188, +1518,1,942,1490,1, +1195,2457,16,0,306, +1,1449,2458,16,0, +306,1,1701,2459,16, +0,306,1,447,1511, +1,205,2460,16,0, +306,1,827,2461,16, +0,306,1,223,2462, +16,0,306,1,476, +1543,1,477,1549,1, +1231,2463,16,0,306, +1,479,1559,1,480, +1564,1,1485,2464,16, +0,306,1,1737,2465, +16,0,306,1,242, +2466,16,0,306,1, +478,1583,1,1001,1588, +1,1002,1593,1,27, +2467,19,598,1,27, +2468,5,95,1,256, +2469,16,0,596,1, +1261,2470,16,0,596, +1,509,2471,16,0, +596,1,1515,2472,16, +0,596,1,2021,718, +1,1775,2473,16,0, +596,1,2029,725,1, +2030,731,1,2031,736, +1,2032,741,1,2033, +746,1,277,2474,16, +0,596,1,2035,752, +1,2037,757,1,2039, +762,1,32,2475,16, +0,596,1,2041,768, +1,2293,2476,16,0, +596,1,2043,774,1, +2045,779,1,41,2477, +16,0,596,1,1297, +2478,16,0,596,1, +43,2479,16,0,596, +1,1803,787,1,1804, +2480,16,0,596,1, +299,2481,16,0,596, +1,52,2482,16,0, +596,1,2318,2483,16, +0,596,1,62,2484, +16,0,596,1,2075, +2485,16,0,596,1, +1574,799,1,71,2486, +16,0,596,1,76, +2487,16,0,596,1, +1834,2488,16,0,596, +1,2337,2489,16,0, +596,1,79,2490,16, +0,596,1,1335,2491, +16,0,596,1,322, +2492,16,0,596,1, +85,2493,16,0,596, +1,89,2494,16,0, +596,1,346,2495,16, +0,596,1,2105,814, +1,2106,2496,16,0, +596,1,97,2497,16, +0,596,1,1860,821, +1,2364,827,1,102, +2498,16,0,596,1, +112,2499,16,0,596, +1,1117,2500,16,0, +596,1,1873,835,1, +1876,2501,16,0,596, +1,124,2502,16,0, +596,1,2136,842,1, +381,2503,16,0,596, +1,525,2504,16,0, +596,1,137,2505,16, +0,596,1,1901,2506, +16,0,596,1,2658, +2507,16,0,596,1, +1153,2508,16,0,596, +1,151,2509,16,0, +596,1,1407,2510,16, +0,596,1,1659,2511, +16,0,596,1,2413, +2512,16,0,596,1, +406,2513,16,0,596, +1,1371,2514,16,0, +596,1,166,2515,16, +0,596,1,1622,2516, +16,0,596,1,1931, +861,1,1933,2517,16, +0,596,1,431,2518, +16,0,596,1,1585, 2519,16,0,596,1, -1901,2520,16,0,596, -1,2658,2521,16,0, -596,1,1153,2522,16, -0,596,1,151,2523, -16,0,596,1,1407, +182,2520,16,0,596, +1,1189,2521,16,0, +596,1,1443,2522,16, +0,596,1,1695,2523, +16,0,596,1,2198, 2524,16,0,596,1, -1659,2525,16,0,596, -1,2413,2526,16,0, -596,1,406,2527,16, -0,596,1,1371,2528, -16,0,596,1,166, +447,2525,16,0,596, +1,2458,876,1,2459, +882,1,1958,2526,16, +0,596,1,2462,889, +1,1657,894,1,2464, +899,1,199,2527,16, +0,596,1,459,2528, +16,0,596,1,462, 2529,16,0,596,1, -1622,2530,16,0,596, -1,1931,861,1,1933, +217,2530,16,0,596, +1,2227,908,1,1225, 2531,16,0,596,1, -431,2532,16,0,596, -1,1585,2533,16,0, -596,1,182,2534,16, -0,596,1,1189,2535, -16,0,596,1,1443, -2536,16,0,596,1, -1695,2537,16,0,596, -1,2198,2538,16,0, -596,1,447,2539,16, -0,596,1,2458,876, -1,2459,882,1,1958, -2540,16,0,596,1, -2462,889,1,1657,894, -1,2464,899,1,199, -2541,16,0,596,1, -459,2542,16,0,596, -1,462,2543,16,0, -596,1,217,2544,16, -0,596,1,2227,908, -1,1225,2545,16,0, -596,1,1479,2546,16, -0,596,1,1731,2547, -16,0,596,1,1989, -916,1,1990,2548,16, -0,596,1,236,2549, -16,0,596,1,1756, -2550,16,0,596,1, -28,2551,19,629,1, -28,2552,5,60,1, -328,1302,1,223,1533, -1,1096,1312,1,118, -1355,1,883,1397,1, -525,1216,1,1001,1588, -1,130,1414,1,459, -1688,1,1114,1343,1, -352,1349,1,447,1511, -1,464,1683,1,1011, -1102,1,1013,1258,1, -242,1578,1,143,1419, -1,40,1177,1,41, -1659,1,42,1662,1, -479,1559,1,44,1183, -1,481,1646,1,373, -1409,1,47,1184,1, -157,1443,1,49,1196, -1,50,1201,1,48, -1190,1,379,1386,1, -380,1391,1,51,1206, -1,476,1543,1,371, -1365,1,478,1583,1, -1048,1344,1,375,1376, -1,172,1469,1,262, -1119,1,283,1172,1, -63,1222,1,67,1233, -1,68,1238,1,69, -1243,1,66,1228,1, -461,2553,16,0,627, -1,74,1253,1,377, -1381,1,1002,1593,1, -70,1248,1,188,1518, -1,82,1280,1,305, -1211,1,477,1549,1, -827,1331,1,93,1318, -1,480,1564,1,205, -1523,1,942,1490,1, -107,1338,1,29,2554, -19,280,1,29,2555, -5,84,1,1011,1102, -1,1012,2556,16,0, -278,1,1013,1258,1, -262,1119,1,1267,2557, -16,0,278,1,515, -2558,16,0,278,1, -1521,2559,16,0,278, -1,525,1216,1,283, -1172,1,2299,2560,16, -0,278,1,42,2561, -16,0,278,1,40, -1177,1,44,1183,1, -47,1184,1,1303,2562, -16,0,278,1,1555, -2563,16,0,278,1, -50,1201,1,48,1190, -1,49,1196,1,51, -1206,1,63,1222,1, -305,1211,1,66,1228, +1479,2532,16,0,596, +1,1731,2533,16,0, +596,1,1989,916,1, +1990,2534,16,0,596, +1,236,2535,16,0, +596,1,1756,2536,16, +0,596,1,28,2537, +19,629,1,28,2538, +5,60,1,328,1302, +1,223,1533,1,1096, +1312,1,118,1355,1, +883,1397,1,525,1216, +1,1001,1588,1,130, +1414,1,459,1688,1, +1114,1343,1,352,1349, +1,447,1511,1,464, +1683,1,1011,1102,1, +1013,1258,1,242,1578, +1,143,1419,1,40, +1177,1,41,1659,1, +42,1662,1,479,1559, +1,44,1183,1,481, +1646,1,373,1409,1, +47,1184,1,157,1443, +1,49,1196,1,50, +1201,1,48,1190,1, +379,1386,1,380,1391, +1,51,1206,1,476, +1543,1,371,1365,1, +478,1583,1,1048,1344, +1,375,1376,1,172, +1469,1,262,1119,1, +283,1172,1,63,1222, 1,67,1233,1,68, 1238,1,69,1243,1, -70,1248,1,73,2564, -16,0,278,1,74, -1253,1,328,1302,1, -1048,1344,1,82,2565, -16,0,278,1,1840, -2566,16,0,278,1, -1591,2567,16,0,278, -1,1341,2568,16,0, +66,1228,1,461,2539, +16,0,627,1,74, +1253,1,377,1381,1, +1002,1593,1,70,1248, +1,188,1518,1,82, +1280,1,305,1211,1, +477,1549,1,827,1331, +1,93,1318,1,480, +1564,1,205,1523,1, +942,1490,1,107,1338, +1,29,2540,19,280, +1,29,2541,5,84, +1,1011,1102,1,1012, +2542,16,0,278,1, +1013,1258,1,262,1119, +1,1267,2543,16,0, +278,1,515,2544,16, +0,278,1,1521,2545, +16,0,278,1,525, +1216,1,283,1172,1, +2299,2546,16,0,278, +1,42,2547,16,0, +278,1,40,1177,1, +44,1183,1,47,1184, +1,1303,2548,16,0, +278,1,1555,2549,16, +0,278,1,50,1201, +1,48,1190,1,49, +1196,1,51,1206,1, +63,1222,1,305,1211, +1,66,1228,1,67, +1233,1,68,1238,1, +69,1243,1,70,1248, +1,73,2550,16,0, +278,1,74,1253,1, +328,1302,1,1048,1344, +1,82,1280,1,1840, +2551,16,0,278,1, +1591,2552,16,0,278, +1,1341,2553,16,0, 278,1,1096,1312,1, 93,1318,1,352,1349, -1,107,2569,16,0, -278,1,1114,1343,1, -118,1355,1,1123,2570, -16,0,278,1,371, -1365,1,1628,2571,16, -0,278,1,375,1376, -1,1882,2572,16,0, -278,1,377,1381,1, -379,1386,1,380,1391, -1,883,2573,16,0, -278,1,373,1409,1, -130,1414,1,143,1419, -1,387,2574,16,0, -278,1,2664,2575,16, -0,278,1,1159,2576, -16,0,278,1,157, -1443,1,1413,2577,16, -0,278,1,1665,2578, -16,0,278,1,412, -2579,16,0,278,1, -1377,2580,16,0,278, -1,172,1469,1,1939, -2581,16,0,278,1, -437,2582,16,0,278, -1,188,1518,1,942, -1490,1,1195,2583,16, -0,278,1,1449,2584, -16,0,278,1,1701, -2585,16,0,278,1, -447,1511,1,205,2586, -16,0,278,1,827, -2587,16,0,278,1, -223,2588,16,0,278, -1,476,1543,1,477, -1549,1,1231,2589,16, -0,278,1,479,1559, -1,480,1564,1,1485, -2590,16,0,278,1, -1737,2591,16,0,278, -1,242,2592,16,0, -278,1,478,1583,1, -1001,1588,1,1002,1593, -1,30,2593,19,268, -1,30,2594,5,84, -1,1011,1102,1,1012, -2595,16,0,266,1, -1013,1258,1,262,1119, -1,1267,2596,16,0, -266,1,515,2597,16, -0,266,1,1521,2598, -16,0,266,1,525, -1216,1,283,1172,1, -2299,2599,16,0,266, -1,42,2600,16,0, -266,1,40,1177,1, -44,1183,1,47,1184, -1,1303,2601,16,0, -266,1,1555,2602,16, -0,266,1,50,1201, -1,48,1190,1,49, -1196,1,51,1206,1, -63,1222,1,305,1211, -1,66,1228,1,67, -1233,1,68,1238,1, -69,1243,1,70,1248, -1,73,2603,16,0, -266,1,74,1253,1, -328,1302,1,1048,1344, -1,82,2604,16,0, -266,1,1840,2605,16, -0,266,1,1591,2606, -16,0,266,1,1341, -2607,16,0,266,1, -1096,1312,1,93,1318, -1,352,1349,1,107, -2608,16,0,266,1, -1114,1343,1,118,1355, -1,1123,2609,16,0, -266,1,371,1365,1, -1628,2610,16,0,266, -1,375,1376,1,1882, -2611,16,0,266,1, -377,1381,1,379,1386, -1,380,1391,1,883, -2612,16,0,266,1, -373,1409,1,130,1414, -1,143,1419,1,387, -2613,16,0,266,1, -2664,2614,16,0,266, -1,1159,2615,16,0, -266,1,157,1443,1, -1413,2616,16,0,266, -1,1665,2617,16,0, -266,1,412,2618,16, -0,266,1,1377,2619, -16,0,266,1,172, -1469,1,1939,2620,16, -0,266,1,437,2621, -16,0,266,1,188, -1518,1,942,1490,1, -1195,2622,16,0,266, -1,1449,2623,16,0, -266,1,1701,2624,16, -0,266,1,447,1511, -1,205,2625,16,0, -266,1,827,2626,16, -0,266,1,223,2627, -16,0,266,1,476, -1543,1,477,1549,1, -1231,2628,16,0,266, -1,479,1559,1,480, -1564,1,1485,2629,16, -0,266,1,1737,2630, -16,0,266,1,242, -2631,16,0,266,1, -478,1583,1,1001,1588, -1,1002,1593,1,31, -2632,19,253,1,31, -2633,5,84,1,1011, -1102,1,1012,2634,16, -0,251,1,1013,1258, -1,262,1119,1,1267, -2635,16,0,251,1, -515,2636,16,0,251, -1,1521,2637,16,0, -251,1,525,1216,1, -283,1172,1,2299,2638, -16,0,251,1,42, -2639,16,0,251,1, -40,1177,1,44,1183, -1,47,1184,1,1303, -2640,16,0,251,1, -1555,2641,16,0,251, -1,50,1201,1,48, -1190,1,49,1196,1, -51,1206,1,63,1222, -1,305,1211,1,66, -1228,1,67,1233,1, -68,1238,1,69,1243, -1,70,1248,1,73, -2642,16,0,251,1, -74,1253,1,328,1302, -1,1048,1344,1,82, -2643,16,0,251,1, -1840,2644,16,0,251, -1,1591,2645,16,0, -251,1,1341,2646,16, -0,251,1,1096,1312, -1,93,1318,1,352, -1349,1,107,2647,16, -0,251,1,1114,1343, -1,118,1355,1,1123, -2648,16,0,251,1, -371,1365,1,1628,2649, -16,0,251,1,375, -1376,1,1882,2650,16, -0,251,1,377,1381, -1,379,1386,1,380, -1391,1,883,2651,16, -0,251,1,373,1409, -1,130,1414,1,143, -2652,16,0,251,1, -387,2653,16,0,251, -1,2664,2654,16,0, -251,1,1159,2655,16, -0,251,1,157,2656, -16,0,251,1,1413, -2657,16,0,251,1, -1665,2658,16,0,251, -1,412,2659,16,0, -251,1,1377,2660,16, -0,251,1,172,1469, -1,1939,2661,16,0, -251,1,437,2662,16, -0,251,1,188,1518, +1,107,1338,1,1114, +1343,1,118,1355,1, +1123,2554,16,0,278, +1,371,1365,1,1628, +2555,16,0,278,1, +375,1376,1,1882,2556, +16,0,278,1,377, +1381,1,379,1386,1, +380,1391,1,883,2557, +16,0,278,1,373, +1409,1,130,1414,1, +143,1419,1,387,2558, +16,0,278,1,2664, +2559,16,0,278,1, +1159,2560,16,0,278, +1,157,1443,1,1413, +2561,16,0,278,1, +1665,2562,16,0,278, +1,412,2563,16,0, +278,1,1377,2564,16, +0,278,1,172,1469, +1,1939,2565,16,0, +278,1,437,2566,16, +0,278,1,188,1518, 1,942,1490,1,1195, -2663,16,0,251,1, -1449,2664,16,0,251, -1,1701,2665,16,0, -251,1,447,1511,1, -205,2666,16,0,251, -1,827,2667,16,0, -251,1,223,2668,16, -0,251,1,476,1543, +2567,16,0,278,1, +1449,2568,16,0,278, +1,1701,2569,16,0, +278,1,447,1511,1, +205,2570,16,0,278, +1,827,2571,16,0, +278,1,223,2572,16, +0,278,1,476,1543, 1,477,1549,1,1231, -2669,16,0,251,1, +2573,16,0,278,1, 479,1559,1,480,1564, -1,1485,2670,16,0, -251,1,1737,2671,16, -0,251,1,242,2672, -16,0,251,1,478, +1,1485,2574,16,0, +278,1,1737,2575,16, +0,278,1,242,2576, +16,0,278,1,478, 1583,1,1001,1588,1, -1002,1593,1,32,2673, -19,246,1,32,2674, +1002,1593,1,30,2577, +19,268,1,30,2578, 5,84,1,1011,1102, -1,1012,2675,16,0, -244,1,1013,1258,1, -262,1119,1,1267,2676, -16,0,244,1,515, -2677,16,0,244,1, -1521,2678,16,0,244, +1,1012,2579,16,0, +266,1,1013,1258,1, +262,1119,1,1267,2580, +16,0,266,1,515, +2581,16,0,266,1, +1521,2582,16,0,266, 1,525,1216,1,283, -1172,1,2299,2679,16, -0,244,1,42,2680, -16,0,244,1,40, +1172,1,2299,2583,16, +0,266,1,42,2584, +16,0,266,1,40, 1177,1,44,1183,1, -47,1184,1,1303,2681, -16,0,244,1,1555, -2682,16,0,244,1, +47,1184,1,1303,2585, +16,0,266,1,1555, +2586,16,0,266,1, 50,1201,1,48,1190, 1,49,1196,1,51, 1206,1,63,1222,1, 305,1211,1,66,1228, 1,67,1233,1,68, 1238,1,69,1243,1, -70,1248,1,73,2683, +70,1248,1,73,2587, +16,0,266,1,74, +1253,1,328,1302,1, +1048,1344,1,82,1280, +1,1840,2588,16,0, +266,1,1591,2589,16, +0,266,1,1341,2590, +16,0,266,1,1096, +1312,1,93,1318,1, +352,1349,1,107,1338, +1,1114,1343,1,118, +1355,1,1123,2591,16, +0,266,1,371,1365, +1,1628,2592,16,0, +266,1,375,1376,1, +1882,2593,16,0,266, +1,377,1381,1,379, +1386,1,380,1391,1, +883,2594,16,0,266, +1,373,1409,1,130, +1414,1,143,1419,1, +387,2595,16,0,266, +1,2664,2596,16,0, +266,1,1159,2597,16, +0,266,1,157,1443, +1,1413,2598,16,0, +266,1,1665,2599,16, +0,266,1,412,2600, +16,0,266,1,1377, +2601,16,0,266,1, +172,1469,1,1939,2602, +16,0,266,1,437, +2603,16,0,266,1, +188,1518,1,942,1490, +1,1195,2604,16,0, +266,1,1449,2605,16, +0,266,1,1701,2606, +16,0,266,1,447, +1511,1,205,2607,16, +0,266,1,827,2608, +16,0,266,1,223, +2609,16,0,266,1, +476,1543,1,477,1549, +1,1231,2610,16,0, +266,1,479,1559,1, +480,1564,1,1485,2611, +16,0,266,1,1737, +2612,16,0,266,1, +242,2613,16,0,266, +1,478,1583,1,1001, +1588,1,1002,1593,1, +31,2614,19,253,1, +31,2615,5,84,1, +1011,1102,1,1012,2616, +16,0,251,1,1013, +1258,1,262,1119,1, +1267,2617,16,0,251, +1,515,2618,16,0, +251,1,1521,2619,16, +0,251,1,525,1216, +1,283,1172,1,2299, +2620,16,0,251,1, +42,2621,16,0,251, +1,40,1177,1,44, +1183,1,47,1184,1, +1303,2622,16,0,251, +1,1555,2623,16,0, +251,1,50,1201,1, +48,1190,1,49,1196, +1,51,1206,1,63, +1222,1,305,1211,1, +66,1228,1,67,1233, +1,68,1238,1,69, +1243,1,70,1248,1, +73,2624,16,0,251, +1,74,1253,1,328, +1302,1,1048,1344,1, +82,1280,1,1840,2625, +16,0,251,1,1591, +2626,16,0,251,1, +1341,2627,16,0,251, +1,1096,1312,1,93, +1318,1,352,1349,1, +107,1338,1,1114,1343, +1,118,1355,1,1123, +2628,16,0,251,1, +371,1365,1,1628,2629, +16,0,251,1,375, +1376,1,1882,2630,16, +0,251,1,377,1381, +1,379,1386,1,380, +1391,1,883,2631,16, +0,251,1,373,1409, +1,130,1414,1,143, +2632,16,0,251,1, +387,2633,16,0,251, +1,2664,2634,16,0, +251,1,1159,2635,16, +0,251,1,157,2636, +16,0,251,1,1413, +2637,16,0,251,1, +1665,2638,16,0,251, +1,412,2639,16,0, +251,1,1377,2640,16, +0,251,1,172,1469, +1,1939,2641,16,0, +251,1,437,2642,16, +0,251,1,188,1518, +1,942,1490,1,1195, +2643,16,0,251,1, +1449,2644,16,0,251, +1,1701,2645,16,0, +251,1,447,1511,1, +205,2646,16,0,251, +1,827,2647,16,0, +251,1,223,2648,16, +0,251,1,476,1543, +1,477,1549,1,1231, +2649,16,0,251,1, +479,1559,1,480,1564, +1,1485,2650,16,0, +251,1,1737,2651,16, +0,251,1,242,2652, +16,0,251,1,478, +1583,1,1001,1588,1, +1002,1593,1,32,2653, +19,246,1,32,2654, +5,84,1,1011,1102, +1,1012,2655,16,0, +244,1,1013,1258,1, +262,1119,1,1267,2656, +16,0,244,1,515, +2657,16,0,244,1, +1521,2658,16,0,244, +1,525,1216,1,283, +1172,1,2299,2659,16, +0,244,1,42,2660, +16,0,244,1,40, +1177,1,44,1183,1, +47,1184,1,1303,2661, +16,0,244,1,1555, +2662,16,0,244,1, +50,1201,1,48,1190, +1,49,1196,1,51, +1206,1,63,1222,1, +305,1211,1,66,1228, +1,67,1233,1,68, +1238,1,69,1243,1, +70,1248,1,73,2663, 16,0,244,1,74, 1253,1,328,1302,1, -1048,1344,1,82,2684, -16,0,244,1,1840, -2685,16,0,244,1, -1591,2686,16,0,244, -1,1341,2687,16,0, -244,1,1096,1312,1, -93,1318,1,352,1349, -1,107,2688,16,0, -244,1,1114,1343,1, -118,1355,1,1123,2689, -16,0,244,1,371, -1365,1,1628,2690,16, -0,244,1,375,1376, -1,1882,2691,16,0, -244,1,377,1381,1, -379,1386,1,380,1391, -1,883,2692,16,0, -244,1,373,1409,1, -130,1414,1,143,2693, -16,0,244,1,387, -2694,16,0,244,1, -2664,2695,16,0,244, -1,1159,2696,16,0, -244,1,157,2697,16, -0,244,1,1413,2698, -16,0,244,1,1665, -2699,16,0,244,1, -412,2700,16,0,244, -1,1377,2701,16,0, -244,1,172,1469,1, -1939,2702,16,0,244, -1,437,2703,16,0, -244,1,188,1518,1, -942,1490,1,1195,2704, -16,0,244,1,1449, -2705,16,0,244,1, -1701,2706,16,0,244, -1,447,1511,1,205, -2707,16,0,244,1, -827,2708,16,0,244, -1,223,2709,16,0, -244,1,476,1543,1, -477,1549,1,1231,2710, -16,0,244,1,479, -1559,1,480,1564,1, -1485,2711,16,0,244, -1,1737,2712,16,0, -244,1,242,2713,16, -0,244,1,478,1583, -1,1001,1588,1,1002, -1593,1,33,2714,19, -332,1,33,2715,5, -84,1,1011,1102,1, -1012,2716,16,0,330, -1,1013,1258,1,262, -1119,1,1267,2717,16, -0,330,1,515,2718, -16,0,330,1,1521, -2719,16,0,330,1, -525,1216,1,283,1172, -1,2299,2720,16,0, -330,1,42,2721,16, -0,330,1,40,1177, -1,44,1183,1,47, -1184,1,1303,2722,16, -0,330,1,1555,2723, -16,0,330,1,50, -1201,1,48,1190,1, -49,1196,1,51,1206, -1,63,1222,1,305, -1211,1,66,1228,1, -67,1233,1,68,1238, -1,69,1243,1,70, -1248,1,73,2724,16, -0,330,1,74,1253, -1,328,1302,1,1048, -1344,1,82,2725,16, -0,330,1,1840,2726, -16,0,330,1,1591, -2727,16,0,330,1, -1341,2728,16,0,330, -1,1096,1312,1,93, -1318,1,352,1349,1, -107,2729,16,0,330, +1048,1344,1,82,1280, +1,1840,2664,16,0, +244,1,1591,2665,16, +0,244,1,1341,2666, +16,0,244,1,1096, +1312,1,93,1318,1, +352,1349,1,107,1338, 1,1114,1343,1,118, -1355,1,1123,2730,16, -0,330,1,371,1365, -1,1628,2731,16,0, -330,1,375,1376,1, -1882,2732,16,0,330, +1355,1,1123,2667,16, +0,244,1,371,1365, +1,1628,2668,16,0, +244,1,375,1376,1, +1882,2669,16,0,244, 1,377,1381,1,379, 1386,1,380,1391,1, -883,2733,16,0,330, +883,2670,16,0,244, 1,373,1409,1,130, -1414,1,143,1419,1, -387,2734,16,0,330, -1,2664,2735,16,0, -330,1,1159,2736,16, -0,330,1,157,1443, -1,1413,2737,16,0, -330,1,1665,2738,16, -0,330,1,412,2739, -16,0,330,1,1377, -2740,16,0,330,1, -172,1469,1,1939,2741, -16,0,330,1,437, -2742,16,0,330,1, -188,1518,1,942,1490, -1,1195,2743,16,0, -330,1,1449,2744,16, -0,330,1,1701,2745, -16,0,330,1,447, -1511,1,205,2746,16, -0,330,1,827,2747, -16,0,330,1,223, -2748,16,0,330,1, -476,1543,1,477,1549, -1,1231,2749,16,0, -330,1,479,1559,1, -480,1564,1,1485,2750, -16,0,330,1,1737, -2751,16,0,330,1, -242,1578,1,478,1583, -1,1001,1588,1,1002, -1593,1,34,2752,19, -322,1,34,2753,5, -84,1,1011,1102,1, -1012,2754,16,0,320, -1,1013,1258,1,262, -1119,1,1267,2755,16, -0,320,1,515,2756, -16,0,320,1,1521, -2757,16,0,320,1, -525,1216,1,283,1172, -1,2299,2758,16,0, -320,1,42,2759,16, -0,320,1,40,1177, -1,44,1183,1,47, -1184,1,1303,2760,16, -0,320,1,1555,2761, -16,0,320,1,50, -1201,1,48,1190,1, -49,1196,1,51,1206, -1,63,1222,1,305, -1211,1,66,1228,1, -67,1233,1,68,1238, -1,69,1243,1,70, -1248,1,73,2762,16, -0,320,1,74,1253, -1,328,1302,1,1048, -1344,1,82,2763,16, -0,320,1,1840,2764, -16,0,320,1,1591, -2765,16,0,320,1, -1341,2766,16,0,320, -1,1096,1312,1,93, -1318,1,352,1349,1, -107,2767,16,0,320, -1,1114,1343,1,118, -1355,1,1123,2768,16, -0,320,1,371,1365, -1,1628,2769,16,0, -320,1,375,1376,1, -1882,2770,16,0,320, -1,377,1381,1,379, -1386,1,380,1391,1, -883,2771,16,0,320, -1,373,1409,1,130, -1414,1,143,1419,1, -387,2772,16,0,320, -1,2664,2773,16,0, -320,1,1159,2774,16, -0,320,1,157,1443, -1,1413,2775,16,0, -320,1,1665,2776,16, -0,320,1,412,2777, -16,0,320,1,1377, -2778,16,0,320,1, -172,1469,1,1939,2779, -16,0,320,1,437, -2780,16,0,320,1, -188,1518,1,942,1490, -1,1195,2781,16,0, -320,1,1449,2782,16, -0,320,1,1701,2783, -16,0,320,1,447, -1511,1,205,1523,1, -827,2784,16,0,320, -1,223,1533,1,476, -1543,1,477,1549,1, -1231,2785,16,0,320, -1,479,1559,1,480, -1564,1,1485,2786,16, -0,320,1,1737,2787, -16,0,320,1,242, -1578,1,478,1583,1, +1414,1,143,2671,16, +0,244,1,387,2672, +16,0,244,1,2664, +2673,16,0,244,1, +1159,2674,16,0,244, +1,157,2675,16,0, +244,1,1413,2676,16, +0,244,1,1665,2677, +16,0,244,1,412, +2678,16,0,244,1, +1377,2679,16,0,244, +1,172,1469,1,1939, +2680,16,0,244,1, +437,2681,16,0,244, +1,188,1518,1,942, +1490,1,1195,2682,16, +0,244,1,1449,2683, +16,0,244,1,1701, +2684,16,0,244,1, +447,1511,1,205,2685, +16,0,244,1,827, +2686,16,0,244,1, +223,2687,16,0,244, +1,476,1543,1,477, +1549,1,1231,2688,16, +0,244,1,479,1559, +1,480,1564,1,1485, +2689,16,0,244,1, +1737,2690,16,0,244, +1,242,2691,16,0, +244,1,478,1583,1, 1001,1588,1,1002,1593, -1,35,2788,19,311, -1,35,2789,5,84, +1,33,2692,19,332, +1,33,2693,5,84, 1,1011,1102,1,1012, -2790,16,0,309,1, +2694,16,0,330,1, 1013,1258,1,262,1119, -1,1267,2791,16,0, -309,1,515,2792,16, -0,309,1,1521,2793, -16,0,309,1,525, +1,1267,2695,16,0, +330,1,515,2696,16, +0,330,1,1521,2697, +16,0,330,1,525, 1216,1,283,1172,1, -2299,2794,16,0,309, -1,42,2795,16,0, -309,1,40,1177,1, +2299,2698,16,0,330, +1,42,2699,16,0, +330,1,40,1177,1, 44,1183,1,47,1184, -1,1303,2796,16,0, -309,1,1555,2797,16, -0,309,1,50,1201, +1,1303,2700,16,0, +330,1,1555,2701,16, +0,330,1,50,1201, 1,48,1190,1,49, 1196,1,51,1206,1, 63,1222,1,305,1211, 1,66,1228,1,67, 1233,1,68,1238,1, 69,1243,1,70,1248, -1,73,2798,16,0, -309,1,74,1253,1, +1,73,2702,16,0, +330,1,74,1253,1, 328,1302,1,1048,1344, -1,82,2799,16,0, -309,1,1840,2800,16, -0,309,1,1591,2801, -16,0,309,1,1341, -2802,16,0,309,1, -1096,1312,1,93,1318, -1,352,1349,1,107, -2803,16,0,309,1, -1114,1343,1,118,1355, -1,1123,2804,16,0, -309,1,371,1365,1, -1628,2805,16,0,309, -1,375,1376,1,1882, -2806,16,0,309,1, -377,1381,1,379,1386, -1,380,1391,1,883, -2807,16,0,309,1, -373,1409,1,130,1414, -1,143,1419,1,387, -2808,16,0,309,1, -2664,2809,16,0,309, -1,1159,2810,16,0, -309,1,157,1443,1, -1413,2811,16,0,309, -1,1665,2812,16,0, -309,1,412,2813,16, -0,309,1,1377,2814, -16,0,309,1,172, -1469,1,1939,2815,16, -0,309,1,437,2816, -16,0,309,1,188, -1518,1,942,1490,1, -1195,2817,16,0,309, -1,1449,2818,16,0, -309,1,1701,2819,16, -0,309,1,447,1511, -1,205,1523,1,827, -2820,16,0,309,1, -223,2821,16,0,309, +1,82,1280,1,1840, +2703,16,0,330,1, +1591,2704,16,0,330, +1,1341,2705,16,0, +330,1,1096,1312,1, +93,1318,1,352,1349, +1,107,1338,1,1114, +1343,1,118,1355,1, +1123,2706,16,0,330, +1,371,1365,1,1628, +2707,16,0,330,1, +375,1376,1,1882,2708, +16,0,330,1,377, +1381,1,379,1386,1, +380,1391,1,883,2709, +16,0,330,1,373, +1409,1,130,1414,1, +143,1419,1,387,2710, +16,0,330,1,2664, +2711,16,0,330,1, +1159,2712,16,0,330, +1,157,1443,1,1413, +2713,16,0,330,1, +1665,2714,16,0,330, +1,412,2715,16,0, +330,1,1377,2716,16, +0,330,1,172,1469, +1,1939,2717,16,0, +330,1,437,2718,16, +0,330,1,188,1518, +1,942,1490,1,1195, +2719,16,0,330,1, +1449,2720,16,0,330, +1,1701,2721,16,0, +330,1,447,1511,1, +205,2722,16,0,330, +1,827,2723,16,0, +330,1,223,2724,16, +0,330,1,476,1543, +1,477,1549,1,1231, +2725,16,0,330,1, +479,1559,1,480,1564, +1,1485,2726,16,0, +330,1,1737,2727,16, +0,330,1,242,1578, +1,478,1583,1,1001, +1588,1,1002,1593,1, +34,2728,19,322,1, +34,2729,5,84,1, +1011,1102,1,1012,2730, +16,0,320,1,1013, +1258,1,262,1119,1, +1267,2731,16,0,320, +1,515,2732,16,0, +320,1,1521,2733,16, +0,320,1,525,1216, +1,283,1172,1,2299, +2734,16,0,320,1, +42,2735,16,0,320, +1,40,1177,1,44, +1183,1,47,1184,1, +1303,2736,16,0,320, +1,1555,2737,16,0, +320,1,50,1201,1, +48,1190,1,49,1196, +1,51,1206,1,63, +1222,1,305,1211,1, +66,1228,1,67,1233, +1,68,1238,1,69, +1243,1,70,1248,1, +73,2738,16,0,320, +1,74,1253,1,328, +1302,1,1048,1344,1, +82,1280,1,1840,2739, +16,0,320,1,1591, +2740,16,0,320,1, +1341,2741,16,0,320, +1,1096,1312,1,93, +1318,1,352,1349,1, +107,1338,1,1114,1343, +1,118,1355,1,1123, +2742,16,0,320,1, +371,1365,1,1628,2743, +16,0,320,1,375, +1376,1,1882,2744,16, +0,320,1,377,1381, +1,379,1386,1,380, +1391,1,883,2745,16, +0,320,1,373,1409, +1,130,1414,1,143, +1419,1,387,2746,16, +0,320,1,2664,2747, +16,0,320,1,1159, +2748,16,0,320,1, +157,1443,1,1413,2749, +16,0,320,1,1665, +2750,16,0,320,1, +412,2751,16,0,320, +1,1377,2752,16,0, +320,1,172,1469,1, +1939,2753,16,0,320, +1,437,2754,16,0, +320,1,188,1518,1, +942,1490,1,1195,2755, +16,0,320,1,1449, +2756,16,0,320,1, +1701,2757,16,0,320, +1,447,1511,1,205, +1523,1,827,2758,16, +0,320,1,223,1533, 1,476,1543,1,477, -1549,1,1231,2822,16, -0,309,1,479,1559, +1549,1,1231,2759,16, +0,320,1,479,1559, 1,480,1564,1,1485, -2823,16,0,309,1, -1737,2824,16,0,309, +2760,16,0,320,1, +1737,2761,16,0,320, 1,242,1578,1,478, 1583,1,1001,1588,1, -1002,1593,1,36,2825, -19,216,1,36,2826, -5,94,1,256,2827, -16,0,214,1,1261, +1002,1593,1,35,2762, +19,311,1,35,2763, +5,84,1,1011,1102, +1,1012,2764,16,0, +309,1,1013,1258,1, +262,1119,1,1267,2765, +16,0,309,1,515, +2766,16,0,309,1, +1521,2767,16,0,309, +1,525,1216,1,283, +1172,1,2299,2768,16, +0,309,1,42,2769, +16,0,309,1,40, +1177,1,44,1183,1, +47,1184,1,1303,2770, +16,0,309,1,1555, +2771,16,0,309,1, +50,1201,1,48,1190, +1,49,1196,1,51, +1206,1,63,1222,1, +305,1211,1,66,1228, +1,67,1233,1,68, +1238,1,69,1243,1, +70,1248,1,73,2772, +16,0,309,1,74, +1253,1,328,1302,1, +1048,1344,1,82,1280, +1,1840,2773,16,0, +309,1,1591,2774,16, +0,309,1,1341,2775, +16,0,309,1,1096, +1312,1,93,1318,1, +352,1349,1,107,1338, +1,1114,1343,1,118, +1355,1,1123,2776,16, +0,309,1,371,1365, +1,1628,2777,16,0, +309,1,375,1376,1, +1882,2778,16,0,309, +1,377,1381,1,379, +1386,1,380,1391,1, +883,2779,16,0,309, +1,373,1409,1,130, +1414,1,143,1419,1, +387,2780,16,0,309, +1,2664,2781,16,0, +309,1,1159,2782,16, +0,309,1,157,1443, +1,1413,2783,16,0, +309,1,1665,2784,16, +0,309,1,412,2785, +16,0,309,1,1377, +2786,16,0,309,1, +172,1469,1,1939,2787, +16,0,309,1,437, +2788,16,0,309,1, +188,1518,1,942,1490, +1,1195,2789,16,0, +309,1,1449,2790,16, +0,309,1,1701,2791, +16,0,309,1,447, +1511,1,205,1523,1, +827,2792,16,0,309, +1,223,2793,16,0, +309,1,476,1543,1, +477,1549,1,1231,2794, +16,0,309,1,479, +1559,1,480,1564,1, +1485,2795,16,0,309, +1,1737,2796,16,0, +309,1,242,1578,1, +478,1583,1,1001,1588, +1,1002,1593,1,36, +2797,19,216,1,36, +2798,5,94,1,256, +2799,16,0,214,1, +1261,2800,16,0,214, +1,509,2801,16,0, +214,1,1515,2802,16, +0,214,1,2021,718, +1,1775,2803,16,0, +214,1,2029,725,1, +2030,731,1,2031,736, +1,2032,741,1,2033, +746,1,277,2804,16, +0,214,1,2035,752, +1,2037,757,1,2039, +762,1,32,2805,16, +0,214,1,2041,768, +1,2293,2806,16,0, +214,1,2043,774,1, +2045,779,1,41,2807, +16,0,214,1,1297, +2808,16,0,214,1, +43,2809,16,0,214, +1,1803,787,1,1804, +2810,16,0,214,1, +299,2811,16,0,214, +1,52,2812,16,0, +214,1,2318,2813,16, +0,214,1,2075,2814, +16,0,214,1,1574, +799,1,71,2815,16, +0,214,1,76,2816, +16,0,214,1,1834, +2817,16,0,214,1, +2337,2818,16,0,214, +1,79,2819,16,0, +214,1,1335,2820,16, +0,214,1,322,2821, +16,0,214,1,85, +2822,16,0,214,1, +89,2823,16,0,214, +1,346,2824,16,0, +214,1,2105,814,1, +2106,2825,16,0,214, +1,97,2826,16,0, +214,1,1860,821,1, +2364,827,1,102,2827, +16,0,214,1,112, 2828,16,0,214,1, -509,2829,16,0,214, -1,1515,2830,16,0, -214,1,2021,718,1, -1775,2831,16,0,214, -1,2029,725,1,2030, -731,1,2031,736,1, -2032,741,1,2033,746, -1,277,2832,16,0, -214,1,2035,752,1, -2037,757,1,2039,762, -1,32,2833,16,0, -214,1,2041,768,1, -2293,2834,16,0,214, -1,2043,774,1,2045, -779,1,41,2835,16, -0,214,1,1297,2836, -16,0,214,1,43, +1117,2829,16,0,214, +1,1873,835,1,1876, +2830,16,0,214,1, +124,2831,16,0,214, +1,2136,842,1,381, +2832,16,0,214,1, +525,2833,16,0,214, +1,137,2834,16,0, +214,1,1901,2835,16, +0,214,1,2658,2836, +16,0,214,1,1153, 2837,16,0,214,1, -1803,787,1,1804,2838, -16,0,214,1,299, -2839,16,0,214,1, -52,2840,16,0,214, -1,2318,2841,16,0, -214,1,2075,2842,16, -0,214,1,1574,799, -1,71,2843,16,0, -214,1,76,2844,16, -0,214,1,1834,2845, -16,0,214,1,2337, -2846,16,0,214,1, -79,2847,16,0,214, -1,1335,2848,16,0, -214,1,322,2849,16, -0,214,1,85,2850, -16,0,214,1,89, -2851,16,0,214,1, -346,2852,16,0,214, -1,2105,814,1,2106, -2853,16,0,214,1, -97,2854,16,0,214, -1,1860,821,1,2364, -827,1,102,2855,16, -0,214,1,112,2856, -16,0,214,1,1117, -2857,16,0,214,1, -1873,835,1,1876,2858, -16,0,214,1,124, +151,2838,16,0,214, +1,1407,2839,16,0, +214,1,1659,2840,16, +0,214,1,2413,2841, +16,0,214,1,406, +2842,16,0,214,1, +1371,2843,16,0,214, +1,166,2844,16,0, +214,1,1622,2845,16, +0,214,1,1931,861, +1,1933,2846,16,0, +214,1,431,2847,16, +0,214,1,1585,2848, +16,0,214,1,182, +2849,16,0,214,1, +1189,2850,16,0,214, +1,1443,2851,16,0, +214,1,1695,2852,16, +0,214,1,2198,2853, +16,0,214,1,447, +2854,16,0,214,1, +2458,876,1,2459,882, +1,1958,2855,16,0, +214,1,2462,889,1, +1657,894,1,2464,899, +1,199,2856,16,0, +214,1,459,2857,16, +0,214,1,462,2858, +16,0,214,1,217, 2859,16,0,214,1, -2136,842,1,381,2860, -16,0,214,1,525, +2227,908,1,1225,2860, +16,0,214,1,1479, 2861,16,0,214,1, -137,2862,16,0,214, -1,1901,2863,16,0, -214,1,2658,2864,16, -0,214,1,1153,2865, -16,0,214,1,151, -2866,16,0,214,1, -1407,2867,16,0,214, -1,1659,2868,16,0, -214,1,2413,2869,16, -0,214,1,406,2870, -16,0,214,1,1371, -2871,16,0,214,1, -166,2872,16,0,214, -1,1622,2873,16,0, -214,1,1931,861,1, -1933,2874,16,0,214, -1,431,2875,16,0, -214,1,1585,2876,16, -0,214,1,182,2877, -16,0,214,1,1189, -2878,16,0,214,1, -1443,2879,16,0,214, -1,1695,2880,16,0, -214,1,2198,2881,16, -0,214,1,447,2882, -16,0,214,1,2458, -876,1,2459,882,1, -1958,2883,16,0,214, -1,2462,889,1,1657, -894,1,2464,899,1, -199,2884,16,0,214, -1,459,2885,16,0, -214,1,462,2886,16, -0,214,1,217,2887, -16,0,214,1,2227, -908,1,1225,2888,16, -0,214,1,1479,2889, -16,0,214,1,1731, -2890,16,0,214,1, -1989,916,1,1990,2891, -16,0,214,1,236, -2892,16,0,214,1, -1756,2893,16,0,214, -1,37,2894,19,233, -1,37,2895,5,94, -1,256,2896,16,0, -231,1,1261,2897,16, -0,231,1,509,2898, -16,0,231,1,1515, -2899,16,0,231,1, -2021,718,1,1775,2900, -16,0,231,1,2029, -725,1,2030,731,1, -2031,736,1,2032,741, -1,2033,746,1,277, -2901,16,0,231,1, -2035,752,1,2037,757, -1,2039,762,1,32, -2902,16,0,231,1, -2041,768,1,2293,2903, -16,0,231,1,2043, -774,1,2045,779,1, -41,2904,16,0,231, -1,1297,2905,16,0, -231,1,43,2906,16, -0,231,1,1803,787, -1,1804,2907,16,0, -231,1,299,2908,16, -0,231,1,52,2909, -16,0,231,1,2318, -2910,16,0,231,1, -2075,2911,16,0,231, -1,1574,799,1,71, -2912,16,0,231,1, -76,2913,16,0,231, -1,1834,2914,16,0, -231,1,2337,2915,16, -0,231,1,79,2916, -16,0,231,1,1335, -2917,16,0,231,1, -322,2918,16,0,231, -1,85,2919,16,0, -231,1,89,2920,16, -0,231,1,346,2921, -16,0,231,1,2105, -814,1,2106,2922,16, -0,231,1,97,2923, -16,0,231,1,1860, -821,1,2364,827,1, -102,2924,16,0,231, -1,112,2925,16,0, -231,1,1117,2926,16, -0,231,1,1873,835, -1,1876,2927,16,0, -231,1,124,2928,16, -0,231,1,2136,842, -1,381,2929,16,0, -231,1,525,2930,16, -0,231,1,137,2931, -16,0,231,1,1901, -2932,16,0,231,1, -2658,2933,16,0,231, -1,1153,2934,16,0, -231,1,151,2935,16, -0,231,1,1407,2936, -16,0,231,1,1659, -2937,16,0,231,1, -2413,2938,16,0,231, -1,406,2939,16,0, -231,1,1371,2940,16, -0,231,1,166,2941, -16,0,231,1,1622, -2942,16,0,231,1, -1931,861,1,1933,2943, -16,0,231,1,431, -2944,16,0,231,1, -1585,2945,16,0,231, -1,182,2946,16,0, -231,1,1189,2947,16, -0,231,1,1443,2948, -16,0,231,1,1695, -2949,16,0,231,1, -2198,2950,16,0,231, -1,447,2951,16,0, -231,1,2458,876,1, -2459,882,1,1958,2952, -16,0,231,1,2462, -889,1,1657,894,1, -2464,899,1,199,2953, -16,0,231,1,459, -2954,16,0,231,1, -462,2955,16,0,231, -1,217,2956,16,0, -231,1,2227,908,1, -1225,2957,16,0,231, -1,1479,2958,16,0, -231,1,1731,2959,16, -0,231,1,1989,916, -1,1990,2960,16,0, -231,1,236,2961,16, -0,231,1,1756,2962, -16,0,231,1,38, -2963,19,230,1,38, -2964,5,84,1,1011, -1102,1,1012,2965,16, -0,228,1,1013,1258, -1,262,1119,1,1267, -2966,16,0,228,1, -515,2967,16,0,228, -1,1521,2968,16,0, -228,1,525,1216,1, -283,1172,1,2299,2969, -16,0,228,1,42, -2970,16,0,228,1, -40,1177,1,44,1183, -1,47,1184,1,1303, -2971,16,0,228,1, -1555,2972,16,0,228, -1,50,1201,1,48, -1190,1,49,1196,1, -51,1206,1,63,1222, -1,305,1211,1,66, -1228,1,67,1233,1, -68,1238,1,69,1243, -1,70,1248,1,73, -2973,16,0,228,1, -74,1253,1,328,1302, -1,1048,1344,1,82, -2974,16,0,228,1, -1840,2975,16,0,228, -1,1591,2976,16,0, -228,1,1341,2977,16, -0,228,1,1096,1312, -1,93,1318,1,352, -1349,1,107,2978,16, -0,228,1,1114,1343, +1731,2862,16,0,214, +1,1989,916,1,1990, +2863,16,0,214,1, +236,2864,16,0,214, +1,1756,2865,16,0, +214,1,37,2866,19, +233,1,37,2867,5, +94,1,256,2868,16, +0,231,1,1261,2869, +16,0,231,1,509, +2870,16,0,231,1, +1515,2871,16,0,231, +1,2021,718,1,1775, +2872,16,0,231,1, +2029,725,1,2030,731, +1,2031,736,1,2032, +741,1,2033,746,1, +277,2873,16,0,231, +1,2035,752,1,2037, +757,1,2039,762,1, +32,2874,16,0,231, +1,2041,768,1,2293, +2875,16,0,231,1, +2043,774,1,2045,779, +1,41,2876,16,0, +231,1,1297,2877,16, +0,231,1,43,2878, +16,0,231,1,1803, +787,1,1804,2879,16, +0,231,1,299,2880, +16,0,231,1,52, +2881,16,0,231,1, +2318,2882,16,0,231, +1,2075,2883,16,0, +231,1,1574,799,1, +71,2884,16,0,231, +1,76,2885,16,0, +231,1,1834,2886,16, +0,231,1,2337,2887, +16,0,231,1,79, +2888,16,0,231,1, +1335,2889,16,0,231, +1,322,2890,16,0, +231,1,85,2891,16, +0,231,1,89,2892, +16,0,231,1,346, +2893,16,0,231,1, +2105,814,1,2106,2894, +16,0,231,1,97, +2895,16,0,231,1, +1860,821,1,2364,827, +1,102,2896,16,0, +231,1,112,2897,16, +0,231,1,1117,2898, +16,0,231,1,1873, +835,1,1876,2899,16, +0,231,1,124,2900, +16,0,231,1,2136, +842,1,381,2901,16, +0,231,1,525,2902, +16,0,231,1,137, +2903,16,0,231,1, +1901,2904,16,0,231, +1,2658,2905,16,0, +231,1,1153,2906,16, +0,231,1,151,2907, +16,0,231,1,1407, +2908,16,0,231,1, +1659,2909,16,0,231, +1,2413,2910,16,0, +231,1,406,2911,16, +0,231,1,1371,2912, +16,0,231,1,166, +2913,16,0,231,1, +1622,2914,16,0,231, +1,1931,861,1,1933, +2915,16,0,231,1, +431,2916,16,0,231, +1,1585,2917,16,0, +231,1,182,2918,16, +0,231,1,1189,2919, +16,0,231,1,1443, +2920,16,0,231,1, +1695,2921,16,0,231, +1,2198,2922,16,0, +231,1,447,2923,16, +0,231,1,2458,876, +1,2459,882,1,1958, +2924,16,0,231,1, +2462,889,1,1657,894, +1,2464,899,1,199, +2925,16,0,231,1, +459,2926,16,0,231, +1,462,2927,16,0, +231,1,217,2928,16, +0,231,1,2227,908, +1,1225,2929,16,0, +231,1,1479,2930,16, +0,231,1,1731,2931, +16,0,231,1,1989, +916,1,1990,2932,16, +0,231,1,236,2933, +16,0,231,1,1756, +2934,16,0,231,1, +38,2935,19,230,1, +38,2936,5,84,1, +1011,1102,1,1012,2937, +16,0,228,1,1013, +1258,1,262,1119,1, +1267,2938,16,0,228, +1,515,2939,16,0, +228,1,1521,2940,16, +0,228,1,525,1216, +1,283,1172,1,2299, +2941,16,0,228,1, +42,2942,16,0,228, +1,40,1177,1,44, +1183,1,47,1184,1, +1303,2943,16,0,228, +1,1555,2944,16,0, +228,1,50,1201,1, +48,1190,1,49,1196, +1,51,1206,1,63, +1222,1,305,1211,1, +66,1228,1,67,1233, +1,68,1238,1,69, +1243,1,70,1248,1, +73,2945,16,0,228, +1,74,1253,1,328, +1302,1,1048,1344,1, +82,1280,1,1840,2946, +16,0,228,1,1591, +2947,16,0,228,1, +1341,2948,16,0,228, +1,1096,1312,1,93, +1318,1,352,1349,1, +107,1338,1,1114,1343, 1,118,1355,1,1123, -2979,16,0,228,1, -371,1365,1,1628,2980, +2949,16,0,228,1, +371,1365,1,1628,2950, 16,0,228,1,375, -1376,1,1882,2981,16, +1376,1,1882,2951,16, 0,228,1,377,1381, 1,379,1386,1,380, 1391,1,883,1397,1, 373,1409,1,130,1414, 1,143,1419,1,387, -2982,16,0,228,1, -2664,2983,16,0,228, -1,1159,2984,16,0, +2952,16,0,228,1, +2664,2953,16,0,228, +1,1159,2954,16,0, 228,1,157,1443,1, -1413,2985,16,0,228, -1,1665,2986,16,0, -228,1,412,2987,16, -0,228,1,1377,2988, +1413,2955,16,0,228, +1,1665,2956,16,0, +228,1,412,2957,16, +0,228,1,1377,2958, 16,0,228,1,172, -1469,1,1939,2989,16, -0,228,1,437,2990, +1469,1,1939,2959,16, +0,228,1,437,2960, 16,0,228,1,188, 1518,1,942,1490,1, -1195,2991,16,0,228, -1,1449,2992,16,0, -228,1,1701,2993,16, +1195,2961,16,0,228, +1,1449,2962,16,0, +228,1,1701,2963,16, 0,228,1,447,1511, 1,205,1523,1,827, 1331,1,223,1533,1, 476,1543,1,477,1549, -1,1231,2994,16,0, +1,1231,2964,16,0, 228,1,479,1559,1, -480,1564,1,1485,2995, +480,1564,1,1485,2965, 16,0,228,1,1737, -2996,16,0,228,1, +2966,16,0,228,1, 242,1578,1,478,1583, 1,1001,1588,1,1002, -1593,1,39,2997,19, -222,1,39,2998,5, +1593,1,39,2967,19, +222,1,39,2968,5, 84,1,1011,1102,1, -1012,2999,16,0,220, +1012,2969,16,0,220, 1,1013,1258,1,262, -1119,1,1267,3000,16, -0,220,1,515,3001, +1119,1,1267,2970,16, +0,220,1,515,2971, 16,0,220,1,1521, -3002,16,0,220,1, +2972,16,0,220,1, 525,1216,1,283,1172, -1,2299,3003,16,0, -220,1,42,3004,16, +1,2299,2973,16,0, +220,1,42,2974,16, 0,220,1,40,1177, 1,44,1183,1,47, -1184,1,1303,3005,16, -0,220,1,1555,3006, +1184,1,1303,2975,16, +0,220,1,1555,2976, 16,0,220,1,50, 1201,1,48,1190,1, 49,1196,1,51,1206, @@ -8046,577 +8028,227 @@ public yyLSLSyntax 1211,1,66,1228,1, 67,1233,1,68,1238, 1,69,1243,1,70, -1248,1,73,3007,16, +1248,1,73,2977,16, 0,220,1,74,1253, 1,328,1302,1,1048, -1344,1,82,3008,16, -0,220,1,1840,3009, -16,0,220,1,1591, -3010,16,0,220,1, -1341,3011,16,0,220, -1,1096,1312,1,93, -1318,1,352,1349,1, -107,3012,16,0,220, -1,1114,1343,1,118, -1355,1,1123,3013,16, -0,220,1,371,1365, -1,1628,3014,16,0, -220,1,375,1376,1, -1882,3015,16,0,220, -1,377,1381,1,379, -1386,1,380,1391,1, -883,1397,1,373,1409, -1,130,1414,1,143, -1419,1,387,3016,16, -0,220,1,2664,3017, -16,0,220,1,1159, -3018,16,0,220,1, -157,1443,1,1413,3019, -16,0,220,1,1665, -3020,16,0,220,1, -412,3021,16,0,220, -1,1377,3022,16,0, -220,1,172,1469,1, -1939,3023,16,0,220, -1,437,3024,16,0, -220,1,188,1518,1, -942,1490,1,1195,3025, -16,0,220,1,1449, -3026,16,0,220,1, -1701,3027,16,0,220, -1,447,1511,1,205, -1523,1,827,1331,1, -223,1533,1,476,1543, -1,477,1549,1,1231, -3028,16,0,220,1, -479,1559,1,480,1564, -1,1485,3029,16,0, -220,1,1737,3030,16, -0,220,1,242,1578, -1,478,1583,1,1001, -1588,1,1002,1593,1, -40,3031,19,210,1, -40,3032,5,84,1, -1011,1102,1,1012,3033, -16,0,208,1,1013, -1258,1,262,1119,1, -1267,3034,16,0,208, -1,515,3035,16,0, -208,1,1521,3036,16, -0,208,1,525,1216, -1,283,1172,1,2299, -3037,16,0,208,1, -42,3038,16,0,208, -1,40,1177,1,44, -1183,1,47,1184,1, -1303,3039,16,0,208, -1,1555,3040,16,0, -208,1,50,1201,1, -48,1190,1,49,1196, -1,51,1206,1,63, -1222,1,305,1211,1, -66,1228,1,67,1233, -1,68,1238,1,69, -1243,1,70,1248,1, -73,3041,16,0,208, -1,74,1253,1,328, -1302,1,1048,1344,1, -82,3042,16,0,208, -1,1840,3043,16,0, -208,1,1591,3044,16, -0,208,1,1341,3045, -16,0,208,1,1096, -1312,1,93,1318,1, -352,1349,1,107,3046, -16,0,208,1,1114, -1343,1,118,3047,16, -0,208,1,1123,3048, -16,0,208,1,371, -1365,1,1628,3049,16, -0,208,1,375,1376, -1,1882,3050,16,0, -208,1,377,1381,1, -379,1386,1,380,1391, -1,883,3051,16,0, -208,1,373,1409,1, -130,3052,16,0,208, -1,143,3053,16,0, -208,1,387,3054,16, -0,208,1,2664,3055, -16,0,208,1,1159, -3056,16,0,208,1, -157,3057,16,0,208, -1,1413,3058,16,0, -208,1,1665,3059,16, -0,208,1,412,3060, -16,0,208,1,1377, -3061,16,0,208,1, -172,3062,16,0,208, -1,1939,3063,16,0, -208,1,437,3064,16, -0,208,1,188,3065, -16,0,208,1,942, -1490,1,1195,3066,16, -0,208,1,1449,3067, -16,0,208,1,1701, -3068,16,0,208,1, -447,1511,1,205,3069, -16,0,208,1,827, -3070,16,0,208,1, -223,3071,16,0,208, -1,476,1543,1,477, -1549,1,1231,3072,16, -0,208,1,479,1559, -1,480,1564,1,1485, -3073,16,0,208,1, -1737,3074,16,0,208, -1,242,3075,16,0, -208,1,478,1583,1, -1001,1588,1,1002,1593, -1,41,3076,19,172, -1,41,3077,5,84, -1,1011,1102,1,1012, -3078,16,0,170,1, -1013,1258,1,262,1119, -1,1267,3079,16,0, -170,1,515,3080,16, -0,170,1,1521,3081, -16,0,170,1,525, -1216,1,283,1172,1, -2299,3082,16,0,170, -1,42,3083,16,0, -170,1,40,1177,1, -44,1183,1,47,1184, -1,1303,3084,16,0, -170,1,1555,3085,16, -0,170,1,50,1201, -1,48,1190,1,49, -1196,1,51,1206,1, -63,1222,1,305,1211, -1,66,1228,1,67, -1233,1,68,1238,1, -69,1243,1,70,1248, -1,73,3086,16,0, -170,1,74,1253,1, -328,1302,1,1048,1344, -1,82,3087,16,0, -170,1,1840,3088,16, -0,170,1,1591,3089, -16,0,170,1,1341, -3090,16,0,170,1, +1344,1,82,1280,1, +1840,2978,16,0,220, +1,1591,2979,16,0, +220,1,1341,2980,16, +0,220,1,1096,1312, +1,93,1318,1,352, +1349,1,107,1338,1, +1114,1343,1,118,1355, +1,1123,2981,16,0, +220,1,371,1365,1, +1628,2982,16,0,220, +1,375,1376,1,1882, +2983,16,0,220,1, +377,1381,1,379,1386, +1,380,1391,1,883, +1397,1,373,1409,1, +130,1414,1,143,1419, +1,387,2984,16,0, +220,1,2664,2985,16, +0,220,1,1159,2986, +16,0,220,1,157, +1443,1,1413,2987,16, +0,220,1,1665,2988, +16,0,220,1,412, +2989,16,0,220,1, +1377,2990,16,0,220, +1,172,1469,1,1939, +2991,16,0,220,1, +437,2992,16,0,220, +1,188,1518,1,942, +1490,1,1195,2993,16, +0,220,1,1449,2994, +16,0,220,1,1701, +2995,16,0,220,1, +447,1511,1,205,1523, +1,827,1331,1,223, +1533,1,476,1543,1, +477,1549,1,1231,2996, +16,0,220,1,479, +1559,1,480,1564,1, +1485,2997,16,0,220, +1,1737,2998,16,0, +220,1,242,1578,1, +478,1583,1,1001,1588, +1,1002,1593,1,40, +2999,19,210,1,40, +3000,5,84,1,1011, +1102,1,1012,3001,16, +0,208,1,1013,1258, +1,262,1119,1,1267, +3002,16,0,208,1, +515,3003,16,0,208, +1,1521,3004,16,0, +208,1,525,1216,1, +283,1172,1,2299,3005, +16,0,208,1,42, +3006,16,0,208,1, +40,1177,1,44,1183, +1,47,1184,1,1303, +3007,16,0,208,1, +1555,3008,16,0,208, +1,50,1201,1,48, +1190,1,49,1196,1, +51,1206,1,63,1222, +1,305,1211,1,66, +1228,1,67,1233,1, +68,1238,1,69,1243, +1,70,1248,1,73, +3009,16,0,208,1, +74,1253,1,328,1302, +1,1048,1344,1,82, +1280,1,1840,3010,16, +0,208,1,1591,3011, +16,0,208,1,1341, +3012,16,0,208,1, 1096,1312,1,93,1318, 1,352,1349,1,107, -3091,16,0,170,1, -1114,1343,1,118,3092, -16,0,170,1,1123, -3093,16,0,170,1, -371,1365,1,1628,3094, -16,0,170,1,375, -1376,1,1882,3095,16, -0,170,1,377,1381, -1,379,1386,1,380, -1391,1,883,3096,16, -0,170,1,373,1409, -1,130,3097,16,0, -170,1,143,3098,16, -0,170,1,387,3099, -16,0,170,1,2664, -3100,16,0,170,1, -1159,3101,16,0,170, -1,157,3102,16,0, -170,1,1413,3103,16, -0,170,1,1665,3104, -16,0,170,1,412, -3105,16,0,170,1, -1377,3106,16,0,170, -1,172,3107,16,0, -170,1,1939,3108,16, -0,170,1,437,3109, -16,0,170,1,188, -3110,16,0,170,1, -942,1490,1,1195,3111, -16,0,170,1,1449, -3112,16,0,170,1, -1701,3113,16,0,170, -1,447,1511,1,205, -3114,16,0,170,1, -827,3115,16,0,170, -1,223,3116,16,0, -170,1,476,1543,1, -477,1549,1,1231,3117, -16,0,170,1,479, -1559,1,480,1564,1, -1485,3118,16,0,170, -1,1737,3119,16,0, -170,1,242,3120,16, -0,170,1,478,1583, -1,1001,1588,1,1002, -1593,1,42,3121,19, -394,1,42,3122,5, -38,1,1901,3123,16, -0,392,1,2075,3124, -16,0,392,1,1860, -821,1,1803,787,1, -1804,3125,16,0,392, -1,2413,3126,16,0, -392,1,2198,3127,16, -0,392,1,1873,835, -1,1657,894,1,1989, -916,1,1990,3128,16, -0,392,1,1775,3129, -16,0,392,1,32, -3130,16,0,392,1, -2105,814,1,2106,3131, -16,0,392,1,2364, -827,1,2227,908,1, -2337,3132,16,0,392, -1,2021,718,1,2458, -876,1,2459,882,1, -2462,889,1,2136,842, -1,2464,899,1,2029, -725,1,2030,731,1, -2031,736,1,2032,741, -1,2033,746,1,2035, -752,1,2037,757,1, -2039,762,1,1931,861, -1,2041,768,1,2043, -774,1,2045,779,1, -1574,799,1,1958,3133, -16,0,392,1,43, -3134,19,453,1,43, -3135,5,25,1,2035, -752,1,2037,757,1, -2039,762,1,2041,768, -1,2227,908,1,2043, -774,1,1657,894,1, -1860,821,1,2136,842, -1,2021,718,1,2459, -882,1,1574,799,1, -2105,3136,16,0,578, -1,1931,861,1,1873, -835,1,2031,736,1, -1803,787,1,1989,3137, -16,0,451,1,2464, -899,1,2029,725,1, -2030,731,1,2364,827, -1,2032,741,1,2033, -746,1,2045,779,1, -44,3138,19,264,1, -44,3139,5,38,1, -1901,3140,16,0,262, -1,2075,3141,16,0, -262,1,1860,821,1, -1803,787,1,1804,3142, -16,0,262,1,2413, -3143,16,0,262,1, -2198,3144,16,0,262, -1,1873,835,1,1657, -894,1,1989,916,1, -1990,3145,16,0,262, -1,1775,3146,16,0, -262,1,32,3147,16, -0,262,1,2105,814, -1,2106,3148,16,0, -262,1,2364,827,1, -2227,908,1,2337,3149, -16,0,262,1,2021, -718,1,2458,876,1, -2459,882,1,2462,889, -1,2136,842,1,2464, -899,1,2029,725,1, -2030,731,1,2031,736, -1,2032,741,1,2033, -746,1,2035,752,1, -2037,757,1,2039,762, -1,1931,861,1,2041, -768,1,2043,774,1, -2045,779,1,1574,799, -1,1958,3150,16,0, -262,1,45,3151,19, -287,1,45,3152,5, -39,1,1901,3153,16, -0,315,1,2075,3154, -16,0,315,1,1860, -821,1,1803,787,1, -1804,3155,16,0,315, -1,2413,3156,16,0, -315,1,2198,3157,16, -0,315,1,1873,835, -1,1657,894,1,1989, -916,1,1990,3158,16, -0,315,1,1775,3159, -16,0,315,1,32, -3160,16,0,315,1, -2105,814,1,2106,3161, -16,0,315,1,2364, -827,1,2227,908,1, -2337,3162,16,0,315, -1,2021,718,1,2458, -876,1,2459,882,1, -2462,889,1,2136,842, -1,2464,899,1,2029, -725,1,2030,731,1, -2031,736,1,2032,741, -1,2033,746,1,2035, -752,1,2037,757,1, -2039,762,1,1931,861, -1,2041,768,1,2043, -774,1,2045,779,1, -1832,3163,16,0,285, -1,1574,799,1,1958, -3164,16,0,315,1, -46,3165,19,671,1, -46,3166,5,38,1, -1901,3167,16,0,669, -1,2075,3168,16,0, -669,1,1860,821,1, -1803,787,1,1804,3169, -16,0,669,1,2413, -3170,16,0,669,1, -2198,3171,16,0,669, -1,1873,835,1,1657, -894,1,1989,916,1, -1990,3172,16,0,669, -1,1775,3173,16,0, -669,1,32,3174,16, -0,669,1,2105,814, -1,2106,3175,16,0, -669,1,2364,827,1, -2227,908,1,2337,3176, -16,0,669,1,2021, -718,1,2458,876,1, -2459,882,1,2462,889, -1,2136,842,1,2464, -899,1,2029,725,1, -2030,731,1,2031,736, -1,2032,741,1,2033, -746,1,2035,752,1, -2037,757,1,2039,762, -1,1931,861,1,2041, -768,1,2043,774,1, -2045,779,1,1574,799, -1,1958,3177,16,0, -669,1,47,3178,19, -466,1,47,3179,5, -19,1,0,3180,16, -0,464,1,2706,3181, -16,0,464,1,2634, -691,1,2636,3182,16, -0,464,1,2639,707, -1,2714,3183,17,3184, -15,3185,4,36,37, -0,71,0,108,0, -111,0,98,0,97, -0,108,0,68,0, -101,0,102,0,105, -0,110,0,105,0, -116,0,105,0,111, -0,110,0,115,0, -1,-1,1,5,3186, -20,3187,4,38,71, -0,108,0,111,0, -98,0,97,0,108, -0,68,0,101,0, -102,0,105,0,110, -0,105,0,116,0, -105,0,111,0,110, -0,115,0,95,0, -50,0,1,145,1, -3,1,3,1,2, -3188,22,1,4,1, -2558,697,1,2716,3189, -17,3190,15,3185,1, --1,1,5,3191,20, -3192,4,38,71,0, -108,0,111,0,98, -0,97,0,108,0, -68,0,101,0,102, -0,105,0,110,0, -105,0,116,0,105, -0,111,0,110,0, -115,0,95,0,49, -0,1,144,1,3, -1,2,1,1,3193, -22,1,3,1,2022, -3194,16,0,567,1, -2459,882,1,2715,3195, -17,3196,15,3185,1, --1,1,5,3197,20, -3198,4,38,71,0, -108,0,111,0,98, -0,97,0,108,0, -68,0,101,0,102, -0,105,0,110,0, -105,0,116,0,105, -0,111,0,110,0, -115,0,95,0,51, -0,1,146,1,3, -1,2,1,1,3199, -22,1,5,1,2464, -899,1,2466,3200,17, -3201,15,3202,4,50, -37,0,71,0,108, -0,111,0,98,0, -97,0,108,0,70, -0,117,0,110,0, -99,0,116,0,105, -0,111,0,110,0, -68,0,101,0,102, -0,105,0,110,0, -105,0,116,0,105, -0,111,0,110,0, -1,-1,1,5,3203, -20,3204,4,52,71, -0,108,0,111,0, -98,0,97,0,108, -0,70,0,117,0, -110,0,99,0,116, -0,105,0,111,0, -110,0,68,0,101, -0,102,0,105,0, -110,0,105,0,116, -0,105,0,111,0, -110,0,95,0,50, -0,1,151,1,3, -1,7,1,6,3205, -22,1,10,1,2640, -685,1,2713,3206,17, -3207,15,3185,1,-1, -1,5,3208,20,3209, -4,38,71,0,108, -0,111,0,98,0, -97,0,108,0,68, -0,101,0,102,0, -105,0,110,0,105, -0,116,0,105,0, -111,0,110,0,115, -0,95,0,52,0, -1,147,1,3,1, -3,1,2,3210,22, -1,6,1,2655,3211, -17,3212,15,3202,1, --1,1,5,3213,20, -3214,4,52,71,0, -108,0,111,0,98, -0,97,0,108,0, -70,0,117,0,110, -0,99,0,116,0, -105,0,111,0,110, -0,68,0,101,0, -102,0,105,0,110, -0,105,0,116,0, -105,0,111,0,110, -0,95,0,49,0, -1,150,1,3,1, -6,1,5,3215,22, -1,9,1,2694,3216, -17,3217,15,3218,4, -52,37,0,71,0, -108,0,111,0,98, -0,97,0,108,0, -86,0,97,0,114, -0,105,0,97,0, -98,0,108,0,101, -0,68,0,101,0, -99,0,108,0,97, -0,114,0,97,0, -116,0,105,0,111, -0,110,0,1,-1, -1,5,3219,20,3220, -4,54,71,0,108, -0,111,0,98,0, -97,0,108,0,86, -0,97,0,114,0, -105,0,97,0,98, -0,108,0,101,0, -68,0,101,0,99, -0,108,0,97,0, -114,0,97,0,116, -0,105,0,111,0, -110,0,95,0,49, -0,1,148,1,3, -1,3,1,2,3221, -22,1,7,1,2695, -3222,16,0,464,1, -2683,3223,17,3224,15, -3218,1,-1,1,5, -3225,20,3226,4,54, -71,0,108,0,111, -0,98,0,97,0, -108,0,86,0,97, -0,114,0,105,0, -97,0,98,0,108, -0,101,0,68,0, -101,0,99,0,108, -0,97,0,114,0, -97,0,116,0,105, -0,111,0,110,0, -95,0,50,0,1, -149,1,3,1,5, -1,4,3227,22,1, -8,1,48,3228,19, -339,1,48,3229,5, -54,1,0,3230,16, -0,337,1,2075,3231, -16,0,495,1,1860, -821,1,1803,787,1, -1804,3232,16,0,495, -1,2413,3233,16,0, -495,1,2634,691,1, -1873,835,1,1657,894, -1,2639,707,1,2640, -685,1,1989,916,1, -1990,3234,16,0,495, -1,2459,882,1,1775, -3235,16,0,495,1, -32,3236,16,0,495, -1,2105,814,1,2106, -3237,16,0,495,1, -2466,3200,1,2655,3211, -1,2683,3223,1,2227, -908,1,2337,3238,16, -0,495,1,2558,697, -1,2694,3216,1,2695, -3239,16,0,337,1, -2021,718,1,2458,876, -1,1901,3240,16,0, -495,1,2462,889,1, -2136,842,1,2464,899, -1,2029,725,1,2030, -731,1,2031,736,1, -2032,741,1,2033,746, -1,2035,752,1,2364, -827,1,2715,3195,1, -2039,762,1,1931,861, -1,2041,768,1,2043, -774,1,2045,779,1, -2198,3241,16,0,495, -1,2706,3242,16,0, -337,1,2037,757,1, -2713,3206,1,2714,3183, -1,1574,799,1,2716, -3189,1,2636,3243,16, -0,337,1,1958,3244, -16,0,495,1,49, -3245,19,500,1,49, -3246,5,38,1,1901, -3247,16,0,498,1, -2075,3248,16,0,498, +1338,1,1114,1343,1, +118,3013,16,0,208, +1,1123,3014,16,0, +208,1,371,1365,1, +1628,3015,16,0,208, +1,375,1376,1,1882, +3016,16,0,208,1, +377,1381,1,379,1386, +1,380,1391,1,883, +3017,16,0,208,1, +373,1409,1,130,3018, +16,0,208,1,143, +3019,16,0,208,1, +387,3020,16,0,208, +1,2664,3021,16,0, +208,1,1159,3022,16, +0,208,1,157,3023, +16,0,208,1,1413, +3024,16,0,208,1, +1665,3025,16,0,208, +1,412,3026,16,0, +208,1,1377,3027,16, +0,208,1,172,3028, +16,0,208,1,1939, +3029,16,0,208,1, +437,3030,16,0,208, +1,188,3031,16,0, +208,1,942,1490,1, +1195,3032,16,0,208, +1,1449,3033,16,0, +208,1,1701,3034,16, +0,208,1,447,1511, +1,205,3035,16,0, +208,1,827,3036,16, +0,208,1,223,3037, +16,0,208,1,476, +1543,1,477,1549,1, +1231,3038,16,0,208, +1,479,1559,1,480, +1564,1,1485,3039,16, +0,208,1,1737,3040, +16,0,208,1,242, +3041,16,0,208,1, +478,1583,1,1001,1588, +1,1002,1593,1,41, +3042,19,172,1,41, +3043,5,84,1,1011, +1102,1,1012,3044,16, +0,170,1,1013,1258, +1,262,1119,1,1267, +3045,16,0,170,1, +515,3046,16,0,170, +1,1521,3047,16,0, +170,1,525,1216,1, +283,1172,1,2299,3048, +16,0,170,1,42, +3049,16,0,170,1, +40,1177,1,44,1183, +1,47,1184,1,1303, +3050,16,0,170,1, +1555,3051,16,0,170, +1,50,1201,1,48, +1190,1,49,1196,1, +51,1206,1,63,1222, +1,305,1211,1,66, +1228,1,67,1233,1, +68,1238,1,69,1243, +1,70,1248,1,73, +3052,16,0,170,1, +74,1253,1,328,1302, +1,1048,1344,1,82, +1280,1,1840,3053,16, +0,170,1,1591,3054, +16,0,170,1,1341, +3055,16,0,170,1, +1096,1312,1,93,1318, +1,352,1349,1,107, +1338,1,1114,1343,1, +118,3056,16,0,170, +1,1123,3057,16,0, +170,1,371,1365,1, +1628,3058,16,0,170, +1,375,1376,1,1882, +3059,16,0,170,1, +377,1381,1,379,1386, +1,380,1391,1,883, +3060,16,0,170,1, +373,1409,1,130,3061, +16,0,170,1,143, +3062,16,0,170,1, +387,3063,16,0,170, +1,2664,3064,16,0, +170,1,1159,3065,16, +0,170,1,157,3066, +16,0,170,1,1413, +3067,16,0,170,1, +1665,3068,16,0,170, +1,412,3069,16,0, +170,1,1377,3070,16, +0,170,1,172,3071, +16,0,170,1,1939, +3072,16,0,170,1, +437,3073,16,0,170, +1,188,3074,16,0, +170,1,942,1490,1, +1195,3075,16,0,170, +1,1449,3076,16,0, +170,1,1701,3077,16, +0,170,1,447,1511, +1,205,3078,16,0, +170,1,827,3079,16, +0,170,1,223,3080, +16,0,170,1,476, +1543,1,477,1549,1, +1231,3081,16,0,170, +1,479,1559,1,480, +1564,1,1485,3082,16, +0,170,1,1737,3083, +16,0,170,1,242, +3084,16,0,170,1, +478,1583,1,1001,1588, +1,1002,1593,1,42, +3085,19,394,1,42, +3086,5,38,1,1901, +3087,16,0,392,1, +2075,3088,16,0,392, 1,1860,821,1,1803, -787,1,1804,3249,16, -0,498,1,2413,3250, -16,0,498,1,2198, -3251,16,0,498,1, +787,1,1804,3089,16, +0,392,1,2413,3090, +16,0,392,1,2198, +3091,16,0,392,1, 1873,835,1,1657,894, 1,1989,916,1,1990, -3252,16,0,498,1, -1775,3253,16,0,498, -1,32,3254,16,0, -498,1,2105,814,1, -2106,3255,16,0,498, +3092,16,0,392,1, +1775,3093,16,0,392, +1,32,3094,16,0, +392,1,2105,814,1, +2106,3095,16,0,392, 1,2364,827,1,2227, -908,1,2337,3256,16, -0,498,1,2021,718, +908,1,2337,3096,16, +0,392,1,2021,718, 1,2458,876,1,2459, 882,1,2462,889,1, 2136,842,1,2464,899, @@ -8628,26 +8260,341 @@ public yyLSLSyntax 1931,861,1,2041,768, 1,2043,774,1,2045, 779,1,1574,799,1, -1958,3257,16,0,498, -1,50,3258,19,614, -1,50,3259,5,38, -1,1901,3260,16,0, -612,1,2075,3261,16, -0,612,1,1860,821, -1,1803,787,1,1804, -3262,16,0,612,1, -2413,3263,16,0,612, -1,2198,3264,16,0, -612,1,1873,835,1, -1657,894,1,1989,916, -1,1990,3265,16,0, -612,1,1775,3266,16, -0,612,1,32,3267, -16,0,612,1,2105, -814,1,2106,3268,16, -0,612,1,2364,827, +1958,3097,16,0,392, +1,43,3098,19,453, +1,43,3099,5,25, +1,2035,752,1,2037, +757,1,2039,762,1, +2041,768,1,2227,908, +1,2043,774,1,1657, +894,1,1860,821,1, +2136,842,1,2021,718, +1,2459,882,1,1574, +799,1,2105,3100,16, +0,578,1,1931,861, +1,1873,835,1,2031, +736,1,1803,787,1, +1989,3101,16,0,451, +1,2464,899,1,2029, +725,1,2030,731,1, +2364,827,1,2032,741, +1,2033,746,1,2045, +779,1,44,3102,19, +264,1,44,3103,5, +38,1,1901,3104,16, +0,262,1,2075,3105, +16,0,262,1,1860, +821,1,1803,787,1, +1804,3106,16,0,262, +1,2413,3107,16,0, +262,1,2198,3108,16, +0,262,1,1873,835, +1,1657,894,1,1989, +916,1,1990,3109,16, +0,262,1,1775,3110, +16,0,262,1,32, +3111,16,0,262,1, +2105,814,1,2106,3112, +16,0,262,1,2364, +827,1,2227,908,1, +2337,3113,16,0,262, +1,2021,718,1,2458, +876,1,2459,882,1, +2462,889,1,2136,842, +1,2464,899,1,2029, +725,1,2030,731,1, +2031,736,1,2032,741, +1,2033,746,1,2035, +752,1,2037,757,1, +2039,762,1,1931,861, +1,2041,768,1,2043, +774,1,2045,779,1, +1574,799,1,1958,3114, +16,0,262,1,45, +3115,19,287,1,45, +3116,5,39,1,1901, +3117,16,0,315,1, +2075,3118,16,0,315, +1,1860,821,1,1803, +787,1,1804,3119,16, +0,315,1,2413,3120, +16,0,315,1,2198, +3121,16,0,315,1, +1873,835,1,1657,894, +1,1989,916,1,1990, +3122,16,0,315,1, +1775,3123,16,0,315, +1,32,3124,16,0, +315,1,2105,814,1, +2106,3125,16,0,315, +1,2364,827,1,2227, +908,1,2337,3126,16, +0,315,1,2021,718, +1,2458,876,1,2459, +882,1,2462,889,1, +2136,842,1,2464,899, +1,2029,725,1,2030, +731,1,2031,736,1, +2032,741,1,2033,746, +1,2035,752,1,2037, +757,1,2039,762,1, +1931,861,1,2041,768, +1,2043,774,1,2045, +779,1,1832,3127,16, +0,285,1,1574,799, +1,1958,3128,16,0, +315,1,46,3129,19, +671,1,46,3130,5, +38,1,1901,3131,16, +0,669,1,2075,3132, +16,0,669,1,1860, +821,1,1803,787,1, +1804,3133,16,0,669, +1,2413,3134,16,0, +669,1,2198,3135,16, +0,669,1,1873,835, +1,1657,894,1,1989, +916,1,1990,3136,16, +0,669,1,1775,3137, +16,0,669,1,32, +3138,16,0,669,1, +2105,814,1,2106,3139, +16,0,669,1,2364, +827,1,2227,908,1, +2337,3140,16,0,669, +1,2021,718,1,2458, +876,1,2459,882,1, +2462,889,1,2136,842, +1,2464,899,1,2029, +725,1,2030,731,1, +2031,736,1,2032,741, +1,2033,746,1,2035, +752,1,2037,757,1, +2039,762,1,1931,861, +1,2041,768,1,2043, +774,1,2045,779,1, +1574,799,1,1958,3141, +16,0,669,1,47, +3142,19,466,1,47, +3143,5,19,1,0, +3144,16,0,464,1, +2706,3145,16,0,464, +1,2634,691,1,2636, +3146,16,0,464,1, +2639,707,1,2714,3147, +17,3148,15,3149,4, +36,37,0,71,0, +108,0,111,0,98, +0,97,0,108,0, +68,0,101,0,102, +0,105,0,110,0, +105,0,116,0,105, +0,111,0,110,0, +115,0,1,-1,1, +5,3150,20,3151,4, +38,71,0,108,0, +111,0,98,0,97, +0,108,0,68,0, +101,0,102,0,105, +0,110,0,105,0, +116,0,105,0,111, +0,110,0,115,0, +95,0,50,0,1, +145,1,3,1,3, +1,2,3152,22,1, +4,1,2558,697,1, +2716,3153,17,3154,15, +3149,1,-1,1,5, +3155,20,3156,4,38, +71,0,108,0,111, +0,98,0,97,0, +108,0,68,0,101, +0,102,0,105,0, +110,0,105,0,116, +0,105,0,111,0, +110,0,115,0,95, +0,49,0,1,144, +1,3,1,2,1, +1,3157,22,1,3, +1,2022,3158,16,0, +567,1,2459,882,1, +2715,3159,17,3160,15, +3149,1,-1,1,5, +3161,20,3162,4,38, +71,0,108,0,111, +0,98,0,97,0, +108,0,68,0,101, +0,102,0,105,0, +110,0,105,0,116, +0,105,0,111,0, +110,0,115,0,95, +0,51,0,1,146, +1,3,1,2,1, +1,3163,22,1,5, +1,2464,899,1,2466, +3164,17,3165,15,3166, +4,50,37,0,71, +0,108,0,111,0, +98,0,97,0,108, +0,70,0,117,0, +110,0,99,0,116, +0,105,0,111,0, +110,0,68,0,101, +0,102,0,105,0, +110,0,105,0,116, +0,105,0,111,0, +110,0,1,-1,1, +5,3167,20,3168,4, +52,71,0,108,0, +111,0,98,0,97, +0,108,0,70,0, +117,0,110,0,99, +0,116,0,105,0, +111,0,110,0,68, +0,101,0,102,0, +105,0,110,0,105, +0,116,0,105,0, +111,0,110,0,95, +0,50,0,1,151, +1,3,1,7,1, +6,3169,22,1,10, +1,2640,685,1,2713, +3170,17,3171,15,3149, +1,-1,1,5,3172, +20,3173,4,38,71, +0,108,0,111,0, +98,0,97,0,108, +0,68,0,101,0, +102,0,105,0,110, +0,105,0,116,0, +105,0,111,0,110, +0,115,0,95,0, +52,0,1,147,1, +3,1,3,1,2, +3174,22,1,6,1, +2655,3175,17,3176,15, +3166,1,-1,1,5, +3177,20,3178,4,52, +71,0,108,0,111, +0,98,0,97,0, +108,0,70,0,117, +0,110,0,99,0, +116,0,105,0,111, +0,110,0,68,0, +101,0,102,0,105, +0,110,0,105,0, +116,0,105,0,111, +0,110,0,95,0, +49,0,1,150,1, +3,1,6,1,5, +3179,22,1,9,1, +2694,3180,17,3181,15, +3182,4,52,37,0, +71,0,108,0,111, +0,98,0,97,0, +108,0,86,0,97, +0,114,0,105,0, +97,0,98,0,108, +0,101,0,68,0, +101,0,99,0,108, +0,97,0,114,0, +97,0,116,0,105, +0,111,0,110,0, +1,-1,1,5,3183, +20,3184,4,54,71, +0,108,0,111,0, +98,0,97,0,108, +0,86,0,97,0, +114,0,105,0,97, +0,98,0,108,0, +101,0,68,0,101, +0,99,0,108,0, +97,0,114,0,97, +0,116,0,105,0, +111,0,110,0,95, +0,49,0,1,148, +1,3,1,3,1, +2,3185,22,1,7, +1,2695,3186,16,0, +464,1,2683,3187,17, +3188,15,3182,1,-1, +1,5,3189,20,3190, +4,54,71,0,108, +0,111,0,98,0, +97,0,108,0,86, +0,97,0,114,0, +105,0,97,0,98, +0,108,0,101,0, +68,0,101,0,99, +0,108,0,97,0, +114,0,97,0,116, +0,105,0,111,0, +110,0,95,0,50, +0,1,149,1,3, +1,5,1,4,3191, +22,1,8,1,48, +3192,19,339,1,48, +3193,5,54,1,0, +3194,16,0,337,1, +2075,3195,16,0,495, +1,1860,821,1,1803, +787,1,1804,3196,16, +0,495,1,2413,3197, +16,0,495,1,2634, +691,1,1873,835,1, +1657,894,1,2639,707, +1,2640,685,1,1989, +916,1,1990,3198,16, +0,495,1,2459,882, +1,1775,3199,16,0, +495,1,32,3200,16, +0,495,1,2105,814, +1,2106,3201,16,0, +495,1,2466,3164,1, +2655,3175,1,2683,3187, 1,2227,908,1,2337, -3269,16,0,612,1, +3202,16,0,495,1, +2558,697,1,2694,3180, +1,2695,3203,16,0, +337,1,2021,718,1, +2458,876,1,1901,3204, +16,0,495,1,2462, +889,1,2136,842,1, +2464,899,1,2029,725, +1,2030,731,1,2031, +736,1,2032,741,1, +2033,746,1,2035,752, +1,2364,827,1,2715, +3159,1,2039,762,1, +1931,861,1,2041,768, +1,2043,774,1,2045, +779,1,2198,3205,16, +0,495,1,2706,3206, +16,0,337,1,2037, +757,1,2713,3170,1, +2714,3147,1,1574,799, +1,2716,3153,1,2636, +3207,16,0,337,1, +1958,3208,16,0,495, +1,49,3209,19,500, +1,49,3210,5,38, +1,1901,3211,16,0, +498,1,2075,3212,16, +0,498,1,1860,821, +1,1803,787,1,1804, +3213,16,0,498,1, +2413,3214,16,0,498, +1,2198,3215,16,0, +498,1,1873,835,1, +1657,894,1,1989,916, +1,1990,3216,16,0, +498,1,1775,3217,16, +0,498,1,32,3218, +16,0,498,1,2105, +814,1,2106,3219,16, +0,498,1,2364,827, +1,2227,908,1,2337, +3220,16,0,498,1, 2021,718,1,2458,876, 1,2459,882,1,2462, 889,1,2136,842,1, @@ -8659,2076 +8606,2127 @@ public yyLSLSyntax 762,1,1931,861,1, 2041,768,1,2043,774, 1,2045,779,1,1574, -799,1,1958,3270,16, -0,612,1,51,3271, -19,127,1,51,3272, -5,53,1,0,3273, -16,0,125,1,2075, -3274,16,0,125,1, +799,1,1958,3221,16, +0,498,1,50,3222, +19,614,1,50,3223, +5,38,1,1901,3224, +16,0,612,1,2075, +3225,16,0,612,1, 1860,821,1,1803,787, -1,1804,3275,16,0, -125,1,10,3276,16, -0,125,1,2413,3277, -16,0,125,1,2198, -3278,16,0,125,1, -1873,835,1,21,3279, -16,0,125,1,1657, -894,1,2030,731,1, -2642,3280,16,0,125, -1,1989,916,1,1990, -3281,16,0,125,1, -2459,882,1,1775,3282, -16,0,125,1,32, -3283,16,0,125,1, -2105,814,1,2106,3284, -16,0,125,1,2655, -3211,1,2683,3223,1, -2227,908,1,2337,3285, -16,0,125,1,52, -3286,16,0,125,1, -2694,3216,1,2695,3287, -16,0,125,1,2021, -718,1,2458,876,1, -1901,3288,16,0,125, +1,1804,3226,16,0, +612,1,2413,3227,16, +0,612,1,2198,3228, +16,0,612,1,1873, +835,1,1657,894,1, +1989,916,1,1990,3229, +16,0,612,1,1775, +3230,16,0,612,1, +32,3231,16,0,612, +1,2105,814,1,2106, +3232,16,0,612,1, +2364,827,1,2227,908, +1,2337,3233,16,0, +612,1,2021,718,1, +2458,876,1,2459,882, 1,2462,889,1,2136, 842,1,2464,899,1, -2029,725,1,2466,3200, +2029,725,1,2030,731, 1,2031,736,1,2032, 741,1,2033,746,1, -2035,752,1,2364,827, -1,2715,3195,1,2039, -762,1,1931,861,1, -2041,768,1,2043,774, -1,2045,779,1,2037, -757,1,2713,3206,1, -2714,3183,1,1574,799, -1,2716,3189,1,1958, -3289,16,0,125,1, -2506,3290,16,0,125, -1,52,3291,19,124, -1,52,3292,5,53, -1,0,3293,16,0, -122,1,2075,3294,16, -0,122,1,1860,821, -1,1803,787,1,1804, -3295,16,0,122,1, -10,3296,16,0,122, -1,2413,3297,16,0, -122,1,2198,3298,16, -0,122,1,1873,835, -1,21,3299,16,0, -122,1,1657,894,1, -2030,731,1,2642,3300, -16,0,122,1,1989, -916,1,1990,3301,16, -0,122,1,2459,882, -1,1775,3302,16,0, -122,1,32,3303,16, -0,122,1,2105,814, -1,2106,3304,16,0, -122,1,2655,3211,1, -2683,3223,1,2227,908, -1,2337,3305,16,0, -122,1,52,3306,16, -0,122,1,2694,3216, -1,2695,3307,16,0, -122,1,2021,718,1, -2458,876,1,1901,3308, -16,0,122,1,2462, -889,1,2136,842,1, -2464,899,1,2029,725, -1,2466,3200,1,2031, -736,1,2032,741,1, -2033,746,1,2035,752, -1,2364,827,1,2715, -3195,1,2039,762,1, -1931,861,1,2041,768, -1,2043,774,1,2045, -779,1,2037,757,1, -2713,3206,1,2714,3183, -1,1574,799,1,2716, -3189,1,1958,3309,16, -0,122,1,2506,3310, -16,0,122,1,53, -3311,19,121,1,53, -3312,5,53,1,0, -3313,16,0,119,1, -2075,3314,16,0,119, -1,1860,821,1,1803, -787,1,1804,3315,16, -0,119,1,10,3316, -16,0,119,1,2413, -3317,16,0,119,1, -2198,3318,16,0,119, -1,1873,835,1,21, -3319,16,0,119,1, -1657,894,1,2030,731, -1,2642,3320,16,0, -119,1,1989,916,1, -1990,3321,16,0,119, -1,2459,882,1,1775, -3322,16,0,119,1, -32,3323,16,0,119, -1,2105,814,1,2106, -3324,16,0,119,1, -2655,3211,1,2683,3223, -1,2227,908,1,2337, -3325,16,0,119,1, -52,3326,16,0,119, -1,2694,3216,1,2695, -3327,16,0,119,1, -2021,718,1,2458,876, -1,1901,3328,16,0, -119,1,2462,889,1, -2136,842,1,2464,899, -1,2029,725,1,2466, -3200,1,2031,736,1, -2032,741,1,2033,746, -1,2035,752,1,2364, -827,1,2715,3195,1, -2039,762,1,1931,861, -1,2041,768,1,2043, -774,1,2045,779,1, -2037,757,1,2713,3206, -1,2714,3183,1,1574, -799,1,2716,3189,1, -1958,3329,16,0,119, -1,2506,3330,16,0, -119,1,54,3331,19, -118,1,54,3332,5, -53,1,0,3333,16, -0,116,1,2075,3334, -16,0,116,1,1860, -821,1,1803,787,1, -1804,3335,16,0,116, -1,10,3336,16,0, -116,1,2413,3337,16, -0,116,1,2198,3338, -16,0,116,1,1873, -835,1,21,3339,16, -0,116,1,1657,894, -1,2030,731,1,2642, -3340,16,0,116,1, -1989,916,1,1990,3341, -16,0,116,1,2459, -882,1,1775,3342,16, -0,116,1,32,3343, -16,0,116,1,2105, -814,1,2106,3344,16, -0,116,1,2655,3211, -1,2683,3223,1,2227, -908,1,2337,3345,16, -0,116,1,52,3346, -16,0,116,1,2694, -3216,1,2695,3347,16, -0,116,1,2021,718, -1,2458,876,1,1901, -3348,16,0,116,1, -2462,889,1,2136,842, -1,2464,899,1,2029, -725,1,2466,3200,1, -2031,736,1,2032,741, -1,2033,746,1,2035, -752,1,2364,827,1, -2715,3195,1,2039,762, -1,1931,861,1,2041, -768,1,2043,774,1, -2045,779,1,2037,757, -1,2713,3206,1,2714, -3183,1,1574,799,1, -2716,3189,1,1958,3349, -16,0,116,1,2506, -3350,16,0,116,1, -55,3351,19,115,1, -55,3352,5,53,1, -0,3353,16,0,113, -1,2075,3354,16,0, -113,1,1860,821,1, -1803,787,1,1804,3355, -16,0,113,1,10, -3356,16,0,113,1, -2413,3357,16,0,113, -1,2198,3358,16,0, -113,1,1873,835,1, -21,3359,16,0,113, +2035,752,1,2037,757, +1,2039,762,1,1931, +861,1,2041,768,1, +2043,774,1,2045,779, +1,1574,799,1,1958, +3234,16,0,612,1, +51,3235,19,127,1, +51,3236,5,53,1, +0,3237,16,0,125, +1,2075,3238,16,0, +125,1,1860,821,1, +1803,787,1,1804,3239, +16,0,125,1,10, +3240,16,0,125,1, +2413,3241,16,0,125, +1,2198,3242,16,0, +125,1,1873,835,1, +21,3243,16,0,125, 1,1657,894,1,2030, -731,1,2642,3360,16, -0,113,1,1989,916, -1,1990,3361,16,0, -113,1,2459,882,1, -1775,3362,16,0,113, -1,32,3363,16,0, -113,1,2105,814,1, -2106,3364,16,0,113, -1,2655,3211,1,2683, -3223,1,2227,908,1, -2337,3365,16,0,113, -1,52,3366,16,0, -113,1,2694,3216,1, -2695,3367,16,0,113, +731,1,2642,3244,16, +0,125,1,1989,916, +1,1990,3245,16,0, +125,1,2459,882,1, +1775,3246,16,0,125, +1,32,3247,16,0, +125,1,2105,814,1, +2106,3248,16,0,125, +1,2655,3175,1,2683, +3187,1,2227,908,1, +2337,3249,16,0,125, +1,52,3250,16,0, +125,1,2694,3180,1, +2695,3251,16,0,125, 1,2021,718,1,2458, -876,1,1901,3368,16, -0,113,1,2462,889, +876,1,1901,3252,16, +0,125,1,2462,889, 1,2136,842,1,2464, 899,1,2029,725,1, -2466,3200,1,2031,736, +2466,3164,1,2031,736, 1,2032,741,1,2033, 746,1,2035,752,1, -2364,827,1,2715,3195, +2364,827,1,2715,3159, 1,2039,762,1,1931, 861,1,2041,768,1, 2043,774,1,2045,779, 1,2037,757,1,2713, -3206,1,2714,3183,1, -1574,799,1,2716,3189, -1,1958,3369,16,0, -113,1,2506,3370,16, -0,113,1,56,3371, -19,112,1,56,3372, -5,53,1,0,3373, -16,0,110,1,2075, -3374,16,0,110,1, +3170,1,2714,3147,1, +1574,799,1,2716,3153, +1,1958,3253,16,0, +125,1,2506,3254,16, +0,125,1,52,3255, +19,124,1,52,3256, +5,53,1,0,3257, +16,0,122,1,2075, +3258,16,0,122,1, 1860,821,1,1803,787, -1,1804,3375,16,0, -110,1,10,3376,16, -0,110,1,2413,3377, -16,0,110,1,2198, -3378,16,0,110,1, -1873,835,1,21,3379, -16,0,110,1,1657, +1,1804,3259,16,0, +122,1,10,3260,16, +0,122,1,2413,3261, +16,0,122,1,2198, +3262,16,0,122,1, +1873,835,1,21,3263, +16,0,122,1,1657, 894,1,2030,731,1, -2642,3380,16,0,110, +2642,3264,16,0,122, 1,1989,916,1,1990, -3381,16,0,110,1, -2459,882,1,1775,3382, -16,0,110,1,32, -3383,16,0,110,1, -2105,814,1,2106,3384, -16,0,110,1,2655, -3211,1,2683,3223,1, -2227,908,1,2337,3385, -16,0,110,1,52, -3386,16,0,110,1, -2694,3216,1,2695,3387, -16,0,110,1,2021, +3265,16,0,122,1, +2459,882,1,1775,3266, +16,0,122,1,32, +3267,16,0,122,1, +2105,814,1,2106,3268, +16,0,122,1,2655, +3175,1,2683,3187,1, +2227,908,1,2337,3269, +16,0,122,1,52, +3270,16,0,122,1, +2694,3180,1,2695,3271, +16,0,122,1,2021, 718,1,2458,876,1, -1901,3388,16,0,110, +1901,3272,16,0,122, 1,2462,889,1,2136, 842,1,2464,899,1, -2029,725,1,2466,3200, +2029,725,1,2466,3164, 1,2031,736,1,2032, 741,1,2033,746,1, 2035,752,1,2364,827, -1,2715,3195,1,2039, +1,2715,3159,1,2039, 762,1,1931,861,1, 2041,768,1,2043,774, 1,2045,779,1,2037, -757,1,2713,3206,1, -2714,3183,1,1574,799, -1,2716,3189,1,1958, -3389,16,0,110,1, -2506,3390,16,0,110, -1,57,3391,19,109, -1,57,3392,5,53, -1,0,3393,16,0, -107,1,2075,3394,16, -0,107,1,1860,821, +757,1,2713,3170,1, +2714,3147,1,1574,799, +1,2716,3153,1,1958, +3273,16,0,122,1, +2506,3274,16,0,122, +1,53,3275,19,121, +1,53,3276,5,53, +1,0,3277,16,0, +119,1,2075,3278,16, +0,119,1,1860,821, 1,1803,787,1,1804, -3395,16,0,107,1, -10,3396,16,0,107, -1,2413,3397,16,0, -107,1,2198,3398,16, -0,107,1,1873,835, -1,21,3399,16,0, -107,1,1657,894,1, -2030,731,1,2642,3400, -16,0,107,1,1989, -916,1,1990,3401,16, -0,107,1,2459,882, -1,1775,3402,16,0, -107,1,32,3403,16, -0,107,1,2105,814, -1,2106,3404,16,0, -107,1,2655,3211,1, -2683,3223,1,2227,908, -1,2337,3405,16,0, -107,1,52,3406,16, -0,107,1,2694,3216, -1,2695,3407,16,0, -107,1,2021,718,1, -2458,876,1,1901,3408, -16,0,107,1,2462, +3279,16,0,119,1, +10,3280,16,0,119, +1,2413,3281,16,0, +119,1,2198,3282,16, +0,119,1,1873,835, +1,21,3283,16,0, +119,1,1657,894,1, +2030,731,1,2642,3284, +16,0,119,1,1989, +916,1,1990,3285,16, +0,119,1,2459,882, +1,1775,3286,16,0, +119,1,32,3287,16, +0,119,1,2105,814, +1,2106,3288,16,0, +119,1,2655,3175,1, +2683,3187,1,2227,908, +1,2337,3289,16,0, +119,1,52,3290,16, +0,119,1,2694,3180, +1,2695,3291,16,0, +119,1,2021,718,1, +2458,876,1,1901,3292, +16,0,119,1,2462, 889,1,2136,842,1, 2464,899,1,2029,725, -1,2466,3200,1,2031, +1,2466,3164,1,2031, 736,1,2032,741,1, 2033,746,1,2035,752, 1,2364,827,1,2715, -3195,1,2039,762,1, +3159,1,2039,762,1, 1931,861,1,2041,768, 1,2043,774,1,2045, 779,1,2037,757,1, -2713,3206,1,2714,3183, +2713,3170,1,2714,3147, 1,1574,799,1,2716, -3189,1,1958,3409,16, -0,107,1,2506,3410, -16,0,107,1,58, -3411,19,429,1,58, -3412,5,9,1,2519, -1618,1,2557,1627,1, -2521,3413,16,0,427, -1,2559,1633,1,2597, -3414,16,0,427,1, -2561,3415,16,0,427, -1,2459,882,1,2464, -899,1,2470,3416,16, -0,427,1,59,3417, -19,426,1,59,3418, -5,9,1,2519,1618, -1,2557,1627,1,2521, -3419,16,0,424,1, -2559,1633,1,2597,3420, -16,0,424,1,2561, -3421,16,0,424,1, -2459,882,1,2464,899, -1,2470,3422,16,0, -424,1,60,3423,19, -423,1,60,3424,5, -9,1,2519,1618,1, -2557,1627,1,2521,3425, -16,0,421,1,2559, -1633,1,2597,3426,16, -0,421,1,2561,3427, -16,0,421,1,2459, -882,1,2464,899,1, -2470,3428,16,0,421, -1,61,3429,19,420, -1,61,3430,5,9, -1,2519,1618,1,2557, -1627,1,2521,3431,16, -0,418,1,2559,1633, -1,2597,3432,16,0, -418,1,2561,3433,16, -0,418,1,2459,882, -1,2464,899,1,2470, -3434,16,0,418,1, -62,3435,19,417,1, -62,3436,5,9,1, -2519,1618,1,2557,1627, -1,2521,3437,16,0, -415,1,2559,1633,1, -2597,3438,16,0,415, -1,2561,3439,16,0, -415,1,2459,882,1, -2464,899,1,2470,3440, -16,0,415,1,63, -3441,19,414,1,63, -3442,5,9,1,2519, -1618,1,2557,1627,1, -2521,3443,16,0,412, -1,2559,1633,1,2597, -3444,16,0,412,1, -2561,3445,16,0,412, -1,2459,882,1,2464, -899,1,2470,3446,16, -0,412,1,64,3447, -19,653,1,64,3448, -5,9,1,2519,1618, -1,2557,1627,1,2521, -3449,16,0,651,1, -2559,1633,1,2597,3450, -16,0,651,1,2561, -3451,16,0,651,1, -2459,882,1,2464,899, -1,2470,3452,16,0, -651,1,65,3453,19, -410,1,65,3454,5, -9,1,2519,1618,1, -2557,1627,1,2521,3455, -16,0,408,1,2559, -1633,1,2597,3456,16, -0,408,1,2561,3457, -16,0,408,1,2459, -882,1,2464,899,1, -2470,3458,16,0,408, -1,66,3459,19,493, -1,66,3460,5,9, -1,2519,1618,1,2557, -1627,1,2521,3461,16, -0,491,1,2559,1633, -1,2597,3462,16,0, -491,1,2561,3463,16, -0,491,1,2459,882, -1,2464,899,1,2470, -3464,16,0,491,1, -67,3465,19,406,1, -67,3466,5,9,1, -2519,1618,1,2557,1627, -1,2521,3467,16,0, -404,1,2559,1633,1, -2597,3468,16,0,404, -1,2561,3469,16,0, -404,1,2459,882,1, -2464,899,1,2470,3470, -16,0,404,1,68, -3471,19,403,1,68, -3472,5,9,1,2519, -1618,1,2557,1627,1, -2521,3473,16,0,401, -1,2559,1633,1,2597, -3474,16,0,401,1, -2561,3475,16,0,401, -1,2459,882,1,2464, -899,1,2470,3476,16, -0,401,1,69,3477, -19,486,1,69,3478, -5,9,1,2519,1618, -1,2557,1627,1,2521, -3479,16,0,484,1, -2559,1633,1,2597,3480, -16,0,484,1,2561, -3481,16,0,484,1, -2459,882,1,2464,899, -1,2470,3482,16,0, -484,1,70,3483,19, -399,1,70,3484,5, -9,1,2519,1618,1, -2557,1627,1,2521,3485, -16,0,397,1,2559, -1633,1,2597,3486,16, -0,397,1,2561,3487, -16,0,397,1,2459, -882,1,2464,899,1, -2470,3488,16,0,397, -1,71,3489,19,483, -1,71,3490,5,9, -1,2519,1618,1,2557, -1627,1,2521,3491,16, -0,481,1,2559,1633, -1,2597,3492,16,0, -481,1,2561,3493,16, -0,481,1,2459,882, -1,2464,899,1,2470, -3494,16,0,481,1, -72,3495,19,480,1, -72,3496,5,9,1, -2519,1618,1,2557,1627, -1,2521,3497,16,0, -478,1,2559,1633,1, -2597,3498,16,0,478, -1,2561,3499,16,0, -478,1,2459,882,1, -2464,899,1,2470,3500, -16,0,478,1,73, -3501,19,477,1,73, -3502,5,9,1,2519, -1618,1,2557,1627,1, -2521,3503,16,0,475, -1,2559,1633,1,2597, -3504,16,0,475,1, -2561,3505,16,0,475, -1,2459,882,1,2464, -899,1,2470,3506,16, -0,475,1,74,3507, -19,474,1,74,3508, -5,9,1,2519,1618, -1,2557,1627,1,2521, -3509,16,0,472,1, -2559,1633,1,2597,3510, -16,0,472,1,2561, -3511,16,0,472,1, -2459,882,1,2464,899, -1,2470,3512,16,0, -472,1,75,3513,19, -390,1,75,3514,5, -9,1,2519,1618,1, -2557,1627,1,2521,3515, -16,0,388,1,2559, -1633,1,2597,3516,16, -0,388,1,2561,3517, -16,0,388,1,2459, -882,1,2464,899,1, -2470,3518,16,0,388, -1,76,3519,19,387, -1,76,3520,5,9, -1,2519,1618,1,2557, -1627,1,2521,3521,16, -0,385,1,2559,1633, -1,2597,3522,16,0, -385,1,2561,3523,16, -0,385,1,2459,882, -1,2464,899,1,2470, -3524,16,0,385,1, -77,3525,19,471,1, -77,3526,5,9,1, -2519,1618,1,2557,1627, -1,2521,3527,16,0, -469,1,2559,1633,1, -2597,3528,16,0,469, -1,2561,3529,16,0, -469,1,2459,882,1, -2464,899,1,2470,3530, -16,0,469,1,78, -3531,19,566,1,78, -3532,5,9,1,2519, -1618,1,2557,1627,1, -2521,3533,16,0,564, -1,2559,1633,1,2597, -3534,16,0,564,1, -2561,3535,16,0,564, -1,2459,882,1,2464, -899,1,2470,3536,16, -0,564,1,79,3537, -19,380,1,79,3538, -5,9,1,2519,1618, -1,2557,1627,1,2521, -3539,16,0,378,1, -2559,1633,1,2597,3540, -16,0,378,1,2561, -3541,16,0,378,1, -2459,882,1,2464,899, -1,2470,3542,16,0, -378,1,80,3543,19, -377,1,80,3544,5, -9,1,2519,1618,1, -2557,1627,1,2521,3545, -16,0,375,1,2559, -1633,1,2597,3546,16, -0,375,1,2561,3547, -16,0,375,1,2459, -882,1,2464,899,1, -2470,3548,16,0,375, -1,81,3549,19,374, -1,81,3550,5,9, -1,2519,1618,1,2557, -1627,1,2521,3551,16, -0,372,1,2559,1633, -1,2597,3552,16,0, -372,1,2561,3553,16, -0,372,1,2459,882, -1,2464,899,1,2470, -3554,16,0,372,1, -82,3555,19,371,1, -82,3556,5,9,1, -2519,1618,1,2557,1627, -1,2521,3557,16,0, -369,1,2559,1633,1, -2597,3558,16,0,369, -1,2561,3559,16,0, -369,1,2459,882,1, -2464,899,1,2470,3560, -16,0,369,1,83, -3561,19,368,1,83, -3562,5,9,1,2519, -1618,1,2557,1627,1, -2521,3563,16,0,366, -1,2559,1633,1,2597, -3564,16,0,366,1, -2561,3565,16,0,366, -1,2459,882,1,2464, -899,1,2470,3566,16, -0,366,1,84,3567, -19,365,1,84,3568, -5,9,1,2519,1618, -1,2557,1627,1,2521, -3569,16,0,363,1, -2559,1633,1,2597,3570, -16,0,363,1,2561, -3571,16,0,363,1, -2459,882,1,2464,899, -1,2470,3572,16,0, -363,1,85,3573,19, -362,1,85,3574,5, -9,1,2519,1618,1, -2557,1627,1,2521,3575, -16,0,360,1,2559, -1633,1,2597,3576,16, -0,360,1,2561,3577, -16,0,360,1,2459, -882,1,2464,899,1, -2470,3578,16,0,360, -1,86,3579,19,359, -1,86,3580,5,9, -1,2519,1618,1,2557, -1627,1,2521,3581,16, -0,357,1,2559,1633, -1,2597,3582,16,0, -357,1,2561,3583,16, -0,357,1,2459,882, -1,2464,899,1,2470, -3584,16,0,357,1, -87,3585,19,356,1, -87,3586,5,9,1, -2519,1618,1,2557,1627, -1,2521,3587,16,0, -354,1,2559,1633,1, -2597,3588,16,0,354, -1,2561,3589,16,0, -354,1,2459,882,1, -2464,899,1,2470,3590, -16,0,354,1,88, -3591,19,353,1,88, -3592,5,9,1,2519, -1618,1,2557,1627,1, -2521,3593,16,0,351, -1,2559,1633,1,2597, -3594,16,0,351,1, -2561,3595,16,0,351, -1,2459,882,1,2464, -899,1,2470,3596,16, -0,351,1,89,3597, -19,347,1,89,3598, -5,9,1,2519,1618, -1,2557,1627,1,2521, -3599,16,0,345,1, -2559,1633,1,2597,3600, -16,0,345,1,2561, -3601,16,0,345,1, -2459,882,1,2464,899, -1,2470,3602,16,0, -345,1,90,3603,19, -350,1,90,3604,5, -9,1,2519,1618,1, -2557,1627,1,2521,3605, -16,0,348,1,2559, -1633,1,2597,3606,16, -0,348,1,2561,3607, -16,0,348,1,2459, -882,1,2464,899,1, -2470,3608,16,0,348, -1,91,3609,19,344, -1,91,3610,5,9, -1,2519,1618,1,2557, -1627,1,2521,3611,16, -0,342,1,2559,1633, -1,2597,3612,16,0, -342,1,2561,3613,16, -0,342,1,2459,882, -1,2464,899,1,2470, -3614,16,0,342,1, -92,3615,19,133,1, -92,3616,5,125,1, -0,3617,16,0,563, -1,1,1951,1,2, -1957,1,3,1962,1, -4,1967,1,5,1972, -1,6,1977,1,7, -1982,1,8,3618,16, -0,131,1,1515,3619, -16,0,165,1,2021, -718,1,2022,3620,16, -0,497,1,256,3621, -16,0,173,1,2025, -3622,16,0,501,1, -18,3623,16,0,138, -1,2027,3624,16,0, -505,1,2695,3625,16, -0,563,1,2029,725, -1,2030,731,1,2031, -736,1,2032,741,1, -2033,746,1,277,3626, -16,0,173,1,2035, -752,1,2037,757,1, -2039,762,1,32,3627, -16,0,165,1,2041, -768,1,2293,3628,16, -0,173,1,2043,774, -1,2045,779,1,2713, -3206,1,2715,3195,1, -41,3629,16,0,173, -1,1297,3630,16,0, -165,1,43,3631,16, -0,173,1,46,3632, -16,0,178,1,1804, -3633,16,0,165,1, -299,3634,16,0,173, -1,52,3635,16,0, -165,1,509,3636,16, -0,173,1,2318,3637, -16,0,165,1,62, -3638,16,0,195,1, -65,3639,16,0,197, -1,2075,3640,16,0, -165,1,1574,799,1, -71,3641,16,0,173, -1,1775,3642,16,0, -165,1,76,3643,16, -0,173,1,1834,3644, -16,0,165,1,2337, -3645,16,0,165,1, -79,3646,16,0,173, -1,1335,3647,16,0, -165,1,322,3648,16, -0,173,1,85,3649, -16,0,173,1,1261, -3650,16,0,165,1, -89,3651,16,0,173, -1,346,3652,16,0, -173,1,97,3653,16, -0,173,1,2106,3654, -16,0,165,1,102, -3655,16,0,173,1, -1860,821,1,1803,787, -1,2364,827,1,1113, -3656,16,0,158,1, -112,3657,16,0,173, -1,1117,3658,16,0, -165,1,1873,835,1, -1876,3659,16,0,165, -1,372,3660,16,0, -535,1,374,3661,16, -0,537,1,124,3662, -16,0,173,1,376, -3663,16,0,539,1, -378,3664,16,0,541, -1,2136,842,1,381, -3665,16,0,173,1, -525,3666,16,0,173, -1,137,3667,16,0, -173,1,1901,3668,16, -0,165,1,2655,3211, -1,2658,3669,16,0, -173,1,1153,3670,16, -0,165,1,151,3671, -16,0,173,1,1407, -3672,16,0,165,1, -1659,3673,16,0,165, -1,2413,3674,16,0, -165,1,406,3675,16, -0,173,1,1371,3676, -16,0,165,1,2105, -814,1,1657,894,1, -166,3677,16,0,173, -1,1622,3678,16,0, -173,1,2683,3223,1, -1931,861,1,1933,3679, -16,0,165,1,431, -3680,16,0,173,1, -1585,3681,16,0,173, -1,182,3682,16,0, -173,1,2694,3216,1, -1189,3683,16,0,165, -1,1443,3684,16,0, -165,1,1695,3685,16, -0,165,1,2198,3686, -16,0,165,1,447, -3687,16,0,173,1, -2458,876,1,2459,882, -1,1958,3688,16,0, -165,1,2462,889,1, -2714,3183,1,2464,899, -1,2716,3189,1,2466, -3200,1,459,3689,16, -0,173,1,2468,3690, -16,0,340,1,462, -3691,16,0,173,1, -199,3692,16,0,173, -1,217,3693,16,0, -173,1,2227,908,1, -1225,3694,16,0,165, -1,1479,3695,16,0, -165,1,1731,3696,16, -0,173,1,1989,916, -1,1990,3697,16,0, -165,1,236,3698,16, -0,173,1,1756,3699, -16,0,165,1,93, -3700,19,626,1,93, -3701,5,95,1,256, -3702,16,0,624,1, -1261,3703,16,0,624, -1,509,3704,16,0, -624,1,1515,3705,16, -0,624,1,2021,718, -1,1775,3706,16,0, -624,1,2029,725,1, -2030,731,1,2031,736, -1,2032,741,1,2033, -746,1,277,3707,16, -0,624,1,2035,752, -1,2037,757,1,2039, -762,1,32,3708,16, -0,624,1,2041,768, -1,2293,3709,16,0, -624,1,2043,774,1, -2045,779,1,41,3710, -16,0,624,1,1297, -3711,16,0,624,1, -43,3712,16,0,624, -1,1803,787,1,1804, -3713,16,0,624,1, -299,3714,16,0,624, -1,52,3715,16,0, -624,1,2318,3716,16, -0,624,1,62,3717, -16,0,624,1,2075, -3718,16,0,624,1, -1574,799,1,71,3719, -16,0,624,1,76, -3720,16,0,624,1, -1834,3721,16,0,624, -1,2337,3722,16,0, -624,1,79,3723,16, -0,624,1,1335,3724, -16,0,624,1,322, -3725,16,0,624,1, -85,3726,16,0,624, -1,89,3727,16,0, -624,1,346,3728,16, -0,624,1,2105,814, -1,2106,3729,16,0, -624,1,97,3730,16, -0,624,1,1860,821, -1,2364,827,1,102, -3731,16,0,624,1, -112,3732,16,0,624, -1,1117,3733,16,0, -624,1,1873,835,1, -1876,3734,16,0,624, -1,124,3735,16,0, -624,1,2136,842,1, -381,3736,16,0,624, -1,525,3737,16,0, -624,1,137,3738,16, -0,624,1,1901,3739, -16,0,624,1,2658, -3740,16,0,624,1, -1153,3741,16,0,624, -1,151,3742,16,0, -624,1,1407,3743,16, -0,624,1,1659,3744, -16,0,624,1,2413, -3745,16,0,624,1, -406,3746,16,0,624, -1,1371,3747,16,0, -624,1,166,3748,16, -0,624,1,1622,3749, -16,0,624,1,1931, -861,1,1933,3750,16, -0,624,1,431,3751, -16,0,624,1,1585, -3752,16,0,624,1, -182,3753,16,0,624, -1,1189,3754,16,0, -624,1,1443,3755,16, -0,624,1,1695,3756, -16,0,624,1,2198, -3757,16,0,624,1, -447,3758,16,0,624, -1,2458,876,1,2459, -882,1,1958,3759,16, -0,624,1,2462,889, -1,1657,894,1,2464, -899,1,199,3760,16, -0,624,1,459,3761, -16,0,624,1,462, -3762,16,0,624,1, -217,3763,16,0,624, -1,2227,908,1,1225, -3764,16,0,624,1, -1479,3765,16,0,624, -1,1731,3766,16,0, -624,1,1989,916,1, -1990,3767,16,0,624, -1,236,3768,16,0, -624,1,1756,3769,16, -0,624,1,94,3770, -19,623,1,94,3771, -5,95,1,256,3772, -16,0,621,1,1261, -3773,16,0,621,1, -509,3774,16,0,621, -1,1515,3775,16,0, -621,1,2021,718,1, -1775,3776,16,0,621, -1,2029,725,1,2030, -731,1,2031,736,1, +3153,1,1958,3293,16, +0,119,1,2506,3294, +16,0,119,1,54, +3295,19,118,1,54, +3296,5,53,1,0, +3297,16,0,116,1, +2075,3298,16,0,116, +1,1860,821,1,1803, +787,1,1804,3299,16, +0,116,1,10,3300, +16,0,116,1,2413, +3301,16,0,116,1, +2198,3302,16,0,116, +1,1873,835,1,21, +3303,16,0,116,1, +1657,894,1,2030,731, +1,2642,3304,16,0, +116,1,1989,916,1, +1990,3305,16,0,116, +1,2459,882,1,1775, +3306,16,0,116,1, +32,3307,16,0,116, +1,2105,814,1,2106, +3308,16,0,116,1, +2655,3175,1,2683,3187, +1,2227,908,1,2337, +3309,16,0,116,1, +52,3310,16,0,116, +1,2694,3180,1,2695, +3311,16,0,116,1, +2021,718,1,2458,876, +1,1901,3312,16,0, +116,1,2462,889,1, +2136,842,1,2464,899, +1,2029,725,1,2466, +3164,1,2031,736,1, 2032,741,1,2033,746, -1,277,3777,16,0, -621,1,2035,752,1, -2037,757,1,2039,762, -1,32,3778,16,0, -621,1,2041,768,1, -2293,3779,16,0,621, -1,2043,774,1,2045, -779,1,41,3780,16, -0,621,1,1297,3781, -16,0,621,1,43, -3782,16,0,621,1, -1803,787,1,1804,3783, -16,0,621,1,299, -3784,16,0,621,1, -52,3785,16,0,621, -1,2318,3786,16,0, -621,1,62,3787,16, -0,621,1,2075,3788, -16,0,621,1,1574, -799,1,71,3789,16, -0,621,1,76,3790, -16,0,621,1,1834, -3791,16,0,621,1, -2337,3792,16,0,621, -1,79,3793,16,0, -621,1,1335,3794,16, -0,621,1,322,3795, -16,0,621,1,85, -3796,16,0,621,1, -89,3797,16,0,621, -1,346,3798,16,0, -621,1,2105,814,1, -2106,3799,16,0,621, -1,97,3800,16,0, -621,1,1860,821,1, -2364,827,1,102,3801, -16,0,621,1,112, -3802,16,0,621,1, -1117,3803,16,0,621, -1,1873,835,1,1876, -3804,16,0,621,1, -124,3805,16,0,621, -1,2136,842,1,381, -3806,16,0,621,1, -525,3807,16,0,621, -1,137,3808,16,0, -621,1,1901,3809,16, -0,621,1,2658,3810, -16,0,621,1,1153, -3811,16,0,621,1, -151,3812,16,0,621, -1,1407,3813,16,0, -621,1,1659,3814,16, -0,621,1,2413,3815, -16,0,621,1,406, -3816,16,0,621,1, -1371,3817,16,0,621, -1,166,3818,16,0, -621,1,1622,3819,16, -0,621,1,1931,861, -1,1933,3820,16,0, -621,1,431,3821,16, -0,621,1,1585,3822, -16,0,621,1,182, -3823,16,0,621,1, -1189,3824,16,0,621, -1,1443,3825,16,0, -621,1,1695,3826,16, -0,621,1,2198,3827, -16,0,621,1,447, -3828,16,0,621,1, -2458,876,1,2459,882, -1,1958,3829,16,0, -621,1,2462,889,1, -1657,894,1,2464,899, -1,199,3830,16,0, -621,1,459,3831,16, -0,621,1,462,3832, -16,0,621,1,217, -3833,16,0,621,1, -2227,908,1,1225,3834, -16,0,621,1,1479, -3835,16,0,621,1, -1731,3836,16,0,621, +1,2035,752,1,2364, +827,1,2715,3159,1, +2039,762,1,1931,861, +1,2041,768,1,2043, +774,1,2045,779,1, +2037,757,1,2713,3170, +1,2714,3147,1,1574, +799,1,2716,3153,1, +1958,3313,16,0,116, +1,2506,3314,16,0, +116,1,55,3315,19, +115,1,55,3316,5, +53,1,0,3317,16, +0,113,1,2075,3318, +16,0,113,1,1860, +821,1,1803,787,1, +1804,3319,16,0,113, +1,10,3320,16,0, +113,1,2413,3321,16, +0,113,1,2198,3322, +16,0,113,1,1873, +835,1,21,3323,16, +0,113,1,1657,894, +1,2030,731,1,2642, +3324,16,0,113,1, +1989,916,1,1990,3325, +16,0,113,1,2459, +882,1,1775,3326,16, +0,113,1,32,3327, +16,0,113,1,2105, +814,1,2106,3328,16, +0,113,1,2655,3175, +1,2683,3187,1,2227, +908,1,2337,3329,16, +0,113,1,52,3330, +16,0,113,1,2694, +3180,1,2695,3331,16, +0,113,1,2021,718, +1,2458,876,1,1901, +3332,16,0,113,1, +2462,889,1,2136,842, +1,2464,899,1,2029, +725,1,2466,3164,1, +2031,736,1,2032,741, +1,2033,746,1,2035, +752,1,2364,827,1, +2715,3159,1,2039,762, +1,1931,861,1,2041, +768,1,2043,774,1, +2045,779,1,2037,757, +1,2713,3170,1,2714, +3147,1,1574,799,1, +2716,3153,1,1958,3333, +16,0,113,1,2506, +3334,16,0,113,1, +56,3335,19,112,1, +56,3336,5,53,1, +0,3337,16,0,110, +1,2075,3338,16,0, +110,1,1860,821,1, +1803,787,1,1804,3339, +16,0,110,1,10, +3340,16,0,110,1, +2413,3341,16,0,110, +1,2198,3342,16,0, +110,1,1873,835,1, +21,3343,16,0,110, +1,1657,894,1,2030, +731,1,2642,3344,16, +0,110,1,1989,916, +1,1990,3345,16,0, +110,1,2459,882,1, +1775,3346,16,0,110, +1,32,3347,16,0, +110,1,2105,814,1, +2106,3348,16,0,110, +1,2655,3175,1,2683, +3187,1,2227,908,1, +2337,3349,16,0,110, +1,52,3350,16,0, +110,1,2694,3180,1, +2695,3351,16,0,110, +1,2021,718,1,2458, +876,1,1901,3352,16, +0,110,1,2462,889, +1,2136,842,1,2464, +899,1,2029,725,1, +2466,3164,1,2031,736, +1,2032,741,1,2033, +746,1,2035,752,1, +2364,827,1,2715,3159, +1,2039,762,1,1931, +861,1,2041,768,1, +2043,774,1,2045,779, +1,2037,757,1,2713, +3170,1,2714,3147,1, +1574,799,1,2716,3153, +1,1958,3353,16,0, +110,1,2506,3354,16, +0,110,1,57,3355, +19,109,1,57,3356, +5,53,1,0,3357, +16,0,107,1,2075, +3358,16,0,107,1, +1860,821,1,1803,787, +1,1804,3359,16,0, +107,1,10,3360,16, +0,107,1,2413,3361, +16,0,107,1,2198, +3362,16,0,107,1, +1873,835,1,21,3363, +16,0,107,1,1657, +894,1,2030,731,1, +2642,3364,16,0,107, 1,1989,916,1,1990, -3837,16,0,621,1, -236,3838,16,0,621, -1,1756,3839,16,0, -621,1,95,3840,19, -620,1,95,3841,5, -95,1,256,3842,16, -0,618,1,1261,3843, -16,0,618,1,509, -3844,16,0,618,1, -1515,3845,16,0,618, -1,2021,718,1,1775, -3846,16,0,618,1, +3365,16,0,107,1, +2459,882,1,1775,3366, +16,0,107,1,32, +3367,16,0,107,1, +2105,814,1,2106,3368, +16,0,107,1,2655, +3175,1,2683,3187,1, +2227,908,1,2337,3369, +16,0,107,1,52, +3370,16,0,107,1, +2694,3180,1,2695,3371, +16,0,107,1,2021, +718,1,2458,876,1, +1901,3372,16,0,107, +1,2462,889,1,2136, +842,1,2464,899,1, +2029,725,1,2466,3164, +1,2031,736,1,2032, +741,1,2033,746,1, +2035,752,1,2364,827, +1,2715,3159,1,2039, +762,1,1931,861,1, +2041,768,1,2043,774, +1,2045,779,1,2037, +757,1,2713,3170,1, +2714,3147,1,1574,799, +1,2716,3153,1,1958, +3373,16,0,107,1, +2506,3374,16,0,107, +1,58,3375,19,429, +1,58,3376,5,9, +1,2519,1618,1,2557, +1627,1,2521,3377,16, +0,427,1,2559,1633, +1,2597,3378,16,0, +427,1,2561,3379,16, +0,427,1,2459,882, +1,2464,899,1,2470, +3380,16,0,427,1, +59,3381,19,426,1, +59,3382,5,9,1, +2519,1618,1,2557,1627, +1,2521,3383,16,0, +424,1,2559,1633,1, +2597,3384,16,0,424, +1,2561,3385,16,0, +424,1,2459,882,1, +2464,899,1,2470,3386, +16,0,424,1,60, +3387,19,423,1,60, +3388,5,9,1,2519, +1618,1,2557,1627,1, +2521,3389,16,0,421, +1,2559,1633,1,2597, +3390,16,0,421,1, +2561,3391,16,0,421, +1,2459,882,1,2464, +899,1,2470,3392,16, +0,421,1,61,3393, +19,420,1,61,3394, +5,9,1,2519,1618, +1,2557,1627,1,2521, +3395,16,0,418,1, +2559,1633,1,2597,3396, +16,0,418,1,2561, +3397,16,0,418,1, +2459,882,1,2464,899, +1,2470,3398,16,0, +418,1,62,3399,19, +417,1,62,3400,5, +9,1,2519,1618,1, +2557,1627,1,2521,3401, +16,0,415,1,2559, +1633,1,2597,3402,16, +0,415,1,2561,3403, +16,0,415,1,2459, +882,1,2464,899,1, +2470,3404,16,0,415, +1,63,3405,19,414, +1,63,3406,5,9, +1,2519,1618,1,2557, +1627,1,2521,3407,16, +0,412,1,2559,1633, +1,2597,3408,16,0, +412,1,2561,3409,16, +0,412,1,2459,882, +1,2464,899,1,2470, +3410,16,0,412,1, +64,3411,19,653,1, +64,3412,5,9,1, +2519,1618,1,2557,1627, +1,2521,3413,16,0, +651,1,2559,1633,1, +2597,3414,16,0,651, +1,2561,3415,16,0, +651,1,2459,882,1, +2464,899,1,2470,3416, +16,0,651,1,65, +3417,19,410,1,65, +3418,5,9,1,2519, +1618,1,2557,1627,1, +2521,3419,16,0,408, +1,2559,1633,1,2597, +3420,16,0,408,1, +2561,3421,16,0,408, +1,2459,882,1,2464, +899,1,2470,3422,16, +0,408,1,66,3423, +19,493,1,66,3424, +5,9,1,2519,1618, +1,2557,1627,1,2521, +3425,16,0,491,1, +2559,1633,1,2597,3426, +16,0,491,1,2561, +3427,16,0,491,1, +2459,882,1,2464,899, +1,2470,3428,16,0, +491,1,67,3429,19, +406,1,67,3430,5, +9,1,2519,1618,1, +2557,1627,1,2521,3431, +16,0,404,1,2559, +1633,1,2597,3432,16, +0,404,1,2561,3433, +16,0,404,1,2459, +882,1,2464,899,1, +2470,3434,16,0,404, +1,68,3435,19,403, +1,68,3436,5,9, +1,2519,1618,1,2557, +1627,1,2521,3437,16, +0,401,1,2559,1633, +1,2597,3438,16,0, +401,1,2561,3439,16, +0,401,1,2459,882, +1,2464,899,1,2470, +3440,16,0,401,1, +69,3441,19,486,1, +69,3442,5,9,1, +2519,1618,1,2557,1627, +1,2521,3443,16,0, +484,1,2559,1633,1, +2597,3444,16,0,484, +1,2561,3445,16,0, +484,1,2459,882,1, +2464,899,1,2470,3446, +16,0,484,1,70, +3447,19,399,1,70, +3448,5,9,1,2519, +1618,1,2557,1627,1, +2521,3449,16,0,397, +1,2559,1633,1,2597, +3450,16,0,397,1, +2561,3451,16,0,397, +1,2459,882,1,2464, +899,1,2470,3452,16, +0,397,1,71,3453, +19,483,1,71,3454, +5,9,1,2519,1618, +1,2557,1627,1,2521, +3455,16,0,481,1, +2559,1633,1,2597,3456, +16,0,481,1,2561, +3457,16,0,481,1, +2459,882,1,2464,899, +1,2470,3458,16,0, +481,1,72,3459,19, +480,1,72,3460,5, +9,1,2519,1618,1, +2557,1627,1,2521,3461, +16,0,478,1,2559, +1633,1,2597,3462,16, +0,478,1,2561,3463, +16,0,478,1,2459, +882,1,2464,899,1, +2470,3464,16,0,478, +1,73,3465,19,477, +1,73,3466,5,9, +1,2519,1618,1,2557, +1627,1,2521,3467,16, +0,475,1,2559,1633, +1,2597,3468,16,0, +475,1,2561,3469,16, +0,475,1,2459,882, +1,2464,899,1,2470, +3470,16,0,475,1, +74,3471,19,474,1, +74,3472,5,9,1, +2519,1618,1,2557,1627, +1,2521,3473,16,0, +472,1,2559,1633,1, +2597,3474,16,0,472, +1,2561,3475,16,0, +472,1,2459,882,1, +2464,899,1,2470,3476, +16,0,472,1,75, +3477,19,390,1,75, +3478,5,9,1,2519, +1618,1,2557,1627,1, +2521,3479,16,0,388, +1,2559,1633,1,2597, +3480,16,0,388,1, +2561,3481,16,0,388, +1,2459,882,1,2464, +899,1,2470,3482,16, +0,388,1,76,3483, +19,387,1,76,3484, +5,9,1,2519,1618, +1,2557,1627,1,2521, +3485,16,0,385,1, +2559,1633,1,2597,3486, +16,0,385,1,2561, +3487,16,0,385,1, +2459,882,1,2464,899, +1,2470,3488,16,0, +385,1,77,3489,19, +471,1,77,3490,5, +9,1,2519,1618,1, +2557,1627,1,2521,3491, +16,0,469,1,2559, +1633,1,2597,3492,16, +0,469,1,2561,3493, +16,0,469,1,2459, +882,1,2464,899,1, +2470,3494,16,0,469, +1,78,3495,19,566, +1,78,3496,5,9, +1,2519,1618,1,2557, +1627,1,2521,3497,16, +0,564,1,2559,1633, +1,2597,3498,16,0, +564,1,2561,3499,16, +0,564,1,2459,882, +1,2464,899,1,2470, +3500,16,0,564,1, +79,3501,19,380,1, +79,3502,5,9,1, +2519,1618,1,2557,1627, +1,2521,3503,16,0, +378,1,2559,1633,1, +2597,3504,16,0,378, +1,2561,3505,16,0, +378,1,2459,882,1, +2464,899,1,2470,3506, +16,0,378,1,80, +3507,19,377,1,80, +3508,5,9,1,2519, +1618,1,2557,1627,1, +2521,3509,16,0,375, +1,2559,1633,1,2597, +3510,16,0,375,1, +2561,3511,16,0,375, +1,2459,882,1,2464, +899,1,2470,3512,16, +0,375,1,81,3513, +19,374,1,81,3514, +5,9,1,2519,1618, +1,2557,1627,1,2521, +3515,16,0,372,1, +2559,1633,1,2597,3516, +16,0,372,1,2561, +3517,16,0,372,1, +2459,882,1,2464,899, +1,2470,3518,16,0, +372,1,82,3519,19, +371,1,82,3520,5, +9,1,2519,1618,1, +2557,1627,1,2521,3521, +16,0,369,1,2559, +1633,1,2597,3522,16, +0,369,1,2561,3523, +16,0,369,1,2459, +882,1,2464,899,1, +2470,3524,16,0,369, +1,83,3525,19,368, +1,83,3526,5,9, +1,2519,1618,1,2557, +1627,1,2521,3527,16, +0,366,1,2559,1633, +1,2597,3528,16,0, +366,1,2561,3529,16, +0,366,1,2459,882, +1,2464,899,1,2470, +3530,16,0,366,1, +84,3531,19,365,1, +84,3532,5,9,1, +2519,1618,1,2557,1627, +1,2521,3533,16,0, +363,1,2559,1633,1, +2597,3534,16,0,363, +1,2561,3535,16,0, +363,1,2459,882,1, +2464,899,1,2470,3536, +16,0,363,1,85, +3537,19,362,1,85, +3538,5,9,1,2519, +1618,1,2557,1627,1, +2521,3539,16,0,360, +1,2559,1633,1,2597, +3540,16,0,360,1, +2561,3541,16,0,360, +1,2459,882,1,2464, +899,1,2470,3542,16, +0,360,1,86,3543, +19,359,1,86,3544, +5,9,1,2519,1618, +1,2557,1627,1,2521, +3545,16,0,357,1, +2559,1633,1,2597,3546, +16,0,357,1,2561, +3547,16,0,357,1, +2459,882,1,2464,899, +1,2470,3548,16,0, +357,1,87,3549,19, +356,1,87,3550,5, +9,1,2519,1618,1, +2557,1627,1,2521,3551, +16,0,354,1,2559, +1633,1,2597,3552,16, +0,354,1,2561,3553, +16,0,354,1,2459, +882,1,2464,899,1, +2470,3554,16,0,354, +1,88,3555,19,353, +1,88,3556,5,9, +1,2519,1618,1,2557, +1627,1,2521,3557,16, +0,351,1,2559,1633, +1,2597,3558,16,0, +351,1,2561,3559,16, +0,351,1,2459,882, +1,2464,899,1,2470, +3560,16,0,351,1, +89,3561,19,347,1, +89,3562,5,9,1, +2519,1618,1,2557,1627, +1,2521,3563,16,0, +345,1,2559,1633,1, +2597,3564,16,0,345, +1,2561,3565,16,0, +345,1,2459,882,1, +2464,899,1,2470,3566, +16,0,345,1,90, +3567,19,350,1,90, +3568,5,9,1,2519, +1618,1,2557,1627,1, +2521,3569,16,0,348, +1,2559,1633,1,2597, +3570,16,0,348,1, +2561,3571,16,0,348, +1,2459,882,1,2464, +899,1,2470,3572,16, +0,348,1,91,3573, +19,344,1,91,3574, +5,9,1,2519,1618, +1,2557,1627,1,2521, +3575,16,0,342,1, +2559,1633,1,2597,3576, +16,0,342,1,2561, +3577,16,0,342,1, +2459,882,1,2464,899, +1,2470,3578,16,0, +342,1,92,3579,19, +133,1,92,3580,5, +125,1,0,3581,16, +0,563,1,1,1951, +1,2,1957,1,3, +1962,1,4,1967,1, +5,1972,1,6,1977, +1,7,1982,1,8, +3582,16,0,131,1, +1515,3583,16,0,165, +1,2021,718,1,2022, +3584,16,0,497,1, +256,3585,16,0,173, +1,2025,3586,16,0, +501,1,18,3587,16, +0,138,1,2027,3588, +16,0,505,1,2695, +3589,16,0,563,1, 2029,725,1,2030,731, 1,2031,736,1,2032, 741,1,2033,746,1, -277,3847,16,0,618, +277,3590,16,0,173, 1,2035,752,1,2037, 757,1,2039,762,1, -32,3848,16,0,618, +32,3591,16,0,165, 1,2041,768,1,2293, -3849,16,0,618,1, +3592,16,0,173,1, 2043,774,1,2045,779, -1,41,3850,16,0, -618,1,1297,3851,16, -0,618,1,43,3852, -16,0,618,1,1803, -787,1,1804,3853,16, -0,618,1,299,3854, -16,0,618,1,52, -3855,16,0,618,1, -2318,3856,16,0,618, -1,62,3857,16,0, -618,1,2075,3858,16, -0,618,1,1574,799, -1,71,3859,16,0, -618,1,76,3860,16, -0,618,1,1834,3861, -16,0,618,1,2337, -3862,16,0,618,1, -79,3863,16,0,618, -1,1335,3864,16,0, -618,1,322,3865,16, -0,618,1,85,3866, -16,0,618,1,89, -3867,16,0,618,1, -346,3868,16,0,618, -1,2105,814,1,2106, -3869,16,0,618,1, -97,3870,16,0,618, -1,1860,821,1,2364, -827,1,102,3871,16, -0,618,1,112,3872, -16,0,618,1,1117, -3873,16,0,618,1, -1873,835,1,1876,3874, -16,0,618,1,124, -3875,16,0,618,1, -2136,842,1,381,3876, -16,0,618,1,525, -3877,16,0,618,1, -137,3878,16,0,618, -1,1901,3879,16,0, -618,1,2658,3880,16, -0,618,1,1153,3881, -16,0,618,1,151, -3882,16,0,618,1, -1407,3883,16,0,618, -1,1659,3884,16,0, -618,1,2413,3885,16, -0,618,1,406,3886, -16,0,618,1,1371, -3887,16,0,618,1, -166,3888,16,0,618, -1,1622,3889,16,0, -618,1,1931,861,1, -1933,3890,16,0,618, -1,431,3891,16,0, -618,1,1585,3892,16, -0,618,1,182,3893, -16,0,618,1,1189, -3894,16,0,618,1, -1443,3895,16,0,618, -1,1695,3896,16,0, -618,1,2198,3897,16, -0,618,1,447,3898, -16,0,618,1,2458, -876,1,2459,882,1, -1958,3899,16,0,618, -1,2462,889,1,1657, -894,1,2464,899,1, -199,3900,16,0,618, -1,459,3901,16,0, -618,1,462,3902,16, -0,618,1,217,3903, -16,0,618,1,2227, -908,1,1225,3904,16, -0,618,1,1479,3905, -16,0,618,1,1731, -3906,16,0,618,1, -1989,916,1,1990,3907, -16,0,618,1,236, -3908,16,0,618,1, -1756,3909,16,0,618, -1,96,3910,19,103, -1,96,3911,5,1, -1,0,3912,16,0, -104,1,97,3913,19, -611,1,97,3914,5, -1,1,0,3915,16, -0,609,1,98,3916, -19,636,1,98,3917, -5,2,1,0,3918, -16,0,638,1,2695, -3919,16,0,634,1, -99,3920,19,633,1, -99,3921,5,2,1, -0,3922,16,0,637, -1,2695,3923,16,0, -631,1,100,3924,19, -296,1,100,3925,5, -2,1,0,3926,16, -0,557,1,2695,3927, -16,0,294,1,101, -3928,19,561,1,101, -3929,5,4,1,0, -3930,16,0,641,1, -2695,3931,16,0,641, -1,2706,3932,16,0, -559,1,2636,3933,16, -0,559,1,102,3934, -19,591,1,102,3935, -5,2,1,2470,3936, -16,0,664,1,2561, -3937,16,0,589,1, -103,3938,19,463,1, -103,3939,5,4,1, -2597,3940,16,0,558, -1,2521,3941,16,0, -558,1,2470,3942,16, -0,461,1,2561,3943, -16,0,461,1,104, -3944,19,141,1,104, -3945,5,3,1,2642, -3946,16,0,569,1, -2506,3947,16,0,317, -1,10,3948,16,0, -139,1,105,3949,19, -151,1,105,3950,5, -17,1,0,3951,16, -0,254,1,2075,3952, -16,0,648,1,2337, -3953,16,0,648,1, -2413,3954,16,0,648, -1,10,3955,16,0, -336,1,2198,3956,16, -0,648,1,1901,3957, -16,0,648,1,2642, -3958,16,0,336,1, -21,3959,16,0,149, -1,2106,3960,16,0, -648,1,2506,3961,16, -0,336,1,1804,3962, -16,0,648,1,1990, -3963,16,0,648,1, -2695,3964,16,0,254, -1,32,3965,16,0, -648,1,1958,3966,16, -0,648,1,1775,3967, -16,0,648,1,106, -3968,19,130,1,106, -3969,5,18,1,0, -3970,16,0,128,1, -2642,3971,16,0,137, -1,2075,3972,16,0, -137,1,2337,3973,16, -0,137,1,2413,3974, -16,0,137,1,10, -3975,16,0,137,1, -2198,3976,16,0,137, -1,1901,3977,16,0, -137,1,52,3978,16, -0,193,1,21,3979, -16,0,137,1,2106, -3980,16,0,137,1, -2506,3981,16,0,137, -1,1804,3982,16,0, -137,1,1990,3983,16, -0,137,1,2695,3984, -16,0,128,1,32, -3985,16,0,137,1, -1958,3986,16,0,137, -1,1775,3987,16,0, -137,1,107,3988,19, -658,1,107,3989,5, -4,1,2597,3990,16, -0,656,1,2521,3991, -16,0,656,1,2470, -3992,16,0,656,1, -2561,3993,16,0,656, -1,108,3994,19,335, -1,108,3995,5,14, -1,2517,3996,16,0, -437,1,2075,3997,16, -0,506,1,2337,3998, -16,0,506,1,2413, -3999,16,0,506,1, -1901,4000,16,0,506, -1,2198,4001,16,0, -506,1,2106,4002,16, -0,506,1,2653,4003, -16,0,571,1,1804, -4004,16,0,506,1, -1990,4005,16,0,506, -1,31,4006,16,0, -333,1,32,4007,16, -0,506,1,1958,4008, -16,0,506,1,1775, -4009,16,0,506,1, -109,4010,19,302,1, -109,4011,5,1,1, -32,4012,16,0,300, -1,110,4013,19,261, -1,110,4014,5,11, -1,2075,4015,16,0, -577,1,2337,4016,16, -0,265,1,2413,4017, -16,0,445,1,1901, -4018,16,0,391,1, -2198,4019,16,0,319, -1,2106,4020,16,0, -607,1,1804,4021,16, -0,284,1,1990,4022, -16,0,494,1,32, -4023,16,0,329,1, -1958,4024,16,0,450, -1,1775,4025,16,0, -259,1,111,4026,19, -583,1,111,4027,5, -11,1,2075,4028,16, -0,581,1,2337,4029, -16,0,581,1,2413, -4030,16,0,581,1, -1901,4031,16,0,581, -1,2198,4032,16,0, -581,1,2106,4033,16, -0,581,1,1804,4034, -16,0,581,1,1990, -4035,16,0,581,1, -32,4036,16,0,581, -1,1958,4037,16,0, -581,1,1775,4038,16, -0,581,1,112,4039, -19,645,1,112,4040, -5,11,1,2075,4041, -16,0,643,1,2337, -4042,16,0,643,1, -2413,4043,16,0,643, -1,1901,4044,16,0, -643,1,2198,4045,16, -0,643,1,2106,4046, -16,0,643,1,1804, -4047,16,0,643,1, -1990,4048,16,0,643, -1,32,4049,16,0, -643,1,1958,4050,16, -0,643,1,1775,4051, -16,0,643,1,113, -4052,19,161,1,113, -4053,5,31,1,1901, -4054,16,0,647,1, -1479,4055,16,0,551, -1,2075,4056,16,0, -647,1,1695,4057,16, -0,189,1,1756,4058, -16,0,188,1,2413, -4059,16,0,647,1, -2198,4060,16,0,647, -1,1876,4061,16,0, -661,1,1659,4062,16, -0,188,1,1443,4063, -16,0,522,1,1117, -4064,16,0,159,1, -1990,4065,16,0,647, -1,1189,4066,16,0, -240,1,1775,4067,16, -0,647,1,32,4068, -16,0,647,1,2106, -4069,16,0,647,1, -1515,4070,16,0,579, -1,2337,4071,16,0, -647,1,52,4072,16, -0,592,1,1804,4073, -16,0,647,1,1261, -4074,16,0,298,1, -1153,4075,16,0,247, -1,1225,4076,16,0, -274,1,1335,4077,16, -0,443,1,1933,4078, -16,0,553,1,1834, -4079,16,0,312,1, -1297,4080,16,0,323, -1,1407,4081,16,0, -568,1,2318,4082,16, -0,188,1,1958,4083, -16,0,647,1,1371, -4084,16,0,438,1, -114,4085,19,531,1, -114,4086,5,11,1, -2075,4087,16,0,529, -1,2337,4088,16,0, -529,1,2413,4089,16, -0,529,1,1901,4090, -16,0,529,1,2198, -4091,16,0,529,1, -2106,4092,16,0,529, -1,1804,4093,16,0, -529,1,1990,4094,16, -0,529,1,32,4095, -16,0,529,1,1958, -4096,16,0,529,1, -1775,4097,16,0,529, -1,115,4098,19,527, -1,115,4099,5,11, -1,2075,4100,16,0, -525,1,2337,4101,16, -0,525,1,2413,4102, -16,0,525,1,1901, -4103,16,0,525,1, -2198,4104,16,0,525, -1,2106,4105,16,0, -525,1,1804,4106,16, -0,525,1,1990,4107, -16,0,525,1,32, -4108,16,0,525,1, -1958,4109,16,0,525, -1,1775,4110,16,0, -525,1,116,4111,19, -575,1,116,4112,5, -11,1,2075,4113,16, -0,573,1,2337,4114, -16,0,573,1,2413, -4115,16,0,573,1, -1901,4116,16,0,573, -1,2198,4117,16,0, -573,1,2106,4118,16, -0,573,1,1804,4119, -16,0,573,1,1990, -4120,16,0,573,1, -32,4121,16,0,573, -1,1958,4122,16,0, -573,1,1775,4123,16, -0,573,1,117,4124, -19,521,1,117,4125, -5,11,1,2075,4126, -16,0,519,1,2337, -4127,16,0,519,1, -2413,4128,16,0,519, -1,1901,4129,16,0, -519,1,2198,4130,16, -0,519,1,2106,4131, -16,0,519,1,1804, -4132,16,0,519,1, -1990,4133,16,0,519, -1,32,4134,16,0, -519,1,1958,4135,16, -0,519,1,1775,4136, -16,0,519,1,118, -4137,19,518,1,118, -4138,5,11,1,2075, -4139,16,0,516,1, -2337,4140,16,0,516, -1,2413,4141,16,0, -516,1,1901,4142,16, -0,516,1,2198,4143, -16,0,516,1,2106, -4144,16,0,516,1, -1804,4145,16,0,516, -1,1990,4146,16,0, -516,1,32,4147,16, -0,516,1,1958,4148, -16,0,516,1,1775, -4149,16,0,516,1, -119,4150,19,515,1, -119,4151,5,11,1, -2075,4152,16,0,513, -1,2337,4153,16,0, -513,1,2413,4154,16, -0,513,1,1901,4155, -16,0,513,1,2198, -4156,16,0,513,1, -2106,4157,16,0,513, -1,1804,4158,16,0, -513,1,1990,4159,16, -0,513,1,32,4160, -16,0,513,1,1958, -4161,16,0,513,1, -1775,4162,16,0,513, -1,120,4163,19,512, -1,120,4164,5,11, -1,2075,4165,16,0, -510,1,2337,4166,16, -0,510,1,2413,4167, -16,0,510,1,1901, -4168,16,0,510,1, -2198,4169,16,0,510, -1,2106,4170,16,0, -510,1,1804,4171,16, -0,510,1,1990,4172, -16,0,510,1,32, -4173,16,0,510,1, -1958,4174,16,0,510, -1,1775,4175,16,0, -510,1,121,4176,19, -509,1,121,4177,5, -11,1,2075,4178,16, -0,507,1,2337,4179, -16,0,507,1,2413, -4180,16,0,507,1, -1901,4181,16,0,507, -1,2198,4182,16,0, -507,1,2106,4183,16, -0,507,1,1804,4184, -16,0,507,1,1990, -4185,16,0,507,1, -32,4186,16,0,507, -1,1958,4187,16,0, -507,1,1775,4188,16, -0,507,1,122,4189, -19,147,1,122,4190, -5,3,1,1756,4191, -16,0,283,1,2318, -4192,16,0,297,1, -1659,4193,16,0,145, -1,123,4194,19,548, -1,123,4195,5,68, -1,1901,4196,16,0, -546,1,1479,4197,16, -0,546,1,112,4198, -16,0,546,1,2293, -4199,16,0,546,1, -1804,4200,16,0,546, -1,431,4201,16,0, -546,1,1443,4202,16, -0,546,1,1756,4203, -16,0,546,1,124, -4204,16,0,546,1, -525,4205,16,0,546, -1,236,4206,16,0, -546,1,346,4207,16, -0,546,1,1876,4208, -16,0,546,1,1659, -4209,16,0,546,1, -1225,4210,16,0,546, -1,1117,4211,16,0, -546,1,137,4212,16, -0,546,1,2318,4213, -16,0,546,1,1775, -4214,16,0,546,1, -32,4215,16,0,546, -1,1407,4216,16,0, -546,1,256,4217,16, -0,546,1,459,4218, -16,0,546,1,406, -4219,16,0,546,1, -41,4220,16,0,546, -1,2658,4221,16,0, -546,1,43,4222,16, -0,546,1,1585,4223, -16,0,546,1,1990, -4224,16,0,546,1, -2337,4225,16,0,546, -1,509,4226,16,0, -546,1,52,4227,16, -0,546,1,151,4228, -16,0,546,1,447, -4229,16,0,546,1, -166,4230,16,0,546, -1,462,4231,16,0, -546,1,277,4232,16, -0,546,1,1695,4233, -16,0,546,1,62, -4234,16,0,586,1, -1153,4235,16,0,546, -1,381,4236,16,0, -546,1,2106,4237,16, -0,546,1,1335,4238, -16,0,546,1,71, -4239,16,0,546,1, -182,4240,16,0,546, -1,76,4241,16,0, -546,1,79,4242,16, -0,546,1,1933,4243, -16,0,546,1,299, -4244,16,0,546,1, -85,4245,16,0,546, -1,1515,4246,16,0, -546,1,2198,4247,16, -0,546,1,89,4248, -16,0,546,1,1834, -4249,16,0,546,1, -1622,4250,16,0,546, -1,2413,4251,16,0, -546,1,2075,4252,16, -0,546,1,1731,4253, -16,0,546,1,97, -4254,16,0,546,1, -1297,4255,16,0,546, -1,1189,4256,16,0, -546,1,102,4257,16, -0,546,1,1261,4258, -16,0,546,1,322, -4259,16,0,546,1, -1958,4260,16,0,546, -1,199,4261,16,0, -546,1,1371,4262,16, -0,546,1,217,4263, -16,0,546,1,124, -4264,19,602,1,124, -4265,5,2,1,459, -4266,16,0,600,1, -41,4267,16,0,665, -1,125,4268,19,606, -1,125,4269,5,3, -1,462,4270,16,0, -604,1,459,4271,16, -0,630,1,41,4272, -16,0,630,1,126, -4273,19,4274,4,36, -69,0,120,0,112, -0,114,0,101,0, -115,0,115,0,105, -0,111,0,110,0, -65,0,114,0,103, -0,117,0,109,0, -101,0,110,0,116, -0,1,126,4269,1, -127,4275,19,544,1, -127,4276,5,68,1, -1901,4277,16,0,542, -1,1479,4278,16,0, -542,1,112,4279,16, -0,542,1,2293,4280, -16,0,542,1,1804, -4281,16,0,542,1, -431,4282,16,0,542, -1,1443,4283,16,0, -542,1,1756,4284,16, -0,542,1,124,4285, -16,0,542,1,525, -4286,16,0,542,1, -236,4287,16,0,542, -1,346,4288,16,0, -542,1,1876,4289,16, -0,542,1,1659,4290, -16,0,542,1,1225, -4291,16,0,542,1, -1117,4292,16,0,542, -1,137,4293,16,0, -542,1,2318,4294,16, -0,542,1,1775,4295, -16,0,542,1,32, -4296,16,0,542,1, -1407,4297,16,0,542, -1,256,4298,16,0, -542,1,459,4299,16, -0,542,1,406,4300, -16,0,542,1,41, -4301,16,0,542,1, -2658,4302,16,0,542, -1,43,4303,16,0, -542,1,1585,4304,16, -0,542,1,1990,4305, -16,0,542,1,2337, -4306,16,0,542,1, -509,4307,16,0,542, -1,52,4308,16,0, -542,1,151,4309,16, -0,542,1,447,4310, -16,0,542,1,166, -4311,16,0,542,1, -462,4312,16,0,542, -1,277,4313,16,0, -542,1,1695,4314,16, -0,542,1,62,4315, -16,0,587,1,1153, -4316,16,0,542,1, -381,4317,16,0,542, -1,2106,4318,16,0, -542,1,1335,4319,16, -0,542,1,71,4320, -16,0,542,1,182, -4321,16,0,542,1, -76,4322,16,0,542, -1,79,4323,16,0, -542,1,1933,4324,16, -0,542,1,299,4325, -16,0,542,1,85, -4326,16,0,542,1, -1515,4327,16,0,542, -1,2198,4328,16,0, -542,1,89,4329,16, -0,542,1,1834,4330, -16,0,542,1,1622, -4331,16,0,542,1, -2413,4332,16,0,542, -1,2075,4333,16,0, -542,1,1731,4334,16, -0,542,1,97,4335, -16,0,542,1,1297, -4336,16,0,542,1, -1189,4337,16,0,542, -1,102,4338,16,0, -542,1,1261,4339,16, -0,542,1,322,4340, -16,0,542,1,1958, -4341,16,0,542,1, -199,4342,16,0,542, -1,1371,4343,16,0, -542,1,217,4344,16, -0,542,1,128,4345, -19,4346,4,28,86, -0,101,0,99,0, -116,0,111,0,114, -0,67,0,111,0, -110,0,115,0,116, -0,97,0,110,0, -116,0,1,128,4276, -1,129,4347,19,4348, -4,32,82,0,111, -0,116,0,97,0, -116,0,105,0,111, -0,110,0,67,0, -111,0,110,0,115, -0,116,0,97,0, -110,0,116,0,1, -129,4276,1,130,4349, -19,4350,4,24,76, -0,105,0,115,0, -116,0,67,0,111, -0,110,0,115,0, -116,0,97,0,110, -0,116,0,1,130, -4276,1,131,4351,19, -169,1,131,4352,5, -67,1,1901,4353,16, -0,585,1,1479,4354, -16,0,533,1,112, -4355,16,0,249,1, -2293,4356,16,0,273, -1,1804,4357,16,0, -585,1,431,4358,16, -0,580,1,1443,4359, -16,0,468,1,1756, -4360,16,0,673,1, -124,4361,16,0,258, -1,525,4362,16,0, -305,1,236,4363,16, -0,341,1,346,4364, -16,0,496,1,1876, -4365,16,0,318,1, -1659,4366,16,0,673, -1,1225,4367,16,0, -248,1,1117,4368,16, -0,219,1,137,4369, -16,0,272,1,2318, -4370,16,0,673,1, -1775,4371,16,0,585, -1,32,4372,16,0, -585,1,1407,4373,16, -0,487,1,256,4374, -16,0,395,1,459, -4375,16,0,167,1, -406,4376,16,0,562, -1,41,4377,16,0, -167,1,2658,4378,16, -0,659,1,43,4379, -16,0,640,1,1990, -4380,16,0,585,1, -2337,4381,16,0,585, -1,509,4382,16,0, -655,1,52,4383,16, -0,594,1,151,4384, -16,0,282,1,447, -4385,16,0,305,1, -166,4386,16,0,293, -1,462,4387,16,0, -167,1,277,4388,16, -0,434,1,1695,4389, -16,0,270,1,1261, -4390,16,0,281,1, -1153,4391,16,0,174, -1,381,4392,16,0, -550,1,2106,4393,16, -0,585,1,1335,4394, -16,0,326,1,71, -4395,16,0,203,1, -182,4396,16,0,305, -1,76,4397,16,0, -549,1,79,4398,16, -0,218,1,1933,4399, -16,0,407,1,299, -4400,16,0,444,1, -85,4401,16,0,457, -1,1515,4402,16,0, -556,1,2198,4403,16, -0,585,1,89,4404, -16,0,227,1,1834, -4405,16,0,292,1, -1622,4406,16,0,654, -1,2413,4407,16,0, -585,1,2075,4408,16, -0,585,1,1731,4409, -16,0,250,1,97, -4410,16,0,411,1, -1297,4411,16,0,328, -1,1189,4412,16,0, -217,1,102,4413,16, -0,238,1,1585,4414, -16,0,663,1,322, -4415,16,0,458,1, -1958,4416,16,0,585, -1,199,4417,16,0, -316,1,1371,4418,16, -0,396,1,217,4419, -16,0,325,1,132, -4420,19,4421,4,36, -67,0,111,0,110, -0,115,0,116,0, -97,0,110,0,116, -0,69,0,120,0, -112,0,114,0,101, -0,115,0,115,0, -105,0,111,0,110, -0,1,132,4352,1, -133,4422,19,4423,4, -30,73,0,100,0, -101,0,110,0,116, -0,69,0,120,0, -112,0,114,0,101, -0,115,0,115,0, -105,0,111,0,110, -0,1,133,4352,1, -134,4424,19,4425,4, -36,73,0,100,0, -101,0,110,0,116, -0,68,0,111,0, -116,0,69,0,120, +1,2713,3170,1,2715, +3159,1,41,3593,16, +0,173,1,1297,3594, +16,0,165,1,43, +3595,16,0,173,1, +46,3596,16,0,178, +1,1804,3597,16,0, +165,1,299,3598,16, +0,173,1,52,3599, +16,0,165,1,509, +3600,16,0,173,1, +2318,3601,16,0,165, +1,62,3602,16,0, +195,1,65,3603,16, +0,197,1,2075,3604, +16,0,165,1,1574, +799,1,71,3605,16, +0,173,1,1775,3606, +16,0,165,1,76, +3607,16,0,173,1, +1834,3608,16,0,165, +1,2337,3609,16,0, +165,1,79,3610,16, +0,173,1,1335,3611, +16,0,165,1,322, +3612,16,0,173,1, +85,3613,16,0,173, +1,1261,3614,16,0, +165,1,89,3615,16, +0,173,1,346,3616, +16,0,173,1,97, +3617,16,0,173,1, +2106,3618,16,0,165, +1,102,3619,16,0, +173,1,1860,821,1, +1803,787,1,2364,827, +1,1113,3620,16,0, +158,1,112,3621,16, +0,173,1,1117,3622, +16,0,165,1,1873, +835,1,1876,3623,16, +0,165,1,372,3624, +16,0,535,1,374, +3625,16,0,537,1, +124,3626,16,0,173, +1,376,3627,16,0, +539,1,378,3628,16, +0,541,1,2136,842, +1,381,3629,16,0, +173,1,525,3630,16, +0,173,1,137,3631, +16,0,173,1,1901, +3632,16,0,165,1, +2655,3175,1,2658,3633, +16,0,173,1,1153, +3634,16,0,165,1, +151,3635,16,0,173, +1,1407,3636,16,0, +165,1,1659,3637,16, +0,165,1,2413,3638, +16,0,165,1,406, +3639,16,0,173,1, +1371,3640,16,0,165, +1,2105,814,1,1657, +894,1,166,3641,16, +0,173,1,1622,3642, +16,0,173,1,2683, +3187,1,1931,861,1, +1933,3643,16,0,165, +1,431,3644,16,0, +173,1,1585,3645,16, +0,173,1,182,3646, +16,0,173,1,2694, +3180,1,1189,3647,16, +0,165,1,1443,3648, +16,0,165,1,1695, +3649,16,0,165,1, +2198,3650,16,0,165, +1,447,3651,16,0, +173,1,2458,876,1, +2459,882,1,1958,3652, +16,0,165,1,2462, +889,1,2714,3147,1, +2464,899,1,2716,3153, +1,2466,3164,1,459, +3653,16,0,173,1, +2468,3654,16,0,340, +1,462,3655,16,0, +173,1,199,3656,16, +0,173,1,217,3657, +16,0,173,1,2227, +908,1,1225,3658,16, +0,165,1,1479,3659, +16,0,165,1,1731, +3660,16,0,173,1, +1989,916,1,1990,3661, +16,0,165,1,236, +3662,16,0,173,1, +1756,3663,16,0,165, +1,93,3664,19,626, +1,93,3665,5,95, +1,256,3666,16,0, +624,1,1261,3667,16, +0,624,1,509,3668, +16,0,624,1,1515, +3669,16,0,624,1, +2021,718,1,1775,3670, +16,0,624,1,2029, +725,1,2030,731,1, +2031,736,1,2032,741, +1,2033,746,1,277, +3671,16,0,624,1, +2035,752,1,2037,757, +1,2039,762,1,32, +3672,16,0,624,1, +2041,768,1,2293,3673, +16,0,624,1,2043, +774,1,2045,779,1, +41,3674,16,0,624, +1,1297,3675,16,0, +624,1,43,3676,16, +0,624,1,1803,787, +1,1804,3677,16,0, +624,1,299,3678,16, +0,624,1,52,3679, +16,0,624,1,2318, +3680,16,0,624,1, +62,3681,16,0,624, +1,2075,3682,16,0, +624,1,1574,799,1, +71,3683,16,0,624, +1,76,3684,16,0, +624,1,1834,3685,16, +0,624,1,2337,3686, +16,0,624,1,79, +3687,16,0,624,1, +1335,3688,16,0,624, +1,322,3689,16,0, +624,1,85,3690,16, +0,624,1,89,3691, +16,0,624,1,346, +3692,16,0,624,1, +2105,814,1,2106,3693, +16,0,624,1,97, +3694,16,0,624,1, +1860,821,1,2364,827, +1,102,3695,16,0, +624,1,112,3696,16, +0,624,1,1117,3697, +16,0,624,1,1873, +835,1,1876,3698,16, +0,624,1,124,3699, +16,0,624,1,2136, +842,1,381,3700,16, +0,624,1,525,3701, +16,0,624,1,137, +3702,16,0,624,1, +1901,3703,16,0,624, +1,2658,3704,16,0, +624,1,1153,3705,16, +0,624,1,151,3706, +16,0,624,1,1407, +3707,16,0,624,1, +1659,3708,16,0,624, +1,2413,3709,16,0, +624,1,406,3710,16, +0,624,1,1371,3711, +16,0,624,1,166, +3712,16,0,624,1, +1622,3713,16,0,624, +1,1931,861,1,1933, +3714,16,0,624,1, +431,3715,16,0,624, +1,1585,3716,16,0, +624,1,182,3717,16, +0,624,1,1189,3718, +16,0,624,1,1443, +3719,16,0,624,1, +1695,3720,16,0,624, +1,2198,3721,16,0, +624,1,447,3722,16, +0,624,1,2458,876, +1,2459,882,1,1958, +3723,16,0,624,1, +2462,889,1,1657,894, +1,2464,899,1,199, +3724,16,0,624,1, +459,3725,16,0,624, +1,462,3726,16,0, +624,1,217,3727,16, +0,624,1,2227,908, +1,1225,3728,16,0, +624,1,1479,3729,16, +0,624,1,1731,3730, +16,0,624,1,1989, +916,1,1990,3731,16, +0,624,1,236,3732, +16,0,624,1,1756, +3733,16,0,624,1, +94,3734,19,623,1, +94,3735,5,95,1, +256,3736,16,0,621, +1,1261,3737,16,0, +621,1,509,3738,16, +0,621,1,1515,3739, +16,0,621,1,2021, +718,1,1775,3740,16, +0,621,1,2029,725, +1,2030,731,1,2031, +736,1,2032,741,1, +2033,746,1,277,3741, +16,0,621,1,2035, +752,1,2037,757,1, +2039,762,1,32,3742, +16,0,621,1,2041, +768,1,2293,3743,16, +0,621,1,2043,774, +1,2045,779,1,41, +3744,16,0,621,1, +1297,3745,16,0,621, +1,43,3746,16,0, +621,1,1803,787,1, +1804,3747,16,0,621, +1,299,3748,16,0, +621,1,52,3749,16, +0,621,1,2318,3750, +16,0,621,1,62, +3751,16,0,621,1, +2075,3752,16,0,621, +1,1574,799,1,71, +3753,16,0,621,1, +76,3754,16,0,621, +1,1834,3755,16,0, +621,1,2337,3756,16, +0,621,1,79,3757, +16,0,621,1,1335, +3758,16,0,621,1, +322,3759,16,0,621, +1,85,3760,16,0, +621,1,89,3761,16, +0,621,1,346,3762, +16,0,621,1,2105, +814,1,2106,3763,16, +0,621,1,97,3764, +16,0,621,1,1860, +821,1,2364,827,1, +102,3765,16,0,621, +1,112,3766,16,0, +621,1,1117,3767,16, +0,621,1,1873,835, +1,1876,3768,16,0, +621,1,124,3769,16, +0,621,1,2136,842, +1,381,3770,16,0, +621,1,525,3771,16, +0,621,1,137,3772, +16,0,621,1,1901, +3773,16,0,621,1, +2658,3774,16,0,621, +1,1153,3775,16,0, +621,1,151,3776,16, +0,621,1,1407,3777, +16,0,621,1,1659, +3778,16,0,621,1, +2413,3779,16,0,621, +1,406,3780,16,0, +621,1,1371,3781,16, +0,621,1,166,3782, +16,0,621,1,1622, +3783,16,0,621,1, +1931,861,1,1933,3784, +16,0,621,1,431, +3785,16,0,621,1, +1585,3786,16,0,621, +1,182,3787,16,0, +621,1,1189,3788,16, +0,621,1,1443,3789, +16,0,621,1,1695, +3790,16,0,621,1, +2198,3791,16,0,621, +1,447,3792,16,0, +621,1,2458,876,1, +2459,882,1,1958,3793, +16,0,621,1,2462, +889,1,1657,894,1, +2464,899,1,199,3794, +16,0,621,1,459, +3795,16,0,621,1, +462,3796,16,0,621, +1,217,3797,16,0, +621,1,2227,908,1, +1225,3798,16,0,621, +1,1479,3799,16,0, +621,1,1731,3800,16, +0,621,1,1989,916, +1,1990,3801,16,0, +621,1,236,3802,16, +0,621,1,1756,3803, +16,0,621,1,95, +3804,19,620,1,95, +3805,5,95,1,256, +3806,16,0,618,1, +1261,3807,16,0,618, +1,509,3808,16,0, +618,1,1515,3809,16, +0,618,1,2021,718, +1,1775,3810,16,0, +618,1,2029,725,1, +2030,731,1,2031,736, +1,2032,741,1,2033, +746,1,277,3811,16, +0,618,1,2035,752, +1,2037,757,1,2039, +762,1,32,3812,16, +0,618,1,2041,768, +1,2293,3813,16,0, +618,1,2043,774,1, +2045,779,1,41,3814, +16,0,618,1,1297, +3815,16,0,618,1, +43,3816,16,0,618, +1,1803,787,1,1804, +3817,16,0,618,1, +299,3818,16,0,618, +1,52,3819,16,0, +618,1,2318,3820,16, +0,618,1,62,3821, +16,0,618,1,2075, +3822,16,0,618,1, +1574,799,1,71,3823, +16,0,618,1,76, +3824,16,0,618,1, +1834,3825,16,0,618, +1,2337,3826,16,0, +618,1,79,3827,16, +0,618,1,1335,3828, +16,0,618,1,322, +3829,16,0,618,1, +85,3830,16,0,618, +1,89,3831,16,0, +618,1,346,3832,16, +0,618,1,2105,814, +1,2106,3833,16,0, +618,1,97,3834,16, +0,618,1,1860,821, +1,2364,827,1,102, +3835,16,0,618,1, +112,3836,16,0,618, +1,1117,3837,16,0, +618,1,1873,835,1, +1876,3838,16,0,618, +1,124,3839,16,0, +618,1,2136,842,1, +381,3840,16,0,618, +1,525,3841,16,0, +618,1,137,3842,16, +0,618,1,1901,3843, +16,0,618,1,2658, +3844,16,0,618,1, +1153,3845,16,0,618, +1,151,3846,16,0, +618,1,1407,3847,16, +0,618,1,1659,3848, +16,0,618,1,2413, +3849,16,0,618,1, +406,3850,16,0,618, +1,1371,3851,16,0, +618,1,166,3852,16, +0,618,1,1622,3853, +16,0,618,1,1931, +861,1,1933,3854,16, +0,618,1,431,3855, +16,0,618,1,1585, +3856,16,0,618,1, +182,3857,16,0,618, +1,1189,3858,16,0, +618,1,1443,3859,16, +0,618,1,1695,3860, +16,0,618,1,2198, +3861,16,0,618,1, +447,3862,16,0,618, +1,2458,876,1,2459, +882,1,1958,3863,16, +0,618,1,2462,889, +1,1657,894,1,2464, +899,1,199,3864,16, +0,618,1,459,3865, +16,0,618,1,462, +3866,16,0,618,1, +217,3867,16,0,618, +1,2227,908,1,1225, +3868,16,0,618,1, +1479,3869,16,0,618, +1,1731,3870,16,0, +618,1,1989,916,1, +1990,3871,16,0,618, +1,236,3872,16,0, +618,1,1756,3873,16, +0,618,1,96,3874, +19,103,1,96,3875, +5,1,1,0,3876, +16,0,104,1,97, +3877,19,611,1,97, +3878,5,1,1,0, +3879,16,0,609,1, +98,3880,19,636,1, +98,3881,5,2,1, +0,3882,16,0,638, +1,2695,3883,16,0, +634,1,99,3884,19, +633,1,99,3885,5, +2,1,0,3886,16, +0,637,1,2695,3887, +16,0,631,1,100, +3888,19,296,1,100, +3889,5,2,1,0, +3890,16,0,557,1, +2695,3891,16,0,294, +1,101,3892,19,561, +1,101,3893,5,4, +1,0,3894,16,0, +641,1,2695,3895,16, +0,641,1,2706,3896, +16,0,559,1,2636, +3897,16,0,559,1, +102,3898,19,591,1, +102,3899,5,2,1, +2470,3900,16,0,664, +1,2561,3901,16,0, +589,1,103,3902,19, +463,1,103,3903,5, +4,1,2597,3904,16, +0,558,1,2521,3905, +16,0,558,1,2470, +3906,16,0,461,1, +2561,3907,16,0,461, +1,104,3908,19,141, +1,104,3909,5,3, +1,2642,3910,16,0, +569,1,2506,3911,16, +0,317,1,10,3912, +16,0,139,1,105, +3913,19,151,1,105, +3914,5,17,1,0, +3915,16,0,254,1, +2075,3916,16,0,648, +1,2337,3917,16,0, +648,1,2413,3918,16, +0,648,1,10,3919, +16,0,336,1,2198, +3920,16,0,648,1, +1901,3921,16,0,648, +1,2642,3922,16,0, +336,1,21,3923,16, +0,149,1,2106,3924, +16,0,648,1,2506, +3925,16,0,336,1, +1804,3926,16,0,648, +1,1990,3927,16,0, +648,1,2695,3928,16, +0,254,1,32,3929, +16,0,648,1,1958, +3930,16,0,648,1, +1775,3931,16,0,648, +1,106,3932,19,130, +1,106,3933,5,18, +1,0,3934,16,0, +128,1,2642,3935,16, +0,137,1,2075,3936, +16,0,137,1,2337, +3937,16,0,137,1, +2413,3938,16,0,137, +1,10,3939,16,0, +137,1,2198,3940,16, +0,137,1,1901,3941, +16,0,137,1,52, +3942,16,0,193,1, +21,3943,16,0,137, +1,2106,3944,16,0, +137,1,2506,3945,16, +0,137,1,1804,3946, +16,0,137,1,1990, +3947,16,0,137,1, +2695,3948,16,0,128, +1,32,3949,16,0, +137,1,1958,3950,16, +0,137,1,1775,3951, +16,0,137,1,107, +3952,19,658,1,107, +3953,5,4,1,2597, +3954,16,0,656,1, +2521,3955,16,0,656, +1,2470,3956,16,0, +656,1,2561,3957,16, +0,656,1,108,3958, +19,335,1,108,3959, +5,14,1,2517,3960, +16,0,437,1,2075, +3961,16,0,506,1, +2337,3962,16,0,506, +1,2413,3963,16,0, +506,1,1901,3964,16, +0,506,1,2198,3965, +16,0,506,1,2106, +3966,16,0,506,1, +2653,3967,16,0,571, +1,1804,3968,16,0, +506,1,1990,3969,16, +0,506,1,31,3970, +16,0,333,1,32, +3971,16,0,506,1, +1958,3972,16,0,506, +1,1775,3973,16,0, +506,1,109,3974,19, +302,1,109,3975,5, +1,1,32,3976,16, +0,300,1,110,3977, +19,261,1,110,3978, +5,11,1,2075,3979, +16,0,577,1,2337, +3980,16,0,265,1, +2413,3981,16,0,445, +1,1901,3982,16,0, +391,1,2198,3983,16, +0,319,1,2106,3984, +16,0,607,1,1804, +3985,16,0,284,1, +1990,3986,16,0,494, +1,32,3987,16,0, +329,1,1958,3988,16, +0,450,1,1775,3989, +16,0,259,1,111, +3990,19,583,1,111, +3991,5,11,1,2075, +3992,16,0,581,1, +2337,3993,16,0,581, +1,2413,3994,16,0, +581,1,1901,3995,16, +0,581,1,2198,3996, +16,0,581,1,2106, +3997,16,0,581,1, +1804,3998,16,0,581, +1,1990,3999,16,0, +581,1,32,4000,16, +0,581,1,1958,4001, +16,0,581,1,1775, +4002,16,0,581,1, +112,4003,19,645,1, +112,4004,5,11,1, +2075,4005,16,0,643, +1,2337,4006,16,0, +643,1,2413,4007,16, +0,643,1,1901,4008, +16,0,643,1,2198, +4009,16,0,643,1, +2106,4010,16,0,643, +1,1804,4011,16,0, +643,1,1990,4012,16, +0,643,1,32,4013, +16,0,643,1,1958, +4014,16,0,643,1, +1775,4015,16,0,643, +1,113,4016,19,161, +1,113,4017,5,31, +1,1901,4018,16,0, +647,1,1479,4019,16, +0,551,1,2075,4020, +16,0,647,1,1695, +4021,16,0,189,1, +1756,4022,16,0,188, +1,2413,4023,16,0, +647,1,2198,4024,16, +0,647,1,1876,4025, +16,0,661,1,1659, +4026,16,0,188,1, +1443,4027,16,0,522, +1,1117,4028,16,0, +159,1,1990,4029,16, +0,647,1,1189,4030, +16,0,240,1,1775, +4031,16,0,647,1, +32,4032,16,0,647, +1,2106,4033,16,0, +647,1,1515,4034,16, +0,579,1,2337,4035, +16,0,647,1,52, +4036,16,0,592,1, +1804,4037,16,0,647, +1,1261,4038,16,0, +298,1,1153,4039,16, +0,247,1,1225,4040, +16,0,274,1,1335, +4041,16,0,443,1, +1933,4042,16,0,553, +1,1834,4043,16,0, +312,1,1297,4044,16, +0,323,1,1407,4045, +16,0,568,1,2318, +4046,16,0,188,1, +1958,4047,16,0,647, +1,1371,4048,16,0, +438,1,114,4049,19, +531,1,114,4050,5, +11,1,2075,4051,16, +0,529,1,2337,4052, +16,0,529,1,2413, +4053,16,0,529,1, +1901,4054,16,0,529, +1,2198,4055,16,0, +529,1,2106,4056,16, +0,529,1,1804,4057, +16,0,529,1,1990, +4058,16,0,529,1, +32,4059,16,0,529, +1,1958,4060,16,0, +529,1,1775,4061,16, +0,529,1,115,4062, +19,527,1,115,4063, +5,11,1,2075,4064, +16,0,525,1,2337, +4065,16,0,525,1, +2413,4066,16,0,525, +1,1901,4067,16,0, +525,1,2198,4068,16, +0,525,1,2106,4069, +16,0,525,1,1804, +4070,16,0,525,1, +1990,4071,16,0,525, +1,32,4072,16,0, +525,1,1958,4073,16, +0,525,1,1775,4074, +16,0,525,1,116, +4075,19,575,1,116, +4076,5,11,1,2075, +4077,16,0,573,1, +2337,4078,16,0,573, +1,2413,4079,16,0, +573,1,1901,4080,16, +0,573,1,2198,4081, +16,0,573,1,2106, +4082,16,0,573,1, +1804,4083,16,0,573, +1,1990,4084,16,0, +573,1,32,4085,16, +0,573,1,1958,4086, +16,0,573,1,1775, +4087,16,0,573,1, +117,4088,19,521,1, +117,4089,5,11,1, +2075,4090,16,0,519, +1,2337,4091,16,0, +519,1,2413,4092,16, +0,519,1,1901,4093, +16,0,519,1,2198, +4094,16,0,519,1, +2106,4095,16,0,519, +1,1804,4096,16,0, +519,1,1990,4097,16, +0,519,1,32,4098, +16,0,519,1,1958, +4099,16,0,519,1, +1775,4100,16,0,519, +1,118,4101,19,518, +1,118,4102,5,11, +1,2075,4103,16,0, +516,1,2337,4104,16, +0,516,1,2413,4105, +16,0,516,1,1901, +4106,16,0,516,1, +2198,4107,16,0,516, +1,2106,4108,16,0, +516,1,1804,4109,16, +0,516,1,1990,4110, +16,0,516,1,32, +4111,16,0,516,1, +1958,4112,16,0,516, +1,1775,4113,16,0, +516,1,119,4114,19, +515,1,119,4115,5, +11,1,2075,4116,16, +0,513,1,2337,4117, +16,0,513,1,2413, +4118,16,0,513,1, +1901,4119,16,0,513, +1,2198,4120,16,0, +513,1,2106,4121,16, +0,513,1,1804,4122, +16,0,513,1,1990, +4123,16,0,513,1, +32,4124,16,0,513, +1,1958,4125,16,0, +513,1,1775,4126,16, +0,513,1,120,4127, +19,512,1,120,4128, +5,11,1,2075,4129, +16,0,510,1,2337, +4130,16,0,510,1, +2413,4131,16,0,510, +1,1901,4132,16,0, +510,1,2198,4133,16, +0,510,1,2106,4134, +16,0,510,1,1804, +4135,16,0,510,1, +1990,4136,16,0,510, +1,32,4137,16,0, +510,1,1958,4138,16, +0,510,1,1775,4139, +16,0,510,1,121, +4140,19,509,1,121, +4141,5,11,1,2075, +4142,16,0,507,1, +2337,4143,16,0,507, +1,2413,4144,16,0, +507,1,1901,4145,16, +0,507,1,2198,4146, +16,0,507,1,2106, +4147,16,0,507,1, +1804,4148,16,0,507, +1,1990,4149,16,0, +507,1,32,4150,16, +0,507,1,1958,4151, +16,0,507,1,1775, +4152,16,0,507,1, +122,4153,19,147,1, +122,4154,5,3,1, +1756,4155,16,0,283, +1,2318,4156,16,0, +297,1,1659,4157,16, +0,145,1,123,4158, +19,548,1,123,4159, +5,68,1,1901,4160, +16,0,546,1,1479, +4161,16,0,546,1, +112,4162,16,0,546, +1,2293,4163,16,0, +546,1,1804,4164,16, +0,546,1,431,4165, +16,0,546,1,1443, +4166,16,0,546,1, +1756,4167,16,0,546, +1,124,4168,16,0, +546,1,525,4169,16, +0,546,1,236,4170, +16,0,546,1,346, +4171,16,0,546,1, +1876,4172,16,0,546, +1,1659,4173,16,0, +546,1,1225,4174,16, +0,546,1,1117,4175, +16,0,546,1,137, +4176,16,0,546,1, +2318,4177,16,0,546, +1,1775,4178,16,0, +546,1,32,4179,16, +0,546,1,1407,4180, +16,0,546,1,256, +4181,16,0,546,1, +459,4182,16,0,546, +1,406,4183,16,0, +546,1,41,4184,16, +0,546,1,2658,4185, +16,0,546,1,43, +4186,16,0,546,1, +1585,4187,16,0,546, +1,1990,4188,16,0, +546,1,2337,4189,16, +0,546,1,509,4190, +16,0,546,1,52, +4191,16,0,546,1, +151,4192,16,0,546, +1,447,4193,16,0, +546,1,166,4194,16, +0,546,1,462,4195, +16,0,546,1,277, +4196,16,0,546,1, +1695,4197,16,0,546, +1,62,4198,16,0, +586,1,1153,4199,16, +0,546,1,381,4200, +16,0,546,1,2106, +4201,16,0,546,1, +1335,4202,16,0,546, +1,71,4203,16,0, +546,1,182,4204,16, +0,546,1,76,4205, +16,0,546,1,79, +4206,16,0,546,1, +1933,4207,16,0,546, +1,299,4208,16,0, +546,1,85,4209,16, +0,546,1,1515,4210, +16,0,546,1,2198, +4211,16,0,546,1, +89,4212,16,0,546, +1,1834,4213,16,0, +546,1,1622,4214,16, +0,546,1,2413,4215, +16,0,546,1,2075, +4216,16,0,546,1, +1731,4217,16,0,546, +1,97,4218,16,0, +546,1,1297,4219,16, +0,546,1,1189,4220, +16,0,546,1,102, +4221,16,0,546,1, +1261,4222,16,0,546, +1,322,4223,16,0, +546,1,1958,4224,16, +0,546,1,199,4225, +16,0,546,1,1371, +4226,16,0,546,1, +217,4227,16,0,546, +1,124,4228,19,602, +1,124,4229,5,2, +1,459,4230,16,0, +600,1,41,4231,16, +0,665,1,125,4232, +19,606,1,125,4233, +5,3,1,462,4234, +16,0,604,1,459, +4235,16,0,630,1, +41,4236,16,0,630, +1,126,4237,19,4238, +4,36,69,0,120, 0,112,0,114,0, 101,0,115,0,115, 0,105,0,111,0, -110,0,1,134,4352, -1,135,4426,19,4427, -4,44,70,0,117, -0,110,0,99,0, -116,0,105,0,111, -0,110,0,67,0, -97,0,108,0,108, -0,69,0,120,0, -112,0,114,0,101, -0,115,0,115,0, -105,0,111,0,110, -0,1,135,4352,1, -136,4428,19,4429,4, -32,66,0,105,0, -110,0,97,0,114, -0,121,0,69,0, +110,0,65,0,114, +0,103,0,117,0, +109,0,101,0,110, +0,116,0,1,126, +4233,1,127,4239,19, +544,1,127,4240,5, +68,1,1901,4241,16, +0,542,1,1479,4242, +16,0,542,1,112, +4243,16,0,542,1, +2293,4244,16,0,542, +1,1804,4245,16,0, +542,1,431,4246,16, +0,542,1,1443,4247, +16,0,542,1,1756, +4248,16,0,542,1, +124,4249,16,0,542, +1,525,4250,16,0, +542,1,236,4251,16, +0,542,1,346,4252, +16,0,542,1,1876, +4253,16,0,542,1, +1659,4254,16,0,542, +1,1225,4255,16,0, +542,1,1117,4256,16, +0,542,1,137,4257, +16,0,542,1,2318, +4258,16,0,542,1, +1775,4259,16,0,542, +1,32,4260,16,0, +542,1,1407,4261,16, +0,542,1,256,4262, +16,0,542,1,459, +4263,16,0,542,1, +406,4264,16,0,542, +1,41,4265,16,0, +542,1,2658,4266,16, +0,542,1,43,4267, +16,0,542,1,1585, +4268,16,0,542,1, +1990,4269,16,0,542, +1,2337,4270,16,0, +542,1,509,4271,16, +0,542,1,52,4272, +16,0,542,1,151, +4273,16,0,542,1, +447,4274,16,0,542, +1,166,4275,16,0, +542,1,462,4276,16, +0,542,1,277,4277, +16,0,542,1,1695, +4278,16,0,542,1, +62,4279,16,0,587, +1,1153,4280,16,0, +542,1,381,4281,16, +0,542,1,2106,4282, +16,0,542,1,1335, +4283,16,0,542,1, +71,4284,16,0,542, +1,182,4285,16,0, +542,1,76,4286,16, +0,542,1,79,4287, +16,0,542,1,1933, +4288,16,0,542,1, +299,4289,16,0,542, +1,85,4290,16,0, +542,1,1515,4291,16, +0,542,1,2198,4292, +16,0,542,1,89, +4293,16,0,542,1, +1834,4294,16,0,542, +1,1622,4295,16,0, +542,1,2413,4296,16, +0,542,1,2075,4297, +16,0,542,1,1731, +4298,16,0,542,1, +97,4299,16,0,542, +1,1297,4300,16,0, +542,1,1189,4301,16, +0,542,1,102,4302, +16,0,542,1,1261, +4303,16,0,542,1, +322,4304,16,0,542, +1,1958,4305,16,0, +542,1,199,4306,16, +0,542,1,1371,4307, +16,0,542,1,217, +4308,16,0,542,1, +128,4309,19,4310,4, +28,86,0,101,0, +99,0,116,0,111, +0,114,0,67,0, +111,0,110,0,115, +0,116,0,97,0, +110,0,116,0,1, +128,4240,1,129,4311, +19,4312,4,32,82, +0,111,0,116,0, +97,0,116,0,105, +0,111,0,110,0, +67,0,111,0,110, +0,115,0,116,0, +97,0,110,0,116, +0,1,129,4240,1, +130,4313,19,4314,4, +24,76,0,105,0, +115,0,116,0,67, +0,111,0,110,0, +115,0,116,0,97, +0,110,0,116,0, +1,130,4240,1,131, +4315,19,169,1,131, +4316,5,67,1,1901, +4317,16,0,585,1, +1479,4318,16,0,533, +1,112,4319,16,0, +249,1,2293,4320,16, +0,273,1,1804,4321, +16,0,585,1,431, +4322,16,0,580,1, +1443,4323,16,0,468, +1,1756,4324,16,0, +673,1,124,4325,16, +0,258,1,525,4326, +16,0,305,1,236, +4327,16,0,341,1, +346,4328,16,0,496, +1,1876,4329,16,0, +318,1,1659,4330,16, +0,673,1,1225,4331, +16,0,248,1,1117, +4332,16,0,219,1, +137,4333,16,0,272, +1,2318,4334,16,0, +673,1,1775,4335,16, +0,585,1,32,4336, +16,0,585,1,1407, +4337,16,0,487,1, +256,4338,16,0,395, +1,459,4339,16,0, +167,1,406,4340,16, +0,562,1,41,4341, +16,0,167,1,2658, +4342,16,0,659,1, +43,4343,16,0,640, +1,1990,4344,16,0, +585,1,2337,4345,16, +0,585,1,509,4346, +16,0,655,1,52, +4347,16,0,594,1, +151,4348,16,0,282, +1,447,4349,16,0, +305,1,166,4350,16, +0,293,1,462,4351, +16,0,167,1,277, +4352,16,0,434,1, +1695,4353,16,0,270, +1,1261,4354,16,0, +281,1,1153,4355,16, +0,174,1,381,4356, +16,0,550,1,2106, +4357,16,0,585,1, +1335,4358,16,0,326, +1,71,4359,16,0, +203,1,182,4360,16, +0,305,1,76,4361, +16,0,549,1,79, +4362,16,0,218,1, +1933,4363,16,0,407, +1,299,4364,16,0, +444,1,85,4365,16, +0,457,1,1515,4366, +16,0,556,1,2198, +4367,16,0,585,1, +89,4368,16,0,227, +1,1834,4369,16,0, +292,1,1622,4370,16, +0,654,1,2413,4371, +16,0,585,1,2075, +4372,16,0,585,1, +1731,4373,16,0,250, +1,97,4374,16,0, +411,1,1297,4375,16, +0,328,1,1189,4376, +16,0,217,1,102, +4377,16,0,238,1, +1585,4378,16,0,663, +1,322,4379,16,0, +458,1,1958,4380,16, +0,585,1,199,4381, +16,0,316,1,1371, +4382,16,0,396,1, +217,4383,16,0,325, +1,132,4384,19,4385, +4,36,67,0,111, +0,110,0,115,0, +116,0,97,0,110, +0,116,0,69,0, 120,0,112,0,114, 0,101,0,115,0, 115,0,105,0,111, -0,110,0,1,136, -4352,1,137,4430,19, -4431,4,30,85,0, -110,0,97,0,114, -0,121,0,69,0, +0,110,0,1,132, +4316,1,133,4386,19, +4387,4,30,73,0, +100,0,101,0,110, +0,116,0,69,0, 120,0,112,0,114, 0,101,0,115,0, 115,0,105,0,111, -0,110,0,1,137, -4352,1,138,4432,19, -4433,4,36,84,0, -121,0,112,0,101, -0,99,0,97,0, -115,0,116,0,69, +0,110,0,1,133, +4316,1,134,4388,19, +4389,4,36,73,0, +100,0,101,0,110, +0,116,0,68,0, +111,0,116,0,69, 0,120,0,112,0, 114,0,101,0,115, 0,115,0,105,0, 111,0,110,0,1, -138,4352,1,139,4434, -19,4435,4,42,80, -0,97,0,114,0, -101,0,110,0,116, -0,104,0,101,0, -115,0,105,0,115, +134,4316,1,135,4390, +19,4391,4,44,70, +0,117,0,110,0, +99,0,116,0,105, +0,111,0,110,0, +67,0,97,0,108, +0,108,0,69,0, +120,0,112,0,114, +0,101,0,115,0, +115,0,105,0,111, +0,110,0,1,135, +4316,1,136,4392,19, +4393,4,32,66,0, +105,0,110,0,97, +0,114,0,121,0, +69,0,120,0,112, +0,114,0,101,0, +115,0,115,0,105, +0,111,0,110,0, +1,136,4316,1,137, +4394,19,4395,4,30, +85,0,110,0,97, +0,114,0,121,0, +69,0,120,0,112, +0,114,0,101,0, +115,0,115,0,105, +0,111,0,110,0, +1,137,4316,1,138, +4396,19,4397,4,36, +84,0,121,0,112, +0,101,0,99,0, +97,0,115,0,116, 0,69,0,120,0, 112,0,114,0,101, 0,115,0,115,0, 105,0,111,0,110, -0,1,139,4352,1, -140,4436,19,4437,4, -56,73,0,110,0, +0,1,138,4316,1, +139,4398,19,4399,4, +42,80,0,97,0, +114,0,101,0,110, +0,116,0,104,0, +101,0,115,0,105, +0,115,0,69,0, +120,0,112,0,114, +0,101,0,115,0, +115,0,105,0,111, +0,110,0,1,139, +4316,1,140,4400,19, +4401,4,56,73,0, +110,0,99,0,114, +0,101,0,109,0, +101,0,110,0,116, +0,68,0,101,0, 99,0,114,0,101, 0,109,0,101,0, -110,0,116,0,68, -0,101,0,99,0, -114,0,101,0,109, -0,101,0,110,0, -116,0,69,0,120, -0,112,0,114,0, -101,0,115,0,115, +110,0,116,0,69, +0,120,0,112,0, +114,0,101,0,115, +0,115,0,105,0, +111,0,110,0,1, +140,4316,1,142,4402, +19,683,1,142,3875, +1,143,4403,19,705, +1,143,3875,1,144, +4404,19,3156,1,144, +3878,1,145,4405,19, +3151,1,145,3878,1, +146,4406,19,3162,1, +146,3878,1,147,4407, +19,3173,1,147,3878, +1,148,4408,19,3184, +1,148,3881,1,149, +4409,19,3190,1,149, +3881,1,150,4410,19, +3178,1,150,3885,1, +151,4411,19,3168,1, +151,3885,1,152,4412, +19,689,1,152,3889, +1,153,4413,19,710, +1,153,3889,1,154, +4414,19,695,1,154, +3893,1,155,4415,19, +700,1,155,3893,1, +156,4416,19,1636,1, +156,3899,1,157,4417, +19,1631,1,157,3899, +1,158,4418,19,1622, +1,158,3903,1,159, +4419,19,1680,1,159, +3909,1,160,4420,19, +1657,1,160,3909,1, +161,4421,19,1117,1, +161,3914,1,162,4422, +19,902,1,162,3959, +1,163,4423,19,886, +1,163,3959,1,164, +4424,19,892,1,164, +3975,1,165,4425,19, +880,1,165,3975,1, +166,4426,19,1145,1, +166,3991,1,167,4427, +19,782,1,167,3978, +1,168,4428,19,897, +1,168,3978,1,169, +4429,19,777,1,169, +3978,1,170,4430,19, +802,1,170,3978,1, +171,4431,19,771,1, +171,3978,1,172,4432, +19,765,1,172,3978, +1,173,4433,19,760, +1,173,3978,1,174, +4434,19,755,1,174, +3978,1,175,4435,19, +749,1,175,3978,1, +176,4436,19,744,1, +176,3978,1,177,4437, +19,739,1,177,3978, +1,178,4438,19,734, +1,178,3978,1,179, +4439,19,729,1,179, +3978,1,180,4440,19, +1152,1,180,4063,1, +181,4441,19,1290,1, +181,4076,1,182,4442, +19,1139,1,182,4089, +1,183,4443,19,1278, +1,183,4089,1,184, +4444,19,919,1,184, +4102,1,185,4445,19, +722,1,185,4102,1, +186,4446,19,817,1, +186,4102,1,187,4447, +19,845,1,187,4102, +1,188,4448,19,865, +1,188,4115,1,189, +4449,19,911,1,189, +4115,1,190,4450,19, +825,1,190,4128,1, +191,4451,19,838,1, +191,4128,1,192,4452, +19,791,1,192,4141, +1,193,4453,19,830, +1,193,4141,1,194, +4454,19,1477,1,194, +4154,1,195,4455,19, +1158,1,195,4154,1, +196,4456,19,1509,1, +196,4154,1,197,4457, +19,1541,1,197,4154, +1,198,4458,19,1406, +1,198,4004,1,199, +4459,19,1466,1,199, +4004,1,200,4460,19, +1133,1,200,4017,1, +201,4461,19,1573,1, +201,4017,1,202,4462, +19,1504,1,202,4017, +1,203,4463,19,1451, +1,203,4017,1,204, +4464,19,1374,1,204, +4017,1,205,4465,19, +1300,1,205,4017,1, +206,4466,19,1310,1, +206,4017,1,207,4467, +19,1128,1,207,4017, +1,208,4468,19,1557, +1,208,4017,1,209, +4469,19,1499,1,209, +4017,1,210,4470,19, +1441,1,210,4017,1, +211,4471,19,1363,1, +211,4017,1,212,4472, +19,1326,1,212,4017, +1,213,4473,19,1111, +1,213,4017,1,214, +4474,19,1461,1,214, +4017,1,215,4475,19, +1487,1,215,4017,1, +216,4476,19,1434,1, +216,4017,1,217,4477, +19,1456,1,217,4017, +1,218,4478,19,1266, +1,218,4017,1,219, +4479,19,1170,1,219, +4017,1,220,4480,19, +1100,1,220,4017,1, +221,4481,19,1531,1, +221,4017,1,222,4482, +19,1482,1,222,4017, +1,223,4483,19,1429, +1,223,4017,1,224, +4484,19,1295,1,224, +4050,1,225,4485,19, +1273,1,225,4050,1, +226,4486,19,1562,1, +226,4240,1,227,4487, +19,1586,1,227,4240, +1,228,4488,19,1552, +1,228,4240,1,229, +4489,19,1547,1,229, +4240,1,230,4490,19, +1568,1,230,4240,1, +231,4491,19,1515,1, +231,4240,1,232,4492, +19,1220,1,232,4240, +1,233,4493,19,1395, +1,233,4316,1,234, +4494,19,1181,1,234, +4316,1,235,4495,19, +1188,1,235,4316,1, +236,4496,19,1209,1, +236,4316,1,237,4497, +19,1204,1,237,4316, +1,238,4498,19,1199, +1,238,4316,1,239, +4499,19,1194,1,239, +4316,1,240,4500,19, +1384,1,240,4316,1, +241,4501,19,1412,1, +241,4316,1,242,4502, +19,1389,1,242,4316, +1,243,4503,19,1379, +1,243,4316,1,244, +4504,19,1369,1,244, +4316,1,245,4505,19, +1352,1,245,4316,1, +246,4506,19,1305,1, +246,4316,1,247,4507, +19,1214,1,247,4316, +1,248,4508,19,1175, +1,248,4316,1,249, +4509,19,1123,1,249, +4316,1,250,4510,19, +1581,1,250,4316,1, +251,4511,19,1536,1, +251,4316,1,252,4512, +19,1526,1,252,4316, +1,253,4513,19,1521, +1,253,4316,1,254, +4514,19,1472,1,254, +4316,1,255,4515,19, +1446,1,255,4316,1, +256,4516,19,1422,1, +256,4316,1,257,4517, +19,1417,1,257,4316, +1,258,4518,19,1358, +1,258,4316,1,259, +4519,19,1334,1,259, +4316,1,260,4520,19, +1400,1,260,4316,1, +261,4521,19,1493,1, +261,4316,1,262,4522, +19,1347,1,262,4316, +1,263,4523,19,1341, +1,263,4316,1,264, +4524,19,1321,1,264, +4316,1,265,4525,19, +1284,1,265,4316,1, +266,4526,19,1261,1, +266,4316,1,267,4527, +19,1106,1,267,4316, +1,268,4528,19,1596, +1,268,4316,1,269, +4529,19,1226,1,269, +4316,1,270,4530,19, +1231,1,270,4316,1, +271,4531,19,1251,1, +271,4316,1,272,4532, +19,1241,1,272,4316, +1,273,4533,19,1246, +1,273,4316,1,274, +4534,19,1236,1,274, +4316,1,275,4535,19, +1591,1,275,4316,1, +276,4536,19,1256,1, +276,4316,1,277,4537, +19,1316,1,277,4159, +1,278,4538,19,1650, +1,278,4229,1,279, +4539,19,1686,1,279, +4229,1,280,4540,19, +1666,1,280,4233,1, +281,4541,19,1985,1, +281,3933,1,282,4542, +19,1980,1,282,3933, +1,283,4543,19,1975, +1,283,3933,1,284, +4544,19,1970,1,284, +3933,1,285,4545,19, +1965,1,285,3933,1, +286,4546,19,1960,1, +286,3933,1,287,4547, +19,1955,1,287,3933, +1,288,4548,19,1944, +1,288,3953,1,289, +4549,19,1939,1,289, +3953,1,290,4550,19, +1934,1,290,3953,1, +291,4551,19,1929,1, +291,3953,1,292,4552, +19,1924,1,292,3953, +1,293,4553,19,1919, +1,293,3953,1,294, +4554,19,1914,1,294, +3953,1,295,4555,19, +1909,1,295,3953,1, +296,4556,19,1904,1, +296,3953,1,297,4557, +19,1739,1,297,3953, +1,298,4558,19,1898, +1,298,3953,1,299, +4559,19,1893,1,299, +3953,1,300,4560,19, +1888,1,300,3953,1, +301,4561,19,1732,1, +301,3953,1,302,4562, +19,1883,1,302,3953, +1,303,4563,19,1878, +1,303,3953,1,304, +4564,19,1873,1,304, +3953,1,305,4565,19, +1868,1,305,3953,1, +306,4566,19,1863,1, +306,3953,1,307,4567, +19,1858,1,307,3953, +1,308,4568,19,1725, +1,308,3953,1,309, +4569,19,1852,1,309, +3953,1,310,4570,19, +1847,1,310,3953,1, +311,4571,19,1842,1, +311,3953,1,312,4572, +19,1719,1,312,3953, +1,313,4573,19,1836, +1,313,3953,1,314, +4574,19,1767,1,314, +3953,1,315,4575,19, +1831,1,315,3953,1, +316,4576,19,1826,1, +316,3953,1,317,4577, +19,1821,1,317,3953, +1,318,4578,19,1816, +1,318,3953,1,319, +4579,19,1811,1,319, +3953,1,320,4580,19, +1806,1,320,3953,1, +321,4581,19,1801,1, +321,3953,1,322,4582, +19,4583,4,50,65, +0,114,0,103,0, +117,0,109,0,101, +0,110,0,116,0, +68,0,101,0,99, +0,108,0,97,0, +114,0,97,0,116, 0,105,0,111,0, -110,0,1,140,4352, -1,142,4438,19,683, -1,142,3911,1,143, -4439,19,705,1,143, -3911,1,144,4440,19, -3192,1,144,3914,1, -145,4441,19,3187,1, -145,3914,1,146,4442, -19,3198,1,146,3914, -1,147,4443,19,3209, -1,147,3914,1,148, -4444,19,3220,1,148, -3917,1,149,4445,19, -3226,1,149,3917,1, -150,4446,19,3214,1, -150,3921,1,151,4447, -19,3204,1,151,3921, -1,152,4448,19,689, -1,152,3925,1,153, -4449,19,710,1,153, -3925,1,154,4450,19, -695,1,154,3929,1, -155,4451,19,700,1, -155,3929,1,156,4452, -19,1636,1,156,3935, -1,157,4453,19,1631, -1,157,3935,1,158, -4454,19,1622,1,158, -3939,1,159,4455,19, -1680,1,159,3945,1, -160,4456,19,1657,1, -160,3945,1,161,4457, -19,1117,1,161,3950, -1,162,4458,19,902, -1,162,3995,1,163, -4459,19,886,1,163, -3995,1,164,4460,19, -892,1,164,4011,1, -165,4461,19,880,1, -165,4011,1,166,4462, -19,1145,1,166,4027, -1,167,4463,19,782, -1,167,4014,1,168, -4464,19,897,1,168, -4014,1,169,4465,19, -777,1,169,4014,1, -170,4466,19,802,1, -170,4014,1,171,4467, -19,771,1,171,4014, -1,172,4468,19,765, -1,172,4014,1,173, -4469,19,760,1,173, -4014,1,174,4470,19, -755,1,174,4014,1, -175,4471,19,749,1, -175,4014,1,176,4472, -19,744,1,176,4014, -1,177,4473,19,739, -1,177,4014,1,178, -4474,19,734,1,178, -4014,1,179,4475,19, -729,1,179,4014,1, -180,4476,19,1152,1, -180,4099,1,181,4477, -19,1290,1,181,4112, -1,182,4478,19,1139, -1,182,4125,1,183, -4479,19,1278,1,183, -4125,1,184,4480,19, -919,1,184,4138,1, -185,4481,19,722,1, -185,4138,1,186,4482, -19,817,1,186,4138, -1,187,4483,19,845, -1,187,4138,1,188, -4484,19,865,1,188, -4151,1,189,4485,19, -911,1,189,4151,1, -190,4486,19,825,1, -190,4164,1,191,4487, -19,838,1,191,4164, -1,192,4488,19,791, -1,192,4177,1,193, -4489,19,830,1,193, -4177,1,194,4490,19, -1477,1,194,4190,1, -195,4491,19,1158,1, -195,4190,1,196,4492, -19,1509,1,196,4190, -1,197,4493,19,1541, -1,197,4190,1,198, -4494,19,1406,1,198, -4040,1,199,4495,19, -1466,1,199,4040,1, -200,4496,19,1133,1, -200,4053,1,201,4497, -19,1573,1,201,4053, -1,202,4498,19,1504, -1,202,4053,1,203, -4499,19,1451,1,203, -4053,1,204,4500,19, -1374,1,204,4053,1, -205,4501,19,1300,1, -205,4053,1,206,4502, -19,1310,1,206,4053, -1,207,4503,19,1128, -1,207,4053,1,208, -4504,19,1557,1,208, -4053,1,209,4505,19, -1499,1,209,4053,1, -210,4506,19,1441,1, -210,4053,1,211,4507, -19,1363,1,211,4053, -1,212,4508,19,1326, -1,212,4053,1,213, -4509,19,1111,1,213, -4053,1,214,4510,19, -1461,1,214,4053,1, -215,4511,19,1487,1, -215,4053,1,216,4512, -19,1434,1,216,4053, -1,217,4513,19,1456, -1,217,4053,1,218, -4514,19,1266,1,218, -4053,1,219,4515,19, -1170,1,219,4053,1, -220,4516,19,1100,1, -220,4053,1,221,4517, -19,1531,1,221,4053, -1,222,4518,19,1482, -1,222,4053,1,223, -4519,19,1429,1,223, -4053,1,224,4520,19, -1295,1,224,4086,1, -225,4521,19,1273,1, -225,4086,1,226,4522, -19,1562,1,226,4276, -1,227,4523,19,1586, -1,227,4276,1,228, -4524,19,1552,1,228, -4276,1,229,4525,19, -1547,1,229,4276,1, -230,4526,19,1568,1, -230,4276,1,231,4527, -19,1515,1,231,4276, -1,232,4528,19,1220, -1,232,4276,1,233, -4529,19,1395,1,233, -4352,1,234,4530,19, -1181,1,234,4352,1, -235,4531,19,1188,1, -235,4352,1,236,4532, -19,1209,1,236,4352, -1,237,4533,19,1204, -1,237,4352,1,238, -4534,19,1199,1,238, -4352,1,239,4535,19, -1194,1,239,4352,1, -240,4536,19,1384,1, -240,4352,1,241,4537, -19,1412,1,241,4352, -1,242,4538,19,1389, -1,242,4352,1,243, -4539,19,1379,1,243, -4352,1,244,4540,19, -1369,1,244,4352,1, -245,4541,19,1352,1, -245,4352,1,246,4542, -19,1305,1,246,4352, -1,247,4543,19,1214, -1,247,4352,1,248, -4544,19,1175,1,248, -4352,1,249,4545,19, -1123,1,249,4352,1, -250,4546,19,1581,1, -250,4352,1,251,4547, -19,1536,1,251,4352, -1,252,4548,19,1526, -1,252,4352,1,253, -4549,19,1521,1,253, -4352,1,254,4550,19, -1472,1,254,4352,1, -255,4551,19,1446,1, -255,4352,1,256,4552, -19,1422,1,256,4352, -1,257,4553,19,1417, -1,257,4352,1,258, -4554,19,1358,1,258, -4352,1,259,4555,19, -1334,1,259,4352,1, -260,4556,19,1400,1, -260,4352,1,261,4557, -19,1493,1,261,4352, -1,262,4558,19,1347, -1,262,4352,1,263, -4559,19,1341,1,263, -4352,1,264,4560,19, -1321,1,264,4352,1, -265,4561,19,1284,1, -265,4352,1,266,4562, -19,1261,1,266,4352, -1,267,4563,19,1106, -1,267,4352,1,268, -4564,19,1596,1,268, -4352,1,269,4565,19, -1226,1,269,4352,1, -270,4566,19,1231,1, -270,4352,1,271,4567, -19,1251,1,271,4352, -1,272,4568,19,1241, -1,272,4352,1,273, -4569,19,1246,1,273, -4352,1,274,4570,19, -1236,1,274,4352,1, -275,4571,19,1591,1, -275,4352,1,276,4572, -19,1256,1,276,4352, -1,277,4573,19,1316, -1,277,4195,1,278, -4574,19,1650,1,278, -4265,1,279,4575,19, -1686,1,279,4265,1, -280,4576,19,1666,1, -280,4269,1,281,4577, -19,1985,1,281,3969, -1,282,4578,19,1980, -1,282,3969,1,283, -4579,19,1975,1,283, -3969,1,284,4580,19, -1970,1,284,3969,1, -285,4581,19,1965,1, -285,3969,1,286,4582, -19,1960,1,286,3969, -1,287,4583,19,1955, -1,287,3969,1,288, -4584,19,1944,1,288, -3989,1,289,4585,19, -1939,1,289,3989,1, -290,4586,19,1934,1, -290,3989,1,291,4587, -19,1929,1,291,3989, -1,292,4588,19,1924, -1,292,3989,1,293, -4589,19,1919,1,293, -3989,1,294,4590,19, -1914,1,294,3989,1, -295,4591,19,1909,1, -295,3989,1,296,4592, -19,1904,1,296,3989, -1,297,4593,19,1739, -1,297,3989,1,298, -4594,19,1898,1,298, -3989,1,299,4595,19, -1893,1,299,3989,1, -300,4596,19,1888,1, -300,3989,1,301,4597, -19,1732,1,301,3989, -1,302,4598,19,1883, -1,302,3989,1,303, -4599,19,1878,1,303, -3989,1,304,4600,19, -1873,1,304,3989,1, -305,4601,19,1868,1, -305,3989,1,306,4602, -19,1863,1,306,3989, -1,307,4603,19,1858, -1,307,3989,1,308, -4604,19,1725,1,308, -3989,1,309,4605,19, -1852,1,309,3989,1, -310,4606,19,1847,1, -310,3989,1,311,4607, -19,1842,1,311,3989, -1,312,4608,19,1719, -1,312,3989,1,313, -4609,19,1836,1,313, -3989,1,314,4610,19, -1767,1,314,3989,1, -315,4611,19,1831,1, -315,3989,1,316,4612, -19,1826,1,316,3989, -1,317,4613,19,1821, -1,317,3989,1,318, -4614,19,1816,1,318, -3989,1,319,4615,19, -1811,1,319,3989,1, -320,4616,19,1806,1, -320,3989,1,321,4617, -19,1801,1,321,3989, -1,322,4618,19,4619, +110,0,76,0,105, +0,115,0,116,0, +95,0,51,0,1, +322,3909,1,323,4584, +19,4585,4,28,65, +0,114,0,103,0, +117,0,109,0,101, +0,110,0,116,0, +76,0,105,0,115, +0,116,0,95,0, +51,0,1,323,4229, +1,324,4586,19,4587, 4,50,65,0,114, 0,103,0,117,0, 109,0,101,0,110, @@ -10739,16 +10737,16 @@ public yyLSLSyntax 0,111,0,110,0, 76,0,105,0,115, 0,116,0,95,0, -51,0,1,322,3945, -1,323,4620,19,4621, +52,0,1,324,3909, +1,325,4588,19,4589, 4,28,65,0,114, 0,103,0,117,0, 109,0,101,0,110, 0,116,0,76,0, 105,0,115,0,116, -0,95,0,51,0, -1,323,4265,1,324, -4622,19,4623,4,50, +0,95,0,52,0, +1,325,4229,1,326, +4590,19,4591,4,50, 65,0,114,0,103, 0,117,0,109,0, 101,0,110,0,116, @@ -10758,28 +10756,8 @@ public yyLSLSyntax 116,0,105,0,111, 0,110,0,76,0, 105,0,115,0,116, -0,95,0,52,0, -1,324,3945,1,325, -4624,19,4625,4,28, -65,0,114,0,103, -0,117,0,109,0, -101,0,110,0,116, -0,76,0,105,0, -115,0,116,0,95, -0,52,0,1,325, -4265,1,326,4626,19, -4627,4,50,65,0, -114,0,103,0,117, -0,109,0,101,0, -110,0,116,0,68, -0,101,0,99,0, -108,0,97,0,114, -0,97,0,116,0, -105,0,111,0,110, -0,76,0,105,0, -115,0,116,0,95, -0,53,0,1,326, -3945,2,0,0}; +0,95,0,53,0, +1,326,3909,2,0,0}; new Sfactory(this,"ExpressionArgument_1",new SCreator(ExpressionArgument_1_factory)); new Sfactory(this,"SimpleAssignment_8",new SCreator(SimpleAssignment_8_factory)); new Sfactory(this,"StatementList_1",new SCreator(StatementList_1_factory)); From 71ba85137f6b85db7c617bd6ee8ef2081b9fab61 Mon Sep 17 00:00:00 2001 From: Melanie Date: Mon, 11 Jun 2012 16:45:52 +0100 Subject: [PATCH 357/547] Commitig the Avination implementation of llTeleportAgent and llTeleportAgentGlobalCoords. These do NOT use PERMISSION_TELEPORT like their SL counterparts because that permission is not yet understood by TPVs based on v1.x. --- .../Shared/Api/Implementation/LSL_Api.cs | 94 +++++++++++++++++++ .../Shared/Api/Interface/ILSL_Api.cs | 2 + .../Shared/Api/Runtime/LSL_Stub.cs | 10 ++ 3 files changed, 106 insertions(+) diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index fb0fdc998d..89f2068ea5 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -4169,6 +4169,100 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api ScriptSleep(5000); } + public void llTeleportAgent(string agent, string destination, LSL_Vector pos, LSL_Vector lookAt) + { + m_host.AddScriptLPS(1); + UUID agentId = new UUID(); + + Vector3 targetPos = new Vector3((float)pos.x, (float)pos.y, (float)pos.z); + Vector3 targetLookAt = new Vector3((float)lookAt.x, (float)lookAt.y, (float)lookAt.z); + + if (UUID.TryParse(agent, out agentId)) + { + ScenePresence presence = World.GetScenePresence(agentId); + if (presence != null && presence.PresenceType != PresenceType.Npc) + { + // agent must not be a god + if (presence.GodLevel >= 200) return; + + if (destination == String.Empty) + destination = World.RegionInfo.RegionName; + + // agent must be over the owners land + if (m_host.OwnerID == World.LandChannel.GetLandObject( + presence.AbsolutePosition.X, presence.AbsolutePosition.Y).LandData.OwnerID) + { + DoLLTeleport(presence, destination, targetPos, targetLookAt); + } + else // or must be wearing the prim + { + if (m_host.ParentGroup.AttachmentPoint != 0 && m_host.OwnerID == presence.UUID) + { + DoLLTeleport(presence, destination, targetPos, targetLookAt); + } + } + } + } + } + + public void llTeleportAgentGlobalCoords(string agent, LSL_Vector global_coords, LSL_Vector pos, LSL_Vector lookAt) + { + m_host.AddScriptLPS(1); + UUID agentId = new UUID(); + + ulong regionHandle = Utils.UIntsToLong((uint)global_coords.x, (uint)global_coords.y); + + Vector3 targetPos = new Vector3((float)pos.x, (float)pos.y, (float)pos.z); + Vector3 targetLookAt = new Vector3((float)lookAt.x, (float)lookAt.y, (float)lookAt.z); + if (UUID.TryParse(agent, out agentId)) + { + ScenePresence presence = World.GetScenePresence(agentId); + if (presence != null && presence.PresenceType != PresenceType.Npc) + { + // agent must not be a god + if (presence.GodLevel >= 200) return; + + // agent must be over the owners land + if (m_host.OwnerID == World.LandChannel.GetLandObject( + presence.AbsolutePosition.X, presence.AbsolutePosition.Y).LandData.OwnerID) + { + World.RequestTeleportLocation(presence.ControllingClient, regionHandle, targetPos, targetLookAt, (uint)TeleportFlags.ViaLocation); + } + else // or must be wearing the prim + { + if (m_host.ParentGroup.AttachmentPoint != 0 && m_host.OwnerID == presence.UUID) + { + World.RequestTeleportLocation(presence.ControllingClient, regionHandle, targetPos, targetLookAt, (uint)TeleportFlags.ViaLocation); + } + } + } + } + } + + private void DoLLTeleport(ScenePresence sp, string destination, Vector3 targetPos, Vector3 targetLookAt) + { + UUID assetID = KeyOrName(destination); + + // The destinaion is not an asset ID and also doesn't name a landmark. + // Use it as a sim name + if (assetID == UUID.Zero) + { + World.RequestTeleportLocation(sp.ControllingClient, destination, targetPos, targetLookAt, (uint)TeleportFlags.ViaLocation); + return; + } + + AssetBase lma = World.AssetService.Get(assetID.ToString()); + if (lma == null) + return; + + if (lma.Type != (sbyte)AssetType.Landmark) + return; + + AssetLandmark lm = new AssetLandmark(lma); + + World.RequestTeleportLocation(sp.ControllingClient, lm.RegionHandle, targetPos, targetLookAt, (uint)TeleportFlags.ViaLocation); + } + public void llTextBox(string agent, string message, int chatChannel) { IDialogModule dm = World.RequestModuleInterface(); diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs index 7f5d1feec1..d39b20454c 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs @@ -403,6 +403,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces void llTargetOmega(LSL_Vector axis, double spinrate, double gain); void llTargetRemove(int number); void llTeleportAgentHome(string agent); + void llTeleportAgent(string agent, string simname, LSL_Vector pos, LSL_Vector lookAt); + void llTeleportAgentGlobalCoords(string agent, LSL_Vector global, LSL_Vector pos, LSL_Vector lookAt); void llTextBox(string avatar, string message, int chat_channel); LSL_String llToLower(string source); LSL_String llToUpper(string source); diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs index c0bf29ca2d..06f5617fac 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs @@ -1833,6 +1833,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase m_LSL_Functions.llTargetRemove(number); } + public void llTeleportAgent(string agent, string simname, LSL_Vector pos, LSL_Vector lookAt) + { + m_LSL_Functions.llTeleportAgent(agent, simname, pos, lookAt); + } + + public void llTeleportAgentGlobalCoords(string agent, LSL_Vector global, LSL_Vector pos, LSL_Vector lookAt) + { + m_LSL_Functions.llTeleportAgentGlobalCoords(agent, global, pos, lookAt); + } + public void llTeleportAgentHome(string agent) { m_LSL_Functions.llTeleportAgentHome(agent); From a927787434a952bc12d7255b2de8ac723c6fd6cc Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Mon, 11 Jun 2012 23:30:11 +0100 Subject: [PATCH 358/547] Add last frame time monitor to MonitorModule now that this value is useful --- .../CoreModules/Framework/Monitoring/MonitorModule.cs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/OpenSim/Region/CoreModules/Framework/Monitoring/MonitorModule.cs b/OpenSim/Region/CoreModules/Framework/Monitoring/MonitorModule.cs index 4a8c369335..e135c21b79 100644 --- a/OpenSim/Region/CoreModules/Framework/Monitoring/MonitorModule.cs +++ b/OpenSim/Region/CoreModules/Framework/Monitoring/MonitorModule.cs @@ -341,6 +341,14 @@ namespace OpenSim.Region.CoreModules.Framework.Monitoring m => m.Scene.StatsReporter.LastReportedSimStats[11], m => string.Format("{0} ms", m.GetValue()))); + m_staticMonitors.Add( + new GenericMonitor( + m_scene, + "SpareFrameTimeMonitor", + "Spare Frame Time", + m => m.Scene.StatsReporter.LastReportedSimStats[21], + m => string.Format("{0} ms", m.GetValue()))); + m_alerts.Add(new DeadlockAlert(m_staticMonitors.Find(x => x is LastFrameTimeMonitor) as LastFrameTimeMonitor)); foreach (IAlert alert in m_alerts) From daad0a3e110699660c12e30283597db1a7344984 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Mon, 11 Jun 2012 23:30:58 +0100 Subject: [PATCH 359/547] Revert "Bind ~ and ! operators in LSL tighter in order to resolve issues in LSL where these aren't evaluated propertly." This reverts commit a8a9d13dc07bc9e23ebf439cbea5ece6ae002315. Accidentally committed, this patch might not be the correct approach. --- .../Shared/CodeTools/lsl.parser.cs | 8186 +++++++++-------- 1 file changed, 4104 insertions(+), 4082 deletions(-) diff --git a/OpenSim/Region/ScriptEngine/Shared/CodeTools/lsl.parser.cs b/OpenSim/Region/ScriptEngine/Shared/CodeTools/lsl.parser.cs index 8428c96f59..ca56cd6c0d 100644 --- a/OpenSim/Region/ScriptEngine/Shared/CodeTools/lsl.parser.cs +++ b/OpenSim/Region/ScriptEngine/Shared/CodeTools/lsl.parser.cs @@ -6338,327 +6338,250 @@ public yyLSLSyntax 16,0,488,1,74, 1253,1,328,1302,1, 1048,2014,16,0,488, -1,82,1280,1,1840, -2015,16,0,488,1, -1591,2016,16,0,488, -1,1341,2017,16,0, -488,1,1096,1312,1, -93,1318,1,352,1349, -1,107,1338,1,1114, -1343,1,118,2018,16, -0,488,1,1123,2019, -16,0,488,1,371, -1365,1,1628,2020,16, -0,488,1,375,1376, -1,1882,2021,16,0, -488,1,377,1381,1, -379,1386,1,380,1391, -1,883,2022,16,0, -488,1,373,1409,1, -130,2023,16,0,488, -1,143,2024,16,0, -488,1,387,2025,16, -0,488,1,2664,2026, -16,0,488,1,1159, -2027,16,0,488,1, -157,2028,16,0,488, -1,1413,2029,16,0, -488,1,1665,2030,16, -0,488,1,412,2031, -16,0,488,1,1377, -2032,16,0,488,1, -172,2033,16,0,488, -1,1939,2034,16,0, -488,1,437,2035,16, -0,488,1,188,2036, -16,0,488,1,942, -2037,16,0,488,1, -1195,2038,16,0,488, -1,1449,2039,16,0, -488,1,1701,2040,16, -0,488,1,447,1511, -1,205,2041,16,0, -488,1,827,2042,16, -0,488,1,223,2043, -16,0,488,1,476, -1543,1,477,1549,1, -1231,2044,16,0,488, -1,479,1559,1,480, -1564,1,1485,2045,16, -0,488,1,1737,2046, -16,0,488,1,242, -2047,16,0,488,1, -478,1583,1,1001,1588, -1,1002,1593,1,19, -2048,19,225,1,19, -2049,5,176,1,256, -2050,16,0,223,1, -1261,2051,16,0,223, -1,1011,1102,1,1012, -2052,16,0,455,1, -2458,876,1,262,1119, -1,1267,2053,16,0, -455,1,2021,718,1, -1521,2054,16,0,455, -1,1775,2055,16,0, -223,1,2029,725,1, -2030,731,1,2031,736, -1,2032,741,1,2033, -746,1,277,2056,16, -0,223,1,2035,752, -1,2037,757,1,2039, -762,1,32,2057,16, -0,223,1,2464,899, -1,2293,2058,16,0, -223,1,2043,774,1, -2045,779,1,2299,2059, -16,0,455,1,41, -2060,16,0,223,1, -42,2061,16,0,455, -1,40,1177,1,44, -1183,1,43,2062,16, -0,223,1,1804,2063, -16,0,223,1,48, -1190,1,49,1196,1, -47,1184,1,51,1206, -1,52,2064,16,0, -223,1,50,1201,1, -305,1211,1,1096,1312, -1,1515,2065,16,0, -223,1,2318,2066,16, -0,223,1,283,1172, -1,63,1222,1,66, -1228,1,67,1233,1, -68,1238,1,69,1243, -1,70,1248,1,71, -2067,16,0,223,1, -73,2068,16,0,455, -1,74,1253,1,1013, -1258,1,76,2069,16, -0,223,1,1834,2070, -16,0,223,1,2337, -2071,16,0,223,1, -79,2072,16,0,223, -1,1335,2073,16,0, -223,1,299,2074,16, -0,223,1,82,1280, -1,1840,2075,16,0, -455,1,1297,2076,16, -0,223,1,85,2077, -16,0,223,1,1341, -2078,16,0,455,1, -89,2079,16,0,223, -1,1303,2080,16,0, -455,1,509,2081,16, -0,223,1,93,1318, -1,322,2082,16,0, -223,1,97,2083,16, -0,223,1,2041,768, -1,1555,2084,16,0, -455,1,827,2085,16, -0,455,1,102,2086, -16,0,223,1,1860, -821,1,1803,787,1, -2364,827,1,107,1338, -1,1114,1343,1,112, -2087,16,0,223,1, -1117,2088,16,0,223, -1,352,1349,1,1873, -835,1,118,2089,16, -0,455,1,1123,2090, -16,0,455,1,371, -1365,1,515,2091,16, -0,455,1,1377,2092, -16,0,455,1,124, -2093,16,0,223,1, -1882,2094,16,0,455, -1,377,1381,1,379, -1386,1,380,1391,1, -130,2095,16,0,455, -1,346,2096,16,0, -223,1,2075,2097,16, -0,223,1,373,1409, -1,387,2098,16,0, -455,1,137,2099,16, -0,223,1,143,2100, -16,0,455,1,1901, +1,82,2015,16,0, +488,1,1840,2016,16, +0,488,1,1591,2017, +16,0,488,1,1341, +2018,16,0,488,1, +1096,1312,1,93,1318, +1,352,1349,1,107, +2019,16,0,488,1, +1114,1343,1,118,2020, +16,0,488,1,1123, +2021,16,0,488,1, +371,1365,1,1628,2022, +16,0,488,1,375, +1376,1,1882,2023,16, +0,488,1,377,1381, +1,379,1386,1,380, +1391,1,883,2024,16, +0,488,1,373,1409, +1,130,2025,16,0, +488,1,143,2026,16, +0,488,1,387,2027, +16,0,488,1,2664, +2028,16,0,488,1, +1159,2029,16,0,488, +1,157,2030,16,0, +488,1,1413,2031,16, +0,488,1,1665,2032, +16,0,488,1,412, +2033,16,0,488,1, +1377,2034,16,0,488, +1,172,2035,16,0, +488,1,1939,2036,16, +0,488,1,437,2037, +16,0,488,1,188, +2038,16,0,488,1, +942,2039,16,0,488, +1,1195,2040,16,0, +488,1,1449,2041,16, +0,488,1,1701,2042, +16,0,488,1,447, +1511,1,205,2043,16, +0,488,1,827,2044, +16,0,488,1,223, +2045,16,0,488,1, +476,1543,1,477,1549, +1,1231,2046,16,0, +488,1,479,1559,1, +480,1564,1,1485,2047, +16,0,488,1,1737, +2048,16,0,488,1, +242,2049,16,0,488, +1,478,1583,1,1001, +1588,1,1002,1593,1, +19,2050,19,225,1, +19,2051,5,176,1, +256,2052,16,0,223, +1,1261,2053,16,0, +223,1,1011,1102,1, +1012,2054,16,0,455, +1,2458,876,1,262, +1119,1,1267,2055,16, +0,455,1,2021,718, +1,1521,2056,16,0, +455,1,1775,2057,16, +0,223,1,2029,725, +1,2030,731,1,2031, +736,1,2032,741,1, +2033,746,1,277,2058, +16,0,223,1,2035, +752,1,2037,757,1, +2039,762,1,32,2059, +16,0,223,1,2464, +899,1,2293,2060,16, +0,223,1,2043,774, +1,2045,779,1,2299, +2061,16,0,455,1, +41,2062,16,0,223, +1,42,2063,16,0, +455,1,40,1177,1, +44,1183,1,43,2064, +16,0,223,1,1804, +2065,16,0,223,1, +48,1190,1,49,1196, +1,47,1184,1,51, +1206,1,52,2066,16, +0,223,1,50,1201, +1,305,1211,1,1096, +1312,1,1515,2067,16, +0,223,1,2318,2068, +16,0,223,1,283, +1172,1,63,1222,1, +66,1228,1,67,1233, +1,68,1238,1,69, +1243,1,70,1248,1, +71,2069,16,0,223, +1,73,2070,16,0, +455,1,74,1253,1, +1013,1258,1,76,2071, +16,0,223,1,1834, +2072,16,0,223,1, +2337,2073,16,0,223, +1,79,2074,16,0, +223,1,1335,2075,16, +0,223,1,299,2076, +16,0,223,1,82, +2077,16,0,455,1, +1840,2078,16,0,455, +1,1297,2079,16,0, +223,1,85,2080,16, +0,223,1,1341,2081, +16,0,455,1,89, +2082,16,0,223,1, +1303,2083,16,0,455, +1,509,2084,16,0, +223,1,93,1318,1, +322,2085,16,0,223, +1,97,2086,16,0, +223,1,2041,768,1, +1555,2087,16,0,455, +1,827,2088,16,0, +455,1,102,2089,16, +0,223,1,1860,821, +1,1803,787,1,2364, +827,1,107,2090,16, +0,455,1,1114,1343, +1,112,2091,16,0, +223,1,1117,2092,16, +0,223,1,352,1349, +1,1873,835,1,118, +2093,16,0,455,1, +1123,2094,16,0,455, +1,371,1365,1,515, +2095,16,0,455,1, +1377,2096,16,0,455, +1,124,2097,16,0, +223,1,1882,2098,16, +0,455,1,377,1381, +1,379,1386,1,380, +1391,1,130,2099,16, +0,455,1,346,2100, +16,0,223,1,2075, 2101,16,0,223,1, -1048,2102,16,0,455, -1,2658,2103,16,0, -223,1,1153,2104,16, -0,223,1,375,1376, -1,151,2105,16,0, -223,1,1407,2106,16, -0,223,1,1659,2107, -16,0,223,1,2413, +373,1409,1,387,2102, +16,0,455,1,137, +2103,16,0,223,1, +143,2104,16,0,455, +1,1901,2105,16,0, +223,1,1048,2106,16, +0,455,1,2658,2107, +16,0,223,1,1153, 2108,16,0,223,1, -1159,2109,16,0,455, -1,381,2110,16,0, -223,1,157,2111,16, -0,455,1,1413,2112, -16,0,455,1,883, -2113,16,0,455,1, -1371,2114,16,0,223, -1,328,1302,1,2105, -814,1,2106,2115,16, -0,223,1,166,2116, -16,0,223,1,525, -2117,16,0,223,1, -1622,2118,16,0,223, -1,406,2119,16,0, -223,1,1574,799,1, -172,2120,16,0,455, -1,1931,861,1,412, -2121,16,0,455,1, -1933,2122,16,0,223, -1,1876,2123,16,0, -223,1,431,2124,16, -0,223,1,1585,2125, -16,0,223,1,182, -2126,16,0,223,1, -1628,2127,16,0,455, -1,1189,2128,16,0, -223,1,437,2129,16, -0,455,1,1591,2130, -16,0,455,1,188, -2131,16,0,455,1, -1695,2132,16,0,223, -1,2198,2133,16,0, -223,1,1195,2134,16, -0,455,1,1449,2135, -16,0,455,1,1701, -2136,16,0,455,1, -447,2137,16,0,223, -1,199,2138,16,0, -223,1,2459,882,1, -1958,2139,16,0,223, -1,2462,889,1,1657, -894,1,205,2140,16, -0,455,1,459,2141, -16,0,223,1,462, -2142,16,0,223,1, -1665,2143,16,0,455, -1,217,2144,16,0, -223,1,2227,908,1, -942,2145,16,0,455, -1,1225,2146,16,0, -223,1,223,2147,16, -0,455,1,1479,2148, -16,0,223,1,1731, -2149,16,0,223,1, -477,1549,1,1231,2150, -16,0,455,1,479, -1559,1,480,1564,1, -1485,2151,16,0,455, -1,1737,2152,16,0, -455,1,1989,916,1, -1990,2153,16,0,223, -1,1443,2154,16,0, -223,1,236,2155,16, -0,223,1,2136,842, -1,2664,2156,16,0, -455,1,476,1543,1, -242,2157,16,0,455, -1,478,1583,1,1939, -2158,16,0,455,1, -1001,1588,1,1002,1593, -1,1756,2159,16,0, -223,1,20,2160,19, -442,1,20,2161,5, -84,1,1011,1102,1, -1012,2162,16,0,440, -1,1013,1258,1,262, -1119,1,1267,2163,16, -0,440,1,515,2164, -16,0,440,1,1521, -2165,16,0,440,1, -525,1216,1,283,1172, -1,2299,2166,16,0, -440,1,42,2167,16, -0,440,1,40,1177, -1,44,1183,1,47, -1184,1,1303,2168,16, -0,440,1,1555,2169, -16,0,440,1,50, -1201,1,48,1190,1, -49,1196,1,51,1206, -1,63,1222,1,305, -1211,1,66,1228,1, -67,1233,1,68,1238, -1,69,1243,1,70, -1248,1,73,2170,16, -0,440,1,74,1253, -1,328,2171,16,0, -440,1,1048,2172,16, -0,440,1,82,1280, -1,1840,2173,16,0, -440,1,1591,2174,16, -0,440,1,1341,2175, -16,0,440,1,1096, -1312,1,93,1318,1, -352,2176,16,0,440, -1,107,1338,1,1114, -1343,1,118,2177,16, -0,440,1,1123,2178, -16,0,440,1,371, -1365,1,1628,2179,16, -0,440,1,375,1376, -1,1882,2180,16,0, -440,1,377,1381,1, -379,1386,1,380,1391, -1,883,2181,16,0, -440,1,373,1409,1, -130,2182,16,0,440, -1,143,2183,16,0, -440,1,387,2184,16, -0,440,1,2664,2185, -16,0,440,1,1159, -2186,16,0,440,1, -157,2187,16,0,440, -1,1413,2188,16,0, -440,1,1665,2189,16, -0,440,1,412,2190, -16,0,440,1,1377, -2191,16,0,440,1, -172,2192,16,0,440, -1,1939,2193,16,0, -440,1,437,2194,16, -0,440,1,188,2195, -16,0,440,1,942, -2196,16,0,440,1, -1195,2197,16,0,440, -1,1449,2198,16,0, -440,1,1701,2199,16, -0,440,1,447,1511, -1,205,2200,16,0, -440,1,827,2201,16, -0,440,1,223,2202, -16,0,440,1,476, -1543,1,477,1549,1, -1231,2203,16,0,440, +375,1376,1,151,2109, +16,0,223,1,1407, +2110,16,0,223,1, +1659,2111,16,0,223, +1,2413,2112,16,0, +223,1,1159,2113,16, +0,455,1,381,2114, +16,0,223,1,157, +2115,16,0,455,1, +1413,2116,16,0,455, +1,883,2117,16,0, +455,1,1371,2118,16, +0,223,1,328,1302, +1,2105,814,1,2106, +2119,16,0,223,1, +166,2120,16,0,223, +1,525,2121,16,0, +223,1,1622,2122,16, +0,223,1,406,2123, +16,0,223,1,1574, +799,1,172,2124,16, +0,455,1,1931,861, +1,412,2125,16,0, +455,1,1933,2126,16, +0,223,1,1876,2127, +16,0,223,1,431, +2128,16,0,223,1, +1585,2129,16,0,223, +1,182,2130,16,0, +223,1,1628,2131,16, +0,455,1,1189,2132, +16,0,223,1,437, +2133,16,0,455,1, +1591,2134,16,0,455, +1,188,2135,16,0, +455,1,1695,2136,16, +0,223,1,2198,2137, +16,0,223,1,1195, +2138,16,0,455,1, +1449,2139,16,0,455, +1,1701,2140,16,0, +455,1,447,2141,16, +0,223,1,199,2142, +16,0,223,1,2459, +882,1,1958,2143,16, +0,223,1,2462,889, +1,1657,894,1,205, +2144,16,0,455,1, +459,2145,16,0,223, +1,462,2146,16,0, +223,1,1665,2147,16, +0,455,1,217,2148, +16,0,223,1,2227, +908,1,942,2149,16, +0,455,1,1225,2150, +16,0,223,1,223, +2151,16,0,455,1, +1479,2152,16,0,223, +1,1731,2153,16,0, +223,1,477,1549,1, +1231,2154,16,0,455, 1,479,1559,1,480, -1564,1,1485,2204,16, -0,440,1,1737,2205, -16,0,440,1,242, -2206,16,0,440,1, -478,1583,1,1001,1588, -1,1002,1593,1,21, -2207,19,432,1,21, -2208,5,84,1,1011, -1102,1,1012,2209,16, -0,430,1,1013,1258, +1564,1,1485,2155,16, +0,455,1,1737,2156, +16,0,455,1,1989, +916,1,1990,2157,16, +0,223,1,1443,2158, +16,0,223,1,236, +2159,16,0,223,1, +2136,842,1,2664,2160, +16,0,455,1,476, +1543,1,242,2161,16, +0,455,1,478,1583, +1,1939,2162,16,0, +455,1,1001,1588,1, +1002,1593,1,1756,2163, +16,0,223,1,20, +2164,19,442,1,20, +2165,5,84,1,1011, +1102,1,1012,2166,16, +0,440,1,1013,1258, 1,262,1119,1,1267, -2210,16,0,430,1, -515,2211,16,0,430, -1,1521,2212,16,0, -430,1,525,1216,1, -283,1172,1,2299,2213, -16,0,430,1,42, -2214,16,0,430,1, +2167,16,0,440,1, +515,2168,16,0,440, +1,1521,2169,16,0, +440,1,525,1216,1, +283,1172,1,2299,2170, +16,0,440,1,42, +2171,16,0,440,1, 40,1177,1,44,1183, 1,47,1184,1,1303, -2215,16,0,430,1, -1555,2216,16,0,430, +2172,16,0,440,1, +1555,2173,16,0,440, 1,50,1201,1,48, 1190,1,49,1196,1, 51,1206,1,63,1222, @@ -6666,160 +6589,243 @@ public yyLSLSyntax 1228,1,67,1233,1, 68,1238,1,69,1243, 1,70,1248,1,73, -2217,16,0,430,1, -74,1253,1,328,2218, -16,0,430,1,1048, -2219,16,0,430,1, -82,1280,1,1840,2220, -16,0,430,1,1591, -2221,16,0,430,1, -1341,2222,16,0,430, -1,1096,1312,1,93, -1318,1,352,2223,16, -0,430,1,107,1338, -1,1114,1343,1,118, -2224,16,0,430,1, -1123,2225,16,0,430, -1,371,1365,1,1628, -2226,16,0,430,1, -375,1376,1,1882,2227, -16,0,430,1,377, -1381,1,379,1386,1, -380,1391,1,883,2228, -16,0,430,1,373, -1409,1,130,2229,16, -0,430,1,143,2230, -16,0,430,1,387, +2174,16,0,440,1, +74,1253,1,328,2175, +16,0,440,1,1048, +2176,16,0,440,1, +82,2177,16,0,440, +1,1840,2178,16,0, +440,1,1591,2179,16, +0,440,1,1341,2180, +16,0,440,1,1096, +1312,1,93,1318,1, +352,2181,16,0,440, +1,107,2182,16,0, +440,1,1114,1343,1, +118,2183,16,0,440, +1,1123,2184,16,0, +440,1,371,1365,1, +1628,2185,16,0,440, +1,375,1376,1,1882, +2186,16,0,440,1, +377,1381,1,379,1386, +1,380,1391,1,883, +2187,16,0,440,1, +373,1409,1,130,2188, +16,0,440,1,143, +2189,16,0,440,1, +387,2190,16,0,440, +1,2664,2191,16,0, +440,1,1159,2192,16, +0,440,1,157,2193, +16,0,440,1,1413, +2194,16,0,440,1, +1665,2195,16,0,440, +1,412,2196,16,0, +440,1,1377,2197,16, +0,440,1,172,2198, +16,0,440,1,1939, +2199,16,0,440,1, +437,2200,16,0,440, +1,188,2201,16,0, +440,1,942,2202,16, +0,440,1,1195,2203, +16,0,440,1,1449, +2204,16,0,440,1, +1701,2205,16,0,440, +1,447,1511,1,205, +2206,16,0,440,1, +827,2207,16,0,440, +1,223,2208,16,0, +440,1,476,1543,1, +477,1549,1,1231,2209, +16,0,440,1,479, +1559,1,480,1564,1, +1485,2210,16,0,440, +1,1737,2211,16,0, +440,1,242,2212,16, +0,440,1,478,1583, +1,1001,1588,1,1002, +1593,1,21,2213,19, +432,1,21,2214,5, +84,1,1011,1102,1, +1012,2215,16,0,430, +1,1013,1258,1,262, +1119,1,1267,2216,16, +0,430,1,515,2217, +16,0,430,1,1521, +2218,16,0,430,1, +525,1216,1,283,1172, +1,2299,2219,16,0, +430,1,42,2220,16, +0,430,1,40,1177, +1,44,1183,1,47, +1184,1,1303,2221,16, +0,430,1,1555,2222, +16,0,430,1,50, +1201,1,48,1190,1, +49,1196,1,51,1206, +1,63,1222,1,305, +1211,1,66,1228,1, +67,1233,1,68,1238, +1,69,1243,1,70, +1248,1,73,2223,16, +0,430,1,74,1253, +1,328,2224,16,0, +430,1,1048,2225,16, +0,430,1,82,2226, +16,0,430,1,1840, +2227,16,0,430,1, +1591,2228,16,0,430, +1,1341,2229,16,0, +430,1,1096,1312,1, +93,1318,1,352,2230, +16,0,430,1,107, 2231,16,0,430,1, -2664,2232,16,0,430, -1,1159,2233,16,0, -430,1,157,2234,16, -0,430,1,1413,2235, -16,0,430,1,1665, -2236,16,0,430,1, -412,2237,16,0,430, -1,1377,2238,16,0, -430,1,172,2239,16, -0,430,1,1939,2240, -16,0,430,1,437, -2241,16,0,430,1, -188,2242,16,0,430, -1,942,2243,16,0, -430,1,1195,2244,16, -0,430,1,1449,2245, -16,0,430,1,1701, -2246,16,0,430,1, -447,1511,1,205,2247, -16,0,430,1,827, -2248,16,0,430,1, -223,2249,16,0,430, -1,476,1543,1,477, -1549,1,1231,2250,16, -0,430,1,479,1559, -1,480,1564,1,1485, -2251,16,0,430,1, -1737,2252,16,0,430, -1,242,2253,16,0, -430,1,478,1583,1, -1001,1588,1,1002,1593, -1,22,2254,19,383, -1,22,2255,5,84, -1,1011,1102,1,1012, -2256,16,0,381,1, -1013,1258,1,262,1119, -1,1267,2257,16,0, -381,1,515,2258,16, -0,381,1,1521,2259, -16,0,381,1,525, -1216,1,283,1172,1, -2299,2260,16,0,381, -1,42,2261,16,0, -381,1,40,1177,1, -44,1183,1,47,1184, -1,1303,2262,16,0, -381,1,1555,2263,16, -0,381,1,50,1201, -1,48,1190,1,49, -1196,1,51,1206,1, -63,1222,1,305,1211, -1,66,1228,1,67, -1233,1,68,1238,1, -69,1243,1,70,1248, -1,73,2264,16,0, -381,1,74,1253,1, -328,2265,16,0,381, -1,1048,2266,16,0, -381,1,82,1280,1, -1840,2267,16,0,381, -1,1591,2268,16,0, -381,1,1341,2269,16, -0,381,1,1096,1312, -1,93,1318,1,352, -2270,16,0,381,1, -107,1338,1,1114,1343, -1,118,2271,16,0, -381,1,1123,2272,16, +1114,1343,1,118,2232, +16,0,430,1,1123, +2233,16,0,430,1, +371,1365,1,1628,2234, +16,0,430,1,375, +1376,1,1882,2235,16, +0,430,1,377,1381, +1,379,1386,1,380, +1391,1,883,2236,16, +0,430,1,373,1409, +1,130,2237,16,0, +430,1,143,2238,16, +0,430,1,387,2239, +16,0,430,1,2664, +2240,16,0,430,1, +1159,2241,16,0,430, +1,157,2242,16,0, +430,1,1413,2243,16, +0,430,1,1665,2244, +16,0,430,1,412, +2245,16,0,430,1, +1377,2246,16,0,430, +1,172,2247,16,0, +430,1,1939,2248,16, +0,430,1,437,2249, +16,0,430,1,188, +2250,16,0,430,1, +942,2251,16,0,430, +1,1195,2252,16,0, +430,1,1449,2253,16, +0,430,1,1701,2254, +16,0,430,1,447, +1511,1,205,2255,16, +0,430,1,827,2256, +16,0,430,1,223, +2257,16,0,430,1, +476,1543,1,477,1549, +1,1231,2258,16,0, +430,1,479,1559,1, +480,1564,1,1485,2259, +16,0,430,1,1737, +2260,16,0,430,1, +242,2261,16,0,430, +1,478,1583,1,1001, +1588,1,1002,1593,1, +22,2262,19,383,1, +22,2263,5,84,1, +1011,1102,1,1012,2264, +16,0,381,1,1013, +1258,1,262,1119,1, +1267,2265,16,0,381, +1,515,2266,16,0, +381,1,1521,2267,16, +0,381,1,525,1216, +1,283,1172,1,2299, +2268,16,0,381,1, +42,2269,16,0,381, +1,40,1177,1,44, +1183,1,47,1184,1, +1303,2270,16,0,381, +1,1555,2271,16,0, +381,1,50,1201,1, +48,1190,1,49,1196, +1,51,1206,1,63, +1222,1,305,1211,1, +66,1228,1,67,1233, +1,68,1238,1,69, +1243,1,70,1248,1, +73,2272,16,0,381, +1,74,1253,1,328, +2273,16,0,381,1, +1048,2274,16,0,381, +1,82,2275,16,0, +381,1,1840,2276,16, +0,381,1,1591,2277, +16,0,381,1,1341, +2278,16,0,381,1, +1096,1312,1,93,1318, +1,352,2279,16,0, +381,1,107,2280,16, +0,381,1,1114,1343, +1,118,2281,16,0, +381,1,1123,2282,16, 0,381,1,371,1365, -1,1628,2273,16,0, +1,1628,2283,16,0, 381,1,375,1376,1, -1882,2274,16,0,381, +1882,2284,16,0,381, 1,377,1381,1,379, 1386,1,380,1391,1, -883,2275,16,0,381, +883,2285,16,0,381, 1,373,1409,1,130, -2276,16,0,381,1, -143,2277,16,0,381, -1,387,2278,16,0, -381,1,2664,2279,16, -0,381,1,1159,2280, -16,0,381,1,157, -2281,16,0,381,1, -1413,2282,16,0,381, -1,1665,2283,16,0, -381,1,412,2284,16, -0,381,1,1377,2285, -16,0,381,1,172, 2286,16,0,381,1, -1939,2287,16,0,381, -1,437,2288,16,0, -381,1,188,2289,16, -0,381,1,942,2290, -16,0,381,1,1195, +143,2287,16,0,381, +1,387,2288,16,0, +381,1,2664,2289,16, +0,381,1,1159,2290, +16,0,381,1,157, 2291,16,0,381,1, -1449,2292,16,0,381, -1,1701,2293,16,0, +1413,2292,16,0,381, +1,1665,2293,16,0, +381,1,412,2294,16, +0,381,1,1377,2295, +16,0,381,1,172, +2296,16,0,381,1, +1939,2297,16,0,381, +1,437,2298,16,0, +381,1,188,2299,16, +0,381,1,942,2300, +16,0,381,1,1195, +2301,16,0,381,1, +1449,2302,16,0,381, +1,1701,2303,16,0, 381,1,447,1511,1, -205,2294,16,0,381, -1,827,2295,16,0, -381,1,223,2296,16, +205,2304,16,0,381, +1,827,2305,16,0, +381,1,223,2306,16, 0,381,1,476,1543, 1,477,1549,1,1231, -2297,16,0,381,1, +2307,16,0,381,1, 479,1559,1,480,1564, -1,1485,2298,16,0, -381,1,1737,2299,16, -0,381,1,242,2300, +1,1485,2308,16,0, +381,1,1737,2309,16, +0,381,1,242,2310, 16,0,381,1,478, 1583,1,1001,1588,1, -1002,1593,1,23,2301, -19,504,1,23,2302, -5,38,1,1901,2303, +1002,1593,1,23,2311, +19,504,1,23,2312, +5,38,1,1901,2313, 16,0,502,1,2075, -2304,16,0,502,1, +2314,16,0,502,1, 1860,821,1,1803,787, -1,1804,2305,16,0, -502,1,2413,2306,16, -0,502,1,2198,2307, +1,1804,2315,16,0, +502,1,2413,2316,16, +0,502,1,2198,2317, 16,0,502,1,1873, 835,1,1657,894,1, -1989,916,1,1990,2308, +1989,916,1,1990,2318, 16,0,502,1,1775, -2309,16,0,502,1, -32,2310,16,0,502, +2319,16,0,502,1, +32,2320,16,0,502, 1,2105,814,1,2106, -2311,16,0,502,1, +2321,16,0,502,1, 2364,827,1,2227,908, -1,2337,2312,16,0, +1,2337,2322,16,0, 502,1,2021,718,1, 2458,876,1,2459,882, 1,2462,889,1,2136, @@ -6832,1195 +6838,1207 @@ public yyLSLSyntax 861,1,2041,768,1, 2043,774,1,2045,779, 1,1574,799,1,1958, -2313,16,0,502,1, -24,2314,19,177,1, -24,2315,5,5,1, -44,2316,16,0,175, -1,377,2317,16,0, -540,1,40,2318,16, -0,674,1,63,2319, +2323,16,0,502,1, +24,2324,19,177,1, +24,2325,5,5,1, +44,2326,16,0,175, +1,377,2327,16,0, +540,1,40,2328,16, +0,674,1,63,2329, 16,0,196,1,373, -2320,16,0,536,1, -25,2321,19,291,1, -25,2322,5,177,1, -256,2323,16,0,545, -1,1261,2324,16,0, +2330,16,0,536,1, +25,2331,19,291,1, +25,2332,5,177,1, +256,2333,16,0,545, +1,1261,2334,16,0, 545,1,1011,1102,1, -1012,2325,16,0,289, +1012,2335,16,0,289, 1,2458,876,1,262, -1119,1,1267,2326,16, +1119,1,1267,2336,16, 0,289,1,2021,718, -1,1521,2327,16,0, -289,1,1775,2328,16, +1,1521,2337,16,0, +289,1,1775,2338,16, 0,545,1,2029,725, 1,2030,731,1,2031, 736,1,2032,741,1, -2033,746,1,277,2329, +2033,746,1,277,2339, 16,0,545,1,2035, 752,1,2037,757,1, -2039,762,1,32,2330, +2039,762,1,32,2340, 16,0,545,1,2464, -899,1,2293,2331,16, +899,1,2293,2341,16, 0,545,1,2043,774, 1,2045,779,1,2299, -2332,16,0,289,1, -41,2333,16,0,545, -1,42,2334,16,0, +2342,16,0,289,1, +41,2343,16,0,545, +1,42,2344,16,0, 289,1,40,1177,1, -44,1183,1,43,2335, +44,1183,1,43,2345, 16,0,545,1,1804, -2336,16,0,545,1, +2346,16,0,545,1, 48,1190,1,49,1196, 1,47,1184,1,51, -1206,1,52,2337,16, +1206,1,52,2347,16, 0,545,1,50,1201, 1,305,1211,1,1096, -1312,1,1515,2338,16, -0,545,1,2318,2339, +1312,1,1515,2348,16, +0,545,1,2318,2349, 16,0,545,1,62, -2340,16,0,545,1, +2350,16,0,545,1, 63,1222,1,66,1228, 1,67,1233,1,68, 1238,1,69,1243,1, -70,1248,1,71,2341, +70,1248,1,71,2351, 16,0,545,1,283, -1172,1,73,2342,16, +1172,1,73,2352,16, 0,289,1,74,1253, 1,1013,1258,1,76, -2343,16,0,545,1, -1834,2344,16,0,545, -1,2337,2345,16,0, -545,1,79,2346,16, -0,545,1,1335,2347, +2353,16,0,545,1, +1834,2354,16,0,545, +1,2337,2355,16,0, +545,1,79,2356,16, +0,545,1,1335,2357, 16,0,545,1,299, -2348,16,0,545,1, -82,1280,1,1840,2349, -16,0,289,1,1297, -2350,16,0,545,1, -85,2351,16,0,545, -1,1341,2352,16,0, -289,1,89,2353,16, -0,545,1,1303,2354, -16,0,289,1,509, -2355,16,0,545,1, -93,1318,1,322,2356, -16,0,545,1,97, -2357,16,0,545,1, -2041,768,1,1555,2358, -16,0,289,1,827, -2359,16,0,289,1, -102,2360,16,0,545, -1,1860,821,1,1803, -787,1,2364,827,1, -107,1338,1,1114,1343, -1,112,2361,16,0, -545,1,1117,2362,16, -0,545,1,352,1349, -1,1873,835,1,118, -1355,1,1123,2363,16, -0,289,1,371,1365, -1,515,2364,16,0, -289,1,1377,2365,16, -0,289,1,124,2366, -16,0,545,1,1882, -2367,16,0,289,1, -377,1381,1,379,1386, -1,380,1391,1,130, -1414,1,346,2368,16, -0,545,1,2075,2369, -16,0,545,1,373, -1409,1,387,2370,16, -0,289,1,137,2371, -16,0,545,1,143, -2372,16,0,289,1, -1901,2373,16,0,545, -1,1048,1344,1,2658, -2374,16,0,545,1, -1153,2375,16,0,545, -1,375,1376,1,151, -2376,16,0,545,1, -1407,2377,16,0,545, -1,1659,2378,16,0, -545,1,2413,2379,16, -0,545,1,1159,2380, -16,0,289,1,381, +2358,16,0,545,1, +82,2359,16,0,289, +1,1840,2360,16,0, +289,1,1297,2361,16, +0,545,1,85,2362, +16,0,545,1,1341, +2363,16,0,289,1, +89,2364,16,0,545, +1,1303,2365,16,0, +289,1,509,2366,16, +0,545,1,93,1318, +1,322,2367,16,0, +545,1,97,2368,16, +0,545,1,2041,768, +1,1555,2369,16,0, +289,1,827,2370,16, +0,289,1,102,2371, +16,0,545,1,1860, +821,1,1803,787,1, +2364,827,1,107,2372, +16,0,289,1,1114, +1343,1,112,2373,16, +0,545,1,1117,2374, +16,0,545,1,352, +1349,1,1873,835,1, +118,1355,1,1123,2375, +16,0,289,1,371, +1365,1,515,2376,16, +0,289,1,1377,2377, +16,0,289,1,124, +2378,16,0,545,1, +1882,2379,16,0,289, +1,377,1381,1,379, +1386,1,380,1391,1, +130,1414,1,346,2380, +16,0,545,1,2075, 2381,16,0,545,1, -157,2382,16,0,289, -1,1413,2383,16,0, -289,1,883,2384,16, -0,289,1,1371,2385, -16,0,545,1,328, -1302,1,2105,814,1, -2106,2386,16,0,545, -1,166,2387,16,0, -545,1,525,2388,16, -0,545,1,1622,2389, -16,0,545,1,406, -2390,16,0,545,1, -1574,799,1,172,1469, -1,1931,861,1,412, -2391,16,0,289,1, -1933,2392,16,0,545, -1,1876,2393,16,0, -545,1,431,2394,16, -0,545,1,1585,2395, -16,0,545,1,182, -2396,16,0,545,1, -1628,2397,16,0,289, -1,1189,2398,16,0, -545,1,437,2399,16, -0,289,1,1591,2400, -16,0,289,1,188, -1518,1,1695,2401,16, -0,545,1,2198,2402, -16,0,545,1,1195, -2403,16,0,289,1, -1449,2404,16,0,289, -1,1701,2405,16,0, -289,1,447,2406,16, -0,545,1,199,2407, -16,0,545,1,2459, -882,1,1958,2408,16, -0,545,1,2462,889, -1,1657,894,1,205, -2409,16,0,289,1, -459,2410,16,0,545, -1,462,2411,16,0, -545,1,1665,2412,16, -0,289,1,217,2413, -16,0,545,1,2227, -908,1,942,1490,1, -1225,2414,16,0,545, -1,223,2415,16,0, -289,1,1479,2416,16, -0,545,1,1731,2417, -16,0,545,1,477, -1549,1,1231,2418,16, -0,289,1,479,1559, -1,480,1564,1,1485, -2419,16,0,289,1, -1737,2420,16,0,289, -1,1989,916,1,1990, -2421,16,0,545,1, -1443,2422,16,0,545, -1,236,2423,16,0, -545,1,2136,842,1, -2664,2424,16,0,289, -1,476,1543,1,242, -2425,16,0,289,1, -478,1583,1,1939,2426, -16,0,289,1,1001, -1588,1,1002,1593,1, -1756,2427,16,0,545, -1,26,2428,19,308, -1,26,2429,5,84, -1,1011,1102,1,1012, -2430,16,0,306,1, -1013,1258,1,262,1119, -1,1267,2431,16,0, -306,1,515,2432,16, -0,660,1,1521,2433, -16,0,306,1,525, -1216,1,283,1172,1, -2299,2434,16,0,306, -1,42,2435,16,0, -306,1,40,1177,1, -44,1183,1,47,1184, -1,1303,2436,16,0, -306,1,1555,2437,16, -0,306,1,50,1201, -1,48,1190,1,49, -1196,1,51,1206,1, -63,1222,1,305,1211, -1,66,1228,1,67, -1233,1,68,1238,1, -69,1243,1,70,1248, -1,73,2438,16,0, -306,1,74,1253,1, -328,1302,1,1048,1344, -1,82,1280,1,1840, -2439,16,0,306,1, -1591,2440,16,0,306, -1,1341,2441,16,0, -306,1,1096,1312,1, -93,1318,1,352,1349, -1,107,1338,1,1114, -1343,1,118,1355,1, -1123,2442,16,0,306, -1,371,1365,1,1628, -2443,16,0,306,1, -375,1376,1,1882,2444, -16,0,306,1,377, -1381,1,379,1386,1, -380,1391,1,883,2445, -16,0,306,1,373, -1409,1,130,1414,1, -143,2446,16,0,306, -1,387,2447,16,0, -306,1,2664,2448,16, -0,306,1,1159,2449, -16,0,306,1,157, -2450,16,0,306,1, -1413,2451,16,0,306, -1,1665,2452,16,0, -306,1,412,2453,16, -0,306,1,1377,2454, -16,0,306,1,172, -1469,1,1939,2455,16, -0,306,1,437,2456, -16,0,588,1,188, -1518,1,942,1490,1, -1195,2457,16,0,306, -1,1449,2458,16,0, -306,1,1701,2459,16, -0,306,1,447,1511, -1,205,2460,16,0, -306,1,827,2461,16, -0,306,1,223,2462, -16,0,306,1,476, -1543,1,477,1549,1, -1231,2463,16,0,306, -1,479,1559,1,480, -1564,1,1485,2464,16, -0,306,1,1737,2465, -16,0,306,1,242, -2466,16,0,306,1, -478,1583,1,1001,1588, -1,1002,1593,1,27, -2467,19,598,1,27, -2468,5,95,1,256, -2469,16,0,596,1, -1261,2470,16,0,596, -1,509,2471,16,0, -596,1,1515,2472,16, -0,596,1,2021,718, -1,1775,2473,16,0, -596,1,2029,725,1, -2030,731,1,2031,736, -1,2032,741,1,2033, -746,1,277,2474,16, -0,596,1,2035,752, -1,2037,757,1,2039, -762,1,32,2475,16, -0,596,1,2041,768, -1,2293,2476,16,0, -596,1,2043,774,1, -2045,779,1,41,2477, -16,0,596,1,1297, -2478,16,0,596,1, -43,2479,16,0,596, -1,1803,787,1,1804, -2480,16,0,596,1, -299,2481,16,0,596, -1,52,2482,16,0, -596,1,2318,2483,16, -0,596,1,62,2484, -16,0,596,1,2075, -2485,16,0,596,1, -1574,799,1,71,2486, -16,0,596,1,76, -2487,16,0,596,1, -1834,2488,16,0,596, -1,2337,2489,16,0, -596,1,79,2490,16, -0,596,1,1335,2491, -16,0,596,1,322, -2492,16,0,596,1, -85,2493,16,0,596, -1,89,2494,16,0, -596,1,346,2495,16, -0,596,1,2105,814, -1,2106,2496,16,0, -596,1,97,2497,16, -0,596,1,1860,821, -1,2364,827,1,102, -2498,16,0,596,1, -112,2499,16,0,596, -1,1117,2500,16,0, -596,1,1873,835,1, -1876,2501,16,0,596, -1,124,2502,16,0, -596,1,2136,842,1, -381,2503,16,0,596, -1,525,2504,16,0, -596,1,137,2505,16, -0,596,1,1901,2506, -16,0,596,1,2658, -2507,16,0,596,1, -1153,2508,16,0,596, -1,151,2509,16,0, -596,1,1407,2510,16, -0,596,1,1659,2511, -16,0,596,1,2413, -2512,16,0,596,1, -406,2513,16,0,596, -1,1371,2514,16,0, -596,1,166,2515,16, -0,596,1,1622,2516, -16,0,596,1,1931, -861,1,1933,2517,16, -0,596,1,431,2518, -16,0,596,1,1585, -2519,16,0,596,1, -182,2520,16,0,596, -1,1189,2521,16,0, -596,1,1443,2522,16, -0,596,1,1695,2523, -16,0,596,1,2198, -2524,16,0,596,1, -447,2525,16,0,596, -1,2458,876,1,2459, -882,1,1958,2526,16, -0,596,1,2462,889, -1,1657,894,1,2464, -899,1,199,2527,16, -0,596,1,459,2528, -16,0,596,1,462, -2529,16,0,596,1, -217,2530,16,0,596, -1,2227,908,1,1225, -2531,16,0,596,1, -1479,2532,16,0,596, -1,1731,2533,16,0, -596,1,1989,916,1, -1990,2534,16,0,596, -1,236,2535,16,0, -596,1,1756,2536,16, -0,596,1,28,2537, -19,629,1,28,2538, -5,60,1,328,1302, -1,223,1533,1,1096, -1312,1,118,1355,1, -883,1397,1,525,1216, -1,1001,1588,1,130, -1414,1,459,1688,1, -1114,1343,1,352,1349, -1,447,1511,1,464, -1683,1,1011,1102,1, -1013,1258,1,242,1578, -1,143,1419,1,40, -1177,1,41,1659,1, -42,1662,1,479,1559, -1,44,1183,1,481, -1646,1,373,1409,1, -47,1184,1,157,1443, -1,49,1196,1,50, -1201,1,48,1190,1, -379,1386,1,380,1391, -1,51,1206,1,476, -1543,1,371,1365,1, -478,1583,1,1048,1344, -1,375,1376,1,172, -1469,1,262,1119,1, -283,1172,1,63,1222, -1,67,1233,1,68, -1238,1,69,1243,1, -66,1228,1,461,2539, -16,0,627,1,74, -1253,1,377,1381,1, -1002,1593,1,70,1248, -1,188,1518,1,82, -1280,1,305,1211,1, -477,1549,1,827,1331, -1,93,1318,1,480, -1564,1,205,1523,1, -942,1490,1,107,1338, -1,29,2540,19,280, -1,29,2541,5,84, -1,1011,1102,1,1012, -2542,16,0,278,1, -1013,1258,1,262,1119, -1,1267,2543,16,0, -278,1,515,2544,16, -0,278,1,1521,2545, -16,0,278,1,525, -1216,1,283,1172,1, -2299,2546,16,0,278, -1,42,2547,16,0, -278,1,40,1177,1, -44,1183,1,47,1184, -1,1303,2548,16,0, -278,1,1555,2549,16, -0,278,1,50,1201, -1,48,1190,1,49, -1196,1,51,1206,1, -63,1222,1,305,1211, -1,66,1228,1,67, -1233,1,68,1238,1, -69,1243,1,70,1248, -1,73,2550,16,0, -278,1,74,1253,1, -328,1302,1,1048,1344, -1,82,1280,1,1840, -2551,16,0,278,1, -1591,2552,16,0,278, -1,1341,2553,16,0, -278,1,1096,1312,1, -93,1318,1,352,1349, -1,107,1338,1,1114, -1343,1,118,1355,1, -1123,2554,16,0,278, -1,371,1365,1,1628, -2555,16,0,278,1, -375,1376,1,1882,2556, -16,0,278,1,377, -1381,1,379,1386,1, -380,1391,1,883,2557, -16,0,278,1,373, -1409,1,130,1414,1, -143,1419,1,387,2558, -16,0,278,1,2664, -2559,16,0,278,1, -1159,2560,16,0,278, -1,157,1443,1,1413, -2561,16,0,278,1, -1665,2562,16,0,278, -1,412,2563,16,0, -278,1,1377,2564,16, -0,278,1,172,1469, -1,1939,2565,16,0, -278,1,437,2566,16, -0,278,1,188,1518, -1,942,1490,1,1195, -2567,16,0,278,1, -1449,2568,16,0,278, -1,1701,2569,16,0, -278,1,447,1511,1, -205,2570,16,0,278, -1,827,2571,16,0, -278,1,223,2572,16, -0,278,1,476,1543, -1,477,1549,1,1231, -2573,16,0,278,1, -479,1559,1,480,1564, -1,1485,2574,16,0, -278,1,1737,2575,16, -0,278,1,242,2576, -16,0,278,1,478, -1583,1,1001,1588,1, -1002,1593,1,30,2577, -19,268,1,30,2578, -5,84,1,1011,1102, -1,1012,2579,16,0, -266,1,1013,1258,1, -262,1119,1,1267,2580, -16,0,266,1,515, -2581,16,0,266,1, -1521,2582,16,0,266, -1,525,1216,1,283, -1172,1,2299,2583,16, -0,266,1,42,2584, -16,0,266,1,40, -1177,1,44,1183,1, -47,1184,1,1303,2585, -16,0,266,1,1555, -2586,16,0,266,1, -50,1201,1,48,1190, -1,49,1196,1,51, -1206,1,63,1222,1, -305,1211,1,66,1228, -1,67,1233,1,68, -1238,1,69,1243,1, -70,1248,1,73,2587, -16,0,266,1,74, -1253,1,328,1302,1, -1048,1344,1,82,1280, -1,1840,2588,16,0, -266,1,1591,2589,16, -0,266,1,1341,2590, -16,0,266,1,1096, -1312,1,93,1318,1, -352,1349,1,107,1338, -1,1114,1343,1,118, -1355,1,1123,2591,16, -0,266,1,371,1365, -1,1628,2592,16,0, -266,1,375,1376,1, -1882,2593,16,0,266, -1,377,1381,1,379, -1386,1,380,1391,1, -883,2594,16,0,266, -1,373,1409,1,130, -1414,1,143,1419,1, -387,2595,16,0,266, -1,2664,2596,16,0, -266,1,1159,2597,16, -0,266,1,157,1443, -1,1413,2598,16,0, -266,1,1665,2599,16, -0,266,1,412,2600, -16,0,266,1,1377, -2601,16,0,266,1, -172,1469,1,1939,2602, -16,0,266,1,437, -2603,16,0,266,1, -188,1518,1,942,1490, -1,1195,2604,16,0, -266,1,1449,2605,16, -0,266,1,1701,2606, -16,0,266,1,447, -1511,1,205,2607,16, -0,266,1,827,2608, -16,0,266,1,223, -2609,16,0,266,1, -476,1543,1,477,1549, -1,1231,2610,16,0, -266,1,479,1559,1, -480,1564,1,1485,2611, -16,0,266,1,1737, -2612,16,0,266,1, -242,2613,16,0,266, -1,478,1583,1,1001, -1588,1,1002,1593,1, -31,2614,19,253,1, -31,2615,5,84,1, -1011,1102,1,1012,2616, -16,0,251,1,1013, -1258,1,262,1119,1, -1267,2617,16,0,251, -1,515,2618,16,0, -251,1,1521,2619,16, -0,251,1,525,1216, -1,283,1172,1,2299, -2620,16,0,251,1, -42,2621,16,0,251, -1,40,1177,1,44, -1183,1,47,1184,1, -1303,2622,16,0,251, -1,1555,2623,16,0, -251,1,50,1201,1, -48,1190,1,49,1196, -1,51,1206,1,63, -1222,1,305,1211,1, -66,1228,1,67,1233, -1,68,1238,1,69, -1243,1,70,1248,1, -73,2624,16,0,251, -1,74,1253,1,328, -1302,1,1048,1344,1, -82,1280,1,1840,2625, -16,0,251,1,1591, -2626,16,0,251,1, -1341,2627,16,0,251, -1,1096,1312,1,93, -1318,1,352,1349,1, -107,1338,1,1114,1343, -1,118,1355,1,1123, -2628,16,0,251,1, -371,1365,1,1628,2629, -16,0,251,1,375, -1376,1,1882,2630,16, -0,251,1,377,1381, -1,379,1386,1,380, -1391,1,883,2631,16, -0,251,1,373,1409, -1,130,1414,1,143, -2632,16,0,251,1, -387,2633,16,0,251, -1,2664,2634,16,0, -251,1,1159,2635,16, -0,251,1,157,2636, -16,0,251,1,1413, -2637,16,0,251,1, -1665,2638,16,0,251, -1,412,2639,16,0, -251,1,1377,2640,16, -0,251,1,172,1469, -1,1939,2641,16,0, -251,1,437,2642,16, -0,251,1,188,1518, -1,942,1490,1,1195, -2643,16,0,251,1, -1449,2644,16,0,251, -1,1701,2645,16,0, -251,1,447,1511,1, -205,2646,16,0,251, -1,827,2647,16,0, -251,1,223,2648,16, -0,251,1,476,1543, -1,477,1549,1,1231, -2649,16,0,251,1, -479,1559,1,480,1564, -1,1485,2650,16,0, -251,1,1737,2651,16, -0,251,1,242,2652, -16,0,251,1,478, -1583,1,1001,1588,1, -1002,1593,1,32,2653, -19,246,1,32,2654, -5,84,1,1011,1102, -1,1012,2655,16,0, -244,1,1013,1258,1, -262,1119,1,1267,2656, -16,0,244,1,515, -2657,16,0,244,1, -1521,2658,16,0,244, -1,525,1216,1,283, -1172,1,2299,2659,16, -0,244,1,42,2660, -16,0,244,1,40, -1177,1,44,1183,1, -47,1184,1,1303,2661, -16,0,244,1,1555, -2662,16,0,244,1, -50,1201,1,48,1190, -1,49,1196,1,51, -1206,1,63,1222,1, -305,1211,1,66,1228, -1,67,1233,1,68, -1238,1,69,1243,1, -70,1248,1,73,2663, -16,0,244,1,74, -1253,1,328,1302,1, -1048,1344,1,82,1280, -1,1840,2664,16,0, -244,1,1591,2665,16, -0,244,1,1341,2666, -16,0,244,1,1096, -1312,1,93,1318,1, -352,1349,1,107,1338, -1,1114,1343,1,118, -1355,1,1123,2667,16, -0,244,1,371,1365, -1,1628,2668,16,0, -244,1,375,1376,1, -1882,2669,16,0,244, -1,377,1381,1,379, -1386,1,380,1391,1, -883,2670,16,0,244, -1,373,1409,1,130, -1414,1,143,2671,16, -0,244,1,387,2672, -16,0,244,1,2664, -2673,16,0,244,1, -1159,2674,16,0,244, -1,157,2675,16,0, -244,1,1413,2676,16, -0,244,1,1665,2677, -16,0,244,1,412, -2678,16,0,244,1, -1377,2679,16,0,244, -1,172,1469,1,1939, -2680,16,0,244,1, -437,2681,16,0,244, -1,188,1518,1,942, -1490,1,1195,2682,16, -0,244,1,1449,2683, -16,0,244,1,1701, -2684,16,0,244,1, -447,1511,1,205,2685, -16,0,244,1,827, -2686,16,0,244,1, -223,2687,16,0,244, -1,476,1543,1,477, -1549,1,1231,2688,16, -0,244,1,479,1559, -1,480,1564,1,1485, -2689,16,0,244,1, -1737,2690,16,0,244, -1,242,2691,16,0, -244,1,478,1583,1, -1001,1588,1,1002,1593, -1,33,2692,19,332, -1,33,2693,5,84, -1,1011,1102,1,1012, -2694,16,0,330,1, -1013,1258,1,262,1119, -1,1267,2695,16,0, -330,1,515,2696,16, -0,330,1,1521,2697, -16,0,330,1,525, -1216,1,283,1172,1, -2299,2698,16,0,330, -1,42,2699,16,0, -330,1,40,1177,1, -44,1183,1,47,1184, -1,1303,2700,16,0, -330,1,1555,2701,16, -0,330,1,50,1201, -1,48,1190,1,49, -1196,1,51,1206,1, -63,1222,1,305,1211, -1,66,1228,1,67, -1233,1,68,1238,1, -69,1243,1,70,1248, -1,73,2702,16,0, -330,1,74,1253,1, -328,1302,1,1048,1344, -1,82,1280,1,1840, -2703,16,0,330,1, -1591,2704,16,0,330, -1,1341,2705,16,0, -330,1,1096,1312,1, -93,1318,1,352,1349, -1,107,1338,1,1114, -1343,1,118,1355,1, -1123,2706,16,0,330, -1,371,1365,1,1628, -2707,16,0,330,1, -375,1376,1,1882,2708, -16,0,330,1,377, -1381,1,379,1386,1, -380,1391,1,883,2709, -16,0,330,1,373, -1409,1,130,1414,1, -143,1419,1,387,2710, -16,0,330,1,2664, -2711,16,0,330,1, -1159,2712,16,0,330, -1,157,1443,1,1413, -2713,16,0,330,1, -1665,2714,16,0,330, -1,412,2715,16,0, -330,1,1377,2716,16, -0,330,1,172,1469, -1,1939,2717,16,0, -330,1,437,2718,16, -0,330,1,188,1518, -1,942,1490,1,1195, -2719,16,0,330,1, -1449,2720,16,0,330, -1,1701,2721,16,0, -330,1,447,1511,1, -205,2722,16,0,330, -1,827,2723,16,0, -330,1,223,2724,16, -0,330,1,476,1543, -1,477,1549,1,1231, -2725,16,0,330,1, -479,1559,1,480,1564, -1,1485,2726,16,0, -330,1,1737,2727,16, -0,330,1,242,1578, -1,478,1583,1,1001, -1588,1,1002,1593,1, -34,2728,19,322,1, -34,2729,5,84,1, -1011,1102,1,1012,2730, -16,0,320,1,1013, -1258,1,262,1119,1, -1267,2731,16,0,320, -1,515,2732,16,0, -320,1,1521,2733,16, -0,320,1,525,1216, -1,283,1172,1,2299, -2734,16,0,320,1, -42,2735,16,0,320, -1,40,1177,1,44, -1183,1,47,1184,1, -1303,2736,16,0,320, -1,1555,2737,16,0, -320,1,50,1201,1, -48,1190,1,49,1196, -1,51,1206,1,63, -1222,1,305,1211,1, -66,1228,1,67,1233, -1,68,1238,1,69, -1243,1,70,1248,1, -73,2738,16,0,320, -1,74,1253,1,328, -1302,1,1048,1344,1, -82,1280,1,1840,2739, -16,0,320,1,1591, -2740,16,0,320,1, -1341,2741,16,0,320, -1,1096,1312,1,93, -1318,1,352,1349,1, -107,1338,1,1114,1343, -1,118,1355,1,1123, -2742,16,0,320,1, -371,1365,1,1628,2743, -16,0,320,1,375, -1376,1,1882,2744,16, -0,320,1,377,1381, -1,379,1386,1,380, -1391,1,883,2745,16, -0,320,1,373,1409, -1,130,1414,1,143, -1419,1,387,2746,16, -0,320,1,2664,2747, -16,0,320,1,1159, -2748,16,0,320,1, -157,1443,1,1413,2749, -16,0,320,1,1665, -2750,16,0,320,1, -412,2751,16,0,320, -1,1377,2752,16,0, -320,1,172,1469,1, -1939,2753,16,0,320, -1,437,2754,16,0, -320,1,188,1518,1, -942,1490,1,1195,2755, -16,0,320,1,1449, -2756,16,0,320,1, -1701,2757,16,0,320, -1,447,1511,1,205, -1523,1,827,2758,16, -0,320,1,223,1533, -1,476,1543,1,477, -1549,1,1231,2759,16, -0,320,1,479,1559, -1,480,1564,1,1485, -2760,16,0,320,1, -1737,2761,16,0,320, -1,242,1578,1,478, -1583,1,1001,1588,1, -1002,1593,1,35,2762, -19,311,1,35,2763, -5,84,1,1011,1102, -1,1012,2764,16,0, -309,1,1013,1258,1, -262,1119,1,1267,2765, -16,0,309,1,515, -2766,16,0,309,1, -1521,2767,16,0,309, -1,525,1216,1,283, -1172,1,2299,2768,16, -0,309,1,42,2769, -16,0,309,1,40, -1177,1,44,1183,1, -47,1184,1,1303,2770, -16,0,309,1,1555, -2771,16,0,309,1, -50,1201,1,48,1190, -1,49,1196,1,51, -1206,1,63,1222,1, -305,1211,1,66,1228, -1,67,1233,1,68, -1238,1,69,1243,1, -70,1248,1,73,2772, -16,0,309,1,74, -1253,1,328,1302,1, -1048,1344,1,82,1280, -1,1840,2773,16,0, -309,1,1591,2774,16, -0,309,1,1341,2775, -16,0,309,1,1096, -1312,1,93,1318,1, -352,1349,1,107,1338, -1,1114,1343,1,118, -1355,1,1123,2776,16, -0,309,1,371,1365, -1,1628,2777,16,0, -309,1,375,1376,1, -1882,2778,16,0,309, -1,377,1381,1,379, -1386,1,380,1391,1, -883,2779,16,0,309, -1,373,1409,1,130, -1414,1,143,1419,1, -387,2780,16,0,309, -1,2664,2781,16,0, -309,1,1159,2782,16, -0,309,1,157,1443, -1,1413,2783,16,0, -309,1,1665,2784,16, -0,309,1,412,2785, -16,0,309,1,1377, -2786,16,0,309,1, -172,1469,1,1939,2787, -16,0,309,1,437, -2788,16,0,309,1, -188,1518,1,942,1490, -1,1195,2789,16,0, -309,1,1449,2790,16, -0,309,1,1701,2791, -16,0,309,1,447, -1511,1,205,1523,1, -827,2792,16,0,309, -1,223,2793,16,0, -309,1,476,1543,1, -477,1549,1,1231,2794, -16,0,309,1,479, +373,1409,1,387,2382, +16,0,289,1,137, +2383,16,0,545,1, +143,2384,16,0,289, +1,1901,2385,16,0, +545,1,1048,1344,1, +2658,2386,16,0,545, +1,1153,2387,16,0, +545,1,375,1376,1, +151,2388,16,0,545, +1,1407,2389,16,0, +545,1,1659,2390,16, +0,545,1,2413,2391, +16,0,545,1,1159, +2392,16,0,289,1, +381,2393,16,0,545, +1,157,2394,16,0, +289,1,1413,2395,16, +0,289,1,883,2396, +16,0,289,1,1371, +2397,16,0,545,1, +328,1302,1,2105,814, +1,2106,2398,16,0, +545,1,166,2399,16, +0,545,1,525,2400, +16,0,545,1,1622, +2401,16,0,545,1, +406,2402,16,0,545, +1,1574,799,1,172, +1469,1,1931,861,1, +412,2403,16,0,289, +1,1933,2404,16,0, +545,1,1876,2405,16, +0,545,1,431,2406, +16,0,545,1,1585, +2407,16,0,545,1, +182,2408,16,0,545, +1,1628,2409,16,0, +289,1,1189,2410,16, +0,545,1,437,2411, +16,0,289,1,1591, +2412,16,0,289,1, +188,1518,1,1695,2413, +16,0,545,1,2198, +2414,16,0,545,1, +1195,2415,16,0,289, +1,1449,2416,16,0, +289,1,1701,2417,16, +0,289,1,447,2418, +16,0,545,1,199, +2419,16,0,545,1, +2459,882,1,1958,2420, +16,0,545,1,2462, +889,1,1657,894,1, +205,2421,16,0,289, +1,459,2422,16,0, +545,1,462,2423,16, +0,545,1,1665,2424, +16,0,289,1,217, +2425,16,0,545,1, +2227,908,1,942,1490, +1,1225,2426,16,0, +545,1,223,2427,16, +0,289,1,1479,2428, +16,0,545,1,1731, +2429,16,0,545,1, +477,1549,1,1231,2430, +16,0,289,1,479, 1559,1,480,1564,1, -1485,2795,16,0,309, -1,1737,2796,16,0, -309,1,242,1578,1, -478,1583,1,1001,1588, -1,1002,1593,1,36, -2797,19,216,1,36, -2798,5,94,1,256, -2799,16,0,214,1, -1261,2800,16,0,214, -1,509,2801,16,0, -214,1,1515,2802,16, -0,214,1,2021,718, -1,1775,2803,16,0, -214,1,2029,725,1, -2030,731,1,2031,736, -1,2032,741,1,2033, -746,1,277,2804,16, -0,214,1,2035,752, -1,2037,757,1,2039, -762,1,32,2805,16, -0,214,1,2041,768, -1,2293,2806,16,0, -214,1,2043,774,1, -2045,779,1,41,2807, -16,0,214,1,1297, -2808,16,0,214,1, -43,2809,16,0,214, -1,1803,787,1,1804, -2810,16,0,214,1, -299,2811,16,0,214, -1,52,2812,16,0, -214,1,2318,2813,16, -0,214,1,2075,2814, -16,0,214,1,1574, -799,1,71,2815,16, -0,214,1,76,2816, -16,0,214,1,1834, -2817,16,0,214,1, -2337,2818,16,0,214, -1,79,2819,16,0, -214,1,1335,2820,16, -0,214,1,322,2821, -16,0,214,1,85, -2822,16,0,214,1, -89,2823,16,0,214, -1,346,2824,16,0, -214,1,2105,814,1, -2106,2825,16,0,214, -1,97,2826,16,0, -214,1,1860,821,1, -2364,827,1,102,2827, -16,0,214,1,112, -2828,16,0,214,1, -1117,2829,16,0,214, -1,1873,835,1,1876, -2830,16,0,214,1, -124,2831,16,0,214, -1,2136,842,1,381, -2832,16,0,214,1, -525,2833,16,0,214, -1,137,2834,16,0, -214,1,1901,2835,16, -0,214,1,2658,2836, -16,0,214,1,1153, -2837,16,0,214,1, -151,2838,16,0,214, -1,1407,2839,16,0, -214,1,1659,2840,16, -0,214,1,2413,2841, -16,0,214,1,406, -2842,16,0,214,1, -1371,2843,16,0,214, -1,166,2844,16,0, -214,1,1622,2845,16, -0,214,1,1931,861, -1,1933,2846,16,0, -214,1,431,2847,16, -0,214,1,1585,2848, -16,0,214,1,182, -2849,16,0,214,1, -1189,2850,16,0,214, -1,1443,2851,16,0, -214,1,1695,2852,16, -0,214,1,2198,2853, -16,0,214,1,447, -2854,16,0,214,1, -2458,876,1,2459,882, -1,1958,2855,16,0, -214,1,2462,889,1, -1657,894,1,2464,899, -1,199,2856,16,0, -214,1,459,2857,16, -0,214,1,462,2858, -16,0,214,1,217, -2859,16,0,214,1, -2227,908,1,1225,2860, -16,0,214,1,1479, -2861,16,0,214,1, -1731,2862,16,0,214, -1,1989,916,1,1990, -2863,16,0,214,1, -236,2864,16,0,214, -1,1756,2865,16,0, -214,1,37,2866,19, -233,1,37,2867,5, -94,1,256,2868,16, -0,231,1,1261,2869, -16,0,231,1,509, -2870,16,0,231,1, -1515,2871,16,0,231, -1,2021,718,1,1775, -2872,16,0,231,1, -2029,725,1,2030,731, -1,2031,736,1,2032, -741,1,2033,746,1, -277,2873,16,0,231, -1,2035,752,1,2037, -757,1,2039,762,1, -32,2874,16,0,231, -1,2041,768,1,2293, -2875,16,0,231,1, -2043,774,1,2045,779, -1,41,2876,16,0, -231,1,1297,2877,16, -0,231,1,43,2878, -16,0,231,1,1803, -787,1,1804,2879,16, -0,231,1,299,2880, -16,0,231,1,52, -2881,16,0,231,1, -2318,2882,16,0,231, -1,2075,2883,16,0, -231,1,1574,799,1, -71,2884,16,0,231, -1,76,2885,16,0, -231,1,1834,2886,16, -0,231,1,2337,2887, -16,0,231,1,79, -2888,16,0,231,1, -1335,2889,16,0,231, -1,322,2890,16,0, -231,1,85,2891,16, -0,231,1,89,2892, -16,0,231,1,346, -2893,16,0,231,1, -2105,814,1,2106,2894, -16,0,231,1,97, -2895,16,0,231,1, +1485,2431,16,0,289, +1,1737,2432,16,0, +289,1,1989,916,1, +1990,2433,16,0,545, +1,1443,2434,16,0, +545,1,236,2435,16, +0,545,1,2136,842, +1,2664,2436,16,0, +289,1,476,1543,1, +242,2437,16,0,289, +1,478,1583,1,1939, +2438,16,0,289,1, +1001,1588,1,1002,1593, +1,1756,2439,16,0, +545,1,26,2440,19, +308,1,26,2441,5, +84,1,1011,1102,1, +1012,2442,16,0,306, +1,1013,1258,1,262, +1119,1,1267,2443,16, +0,306,1,515,2444, +16,0,660,1,1521, +2445,16,0,306,1, +525,1216,1,283,1172, +1,2299,2446,16,0, +306,1,42,2447,16, +0,306,1,40,1177, +1,44,1183,1,47, +1184,1,1303,2448,16, +0,306,1,1555,2449, +16,0,306,1,50, +1201,1,48,1190,1, +49,1196,1,51,1206, +1,63,1222,1,305, +1211,1,66,1228,1, +67,1233,1,68,1238, +1,69,1243,1,70, +1248,1,73,2450,16, +0,306,1,74,1253, +1,328,1302,1,1048, +1344,1,82,2451,16, +0,306,1,1840,2452, +16,0,306,1,1591, +2453,16,0,306,1, +1341,2454,16,0,306, +1,1096,1312,1,93, +1318,1,352,1349,1, +107,2455,16,0,306, +1,1114,1343,1,118, +1355,1,1123,2456,16, +0,306,1,371,1365, +1,1628,2457,16,0, +306,1,375,1376,1, +1882,2458,16,0,306, +1,377,1381,1,379, +1386,1,380,1391,1, +883,2459,16,0,306, +1,373,1409,1,130, +1414,1,143,2460,16, +0,306,1,387,2461, +16,0,306,1,2664, +2462,16,0,306,1, +1159,2463,16,0,306, +1,157,2464,16,0, +306,1,1413,2465,16, +0,306,1,1665,2466, +16,0,306,1,412, +2467,16,0,306,1, +1377,2468,16,0,306, +1,172,1469,1,1939, +2469,16,0,306,1, +437,2470,16,0,588, +1,188,1518,1,942, +1490,1,1195,2471,16, +0,306,1,1449,2472, +16,0,306,1,1701, +2473,16,0,306,1, +447,1511,1,205,2474, +16,0,306,1,827, +2475,16,0,306,1, +223,2476,16,0,306, +1,476,1543,1,477, +1549,1,1231,2477,16, +0,306,1,479,1559, +1,480,1564,1,1485, +2478,16,0,306,1, +1737,2479,16,0,306, +1,242,2480,16,0, +306,1,478,1583,1, +1001,1588,1,1002,1593, +1,27,2481,19,598, +1,27,2482,5,95, +1,256,2483,16,0, +596,1,1261,2484,16, +0,596,1,509,2485, +16,0,596,1,1515, +2486,16,0,596,1, +2021,718,1,1775,2487, +16,0,596,1,2029, +725,1,2030,731,1, +2031,736,1,2032,741, +1,2033,746,1,277, +2488,16,0,596,1, +2035,752,1,2037,757, +1,2039,762,1,32, +2489,16,0,596,1, +2041,768,1,2293,2490, +16,0,596,1,2043, +774,1,2045,779,1, +41,2491,16,0,596, +1,1297,2492,16,0, +596,1,43,2493,16, +0,596,1,1803,787, +1,1804,2494,16,0, +596,1,299,2495,16, +0,596,1,52,2496, +16,0,596,1,2318, +2497,16,0,596,1, +62,2498,16,0,596, +1,2075,2499,16,0, +596,1,1574,799,1, +71,2500,16,0,596, +1,76,2501,16,0, +596,1,1834,2502,16, +0,596,1,2337,2503, +16,0,596,1,79, +2504,16,0,596,1, +1335,2505,16,0,596, +1,322,2506,16,0, +596,1,85,2507,16, +0,596,1,89,2508, +16,0,596,1,346, +2509,16,0,596,1, +2105,814,1,2106,2510, +16,0,596,1,97, +2511,16,0,596,1, 1860,821,1,2364,827, -1,102,2896,16,0, -231,1,112,2897,16, -0,231,1,1117,2898, -16,0,231,1,1873, -835,1,1876,2899,16, -0,231,1,124,2900, -16,0,231,1,2136, -842,1,381,2901,16, -0,231,1,525,2902, -16,0,231,1,137, -2903,16,0,231,1, -1901,2904,16,0,231, -1,2658,2905,16,0, -231,1,1153,2906,16, -0,231,1,151,2907, -16,0,231,1,1407, -2908,16,0,231,1, -1659,2909,16,0,231, -1,2413,2910,16,0, -231,1,406,2911,16, -0,231,1,1371,2912, -16,0,231,1,166, -2913,16,0,231,1, -1622,2914,16,0,231, +1,102,2512,16,0, +596,1,112,2513,16, +0,596,1,1117,2514, +16,0,596,1,1873, +835,1,1876,2515,16, +0,596,1,124,2516, +16,0,596,1,2136, +842,1,381,2517,16, +0,596,1,525,2518, +16,0,596,1,137, +2519,16,0,596,1, +1901,2520,16,0,596, +1,2658,2521,16,0, +596,1,1153,2522,16, +0,596,1,151,2523, +16,0,596,1,1407, +2524,16,0,596,1, +1659,2525,16,0,596, +1,2413,2526,16,0, +596,1,406,2527,16, +0,596,1,1371,2528, +16,0,596,1,166, +2529,16,0,596,1, +1622,2530,16,0,596, 1,1931,861,1,1933, -2915,16,0,231,1, -431,2916,16,0,231, -1,1585,2917,16,0, -231,1,182,2918,16, -0,231,1,1189,2919, -16,0,231,1,1443, -2920,16,0,231,1, -1695,2921,16,0,231, -1,2198,2922,16,0, -231,1,447,2923,16, -0,231,1,2458,876, +2531,16,0,596,1, +431,2532,16,0,596, +1,1585,2533,16,0, +596,1,182,2534,16, +0,596,1,1189,2535, +16,0,596,1,1443, +2536,16,0,596,1, +1695,2537,16,0,596, +1,2198,2538,16,0, +596,1,447,2539,16, +0,596,1,2458,876, 1,2459,882,1,1958, -2924,16,0,231,1, +2540,16,0,596,1, 2462,889,1,1657,894, 1,2464,899,1,199, -2925,16,0,231,1, -459,2926,16,0,231, -1,462,2927,16,0, -231,1,217,2928,16, -0,231,1,2227,908, -1,1225,2929,16,0, -231,1,1479,2930,16, -0,231,1,1731,2931, -16,0,231,1,1989, -916,1,1990,2932,16, -0,231,1,236,2933, -16,0,231,1,1756, -2934,16,0,231,1, -38,2935,19,230,1, -38,2936,5,84,1, -1011,1102,1,1012,2937, -16,0,228,1,1013, -1258,1,262,1119,1, -1267,2938,16,0,228, -1,515,2939,16,0, -228,1,1521,2940,16, -0,228,1,525,1216, -1,283,1172,1,2299, -2941,16,0,228,1, -42,2942,16,0,228, -1,40,1177,1,44, -1183,1,47,1184,1, -1303,2943,16,0,228, -1,1555,2944,16,0, -228,1,50,1201,1, -48,1190,1,49,1196, -1,51,1206,1,63, -1222,1,305,1211,1, -66,1228,1,67,1233, +2541,16,0,596,1, +459,2542,16,0,596, +1,462,2543,16,0, +596,1,217,2544,16, +0,596,1,2227,908, +1,1225,2545,16,0, +596,1,1479,2546,16, +0,596,1,1731,2547, +16,0,596,1,1989, +916,1,1990,2548,16, +0,596,1,236,2549, +16,0,596,1,1756, +2550,16,0,596,1, +28,2551,19,629,1, +28,2552,5,60,1, +328,1302,1,223,1533, +1,1096,1312,1,118, +1355,1,883,1397,1, +525,1216,1,1001,1588, +1,130,1414,1,459, +1688,1,1114,1343,1, +352,1349,1,447,1511, +1,464,1683,1,1011, +1102,1,1013,1258,1, +242,1578,1,143,1419, +1,40,1177,1,41, +1659,1,42,1662,1, +479,1559,1,44,1183, +1,481,1646,1,373, +1409,1,47,1184,1, +157,1443,1,49,1196, +1,50,1201,1,48, +1190,1,379,1386,1, +380,1391,1,51,1206, +1,476,1543,1,371, +1365,1,478,1583,1, +1048,1344,1,375,1376, +1,172,1469,1,262, +1119,1,283,1172,1, +63,1222,1,67,1233, 1,68,1238,1,69, -1243,1,70,1248,1, -73,2945,16,0,228, -1,74,1253,1,328, -1302,1,1048,1344,1, -82,1280,1,1840,2946, -16,0,228,1,1591, -2947,16,0,228,1, -1341,2948,16,0,228, +1243,1,66,1228,1, +461,2553,16,0,627, +1,74,1253,1,377, +1381,1,1002,1593,1, +70,1248,1,188,1518, +1,82,1280,1,305, +1211,1,477,1549,1, +827,1331,1,93,1318, +1,480,1564,1,205, +1523,1,942,1490,1, +107,1338,1,29,2554, +19,280,1,29,2555, +5,84,1,1011,1102, +1,1012,2556,16,0, +278,1,1013,1258,1, +262,1119,1,1267,2557, +16,0,278,1,515, +2558,16,0,278,1, +1521,2559,16,0,278, +1,525,1216,1,283, +1172,1,2299,2560,16, +0,278,1,42,2561, +16,0,278,1,40, +1177,1,44,1183,1, +47,1184,1,1303,2562, +16,0,278,1,1555, +2563,16,0,278,1, +50,1201,1,48,1190, +1,49,1196,1,51, +1206,1,63,1222,1, +305,1211,1,66,1228, +1,67,1233,1,68, +1238,1,69,1243,1, +70,1248,1,73,2564, +16,0,278,1,74, +1253,1,328,1302,1, +1048,1344,1,82,2565, +16,0,278,1,1840, +2566,16,0,278,1, +1591,2567,16,0,278, +1,1341,2568,16,0, +278,1,1096,1312,1, +93,1318,1,352,1349, +1,107,2569,16,0, +278,1,1114,1343,1, +118,1355,1,1123,2570, +16,0,278,1,371, +1365,1,1628,2571,16, +0,278,1,375,1376, +1,1882,2572,16,0, +278,1,377,1381,1, +379,1386,1,380,1391, +1,883,2573,16,0, +278,1,373,1409,1, +130,1414,1,143,1419, +1,387,2574,16,0, +278,1,2664,2575,16, +0,278,1,1159,2576, +16,0,278,1,157, +1443,1,1413,2577,16, +0,278,1,1665,2578, +16,0,278,1,412, +2579,16,0,278,1, +1377,2580,16,0,278, +1,172,1469,1,1939, +2581,16,0,278,1, +437,2582,16,0,278, +1,188,1518,1,942, +1490,1,1195,2583,16, +0,278,1,1449,2584, +16,0,278,1,1701, +2585,16,0,278,1, +447,1511,1,205,2586, +16,0,278,1,827, +2587,16,0,278,1, +223,2588,16,0,278, +1,476,1543,1,477, +1549,1,1231,2589,16, +0,278,1,479,1559, +1,480,1564,1,1485, +2590,16,0,278,1, +1737,2591,16,0,278, +1,242,2592,16,0, +278,1,478,1583,1, +1001,1588,1,1002,1593, +1,30,2593,19,268, +1,30,2594,5,84, +1,1011,1102,1,1012, +2595,16,0,266,1, +1013,1258,1,262,1119, +1,1267,2596,16,0, +266,1,515,2597,16, +0,266,1,1521,2598, +16,0,266,1,525, +1216,1,283,1172,1, +2299,2599,16,0,266, +1,42,2600,16,0, +266,1,40,1177,1, +44,1183,1,47,1184, +1,1303,2601,16,0, +266,1,1555,2602,16, +0,266,1,50,1201, +1,48,1190,1,49, +1196,1,51,1206,1, +63,1222,1,305,1211, +1,66,1228,1,67, +1233,1,68,1238,1, +69,1243,1,70,1248, +1,73,2603,16,0, +266,1,74,1253,1, +328,1302,1,1048,1344, +1,82,2604,16,0, +266,1,1840,2605,16, +0,266,1,1591,2606, +16,0,266,1,1341, +2607,16,0,266,1, +1096,1312,1,93,1318, +1,352,1349,1,107, +2608,16,0,266,1, +1114,1343,1,118,1355, +1,1123,2609,16,0, +266,1,371,1365,1, +1628,2610,16,0,266, +1,375,1376,1,1882, +2611,16,0,266,1, +377,1381,1,379,1386, +1,380,1391,1,883, +2612,16,0,266,1, +373,1409,1,130,1414, +1,143,1419,1,387, +2613,16,0,266,1, +2664,2614,16,0,266, +1,1159,2615,16,0, +266,1,157,1443,1, +1413,2616,16,0,266, +1,1665,2617,16,0, +266,1,412,2618,16, +0,266,1,1377,2619, +16,0,266,1,172, +1469,1,1939,2620,16, +0,266,1,437,2621, +16,0,266,1,188, +1518,1,942,1490,1, +1195,2622,16,0,266, +1,1449,2623,16,0, +266,1,1701,2624,16, +0,266,1,447,1511, +1,205,2625,16,0, +266,1,827,2626,16, +0,266,1,223,2627, +16,0,266,1,476, +1543,1,477,1549,1, +1231,2628,16,0,266, +1,479,1559,1,480, +1564,1,1485,2629,16, +0,266,1,1737,2630, +16,0,266,1,242, +2631,16,0,266,1, +478,1583,1,1001,1588, +1,1002,1593,1,31, +2632,19,253,1,31, +2633,5,84,1,1011, +1102,1,1012,2634,16, +0,251,1,1013,1258, +1,262,1119,1,1267, +2635,16,0,251,1, +515,2636,16,0,251, +1,1521,2637,16,0, +251,1,525,1216,1, +283,1172,1,2299,2638, +16,0,251,1,42, +2639,16,0,251,1, +40,1177,1,44,1183, +1,47,1184,1,1303, +2640,16,0,251,1, +1555,2641,16,0,251, +1,50,1201,1,48, +1190,1,49,1196,1, +51,1206,1,63,1222, +1,305,1211,1,66, +1228,1,67,1233,1, +68,1238,1,69,1243, +1,70,1248,1,73, +2642,16,0,251,1, +74,1253,1,328,1302, +1,1048,1344,1,82, +2643,16,0,251,1, +1840,2644,16,0,251, +1,1591,2645,16,0, +251,1,1341,2646,16, +0,251,1,1096,1312, +1,93,1318,1,352, +1349,1,107,2647,16, +0,251,1,1114,1343, +1,118,1355,1,1123, +2648,16,0,251,1, +371,1365,1,1628,2649, +16,0,251,1,375, +1376,1,1882,2650,16, +0,251,1,377,1381, +1,379,1386,1,380, +1391,1,883,2651,16, +0,251,1,373,1409, +1,130,1414,1,143, +2652,16,0,251,1, +387,2653,16,0,251, +1,2664,2654,16,0, +251,1,1159,2655,16, +0,251,1,157,2656, +16,0,251,1,1413, +2657,16,0,251,1, +1665,2658,16,0,251, +1,412,2659,16,0, +251,1,1377,2660,16, +0,251,1,172,1469, +1,1939,2661,16,0, +251,1,437,2662,16, +0,251,1,188,1518, +1,942,1490,1,1195, +2663,16,0,251,1, +1449,2664,16,0,251, +1,1701,2665,16,0, +251,1,447,1511,1, +205,2666,16,0,251, +1,827,2667,16,0, +251,1,223,2668,16, +0,251,1,476,1543, +1,477,1549,1,1231, +2669,16,0,251,1, +479,1559,1,480,1564, +1,1485,2670,16,0, +251,1,1737,2671,16, +0,251,1,242,2672, +16,0,251,1,478, +1583,1,1001,1588,1, +1002,1593,1,32,2673, +19,246,1,32,2674, +5,84,1,1011,1102, +1,1012,2675,16,0, +244,1,1013,1258,1, +262,1119,1,1267,2676, +16,0,244,1,515, +2677,16,0,244,1, +1521,2678,16,0,244, +1,525,1216,1,283, +1172,1,2299,2679,16, +0,244,1,42,2680, +16,0,244,1,40, +1177,1,44,1183,1, +47,1184,1,1303,2681, +16,0,244,1,1555, +2682,16,0,244,1, +50,1201,1,48,1190, +1,49,1196,1,51, +1206,1,63,1222,1, +305,1211,1,66,1228, +1,67,1233,1,68, +1238,1,69,1243,1, +70,1248,1,73,2683, +16,0,244,1,74, +1253,1,328,1302,1, +1048,1344,1,82,2684, +16,0,244,1,1840, +2685,16,0,244,1, +1591,2686,16,0,244, +1,1341,2687,16,0, +244,1,1096,1312,1, +93,1318,1,352,1349, +1,107,2688,16,0, +244,1,1114,1343,1, +118,1355,1,1123,2689, +16,0,244,1,371, +1365,1,1628,2690,16, +0,244,1,375,1376, +1,1882,2691,16,0, +244,1,377,1381,1, +379,1386,1,380,1391, +1,883,2692,16,0, +244,1,373,1409,1, +130,1414,1,143,2693, +16,0,244,1,387, +2694,16,0,244,1, +2664,2695,16,0,244, +1,1159,2696,16,0, +244,1,157,2697,16, +0,244,1,1413,2698, +16,0,244,1,1665, +2699,16,0,244,1, +412,2700,16,0,244, +1,1377,2701,16,0, +244,1,172,1469,1, +1939,2702,16,0,244, +1,437,2703,16,0, +244,1,188,1518,1, +942,1490,1,1195,2704, +16,0,244,1,1449, +2705,16,0,244,1, +1701,2706,16,0,244, +1,447,1511,1,205, +2707,16,0,244,1, +827,2708,16,0,244, +1,223,2709,16,0, +244,1,476,1543,1, +477,1549,1,1231,2710, +16,0,244,1,479, +1559,1,480,1564,1, +1485,2711,16,0,244, +1,1737,2712,16,0, +244,1,242,2713,16, +0,244,1,478,1583, +1,1001,1588,1,1002, +1593,1,33,2714,19, +332,1,33,2715,5, +84,1,1011,1102,1, +1012,2716,16,0,330, +1,1013,1258,1,262, +1119,1,1267,2717,16, +0,330,1,515,2718, +16,0,330,1,1521, +2719,16,0,330,1, +525,1216,1,283,1172, +1,2299,2720,16,0, +330,1,42,2721,16, +0,330,1,40,1177, +1,44,1183,1,47, +1184,1,1303,2722,16, +0,330,1,1555,2723, +16,0,330,1,50, +1201,1,48,1190,1, +49,1196,1,51,1206, +1,63,1222,1,305, +1211,1,66,1228,1, +67,1233,1,68,1238, +1,69,1243,1,70, +1248,1,73,2724,16, +0,330,1,74,1253, +1,328,1302,1,1048, +1344,1,82,2725,16, +0,330,1,1840,2726, +16,0,330,1,1591, +2727,16,0,330,1, +1341,2728,16,0,330, 1,1096,1312,1,93, 1318,1,352,1349,1, -107,1338,1,1114,1343, +107,2729,16,0,330, +1,1114,1343,1,118, +1355,1,1123,2730,16, +0,330,1,371,1365, +1,1628,2731,16,0, +330,1,375,1376,1, +1882,2732,16,0,330, +1,377,1381,1,379, +1386,1,380,1391,1, +883,2733,16,0,330, +1,373,1409,1,130, +1414,1,143,1419,1, +387,2734,16,0,330, +1,2664,2735,16,0, +330,1,1159,2736,16, +0,330,1,157,1443, +1,1413,2737,16,0, +330,1,1665,2738,16, +0,330,1,412,2739, +16,0,330,1,1377, +2740,16,0,330,1, +172,1469,1,1939,2741, +16,0,330,1,437, +2742,16,0,330,1, +188,1518,1,942,1490, +1,1195,2743,16,0, +330,1,1449,2744,16, +0,330,1,1701,2745, +16,0,330,1,447, +1511,1,205,2746,16, +0,330,1,827,2747, +16,0,330,1,223, +2748,16,0,330,1, +476,1543,1,477,1549, +1,1231,2749,16,0, +330,1,479,1559,1, +480,1564,1,1485,2750, +16,0,330,1,1737, +2751,16,0,330,1, +242,1578,1,478,1583, +1,1001,1588,1,1002, +1593,1,34,2752,19, +322,1,34,2753,5, +84,1,1011,1102,1, +1012,2754,16,0,320, +1,1013,1258,1,262, +1119,1,1267,2755,16, +0,320,1,515,2756, +16,0,320,1,1521, +2757,16,0,320,1, +525,1216,1,283,1172, +1,2299,2758,16,0, +320,1,42,2759,16, +0,320,1,40,1177, +1,44,1183,1,47, +1184,1,1303,2760,16, +0,320,1,1555,2761, +16,0,320,1,50, +1201,1,48,1190,1, +49,1196,1,51,1206, +1,63,1222,1,305, +1211,1,66,1228,1, +67,1233,1,68,1238, +1,69,1243,1,70, +1248,1,73,2762,16, +0,320,1,74,1253, +1,328,1302,1,1048, +1344,1,82,2763,16, +0,320,1,1840,2764, +16,0,320,1,1591, +2765,16,0,320,1, +1341,2766,16,0,320, +1,1096,1312,1,93, +1318,1,352,1349,1, +107,2767,16,0,320, +1,1114,1343,1,118, +1355,1,1123,2768,16, +0,320,1,371,1365, +1,1628,2769,16,0, +320,1,375,1376,1, +1882,2770,16,0,320, +1,377,1381,1,379, +1386,1,380,1391,1, +883,2771,16,0,320, +1,373,1409,1,130, +1414,1,143,1419,1, +387,2772,16,0,320, +1,2664,2773,16,0, +320,1,1159,2774,16, +0,320,1,157,1443, +1,1413,2775,16,0, +320,1,1665,2776,16, +0,320,1,412,2777, +16,0,320,1,1377, +2778,16,0,320,1, +172,1469,1,1939,2779, +16,0,320,1,437, +2780,16,0,320,1, +188,1518,1,942,1490, +1,1195,2781,16,0, +320,1,1449,2782,16, +0,320,1,1701,2783, +16,0,320,1,447, +1511,1,205,1523,1, +827,2784,16,0,320, +1,223,1533,1,476, +1543,1,477,1549,1, +1231,2785,16,0,320, +1,479,1559,1,480, +1564,1,1485,2786,16, +0,320,1,1737,2787, +16,0,320,1,242, +1578,1,478,1583,1, +1001,1588,1,1002,1593, +1,35,2788,19,311, +1,35,2789,5,84, +1,1011,1102,1,1012, +2790,16,0,309,1, +1013,1258,1,262,1119, +1,1267,2791,16,0, +309,1,515,2792,16, +0,309,1,1521,2793, +16,0,309,1,525, +1216,1,283,1172,1, +2299,2794,16,0,309, +1,42,2795,16,0, +309,1,40,1177,1, +44,1183,1,47,1184, +1,1303,2796,16,0, +309,1,1555,2797,16, +0,309,1,50,1201, +1,48,1190,1,49, +1196,1,51,1206,1, +63,1222,1,305,1211, +1,66,1228,1,67, +1233,1,68,1238,1, +69,1243,1,70,1248, +1,73,2798,16,0, +309,1,74,1253,1, +328,1302,1,1048,1344, +1,82,2799,16,0, +309,1,1840,2800,16, +0,309,1,1591,2801, +16,0,309,1,1341, +2802,16,0,309,1, +1096,1312,1,93,1318, +1,352,1349,1,107, +2803,16,0,309,1, +1114,1343,1,118,1355, +1,1123,2804,16,0, +309,1,371,1365,1, +1628,2805,16,0,309, +1,375,1376,1,1882, +2806,16,0,309,1, +377,1381,1,379,1386, +1,380,1391,1,883, +2807,16,0,309,1, +373,1409,1,130,1414, +1,143,1419,1,387, +2808,16,0,309,1, +2664,2809,16,0,309, +1,1159,2810,16,0, +309,1,157,1443,1, +1413,2811,16,0,309, +1,1665,2812,16,0, +309,1,412,2813,16, +0,309,1,1377,2814, +16,0,309,1,172, +1469,1,1939,2815,16, +0,309,1,437,2816, +16,0,309,1,188, +1518,1,942,1490,1, +1195,2817,16,0,309, +1,1449,2818,16,0, +309,1,1701,2819,16, +0,309,1,447,1511, +1,205,1523,1,827, +2820,16,0,309,1, +223,2821,16,0,309, +1,476,1543,1,477, +1549,1,1231,2822,16, +0,309,1,479,1559, +1,480,1564,1,1485, +2823,16,0,309,1, +1737,2824,16,0,309, +1,242,1578,1,478, +1583,1,1001,1588,1, +1002,1593,1,36,2825, +19,216,1,36,2826, +5,94,1,256,2827, +16,0,214,1,1261, +2828,16,0,214,1, +509,2829,16,0,214, +1,1515,2830,16,0, +214,1,2021,718,1, +1775,2831,16,0,214, +1,2029,725,1,2030, +731,1,2031,736,1, +2032,741,1,2033,746, +1,277,2832,16,0, +214,1,2035,752,1, +2037,757,1,2039,762, +1,32,2833,16,0, +214,1,2041,768,1, +2293,2834,16,0,214, +1,2043,774,1,2045, +779,1,41,2835,16, +0,214,1,1297,2836, +16,0,214,1,43, +2837,16,0,214,1, +1803,787,1,1804,2838, +16,0,214,1,299, +2839,16,0,214,1, +52,2840,16,0,214, +1,2318,2841,16,0, +214,1,2075,2842,16, +0,214,1,1574,799, +1,71,2843,16,0, +214,1,76,2844,16, +0,214,1,1834,2845, +16,0,214,1,2337, +2846,16,0,214,1, +79,2847,16,0,214, +1,1335,2848,16,0, +214,1,322,2849,16, +0,214,1,85,2850, +16,0,214,1,89, +2851,16,0,214,1, +346,2852,16,0,214, +1,2105,814,1,2106, +2853,16,0,214,1, +97,2854,16,0,214, +1,1860,821,1,2364, +827,1,102,2855,16, +0,214,1,112,2856, +16,0,214,1,1117, +2857,16,0,214,1, +1873,835,1,1876,2858, +16,0,214,1,124, +2859,16,0,214,1, +2136,842,1,381,2860, +16,0,214,1,525, +2861,16,0,214,1, +137,2862,16,0,214, +1,1901,2863,16,0, +214,1,2658,2864,16, +0,214,1,1153,2865, +16,0,214,1,151, +2866,16,0,214,1, +1407,2867,16,0,214, +1,1659,2868,16,0, +214,1,2413,2869,16, +0,214,1,406,2870, +16,0,214,1,1371, +2871,16,0,214,1, +166,2872,16,0,214, +1,1622,2873,16,0, +214,1,1931,861,1, +1933,2874,16,0,214, +1,431,2875,16,0, +214,1,1585,2876,16, +0,214,1,182,2877, +16,0,214,1,1189, +2878,16,0,214,1, +1443,2879,16,0,214, +1,1695,2880,16,0, +214,1,2198,2881,16, +0,214,1,447,2882, +16,0,214,1,2458, +876,1,2459,882,1, +1958,2883,16,0,214, +1,2462,889,1,1657, +894,1,2464,899,1, +199,2884,16,0,214, +1,459,2885,16,0, +214,1,462,2886,16, +0,214,1,217,2887, +16,0,214,1,2227, +908,1,1225,2888,16, +0,214,1,1479,2889, +16,0,214,1,1731, +2890,16,0,214,1, +1989,916,1,1990,2891, +16,0,214,1,236, +2892,16,0,214,1, +1756,2893,16,0,214, +1,37,2894,19,233, +1,37,2895,5,94, +1,256,2896,16,0, +231,1,1261,2897,16, +0,231,1,509,2898, +16,0,231,1,1515, +2899,16,0,231,1, +2021,718,1,1775,2900, +16,0,231,1,2029, +725,1,2030,731,1, +2031,736,1,2032,741, +1,2033,746,1,277, +2901,16,0,231,1, +2035,752,1,2037,757, +1,2039,762,1,32, +2902,16,0,231,1, +2041,768,1,2293,2903, +16,0,231,1,2043, +774,1,2045,779,1, +41,2904,16,0,231, +1,1297,2905,16,0, +231,1,43,2906,16, +0,231,1,1803,787, +1,1804,2907,16,0, +231,1,299,2908,16, +0,231,1,52,2909, +16,0,231,1,2318, +2910,16,0,231,1, +2075,2911,16,0,231, +1,1574,799,1,71, +2912,16,0,231,1, +76,2913,16,0,231, +1,1834,2914,16,0, +231,1,2337,2915,16, +0,231,1,79,2916, +16,0,231,1,1335, +2917,16,0,231,1, +322,2918,16,0,231, +1,85,2919,16,0, +231,1,89,2920,16, +0,231,1,346,2921, +16,0,231,1,2105, +814,1,2106,2922,16, +0,231,1,97,2923, +16,0,231,1,1860, +821,1,2364,827,1, +102,2924,16,0,231, +1,112,2925,16,0, +231,1,1117,2926,16, +0,231,1,1873,835, +1,1876,2927,16,0, +231,1,124,2928,16, +0,231,1,2136,842, +1,381,2929,16,0, +231,1,525,2930,16, +0,231,1,137,2931, +16,0,231,1,1901, +2932,16,0,231,1, +2658,2933,16,0,231, +1,1153,2934,16,0, +231,1,151,2935,16, +0,231,1,1407,2936, +16,0,231,1,1659, +2937,16,0,231,1, +2413,2938,16,0,231, +1,406,2939,16,0, +231,1,1371,2940,16, +0,231,1,166,2941, +16,0,231,1,1622, +2942,16,0,231,1, +1931,861,1,1933,2943, +16,0,231,1,431, +2944,16,0,231,1, +1585,2945,16,0,231, +1,182,2946,16,0, +231,1,1189,2947,16, +0,231,1,1443,2948, +16,0,231,1,1695, +2949,16,0,231,1, +2198,2950,16,0,231, +1,447,2951,16,0, +231,1,2458,876,1, +2459,882,1,1958,2952, +16,0,231,1,2462, +889,1,1657,894,1, +2464,899,1,199,2953, +16,0,231,1,459, +2954,16,0,231,1, +462,2955,16,0,231, +1,217,2956,16,0, +231,1,2227,908,1, +1225,2957,16,0,231, +1,1479,2958,16,0, +231,1,1731,2959,16, +0,231,1,1989,916, +1,1990,2960,16,0, +231,1,236,2961,16, +0,231,1,1756,2962, +16,0,231,1,38, +2963,19,230,1,38, +2964,5,84,1,1011, +1102,1,1012,2965,16, +0,228,1,1013,1258, +1,262,1119,1,1267, +2966,16,0,228,1, +515,2967,16,0,228, +1,1521,2968,16,0, +228,1,525,1216,1, +283,1172,1,2299,2969, +16,0,228,1,42, +2970,16,0,228,1, +40,1177,1,44,1183, +1,47,1184,1,1303, +2971,16,0,228,1, +1555,2972,16,0,228, +1,50,1201,1,48, +1190,1,49,1196,1, +51,1206,1,63,1222, +1,305,1211,1,66, +1228,1,67,1233,1, +68,1238,1,69,1243, +1,70,1248,1,73, +2973,16,0,228,1, +74,1253,1,328,1302, +1,1048,1344,1,82, +2974,16,0,228,1, +1840,2975,16,0,228, +1,1591,2976,16,0, +228,1,1341,2977,16, +0,228,1,1096,1312, +1,93,1318,1,352, +1349,1,107,2978,16, +0,228,1,1114,1343, 1,118,1355,1,1123, -2949,16,0,228,1, -371,1365,1,1628,2950, +2979,16,0,228,1, +371,1365,1,1628,2980, 16,0,228,1,375, -1376,1,1882,2951,16, +1376,1,1882,2981,16, 0,228,1,377,1381, 1,379,1386,1,380, 1391,1,883,1397,1, 373,1409,1,130,1414, 1,143,1419,1,387, -2952,16,0,228,1, -2664,2953,16,0,228, -1,1159,2954,16,0, +2982,16,0,228,1, +2664,2983,16,0,228, +1,1159,2984,16,0, 228,1,157,1443,1, -1413,2955,16,0,228, -1,1665,2956,16,0, -228,1,412,2957,16, -0,228,1,1377,2958, +1413,2985,16,0,228, +1,1665,2986,16,0, +228,1,412,2987,16, +0,228,1,1377,2988, 16,0,228,1,172, -1469,1,1939,2959,16, -0,228,1,437,2960, +1469,1,1939,2989,16, +0,228,1,437,2990, 16,0,228,1,188, 1518,1,942,1490,1, -1195,2961,16,0,228, -1,1449,2962,16,0, -228,1,1701,2963,16, +1195,2991,16,0,228, +1,1449,2992,16,0, +228,1,1701,2993,16, 0,228,1,447,1511, 1,205,1523,1,827, 1331,1,223,1533,1, 476,1543,1,477,1549, -1,1231,2964,16,0, +1,1231,2994,16,0, 228,1,479,1559,1, -480,1564,1,1485,2965, +480,1564,1,1485,2995, 16,0,228,1,1737, -2966,16,0,228,1, +2996,16,0,228,1, 242,1578,1,478,1583, 1,1001,1588,1,1002, -1593,1,39,2967,19, -222,1,39,2968,5, +1593,1,39,2997,19, +222,1,39,2998,5, 84,1,1011,1102,1, -1012,2969,16,0,220, +1012,2999,16,0,220, 1,1013,1258,1,262, -1119,1,1267,2970,16, -0,220,1,515,2971, +1119,1,1267,3000,16, +0,220,1,515,3001, 16,0,220,1,1521, -2972,16,0,220,1, +3002,16,0,220,1, 525,1216,1,283,1172, -1,2299,2973,16,0, -220,1,42,2974,16, +1,2299,3003,16,0, +220,1,42,3004,16, 0,220,1,40,1177, 1,44,1183,1,47, -1184,1,1303,2975,16, -0,220,1,1555,2976, +1184,1,1303,3005,16, +0,220,1,1555,3006, 16,0,220,1,50, 1201,1,48,1190,1, 49,1196,1,51,1206, @@ -8028,227 +8046,577 @@ public yyLSLSyntax 1211,1,66,1228,1, 67,1233,1,68,1238, 1,69,1243,1,70, -1248,1,73,2977,16, +1248,1,73,3007,16, 0,220,1,74,1253, 1,328,1302,1,1048, -1344,1,82,1280,1, -1840,2978,16,0,220, -1,1591,2979,16,0, -220,1,1341,2980,16, -0,220,1,1096,1312, -1,93,1318,1,352, -1349,1,107,1338,1, -1114,1343,1,118,1355, -1,1123,2981,16,0, -220,1,371,1365,1, -1628,2982,16,0,220, -1,375,1376,1,1882, -2983,16,0,220,1, -377,1381,1,379,1386, -1,380,1391,1,883, -1397,1,373,1409,1, -130,1414,1,143,1419, -1,387,2984,16,0, -220,1,2664,2985,16, -0,220,1,1159,2986, -16,0,220,1,157, -1443,1,1413,2987,16, -0,220,1,1665,2988, -16,0,220,1,412, -2989,16,0,220,1, -1377,2990,16,0,220, -1,172,1469,1,1939, -2991,16,0,220,1, -437,2992,16,0,220, -1,188,1518,1,942, -1490,1,1195,2993,16, -0,220,1,1449,2994, -16,0,220,1,1701, -2995,16,0,220,1, -447,1511,1,205,1523, -1,827,1331,1,223, -1533,1,476,1543,1, -477,1549,1,1231,2996, -16,0,220,1,479, -1559,1,480,1564,1, -1485,2997,16,0,220, -1,1737,2998,16,0, -220,1,242,1578,1, -478,1583,1,1001,1588, -1,1002,1593,1,40, -2999,19,210,1,40, -3000,5,84,1,1011, -1102,1,1012,3001,16, -0,208,1,1013,1258, -1,262,1119,1,1267, -3002,16,0,208,1, -515,3003,16,0,208, -1,1521,3004,16,0, -208,1,525,1216,1, -283,1172,1,2299,3005, -16,0,208,1,42, -3006,16,0,208,1, -40,1177,1,44,1183, -1,47,1184,1,1303, -3007,16,0,208,1, -1555,3008,16,0,208, -1,50,1201,1,48, -1190,1,49,1196,1, -51,1206,1,63,1222, -1,305,1211,1,66, -1228,1,67,1233,1, -68,1238,1,69,1243, -1,70,1248,1,73, -3009,16,0,208,1, -74,1253,1,328,1302, -1,1048,1344,1,82, -1280,1,1840,3010,16, -0,208,1,1591,3011, -16,0,208,1,1341, -3012,16,0,208,1, -1096,1312,1,93,1318, -1,352,1349,1,107, -1338,1,1114,1343,1, -118,3013,16,0,208, -1,1123,3014,16,0, -208,1,371,1365,1, -1628,3015,16,0,208, -1,375,1376,1,1882, -3016,16,0,208,1, -377,1381,1,379,1386, -1,380,1391,1,883, -3017,16,0,208,1, -373,1409,1,130,3018, -16,0,208,1,143, -3019,16,0,208,1, -387,3020,16,0,208, -1,2664,3021,16,0, -208,1,1159,3022,16, -0,208,1,157,3023, -16,0,208,1,1413, -3024,16,0,208,1, -1665,3025,16,0,208, -1,412,3026,16,0, -208,1,1377,3027,16, -0,208,1,172,3028, -16,0,208,1,1939, -3029,16,0,208,1, -437,3030,16,0,208, -1,188,3031,16,0, -208,1,942,1490,1, -1195,3032,16,0,208, -1,1449,3033,16,0, -208,1,1701,3034,16, -0,208,1,447,1511, -1,205,3035,16,0, -208,1,827,3036,16, -0,208,1,223,3037, -16,0,208,1,476, -1543,1,477,1549,1, -1231,3038,16,0,208, -1,479,1559,1,480, -1564,1,1485,3039,16, -0,208,1,1737,3040, -16,0,208,1,242, -3041,16,0,208,1, -478,1583,1,1001,1588, -1,1002,1593,1,41, -3042,19,172,1,41, -3043,5,84,1,1011, -1102,1,1012,3044,16, -0,170,1,1013,1258, -1,262,1119,1,1267, -3045,16,0,170,1, -515,3046,16,0,170, -1,1521,3047,16,0, -170,1,525,1216,1, -283,1172,1,2299,3048, -16,0,170,1,42, -3049,16,0,170,1, -40,1177,1,44,1183, -1,47,1184,1,1303, -3050,16,0,170,1, -1555,3051,16,0,170, -1,50,1201,1,48, -1190,1,49,1196,1, -51,1206,1,63,1222, -1,305,1211,1,66, -1228,1,67,1233,1, -68,1238,1,69,1243, -1,70,1248,1,73, -3052,16,0,170,1, -74,1253,1,328,1302, -1,1048,1344,1,82, -1280,1,1840,3053,16, -0,170,1,1591,3054, +1344,1,82,3008,16, +0,220,1,1840,3009, +16,0,220,1,1591, +3010,16,0,220,1, +1341,3011,16,0,220, +1,1096,1312,1,93, +1318,1,352,1349,1, +107,3012,16,0,220, +1,1114,1343,1,118, +1355,1,1123,3013,16, +0,220,1,371,1365, +1,1628,3014,16,0, +220,1,375,1376,1, +1882,3015,16,0,220, +1,377,1381,1,379, +1386,1,380,1391,1, +883,1397,1,373,1409, +1,130,1414,1,143, +1419,1,387,3016,16, +0,220,1,2664,3017, +16,0,220,1,1159, +3018,16,0,220,1, +157,1443,1,1413,3019, +16,0,220,1,1665, +3020,16,0,220,1, +412,3021,16,0,220, +1,1377,3022,16,0, +220,1,172,1469,1, +1939,3023,16,0,220, +1,437,3024,16,0, +220,1,188,1518,1, +942,1490,1,1195,3025, +16,0,220,1,1449, +3026,16,0,220,1, +1701,3027,16,0,220, +1,447,1511,1,205, +1523,1,827,1331,1, +223,1533,1,476,1543, +1,477,1549,1,1231, +3028,16,0,220,1, +479,1559,1,480,1564, +1,1485,3029,16,0, +220,1,1737,3030,16, +0,220,1,242,1578, +1,478,1583,1,1001, +1588,1,1002,1593,1, +40,3031,19,210,1, +40,3032,5,84,1, +1011,1102,1,1012,3033, +16,0,208,1,1013, +1258,1,262,1119,1, +1267,3034,16,0,208, +1,515,3035,16,0, +208,1,1521,3036,16, +0,208,1,525,1216, +1,283,1172,1,2299, +3037,16,0,208,1, +42,3038,16,0,208, +1,40,1177,1,44, +1183,1,47,1184,1, +1303,3039,16,0,208, +1,1555,3040,16,0, +208,1,50,1201,1, +48,1190,1,49,1196, +1,51,1206,1,63, +1222,1,305,1211,1, +66,1228,1,67,1233, +1,68,1238,1,69, +1243,1,70,1248,1, +73,3041,16,0,208, +1,74,1253,1,328, +1302,1,1048,1344,1, +82,3042,16,0,208, +1,1840,3043,16,0, +208,1,1591,3044,16, +0,208,1,1341,3045, +16,0,208,1,1096, +1312,1,93,1318,1, +352,1349,1,107,3046, +16,0,208,1,1114, +1343,1,118,3047,16, +0,208,1,1123,3048, +16,0,208,1,371, +1365,1,1628,3049,16, +0,208,1,375,1376, +1,1882,3050,16,0, +208,1,377,1381,1, +379,1386,1,380,1391, +1,883,3051,16,0, +208,1,373,1409,1, +130,3052,16,0,208, +1,143,3053,16,0, +208,1,387,3054,16, +0,208,1,2664,3055, +16,0,208,1,1159, +3056,16,0,208,1, +157,3057,16,0,208, +1,1413,3058,16,0, +208,1,1665,3059,16, +0,208,1,412,3060, +16,0,208,1,1377, +3061,16,0,208,1, +172,3062,16,0,208, +1,1939,3063,16,0, +208,1,437,3064,16, +0,208,1,188,3065, +16,0,208,1,942, +1490,1,1195,3066,16, +0,208,1,1449,3067, +16,0,208,1,1701, +3068,16,0,208,1, +447,1511,1,205,3069, +16,0,208,1,827, +3070,16,0,208,1, +223,3071,16,0,208, +1,476,1543,1,477, +1549,1,1231,3072,16, +0,208,1,479,1559, +1,480,1564,1,1485, +3073,16,0,208,1, +1737,3074,16,0,208, +1,242,3075,16,0, +208,1,478,1583,1, +1001,1588,1,1002,1593, +1,41,3076,19,172, +1,41,3077,5,84, +1,1011,1102,1,1012, +3078,16,0,170,1, +1013,1258,1,262,1119, +1,1267,3079,16,0, +170,1,515,3080,16, +0,170,1,1521,3081, +16,0,170,1,525, +1216,1,283,1172,1, +2299,3082,16,0,170, +1,42,3083,16,0, +170,1,40,1177,1, +44,1183,1,47,1184, +1,1303,3084,16,0, +170,1,1555,3085,16, +0,170,1,50,1201, +1,48,1190,1,49, +1196,1,51,1206,1, +63,1222,1,305,1211, +1,66,1228,1,67, +1233,1,68,1238,1, +69,1243,1,70,1248, +1,73,3086,16,0, +170,1,74,1253,1, +328,1302,1,1048,1344, +1,82,3087,16,0, +170,1,1840,3088,16, +0,170,1,1591,3089, 16,0,170,1,1341, -3055,16,0,170,1, +3090,16,0,170,1, 1096,1312,1,93,1318, 1,352,1349,1,107, -1338,1,1114,1343,1, -118,3056,16,0,170, -1,1123,3057,16,0, -170,1,371,1365,1, -1628,3058,16,0,170, -1,375,1376,1,1882, -3059,16,0,170,1, -377,1381,1,379,1386, -1,380,1391,1,883, -3060,16,0,170,1, -373,1409,1,130,3061, -16,0,170,1,143, -3062,16,0,170,1, -387,3063,16,0,170, -1,2664,3064,16,0, -170,1,1159,3065,16, -0,170,1,157,3066, -16,0,170,1,1413, -3067,16,0,170,1, -1665,3068,16,0,170, -1,412,3069,16,0, -170,1,1377,3070,16, -0,170,1,172,3071, -16,0,170,1,1939, -3072,16,0,170,1, -437,3073,16,0,170, -1,188,3074,16,0, -170,1,942,1490,1, -1195,3075,16,0,170, -1,1449,3076,16,0, -170,1,1701,3077,16, -0,170,1,447,1511, -1,205,3078,16,0, -170,1,827,3079,16, -0,170,1,223,3080, -16,0,170,1,476, -1543,1,477,1549,1, -1231,3081,16,0,170, -1,479,1559,1,480, -1564,1,1485,3082,16, -0,170,1,1737,3083, -16,0,170,1,242, -3084,16,0,170,1, -478,1583,1,1001,1588, -1,1002,1593,1,42, -3085,19,394,1,42, -3086,5,38,1,1901, -3087,16,0,392,1, -2075,3088,16,0,392, +3091,16,0,170,1, +1114,1343,1,118,3092, +16,0,170,1,1123, +3093,16,0,170,1, +371,1365,1,1628,3094, +16,0,170,1,375, +1376,1,1882,3095,16, +0,170,1,377,1381, +1,379,1386,1,380, +1391,1,883,3096,16, +0,170,1,373,1409, +1,130,3097,16,0, +170,1,143,3098,16, +0,170,1,387,3099, +16,0,170,1,2664, +3100,16,0,170,1, +1159,3101,16,0,170, +1,157,3102,16,0, +170,1,1413,3103,16, +0,170,1,1665,3104, +16,0,170,1,412, +3105,16,0,170,1, +1377,3106,16,0,170, +1,172,3107,16,0, +170,1,1939,3108,16, +0,170,1,437,3109, +16,0,170,1,188, +3110,16,0,170,1, +942,1490,1,1195,3111, +16,0,170,1,1449, +3112,16,0,170,1, +1701,3113,16,0,170, +1,447,1511,1,205, +3114,16,0,170,1, +827,3115,16,0,170, +1,223,3116,16,0, +170,1,476,1543,1, +477,1549,1,1231,3117, +16,0,170,1,479, +1559,1,480,1564,1, +1485,3118,16,0,170, +1,1737,3119,16,0, +170,1,242,3120,16, +0,170,1,478,1583, +1,1001,1588,1,1002, +1593,1,42,3121,19, +394,1,42,3122,5, +38,1,1901,3123,16, +0,392,1,2075,3124, +16,0,392,1,1860, +821,1,1803,787,1, +1804,3125,16,0,392, +1,2413,3126,16,0, +392,1,2198,3127,16, +0,392,1,1873,835, +1,1657,894,1,1989, +916,1,1990,3128,16, +0,392,1,1775,3129, +16,0,392,1,32, +3130,16,0,392,1, +2105,814,1,2106,3131, +16,0,392,1,2364, +827,1,2227,908,1, +2337,3132,16,0,392, +1,2021,718,1,2458, +876,1,2459,882,1, +2462,889,1,2136,842, +1,2464,899,1,2029, +725,1,2030,731,1, +2031,736,1,2032,741, +1,2033,746,1,2035, +752,1,2037,757,1, +2039,762,1,1931,861, +1,2041,768,1,2043, +774,1,2045,779,1, +1574,799,1,1958,3133, +16,0,392,1,43, +3134,19,453,1,43, +3135,5,25,1,2035, +752,1,2037,757,1, +2039,762,1,2041,768, +1,2227,908,1,2043, +774,1,1657,894,1, +1860,821,1,2136,842, +1,2021,718,1,2459, +882,1,1574,799,1, +2105,3136,16,0,578, +1,1931,861,1,1873, +835,1,2031,736,1, +1803,787,1,1989,3137, +16,0,451,1,2464, +899,1,2029,725,1, +2030,731,1,2364,827, +1,2032,741,1,2033, +746,1,2045,779,1, +44,3138,19,264,1, +44,3139,5,38,1, +1901,3140,16,0,262, +1,2075,3141,16,0, +262,1,1860,821,1, +1803,787,1,1804,3142, +16,0,262,1,2413, +3143,16,0,262,1, +2198,3144,16,0,262, +1,1873,835,1,1657, +894,1,1989,916,1, +1990,3145,16,0,262, +1,1775,3146,16,0, +262,1,32,3147,16, +0,262,1,2105,814, +1,2106,3148,16,0, +262,1,2364,827,1, +2227,908,1,2337,3149, +16,0,262,1,2021, +718,1,2458,876,1, +2459,882,1,2462,889, +1,2136,842,1,2464, +899,1,2029,725,1, +2030,731,1,2031,736, +1,2032,741,1,2033, +746,1,2035,752,1, +2037,757,1,2039,762, +1,1931,861,1,2041, +768,1,2043,774,1, +2045,779,1,1574,799, +1,1958,3150,16,0, +262,1,45,3151,19, +287,1,45,3152,5, +39,1,1901,3153,16, +0,315,1,2075,3154, +16,0,315,1,1860, +821,1,1803,787,1, +1804,3155,16,0,315, +1,2413,3156,16,0, +315,1,2198,3157,16, +0,315,1,1873,835, +1,1657,894,1,1989, +916,1,1990,3158,16, +0,315,1,1775,3159, +16,0,315,1,32, +3160,16,0,315,1, +2105,814,1,2106,3161, +16,0,315,1,2364, +827,1,2227,908,1, +2337,3162,16,0,315, +1,2021,718,1,2458, +876,1,2459,882,1, +2462,889,1,2136,842, +1,2464,899,1,2029, +725,1,2030,731,1, +2031,736,1,2032,741, +1,2033,746,1,2035, +752,1,2037,757,1, +2039,762,1,1931,861, +1,2041,768,1,2043, +774,1,2045,779,1, +1832,3163,16,0,285, +1,1574,799,1,1958, +3164,16,0,315,1, +46,3165,19,671,1, +46,3166,5,38,1, +1901,3167,16,0,669, +1,2075,3168,16,0, +669,1,1860,821,1, +1803,787,1,1804,3169, +16,0,669,1,2413, +3170,16,0,669,1, +2198,3171,16,0,669, +1,1873,835,1,1657, +894,1,1989,916,1, +1990,3172,16,0,669, +1,1775,3173,16,0, +669,1,32,3174,16, +0,669,1,2105,814, +1,2106,3175,16,0, +669,1,2364,827,1, +2227,908,1,2337,3176, +16,0,669,1,2021, +718,1,2458,876,1, +2459,882,1,2462,889, +1,2136,842,1,2464, +899,1,2029,725,1, +2030,731,1,2031,736, +1,2032,741,1,2033, +746,1,2035,752,1, +2037,757,1,2039,762, +1,1931,861,1,2041, +768,1,2043,774,1, +2045,779,1,1574,799, +1,1958,3177,16,0, +669,1,47,3178,19, +466,1,47,3179,5, +19,1,0,3180,16, +0,464,1,2706,3181, +16,0,464,1,2634, +691,1,2636,3182,16, +0,464,1,2639,707, +1,2714,3183,17,3184, +15,3185,4,36,37, +0,71,0,108,0, +111,0,98,0,97, +0,108,0,68,0, +101,0,102,0,105, +0,110,0,105,0, +116,0,105,0,111, +0,110,0,115,0, +1,-1,1,5,3186, +20,3187,4,38,71, +0,108,0,111,0, +98,0,97,0,108, +0,68,0,101,0, +102,0,105,0,110, +0,105,0,116,0, +105,0,111,0,110, +0,115,0,95,0, +50,0,1,145,1, +3,1,3,1,2, +3188,22,1,4,1, +2558,697,1,2716,3189, +17,3190,15,3185,1, +-1,1,5,3191,20, +3192,4,38,71,0, +108,0,111,0,98, +0,97,0,108,0, +68,0,101,0,102, +0,105,0,110,0, +105,0,116,0,105, +0,111,0,110,0, +115,0,95,0,49, +0,1,144,1,3, +1,2,1,1,3193, +22,1,3,1,2022, +3194,16,0,567,1, +2459,882,1,2715,3195, +17,3196,15,3185,1, +-1,1,5,3197,20, +3198,4,38,71,0, +108,0,111,0,98, +0,97,0,108,0, +68,0,101,0,102, +0,105,0,110,0, +105,0,116,0,105, +0,111,0,110,0, +115,0,95,0,51, +0,1,146,1,3, +1,2,1,1,3199, +22,1,5,1,2464, +899,1,2466,3200,17, +3201,15,3202,4,50, +37,0,71,0,108, +0,111,0,98,0, +97,0,108,0,70, +0,117,0,110,0, +99,0,116,0,105, +0,111,0,110,0, +68,0,101,0,102, +0,105,0,110,0, +105,0,116,0,105, +0,111,0,110,0, +1,-1,1,5,3203, +20,3204,4,52,71, +0,108,0,111,0, +98,0,97,0,108, +0,70,0,117,0, +110,0,99,0,116, +0,105,0,111,0, +110,0,68,0,101, +0,102,0,105,0, +110,0,105,0,116, +0,105,0,111,0, +110,0,95,0,50, +0,1,151,1,3, +1,7,1,6,3205, +22,1,10,1,2640, +685,1,2713,3206,17, +3207,15,3185,1,-1, +1,5,3208,20,3209, +4,38,71,0,108, +0,111,0,98,0, +97,0,108,0,68, +0,101,0,102,0, +105,0,110,0,105, +0,116,0,105,0, +111,0,110,0,115, +0,95,0,52,0, +1,147,1,3,1, +3,1,2,3210,22, +1,6,1,2655,3211, +17,3212,15,3202,1, +-1,1,5,3213,20, +3214,4,52,71,0, +108,0,111,0,98, +0,97,0,108,0, +70,0,117,0,110, +0,99,0,116,0, +105,0,111,0,110, +0,68,0,101,0, +102,0,105,0,110, +0,105,0,116,0, +105,0,111,0,110, +0,95,0,49,0, +1,150,1,3,1, +6,1,5,3215,22, +1,9,1,2694,3216, +17,3217,15,3218,4, +52,37,0,71,0, +108,0,111,0,98, +0,97,0,108,0, +86,0,97,0,114, +0,105,0,97,0, +98,0,108,0,101, +0,68,0,101,0, +99,0,108,0,97, +0,114,0,97,0, +116,0,105,0,111, +0,110,0,1,-1, +1,5,3219,20,3220, +4,54,71,0,108, +0,111,0,98,0, +97,0,108,0,86, +0,97,0,114,0, +105,0,97,0,98, +0,108,0,101,0, +68,0,101,0,99, +0,108,0,97,0, +114,0,97,0,116, +0,105,0,111,0, +110,0,95,0,49, +0,1,148,1,3, +1,3,1,2,3221, +22,1,7,1,2695, +3222,16,0,464,1, +2683,3223,17,3224,15, +3218,1,-1,1,5, +3225,20,3226,4,54, +71,0,108,0,111, +0,98,0,97,0, +108,0,86,0,97, +0,114,0,105,0, +97,0,98,0,108, +0,101,0,68,0, +101,0,99,0,108, +0,97,0,114,0, +97,0,116,0,105, +0,111,0,110,0, +95,0,50,0,1, +149,1,3,1,5, +1,4,3227,22,1, +8,1,48,3228,19, +339,1,48,3229,5, +54,1,0,3230,16, +0,337,1,2075,3231, +16,0,495,1,1860, +821,1,1803,787,1, +1804,3232,16,0,495, +1,2413,3233,16,0, +495,1,2634,691,1, +1873,835,1,1657,894, +1,2639,707,1,2640, +685,1,1989,916,1, +1990,3234,16,0,495, +1,2459,882,1,1775, +3235,16,0,495,1, +32,3236,16,0,495, +1,2105,814,1,2106, +3237,16,0,495,1, +2466,3200,1,2655,3211, +1,2683,3223,1,2227, +908,1,2337,3238,16, +0,495,1,2558,697, +1,2694,3216,1,2695, +3239,16,0,337,1, +2021,718,1,2458,876, +1,1901,3240,16,0, +495,1,2462,889,1, +2136,842,1,2464,899, +1,2029,725,1,2030, +731,1,2031,736,1, +2032,741,1,2033,746, +1,2035,752,1,2364, +827,1,2715,3195,1, +2039,762,1,1931,861, +1,2041,768,1,2043, +774,1,2045,779,1, +2198,3241,16,0,495, +1,2706,3242,16,0, +337,1,2037,757,1, +2713,3206,1,2714,3183, +1,1574,799,1,2716, +3189,1,2636,3243,16, +0,337,1,1958,3244, +16,0,495,1,49, +3245,19,500,1,49, +3246,5,38,1,1901, +3247,16,0,498,1, +2075,3248,16,0,498, 1,1860,821,1,1803, -787,1,1804,3089,16, -0,392,1,2413,3090, -16,0,392,1,2198, -3091,16,0,392,1, +787,1,1804,3249,16, +0,498,1,2413,3250, +16,0,498,1,2198, +3251,16,0,498,1, 1873,835,1,1657,894, 1,1989,916,1,1990, -3092,16,0,392,1, -1775,3093,16,0,392, -1,32,3094,16,0, -392,1,2105,814,1, -2106,3095,16,0,392, +3252,16,0,498,1, +1775,3253,16,0,498, +1,32,3254,16,0, +498,1,2105,814,1, +2106,3255,16,0,498, 1,2364,827,1,2227, -908,1,2337,3096,16, -0,392,1,2021,718, +908,1,2337,3256,16, +0,498,1,2021,718, 1,2458,876,1,2459, 882,1,2462,889,1, 2136,842,1,2464,899, @@ -8260,341 +8628,26 @@ public yyLSLSyntax 1931,861,1,2041,768, 1,2043,774,1,2045, 779,1,1574,799,1, -1958,3097,16,0,392, -1,43,3098,19,453, -1,43,3099,5,25, -1,2035,752,1,2037, -757,1,2039,762,1, -2041,768,1,2227,908, -1,2043,774,1,1657, -894,1,1860,821,1, -2136,842,1,2021,718, -1,2459,882,1,1574, -799,1,2105,3100,16, -0,578,1,1931,861, -1,1873,835,1,2031, -736,1,1803,787,1, -1989,3101,16,0,451, -1,2464,899,1,2029, -725,1,2030,731,1, -2364,827,1,2032,741, -1,2033,746,1,2045, -779,1,44,3102,19, -264,1,44,3103,5, -38,1,1901,3104,16, -0,262,1,2075,3105, -16,0,262,1,1860, -821,1,1803,787,1, -1804,3106,16,0,262, -1,2413,3107,16,0, -262,1,2198,3108,16, -0,262,1,1873,835, -1,1657,894,1,1989, -916,1,1990,3109,16, -0,262,1,1775,3110, -16,0,262,1,32, -3111,16,0,262,1, -2105,814,1,2106,3112, -16,0,262,1,2364, -827,1,2227,908,1, -2337,3113,16,0,262, -1,2021,718,1,2458, -876,1,2459,882,1, -2462,889,1,2136,842, -1,2464,899,1,2029, -725,1,2030,731,1, -2031,736,1,2032,741, -1,2033,746,1,2035, -752,1,2037,757,1, -2039,762,1,1931,861, -1,2041,768,1,2043, -774,1,2045,779,1, -1574,799,1,1958,3114, -16,0,262,1,45, -3115,19,287,1,45, -3116,5,39,1,1901, -3117,16,0,315,1, -2075,3118,16,0,315, -1,1860,821,1,1803, -787,1,1804,3119,16, -0,315,1,2413,3120, -16,0,315,1,2198, -3121,16,0,315,1, -1873,835,1,1657,894, -1,1989,916,1,1990, -3122,16,0,315,1, -1775,3123,16,0,315, -1,32,3124,16,0, -315,1,2105,814,1, -2106,3125,16,0,315, -1,2364,827,1,2227, -908,1,2337,3126,16, -0,315,1,2021,718, -1,2458,876,1,2459, -882,1,2462,889,1, -2136,842,1,2464,899, -1,2029,725,1,2030, -731,1,2031,736,1, -2032,741,1,2033,746, -1,2035,752,1,2037, -757,1,2039,762,1, -1931,861,1,2041,768, -1,2043,774,1,2045, -779,1,1832,3127,16, -0,285,1,1574,799, -1,1958,3128,16,0, -315,1,46,3129,19, -671,1,46,3130,5, -38,1,1901,3131,16, -0,669,1,2075,3132, -16,0,669,1,1860, -821,1,1803,787,1, -1804,3133,16,0,669, -1,2413,3134,16,0, -669,1,2198,3135,16, -0,669,1,1873,835, -1,1657,894,1,1989, -916,1,1990,3136,16, -0,669,1,1775,3137, -16,0,669,1,32, -3138,16,0,669,1, -2105,814,1,2106,3139, -16,0,669,1,2364, -827,1,2227,908,1, -2337,3140,16,0,669, -1,2021,718,1,2458, -876,1,2459,882,1, -2462,889,1,2136,842, -1,2464,899,1,2029, -725,1,2030,731,1, -2031,736,1,2032,741, -1,2033,746,1,2035, -752,1,2037,757,1, -2039,762,1,1931,861, -1,2041,768,1,2043, -774,1,2045,779,1, -1574,799,1,1958,3141, -16,0,669,1,47, -3142,19,466,1,47, -3143,5,19,1,0, -3144,16,0,464,1, -2706,3145,16,0,464, -1,2634,691,1,2636, -3146,16,0,464,1, -2639,707,1,2714,3147, -17,3148,15,3149,4, -36,37,0,71,0, -108,0,111,0,98, -0,97,0,108,0, -68,0,101,0,102, -0,105,0,110,0, -105,0,116,0,105, -0,111,0,110,0, -115,0,1,-1,1, -5,3150,20,3151,4, -38,71,0,108,0, -111,0,98,0,97, -0,108,0,68,0, -101,0,102,0,105, -0,110,0,105,0, -116,0,105,0,111, -0,110,0,115,0, -95,0,50,0,1, -145,1,3,1,3, -1,2,3152,22,1, -4,1,2558,697,1, -2716,3153,17,3154,15, -3149,1,-1,1,5, -3155,20,3156,4,38, -71,0,108,0,111, -0,98,0,97,0, -108,0,68,0,101, -0,102,0,105,0, -110,0,105,0,116, -0,105,0,111,0, -110,0,115,0,95, -0,49,0,1,144, -1,3,1,2,1, -1,3157,22,1,3, -1,2022,3158,16,0, -567,1,2459,882,1, -2715,3159,17,3160,15, -3149,1,-1,1,5, -3161,20,3162,4,38, -71,0,108,0,111, -0,98,0,97,0, -108,0,68,0,101, -0,102,0,105,0, -110,0,105,0,116, -0,105,0,111,0, -110,0,115,0,95, -0,51,0,1,146, -1,3,1,2,1, -1,3163,22,1,5, -1,2464,899,1,2466, -3164,17,3165,15,3166, -4,50,37,0,71, -0,108,0,111,0, -98,0,97,0,108, -0,70,0,117,0, -110,0,99,0,116, -0,105,0,111,0, -110,0,68,0,101, -0,102,0,105,0, -110,0,105,0,116, -0,105,0,111,0, -110,0,1,-1,1, -5,3167,20,3168,4, -52,71,0,108,0, -111,0,98,0,97, -0,108,0,70,0, -117,0,110,0,99, -0,116,0,105,0, -111,0,110,0,68, -0,101,0,102,0, -105,0,110,0,105, -0,116,0,105,0, -111,0,110,0,95, -0,50,0,1,151, -1,3,1,7,1, -6,3169,22,1,10, -1,2640,685,1,2713, -3170,17,3171,15,3149, -1,-1,1,5,3172, -20,3173,4,38,71, -0,108,0,111,0, -98,0,97,0,108, -0,68,0,101,0, -102,0,105,0,110, -0,105,0,116,0, -105,0,111,0,110, -0,115,0,95,0, -52,0,1,147,1, -3,1,3,1,2, -3174,22,1,6,1, -2655,3175,17,3176,15, -3166,1,-1,1,5, -3177,20,3178,4,52, -71,0,108,0,111, -0,98,0,97,0, -108,0,70,0,117, -0,110,0,99,0, -116,0,105,0,111, -0,110,0,68,0, -101,0,102,0,105, -0,110,0,105,0, -116,0,105,0,111, -0,110,0,95,0, -49,0,1,150,1, -3,1,6,1,5, -3179,22,1,9,1, -2694,3180,17,3181,15, -3182,4,52,37,0, -71,0,108,0,111, -0,98,0,97,0, -108,0,86,0,97, -0,114,0,105,0, -97,0,98,0,108, -0,101,0,68,0, -101,0,99,0,108, -0,97,0,114,0, -97,0,116,0,105, -0,111,0,110,0, -1,-1,1,5,3183, -20,3184,4,54,71, -0,108,0,111,0, -98,0,97,0,108, -0,86,0,97,0, -114,0,105,0,97, -0,98,0,108,0, -101,0,68,0,101, -0,99,0,108,0, -97,0,114,0,97, -0,116,0,105,0, -111,0,110,0,95, -0,49,0,1,148, -1,3,1,3,1, -2,3185,22,1,7, -1,2695,3186,16,0, -464,1,2683,3187,17, -3188,15,3182,1,-1, -1,5,3189,20,3190, -4,54,71,0,108, -0,111,0,98,0, -97,0,108,0,86, -0,97,0,114,0, -105,0,97,0,98, -0,108,0,101,0, -68,0,101,0,99, -0,108,0,97,0, -114,0,97,0,116, -0,105,0,111,0, -110,0,95,0,50, -0,1,149,1,3, -1,5,1,4,3191, -22,1,8,1,48, -3192,19,339,1,48, -3193,5,54,1,0, -3194,16,0,337,1, -2075,3195,16,0,495, -1,1860,821,1,1803, -787,1,1804,3196,16, -0,495,1,2413,3197, -16,0,495,1,2634, -691,1,1873,835,1, -1657,894,1,2639,707, -1,2640,685,1,1989, -916,1,1990,3198,16, -0,495,1,2459,882, -1,1775,3199,16,0, -495,1,32,3200,16, -0,495,1,2105,814, -1,2106,3201,16,0, -495,1,2466,3164,1, -2655,3175,1,2683,3187, -1,2227,908,1,2337, -3202,16,0,495,1, -2558,697,1,2694,3180, -1,2695,3203,16,0, -337,1,2021,718,1, -2458,876,1,1901,3204, -16,0,495,1,2462, -889,1,2136,842,1, -2464,899,1,2029,725, -1,2030,731,1,2031, -736,1,2032,741,1, -2033,746,1,2035,752, -1,2364,827,1,2715, -3159,1,2039,762,1, -1931,861,1,2041,768, -1,2043,774,1,2045, -779,1,2198,3205,16, -0,495,1,2706,3206, -16,0,337,1,2037, -757,1,2713,3170,1, -2714,3147,1,1574,799, -1,2716,3153,1,2636, -3207,16,0,337,1, -1958,3208,16,0,495, -1,49,3209,19,500, -1,49,3210,5,38, -1,1901,3211,16,0, -498,1,2075,3212,16, -0,498,1,1860,821, +1958,3257,16,0,498, +1,50,3258,19,614, +1,50,3259,5,38, +1,1901,3260,16,0, +612,1,2075,3261,16, +0,612,1,1860,821, 1,1803,787,1,1804, -3213,16,0,498,1, -2413,3214,16,0,498, -1,2198,3215,16,0, -498,1,1873,835,1, +3262,16,0,612,1, +2413,3263,16,0,612, +1,2198,3264,16,0, +612,1,1873,835,1, 1657,894,1,1989,916, -1,1990,3216,16,0, -498,1,1775,3217,16, -0,498,1,32,3218, -16,0,498,1,2105, -814,1,2106,3219,16, -0,498,1,2364,827, +1,1990,3265,16,0, +612,1,1775,3266,16, +0,612,1,32,3267, +16,0,612,1,2105, +814,1,2106,3268,16, +0,612,1,2364,827, 1,2227,908,1,2337, -3220,16,0,498,1, +3269,16,0,612,1, 2021,718,1,2458,876, 1,2459,882,1,2462, 889,1,2136,842,1, @@ -8606,2127 +8659,2076 @@ public yyLSLSyntax 762,1,1931,861,1, 2041,768,1,2043,774, 1,2045,779,1,1574, -799,1,1958,3221,16, -0,498,1,50,3222, -19,614,1,50,3223, -5,38,1,1901,3224, -16,0,612,1,2075, -3225,16,0,612,1, +799,1,1958,3270,16, +0,612,1,51,3271, +19,127,1,51,3272, +5,53,1,0,3273, +16,0,125,1,2075, +3274,16,0,125,1, 1860,821,1,1803,787, -1,1804,3226,16,0, -612,1,2413,3227,16, -0,612,1,2198,3228, -16,0,612,1,1873, -835,1,1657,894,1, -1989,916,1,1990,3229, -16,0,612,1,1775, -3230,16,0,612,1, -32,3231,16,0,612, -1,2105,814,1,2106, -3232,16,0,612,1, -2364,827,1,2227,908, -1,2337,3233,16,0, -612,1,2021,718,1, -2458,876,1,2459,882, -1,2462,889,1,2136, -842,1,2464,899,1, -2029,725,1,2030,731, -1,2031,736,1,2032, -741,1,2033,746,1, -2035,752,1,2037,757, -1,2039,762,1,1931, -861,1,2041,768,1, -2043,774,1,2045,779, -1,1574,799,1,1958, -3234,16,0,612,1, -51,3235,19,127,1, -51,3236,5,53,1, -0,3237,16,0,125, -1,2075,3238,16,0, -125,1,1860,821,1, -1803,787,1,1804,3239, -16,0,125,1,10, -3240,16,0,125,1, -2413,3241,16,0,125, -1,2198,3242,16,0, -125,1,1873,835,1, -21,3243,16,0,125, -1,1657,894,1,2030, -731,1,2642,3244,16, -0,125,1,1989,916, -1,1990,3245,16,0, -125,1,2459,882,1, -1775,3246,16,0,125, -1,32,3247,16,0, -125,1,2105,814,1, -2106,3248,16,0,125, -1,2655,3175,1,2683, -3187,1,2227,908,1, -2337,3249,16,0,125, -1,52,3250,16,0, -125,1,2694,3180,1, -2695,3251,16,0,125, -1,2021,718,1,2458, -876,1,1901,3252,16, -0,125,1,2462,889, -1,2136,842,1,2464, -899,1,2029,725,1, -2466,3164,1,2031,736, -1,2032,741,1,2033, -746,1,2035,752,1, -2364,827,1,2715,3159, -1,2039,762,1,1931, -861,1,2041,768,1, -2043,774,1,2045,779, -1,2037,757,1,2713, -3170,1,2714,3147,1, -1574,799,1,2716,3153, -1,1958,3253,16,0, -125,1,2506,3254,16, -0,125,1,52,3255, -19,124,1,52,3256, -5,53,1,0,3257, -16,0,122,1,2075, -3258,16,0,122,1, -1860,821,1,1803,787, -1,1804,3259,16,0, -122,1,10,3260,16, -0,122,1,2413,3261, -16,0,122,1,2198, -3262,16,0,122,1, -1873,835,1,21,3263, -16,0,122,1,1657, +1,1804,3275,16,0, +125,1,10,3276,16, +0,125,1,2413,3277, +16,0,125,1,2198, +3278,16,0,125,1, +1873,835,1,21,3279, +16,0,125,1,1657, 894,1,2030,731,1, -2642,3264,16,0,122, +2642,3280,16,0,125, 1,1989,916,1,1990, -3265,16,0,122,1, -2459,882,1,1775,3266, -16,0,122,1,32, -3267,16,0,122,1, -2105,814,1,2106,3268, -16,0,122,1,2655, -3175,1,2683,3187,1, -2227,908,1,2337,3269, -16,0,122,1,52, -3270,16,0,122,1, -2694,3180,1,2695,3271, -16,0,122,1,2021, +3281,16,0,125,1, +2459,882,1,1775,3282, +16,0,125,1,32, +3283,16,0,125,1, +2105,814,1,2106,3284, +16,0,125,1,2655, +3211,1,2683,3223,1, +2227,908,1,2337,3285, +16,0,125,1,52, +3286,16,0,125,1, +2694,3216,1,2695,3287, +16,0,125,1,2021, 718,1,2458,876,1, -1901,3272,16,0,122, +1901,3288,16,0,125, 1,2462,889,1,2136, 842,1,2464,899,1, -2029,725,1,2466,3164, +2029,725,1,2466,3200, 1,2031,736,1,2032, 741,1,2033,746,1, 2035,752,1,2364,827, -1,2715,3159,1,2039, +1,2715,3195,1,2039, 762,1,1931,861,1, 2041,768,1,2043,774, 1,2045,779,1,2037, -757,1,2713,3170,1, -2714,3147,1,1574,799, -1,2716,3153,1,1958, -3273,16,0,122,1, -2506,3274,16,0,122, -1,53,3275,19,121, -1,53,3276,5,53, -1,0,3277,16,0, -119,1,2075,3278,16, -0,119,1,1860,821, +757,1,2713,3206,1, +2714,3183,1,1574,799, +1,2716,3189,1,1958, +3289,16,0,125,1, +2506,3290,16,0,125, +1,52,3291,19,124, +1,52,3292,5,53, +1,0,3293,16,0, +122,1,2075,3294,16, +0,122,1,1860,821, 1,1803,787,1,1804, -3279,16,0,119,1, -10,3280,16,0,119, -1,2413,3281,16,0, -119,1,2198,3282,16, -0,119,1,1873,835, -1,21,3283,16,0, -119,1,1657,894,1, -2030,731,1,2642,3284, -16,0,119,1,1989, -916,1,1990,3285,16, -0,119,1,2459,882, -1,1775,3286,16,0, -119,1,32,3287,16, -0,119,1,2105,814, -1,2106,3288,16,0, -119,1,2655,3175,1, -2683,3187,1,2227,908, -1,2337,3289,16,0, -119,1,52,3290,16, -0,119,1,2694,3180, -1,2695,3291,16,0, -119,1,2021,718,1, -2458,876,1,1901,3292, -16,0,119,1,2462, +3295,16,0,122,1, +10,3296,16,0,122, +1,2413,3297,16,0, +122,1,2198,3298,16, +0,122,1,1873,835, +1,21,3299,16,0, +122,1,1657,894,1, +2030,731,1,2642,3300, +16,0,122,1,1989, +916,1,1990,3301,16, +0,122,1,2459,882, +1,1775,3302,16,0, +122,1,32,3303,16, +0,122,1,2105,814, +1,2106,3304,16,0, +122,1,2655,3211,1, +2683,3223,1,2227,908, +1,2337,3305,16,0, +122,1,52,3306,16, +0,122,1,2694,3216, +1,2695,3307,16,0, +122,1,2021,718,1, +2458,876,1,1901,3308, +16,0,122,1,2462, 889,1,2136,842,1, 2464,899,1,2029,725, -1,2466,3164,1,2031, +1,2466,3200,1,2031, 736,1,2032,741,1, 2033,746,1,2035,752, 1,2364,827,1,2715, -3159,1,2039,762,1, +3195,1,2039,762,1, 1931,861,1,2041,768, 1,2043,774,1,2045, 779,1,2037,757,1, -2713,3170,1,2714,3147, +2713,3206,1,2714,3183, 1,1574,799,1,2716, -3153,1,1958,3293,16, -0,119,1,2506,3294, -16,0,119,1,54, -3295,19,118,1,54, -3296,5,53,1,0, -3297,16,0,116,1, -2075,3298,16,0,116, +3189,1,1958,3309,16, +0,122,1,2506,3310, +16,0,122,1,53, +3311,19,121,1,53, +3312,5,53,1,0, +3313,16,0,119,1, +2075,3314,16,0,119, 1,1860,821,1,1803, -787,1,1804,3299,16, -0,116,1,10,3300, -16,0,116,1,2413, -3301,16,0,116,1, -2198,3302,16,0,116, +787,1,1804,3315,16, +0,119,1,10,3316, +16,0,119,1,2413, +3317,16,0,119,1, +2198,3318,16,0,119, 1,1873,835,1,21, -3303,16,0,116,1, +3319,16,0,119,1, 1657,894,1,2030,731, -1,2642,3304,16,0, -116,1,1989,916,1, -1990,3305,16,0,116, +1,2642,3320,16,0, +119,1,1989,916,1, +1990,3321,16,0,119, 1,2459,882,1,1775, -3306,16,0,116,1, -32,3307,16,0,116, +3322,16,0,119,1, +32,3323,16,0,119, 1,2105,814,1,2106, -3308,16,0,116,1, -2655,3175,1,2683,3187, +3324,16,0,119,1, +2655,3211,1,2683,3223, 1,2227,908,1,2337, -3309,16,0,116,1, -52,3310,16,0,116, -1,2694,3180,1,2695, -3311,16,0,116,1, +3325,16,0,119,1, +52,3326,16,0,119, +1,2694,3216,1,2695, +3327,16,0,119,1, 2021,718,1,2458,876, -1,1901,3312,16,0, -116,1,2462,889,1, +1,1901,3328,16,0, +119,1,2462,889,1, 2136,842,1,2464,899, 1,2029,725,1,2466, -3164,1,2031,736,1, +3200,1,2031,736,1, 2032,741,1,2033,746, 1,2035,752,1,2364, -827,1,2715,3159,1, +827,1,2715,3195,1, 2039,762,1,1931,861, 1,2041,768,1,2043, 774,1,2045,779,1, -2037,757,1,2713,3170, -1,2714,3147,1,1574, -799,1,2716,3153,1, -1958,3313,16,0,116, -1,2506,3314,16,0, -116,1,55,3315,19, -115,1,55,3316,5, -53,1,0,3317,16, -0,113,1,2075,3318, -16,0,113,1,1860, +2037,757,1,2713,3206, +1,2714,3183,1,1574, +799,1,2716,3189,1, +1958,3329,16,0,119, +1,2506,3330,16,0, +119,1,54,3331,19, +118,1,54,3332,5, +53,1,0,3333,16, +0,116,1,2075,3334, +16,0,116,1,1860, 821,1,1803,787,1, -1804,3319,16,0,113, -1,10,3320,16,0, -113,1,2413,3321,16, -0,113,1,2198,3322, -16,0,113,1,1873, -835,1,21,3323,16, -0,113,1,1657,894, +1804,3335,16,0,116, +1,10,3336,16,0, +116,1,2413,3337,16, +0,116,1,2198,3338, +16,0,116,1,1873, +835,1,21,3339,16, +0,116,1,1657,894, 1,2030,731,1,2642, -3324,16,0,113,1, -1989,916,1,1990,3325, -16,0,113,1,2459, -882,1,1775,3326,16, -0,113,1,32,3327, -16,0,113,1,2105, -814,1,2106,3328,16, -0,113,1,2655,3175, -1,2683,3187,1,2227, -908,1,2337,3329,16, -0,113,1,52,3330, -16,0,113,1,2694, -3180,1,2695,3331,16, -0,113,1,2021,718, +3340,16,0,116,1, +1989,916,1,1990,3341, +16,0,116,1,2459, +882,1,1775,3342,16, +0,116,1,32,3343, +16,0,116,1,2105, +814,1,2106,3344,16, +0,116,1,2655,3211, +1,2683,3223,1,2227, +908,1,2337,3345,16, +0,116,1,52,3346, +16,0,116,1,2694, +3216,1,2695,3347,16, +0,116,1,2021,718, 1,2458,876,1,1901, -3332,16,0,113,1, +3348,16,0,116,1, 2462,889,1,2136,842, 1,2464,899,1,2029, -725,1,2466,3164,1, +725,1,2466,3200,1, 2031,736,1,2032,741, 1,2033,746,1,2035, 752,1,2364,827,1, -2715,3159,1,2039,762, +2715,3195,1,2039,762, 1,1931,861,1,2041, 768,1,2043,774,1, 2045,779,1,2037,757, -1,2713,3170,1,2714, -3147,1,1574,799,1, -2716,3153,1,1958,3333, -16,0,113,1,2506, -3334,16,0,113,1, -56,3335,19,112,1, -56,3336,5,53,1, -0,3337,16,0,110, -1,2075,3338,16,0, -110,1,1860,821,1, -1803,787,1,1804,3339, -16,0,110,1,10, -3340,16,0,110,1, -2413,3341,16,0,110, -1,2198,3342,16,0, -110,1,1873,835,1, -21,3343,16,0,110, +1,2713,3206,1,2714, +3183,1,1574,799,1, +2716,3189,1,1958,3349, +16,0,116,1,2506, +3350,16,0,116,1, +55,3351,19,115,1, +55,3352,5,53,1, +0,3353,16,0,113, +1,2075,3354,16,0, +113,1,1860,821,1, +1803,787,1,1804,3355, +16,0,113,1,10, +3356,16,0,113,1, +2413,3357,16,0,113, +1,2198,3358,16,0, +113,1,1873,835,1, +21,3359,16,0,113, 1,1657,894,1,2030, -731,1,2642,3344,16, -0,110,1,1989,916, -1,1990,3345,16,0, -110,1,2459,882,1, -1775,3346,16,0,110, -1,32,3347,16,0, -110,1,2105,814,1, -2106,3348,16,0,110, -1,2655,3175,1,2683, -3187,1,2227,908,1, -2337,3349,16,0,110, -1,52,3350,16,0, -110,1,2694,3180,1, -2695,3351,16,0,110, +731,1,2642,3360,16, +0,113,1,1989,916, +1,1990,3361,16,0, +113,1,2459,882,1, +1775,3362,16,0,113, +1,32,3363,16,0, +113,1,2105,814,1, +2106,3364,16,0,113, +1,2655,3211,1,2683, +3223,1,2227,908,1, +2337,3365,16,0,113, +1,52,3366,16,0, +113,1,2694,3216,1, +2695,3367,16,0,113, 1,2021,718,1,2458, -876,1,1901,3352,16, -0,110,1,2462,889, +876,1,1901,3368,16, +0,113,1,2462,889, 1,2136,842,1,2464, 899,1,2029,725,1, -2466,3164,1,2031,736, +2466,3200,1,2031,736, 1,2032,741,1,2033, 746,1,2035,752,1, -2364,827,1,2715,3159, +2364,827,1,2715,3195, 1,2039,762,1,1931, 861,1,2041,768,1, 2043,774,1,2045,779, 1,2037,757,1,2713, -3170,1,2714,3147,1, -1574,799,1,2716,3153, -1,1958,3353,16,0, -110,1,2506,3354,16, -0,110,1,57,3355, -19,109,1,57,3356, -5,53,1,0,3357, -16,0,107,1,2075, -3358,16,0,107,1, +3206,1,2714,3183,1, +1574,799,1,2716,3189, +1,1958,3369,16,0, +113,1,2506,3370,16, +0,113,1,56,3371, +19,112,1,56,3372, +5,53,1,0,3373, +16,0,110,1,2075, +3374,16,0,110,1, 1860,821,1,1803,787, -1,1804,3359,16,0, -107,1,10,3360,16, -0,107,1,2413,3361, -16,0,107,1,2198, -3362,16,0,107,1, -1873,835,1,21,3363, -16,0,107,1,1657, +1,1804,3375,16,0, +110,1,10,3376,16, +0,110,1,2413,3377, +16,0,110,1,2198, +3378,16,0,110,1, +1873,835,1,21,3379, +16,0,110,1,1657, 894,1,2030,731,1, -2642,3364,16,0,107, +2642,3380,16,0,110, 1,1989,916,1,1990, -3365,16,0,107,1, -2459,882,1,1775,3366, -16,0,107,1,32, -3367,16,0,107,1, -2105,814,1,2106,3368, -16,0,107,1,2655, -3175,1,2683,3187,1, -2227,908,1,2337,3369, -16,0,107,1,52, -3370,16,0,107,1, -2694,3180,1,2695,3371, -16,0,107,1,2021, +3381,16,0,110,1, +2459,882,1,1775,3382, +16,0,110,1,32, +3383,16,0,110,1, +2105,814,1,2106,3384, +16,0,110,1,2655, +3211,1,2683,3223,1, +2227,908,1,2337,3385, +16,0,110,1,52, +3386,16,0,110,1, +2694,3216,1,2695,3387, +16,0,110,1,2021, 718,1,2458,876,1, -1901,3372,16,0,107, +1901,3388,16,0,110, 1,2462,889,1,2136, 842,1,2464,899,1, -2029,725,1,2466,3164, +2029,725,1,2466,3200, 1,2031,736,1,2032, 741,1,2033,746,1, 2035,752,1,2364,827, -1,2715,3159,1,2039, +1,2715,3195,1,2039, 762,1,1931,861,1, 2041,768,1,2043,774, 1,2045,779,1,2037, -757,1,2713,3170,1, -2714,3147,1,1574,799, -1,2716,3153,1,1958, -3373,16,0,107,1, -2506,3374,16,0,107, -1,58,3375,19,429, -1,58,3376,5,9, -1,2519,1618,1,2557, -1627,1,2521,3377,16, -0,427,1,2559,1633, -1,2597,3378,16,0, -427,1,2561,3379,16, -0,427,1,2459,882, -1,2464,899,1,2470, -3380,16,0,427,1, -59,3381,19,426,1, -59,3382,5,9,1, -2519,1618,1,2557,1627, -1,2521,3383,16,0, -424,1,2559,1633,1, -2597,3384,16,0,424, -1,2561,3385,16,0, -424,1,2459,882,1, -2464,899,1,2470,3386, -16,0,424,1,60, -3387,19,423,1,60, -3388,5,9,1,2519, +757,1,2713,3206,1, +2714,3183,1,1574,799, +1,2716,3189,1,1958, +3389,16,0,110,1, +2506,3390,16,0,110, +1,57,3391,19,109, +1,57,3392,5,53, +1,0,3393,16,0, +107,1,2075,3394,16, +0,107,1,1860,821, +1,1803,787,1,1804, +3395,16,0,107,1, +10,3396,16,0,107, +1,2413,3397,16,0, +107,1,2198,3398,16, +0,107,1,1873,835, +1,21,3399,16,0, +107,1,1657,894,1, +2030,731,1,2642,3400, +16,0,107,1,1989, +916,1,1990,3401,16, +0,107,1,2459,882, +1,1775,3402,16,0, +107,1,32,3403,16, +0,107,1,2105,814, +1,2106,3404,16,0, +107,1,2655,3211,1, +2683,3223,1,2227,908, +1,2337,3405,16,0, +107,1,52,3406,16, +0,107,1,2694,3216, +1,2695,3407,16,0, +107,1,2021,718,1, +2458,876,1,1901,3408, +16,0,107,1,2462, +889,1,2136,842,1, +2464,899,1,2029,725, +1,2466,3200,1,2031, +736,1,2032,741,1, +2033,746,1,2035,752, +1,2364,827,1,2715, +3195,1,2039,762,1, +1931,861,1,2041,768, +1,2043,774,1,2045, +779,1,2037,757,1, +2713,3206,1,2714,3183, +1,1574,799,1,2716, +3189,1,1958,3409,16, +0,107,1,2506,3410, +16,0,107,1,58, +3411,19,429,1,58, +3412,5,9,1,2519, 1618,1,2557,1627,1, -2521,3389,16,0,421, +2521,3413,16,0,427, 1,2559,1633,1,2597, -3390,16,0,421,1, -2561,3391,16,0,421, +3414,16,0,427,1, +2561,3415,16,0,427, 1,2459,882,1,2464, -899,1,2470,3392,16, -0,421,1,61,3393, -19,420,1,61,3394, +899,1,2470,3416,16, +0,427,1,59,3417, +19,426,1,59,3418, 5,9,1,2519,1618, 1,2557,1627,1,2521, -3395,16,0,418,1, -2559,1633,1,2597,3396, -16,0,418,1,2561, -3397,16,0,418,1, +3419,16,0,424,1, +2559,1633,1,2597,3420, +16,0,424,1,2561, +3421,16,0,424,1, 2459,882,1,2464,899, -1,2470,3398,16,0, -418,1,62,3399,19, -417,1,62,3400,5, +1,2470,3422,16,0, +424,1,60,3423,19, +423,1,60,3424,5, 9,1,2519,1618,1, -2557,1627,1,2521,3401, -16,0,415,1,2559, -1633,1,2597,3402,16, -0,415,1,2561,3403, -16,0,415,1,2459, +2557,1627,1,2521,3425, +16,0,421,1,2559, +1633,1,2597,3426,16, +0,421,1,2561,3427, +16,0,421,1,2459, 882,1,2464,899,1, -2470,3404,16,0,415, -1,63,3405,19,414, -1,63,3406,5,9, +2470,3428,16,0,421, +1,61,3429,19,420, +1,61,3430,5,9, 1,2519,1618,1,2557, -1627,1,2521,3407,16, -0,412,1,2559,1633, -1,2597,3408,16,0, -412,1,2561,3409,16, -0,412,1,2459,882, +1627,1,2521,3431,16, +0,418,1,2559,1633, +1,2597,3432,16,0, +418,1,2561,3433,16, +0,418,1,2459,882, 1,2464,899,1,2470, -3410,16,0,412,1, -64,3411,19,653,1, -64,3412,5,9,1, +3434,16,0,418,1, +62,3435,19,417,1, +62,3436,5,9,1, 2519,1618,1,2557,1627, -1,2521,3413,16,0, -651,1,2559,1633,1, -2597,3414,16,0,651, -1,2561,3415,16,0, -651,1,2459,882,1, -2464,899,1,2470,3416, -16,0,651,1,65, -3417,19,410,1,65, -3418,5,9,1,2519, +1,2521,3437,16,0, +415,1,2559,1633,1, +2597,3438,16,0,415, +1,2561,3439,16,0, +415,1,2459,882,1, +2464,899,1,2470,3440, +16,0,415,1,63, +3441,19,414,1,63, +3442,5,9,1,2519, 1618,1,2557,1627,1, -2521,3419,16,0,408, +2521,3443,16,0,412, 1,2559,1633,1,2597, -3420,16,0,408,1, -2561,3421,16,0,408, +3444,16,0,412,1, +2561,3445,16,0,412, 1,2459,882,1,2464, -899,1,2470,3422,16, -0,408,1,66,3423, -19,493,1,66,3424, +899,1,2470,3446,16, +0,412,1,64,3447, +19,653,1,64,3448, 5,9,1,2519,1618, 1,2557,1627,1,2521, -3425,16,0,491,1, -2559,1633,1,2597,3426, -16,0,491,1,2561, -3427,16,0,491,1, +3449,16,0,651,1, +2559,1633,1,2597,3450, +16,0,651,1,2561, +3451,16,0,651,1, 2459,882,1,2464,899, -1,2470,3428,16,0, -491,1,67,3429,19, -406,1,67,3430,5, +1,2470,3452,16,0, +651,1,65,3453,19, +410,1,65,3454,5, 9,1,2519,1618,1, -2557,1627,1,2521,3431, -16,0,404,1,2559, -1633,1,2597,3432,16, -0,404,1,2561,3433, -16,0,404,1,2459, +2557,1627,1,2521,3455, +16,0,408,1,2559, +1633,1,2597,3456,16, +0,408,1,2561,3457, +16,0,408,1,2459, 882,1,2464,899,1, -2470,3434,16,0,404, -1,68,3435,19,403, -1,68,3436,5,9, +2470,3458,16,0,408, +1,66,3459,19,493, +1,66,3460,5,9, 1,2519,1618,1,2557, -1627,1,2521,3437,16, -0,401,1,2559,1633, -1,2597,3438,16,0, -401,1,2561,3439,16, -0,401,1,2459,882, +1627,1,2521,3461,16, +0,491,1,2559,1633, +1,2597,3462,16,0, +491,1,2561,3463,16, +0,491,1,2459,882, 1,2464,899,1,2470, -3440,16,0,401,1, -69,3441,19,486,1, -69,3442,5,9,1, +3464,16,0,491,1, +67,3465,19,406,1, +67,3466,5,9,1, 2519,1618,1,2557,1627, -1,2521,3443,16,0, -484,1,2559,1633,1, -2597,3444,16,0,484, -1,2561,3445,16,0, -484,1,2459,882,1, -2464,899,1,2470,3446, -16,0,484,1,70, -3447,19,399,1,70, -3448,5,9,1,2519, +1,2521,3467,16,0, +404,1,2559,1633,1, +2597,3468,16,0,404, +1,2561,3469,16,0, +404,1,2459,882,1, +2464,899,1,2470,3470, +16,0,404,1,68, +3471,19,403,1,68, +3472,5,9,1,2519, 1618,1,2557,1627,1, -2521,3449,16,0,397, +2521,3473,16,0,401, 1,2559,1633,1,2597, -3450,16,0,397,1, -2561,3451,16,0,397, +3474,16,0,401,1, +2561,3475,16,0,401, 1,2459,882,1,2464, -899,1,2470,3452,16, -0,397,1,71,3453, -19,483,1,71,3454, +899,1,2470,3476,16, +0,401,1,69,3477, +19,486,1,69,3478, 5,9,1,2519,1618, 1,2557,1627,1,2521, -3455,16,0,481,1, -2559,1633,1,2597,3456, -16,0,481,1,2561, -3457,16,0,481,1, +3479,16,0,484,1, +2559,1633,1,2597,3480, +16,0,484,1,2561, +3481,16,0,484,1, 2459,882,1,2464,899, -1,2470,3458,16,0, -481,1,72,3459,19, -480,1,72,3460,5, +1,2470,3482,16,0, +484,1,70,3483,19, +399,1,70,3484,5, 9,1,2519,1618,1, -2557,1627,1,2521,3461, -16,0,478,1,2559, -1633,1,2597,3462,16, -0,478,1,2561,3463, -16,0,478,1,2459, +2557,1627,1,2521,3485, +16,0,397,1,2559, +1633,1,2597,3486,16, +0,397,1,2561,3487, +16,0,397,1,2459, 882,1,2464,899,1, -2470,3464,16,0,478, -1,73,3465,19,477, -1,73,3466,5,9, +2470,3488,16,0,397, +1,71,3489,19,483, +1,71,3490,5,9, 1,2519,1618,1,2557, -1627,1,2521,3467,16, -0,475,1,2559,1633, -1,2597,3468,16,0, -475,1,2561,3469,16, -0,475,1,2459,882, +1627,1,2521,3491,16, +0,481,1,2559,1633, +1,2597,3492,16,0, +481,1,2561,3493,16, +0,481,1,2459,882, 1,2464,899,1,2470, -3470,16,0,475,1, -74,3471,19,474,1, -74,3472,5,9,1, +3494,16,0,481,1, +72,3495,19,480,1, +72,3496,5,9,1, 2519,1618,1,2557,1627, -1,2521,3473,16,0, -472,1,2559,1633,1, -2597,3474,16,0,472, -1,2561,3475,16,0, -472,1,2459,882,1, -2464,899,1,2470,3476, -16,0,472,1,75, -3477,19,390,1,75, -3478,5,9,1,2519, +1,2521,3497,16,0, +478,1,2559,1633,1, +2597,3498,16,0,478, +1,2561,3499,16,0, +478,1,2459,882,1, +2464,899,1,2470,3500, +16,0,478,1,73, +3501,19,477,1,73, +3502,5,9,1,2519, 1618,1,2557,1627,1, -2521,3479,16,0,388, +2521,3503,16,0,475, 1,2559,1633,1,2597, -3480,16,0,388,1, -2561,3481,16,0,388, +3504,16,0,475,1, +2561,3505,16,0,475, 1,2459,882,1,2464, -899,1,2470,3482,16, -0,388,1,76,3483, -19,387,1,76,3484, +899,1,2470,3506,16, +0,475,1,74,3507, +19,474,1,74,3508, 5,9,1,2519,1618, 1,2557,1627,1,2521, -3485,16,0,385,1, -2559,1633,1,2597,3486, -16,0,385,1,2561, -3487,16,0,385,1, +3509,16,0,472,1, +2559,1633,1,2597,3510, +16,0,472,1,2561, +3511,16,0,472,1, 2459,882,1,2464,899, -1,2470,3488,16,0, -385,1,77,3489,19, -471,1,77,3490,5, +1,2470,3512,16,0, +472,1,75,3513,19, +390,1,75,3514,5, 9,1,2519,1618,1, -2557,1627,1,2521,3491, -16,0,469,1,2559, -1633,1,2597,3492,16, -0,469,1,2561,3493, -16,0,469,1,2459, +2557,1627,1,2521,3515, +16,0,388,1,2559, +1633,1,2597,3516,16, +0,388,1,2561,3517, +16,0,388,1,2459, 882,1,2464,899,1, -2470,3494,16,0,469, -1,78,3495,19,566, -1,78,3496,5,9, +2470,3518,16,0,388, +1,76,3519,19,387, +1,76,3520,5,9, 1,2519,1618,1,2557, -1627,1,2521,3497,16, -0,564,1,2559,1633, -1,2597,3498,16,0, -564,1,2561,3499,16, -0,564,1,2459,882, +1627,1,2521,3521,16, +0,385,1,2559,1633, +1,2597,3522,16,0, +385,1,2561,3523,16, +0,385,1,2459,882, 1,2464,899,1,2470, -3500,16,0,564,1, -79,3501,19,380,1, -79,3502,5,9,1, +3524,16,0,385,1, +77,3525,19,471,1, +77,3526,5,9,1, 2519,1618,1,2557,1627, -1,2521,3503,16,0, -378,1,2559,1633,1, -2597,3504,16,0,378, -1,2561,3505,16,0, -378,1,2459,882,1, -2464,899,1,2470,3506, -16,0,378,1,80, -3507,19,377,1,80, -3508,5,9,1,2519, +1,2521,3527,16,0, +469,1,2559,1633,1, +2597,3528,16,0,469, +1,2561,3529,16,0, +469,1,2459,882,1, +2464,899,1,2470,3530, +16,0,469,1,78, +3531,19,566,1,78, +3532,5,9,1,2519, 1618,1,2557,1627,1, -2521,3509,16,0,375, +2521,3533,16,0,564, 1,2559,1633,1,2597, -3510,16,0,375,1, -2561,3511,16,0,375, +3534,16,0,564,1, +2561,3535,16,0,564, 1,2459,882,1,2464, -899,1,2470,3512,16, -0,375,1,81,3513, -19,374,1,81,3514, +899,1,2470,3536,16, +0,564,1,79,3537, +19,380,1,79,3538, 5,9,1,2519,1618, 1,2557,1627,1,2521, -3515,16,0,372,1, -2559,1633,1,2597,3516, -16,0,372,1,2561, -3517,16,0,372,1, +3539,16,0,378,1, +2559,1633,1,2597,3540, +16,0,378,1,2561, +3541,16,0,378,1, 2459,882,1,2464,899, -1,2470,3518,16,0, -372,1,82,3519,19, -371,1,82,3520,5, +1,2470,3542,16,0, +378,1,80,3543,19, +377,1,80,3544,5, 9,1,2519,1618,1, -2557,1627,1,2521,3521, -16,0,369,1,2559, -1633,1,2597,3522,16, -0,369,1,2561,3523, -16,0,369,1,2459, +2557,1627,1,2521,3545, +16,0,375,1,2559, +1633,1,2597,3546,16, +0,375,1,2561,3547, +16,0,375,1,2459, 882,1,2464,899,1, -2470,3524,16,0,369, -1,83,3525,19,368, -1,83,3526,5,9, +2470,3548,16,0,375, +1,81,3549,19,374, +1,81,3550,5,9, 1,2519,1618,1,2557, -1627,1,2521,3527,16, -0,366,1,2559,1633, -1,2597,3528,16,0, -366,1,2561,3529,16, -0,366,1,2459,882, +1627,1,2521,3551,16, +0,372,1,2559,1633, +1,2597,3552,16,0, +372,1,2561,3553,16, +0,372,1,2459,882, 1,2464,899,1,2470, -3530,16,0,366,1, -84,3531,19,365,1, -84,3532,5,9,1, +3554,16,0,372,1, +82,3555,19,371,1, +82,3556,5,9,1, 2519,1618,1,2557,1627, -1,2521,3533,16,0, -363,1,2559,1633,1, -2597,3534,16,0,363, -1,2561,3535,16,0, -363,1,2459,882,1, -2464,899,1,2470,3536, -16,0,363,1,85, -3537,19,362,1,85, -3538,5,9,1,2519, +1,2521,3557,16,0, +369,1,2559,1633,1, +2597,3558,16,0,369, +1,2561,3559,16,0, +369,1,2459,882,1, +2464,899,1,2470,3560, +16,0,369,1,83, +3561,19,368,1,83, +3562,5,9,1,2519, 1618,1,2557,1627,1, -2521,3539,16,0,360, +2521,3563,16,0,366, 1,2559,1633,1,2597, -3540,16,0,360,1, -2561,3541,16,0,360, +3564,16,0,366,1, +2561,3565,16,0,366, 1,2459,882,1,2464, -899,1,2470,3542,16, -0,360,1,86,3543, -19,359,1,86,3544, +899,1,2470,3566,16, +0,366,1,84,3567, +19,365,1,84,3568, 5,9,1,2519,1618, 1,2557,1627,1,2521, -3545,16,0,357,1, -2559,1633,1,2597,3546, -16,0,357,1,2561, -3547,16,0,357,1, +3569,16,0,363,1, +2559,1633,1,2597,3570, +16,0,363,1,2561, +3571,16,0,363,1, 2459,882,1,2464,899, -1,2470,3548,16,0, -357,1,87,3549,19, -356,1,87,3550,5, +1,2470,3572,16,0, +363,1,85,3573,19, +362,1,85,3574,5, 9,1,2519,1618,1, -2557,1627,1,2521,3551, -16,0,354,1,2559, -1633,1,2597,3552,16, -0,354,1,2561,3553, -16,0,354,1,2459, +2557,1627,1,2521,3575, +16,0,360,1,2559, +1633,1,2597,3576,16, +0,360,1,2561,3577, +16,0,360,1,2459, 882,1,2464,899,1, -2470,3554,16,0,354, -1,88,3555,19,353, -1,88,3556,5,9, +2470,3578,16,0,360, +1,86,3579,19,359, +1,86,3580,5,9, 1,2519,1618,1,2557, -1627,1,2521,3557,16, -0,351,1,2559,1633, -1,2597,3558,16,0, -351,1,2561,3559,16, -0,351,1,2459,882, +1627,1,2521,3581,16, +0,357,1,2559,1633, +1,2597,3582,16,0, +357,1,2561,3583,16, +0,357,1,2459,882, 1,2464,899,1,2470, -3560,16,0,351,1, -89,3561,19,347,1, -89,3562,5,9,1, +3584,16,0,357,1, +87,3585,19,356,1, +87,3586,5,9,1, 2519,1618,1,2557,1627, -1,2521,3563,16,0, -345,1,2559,1633,1, -2597,3564,16,0,345, -1,2561,3565,16,0, -345,1,2459,882,1, -2464,899,1,2470,3566, -16,0,345,1,90, -3567,19,350,1,90, -3568,5,9,1,2519, +1,2521,3587,16,0, +354,1,2559,1633,1, +2597,3588,16,0,354, +1,2561,3589,16,0, +354,1,2459,882,1, +2464,899,1,2470,3590, +16,0,354,1,88, +3591,19,353,1,88, +3592,5,9,1,2519, 1618,1,2557,1627,1, -2521,3569,16,0,348, +2521,3593,16,0,351, 1,2559,1633,1,2597, -3570,16,0,348,1, -2561,3571,16,0,348, +3594,16,0,351,1, +2561,3595,16,0,351, 1,2459,882,1,2464, -899,1,2470,3572,16, -0,348,1,91,3573, -19,344,1,91,3574, +899,1,2470,3596,16, +0,351,1,89,3597, +19,347,1,89,3598, 5,9,1,2519,1618, 1,2557,1627,1,2521, -3575,16,0,342,1, -2559,1633,1,2597,3576, -16,0,342,1,2561, -3577,16,0,342,1, +3599,16,0,345,1, +2559,1633,1,2597,3600, +16,0,345,1,2561, +3601,16,0,345,1, 2459,882,1,2464,899, -1,2470,3578,16,0, -342,1,92,3579,19, -133,1,92,3580,5, -125,1,0,3581,16, -0,563,1,1,1951, -1,2,1957,1,3, -1962,1,4,1967,1, -5,1972,1,6,1977, -1,7,1982,1,8, -3582,16,0,131,1, -1515,3583,16,0,165, -1,2021,718,1,2022, -3584,16,0,497,1, -256,3585,16,0,173, -1,2025,3586,16,0, -501,1,18,3587,16, -0,138,1,2027,3588, -16,0,505,1,2695, -3589,16,0,563,1, +1,2470,3602,16,0, +345,1,90,3603,19, +350,1,90,3604,5, +9,1,2519,1618,1, +2557,1627,1,2521,3605, +16,0,348,1,2559, +1633,1,2597,3606,16, +0,348,1,2561,3607, +16,0,348,1,2459, +882,1,2464,899,1, +2470,3608,16,0,348, +1,91,3609,19,344, +1,91,3610,5,9, +1,2519,1618,1,2557, +1627,1,2521,3611,16, +0,342,1,2559,1633, +1,2597,3612,16,0, +342,1,2561,3613,16, +0,342,1,2459,882, +1,2464,899,1,2470, +3614,16,0,342,1, +92,3615,19,133,1, +92,3616,5,125,1, +0,3617,16,0,563, +1,1,1951,1,2, +1957,1,3,1962,1, +4,1967,1,5,1972, +1,6,1977,1,7, +1982,1,8,3618,16, +0,131,1,1515,3619, +16,0,165,1,2021, +718,1,2022,3620,16, +0,497,1,256,3621, +16,0,173,1,2025, +3622,16,0,501,1, +18,3623,16,0,138, +1,2027,3624,16,0, +505,1,2695,3625,16, +0,563,1,2029,725, +1,2030,731,1,2031, +736,1,2032,741,1, +2033,746,1,277,3626, +16,0,173,1,2035, +752,1,2037,757,1, +2039,762,1,32,3627, +16,0,165,1,2041, +768,1,2293,3628,16, +0,173,1,2043,774, +1,2045,779,1,2713, +3206,1,2715,3195,1, +41,3629,16,0,173, +1,1297,3630,16,0, +165,1,43,3631,16, +0,173,1,46,3632, +16,0,178,1,1804, +3633,16,0,165,1, +299,3634,16,0,173, +1,52,3635,16,0, +165,1,509,3636,16, +0,173,1,2318,3637, +16,0,165,1,62, +3638,16,0,195,1, +65,3639,16,0,197, +1,2075,3640,16,0, +165,1,1574,799,1, +71,3641,16,0,173, +1,1775,3642,16,0, +165,1,76,3643,16, +0,173,1,1834,3644, +16,0,165,1,2337, +3645,16,0,165,1, +79,3646,16,0,173, +1,1335,3647,16,0, +165,1,322,3648,16, +0,173,1,85,3649, +16,0,173,1,1261, +3650,16,0,165,1, +89,3651,16,0,173, +1,346,3652,16,0, +173,1,97,3653,16, +0,173,1,2106,3654, +16,0,165,1,102, +3655,16,0,173,1, +1860,821,1,1803,787, +1,2364,827,1,1113, +3656,16,0,158,1, +112,3657,16,0,173, +1,1117,3658,16,0, +165,1,1873,835,1, +1876,3659,16,0,165, +1,372,3660,16,0, +535,1,374,3661,16, +0,537,1,124,3662, +16,0,173,1,376, +3663,16,0,539,1, +378,3664,16,0,541, +1,2136,842,1,381, +3665,16,0,173,1, +525,3666,16,0,173, +1,137,3667,16,0, +173,1,1901,3668,16, +0,165,1,2655,3211, +1,2658,3669,16,0, +173,1,1153,3670,16, +0,165,1,151,3671, +16,0,173,1,1407, +3672,16,0,165,1, +1659,3673,16,0,165, +1,2413,3674,16,0, +165,1,406,3675,16, +0,173,1,1371,3676, +16,0,165,1,2105, +814,1,1657,894,1, +166,3677,16,0,173, +1,1622,3678,16,0, +173,1,2683,3223,1, +1931,861,1,1933,3679, +16,0,165,1,431, +3680,16,0,173,1, +1585,3681,16,0,173, +1,182,3682,16,0, +173,1,2694,3216,1, +1189,3683,16,0,165, +1,1443,3684,16,0, +165,1,1695,3685,16, +0,165,1,2198,3686, +16,0,165,1,447, +3687,16,0,173,1, +2458,876,1,2459,882, +1,1958,3688,16,0, +165,1,2462,889,1, +2714,3183,1,2464,899, +1,2716,3189,1,2466, +3200,1,459,3689,16, +0,173,1,2468,3690, +16,0,340,1,462, +3691,16,0,173,1, +199,3692,16,0,173, +1,217,3693,16,0, +173,1,2227,908,1, +1225,3694,16,0,165, +1,1479,3695,16,0, +165,1,1731,3696,16, +0,173,1,1989,916, +1,1990,3697,16,0, +165,1,236,3698,16, +0,173,1,1756,3699, +16,0,165,1,93, +3700,19,626,1,93, +3701,5,95,1,256, +3702,16,0,624,1, +1261,3703,16,0,624, +1,509,3704,16,0, +624,1,1515,3705,16, +0,624,1,2021,718, +1,1775,3706,16,0, +624,1,2029,725,1, +2030,731,1,2031,736, +1,2032,741,1,2033, +746,1,277,3707,16, +0,624,1,2035,752, +1,2037,757,1,2039, +762,1,32,3708,16, +0,624,1,2041,768, +1,2293,3709,16,0, +624,1,2043,774,1, +2045,779,1,41,3710, +16,0,624,1,1297, +3711,16,0,624,1, +43,3712,16,0,624, +1,1803,787,1,1804, +3713,16,0,624,1, +299,3714,16,0,624, +1,52,3715,16,0, +624,1,2318,3716,16, +0,624,1,62,3717, +16,0,624,1,2075, +3718,16,0,624,1, +1574,799,1,71,3719, +16,0,624,1,76, +3720,16,0,624,1, +1834,3721,16,0,624, +1,2337,3722,16,0, +624,1,79,3723,16, +0,624,1,1335,3724, +16,0,624,1,322, +3725,16,0,624,1, +85,3726,16,0,624, +1,89,3727,16,0, +624,1,346,3728,16, +0,624,1,2105,814, +1,2106,3729,16,0, +624,1,97,3730,16, +0,624,1,1860,821, +1,2364,827,1,102, +3731,16,0,624,1, +112,3732,16,0,624, +1,1117,3733,16,0, +624,1,1873,835,1, +1876,3734,16,0,624, +1,124,3735,16,0, +624,1,2136,842,1, +381,3736,16,0,624, +1,525,3737,16,0, +624,1,137,3738,16, +0,624,1,1901,3739, +16,0,624,1,2658, +3740,16,0,624,1, +1153,3741,16,0,624, +1,151,3742,16,0, +624,1,1407,3743,16, +0,624,1,1659,3744, +16,0,624,1,2413, +3745,16,0,624,1, +406,3746,16,0,624, +1,1371,3747,16,0, +624,1,166,3748,16, +0,624,1,1622,3749, +16,0,624,1,1931, +861,1,1933,3750,16, +0,624,1,431,3751, +16,0,624,1,1585, +3752,16,0,624,1, +182,3753,16,0,624, +1,1189,3754,16,0, +624,1,1443,3755,16, +0,624,1,1695,3756, +16,0,624,1,2198, +3757,16,0,624,1, +447,3758,16,0,624, +1,2458,876,1,2459, +882,1,1958,3759,16, +0,624,1,2462,889, +1,1657,894,1,2464, +899,1,199,3760,16, +0,624,1,459,3761, +16,0,624,1,462, +3762,16,0,624,1, +217,3763,16,0,624, +1,2227,908,1,1225, +3764,16,0,624,1, +1479,3765,16,0,624, +1,1731,3766,16,0, +624,1,1989,916,1, +1990,3767,16,0,624, +1,236,3768,16,0, +624,1,1756,3769,16, +0,624,1,94,3770, +19,623,1,94,3771, +5,95,1,256,3772, +16,0,621,1,1261, +3773,16,0,621,1, +509,3774,16,0,621, +1,1515,3775,16,0, +621,1,2021,718,1, +1775,3776,16,0,621, +1,2029,725,1,2030, +731,1,2031,736,1, +2032,741,1,2033,746, +1,277,3777,16,0, +621,1,2035,752,1, +2037,757,1,2039,762, +1,32,3778,16,0, +621,1,2041,768,1, +2293,3779,16,0,621, +1,2043,774,1,2045, +779,1,41,3780,16, +0,621,1,1297,3781, +16,0,621,1,43, +3782,16,0,621,1, +1803,787,1,1804,3783, +16,0,621,1,299, +3784,16,0,621,1, +52,3785,16,0,621, +1,2318,3786,16,0, +621,1,62,3787,16, +0,621,1,2075,3788, +16,0,621,1,1574, +799,1,71,3789,16, +0,621,1,76,3790, +16,0,621,1,1834, +3791,16,0,621,1, +2337,3792,16,0,621, +1,79,3793,16,0, +621,1,1335,3794,16, +0,621,1,322,3795, +16,0,621,1,85, +3796,16,0,621,1, +89,3797,16,0,621, +1,346,3798,16,0, +621,1,2105,814,1, +2106,3799,16,0,621, +1,97,3800,16,0, +621,1,1860,821,1, +2364,827,1,102,3801, +16,0,621,1,112, +3802,16,0,621,1, +1117,3803,16,0,621, +1,1873,835,1,1876, +3804,16,0,621,1, +124,3805,16,0,621, +1,2136,842,1,381, +3806,16,0,621,1, +525,3807,16,0,621, +1,137,3808,16,0, +621,1,1901,3809,16, +0,621,1,2658,3810, +16,0,621,1,1153, +3811,16,0,621,1, +151,3812,16,0,621, +1,1407,3813,16,0, +621,1,1659,3814,16, +0,621,1,2413,3815, +16,0,621,1,406, +3816,16,0,621,1, +1371,3817,16,0,621, +1,166,3818,16,0, +621,1,1622,3819,16, +0,621,1,1931,861, +1,1933,3820,16,0, +621,1,431,3821,16, +0,621,1,1585,3822, +16,0,621,1,182, +3823,16,0,621,1, +1189,3824,16,0,621, +1,1443,3825,16,0, +621,1,1695,3826,16, +0,621,1,2198,3827, +16,0,621,1,447, +3828,16,0,621,1, +2458,876,1,2459,882, +1,1958,3829,16,0, +621,1,2462,889,1, +1657,894,1,2464,899, +1,199,3830,16,0, +621,1,459,3831,16, +0,621,1,462,3832, +16,0,621,1,217, +3833,16,0,621,1, +2227,908,1,1225,3834, +16,0,621,1,1479, +3835,16,0,621,1, +1731,3836,16,0,621, +1,1989,916,1,1990, +3837,16,0,621,1, +236,3838,16,0,621, +1,1756,3839,16,0, +621,1,95,3840,19, +620,1,95,3841,5, +95,1,256,3842,16, +0,618,1,1261,3843, +16,0,618,1,509, +3844,16,0,618,1, +1515,3845,16,0,618, +1,2021,718,1,1775, +3846,16,0,618,1, 2029,725,1,2030,731, 1,2031,736,1,2032, 741,1,2033,746,1, -277,3590,16,0,173, +277,3847,16,0,618, 1,2035,752,1,2037, 757,1,2039,762,1, -32,3591,16,0,165, +32,3848,16,0,618, 1,2041,768,1,2293, -3592,16,0,173,1, -2043,774,1,2045,779, -1,2713,3170,1,2715, -3159,1,41,3593,16, -0,173,1,1297,3594, -16,0,165,1,43, -3595,16,0,173,1, -46,3596,16,0,178, -1,1804,3597,16,0, -165,1,299,3598,16, -0,173,1,52,3599, -16,0,165,1,509, -3600,16,0,173,1, -2318,3601,16,0,165, -1,62,3602,16,0, -195,1,65,3603,16, -0,197,1,2075,3604, -16,0,165,1,1574, -799,1,71,3605,16, -0,173,1,1775,3606, -16,0,165,1,76, -3607,16,0,173,1, -1834,3608,16,0,165, -1,2337,3609,16,0, -165,1,79,3610,16, -0,173,1,1335,3611, -16,0,165,1,322, -3612,16,0,173,1, -85,3613,16,0,173, -1,1261,3614,16,0, -165,1,89,3615,16, -0,173,1,346,3616, -16,0,173,1,97, -3617,16,0,173,1, -2106,3618,16,0,165, -1,102,3619,16,0, -173,1,1860,821,1, -1803,787,1,2364,827, -1,1113,3620,16,0, -158,1,112,3621,16, -0,173,1,1117,3622, -16,0,165,1,1873, -835,1,1876,3623,16, -0,165,1,372,3624, -16,0,535,1,374, -3625,16,0,537,1, -124,3626,16,0,173, -1,376,3627,16,0, -539,1,378,3628,16, -0,541,1,2136,842, -1,381,3629,16,0, -173,1,525,3630,16, -0,173,1,137,3631, -16,0,173,1,1901, -3632,16,0,165,1, -2655,3175,1,2658,3633, -16,0,173,1,1153, -3634,16,0,165,1, -151,3635,16,0,173, -1,1407,3636,16,0, -165,1,1659,3637,16, -0,165,1,2413,3638, -16,0,165,1,406, -3639,16,0,173,1, -1371,3640,16,0,165, -1,2105,814,1,1657, -894,1,166,3641,16, -0,173,1,1622,3642, -16,0,173,1,2683, -3187,1,1931,861,1, -1933,3643,16,0,165, -1,431,3644,16,0, -173,1,1585,3645,16, -0,173,1,182,3646, -16,0,173,1,2694, -3180,1,1189,3647,16, -0,165,1,1443,3648, -16,0,165,1,1695, -3649,16,0,165,1, -2198,3650,16,0,165, -1,447,3651,16,0, -173,1,2458,876,1, -2459,882,1,1958,3652, -16,0,165,1,2462, -889,1,2714,3147,1, -2464,899,1,2716,3153, -1,2466,3164,1,459, -3653,16,0,173,1, -2468,3654,16,0,340, -1,462,3655,16,0, -173,1,199,3656,16, -0,173,1,217,3657, -16,0,173,1,2227, -908,1,1225,3658,16, -0,165,1,1479,3659, -16,0,165,1,1731, -3660,16,0,173,1, -1989,916,1,1990,3661, -16,0,165,1,236, -3662,16,0,173,1, -1756,3663,16,0,165, -1,93,3664,19,626, -1,93,3665,5,95, -1,256,3666,16,0, -624,1,1261,3667,16, -0,624,1,509,3668, -16,0,624,1,1515, -3669,16,0,624,1, -2021,718,1,1775,3670, -16,0,624,1,2029, -725,1,2030,731,1, -2031,736,1,2032,741, -1,2033,746,1,277, -3671,16,0,624,1, -2035,752,1,2037,757, -1,2039,762,1,32, -3672,16,0,624,1, -2041,768,1,2293,3673, -16,0,624,1,2043, -774,1,2045,779,1, -41,3674,16,0,624, -1,1297,3675,16,0, -624,1,43,3676,16, -0,624,1,1803,787, -1,1804,3677,16,0, -624,1,299,3678,16, -0,624,1,52,3679, -16,0,624,1,2318, -3680,16,0,624,1, -62,3681,16,0,624, -1,2075,3682,16,0, -624,1,1574,799,1, -71,3683,16,0,624, -1,76,3684,16,0, -624,1,1834,3685,16, -0,624,1,2337,3686, -16,0,624,1,79, -3687,16,0,624,1, -1335,3688,16,0,624, -1,322,3689,16,0, -624,1,85,3690,16, -0,624,1,89,3691, -16,0,624,1,346, -3692,16,0,624,1, -2105,814,1,2106,3693, -16,0,624,1,97, -3694,16,0,624,1, -1860,821,1,2364,827, -1,102,3695,16,0, -624,1,112,3696,16, -0,624,1,1117,3697, -16,0,624,1,1873, -835,1,1876,3698,16, -0,624,1,124,3699, -16,0,624,1,2136, -842,1,381,3700,16, -0,624,1,525,3701, -16,0,624,1,137, -3702,16,0,624,1, -1901,3703,16,0,624, -1,2658,3704,16,0, -624,1,1153,3705,16, -0,624,1,151,3706, -16,0,624,1,1407, -3707,16,0,624,1, -1659,3708,16,0,624, -1,2413,3709,16,0, -624,1,406,3710,16, -0,624,1,1371,3711, -16,0,624,1,166, -3712,16,0,624,1, -1622,3713,16,0,624, -1,1931,861,1,1933, -3714,16,0,624,1, -431,3715,16,0,624, -1,1585,3716,16,0, -624,1,182,3717,16, -0,624,1,1189,3718, -16,0,624,1,1443, -3719,16,0,624,1, -1695,3720,16,0,624, -1,2198,3721,16,0, -624,1,447,3722,16, -0,624,1,2458,876, -1,2459,882,1,1958, -3723,16,0,624,1, -2462,889,1,1657,894, -1,2464,899,1,199, -3724,16,0,624,1, -459,3725,16,0,624, -1,462,3726,16,0, -624,1,217,3727,16, -0,624,1,2227,908, -1,1225,3728,16,0, -624,1,1479,3729,16, -0,624,1,1731,3730, -16,0,624,1,1989, -916,1,1990,3731,16, -0,624,1,236,3732, -16,0,624,1,1756, -3733,16,0,624,1, -94,3734,19,623,1, -94,3735,5,95,1, -256,3736,16,0,621, -1,1261,3737,16,0, -621,1,509,3738,16, -0,621,1,1515,3739, -16,0,621,1,2021, -718,1,1775,3740,16, -0,621,1,2029,725, -1,2030,731,1,2031, -736,1,2032,741,1, -2033,746,1,277,3741, -16,0,621,1,2035, -752,1,2037,757,1, -2039,762,1,32,3742, -16,0,621,1,2041, -768,1,2293,3743,16, -0,621,1,2043,774, -1,2045,779,1,41, -3744,16,0,621,1, -1297,3745,16,0,621, -1,43,3746,16,0, -621,1,1803,787,1, -1804,3747,16,0,621, -1,299,3748,16,0, -621,1,52,3749,16, -0,621,1,2318,3750, -16,0,621,1,62, -3751,16,0,621,1, -2075,3752,16,0,621, -1,1574,799,1,71, -3753,16,0,621,1, -76,3754,16,0,621, -1,1834,3755,16,0, -621,1,2337,3756,16, -0,621,1,79,3757, -16,0,621,1,1335, -3758,16,0,621,1, -322,3759,16,0,621, -1,85,3760,16,0, -621,1,89,3761,16, -0,621,1,346,3762, -16,0,621,1,2105, -814,1,2106,3763,16, -0,621,1,97,3764, -16,0,621,1,1860, -821,1,2364,827,1, -102,3765,16,0,621, -1,112,3766,16,0, -621,1,1117,3767,16, -0,621,1,1873,835, -1,1876,3768,16,0, -621,1,124,3769,16, -0,621,1,2136,842, -1,381,3770,16,0, -621,1,525,3771,16, -0,621,1,137,3772, -16,0,621,1,1901, -3773,16,0,621,1, -2658,3774,16,0,621, -1,1153,3775,16,0, -621,1,151,3776,16, -0,621,1,1407,3777, -16,0,621,1,1659, -3778,16,0,621,1, -2413,3779,16,0,621, -1,406,3780,16,0, -621,1,1371,3781,16, -0,621,1,166,3782, -16,0,621,1,1622, -3783,16,0,621,1, -1931,861,1,1933,3784, -16,0,621,1,431, -3785,16,0,621,1, -1585,3786,16,0,621, -1,182,3787,16,0, -621,1,1189,3788,16, -0,621,1,1443,3789, -16,0,621,1,1695, -3790,16,0,621,1, -2198,3791,16,0,621, -1,447,3792,16,0, -621,1,2458,876,1, -2459,882,1,1958,3793, -16,0,621,1,2462, -889,1,1657,894,1, -2464,899,1,199,3794, -16,0,621,1,459, -3795,16,0,621,1, -462,3796,16,0,621, -1,217,3797,16,0, -621,1,2227,908,1, -1225,3798,16,0,621, -1,1479,3799,16,0, -621,1,1731,3800,16, -0,621,1,1989,916, -1,1990,3801,16,0, -621,1,236,3802,16, -0,621,1,1756,3803, -16,0,621,1,95, -3804,19,620,1,95, -3805,5,95,1,256, -3806,16,0,618,1, -1261,3807,16,0,618, -1,509,3808,16,0, -618,1,1515,3809,16, -0,618,1,2021,718, -1,1775,3810,16,0, -618,1,2029,725,1, -2030,731,1,2031,736, -1,2032,741,1,2033, -746,1,277,3811,16, -0,618,1,2035,752, -1,2037,757,1,2039, -762,1,32,3812,16, -0,618,1,2041,768, -1,2293,3813,16,0, -618,1,2043,774,1, -2045,779,1,41,3814, -16,0,618,1,1297, -3815,16,0,618,1, -43,3816,16,0,618, -1,1803,787,1,1804, -3817,16,0,618,1, -299,3818,16,0,618, -1,52,3819,16,0, -618,1,2318,3820,16, -0,618,1,62,3821, -16,0,618,1,2075, -3822,16,0,618,1, -1574,799,1,71,3823, -16,0,618,1,76, -3824,16,0,618,1, -1834,3825,16,0,618, -1,2337,3826,16,0, -618,1,79,3827,16, -0,618,1,1335,3828, -16,0,618,1,322, -3829,16,0,618,1, -85,3830,16,0,618, -1,89,3831,16,0, -618,1,346,3832,16, -0,618,1,2105,814, -1,2106,3833,16,0, -618,1,97,3834,16, -0,618,1,1860,821, -1,2364,827,1,102, -3835,16,0,618,1, -112,3836,16,0,618, -1,1117,3837,16,0, -618,1,1873,835,1, -1876,3838,16,0,618, -1,124,3839,16,0, -618,1,2136,842,1, -381,3840,16,0,618, -1,525,3841,16,0, -618,1,137,3842,16, -0,618,1,1901,3843, -16,0,618,1,2658, -3844,16,0,618,1, -1153,3845,16,0,618, -1,151,3846,16,0, -618,1,1407,3847,16, -0,618,1,1659,3848, -16,0,618,1,2413, 3849,16,0,618,1, -406,3850,16,0,618, -1,1371,3851,16,0, -618,1,166,3852,16, -0,618,1,1622,3853, -16,0,618,1,1931, -861,1,1933,3854,16, -0,618,1,431,3855, -16,0,618,1,1585, -3856,16,0,618,1, -182,3857,16,0,618, -1,1189,3858,16,0, -618,1,1443,3859,16, -0,618,1,1695,3860, -16,0,618,1,2198, -3861,16,0,618,1, -447,3862,16,0,618, -1,2458,876,1,2459, -882,1,1958,3863,16, -0,618,1,2462,889, -1,1657,894,1,2464, -899,1,199,3864,16, -0,618,1,459,3865, -16,0,618,1,462, -3866,16,0,618,1, -217,3867,16,0,618, -1,2227,908,1,1225, -3868,16,0,618,1, -1479,3869,16,0,618, -1,1731,3870,16,0, -618,1,1989,916,1, -1990,3871,16,0,618, -1,236,3872,16,0, -618,1,1756,3873,16, -0,618,1,96,3874, -19,103,1,96,3875, -5,1,1,0,3876, -16,0,104,1,97, -3877,19,611,1,97, -3878,5,1,1,0, -3879,16,0,609,1, -98,3880,19,636,1, -98,3881,5,2,1, -0,3882,16,0,638, -1,2695,3883,16,0, -634,1,99,3884,19, -633,1,99,3885,5, -2,1,0,3886,16, -0,637,1,2695,3887, -16,0,631,1,100, -3888,19,296,1,100, -3889,5,2,1,0, -3890,16,0,557,1, -2695,3891,16,0,294, -1,101,3892,19,561, -1,101,3893,5,4, -1,0,3894,16,0, -641,1,2695,3895,16, -0,641,1,2706,3896, -16,0,559,1,2636, -3897,16,0,559,1, -102,3898,19,591,1, -102,3899,5,2,1, -2470,3900,16,0,664, -1,2561,3901,16,0, -589,1,103,3902,19, -463,1,103,3903,5, -4,1,2597,3904,16, -0,558,1,2521,3905, -16,0,558,1,2470, -3906,16,0,461,1, -2561,3907,16,0,461, -1,104,3908,19,141, -1,104,3909,5,3, -1,2642,3910,16,0, -569,1,2506,3911,16, -0,317,1,10,3912, -16,0,139,1,105, -3913,19,151,1,105, -3914,5,17,1,0, -3915,16,0,254,1, -2075,3916,16,0,648, -1,2337,3917,16,0, -648,1,2413,3918,16, -0,648,1,10,3919, -16,0,336,1,2198, -3920,16,0,648,1, -1901,3921,16,0,648, -1,2642,3922,16,0, -336,1,21,3923,16, -0,149,1,2106,3924, -16,0,648,1,2506, -3925,16,0,336,1, -1804,3926,16,0,648, -1,1990,3927,16,0, -648,1,2695,3928,16, -0,254,1,32,3929, -16,0,648,1,1958, -3930,16,0,648,1, -1775,3931,16,0,648, -1,106,3932,19,130, -1,106,3933,5,18, -1,0,3934,16,0, -128,1,2642,3935,16, -0,137,1,2075,3936, -16,0,137,1,2337, -3937,16,0,137,1, -2413,3938,16,0,137, -1,10,3939,16,0, -137,1,2198,3940,16, -0,137,1,1901,3941, -16,0,137,1,52, -3942,16,0,193,1, -21,3943,16,0,137, -1,2106,3944,16,0, -137,1,2506,3945,16, -0,137,1,1804,3946, -16,0,137,1,1990, -3947,16,0,137,1, -2695,3948,16,0,128, -1,32,3949,16,0, -137,1,1958,3950,16, -0,137,1,1775,3951, -16,0,137,1,107, -3952,19,658,1,107, -3953,5,4,1,2597, -3954,16,0,656,1, -2521,3955,16,0,656, -1,2470,3956,16,0, -656,1,2561,3957,16, -0,656,1,108,3958, -19,335,1,108,3959, -5,14,1,2517,3960, -16,0,437,1,2075, -3961,16,0,506,1, -2337,3962,16,0,506, -1,2413,3963,16,0, -506,1,1901,3964,16, -0,506,1,2198,3965, -16,0,506,1,2106, -3966,16,0,506,1, -2653,3967,16,0,571, -1,1804,3968,16,0, -506,1,1990,3969,16, -0,506,1,31,3970, -16,0,333,1,32, -3971,16,0,506,1, -1958,3972,16,0,506, -1,1775,3973,16,0, -506,1,109,3974,19, -302,1,109,3975,5, -1,1,32,3976,16, -0,300,1,110,3977, -19,261,1,110,3978, -5,11,1,2075,3979, -16,0,577,1,2337, -3980,16,0,265,1, -2413,3981,16,0,445, -1,1901,3982,16,0, -391,1,2198,3983,16, -0,319,1,2106,3984, -16,0,607,1,1804, -3985,16,0,284,1, -1990,3986,16,0,494, -1,32,3987,16,0, -329,1,1958,3988,16, -0,450,1,1775,3989, -16,0,259,1,111, -3990,19,583,1,111, -3991,5,11,1,2075, -3992,16,0,581,1, -2337,3993,16,0,581, -1,2413,3994,16,0, -581,1,1901,3995,16, -0,581,1,2198,3996, -16,0,581,1,2106, -3997,16,0,581,1, -1804,3998,16,0,581, -1,1990,3999,16,0, -581,1,32,4000,16, -0,581,1,1958,4001, -16,0,581,1,1775, -4002,16,0,581,1, -112,4003,19,645,1, -112,4004,5,11,1, -2075,4005,16,0,643, -1,2337,4006,16,0, -643,1,2413,4007,16, -0,643,1,1901,4008, -16,0,643,1,2198, -4009,16,0,643,1, -2106,4010,16,0,643, -1,1804,4011,16,0, -643,1,1990,4012,16, -0,643,1,32,4013, -16,0,643,1,1958, -4014,16,0,643,1, -1775,4015,16,0,643, -1,113,4016,19,161, -1,113,4017,5,31, -1,1901,4018,16,0, -647,1,1479,4019,16, -0,551,1,2075,4020, -16,0,647,1,1695, -4021,16,0,189,1, -1756,4022,16,0,188, -1,2413,4023,16,0, -647,1,2198,4024,16, -0,647,1,1876,4025, -16,0,661,1,1659, -4026,16,0,188,1, -1443,4027,16,0,522, -1,1117,4028,16,0, -159,1,1990,4029,16, -0,647,1,1189,4030, -16,0,240,1,1775, -4031,16,0,647,1, -32,4032,16,0,647, -1,2106,4033,16,0, -647,1,1515,4034,16, -0,579,1,2337,4035, -16,0,647,1,52, -4036,16,0,592,1, -1804,4037,16,0,647, -1,1261,4038,16,0, -298,1,1153,4039,16, -0,247,1,1225,4040, -16,0,274,1,1335, -4041,16,0,443,1, -1933,4042,16,0,553, -1,1834,4043,16,0, -312,1,1297,4044,16, -0,323,1,1407,4045, -16,0,568,1,2318, -4046,16,0,188,1, -1958,4047,16,0,647, -1,1371,4048,16,0, -438,1,114,4049,19, -531,1,114,4050,5, -11,1,2075,4051,16, -0,529,1,2337,4052, -16,0,529,1,2413, -4053,16,0,529,1, -1901,4054,16,0,529, -1,2198,4055,16,0, -529,1,2106,4056,16, -0,529,1,1804,4057, -16,0,529,1,1990, -4058,16,0,529,1, -32,4059,16,0,529, -1,1958,4060,16,0, -529,1,1775,4061,16, -0,529,1,115,4062, -19,527,1,115,4063, -5,11,1,2075,4064, -16,0,525,1,2337, -4065,16,0,525,1, -2413,4066,16,0,525, -1,1901,4067,16,0, -525,1,2198,4068,16, -0,525,1,2106,4069, -16,0,525,1,1804, -4070,16,0,525,1, -1990,4071,16,0,525, -1,32,4072,16,0, -525,1,1958,4073,16, -0,525,1,1775,4074, -16,0,525,1,116, -4075,19,575,1,116, -4076,5,11,1,2075, -4077,16,0,573,1, -2337,4078,16,0,573, -1,2413,4079,16,0, -573,1,1901,4080,16, -0,573,1,2198,4081, -16,0,573,1,2106, -4082,16,0,573,1, -1804,4083,16,0,573, -1,1990,4084,16,0, -573,1,32,4085,16, -0,573,1,1958,4086, -16,0,573,1,1775, -4087,16,0,573,1, -117,4088,19,521,1, -117,4089,5,11,1, -2075,4090,16,0,519, -1,2337,4091,16,0, -519,1,2413,4092,16, -0,519,1,1901,4093, -16,0,519,1,2198, -4094,16,0,519,1, -2106,4095,16,0,519, -1,1804,4096,16,0, -519,1,1990,4097,16, -0,519,1,32,4098, -16,0,519,1,1958, -4099,16,0,519,1, -1775,4100,16,0,519, -1,118,4101,19,518, -1,118,4102,5,11, -1,2075,4103,16,0, -516,1,2337,4104,16, -0,516,1,2413,4105, -16,0,516,1,1901, -4106,16,0,516,1, -2198,4107,16,0,516, -1,2106,4108,16,0, -516,1,1804,4109,16, -0,516,1,1990,4110, -16,0,516,1,32, -4111,16,0,516,1, -1958,4112,16,0,516, -1,1775,4113,16,0, -516,1,119,4114,19, -515,1,119,4115,5, -11,1,2075,4116,16, -0,513,1,2337,4117, -16,0,513,1,2413, -4118,16,0,513,1, -1901,4119,16,0,513, -1,2198,4120,16,0, -513,1,2106,4121,16, -0,513,1,1804,4122, -16,0,513,1,1990, -4123,16,0,513,1, -32,4124,16,0,513, -1,1958,4125,16,0, -513,1,1775,4126,16, -0,513,1,120,4127, -19,512,1,120,4128, -5,11,1,2075,4129, -16,0,510,1,2337, -4130,16,0,510,1, -2413,4131,16,0,510, -1,1901,4132,16,0, -510,1,2198,4133,16, -0,510,1,2106,4134, -16,0,510,1,1804, -4135,16,0,510,1, -1990,4136,16,0,510, -1,32,4137,16,0, -510,1,1958,4138,16, -0,510,1,1775,4139, -16,0,510,1,121, -4140,19,509,1,121, -4141,5,11,1,2075, -4142,16,0,507,1, -2337,4143,16,0,507, -1,2413,4144,16,0, -507,1,1901,4145,16, -0,507,1,2198,4146, -16,0,507,1,2106, -4147,16,0,507,1, -1804,4148,16,0,507, -1,1990,4149,16,0, -507,1,32,4150,16, -0,507,1,1958,4151, -16,0,507,1,1775, -4152,16,0,507,1, -122,4153,19,147,1, -122,4154,5,3,1, -1756,4155,16,0,283, -1,2318,4156,16,0, -297,1,1659,4157,16, -0,145,1,123,4158, -19,548,1,123,4159, -5,68,1,1901,4160, -16,0,546,1,1479, -4161,16,0,546,1, -112,4162,16,0,546, -1,2293,4163,16,0, -546,1,1804,4164,16, -0,546,1,431,4165, -16,0,546,1,1443, -4166,16,0,546,1, -1756,4167,16,0,546, -1,124,4168,16,0, -546,1,525,4169,16, -0,546,1,236,4170, -16,0,546,1,346, -4171,16,0,546,1, -1876,4172,16,0,546, -1,1659,4173,16,0, -546,1,1225,4174,16, -0,546,1,1117,4175, -16,0,546,1,137, -4176,16,0,546,1, -2318,4177,16,0,546, -1,1775,4178,16,0, -546,1,32,4179,16, -0,546,1,1407,4180, -16,0,546,1,256, -4181,16,0,546,1, -459,4182,16,0,546, -1,406,4183,16,0, -546,1,41,4184,16, -0,546,1,2658,4185, -16,0,546,1,43, -4186,16,0,546,1, -1585,4187,16,0,546, -1,1990,4188,16,0, -546,1,2337,4189,16, -0,546,1,509,4190, -16,0,546,1,52, -4191,16,0,546,1, -151,4192,16,0,546, -1,447,4193,16,0, -546,1,166,4194,16, -0,546,1,462,4195, -16,0,546,1,277, -4196,16,0,546,1, -1695,4197,16,0,546, -1,62,4198,16,0, -586,1,1153,4199,16, -0,546,1,381,4200, -16,0,546,1,2106, -4201,16,0,546,1, -1335,4202,16,0,546, -1,71,4203,16,0, -546,1,182,4204,16, -0,546,1,76,4205, -16,0,546,1,79, -4206,16,0,546,1, -1933,4207,16,0,546, -1,299,4208,16,0, -546,1,85,4209,16, -0,546,1,1515,4210, -16,0,546,1,2198, -4211,16,0,546,1, -89,4212,16,0,546, -1,1834,4213,16,0, -546,1,1622,4214,16, -0,546,1,2413,4215, -16,0,546,1,2075, -4216,16,0,546,1, -1731,4217,16,0,546, -1,97,4218,16,0, -546,1,1297,4219,16, -0,546,1,1189,4220, -16,0,546,1,102, -4221,16,0,546,1, -1261,4222,16,0,546, -1,322,4223,16,0, -546,1,1958,4224,16, -0,546,1,199,4225, -16,0,546,1,1371, -4226,16,0,546,1, -217,4227,16,0,546, -1,124,4228,19,602, -1,124,4229,5,2, -1,459,4230,16,0, -600,1,41,4231,16, -0,665,1,125,4232, -19,606,1,125,4233, -5,3,1,462,4234, -16,0,604,1,459, -4235,16,0,630,1, -41,4236,16,0,630, -1,126,4237,19,4238, -4,36,69,0,120, -0,112,0,114,0, -101,0,115,0,115, -0,105,0,111,0, -110,0,65,0,114, -0,103,0,117,0, -109,0,101,0,110, -0,116,0,1,126, -4233,1,127,4239,19, -544,1,127,4240,5, -68,1,1901,4241,16, -0,542,1,1479,4242, -16,0,542,1,112, -4243,16,0,542,1, -2293,4244,16,0,542, -1,1804,4245,16,0, -542,1,431,4246,16, -0,542,1,1443,4247, -16,0,542,1,1756, -4248,16,0,542,1, -124,4249,16,0,542, -1,525,4250,16,0, -542,1,236,4251,16, -0,542,1,346,4252, -16,0,542,1,1876, -4253,16,0,542,1, -1659,4254,16,0,542, -1,1225,4255,16,0, -542,1,1117,4256,16, -0,542,1,137,4257, -16,0,542,1,2318, -4258,16,0,542,1, -1775,4259,16,0,542, -1,32,4260,16,0, -542,1,1407,4261,16, -0,542,1,256,4262, -16,0,542,1,459, -4263,16,0,542,1, -406,4264,16,0,542, -1,41,4265,16,0, -542,1,2658,4266,16, -0,542,1,43,4267, -16,0,542,1,1585, -4268,16,0,542,1, -1990,4269,16,0,542, -1,2337,4270,16,0, -542,1,509,4271,16, -0,542,1,52,4272, -16,0,542,1,151, -4273,16,0,542,1, -447,4274,16,0,542, -1,166,4275,16,0, -542,1,462,4276,16, -0,542,1,277,4277, -16,0,542,1,1695, -4278,16,0,542,1, -62,4279,16,0,587, -1,1153,4280,16,0, -542,1,381,4281,16, -0,542,1,2106,4282, -16,0,542,1,1335, -4283,16,0,542,1, -71,4284,16,0,542, -1,182,4285,16,0, -542,1,76,4286,16, -0,542,1,79,4287, -16,0,542,1,1933, -4288,16,0,542,1, -299,4289,16,0,542, -1,85,4290,16,0, -542,1,1515,4291,16, -0,542,1,2198,4292, -16,0,542,1,89, -4293,16,0,542,1, -1834,4294,16,0,542, -1,1622,4295,16,0, -542,1,2413,4296,16, -0,542,1,2075,4297, -16,0,542,1,1731, -4298,16,0,542,1, -97,4299,16,0,542, -1,1297,4300,16,0, -542,1,1189,4301,16, -0,542,1,102,4302, -16,0,542,1,1261, -4303,16,0,542,1, -322,4304,16,0,542, -1,1958,4305,16,0, -542,1,199,4306,16, -0,542,1,1371,4307, -16,0,542,1,217, -4308,16,0,542,1, -128,4309,19,4310,4, -28,86,0,101,0, -99,0,116,0,111, -0,114,0,67,0, +2043,774,1,2045,779, +1,41,3850,16,0, +618,1,1297,3851,16, +0,618,1,43,3852, +16,0,618,1,1803, +787,1,1804,3853,16, +0,618,1,299,3854, +16,0,618,1,52, +3855,16,0,618,1, +2318,3856,16,0,618, +1,62,3857,16,0, +618,1,2075,3858,16, +0,618,1,1574,799, +1,71,3859,16,0, +618,1,76,3860,16, +0,618,1,1834,3861, +16,0,618,1,2337, +3862,16,0,618,1, +79,3863,16,0,618, +1,1335,3864,16,0, +618,1,322,3865,16, +0,618,1,85,3866, +16,0,618,1,89, +3867,16,0,618,1, +346,3868,16,0,618, +1,2105,814,1,2106, +3869,16,0,618,1, +97,3870,16,0,618, +1,1860,821,1,2364, +827,1,102,3871,16, +0,618,1,112,3872, +16,0,618,1,1117, +3873,16,0,618,1, +1873,835,1,1876,3874, +16,0,618,1,124, +3875,16,0,618,1, +2136,842,1,381,3876, +16,0,618,1,525, +3877,16,0,618,1, +137,3878,16,0,618, +1,1901,3879,16,0, +618,1,2658,3880,16, +0,618,1,1153,3881, +16,0,618,1,151, +3882,16,0,618,1, +1407,3883,16,0,618, +1,1659,3884,16,0, +618,1,2413,3885,16, +0,618,1,406,3886, +16,0,618,1,1371, +3887,16,0,618,1, +166,3888,16,0,618, +1,1622,3889,16,0, +618,1,1931,861,1, +1933,3890,16,0,618, +1,431,3891,16,0, +618,1,1585,3892,16, +0,618,1,182,3893, +16,0,618,1,1189, +3894,16,0,618,1, +1443,3895,16,0,618, +1,1695,3896,16,0, +618,1,2198,3897,16, +0,618,1,447,3898, +16,0,618,1,2458, +876,1,2459,882,1, +1958,3899,16,0,618, +1,2462,889,1,1657, +894,1,2464,899,1, +199,3900,16,0,618, +1,459,3901,16,0, +618,1,462,3902,16, +0,618,1,217,3903, +16,0,618,1,2227, +908,1,1225,3904,16, +0,618,1,1479,3905, +16,0,618,1,1731, +3906,16,0,618,1, +1989,916,1,1990,3907, +16,0,618,1,236, +3908,16,0,618,1, +1756,3909,16,0,618, +1,96,3910,19,103, +1,96,3911,5,1, +1,0,3912,16,0, +104,1,97,3913,19, +611,1,97,3914,5, +1,1,0,3915,16, +0,609,1,98,3916, +19,636,1,98,3917, +5,2,1,0,3918, +16,0,638,1,2695, +3919,16,0,634,1, +99,3920,19,633,1, +99,3921,5,2,1, +0,3922,16,0,637, +1,2695,3923,16,0, +631,1,100,3924,19, +296,1,100,3925,5, +2,1,0,3926,16, +0,557,1,2695,3927, +16,0,294,1,101, +3928,19,561,1,101, +3929,5,4,1,0, +3930,16,0,641,1, +2695,3931,16,0,641, +1,2706,3932,16,0, +559,1,2636,3933,16, +0,559,1,102,3934, +19,591,1,102,3935, +5,2,1,2470,3936, +16,0,664,1,2561, +3937,16,0,589,1, +103,3938,19,463,1, +103,3939,5,4,1, +2597,3940,16,0,558, +1,2521,3941,16,0, +558,1,2470,3942,16, +0,461,1,2561,3943, +16,0,461,1,104, +3944,19,141,1,104, +3945,5,3,1,2642, +3946,16,0,569,1, +2506,3947,16,0,317, +1,10,3948,16,0, +139,1,105,3949,19, +151,1,105,3950,5, +17,1,0,3951,16, +0,254,1,2075,3952, +16,0,648,1,2337, +3953,16,0,648,1, +2413,3954,16,0,648, +1,10,3955,16,0, +336,1,2198,3956,16, +0,648,1,1901,3957, +16,0,648,1,2642, +3958,16,0,336,1, +21,3959,16,0,149, +1,2106,3960,16,0, +648,1,2506,3961,16, +0,336,1,1804,3962, +16,0,648,1,1990, +3963,16,0,648,1, +2695,3964,16,0,254, +1,32,3965,16,0, +648,1,1958,3966,16, +0,648,1,1775,3967, +16,0,648,1,106, +3968,19,130,1,106, +3969,5,18,1,0, +3970,16,0,128,1, +2642,3971,16,0,137, +1,2075,3972,16,0, +137,1,2337,3973,16, +0,137,1,2413,3974, +16,0,137,1,10, +3975,16,0,137,1, +2198,3976,16,0,137, +1,1901,3977,16,0, +137,1,52,3978,16, +0,193,1,21,3979, +16,0,137,1,2106, +3980,16,0,137,1, +2506,3981,16,0,137, +1,1804,3982,16,0, +137,1,1990,3983,16, +0,137,1,2695,3984, +16,0,128,1,32, +3985,16,0,137,1, +1958,3986,16,0,137, +1,1775,3987,16,0, +137,1,107,3988,19, +658,1,107,3989,5, +4,1,2597,3990,16, +0,656,1,2521,3991, +16,0,656,1,2470, +3992,16,0,656,1, +2561,3993,16,0,656, +1,108,3994,19,335, +1,108,3995,5,14, +1,2517,3996,16,0, +437,1,2075,3997,16, +0,506,1,2337,3998, +16,0,506,1,2413, +3999,16,0,506,1, +1901,4000,16,0,506, +1,2198,4001,16,0, +506,1,2106,4002,16, +0,506,1,2653,4003, +16,0,571,1,1804, +4004,16,0,506,1, +1990,4005,16,0,506, +1,31,4006,16,0, +333,1,32,4007,16, +0,506,1,1958,4008, +16,0,506,1,1775, +4009,16,0,506,1, +109,4010,19,302,1, +109,4011,5,1,1, +32,4012,16,0,300, +1,110,4013,19,261, +1,110,4014,5,11, +1,2075,4015,16,0, +577,1,2337,4016,16, +0,265,1,2413,4017, +16,0,445,1,1901, +4018,16,0,391,1, +2198,4019,16,0,319, +1,2106,4020,16,0, +607,1,1804,4021,16, +0,284,1,1990,4022, +16,0,494,1,32, +4023,16,0,329,1, +1958,4024,16,0,450, +1,1775,4025,16,0, +259,1,111,4026,19, +583,1,111,4027,5, +11,1,2075,4028,16, +0,581,1,2337,4029, +16,0,581,1,2413, +4030,16,0,581,1, +1901,4031,16,0,581, +1,2198,4032,16,0, +581,1,2106,4033,16, +0,581,1,1804,4034, +16,0,581,1,1990, +4035,16,0,581,1, +32,4036,16,0,581, +1,1958,4037,16,0, +581,1,1775,4038,16, +0,581,1,112,4039, +19,645,1,112,4040, +5,11,1,2075,4041, +16,0,643,1,2337, +4042,16,0,643,1, +2413,4043,16,0,643, +1,1901,4044,16,0, +643,1,2198,4045,16, +0,643,1,2106,4046, +16,0,643,1,1804, +4047,16,0,643,1, +1990,4048,16,0,643, +1,32,4049,16,0, +643,1,1958,4050,16, +0,643,1,1775,4051, +16,0,643,1,113, +4052,19,161,1,113, +4053,5,31,1,1901, +4054,16,0,647,1, +1479,4055,16,0,551, +1,2075,4056,16,0, +647,1,1695,4057,16, +0,189,1,1756,4058, +16,0,188,1,2413, +4059,16,0,647,1, +2198,4060,16,0,647, +1,1876,4061,16,0, +661,1,1659,4062,16, +0,188,1,1443,4063, +16,0,522,1,1117, +4064,16,0,159,1, +1990,4065,16,0,647, +1,1189,4066,16,0, +240,1,1775,4067,16, +0,647,1,32,4068, +16,0,647,1,2106, +4069,16,0,647,1, +1515,4070,16,0,579, +1,2337,4071,16,0, +647,1,52,4072,16, +0,592,1,1804,4073, +16,0,647,1,1261, +4074,16,0,298,1, +1153,4075,16,0,247, +1,1225,4076,16,0, +274,1,1335,4077,16, +0,443,1,1933,4078, +16,0,553,1,1834, +4079,16,0,312,1, +1297,4080,16,0,323, +1,1407,4081,16,0, +568,1,2318,4082,16, +0,188,1,1958,4083, +16,0,647,1,1371, +4084,16,0,438,1, +114,4085,19,531,1, +114,4086,5,11,1, +2075,4087,16,0,529, +1,2337,4088,16,0, +529,1,2413,4089,16, +0,529,1,1901,4090, +16,0,529,1,2198, +4091,16,0,529,1, +2106,4092,16,0,529, +1,1804,4093,16,0, +529,1,1990,4094,16, +0,529,1,32,4095, +16,0,529,1,1958, +4096,16,0,529,1, +1775,4097,16,0,529, +1,115,4098,19,527, +1,115,4099,5,11, +1,2075,4100,16,0, +525,1,2337,4101,16, +0,525,1,2413,4102, +16,0,525,1,1901, +4103,16,0,525,1, +2198,4104,16,0,525, +1,2106,4105,16,0, +525,1,1804,4106,16, +0,525,1,1990,4107, +16,0,525,1,32, +4108,16,0,525,1, +1958,4109,16,0,525, +1,1775,4110,16,0, +525,1,116,4111,19, +575,1,116,4112,5, +11,1,2075,4113,16, +0,573,1,2337,4114, +16,0,573,1,2413, +4115,16,0,573,1, +1901,4116,16,0,573, +1,2198,4117,16,0, +573,1,2106,4118,16, +0,573,1,1804,4119, +16,0,573,1,1990, +4120,16,0,573,1, +32,4121,16,0,573, +1,1958,4122,16,0, +573,1,1775,4123,16, +0,573,1,117,4124, +19,521,1,117,4125, +5,11,1,2075,4126, +16,0,519,1,2337, +4127,16,0,519,1, +2413,4128,16,0,519, +1,1901,4129,16,0, +519,1,2198,4130,16, +0,519,1,2106,4131, +16,0,519,1,1804, +4132,16,0,519,1, +1990,4133,16,0,519, +1,32,4134,16,0, +519,1,1958,4135,16, +0,519,1,1775,4136, +16,0,519,1,118, +4137,19,518,1,118, +4138,5,11,1,2075, +4139,16,0,516,1, +2337,4140,16,0,516, +1,2413,4141,16,0, +516,1,1901,4142,16, +0,516,1,2198,4143, +16,0,516,1,2106, +4144,16,0,516,1, +1804,4145,16,0,516, +1,1990,4146,16,0, +516,1,32,4147,16, +0,516,1,1958,4148, +16,0,516,1,1775, +4149,16,0,516,1, +119,4150,19,515,1, +119,4151,5,11,1, +2075,4152,16,0,513, +1,2337,4153,16,0, +513,1,2413,4154,16, +0,513,1,1901,4155, +16,0,513,1,2198, +4156,16,0,513,1, +2106,4157,16,0,513, +1,1804,4158,16,0, +513,1,1990,4159,16, +0,513,1,32,4160, +16,0,513,1,1958, +4161,16,0,513,1, +1775,4162,16,0,513, +1,120,4163,19,512, +1,120,4164,5,11, +1,2075,4165,16,0, +510,1,2337,4166,16, +0,510,1,2413,4167, +16,0,510,1,1901, +4168,16,0,510,1, +2198,4169,16,0,510, +1,2106,4170,16,0, +510,1,1804,4171,16, +0,510,1,1990,4172, +16,0,510,1,32, +4173,16,0,510,1, +1958,4174,16,0,510, +1,1775,4175,16,0, +510,1,121,4176,19, +509,1,121,4177,5, +11,1,2075,4178,16, +0,507,1,2337,4179, +16,0,507,1,2413, +4180,16,0,507,1, +1901,4181,16,0,507, +1,2198,4182,16,0, +507,1,2106,4183,16, +0,507,1,1804,4184, +16,0,507,1,1990, +4185,16,0,507,1, +32,4186,16,0,507, +1,1958,4187,16,0, +507,1,1775,4188,16, +0,507,1,122,4189, +19,147,1,122,4190, +5,3,1,1756,4191, +16,0,283,1,2318, +4192,16,0,297,1, +1659,4193,16,0,145, +1,123,4194,19,548, +1,123,4195,5,68, +1,1901,4196,16,0, +546,1,1479,4197,16, +0,546,1,112,4198, +16,0,546,1,2293, +4199,16,0,546,1, +1804,4200,16,0,546, +1,431,4201,16,0, +546,1,1443,4202,16, +0,546,1,1756,4203, +16,0,546,1,124, +4204,16,0,546,1, +525,4205,16,0,546, +1,236,4206,16,0, +546,1,346,4207,16, +0,546,1,1876,4208, +16,0,546,1,1659, +4209,16,0,546,1, +1225,4210,16,0,546, +1,1117,4211,16,0, +546,1,137,4212,16, +0,546,1,2318,4213, +16,0,546,1,1775, +4214,16,0,546,1, +32,4215,16,0,546, +1,1407,4216,16,0, +546,1,256,4217,16, +0,546,1,459,4218, +16,0,546,1,406, +4219,16,0,546,1, +41,4220,16,0,546, +1,2658,4221,16,0, +546,1,43,4222,16, +0,546,1,1585,4223, +16,0,546,1,1990, +4224,16,0,546,1, +2337,4225,16,0,546, +1,509,4226,16,0, +546,1,52,4227,16, +0,546,1,151,4228, +16,0,546,1,447, +4229,16,0,546,1, +166,4230,16,0,546, +1,462,4231,16,0, +546,1,277,4232,16, +0,546,1,1695,4233, +16,0,546,1,62, +4234,16,0,586,1, +1153,4235,16,0,546, +1,381,4236,16,0, +546,1,2106,4237,16, +0,546,1,1335,4238, +16,0,546,1,71, +4239,16,0,546,1, +182,4240,16,0,546, +1,76,4241,16,0, +546,1,79,4242,16, +0,546,1,1933,4243, +16,0,546,1,299, +4244,16,0,546,1, +85,4245,16,0,546, +1,1515,4246,16,0, +546,1,2198,4247,16, +0,546,1,89,4248, +16,0,546,1,1834, +4249,16,0,546,1, +1622,4250,16,0,546, +1,2413,4251,16,0, +546,1,2075,4252,16, +0,546,1,1731,4253, +16,0,546,1,97, +4254,16,0,546,1, +1297,4255,16,0,546, +1,1189,4256,16,0, +546,1,102,4257,16, +0,546,1,1261,4258, +16,0,546,1,322, +4259,16,0,546,1, +1958,4260,16,0,546, +1,199,4261,16,0, +546,1,1371,4262,16, +0,546,1,217,4263, +16,0,546,1,124, +4264,19,602,1,124, +4265,5,2,1,459, +4266,16,0,600,1, +41,4267,16,0,665, +1,125,4268,19,606, +1,125,4269,5,3, +1,462,4270,16,0, +604,1,459,4271,16, +0,630,1,41,4272, +16,0,630,1,126, +4273,19,4274,4,36, +69,0,120,0,112, +0,114,0,101,0, +115,0,115,0,105, +0,111,0,110,0, +65,0,114,0,103, +0,117,0,109,0, +101,0,110,0,116, +0,1,126,4269,1, +127,4275,19,544,1, +127,4276,5,68,1, +1901,4277,16,0,542, +1,1479,4278,16,0, +542,1,112,4279,16, +0,542,1,2293,4280, +16,0,542,1,1804, +4281,16,0,542,1, +431,4282,16,0,542, +1,1443,4283,16,0, +542,1,1756,4284,16, +0,542,1,124,4285, +16,0,542,1,525, +4286,16,0,542,1, +236,4287,16,0,542, +1,346,4288,16,0, +542,1,1876,4289,16, +0,542,1,1659,4290, +16,0,542,1,1225, +4291,16,0,542,1, +1117,4292,16,0,542, +1,137,4293,16,0, +542,1,2318,4294,16, +0,542,1,1775,4295, +16,0,542,1,32, +4296,16,0,542,1, +1407,4297,16,0,542, +1,256,4298,16,0, +542,1,459,4299,16, +0,542,1,406,4300, +16,0,542,1,41, +4301,16,0,542,1, +2658,4302,16,0,542, +1,43,4303,16,0, +542,1,1585,4304,16, +0,542,1,1990,4305, +16,0,542,1,2337, +4306,16,0,542,1, +509,4307,16,0,542, +1,52,4308,16,0, +542,1,151,4309,16, +0,542,1,447,4310, +16,0,542,1,166, +4311,16,0,542,1, +462,4312,16,0,542, +1,277,4313,16,0, +542,1,1695,4314,16, +0,542,1,62,4315, +16,0,587,1,1153, +4316,16,0,542,1, +381,4317,16,0,542, +1,2106,4318,16,0, +542,1,1335,4319,16, +0,542,1,71,4320, +16,0,542,1,182, +4321,16,0,542,1, +76,4322,16,0,542, +1,79,4323,16,0, +542,1,1933,4324,16, +0,542,1,299,4325, +16,0,542,1,85, +4326,16,0,542,1, +1515,4327,16,0,542, +1,2198,4328,16,0, +542,1,89,4329,16, +0,542,1,1834,4330, +16,0,542,1,1622, +4331,16,0,542,1, +2413,4332,16,0,542, +1,2075,4333,16,0, +542,1,1731,4334,16, +0,542,1,97,4335, +16,0,542,1,1297, +4336,16,0,542,1, +1189,4337,16,0,542, +1,102,4338,16,0, +542,1,1261,4339,16, +0,542,1,322,4340, +16,0,542,1,1958, +4341,16,0,542,1, +199,4342,16,0,542, +1,1371,4343,16,0, +542,1,217,4344,16, +0,542,1,128,4345, +19,4346,4,28,86, +0,101,0,99,0, +116,0,111,0,114, +0,67,0,111,0, +110,0,115,0,116, +0,97,0,110,0, +116,0,1,128,4276, +1,129,4347,19,4348, +4,32,82,0,111, +0,116,0,97,0, +116,0,105,0,111, +0,110,0,67,0, 111,0,110,0,115, 0,116,0,97,0, 110,0,116,0,1, -128,4240,1,129,4311, -19,4312,4,32,82, -0,111,0,116,0, -97,0,116,0,105, -0,111,0,110,0, +129,4276,1,130,4349, +19,4350,4,24,76, +0,105,0,115,0, +116,0,67,0,111, +0,110,0,115,0, +116,0,97,0,110, +0,116,0,1,130, +4276,1,131,4351,19, +169,1,131,4352,5, +67,1,1901,4353,16, +0,585,1,1479,4354, +16,0,533,1,112, +4355,16,0,249,1, +2293,4356,16,0,273, +1,1804,4357,16,0, +585,1,431,4358,16, +0,580,1,1443,4359, +16,0,468,1,1756, +4360,16,0,673,1, +124,4361,16,0,258, +1,525,4362,16,0, +305,1,236,4363,16, +0,341,1,346,4364, +16,0,496,1,1876, +4365,16,0,318,1, +1659,4366,16,0,673, +1,1225,4367,16,0, +248,1,1117,4368,16, +0,219,1,137,4369, +16,0,272,1,2318, +4370,16,0,673,1, +1775,4371,16,0,585, +1,32,4372,16,0, +585,1,1407,4373,16, +0,487,1,256,4374, +16,0,395,1,459, +4375,16,0,167,1, +406,4376,16,0,562, +1,41,4377,16,0, +167,1,2658,4378,16, +0,659,1,43,4379, +16,0,640,1,1990, +4380,16,0,585,1, +2337,4381,16,0,585, +1,509,4382,16,0, +655,1,52,4383,16, +0,594,1,151,4384, +16,0,282,1,447, +4385,16,0,305,1, +166,4386,16,0,293, +1,462,4387,16,0, +167,1,277,4388,16, +0,434,1,1695,4389, +16,0,270,1,1261, +4390,16,0,281,1, +1153,4391,16,0,174, +1,381,4392,16,0, +550,1,2106,4393,16, +0,585,1,1335,4394, +16,0,326,1,71, +4395,16,0,203,1, +182,4396,16,0,305, +1,76,4397,16,0, +549,1,79,4398,16, +0,218,1,1933,4399, +16,0,407,1,299, +4400,16,0,444,1, +85,4401,16,0,457, +1,1515,4402,16,0, +556,1,2198,4403,16, +0,585,1,89,4404, +16,0,227,1,1834, +4405,16,0,292,1, +1622,4406,16,0,654, +1,2413,4407,16,0, +585,1,2075,4408,16, +0,585,1,1731,4409, +16,0,250,1,97, +4410,16,0,411,1, +1297,4411,16,0,328, +1,1189,4412,16,0, +217,1,102,4413,16, +0,238,1,1585,4414, +16,0,663,1,322, +4415,16,0,458,1, +1958,4416,16,0,585, +1,199,4417,16,0, +316,1,1371,4418,16, +0,396,1,217,4419, +16,0,325,1,132, +4420,19,4421,4,36, 67,0,111,0,110, 0,115,0,116,0, 97,0,110,0,116, -0,1,129,4240,1, -130,4313,19,4314,4, -24,76,0,105,0, -115,0,116,0,67, -0,111,0,110,0, -115,0,116,0,97, -0,110,0,116,0, -1,130,4240,1,131, -4315,19,169,1,131, -4316,5,67,1,1901, -4317,16,0,585,1, -1479,4318,16,0,533, -1,112,4319,16,0, -249,1,2293,4320,16, -0,273,1,1804,4321, -16,0,585,1,431, -4322,16,0,580,1, -1443,4323,16,0,468, -1,1756,4324,16,0, -673,1,124,4325,16, -0,258,1,525,4326, -16,0,305,1,236, -4327,16,0,341,1, -346,4328,16,0,496, -1,1876,4329,16,0, -318,1,1659,4330,16, -0,673,1,1225,4331, -16,0,248,1,1117, -4332,16,0,219,1, -137,4333,16,0,272, -1,2318,4334,16,0, -673,1,1775,4335,16, -0,585,1,32,4336, -16,0,585,1,1407, -4337,16,0,487,1, -256,4338,16,0,395, -1,459,4339,16,0, -167,1,406,4340,16, -0,562,1,41,4341, -16,0,167,1,2658, -4342,16,0,659,1, -43,4343,16,0,640, -1,1990,4344,16,0, -585,1,2337,4345,16, -0,585,1,509,4346, -16,0,655,1,52, -4347,16,0,594,1, -151,4348,16,0,282, -1,447,4349,16,0, -305,1,166,4350,16, -0,293,1,462,4351, -16,0,167,1,277, -4352,16,0,434,1, -1695,4353,16,0,270, -1,1261,4354,16,0, -281,1,1153,4355,16, -0,174,1,381,4356, -16,0,550,1,2106, -4357,16,0,585,1, -1335,4358,16,0,326, -1,71,4359,16,0, -203,1,182,4360,16, -0,305,1,76,4361, -16,0,549,1,79, -4362,16,0,218,1, -1933,4363,16,0,407, -1,299,4364,16,0, -444,1,85,4365,16, -0,457,1,1515,4366, -16,0,556,1,2198, -4367,16,0,585,1, -89,4368,16,0,227, -1,1834,4369,16,0, -292,1,1622,4370,16, -0,654,1,2413,4371, -16,0,585,1,2075, -4372,16,0,585,1, -1731,4373,16,0,250, -1,97,4374,16,0, -411,1,1297,4375,16, -0,328,1,1189,4376, -16,0,217,1,102, -4377,16,0,238,1, -1585,4378,16,0,663, -1,322,4379,16,0, -458,1,1958,4380,16, -0,585,1,199,4381, -16,0,316,1,1371, -4382,16,0,396,1, -217,4383,16,0,325, -1,132,4384,19,4385, -4,36,67,0,111, -0,110,0,115,0, -116,0,97,0,110, -0,116,0,69,0, -120,0,112,0,114, -0,101,0,115,0, -115,0,105,0,111, -0,110,0,1,132, -4316,1,133,4386,19, -4387,4,30,73,0, -100,0,101,0,110, -0,116,0,69,0, -120,0,112,0,114, -0,101,0,115,0, -115,0,105,0,111, -0,110,0,1,133, -4316,1,134,4388,19, -4389,4,36,73,0, -100,0,101,0,110, -0,116,0,68,0, -111,0,116,0,69, -0,120,0,112,0, -114,0,101,0,115, -0,115,0,105,0, -111,0,110,0,1, -134,4316,1,135,4390, -19,4391,4,44,70, -0,117,0,110,0, -99,0,116,0,105, -0,111,0,110,0, -67,0,97,0,108, -0,108,0,69,0, -120,0,112,0,114, -0,101,0,115,0, -115,0,105,0,111, -0,110,0,1,135, -4316,1,136,4392,19, -4393,4,32,66,0, -105,0,110,0,97, -0,114,0,121,0, -69,0,120,0,112, -0,114,0,101,0, -115,0,115,0,105, -0,111,0,110,0, -1,136,4316,1,137, -4394,19,4395,4,30, -85,0,110,0,97, -0,114,0,121,0, -69,0,120,0,112, -0,114,0,101,0, -115,0,115,0,105, -0,111,0,110,0, -1,137,4316,1,138, -4396,19,4397,4,36, -84,0,121,0,112, -0,101,0,99,0, -97,0,115,0,116, 0,69,0,120,0, 112,0,114,0,101, 0,115,0,115,0, 105,0,111,0,110, -0,1,138,4316,1, -139,4398,19,4399,4, -42,80,0,97,0, -114,0,101,0,110, -0,116,0,104,0, -101,0,115,0,105, -0,115,0,69,0, +0,1,132,4352,1, +133,4422,19,4423,4, +30,73,0,100,0, +101,0,110,0,116, +0,69,0,120,0, +112,0,114,0,101, +0,115,0,115,0, +105,0,111,0,110, +0,1,133,4352,1, +134,4424,19,4425,4, +36,73,0,100,0, +101,0,110,0,116, +0,68,0,111,0, +116,0,69,0,120, +0,112,0,114,0, +101,0,115,0,115, +0,105,0,111,0, +110,0,1,134,4352, +1,135,4426,19,4427, +4,44,70,0,117, +0,110,0,99,0, +116,0,105,0,111, +0,110,0,67,0, +97,0,108,0,108, +0,69,0,120,0, +112,0,114,0,101, +0,115,0,115,0, +105,0,111,0,110, +0,1,135,4352,1, +136,4428,19,4429,4, +32,66,0,105,0, +110,0,97,0,114, +0,121,0,69,0, 120,0,112,0,114, 0,101,0,115,0, 115,0,105,0,111, -0,110,0,1,139, -4316,1,140,4400,19, -4401,4,56,73,0, -110,0,99,0,114, -0,101,0,109,0, -101,0,110,0,116, -0,68,0,101,0, -99,0,114,0,101, -0,109,0,101,0, -110,0,116,0,69, +0,110,0,1,136, +4352,1,137,4430,19, +4431,4,30,85,0, +110,0,97,0,114, +0,121,0,69,0, +120,0,112,0,114, +0,101,0,115,0, +115,0,105,0,111, +0,110,0,1,137, +4352,1,138,4432,19, +4433,4,36,84,0, +121,0,112,0,101, +0,99,0,97,0, +115,0,116,0,69, 0,120,0,112,0, 114,0,101,0,115, 0,115,0,105,0, 111,0,110,0,1, -140,4316,1,142,4402, -19,683,1,142,3875, -1,143,4403,19,705, -1,143,3875,1,144, -4404,19,3156,1,144, -3878,1,145,4405,19, -3151,1,145,3878,1, -146,4406,19,3162,1, -146,3878,1,147,4407, -19,3173,1,147,3878, -1,148,4408,19,3184, -1,148,3881,1,149, -4409,19,3190,1,149, -3881,1,150,4410,19, -3178,1,150,3885,1, -151,4411,19,3168,1, -151,3885,1,152,4412, -19,689,1,152,3889, -1,153,4413,19,710, -1,153,3889,1,154, -4414,19,695,1,154, -3893,1,155,4415,19, -700,1,155,3893,1, -156,4416,19,1636,1, -156,3899,1,157,4417, -19,1631,1,157,3899, -1,158,4418,19,1622, -1,158,3903,1,159, -4419,19,1680,1,159, -3909,1,160,4420,19, -1657,1,160,3909,1, -161,4421,19,1117,1, -161,3914,1,162,4422, -19,902,1,162,3959, -1,163,4423,19,886, -1,163,3959,1,164, -4424,19,892,1,164, -3975,1,165,4425,19, -880,1,165,3975,1, -166,4426,19,1145,1, -166,3991,1,167,4427, -19,782,1,167,3978, -1,168,4428,19,897, -1,168,3978,1,169, -4429,19,777,1,169, -3978,1,170,4430,19, -802,1,170,3978,1, -171,4431,19,771,1, -171,3978,1,172,4432, -19,765,1,172,3978, -1,173,4433,19,760, -1,173,3978,1,174, -4434,19,755,1,174, -3978,1,175,4435,19, -749,1,175,3978,1, -176,4436,19,744,1, -176,3978,1,177,4437, -19,739,1,177,3978, -1,178,4438,19,734, -1,178,3978,1,179, -4439,19,729,1,179, -3978,1,180,4440,19, -1152,1,180,4063,1, -181,4441,19,1290,1, -181,4076,1,182,4442, -19,1139,1,182,4089, -1,183,4443,19,1278, -1,183,4089,1,184, -4444,19,919,1,184, -4102,1,185,4445,19, -722,1,185,4102,1, -186,4446,19,817,1, -186,4102,1,187,4447, -19,845,1,187,4102, -1,188,4448,19,865, -1,188,4115,1,189, -4449,19,911,1,189, -4115,1,190,4450,19, -825,1,190,4128,1, -191,4451,19,838,1, -191,4128,1,192,4452, -19,791,1,192,4141, -1,193,4453,19,830, -1,193,4141,1,194, -4454,19,1477,1,194, -4154,1,195,4455,19, -1158,1,195,4154,1, -196,4456,19,1509,1, -196,4154,1,197,4457, -19,1541,1,197,4154, -1,198,4458,19,1406, -1,198,4004,1,199, -4459,19,1466,1,199, -4004,1,200,4460,19, -1133,1,200,4017,1, -201,4461,19,1573,1, -201,4017,1,202,4462, -19,1504,1,202,4017, -1,203,4463,19,1451, -1,203,4017,1,204, -4464,19,1374,1,204, -4017,1,205,4465,19, -1300,1,205,4017,1, -206,4466,19,1310,1, -206,4017,1,207,4467, -19,1128,1,207,4017, -1,208,4468,19,1557, -1,208,4017,1,209, -4469,19,1499,1,209, -4017,1,210,4470,19, -1441,1,210,4017,1, -211,4471,19,1363,1, -211,4017,1,212,4472, -19,1326,1,212,4017, -1,213,4473,19,1111, -1,213,4017,1,214, -4474,19,1461,1,214, -4017,1,215,4475,19, -1487,1,215,4017,1, -216,4476,19,1434,1, -216,4017,1,217,4477, -19,1456,1,217,4017, -1,218,4478,19,1266, -1,218,4017,1,219, -4479,19,1170,1,219, -4017,1,220,4480,19, -1100,1,220,4017,1, -221,4481,19,1531,1, -221,4017,1,222,4482, -19,1482,1,222,4017, -1,223,4483,19,1429, -1,223,4017,1,224, -4484,19,1295,1,224, -4050,1,225,4485,19, -1273,1,225,4050,1, -226,4486,19,1562,1, -226,4240,1,227,4487, -19,1586,1,227,4240, -1,228,4488,19,1552, -1,228,4240,1,229, -4489,19,1547,1,229, -4240,1,230,4490,19, -1568,1,230,4240,1, -231,4491,19,1515,1, -231,4240,1,232,4492, -19,1220,1,232,4240, -1,233,4493,19,1395, -1,233,4316,1,234, -4494,19,1181,1,234, -4316,1,235,4495,19, -1188,1,235,4316,1, -236,4496,19,1209,1, -236,4316,1,237,4497, -19,1204,1,237,4316, -1,238,4498,19,1199, -1,238,4316,1,239, -4499,19,1194,1,239, -4316,1,240,4500,19, -1384,1,240,4316,1, -241,4501,19,1412,1, -241,4316,1,242,4502, -19,1389,1,242,4316, -1,243,4503,19,1379, -1,243,4316,1,244, -4504,19,1369,1,244, -4316,1,245,4505,19, -1352,1,245,4316,1, -246,4506,19,1305,1, -246,4316,1,247,4507, -19,1214,1,247,4316, -1,248,4508,19,1175, -1,248,4316,1,249, -4509,19,1123,1,249, -4316,1,250,4510,19, -1581,1,250,4316,1, -251,4511,19,1536,1, -251,4316,1,252,4512, -19,1526,1,252,4316, -1,253,4513,19,1521, -1,253,4316,1,254, -4514,19,1472,1,254, -4316,1,255,4515,19, -1446,1,255,4316,1, -256,4516,19,1422,1, -256,4316,1,257,4517, -19,1417,1,257,4316, -1,258,4518,19,1358, -1,258,4316,1,259, -4519,19,1334,1,259, -4316,1,260,4520,19, -1400,1,260,4316,1, -261,4521,19,1493,1, -261,4316,1,262,4522, -19,1347,1,262,4316, -1,263,4523,19,1341, -1,263,4316,1,264, -4524,19,1321,1,264, -4316,1,265,4525,19, -1284,1,265,4316,1, -266,4526,19,1261,1, -266,4316,1,267,4527, -19,1106,1,267,4316, -1,268,4528,19,1596, -1,268,4316,1,269, -4529,19,1226,1,269, -4316,1,270,4530,19, -1231,1,270,4316,1, -271,4531,19,1251,1, -271,4316,1,272,4532, -19,1241,1,272,4316, -1,273,4533,19,1246, -1,273,4316,1,274, -4534,19,1236,1,274, -4316,1,275,4535,19, -1591,1,275,4316,1, -276,4536,19,1256,1, -276,4316,1,277,4537, -19,1316,1,277,4159, -1,278,4538,19,1650, -1,278,4229,1,279, -4539,19,1686,1,279, -4229,1,280,4540,19, -1666,1,280,4233,1, -281,4541,19,1985,1, -281,3933,1,282,4542, -19,1980,1,282,3933, -1,283,4543,19,1975, -1,283,3933,1,284, -4544,19,1970,1,284, -3933,1,285,4545,19, -1965,1,285,3933,1, -286,4546,19,1960,1, -286,3933,1,287,4547, -19,1955,1,287,3933, -1,288,4548,19,1944, -1,288,3953,1,289, -4549,19,1939,1,289, -3953,1,290,4550,19, -1934,1,290,3953,1, -291,4551,19,1929,1, -291,3953,1,292,4552, -19,1924,1,292,3953, -1,293,4553,19,1919, -1,293,3953,1,294, -4554,19,1914,1,294, -3953,1,295,4555,19, -1909,1,295,3953,1, -296,4556,19,1904,1, -296,3953,1,297,4557, -19,1739,1,297,3953, -1,298,4558,19,1898, -1,298,3953,1,299, -4559,19,1893,1,299, -3953,1,300,4560,19, -1888,1,300,3953,1, -301,4561,19,1732,1, -301,3953,1,302,4562, -19,1883,1,302,3953, -1,303,4563,19,1878, -1,303,3953,1,304, -4564,19,1873,1,304, -3953,1,305,4565,19, -1868,1,305,3953,1, -306,4566,19,1863,1, -306,3953,1,307,4567, -19,1858,1,307,3953, -1,308,4568,19,1725, -1,308,3953,1,309, -4569,19,1852,1,309, -3953,1,310,4570,19, -1847,1,310,3953,1, -311,4571,19,1842,1, -311,3953,1,312,4572, -19,1719,1,312,3953, -1,313,4573,19,1836, -1,313,3953,1,314, -4574,19,1767,1,314, -3953,1,315,4575,19, -1831,1,315,3953,1, -316,4576,19,1826,1, -316,3953,1,317,4577, -19,1821,1,317,3953, -1,318,4578,19,1816, -1,318,3953,1,319, -4579,19,1811,1,319, -3953,1,320,4580,19, -1806,1,320,3953,1, -321,4581,19,1801,1, -321,3953,1,322,4582, -19,4583,4,50,65, -0,114,0,103,0, -117,0,109,0,101, -0,110,0,116,0, -68,0,101,0,99, -0,108,0,97,0, -114,0,97,0,116, +138,4352,1,139,4434, +19,4435,4,42,80, +0,97,0,114,0, +101,0,110,0,116, +0,104,0,101,0, +115,0,105,0,115, +0,69,0,120,0, +112,0,114,0,101, +0,115,0,115,0, +105,0,111,0,110, +0,1,139,4352,1, +140,4436,19,4437,4, +56,73,0,110,0, +99,0,114,0,101, +0,109,0,101,0, +110,0,116,0,68, +0,101,0,99,0, +114,0,101,0,109, +0,101,0,110,0, +116,0,69,0,120, +0,112,0,114,0, +101,0,115,0,115, 0,105,0,111,0, -110,0,76,0,105, -0,115,0,116,0, -95,0,51,0,1, -322,3909,1,323,4584, -19,4585,4,28,65, -0,114,0,103,0, -117,0,109,0,101, -0,110,0,116,0, -76,0,105,0,115, -0,116,0,95,0, -51,0,1,323,4229, -1,324,4586,19,4587, +110,0,1,140,4352, +1,142,4438,19,683, +1,142,3911,1,143, +4439,19,705,1,143, +3911,1,144,4440,19, +3192,1,144,3914,1, +145,4441,19,3187,1, +145,3914,1,146,4442, +19,3198,1,146,3914, +1,147,4443,19,3209, +1,147,3914,1,148, +4444,19,3220,1,148, +3917,1,149,4445,19, +3226,1,149,3917,1, +150,4446,19,3214,1, +150,3921,1,151,4447, +19,3204,1,151,3921, +1,152,4448,19,689, +1,152,3925,1,153, +4449,19,710,1,153, +3925,1,154,4450,19, +695,1,154,3929,1, +155,4451,19,700,1, +155,3929,1,156,4452, +19,1636,1,156,3935, +1,157,4453,19,1631, +1,157,3935,1,158, +4454,19,1622,1,158, +3939,1,159,4455,19, +1680,1,159,3945,1, +160,4456,19,1657,1, +160,3945,1,161,4457, +19,1117,1,161,3950, +1,162,4458,19,902, +1,162,3995,1,163, +4459,19,886,1,163, +3995,1,164,4460,19, +892,1,164,4011,1, +165,4461,19,880,1, +165,4011,1,166,4462, +19,1145,1,166,4027, +1,167,4463,19,782, +1,167,4014,1,168, +4464,19,897,1,168, +4014,1,169,4465,19, +777,1,169,4014,1, +170,4466,19,802,1, +170,4014,1,171,4467, +19,771,1,171,4014, +1,172,4468,19,765, +1,172,4014,1,173, +4469,19,760,1,173, +4014,1,174,4470,19, +755,1,174,4014,1, +175,4471,19,749,1, +175,4014,1,176,4472, +19,744,1,176,4014, +1,177,4473,19,739, +1,177,4014,1,178, +4474,19,734,1,178, +4014,1,179,4475,19, +729,1,179,4014,1, +180,4476,19,1152,1, +180,4099,1,181,4477, +19,1290,1,181,4112, +1,182,4478,19,1139, +1,182,4125,1,183, +4479,19,1278,1,183, +4125,1,184,4480,19, +919,1,184,4138,1, +185,4481,19,722,1, +185,4138,1,186,4482, +19,817,1,186,4138, +1,187,4483,19,845, +1,187,4138,1,188, +4484,19,865,1,188, +4151,1,189,4485,19, +911,1,189,4151,1, +190,4486,19,825,1, +190,4164,1,191,4487, +19,838,1,191,4164, +1,192,4488,19,791, +1,192,4177,1,193, +4489,19,830,1,193, +4177,1,194,4490,19, +1477,1,194,4190,1, +195,4491,19,1158,1, +195,4190,1,196,4492, +19,1509,1,196,4190, +1,197,4493,19,1541, +1,197,4190,1,198, +4494,19,1406,1,198, +4040,1,199,4495,19, +1466,1,199,4040,1, +200,4496,19,1133,1, +200,4053,1,201,4497, +19,1573,1,201,4053, +1,202,4498,19,1504, +1,202,4053,1,203, +4499,19,1451,1,203, +4053,1,204,4500,19, +1374,1,204,4053,1, +205,4501,19,1300,1, +205,4053,1,206,4502, +19,1310,1,206,4053, +1,207,4503,19,1128, +1,207,4053,1,208, +4504,19,1557,1,208, +4053,1,209,4505,19, +1499,1,209,4053,1, +210,4506,19,1441,1, +210,4053,1,211,4507, +19,1363,1,211,4053, +1,212,4508,19,1326, +1,212,4053,1,213, +4509,19,1111,1,213, +4053,1,214,4510,19, +1461,1,214,4053,1, +215,4511,19,1487,1, +215,4053,1,216,4512, +19,1434,1,216,4053, +1,217,4513,19,1456, +1,217,4053,1,218, +4514,19,1266,1,218, +4053,1,219,4515,19, +1170,1,219,4053,1, +220,4516,19,1100,1, +220,4053,1,221,4517, +19,1531,1,221,4053, +1,222,4518,19,1482, +1,222,4053,1,223, +4519,19,1429,1,223, +4053,1,224,4520,19, +1295,1,224,4086,1, +225,4521,19,1273,1, +225,4086,1,226,4522, +19,1562,1,226,4276, +1,227,4523,19,1586, +1,227,4276,1,228, +4524,19,1552,1,228, +4276,1,229,4525,19, +1547,1,229,4276,1, +230,4526,19,1568,1, +230,4276,1,231,4527, +19,1515,1,231,4276, +1,232,4528,19,1220, +1,232,4276,1,233, +4529,19,1395,1,233, +4352,1,234,4530,19, +1181,1,234,4352,1, +235,4531,19,1188,1, +235,4352,1,236,4532, +19,1209,1,236,4352, +1,237,4533,19,1204, +1,237,4352,1,238, +4534,19,1199,1,238, +4352,1,239,4535,19, +1194,1,239,4352,1, +240,4536,19,1384,1, +240,4352,1,241,4537, +19,1412,1,241,4352, +1,242,4538,19,1389, +1,242,4352,1,243, +4539,19,1379,1,243, +4352,1,244,4540,19, +1369,1,244,4352,1, +245,4541,19,1352,1, +245,4352,1,246,4542, +19,1305,1,246,4352, +1,247,4543,19,1214, +1,247,4352,1,248, +4544,19,1175,1,248, +4352,1,249,4545,19, +1123,1,249,4352,1, +250,4546,19,1581,1, +250,4352,1,251,4547, +19,1536,1,251,4352, +1,252,4548,19,1526, +1,252,4352,1,253, +4549,19,1521,1,253, +4352,1,254,4550,19, +1472,1,254,4352,1, +255,4551,19,1446,1, +255,4352,1,256,4552, +19,1422,1,256,4352, +1,257,4553,19,1417, +1,257,4352,1,258, +4554,19,1358,1,258, +4352,1,259,4555,19, +1334,1,259,4352,1, +260,4556,19,1400,1, +260,4352,1,261,4557, +19,1493,1,261,4352, +1,262,4558,19,1347, +1,262,4352,1,263, +4559,19,1341,1,263, +4352,1,264,4560,19, +1321,1,264,4352,1, +265,4561,19,1284,1, +265,4352,1,266,4562, +19,1261,1,266,4352, +1,267,4563,19,1106, +1,267,4352,1,268, +4564,19,1596,1,268, +4352,1,269,4565,19, +1226,1,269,4352,1, +270,4566,19,1231,1, +270,4352,1,271,4567, +19,1251,1,271,4352, +1,272,4568,19,1241, +1,272,4352,1,273, +4569,19,1246,1,273, +4352,1,274,4570,19, +1236,1,274,4352,1, +275,4571,19,1591,1, +275,4352,1,276,4572, +19,1256,1,276,4352, +1,277,4573,19,1316, +1,277,4195,1,278, +4574,19,1650,1,278, +4265,1,279,4575,19, +1686,1,279,4265,1, +280,4576,19,1666,1, +280,4269,1,281,4577, +19,1985,1,281,3969, +1,282,4578,19,1980, +1,282,3969,1,283, +4579,19,1975,1,283, +3969,1,284,4580,19, +1970,1,284,3969,1, +285,4581,19,1965,1, +285,3969,1,286,4582, +19,1960,1,286,3969, +1,287,4583,19,1955, +1,287,3969,1,288, +4584,19,1944,1,288, +3989,1,289,4585,19, +1939,1,289,3989,1, +290,4586,19,1934,1, +290,3989,1,291,4587, +19,1929,1,291,3989, +1,292,4588,19,1924, +1,292,3989,1,293, +4589,19,1919,1,293, +3989,1,294,4590,19, +1914,1,294,3989,1, +295,4591,19,1909,1, +295,3989,1,296,4592, +19,1904,1,296,3989, +1,297,4593,19,1739, +1,297,3989,1,298, +4594,19,1898,1,298, +3989,1,299,4595,19, +1893,1,299,3989,1, +300,4596,19,1888,1, +300,3989,1,301,4597, +19,1732,1,301,3989, +1,302,4598,19,1883, +1,302,3989,1,303, +4599,19,1878,1,303, +3989,1,304,4600,19, +1873,1,304,3989,1, +305,4601,19,1868,1, +305,3989,1,306,4602, +19,1863,1,306,3989, +1,307,4603,19,1858, +1,307,3989,1,308, +4604,19,1725,1,308, +3989,1,309,4605,19, +1852,1,309,3989,1, +310,4606,19,1847,1, +310,3989,1,311,4607, +19,1842,1,311,3989, +1,312,4608,19,1719, +1,312,3989,1,313, +4609,19,1836,1,313, +3989,1,314,4610,19, +1767,1,314,3989,1, +315,4611,19,1831,1, +315,3989,1,316,4612, +19,1826,1,316,3989, +1,317,4613,19,1821, +1,317,3989,1,318, +4614,19,1816,1,318, +3989,1,319,4615,19, +1811,1,319,3989,1, +320,4616,19,1806,1, +320,3989,1,321,4617, +19,1801,1,321,3989, +1,322,4618,19,4619, 4,50,65,0,114, 0,103,0,117,0, 109,0,101,0,110, @@ -10737,16 +10739,16 @@ public yyLSLSyntax 0,111,0,110,0, 76,0,105,0,115, 0,116,0,95,0, -52,0,1,324,3909, -1,325,4588,19,4589, +51,0,1,322,3945, +1,323,4620,19,4621, 4,28,65,0,114, 0,103,0,117,0, 109,0,101,0,110, 0,116,0,76,0, 105,0,115,0,116, -0,95,0,52,0, -1,325,4229,1,326, -4590,19,4591,4,50, +0,95,0,51,0, +1,323,4265,1,324, +4622,19,4623,4,50, 65,0,114,0,103, 0,117,0,109,0, 101,0,110,0,116, @@ -10756,8 +10758,28 @@ public yyLSLSyntax 116,0,105,0,111, 0,110,0,76,0, 105,0,115,0,116, -0,95,0,53,0, -1,326,3909,2,0,0}; +0,95,0,52,0, +1,324,3945,1,325, +4624,19,4625,4,28, +65,0,114,0,103, +0,117,0,109,0, +101,0,110,0,116, +0,76,0,105,0, +115,0,116,0,95, +0,52,0,1,325, +4265,1,326,4626,19, +4627,4,50,65,0, +114,0,103,0,117, +0,109,0,101,0, +110,0,116,0,68, +0,101,0,99,0, +108,0,97,0,114, +0,97,0,116,0, +105,0,111,0,110, +0,76,0,105,0, +115,0,116,0,95, +0,53,0,1,326, +3945,2,0,0}; new Sfactory(this,"ExpressionArgument_1",new SCreator(ExpressionArgument_1_factory)); new Sfactory(this,"SimpleAssignment_8",new SCreator(SimpleAssignment_8_factory)); new Sfactory(this,"StatementList_1",new SCreator(StatementList_1_factory)); From 51fe97a00c5aaed446dd46b9ef7c120c5ad29845 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Mon, 11 Jun 2012 23:33:05 +0100 Subject: [PATCH 360/547] Set CreateDefaultAvatarEntries = true in Robust.HG.ini.example to match Robust.HG.ini Thanks to Ai Austin for the spot. --- bin/Robust.HG.ini.example | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/Robust.HG.ini.example b/bin/Robust.HG.ini.example index 00e2fd71ad..9887ab5763 100644 --- a/bin/Robust.HG.ini.example +++ b/bin/Robust.HG.ini.example @@ -185,7 +185,7 @@ ServiceConnectors = "8003/OpenSim.Server.Handlers.dll:AssetServiceConnector,8003 ;; This switch creates the minimum set of body parts and avatar entries for a viewer 2 ;; to show a default "Ruth" avatar rather than a cloud for a newly created user. ;; Default is false - ; CreateDefaultAvatarEntries = false + CreateDefaultAvatarEntries = true ;; Allow the service to process HTTP createuser calls. ;; Default is false. From bab7dab4c586f9e7a71e9acec45c527fd8e5be07 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Mon, 11 Jun 2012 23:37:16 +0100 Subject: [PATCH 361/547] Comment out the scene presence sitting debug log messages for now --- OpenSim/Region/Framework/Scenes/ScenePresence.cs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index 029e0d7994..3909fd4706 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs @@ -1899,9 +1899,9 @@ namespace OpenSim.Region.Framework.Scenes { if (SitTargetUnOccupied) { - m_log.DebugFormat( - "[SCENE PRESENCE]: Sitting {0} on {1} {2} because sit target is set and unoccupied", - Name, part.Name, part.LocalId); +// m_log.DebugFormat( +// "[SCENE PRESENCE]: Sitting {0} on {1} {2} because sit target is set and unoccupied", +// Name, part.Name, part.LocalId); part.SitTargetAvatar = UUID; offset = new Vector3(avSitOffSet.X, avSitOffSet.Y, avSitOffSet.Z); @@ -1913,9 +1913,9 @@ namespace OpenSim.Region.Framework.Scenes { if (Util.GetDistanceTo(AbsolutePosition, pos) <= 10) { - m_log.DebugFormat( - "[SCENE PRESENCE]: Sitting {0} on {1} {2} because sit target is unset and within 10m", - Name, part.Name, part.LocalId); +// m_log.DebugFormat( +// "[SCENE PRESENCE]: Sitting {0} on {1} {2} because sit target is unset and within 10m", +// Name, part.Name, part.LocalId); AbsolutePosition = pos + new Vector3(0.0f, 0.0f, m_sitAvatarHeight); canSit = true; From 8c7149063bce41cac6543757c7b917583f21ea90 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Tue, 12 Jun 2012 01:23:40 +0100 Subject: [PATCH 362/547] In PresenceDetector.OnConnectionClose(), use the IsChildAgent check already available on IClientAPI.SceneAgent rather than retrieving it again by scanning all scenes. --- OpenSim/Framework/IClientAPI.cs | 22 ++++++++++++++----- .../ClientStack/Linden/UDP/LLClientView.cs | 4 ++-- .../Presence/PresenceDetector.cs | 13 +---------- OpenSim/Region/Framework/Scenes/Scene.cs | 7 +++--- 4 files changed, 22 insertions(+), 24 deletions(-) diff --git a/OpenSim/Framework/IClientAPI.cs b/OpenSim/Framework/IClientAPI.cs index 869b069f90..f8b6a8463a 100644 --- a/OpenSim/Framework/IClientAPI.cs +++ b/OpenSim/Framework/IClientAPI.cs @@ -740,14 +740,24 @@ namespace OpenSim.Framework /// string Name { get; } - /// - /// Determines whether the client thread is doing anything or not. - /// + /// + /// True if the client is active (sending and receiving new UDP messages). False if the client is closing. + /// bool IsActive { get; set; } - /// - /// Determines whether the client is or has been removed from a given scene - /// + /// + /// Set if the client is closing due to a logout request or because of too much time since last ack. + /// + /// + /// Do not use this flag if you want to know if the client is closing, since it will not be set in other + /// circumstances (e.g. if a child agent is closed or the agent is kicked off the simulator). Use IsActive + /// instead. + /// + /// Only set for root agents. + /// + /// TODO: Too much time since last ack should probably be a separate property, or possibly part of a state + /// machine. + /// bool IsLoggingOut { get; set; } bool SendLogoutPacketWhenClosing { set; } diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs index 74b9c6d773..c4f167e2a1 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs @@ -490,12 +490,12 @@ namespace OpenSim.Region.ClientStack.LindenUDP /// public void Close() { + IsActive = false; + m_log.DebugFormat( "[CLIENT]: Close has been called for {0} attached to scene {1}", Name, m_scene.RegionInfo.RegionName); - IsActive = false; - // Shutdown the image manager ImageManager.Close(); diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Presence/PresenceDetector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Presence/PresenceDetector.cs index ccfbf78a29..b43745c846 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Presence/PresenceDetector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Presence/PresenceDetector.cs @@ -64,7 +64,6 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Presence scene.EventManager.OnNewClient -= OnNewClient; m_PresenceService.LogoutRegionAgents(scene.RegionInfo.RegionID); - } public void OnMakeRootAgent(ScenePresence sp) @@ -80,18 +79,8 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Presence public void OnConnectionClose(IClientAPI client) { - if (client.IsLoggingOut) + if (client.IsLoggingOut && !client.SceneAgent.IsChildAgent) { - object sp = null; - if (client.Scene.TryGetScenePresence(client.AgentId, out sp)) - { - if (sp is ScenePresence) - { - if (((ScenePresence)sp).IsChildAgent) - return; - } - } - // m_log.DebugFormat("[PRESENCE DETECTOR]: Detected client logout {0} in {1}", client.AgentId, client.Scene.RegionInfo.RegionName); m_PresenceService.LogoutAgent(client.SessionId); } diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 7afde38c23..1305d83018 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -3463,10 +3463,9 @@ namespace OpenSim.Region.Framework.Scenes // Or the same user is trying to be root twice here, won't work. // Kill it. m_log.DebugFormat( - "[SCENE]: Zombie scene presence detected for {0} in {1}", - agent.AgentID, - RegionInfo.RegionName - ); + "[SCENE]: Zombie scene presence detected for {0} {1} in {2}", + sp.Name, sp.UUID, RegionInfo.RegionName); + sp.ControllingClient.Close(); sp = null; } From c89db34fc4372be7ff94d92472131b2c33de8605 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Tue, 12 Jun 2012 02:03:31 +0100 Subject: [PATCH 363/547] If the simulator closes a root agent due to ack timeout, then send the client a kick message with that reason, in case it is somehow still listening. --- .../ClientStack/Linden/UDP/LLUDPServer.cs | 22 +++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs index 7f86491f4c..2036f61f22 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs @@ -558,9 +558,12 @@ namespace OpenSim.Region.ClientStack.LindenUDP if (!client.IsLoggingOut && (Environment.TickCount & Int32.MaxValue) - udpClient.TickLastPacketReceived > timeoutTicks) { - m_log.Warn("[LLUDPSERVER]: Ack timeout, disconnecting " + udpClient.AgentID); + m_log.WarnFormat( + "[LLUDPSERVER]: Ack timeout for {0} {1}, disconnecting", + client.Name, client.AgentId); + StatsManager.SimExtraStats.AddAbnormalClientThreadTermination(); - RemoveClient(client); + LogoutClientDueToTimeout(client); return; } @@ -1121,6 +1124,21 @@ namespace OpenSim.Region.ClientStack.LindenUDP Util.FireAndForget(o => client.Close()); } + private void LogoutClientDueToTimeout(IClientAPI client) + { + // We must set IsLoggingOut synchronously so that we can stop the packet loop reinvoking this method. + client.IsLoggingOut = true; + + // Fire this out on a different thread so that we don't hold up outgoing packet processing for + // everybody else if this is being called due to an ack timeout. + // This is the same as processing as the async process of a logout request. + Util.FireAndForget( + o => + { if (!client.SceneAgent.IsChildAgent) + client.Kick("Simulator logged you out due to connection timeout"); + client.Close(); }); + } + private void IncomingPacketHandler() { // Set this culture for the thread that incoming packets are received From b099f26376a7d671eeb9113dd7611cfcb0e57de0 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Tue, 12 Jun 2012 02:16:36 +0100 Subject: [PATCH 364/547] Set IClientAPI.IsActive = false early on client removal due to ack timeout rather than using IsLoggingOut flag. IsActive is more appropriate since unack timeout is not due to voluntary logout. This is in line with operations such as manual kick that do not set the IsLoggingOut flag. It's also slightly better race-wise since it reduces the chance of this operation clashing with another reason for client deactivation (e.g. manual kick). --- OpenSim/Framework/IClientAPI.cs | 9 +-- .../ClientStack/Linden/UDP/LLUDPServer.cs | 62 ++++++++++--------- 2 files changed, 37 insertions(+), 34 deletions(-) diff --git a/OpenSim/Framework/IClientAPI.cs b/OpenSim/Framework/IClientAPI.cs index f8b6a8463a..2ea6de547a 100644 --- a/OpenSim/Framework/IClientAPI.cs +++ b/OpenSim/Framework/IClientAPI.cs @@ -741,22 +741,19 @@ namespace OpenSim.Framework string Name { get; } /// - /// True if the client is active (sending and receiving new UDP messages). False if the client is closing. + /// True if the client is active (sending and receiving new UDP messages). False if the client is being closed. /// bool IsActive { get; set; } /// - /// Set if the client is closing due to a logout request or because of too much time since last ack. + /// Set if the client is closing due to a logout request /// /// /// Do not use this flag if you want to know if the client is closing, since it will not be set in other /// circumstances (e.g. if a child agent is closed or the agent is kicked off the simulator). Use IsActive - /// instead. + /// instead with a IClientAPI.SceneAgent.IsChildAgent check if necessary. /// /// Only set for root agents. - /// - /// TODO: Too much time since last ack should probably be a separate property, or possibly part of a state - /// machine. /// bool IsLoggingOut { get; set; } diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs index 2036f61f22..37d29439a6 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs @@ -555,15 +555,17 @@ namespace OpenSim.Region.ClientStack.LindenUDP if (udpClient.IsPaused) timeoutTicks = m_pausedAckTimeout; - if (!client.IsLoggingOut && + if (client.IsActive && (Environment.TickCount & Int32.MaxValue) - udpClient.TickLastPacketReceived > timeoutTicks) { - m_log.WarnFormat( - "[LLUDPSERVER]: Ack timeout for {0} {1}, disconnecting", - client.Name, client.AgentId); + // We must set IsActive synchronously so that we can stop the packet loop reinvoking this method, even + // though it's set later on by LLClientView.Close() + client.IsActive = false; - StatsManager.SimExtraStats.AddAbnormalClientThreadTermination(); - LogoutClientDueToTimeout(client); + // Fire this out on a different thread so that we don't hold up outgoing packet processing for + // everybody else if this is being called due to an ack timeout. + // This is the same as processing as the async process of a logout request. + Util.FireAndForget(o => DeactivateClientDueToTimeout(client)); return; } @@ -792,7 +794,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP Interlocked.Increment(ref udpClient.PacketsReceived); int now = Environment.TickCount & Int32.MaxValue; - udpClient.TickLastPacketReceived = now; +// udpClient.TickLastPacketReceived = now; #region ACK Receiving @@ -1113,30 +1115,30 @@ namespace OpenSim.Region.ClientStack.LindenUDP return client; } - private void RemoveClient(IClientAPI client) + /// + /// Deactivates the client if we don't receive any packets within a certain amount of time (default 60 seconds). + /// + /// + /// If a connection is active then we will always receive packets even if nothing else is happening, due to + /// regular client pings. + /// + /// + private void DeactivateClientDueToTimeout(IClientAPI client) { - // We must set IsLoggingOut synchronously so that we can stop the packet loop reinvoking this method. - client.IsLoggingOut = true; + // We must set IsActive synchronously so that we can stop the packet loop reinvoking this method, even + // though it's set later on by LLClientView.Close() + client.IsActive = false; - // Fire this out on a different thread so that we don't hold up outgoing packet processing for - // everybody else if this is being called due to an ack timeout. - // This is the same as processing as the async process of a logout request. - Util.FireAndForget(o => client.Close()); - } + m_log.WarnFormat( + "[LLUDPSERVER]: Ack timeout, disconnecting {0} agent for {1} in {2}", + client.SceneAgent.IsChildAgent ? "child" : "root", client.Name, m_scene.RegionInfo.RegionName); - private void LogoutClientDueToTimeout(IClientAPI client) - { - // We must set IsLoggingOut synchronously so that we can stop the packet loop reinvoking this method. - client.IsLoggingOut = true; + StatsManager.SimExtraStats.AddAbnormalClientThreadTermination(); - // Fire this out on a different thread so that we don't hold up outgoing packet processing for - // everybody else if this is being called due to an ack timeout. - // This is the same as processing as the async process of a logout request. - Util.FireAndForget( - o => - { if (!client.SceneAgent.IsChildAgent) - client.Kick("Simulator logged you out due to connection timeout"); - client.Close(); }); + if (!client.SceneAgent.IsChildAgent) + client.Kick("Simulator logged you out due to connection timeout"); + + client.Close(); } private void IncomingPacketHandler() @@ -1450,8 +1452,12 @@ namespace OpenSim.Region.ClientStack.LindenUDP protected void LogoutHandler(IClientAPI client) { client.SendLogoutPacket(); + if (!client.IsLoggingOut) - RemoveClient(client); + { + client.IsLoggingOut = true; + client.Close(); + } } } } \ No newline at end of file From 1b1f0a2d77fb4d2ac572f16c71a7560860c8c040 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Tue, 12 Jun 2012 02:43:33 +0100 Subject: [PATCH 365/547] OnConnectionClosed listeners, retrieve data from IClientAPI.SceneAgent rather than scanning all scene for the presence with the right id Stop checking IsLoggingOut on these listeners, if called with a root agent then we always want to perform these actions. This covers cases where the client is closed due to manual kick, simulator shutdown, etc. --- OpenSim/Framework/ISceneAgent.cs | 7 +++ .../EntityTransfer/HGEntityTransferModule.cs | 46 +++++++++---------- .../GridUser/ActivityDetector.cs | 28 +++-------- .../Presence/PresenceDetector.cs | 2 +- .../Framework/Scenes/AsyncInventorySender.cs | 2 +- .../SimianGrid/SimianActivityDetector.cs | 28 +++-------- 6 files changed, 43 insertions(+), 70 deletions(-) diff --git a/OpenSim/Framework/ISceneAgent.cs b/OpenSim/Framework/ISceneAgent.cs index 824172d58a..563d906b7f 100644 --- a/OpenSim/Framework/ISceneAgent.cs +++ b/OpenSim/Framework/ISceneAgent.cs @@ -26,6 +26,7 @@ */ using System; +using OpenMetaverse; namespace OpenSim.Framework { @@ -71,5 +72,11 @@ namespace OpenSim.Framework /// This includes scene object data and the appearance data of other avatars. /// void SendInitialDataToMe(); + + /// + /// Direction in which the scene presence is looking. + /// + /// Will be Vector3.Zero for a child agent. + Vector3 Lookat { get; } } } \ No newline at end of file diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs index 43a72e279d..08863c2d05 100644 --- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs +++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs @@ -325,34 +325,30 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer void OnConnectionClosed(IClientAPI obj) { - if (obj.IsLoggingOut) + if (obj.SceneAgent.IsChildAgent) + return; + + // Let's find out if this is a foreign user or a local user + IUserManagement uMan = Scene.RequestModuleInterface(); +// UserAccount account = Scene.UserAccountService.GetUserAccount(Scene.RegionInfo.ScopeID, obj.AgentId); + + if (uMan != null && uMan.IsLocalGridUser(obj.AgentId)) { - object sp = null; - if (obj.Scene.TryGetScenePresence(obj.AgentId, out sp)) - { - if (((ScenePresence)sp).IsChildAgent) - return; - } + // local grid user + return; + } - // Let's find out if this is a foreign user or a local user - IUserManagement uMan = Scene.RequestModuleInterface(); -// UserAccount account = Scene.UserAccountService.GetUserAccount(Scene.RegionInfo.ScopeID, obj.AgentId); - if (uMan != null && uMan.IsLocalGridUser(obj.AgentId)) - { - // local grid user - return; - } + AgentCircuitData aCircuit = ((Scene)(obj.Scene)).AuthenticateHandler.GetAgentCircuitData(obj.CircuitCode); - AgentCircuitData aCircuit = ((Scene)(obj.Scene)).AuthenticateHandler.GetAgentCircuitData(obj.CircuitCode); - - if (aCircuit.ServiceURLs.ContainsKey("HomeURI")) - { - string url = aCircuit.ServiceURLs["HomeURI"].ToString(); - IUserAgentService security = new UserAgentServiceConnector(url); - security.LogoutAgent(obj.AgentId, obj.SessionId); - //m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: Sent logout call to UserAgentService @ {0}", url); - } - else + if (aCircuit.ServiceURLs.ContainsKey("HomeURI")) + { + string url = aCircuit.ServiceURLs["HomeURI"].ToString(); + IUserAgentService security = new UserAgentServiceConnector(url); + security.LogoutAgent(obj.AgentId, obj.SessionId); + //m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: Sent logout call to UserAgentService @ {0}", url); + } + else + { m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: HomeURI not found for agent {0} logout", obj.AgentId); } } diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/GridUser/ActivityDetector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/GridUser/ActivityDetector.cs index 4cf62eca54..b0edce7a91 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/GridUser/ActivityDetector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/GridUser/ActivityDetector.cs @@ -79,29 +79,13 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.GridUser public void OnConnectionClose(IClientAPI client) { - if (client.IsLoggingOut) - { - object sp = null; - Vector3 position = new Vector3(128, 128, 0); - Vector3 lookat = new Vector3(0, 1, 0); - - if (client.Scene.TryGetScenePresence(client.AgentId, out sp)) - { - if (sp is ScenePresence) - { - if (((ScenePresence)sp).IsChildAgent) - return; - - position = ((ScenePresence)sp).AbsolutePosition; - lookat = ((ScenePresence)sp).Lookat; - } - } - -// m_log.DebugFormat("[ACTIVITY DETECTOR]: Detected client logout {0} in {1}", client.AgentId, client.Scene.RegionInfo.RegionName); - m_GridUserService.LoggedOut(client.AgentId.ToString(), client.SessionId, client.Scene.RegionInfo.RegionID, position, lookat); - } + if (client.SceneAgent.IsChildAgent) + return; +// m_log.DebugFormat("[ACTIVITY DETECTOR]: Detected client logout {0} in {1}", client.AgentId, client.Scene.RegionInfo.RegionName); + m_GridUserService.LoggedOut( + client.AgentId.ToString(), client.SessionId, client.Scene.RegionInfo.RegionID, + client.SceneAgent.AbsolutePosition, client.SceneAgent.Lookat); } - } } diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Presence/PresenceDetector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Presence/PresenceDetector.cs index b43745c846..172bea10e3 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Presence/PresenceDetector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Presence/PresenceDetector.cs @@ -79,7 +79,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Presence public void OnConnectionClose(IClientAPI client) { - if (client.IsLoggingOut && !client.SceneAgent.IsChildAgent) + if (!client.SceneAgent.IsChildAgent) { // m_log.DebugFormat("[PRESENCE DETECTOR]: Detected client logout {0} in {1}", client.AgentId, client.Scene.RegionInfo.RegionName); m_PresenceService.LogoutAgent(client.SessionId); diff --git a/OpenSim/Region/Framework/Scenes/AsyncInventorySender.cs b/OpenSim/Region/Framework/Scenes/AsyncInventorySender.cs index 9cb567430b..d9d2e64d87 100644 --- a/OpenSim/Region/Framework/Scenes/AsyncInventorySender.cs +++ b/OpenSim/Region/Framework/Scenes/AsyncInventorySender.cs @@ -137,7 +137,7 @@ namespace OpenSim.Region.Framework.Scenes } } - if (fh.Client.IsLoggingOut) + if (!fh.Client.IsActive) continue; // m_log.DebugFormat( diff --git a/OpenSim/Services/Connectors/SimianGrid/SimianActivityDetector.cs b/OpenSim/Services/Connectors/SimianGrid/SimianActivityDetector.cs index 2267325bdc..95e4bab134 100644 --- a/OpenSim/Services/Connectors/SimianGrid/SimianActivityDetector.cs +++ b/OpenSim/Services/Connectors/SimianGrid/SimianActivityDetector.cs @@ -79,27 +79,13 @@ namespace OpenSim.Services.Connectors.SimianGrid public void OnConnectionClose(IClientAPI client) { - if (client.IsLoggingOut) - { - object sp = null; - Vector3 position = new Vector3(128, 128, 0); - Vector3 lookat = new Vector3(0, 1, 0); + if (client.SceneAgent.IsChildAgent) + return; - if (client.Scene.TryGetScenePresence(client.AgentId, out sp)) - { - if (sp is ScenePresence) - { - if (((ScenePresence)sp).IsChildAgent) - return; - - position = ((ScenePresence)sp).AbsolutePosition; - lookat = ((ScenePresence)sp).Lookat; - } - } - -// m_log.DebugFormat("[SIMIAN ACTIVITY DETECTOR]: Detected client logout {0} in {1}", client.AgentId, client.Scene.RegionInfo.RegionName); - m_GridUserService.LoggedOut(client.AgentId.ToString(), client.SessionId, client.Scene.RegionInfo.RegionID, position, lookat); - } +// m_log.DebugFormat("[ACTIVITY DETECTOR]: Detected client logout {0} in {1}", client.AgentId, client.Scene.RegionInfo.RegionName); + m_GridUserService.LoggedOut( + client.AgentId.ToString(), client.SessionId, client.Scene.RegionInfo.RegionID, + client.SceneAgent.AbsolutePosition, client.SceneAgent.Lookat); } void OnEnteringNewParcel(ScenePresence sp, int localLandID, UUID regionID) @@ -111,4 +97,4 @@ namespace OpenSim.Services.Connectors.SimianGrid }); } } -} +} \ No newline at end of file From 2ca31a9841991f748e972c96a3eba96e611f1dea Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Tue, 12 Jun 2012 02:46:14 +0100 Subject: [PATCH 366/547] Remove accidental timeout left in during earlier debugging. Has been in since two commits ago (b099f26) --- OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs index 37d29439a6..5126d845ad 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs @@ -794,7 +794,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP Interlocked.Increment(ref udpClient.PacketsReceived); int now = Environment.TickCount & Int32.MaxValue; -// udpClient.TickLastPacketReceived = now; + udpClient.TickLastPacketReceived = now; #region ACK Receiving From c53c55fed02d02af419fb2968764fcefa5faac37 Mon Sep 17 00:00:00 2001 From: BlueWall Date: Tue, 12 Jun 2012 17:07:10 -0400 Subject: [PATCH 367/547] Add variable timer configureation for the timer_Script Added "timer_Interval" to the OpenSimDefaults.ini, leaving the default value set to 1200, as the previous default setting. The value represents seconds. To change the default, copy the entry to OpenSim.ini and multiply the number of minutes for the interval by 60. --- OpenSim/Region/Application/OpenSim.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/OpenSim/Region/Application/OpenSim.cs b/OpenSim/Region/Application/OpenSim.cs index 9c38ebedbe..57a3c69b07 100644 --- a/OpenSim/Region/Application/OpenSim.cs +++ b/OpenSim/Region/Application/OpenSim.cs @@ -70,6 +70,7 @@ namespace OpenSim private Regex m_consolePromptRegex = new Regex(@"([^\\])\\(\w)", RegexOptions.Compiled); private string m_timedScript = "disabled"; + private int m_timeInterval = 1200; private Timer m_scriptTimer; public OpenSim(IConfigSource configSource) : base(configSource) @@ -99,6 +100,10 @@ namespace OpenSim m_consolePort = (uint)networkConfig.GetInt("console_port", 0); m_timedScript = startupConfig.GetString("timer_Script", "disabled"); + if (m_timedScript != "disabled") + { + m_timeInterval = startupConfig.GetInt("timer_Interval", 1200); + } if (m_logFileAppender != null) { @@ -216,7 +221,7 @@ namespace OpenSim { m_scriptTimer = new Timer(); m_scriptTimer.Enabled = true; - m_scriptTimer.Interval = 1200*1000; + m_scriptTimer.Interval = m_timeInterval*1000; m_scriptTimer.Elapsed += RunAutoTimerScript; } } From c6e375291a8fa3dbdcbd25cfb64bf0d536707fb0 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Wed, 13 Jun 2012 00:03:44 +0100 Subject: [PATCH 368/547] Don't include time to transmit response back to requester when assessing slow handling of requests. This is to avoid logging a 'slow' request when the source of delay is the viewer in processing a response. This is not something we can do much about on the server end - it's server-side delay that we're interested in. To ensure consistency, this commit also had to refactor and simplify inbound non-poll network request handling, though there should be no functional change. IOSHttpResponse no longer exposes the Send() method, only classes in OpenSim.Framework.Servers.HttpServer should be doing this. Only the GetTextureHandler was sending its own response. Now it leaves this to BaseHttpServer, like all other core handlers. --- .../Rest/Inventory/RestHandler.cs | 1 - .../Handlers/GetTexture/GetTextureHandler.cs | 2 - .../Servers/HttpServer/BaseHttpServer.cs | 423 +++++------------- .../HttpServer/Interfaces/IOSHttpResponse.cs | 8 +- .../Servers/HttpServer/OSHttpResponse.cs | 3 +- .../HttpServer/PollServiceRequestManager.cs | 6 +- .../HttpServer/PollServiceWorkerThread.cs | 53 ++- 7 files changed, 174 insertions(+), 322 deletions(-) diff --git a/OpenSim/ApplicationPlugins/Rest/Inventory/RestHandler.cs b/OpenSim/ApplicationPlugins/Rest/Inventory/RestHandler.cs index db62d52438..cb88695600 100644 --- a/OpenSim/ApplicationPlugins/Rest/Inventory/RestHandler.cs +++ b/OpenSim/ApplicationPlugins/Rest/Inventory/RestHandler.cs @@ -539,7 +539,6 @@ namespace OpenSim.ApplicationPlugins.Rest.Inventory /// path has not already been registered, the method is added to the active /// handler table. /// @@ -310,35 +307,41 @@ namespace OpenSim.Data.MySQL using (MySqlConnection dbcon = new MySqlConnection(m_connectionString)) { dbcon.Open(); - MySqlCommand cmd = new MySqlCommand("SELECT name,description,assetType,temporary,id,asset_flags,CreatorID FROM assets LIMIT ?start, ?count", dbcon); - cmd.Parameters.AddWithValue("?start", start); - cmd.Parameters.AddWithValue("?count", count); - try + using (MySqlCommand cmd + = new MySqlCommand( + "SELECT name,description,assetType,temporary,id,asset_flags,CreatorID FROM assets LIMIT ?start, ?count", + dbcon)) { - using (MySqlDataReader dbReader = cmd.ExecuteReader()) + cmd.Parameters.AddWithValue("?start", start); + cmd.Parameters.AddWithValue("?count", count); + + try { - while (dbReader.Read()) + using (MySqlDataReader dbReader = cmd.ExecuteReader()) { - AssetMetadata metadata = new AssetMetadata(); - metadata.Name = (string)dbReader["name"]; - metadata.Description = (string)dbReader["description"]; - metadata.Type = (sbyte)dbReader["assetType"]; - metadata.Temporary = Convert.ToBoolean(dbReader["temporary"]); // Not sure if this is correct. - metadata.Flags = (AssetFlags)Convert.ToInt32(dbReader["asset_flags"]); - metadata.FullID = DBGuid.FromDB(dbReader["id"]); - metadata.CreatorID = dbReader["CreatorID"].ToString(); - - // Current SHA1s are not stored/computed. - metadata.SHA1 = new byte[] { }; - - retList.Add(metadata); + while (dbReader.Read()) + { + AssetMetadata metadata = new AssetMetadata(); + metadata.Name = (string)dbReader["name"]; + metadata.Description = (string)dbReader["description"]; + metadata.Type = (sbyte)dbReader["assetType"]; + metadata.Temporary = Convert.ToBoolean(dbReader["temporary"]); // Not sure if this is correct. + metadata.Flags = (AssetFlags)Convert.ToInt32(dbReader["asset_flags"]); + metadata.FullID = DBGuid.FromDB(dbReader["id"]); + metadata.CreatorID = dbReader["CreatorID"].ToString(); + + // Current SHA1s are not stored/computed. + metadata.SHA1 = new byte[] { }; + + retList.Add(metadata); + } } } - } - catch (Exception e) - { - m_log.Error("[ASSETS DB]: MySql failure fetching asset set" + Environment.NewLine + e.ToString()); + catch (Exception e) + { + m_log.Error("[ASSETS DB]: MySql failure fetching asset set" + Environment.NewLine + e.ToString()); + } } } } @@ -353,11 +356,12 @@ namespace OpenSim.Data.MySQL using (MySqlConnection dbcon = new MySqlConnection(m_connectionString)) { dbcon.Open(); - MySqlCommand cmd = new MySqlCommand("delete from assets where id=?id", dbcon); - cmd.Parameters.AddWithValue("?id", id); - cmd.ExecuteNonQuery(); - cmd.Dispose(); + using (MySqlCommand cmd = new MySqlCommand("delete from assets where id=?id", dbcon)) + { + cmd.Parameters.AddWithValue("?id", id); + cmd.ExecuteNonQuery(); + } } } @@ -366,4 +370,4 @@ namespace OpenSim.Data.MySQL #endregion } -} +} \ No newline at end of file diff --git a/OpenSim/Data/MySQL/MySQLAuthenticationData.cs b/OpenSim/Data/MySQL/MySQLAuthenticationData.cs index 664ce84f7c..76274972a8 100644 --- a/OpenSim/Data/MySQL/MySQLAuthenticationData.cs +++ b/OpenSim/Data/MySQL/MySQLAuthenticationData.cs @@ -70,30 +70,34 @@ namespace OpenSim.Data.MySQL using (MySqlConnection dbcon = new MySqlConnection(m_connectionString)) { dbcon.Open(); - MySqlCommand cmd = new MySqlCommand("select * from `" + m_Realm + "` where UUID = ?principalID", dbcon); - cmd.Parameters.AddWithValue("?principalID", principalID.ToString()); - IDataReader result = cmd.ExecuteReader(); - - if (result.Read()) + using (MySqlCommand cmd + = new MySqlCommand("select * from `" + m_Realm + "` where UUID = ?principalID", dbcon)) { - ret.PrincipalID = principalID; + cmd.Parameters.AddWithValue("?principalID", principalID.ToString()); - CheckColumnNames(result); - - foreach (string s in m_ColumnNames) + IDataReader result = cmd.ExecuteReader(); + + if (result.Read()) { - if (s == "UUID") - continue; - - ret.Data[s] = result[s].ToString(); + ret.PrincipalID = principalID; + + CheckColumnNames(result); + + foreach (string s in m_ColumnNames) + { + if (s == "UUID") + continue; + + ret.Data[s] = result[s].ToString(); + } + + return ret; + } + else + { + return null; } - - return ret; - } - else - { - return null; } } } @@ -119,57 +123,53 @@ namespace OpenSim.Data.MySQL string[] fields = new List(data.Data.Keys).ToArray(); - MySqlCommand cmd = new MySqlCommand(); - - string update = "update `"+m_Realm+"` set "; - bool first = true; - foreach (string field in fields) + using (MySqlCommand cmd = new MySqlCommand()) { - if (!first) - update += ", "; - update += "`" + field + "` = ?"+field; - - first = false; - - cmd.Parameters.AddWithValue("?"+field, data.Data[field]); - } - - update += " where UUID = ?principalID"; - - cmd.CommandText = update; - cmd.Parameters.AddWithValue("?principalID", data.PrincipalID.ToString()); - - if (ExecuteNonQuery(cmd) < 1) - { - string insert = "insert into `" + m_Realm + "` (`UUID`, `" + - String.Join("`, `", fields) + - "`) values (?principalID, ?" + String.Join(", ?", fields) + ")"; - - cmd.CommandText = insert; - + string update = "update `"+m_Realm+"` set "; + bool first = true; + foreach (string field in fields) + { + if (!first) + update += ", "; + update += "`" + field + "` = ?"+field; + + first = false; + + cmd.Parameters.AddWithValue("?"+field, data.Data[field]); + } + + update += " where UUID = ?principalID"; + + cmd.CommandText = update; + cmd.Parameters.AddWithValue("?principalID", data.PrincipalID.ToString()); + if (ExecuteNonQuery(cmd) < 1) { - cmd.Dispose(); - return false; + string insert = "insert into `" + m_Realm + "` (`UUID`, `" + + String.Join("`, `", fields) + + "`) values (?principalID, ?" + String.Join(", ?", fields) + ")"; + + cmd.CommandText = insert; + + if (ExecuteNonQuery(cmd) < 1) + return false; } } - cmd.Dispose(); - return true; } public bool SetDataItem(UUID principalID, string item, string value) { - MySqlCommand cmd = new MySqlCommand("update `" + m_Realm + - "` set `" + item + "` = ?" + item + " where UUID = ?UUID"); - - - cmd.Parameters.AddWithValue("?"+item, value); - cmd.Parameters.AddWithValue("?UUID", principalID.ToString()); - - if (ExecuteNonQuery(cmd) > 0) - return true; + using (MySqlCommand cmd + = new MySqlCommand("update `" + m_Realm + "` set `" + item + "` = ?" + item + " where UUID = ?UUID")) + { + cmd.Parameters.AddWithValue("?"+item, value); + cmd.Parameters.AddWithValue("?UUID", principalID.ToString()); + + if (ExecuteNonQuery(cmd) > 0) + return true; + } return false; } @@ -179,18 +179,18 @@ namespace OpenSim.Data.MySQL if (System.Environment.TickCount - m_LastExpire > 30000) DoExpire(); - MySqlCommand cmd = new MySqlCommand("insert into tokens (UUID, token, validity) values (?principalID, ?token, date_add(now(), interval ?lifetime minute))"); - cmd.Parameters.AddWithValue("?principalID", principalID.ToString()); - cmd.Parameters.AddWithValue("?token", token); - cmd.Parameters.AddWithValue("?lifetime", lifetime.ToString()); - - if (ExecuteNonQuery(cmd) > 0) + using (MySqlCommand cmd + = new MySqlCommand( + "insert into tokens (UUID, token, validity) values (?principalID, ?token, date_add(now(), interval ?lifetime minute))")) { - cmd.Dispose(); - return true; + cmd.Parameters.AddWithValue("?principalID", principalID.ToString()); + cmd.Parameters.AddWithValue("?token", token); + cmd.Parameters.AddWithValue("?lifetime", lifetime.ToString()); + + if (ExecuteNonQuery(cmd) > 0) + return true; } - cmd.Dispose(); return false; } @@ -199,30 +199,29 @@ namespace OpenSim.Data.MySQL if (System.Environment.TickCount - m_LastExpire > 30000) DoExpire(); - MySqlCommand cmd = new MySqlCommand("update tokens set validity = date_add(now(), interval ?lifetime minute) where UUID = ?principalID and token = ?token and validity > now()"); - cmd.Parameters.AddWithValue("?principalID", principalID.ToString()); - cmd.Parameters.AddWithValue("?token", token); - cmd.Parameters.AddWithValue("?lifetime", lifetime.ToString()); - - if (ExecuteNonQuery(cmd) > 0) + using (MySqlCommand cmd + = new MySqlCommand( + "update tokens set validity = date_add(now(), interval ?lifetime minute) where UUID = ?principalID and token = ?token and validity > now()")) { - cmd.Dispose(); - return true; - } + cmd.Parameters.AddWithValue("?principalID", principalID.ToString()); + cmd.Parameters.AddWithValue("?token", token); + cmd.Parameters.AddWithValue("?lifetime", lifetime.ToString()); - cmd.Dispose(); + if (ExecuteNonQuery(cmd) > 0) + return true; + } return false; } private void DoExpire() { - MySqlCommand cmd = new MySqlCommand("delete from tokens where validity < now()"); - ExecuteNonQuery(cmd); - - cmd.Dispose(); + using (MySqlCommand cmd = new MySqlCommand("delete from tokens where validity < now()")) + { + ExecuteNonQuery(cmd); + } m_LastExpire = System.Environment.TickCount; } } -} +} \ No newline at end of file diff --git a/OpenSim/Data/MySQL/MySQLAvatarData.cs b/OpenSim/Data/MySQL/MySQLAvatarData.cs index 8c841abc06..6a2f5d814d 100644 --- a/OpenSim/Data/MySQL/MySQLAvatarData.cs +++ b/OpenSim/Data/MySQL/MySQLAvatarData.cs @@ -52,14 +52,15 @@ namespace OpenSim.Data.MySQL public bool Delete(UUID principalID, string name) { - MySqlCommand cmd = new MySqlCommand(); - - cmd.CommandText = String.Format("delete from {0} where `PrincipalID` = ?PrincipalID and `Name` = ?Name", m_Realm); - cmd.Parameters.AddWithValue("?PrincipalID", principalID.ToString()); - cmd.Parameters.AddWithValue("?Name", name); - - if (ExecuteNonQuery(cmd) > 0) - return true; + using (MySqlCommand cmd = new MySqlCommand()) + { + cmd.CommandText = String.Format("delete from {0} where `PrincipalID` = ?PrincipalID and `Name` = ?Name", m_Realm); + cmd.Parameters.AddWithValue("?PrincipalID", principalID.ToString()); + cmd.Parameters.AddWithValue("?Name", name); + + if (ExecuteNonQuery(cmd) > 0) + return true; + } return false; } diff --git a/OpenSim/Data/MySQL/MySQLFriendsData.cs b/OpenSim/Data/MySQL/MySQLFriendsData.cs index 130ba5e9c2..3cd6b8f68b 100644 --- a/OpenSim/Data/MySQL/MySQLFriendsData.cs +++ b/OpenSim/Data/MySQL/MySQLFriendsData.cs @@ -49,34 +49,38 @@ namespace OpenSim.Data.MySQL public bool Delete(string principalID, string friend) { - MySqlCommand cmd = new MySqlCommand(); + using (MySqlCommand cmd = new MySqlCommand()) + { + cmd.CommandText = String.Format("delete from {0} where PrincipalID = ?PrincipalID and Friend = ?Friend", m_Realm); + cmd.Parameters.AddWithValue("?PrincipalID", principalID.ToString()); + cmd.Parameters.AddWithValue("?Friend", friend); - cmd.CommandText = String.Format("delete from {0} where PrincipalID = ?PrincipalID and Friend = ?Friend", m_Realm); - cmd.Parameters.AddWithValue("?PrincipalID", principalID.ToString()); - cmd.Parameters.AddWithValue("?Friend", friend); - - ExecuteNonQuery(cmd); + ExecuteNonQuery(cmd); + } return true; } public FriendsData[] GetFriends(UUID principalID) { - MySqlCommand cmd = new MySqlCommand(); + using (MySqlCommand cmd = new MySqlCommand()) + { + cmd.CommandText = String.Format("select a.*,case when b.Flags is null then -1 else b.Flags end as TheirFlags from {0} as a left join {0} as b on a.PrincipalID = b.Friend and a.Friend = b.PrincipalID where a.PrincipalID = ?PrincipalID", m_Realm); + cmd.Parameters.AddWithValue("?PrincipalID", principalID.ToString()); - cmd.CommandText = String.Format("select a.*,case when b.Flags is null then -1 else b.Flags end as TheirFlags from {0} as a left join {0} as b on a.PrincipalID = b.Friend and a.Friend = b.PrincipalID where a.PrincipalID = ?PrincipalID", m_Realm); - cmd.Parameters.AddWithValue("?PrincipalID", principalID.ToString()); - - return DoQuery(cmd); + return DoQuery(cmd); + } } public FriendsData[] GetFriends(string principalID) { - MySqlCommand cmd = new MySqlCommand(); + using (MySqlCommand cmd = new MySqlCommand()) + { + cmd.CommandText = String.Format("select a.*,case when b.Flags is null then -1 else b.Flags end as TheirFlags from {0} as a left join {0} as b on a.PrincipalID = b.Friend and a.Friend = b.PrincipalID where a.PrincipalID LIKE ?PrincipalID", m_Realm); + cmd.Parameters.AddWithValue("?PrincipalID", principalID.ToString() + '%'); - cmd.CommandText = String.Format("select a.*,case when b.Flags is null then -1 else b.Flags end as TheirFlags from {0} as a left join {0} as b on a.PrincipalID = b.Friend and a.Friend = b.PrincipalID where a.PrincipalID LIKE ?PrincipalID", m_Realm); - cmd.Parameters.AddWithValue("?PrincipalID", principalID.ToString() + '%'); - return DoQuery(cmd); + return DoQuery(cmd); + } } } -} +} \ No newline at end of file diff --git a/OpenSim/Data/MySQL/MySQLInventoryData.cs b/OpenSim/Data/MySQL/MySQLInventoryData.cs index 1a634e5eb6..e9b10f3cdf 100644 --- a/OpenSim/Data/MySQL/MySQLInventoryData.cs +++ b/OpenSim/Data/MySQL/MySQLInventoryData.cs @@ -467,43 +467,43 @@ namespace OpenSim.Data.MySQL { dbcon.Open(); - MySqlCommand result = new MySqlCommand(sql, dbcon); - result.Parameters.AddWithValue("?inventoryID", item.ID.ToString()); - result.Parameters.AddWithValue("?assetID", item.AssetID.ToString()); - result.Parameters.AddWithValue("?assetType", item.AssetType.ToString()); - result.Parameters.AddWithValue("?parentFolderID", item.Folder.ToString()); - result.Parameters.AddWithValue("?avatarID", item.Owner.ToString()); - result.Parameters.AddWithValue("?inventoryName", itemName); - result.Parameters.AddWithValue("?inventoryDescription", itemDesc); - result.Parameters.AddWithValue("?inventoryNextPermissions", item.NextPermissions.ToString()); - result.Parameters.AddWithValue("?inventoryCurrentPermissions", - item.CurrentPermissions.ToString()); - result.Parameters.AddWithValue("?invType", item.InvType); - result.Parameters.AddWithValue("?creatorID", item.CreatorId); - result.Parameters.AddWithValue("?inventoryBasePermissions", item.BasePermissions); - result.Parameters.AddWithValue("?inventoryEveryOnePermissions", item.EveryOnePermissions); - result.Parameters.AddWithValue("?inventoryGroupPermissions", item.GroupPermissions); - result.Parameters.AddWithValue("?salePrice", item.SalePrice); - result.Parameters.AddWithValue("?saleType", unchecked((sbyte)item.SaleType)); - result.Parameters.AddWithValue("?creationDate", item.CreationDate); - result.Parameters.AddWithValue("?groupID", item.GroupID); - result.Parameters.AddWithValue("?groupOwned", item.GroupOwned); - result.Parameters.AddWithValue("?flags", item.Flags); - - lock (m_dbLock) + using (MySqlCommand result = new MySqlCommand(sql, dbcon)) { - result.ExecuteNonQuery(); + result.Parameters.AddWithValue("?inventoryID", item.ID.ToString()); + result.Parameters.AddWithValue("?assetID", item.AssetID.ToString()); + result.Parameters.AddWithValue("?assetType", item.AssetType.ToString()); + result.Parameters.AddWithValue("?parentFolderID", item.Folder.ToString()); + result.Parameters.AddWithValue("?avatarID", item.Owner.ToString()); + result.Parameters.AddWithValue("?inventoryName", itemName); + result.Parameters.AddWithValue("?inventoryDescription", itemDesc); + result.Parameters.AddWithValue("?inventoryNextPermissions", item.NextPermissions.ToString()); + result.Parameters.AddWithValue("?inventoryCurrentPermissions", + item.CurrentPermissions.ToString()); + result.Parameters.AddWithValue("?invType", item.InvType); + result.Parameters.AddWithValue("?creatorID", item.CreatorId); + result.Parameters.AddWithValue("?inventoryBasePermissions", item.BasePermissions); + result.Parameters.AddWithValue("?inventoryEveryOnePermissions", item.EveryOnePermissions); + result.Parameters.AddWithValue("?inventoryGroupPermissions", item.GroupPermissions); + result.Parameters.AddWithValue("?salePrice", item.SalePrice); + result.Parameters.AddWithValue("?saleType", unchecked((sbyte)item.SaleType)); + result.Parameters.AddWithValue("?creationDate", item.CreationDate); + result.Parameters.AddWithValue("?groupID", item.GroupID); + result.Parameters.AddWithValue("?groupOwned", item.GroupOwned); + result.Parameters.AddWithValue("?flags", item.Flags); + + lock (m_dbLock) + result.ExecuteNonQuery(); + + result.Dispose(); } - result.Dispose(); - - result = new MySqlCommand("update inventoryfolders set version=version+1 where folderID = ?folderID", dbcon); - result.Parameters.AddWithValue("?folderID", item.Folder.ToString()); - lock (m_dbLock) + using (MySqlCommand result = new MySqlCommand("update inventoryfolders set version=version+1 where folderID = ?folderID", dbcon)) { - result.ExecuteNonQuery(); + result.Parameters.AddWithValue("?folderID", item.Folder.ToString()); + + lock (m_dbLock) + result.ExecuteNonQuery(); } - result.Dispose(); } } catch (MySqlException e) @@ -533,12 +533,12 @@ namespace OpenSim.Data.MySQL { dbcon.Open(); - MySqlCommand cmd = new MySqlCommand("DELETE FROM inventoryitems WHERE inventoryID=?uuid", dbcon); - cmd.Parameters.AddWithValue("?uuid", itemID.ToString()); - - lock (m_dbLock) + using (MySqlCommand cmd = new MySqlCommand("DELETE FROM inventoryitems WHERE inventoryID=?uuid", dbcon)) { - cmd.ExecuteNonQuery(); + cmd.Parameters.AddWithValue("?uuid", itemID.ToString()); + + lock (m_dbLock) + cmd.ExecuteNonQuery(); } } } @@ -579,24 +579,26 @@ namespace OpenSim.Data.MySQL { dbcon.Open(); - MySqlCommand cmd = new MySqlCommand(sql, dbcon); - cmd.Parameters.AddWithValue("?folderID", folder.ID.ToString()); - cmd.Parameters.AddWithValue("?agentID", folder.Owner.ToString()); - cmd.Parameters.AddWithValue("?parentFolderID", folder.ParentID.ToString()); - cmd.Parameters.AddWithValue("?folderName", folderName); - cmd.Parameters.AddWithValue("?type", folder.Type); - cmd.Parameters.AddWithValue("?version", folder.Version); + using (MySqlCommand cmd = new MySqlCommand(sql, dbcon)) + { + cmd.Parameters.AddWithValue("?folderID", folder.ID.ToString()); + cmd.Parameters.AddWithValue("?agentID", folder.Owner.ToString()); + cmd.Parameters.AddWithValue("?parentFolderID", folder.ParentID.ToString()); + cmd.Parameters.AddWithValue("?folderName", folderName); + cmd.Parameters.AddWithValue("?type", folder.Type); + cmd.Parameters.AddWithValue("?version", folder.Version); - try - { - lock (m_dbLock) + try { - cmd.ExecuteNonQuery(); + lock (m_dbLock) + { + cmd.ExecuteNonQuery(); + } + } + catch (Exception e) + { + m_log.Error(e.ToString()); } - } - catch (Exception e) - { - m_log.Error(e.ToString()); } } } @@ -624,20 +626,22 @@ namespace OpenSim.Data.MySQL { dbcon.Open(); - MySqlCommand cmd = new MySqlCommand(sql, dbcon); - cmd.Parameters.AddWithValue("?folderID", folder.ID.ToString()); - cmd.Parameters.AddWithValue("?parentFolderID", folder.ParentID.ToString()); - - try + using (MySqlCommand cmd = new MySqlCommand(sql, dbcon)) { - lock (m_dbLock) + cmd.Parameters.AddWithValue("?folderID", folder.ID.ToString()); + cmd.Parameters.AddWithValue("?parentFolderID", folder.ParentID.ToString()); + + try { - cmd.ExecuteNonQuery(); + lock (m_dbLock) + { + cmd.ExecuteNonQuery(); + } + } + catch (Exception e) + { + m_log.Error(e.ToString()); } - } - catch (Exception e) - { - m_log.Error(e.ToString()); } } } diff --git a/OpenSim/Data/MySQL/MySQLPresenceData.cs b/OpenSim/Data/MySQL/MySQLPresenceData.cs index fc625f0057..780806087f 100644 --- a/OpenSim/Data/MySQL/MySQLPresenceData.cs +++ b/OpenSim/Data/MySQL/MySQLPresenceData.cs @@ -63,13 +63,14 @@ namespace OpenSim.Data.MySQL public void LogoutRegionAgents(UUID regionID) { - MySqlCommand cmd = new MySqlCommand(); - - cmd.CommandText = String.Format("delete from {0} where `RegionID`=?RegionID", m_Realm); - - cmd.Parameters.AddWithValue("?RegionID", regionID.ToString()); - - ExecuteNonQuery(cmd); + using (MySqlCommand cmd = new MySqlCommand()) + { + cmd.CommandText = String.Format("delete from {0} where `RegionID`=?RegionID", m_Realm); + + cmd.Parameters.AddWithValue("?RegionID", regionID.ToString()); + + ExecuteNonQuery(cmd); + } } public bool ReportAgent(UUID sessionID, UUID regionID) @@ -81,17 +82,18 @@ namespace OpenSim.Data.MySQL if (regionID == UUID.Zero) return false; - MySqlCommand cmd = new MySqlCommand(); - - cmd.CommandText = String.Format("update {0} set RegionID=?RegionID, LastSeen=NOW() where `SessionID`=?SessionID", m_Realm); - - cmd.Parameters.AddWithValue("?SessionID", sessionID.ToString()); - cmd.Parameters.AddWithValue("?RegionID", regionID.ToString()); - - if (ExecuteNonQuery(cmd) == 0) - return false; + using (MySqlCommand cmd = new MySqlCommand()) + { + cmd.CommandText = String.Format("update {0} set RegionID=?RegionID, LastSeen=NOW() where `SessionID`=?SessionID", m_Realm); + + cmd.Parameters.AddWithValue("?SessionID", sessionID.ToString()); + cmd.Parameters.AddWithValue("?RegionID", regionID.ToString()); + + if (ExecuteNonQuery(cmd) == 0) + return false; + } return true; } } -} +} \ No newline at end of file diff --git a/OpenSim/Data/MySQL/MySQLRegionData.cs b/OpenSim/Data/MySQL/MySQLRegionData.cs index d1f1932dd8..0614879061 100644 --- a/OpenSim/Data/MySQL/MySQLRegionData.cs +++ b/OpenSim/Data/MySQL/MySQLRegionData.cs @@ -329,11 +329,12 @@ namespace OpenSim.Data.MySQL if (scopeID != UUID.Zero) command += " and ScopeID = ?scopeID"; - MySqlCommand cmd = new MySqlCommand(command); - - cmd.Parameters.AddWithValue("?scopeID", scopeID.ToString()); - - return RunCommand(cmd); + using (MySqlCommand cmd = new MySqlCommand(command)) + { + cmd.Parameters.AddWithValue("?scopeID", scopeID.ToString()); + + return RunCommand(cmd); + } } } -} +} \ No newline at end of file diff --git a/OpenSim/Data/MySQL/MySQLSimulationData.cs b/OpenSim/Data/MySQL/MySQLSimulationData.cs index 381a514bea..b36ff5acbc 100644 --- a/OpenSim/Data/MySQL/MySQLSimulationData.cs +++ b/OpenSim/Data/MySQL/MySQLSimulationData.cs @@ -129,114 +129,114 @@ namespace OpenSim.Data.MySQL using (MySqlConnection dbcon = new MySqlConnection(m_connectionString)) { dbcon.Open(); - MySqlCommand cmd = dbcon.CreateCommand(); - foreach (SceneObjectPart prim in obj.Parts) + using (MySqlCommand cmd = dbcon.CreateCommand()) { - cmd.Parameters.Clear(); - - cmd.CommandText = "replace into prims (" + - "UUID, CreationDate, " + - "Name, Text, Description, " + - "SitName, TouchName, ObjectFlags, " + - "OwnerMask, NextOwnerMask, GroupMask, " + - "EveryoneMask, BaseMask, PositionX, " + - "PositionY, PositionZ, GroupPositionX, " + - "GroupPositionY, GroupPositionZ, VelocityX, " + - "VelocityY, VelocityZ, AngularVelocityX, " + - "AngularVelocityY, AngularVelocityZ, " + - "AccelerationX, AccelerationY, " + - "AccelerationZ, RotationX, " + - "RotationY, RotationZ, " + - "RotationW, SitTargetOffsetX, " + - "SitTargetOffsetY, SitTargetOffsetZ, " + - "SitTargetOrientW, SitTargetOrientX, " + - "SitTargetOrientY, SitTargetOrientZ, " + - "RegionUUID, CreatorID, " + - "OwnerID, GroupID, " + - "LastOwnerID, SceneGroupID, " + - "PayPrice, PayButton1, " + - "PayButton2, PayButton3, " + - "PayButton4, LoopedSound, " + - "LoopedSoundGain, TextureAnimation, " + - "OmegaX, OmegaY, OmegaZ, " + - "CameraEyeOffsetX, CameraEyeOffsetY, " + - "CameraEyeOffsetZ, CameraAtOffsetX, " + - "CameraAtOffsetY, CameraAtOffsetZ, " + - "ForceMouselook, ScriptAccessPin, " + - "AllowedDrop, DieAtEdge, " + - "SalePrice, SaleType, " + - "ColorR, ColorG, ColorB, ColorA, " + - "ParticleSystem, ClickAction, Material, " + - "CollisionSound, CollisionSoundVolume, " + - "PassTouches, " + - "LinkNumber, MediaURL) values (" + "?UUID, " + - "?CreationDate, ?Name, ?Text, " + - "?Description, ?SitName, ?TouchName, " + - "?ObjectFlags, ?OwnerMask, ?NextOwnerMask, " + - "?GroupMask, ?EveryoneMask, ?BaseMask, " + - "?PositionX, ?PositionY, ?PositionZ, " + - "?GroupPositionX, ?GroupPositionY, " + - "?GroupPositionZ, ?VelocityX, " + - "?VelocityY, ?VelocityZ, ?AngularVelocityX, " + - "?AngularVelocityY, ?AngularVelocityZ, " + - "?AccelerationX, ?AccelerationY, " + - "?AccelerationZ, ?RotationX, " + - "?RotationY, ?RotationZ, " + - "?RotationW, ?SitTargetOffsetX, " + - "?SitTargetOffsetY, ?SitTargetOffsetZ, " + - "?SitTargetOrientW, ?SitTargetOrientX, " + - "?SitTargetOrientY, ?SitTargetOrientZ, " + - "?RegionUUID, ?CreatorID, ?OwnerID, " + - "?GroupID, ?LastOwnerID, ?SceneGroupID, " + - "?PayPrice, ?PayButton1, ?PayButton2, " + - "?PayButton3, ?PayButton4, ?LoopedSound, " + - "?LoopedSoundGain, ?TextureAnimation, " + - "?OmegaX, ?OmegaY, ?OmegaZ, " + - "?CameraEyeOffsetX, ?CameraEyeOffsetY, " + - "?CameraEyeOffsetZ, ?CameraAtOffsetX, " + - "?CameraAtOffsetY, ?CameraAtOffsetZ, " + - "?ForceMouselook, ?ScriptAccessPin, " + - "?AllowedDrop, ?DieAtEdge, ?SalePrice, " + - "?SaleType, ?ColorR, ?ColorG, " + - "?ColorB, ?ColorA, ?ParticleSystem, " + - "?ClickAction, ?Material, ?CollisionSound, " + - "?CollisionSoundVolume, ?PassTouches, ?LinkNumber, ?MediaURL)"; - - FillPrimCommand(cmd, prim, obj.UUID, regionUUID); - - ExecuteNonQuery(cmd); - - cmd.Parameters.Clear(); - - cmd.CommandText = "replace into primshapes (" + - "UUID, Shape, ScaleX, ScaleY, " + - "ScaleZ, PCode, PathBegin, PathEnd, " + - "PathScaleX, PathScaleY, PathShearX, " + - "PathShearY, PathSkew, PathCurve, " + - "PathRadiusOffset, PathRevolutions, " + - "PathTaperX, PathTaperY, PathTwist, " + - "PathTwistBegin, ProfileBegin, ProfileEnd, " + - "ProfileCurve, ProfileHollow, Texture, " + - "ExtraParams, State, Media) values (?UUID, " + - "?Shape, ?ScaleX, ?ScaleY, ?ScaleZ, " + - "?PCode, ?PathBegin, ?PathEnd, " + - "?PathScaleX, ?PathScaleY, " + - "?PathShearX, ?PathShearY, " + - "?PathSkew, ?PathCurve, ?PathRadiusOffset, " + - "?PathRevolutions, ?PathTaperX, " + - "?PathTaperY, ?PathTwist, " + - "?PathTwistBegin, ?ProfileBegin, " + - "?ProfileEnd, ?ProfileCurve, " + - "?ProfileHollow, ?Texture, ?ExtraParams, " + - "?State, ?Media)"; - - FillShapeCommand(cmd, prim); - - ExecuteNonQuery(cmd); + foreach (SceneObjectPart prim in obj.Parts) + { + cmd.Parameters.Clear(); + + cmd.CommandText = "replace into prims (" + + "UUID, CreationDate, " + + "Name, Text, Description, " + + "SitName, TouchName, ObjectFlags, " + + "OwnerMask, NextOwnerMask, GroupMask, " + + "EveryoneMask, BaseMask, PositionX, " + + "PositionY, PositionZ, GroupPositionX, " + + "GroupPositionY, GroupPositionZ, VelocityX, " + + "VelocityY, VelocityZ, AngularVelocityX, " + + "AngularVelocityY, AngularVelocityZ, " + + "AccelerationX, AccelerationY, " + + "AccelerationZ, RotationX, " + + "RotationY, RotationZ, " + + "RotationW, SitTargetOffsetX, " + + "SitTargetOffsetY, SitTargetOffsetZ, " + + "SitTargetOrientW, SitTargetOrientX, " + + "SitTargetOrientY, SitTargetOrientZ, " + + "RegionUUID, CreatorID, " + + "OwnerID, GroupID, " + + "LastOwnerID, SceneGroupID, " + + "PayPrice, PayButton1, " + + "PayButton2, PayButton3, " + + "PayButton4, LoopedSound, " + + "LoopedSoundGain, TextureAnimation, " + + "OmegaX, OmegaY, OmegaZ, " + + "CameraEyeOffsetX, CameraEyeOffsetY, " + + "CameraEyeOffsetZ, CameraAtOffsetX, " + + "CameraAtOffsetY, CameraAtOffsetZ, " + + "ForceMouselook, ScriptAccessPin, " + + "AllowedDrop, DieAtEdge, " + + "SalePrice, SaleType, " + + "ColorR, ColorG, ColorB, ColorA, " + + "ParticleSystem, ClickAction, Material, " + + "CollisionSound, CollisionSoundVolume, " + + "PassTouches, " + + "LinkNumber, MediaURL) values (" + "?UUID, " + + "?CreationDate, ?Name, ?Text, " + + "?Description, ?SitName, ?TouchName, " + + "?ObjectFlags, ?OwnerMask, ?NextOwnerMask, " + + "?GroupMask, ?EveryoneMask, ?BaseMask, " + + "?PositionX, ?PositionY, ?PositionZ, " + + "?GroupPositionX, ?GroupPositionY, " + + "?GroupPositionZ, ?VelocityX, " + + "?VelocityY, ?VelocityZ, ?AngularVelocityX, " + + "?AngularVelocityY, ?AngularVelocityZ, " + + "?AccelerationX, ?AccelerationY, " + + "?AccelerationZ, ?RotationX, " + + "?RotationY, ?RotationZ, " + + "?RotationW, ?SitTargetOffsetX, " + + "?SitTargetOffsetY, ?SitTargetOffsetZ, " + + "?SitTargetOrientW, ?SitTargetOrientX, " + + "?SitTargetOrientY, ?SitTargetOrientZ, " + + "?RegionUUID, ?CreatorID, ?OwnerID, " + + "?GroupID, ?LastOwnerID, ?SceneGroupID, " + + "?PayPrice, ?PayButton1, ?PayButton2, " + + "?PayButton3, ?PayButton4, ?LoopedSound, " + + "?LoopedSoundGain, ?TextureAnimation, " + + "?OmegaX, ?OmegaY, ?OmegaZ, " + + "?CameraEyeOffsetX, ?CameraEyeOffsetY, " + + "?CameraEyeOffsetZ, ?CameraAtOffsetX, " + + "?CameraAtOffsetY, ?CameraAtOffsetZ, " + + "?ForceMouselook, ?ScriptAccessPin, " + + "?AllowedDrop, ?DieAtEdge, ?SalePrice, " + + "?SaleType, ?ColorR, ?ColorG, " + + "?ColorB, ?ColorA, ?ParticleSystem, " + + "?ClickAction, ?Material, ?CollisionSound, " + + "?CollisionSoundVolume, ?PassTouches, ?LinkNumber, ?MediaURL)"; + + FillPrimCommand(cmd, prim, obj.UUID, regionUUID); + + ExecuteNonQuery(cmd); + + cmd.Parameters.Clear(); + + cmd.CommandText = "replace into primshapes (" + + "UUID, Shape, ScaleX, ScaleY, " + + "ScaleZ, PCode, PathBegin, PathEnd, " + + "PathScaleX, PathScaleY, PathShearX, " + + "PathShearY, PathSkew, PathCurve, " + + "PathRadiusOffset, PathRevolutions, " + + "PathTaperX, PathTaperY, PathTwist, " + + "PathTwistBegin, ProfileBegin, ProfileEnd, " + + "ProfileCurve, ProfileHollow, Texture, " + + "ExtraParams, State, Media) values (?UUID, " + + "?Shape, ?ScaleX, ?ScaleY, ?ScaleZ, " + + "?PCode, ?PathBegin, ?PathEnd, " + + "?PathScaleX, ?PathScaleY, " + + "?PathShearX, ?PathShearY, " + + "?PathSkew, ?PathCurve, ?PathRadiusOffset, " + + "?PathRevolutions, ?PathTaperX, " + + "?PathTaperY, ?PathTwist, " + + "?PathTwistBegin, ?ProfileBegin, " + + "?ProfileEnd, ?ProfileCurve, " + + "?ProfileHollow, ?Texture, ?ExtraParams, " + + "?State, ?Media)"; + + FillShapeCommand(cmd, prim); + + ExecuteNonQuery(cmd); + } } - - cmd.Dispose(); } } } @@ -1804,37 +1804,36 @@ namespace OpenSim.Data.MySQL { dbcon.Open(); - MySqlCommand cmd = dbcon.CreateCommand(); - - if (items.Count == 0) - return; - - cmd.CommandText = "insert into primitems (" + - "invType, assetType, name, " + - "description, creationDate, nextPermissions, " + - "currentPermissions, basePermissions, " + - "everyonePermissions, groupPermissions, " + - "flags, itemID, primID, assetID, " + - "parentFolderID, creatorID, ownerID, " + - "groupID, lastOwnerID) values (?invType, " + - "?assetType, ?name, ?description, " + - "?creationDate, ?nextPermissions, " + - "?currentPermissions, ?basePermissions, " + - "?everyonePermissions, ?groupPermissions, " + - "?flags, ?itemID, ?primID, ?assetID, " + - "?parentFolderID, ?creatorID, ?ownerID, " + - "?groupID, ?lastOwnerID)"; - - foreach (TaskInventoryItem item in items) + using (MySqlCommand cmd = dbcon.CreateCommand()) { - cmd.Parameters.Clear(); - - FillItemCommand(cmd, item); - - ExecuteNonQuery(cmd); + if (items.Count == 0) + return; + + cmd.CommandText = "insert into primitems (" + + "invType, assetType, name, " + + "description, creationDate, nextPermissions, " + + "currentPermissions, basePermissions, " + + "everyonePermissions, groupPermissions, " + + "flags, itemID, primID, assetID, " + + "parentFolderID, creatorID, ownerID, " + + "groupID, lastOwnerID) values (?invType, " + + "?assetType, ?name, ?description, " + + "?creationDate, ?nextPermissions, " + + "?currentPermissions, ?basePermissions, " + + "?everyonePermissions, ?groupPermissions, " + + "?flags, ?itemID, ?primID, ?assetID, " + + "?parentFolderID, ?creatorID, ?ownerID, " + + "?groupID, ?lastOwnerID)"; + + foreach (TaskInventoryItem item in items) + { + cmd.Parameters.Clear(); + + FillItemCommand(cmd, item); + + ExecuteNonQuery(cmd); + } } - - cmd.Dispose(); } } } diff --git a/OpenSim/Data/MySQL/MySQLUserAccountData.cs b/OpenSim/Data/MySQL/MySQLUserAccountData.cs index aa69d680a7..e964295e5f 100644 --- a/OpenSim/Data/MySQL/MySQLUserAccountData.cs +++ b/OpenSim/Data/MySQL/MySQLUserAccountData.cs @@ -62,23 +62,24 @@ namespace OpenSim.Data.MySQL if (words.Length > 2) return new UserAccountData[0]; - MySqlCommand cmd = new MySqlCommand(); - - if (words.Length == 1) + using (MySqlCommand cmd = new MySqlCommand()) { - cmd.CommandText = String.Format("select * from {0} where (ScopeID=?ScopeID or ScopeID='00000000-0000-0000-0000-000000000000') and (FirstName like ?search or LastName like ?search)", m_Realm); - cmd.Parameters.AddWithValue("?search", "%" + words[0] + "%"); - cmd.Parameters.AddWithValue("?ScopeID", scopeID.ToString()); - } - else - { - cmd.CommandText = String.Format("select * from {0} where (ScopeID=?ScopeID or ScopeID='00000000-0000-0000-0000-000000000000') and (FirstName like ?searchFirst or LastName like ?searchLast)", m_Realm); - cmd.Parameters.AddWithValue("?searchFirst", "%" + words[0] + "%"); - cmd.Parameters.AddWithValue("?searchLast", "%" + words[1] + "%"); - cmd.Parameters.AddWithValue("?ScopeID", scopeID.ToString()); - } + if (words.Length == 1) + { + cmd.CommandText = String.Format("select * from {0} where (ScopeID=?ScopeID or ScopeID='00000000-0000-0000-0000-000000000000') and (FirstName like ?search or LastName like ?search)", m_Realm); + cmd.Parameters.AddWithValue("?search", "%" + words[0] + "%"); + cmd.Parameters.AddWithValue("?ScopeID", scopeID.ToString()); + } + else + { + cmd.CommandText = String.Format("select * from {0} where (ScopeID=?ScopeID or ScopeID='00000000-0000-0000-0000-000000000000') and (FirstName like ?searchFirst or LastName like ?searchLast)", m_Realm); + cmd.Parameters.AddWithValue("?searchFirst", "%" + words[0] + "%"); + cmd.Parameters.AddWithValue("?searchLast", "%" + words[1] + "%"); + cmd.Parameters.AddWithValue("?ScopeID", scopeID.ToString()); + } - return DoQuery(cmd); + return DoQuery(cmd); + } } } -} +} \ No newline at end of file From 4ad45934c67f221fa54e1c7407949b375956eed6 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Mon, 30 Apr 2012 16:00:31 +0100 Subject: [PATCH 132/547] If there are no new prim items to store then don't bother opening the MySqlConnection only to do nothing with it. --- OpenSim/Data/MySQL/MySQLSimulationData.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/OpenSim/Data/MySQL/MySQLSimulationData.cs b/OpenSim/Data/MySQL/MySQLSimulationData.cs index b36ff5acbc..b2a1481ee9 100644 --- a/OpenSim/Data/MySQL/MySQLSimulationData.cs +++ b/OpenSim/Data/MySQL/MySQLSimulationData.cs @@ -1800,15 +1800,15 @@ namespace OpenSim.Data.MySQL { RemoveItems(primID); + if (items.Count == 0) + return; + using (MySqlConnection dbcon = new MySqlConnection(m_connectionString)) { dbcon.Open(); using (MySqlCommand cmd = dbcon.CreateCommand()) { - if (items.Count == 0) - return; - cmd.CommandText = "insert into primitems (" + "invType, assetType, name, " + "description, creationDate, nextPermissions, " + From fe8e835bfc027696979ff0fb3135e5b2718af9ed Mon Sep 17 00:00:00 2001 From: Oren Hurvitz Date: Sat, 28 Apr 2012 17:42:49 +0300 Subject: [PATCH 133/547] Fixed: scripted controls didn't work if the avatar was sitting down This fixes a bug introduced in 6473674bbf6ce006512083902e8ff1796d8c8b22 --- .../Region/Framework/Scenes/ScenePresence.cs | 24 ++++++++++++------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index 64fe7a8e36..3cf7b2aa39 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs @@ -1336,6 +1336,7 @@ namespace OpenSim.Region.Framework.Scenes PhysicsActor actor = PhysicsActor; if (actor == null) { + SafeSendControlsToScripts(flagsForScripts); return; } @@ -1512,20 +1513,25 @@ namespace OpenSim.Region.Framework.Scenes if (update_movementflag && ParentID == 0) Animator.UpdateMovementAnimations(); - lock (scriptedcontrols) - { - if (scriptedcontrols.Count > 0) - { - // Notify the scripts only after calling UpdateMovementAnimations(), so that if a script - // (e.g., a walking script) checks which animation is active it will be the correct animation. - SendControlToScripts(flagsForScripts); - } - } + SafeSendControlsToScripts(flagsForScripts); } m_scene.EventManager.TriggerOnClientMovement(this); } + private void SafeSendControlsToScripts(uint flagsForScripts) + { + lock (scriptedcontrols) + { + if (scriptedcontrols.Count > 0) + { + // Notify the scripts only after calling UpdateMovementAnimations(), so that if a script + // (e.g., a walking script) checks which animation is active it will be the correct animation. + SendControlToScripts(flagsForScripts); + } + } + } + /// /// Calculate an update to move the presence to the set target. /// From d0598c63f38f560ba0daf8ddf71b6218363ac887 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Mon, 30 Apr 2012 17:33:08 +0100 Subject: [PATCH 134/547] refactor: Simplify by combining SafeSendControlsToScripts() from fe8e835 into SendControlsToScripts() (instead of SendControlToScripts()). --- .../Region/Framework/Scenes/ScenePresence.cs | 148 +++++++++--------- 1 file changed, 75 insertions(+), 73 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index 3cf7b2aa39..f1d092616c 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs @@ -1336,7 +1336,7 @@ namespace OpenSim.Region.Framework.Scenes PhysicsActor actor = PhysicsActor; if (actor == null) { - SafeSendControlsToScripts(flagsForScripts); + SendControlsToScripts(flagsForScripts); return; } @@ -1513,25 +1513,12 @@ namespace OpenSim.Region.Framework.Scenes if (update_movementflag && ParentID == 0) Animator.UpdateMovementAnimations(); - SafeSendControlsToScripts(flagsForScripts); + SendControlsToScripts(flagsForScripts); } m_scene.EventManager.TriggerOnClientMovement(this); } - private void SafeSendControlsToScripts(uint flagsForScripts) - { - lock (scriptedcontrols) - { - if (scriptedcontrols.Count > 0) - { - // Notify the scripts only after calling UpdateMovementAnimations(), so that if a script - // (e.g., a walking script) checks which animation is active it will be the correct animation. - SendControlToScripts(flagsForScripts); - } - } - } - /// /// Calculate an update to move the presence to the set target. /// @@ -3687,77 +3674,92 @@ namespace OpenSim.Region.Framework.Scenes } } - internal void SendControlToScripts(uint flags) + private void SendControlsToScripts(uint flags) { - ScriptControlled allflags = ScriptControlled.CONTROL_ZERO; - - if (MouseDown) + // Notify the scripts only after calling UpdateMovementAnimations(), so that if a script + // (e.g., a walking script) checks which animation is active it will be the correct animation. + lock (scriptedcontrols) { - allflags = LastCommands & (ScriptControlled.CONTROL_ML_LBUTTON | ScriptControlled.CONTROL_LBUTTON); - if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_LBUTTON_UP) != 0 || (flags & unchecked((uint)AgentManager.ControlFlags.AGENT_CONTROL_ML_LBUTTON_UP)) != 0) + if (scriptedcontrols.Count <= 0) + return; + + ScriptControlled allflags = ScriptControlled.CONTROL_ZERO; + + if (MouseDown) { - allflags = ScriptControlled.CONTROL_ZERO; + allflags = LastCommands & (ScriptControlled.CONTROL_ML_LBUTTON | ScriptControlled.CONTROL_LBUTTON); + if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_LBUTTON_UP) != 0 || (flags & unchecked((uint)AgentManager.ControlFlags.AGENT_CONTROL_ML_LBUTTON_UP)) != 0) + { + allflags = ScriptControlled.CONTROL_ZERO; + MouseDown = true; + } + } + + if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_ML_LBUTTON_DOWN) != 0) + { + allflags |= ScriptControlled.CONTROL_ML_LBUTTON; MouseDown = true; } - } + + if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_LBUTTON_DOWN) != 0) + { + allflags |= ScriptControlled.CONTROL_LBUTTON; + MouseDown = true; + } + + // find all activated controls, whether the scripts are interested in them or not + if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_AT_POS) != 0 || (flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_POS) != 0) + { + allflags |= ScriptControlled.CONTROL_FWD; + } + + if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG) != 0 || (flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_NEG) != 0) + { + allflags |= ScriptControlled.CONTROL_BACK; + } + + if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_POS) != 0 || (flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_POS) != 0) + { + allflags |= ScriptControlled.CONTROL_UP; + } + + if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) != 0 || (flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG) != 0) + { + allflags |= ScriptControlled.CONTROL_DOWN; + } - if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_ML_LBUTTON_DOWN) != 0) - { - allflags |= ScriptControlled.CONTROL_ML_LBUTTON; - MouseDown = true; - } - if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_LBUTTON_DOWN) != 0) - { - allflags |= ScriptControlled.CONTROL_LBUTTON; - MouseDown = true; - } + if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS) != 0 || (flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_POS) != 0) + { + allflags |= ScriptControlled.CONTROL_LEFT; + } + + if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG) != 0 || (flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_NEG) != 0) + { + allflags |= ScriptControlled.CONTROL_RIGHT; + } + + if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_YAW_NEG) != 0) + { + allflags |= ScriptControlled.CONTROL_ROT_RIGHT; + } + + if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_YAW_POS) != 0) + { + allflags |= ScriptControlled.CONTROL_ROT_LEFT; + } - // find all activated controls, whether the scripts are interested in them or not - if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_AT_POS) != 0 || (flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_POS) != 0) - { - allflags |= ScriptControlled.CONTROL_FWD; - } - if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG) != 0 || (flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_NEG) != 0) - { - allflags |= ScriptControlled.CONTROL_BACK; - } - if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_POS) != 0 || (flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_POS) != 0) - { - allflags |= ScriptControlled.CONTROL_UP; - } - if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) != 0 || (flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG) != 0) - { - allflags |= ScriptControlled.CONTROL_DOWN; - } - if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS) != 0 || (flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_POS) != 0) - { - allflags |= ScriptControlled.CONTROL_LEFT; - } - if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG) != 0 || (flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_NEG) != 0) - { - allflags |= ScriptControlled.CONTROL_RIGHT; - } - if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_YAW_NEG) != 0) - { - allflags |= ScriptControlled.CONTROL_ROT_RIGHT; - } - if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_YAW_POS) != 0) - { - allflags |= ScriptControlled.CONTROL_ROT_LEFT; - } - // optimization; we have to check per script, but if nothing is pressed and nothing changed, we can skip that - if (allflags != ScriptControlled.CONTROL_ZERO || allflags != LastCommands) - { - lock (scriptedcontrols) + // optimization; we have to check per script, but if nothing is pressed and nothing changed, we can skip that + if (allflags != ScriptControlled.CONTROL_ZERO || allflags != LastCommands) { foreach (KeyValuePair kvp in scriptedcontrols) { UUID scriptUUID = kvp.Key; ScriptControllers scriptControlData = kvp.Value; - + ScriptControlled localHeld = allflags & scriptControlData.eventControls; // the flags interesting for us ScriptControlled localLast = LastCommands & scriptControlData.eventControls; // the activated controls in the last cycle ScriptControlled localChange = localHeld ^ localLast; // the changed bits + if (localHeld != ScriptControlled.CONTROL_ZERO || localChange != ScriptControlled.CONTROL_ZERO) { // only send if still pressed or just changed @@ -3765,9 +3767,9 @@ namespace OpenSim.Region.Framework.Scenes } } } + + LastCommands = allflags; } - - LastCommands = allflags; } internal static AgentManager.ControlFlags RemoveIgnoredControls(AgentManager.ControlFlags flags, ScriptControlled ignored) From 9c2a73b61ef1e834c77f5d945ebae435b033ca38 Mon Sep 17 00:00:00 2001 From: TBG Renfold Date: Tue, 24 Apr 2012 19:38:37 +0100 Subject: [PATCH 135/547] llGenerateKey implementation. Creates a random UUID I.E: UUID.Random().ToString(); Signed-off-by: TBG Renfold --- .../ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | 7 +++++++ .../Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs | 1 + OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs | 5 +++++ 3 files changed, 13 insertions(+) diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index d641958daf..62b5c0f9b1 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -1734,6 +1734,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api rgb.y = texcolor.G; rgb.z = texcolor.B; return rgb; + } else { @@ -3192,6 +3193,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api return m_host.UUID.ToString(); } + public LSL_Key llGenerateKey() + { + m_host.AddScriptLPS(1); + return UUID.Random().ToString(); + } + public void llSetBuoyancy(double buoyancy) { m_host.AddScriptLPS(1); diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs index 69df392322..7a797ac27b 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs @@ -105,6 +105,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces LSL_Integer llFloor(double f); void llForceMouselook(int mouselook); LSL_Float llFrand(double mag); + LSL_Key llGenerateKey(); LSL_Vector llGetAccel(); LSL_Integer llGetAgentInfo(string id); LSL_String llGetAgentLanguage(string id); diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs index 3c2f7bdf44..80fa530410 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs @@ -369,6 +369,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase return m_LSL_Functions.llFrand(mag); } + public LSL_Key llGenerateKey() + { + return m_LSL_Functions.llGenerateKey(); + } + public LSL_Vector llGetAccel() { return m_LSL_Functions.llGetAccel(); From cc482d2d5627ead7883f4b529c4221870724ff9c Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Mon, 30 Apr 2012 17:39:11 +0100 Subject: [PATCH 136/547] Add TBG Renfold to contributors --- CONTRIBUTORS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CONTRIBUTORS.txt b/CONTRIBUTORS.txt index ad95cf72c8..8a1141fd11 100644 --- a/CONTRIBUTORS.txt +++ b/CONTRIBUTORS.txt @@ -146,6 +146,7 @@ what it is today. * Stefan_Boom / stoehr * Strawberry Fride * Talun +* TBG Renfold * tglion * tlaukkan/Tommil (Tommi S. E. Laukkanen, Bubble Cloud) * tyre From b678ea18b238ef1ab816445f48bd1c838f9978fc Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Mon, 30 Apr 2012 18:44:22 +0100 Subject: [PATCH 137/547] Create TestHelpers.EnableLogging() and DisableLogging() to turn logging on and off within tests. This makes *.Tests.dll.config files no longer needed, hence deleted. --- .../Framework/Scenes/Tests/BorderTests.cs | 4 +- .../Framework/Scenes/Tests/SceneGraphTests.cs | 6 +++ .../Tests/ScenePresenceTeleportTests.cs | 3 +- OpenSim/Tests/Common/TestHelpers.cs | 46 +++++++++++++++++++ ....Framework.Communications.Tests.dll.config | 33 ------------- ...m.Framework.Serialization.Tests.dll.config | 33 ------------- ...OpenSim.Framework.Servers.Tests.dll.config | 33 ------------- bin/OpenSim.Framework.Tests.dll.config | 33 ------------- ...on.ClientStack.LindenCaps.Tests.dll.config | 33 ------------- ...ion.ClientStack.LindenUDP.Tests.dll.config | 33 ------------- ...penSim.Region.CoreModules.Tests.dll.config | 33 ------------- bin/OpenSim.Region.Framework.Tests.dll.config | 33 ------------- ...im.Region.OptionalModules.Tests.dll.config | 33 ------------- ...enSim.Region.ScriptEngine.Tests.dll.config | 33 ------------- bin/OpenSim.Tests.Torture.dll.config | 33 ------------- 15 files changed, 55 insertions(+), 367 deletions(-) delete mode 100644 bin/OpenSim.Framework.Communications.Tests.dll.config delete mode 100644 bin/OpenSim.Framework.Serialization.Tests.dll.config delete mode 100644 bin/OpenSim.Framework.Servers.Tests.dll.config delete mode 100644 bin/OpenSim.Framework.Tests.dll.config delete mode 100644 bin/OpenSim.Region.ClientStack.LindenCaps.Tests.dll.config delete mode 100644 bin/OpenSim.Region.ClientStack.LindenUDP.Tests.dll.config delete mode 100644 bin/OpenSim.Region.CoreModules.Tests.dll.config delete mode 100644 bin/OpenSim.Region.Framework.Tests.dll.config delete mode 100644 bin/OpenSim.Region.OptionalModules.Tests.dll.config delete mode 100644 bin/OpenSim.Region.ScriptEngine.Tests.dll.config delete mode 100644 bin/OpenSim.Tests.Torture.dll.config diff --git a/OpenSim/Region/Framework/Scenes/Tests/BorderTests.cs b/OpenSim/Region/Framework/Scenes/Tests/BorderTests.cs index ab6311b520..4a21dc9730 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/BorderTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/BorderTests.cs @@ -27,6 +27,7 @@ using System; using System.Collections.Generic; +using System.IO; using System.Text; using NUnit.Framework; using OpenMetaverse; @@ -68,11 +69,8 @@ namespace OpenSim.Region.Framework.Scenes.Tests Vector3 position = new Vector3(200,200,21); foreach (Border b in testborders) - { Assert.That(!b.TestCross(position)); - } - position = new Vector3(200,280,21); Assert.That(NorthBorder.TestCross(position)); diff --git a/OpenSim/Region/Framework/Scenes/Tests/SceneGraphTests.cs b/OpenSim/Region/Framework/Scenes/Tests/SceneGraphTests.cs index 1c33a5f27a..d23c96511c 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/SceneGraphTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/SceneGraphTests.cs @@ -26,7 +26,9 @@ */ using System; +using System.IO; using System.Reflection; +using System.Text; using NUnit.Framework; using OpenMetaverse; using OpenSim.Framework; @@ -44,6 +46,8 @@ namespace OpenSim.Region.Framework.Scenes.Tests public void TestDuplicateObject() { TestHelpers.InMethod(); +// TestHelpers.EnableLogging(); + Scene scene = new SceneHelpers().SetupScene(); UUID ownerId = new UUID("00000000-0000-0000-0000-000000000010"); @@ -82,6 +86,8 @@ namespace OpenSim.Region.Framework.Scenes.Tests Assert.That(dupePart1.PhysActor, Is.Not.Null); Assert.That(dupePart2.PhysActor, Is.Not.Null); */ + +// TestHelpers.DisableLogging(); } } } \ No newline at end of file diff --git a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTeleportTests.cs b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTeleportTests.cs index 19542ffffe..c750cc5d10 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTeleportTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTeleportTests.cs @@ -38,7 +38,8 @@ using OpenSim.Region.Framework.Interfaces; using OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation; using OpenSim.Tests.Common; using OpenSim.Tests.Common.Mock; -using System.Threading; +using System.IO; +using System.Text; namespace OpenSim.Region.Framework.Scenes.Tests { diff --git a/OpenSim/Tests/Common/TestHelpers.cs b/OpenSim/Tests/Common/TestHelpers.cs index ced06de1ad..5030d4bf7f 100644 --- a/OpenSim/Tests/Common/TestHelpers.cs +++ b/OpenSim/Tests/Common/TestHelpers.cs @@ -27,6 +27,8 @@ using System; using System.Diagnostics; +using System.IO; +using System.Text; using NUnit.Framework; using OpenMetaverse; @@ -34,6 +36,37 @@ namespace OpenSim.Tests.Common { public class TestHelpers { + private static Stream EnableLoggingConfigStream + = new MemoryStream( + Encoding.UTF8.GetBytes( +@" + + + + + + + + + + + + + + + +")); + + private static Stream DisableLoggingConfigStream + = new MemoryStream( + Encoding.UTF8.GetBytes( + // ""))); + //""))); + //""))); + //""))); + //""))); + "")); + public static bool AssertThisDelegateCausesArgumentException(TestDelegate d) { try @@ -58,6 +91,19 @@ namespace OpenSim.Tests.Common Console.WriteLine("===> In Test Method : {0} <===", stackTrace.GetFrame(1).GetMethod().Name); } + public static void EnableLogging() + { + log4net.Config.XmlConfigurator.Configure(EnableLoggingConfigStream); + } + + /// + /// Disable logging whilst running the tests. + /// + public static void DisableLogging() + { + log4net.Config.XmlConfigurator.Configure(DisableLoggingConfigStream); + } + /// /// Parse tail section into full UUID. /// diff --git a/bin/OpenSim.Framework.Communications.Tests.dll.config b/bin/OpenSim.Framework.Communications.Tests.dll.config deleted file mode 100644 index a3f681d89e..0000000000 --- a/bin/OpenSim.Framework.Communications.Tests.dll.config +++ /dev/null @@ -1,33 +0,0 @@ - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/bin/OpenSim.Framework.Serialization.Tests.dll.config b/bin/OpenSim.Framework.Serialization.Tests.dll.config deleted file mode 100644 index a3f681d89e..0000000000 --- a/bin/OpenSim.Framework.Serialization.Tests.dll.config +++ /dev/null @@ -1,33 +0,0 @@ - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/bin/OpenSim.Framework.Servers.Tests.dll.config b/bin/OpenSim.Framework.Servers.Tests.dll.config deleted file mode 100644 index a3f681d89e..0000000000 --- a/bin/OpenSim.Framework.Servers.Tests.dll.config +++ /dev/null @@ -1,33 +0,0 @@ - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/bin/OpenSim.Framework.Tests.dll.config b/bin/OpenSim.Framework.Tests.dll.config deleted file mode 100644 index a3f681d89e..0000000000 --- a/bin/OpenSim.Framework.Tests.dll.config +++ /dev/null @@ -1,33 +0,0 @@ - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/bin/OpenSim.Region.ClientStack.LindenCaps.Tests.dll.config b/bin/OpenSim.Region.ClientStack.LindenCaps.Tests.dll.config deleted file mode 100644 index a3f681d89e..0000000000 --- a/bin/OpenSim.Region.ClientStack.LindenCaps.Tests.dll.config +++ /dev/null @@ -1,33 +0,0 @@ - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/bin/OpenSim.Region.ClientStack.LindenUDP.Tests.dll.config b/bin/OpenSim.Region.ClientStack.LindenUDP.Tests.dll.config deleted file mode 100644 index a3f681d89e..0000000000 --- a/bin/OpenSim.Region.ClientStack.LindenUDP.Tests.dll.config +++ /dev/null @@ -1,33 +0,0 @@ - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/bin/OpenSim.Region.CoreModules.Tests.dll.config b/bin/OpenSim.Region.CoreModules.Tests.dll.config deleted file mode 100644 index a3f681d89e..0000000000 --- a/bin/OpenSim.Region.CoreModules.Tests.dll.config +++ /dev/null @@ -1,33 +0,0 @@ - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/bin/OpenSim.Region.Framework.Tests.dll.config b/bin/OpenSim.Region.Framework.Tests.dll.config deleted file mode 100644 index a3f681d89e..0000000000 --- a/bin/OpenSim.Region.Framework.Tests.dll.config +++ /dev/null @@ -1,33 +0,0 @@ - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/bin/OpenSim.Region.OptionalModules.Tests.dll.config b/bin/OpenSim.Region.OptionalModules.Tests.dll.config deleted file mode 100644 index a3f681d89e..0000000000 --- a/bin/OpenSim.Region.OptionalModules.Tests.dll.config +++ /dev/null @@ -1,33 +0,0 @@ - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/bin/OpenSim.Region.ScriptEngine.Tests.dll.config b/bin/OpenSim.Region.ScriptEngine.Tests.dll.config deleted file mode 100644 index a3f681d89e..0000000000 --- a/bin/OpenSim.Region.ScriptEngine.Tests.dll.config +++ /dev/null @@ -1,33 +0,0 @@ - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/bin/OpenSim.Tests.Torture.dll.config b/bin/OpenSim.Tests.Torture.dll.config deleted file mode 100644 index a3f681d89e..0000000000 --- a/bin/OpenSim.Tests.Torture.dll.config +++ /dev/null @@ -1,33 +0,0 @@ - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - From 37dd174697c0bcc201f8d8e4d7569c2a51f53757 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Tue, 1 May 2012 17:52:30 +0100 Subject: [PATCH 138/547] refactor: Split most of EntityTransferModule.Teleport() into its same region and different region teleport components. DoTeleport() now retrives IEventQueue itself rather than requiring it to be passed in. --- .../CoreModules/Avatar/Lure/HGLureModule.cs | 10 +- .../EntityTransfer/EntityTransferModule.cs | 280 ++++++++++-------- .../EntityTransfer/HGEntityTransferModule.cs | 15 +- .../Interfaces/IEntityTransferModule.cs | 37 ++- 4 files changed, 205 insertions(+), 137 deletions(-) diff --git a/OpenSim/Region/CoreModules/Avatar/Lure/HGLureModule.cs b/OpenSim/Region/CoreModules/Avatar/Lure/HGLureModule.cs index bc5c1ff2c2..92cf9d1616 100644 --- a/OpenSim/Region/CoreModules/Avatar/Lure/HGLureModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Lure/HGLureModule.cs @@ -240,13 +240,15 @@ namespace OpenSim.Region.CoreModules.Avatar.Lure { ScenePresence sp = scene.GetScenePresence(client.AgentId); IEntityTransferModule transferMod = scene.RequestModuleInterface(); - IEventQueue eq = sp.Scene.RequestModuleInterface(); - if (transferMod != null && sp != null && eq != null) - transferMod.DoTeleport(sp, gatekeeper, finalDestination, im.Position + new Vector3(0.5f, 0.5f, 0f), Vector3.UnitX, teleportflags, eq); + + if (transferMod != null && sp != null) + transferMod.DoTeleport( + sp, gatekeeper, finalDestination, im.Position + new Vector3(0.5f, 0.5f, 0f), + Vector3.UnitX, teleportflags); } } } } } } -} +} \ No newline at end of file diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs index 779fd6b012..b547317509 100644 --- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs +++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs @@ -170,8 +170,6 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer if (!sp.Scene.Permissions.CanTeleport(sp.UUID)) return; - IEventQueue eq = sp.Scene.RequestModuleInterface(); - // Reset animations; the viewer does that in teleports. sp.Animator.ResetAnimations(); @@ -183,130 +181,16 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer { destinationRegionName = sp.Scene.RegionInfo.RegionName; - m_log.DebugFormat( - "[ENTITY TRANSFER MODULE]: Teleport for {0} to {1} within {2}", - sp.Name, position, destinationRegionName); - - // Teleport within the same region - if (IsOutsideRegion(sp.Scene, position) || position.Z < 0) - { - Vector3 emergencyPos = new Vector3(128, 128, 128); - - m_log.WarnFormat( - "[ENTITY TRANSFER MODULE]: RequestTeleportToLocation() was given an illegal position of {0} for avatar {1}, {2}. Substituting {3}", - position, sp.Name, sp.UUID, emergencyPos); - - position = emergencyPos; - } - - // TODO: Get proper AVG Height - float localAVHeight = 1.56f; - float posZLimit = 22; - - // TODO: Check other Scene HeightField - if (position.X > 0 && position.X <= (int)Constants.RegionSize && position.Y > 0 && position.Y <= (int)Constants.RegionSize) - { - posZLimit = (float)sp.Scene.Heightmap[(int)position.X, (int)position.Y]; - } - - float newPosZ = posZLimit + localAVHeight; - if (posZLimit >= (position.Z - (localAVHeight / 2)) && !(Single.IsInfinity(newPosZ) || Single.IsNaN(newPosZ))) - { - position.Z = newPosZ; - } - - sp.ControllingClient.SendTeleportStart(teleportFlags); - - sp.ControllingClient.SendLocalTeleport(position, lookAt, teleportFlags); - sp.Velocity = Vector3.Zero; - sp.Teleport(position); - - foreach (SceneObjectGroup grp in sp.GetAttachments()) - { - sp.Scene.EventManager.TriggerOnScriptChangedEvent(grp.LocalId, (uint)Changed.TELEPORT); - } + TeleportAgentWithinRegion(sp, position, lookAt, teleportFlags); } else // Another region possibly in another simulator { - uint x = 0, y = 0; - Utils.LongToUInts(regionHandle, out x, out y); - GridRegion reg = m_aScene.GridService.GetRegionByPosition(sp.Scene.RegionInfo.ScopeID, (int)x, (int)y); - - if (reg != null) - { - GridRegion finalDestination = GetFinalDestination(reg); - if (finalDestination == null) - { - m_log.WarnFormat( - "[ENTITY TRANSFER MODULE]: Final destination is having problems. Unable to teleport {0} {1}", - sp.Name, sp.UUID); - - sp.ControllingClient.SendTeleportFailed("Problem at destination"); - return; - } + GridRegion finalDestination; + TeleportAgentToDifferentRegion( + sp, regionHandle, position, lookAt, teleportFlags, out finalDestination); + if (finalDestination != null) destinationRegionName = finalDestination.RegionName; - - uint curX = 0, curY = 0; - Utils.LongToUInts(sp.Scene.RegionInfo.RegionHandle, out curX, out curY); - int curCellX = (int)(curX / Constants.RegionSize); - int curCellY = (int)(curY / Constants.RegionSize); - int destCellX = (int)(finalDestination.RegionLocX / Constants.RegionSize); - int destCellY = (int)(finalDestination.RegionLocY / Constants.RegionSize); - -// m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Source co-ords are x={0} y={1}", curRegionX, curRegionY); -// -// m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Final dest is x={0} y={1} {2}@{3}", -// destRegionX, destRegionY, finalDestination.RegionID, finalDestination.ServerURI); - - // Check that these are not the same coordinates - if (finalDestination.RegionLocX == sp.Scene.RegionInfo.RegionLocX && - finalDestination.RegionLocY == sp.Scene.RegionInfo.RegionLocY) - { - // Can't do. Viewer crashes - sp.ControllingClient.SendTeleportFailed("Space warp! You would crash. Move to a different region and try again."); - return; - } - - if (Math.Abs(curCellX - destCellX) > MaxTransferDistance || Math.Abs(curCellY - destCellY) > MaxTransferDistance) - { - sp.ControllingClient.SendTeleportFailed( - string.Format( - "Can't teleport to {0} ({1},{2}) from {3} ({4},{5}), destination is more than {6} regions way", - finalDestination.RegionName, destCellX, destCellY, - sp.Scene.RegionInfo.RegionName, curCellX, curCellY, - MaxTransferDistance)); - - return; - } - - // - // This is it - // - DoTeleport(sp, reg, finalDestination, position, lookAt, teleportFlags, eq); - // - // - // - } - else - { - // TP to a place that doesn't exist (anymore) - // Inform the viewer about that - sp.ControllingClient.SendTeleportFailed("The region you tried to teleport to doesn't exist anymore"); - - // and set the map-tile to '(Offline)' - uint regX, regY; - Utils.LongToUInts(regionHandle, out regX, out regY); - - MapBlockData block = new MapBlockData(); - block.X = (ushort)(regX / Constants.RegionSize); - block.Y = (ushort)(regY / Constants.RegionSize); - block.Access = 254; // == not there - - List blocks = new List(); - blocks.Add(block); - sp.ControllingClient.SendMapBlock(blocks, 0); - } } } catch (Exception e) @@ -320,8 +204,160 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer } } - public void DoTeleport(ScenePresence sp, GridRegion reg, GridRegion finalDestination, Vector3 position, Vector3 lookAt, uint teleportFlags, IEventQueue eq) + /// + /// Teleports the agent within its current region. + /// + /// + /// + /// + /// 0 && position.X <= (int)Constants.RegionSize && position.Y > 0 && position.Y <= (int)Constants.RegionSize) + { + posZLimit = (float)sp.Scene.Heightmap[(int)position.X, (int)position.Y]; + } + + float newPosZ = posZLimit + localAVHeight; + if (posZLimit >= (position.Z - (localAVHeight / 2)) && !(Single.IsInfinity(newPosZ) || Single.IsNaN(newPosZ))) + { + position.Z = newPosZ; + } + + sp.ControllingClient.SendTeleportStart(teleportFlags); + + sp.ControllingClient.SendLocalTeleport(position, lookAt, teleportFlags); + sp.Velocity = Vector3.Zero; + sp.Teleport(position); + + foreach (SceneObjectGroup grp in sp.GetAttachments()) + { + sp.Scene.EventManager.TriggerOnScriptChangedEvent(grp.LocalId, (uint)Changed.TELEPORT); + } + } + + /// + /// Teleports the agent to a different region. + /// + /// + /// /param> + /// + /// + /// + /// + private void TeleportAgentToDifferentRegion( + ScenePresence sp, ulong regionHandle, Vector3 position, + Vector3 lookAt, uint teleportFlags, out GridRegion finalDestination) + { + uint x = 0, y = 0; + Utils.LongToUInts(regionHandle, out x, out y); + GridRegion reg = m_aScene.GridService.GetRegionByPosition(sp.Scene.RegionInfo.ScopeID, (int)x, (int)y); + + if (reg != null) + { + finalDestination = GetFinalDestination(reg); + + if (finalDestination == null) + { + m_log.WarnFormat( + "[ENTITY TRANSFER MODULE]: Final destination is having problems. Unable to teleport {0} {1}", + sp.Name, sp.UUID); + + sp.ControllingClient.SendTeleportFailed("Problem at destination"); + return; + } + + uint curX = 0, curY = 0; + Utils.LongToUInts(sp.Scene.RegionInfo.RegionHandle, out curX, out curY); + int curCellX = (int)(curX / Constants.RegionSize); + int curCellY = (int)(curY / Constants.RegionSize); + int destCellX = (int)(finalDestination.RegionLocX / Constants.RegionSize); + int destCellY = (int)(finalDestination.RegionLocY / Constants.RegionSize); + +// m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Source co-ords are x={0} y={1}", curRegionX, curRegionY); +// +// m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Final dest is x={0} y={1} {2}@{3}", +// destRegionX, destRegionY, finalDestination.RegionID, finalDestination.ServerURI); + + // Check that these are not the same coordinates + if (finalDestination.RegionLocX == sp.Scene.RegionInfo.RegionLocX && + finalDestination.RegionLocY == sp.Scene.RegionInfo.RegionLocY) + { + // Can't do. Viewer crashes + sp.ControllingClient.SendTeleportFailed("Space warp! You would crash. Move to a different region and try again."); + return; + } + + if (Math.Abs(curCellX - destCellX) > MaxTransferDistance || Math.Abs(curCellY - destCellY) > MaxTransferDistance) + { + sp.ControllingClient.SendTeleportFailed( + string.Format( + "Can't teleport to {0} ({1},{2}) from {3} ({4},{5}), destination is more than {6} regions way", + finalDestination.RegionName, destCellX, destCellY, + sp.Scene.RegionInfo.RegionName, curCellX, curCellY, + MaxTransferDistance)); + + return; + } + + // + // This is it + // + DoTeleport(sp, reg, finalDestination, position, lookAt, teleportFlags); + // + // + // + } + else + { + finalDestination = null; + + // TP to a place that doesn't exist (anymore) + // Inform the viewer about that + sp.ControllingClient.SendTeleportFailed("The region you tried to teleport to doesn't exist anymore"); + + // and set the map-tile to '(Offline)' + uint regX, regY; + Utils.LongToUInts(regionHandle, out regX, out regY); + + MapBlockData block = new MapBlockData(); + block.X = (ushort)(regX / Constants.RegionSize); + block.Y = (ushort)(regY / Constants.RegionSize); + block.Access = 254; // == not there + + List blocks = new List(); + blocks.Add(block); + sp.ControllingClient.SendMapBlock(blocks, 0); + } + } + + public void DoTeleport( + ScenePresence sp, GridRegion reg, GridRegion finalDestination, + Vector3 position, Vector3 lookAt, uint teleportFlags) + { + IEventQueue eq = sp.Scene.RequestModuleInterface(); + if (reg == null || finalDestination == null) { sp.ControllingClient.SendTeleportFailed("Unable to locate destination"); diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs index 488bbcbbe7..b578bcb788 100644 --- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs +++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs @@ -242,13 +242,14 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer return; } - IEventQueue eq = sp.Scene.RequestModuleInterface(); GridRegion homeGatekeeper = MakeRegion(aCircuit); m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: teleporting user {0} {1} home to {2} via {3}:{4}", aCircuit.firstname, aCircuit.lastname, finalDestination.RegionName, homeGatekeeper.ServerURI, homeGatekeeper.RegionName); - DoTeleport(sp, homeGatekeeper, finalDestination, position, lookAt, (uint)(Constants.TeleportFlags.SetLastToTarget | Constants.TeleportFlags.ViaHome), eq); + DoTeleport( + sp, homeGatekeeper, finalDestination, + position, lookAt, (uint)(Constants.TeleportFlags.SetLastToTarget | Constants.TeleportFlags.ViaHome)); } /// @@ -288,17 +289,17 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer { ScenePresence sp = scene.GetScenePresence(remoteClient.AgentId); IEntityTransferModule transferMod = scene.RequestModuleInterface(); - IEventQueue eq = sp.Scene.RequestModuleInterface(); - if (transferMod != null && sp != null && eq != null) - transferMod.DoTeleport(sp, gatekeeper, finalDestination, lm.Position, - Vector3.UnitX, (uint)(Constants.TeleportFlags.SetLastToTarget | Constants.TeleportFlags.ViaLandmark), eq); + + if (transferMod != null && sp != null) + transferMod.DoTeleport( + sp, gatekeeper, finalDestination, lm.Position, Vector3.UnitX, + (uint)(Constants.TeleportFlags.SetLastToTarget | Constants.TeleportFlags.ViaLandmark)); } } // can't find the region: Tell viewer and abort remoteClient.SendTeleportFailed("The teleport destination could not be found."); - } #endregion diff --git a/OpenSim/Region/Framework/Interfaces/IEntityTransferModule.cs b/OpenSim/Region/Framework/Interfaces/IEntityTransferModule.cs index 07e97d5630..18e9e3c021 100644 --- a/OpenSim/Region/Framework/Interfaces/IEntityTransferModule.cs +++ b/OpenSim/Region/Framework/Interfaces/IEntityTransferModule.cs @@ -37,12 +37,41 @@ namespace OpenSim.Region.Framework.Interfaces { public interface IEntityTransferModule { - void Teleport(ScenePresence agent, ulong regionHandle, Vector3 position, - Vector3 lookAt, uint teleportFlags); + /// + /// Teleport an agent within the same or to a different region. + /// + /// + /// + /// The handle of the destination region. If it's the same as the region currently + /// occupied by the agent then the teleport will be within that region. + /// + /// + /// + /// + void Teleport(ScenePresence agent, ulong regionHandle, Vector3 position, Vector3 lookAt, uint teleportFlags); - void DoTeleport(ScenePresence sp, GridRegion reg, GridRegion finalDestination, - Vector3 position, Vector3 lookAt, uint teleportFlags, IEventQueue eq); + /// + /// Teleport an agent directly to a given region without checking whether the region should be subsituted. + /// + /// + /// Please use Teleport() instead unless you know exactly what you're doing. + /// Do not use for same region teleports. + /// + /// + /// + /// /param> + /// + /// + /// + void DoTeleport( + ScenePresence sp, GridRegion reg, GridRegion finalDestination, + Vector3 position, Vector3 lookAt, uint teleportFlags); + /// + /// Teleports the agent for the given client to their home destination. + /// + /// + /// void TeleportHome(UUID id, IClientAPI client); bool Cross(ScenePresence agent, bool isFlying); From 5786521103eb6721e86e4abfce742019b960491e Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Tue, 1 May 2012 18:38:46 +0100 Subject: [PATCH 139/547] Move max teleport distance check down into etm.DoTeleport() since this should apply to all teleport calls, not just those through Teleport() --- .../EntityTransfer/EntityTransferModule.cs | 81 ++++++++++--------- 1 file changed, 41 insertions(+), 40 deletions(-) diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs index b547317509..230706e042 100644 --- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs +++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs @@ -51,15 +51,12 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer { private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + public const int DefaultMaxTransferDistance = 4095; + /// /// The maximum distance, in standard region units (256m) that an agent is allowed to transfer. /// - private int m_MaxTransferDistance = 4095; - public int MaxTransferDistance - { - get { return m_MaxTransferDistance; } - set { m_MaxTransferDistance = value; } - } + public int MaxTransferDistance { get; set; } protected bool m_Enabled = false; protected Scene m_aScene; @@ -102,9 +99,9 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer { IConfig transferConfig = source.Configs["EntityTransfer"]; if (transferConfig != null) - { - MaxTransferDistance = transferConfig.GetInt("max_distance", 4095); - } + MaxTransferDistance = transferConfig.GetInt("max_distance", DefaultMaxTransferDistance); + else + MaxTransferDistance = DefaultMaxTransferDistance; m_agentsInTransit = new List(); m_Enabled = true; @@ -288,18 +285,6 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer return; } - uint curX = 0, curY = 0; - Utils.LongToUInts(sp.Scene.RegionInfo.RegionHandle, out curX, out curY); - int curCellX = (int)(curX / Constants.RegionSize); - int curCellY = (int)(curY / Constants.RegionSize); - int destCellX = (int)(finalDestination.RegionLocX / Constants.RegionSize); - int destCellY = (int)(finalDestination.RegionLocY / Constants.RegionSize); - -// m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Source co-ords are x={0} y={1}", curRegionX, curRegionY); -// -// m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Final dest is x={0} y={1} {2}@{3}", -// destRegionX, destRegionY, finalDestination.RegionID, finalDestination.ServerURI); - // Check that these are not the same coordinates if (finalDestination.RegionLocX == sp.Scene.RegionInfo.RegionLocX && finalDestination.RegionLocY == sp.Scene.RegionInfo.RegionLocY) @@ -309,18 +294,6 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer return; } - if (Math.Abs(curCellX - destCellX) > MaxTransferDistance || Math.Abs(curCellY - destCellY) > MaxTransferDistance) - { - sp.ControllingClient.SendTeleportFailed( - string.Format( - "Can't teleport to {0} ({1},{2}) from {3} ({4},{5}), destination is more than {6} regions way", - finalDestination.RegionName, destCellX, destCellY, - sp.Scene.RegionInfo.RegionName, curCellX, curCellY, - MaxTransferDistance)); - - return; - } - // // This is it // @@ -332,7 +305,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer else { finalDestination = null; - + // TP to a place that doesn't exist (anymore) // Inform the viewer about that sp.ControllingClient.SendTeleportFailed("The region you tried to teleport to doesn't exist anymore"); @@ -352,10 +325,44 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer } } + /// + /// Determines whether this instance is within the max transfer distance. + /// + /// + /// + /// + /// true if this instance is within max transfer distance; otherwise, false. + /// + private bool IsWithinMaxTeleportDistance(RegionInfo sourceRegion, GridRegion destRegion) + { +// m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Source co-ords are x={0} y={1}", curRegionX, curRegionY); +// +// m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Final dest is x={0} y={1} {2}@{3}", +// destRegionX, destRegionY, finalDestination.RegionID, finalDestination.ServerURI); + + // Insanely, RegionLoc on RegionInfo is the 256m map co-ord whilst GridRegion.RegionLoc is the raw meters position. + return Math.Abs(sourceRegion.RegionLocX - destRegion.RegionCoordX) <= MaxTransferDistance + && Math.Abs(sourceRegion.RegionLocY - destRegion.RegionCoordY) <= MaxTransferDistance; + } + public void DoTeleport( ScenePresence sp, GridRegion reg, GridRegion finalDestination, Vector3 position, Vector3 lookAt, uint teleportFlags) { + RegionInfo sourceRegion = sp.Scene.RegionInfo; + + if (!IsWithinMaxTeleportDistance(sourceRegion, finalDestination)) + { + sp.ControllingClient.SendTeleportFailed( + string.Format( + "Can't teleport to {0} ({1},{2}) from {3} ({4},{5}), destination is more than {6} regions way", + finalDestination.RegionName, finalDestination.RegionCoordX, finalDestination.RegionCoordY, + sourceRegion.RegionName, sourceRegion.RegionLocX, sourceRegion.RegionLocY, + MaxTransferDistance)); + + return; + } + IEventQueue eq = sp.Scene.RequestModuleInterface(); if (reg == null || finalDestination == null) @@ -665,7 +672,6 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer protected virtual bool IsOutsideRegion(Scene s, Vector3 pos) { - if (s.TestBorderCross(pos, Cardinals.N)) return true; if (s.TestBorderCross(pos, Cardinals.S)) @@ -806,7 +812,6 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer neighboury = ba.TriggerRegionY; neighbourx = ba.TriggerRegionX; - Vector3 newposition = pos; newposition.X += (scene.RegionInfo.RegionLocX - neighbourx) * Constants.RegionSize; newposition.Y += (scene.RegionInfo.RegionLocY - neighboury) * Constants.RegionSize; @@ -814,7 +819,6 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer String.Format("Moving you to region {0},{1}", neighbourx, neighboury), false); InformClientToInitateTeleportToLocation(agent, neighbourx, neighboury, newposition, scene); - return true; } @@ -854,8 +858,6 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer neighboury += (uint)(int)(c.BorderLine.Z / (int)Constants.RegionSize); newpos.Y = enterDistance; } - - } else if (scene.TestBorderCross(pos + southCross, Cardinals.S)) { @@ -882,7 +884,6 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer } else if (scene.TestBorderCross(pos + northCross, Cardinals.N)) { - Border b = scene.GetCrossedBorder(pos + northCross, Cardinals.N); neighboury += (uint)(int)(b.BorderLine.Z / (int)Constants.RegionSize); newpos.Y = enterDistance; From 9d2e1c67a8969e4769006c7347505b58a7827b3f Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Tue, 1 May 2012 23:14:12 +0100 Subject: [PATCH 140/547] Add regression test for teleporting between neighbouring regions on the same simulator This adds a non-advertised wait_for_callback option in [EntityTransfer]. Default is always true. Teleport tests disable the wait for callback from the destination region in order to run within a single thread. --- .../Linden/UDP/Tests/LLImageManagerTests.cs | 3 +- .../ClientStack/RegionApplicationBase.cs | 2 +- .../EntityTransfer/EntityTransferModule.cs | 30 ++++- .../Tests/InventoryAccessModuleTests.cs | 7 +- .../Region/Framework/Scenes/ScenePresence.cs | 4 +- .../Scenes/Tests/ScenePresenceAgentTests.cs | 3 +- .../Tests/ScenePresenceTeleportTests.cs | 112 ++++++++++++++++-- OpenSim/Tests/Common/Helpers/SceneHelpers.cs | 72 ++++++++++- OpenSim/Tests/Common/Mock/TestClient.cs | 39 +++++- OpenSim/Tests/Common/TestHelpers.cs | 9 +- 10 files changed, 248 insertions(+), 33 deletions(-) diff --git a/OpenSim/Region/ClientStack/Linden/UDP/Tests/LLImageManagerTests.cs b/OpenSim/Region/ClientStack/Linden/UDP/Tests/LLImageManagerTests.cs index 221f02bda9..5fcf376b84 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/Tests/LLImageManagerTests.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/Tests/LLImageManagerTests.cs @@ -79,7 +79,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP.Tests J2KDecoderModule j2kdm = new J2KDecoderModule(); - scene = new SceneHelpers().SetupScene(); + SceneHelpers sceneHelpers = new SceneHelpers(); + scene = sceneHelpers.SetupScene(); SceneHelpers.SetupSceneModules(scene, j2kdm); tc = new TestClient(SceneHelpers.GenerateAgentData(userId), scene); diff --git a/OpenSim/Region/ClientStack/RegionApplicationBase.cs b/OpenSim/Region/ClientStack/RegionApplicationBase.cs index 6e3a58e63a..6e78d6d774 100644 --- a/OpenSim/Region/ClientStack/RegionApplicationBase.cs +++ b/OpenSim/Region/ClientStack/RegionApplicationBase.cs @@ -111,7 +111,7 @@ namespace OpenSim.Region.ClientStack server.Start(); } } - + base.StartupSpecific(); } diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs index 230706e042..35486bb5c1 100644 --- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs +++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs @@ -52,12 +52,20 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); public const int DefaultMaxTransferDistance = 4095; + public const bool EnableWaitForCallbackFromTeleportDestDefault = true; + /// /// The maximum distance, in standard region units (256m) that an agent is allowed to transfer. /// public int MaxTransferDistance { get; set; } + /// + /// If true then on a teleport, the source region waits for a callback from the destination region. If + /// a callback fails to arrive within a set time then the user is pulled back into the source region. + /// + public bool EnableWaitForCallbackFromTeleportDest { get; set; } + protected bool m_Enabled = false; protected Scene m_aScene; protected List m_Scenes = new List(); @@ -99,9 +107,16 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer { IConfig transferConfig = source.Configs["EntityTransfer"]; if (transferConfig != null) + { + EnableWaitForCallbackFromTeleportDest + = transferConfig.GetBoolean("wait_for_callback", EnableWaitForCallbackFromTeleportDestDefault); + MaxTransferDistance = transferConfig.GetInt("max_distance", DefaultMaxTransferDistance); + } else + { MaxTransferDistance = DefaultMaxTransferDistance; + } m_agentsInTransit = new List(); m_Enabled = true; @@ -499,6 +514,9 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer } else { + ICapabilitiesModule capModule = sp.Scene.CapsModule; + ulong regionHandle = reg.RegionHandle; + capModule.GetChildSeed(UUID.Zero, regionHandle); agentCircuit.CapsPath = sp.Scene.CapsModule.GetChildSeed(sp.UUID, reg.RegionHandle); capsPath = finalDestination.ServerURI + CapsUtil.GetCapsSeedPath(agentCircuit.CapsPath); } @@ -527,7 +545,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer sp.ControllingClient.SendTeleportProgress(teleportFlags | (uint)TeleportFlags.DisableCancel, "sending_dest"); m_log.DebugFormat( - "[ENTITY TRANSFER MODULE]: Sending new CAPS seed url {0} to client {1}", capsPath, sp.UUID); + "[ENTITY TRANSFER MODULE]: Sending new CAPS seed url {0} from {1} to {2}", + capsPath, sp.Scene.RegionInfo.RegionName, sp.Name); if (eq != null) { @@ -546,7 +565,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer // TeleportFinish makes the client send CompleteMovementIntoRegion (at the destination), which // trigers a whole shebang of things there, including MakeRoot. So let's wait for confirmation // that the client contacted the destination before we close things here. - if (!WaitForCallback(sp.UUID)) + if (EnableWaitForCallbackFromTeleportDest && !WaitForCallback(sp.UUID)) { m_log.WarnFormat( "[ENTITY TRANSFER MODULE]: Teleport of {0} to {1} failed due to no callback from destination region. Returning avatar to source region.", @@ -1286,7 +1305,6 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer { if (neighbour.RegionHandle != sp.Scene.RegionInfo.RegionHandle) { - AgentCircuitData currentAgentCircuit = sp.Scene.AuthenticateHandler.GetAgentCircuitData(sp.ControllingClient.CircuitCode); AgentCircuitData agent = sp.ControllingClient.RequestClientInfo(); agent.BaseFolder = UUID.Zero; @@ -1311,7 +1329,9 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer seeds.Add(neighbour.RegionHandle, agent.CapsPath); } else + { agent.CapsPath = sp.Scene.CapsModule.GetChildSeed(sp.UUID, neighbour.RegionHandle); + } cagents.Add(agent); } @@ -1926,7 +1946,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer int count = 200; while (m_agentsInTransit.Contains(id) && count-- > 0) { - //m_log.Debug(" >>> Waiting... " + count); +// m_log.Debug(" >>> Waiting... " + count); Thread.Sleep(100); } @@ -1934,6 +1954,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer return true; else return false; + + return true; } protected void SetInTransit(UUID id) diff --git a/OpenSim/Region/CoreModules/Framework/InventoryAccess/Tests/InventoryAccessModuleTests.cs b/OpenSim/Region/CoreModules/Framework/InventoryAccess/Tests/InventoryAccessModuleTests.cs index d6afaa9e75..21d8bd77a9 100644 --- a/OpenSim/Region/CoreModules/Framework/InventoryAccess/Tests/InventoryAccessModuleTests.cs +++ b/OpenSim/Region/CoreModules/Framework/InventoryAccess/Tests/InventoryAccessModuleTests.cs @@ -64,8 +64,9 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess.Tests IConfigSource config = new IniConfigSource(); config.AddConfig("Modules"); config.Configs["Modules"].Set("InventoryAccessModule", "BasicInventoryAccessModule"); - - m_scene = new SceneHelpers().SetupScene(); + + SceneHelpers sceneHelpers = new SceneHelpers(); + m_scene = sceneHelpers.SetupScene(); SceneHelpers.SetupSceneModules(m_scene, config, m_iam); // Create user @@ -76,7 +77,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess.Tests AgentCircuitData acd = new AgentCircuitData(); acd.AgentID = m_userId; - m_tc = new TestClient(acd, m_scene); + m_tc = new TestClient(acd, m_scene); } [Test] diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index f1d092616c..e5a9a996ba 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs @@ -2895,8 +2895,8 @@ namespace OpenSim.Region.Framework.Scenes x = x / Constants.RegionSize; y = y / Constants.RegionSize; - //m_log.Debug("---> x: " + x + "; newx:" + newRegionX + "; Abs:" + (int)Math.Abs((int)(x - newRegionX))); - //m_log.Debug("---> y: " + y + "; newy:" + newRegionY + "; Abs:" + (int)Math.Abs((int)(y - newRegionY))); +// m_log.Debug("---> x: " + x + "; newx:" + newRegionX + "; Abs:" + (int)Math.Abs((int)(x - newRegionX))); +// m_log.Debug("---> y: " + y + "; newy:" + newRegionY + "; Abs:" + (int)Math.Abs((int)(y - newRegionY))); if (Util.IsOutsideView(DrawDistance, x, newRegionX, y, newRegionY)) { byebyeRegions.Add(handle); diff --git a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAgentTests.cs b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAgentTests.cs index 2e46377901..1aa48d7520 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAgentTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAgentTests.cs @@ -128,7 +128,8 @@ namespace OpenSim.Region.Framework.Scenes.Tests IConfig config = configSource.AddConfig("Modules"); config.Set("SimulationServices", "LocalSimulationConnectorModule"); - TestScene scene = new SceneHelpers().SetupScene(); + SceneHelpers sceneHelpers = new SceneHelpers(); + TestScene scene = sceneHelpers.SetupScene(); SceneHelpers.SetupSceneModules(scene, configSource, lsc); UUID agentId = TestHelpers.ParseTail(0x01); diff --git a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTeleportTests.cs b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTeleportTests.cs index c750cc5d10..ea4fb66b4e 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTeleportTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTeleportTests.cs @@ -33,8 +33,9 @@ using OpenMetaverse; using OpenSim.Framework; using OpenSim.Framework.Communications; using OpenSim.Framework.Servers; -using OpenSim.Region.CoreModules.Framework.EntityTransfer; using OpenSim.Region.Framework.Interfaces; +using OpenSim.Region.CoreModules.Framework; +using OpenSim.Region.CoreModules.Framework.EntityTransfer; using OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation; using OpenSim.Tests.Common; using OpenSim.Tests.Common.Mock; @@ -49,6 +50,22 @@ namespace OpenSim.Region.Framework.Scenes.Tests [TestFixture] public class ScenePresenceTeleportTests { + [TestFixtureSetUp] + public void FixtureInit() + { + // Don't allow tests to be bamboozled by asynchronous events. Execute everything on the same thread. + Util.FireAndForgetMethod = FireAndForgetMethod.RegressionTest; + } + + [TestFixtureTearDown] + public void TearDown() + { + // We must set this back afterwards, otherwise later tests will fail since they're expecting multiple + // threads. Possibly, later tests should be rewritten so none of them require async stuff (which regression + // tests really shouldn't). + Util.FireAndForgetMethod = Util.DefaultFireAndForgetMethod; + } + [Test] public void TestSameRegionTeleport() { @@ -96,10 +113,14 @@ namespace OpenSim.Region.Framework.Scenes.Tests LocalSimulationConnectorModule lscm = new LocalSimulationConnectorModule(); IConfigSource config = new IniConfigSource(); - config.AddConfig("Modules"); - // Not strictly necessary since FriendsModule assumes it is the default (!) - config.Configs["Modules"].Set("EntityTransferModule", etm.Name); - config.Configs["Modules"].Set("SimulationServices", lscm.Name); + IConfig modulesConfig = config.AddConfig("Modules"); + modulesConfig.Set("EntityTransferModule", etm.Name); + modulesConfig.Set("SimulationServices", lscm.Name); + IConfig entityTransferConfig = config.AddConfig("EntityTransfer"); + + // In order to run a single threaded regression test we do not want the entity transfer module waiting + // for a callback from the destination scene before removing its avatar data. + entityTransferConfig.Set("wait_for_callback", false); SceneHelpers sh = new SceneHelpers(); TestScene sceneA = sh.SetupScene("sceneA", TestHelpers.ParseTail(0x100), 1000, 1000); @@ -110,12 +131,12 @@ namespace OpenSim.Region.Framework.Scenes.Tests Vector3 teleportPosition = new Vector3(10, 11, 12); Vector3 teleportLookAt = new Vector3(20, 21, 22); - ScenePresence sp = SceneHelpers.AddScenePresence(sceneA, userId); + ScenePresence sp = SceneHelpers.AddScenePresence(sceneA, userId, sh.SceneManager); sp.AbsolutePosition = new Vector3(30, 31, 32); // XXX: A very nasty hack to tell the client about the destination scene without having to crank the whole // UDP stack (?) - ((TestClient)sp.ControllingClient).TeleportTargetScene = sceneB; +// ((TestClient)sp.ControllingClient).TeleportTargetScene = sceneB; sceneA.RequestTeleportLocation( sp.ControllingClient, @@ -124,6 +145,8 @@ namespace OpenSim.Region.Framework.Scenes.Tests teleportLookAt, (uint)TeleportFlags.ViaLocation); + ((TestClient)sp.ControllingClient).CompleteTeleportClientSide(); + Assert.That(sceneA.GetScenePresence(userId), Is.Null); ScenePresence sceneBSp = sceneB.GetScenePresence(userId); @@ -137,5 +160,80 @@ namespace OpenSim.Region.Framework.Scenes.Tests // position instead). // Assert.That(sp.Lookat, Is.EqualTo(teleportLookAt)); } + + [Test] + public void TestSameSimulatorNeighbouringRegionsTeleport() + { + TestHelpers.InMethod(); +// TestHelpers.EnableLogging(); + + UUID userId = TestHelpers.ParseTail(0x1); + + EntityTransferModule etm = new EntityTransferModule(); + LocalSimulationConnectorModule lscm = new LocalSimulationConnectorModule(); + + IConfigSource config = new IniConfigSource(); + IConfig modulesConfig = config.AddConfig("Modules"); + modulesConfig.Set("EntityTransferModule", etm.Name); + modulesConfig.Set("SimulationServices", lscm.Name); + IConfig entityTransferConfig = config.AddConfig("EntityTransfer"); + + // In order to run a single threaded regression test we do not want the entity transfer module waiting + // for a callback from the destination scene before removing its avatar data. + entityTransferConfig.Set("wait_for_callback", false); + + SceneHelpers sh = new SceneHelpers(); + TestScene sceneA = sh.SetupScene("sceneA", TestHelpers.ParseTail(0x100), 1000, 1000); + TestScene sceneB = sh.SetupScene("sceneB", TestHelpers.ParseTail(0x200), 1001, 1000); + + SceneHelpers.SetupSceneModules(new Scene[] { sceneA, sceneB }, config, etm, lscm); + SceneHelpers.SetupSceneModules(sceneA, new CapabilitiesModule()); + SceneHelpers.SetupSceneModules(sceneB, new CapabilitiesModule()); + + Vector3 teleportPosition = new Vector3(10, 11, 12); + Vector3 teleportLookAt = new Vector3(20, 21, 22); + + ScenePresence originalSp = SceneHelpers.AddScenePresence(sceneA, userId, sh.SceneManager); + originalSp.AbsolutePosition = new Vector3(30, 31, 32); + + ScenePresence beforeSceneASp = sceneA.GetScenePresence(userId); + Assert.That(beforeSceneASp, Is.Not.Null); + Assert.That(beforeSceneASp.IsChildAgent, Is.False); + + ScenePresence beforeSceneBSp = sceneB.GetScenePresence(userId); + Assert.That(beforeSceneBSp, Is.Not.Null); + Assert.That(beforeSceneBSp.IsChildAgent, Is.True); + + // XXX: A very nasty hack to tell the client about the destination scene without having to crank the whole + // UDP stack (?) +// ((TestClient)beforeSceneASp.ControllingClient).TeleportTargetScene = sceneB; + + sceneA.RequestTeleportLocation( + beforeSceneASp.ControllingClient, + sceneB.RegionInfo.RegionHandle, + teleportPosition, + teleportLookAt, + (uint)TeleportFlags.ViaLocation); + + ((TestClient)beforeSceneASp.ControllingClient).CompleteTeleportClientSide(); + + ScenePresence afterSceneASp = sceneA.GetScenePresence(userId); + Assert.That(afterSceneASp, Is.Not.Null); + Assert.That(afterSceneASp.IsChildAgent, Is.True); + + ScenePresence afterSceneBSp = sceneB.GetScenePresence(userId); + Assert.That(afterSceneBSp, Is.Not.Null); + Assert.That(afterSceneBSp.IsChildAgent, Is.False); + Assert.That(afterSceneBSp.Scene.RegionInfo.RegionName, Is.EqualTo(sceneB.RegionInfo.RegionName)); + Assert.That(afterSceneBSp.AbsolutePosition, Is.EqualTo(teleportPosition)); + + // TODO: Add assertions to check correct circuit details in both scenes. + + // Lookat is sent to the client only - sp.Lookat does not yield the same thing (calculation from camera + // position instead). +// Assert.That(sp.Lookat, Is.EqualTo(teleportLookAt)); + +// TestHelpers.DisableLogging(); + } } } \ No newline at end of file diff --git a/OpenSim/Tests/Common/Helpers/SceneHelpers.cs b/OpenSim/Tests/Common/Helpers/SceneHelpers.cs index 8e547077fc..dc24418145 100644 --- a/OpenSim/Tests/Common/Helpers/SceneHelpers.cs +++ b/OpenSim/Tests/Common/Helpers/SceneHelpers.cs @@ -58,6 +58,11 @@ namespace OpenSim.Tests.Common /// public class SceneHelpers { + /// + /// We need a scene manager so that test clients can retrieve a scene when performing teleport tests. + /// + public SceneManager SceneManager { get; private set; } + private AgentCircuitManager m_acm = new AgentCircuitManager(); private ISimulationDataService m_simDataService = OpenSim.Server.Base.ServerUtils.LoadPlugin("OpenSim.Tests.Common.dll", null); @@ -76,6 +81,8 @@ namespace OpenSim.Tests.Common public SceneHelpers(CoreAssetCache cache) { + SceneManager = new SceneManager(); + m_assetService = StartAssetService(cache); m_authenticationService = StartAuthenticationService(); m_inventoryService = StartInventoryService(); @@ -186,6 +193,8 @@ namespace OpenSim.Tests.Common testScene.LoginsDisabled = false; testScene.RegisterRegionWithGrid(); + SceneManager.Add(testScene); + return testScene; } @@ -350,6 +359,7 @@ namespace OpenSim.Tests.Common List newModules = new List(); foreach (object module in modules) { +// Console.WriteLine("MODULE RAW {0}", module); if (module is IRegionModule) { IRegionModule m = (IRegionModule)module; @@ -367,6 +377,7 @@ namespace OpenSim.Tests.Common // for the new system, everything has to be initialised first, // shared modules have to be post-initialised, then all get an AddRegion with the scene IRegionModuleBase m = (IRegionModuleBase)module; +// Console.WriteLine("MODULE {0}", m.Name); m.Initialise(config); newModules.Add(m); } @@ -426,6 +437,10 @@ namespace OpenSim.Tests.Common /// /// Add a root agent where the details of the agent connection (apart from the id) are unimportant for the test /// + /// + /// This can be used for tests where there is only one region or where there are multiple non-neighbour regions + /// and teleport doesn't take place. + /// /// /// /// @@ -434,6 +449,18 @@ namespace OpenSim.Tests.Common return AddScenePresence(scene, GenerateAgentData(agentId)); } + /// + /// Add a root agent where the details of the agent connection (apart from the id) are unimportant for the test + /// + /// + /// + /// + /// + public static ScenePresence AddScenePresence(Scene scene, UUID agentId, SceneManager sceneManager) + { + return AddScenePresence(scene, GenerateAgentData(agentId), sceneManager); + } + /// /// Add a root agent. /// @@ -453,6 +480,30 @@ namespace OpenSim.Tests.Common /// /// public static ScenePresence AddScenePresence(Scene scene, AgentCircuitData agentData) + { + return AddScenePresence(scene, agentData, null); + } + + /// + /// Add a root agent. + /// + /// + /// This function + /// + /// 1) Tells the scene that an agent is coming. Normally, the login service (local if standalone, from the + /// userserver if grid) would give initial login data back to the client and separately tell the scene that the + /// agent was coming. + /// + /// 2) Connects the agent with the scene + /// + /// This function performs actions equivalent with notifying the scene that an agent is + /// coming and then actually connecting the agent to the scene. The one step missed out is the very first + /// + /// + /// + /// + /// + public static ScenePresence AddScenePresence(Scene scene, AgentCircuitData agentData, SceneManager sceneManager) { // We emulate the proper login sequence here by doing things in four stages @@ -463,7 +514,7 @@ namespace OpenSim.Tests.Common lpsc.m_PresenceService.LoginAgent(agentData.AgentID.ToString(), agentData.SessionID, agentData.SecureSessionID); // Stages 1 & 2 - ScenePresence sp = IntroduceClientToScene(scene, agentData, TeleportFlags.ViaLogin); + ScenePresence sp = IntroduceClientToScene(scene, sceneManager, agentData, TeleportFlags.ViaLogin); // Stage 3: Complete the entrance into the region. This converts the child agent into a root agent. sp.CompleteMovement(sp.ControllingClient, true); @@ -471,7 +522,20 @@ namespace OpenSim.Tests.Common return sp; } - private static ScenePresence IntroduceClientToScene(Scene scene, AgentCircuitData agentData, TeleportFlags tf) + /// + /// Introduce an agent into the scene by adding a new client. + /// + /// The scene presence added + /// + /// Scene manager. Can be null if there is only one region in the test or multiple regions that are not + /// neighbours and where no teleporting takes place. + /// + /// + /// + /// + private static ScenePresence IntroduceClientToScene( + Scene scene, SceneManager sceneManager, AgentCircuitData agentData, TeleportFlags tf) { string reason; @@ -480,7 +544,7 @@ namespace OpenSim.Tests.Common Console.WriteLine("NewUserConnection failed: " + reason); // Stage 2: add the new client as a child agent to the scene - TestClient client = new TestClient(agentData, scene); + TestClient client = new TestClient(agentData, scene, sceneManager); scene.AddNewClient(client, PresenceType.User); return scene.GetScenePresence(agentData.AgentID); @@ -492,7 +556,7 @@ namespace OpenSim.Tests.Common acd.child = true; // XXX: ViaLogin may not be correct for child agents - return IntroduceClientToScene(scene, acd, TeleportFlags.ViaLogin); + return IntroduceClientToScene(scene, null, acd, TeleportFlags.ViaLogin); } /// diff --git a/OpenSim/Tests/Common/Mock/TestClient.cs b/OpenSim/Tests/Common/Mock/TestClient.cs index cb9840e4f7..36049a1386 100644 --- a/OpenSim/Tests/Common/Mock/TestClient.cs +++ b/OpenSim/Tests/Common/Mock/TestClient.cs @@ -46,12 +46,10 @@ namespace OpenSim.Tests.Common.Mock EventWaitHandle wh = new EventWaitHandle (false, EventResetMode.AutoReset, "Crossing"); - // TODO: This is a really nasty (and temporary) means of telling the test client which scene to invoke setup - // methods on when a teleport is requested - public Scene TeleportTargetScene; private TestClient TeleportSceneClient; private Scene m_scene; + private SceneManager m_sceneManager; // Properties so that we can get at received data for test purposes public List ReceivedOfflineNotifications { get; private set; } @@ -432,15 +430,29 @@ namespace OpenSim.Tests.Common.Mock /// /// Constructor /// + /// + /// Can be used for a test where there is only one region or where there are multiple regions that are not + /// neighbours and where no teleporting takes place. In other situations, the constructor that takes in a + /// scene manager should be used. + /// /// /// - public TestClient(AgentCircuitData agentData, Scene scene) + public TestClient(AgentCircuitData agentData, Scene scene) : this(agentData, scene, null) {} + + /// + /// Constructor + /// + /// + /// + /// + public TestClient(AgentCircuitData agentData, Scene scene, SceneManager sceneManager) { m_agentId = agentData.AgentID; m_firstName = agentData.firstname; m_lastName = agentData.lastname; m_circuitCode = agentData.circuitcode; m_scene = scene; + m_sceneManager = sceneManager; SessionId = agentData.SessionID; SecureSessionId = agentData.SecureSessionID; CapsSeedUrl = agentData.CapsPath; @@ -590,8 +602,16 @@ namespace OpenSim.Tests.Common.Mock AgentCircuitData newAgent = RequestClientInfo(); // Stage 2: add the new client as a child agent to the scene - TeleportSceneClient = new TestClient(newAgent, TeleportTargetScene); - TeleportTargetScene.AddNewClient(TeleportSceneClient, PresenceType.User); + uint x, y; + Utils.LongToUInts(neighbourHandle, out x, out y); + x /= Constants.RegionSize; + y /= Constants.RegionSize; + + Scene neighbourScene; + m_sceneManager.TryGetScene(x, y, out neighbourScene); + + TeleportSceneClient = new TestClient(newAgent, neighbourScene, m_sceneManager); + neighbourScene.AddNewClient(TeleportSceneClient, PresenceType.User); } public virtual void SendRegionTeleport(ulong regionHandle, byte simAccess, IPEndPoint regionExternalEndPoint, @@ -601,6 +621,13 @@ namespace OpenSim.Tests.Common.Mock CapsSeedUrl = capsURL; + // We don't do this here so that the source region can complete processing first in a single-threaded + // regression test scenario. The test itself will have to call CompleteTeleportClientSide() after a teleport + // CompleteTeleportClientSide(); + } + + public void CompleteTeleportClientSide() + { TeleportSceneClient.CompleteMovement(); //TeleportTargetScene.AgentCrossing(newAgent.AgentID, new Vector3(90, 90, 90), false); } diff --git a/OpenSim/Tests/Common/TestHelpers.cs b/OpenSim/Tests/Common/TestHelpers.cs index 5030d4bf7f..6744fcac97 100644 --- a/OpenSim/Tests/Common/TestHelpers.cs +++ b/OpenSim/Tests/Common/TestHelpers.cs @@ -46,7 +46,8 @@ namespace OpenSim.Tests.Common - + + @@ -62,9 +63,9 @@ namespace OpenSim.Tests.Common Encoding.UTF8.GetBytes( // ""))); //""))); - //""))); - //""))); - //""))); +// "")); +// ""))); +// "")); "")); public static bool AssertThisDelegateCausesArgumentException(TestDelegate d) From a29f7f7551c0b6d783d9c6df9f6a6487901dfd82 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Tue, 1 May 2012 23:25:30 +0100 Subject: [PATCH 141/547] Remove some test code that accidentally crept in with 9d2e1c67 --- .../Framework/EntityTransfer/EntityTransferModule.cs | 3 --- 1 file changed, 3 deletions(-) diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs index 35486bb5c1..75d1586565 100644 --- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs +++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs @@ -514,9 +514,6 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer } else { - ICapabilitiesModule capModule = sp.Scene.CapsModule; - ulong regionHandle = reg.RegionHandle; - capModule.GetChildSeed(UUID.Zero, regionHandle); agentCircuit.CapsPath = sp.Scene.CapsModule.GetChildSeed(sp.UUID, reg.RegionHandle); capsPath = finalDestination.ServerURI + CapsUtil.GetCapsSeedPath(agentCircuit.CapsPath); } From 40f3c24562e620e8f09b3569c0b643eb5eae013f Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Tue, 1 May 2012 23:49:02 +0100 Subject: [PATCH 142/547] Comment out the five second sleep in etm.DoTeleport() if the old agent needs to be closed because it is no longer in the child's view distance. This sleep appears unnecessary since a sleep has already occurred in WaitForCallback() whilst waiting for the destination region to notify of teleport success. There are no async operations between this sleep and the WaitForCallback() If this sleep is present, then teleporting back to the source region within 5 seconds results in a disconnection. If this sleep is commented out then teleporting quickly back and forth between two simulators appears to work without issue. Tested on standalone, local grid and distributed grid. Please revert if there's something that I've missed. --- .../Framework/EntityTransfer/EntityTransferModule.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs index 75d1586565..8d5e0a5890 100644 --- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs +++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs @@ -595,7 +595,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer if (NeedsClosing(sp.DrawDistance, oldRegionX, newRegionX, oldRegionY, newRegionY, reg)) { - Thread.Sleep(5000); +// Thread.Sleep(5000); sp.Close(); sp.Scene.IncomingCloseAgent(sp.UUID); } From 231a3bf147315a9284140476d2b09e13c3fee1c0 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 3 May 2012 01:45:49 +0100 Subject: [PATCH 143/547] Implement optional name and description on http stream handlers so that we can relate a slow request to what the handler actually does and the agent it serves, if applicable. This is most useful for capabilities where the url is not self-describing. --- .../FetchInventory2ServerConnector.cs | 3 +- .../GetMesh/GetMeshServerConnector.cs | 15 ++-- .../Handlers/GetTexture/GetTextureHandler.cs | 4 +- .../GetTexture/GetTextureServerConnector.cs | 6 +- .../Tests/GetTextureHandlerTests.cs | 2 +- .../UploadBakedTextureHandler.cs | 4 +- .../WebFetchInvDescServerConnector.cs | 8 +- OpenSim/Capabilities/LLSDStreamHandler.cs | 6 +- .../Servers/HttpServer/BaseHTTPHandler.cs | 10 +-- .../Servers/HttpServer/BaseHttpServer.cs | 16 +++- .../Servers/HttpServer/BaseRequestHandler.cs | 10 ++- .../Servers/HttpServer/BaseStreamHandler.cs | 9 +- .../Servers/HttpServer/BinaryStreamHandler.cs | 17 ++-- .../HttpServer/Interfaces/IStreamHandler.cs | 21 ++++- .../HttpServer/RestDeserialiseHandler.cs | 6 +- .../Servers/HttpServer/RestHTTPHandler.cs | 24 +++-- .../Servers/HttpServer/RestStreamHandler.cs | 14 +-- OpenSim/Region/Application/OpenSimBase.cs | 11 ++- .../Linden/Caps/BunchOfCaps/BunchOfCaps.cs | 47 +++++++--- .../Caps/EventQueue/EventQueueGetModule.cs | 8 +- .../Linden/Caps/FetchInventory2Module.cs | 3 +- .../ClientStack/Linden/Caps/GetMeshModule.cs | 12 +-- .../Linden/Caps/GetTextureModule.cs | 4 +- .../Linden/Caps/MeshUploadFlagModule.cs | 4 +- ...ewFileAgentInventoryVariablePriceModule.cs | 89 ++++++++++--------- .../Linden/Caps/ObjectCaps/ObjectAdd.cs | 14 +-- .../ObjectCaps/UploadObjectAssetModule.cs | 15 ++-- .../Linden/Caps/SimulatorFeaturesModule.cs | 4 +- .../Linden/Caps/UploadBakedTextureModule.cs | 4 +- .../Linden/Caps/WebFetchInvDescModule.cs | 9 +- .../World/Land/LandManagementModule.cs | 33 ++++--- .../World/Media/Moap/MoapModule.cs | 8 +- .../World/WorldMap/WorldMapModule.cs | 17 ++-- .../Framework/Scenes/RegionStatsHandler.cs | 9 +- .../FreeSwitchVoice/FreeSwitchVoiceModule.cs | 53 ++++++----- .../Voice/VivoxVoice/VivoxVoiceModule.cs | 54 ++++++----- .../Region/UserStatistics/WebStatsModule.cs | 17 ++-- .../Authentication/OpenIdServerHandler.cs | 2 + 38 files changed, 375 insertions(+), 217 deletions(-) diff --git a/OpenSim/Capabilities/Handlers/FetchInventory2/FetchInventory2ServerConnector.cs b/OpenSim/Capabilities/Handlers/FetchInventory2/FetchInventory2ServerConnector.cs index 0ba89315e1..5bab52fe94 100644 --- a/OpenSim/Capabilities/Handlers/FetchInventory2/FetchInventory2ServerConnector.cs +++ b/OpenSim/Capabilities/Handlers/FetchInventory2/FetchInventory2ServerConnector.cs @@ -63,7 +63,8 @@ namespace OpenSim.Capabilities.Handlers FetchInventory2Handler fiHandler = new FetchInventory2Handler(m_InventoryService); IRequestHandler reqHandler - = new RestStreamHandler("POST", "/CAPS/FetchInventory/", fiHandler.FetchInventoryRequest); + = new RestStreamHandler( + "POST", "/CAPS/FetchInventory/", fiHandler.FetchInventoryRequest, "FetchInventory", null); server.AddStreamHandler(reqHandler); } } diff --git a/OpenSim/Capabilities/Handlers/GetMesh/GetMeshServerConnector.cs b/OpenSim/Capabilities/Handlers/GetMesh/GetMeshServerConnector.cs index 2ecfa3c23b..8a275f3f5e 100644 --- a/OpenSim/Capabilities/Handlers/GetMesh/GetMeshServerConnector.cs +++ b/OpenSim/Capabilities/Handlers/GetMesh/GetMeshServerConnector.cs @@ -66,13 +66,14 @@ namespace OpenSim.Capabilities.Handlers throw new Exception(String.Format("Failed to load AssetService from {0}; config is {1}", assetService, m_ConfigName)); GetMeshHandler gmeshHandler = new GetMeshHandler(m_AssetService); - IRequestHandler reqHandler = new RestHTTPHandler("GET", "/CAPS/" + UUID.Random(), - delegate(Hashtable m_dhttpMethod) - { - return gmeshHandler.ProcessGetMesh(m_dhttpMethod, UUID.Zero, null); - }); + IRequestHandler reqHandler + = new RestHTTPHandler( + "GET", + "/CAPS/" + UUID.Random(), + httpMethod => gmeshHandler.ProcessGetMesh(httpMethod, UUID.Zero, null), + "GetMesh", + null); server.AddStreamHandler(reqHandler); } - } -} +} \ No newline at end of file diff --git a/OpenSim/Capabilities/Handlers/GetTexture/GetTextureHandler.cs b/OpenSim/Capabilities/Handlers/GetTexture/GetTextureHandler.cs index 217217e25e..abdbc7268b 100644 --- a/OpenSim/Capabilities/Handlers/GetTexture/GetTextureHandler.cs +++ b/OpenSim/Capabilities/Handlers/GetTexture/GetTextureHandler.cs @@ -58,8 +58,8 @@ namespace OpenSim.Capabilities.Handlers // TODO: Change this to a config option const string REDIRECT_URL = null; - public GetTextureHandler(string path, IAssetService assService) : - base("GET", path) + public GetTextureHandler(string path, IAssetService assService, string name, string description) + : base("GET", path, name, description) { m_assetService = assService; } diff --git a/OpenSim/Capabilities/Handlers/GetTexture/GetTextureServerConnector.cs b/OpenSim/Capabilities/Handlers/GetTexture/GetTextureServerConnector.cs index 0d072f71ff..71cf033437 100644 --- a/OpenSim/Capabilities/Handlers/GetTexture/GetTextureServerConnector.cs +++ b/OpenSim/Capabilities/Handlers/GetTexture/GetTextureServerConnector.cs @@ -62,8 +62,8 @@ namespace OpenSim.Capabilities.Handlers if (m_AssetService == null) throw new Exception(String.Format("Failed to load AssetService from {0}; config is {1}", assetService, m_ConfigName)); - server.AddStreamHandler(new GetTextureHandler("/CAPS/GetTexture/" /*+ UUID.Random() */, m_AssetService)); + server.AddStreamHandler( + new GetTextureHandler("/CAPS/GetTexture/" /*+ UUID.Random() */, m_AssetService, "GetTexture", null)); } - } -} +} \ No newline at end of file diff --git a/OpenSim/Capabilities/Handlers/GetTexture/Tests/GetTextureHandlerTests.cs b/OpenSim/Capabilities/Handlers/GetTexture/Tests/GetTextureHandlerTests.cs index 85e5cc65f1..761e4e7564 100644 --- a/OpenSim/Capabilities/Handlers/GetTexture/Tests/GetTextureHandlerTests.cs +++ b/OpenSim/Capabilities/Handlers/GetTexture/Tests/GetTextureHandlerTests.cs @@ -52,7 +52,7 @@ namespace OpenSim.Capabilities.Handlers.GetTexture.Tests // Overkill - we only really need the asset service, not a whole scene. Scene scene = new SceneHelpers().SetupScene(); - GetTextureHandler handler = new GetTextureHandler(null, scene.AssetService); + GetTextureHandler handler = new GetTextureHandler(null, scene.AssetService, "TestGetTexture", null); TestOSHttpRequest req = new TestOSHttpRequest(); TestOSHttpResponse resp = new TestOSHttpResponse(); req.Url = new Uri("http://localhost/?texture_id=00000000-0000-1111-9999-000000000012"); diff --git a/OpenSim/Capabilities/Handlers/UploadBakedTexture/UploadBakedTextureHandler.cs b/OpenSim/Capabilities/Handlers/UploadBakedTexture/UploadBakedTextureHandler.cs index 594ce9dad9..8849a59ce3 100644 --- a/OpenSim/Capabilities/Handlers/UploadBakedTexture/UploadBakedTextureHandler.cs +++ b/OpenSim/Capabilities/Handlers/UploadBakedTexture/UploadBakedTextureHandler.cs @@ -85,8 +85,8 @@ namespace OpenSim.Capabilities.Handlers uploader.OnUpLoad += BakedTextureUploaded; m_HostCapsObj.HttpListener.AddStreamHandler( - new BinaryStreamHandler("POST", capsBase + uploaderPath, - uploader.uploaderCaps)); + new BinaryStreamHandler( + "POST", capsBase + uploaderPath, uploader.uploaderCaps, "UploadBakedTexture", null)); string protocol = "http://"; diff --git a/OpenSim/Capabilities/Handlers/WebFetchInventoryDescendents/WebFetchInvDescServerConnector.cs b/OpenSim/Capabilities/Handlers/WebFetchInventoryDescendents/WebFetchInvDescServerConnector.cs index 92eeb140d0..5d86557dc3 100644 --- a/OpenSim/Capabilities/Handlers/WebFetchInventoryDescendents/WebFetchInvDescServerConnector.cs +++ b/OpenSim/Capabilities/Handlers/WebFetchInventoryDescendents/WebFetchInvDescServerConnector.cs @@ -68,7 +68,13 @@ namespace OpenSim.Capabilities.Handlers ServerUtils.LoadPlugin(libService, args); WebFetchInvDescHandler webFetchHandler = new WebFetchInvDescHandler(m_InventoryService, m_LibraryService); - IRequestHandler reqHandler = new RestStreamHandler("POST", "/CAPS/WebFetchInvDesc/" /*+ UUID.Random()*/, webFetchHandler.FetchInventoryDescendentsRequest); + IRequestHandler reqHandler + = new RestStreamHandler( + "POST", + "/CAPS/WebFetchInvDesc/" /*+ UUID.Random()*/, + webFetchHandler.FetchInventoryDescendentsRequest, + "WebFetchInvDesc", + null); server.AddStreamHandler(reqHandler); } diff --git a/OpenSim/Capabilities/LLSDStreamHandler.cs b/OpenSim/Capabilities/LLSDStreamHandler.cs index c7c1fc93db..f5c728ce91 100644 --- a/OpenSim/Capabilities/LLSDStreamHandler.cs +++ b/OpenSim/Capabilities/LLSDStreamHandler.cs @@ -39,7 +39,11 @@ namespace OpenSim.Framework.Capabilities private LLSDMethod m_method; public LLSDStreamhandler(string httpMethod, string path, LLSDMethod method) - : base(httpMethod, path) + : this(httpMethod, path, method, null, null) {} + + public LLSDStreamhandler( + string httpMethod, string path, LLSDMethod method, string name, string description) + : base(httpMethod, path, name, description) { m_method = method; } diff --git a/OpenSim/Framework/Servers/HttpServer/BaseHTTPHandler.cs b/OpenSim/Framework/Servers/HttpServer/BaseHTTPHandler.cs index 2fe9769b0f..9f8f4a8674 100644 --- a/OpenSim/Framework/Servers/HttpServer/BaseHTTPHandler.cs +++ b/OpenSim/Framework/Servers/HttpServer/BaseHTTPHandler.cs @@ -33,9 +33,9 @@ namespace OpenSim.Framework.Servers.HttpServer { public abstract Hashtable Handle(string path, Hashtable Request); - protected BaseHTTPHandler(string httpMethod, string path) - : base(httpMethod, path) - { - } + protected BaseHTTPHandler(string httpMethod, string path) : this(httpMethod, path, null, null) {} + + protected BaseHTTPHandler(string httpMethod, string path, string name, string description) + : base(httpMethod, path, name, description) {} } -} +} \ No newline at end of file diff --git a/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs b/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs index 0fbf90aac4..4ea4a1a6d2 100644 --- a/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs +++ b/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs @@ -156,7 +156,7 @@ namespace OpenSim.Framework.Servers.HttpServer } } - public List GetStreamHandlerKeys() + public List GetStreamHandlerKeys() { lock (m_streamHandlers) return new List(m_streamHandlers.Keys); @@ -410,6 +410,8 @@ namespace OpenSim.Framework.Servers.HttpServer // string reqnum = "unknown"; int tickstart = Environment.TickCount; + IRequestHandler requestHandler = null; + try { // OpenSim.Framework.WebUtil.OSHeaderRequestID @@ -438,8 +440,6 @@ namespace OpenSim.Framework.Servers.HttpServer //response.KeepAlive = true; response.SendChunked = false; - IRequestHandler requestHandler; - string path = request.RawUrl; string handlerKey = GetHandlerKey(request.HttpMethod, path); @@ -675,8 +675,16 @@ namespace OpenSim.Framework.Servers.HttpServer // since its just for reporting, tickdiff limit can be adjusted int tickdiff = Environment.TickCount - tickstart; if (tickdiff > 3000) + { m_log.InfoFormat( - "[BASE HTTP SERVER]: slow {0} request for {1} from {2} took {3} ms", requestMethod, uriString, request.RemoteIPEndPoint.ToString(), tickdiff); + "[BASE HTTP SERVER]: slow {0} for {1} {2} {3} from {4} took {5} ms", + requestMethod, + uriString, + requestHandler != null ? requestHandler.Name : "", + requestHandler != null ? requestHandler.Description : "", + request.RemoteIPEndPoint.ToString(), + tickdiff); + } } } diff --git a/OpenSim/Framework/Servers/HttpServer/BaseRequestHandler.cs b/OpenSim/Framework/Servers/HttpServer/BaseRequestHandler.cs index a2135a381f..ae7aaf2e3e 100644 --- a/OpenSim/Framework/Servers/HttpServer/BaseRequestHandler.cs +++ b/OpenSim/Framework/Servers/HttpServer/BaseRequestHandler.cs @@ -45,8 +45,16 @@ namespace OpenSim.Framework.Servers.HttpServer private readonly string m_path; - protected BaseRequestHandler(string httpMethod, string path) + public string Name { get; private set; } + + public string Description { get; private set; } + + protected BaseRequestHandler(string httpMethod, string path) : this(httpMethod, path, null, null) {} + + protected BaseRequestHandler(string httpMethod, string path, string name, string description) { + Name = name; + Description = description; m_httpMethod = httpMethod; m_path = path; } diff --git a/OpenSim/Framework/Servers/HttpServer/BaseStreamHandler.cs b/OpenSim/Framework/Servers/HttpServer/BaseStreamHandler.cs index f1cde747fc..6342983a55 100644 --- a/OpenSim/Framework/Servers/HttpServer/BaseStreamHandler.cs +++ b/OpenSim/Framework/Servers/HttpServer/BaseStreamHandler.cs @@ -34,8 +34,9 @@ namespace OpenSim.Framework.Servers.HttpServer public abstract byte[] Handle(string path, Stream request, IOSHttpRequest httpRequest, IOSHttpResponse httpResponse); - protected BaseStreamHandler(string httpMethod, string path) : base(httpMethod, path) - { - } + protected BaseStreamHandler(string httpMethod, string path) : this(httpMethod, path, null, null) {} + + protected BaseStreamHandler(string httpMethod, string path, string name, string description) + : base(httpMethod, path, name, description) {} } -} +} \ No newline at end of file diff --git a/OpenSim/Framework/Servers/HttpServer/BinaryStreamHandler.cs b/OpenSim/Framework/Servers/HttpServer/BinaryStreamHandler.cs index 1699233375..b94bfb4311 100644 --- a/OpenSim/Framework/Servers/HttpServer/BinaryStreamHandler.cs +++ b/OpenSim/Framework/Servers/HttpServer/BinaryStreamHandler.cs @@ -36,6 +36,15 @@ namespace OpenSim.Framework.Servers.HttpServer { private BinaryMethod m_method; + public BinaryStreamHandler(string httpMethod, string path, BinaryMethod binaryMethod) + : this(httpMethod, path, binaryMethod, null, null) {} + + public BinaryStreamHandler(string httpMethod, string path, BinaryMethod binaryMethod, string name, string description) + : base(httpMethod, path, name, description) + { + m_method = binaryMethod; + } + public override byte[] Handle(string path, Stream request, IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) { byte[] data = ReadFully(request); @@ -45,12 +54,6 @@ namespace OpenSim.Framework.Servers.HttpServer return Encoding.UTF8.GetBytes(responseString); } - public BinaryStreamHandler(string httpMethod, string path, BinaryMethod binaryMethod) - : base(httpMethod, path) - { - m_method = binaryMethod; - } - private static byte[] ReadFully(Stream stream) { byte[] buffer = new byte[1024]; @@ -70,4 +73,4 @@ namespace OpenSim.Framework.Servers.HttpServer } } } -} +} \ No newline at end of file diff --git a/OpenSim/Framework/Servers/HttpServer/Interfaces/IStreamHandler.cs b/OpenSim/Framework/Servers/HttpServer/Interfaces/IStreamHandler.cs index a449c2daa8..cb5cce5f79 100644 --- a/OpenSim/Framework/Servers/HttpServer/Interfaces/IStreamHandler.cs +++ b/OpenSim/Framework/Servers/HttpServer/Interfaces/IStreamHandler.cs @@ -32,6 +32,25 @@ namespace OpenSim.Framework.Servers.HttpServer { public interface IRequestHandler { + + /// + /// Name for this handler. + /// + /// + /// Used for diagnostics. The path doesn't always describe what the handler does. Can be null if none + /// specified. + /// + string Name { get; } + + /// + /// Description for this handler. + /// + /// + /// Used for diagnostics. The path doesn't always describe what the handler does. Can be null if none + /// specified. + /// + string Description { get; } + // Return response content type string ContentType { get; } @@ -58,4 +77,4 @@ namespace OpenSim.Framework.Servers.HttpServer { Hashtable Handle(string path, Hashtable request); } -} +} \ No newline at end of file diff --git a/OpenSim/Framework/Servers/HttpServer/RestDeserialiseHandler.cs b/OpenSim/Framework/Servers/HttpServer/RestDeserialiseHandler.cs index a467a83073..07082a8ebb 100644 --- a/OpenSim/Framework/Servers/HttpServer/RestDeserialiseHandler.cs +++ b/OpenSim/Framework/Servers/HttpServer/RestDeserialiseHandler.cs @@ -39,7 +39,11 @@ namespace OpenSim.Framework.Servers.HttpServer private RestDeserialiseMethod m_method; public RestDeserialiseHandler(string httpMethod, string path, RestDeserialiseMethod method) - : base(httpMethod, path) + : this(httpMethod, path, method, null, null) {} + + public RestDeserialiseHandler( + string httpMethod, string path, RestDeserialiseMethod method, string name, string description) + : base(httpMethod, path, name, description) { m_method = method; } diff --git a/OpenSim/Framework/Servers/HttpServer/RestHTTPHandler.cs b/OpenSim/Framework/Servers/HttpServer/RestHTTPHandler.cs index 1f23cacc08..7f898394fd 100644 --- a/OpenSim/Framework/Servers/HttpServer/RestHTTPHandler.cs +++ b/OpenSim/Framework/Servers/HttpServer/RestHTTPHandler.cs @@ -38,19 +38,25 @@ namespace OpenSim.Framework.Servers.HttpServer get { return m_dhttpMethod; } } - public override Hashtable Handle(string path, Hashtable request) - { - - string param = GetParam(path); - request.Add("param", param); - request.Add("path", path); - return m_dhttpMethod(request); - } - public RestHTTPHandler(string httpMethod, string path, GenericHTTPMethod dhttpMethod) : base(httpMethod, path) { m_dhttpMethod = dhttpMethod; } + + public RestHTTPHandler( + string httpMethod, string path, GenericHTTPMethod dhttpMethod, string name, string description) + : base(httpMethod, path, name, description) + { + m_dhttpMethod = dhttpMethod; + } + + public override Hashtable Handle(string path, Hashtable request) + { + string param = GetParam(path); + request.Add("param", param); + request.Add("path", path); + return m_dhttpMethod(request); + } } } diff --git a/OpenSim/Framework/Servers/HttpServer/RestStreamHandler.cs b/OpenSim/Framework/Servers/HttpServer/RestStreamHandler.cs index d2c4002cd5..1f17fee0d0 100644 --- a/OpenSim/Framework/Servers/HttpServer/RestStreamHandler.cs +++ b/OpenSim/Framework/Servers/HttpServer/RestStreamHandler.cs @@ -39,6 +39,15 @@ namespace OpenSim.Framework.Servers.HttpServer get { return m_restMethod; } } + public RestStreamHandler(string httpMethod, string path, RestMethod restMethod) + : this(httpMethod, path, restMethod, null, null) {} + + public RestStreamHandler(string httpMethod, string path, RestMethod restMethod, string name, string description) + : base(httpMethod, path, name, description) + { + m_restMethod = restMethod; + } + public override byte[] Handle(string path, Stream request, IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) { Encoding encoding = Encoding.UTF8; @@ -52,10 +61,5 @@ namespace OpenSim.Framework.Servers.HttpServer return Encoding.UTF8.GetBytes(responseString); } - - public RestStreamHandler(string httpMethod, string path, RestMethod restMethod) : base(httpMethod, path) - { - m_restMethod = restMethod; - } } } diff --git a/OpenSim/Region/Application/OpenSimBase.cs b/OpenSim/Region/Application/OpenSimBase.cs index 5de3f25b7d..79259d8b3c 100644 --- a/OpenSim/Region/Application/OpenSimBase.cs +++ b/OpenSim/Region/Application/OpenSimBase.cs @@ -388,7 +388,7 @@ namespace OpenSim scene.LoadPrimsFromStorage(regionInfo.originRegionID); // TODO : Try setting resource for region xstats here on scene - MainServer.Instance.AddStreamHandler(new Region.Framework.Scenes.RegionStatsHandler(regionInfo)); + MainServer.Instance.AddStreamHandler(new RegionStatsHandler(regionInfo)); scene.loadAllLandObjectsFromStorage(regionInfo.originRegionID); scene.EventManager.TriggerParcelPrimCountUpdate(); @@ -773,6 +773,9 @@ namespace OpenSim return Util.UTF8.GetBytes("OK"); } + public string Name { get { return "SimStatus"; } } + public string Description { get { return "Simulator Status"; } } + public string ContentType { get { return "text/plain"; } @@ -797,6 +800,9 @@ namespace OpenSim { OpenSimBase m_opensim; string osXStatsURI = String.Empty; + + public string Name { get { return "XSimStatus"; } } + public string Description { get { return "Simulator XStatus"; } } public XSimStatusHandler(OpenSimBase sim) { @@ -837,6 +843,9 @@ namespace OpenSim { OpenSimBase m_opensim; string osUXStatsURI = String.Empty; + + public string Name { get { return "UXSimStatus"; } } + public string Description { get { return "Simulator UXStatus"; } } public UXSimStatusHandler(OpenSimBase sim) { diff --git a/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs b/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs index e20c24f334..9791885ffa 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs @@ -155,7 +155,9 @@ namespace OpenSim.Region.ClientStack.Linden try { // the root of all evil - m_HostCapsObj.RegisterHandler("SEED", new RestStreamHandler("POST", capsBase + m_requestPath, SeedCapRequest)); + m_HostCapsObj.RegisterHandler( + "SEED", new RestStreamHandler("POST", capsBase + m_requestPath, SeedCapRequest, "SEED", null)); + m_log.DebugFormat( "[CAPS]: Registered seed capability {0} for {1}", capsBase + m_requestPath, m_HostCapsObj.AgentID); @@ -163,7 +165,10 @@ namespace OpenSim.Region.ClientStack.Linden // new LLSDStreamhandler("POST", // capsBase + m_mapLayerPath, // GetMapLayer); - IRequestHandler req = new RestStreamHandler("POST", capsBase + m_notecardTaskUpdatePath, ScriptTaskInventory); + IRequestHandler req + = new RestStreamHandler( + "POST", capsBase + m_notecardTaskUpdatePath, ScriptTaskInventory, "UpdateScript", null); + m_HostCapsObj.RegisterHandler("UpdateScriptTaskInventory", req); m_HostCapsObj.RegisterHandler("UpdateScriptTask", req); } @@ -178,14 +183,27 @@ namespace OpenSim.Region.ClientStack.Linden try { // I don't think this one works... - m_HostCapsObj.RegisterHandler("NewFileAgentInventory", new LLSDStreamhandler("POST", - capsBase + m_newInventory, - NewAgentInventoryRequest)); - IRequestHandler req = new RestStreamHandler("POST", capsBase + m_notecardUpdatePath, NoteCardAgentInventory); + m_HostCapsObj.RegisterHandler( + "NewFileAgentInventory", + new LLSDStreamhandler( + "POST", + capsBase + m_newInventory, + NewAgentInventoryRequest, + "NewFileAgentInventory", + null)); + + IRequestHandler req + = new RestStreamHandler( + "POST", capsBase + m_notecardUpdatePath, NoteCardAgentInventory, "Update*", null); + m_HostCapsObj.RegisterHandler("UpdateNotecardAgentInventory", req); m_HostCapsObj.RegisterHandler("UpdateScriptAgentInventory", req); m_HostCapsObj.RegisterHandler("UpdateScriptAgent", req); - m_HostCapsObj.RegisterHandler("CopyInventoryFromNotecard", new RestStreamHandler("POST", capsBase + m_copyFromNotecardPath, CopyInventoryFromNotecard)); + + m_HostCapsObj.RegisterHandler( + "CopyInventoryFromNotecard", + new RestStreamHandler( + "POST", capsBase + m_copyFromNotecardPath, CopyInventoryFromNotecard, "CopyInventoryFromNotecard", null)); // As of RC 1.22.9 of the Linden client this is // supported @@ -289,7 +307,9 @@ namespace OpenSim.Region.ClientStack.Linden m_dumpAssetsToFile); uploader.OnUpLoad += TaskScriptUpdated; - m_HostCapsObj.HttpListener.AddStreamHandler(new BinaryStreamHandler("POST", capsBase + uploaderPath, uploader.uploaderCaps)); + m_HostCapsObj.HttpListener.AddStreamHandler( + new BinaryStreamHandler( + "POST", capsBase + uploaderPath, uploader.uploaderCaps, "BunchOfCaps", null)); string protocol = "http://"; @@ -416,8 +436,14 @@ namespace OpenSim.Region.ClientStack.Linden AssetUploader uploader = new AssetUploader(assetName, assetDes, newAsset, newInvItem, parentFolder, llsdRequest.inventory_type, llsdRequest.asset_type, capsBase + uploaderPath, m_HostCapsObj.HttpListener, m_dumpAssetsToFile); + m_HostCapsObj.HttpListener.AddStreamHandler( - new BinaryStreamHandler("POST", capsBase + uploaderPath, uploader.uploaderCaps)); + new BinaryStreamHandler( + "POST", + capsBase + uploaderPath, + uploader.uploaderCaps, + "NewAgentInventoryRequest", + m_HostCapsObj.AgentID.ToString())); string protocol = "http://"; @@ -733,7 +759,8 @@ namespace OpenSim.Region.ClientStack.Linden uploader.OnUpLoad += ItemUpdated; m_HostCapsObj.HttpListener.AddStreamHandler( - new BinaryStreamHandler("POST", capsBase + uploaderPath, uploader.uploaderCaps)); + new BinaryStreamHandler( + "POST", capsBase + uploaderPath, uploader.uploaderCaps, "NoteCardAgentInventory", null)); string protocol = "http://"; diff --git a/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/EventQueueGetModule.cs b/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/EventQueueGetModule.cs index 7c07c56aa5..1a35d22c3b 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/EventQueueGetModule.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/EventQueueGetModule.cs @@ -351,14 +351,18 @@ namespace OpenSim.Region.ClientStack.Linden // EventQueueGet when it receive capability information, but then we replace the rest handler immediately // afterwards with the poll service. So for now, we'll pass a null instead to simplify code reading, but // really it should be possible to directly register the poll handler as a capability. - caps.RegisterHandler("EventQueueGet", - new RestHTTPHandler("POST", capsBase + EventQueueGetUUID.ToString() + "/", null)); + caps.RegisterHandler( + "EventQueueGet", + new RestHTTPHandler( + "POST", capsBase + EventQueueGetUUID.ToString() + "/", null)); + // delegate(Hashtable m_dhttpMethod) // { // return ProcessQueue(m_dhttpMethod, agentID, caps); // })); // This will persist this beyond the expiry of the caps handlers + // TODO: Add EventQueueGet name/description for diagnostics MainServer.Instance.AddPollServiceHTTPHandler( capsBase + EventQueueGetUUID.ToString() + "/", new PollServiceEventArgs(null, HasEvents, GetEvents, NoEvents, agentID)); diff --git a/OpenSim/Region/ClientStack/Linden/Caps/FetchInventory2Module.cs b/OpenSim/Region/ClientStack/Linden/Caps/FetchInventory2Module.cs index 14501c7314..cb5afcc38f 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/FetchInventory2Module.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/FetchInventory2Module.cs @@ -132,7 +132,8 @@ namespace OpenSim.Region.ClientStack.Linden capUrl = "/CAPS/" + UUID.Random(); IRequestHandler reqHandler - = new RestStreamHandler("POST", capUrl, m_fetchHandler.FetchInventoryRequest); + = new RestStreamHandler( + "POST", capUrl, m_fetchHandler.FetchInventoryRequest, capName, agentID.ToString()); caps.RegisterHandler(capName, reqHandler); } diff --git a/OpenSim/Region/ClientStack/Linden/Caps/GetMeshModule.cs b/OpenSim/Region/ClientStack/Linden/Caps/GetMeshModule.cs index e7bd2e764a..0d7b1fc6e6 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/GetMeshModule.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/GetMeshModule.cs @@ -120,11 +120,13 @@ namespace OpenSim.Region.ClientStack.Linden { // m_log.DebugFormat("[GETMESH]: /CAPS/{0} in region {1}", capID, m_scene.RegionInfo.RegionName); GetMeshHandler gmeshHandler = new GetMeshHandler(m_AssetService); - IRequestHandler reqHandler = new RestHTTPHandler("GET", "/CAPS/" + UUID.Random(), - delegate(Hashtable m_dhttpMethod) - { - return gmeshHandler.ProcessGetMesh(m_dhttpMethod, UUID.Zero, null); - }); + IRequestHandler reqHandler + = new RestHTTPHandler( + "GET", + "/CAPS/" + UUID.Random(), + httpMethod => gmeshHandler.ProcessGetMesh(httpMethod, UUID.Zero, null), + "GetMesh", + agentID.ToString()); caps.RegisterHandler("GetMesh", reqHandler); } diff --git a/OpenSim/Region/ClientStack/Linden/Caps/GetTextureModule.cs b/OpenSim/Region/ClientStack/Linden/Caps/GetTextureModule.cs index fffcee2b7e..5ae9cc3307 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/GetTextureModule.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/GetTextureModule.cs @@ -130,7 +130,9 @@ namespace OpenSim.Region.ClientStack.Linden if (m_URL == "localhost") { // m_log.DebugFormat("[GETTEXTURE]: /CAPS/{0} in region {1}", capID, m_scene.RegionInfo.RegionName); - caps.RegisterHandler("GetTexture", new GetTextureHandler("/CAPS/" + capID + "/", m_assetService)); + caps.RegisterHandler( + "GetTexture", + new GetTextureHandler("/CAPS/" + capID + "/", m_assetService, "GetTexture", agentID.ToString())); } else { diff --git a/OpenSim/Region/ClientStack/Linden/Caps/MeshUploadFlagModule.cs b/OpenSim/Region/ClientStack/Linden/Caps/MeshUploadFlagModule.cs index 18c7eaeb59..44a68839ca 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/MeshUploadFlagModule.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/MeshUploadFlagModule.cs @@ -117,7 +117,9 @@ namespace OpenSim.Region.ClientStack.Linden public void RegisterCaps(UUID agentID, Caps caps) { - IRequestHandler reqHandler = new RestHTTPHandler("GET", "/CAPS/" + UUID.Random(), MeshUploadFlag); + IRequestHandler reqHandler + = new RestHTTPHandler("GET", "/CAPS/" + UUID.Random(), MeshUploadFlag, "MeshUploadFlag", agentID.ToString()); + caps.RegisterHandler("MeshUploadFlag", reqHandler); m_agentID = agentID; } diff --git a/OpenSim/Region/ClientStack/Linden/Caps/NewFileAgentInventoryVariablePriceModule.cs b/OpenSim/Region/ClientStack/Linden/Caps/NewFileAgentInventoryVariablePriceModule.cs index 91872c5a34..52c4f44c8c 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/NewFileAgentInventoryVariablePriceModule.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/NewFileAgentInventoryVariablePriceModule.cs @@ -115,67 +115,66 @@ namespace OpenSim.Region.ClientStack.Linden UUID capID = UUID.Random(); // m_log.Debug("[NEW FILE AGENT INVENTORY VARIABLE PRICE]: /CAPS/" + capID); - caps.RegisterHandler("NewFileAgentInventoryVariablePrice", - - new LLSDStreamhandler("POST", - "/CAPS/" + capID.ToString(), - delegate(LLSDAssetUploadRequest req) - { - return NewAgentInventoryRequest(req,agentID); - })); - + caps.RegisterHandler( + "NewFileAgentInventoryVariablePrice", + new LLSDStreamhandler( + "POST", + "/CAPS/" + capID.ToString(), + req => NewAgentInventoryRequest(req, agentID), + "NewFileAgentInventoryVariablePrice", + agentID.ToString())); } #endregion public LLSDNewFileAngentInventoryVariablePriceReplyResponse NewAgentInventoryRequest(LLSDAssetUploadRequest llsdRequest, UUID agentID) { - //TODO: The Mesh uploader uploads many types of content. If you're going to implement a Money based limit - // You need to be aware of this and - + // you need to be aware of this //if (llsdRequest.asset_type == "texture" || // llsdRequest.asset_type == "animation" || // llsdRequest.asset_type == "sound") // { // check user level - ScenePresence avatar = null; - IClientAPI client = null; - m_scene.TryGetScenePresence(agentID, out avatar); - if (avatar != null) + ScenePresence avatar = null; + IClientAPI client = null; + m_scene.TryGetScenePresence(agentID, out avatar); + + if (avatar != null) + { + client = avatar.ControllingClient; + + if (avatar.UserLevel < m_levelUpload) { - client = avatar.ControllingClient; + if (client != null) + client.SendAgentAlertMessage("Unable to upload asset. Insufficient permissions.", false); - if (avatar.UserLevel < m_levelUpload) - { - if (client != null) - client.SendAgentAlertMessage("Unable to upload asset. Insufficient permissions.", false); - - LLSDNewFileAngentInventoryVariablePriceReplyResponse errorResponse = new LLSDNewFileAngentInventoryVariablePriceReplyResponse(); - errorResponse.rsvp = ""; - errorResponse.state = "error"; - return errorResponse; - } + LLSDNewFileAngentInventoryVariablePriceReplyResponse errorResponse = new LLSDNewFileAngentInventoryVariablePriceReplyResponse(); + errorResponse.rsvp = ""; + errorResponse.state = "error"; + return errorResponse; } + } - // check funds - IMoneyModule mm = m_scene.RequestModuleInterface(); + // check funds + IMoneyModule mm = m_scene.RequestModuleInterface(); - if (mm != null) + if (mm != null) + { + if (!mm.UploadCovered(agentID, mm.UploadCharge)) { - if (!mm.UploadCovered(agentID, mm.UploadCharge)) - { - if (client != null) - client.SendAgentAlertMessage("Unable to upload asset. Insufficient funds.", false); + if (client != null) + client.SendAgentAlertMessage("Unable to upload asset. Insufficient funds.", false); - LLSDNewFileAngentInventoryVariablePriceReplyResponse errorResponse = new LLSDNewFileAngentInventoryVariablePriceReplyResponse(); - errorResponse.rsvp = ""; - errorResponse.state = "error"; - return errorResponse; - } + LLSDNewFileAngentInventoryVariablePriceReplyResponse errorResponse = new LLSDNewFileAngentInventoryVariablePriceReplyResponse(); + errorResponse.rsvp = ""; + errorResponse.state = "error"; + return errorResponse; } + } + // } string assetName = llsdRequest.name; @@ -189,8 +188,14 @@ namespace OpenSim.Region.ClientStack.Linden AssetUploader uploader = new AssetUploader(assetName, assetDes, newAsset, newInvItem, parentFolder, llsdRequest.inventory_type, llsdRequest.asset_type, capsBase + uploaderPath, MainServer.Instance, m_dumpAssetsToFile); + MainServer.Instance.AddStreamHandler( - new BinaryStreamHandler("POST", capsBase + uploaderPath, uploader.uploaderCaps)); + new BinaryStreamHandler( + "POST", + capsBase + uploaderPath, + uploader.uploaderCaps, + "NewFileAgentInventoryVariablePrice", + agentID.ToString())); string protocol = "http://"; @@ -199,10 +204,9 @@ namespace OpenSim.Region.ClientStack.Linden string uploaderURL = protocol + m_scene.RegionInfo.ExternalHostName + ":" + MainServer.Instance.Port.ToString() + capsBase + uploaderPath; - + LLSDNewFileAngentInventoryVariablePriceReplyResponse uploadResponse = new LLSDNewFileAngentInventoryVariablePriceReplyResponse(); - uploadResponse.rsvp = uploaderURL; uploadResponse.state = "upload"; @@ -220,6 +224,7 @@ namespace OpenSim.Region.ClientStack.Linden pinventoryItem, pparentFolder, pdata, pinventoryType, passetType,agentID); }; + return uploadResponse; } diff --git a/OpenSim/Region/ClientStack/Linden/Caps/ObjectCaps/ObjectAdd.cs b/OpenSim/Region/ClientStack/Linden/Caps/ObjectCaps/ObjectAdd.cs index 1c47f0ef80..4ccfc434a6 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/ObjectCaps/ObjectAdd.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/ObjectCaps/ObjectAdd.cs @@ -66,12 +66,14 @@ namespace OpenSim.Region.ClientStack.Linden // m_log.InfoFormat("[OBJECTADD]: {0}", "/CAPS/OA/" + capuuid + "/"); - caps.RegisterHandler("ObjectAdd", - new RestHTTPHandler("POST", "/CAPS/OA/" + capuuid + "/", - delegate(Hashtable m_dhttpMethod) - { - return ProcessAdd(m_dhttpMethod, agentID, caps); - })); + caps.RegisterHandler( + "ObjectAdd", + new RestHTTPHandler( + "POST", + "/CAPS/OA/" + capuuid + "/", + httpMethod => ProcessAdd(httpMethod, agentID, caps), + "ObjectAdd", + agentID.ToString()));; } public Hashtable ProcessAdd(Hashtable request, UUID AgentId, Caps cap) diff --git a/OpenSim/Region/ClientStack/Linden/Caps/ObjectCaps/UploadObjectAssetModule.cs b/OpenSim/Region/ClientStack/Linden/Caps/ObjectCaps/UploadObjectAssetModule.cs index 7a3d97e5d3..f0f398417f 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/ObjectCaps/UploadObjectAssetModule.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/ObjectCaps/UploadObjectAssetModule.cs @@ -106,12 +106,15 @@ namespace OpenSim.Region.ClientStack.Linden UUID capID = UUID.Random(); // m_log.Debug("[UPLOAD OBJECT ASSET MODULE]: /CAPS/" + capID); - caps.RegisterHandler("UploadObjectAsset", - new RestHTTPHandler("POST", "/CAPS/OA/" + capID + "/", - delegate(Hashtable m_dhttpMethod) - { - return ProcessAdd(m_dhttpMethod, agentID, caps); - })); + caps.RegisterHandler( + "UploadObjectAsset", + new RestHTTPHandler( + "POST", + "/CAPS/OA/" + capID + "/", + httpMethod => ProcessAdd(httpMethod, agentID, caps), + "UploadObjectAsset", + agentID.ToString())); + /* caps.RegisterHandler("NewFileAgentInventoryVariablePrice", diff --git a/OpenSim/Region/ClientStack/Linden/Caps/SimulatorFeaturesModule.cs b/OpenSim/Region/ClientStack/Linden/Caps/SimulatorFeaturesModule.cs index 1dd8938fb0..8ed0fb3e1f 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/SimulatorFeaturesModule.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/SimulatorFeaturesModule.cs @@ -154,7 +154,9 @@ namespace OpenSim.Region.ClientStack.Linden public void RegisterCaps(UUID agentID, Caps caps) { IRequestHandler reqHandler - = new RestHTTPHandler("GET", "/CAPS/" + UUID.Random(), HandleSimulatorFeaturesRequest); + = new RestHTTPHandler( + "GET", "/CAPS/" + UUID.Random(), + HandleSimulatorFeaturesRequest, "SimulatorFeatures", agentID.ToString()); caps.RegisterHandler("SimulatorFeatures", reqHandler); } diff --git a/OpenSim/Region/ClientStack/Linden/Caps/UploadBakedTextureModule.cs b/OpenSim/Region/ClientStack/Linden/Caps/UploadBakedTextureModule.cs index 45d6071c24..b3d61a8be0 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/UploadBakedTextureModule.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/UploadBakedTextureModule.cs @@ -106,7 +106,9 @@ namespace OpenSim.Region.ClientStack.Linden "POST", "/CAPS/" + caps.CapsObjectPath + m_uploadBakedTexturePath, new UploadBakedTextureHandler( - caps, m_scene.AssetService, m_persistBakedTextures).UploadBakedTexture)); + caps, m_scene.AssetService, m_persistBakedTextures).UploadBakedTexture, + "UploadBakedTexture", + agentID.ToString())); } } } \ No newline at end of file diff --git a/OpenSim/Region/ClientStack/Linden/Caps/WebFetchInvDescModule.cs b/OpenSim/Region/ClientStack/Linden/Caps/WebFetchInvDescModule.cs index 10f43d192d..2359bd6683 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/WebFetchInvDescModule.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/WebFetchInvDescModule.cs @@ -144,7 +144,12 @@ namespace OpenSim.Region.ClientStack.Linden capUrl = "/CAPS/" + UUID.Random(); IRequestHandler reqHandler - = new RestStreamHandler("POST", capUrl, m_webFetchHandler.FetchInventoryDescendentsRequest); + = new RestStreamHandler( + "POST", + capUrl, + m_webFetchHandler.FetchInventoryDescendentsRequest, + "FetchInventoryDescendents2", + agentID.ToString()); caps.RegisterHandler(capName, reqHandler); } @@ -160,4 +165,4 @@ namespace OpenSim.Region.ClientStack.Linden // capName, capUrl, m_scene.RegionInfo.RegionName, agentID); } } -} +} \ No newline at end of file diff --git a/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs b/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs index f6d4b401c1..8b7406d7db 100644 --- a/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs +++ b/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs @@ -1433,21 +1433,26 @@ namespace OpenSim.Region.CoreModules.World.Land private void EventManagerOnRegisterCaps(UUID agentID, Caps caps) { string capsBase = "/CAPS/" + caps.CapsObjectPath; - caps.RegisterHandler("RemoteParcelRequest", - new RestStreamHandler("POST", capsBase + remoteParcelRequestPath, - delegate(string request, string path, string param, - IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) - { - return RemoteParcelRequest(request, path, param, agentID, caps); - })); + caps.RegisterHandler( + "RemoteParcelRequest", + new RestStreamHandler( + "POST", + capsBase + remoteParcelRequestPath, + (request, path, param, httpRequest, httpResponse) + => RemoteParcelRequest(request, path, param, agentID, caps), + "RemoteParcelRequest", + agentID.ToString())); + UUID parcelCapID = UUID.Random(); - caps.RegisterHandler("ParcelPropertiesUpdate", - new RestStreamHandler("POST", "/CAPS/" + parcelCapID, - delegate(string request, string path, string param, - IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) - { - return ProcessPropertiesUpdate(request, path, param, agentID, caps); - })); + caps.RegisterHandler( + "ParcelPropertiesUpdate", + new RestStreamHandler( + "POST", + "/CAPS/" + parcelCapID, + (request, path, param, httpRequest, httpResponse) + => ProcessPropertiesUpdate(request, path, param, agentID, caps), + "ParcelPropertiesUpdate", + agentID.ToString())); } private string ProcessPropertiesUpdate(string request, string path, string param, UUID agentID, Caps caps) { diff --git a/OpenSim/Region/CoreModules/World/Media/Moap/MoapModule.cs b/OpenSim/Region/CoreModules/World/Media/Moap/MoapModule.cs index 5239f50e78..601e81e587 100644 --- a/OpenSim/Region/CoreModules/World/Media/Moap/MoapModule.cs +++ b/OpenSim/Region/CoreModules/World/Media/Moap/MoapModule.cs @@ -145,7 +145,9 @@ namespace OpenSim.Region.CoreModules.World.Media.Moap // Even though we're registering for POST we're going to get GETS and UPDATES too caps.RegisterHandler( - "ObjectMedia", new RestStreamHandler("POST", omCapUrl, HandleObjectMediaMessage)); + "ObjectMedia", + new RestStreamHandler( + "POST", omCapUrl, HandleObjectMediaMessage, "ObjectMedia", agentID.ToString())); } string omuCapUrl = "/CAPS/" + UUID.Random(); @@ -157,7 +159,9 @@ namespace OpenSim.Region.CoreModules.World.Media.Moap // Even though we're registering for POST we're going to get GETS and UPDATES too caps.RegisterHandler( - "ObjectMediaNavigate", new RestStreamHandler("POST", omuCapUrl, HandleObjectMediaNavigateMessage)); + "ObjectMediaNavigate", + new RestStreamHandler( + "POST", omuCapUrl, HandleObjectMediaNavigateMessage, "ObjectMediaNavigate", agentID.ToString())); } } diff --git a/OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs b/OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs index faaf92864a..2335bea2a4 100644 --- a/OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs +++ b/OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs @@ -190,14 +190,15 @@ namespace OpenSim.Region.CoreModules.World.WorldMap { //m_log.DebugFormat("[WORLD MAP]: OnRegisterCaps: agentID {0} caps {1}", agentID, caps); string capsBase = "/CAPS/" + caps.CapsObjectPath; - caps.RegisterHandler("MapLayer", - new RestStreamHandler("POST", capsBase + m_mapLayerPath, - delegate(string request, string path, string param, - IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) - { - return MapLayerRequest(request, path, param, - agentID, caps); - })); + caps.RegisterHandler( + "MapLayer", + new RestStreamHandler( + "POST", + capsBase + m_mapLayerPath, + (request, path, param, httpRequest, httpResponse) + => MapLayerRequest(request, path, param, agentID, caps), + "MapLayer", + agentID.ToString())); } /// diff --git a/OpenSim/Region/Framework/Scenes/RegionStatsHandler.cs b/OpenSim/Region/Framework/Scenes/RegionStatsHandler.cs index 6c5685c928..1365831779 100644 --- a/OpenSim/Region/Framework/Scenes/RegionStatsHandler.cs +++ b/OpenSim/Region/Framework/Scenes/RegionStatsHandler.cs @@ -48,16 +48,19 @@ namespace OpenSim.Region.Framework.Scenes { public class RegionStatsHandler : IStreamedRequestHandler { + //private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + private string osRXStatsURI = String.Empty; private string osXStatsURI = String.Empty; //private string osSecret = String.Empty; private OpenSim.Framework.RegionInfo regionInfo; public string localZone = TimeZone.CurrentTimeZone.StandardName; public TimeSpan utcOffset = TimeZone.CurrentTimeZone.GetUtcOffset(DateTime.Now); - - //private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - public RegionStatsHandler(OpenSim.Framework.RegionInfo region_info) + public string Name { get { return "RegionStats"; } } + public string Description { get { return "Region Statistics"; } } + + public RegionStatsHandler(RegionInfo region_info) { regionInfo = region_info; osRXStatsURI = Util.SHA1Hash(regionInfo.regionSecret); diff --git a/OpenSim/Region/OptionalModules/Avatar/Voice/FreeSwitchVoice/FreeSwitchVoiceModule.cs b/OpenSim/Region/OptionalModules/Avatar/Voice/FreeSwitchVoice/FreeSwitchVoiceModule.cs index 05678c0fe9..be8873dc1e 100644 --- a/OpenSim/Region/OptionalModules/Avatar/Voice/FreeSwitchVoice/FreeSwitchVoiceModule.cs +++ b/OpenSim/Region/OptionalModules/Avatar/Voice/FreeSwitchVoice/FreeSwitchVoiceModule.cs @@ -306,30 +306,35 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.FreeSwitchVoice agentID, caps, scene.RegionInfo.RegionName); string capsBase = "/CAPS/" + caps.CapsObjectPath; - caps.RegisterHandler("ProvisionVoiceAccountRequest", - new RestStreamHandler("POST", capsBase + m_provisionVoiceAccountRequestPath, - delegate(string request, string path, string param, - IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) - { - return ProvisionVoiceAccountRequest(scene, request, path, param, - agentID, caps); - })); - caps.RegisterHandler("ParcelVoiceInfoRequest", - new RestStreamHandler("POST", capsBase + m_parcelVoiceInfoRequestPath, - delegate(string request, string path, string param, - IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) - { - return ParcelVoiceInfoRequest(scene, request, path, param, - agentID, caps); - })); - caps.RegisterHandler("ChatSessionRequest", - new RestStreamHandler("POST", capsBase + m_chatSessionRequestPath, - delegate(string request, string path, string param, - IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) - { - return ChatSessionRequest(scene, request, path, param, - agentID, caps); - })); + caps.RegisterHandler( + "ProvisionVoiceAccountRequest", + new RestStreamHandler( + "POST", + capsBase + m_provisionVoiceAccountRequestPath, + (request, path, param, httpRequest, httpResponse) + => ProvisionVoiceAccountRequest(scene, request, path, param, agentID, caps), + "ProvisionVoiceAccountRequest", + agentID.ToString())); + + caps.RegisterHandler( + "ParcelVoiceInfoRequest", + new RestStreamHandler( + "POST", + capsBase + m_parcelVoiceInfoRequestPath, + (request, path, param, httpRequest, httpResponse) + => ParcelVoiceInfoRequest(scene, request, path, param, agentID, caps), + "ParcelVoiceInfoRequest", + agentID.ToString())); + + caps.RegisterHandler( + "ChatSessionRequest", + new RestStreamHandler( + "POST", + capsBase + m_chatSessionRequestPath, + (request, path, param, httpRequest, httpResponse) + => ChatSessionRequest(scene, request, path, param, agentID, caps), + "ChatSessionRequest", + agentID.ToString())); } /// diff --git a/OpenSim/Region/OptionalModules/Avatar/Voice/VivoxVoice/VivoxVoiceModule.cs b/OpenSim/Region/OptionalModules/Avatar/Voice/VivoxVoice/VivoxVoiceModule.cs index 738133c9d8..a36fd74745 100644 --- a/OpenSim/Region/OptionalModules/Avatar/Voice/VivoxVoice/VivoxVoiceModule.cs +++ b/OpenSim/Region/OptionalModules/Avatar/Voice/VivoxVoice/VivoxVoiceModule.cs @@ -406,30 +406,36 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.VivoxVoice m_log.DebugFormat("[VivoxVoice] OnRegisterCaps: agentID {0} caps {1}", agentID, caps); string capsBase = "/CAPS/" + caps.CapsObjectPath; - caps.RegisterHandler("ProvisionVoiceAccountRequest", - new RestStreamHandler("POST", capsBase + m_provisionVoiceAccountRequestPath, - delegate(string request, string path, string param, - IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) - { - return ProvisionVoiceAccountRequest(scene, request, path, param, - agentID, caps); - })); - caps.RegisterHandler("ParcelVoiceInfoRequest", - new RestStreamHandler("POST", capsBase + m_parcelVoiceInfoRequestPath, - delegate(string request, string path, string param, - IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) - { - return ParcelVoiceInfoRequest(scene, request, path, param, - agentID, caps); - })); - caps.RegisterHandler("ChatSessionRequest", - new RestStreamHandler("POST", capsBase + m_chatSessionRequestPath, - delegate(string request, string path, string param, - IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) - { - return ChatSessionRequest(scene, request, path, param, - agentID, caps); - })); + + caps.RegisterHandler( + "ProvisionVoiceAccountRequest", + new RestStreamHandler( + "POST", + capsBase + m_provisionVoiceAccountRequestPath, + (request, path, param, httpRequest, httpResponse) + => ProvisionVoiceAccountRequest(scene, request, path, param, agentID, caps), + "ProvisionVoiceAccountRequest", + agentID.ToString())); + + caps.RegisterHandler( + "ParcelVoiceInfoRequest", + new RestStreamHandler( + "POST", + capsBase + m_parcelVoiceInfoRequestPath, + (request, path, param, httpRequest, httpResponse) + => ParcelVoiceInfoRequest(scene, request, path, param, agentID, caps), + "ParcelVoiceInfoRequest", + agentID.ToString())); + + caps.RegisterHandler( + "ChatSessionRequest", + new RestStreamHandler( + "POST", + capsBase + m_chatSessionRequestPath, + (request, path, param, httpRequest, httpResponse) + => ChatSessionRequest(scene, request, path, param, agentID, caps), + "ChatSessionRequest", + agentID.ToString())); } /// diff --git a/OpenSim/Region/UserStatistics/WebStatsModule.cs b/OpenSim/Region/UserStatistics/WebStatsModule.cs index 4248035904..faf746fac0 100644 --- a/OpenSim/Region/UserStatistics/WebStatsModule.cs +++ b/OpenSim/Region/UserStatistics/WebStatsModule.cs @@ -282,14 +282,15 @@ namespace OpenSim.Region.UserStatistics // m_log.DebugFormat("[WEB STATS MODULE]: OnRegisterCaps: agentID {0} caps {1}", agentID, caps); string capsPath = "/CAPS/VS/" + UUID.Random(); - caps.RegisterHandler("ViewerStats", - new RestStreamHandler("POST", capsPath, - delegate(string request, string path, string param, - IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) - { - return ViewerStatsReport(request, path, param, - agentID, caps); - })); + caps.RegisterHandler( + "ViewerStats", + new RestStreamHandler( + "POST", + capsPath, + (request, path, param, httpRequest, httpResponse) + => ViewerStatsReport(request, path, param, agentID, caps), + "ViewerStats", + agentID.ToString())); } private void OnDeRegisterCaps(UUID agentID, Caps caps) diff --git a/OpenSim/Server/Handlers/Authentication/OpenIdServerHandler.cs b/OpenSim/Server/Handlers/Authentication/OpenIdServerHandler.cs index dfed761234..18cef154e5 100644 --- a/OpenSim/Server/Handlers/Authentication/OpenIdServerHandler.cs +++ b/OpenSim/Server/Handlers/Authentication/OpenIdServerHandler.cs @@ -191,6 +191,8 @@ For more information, see http://openid.net/. #endregion HTML + public string Name { get { return "OpenId"; } } + public string Description { get { return null; } } public string ContentType { get { return m_contentType; } } public string HttpMethod { get { return m_httpMethod; } } public string Path { get { return m_path; } } From 9ffc2c106280a7b5b0eddba8cf906f1f7ad956a6 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 3 May 2012 01:56:24 +0100 Subject: [PATCH 144/547] minor: resolve some mono compiler warnings --- .../Framework/EntityTransfer/EntityTransferModule.cs | 7 +------ .../Authorization/AuthorizationService.cs | 4 ++-- OpenSim/Region/DataSnapshot/DataRequestHandler.cs | 4 ++-- 3 files changed, 5 insertions(+), 10 deletions(-) diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs index 8d5e0a5890..e47c339638 100644 --- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs +++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs @@ -1947,12 +1947,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer Thread.Sleep(100); } - if (count > 0) - return true; - else - return false; - - return true; + return count > 0; } protected void SetInTransit(UUID id) diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Authorization/AuthorizationService.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Authorization/AuthorizationService.cs index f0d21e67db..4470799f79 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Authorization/AuthorizationService.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Authorization/AuthorizationService.cs @@ -55,7 +55,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Authorization MethodBase.GetCurrentMethod().DeclaringType); private IUserManagement m_UserManagement; - private IGridService m_GridService; +// private IGridService m_GridService; private Scene m_Scene; AccessFlags m_accessValue = AccessFlags.None; @@ -65,7 +65,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Authorization { m_Scene = scene; m_UserManagement = scene.RequestModuleInterface(); - m_GridService = scene.GridService; +// m_GridService = scene.GridService; if (config != null) { diff --git a/OpenSim/Region/DataSnapshot/DataRequestHandler.cs b/OpenSim/Region/DataSnapshot/DataRequestHandler.cs index 2f2b3e6743..32e93b4057 100644 --- a/OpenSim/Region/DataSnapshot/DataRequestHandler.cs +++ b/OpenSim/Region/DataSnapshot/DataRequestHandler.cs @@ -42,13 +42,13 @@ namespace OpenSim.Region.DataSnapshot { public class DataRequestHandler { - private Scene m_scene = null; +// private Scene m_scene = null; private DataSnapshotManager m_externalData = null; private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); public DataRequestHandler(Scene scene, DataSnapshotManager externalData) { - m_scene = scene; +// m_scene = scene; m_externalData = externalData; //Register HTTP handler From bf5f8b54ae24c50e7288d34525962ec174d4b473 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 3 May 2012 02:22:06 +0100 Subject: [PATCH 145/547] Remove the somewhat misleading logging of the string length of some unknown requests, as this appeared to be some kind of numbered error code. This brings these messages into line with similar messages that did not do this. --- OpenSim/Server/Handlers/Friends/FriendsServerPostHandler.cs | 4 ++-- OpenSim/Server/Handlers/Grid/GridServerPostHandler.cs | 2 +- .../Server/Handlers/Hypergrid/HGFriendsServerPostHandler.cs | 3 ++- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/OpenSim/Server/Handlers/Friends/FriendsServerPostHandler.cs b/OpenSim/Server/Handlers/Friends/FriendsServerPostHandler.cs index 59420f5ca5..ef9b96fa54 100644 --- a/OpenSim/Server/Handlers/Friends/FriendsServerPostHandler.cs +++ b/OpenSim/Server/Handlers/Friends/FriendsServerPostHandler.cs @@ -95,7 +95,8 @@ namespace OpenSim.Server.Handlers.Friends return DeleteFriendString(request); } - m_log.DebugFormat("[FRIENDS HANDLER]: unknown method {0} request {1}", method.Length, method); + + m_log.DebugFormat("[FRIENDS HANDLER]: unknown method request {0}", method); } catch (Exception e) { @@ -103,7 +104,6 @@ namespace OpenSim.Server.Handlers.Friends } return FailureResult(); - } #region Method-specific handlers diff --git a/OpenSim/Server/Handlers/Grid/GridServerPostHandler.cs b/OpenSim/Server/Handlers/Grid/GridServerPostHandler.cs index bebf48242b..91d14cbeab 100644 --- a/OpenSim/Server/Handlers/Grid/GridServerPostHandler.cs +++ b/OpenSim/Server/Handlers/Grid/GridServerPostHandler.cs @@ -116,7 +116,7 @@ namespace OpenSim.Server.Handlers.Grid return GetRegionFlags(request); } - m_log.DebugFormat("[GRID HANDLER]: unknown method {0} request {1}", method.Length, method); + m_log.DebugFormat("[GRID HANDLER]: unknown method request {0}", method); } catch (Exception e) { diff --git a/OpenSim/Server/Handlers/Hypergrid/HGFriendsServerPostHandler.cs b/OpenSim/Server/Handlers/Hypergrid/HGFriendsServerPostHandler.cs index 8ef03e7a71..c2f127c213 100644 --- a/OpenSim/Server/Handlers/Hypergrid/HGFriendsServerPostHandler.cs +++ b/OpenSim/Server/Handlers/Hypergrid/HGFriendsServerPostHandler.cs @@ -122,7 +122,8 @@ namespace OpenSim.Server.Handlers.Hypergrid return GrantRights(request); */ } - m_log.DebugFormat("[HGFRIENDS HANDLER]: unknown method {0} request {1}", method.Length, method); + + m_log.DebugFormat("[HGFRIENDS HANDLER]: unknown method {0}", method); } catch (Exception e) { From 100e4ca67ea5f9eacc575ac65ce3ac7cd81eeb3d Mon Sep 17 00:00:00 2001 From: Snoopy Pfeffer Date: Thu, 3 May 2012 19:00:09 +0200 Subject: [PATCH 146/547] Fixes Mantis #5999. llSetLinkPrimitiveParams with PRIM_BUMP_SHINY did cause a runtime error. --- .../Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index 62b5c0f9b1..704dfc31a7 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -7336,7 +7336,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api return; face = (int)rules.GetLSLIntegerItem(idx++); int shiny = (int)rules.GetLSLIntegerItem(idx++); - Bumpiness bump = (Bumpiness)Convert.ToByte((int)rules.GetLSLIntegerItem(idx++)); + Bumpiness bump = (Bumpiness)(int)rules.GetLSLIntegerItem(idx++); SetShiny(part, face, shiny, bump); From fcd5b0817be93ccbb9897b424f70c5081a445e9f Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 3 May 2012 22:30:36 +0100 Subject: [PATCH 147/547] Reinsert a 2000ms delay before closing a no longer required agent on the source region after teleport to resolve Imprudence teleport problems. Viewers 1 and 3 are fine with doing this immediately. However, Imprudence has a small delay (<200ms, >500ms) after receiving the AgentCompleteMovement reply packet on the destination region before regarding that region as the currnet region. If Imprudence receives a DisableSimulator in this period, it quits. We are not restoring the full 5000ms delay since this brings back a bug where teleports permanently fail if an avatar tries to teleport back too quickly. This commit also sends the AgentCompleteMovement packet to the client before telling the source region to release its old agent, in order to further cut down any possibility of the DisableSimulator being recieved before the AgentMovementComplete. --- .../EntityTransfer/EntityTransferModule.cs | 9 +++++++-- OpenSim/Region/Framework/Scenes/ScenePresence.cs | 14 ++++++++++---- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs index e47c339638..cd588e5d86 100644 --- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs +++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs @@ -30,7 +30,6 @@ using System.Collections.Generic; using System.Net; using System.Reflection; using System.Threading; - using OpenSim.Framework; using OpenSim.Framework.Capabilities; using OpenSim.Framework.Client; @@ -595,7 +594,13 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer if (NeedsClosing(sp.DrawDistance, oldRegionX, newRegionX, oldRegionY, newRegionY, reg)) { -// Thread.Sleep(5000); + // We need to delay here because Imprudence viewers, unlike v1 or v3, have a short (<200ms, <500ms) delay before + // they regard the new region as the current region after receiving the AgentMovementComplete + // response. If close is sent before then, it will cause the viewer to quit instead. + // However, if this delay is longer, then a viewer can teleport back to this region and experience + // a failure because the old ScenePresence has not yet been cleaned up. + Thread.Sleep(2000); + sp.Close(); sp.Scene.IncomingCloseAgent(sp.UUID); } diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index e5a9a996ba..91e6e5a452 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs @@ -1140,9 +1140,19 @@ namespace OpenSim.Region.Framework.Scenes bool flying = ((m_AgentControlFlags & AgentManager.ControlFlags.AGENT_CONTROL_FLY) != 0); MakeRootAgent(AbsolutePosition, flying); + ControllingClient.MoveAgentIntoRegion(m_scene.RegionInfo, AbsolutePosition, look); + +// m_log.DebugFormat("[SCENE PRESENCE] Completed movement"); if ((m_callbackURI != null) && !m_callbackURI.Equals("")) { + // We cannot sleep here since this would hold up the inbound packet processing thread, as + // CompleteMovement() is executed synchronously. However, it might be better to delay the release + // here until we know for sure that the agent is active in this region. Sending AgentMovementComplete + // is not enough for Imprudence clients - there appears to be a small delay (<200ms, <500ms) until they regard this + // region as the current region, meaning that a close sent before then will fail the teleport. +// System.Threading.Thread.Sleep(2000); + m_log.DebugFormat( "[SCENE PRESENCE]: Releasing {0} {1} with callback to {2}", client.Name, client.AgentId, m_callbackURI); @@ -1151,9 +1161,6 @@ namespace OpenSim.Region.Framework.Scenes m_callbackURI = null; } -// m_log.DebugFormat("[SCENE PRESENCE] Completed movement"); - - ControllingClient.MoveAgentIntoRegion(m_scene.RegionInfo, AbsolutePosition, look); ValidateAndSendAppearanceAndAgentData(); // Create child agents in neighbouring regions @@ -1168,7 +1175,6 @@ namespace OpenSim.Region.Framework.Scenes friendsModule.SendFriendsOnlineIfNeeded(ControllingClient); } - // m_log.DebugFormat( // "[SCENE PRESENCE]: Completing movement of {0} into region {1} took {2}ms", // client.Name, Scene.RegionInfo.RegionName, (DateTime.Now - startTime).Milliseconds); From c9faf0df741c89ec92b09d54ab471b070e5a1dff Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 4 May 2012 01:12:56 +0100 Subject: [PATCH 148/547] Extend 'slow' request logging to other server outbound requests (forms, rest, async rest) as well as the existing logging on outbound OSD requests. Also prints out the first 100 chars of any slow request data since this can contain useful info (such as agent ID). --- OpenSim/Framework/WebUtil.cs | 285 ++++++++++++++++++++++++----------- 1 file changed, 200 insertions(+), 85 deletions(-) diff --git a/OpenSim/Framework/WebUtil.cs b/OpenSim/Framework/WebUtil.cs index d2aa538ce1..478d2a7ef2 100644 --- a/OpenSim/Framework/WebUtil.cs +++ b/OpenSim/Framework/WebUtil.cs @@ -53,19 +53,36 @@ namespace OpenSim.Framework LogManager.GetLogger( MethodBase.GetCurrentMethod().DeclaringType); - private static int m_requestNumber = 0; + /// + /// Request number for diagnostic purposes. + /// + public static int RequestNumber = 0; - // this is the header field used to communicate the local request id - // used for performance and debugging + /// + /// this is the header field used to communicate the local request id + /// used for performance and debugging + /// public const string OSHeaderRequestID = "opensim-request-id"; - // number of milliseconds a call can take before it is considered - // a "long" call for warning & debugging purposes + /// + /// Number of milliseconds a call can take before it is considered + /// a "long" call for warning & debugging purposes + /// public const int LongCallTime = 500; - // dictionary of end points + /// + /// The maximum length of any data logged because of a long request time. + /// + /// + /// This is to truncate any really large post data, such as an asset. In theory, the first section should + /// give us useful information about the call (which agent it relates to if applicable, etc.). + /// + public const int MaxRequestDiagLength = 100; + + /// + /// Dictionary of end points + /// private static Dictionary m_endpointSerializer = new Dictionary(); - private static object EndPointLock(string url) { @@ -128,12 +145,13 @@ namespace OpenSim.Framework private static OSDMap ServiceOSDRequestWorker(string url, OSDMap data, string method, int timeout, bool compressed) { - int reqnum = m_requestNumber++; + int reqnum = RequestNumber++; // m_log.DebugFormat("[WEB UTIL]: <{0}> start osd request for {1}, method {2}",reqnum,url,method); string errorMessage = "unknown error"; int tickstart = Util.EnvironmentTickCount(); int tickdata = 0; + string strBuffer = null; try { @@ -148,7 +166,7 @@ namespace OpenSim.Framework // If there is some input, write it into the request if (data != null) { - string strBuffer = OSDParser.SerializeJsonString(data); + strBuffer = OSDParser.SerializeJsonString(data); byte[] buffer = System.Text.Encoding.UTF8.GetBytes(strBuffer); if (compressed) @@ -208,11 +226,18 @@ namespace OpenSim.Framework } finally { - // This just dumps a warning for any operation that takes more than 100 ms int tickdiff = Util.EnvironmentTickCountSubtract(tickstart); if (tickdiff > LongCallTime) - m_log.DebugFormat("[WEB UTIL]: osd request <{0}> (URI:{1}, METHOD:{2}) took {3}ms overall, {4}ms writing", - reqnum,url,method,tickdiff,tickdata); + m_log.InfoFormat( + "[OSD REQUEST]: Slow request to <{0}> {1} {2} took {3}ms, {4}ms writing, {5}", + reqnum, + method, + url, + tickdiff, + tickdata, + strBuffer != null + ? (strBuffer.Length > MaxRequestDiagLength ? strBuffer.Remove(MaxRequestDiagLength) : strBuffer) + : ""); } m_log.DebugFormat( @@ -290,17 +315,17 @@ namespace OpenSim.Framework private static OSDMap ServiceFormRequestWorker(string url, NameValueCollection data, int timeout) { - int reqnum = m_requestNumber++; + int reqnum = RequestNumber++; string method = (data != null && data["RequestMethod"] != null) ? data["RequestMethod"] : "unknown"; // m_log.DebugFormat("[WEB UTIL]: <{0}> start form request for {1}, method {2}",reqnum,url,method); string errorMessage = "unknown error"; int tickstart = Util.EnvironmentTickCount(); int tickdata = 0; + string queryString = null; try { - HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url); request.Method = "POST"; request.Timeout = timeout; @@ -311,7 +336,7 @@ namespace OpenSim.Framework if (data != null) { - string queryString = BuildQueryString(data); + queryString = BuildQueryString(data); byte[] buffer = System.Text.Encoding.UTF8.GetBytes(queryString); request.ContentLength = buffer.Length; @@ -354,11 +379,19 @@ namespace OpenSim.Framework { int tickdiff = Util.EnvironmentTickCountSubtract(tickstart); if (tickdiff > LongCallTime) - m_log.InfoFormat("[WEB UTIL]: form request <{0}> (URI:{1}, METHOD:{2}) took {3}ms overall, {4}ms writing", - reqnum,url,method,tickdiff,tickdata); + m_log.InfoFormat( + "[SERVICE FORM]: Slow request to <{0}> {1} {2} took {3}ms, {4}ms writing, {5}", + reqnum, + method, + url, + tickdiff, + tickdata, + queryString != null + ? (queryString.Length > MaxRequestDiagLength) ? queryString.Remove(MaxRequestDiagLength) : queryString + : ""); } - m_log.WarnFormat("[WEB UTIL]: <{0}> form request to {1} failed: {2}", reqnum, url, errorMessage); + m_log.WarnFormat("[SERVICE FORM]: <{0}> form request to {1} failed: {2}", reqnum, url, errorMessage); return ErrorResponseMap(errorMessage); } @@ -639,8 +672,6 @@ namespace OpenSim.Framework return new string[0]; } - - } public static class AsynchronousRestObjectRequester @@ -663,6 +694,12 @@ namespace OpenSim.Framework public static void MakeRequest(string verb, string requestUrl, TRequest obj, Action action) { + int reqnum = WebUtil.RequestNumber++; + // m_log.DebugFormat("[WEB UTIL]: <{0}> start osd request for {1}, method {2}",reqnum,url,method); + + int tickstart = Util.EnvironmentTickCount(); + int tickdata = 0; + // m_log.DebugFormat("[ASYNC REQUEST]: Starting {0} {1}", verb, requestUrl); Type type = typeof(TRequest); @@ -673,12 +710,13 @@ namespace OpenSim.Framework XmlSerializer deserializer = new XmlSerializer(typeof(TResponse)); request.Method = verb; + MemoryStream buffer = null; if (verb == "POST") { request.ContentType = "text/xml"; - MemoryStream buffer = new MemoryStream(); + buffer = new MemoryStream(); XmlWriterSettings settings = new XmlWriterSettings(); settings.Encoding = Encoding.UTF8; @@ -700,6 +738,9 @@ namespace OpenSim.Framework requestStream.Write(buffer.ToArray(), 0, length); requestStream.Close(); + // capture how much time was spent writing + tickdata = Util.EnvironmentTickCountSubtract(tickstart); + request.BeginGetResponse(delegate(IAsyncResult ar) { response = request.EndGetResponse(ar); @@ -725,88 +766,108 @@ namespace OpenSim.Framework }, null); }, null); - - - return; } - - request.BeginGetResponse(delegate(IAsyncResult res2) + else { - try + request.BeginGetResponse(delegate(IAsyncResult res2) { - // If the server returns a 404, this appears to trigger a System.Net.WebException even though that isn't - // documented in MSDN - response = request.EndGetResponse(res2); - - Stream respStream = null; try { - respStream = response.GetResponseStream(); - deserial = (TResponse)deserializer.Deserialize(respStream); - } - catch (System.InvalidOperationException) - { - } - finally - { - respStream.Close(); - response.Close(); - } - } - catch (WebException e) - { - if (e.Status == WebExceptionStatus.ProtocolError) - { - if (e.Response is HttpWebResponse) + // If the server returns a 404, this appears to trigger a System.Net.WebException even though that isn't + // documented in MSDN + response = request.EndGetResponse(res2); + + Stream respStream = null; + try { - HttpWebResponse httpResponse = (HttpWebResponse)e.Response; - - if (httpResponse.StatusCode != HttpStatusCode.NotFound) - { - // We don't appear to be handling any other status codes, so log these feailures to that - // people don't spend unnecessary hours hunting phantom bugs. - m_log.DebugFormat( - "[ASYNC REQUEST]: Request {0} {1} failed with unexpected status code {2}", - verb, requestUrl, httpResponse.StatusCode); - } + respStream = response.GetResponseStream(); + deserial = (TResponse)deserializer.Deserialize(respStream); + } + catch (System.InvalidOperationException) + { + } + finally + { + respStream.Close(); + response.Close(); } } - else + catch (WebException e) + { + if (e.Status == WebExceptionStatus.ProtocolError) + { + if (e.Response is HttpWebResponse) + { + HttpWebResponse httpResponse = (HttpWebResponse)e.Response; + + if (httpResponse.StatusCode != HttpStatusCode.NotFound) + { + // We don't appear to be handling any other status codes, so log these feailures to that + // people don't spend unnecessary hours hunting phantom bugs. + m_log.DebugFormat( + "[ASYNC REQUEST]: Request {0} {1} failed with unexpected status code {2}", + verb, requestUrl, httpResponse.StatusCode); + } + } + } + else + { + m_log.ErrorFormat( + "[ASYNC REQUEST]: Request {0} {1} failed with status {2} and message {3}", + verb, requestUrl, e.Status, e.Message); + } + } + catch (Exception e) { m_log.ErrorFormat( - "[ASYNC REQUEST]: Request {0} {1} failed with status {2} and message {3}", - verb, requestUrl, e.Status, e.Message); + "[ASYNC REQUEST]: Request {0} {1} failed with exception {2}{3}", + verb, requestUrl, e.Message, e.StackTrace); } - } - catch (Exception e) + + // m_log.DebugFormat("[ASYNC REQUEST]: Received {0}", deserial.ToString()); + + try + { + action(deserial); + } + catch (Exception e) + { + m_log.ErrorFormat( + "[ASYNC REQUEST]: Request {0} {1} callback failed with exception {2}{3}", + verb, requestUrl, e.Message, e.StackTrace); + } + + }, null); + } + + int tickdiff = Util.EnvironmentTickCountSubtract(tickstart); + if (tickdiff > WebUtil.LongCallTime) + { + string originalRequest = null; + + if (buffer != null) { - m_log.ErrorFormat( - "[ASYNC REQUEST]: Request {0} {1} failed with exception {2}{3}", - verb, requestUrl, e.Message, e.StackTrace); + originalRequest = Encoding.UTF8.GetString(buffer.ToArray()); + + if (originalRequest.Length > WebUtil.MaxRequestDiagLength) + originalRequest = originalRequest.Remove(WebUtil.MaxRequestDiagLength); } - // m_log.DebugFormat("[ASYNC REQUEST]: Received {0}", deserial.ToString()); - - try - { - action(deserial); - } - catch (Exception e) - { - m_log.ErrorFormat( - "[ASYNC REQUEST]: Request {0} {1} callback failed with exception {2}{3}", - verb, requestUrl, e.Message, e.StackTrace); - } - - }, null); + m_log.InfoFormat( + "[ASYNC REQUEST]: Slow request to <{0}> {1} {2} took {3}ms, {4}ms writing, {5}", + reqnum, + verb, + requestUrl, + tickdiff, + tickdata, + originalRequest); + } } } public static class SynchronousRestFormsRequester { - private static readonly ILog m_log = - LogManager.GetLogger( - MethodBase.GetCurrentMethod().DeclaringType); + private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); /// /// Perform a synchronous REST request. @@ -820,6 +881,12 @@ namespace OpenSim.Framework /// the request. You'll want to make sure you deal with this as they're not uncommon public static string MakeRequest(string verb, string requestUrl, string obj) { + int reqnum = WebUtil.RequestNumber++; + // m_log.DebugFormat("[WEB UTIL]: <{0}> start osd request for {1}, method {2}",reqnum,url,method); + + int tickstart = Util.EnvironmentTickCount(); + int tickdata = 0; + WebRequest request = WebRequest.Create(requestUrl); request.Method = verb; string respstring = String.Empty; @@ -855,6 +922,9 @@ namespace OpenSim.Framework { if (requestStream != null) requestStream.Close(); + + // capture how much time was spent writing + tickdata = Util.EnvironmentTickCountSubtract(tickstart); } } @@ -893,6 +963,18 @@ namespace OpenSim.Framework m_log.DebugFormat("[FORMS]: InvalidOperationException on receiving {0} {1}", verb, requestUrl); } } + + int tickdiff = Util.EnvironmentTickCountSubtract(tickstart); + if (tickdiff > WebUtil.LongCallTime) + m_log.InfoFormat( + "[FORMS]: Slow request to <{0}> {1} {2} took {3}ms, {4}ms writing, {5}", + reqnum, + verb, + requestUrl, + tickdiff, + tickdata, + obj.Length > WebUtil.MaxRequestDiagLength ? obj.Remove(WebUtil.MaxRequestDiagLength) : obj); + return respstring; } } @@ -915,17 +997,24 @@ namespace OpenSim.Framework /// the request. You'll want to make sure you deal with this as they're not uncommon public static TResponse MakeRequest(string verb, string requestUrl, TRequest obj) { + int reqnum = WebUtil.RequestNumber++; + // m_log.DebugFormat("[WEB UTIL]: <{0}> start osd request for {1}, method {2}",reqnum,url,method); + + int tickstart = Util.EnvironmentTickCount(); + int tickdata = 0; + Type type = typeof(TRequest); TResponse deserial = default(TResponse); WebRequest request = WebRequest.Create(requestUrl); request.Method = verb; + MemoryStream buffer = null; if ((verb == "POST") || (verb == "PUT")) { request.ContentType = "text/xml"; - MemoryStream buffer = new MemoryStream(); + buffer = new MemoryStream(); XmlWriterSettings settings = new XmlWriterSettings(); settings.Encoding = Encoding.UTF8; @@ -958,6 +1047,9 @@ namespace OpenSim.Framework { if (requestStream != null) requestStream.Close(); + + // capture how much time was spent writing + tickdata = Util.EnvironmentTickCountSubtract(tickstart); } } @@ -1005,6 +1097,29 @@ namespace OpenSim.Framework verb, requestUrl, e.Message, e.StackTrace); } + int tickdiff = Util.EnvironmentTickCountSubtract(tickstart); + if (tickdiff > WebUtil.LongCallTime) + { + string originalRequest = null; + + if (buffer != null) + { + originalRequest = Encoding.UTF8.GetString(buffer.ToArray()); + + if (originalRequest.Length > WebUtil.MaxRequestDiagLength) + originalRequest = originalRequest.Remove(WebUtil.MaxRequestDiagLength); + } + + m_log.InfoFormat( + "[SynchronousRestObjectRequester]: Slow request to <{0}> {1} {2} took {3}ms, {4}ms writing, {5}", + reqnum, + verb, + requestUrl, + tickdiff, + tickdata, + originalRequest); + } + return deserial; } } From fb99ee67743dddd75c2b65039f227188f46cc389 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 4 May 2012 01:16:56 +0100 Subject: [PATCH 149/547] minor: Tweak BaseHttpServer message to make it clear that this relates to slow handling of inbound requests. --- OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs b/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs index 4ea4a1a6d2..6fa36b5d15 100644 --- a/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs +++ b/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs @@ -677,7 +677,7 @@ namespace OpenSim.Framework.Servers.HttpServer if (tickdiff > 3000) { m_log.InfoFormat( - "[BASE HTTP SERVER]: slow {0} for {1} {2} {3} from {4} took {5} ms", + "[BASE HTTP SERVER]: Slow handling of {0} {1} {2} {3} from {4} took {5}ms", requestMethod, uriString, requestHandler != null ? requestHandler.Name : "", From cccef2e56dc8b02ccd83fb1c832e4ce026cdcaf9 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 4 May 2012 19:21:43 +0100 Subject: [PATCH 150/547] Calculate the Daylight Savings Time information sent to the viewer based on US Pacific Standard Time rather than whatever timezone the login server is set to. This is because the viewer doesn't receive a timezone from the server but bases its displays on Pacific Standard Time. However, it still expects to receive notification from the server as to whether or not Daylight Savings Time for PST is in operation. This commit introduces a new DSTZone setting in the [LoginService] config setting that accepts a list of timezone names valid across different platforms to calculate Pacific DST. If you need the old behaviour of calculating DST based on the local timezone of the server running the login service, then please override DSTZone with "local". A mailing list announcement will be made later. Thanks to Olivier Van Helden and Gudule Lapointe for determining this behaviour and providing this patch. From http://opensimulator.org/mantis/view.php?id=5972 --- .../LLLoginService/LLLoginResponse.cs | 43 ++++++++++++++++++- .../Services/LLLoginService/LLLoginService.cs | 17 ++++++-- bin/Robust.HG.ini.example | 12 ++++++ bin/Robust.ini.example | 21 +++++++++ bin/config-include/Standalone.ini | 12 ++++++ 5 files changed, 100 insertions(+), 5 deletions(-) diff --git a/OpenSim/Services/LLLoginService/LLLoginResponse.cs b/OpenSim/Services/LLLoginService/LLLoginResponse.cs index 01de15990d..6b3bc84c79 100644 --- a/OpenSim/Services/LLLoginService/LLLoginResponse.cs +++ b/OpenSim/Services/LLLoginService/LLLoginResponse.cs @@ -226,7 +226,8 @@ namespace OpenSim.Services.LLLoginService public LLLoginResponse(UserAccount account, AgentCircuitData aCircuit, GridUserInfo pinfo, GridRegion destination, List invSkel, FriendInfo[] friendsList, ILibraryService libService, string where, string startlocation, Vector3 position, Vector3 lookAt, List gestures, string message, - GridRegion home, IPEndPoint clientIP, string mapTileURL, string profileURL, string openIDURL, string searchURL, string currency) + GridRegion home, IPEndPoint clientIP, string mapTileURL, string profileURL, string openIDURL, string searchURL, string currency, + string DSTZone) : this() { FillOutInventoryData(invSkel, libService); @@ -255,7 +256,45 @@ namespace OpenSim.Services.LLLoginService FillOutRegionData(destination); FillOutSeedCap(aCircuit, destination, clientIP); - + + switch (DSTZone) + { + case "none": + DST = "N"; + break; + case "local": + DST = TimeZone.CurrentTimeZone.IsDaylightSavingTime(DateTime.Now) ? "Y" : "N"; + break; + default: + TimeZoneInfo dstTimeZone = null; + string[] tzList = DSTZone.Split(';'); + + foreach (string tzName in tzList) + { + try + { + dstTimeZone = TimeZoneInfo.FindSystemTimeZoneById(tzName); + } + catch (Exception e) + { + continue; + } + break; + } + + if (dstTimeZone == null) + { + m_log.WarnFormat( + "[LLOGIN RESPONSE]: No valid timezone found for DST in {0}, falling back to system time.", tzList); + DST = TimeZone.CurrentTimeZone.IsDaylightSavingTime(DateTime.Now) ? "Y" : "N"; + } + else + { + DST = dstTimeZone.IsDaylightSavingTime(DateTime.Now) ? "Y" : "N"; + } + + break; + } } private void FillOutInventoryData(List invSkel, ILibraryService libService) diff --git a/OpenSim/Services/LLLoginService/LLLoginService.cs b/OpenSim/Services/LLLoginService/LLLoginService.cs index db8a9cb2a9..9acba114da 100644 --- a/OpenSim/Services/LLLoginService/LLLoginService.cs +++ b/OpenSim/Services/LLLoginService/LLLoginService.cs @@ -82,6 +82,8 @@ namespace OpenSim.Services.LLLoginService protected string m_AllowedClients; protected string m_DeniedClients; + protected string m_DSTZone; + IConfig m_LoginServerConfig; // IConfig m_ClientsConfig; @@ -118,6 +120,8 @@ namespace OpenSim.Services.LLLoginService m_AllowedClients = m_LoginServerConfig.GetString("AllowedClients", string.Empty); m_DeniedClients = m_LoginServerConfig.GetString("DeniedClients", string.Empty); + m_DSTZone = m_LoginServerConfig.GetString("DSTZone", "America/Los_Angeles;Pacific Standard Time"); + // Clean up some of these vars if (m_MapTileURL != String.Empty) { @@ -240,6 +244,7 @@ namespace OpenSim.Services.LLLoginService m_log.InfoFormat("[LLOGIN SERVICE]: Login request for {0} {1} at {2} using viewer {3}, channel {4}, IP {5}, Mac {6}, Id0 {7}", firstName, lastName, startLocation, clientVersion, channel, clientIP.Address.ToString(), mac, id0); + try { // @@ -416,8 +421,11 @@ namespace OpenSim.Services.LLLoginService // // Finally, fill out the response and return it // - LLLoginResponse response = new LLLoginResponse(account, aCircuit, guinfo, destination, inventorySkel, friendsList, m_LibraryService, - where, startLocation, position, lookAt, gestures, m_WelcomeMessage, home, clientIP, m_MapTileURL, m_ProfileURL, m_OpenIDURL, m_SearchURL, m_Currency); + LLLoginResponse response + = new LLLoginResponse( + account, aCircuit, guinfo, destination, inventorySkel, friendsList, m_LibraryService, + where, startLocation, position, lookAt, gestures, m_WelcomeMessage, home, clientIP, + m_MapTileURL, m_ProfileURL, m_OpenIDURL, m_SearchURL, m_Currency, m_DSTZone); m_log.DebugFormat("[LLOGIN SERVICE]: All clear. Sending login response to client."); return response; @@ -431,7 +439,10 @@ namespace OpenSim.Services.LLLoginService } } - protected GridRegion FindDestination(UserAccount account, UUID scopeID, GridUserInfo pinfo, UUID sessionID, string startLocation, GridRegion home, out GridRegion gatekeeper, out string where, out Vector3 position, out Vector3 lookAt, out TeleportFlags flags) + protected GridRegion FindDestination( + UserAccount account, UUID scopeID, GridUserInfo pinfo, UUID sessionID, string startLocation, + GridRegion home, out GridRegion gatekeeper, + out string where, out Vector3 position, out Vector3 lookAt, out TeleportFlags flags) { flags = TeleportFlags.ViaLogin; diff --git a/bin/Robust.HG.ini.example b/bin/Robust.HG.ini.example index be7540750d..00e2fd71ad 100644 --- a/bin/Robust.HG.ini.example +++ b/bin/Robust.HG.ini.example @@ -275,6 +275,18 @@ ServiceConnectors = "8003/OpenSim.Server.Handlers.dll:AssetServiceConnector,8003 ;AllowedClients = "" ;DeniedClients = "" + ;# {DSTZone} {} {Override Daylight Saving Time rules} {* none local} "America/Los_Angeles;Pacific Standard Time" + ;; Viewers do not receive timezone information from the server - almost all (?) default to Pacific Standard Time + ;; However, they do rely on the server to tell them whether it's Daylight Saving Time or not. + ;; Hence, calculating DST based on a different timezone can result in a misleading viewer display and inconsistencies between grids. + ;; By default, this setting uses various timezone names to calculate DST with regards to the viewer's standard PST. + ;; Options are + ;; "none" no DST + ;; "local" use the server's only timezone to calculate DST. This is previous OpenSimulator behaviour. + ;; "America/Los_Angeles;Pacific Standard Time" use these timezone names to look up Daylight savings. + ;; 'America/Los_Angeles' is used on Linux/Mac systems whilst 'Pacific Standard Time' is used on Windows + DSTZone = "America/Los_Angeles;Pacific Standard Time" + [MapImageService] LocalServiceModule = "OpenSim.Services.MapImageService.dll:MapImageService" ; Set this if you want to change the default diff --git a/bin/Robust.ini.example b/bin/Robust.ini.example index 582af2737f..1c04ab5c12 100644 --- a/bin/Robust.ini.example +++ b/bin/Robust.ini.example @@ -250,6 +250,27 @@ ServiceConnectors = "8003/OpenSim.Server.Handlers.dll:AssetServiceConnector,8003 ;AllowedClients = "" ;DeniedClients = "" + ;# {DSTZone} {} {Override Daylight Saving Time rules} {* none local} "America/Los_Angeles;Pacific Standard Time" + ;; Viewers do not listen to timezone sent by the server. They use Pacific Standard Time instead, + ;; but rely on the server to calculate Daylight Saving Time. Sending another DST than US Pacific + ;; would result in time inconsistencies between grids (during summer and around DST transition period) + ;; default let OpenSim calculate US Pacific DST + ;; "none" disable DST (equivallent to "local" with system set to GMT) + ;; "local" force legacy behaviour (using local system time to calculate DST) + ; DSTZone = "America/Los_Angeles;Pacific Standard Time" + + ;# {DSTZone} {} {Override Daylight Saving Time rules} {* none local} "America/Los_Angeles;Pacific Standard Time" + ;; Viewers do not receive timezone information from the server - almost all (?) default to Pacific Standard Time + ;; However, they do rely on the server to tell them whether it's Daylight Saving Time or not. + ;; Hence, calculating DST based on a different timezone can result in a misleading viewer display and inconsistencies between grids. + ;; By default, this setting uses various timezone names to calculate DST with regards to the viewer's standard PST. + ;; Options are + ;; "none" no DST + ;; "local" use the server's only timezone to calculate DST. This is previous OpenSimulator behaviour. + ;; "America/Los_Angeles;Pacific Standard Time" use these timezone names to look up Daylight savings. + ;; 'America/Los_Angeles' is used on Linux/Mac systems whilst 'Pacific Standard Time' is used on Windows + DSTZone = "America/Los_Angeles;Pacific Standard Time" + [MapImageService] LocalServiceModule = "OpenSim.Services.MapImageService.dll:MapImageService" ; Set this if you want to change the default diff --git a/bin/config-include/Standalone.ini b/bin/config-include/Standalone.ini index d307387e85..74d9d2eb3e 100644 --- a/bin/config-include/Standalone.ini +++ b/bin/config-include/Standalone.ini @@ -95,6 +95,18 @@ WelcomeMessage = "Welcome, Avatar!" + ;# {DSTZone} {} {Override Daylight Saving Time rules} {* none local} "America/Los_Angeles;Pacific Standard Time" + ;; Viewers do not receive timezone information from the server - almost all (?) default to Pacific Standard Time + ;; However, they do rely on the server to tell them whether it's Daylight Saving Time or not. + ;; Hence, calculating DST based on a different timezone can result in a misleading viewer display and inconsistencies between grids. + ;; By default, this setting uses various timezone names to calculate DST with regards to the viewer's standard PST. + ;; Options are + ;; "none" no DST + ;; "local" use the server's only timezone to calculate DST. This is previous OpenSimulator behaviour. + ;; "America/Los_Angeles;Pacific Standard Time" use these timezone names to look up Daylight savings. + ;; 'America/Los_Angeles' is used on Linux/Mac systems whilst 'Pacific Standard Time' is used on Windows + DSTZone = "America/Los_Angeles;Pacific Standard Time" + [MapImageService] LocalServiceModule = "OpenSim.Services.MapImageService.dll:MapImageService" ; in minutes From ad23774433b55e0cfbfc50208b247f0c3f41e8ea Mon Sep 17 00:00:00 2001 From: Oren Hurvitz Date: Mon, 23 Apr 2012 18:36:36 +0300 Subject: [PATCH 151/547] Allow deleting folders even if they're not in the Trash The functions DeleteFolders() and PurgeFolder() still work as before, i.e. they only allow deleting folders that are in the Trash. However, the functions DeleteFoldersEx() and PurgeFolderEx() can now be used to delete any folder. --- .../InventoryService/XInventoryService.cs | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/OpenSim/Services/InventoryService/XInventoryService.cs b/OpenSim/Services/InventoryService/XInventoryService.cs index 0e7a3584e2..37a6a42f2b 100644 --- a/OpenSim/Services/InventoryService/XInventoryService.cs +++ b/OpenSim/Services/InventoryService/XInventoryService.cs @@ -363,6 +363,11 @@ namespace OpenSim.Services.InventoryService // We don't check the principal's ID here // public virtual bool DeleteFolders(UUID principalID, List folderIDs) + { + return DeleteFoldersEx(principalID, folderIDs, true); + } + + public bool DeleteFoldersEx(UUID principalID, List folderIDs, bool onlyIfTrash) { if (!m_AllowDelete) return false; @@ -371,11 +376,12 @@ namespace OpenSim.Services.InventoryService // foreach (UUID id in folderIDs) { - if (!ParentIsTrash(id)) + if (onlyIfTrash && !ParentIsTrash(id)) continue; + //m_log.InfoFormat("[XINVENTORY SERVICE]: Delete folder {0}", id); InventoryFolderBase f = new InventoryFolderBase(); f.ID = id; - PurgeFolder(f); + PurgeFolderEx(f, onlyIfTrash); m_Database.DeleteFolders("folderID", id.ToString()); } @@ -383,11 +389,16 @@ namespace OpenSim.Services.InventoryService } public virtual bool PurgeFolder(InventoryFolderBase folder) + { + return PurgeFolderEx(folder, true); + } + + private bool PurgeFolderEx(InventoryFolderBase folder, bool onlyIfTrash) { if (!m_AllowDelete) return false; - if (!ParentIsTrash(folder.ID)) + if (onlyIfTrash && !ParentIsTrash(folder.ID)) return false; XInventoryFolder[] subFolders = m_Database.GetFolders( @@ -396,7 +407,7 @@ namespace OpenSim.Services.InventoryService foreach (XInventoryFolder x in subFolders) { - PurgeFolder(ConvertToOpenSim(x)); + PurgeFolderEx(ConvertToOpenSim(x), onlyIfTrash); m_Database.DeleteFolders("folderID", x.folderID.ToString()); } From e83bc049dffba51a4d739d150cbd82a68453a0c6 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 4 May 2012 20:37:21 +0100 Subject: [PATCH 152/547] refactor: Rename new DeleteFoldersEx/PurgeFoldersEx methods to DeleteFolders/PurgeFolders overloads as previously discussed with Oren - I think this makes more sense on balance These overloads are not publicly available on core connectors or IInventoryService. --- .../Services/InventoryService/XInventoryService.cs | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/OpenSim/Services/InventoryService/XInventoryService.cs b/OpenSim/Services/InventoryService/XInventoryService.cs index 37a6a42f2b..15156d0537 100644 --- a/OpenSim/Services/InventoryService/XInventoryService.cs +++ b/OpenSim/Services/InventoryService/XInventoryService.cs @@ -52,6 +52,7 @@ namespace OpenSim.Services.InventoryService : this(config, "InventoryService") { } + public XInventoryService(IConfigSource config, string configName) : base(config) { if (configName != string.Empty) @@ -364,10 +365,10 @@ namespace OpenSim.Services.InventoryService // public virtual bool DeleteFolders(UUID principalID, List folderIDs) { - return DeleteFoldersEx(principalID, folderIDs, true); + return DeleteFolders(principalID, folderIDs, true); } - public bool DeleteFoldersEx(UUID principalID, List folderIDs, bool onlyIfTrash) + public virtual bool DeleteFolders(UUID principalID, List folderIDs, bool onlyIfTrash) { if (!m_AllowDelete) return false; @@ -381,7 +382,7 @@ namespace OpenSim.Services.InventoryService //m_log.InfoFormat("[XINVENTORY SERVICE]: Delete folder {0}", id); InventoryFolderBase f = new InventoryFolderBase(); f.ID = id; - PurgeFolderEx(f, onlyIfTrash); + PurgeFolder(f, onlyIfTrash); m_Database.DeleteFolders("folderID", id.ToString()); } @@ -390,10 +391,10 @@ namespace OpenSim.Services.InventoryService public virtual bool PurgeFolder(InventoryFolderBase folder) { - return PurgeFolderEx(folder, true); + return PurgeFolder(folder, true); } - private bool PurgeFolderEx(InventoryFolderBase folder, bool onlyIfTrash) + public virtual bool PurgeFolder(InventoryFolderBase folder, bool onlyIfTrash) { if (!m_AllowDelete) return false; @@ -407,7 +408,7 @@ namespace OpenSim.Services.InventoryService foreach (XInventoryFolder x in subFolders) { - PurgeFolderEx(ConvertToOpenSim(x), onlyIfTrash); + PurgeFolder(ConvertToOpenSim(x), onlyIfTrash); m_Database.DeleteFolders("folderID", x.folderID.ToString()); } From 6096a1f30ed7857b1dbacf152dba4f0aa7e6e1e9 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 4 May 2012 20:53:30 +0100 Subject: [PATCH 153/547] Change LongCallTime on WebUtil to 3000, to match the time where request handling is considered "slow". This may be the wrong thing to do but stops lots of log spam in HG setups now that the monitoring is extended to other outgoing calls. LongCallTime may need to be made configurable. --- OpenSim/Framework/WebUtil.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Framework/WebUtil.cs b/OpenSim/Framework/WebUtil.cs index 478d2a7ef2..2aa4af5202 100644 --- a/OpenSim/Framework/WebUtil.cs +++ b/OpenSim/Framework/WebUtil.cs @@ -68,7 +68,7 @@ namespace OpenSim.Framework /// Number of milliseconds a call can take before it is considered /// a "long" call for warning & debugging purposes /// - public const int LongCallTime = 500; + public const int LongCallTime = 3000; /// /// The maximum length of any data logged because of a long request time. From 92fde6ed268f4c7357ca5ad96b967db0f0658446 Mon Sep 17 00:00:00 2001 From: Talun Date: Fri, 4 May 2012 19:37:13 +0100 Subject: [PATCH 154/547] Mantis 60004 problems with damage and llSetDamage. In damage enabled areas this patch - Deletes any objects that have damage set > 0 that deliver that damage to an avatar Stops Gods receiving damage, Stops volume detect objects causing damage Deletes NPCS when their helth reduces to zero Gradually "heals" damage to an avatar Resets health on going to a non damage area --- .../CoreModules/Avatar/Combat/CombatModule.cs | 17 ++++-- .../Region/Framework/Scenes/ScenePresence.cs | 53 ++++++++++++++++--- 2 files changed, 60 insertions(+), 10 deletions(-) diff --git a/OpenSim/Region/CoreModules/Avatar/Combat/CombatModule.cs b/OpenSim/Region/CoreModules/Avatar/Combat/CombatModule.cs index 0babeb5140..3a9146557d 100644 --- a/OpenSim/Region/CoreModules/Avatar/Combat/CombatModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Combat/CombatModule.cs @@ -96,6 +96,13 @@ namespace OpenSim.Region.CoreModules.Avatar.Combat.CombatModule ScenePresence killingAvatar = null; // string killingAvatarMessage; + // check to see if it is an NPC and just remove it + INPCModule NPCmodule = deadAvatar.Scene.RequestModuleInterface(); + if (NPCmodule != null && NPCmodule.DeleteNPC(deadAvatar.UUID, deadAvatar.Scene)) + { + return; + } + if (killerObjectLocalID == 0) deadAvatarMessage = "You committed suicide!"; else @@ -145,7 +152,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Combat.CombatModule catch (InvalidOperationException) { } - deadAvatar.Health = 100; + deadAvatar.setHealthWithUpdate(100.0f); deadAvatar.Scene.TeleportClientHome(deadAvatar.UUID, deadAvatar.ControllingClient); } @@ -154,14 +161,18 @@ namespace OpenSim.Region.CoreModules.Avatar.Combat.CombatModule try { ILandObject obj = avatar.Scene.LandChannel.GetLandObject(avatar.AbsolutePosition.X, avatar.AbsolutePosition.Y); - - if ((obj.LandData.Flags & (uint)ParcelFlags.AllowDamage) != 0) + if ((obj.LandData.Flags & (uint)ParcelFlags.AllowDamage) != 0 + || avatar.Scene.RegionInfo.RegionSettings.AllowDamage) { avatar.Invulnerable = false; } else { avatar.Invulnerable = true; + if (avatar.Health < 100.0f) + { + avatar.setHealthWithUpdate(100.0f); + } } } catch (Exception) diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index 91e6e5a452..7e49a5e2cc 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs @@ -3312,23 +3312,53 @@ namespace OpenSim.Region.Framework.Scenes } } - if (Invulnerable) + // Gods do not take damage and Invulnerable is set depending on parcel/region flags + if (Invulnerable || GodLevel > 0) return; - + + // The following may be better in the ICombatModule + // probably tweaking of the values for ground and normal prim collisions will be needed float starthealth = Health; uint killerObj = 0; + SceneObjectPart part = null; foreach (uint localid in coldata.Keys) { - SceneObjectPart part = Scene.GetSceneObjectPart(localid); - - if (part != null && part.ParentGroup.Damage != -1.0f) - Health -= part.ParentGroup.Damage; + if (localid == 0) + { + part = null; + } else { - if (coldata[localid].PenetrationDepth >= 0.10f) + part = Scene.GetSceneObjectPart(localid); + } + if (part != null) + { + // Ignore if it has been deleted or volume detect + if (!part.ParentGroup.IsDeleted && !part.ParentGroup.IsVolumeDetect) + { + if (part.ParentGroup.Damage > 0.0f) + { + // Something with damage... + Health -= part.ParentGroup.Damage; + part.ParentGroup.Scene.DeleteSceneObject(part.ParentGroup, false); + } + else + { + // An ordinary prim + if (coldata[localid].PenetrationDepth >= 0.10f) + Health -= coldata[localid].PenetrationDepth * 5.0f; + } + } + } + else + { + // 0 is the ground + // what about collisions with other avatars? + if (localid == 0 && coldata[localid].PenetrationDepth >= 0.10f) Health -= coldata[localid].PenetrationDepth * 5.0f; } + if (Health <= 0.0f) { if (localid != 0) @@ -3344,7 +3374,16 @@ namespace OpenSim.Region.Framework.Scenes ControllingClient.SendHealth(Health); } if (Health <= 0) + { m_scene.EventManager.TriggerAvatarKill(killerObj, this); + } + if (starthealth == Health && Health < 100.0f) + { + Health += 0.03f; + if (Health > 100.0f) + Health = 100.0f; + ControllingClient.SendHealth(Health); + } } } From c84ef57e5273ac2c8703c75406138c58f9c19d0f Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 4 May 2012 21:04:42 +0100 Subject: [PATCH 155/547] minor: remove mono compiler warning --- OpenSim/Services/LLLoginService/LLLoginResponse.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Services/LLLoginService/LLLoginResponse.cs b/OpenSim/Services/LLLoginService/LLLoginResponse.cs index 6b3bc84c79..9ec744f80f 100644 --- a/OpenSim/Services/LLLoginService/LLLoginResponse.cs +++ b/OpenSim/Services/LLLoginService/LLLoginResponse.cs @@ -275,7 +275,7 @@ namespace OpenSim.Services.LLLoginService { dstTimeZone = TimeZoneInfo.FindSystemTimeZoneById(tzName); } - catch (Exception e) + catch { continue; } From da4819a170071d2acae309606c4ac2cf9f772a39 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 4 May 2012 22:11:25 +0100 Subject: [PATCH 156/547] Temporarily add debug log lines to lsl url request and release To help with http://opensimulator.org/mantis/view.php?id=5993 --- .../CoreModules/Scripting/LSLHttp/UrlModule.cs | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs b/OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs index 93e75b3622..d58fc0feac 100644 --- a/OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs +++ b/OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs @@ -146,6 +146,7 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp public void Close() { } + public UUID RequestURL(IScriptModule engine, SceneObjectPart host, UUID itemID) { UUID urlcode = UUID.Random(); @@ -175,6 +176,10 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp uri, new PollServiceEventArgs(HttpRequestHandler, HasEvents, GetEvents, NoEvents, urlcode)); + m_log.DebugFormat( + "[URL MODULE]: Set up incoming request url {0} for {1} in {2} {3}", + uri, itemID, host.Name, host.LocalId); + engine.PostScriptEvent(itemID, "http_request", new Object[] { urlcode.ToString(), "URL_REQUEST_GRANTED", url }); } @@ -217,6 +222,10 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp uri, new PollServiceEventArgs(HttpRequestHandler, HasEvents, GetEvents, NoEvents, urlcode)); + m_log.DebugFormat( + "[URL MODULE]: Set up incoming secure request url {0} for {1} in {2} {3}", + uri, itemID, host.Name, host.LocalId); + engine.PostScriptEvent(itemID, "http_request", new Object[] { urlcode.ToString(), "URL_REQUEST_GRANTED", url }); } @@ -237,6 +246,10 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp foreach (UUID req in data.requests.Keys) m_RequestMap.Remove(req); + m_log.DebugFormat( + "[URL MODULE]: Releasing url {0} for {1} in {2}", + url, data.itemID, data.hostID); + RemoveUrl(data); m_UrlMap.Remove(url); } From dec6ad2933f75d4ac475a5e1c4302fe758c60d6d Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 4 May 2012 22:57:33 +0100 Subject: [PATCH 157/547] Don't try and update the access time of a file that is actively being cached. This may cause IOErrors on Windows. Aims to help with http://opensimulator.org/mantis/view.php?id=6003 --- OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs b/OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs index 389fb7b871..a25976d733 100644 --- a/OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs +++ b/OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs @@ -261,10 +261,14 @@ namespace Flotsam.RegionModules.AssetCache try { - // If the file is already cached, don't cache it, just touch it so access time is updated + // If the file is already cached just update access time. if (File.Exists(filename)) { - File.SetLastAccessTime(filename, DateTime.Now); + lock (m_CurrentlyWriting) + { + if (!m_CurrentlyWriting.Contains(filename)) + File.SetLastAccessTime(filename, DateTime.Now); + } } else { From e18686528ea09d72dd75da341da7bbb6f1fad5aa Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 4 May 2012 23:03:33 +0100 Subject: [PATCH 158/547] Use the more efficient HashSet instead of List for FlotasmAssetCache.m_CurrentlyWriting --- OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs b/OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs index a25976d733..dd6026bd93 100644 --- a/OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs +++ b/OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs @@ -83,7 +83,7 @@ namespace Flotsam.RegionModules.AssetCache private Dictionary m_CurrentlyWriting = new Dictionary(); private int m_WaitOnInprogressTimeout = 3000; #else - private List m_CurrentlyWriting = new List(); + private HashSet m_CurrentlyWriting = new HashSet(); #endif private bool m_FileCacheEnabled = true; From 01b00ad0d57d828028379875a382965b44073497 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Sat, 5 May 2012 00:29:14 +0100 Subject: [PATCH 159/547] Fire the scripting changed event with CHANGED_OWNER when an object that has changed owners is rezzed. This needs to occur after the script is resumed rather than before, when the event is just dropped. Addresses http://opensimulator.org/mantis/view.php?id=5890 and http://opensimulator.org/mantis/view.php?id=5952 --- OpenSim/Framework/TaskInventoryItem.cs | 16 +++++++++++++--- .../Avatar/Attachments/AttachmentsModule.cs | 18 +++++++++--------- .../CoreModules/World/Land/PrimCountModule.cs | 1 - .../Scenes/SceneObjectPartInventory.cs | 10 ++++++++-- 4 files changed, 30 insertions(+), 15 deletions(-) diff --git a/OpenSim/Framework/TaskInventoryItem.cs b/OpenSim/Framework/TaskInventoryItem.cs index d4bbbfb7c9..362d3652b4 100644 --- a/OpenSim/Framework/TaskInventoryItem.cs +++ b/OpenSim/Framework/TaskInventoryItem.cs @@ -26,6 +26,8 @@ */ using System; +using System.Reflection; +using log4net; using OpenMetaverse; namespace OpenSim.Framework @@ -35,6 +37,8 @@ namespace OpenSim.Framework /// public class TaskInventoryItem : ICloneable { +// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + /// /// XXX This should really be factored out into some constants class. /// @@ -331,12 +335,18 @@ namespace OpenSim.Framework } } - public bool OwnerChanged { - get { + public bool OwnerChanged + { + get + { return _ownerChanged; } - set { + set + { _ownerChanged = value; +// m_log.DebugFormat( +// "[TASK INVENTORY ITEM]: Owner changed set {0} for {1} {2} owned by {3}", +// _ownerChanged, Name, ItemID, OwnerID); } } diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs index 7200c4bc00..2e1948d231 100644 --- a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs @@ -527,9 +527,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments private void AttachToAgent( IScenePresence sp, SceneObjectGroup so, uint attachmentpoint, Vector3 attachOffset, bool silent) { - // m_log.DebugFormat( - // "[ATTACHMENTS MODULE]: Adding attachment {0} to avatar {1} in pt {2} pos {3} {4}", - // so.Name, avatar.Name, attachmentpoint, attachOffset, so.RootPart.AttachedPos); +// m_log.DebugFormat( +// "[ATTACHMENTS MODULE]: Adding attachment {0} to avatar {1} in pt {2} pos {3} {4}", +// so.Name, sp.Name, attachmentpoint, attachOffset, so.RootPart.AttachedPos); so.DetachFromBackup(); @@ -788,9 +788,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments /// private void ShowAttachInUserInventory(IScenePresence sp, uint AttachmentPt, UUID itemID, SceneObjectGroup att) { - // m_log.DebugFormat( - // "[USER INVENTORY]: Updating attachment {0} for {1} at {2} using item ID {3}", - // att.Name, sp.Name, AttachmentPt, itemID); +// m_log.DebugFormat( +// "[USER INVENTORY]: Updating attachment {0} for {1} at {2} using item ID {3}", +// att.Name, sp.Name, AttachmentPt, itemID); if (UUID.Zero == itemID) { @@ -853,9 +853,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments private void Client_OnObjectAttach(IClientAPI remoteClient, uint objectLocalID, uint AttachmentPt, bool silent) { - // m_log.DebugFormat( - // "[ATTACHMENTS MODULE]: Attaching object local id {0} to {1} point {2} from ground (silent = {3})", - // objectLocalID, remoteClient.Name, AttachmentPt, silent); +// m_log.DebugFormat( +// "[ATTACHMENTS MODULE]: Attaching object local id {0} to {1} point {2} from ground (silent = {3})", +// objectLocalID, remoteClient.Name, AttachmentPt, silent); if (!Enabled) return; diff --git a/OpenSim/Region/CoreModules/World/Land/PrimCountModule.cs b/OpenSim/Region/CoreModules/World/Land/PrimCountModule.cs index efede5ca42..b2f71d1250 100644 --- a/OpenSim/Region/CoreModules/World/Land/PrimCountModule.cs +++ b/OpenSim/Region/CoreModules/World/Land/PrimCountModule.cs @@ -126,7 +126,6 @@ namespace OpenSim.Region.CoreModules.World.Land // m_log.DebugFormat( // "[PRIM COUNT MODULE]: Ignoring OnParcelPrimCountAdd() for {0} on {1} since count is tainted", // obj.Name, m_Scene.RegionInfo.RegionName); - } } diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs index aacad98369..3734e03994 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs @@ -1219,13 +1219,19 @@ namespace OpenSim.Region.Framework.Scenes { if (engine != null) { +// m_log.DebugFormat( +// "[PRIM INVENTORY]: Resuming script {0} {1} for {2}, OwnerChanged {3}", +// item.Name, item.ItemID, item.OwnerID, item.OwnerChanged); + + engine.ResumeScript(item.ItemID); + if (item.OwnerChanged) engine.PostScriptEvent(item.ItemID, "changed", new Object[] { (int)Changed.OWNER }); + item.OwnerChanged = false; - engine.ResumeScript(item.ItemID); } } } } } -} +} \ No newline at end of file From 9317b888f99257ba2612cc8700ffa4055f25369e Mon Sep 17 00:00:00 2001 From: nebadon Date: Sat, 5 May 2012 13:49:10 -0700 Subject: [PATCH 160/547] testing new opensimulator.org hardware out to make sure git still works! --- CONTRIBUTORS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CONTRIBUTORS.txt b/CONTRIBUTORS.txt index 8a1141fd11..cb61931e33 100644 --- a/CONTRIBUTORS.txt +++ b/CONTRIBUTORS.txt @@ -205,3 +205,4 @@ In addition, we would like to thank: * The Mono Project * The NANT Developers * Microsoft (.NET, MSSQL-Adapters) +- From 531c52abe3e7397141f423d2617351d97cf3aa09 Mon Sep 17 00:00:00 2001 From: nebadon Date: Sat, 5 May 2012 13:59:40 -0700 Subject: [PATCH 161/547] test #2 --- CONTRIBUTORS.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTORS.txt b/CONTRIBUTORS.txt index cb61931e33..d80ead8e99 100644 --- a/CONTRIBUTORS.txt +++ b/CONTRIBUTORS.txt @@ -205,4 +205,4 @@ In addition, we would like to thank: * The Mono Project * The NANT Developers * Microsoft (.NET, MSSQL-Adapters) -- +-- From 8d070cf47babb947fce4d938f820452d4bfb7ca2 Mon Sep 17 00:00:00 2001 From: nebadon Date: Sat, 5 May 2012 14:32:40 -0700 Subject: [PATCH 162/547] last test clean up the mess.. --- CONTRIBUTORS.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTORS.txt b/CONTRIBUTORS.txt index d80ead8e99..1d20dffc27 100644 --- a/CONTRIBUTORS.txt +++ b/CONTRIBUTORS.txt @@ -205,4 +205,4 @@ In addition, we would like to thank: * The Mono Project * The NANT Developers * Microsoft (.NET, MSSQL-Adapters) --- + From 86dd5adceb08d6044471b85e4982f01f9318403d Mon Sep 17 00:00:00 2001 From: nebadon Date: Sat, 5 May 2012 14:42:33 -0700 Subject: [PATCH 163/547] one last test.. --- CONTRIBUTORS.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTORS.txt b/CONTRIBUTORS.txt index 1d20dffc27..49e6478b5e 100644 --- a/CONTRIBUTORS.txt +++ b/CONTRIBUTORS.txt @@ -205,4 +205,4 @@ In addition, we would like to thank: * The Mono Project * The NANT Developers * Microsoft (.NET, MSSQL-Adapters) - +* From f19fe50629bfee151286da487ba58e0f35f78329 Mon Sep 17 00:00:00 2001 From: nebadon Date: Sat, 5 May 2012 14:45:53 -0700 Subject: [PATCH 164/547] never say last test!! --- CONTRIBUTORS.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTORS.txt b/CONTRIBUTORS.txt index 49e6478b5e..1d20dffc27 100644 --- a/CONTRIBUTORS.txt +++ b/CONTRIBUTORS.txt @@ -205,4 +205,4 @@ In addition, we would like to thank: * The Mono Project * The NANT Developers * Microsoft (.NET, MSSQL-Adapters) -* + From c11b3760daee51ac32c78d7787771ec800573d3c Mon Sep 17 00:00:00 2001 From: nebadon Date: Sat, 5 May 2012 14:49:10 -0700 Subject: [PATCH 165/547] just another test :) --- CONTRIBUTORS.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTORS.txt b/CONTRIBUTORS.txt index 1d20dffc27..8350802a8b 100644 --- a/CONTRIBUTORS.txt +++ b/CONTRIBUTORS.txt @@ -205,4 +205,4 @@ In addition, we would like to thank: * The Mono Project * The NANT Developers * Microsoft (.NET, MSSQL-Adapters) - +*x From b60f51dafc364435796718807d211a17bfc35e12 Mon Sep 17 00:00:00 2001 From: Melanie Date: Sun, 6 May 2012 19:21:54 +0100 Subject: [PATCH 166/547] Stop llSetPos from sending one update per child prim --- OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs index 268600409f..05bea8dd88 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs @@ -2771,7 +2771,7 @@ namespace OpenSim.Region.Framework.Scenes //we need to do a terse update even if the move wasn't allowed // so that the position is reset in the client (the object snaps back) - ScheduleGroupForTerseUpdate(); + RootPart.ScheduleTerseUpdate(); } /// From b697d0e895dc7670e160188501da88a780455500 Mon Sep 17 00:00:00 2001 From: dahlia Date: Sun, 6 May 2012 23:54:50 -0700 Subject: [PATCH 167/547] add OS_NPC_RUNNING option to osNpcMoveToTarget() to allow running speed for moving NPCs --- OpenSim/Region/Framework/Interfaces/INPCModule.cs | 6 ++++-- OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs | 3 ++- .../ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs | 3 ++- .../Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs | 1 + 4 files changed, 9 insertions(+), 4 deletions(-) diff --git a/OpenSim/Region/Framework/Interfaces/INPCModule.cs b/OpenSim/Region/Framework/Interfaces/INPCModule.cs index b4dc3c3c11..e071ea3e9e 100644 --- a/OpenSim/Region/Framework/Interfaces/INPCModule.cs +++ b/OpenSim/Region/Framework/Interfaces/INPCModule.cs @@ -113,9 +113,11 @@ namespace OpenSim.Region.Framework.Interfaces /// /// /// If true and the avatar is flying when it reaches the target, land. - /// + /// name="running"> + /// If true, NPC moves with running speed. /// True if the operation succeeded, false if there was no such agent or the agent was not an NPC - bool MoveToTarget(UUID agentID, Scene scene, Vector3 pos, bool noFly, bool landAtTarget); + /// + bool MoveToTarget(UUID agentID, Scene scene, Vector3 pos, bool noFly, bool landAtTarget, bool running = false); /// /// Stop the NPC's current movement. diff --git a/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs b/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs index 3ac1eb102d..541ad7d78c 100644 --- a/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs +++ b/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs @@ -169,7 +169,7 @@ namespace OpenSim.Region.OptionalModules.World.NPC } } - public bool MoveToTarget(UUID agentID, Scene scene, Vector3 pos, bool noFly, bool landAtTarget) + public bool MoveToTarget(UUID agentID, Scene scene, Vector3 pos, bool noFly, bool landAtTarget, bool running = false) { lock (m_avatars) { @@ -183,6 +183,7 @@ namespace OpenSim.Region.OptionalModules.World.NPC sp.Name, pos, scene.RegionInfo.RegionName, noFly, landAtTarget); sp.MoveToTarget(pos, noFly, landAtTarget); + sp.SetAlwaysRun = running; return true; } diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs index 0d4ea198e9..3659687f08 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs @@ -2474,7 +2474,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api World, pos, (options & ScriptBaseClass.OS_NPC_NO_FLY) != 0, - (options & ScriptBaseClass.OS_NPC_LAND_AT_TARGET) != 0); + (options & ScriptBaseClass.OS_NPC_LAND_AT_TARGET) != 0, + (options & ScriptBaseClass.OS_NPC_RUNNING) != 0); } } diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs index fd7c41e682..2a28542a96 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs @@ -626,6 +626,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase public const int OS_NPC_FLY = 0; public const int OS_NPC_NO_FLY = 1; public const int OS_NPC_LAND_AT_TARGET = 2; + public const int OS_NPC_RUNNING = 4; public const int OS_NPC_SIT_NOW = 0; From 4186fa10f0eba3628ef8222db2e4b0e2b69df5cd Mon Sep 17 00:00:00 2001 From: dahlia Date: Mon, 7 May 2012 00:08:56 -0700 Subject: [PATCH 168/547] remove default values from prior commit since mono cant deal with them --- .../Region/Framework/Interfaces/INPCModule.cs | 2 +- .../OptionalModules/World/NPC/NPCModule.cs | 2 +- .../World/NPC/Tests/NPCModuleTests.cs | 4 ++-- .../Shared/Api/Implementation/OSSL_Api.cs | 2 +- bin/PrimMesher.dll | Bin 37376 -> 46592 bytes 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/OpenSim/Region/Framework/Interfaces/INPCModule.cs b/OpenSim/Region/Framework/Interfaces/INPCModule.cs index e071ea3e9e..860483d461 100644 --- a/OpenSim/Region/Framework/Interfaces/INPCModule.cs +++ b/OpenSim/Region/Framework/Interfaces/INPCModule.cs @@ -117,7 +117,7 @@ namespace OpenSim.Region.Framework.Interfaces /// If true, NPC moves with running speed. /// True if the operation succeeded, false if there was no such agent or the agent was not an NPC /// - bool MoveToTarget(UUID agentID, Scene scene, Vector3 pos, bool noFly, bool landAtTarget, bool running = false); + bool MoveToTarget(UUID agentID, Scene scene, Vector3 pos, bool noFly, bool landAtTarget, bool running); /// /// Stop the NPC's current movement. diff --git a/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs b/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs index 541ad7d78c..d3456ab61a 100644 --- a/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs +++ b/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs @@ -169,7 +169,7 @@ namespace OpenSim.Region.OptionalModules.World.NPC } } - public bool MoveToTarget(UUID agentID, Scene scene, Vector3 pos, bool noFly, bool landAtTarget, bool running = false) + public bool MoveToTarget(UUID agentID, Scene scene, Vector3 pos, bool noFly, bool landAtTarget, bool running) { lock (m_avatars) { diff --git a/OpenSim/Region/OptionalModules/World/NPC/Tests/NPCModuleTests.cs b/OpenSim/Region/OptionalModules/World/NPC/Tests/NPCModuleTests.cs index a39257e1d0..65dad2d62f 100644 --- a/OpenSim/Region/OptionalModules/World/NPC/Tests/NPCModuleTests.cs +++ b/OpenSim/Region/OptionalModules/World/NPC/Tests/NPCModuleTests.cs @@ -242,7 +242,7 @@ namespace OpenSim.Region.OptionalModules.World.NPC.Tests Assert.That(npc.AbsolutePosition, Is.EqualTo(startPos)); Vector3 targetPos = startPos + new Vector3(0, 10, 0); - m_npcMod.MoveToTarget(npc.UUID, m_scene, targetPos, false, false); + m_npcMod.MoveToTarget(npc.UUID, m_scene, targetPos, false, false, false); Assert.That(npc.AbsolutePosition, Is.EqualTo(startPos)); //Assert.That(npc.Rotation, Is.EqualTo(new Quaternion(0, 0, 0.7071068f, 0.7071068f))); @@ -267,7 +267,7 @@ namespace OpenSim.Region.OptionalModules.World.NPC.Tests // Try a second movement startPos = npc.AbsolutePosition; targetPos = startPos + new Vector3(10, 0, 0); - m_npcMod.MoveToTarget(npc.UUID, m_scene, targetPos, false, false); + m_npcMod.MoveToTarget(npc.UUID, m_scene, targetPos, false, false, false); Assert.That(npc.AbsolutePosition, Is.EqualTo(startPos)); // Assert.That(npc.Rotation, Is.EqualTo(new Quaternion(0, 0, 0, 1))); diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs index 3659687f08..ed9a4e00aa 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs @@ -2449,7 +2449,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api return; Vector3 pos = new Vector3((float) position.x, (float) position.y, (float) position.z); - module.MoveToTarget(npcId, World, pos, false, true); + module.MoveToTarget(npcId, World, pos, false, true, false); } } diff --git a/bin/PrimMesher.dll b/bin/PrimMesher.dll index 249e91c0a5bdb6485e6f937a932aa1887fa28b4e..87022b7cfc21c202beaecb9cf3f26932338f0932 100755 GIT binary patch literal 46592 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 From 40324553322d1cf211eec32041bad5a2dc197f6d Mon Sep 17 00:00:00 2001 From: dahlia Date: Mon, 7 May 2012 00:33:50 -0700 Subject: [PATCH 169/547] add a null check for Primitive.Sculpt in PrimitiveBaseShape constructor for OpenMetaverse.Primitive object --- OpenSim/Framework/PrimitiveBaseShape.cs | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/OpenSim/Framework/PrimitiveBaseShape.cs b/OpenSim/Framework/PrimitiveBaseShape.cs index 1b6a1d2e58..76dcfca726 100644 --- a/OpenSim/Framework/PrimitiveBaseShape.cs +++ b/OpenSim/Framework/PrimitiveBaseShape.cs @@ -241,10 +241,14 @@ namespace OpenSim.Framework m_textureEntry = prim.Textures.GetBytes(); - SculptEntry = (prim.Sculpt.Type != OpenMetaverse.SculptType.None); - SculptData = prim.Sculpt.GetBytes(); - SculptTexture = prim.Sculpt.SculptTexture; - SculptType = (byte)prim.Sculpt.Type; + if (prim.Sculpt != null) + { + SculptEntry = (prim.Sculpt.Type != OpenMetaverse.SculptType.None); + SculptData = prim.Sculpt.GetBytes(); + SculptTexture = prim.Sculpt.SculptTexture; + SculptType = (byte)prim.Sculpt.Type; + } + else SculptType = (byte)OpenMetaverse.SculptType.None; } [XmlIgnore] From cdf97ab3a654581fe5c3f29b1b3a6459c8c73378 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Mon, 7 May 2012 17:21:45 +0100 Subject: [PATCH 170/547] Fix a bug in FriendsModule.StatusNotify() where all subsequent friends would not be notified once a non-local friend was found. --- .../Region/CoreModules/Avatar/Friends/FriendsModule.cs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs b/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs index fc6325dc3d..98afbc9159 100644 --- a/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs @@ -498,7 +498,10 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends Util.FireAndForget( delegate { - m_log.DebugFormat("[FRIENDS MODULE]: Notifying {0} friends", friendList.Count); + m_log.DebugFormat( + "[FRIENDS MODULE]: Notifying {0} friends of {1} of online status {2}", + friendList.Count, agentID, online); + // Notify about this user status StatusNotify(friendList, agentID, online); } @@ -515,7 +518,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends { // Try local if (LocalStatusNotification(userID, friendID, online)) - return; + continue; // The friend is not here [as root]. Let's forward. PresenceInfo[] friendSessions = PresenceService.GetAgents(new string[] { friendID.ToString() }); @@ -523,11 +526,13 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends { PresenceInfo friendSession = null; foreach (PresenceInfo pinfo in friendSessions) + { if (pinfo.RegionID != UUID.Zero) // let's guard against sessions-gone-bad { friendSession = pinfo; break; } + } if (friendSession != null) { From 5053506d88ac8b06be27ffb404bcc120e3f48241 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Mon, 7 May 2012 18:27:33 +0100 Subject: [PATCH 171/547] refactor: Instead of performing a ScenePresence lookup twice over LocateClientObject() and GetClientScene(), do the lookup just once in LocateClientObject() --- .../Avatar/Friends/FriendsModule.cs | 20 ++----------------- 1 file changed, 2 insertions(+), 18 deletions(-) diff --git a/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs b/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs index 98afbc9159..24ec435d17 100644 --- a/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs @@ -448,30 +448,14 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends /// Find the client for a ID /// public IClientAPI LocateClientObject(UUID agentID) - { - Scene scene = GetClientScene(agentID); - if (scene != null) - { - ScenePresence presence = scene.GetScenePresence(agentID); - if (presence != null) - return presence.ControllingClient; - } - - return null; - } - - /// - /// Find the scene for an agent - /// - private Scene GetClientScene(UUID agentId) { lock (m_Scenes) { foreach (Scene scene in m_Scenes) { - ScenePresence presence = scene.GetScenePresence(agentId); + ScenePresence presence = scene.GetScenePresence(agentID); if (presence != null && !presence.IsChildAgent) - return scene; + return presence.ControllingClient; } } From a82dc263abe5ef2a7221609da14f75d7026f9fbe Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Mon, 7 May 2012 19:05:21 +0100 Subject: [PATCH 172/547] For osGetGridNick(), osGetGridName(), osGetGridLoginURI() and osGetGridCustom(), try to read from the [GridInfoService] section on standalone rather than [GridInfo] [GridInfoService] is the section that's actually in bin/config-include/StandaloneCommon.ini.example --- .../Shared/Api/Implementation/OSSL_Api.cs | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs index ed9a4e00aa..3b67966a1a 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs @@ -128,6 +128,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api { // private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + public const string GridInfoServiceConfigSectionName = "GridInfoService"; + internal IScriptEngine m_ScriptEngine; internal ILSL_Api m_LSL_Api = null; // get a reference to the LSL API so we can call methods housed there internal SceneObjectPart m_host; @@ -2032,8 +2034,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api string nick = String.Empty; IConfigSource config = m_ScriptEngine.ConfigSource; - if (config.Configs["GridInfo"] != null) - nick = config.Configs["GridInfo"].GetString("gridnick", nick); + if (config.Configs[GridInfoServiceConfigSectionName] != null) + nick = config.Configs[GridInfoServiceConfigSectionName].GetString("gridnick", nick); if (String.IsNullOrEmpty(nick)) nick = GridUserInfo(InfoType.Nick); @@ -2049,8 +2051,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api string name = String.Empty; IConfigSource config = m_ScriptEngine.ConfigSource; - if (config.Configs["GridInfo"] != null) - name = config.Configs["GridInfo"].GetString("gridname", name); + if (config.Configs[GridInfoServiceConfigSectionName] != null) + name = config.Configs[GridInfoServiceConfigSectionName].GetString("gridname", name); if (String.IsNullOrEmpty(name)) name = GridUserInfo(InfoType.Name); @@ -2066,8 +2068,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api string loginURI = String.Empty; IConfigSource config = m_ScriptEngine.ConfigSource; - if (config.Configs["GridInfo"] != null) - loginURI = config.Configs["GridInfo"].GetString("login", loginURI); + if (config.Configs[GridInfoServiceConfigSectionName] != null) + loginURI = config.Configs[GridInfoServiceConfigSectionName].GetString("login", loginURI); if (String.IsNullOrEmpty(loginURI)) loginURI = GridUserInfo(InfoType.Login); @@ -2114,8 +2116,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api string retval = String.Empty; IConfigSource config = m_ScriptEngine.ConfigSource; - if (config.Configs["GridInfo"] != null) - retval = config.Configs["GridInfo"].GetString(key, retval); + if (config.Configs[GridInfoServiceConfigSectionName] != null) + retval = config.Configs[GridInfoServiceConfigSectionName].GetString(key, retval); if (String.IsNullOrEmpty(retval)) retval = GridUserInfo(InfoType.Custom, key); From 65c88b2ff4e2616fa5c1d4c5e75298ed1eb1c0d8 Mon Sep 17 00:00:00 2001 From: Oren Hurvitz Date: Sun, 29 Apr 2012 08:53:33 +0300 Subject: [PATCH 173/547] Better error handling if Load OAR or Save OAR fail --- .../World/Archiver/ArchiveReadRequest.cs | 20 +++++++++++++++---- .../Archiver/ArchiveWriteRequestExecution.cs | 7 ++++++- .../ArchiveWriteRequestPreparation.cs | 11 +++++++++- 3 files changed, 32 insertions(+), 6 deletions(-) diff --git a/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs b/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs index a6dbaba7d7..e360f938db 100644 --- a/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs +++ b/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs @@ -200,8 +200,8 @@ namespace OpenSim.Region.CoreModules.World.Archiver } catch (Exception e) { - m_log.ErrorFormat( - "[ARCHIVER]: Aborting load with error in archive file {0}. {1}", filePath, e); + m_log.Error( + String.Format("[ARCHIVER]: Aborting load with error in archive file {0} ", filePath), e); m_errorMessage += e.ToString(); m_scene.EventManager.TriggerOarFileLoaded(m_requestId, m_errorMessage); return; @@ -219,6 +219,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver { m_log.ErrorFormat("[ARCHIVER]: Failed to load {0} assets", failedAssetRestores); m_errorMessage += String.Format("Failed to load {0} assets", failedAssetRestores); + // Continue, because we allow the OAR to be loaded even if some assets fail } } @@ -228,8 +229,19 @@ namespace OpenSim.Region.CoreModules.World.Archiver m_scene.DeleteAllSceneObjects(); } - LoadParcels(serialisedParcels); - LoadObjects(serialisedSceneObjects); + try + { + LoadParcels(serialisedParcels); + LoadObjects(serialisedSceneObjects); + } + catch (Exception e) + { + m_log.Error("[ARCHIVER]: Error loading parcels or objects ", e); + m_errorMessage += e.ToString(); + m_scene.EventManager.TriggerOarFileLoaded(m_requestId, m_errorMessage); + return; + } + m_log.InfoFormat("[ARCHIVER]: Successfully loaded archive"); diff --git a/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestExecution.cs b/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestExecution.cs index c179a34b38..2b40a9eded 100644 --- a/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestExecution.cs +++ b/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestExecution.cs @@ -87,6 +87,11 @@ namespace OpenSim.Region.CoreModules.World.Archiver { Save(assetsFoundUuids, assetsNotFoundUuids); } + catch (Exception e) + { + m_scene.EventManager.TriggerOarFileSaved(m_requestId, e.ToString()); + throw; + } finally { m_archiveWriter.Close(); @@ -150,4 +155,4 @@ namespace OpenSim.Region.CoreModules.World.Archiver } } } -} \ No newline at end of file +} diff --git a/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestPreparation.cs b/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestPreparation.cs index eabe46e936..384d81b285 100644 --- a/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestPreparation.cs +++ b/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestPreparation.cs @@ -124,6 +124,9 @@ namespace OpenSim.Region.CoreModules.World.Archiver if (options.ContainsKey("noassets") && (bool)options["noassets"]) SaveAssets = false; + // Whether someone else (i.e., ReceivedAllAssets()) is responsible for calling TriggerOarFileSaved() when we're done + bool eventHandled = false; + try { Dictionary assetUuids = new Dictionary(); @@ -230,15 +233,21 @@ namespace OpenSim.Region.CoreModules.World.Archiver m_scene.RegionInfo.ScopeID, options, awre.ReceivedAllAssets); Util.FireAndForget(o => ar.Execute()); + eventHandled = true; } else { awre.ReceivedAllAssets(new List(), new List()); + eventHandled = true; } } - catch (Exception) + catch (Exception e) { m_saveStream.Close(); + + if (!eventHandled) + m_scene.EventManager.TriggerOarFileSaved(m_requestId, e.ToString()); + throw; } } From 15844da3af92fc6e874d6b2df8f5da3b490179ec Mon Sep 17 00:00:00 2001 From: Oren Hurvitz Date: Mon, 23 Apr 2012 15:27:04 +0300 Subject: [PATCH 174/547] Log the full exception when errors occur in BaseHttpServer --- .../Servers/HttpServer/BaseHttpServer.cs | 38 +++++++++---------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs b/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs index 6fa36b5d15..d0463c8121 100644 --- a/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs +++ b/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs @@ -356,7 +356,7 @@ namespace OpenSim.Framework.Servers.HttpServer } catch (Exception e) { - m_log.ErrorFormat("[BASE HTTP SERVER]: OnRequest() failed with {0}{1}", e.Message, e.StackTrace); + m_log.Error(String.Format("[BASE HTTP SERVER]: OnRequest() failed: {0} ", e.Message), e); } } @@ -551,11 +551,11 @@ namespace OpenSim.Framework.Servers.HttpServer catch (SocketException e) { // This has to be here to prevent a Linux/Mono crash - m_log.WarnFormat("[BASE HTTP SERVER]: XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux.", e); + m_log.Warn(String.Format("[BASE HTTP SERVER]: XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux. ", e.Message), e); } catch (IOException e) { - m_log.Warn("[BASE HTTP SERVER]: XmlRpcRequest issue: " + e.Message); + m_log.Warn(String.Format("[BASE HTTP SERVER]: XmlRpcRequest issue {0}. ", e.Message), e); } return; @@ -658,15 +658,15 @@ namespace OpenSim.Framework.Servers.HttpServer // // An alternative may be to turn off all response write exceptions on the HttpListener, but let's go // with the minimum first - m_log.WarnFormat("[BASE HTTP SERVER]: HandleRequest threw {0}.\nNOTE: this may be spurious on Linux", e); + m_log.Warn(String.Format("[BASE HTTP SERVER]: HandleRequest threw {0}.\nNOTE: this may be spurious on Linux ", e.Message), e); } catch (IOException e) { - m_log.ErrorFormat("[BASE HTTP SERVER]: HandleRequest() threw {0}{1}", e.Message, e.StackTrace); + m_log.Error(String.Format("[BASE HTTP SERVER]: HandleRequest() threw {0} ", e.Message), e); } catch (Exception e) { - m_log.ErrorFormat("[BASE HTTP SERVER]: HandleRequest() threw {0}{1}", e.Message, e.StackTrace); + m_log.Error(String.Format("[BASE HTTP SERVER]: HandleRequest() threw {0} ", e.Message), e); SendHTML500(response); } finally @@ -933,11 +933,11 @@ namespace OpenSim.Framework.Servers.HttpServer catch (SocketException e) { // This has to be here to prevent a Linux/Mono crash - m_log.WarnFormat("[BASE HTTP SERVER]: XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux.", e); + m_log.Warn(String.Format("[BASE HTTP SERVER]: XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux. ", e.Message), e); } catch (IOException e) { - m_log.Warn("[BASE HTTP SERVER]: XmlRpcRequest issue: " + e.Message); + m_log.Warn(String.Format("[BASE HTTP SERVER]: XmlRpcRequest issue {0} ", e.Message), e); } } return; @@ -970,11 +970,11 @@ namespace OpenSim.Framework.Servers.HttpServer catch (SocketException e) { // This has to be here to prevent a Linux/Mono crash - m_log.WarnFormat("[BASE HTTP SERVER]: XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux.", e); + m_log.Warn(String.Format("[BASE HTTP SERVER]: XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux. ", e.Message), e); } catch (IOException e) { - m_log.Warn("[BASE HTTP SERVER]: XmlRpcRequest issue: " + e.Message); + m_log.Warn(String.Format("[BASE HTTP SERVER]: XmlRpcRequest issue {0} ", e.Message), e); } } } @@ -1085,12 +1085,12 @@ namespace OpenSim.Framework.Servers.HttpServer } catch (IOException e) { - m_log.WarnFormat("[BASE HTTP SERVER]: LLSD IOException {0}.", e); + m_log.Warn(String.Format("[BASE HTTP SERVER]: LLSD IOException {0} ", e.Message), e); } catch (SocketException e) { // This has to be here to prevent a Linux/Mono crash - m_log.WarnFormat("[BASE HTTP SERVER]: LLSD issue {0}.\nNOTE: this may be spurious on Linux.", e); + m_log.Warn(String.Format("[BASE HTTP SERVER]: LLSD issue {0}.\nNOTE: this may be spurious on Linux. ", e.Message), e); } } } @@ -1342,8 +1342,8 @@ namespace OpenSim.Framework.Servers.HttpServer catch (SocketException f) { // This has to be here to prevent a Linux/Mono crash - m_log.WarnFormat( - "[BASE HTTP SERVER]: XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux.", f); + m_log.Warn( + String.Format("[BASE HTTP SERVER]: XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux. ", f.Message), f); } } catch(Exception) @@ -1638,11 +1638,11 @@ namespace OpenSim.Framework.Servers.HttpServer catch (SocketException e) { // This has to be here to prevent a Linux/Mono crash - m_log.WarnFormat("[BASE HTTP SERVER]: XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux.", e); + m_log.Warn(String.Format("[BASE HTTP SERVER]: XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux. ", e.Message), e); } catch (IOException e) { - m_log.Warn("[BASE HTTP SERVER]: XmlRpcRequest issue: " + e.Message); + m_log.Warn(String.Format("[BASE HTTP SERVER]: XmlRpcRequest issue {0} ", e.Message), e); } } } @@ -1679,7 +1679,7 @@ namespace OpenSim.Framework.Servers.HttpServer catch (SocketException e) { // This has to be here to prevent a Linux/Mono crash - m_log.WarnFormat("[BASE HTTP SERVER]: XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux.", e); + m_log.Warn(String.Format("[BASE HTTP SERVER]: XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux. ", e.Message), e); } } } @@ -1715,7 +1715,7 @@ namespace OpenSim.Framework.Servers.HttpServer catch (SocketException e) { // This has to be here to prevent a Linux/Mono crash - m_log.WarnFormat("[BASE HTTP SERVER] XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux.", e); + m_log.Warn(String.Format("[BASE HTTP SERVER] XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux. ", e.Message), e); } } } @@ -1794,7 +1794,7 @@ namespace OpenSim.Framework.Servers.HttpServer public void httpServerException(object source, Exception exception) { - m_log.ErrorFormat("[BASE HTTP SERVER]: {0} had an exception {1}", source.ToString(), exception.ToString()); + m_log.Error(String.Format("[BASE HTTP SERVER]: {0} had an exception: {1} ", source.ToString(), exception.Message), exception); /* if (HTTPDRunning)// && NotSocketErrors > 5) { From 5d1d47e1f9327c29ba26d231c8d18680d06cb1d9 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Mon, 7 May 2012 20:01:17 +0100 Subject: [PATCH 175/547] Revert "Better error handling if Load OAR or Save OAR fail" This reverts commit 65c88b2ff4e2616fa5c1d4c5e75298ed1eb1c0d8. Yet again I accidentally committed something whilst evaluating it. --- .../World/Archiver/ArchiveReadRequest.cs | 20 ++++--------------- .../Archiver/ArchiveWriteRequestExecution.cs | 7 +------ .../ArchiveWriteRequestPreparation.cs | 11 +--------- 3 files changed, 6 insertions(+), 32 deletions(-) diff --git a/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs b/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs index e360f938db..a6dbaba7d7 100644 --- a/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs +++ b/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs @@ -200,8 +200,8 @@ namespace OpenSim.Region.CoreModules.World.Archiver } catch (Exception e) { - m_log.Error( - String.Format("[ARCHIVER]: Aborting load with error in archive file {0} ", filePath), e); + m_log.ErrorFormat( + "[ARCHIVER]: Aborting load with error in archive file {0}. {1}", filePath, e); m_errorMessage += e.ToString(); m_scene.EventManager.TriggerOarFileLoaded(m_requestId, m_errorMessage); return; @@ -219,7 +219,6 @@ namespace OpenSim.Region.CoreModules.World.Archiver { m_log.ErrorFormat("[ARCHIVER]: Failed to load {0} assets", failedAssetRestores); m_errorMessage += String.Format("Failed to load {0} assets", failedAssetRestores); - // Continue, because we allow the OAR to be loaded even if some assets fail } } @@ -229,19 +228,8 @@ namespace OpenSim.Region.CoreModules.World.Archiver m_scene.DeleteAllSceneObjects(); } - try - { - LoadParcels(serialisedParcels); - LoadObjects(serialisedSceneObjects); - } - catch (Exception e) - { - m_log.Error("[ARCHIVER]: Error loading parcels or objects ", e); - m_errorMessage += e.ToString(); - m_scene.EventManager.TriggerOarFileLoaded(m_requestId, m_errorMessage); - return; - } - + LoadParcels(serialisedParcels); + LoadObjects(serialisedSceneObjects); m_log.InfoFormat("[ARCHIVER]: Successfully loaded archive"); diff --git a/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestExecution.cs b/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestExecution.cs index 2b40a9eded..c179a34b38 100644 --- a/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestExecution.cs +++ b/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestExecution.cs @@ -87,11 +87,6 @@ namespace OpenSim.Region.CoreModules.World.Archiver { Save(assetsFoundUuids, assetsNotFoundUuids); } - catch (Exception e) - { - m_scene.EventManager.TriggerOarFileSaved(m_requestId, e.ToString()); - throw; - } finally { m_archiveWriter.Close(); @@ -155,4 +150,4 @@ namespace OpenSim.Region.CoreModules.World.Archiver } } } -} +} \ No newline at end of file diff --git a/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestPreparation.cs b/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestPreparation.cs index 384d81b285..eabe46e936 100644 --- a/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestPreparation.cs +++ b/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestPreparation.cs @@ -124,9 +124,6 @@ namespace OpenSim.Region.CoreModules.World.Archiver if (options.ContainsKey("noassets") && (bool)options["noassets"]) SaveAssets = false; - // Whether someone else (i.e., ReceivedAllAssets()) is responsible for calling TriggerOarFileSaved() when we're done - bool eventHandled = false; - try { Dictionary assetUuids = new Dictionary(); @@ -233,21 +230,15 @@ namespace OpenSim.Region.CoreModules.World.Archiver m_scene.RegionInfo.ScopeID, options, awre.ReceivedAllAssets); Util.FireAndForget(o => ar.Execute()); - eventHandled = true; } else { awre.ReceivedAllAssets(new List(), new List()); - eventHandled = true; } } - catch (Exception e) + catch (Exception) { m_saveStream.Close(); - - if (!eventHandled) - m_scene.EventManager.TriggerOarFileSaved(m_requestId, e.ToString()); - throw; } } From abbd050a13e2b4f174c37979b46cf83f6b2f62dc Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Tue, 8 May 2012 21:31:35 +0100 Subject: [PATCH 176/547] Perform SceneGraph.DuplicateObject() under existing m_updateLock already used for link and delinking, in order to avoid race conditions. DuplicateObject() relies on source object having correct link numbers for the duration of the dupe. Both link and delink can change link numbers such that they are not consistent for short periods of time. --- OpenSim/Region/Framework/Scenes/SceneGraph.cs | 180 ++++++++++-------- 1 file changed, 97 insertions(+), 83 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs index 67eb0fe128..481592277d 100644 --- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs +++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs @@ -92,8 +92,12 @@ namespace OpenSim.Region.Framework.Scenes protected internal Dictionary SceneObjectGroupsByLocalPartID = new Dictionary(); /// - /// Lock to prevent object group update, linking and delinking operations from running concurrently. + /// Lock to prevent object group update, linking, delinking and duplication operations from running concurrently. /// + /// + /// These operations rely on the parts composition of the object. If allowed to run concurrently then race + /// conditions can occur. + /// private Object m_updateLock = new Object(); #endregion @@ -1844,96 +1848,106 @@ namespace OpenSim.Region.Framework.Scenes /// /// /// - public SceneObjectGroup DuplicateObject(uint originalPrimID, Vector3 offset, uint flags, UUID AgentID, UUID GroupID, Quaternion rot) + /// null if duplication fails, otherwise the duplicated object + public SceneObjectGroup DuplicateObject( + uint originalPrimID, Vector3 offset, uint flags, UUID AgentID, UUID GroupID, Quaternion rot) { -// m_log.DebugFormat( -// "[SCENE]: Duplication of object {0} at offset {1} requested by agent {2}", -// originalPrimID, offset, AgentID); - - SceneObjectGroup original = GetGroupByPrim(originalPrimID); - if (original != null) + Monitor.Enter(m_updateLock); + + try { - if (m_parentScene.Permissions.CanDuplicateObject( - original.PrimCount, original.UUID, AgentID, original.AbsolutePosition)) + // m_log.DebugFormat( + // "[SCENE]: Duplication of object {0} at offset {1} requested by agent {2}", + // originalPrimID, offset, AgentID); + + SceneObjectGroup original = GetGroupByPrim(originalPrimID); + if (original == null) { - SceneObjectGroup copy = original.Copy(true); - copy.AbsolutePosition = copy.AbsolutePosition + offset; + m_log.WarnFormat( + "[SCENEGRAPH]: Attempt to duplicate nonexistant prim id {0} by {1}", originalPrimID, AgentID); - if (original.OwnerID != AgentID) - { - copy.SetOwnerId(AgentID); - copy.SetRootPartOwner(copy.RootPart, AgentID, GroupID); - - SceneObjectPart[] partList = copy.Parts; - - if (m_parentScene.Permissions.PropagatePermissions()) - { - foreach (SceneObjectPart child in partList) - { - child.Inventory.ChangeInventoryOwner(AgentID); - child.TriggerScriptChangedEvent(Changed.OWNER); - child.ApplyNextOwnerPermissions(); - } - } - - copy.RootPart.ObjectSaleType = 0; - copy.RootPart.SalePrice = 10; - } - - // FIXME: This section needs to be refactored so that it just calls AddSceneObject() - Entities.Add(copy); - - lock (SceneObjectGroupsByFullID) - SceneObjectGroupsByFullID[copy.UUID] = copy; - - SceneObjectPart[] children = copy.Parts; - - lock (SceneObjectGroupsByFullPartID) - { - SceneObjectGroupsByFullPartID[copy.UUID] = copy; - foreach (SceneObjectPart part in children) - SceneObjectGroupsByFullPartID[part.UUID] = copy; - } - - lock (SceneObjectGroupsByLocalPartID) - { - SceneObjectGroupsByLocalPartID[copy.LocalId] = copy; - foreach (SceneObjectPart part in children) - SceneObjectGroupsByLocalPartID[part.LocalId] = copy; - } - // PROBABLE END OF FIXME - - // Since we copy from a source group that is in selected - // state, but the copy is shown deselected in the viewer, - // We need to clear the selection flag here, else that - // prim never gets persisted at all. The client doesn't - // think it's selected, so it will never send a deselect... - copy.IsSelected = false; - - m_numPrim += copy.Parts.Length; - - if (rot != Quaternion.Identity) - { - copy.UpdateGroupRotationR(rot); - } - - copy.CreateScriptInstances(0, false, m_parentScene.DefaultScriptEngine, 1); - copy.HasGroupChanged = true; - copy.ScheduleGroupForFullUpdate(); - copy.ResumeScripts(); - - // required for physics to update it's position - copy.AbsolutePosition = copy.AbsolutePosition; - - return copy; + return null; } + + if (!m_parentScene.Permissions.CanDuplicateObject( + original.PrimCount, original.UUID, AgentID, original.AbsolutePosition)) + return null; + + SceneObjectGroup copy = original.Copy(true); + copy.AbsolutePosition = copy.AbsolutePosition + offset; + + if (original.OwnerID != AgentID) + { + copy.SetOwnerId(AgentID); + copy.SetRootPartOwner(copy.RootPart, AgentID, GroupID); + + SceneObjectPart[] partList = copy.Parts; + + if (m_parentScene.Permissions.PropagatePermissions()) + { + foreach (SceneObjectPart child in partList) + { + child.Inventory.ChangeInventoryOwner(AgentID); + child.TriggerScriptChangedEvent(Changed.OWNER); + child.ApplyNextOwnerPermissions(); + } + } + + copy.RootPart.ObjectSaleType = 0; + copy.RootPart.SalePrice = 10; + } + + // FIXME: This section needs to be refactored so that it just calls AddSceneObject() + Entities.Add(copy); + + lock (SceneObjectGroupsByFullID) + SceneObjectGroupsByFullID[copy.UUID] = copy; + + SceneObjectPart[] children = copy.Parts; + + lock (SceneObjectGroupsByFullPartID) + { + SceneObjectGroupsByFullPartID[copy.UUID] = copy; + foreach (SceneObjectPart part in children) + SceneObjectGroupsByFullPartID[part.UUID] = copy; + } + + lock (SceneObjectGroupsByLocalPartID) + { + SceneObjectGroupsByLocalPartID[copy.LocalId] = copy; + foreach (SceneObjectPart part in children) + SceneObjectGroupsByLocalPartID[part.LocalId] = copy; + } + // PROBABLE END OF FIXME + + // Since we copy from a source group that is in selected + // state, but the copy is shown deselected in the viewer, + // We need to clear the selection flag here, else that + // prim never gets persisted at all. The client doesn't + // think it's selected, so it will never send a deselect... + copy.IsSelected = false; + + m_numPrim += copy.Parts.Length; + + if (rot != Quaternion.Identity) + { + copy.UpdateGroupRotationR(rot); + } + + copy.CreateScriptInstances(0, false, m_parentScene.DefaultScriptEngine, 1); + copy.HasGroupChanged = true; + copy.ScheduleGroupForFullUpdate(); + copy.ResumeScripts(); + + // required for physics to update it's position + copy.AbsolutePosition = copy.AbsolutePosition; + + return copy; } - else + finally { - m_log.WarnFormat("[SCENE]: Attempted to duplicate nonexistant prim id {0}", GroupID); + Monitor.Exit(m_updateLock); } - - return null; } /// From 01b78235db71994ba3e37bd6ea297bed7e4576b9 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Tue, 8 May 2012 22:58:34 +0100 Subject: [PATCH 177/547] Instead of constantly looking up unchanging self item in script code, pass in self item on initialization. --- .../ScriptEngine/Interfaces/IScriptApi.cs | 20 +- .../Shared/Api/Implementation/LSL_Api.cs | 244 ++++++++---------- .../Shared/Api/Implementation/LS_Api.cs | 4 +- .../Shared/Api/Implementation/MOD_Api.cs | 10 +- .../Shared/Api/Implementation/OSSL_Api.cs | 29 +-- .../Shared/Instance/ScriptInstance.cs | 2 +- .../Shared/Tests/LSL_ApiInventoryTests.cs | 9 +- .../ScriptEngine/Shared/Tests/LSL_ApiTest.cs | 3 +- .../Shared/Tests/OSSL_ApiAppearanceTest.cs | 8 +- .../Shared/Tests/OSSL_ApiNpcTests.cs | 6 +- 10 files changed, 145 insertions(+), 190 deletions(-) diff --git a/OpenSim/Region/ScriptEngine/Interfaces/IScriptApi.cs b/OpenSim/Region/ScriptEngine/Interfaces/IScriptApi.cs index bb5baccfd4..cced52260f 100644 --- a/OpenSim/Region/ScriptEngine/Interfaces/IScriptApi.cs +++ b/OpenSim/Region/ScriptEngine/Interfaces/IScriptApi.cs @@ -27,17 +27,23 @@ using System; using OpenMetaverse; +using OpenSim.Framework; using OpenSim.Region.Framework.Scenes; - namespace OpenSim.Region.ScriptEngine.Interfaces { public interface IScriptApi { - // - // Each API has an identifier, which is used to load the - // proper runtime assembly at load time. - // - void Initialize(IScriptEngine engine, SceneObjectPart part, uint localID, UUID item); + /// + /// Initialize the API + /// + /// + /// Each API has an identifier, which is used to load the + /// proper runtime assembly at load time. + /// /param> + /// + /// + /// + void Initialize(IScriptEngine engine, SceneObjectPart part, uint localID, TaskInventoryItem item); } -} +} \ No newline at end of file diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index 704dfc31a7..e8e4dab02a 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -87,9 +87,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api protected uint m_localID; /// - /// The UUID of the item that hosts this script + /// The item that hosts this script /// - protected UUID m_itemID; + protected TaskInventoryItem m_item; protected bool throwErrorOnNotImplemented = true; protected AsyncCommandManager AsyncCommands = null; @@ -108,12 +108,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api protected Dictionary m_userInfoCache = new Dictionary(); - public void Initialize(IScriptEngine ScriptEngine, SceneObjectPart host, uint localID, UUID itemID) + public void Initialize(IScriptEngine ScriptEngine, SceneObjectPart host, uint localID, TaskInventoryItem item) { m_ScriptEngine = ScriptEngine; m_host = host; m_localID = localID; - m_itemID = itemID; + m_item = item; m_ScriptDelayFactor = m_ScriptEngine.Config.GetFloat("ScriptDelayFactor", 1.0f); @@ -163,7 +163,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public void state(string newState) { - m_ScriptEngine.SetState(m_itemID, newState); + m_ScriptEngine.SetState(m_item.ItemID, newState); } /// @@ -173,7 +173,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public void llResetScript() { m_host.AddScriptLPS(1); - m_ScriptEngine.ApiResetScript(m_itemID); + m_ScriptEngine.ApiResetScript(m_item.ItemID); } public void llResetOtherScript(string name) @@ -272,20 +272,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api } } - /// - /// Get the inventory item that hosts ourselves. - /// - /// - /// FIXME: It would be far easier to pass in TaskInventoryItem rather than just m_itemID so that we don't need - /// to keep looking ourselves up. - /// - /// - protected TaskInventoryItem GetSelfInventoryItem() - { - lock (m_host.TaskInventory) - return m_host.TaskInventory[m_itemID]; - } - protected UUID InventoryKey(string name, int type) { m_host.AddScriptLPS(1); @@ -857,7 +843,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api UUID.TryParse(ID, out keyID); IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface(); if (wComm != null) - return wComm.Listen(m_localID, m_itemID, m_host.UUID, channelID, name, keyID, msg); + return wComm.Listen(m_localID, m_item.ItemID, m_host.UUID, channelID, name, keyID, msg); else return -1; } @@ -867,7 +853,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api m_host.AddScriptLPS(1); IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface(); if (wComm != null) - wComm.ListenControl(m_itemID, number, active); + wComm.ListenControl(m_item.ItemID, number, active); } public void llListenRemove(int number) @@ -875,7 +861,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api m_host.AddScriptLPS(1); IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface(); if (wComm != null) - wComm.ListenRemove(m_itemID, number); + wComm.ListenRemove(m_item.ItemID, number); } public void llSensor(string name, string id, int type, double range, double arc) @@ -884,7 +870,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api UUID keyID = UUID.Zero; UUID.TryParse(id, out keyID); - AsyncCommands.SensorRepeatPlugin.SenseOnce(m_localID, m_itemID, name, keyID, type, range, arc, m_host); + AsyncCommands.SensorRepeatPlugin.SenseOnce(m_localID, m_item.ItemID, name, keyID, type, range, arc, m_host); } public void llSensorRepeat(string name, string id, int type, double range, double arc, double rate) @@ -893,13 +879,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api UUID keyID = UUID.Zero; UUID.TryParse(id, out keyID); - AsyncCommands.SensorRepeatPlugin.SetSenseRepeatEvent(m_localID, m_itemID, name, keyID, type, range, arc, rate, m_host); + AsyncCommands.SensorRepeatPlugin.SetSenseRepeatEvent(m_localID, m_item.ItemID, name, keyID, type, range, arc, rate, m_host); } public void llSensorRemove() { m_host.AddScriptLPS(1); - AsyncCommands.SensorRepeatPlugin.UnSetSenseRepeaterEvents(m_localID, m_itemID); + AsyncCommands.SensorRepeatPlugin.UnSetSenseRepeaterEvents(m_localID, m_item.ItemID); } public string resolveName(UUID objecUUID) @@ -940,7 +926,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public LSL_String llDetectedName(int number) { m_host.AddScriptLPS(1); - DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, number); + DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, number); if (detectedParams == null) return String.Empty; return detectedParams.Name; @@ -949,7 +935,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public LSL_String llDetectedKey(int number) { m_host.AddScriptLPS(1); - DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, number); + DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, number); if (detectedParams == null) return String.Empty; return detectedParams.Key.ToString(); @@ -958,7 +944,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public LSL_String llDetectedOwner(int number) { m_host.AddScriptLPS(1); - DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, number); + DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, number); if (detectedParams == null) return String.Empty; return detectedParams.Owner.ToString(); @@ -967,7 +953,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public LSL_Integer llDetectedType(int number) { m_host.AddScriptLPS(1); - DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, number); + DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, number); if (detectedParams == null) return 0; return new LSL_Integer(detectedParams.Type); @@ -976,7 +962,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public LSL_Vector llDetectedPos(int number) { m_host.AddScriptLPS(1); - DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, number); + DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, number); if (detectedParams == null) return new LSL_Vector(); return detectedParams.Position; @@ -985,7 +971,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public LSL_Vector llDetectedVel(int number) { m_host.AddScriptLPS(1); - DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, number); + DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, number); if (detectedParams == null) return new LSL_Vector(); return detectedParams.Velocity; @@ -994,7 +980,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public LSL_Vector llDetectedGrab(int number) { m_host.AddScriptLPS(1); - DetectParams parms = m_ScriptEngine.GetDetectParams(m_itemID, number); + DetectParams parms = m_ScriptEngine.GetDetectParams(m_item.ItemID, number); if (parms == null) return new LSL_Vector(0, 0, 0); @@ -1004,7 +990,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public LSL_Rotation llDetectedRot(int number) { m_host.AddScriptLPS(1); - DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, number); + DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, number); if (detectedParams == null) return new LSL_Rotation(); return detectedParams.Rotation; @@ -1013,7 +999,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public LSL_Integer llDetectedGroup(int number) { m_host.AddScriptLPS(1); - DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, number); + DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, number); if (detectedParams == null) return new LSL_Integer(0); if (m_host.GroupID == detectedParams.Group) @@ -1024,7 +1010,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public LSL_Integer llDetectedLinkNumber(int number) { m_host.AddScriptLPS(1); - DetectParams parms = m_ScriptEngine.GetDetectParams(m_itemID, number); + DetectParams parms = m_ScriptEngine.GetDetectParams(m_item.ItemID, number); if (parms == null) return new LSL_Integer(0); @@ -1037,7 +1023,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public LSL_Vector llDetectedTouchBinormal(int index) { m_host.AddScriptLPS(1); - DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, index); + DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, index); if (detectedParams == null) return new LSL_Vector(); return detectedParams.TouchBinormal; @@ -1049,7 +1035,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public LSL_Integer llDetectedTouchFace(int index) { m_host.AddScriptLPS(1); - DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, index); + DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, index); if (detectedParams == null) return new LSL_Integer(-1); return new LSL_Integer(detectedParams.TouchFace); @@ -1061,7 +1047,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public LSL_Vector llDetectedTouchNormal(int index) { m_host.AddScriptLPS(1); - DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, index); + DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, index); if (detectedParams == null) return new LSL_Vector(); return detectedParams.TouchNormal; @@ -1073,7 +1059,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public LSL_Vector llDetectedTouchPos(int index) { m_host.AddScriptLPS(1); - DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, index); + DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, index); if (detectedParams == null) return new LSL_Vector(); return detectedParams.TouchPos; @@ -1085,7 +1071,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public LSL_Vector llDetectedTouchST(int index) { m_host.AddScriptLPS(1); - DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, index); + DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, index); if (detectedParams == null) return new LSL_Vector(-1.0, -1.0, 0.0); return detectedParams.TouchST; @@ -1097,7 +1083,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public LSL_Vector llDetectedTouchUV(int index) { m_host.AddScriptLPS(1); - DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, index); + DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, index); if (detectedParams == null) return new LSL_Vector(-1.0, -1.0, 0.0); return detectedParams.TouchUV; @@ -2702,12 +2688,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api { m_host.AddScriptLPS(1); - TaskInventoryItem item = GetSelfInventoryItem(); - - if (item.PermsGranter == UUID.Zero) + if (m_item.PermsGranter == UUID.Zero) return 0; - if ((item.PermsMask & ScriptBaseClass.PERMISSION_DEBIT) == 0) + if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_DEBIT) == 0) { LSLError("No permissions to give money"); return 0; @@ -2890,7 +2874,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api sec = m_MinTimerInterval; m_host.AddScriptLPS(1); // Setting timer repeat - AsyncCommands.TimerPlugin.SetTimerEvent(m_localID, m_itemID, sec); + AsyncCommands.TimerPlugin.SetTimerEvent(m_localID, m_item.ItemID, sec); } public virtual void llSleep(double sec) @@ -2945,17 +2929,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public void llTakeControls(int controls, int accept, int pass_on) { - TaskInventoryItem item = GetSelfInventoryItem(); - - if (item.PermsGranter != UUID.Zero) + if (m_item.PermsGranter != UUID.Zero) { - ScenePresence presence = World.GetScenePresence(item.PermsGranter); + ScenePresence presence = World.GetScenePresence(m_item.PermsGranter); if (presence != null) { - if ((item.PermsMask & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) != 0) + if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) != 0) { - presence.RegisterControlEventsToScript(controls, accept, pass_on, m_localID, m_itemID); + presence.RegisterControlEventsToScript(controls, accept, pass_on, m_localID, m_item.ItemID); } } } @@ -2967,20 +2949,18 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api { m_host.AddScriptLPS(1); - TaskInventoryItem item = GetSelfInventoryItem(); - - if (item.PermsGranter != UUID.Zero) + if (m_item.PermsGranter != UUID.Zero) { - ScenePresence presence = World.GetScenePresence(item.PermsGranter); + ScenePresence presence = World.GetScenePresence(m_item.PermsGranter); if (presence != null) { - if ((item.PermsMask & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) != 0) + if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) != 0) { // Unregister controls from Presence - presence.UnRegisterControlEventsToScript(m_localID, m_itemID); + presence.UnRegisterControlEventsToScript(m_localID, m_item.ItemID); // Remove Take Control permission. - item.PermsMask &= ~ScriptBaseClass.PERMISSION_TAKE_CONTROLS; + m_item.PermsMask &= ~ScriptBaseClass.PERMISSION_TAKE_CONTROLS; } } } @@ -3042,12 +3022,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api // if (m_host.ParentGroup.RootPart.AttachmentPoint == 0) // return; - TaskInventoryItem item = GetSelfInventoryItem(); - - if (item.PermsGranter != m_host.OwnerID) + if (m_item.PermsGranter != m_host.OwnerID) return; - if ((item.PermsMask & ScriptBaseClass.PERMISSION_ATTACH) != 0) + if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_ATTACH) != 0) AttachToAvatar(attachmentPoint); } @@ -3058,12 +3036,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api if (m_host.ParentGroup.AttachmentPoint == 0) return; - TaskInventoryItem item = GetSelfInventoryItem(); - - if (item.PermsGranter != m_host.OwnerID) + if (m_item.PermsGranter != m_host.OwnerID) return; - if ((item.PermsMask & ScriptBaseClass.PERMISSION_ATTACH) != 0) + if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_ATTACH) != 0) DetachFromAvatar(); } @@ -3245,7 +3221,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api m_host.AddScriptLPS(1); try { - m_ScriptEngine.SetMinEventDelay(m_itemID, delay); + m_ScriptEngine.SetMinEventDelay(m_item.ItemID, delay); } catch (NotImplementedException) { @@ -3298,14 +3274,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api { m_host.AddScriptLPS(1); - TaskInventoryItem item = GetSelfInventoryItem(); - - if (item.PermsGranter == UUID.Zero) + if (m_item.PermsGranter == UUID.Zero) return; - if ((item.PermsMask & ScriptBaseClass.PERMISSION_TRIGGER_ANIMATION) != 0) + if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_TRIGGER_ANIMATION) != 0) { - ScenePresence presence = World.GetScenePresence(item.PermsGranter); + ScenePresence presence = World.GetScenePresence(m_item.PermsGranter); if (presence != null) { @@ -3323,21 +3297,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api { m_host.AddScriptLPS(1); - TaskInventoryItem item = GetSelfInventoryItem(); - - if (item.PermsGranter == UUID.Zero) + if (m_item.PermsGranter == UUID.Zero) return; - if ((item.PermsMask & ScriptBaseClass.PERMISSION_TRIGGER_ANIMATION) != 0) + if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_TRIGGER_ANIMATION) != 0) { UUID animID = new UUID(); if (!UUID.TryParse(anim, out animID)) { - animID=InventoryKey(anim); + animID = InventoryKey(anim); } - ScenePresence presence = World.GetScenePresence(item.PermsGranter); + ScenePresence presence = World.GetScenePresence(m_item.PermsGranter); if (presence != null) { @@ -3373,7 +3345,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public LSL_Integer llGetStartParameter() { m_host.AddScriptLPS(1); - return m_ScriptEngine.GetStartParameter(m_itemID); + return m_ScriptEngine.GetStartParameter(m_item.ItemID); } public void llRequestPermissions(string agent, int perm) @@ -3383,16 +3355,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api if (!UUID.TryParse(agent, out agentID)) return; - TaskInventoryItem item = GetSelfInventoryItem(); - if (agentID == UUID.Zero || perm == 0) // Releasing permissions { llReleaseControls(); - item.PermsGranter = UUID.Zero; - item.PermsMask = 0; + m_item.PermsGranter = UUID.Zero; + m_item.PermsMask = 0; - m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams( + m_ScriptEngine.PostScriptEvent(m_item.ItemID, new EventParams( "run_time_permissions", new Object[] { new LSL_Integer(0) }, new DetectParams[0])); @@ -3400,7 +3370,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api return; } - if (item.PermsGranter != agentID || (perm & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) == 0) + if (m_item.PermsGranter != agentID || (perm & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) == 0) llReleaseControls(); m_host.AddScriptLPS(1); @@ -3417,11 +3387,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api { lock (m_host.TaskInventory) { - m_host.TaskInventory[m_itemID].PermsGranter = agentID; - m_host.TaskInventory[m_itemID].PermsMask = perm; + m_host.TaskInventory[m_item.ItemID].PermsGranter = agentID; + m_host.TaskInventory[m_item.ItemID].PermsMask = perm; } - m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams( + m_ScriptEngine.PostScriptEvent(m_item.ItemID, new EventParams( "run_time_permissions", new Object[] { new LSL_Integer(perm) }, new DetectParams[0])); @@ -3441,11 +3411,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api { lock (m_host.TaskInventory) { - m_host.TaskInventory[m_itemID].PermsGranter = agentID; - m_host.TaskInventory[m_itemID].PermsMask = perm; + m_host.TaskInventory[m_item.ItemID].PermsGranter = agentID; + m_host.TaskInventory[m_item.ItemID].PermsMask = perm; } - m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams( + m_ScriptEngine.PostScriptEvent(m_item.ItemID, new EventParams( "run_time_permissions", new Object[] { new LSL_Integer(perm) }, new DetectParams[0])); @@ -3466,8 +3436,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api { lock (m_host.TaskInventory) { - m_host.TaskInventory[m_itemID].PermsGranter = agentID; - m_host.TaskInventory[m_itemID].PermsMask = 0; + m_host.TaskInventory[m_item.ItemID].PermsGranter = agentID; + m_host.TaskInventory[m_item.ItemID].PermsMask = 0; } presence.ControllingClient.OnScriptAnswer += handleScriptAnswer; @@ -3475,13 +3445,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api } presence.ControllingClient.SendScriptQuestion( - m_host.UUID, m_host.ParentGroup.RootPart.Name, ownerName, m_itemID, perm); + m_host.UUID, m_host.ParentGroup.RootPart.Name, ownerName, m_item.ItemID, perm); return; } // Requested agent is not in range, refuse perms - m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams( + m_ScriptEngine.PostScriptEvent(m_item.ItemID, new EventParams( "run_time_permissions", new Object[] { new LSL_Integer(0) }, new DetectParams[0])); @@ -3500,10 +3470,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api lock (m_host.TaskInventory) { - m_host.TaskInventory[m_itemID].PermsMask = answer; + m_host.TaskInventory[m_item.ItemID].PermsMask = answer; } - m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams( + m_ScriptEngine.PostScriptEvent(m_item.ItemID, new EventParams( "run_time_permissions", new Object[] { new LSL_Integer(answer) }, new DetectParams[0])); @@ -3513,14 +3483,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api { m_host.AddScriptLPS(1); - return GetSelfInventoryItem().PermsGranter.ToString(); + return m_item.PermsGranter.ToString(); } public LSL_Integer llGetPermissions() { m_host.AddScriptLPS(1); - int perms = GetSelfInventoryItem().PermsMask; + int perms = m_item.PermsMask; if (m_automaticLinkPermission) perms |= ScriptBaseClass.PERMISSION_CHANGE_LINKS; @@ -3558,9 +3528,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api if (!UUID.TryParse(target, out targetID)) return; - TaskInventoryItem item = GetSelfInventoryItem(); - - if ((item.PermsMask & ScriptBaseClass.PERMISSION_CHANGE_LINKS) == 0 + if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_CHANGE_LINKS) == 0 && !m_automaticLinkPermission) { ShoutError("Script trying to link but PERMISSION_CHANGE_LINKS permission not set!"); @@ -3568,7 +3536,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api } IClientAPI client = null; - ScenePresence sp = World.GetScenePresence(item.PermsGranter); + ScenePresence sp = World.GetScenePresence(m_item.PermsGranter); if (sp != null) client = sp.ControllingClient; @@ -3615,7 +3583,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api { m_host.AddScriptLPS(1); - if ((GetSelfInventoryItem().PermsMask & ScriptBaseClass.PERMISSION_CHANGE_LINKS) == 0 + if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_CHANGE_LINKS) == 0 && !m_automaticLinkPermission) { ShoutError("Script trying to link but PERMISSION_CHANGE_LINKS permission not set!"); @@ -3986,7 +3954,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api { if (item.Name == name) { - if (item.ItemID == m_itemID) + if (item.ItemID == m_item.ItemID) throw new ScriptDeleteException(); else m_host.Inventory.RemoveInventoryItem(item.ItemID); @@ -4122,7 +4090,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api UUID tid = AsyncCommands. DataserverPlugin.RegisterRequest(m_localID, - m_itemID, rq.ToString()); + m_item.ItemID, rq.ToString()); AsyncCommands. DataserverPlugin.DataserverReply(rq.ToString(), reply); @@ -4143,7 +4111,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api { UUID tid = AsyncCommands. DataserverPlugin.RegisterRequest(m_localID, - m_itemID, item.AssetID.ToString()); + m_item.ItemID, item.AssetID.ToString()); Vector3 region = new Vector3( World.RegionInfo.RegionLocX * Constants.RegionSize, @@ -4498,9 +4466,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api { m_host.AddScriptLPS(1); - TaskInventoryItem item = GetSelfInventoryItem(); - - return item.Name != null ? item.Name : String.Empty; + return m_item.Name != null ? m_item.Name : String.Empty; } public LSL_Integer llGetLinkNumberOfSides(int link) @@ -6598,14 +6564,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api IXMLRPC xmlrpcMod = m_ScriptEngine.World.RequestModuleInterface(); if (xmlrpcMod.IsEnabled()) { - UUID channelID = xmlrpcMod.OpenXMLRPCChannel(m_localID, m_itemID, UUID.Zero); + UUID channelID = xmlrpcMod.OpenXMLRPCChannel(m_localID, m_item.ItemID, UUID.Zero); IXmlRpcRouter xmlRpcRouter = m_ScriptEngine.World.RequestModuleInterface(); if (xmlRpcRouter != null) { string ExternalHostName = m_ScriptEngine.World.RegionInfo.ExternalHostName; xmlRpcRouter.RegisterNewReceiver(m_ScriptEngine.ScriptModule, channelID, m_host.UUID, - m_itemID, String.Format("http://{0}:{1}/", ExternalHostName, + m_item.ItemID, String.Format("http://{0}:{1}/", ExternalHostName, xmlrpcMod.Port.ToString())); } object[] resobj = new object[] @@ -6617,7 +6583,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api new LSL_Integer(0), new LSL_String(String.Empty) }; - m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams("remote_data", resobj, + m_ScriptEngine.PostScriptEvent(m_item.ItemID, new EventParams("remote_data", resobj, new DetectParams[0])); } ScriptSleep(1000); @@ -6628,7 +6594,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api m_host.AddScriptLPS(1); IXMLRPC xmlrpcMod = m_ScriptEngine.World.RequestModuleInterface(); ScriptSleep(3000); - return (xmlrpcMod.SendRemoteData(m_localID, m_itemID, channel, dest, idata, sdata)).ToString(); + return (xmlrpcMod.SendRemoteData(m_localID, m_item.ItemID, channel, dest, idata, sdata)).ToString(); } public void llRemoteDataReply(string channel, string message_id, string sdata, int idata) @@ -9049,13 +9015,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api { m_host.AddScriptLPS(1); if (m_UrlModule != null) - return m_UrlModule.RequestSecureURL(m_ScriptEngine.ScriptModule, m_host, m_itemID).ToString(); + return m_UrlModule.RequestSecureURL(m_ScriptEngine.ScriptModule, m_host, m_item.ItemID).ToString(); return UUID.Zero.ToString(); } public LSL_String llRequestSimulatorData(string simulator, int data) { - IOSSL_Api ossl = (IOSSL_Api)m_ScriptEngine.GetApi(m_itemID, "OSSL"); + IOSSL_Api ossl = (IOSSL_Api)m_ScriptEngine.GetApi(m_item.ItemID, "OSSL"); try { @@ -9117,7 +9083,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api UUID rq = UUID.Random(); UUID tid = AsyncCommands. - DataserverPlugin.RegisterRequest(m_localID, m_itemID, rq.ToString()); + DataserverPlugin.RegisterRequest(m_localID, m_item.ItemID, rq.ToString()); AsyncCommands. DataserverPlugin.DataserverReply(rq.ToString(), reply); @@ -9136,7 +9102,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api m_host.AddScriptLPS(1); if (m_UrlModule != null) - return m_UrlModule.RequestURL(m_ScriptEngine.ScriptModule, m_host, m_itemID).ToString(); + return m_UrlModule.RequestURL(m_ScriptEngine.ScriptModule, m_host, m_item.ItemID).ToString(); return UUID.Zero.ToString(); } @@ -9602,12 +9568,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api { m_host.AddScriptLPS(1); - TaskInventoryItem item = GetSelfInventoryItem(); - - if (item.PermsGranter == UUID.Zero) + if (m_item.PermsGranter == UUID.Zero) return new LSL_Vector(); - if ((item.PermsMask & ScriptBaseClass.PERMISSION_TRACK_CAMERA) == 0) + if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_TRACK_CAMERA) == 0) { ShoutError("No permissions to track the camera"); return new LSL_Vector(); @@ -9626,12 +9590,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api { m_host.AddScriptLPS(1); - TaskInventoryItem item = GetSelfInventoryItem(); - - if (item.PermsGranter == UUID.Zero) + if (m_item.PermsGranter == UUID.Zero) return new LSL_Rotation(); - if ((item.PermsMask & ScriptBaseClass.PERMISSION_TRACK_CAMERA) == 0) + if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_TRACK_CAMERA) == 0) { ShoutError("No permissions to track the camera"); return new LSL_Rotation(); @@ -9696,7 +9658,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public void llMapDestination(string simname, LSL_Vector pos, LSL_Vector lookAt) { m_host.AddScriptLPS(1); - DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, 0); + DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, 0); if (detectedParams == null) return; // only works on the first detected avatar ScenePresence avatar = World.GetScenePresence(detectedParams.Key); @@ -9813,15 +9775,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api if (objectID == UUID.Zero) return; - TaskInventoryItem item = GetSelfInventoryItem(); - // we need the permission first, to know which avatar we want to set the camera for - UUID agentID = item.PermsGranter; + UUID agentID = m_item.PermsGranter; if (agentID == UUID.Zero) return; - if ((item.PermsMask & ScriptBaseClass.PERMISSION_CONTROL_CAMERA) == 0) + if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_CONTROL_CAMERA) == 0) return; ScenePresence presence = World.GetScenePresence(agentID); @@ -9867,15 +9827,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api if (objectID == UUID.Zero) return; - TaskInventoryItem item = GetSelfInventoryItem(); - // we need the permission first, to know which avatar we want to clear the camera for - UUID agentID = item.PermsGranter; + UUID agentID = m_item.PermsGranter; if (agentID == UUID.Zero) return; - if ((item.PermsMask & ScriptBaseClass.PERMISSION_CONTROL_CAMERA) == 0) + if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_CONTROL_CAMERA) == 0) return; ScenePresence presence = World.GetScenePresence(agentID); @@ -10025,7 +9983,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api } UUID reqID = httpScriptMod. - StartHttpRequest(m_localID, m_itemID, url, param, httpHeaders, body); + StartHttpRequest(m_localID, m_item.ItemID, url, param, httpHeaders, body); if (reqID != UUID.Zero) return reqID.ToString(); @@ -10455,7 +10413,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api } // was: UUID tid = tid = AsyncCommands. - UUID tid = AsyncCommands.DataserverPlugin.RegisterRequest(m_localID, m_itemID, assetID.ToString()); + UUID tid = AsyncCommands.DataserverPlugin.RegisterRequest(m_localID, m_item.ItemID, assetID.ToString()); if (NotecardCache.IsCached(assetID)) { @@ -10517,7 +10475,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api } // was: UUID tid = tid = AsyncCommands. - UUID tid = AsyncCommands.DataserverPlugin.RegisterRequest(m_localID, m_itemID, assetID.ToString()); + UUID tid = AsyncCommands.DataserverPlugin.RegisterRequest(m_localID, m_item.ItemID, assetID.ToString()); if (NotecardCache.IsCached(assetID)) { @@ -10575,7 +10533,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public void print(string str) { // yes, this is a real LSL function. See: http://wiki.secondlife.com/wiki/Print - IOSSL_Api ossl = (IOSSL_Api)m_ScriptEngine.GetApi(m_itemID, "OSSL"); + IOSSL_Api ossl = (IOSSL_Api)m_ScriptEngine.GetApi(m_item.ItemID, "OSSL"); if (ossl != null) { ossl.CheckThreatLevel(ThreatLevel.High, "print"); @@ -10603,7 +10561,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api { UUID rq = UUID.Random(); - AsyncCommands.DataserverPlugin.RegisterRequest(m_localID, m_itemID, rq.ToString()); + AsyncCommands.DataserverPlugin.RegisterRequest(m_localID, m_item.ItemID, rq.ToString()); AsyncCommands.DataserverPlugin.DataserverReply(rq.ToString(), Name2Username(llKey2Name(id))); @@ -10619,7 +10577,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api { UUID rq = UUID.Random(); - AsyncCommands.DataserverPlugin.RegisterRequest(m_localID, m_itemID, rq.ToString()); + AsyncCommands.DataserverPlugin.RegisterRequest(m_localID, m_item.ItemID, rq.ToString()); AsyncCommands.DataserverPlugin.DataserverReply(rq.ToString(), llKey2Name(id)); diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LS_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LS_Api.cs index df20126ff2..cd47d96e99 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LS_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LS_Api.cs @@ -59,16 +59,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api internal IScriptEngine m_ScriptEngine; internal SceneObjectPart m_host; internal uint m_localID; - internal UUID m_itemID; internal bool m_LSFunctionsEnabled = false; internal IScriptModuleComms m_comms = null; - public void Initialize(IScriptEngine ScriptEngine, SceneObjectPart host, uint localID, UUID itemID) + public void Initialize(IScriptEngine ScriptEngine, SceneObjectPart host, uint localID, TaskInventoryItem item) { m_ScriptEngine = ScriptEngine; m_host = host; m_localID = localID; - m_itemID = itemID; if (m_ScriptEngine.Config.GetBoolean("AllowLightShareFunctions", false)) m_LSFunctionsEnabled = true; diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/MOD_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/MOD_Api.cs index 7c07e15fa3..a578b50cf1 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/MOD_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/MOD_Api.cs @@ -58,16 +58,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api internal IScriptEngine m_ScriptEngine; internal SceneObjectPart m_host; internal uint m_localID; - internal UUID m_itemID; + internal TaskInventoryItem m_item; internal bool m_MODFunctionsEnabled = false; internal IScriptModuleComms m_comms = null; - public void Initialize(IScriptEngine ScriptEngine, SceneObjectPart host, uint localID, UUID itemID) + public void Initialize(IScriptEngine ScriptEngine, SceneObjectPart host, uint localID, TaskInventoryItem item) { m_ScriptEngine = ScriptEngine; m_host = host; m_localID = localID; - m_itemID = itemID; + m_item = item; if (m_ScriptEngine.Config.GetBoolean("AllowMODFunctions", false)) m_MODFunctionsEnabled = true; @@ -252,7 +252,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api // non-null but don't trust it completely try { - object result = m_comms.InvokeOperation(m_host.UUID, m_itemID, fname, convertedParms); + object result = m_comms.InvokeOperation(m_host.UUID, m_item.ItemID, fname, convertedParms); if (result != null) return result; @@ -279,7 +279,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api UUID req = UUID.Random(); - m_comms.RaiseEvent(m_itemID, req.ToString(), module, command, k); + m_comms.RaiseEvent(m_item.ItemID, req.ToString(), module, command, k); return req.ToString(); } diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs index 3b67966a1a..9b2022a1c2 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs @@ -134,19 +134,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api internal ILSL_Api m_LSL_Api = null; // get a reference to the LSL API so we can call methods housed there internal SceneObjectPart m_host; internal uint m_localID; - internal UUID m_itemID; + internal TaskInventoryItem m_item; internal bool m_OSFunctionsEnabled = false; internal ThreatLevel m_MaxThreatLevel = ThreatLevel.VeryLow; internal float m_ScriptDelayFactor = 1.0f; internal float m_ScriptDistanceFactor = 1.0f; internal Dictionary m_FunctionPerms = new Dictionary(); - public void Initialize(IScriptEngine ScriptEngine, SceneObjectPart host, uint localID, UUID itemID) + public void Initialize(IScriptEngine ScriptEngine, SceneObjectPart host, uint localID, TaskInventoryItem item) { m_ScriptEngine = ScriptEngine; m_host = host; m_localID = localID; - m_itemID = itemID; + m_item = item; if (m_ScriptEngine.Config.GetBoolean("AllowOSFunctions", false)) m_OSFunctionsEnabled = true; @@ -224,7 +224,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api if (m_LSL_Api != null) return; - m_LSL_Api = (ILSL_Api)m_ScriptEngine.GetApi(m_itemID, "LSL"); + m_LSL_Api = (ILSL_Api)m_ScriptEngine.GetApi(m_item.ItemID, "LSL"); } // @@ -343,22 +343,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api return; } - TaskInventoryItem ti = m_host.Inventory.GetInventoryItem(m_itemID); - if (ti == null) - { - OSSLError( - String.Format("{0} permission error. Can't find script in prim inventory.", - function)); - } - - UUID ownerID = ti.OwnerID; + UUID ownerID = m_item.OwnerID; //OSSL only may be used if object is in the same group as the parcel if (m_FunctionPerms[function].AllowedOwnerClasses.Contains("PARCEL_GROUP_MEMBER")) { ILandObject land = World.LandChannel.GetLandObject(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y); - if (land.LandData.GroupID == ti.GroupID && land.LandData.GroupID != UUID.Zero) + if (land.LandData.GroupID == m_item.GroupID && land.LandData.GroupID != UUID.Zero) { return; } @@ -394,13 +386,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api } } - if (!m_FunctionPerms[function].AllowedCreators.Contains(ti.CreatorID)) + if (!m_FunctionPerms[function].AllowedCreators.Contains(m_item.CreatorID)) OSSLError( String.Format("{0} permission denied. Script creator is not in the list of users allowed to execute this function and prim owner also has no permission.", function)); - if (ti.CreatorID != ownerID) + + if (m_item.CreatorID != ownerID) { - if ((ti.CurrentPermissions & (uint)PermissionMask.Modify) != 0) + if ((m_item.CurrentPermissions & (uint)PermissionMask.Modify) != 0) OSSLError( String.Format("{0} permission denied. Script permissions error.", function)); @@ -1183,7 +1176,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api CheckThreatLevel(ThreatLevel.High, "osSetStateEvents"); m_host.AddScriptLPS(1); - m_host.SetScriptEvents(m_itemID, events); + m_host.SetScriptEvents(m_item.ItemID, events); } public void osSetRegionWaterHeight(double height) diff --git a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs index 2c8af81d5e..dd4739346c 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs @@ -232,7 +232,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance foreach (string api in am.GetApis()) { m_Apis[api] = am.CreateApi(api); - m_Apis[api].Initialize(engine, part, LocalID, itemID); + m_Apis[api].Initialize(engine, part, LocalID, ScriptTask); } try diff --git a/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiInventoryTests.cs b/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiInventoryTests.cs index 49266e91ea..f480e1d9db 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiInventoryTests.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiInventoryTests.cs @@ -88,10 +88,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests // Create an object embedded inside the first UUID itemId = TestHelpers.ParseTail(0x20); - TaskInventoryHelpers.AddSceneObject(m_scene, so1.RootPart, inventoryItemName, itemId, userId); + TaskInventoryItem item + = TaskInventoryHelpers.AddSceneObject(m_scene, so1.RootPart, inventoryItemName, itemId, userId); LSL_Api api = new LSL_Api(); - api.Initialize(m_engine, so1.RootPart, so1.RootPart.LocalId, so1.RootPart.UUID); + api.Initialize(m_engine, so1.RootPart, so1.RootPart.LocalId, null); // Create a second object SceneObjectGroup so2 = SceneHelpers.CreateSceneObject(1, userId, "so2", 0x100); @@ -124,7 +125,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests SceneObjectGroup so1 = SceneHelpers.CreateSceneObject(1, user1Id, "so1", 0x10); m_scene.AddSceneObject(so1); LSL_Api api = new LSL_Api(); - api.Initialize(m_engine, so1.RootPart, so1.RootPart.LocalId, so1.RootPart.UUID); + api.Initialize(m_engine, so1.RootPart, so1.RootPart.LocalId, null); // Create an object embedded inside the first UUID itemId = TestHelpers.ParseTail(0x20); @@ -134,7 +135,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests SceneObjectGroup so2 = SceneHelpers.CreateSceneObject(1, user2Id, "so2", 0x100); m_scene.AddSceneObject(so2); LSL_Api api2 = new LSL_Api(); - api2.Initialize(m_engine, so2.RootPart, so2.RootPart.LocalId, so2.RootPart.UUID); + api2.Initialize(m_engine, so2.RootPart, so2.RootPart.LocalId, null); // *** Firstly, we test where llAllowInventoryDrop() has not been called. *** api.llGiveInventory(so2.UUID.ToString(), inventoryItemName); diff --git a/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiTest.cs b/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiTest.cs index 92a63bf497..bba6c56491 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiTest.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiTest.cs @@ -66,8 +66,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests engine.AddRegion(scene); m_lslApi = new LSL_Api(); - m_lslApi.Initialize(engine, part, part.LocalId, part.UUID); - + m_lslApi.Initialize(engine, part, part.LocalId, null); } [Test] diff --git a/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiAppearanceTest.cs b/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiAppearanceTest.cs index c51227b77c..dff8f6e1ee 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiAppearanceTest.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiAppearanceTest.cs @@ -95,7 +95,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests m_scene.AddSceneObject(so); OSSL_Api osslApi = new OSSL_Api(); - osslApi.Initialize(m_engine, part, part.LocalId, part.UUID); + osslApi.Initialize(m_engine, part, part.LocalId, null); string notecardName = "appearanceNc"; osslApi.osOwnerSaveAppearance(notecardName); @@ -130,7 +130,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests m_scene.AddSceneObject(so); OSSL_Api osslApi = new OSSL_Api(); - osslApi.Initialize(m_engine, part, part.LocalId, part.UUID); + osslApi.Initialize(m_engine, part, part.LocalId, null); string notecardName = "appearanceNc"; osslApi.osOwnerSaveAppearance(notecardName); @@ -161,7 +161,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests m_scene.AddSceneObject(so); OSSL_Api osslApi = new OSSL_Api(); - osslApi.Initialize(m_engine, part, part.LocalId, part.UUID); + osslApi.Initialize(m_engine, part, part.LocalId, null); string notecardName = "appearanceNc"; @@ -202,7 +202,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests m_scene.AddSceneObject(so); OSSL_Api osslApi = new OSSL_Api(); - osslApi.Initialize(m_engine, part, part.LocalId, part.UUID); + osslApi.Initialize(m_engine, part, part.LocalId, null); string notecardName = "appearanceNc"; diff --git a/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiNpcTests.cs b/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiNpcTests.cs index 9c36108da3..80ac52c3ec 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiNpcTests.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiNpcTests.cs @@ -104,10 +104,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests m_scene.AddSceneObject(otherSo); OSSL_Api osslApi = new OSSL_Api(); - osslApi.Initialize(m_engine, part, part.LocalId, part.UUID); + osslApi.Initialize(m_engine, part, part.LocalId, null); OSSL_Api otherOsslApi = new OSSL_Api(); - otherOsslApi.Initialize(m_engine, otherPart, otherPart.LocalId, otherPart.UUID); + otherOsslApi.Initialize(m_engine, otherPart, otherPart.LocalId, null); string notecardName = "appearanceNc"; osslApi.osOwnerSaveAppearance(notecardName); @@ -151,7 +151,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests m_scene.AddSceneObject(so); OSSL_Api osslApi = new OSSL_Api(); - osslApi.Initialize(m_engine, part, part.LocalId, part.UUID); + osslApi.Initialize(m_engine, part, part.LocalId, null); string notecardName = "appearanceNc"; osslApi.osOwnerSaveAppearance(notecardName); From 6406d5a5b9c1c4ef261254e7d4446603b496d1fd Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Tue, 8 May 2012 23:20:27 +0100 Subject: [PATCH 178/547] refactor: Eliminate local id parameter from api initialize. This is always available from m_host.LocalId --- .../ScriptEngine/Interfaces/IScriptApi.cs | 3 +- .../Shared/Api/Implementation/LSL_Api.cs | 40 +++++++++---------- .../Shared/Api/Implementation/LS_Api.cs | 4 +- .../Shared/Api/Implementation/MOD_Api.cs | 4 +- .../Shared/Api/Implementation/OSSL_Api.cs | 4 +- .../Shared/Instance/ScriptInstance.cs | 2 +- .../Shared/Tests/LSL_ApiInventoryTests.cs | 9 ++--- .../ScriptEngine/Shared/Tests/LSL_ApiTest.cs | 2 +- .../Shared/Tests/OSSL_ApiAppearanceTest.cs | 8 ++-- .../Shared/Tests/OSSL_ApiNpcTests.cs | 6 +-- 10 files changed, 36 insertions(+), 46 deletions(-) diff --git a/OpenSim/Region/ScriptEngine/Interfaces/IScriptApi.cs b/OpenSim/Region/ScriptEngine/Interfaces/IScriptApi.cs index cced52260f..2027ca6491 100644 --- a/OpenSim/Region/ScriptEngine/Interfaces/IScriptApi.cs +++ b/OpenSim/Region/ScriptEngine/Interfaces/IScriptApi.cs @@ -42,8 +42,7 @@ namespace OpenSim.Region.ScriptEngine.Interfaces /// proper runtime assembly at load time. /// /param> /// - /// /// - void Initialize(IScriptEngine engine, SceneObjectPart part, uint localID, TaskInventoryItem item); + void Initialize(IScriptEngine engine, SceneObjectPart part, TaskInventoryItem item); } } \ No newline at end of file diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index e8e4dab02a..afd943b481 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -84,7 +84,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); protected IScriptEngine m_ScriptEngine; protected SceneObjectPart m_host; - protected uint m_localID; /// /// The item that hosts this script @@ -108,11 +107,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api protected Dictionary m_userInfoCache = new Dictionary(); - public void Initialize(IScriptEngine ScriptEngine, SceneObjectPart host, uint localID, TaskInventoryItem item) + public void Initialize(IScriptEngine ScriptEngine, SceneObjectPart host, TaskInventoryItem item) { m_ScriptEngine = ScriptEngine; m_host = host; - m_localID = localID; m_item = item; m_ScriptDelayFactor = @@ -843,7 +841,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api UUID.TryParse(ID, out keyID); IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface(); if (wComm != null) - return wComm.Listen(m_localID, m_item.ItemID, m_host.UUID, channelID, name, keyID, msg); + return wComm.Listen(m_host.LocalId, m_item.ItemID, m_host.UUID, channelID, name, keyID, msg); else return -1; } @@ -870,7 +868,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api UUID keyID = UUID.Zero; UUID.TryParse(id, out keyID); - AsyncCommands.SensorRepeatPlugin.SenseOnce(m_localID, m_item.ItemID, name, keyID, type, range, arc, m_host); + AsyncCommands.SensorRepeatPlugin.SenseOnce(m_host.LocalId, m_item.ItemID, name, keyID, type, range, arc, m_host); } public void llSensorRepeat(string name, string id, int type, double range, double arc, double rate) @@ -879,13 +877,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api UUID keyID = UUID.Zero; UUID.TryParse(id, out keyID); - AsyncCommands.SensorRepeatPlugin.SetSenseRepeatEvent(m_localID, m_item.ItemID, name, keyID, type, range, arc, rate, m_host); + AsyncCommands.SensorRepeatPlugin.SetSenseRepeatEvent(m_host.LocalId, m_item.ItemID, name, keyID, type, range, arc, rate, m_host); } public void llSensorRemove() { m_host.AddScriptLPS(1); - AsyncCommands.SensorRepeatPlugin.UnSetSenseRepeaterEvents(m_localID, m_item.ItemID); + AsyncCommands.SensorRepeatPlugin.UnSetSenseRepeaterEvents(m_host.LocalId, m_item.ItemID); } public string resolveName(UUID objecUUID) @@ -2874,7 +2872,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api sec = m_MinTimerInterval; m_host.AddScriptLPS(1); // Setting timer repeat - AsyncCommands.TimerPlugin.SetTimerEvent(m_localID, m_item.ItemID, sec); + AsyncCommands.TimerPlugin.SetTimerEvent(m_host.LocalId, m_item.ItemID, sec); } public virtual void llSleep(double sec) @@ -2937,7 +2935,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api { if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) != 0) { - presence.RegisterControlEventsToScript(controls, accept, pass_on, m_localID, m_item.ItemID); + presence.RegisterControlEventsToScript(controls, accept, pass_on, m_host.LocalId, m_item.ItemID); } } } @@ -2958,7 +2956,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) != 0) { // Unregister controls from Presence - presence.UnRegisterControlEventsToScript(m_localID, m_item.ItemID); + presence.UnRegisterControlEventsToScript(m_host.LocalId, m_item.ItemID); // Remove Take Control permission. m_item.PermsMask &= ~ScriptBaseClass.PERMISSION_TAKE_CONTROLS; } @@ -4089,7 +4087,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api UUID rq = UUID.Random(); UUID tid = AsyncCommands. - DataserverPlugin.RegisterRequest(m_localID, + DataserverPlugin.RegisterRequest(m_host.LocalId, m_item.ItemID, rq.ToString()); AsyncCommands. @@ -4110,7 +4108,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api if (item.Type == 3 && item.Name == name) { UUID tid = AsyncCommands. - DataserverPlugin.RegisterRequest(m_localID, + DataserverPlugin.RegisterRequest(m_host.LocalId, m_item.ItemID, item.AssetID.ToString()); Vector3 region = new Vector3( @@ -6564,7 +6562,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api IXMLRPC xmlrpcMod = m_ScriptEngine.World.RequestModuleInterface(); if (xmlrpcMod.IsEnabled()) { - UUID channelID = xmlrpcMod.OpenXMLRPCChannel(m_localID, m_item.ItemID, UUID.Zero); + UUID channelID = xmlrpcMod.OpenXMLRPCChannel(m_host.LocalId, m_item.ItemID, UUID.Zero); IXmlRpcRouter xmlRpcRouter = m_ScriptEngine.World.RequestModuleInterface(); if (xmlRpcRouter != null) { @@ -6594,7 +6592,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api m_host.AddScriptLPS(1); IXMLRPC xmlrpcMod = m_ScriptEngine.World.RequestModuleInterface(); ScriptSleep(3000); - return (xmlrpcMod.SendRemoteData(m_localID, m_item.ItemID, channel, dest, idata, sdata)).ToString(); + return (xmlrpcMod.SendRemoteData(m_host.LocalId, m_item.ItemID, channel, dest, idata, sdata)).ToString(); } public void llRemoteDataReply(string channel, string message_id, string sdata, int idata) @@ -9083,7 +9081,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api UUID rq = UUID.Random(); UUID tid = AsyncCommands. - DataserverPlugin.RegisterRequest(m_localID, m_item.ItemID, rq.ToString()); + DataserverPlugin.RegisterRequest(m_host.LocalId, m_item.ItemID, rq.ToString()); AsyncCommands. DataserverPlugin.DataserverReply(rq.ToString(), reply); @@ -9982,8 +9980,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api } } - UUID reqID = httpScriptMod. - StartHttpRequest(m_localID, m_item.ItemID, url, param, httpHeaders, body); + UUID reqID + = httpScriptMod.StartHttpRequest(m_host.LocalId, m_item.ItemID, url, param, httpHeaders, body); if (reqID != UUID.Zero) return reqID.ToString(); @@ -10413,7 +10411,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api } // was: UUID tid = tid = AsyncCommands. - UUID tid = AsyncCommands.DataserverPlugin.RegisterRequest(m_localID, m_item.ItemID, assetID.ToString()); + UUID tid = AsyncCommands.DataserverPlugin.RegisterRequest(m_host.LocalId, m_item.ItemID, assetID.ToString()); if (NotecardCache.IsCached(assetID)) { @@ -10475,7 +10473,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api } // was: UUID tid = tid = AsyncCommands. - UUID tid = AsyncCommands.DataserverPlugin.RegisterRequest(m_localID, m_item.ItemID, assetID.ToString()); + UUID tid = AsyncCommands.DataserverPlugin.RegisterRequest(m_host.LocalId, m_item.ItemID, assetID.ToString()); if (NotecardCache.IsCached(assetID)) { @@ -10561,7 +10559,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api { UUID rq = UUID.Random(); - AsyncCommands.DataserverPlugin.RegisterRequest(m_localID, m_item.ItemID, rq.ToString()); + AsyncCommands.DataserverPlugin.RegisterRequest(m_host.LocalId, m_item.ItemID, rq.ToString()); AsyncCommands.DataserverPlugin.DataserverReply(rq.ToString(), Name2Username(llKey2Name(id))); @@ -10577,7 +10575,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api { UUID rq = UUID.Random(); - AsyncCommands.DataserverPlugin.RegisterRequest(m_localID, m_item.ItemID, rq.ToString()); + AsyncCommands.DataserverPlugin.RegisterRequest(m_host.LocalId, m_item.ItemID, rq.ToString()); AsyncCommands.DataserverPlugin.DataserverReply(rq.ToString(), llKey2Name(id)); diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LS_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LS_Api.cs index cd47d96e99..795de802bb 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LS_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LS_Api.cs @@ -58,15 +58,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api { internal IScriptEngine m_ScriptEngine; internal SceneObjectPart m_host; - internal uint m_localID; internal bool m_LSFunctionsEnabled = false; internal IScriptModuleComms m_comms = null; - public void Initialize(IScriptEngine ScriptEngine, SceneObjectPart host, uint localID, TaskInventoryItem item) + public void Initialize(IScriptEngine ScriptEngine, SceneObjectPart host, TaskInventoryItem item) { m_ScriptEngine = ScriptEngine; m_host = host; - m_localID = localID; if (m_ScriptEngine.Config.GetBoolean("AllowLightShareFunctions", false)) m_LSFunctionsEnabled = true; diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/MOD_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/MOD_Api.cs index a578b50cf1..4bd3dffd30 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/MOD_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/MOD_Api.cs @@ -57,16 +57,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api { internal IScriptEngine m_ScriptEngine; internal SceneObjectPart m_host; - internal uint m_localID; internal TaskInventoryItem m_item; internal bool m_MODFunctionsEnabled = false; internal IScriptModuleComms m_comms = null; - public void Initialize(IScriptEngine ScriptEngine, SceneObjectPart host, uint localID, TaskInventoryItem item) + public void Initialize(IScriptEngine ScriptEngine, SceneObjectPart host, TaskInventoryItem item) { m_ScriptEngine = ScriptEngine; m_host = host; - m_localID = localID; m_item = item; if (m_ScriptEngine.Config.GetBoolean("AllowMODFunctions", false)) diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs index 9b2022a1c2..ad1a3585ca 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs @@ -133,7 +133,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api internal IScriptEngine m_ScriptEngine; internal ILSL_Api m_LSL_Api = null; // get a reference to the LSL API so we can call methods housed there internal SceneObjectPart m_host; - internal uint m_localID; internal TaskInventoryItem m_item; internal bool m_OSFunctionsEnabled = false; internal ThreatLevel m_MaxThreatLevel = ThreatLevel.VeryLow; @@ -141,11 +140,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api internal float m_ScriptDistanceFactor = 1.0f; internal Dictionary m_FunctionPerms = new Dictionary(); - public void Initialize(IScriptEngine ScriptEngine, SceneObjectPart host, uint localID, TaskInventoryItem item) + public void Initialize(IScriptEngine ScriptEngine, SceneObjectPart host, TaskInventoryItem item) { m_ScriptEngine = ScriptEngine; m_host = host; - m_localID = localID; m_item = item; if (m_ScriptEngine.Config.GetBoolean("AllowOSFunctions", false)) diff --git a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs index dd4739346c..329e36131b 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs @@ -232,7 +232,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance foreach (string api in am.GetApis()) { m_Apis[api] = am.CreateApi(api); - m_Apis[api].Initialize(engine, part, LocalID, ScriptTask); + m_Apis[api].Initialize(engine, part, ScriptTask); } try diff --git a/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiInventoryTests.cs b/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiInventoryTests.cs index f480e1d9db..c73e22ffdb 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiInventoryTests.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiInventoryTests.cs @@ -88,11 +88,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests // Create an object embedded inside the first UUID itemId = TestHelpers.ParseTail(0x20); - TaskInventoryItem item - = TaskInventoryHelpers.AddSceneObject(m_scene, so1.RootPart, inventoryItemName, itemId, userId); + TaskInventoryHelpers.AddSceneObject(m_scene, so1.RootPart, inventoryItemName, itemId, userId); LSL_Api api = new LSL_Api(); - api.Initialize(m_engine, so1.RootPart, so1.RootPart.LocalId, null); + api.Initialize(m_engine, so1.RootPart, null); // Create a second object SceneObjectGroup so2 = SceneHelpers.CreateSceneObject(1, userId, "so2", 0x100); @@ -125,7 +124,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests SceneObjectGroup so1 = SceneHelpers.CreateSceneObject(1, user1Id, "so1", 0x10); m_scene.AddSceneObject(so1); LSL_Api api = new LSL_Api(); - api.Initialize(m_engine, so1.RootPart, so1.RootPart.LocalId, null); + api.Initialize(m_engine, so1.RootPart, null); // Create an object embedded inside the first UUID itemId = TestHelpers.ParseTail(0x20); @@ -135,7 +134,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests SceneObjectGroup so2 = SceneHelpers.CreateSceneObject(1, user2Id, "so2", 0x100); m_scene.AddSceneObject(so2); LSL_Api api2 = new LSL_Api(); - api2.Initialize(m_engine, so2.RootPart, so2.RootPart.LocalId, null); + api2.Initialize(m_engine, so2.RootPart, null); // *** Firstly, we test where llAllowInventoryDrop() has not been called. *** api.llGiveInventory(so2.UUID.ToString(), inventoryItemName); diff --git a/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiTest.cs b/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiTest.cs index bba6c56491..f96a156a6e 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiTest.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiTest.cs @@ -66,7 +66,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests engine.AddRegion(scene); m_lslApi = new LSL_Api(); - m_lslApi.Initialize(engine, part, part.LocalId, null); + m_lslApi.Initialize(engine, part, null); } [Test] diff --git a/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiAppearanceTest.cs b/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiAppearanceTest.cs index dff8f6e1ee..3965734435 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiAppearanceTest.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiAppearanceTest.cs @@ -95,7 +95,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests m_scene.AddSceneObject(so); OSSL_Api osslApi = new OSSL_Api(); - osslApi.Initialize(m_engine, part, part.LocalId, null); + osslApi.Initialize(m_engine, part, null); string notecardName = "appearanceNc"; osslApi.osOwnerSaveAppearance(notecardName); @@ -130,7 +130,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests m_scene.AddSceneObject(so); OSSL_Api osslApi = new OSSL_Api(); - osslApi.Initialize(m_engine, part, part.LocalId, null); + osslApi.Initialize(m_engine, part, null); string notecardName = "appearanceNc"; osslApi.osOwnerSaveAppearance(notecardName); @@ -161,7 +161,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests m_scene.AddSceneObject(so); OSSL_Api osslApi = new OSSL_Api(); - osslApi.Initialize(m_engine, part, part.LocalId, null); + osslApi.Initialize(m_engine, part, null); string notecardName = "appearanceNc"; @@ -202,7 +202,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests m_scene.AddSceneObject(so); OSSL_Api osslApi = new OSSL_Api(); - osslApi.Initialize(m_engine, part, part.LocalId, null); + osslApi.Initialize(m_engine, part, null); string notecardName = "appearanceNc"; diff --git a/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiNpcTests.cs b/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiNpcTests.cs index 80ac52c3ec..0ccd8897c3 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiNpcTests.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiNpcTests.cs @@ -104,10 +104,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests m_scene.AddSceneObject(otherSo); OSSL_Api osslApi = new OSSL_Api(); - osslApi.Initialize(m_engine, part, part.LocalId, null); + osslApi.Initialize(m_engine, part, null); OSSL_Api otherOsslApi = new OSSL_Api(); - otherOsslApi.Initialize(m_engine, otherPart, otherPart.LocalId, null); + otherOsslApi.Initialize(m_engine, otherPart, null); string notecardName = "appearanceNc"; osslApi.osOwnerSaveAppearance(notecardName); @@ -151,7 +151,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests m_scene.AddSceneObject(so); OSSL_Api osslApi = new OSSL_Api(); - osslApi.Initialize(m_engine, part, part.LocalId, null); + osslApi.Initialize(m_engine, part, null); string notecardName = "appearanceNc"; osslApi.osOwnerSaveAppearance(notecardName); From c0658a102ebbff6ea8ef1ef510d30da890aacded Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Tue, 8 May 2012 23:29:51 +0100 Subject: [PATCH 179/547] Add automated TestllCreateLink() --- .../Shared/Tests/LSL_ApiLinkingTests.cs | 112 ++++++++++++++++++ 1 file changed, 112 insertions(+) create mode 100644 OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiLinkingTests.cs diff --git a/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiLinkingTests.cs b/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiLinkingTests.cs new file mode 100644 index 0000000000..44209157f8 --- /dev/null +++ b/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiLinkingTests.cs @@ -0,0 +1,112 @@ +/* + * Copyright (c) Contributors, http://opensimulator.org/ + * See CONTRIBUTORS.TXT for a full list of copyright holders. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the OpenSimulator Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using System; +using System.Collections.Generic; +using System.Reflection; +using System.Text; +using log4net; +using Nini.Config; +using NUnit.Framework; +using OpenMetaverse; +using OpenMetaverse.Assets; +using OpenMetaverse.StructuredData; +using OpenSim.Framework; +using OpenSim.Region.CoreModules.Avatar.AvatarFactory; +using OpenSim.Region.OptionalModules.World.NPC; +using OpenSim.Region.Framework.Scenes; +using OpenSim.Region.ScriptEngine.Shared; +using OpenSim.Region.ScriptEngine.Shared.Api; +using OpenSim.Region.ScriptEngine.Shared.ScriptBase; +using OpenSim.Services.Interfaces; +using OpenSim.Tests.Common; +using OpenSim.Tests.Common.Mock; + +namespace OpenSim.Region.ScriptEngine.Shared.Tests +{ + /// + /// Tests for linking functions in LSL + /// + /// + /// This relates to LSL. Actual linking functionality should be tested in the main + /// OpenSim.Region.Framework.Scenes.Tests.SceneObjectLinkingTests. + /// + [TestFixture] + public class LSL_ApiLinkingTests + { + protected Scene m_scene; + protected XEngine.XEngine m_engine; + + [SetUp] + public void SetUp() + { + IConfigSource initConfigSource = new IniConfigSource(); + IConfig config = initConfigSource.AddConfig("XEngine"); + config.Set("Enabled", "true"); + + m_scene = new SceneHelpers().SetupScene(); + SceneHelpers.SetupSceneModules(m_scene, initConfigSource); + + m_engine = new XEngine.XEngine(); + m_engine.Initialise(initConfigSource); + m_engine.AddRegion(m_scene); + } + + [Test] + public void TestllCreateLink() + { + TestHelpers.InMethod(); + + UUID ownerId = TestHelpers.ParseTail(0x1); + + SceneObjectGroup grp1 = SceneHelpers.CreateSceneObject(2, ownerId, "grp1-", 0x10); + grp1.AbsolutePosition = new Vector3(10, 10, 10); + m_scene.AddSceneObject(grp1); + + // FIXME: This should really be a script item (with accompanying script) + TaskInventoryItem grp1Item + = TaskInventoryHelpers.AddNotecard(m_scene, grp1.RootPart); + grp1Item.PermsMask |= ScriptBaseClass.PERMISSION_CHANGE_LINKS; + + SceneObjectGroup grp2 = SceneHelpers.CreateSceneObject(2, ownerId, "grp2-", 0x20); + grp2.AbsolutePosition = new Vector3(20, 20, 20); + + // <180,0,0> + grp2.UpdateGroupRotationR(Quaternion.CreateFromEulers(180 * Utils.DEG_TO_RAD, 0, 0)); + + m_scene.AddSceneObject(grp2); + + LSL_Api apiGrp1 = new LSL_Api(); + apiGrp1.Initialize(m_engine, grp1.RootPart, grp1Item); + + apiGrp1.llCreateLink(grp2.UUID.ToString(), ScriptBaseClass.TRUE); + + Assert.That(grp1.Parts.Length, Is.EqualTo(4)); + Assert.That(grp2.IsDeleted, Is.True); + } + } +} \ No newline at end of file From ef279c5a62d15d29ca94c95418a13d52f2a68244 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Tue, 8 May 2012 23:36:23 +0100 Subject: [PATCH 180/547] Add automated TestllBreakLink() --- .../Shared/Tests/LSL_ApiLinkingTests.cs | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiLinkingTests.cs b/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiLinkingTests.cs index 44209157f8..bc3b790362 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiLinkingTests.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiLinkingTests.cs @@ -108,5 +108,32 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests Assert.That(grp1.Parts.Length, Is.EqualTo(4)); Assert.That(grp2.IsDeleted, Is.True); } + + [Test] + public void TestllBreakLink() + { + TestHelpers.InMethod(); + + UUID ownerId = TestHelpers.ParseTail(0x1); + + SceneObjectGroup grp1 = SceneHelpers.CreateSceneObject(2, ownerId, "grp1-", 0x10); + grp1.AbsolutePosition = new Vector3(10, 10, 10); + m_scene.AddSceneObject(grp1); + + // FIXME: This should really be a script item (with accompanying script) + TaskInventoryItem grp1Item + = TaskInventoryHelpers.AddNotecard(m_scene, grp1.RootPart); + grp1Item.PermsMask |= ScriptBaseClass.PERMISSION_CHANGE_LINKS; + + LSL_Api apiGrp1 = new LSL_Api(); + apiGrp1.Initialize(m_engine, grp1.RootPart, grp1Item); + + apiGrp1.llBreakLink(2); + + Assert.That(grp1.Parts.Length, Is.EqualTo(1)); + + SceneObjectGroup grp2 = m_scene.GetSceneObjectGroup("grp1-Part1"); + Assert.That(grp2, Is.Not.Null); + } } } \ No newline at end of file From c21c9e13ef09607fa6f918f27bf087247a70d5a3 Mon Sep 17 00:00:00 2001 From: Talun Date: Mon, 7 May 2012 21:44:17 +0100 Subject: [PATCH 181/547] Mantis 1456 same region teleport of a sitting avatar. Region to region was fixed some time ago in EntityTransferModule. This applies the same fix for same region teleports. --- OpenSim/Region/Framework/Scenes/ScenePresence.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index 7e49a5e2cc..769824efa0 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs @@ -996,6 +996,8 @@ namespace OpenSim.Region.Framework.Scenes public void TeleportWithMomentum(Vector3 pos, Vector3? v) { + if (ParentID != (uint)0) + StandUp(); bool isFlying = Flying; Vector3 vel = Velocity; RemoveFromPhysicalScene(); From 20952c75c526180a0286fb9634b94ac1354a2770 Mon Sep 17 00:00:00 2001 From: Dan Lake Date: Tue, 8 May 2012 16:05:34 -0700 Subject: [PATCH 182/547] Trigger event when scene presences are updated --- .../Region/Framework/Scenes/EventManager.cs | 24 +++++++++++++++++++ .../Region/Framework/Scenes/ScenePresence.cs | 10 ++++++++ 2 files changed, 34 insertions(+) diff --git a/OpenSim/Region/Framework/Scenes/EventManager.cs b/OpenSim/Region/Framework/Scenes/EventManager.cs index b3debb0296..ace83135d8 100644 --- a/OpenSim/Region/Framework/Scenes/EventManager.cs +++ b/OpenSim/Region/Framework/Scenes/EventManager.cs @@ -480,6 +480,9 @@ namespace OpenSim.Region.Framework.Scenes public delegate void SceneObjectPartUpdated(SceneObjectPart sop); public event SceneObjectPartUpdated OnSceneObjectPartUpdated; + public delegate void ScenePresenceUpdated(ScenePresence sp); + public event ScenePresenceUpdated OnScenePresenceUpdated; + public delegate void RegionUp(GridRegion region); public event RegionUp OnRegionUp; @@ -2343,6 +2346,27 @@ namespace OpenSim.Region.Framework.Scenes } } + public void TriggerScenePresenceUpdated(ScenePresence sp) + { + ScenePresenceUpdated handler = OnScenePresenceUpdated; + if (handler != null) + { + foreach (ScenePresenceUpdated d in handler.GetInvocationList()) + { + try + { + d(sp); + } + catch (Exception e) + { + m_log.ErrorFormat( + "[EVENT MANAGER]: Delegate for TriggerScenePresenceUpdated failed - continuing. {0} {1}", + e.Message, e.StackTrace); + } + } + } + } + public void TriggerOnParcelPropertiesUpdateRequest(LandUpdateArgs args, int local_id, IClientAPI remote_client) { diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index 7e49a5e2cc..c552447836 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs @@ -76,6 +76,11 @@ namespace OpenSim.Region.Framework.Scenes // { // m_log.Debug("[SCENE PRESENCE] Destructor called"); // } + private void TriggerScenePresenceUpdated() + { + if (m_scene != null) + m_scene.EventManager.TriggerScenePresenceUpdated(this); + } private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); @@ -489,6 +494,7 @@ namespace OpenSim.Region.Framework.Scenes //m_log.DebugFormat( // "[ENTITY BASE]: In {0} set AbsolutePosition of {1} to {2}", // Scene.RegionInfo.RegionName, Name, m_pos); + TriggerScenePresenceUpdated(); } } @@ -508,6 +514,7 @@ namespace OpenSim.Region.Framework.Scenes return; m_pos = value; + TriggerScenePresenceUpdated(); } } @@ -1523,6 +1530,7 @@ namespace OpenSim.Region.Framework.Scenes } m_scene.EventManager.TriggerOnClientMovement(this); + TriggerScenePresenceUpdated(); } /// @@ -2419,6 +2427,7 @@ namespace OpenSim.Region.Framework.Scenes m_scene.ForEachClient(SendTerseUpdateToClient); } + TriggerScenePresenceUpdated(); } public void SendCoarseLocations(List coarseLocations, List avatarUUIDs) @@ -3195,6 +3204,7 @@ namespace OpenSim.Region.Framework.Scenes Velocity = force; m_forceToApply = null; + TriggerScenePresenceUpdated(); } } From e5dbb652d5118d193de794fb948252195594b344 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Wed, 9 May 2012 00:11:10 +0100 Subject: [PATCH 183/547] Remove physics actor related race conditions in SetVehicleFlags() and SetPhysicsAxisRotation() sop.PhysActor can currently become null at any time. --- .../Region/Framework/Scenes/SceneObjectPart.cs | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index 4bec2d4157..f911ef87a7 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs @@ -3321,10 +3321,10 @@ namespace OpenSim.Region.Framework.Scenes public void SetVehicleFlags(int param, bool remove) { - if (PhysActor != null) - { - PhysActor.VehicleFlags(param, remove); - } + PhysicsActor pa = PhysActor; + + if (pa != null) + pa.VehicleFlags(param, remove); } public void SetGroup(UUID groupID, IClientAPI client) @@ -3356,10 +3356,12 @@ namespace OpenSim.Region.Framework.Scenes public void SetPhysicsAxisRotation() { - if (PhysActor != null) + PhysicsActor pa = PhysActor; + + if (pa != null) { - PhysActor.LockAngularMotion(RotationAxis); - ParentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(PhysActor); + pa.LockAngularMotion(RotationAxis); + ParentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(pa); } } From 61e99bcdcba5480aa8a2a8b8e2f2b0a66c08e6b4 Mon Sep 17 00:00:00 2001 From: Talun Date: Tue, 8 May 2012 15:52:25 +0100 Subject: [PATCH 184/547] Mantis 6015 new LSL function llGetAgentList. Details in the lsl wiki --- .../Shared/Api/Implementation/LSL_Api.cs | 85 +++++++++++++++++++ .../Shared/Api/Interface/ILSL_Api.cs | 1 + .../Shared/Api/Runtime/LSL_Constants.cs | 5 ++ .../Shared/Api/Runtime/LSL_Stub.cs | 5 ++ 4 files changed, 96 insertions(+) diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index afd943b481..5b5cab860c 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -5529,6 +5529,91 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api m_host.AddScriptLPS(1); return "en-us"; } + /// + /// http://wiki.secondlife.com/wiki/LlGetAgentList + /// The list of options is currently not used in SL + /// scope is one of:- + /// AGENT_LIST_REGION - all in the region + /// AGENT_LIST_PARCEL - all in the same parcel as the scripted object + /// AGENT_LIST_PARCEL_OWNER - all in any parcel owned by the owner of the + /// current parcel. + /// + public LSL_List llGetAgentList(LSL_Integer scope, LSL_List options) + { + m_host.AddScriptLPS(1); + + // the constants are 1, 2 and 4 so bits are being set, but you + // get an error "INVALID_SCOPE" if it is anything but 1, 2 and 4 + bool regionWide = scope == ScriptBaseClass.AGENT_LIST_REGION; + bool parcelOwned = scope == ScriptBaseClass.AGENT_LIST_PARCEL_OWNER; + bool parcel = scope == ScriptBaseClass.AGENT_LIST_PARCEL; + + LSL_List result = new LSL_List(); + + if (!regionWide && !parcelOwned && !parcel) + { + result.Add("INVALID_SCOPE"); + return result; + } + + ILandObject land; + Vector3 pos; + UUID id = UUID.Zero; + if (parcel || parcelOwned) + { + pos = m_host.ParentGroup.RootPart.GetWorldPosition(); + land = World.LandChannel.GetLandObject(pos.X, pos.Y); + if (land == null) + { + id = UUID.Zero; + } + else + { + if (parcelOwned) + { + id = land.LandData.OwnerID; + } + else + { + id = land.LandData.GlobalID; + } + } + } + List presenceIds = new List(); + + World.ForEachRootScenePresence( + delegate (ScenePresence ssp) + { + // Gods are not listed in SL + if (!ssp.IsDeleted && ssp.GodLevel == 0.0 && !ssp.IsChildAgent) + { + if (!regionWide) + { + pos = ssp.AbsolutePosition; + land = World.LandChannel.GetLandObject(pos.X, pos.Y); + if (land != null) + { + if (parcelOwned && land.LandData.OwnerID == id || + parcel && land.LandData.GlobalID == id) + { + result.Add(ssp.UUID.ToString()); + } + } + } + else + { + result.Add(ssp.UUID.ToString()); + } + } + // Maximum of 100 results + if (result.Length > 99) + { + return; + } + } + ); + return result; + } public void llAdjustSoundVolume(double volume) { diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs index 7a797ac27b..7f5d1feec1 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs @@ -109,6 +109,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces LSL_Vector llGetAccel(); LSL_Integer llGetAgentInfo(string id); LSL_String llGetAgentLanguage(string id); + LSL_List llGetAgentList(LSL_Integer scope, LSL_List options); LSL_Vector llGetAgentSize(string id); LSL_Float llGetAlpha(int face); LSL_Float llGetAndResetTime(); diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs index 2a28542a96..b6c21e6cdd 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs @@ -501,6 +501,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase public const int OBJECT_STREAMING_COST = 15; public const int OBJECT_PHYSICS_COST = 16; + // for llGetAgentList + public const int AGENT_LIST_PARCEL = 1; + public const int AGENT_LIST_PARCEL_OWNER = 2; + public const int AGENT_LIST_REGION = 4; + // Can not be public const? public static readonly vector ZERO_VECTOR = new vector(0.0, 0.0, 0.0); public static readonly rotation ZERO_ROTATION = new rotation(0.0, 0.0, 0.0, 1.0); diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs index 80fa530410..c0bf29ca2d 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs @@ -389,6 +389,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase return m_LSL_Functions.llGetAgentLanguage(id); } + public LSL_List llGetAgentList(LSL_Integer scope, LSL_List options) + { + return m_LSL_Functions.llGetAgentList(scope, options); + } + public LSL_Vector llGetAgentSize(string id) { return m_LSL_Functions.llGetAgentSize(id); From e813f41478eefb50748e9bdc2b825fa8bc25c971 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Wed, 9 May 2012 20:52:54 +0100 Subject: [PATCH 185/547] Escape and unescape xml element names if necessary in ServerUtils.BuildXmlData() and ParseElement() If AvatarService appearance data is retrieved over the network, then ServerUtils was attempting to transfer names such as "Wearable 0:0" directly to xml element names, resulting in an exception. Space is not valid in xml element names. Neither is : in this case since the intention is not to namespace. Using names directly as keys is not a good idea. To get around this problem this patch escapes and unescapes the element names as appropriate. This has no impact on existing xml (since it had to be valid in the first place) but allows AvatarService data to be used over the network. Setting appearance (from simulator to AvatarService) did not suffer this problem since the values are passed in the query string which is already properly escaped. --- OpenSim/Server/Base/ServerUtils.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/OpenSim/Server/Base/ServerUtils.cs b/OpenSim/Server/Base/ServerUtils.cs index 0cc2a4b57f..42c82cf34c 100644 --- a/OpenSim/Server/Base/ServerUtils.cs +++ b/OpenSim/Server/Base/ServerUtils.cs @@ -268,7 +268,7 @@ namespace OpenSim.Server.Base continue; XmlElement elem = parent.OwnerDocument.CreateElement("", - kvp.Key, ""); + XmlConvert.EncodeLocalName(kvp.Key), ""); if (kvp.Value is Dictionary) { @@ -323,11 +323,11 @@ namespace OpenSim.Server.Base XmlNode type = part.Attributes.GetNamedItem("type"); if (type == null || type.Value != "List") { - ret[part.Name] = part.InnerText; + ret[XmlConvert.DecodeName(part.Name)] = part.InnerText; } else { - ret[part.Name] = ParseElement(part); + ret[XmlConvert.DecodeName(part.Name)] = ParseElement(part); } } From 6987aef38dbc4f5c24b6e2cc73601f9a7c5f4431 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Wed, 9 May 2012 23:12:30 +0100 Subject: [PATCH 186/547] Improve logging on the prim inventory script asset request path for future use. This adds name and description of the request handler to http request logging when DebugLevel >= 1 --- .../Framework/Servers/HttpServer/BaseHttpServer.cs | 4 ++-- .../Linden/Caps/BunchOfCaps/BunchOfCaps.cs | 2 +- .../Region/ClientStack/Linden/UDP/LLClientView.cs | 13 ++++++++----- OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | 4 ++++ 4 files changed, 15 insertions(+), 8 deletions(-) diff --git a/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs b/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs index d0463c8121..401dfd3e26 100644 --- a/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs +++ b/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs @@ -447,8 +447,8 @@ namespace OpenSim.Framework.Servers.HttpServer { if (DebugLevel >= 1) m_log.DebugFormat( - "[BASE HTTP SERVER]: Found stream handler for {0} {1}", - request.HttpMethod, request.Url.PathAndQuery); + "[BASE HTTP SERVER]: Found stream handler for {0} {1} {2} {3}", + request.HttpMethod, request.Url.PathAndQuery, requestHandler.Name, requestHandler.Description); // Okay, so this is bad, but should be considered temporary until everything is IStreamHandler. byte[] buffer = null; diff --git a/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs b/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs index 9791885ffa..6c28e78f20 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs @@ -309,7 +309,7 @@ namespace OpenSim.Region.ClientStack.Linden m_HostCapsObj.HttpListener.AddStreamHandler( new BinaryStreamHandler( - "POST", capsBase + uploaderPath, uploader.uploaderCaps, "BunchOfCaps", null)); + "POST", capsBase + uploaderPath, uploader.uploaderCaps, "TaskInventoryScriptUpdater", null)); string protocol = "http://"; diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs index ae5cbfff55..4d6081c447 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs @@ -11955,21 +11955,24 @@ namespace OpenSim.Region.ClientStack.LindenUDP protected void MakeAssetRequest(TransferRequestPacket transferRequest, UUID taskID) { UUID requestID = UUID.Zero; - if (transferRequest.TransferInfo.SourceType == (int)SourceType.Asset) + int sourceType = transferRequest.TransferInfo.SourceType; + + if (sourceType == (int)SourceType.Asset) { requestID = new UUID(transferRequest.TransferInfo.Params, 0); } - else if (transferRequest.TransferInfo.SourceType == (int)SourceType.SimInventoryItem) + else if (sourceType == (int)SourceType.SimInventoryItem) { requestID = new UUID(transferRequest.TransferInfo.Params, 80); } - else if (transferRequest.TransferInfo.SourceType == (int)SourceType.SimEstate) + else if (sourceType == (int)SourceType.SimEstate) { requestID = taskID; } - -// m_log.DebugFormat("[CLIENT]: {0} requesting asset {1}", Name, requestID); +// m_log.DebugFormat( +// "[LLCLIENTVIEW]: Received transfer request for {0} in {1} type {2} by {3}", +// requestID, taskID, (SourceType)sourceType, Name); m_assetService.Get(requestID.ToString(), transferRequest, AssetReceived); } diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs index 816d3b64ce..8a26df1dc2 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs @@ -300,6 +300,10 @@ namespace OpenSim.Region.Framework.Scenes AssetBase asset = CreateAsset(item.Name, item.Description, (sbyte)AssetType.LSLText, data, remoteClient.AgentId); AssetService.Store(asset); +// m_log.DebugFormat( +// "[PRIM INVENTORY]: Stored asset {0} when updating item {1} in prim {2} for {3}", +// asset.ID, item.Name, part.Name, remoteClient.Name); + if (isScriptRunning) { part.Inventory.RemoveScriptInstance(item.ItemID, false); From d8a78374aa11c5460d6e58a6f4110fca61dfded4 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Wed, 9 May 2012 23:25:01 +0100 Subject: [PATCH 187/547] Where necessary, rename OpenSim/Services/Connectors/*.cs files to reflect the actual class names. This is usually because the file name was singular (*Service*) but the class name was plural (*Services*). This is to make configuration easier rather than having to look in the c# code itself to find the slightly different name of the connector. This does not affect existing configuration since the files are being renamed rather than the classes. --- .../Asset/{AssetServiceConnector.cs => AssetServicesConnector.cs} | 0 ...tionServiceConnector.cs => AuthenticationServicesConnector.cs} | 0 ...ationServiceConnector.cs => AuthorizationServicesConnector.cs} | 0 .../{AvatarServiceConnector.cs => AvatarServicesConnector.cs} | 0 .../{FriendsServiceConnector.cs => FriendsServicesConnector.cs} | 0 .../Grid/{GridServiceConnector.cs => GridServicesConnector.cs} | 0 .../{GridUserServiceConnector.cs => GridUserServicesConnector.cs} | 0 ...HGFriendsServiceConnector.cs => HGFriendsServicesConnector.cs} | 0 .../{HeloServiceConnector.cs => HeloServicesConnector.cs} | 0 .../{XInventoryConnector.cs => XInventoryServicesConnector.cs} | 0 .../Land/{LandServiceConnector.cs => LandServicesConnector.cs} | 0 .../{MapImageServiceConnector.cs => MapImageServicesConnector.cs} | 0 ...NeighbourServiceConnector.cs => NeighbourServicesConnector.cs} | 0 .../{PresenceServiceConnector.cs => PresenceServicesConnector.cs} | 0 ...AccountServiceConnector.cs => UserAccountServicesConnector.cs} | 0 15 files changed, 0 insertions(+), 0 deletions(-) rename OpenSim/Services/Connectors/Asset/{AssetServiceConnector.cs => AssetServicesConnector.cs} (100%) rename OpenSim/Services/Connectors/Authentication/{AuthenticationServiceConnector.cs => AuthenticationServicesConnector.cs} (100%) rename OpenSim/Services/Connectors/Authorization/{AuthorizationServiceConnector.cs => AuthorizationServicesConnector.cs} (100%) rename OpenSim/Services/Connectors/Avatar/{AvatarServiceConnector.cs => AvatarServicesConnector.cs} (100%) rename OpenSim/Services/Connectors/Friends/{FriendsServiceConnector.cs => FriendsServicesConnector.cs} (100%) rename OpenSim/Services/Connectors/Grid/{GridServiceConnector.cs => GridServicesConnector.cs} (100%) rename OpenSim/Services/Connectors/GridUser/{GridUserServiceConnector.cs => GridUserServicesConnector.cs} (100%) rename OpenSim/Services/Connectors/Hypergrid/{HGFriendsServiceConnector.cs => HGFriendsServicesConnector.cs} (100%) rename OpenSim/Services/Connectors/Hypergrid/{HeloServiceConnector.cs => HeloServicesConnector.cs} (100%) rename OpenSim/Services/Connectors/Inventory/{XInventoryConnector.cs => XInventoryServicesConnector.cs} (100%) rename OpenSim/Services/Connectors/Land/{LandServiceConnector.cs => LandServicesConnector.cs} (100%) rename OpenSim/Services/Connectors/MapImage/{MapImageServiceConnector.cs => MapImageServicesConnector.cs} (100%) rename OpenSim/Services/Connectors/Neighbour/{NeighbourServiceConnector.cs => NeighbourServicesConnector.cs} (100%) rename OpenSim/Services/Connectors/Presence/{PresenceServiceConnector.cs => PresenceServicesConnector.cs} (100%) rename OpenSim/Services/Connectors/UserAccounts/{UserAccountServiceConnector.cs => UserAccountServicesConnector.cs} (100%) diff --git a/OpenSim/Services/Connectors/Asset/AssetServiceConnector.cs b/OpenSim/Services/Connectors/Asset/AssetServicesConnector.cs similarity index 100% rename from OpenSim/Services/Connectors/Asset/AssetServiceConnector.cs rename to OpenSim/Services/Connectors/Asset/AssetServicesConnector.cs diff --git a/OpenSim/Services/Connectors/Authentication/AuthenticationServiceConnector.cs b/OpenSim/Services/Connectors/Authentication/AuthenticationServicesConnector.cs similarity index 100% rename from OpenSim/Services/Connectors/Authentication/AuthenticationServiceConnector.cs rename to OpenSim/Services/Connectors/Authentication/AuthenticationServicesConnector.cs diff --git a/OpenSim/Services/Connectors/Authorization/AuthorizationServiceConnector.cs b/OpenSim/Services/Connectors/Authorization/AuthorizationServicesConnector.cs similarity index 100% rename from OpenSim/Services/Connectors/Authorization/AuthorizationServiceConnector.cs rename to OpenSim/Services/Connectors/Authorization/AuthorizationServicesConnector.cs diff --git a/OpenSim/Services/Connectors/Avatar/AvatarServiceConnector.cs b/OpenSim/Services/Connectors/Avatar/AvatarServicesConnector.cs similarity index 100% rename from OpenSim/Services/Connectors/Avatar/AvatarServiceConnector.cs rename to OpenSim/Services/Connectors/Avatar/AvatarServicesConnector.cs diff --git a/OpenSim/Services/Connectors/Friends/FriendsServiceConnector.cs b/OpenSim/Services/Connectors/Friends/FriendsServicesConnector.cs similarity index 100% rename from OpenSim/Services/Connectors/Friends/FriendsServiceConnector.cs rename to OpenSim/Services/Connectors/Friends/FriendsServicesConnector.cs diff --git a/OpenSim/Services/Connectors/Grid/GridServiceConnector.cs b/OpenSim/Services/Connectors/Grid/GridServicesConnector.cs similarity index 100% rename from OpenSim/Services/Connectors/Grid/GridServiceConnector.cs rename to OpenSim/Services/Connectors/Grid/GridServicesConnector.cs diff --git a/OpenSim/Services/Connectors/GridUser/GridUserServiceConnector.cs b/OpenSim/Services/Connectors/GridUser/GridUserServicesConnector.cs similarity index 100% rename from OpenSim/Services/Connectors/GridUser/GridUserServiceConnector.cs rename to OpenSim/Services/Connectors/GridUser/GridUserServicesConnector.cs diff --git a/OpenSim/Services/Connectors/Hypergrid/HGFriendsServiceConnector.cs b/OpenSim/Services/Connectors/Hypergrid/HGFriendsServicesConnector.cs similarity index 100% rename from OpenSim/Services/Connectors/Hypergrid/HGFriendsServiceConnector.cs rename to OpenSim/Services/Connectors/Hypergrid/HGFriendsServicesConnector.cs diff --git a/OpenSim/Services/Connectors/Hypergrid/HeloServiceConnector.cs b/OpenSim/Services/Connectors/Hypergrid/HeloServicesConnector.cs similarity index 100% rename from OpenSim/Services/Connectors/Hypergrid/HeloServiceConnector.cs rename to OpenSim/Services/Connectors/Hypergrid/HeloServicesConnector.cs diff --git a/OpenSim/Services/Connectors/Inventory/XInventoryConnector.cs b/OpenSim/Services/Connectors/Inventory/XInventoryServicesConnector.cs similarity index 100% rename from OpenSim/Services/Connectors/Inventory/XInventoryConnector.cs rename to OpenSim/Services/Connectors/Inventory/XInventoryServicesConnector.cs diff --git a/OpenSim/Services/Connectors/Land/LandServiceConnector.cs b/OpenSim/Services/Connectors/Land/LandServicesConnector.cs similarity index 100% rename from OpenSim/Services/Connectors/Land/LandServiceConnector.cs rename to OpenSim/Services/Connectors/Land/LandServicesConnector.cs diff --git a/OpenSim/Services/Connectors/MapImage/MapImageServiceConnector.cs b/OpenSim/Services/Connectors/MapImage/MapImageServicesConnector.cs similarity index 100% rename from OpenSim/Services/Connectors/MapImage/MapImageServiceConnector.cs rename to OpenSim/Services/Connectors/MapImage/MapImageServicesConnector.cs diff --git a/OpenSim/Services/Connectors/Neighbour/NeighbourServiceConnector.cs b/OpenSim/Services/Connectors/Neighbour/NeighbourServicesConnector.cs similarity index 100% rename from OpenSim/Services/Connectors/Neighbour/NeighbourServiceConnector.cs rename to OpenSim/Services/Connectors/Neighbour/NeighbourServicesConnector.cs diff --git a/OpenSim/Services/Connectors/Presence/PresenceServiceConnector.cs b/OpenSim/Services/Connectors/Presence/PresenceServicesConnector.cs similarity index 100% rename from OpenSim/Services/Connectors/Presence/PresenceServiceConnector.cs rename to OpenSim/Services/Connectors/Presence/PresenceServicesConnector.cs diff --git a/OpenSim/Services/Connectors/UserAccounts/UserAccountServiceConnector.cs b/OpenSim/Services/Connectors/UserAccounts/UserAccountServicesConnector.cs similarity index 100% rename from OpenSim/Services/Connectors/UserAccounts/UserAccountServiceConnector.cs rename to OpenSim/Services/Connectors/UserAccounts/UserAccountServicesConnector.cs From de44734fe9a0b31cd8cb78c0f58e61a35fe2a259 Mon Sep 17 00:00:00 2001 From: Mic Bowman Date: Thu, 10 May 2012 09:08:40 -0700 Subject: [PATCH 188/547] Saving estate state is really slow (relatively) and it gets completely rewritten every time a region starts up. This makes the data write only when the data was not already read from the database. There is a still a major race condition whenever two regions share the same estate data, but at least it won't be triggered on startup. --- .../LoadRegions/LoadRegionsPlugin.cs | 5 +++-- OpenSim/Region/Application/OpenSim.cs | 5 +++-- OpenSim/Region/Application/OpenSimBase.cs | 12 +++++++----- 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/OpenSim/ApplicationPlugins/LoadRegions/LoadRegionsPlugin.cs b/OpenSim/ApplicationPlugins/LoadRegions/LoadRegionsPlugin.cs index 45b8d6f4b9..00657028e4 100644 --- a/OpenSim/ApplicationPlugins/LoadRegions/LoadRegionsPlugin.cs +++ b/OpenSim/ApplicationPlugins/LoadRegions/LoadRegionsPlugin.cs @@ -122,9 +122,10 @@ namespace OpenSim.ApplicationPlugins.LoadRegions Thread.CurrentThread.ManagedThreadId.ToString() + ")"); - m_openSim.PopulateRegionEstateInfo(regionsToLoad[i]); + bool changed = m_openSim.PopulateRegionEstateInfo(regionsToLoad[i]); m_openSim.CreateRegion(regionsToLoad[i], true, out scene); - regionsToLoad[i].EstateSettings.Save(); + if (changed) + regionsToLoad[i].EstateSettings.Save(); if (scene != null) { diff --git a/OpenSim/Region/Application/OpenSim.cs b/OpenSim/Region/Application/OpenSim.cs index 4ec64eeb55..6796f2bd33 100644 --- a/OpenSim/Region/Application/OpenSim.cs +++ b/OpenSim/Region/Application/OpenSim.cs @@ -618,10 +618,11 @@ namespace OpenSim return; } - PopulateRegionEstateInfo(regInfo); + bool changed = PopulateRegionEstateInfo(regInfo); IScene scene; CreateRegion(regInfo, true, out scene); - regInfo.EstateSettings.Save(); + if (changed) + regInfo.EstateSettings.Save(); } /// diff --git a/OpenSim/Region/Application/OpenSimBase.cs b/OpenSim/Region/Application/OpenSimBase.cs index 79259d8b3c..045e8d2f4a 100644 --- a/OpenSim/Region/Application/OpenSimBase.cs +++ b/OpenSim/Region/Application/OpenSimBase.cs @@ -977,13 +977,13 @@ namespace OpenSim /// Load the estate information for the provided RegionInfo object. /// /// - public void PopulateRegionEstateInfo(RegionInfo regInfo) + public bool PopulateRegionEstateInfo(RegionInfo regInfo) { if (EstateDataService != null) regInfo.EstateSettings = EstateDataService.LoadEstateSettings(regInfo.RegionID, false); if (regInfo.EstateSettings.EstateID != 0) - return; + return false; // estate info in the database did not change m_log.WarnFormat("[ESTATE] Region {0} is not part of an estate.", regInfo.RegionName); @@ -1018,7 +1018,7 @@ namespace OpenSim } if (defaultEstateJoined) - return; + return true; // need to update the database else m_log.ErrorFormat( "[OPENSIM BASE]: Joining default estate {0} failed", defaultEstateName); @@ -1080,8 +1080,10 @@ namespace OpenSim MainConsole.Instance.Output("Joining the estate failed. Please try again."); } } - } - } + } + + return true; // need to update the database + } } public class OpenSimConfigSource From f374b63ac8a2f75b59b2c0442ab8000f76466f70 Mon Sep 17 00:00:00 2001 From: Dan Lake Date: Thu, 10 May 2012 14:42:46 -0700 Subject: [PATCH 189/547] Add even for terrain tainting and synchronize terrain module with physics scene before physics simulation step rather than after --- .../World/Terrain/TerrainModule.cs | 1 + .../Region/Framework/Scenes/EventManager.cs | 25 +++++++++++++++++++ OpenSim/Region/Framework/Scenes/Scene.cs | 15 +++++------ 3 files changed, 34 insertions(+), 7 deletions(-) diff --git a/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs b/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs index 8535a5aceb..2eac0faa9c 100644 --- a/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs +++ b/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs @@ -722,6 +722,7 @@ namespace OpenSim.Region.CoreModules.World.Terrain } if (shouldTaint) { + m_scene.EventManager.TriggerTerrainTainted(); m_tainted = true; } } diff --git a/OpenSim/Region/Framework/Scenes/EventManager.cs b/OpenSim/Region/Framework/Scenes/EventManager.cs index ace83135d8..f97b0a9a19 100644 --- a/OpenSim/Region/Framework/Scenes/EventManager.cs +++ b/OpenSim/Region/Framework/Scenes/EventManager.cs @@ -53,6 +53,10 @@ namespace OpenSim.Region.Framework.Scenes public event ClientMovement OnClientMovement; + public delegate void OnTerrainTaintedDelegate(); + + public event OnTerrainTaintedDelegate OnTerrainTainted; + public delegate void OnTerrainTickDelegate(); public event OnTerrainTickDelegate OnTerrainTick; @@ -914,6 +918,27 @@ namespace OpenSim.Region.Framework.Scenes } } + public void TriggerTerrainTainted() + { + OnTerrainTaintedDelegate handlerTerrainTainted = OnTerrainTainted; + if (handlerTerrainTainted != null) + { + foreach (OnTerrainTickDelegate d in handlerTerrainTainted.GetInvocationList()) + { + try + { + d(); + } + catch (Exception e) + { + m_log.ErrorFormat( + "[EVENT MANAGER]: Delegate for TriggerTerrainTainted failed - continuing. {0} {1}", + e.Message, e.StackTrace); + } + } + } + } + public void TriggerParcelPrimCountAdd(SceneObjectGroup obj) { OnParcelPrimCountAddDelegate handlerParcelPrimCountAdd = OnParcelPrimCountAdd; diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 4d0aa6f32c..3d2213a9cc 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -1353,6 +1353,14 @@ namespace OpenSim.Region.Framework.Scenes try { + // Apply taints in terrain module to terrain in physics scene + if (Frame % m_update_terrain == 0) + { + terMS = Util.EnvironmentTickCount(); + UpdateTerrain(); + terrainMS = Util.EnvironmentTickCountSubtract(terMS); + } + tmpPhysicsMS2 = Util.EnvironmentTickCount(); if ((Frame % m_update_physics == 0) && m_physics_enabled) m_sceneGraph.UpdatePreparePhysics(); @@ -1417,13 +1425,6 @@ namespace OpenSim.Region.Framework.Scenes backupMS = Util.EnvironmentTickCountSubtract(backMS); } - if (Frame % m_update_terrain == 0) - { - terMS = Util.EnvironmentTickCount(); - UpdateTerrain(); - terrainMS = Util.EnvironmentTickCountSubtract(terMS); - } - //if (Frame % m_update_land == 0) //{ // int ldMS = Util.EnvironmentTickCount(); From bce3e7cb06611db887ee50c793d72674ad326ba7 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 10 May 2012 22:48:03 +0100 Subject: [PATCH 190/547] Add "attachments" show console command that will show the server's record of which attachments an in-scene avatar has. For debugging purposes. --- .../Attachments/AttachmentsCommandModule.cs | 177 ++++++++++++++++++ 1 file changed, 177 insertions(+) create mode 100644 OpenSim/Region/OptionalModules/Avatar/Attachments/AttachmentsCommandModule.cs diff --git a/OpenSim/Region/OptionalModules/Avatar/Attachments/AttachmentsCommandModule.cs b/OpenSim/Region/OptionalModules/Avatar/Attachments/AttachmentsCommandModule.cs new file mode 100644 index 0000000000..ce23613d7e --- /dev/null +++ b/OpenSim/Region/OptionalModules/Avatar/Attachments/AttachmentsCommandModule.cs @@ -0,0 +1,177 @@ +/* + * Copyright (c) Contributors, http://opensimulator.org/ + * See CONTRIBUTORS.TXT for a full list of copyright holders. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the OpenSimulator Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text; +using log4net; +using Mono.Addins; +using Nini.Config; +using OpenMetaverse; +using OpenSim.Framework; +using OpenSim.Framework.Console; +using OpenSim.Framework.Statistics; +using OpenSim.Region.ClientStack.LindenUDP; +using OpenSim.Region.Framework.Interfaces; +using OpenSim.Region.Framework.Scenes; + +namespace OpenSim.Region.OptionalModules.Avatar.Attachments +{ + /// + /// A module that just holds commands for inspecting avatar appearance. + /// + [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "AttachmentsCommandModule")] + public class AttachmentsCommandModule : ISharedRegionModule + { +// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + + private List m_scenes = new List(); +// private IAvatarFactoryModule m_avatarFactory; + + public string Name { get { return "Attachments Command Module"; } } + + public Type ReplaceableInterface { get { return null; } } + + public void Initialise(IConfigSource source) + { +// m_log.DebugFormat("[ATTACHMENTS COMMAND MODULE]: INITIALIZED MODULE"); + } + + public void PostInitialise() + { +// m_log.DebugFormat("[ATTACHMENTS COMMAND MODULE]: POST INITIALIZED MODULE"); + } + + public void Close() + { +// m_log.DebugFormat("[ATTACHMENTS COMMAND MODULE]: CLOSED MODULE"); + } + + public void AddRegion(Scene scene) + { +// m_log.DebugFormat("[ATTACHMENTS COMMAND MODULE]: REGION {0} ADDED", scene.RegionInfo.RegionName); + } + + public void RemoveRegion(Scene scene) + { +// m_log.DebugFormat("[ATTACHMENTS COMMAND MODULE]: REGION {0} REMOVED", scene.RegionInfo.RegionName); + + lock (m_scenes) + m_scenes.Remove(scene); + } + + public void RegionLoaded(Scene scene) + { +// m_log.DebugFormat("[ATTACHMENTS COMMAND MODULE]: REGION {0} LOADED", scene.RegionInfo.RegionName); + + lock (m_scenes) + m_scenes.Add(scene); + + scene.AddCommand( + "Users", this, "attachments show", + "attachments show [ ]", + "Show attachment information for avatars in this simulator.", + HandleShowAttachmentsCommand); + } + + protected void HandleShowAttachmentsCommand(string module, string[] cmd) + { + if (cmd.Length != 2 && cmd.Length < 4) + { + MainConsole.Instance.OutputFormat("Usage: attachments show [ ]"); + return; + } + + bool targetNameSupplied = false; + string optionalTargetFirstName = null; + string optionalTargetLastName = null; + + if (cmd.Length >= 4) + { + targetNameSupplied = true; + optionalTargetFirstName = cmd[2]; + optionalTargetLastName = cmd[3]; + } + + StringBuilder sb = new StringBuilder(); + + lock (m_scenes) + { + foreach (Scene scene in m_scenes) + { + if (targetNameSupplied) + { + ScenePresence sp = scene.GetScenePresence(optionalTargetFirstName, optionalTargetLastName); + if (sp != null && !sp.IsChildAgent) + GetAttachmentsReport(sp, sb); + } + else + { + scene.ForEachRootScenePresence(sp => GetAttachmentsReport(sp, sb)); + } + } + } + + MainConsole.Instance.Output(sb.ToString()); + } + + private void GetAttachmentsReport(ScenePresence sp, StringBuilder sb) + { + sb.AppendFormat("Attachments for {0}\n", sp.Name); + + sb.AppendFormat( + " {0,-36} {1,-10} {2,-36} {3,-14} {4,-15}\n", + "Attachment Name", "Local ID", "Item ID", "Attach Point", "Position"); + + List attachmentObjects = sp.GetAttachments(); + foreach (SceneObjectGroup attachmentObject in attachmentObjects) + { +// InventoryItemBase attachmentItem +// = m_scenes[0].InventoryService.GetItem(new InventoryItemBase(attachmentObject.FromItemID)); + +// if (attachmentItem == null) +// { +// sb.AppendFormat( +// "WARNING: Couldn't find attachment for item {0} at point {1}\n", +// attachmentData.ItemID, (AttachmentPoint)attachmentData.AttachPoint); +// continue; +// } +// else +// { + sb.AppendFormat( + " {0,-36} {1,-10} {2,-36} {3,-14} {4,-15}\n", + attachmentObject.Name, attachmentObject.LocalId, attachmentObject.FromItemID, + (AttachmentPoint)attachmentObject.AttachmentPoint, attachmentObject.RootPart.AttachedPos); +// } + } + + sb.Append("\n"); + } + } +} \ No newline at end of file From 903cff9264ce405d00eab2739fcfb461749b4772 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 10 May 2012 23:47:39 +0100 Subject: [PATCH 191/547] Add ConsoleTable framework class for future uniform formatting of console output tables. Still subject to change - if you use this be prepared to change your output code if/when the methods change. Make new "attachments show" command use this. --- OpenSim/Framework/Console/ConsoleTable.cs | 139 ++++++++++++++++++ .../Attachments/AttachmentsCommandModule.cs | 34 ++++- 2 files changed, 165 insertions(+), 8 deletions(-) create mode 100644 OpenSim/Framework/Console/ConsoleTable.cs diff --git a/OpenSim/Framework/Console/ConsoleTable.cs b/OpenSim/Framework/Console/ConsoleTable.cs new file mode 100644 index 0000000000..be3025be7f --- /dev/null +++ b/OpenSim/Framework/Console/ConsoleTable.cs @@ -0,0 +1,139 @@ +/* + * Copyright (c) Contributors, http://opensimulator.org/ + * See CONTRIBUTORS.TXT for a full list of copyright holders. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the OpenSimulator Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace OpenSim.Framework.Console +{ + /// + /// Used to generated a formatted table for the console. + /// + /// + /// Currently subject to change. If you use this, be prepared to change your code when this class changes. + /// + public class ConsoleTable + { + /// + /// Default number of spaces between table columns. + /// + public const int DefaultTableSpacing = 2; + + /// + /// Table columns. + /// + public List Columns { get; private set; } + + /// + /// Table rows + /// + public List Rows { get; private set; } + + /// + /// Number of spaces to indent the table. + /// + public int Indent { get; set; } + + /// + /// Spacing between table columns + /// + public int TableSpacing { get; set; } + + public ConsoleTable() + { + TableSpacing = DefaultTableSpacing; + Columns = new List(); + Rows = new List(); + } + + public override string ToString() + { + StringBuilder sb = new StringBuilder(); + AddToStringBuilder(sb); + return sb.ToString(); + } + + public void AddToStringBuilder(StringBuilder sb) + { + string formatString = GetFormatString(); +// System.Console.WriteLine("FORMAT STRING [{0}]", formatString); + + // columns + sb.AppendFormat(formatString, Columns.ConvertAll(c => c.Header).ToArray()); + + // rows + foreach (ConsoleTableRow row in Rows) + sb.AppendFormat(formatString, row.Cells.ToArray()); + } + + /// + /// Gets the format string for the table. + /// + private string GetFormatString() + { + StringBuilder formatSb = new StringBuilder(); + + formatSb.Append(' ', Indent); + + for (int i = 0; i < Columns.Count; i++) + { + formatSb.Append(' ', TableSpacing); + + // Can only do left formatting for now + formatSb.AppendFormat("{{{0},-{1}}}", i, Columns[i].Width); + } + + formatSb.Append('\n'); + + return formatSb.ToString(); + } + } + + public struct ConsoleTableColumn + { + public string Header { get; set; } + public int Width { get; set; } + + public ConsoleTableColumn(string header, int width) : this() + { + Header = header; + Width = width; + } + } + + public struct ConsoleTableRow + { + public List Cells { get; private set; } + + public ConsoleTableRow(List cells) : this() + { + Cells = cells; + } + } +} \ No newline at end of file diff --git a/OpenSim/Region/OptionalModules/Avatar/Attachments/AttachmentsCommandModule.cs b/OpenSim/Region/OptionalModules/Avatar/Attachments/AttachmentsCommandModule.cs index ce23613d7e..a95514c642 100644 --- a/OpenSim/Region/OptionalModules/Avatar/Attachments/AttachmentsCommandModule.cs +++ b/OpenSim/Region/OptionalModules/Avatar/Attachments/AttachmentsCommandModule.cs @@ -53,7 +53,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.Attachments private List m_scenes = new List(); // private IAvatarFactoryModule m_avatarFactory; - + public string Name { get { return "Attachments Command Module"; } } public Type ReplaceableInterface { get { return null; } } @@ -145,9 +145,16 @@ namespace OpenSim.Region.OptionalModules.Avatar.Attachments { sb.AppendFormat("Attachments for {0}\n", sp.Name); - sb.AppendFormat( - " {0,-36} {1,-10} {2,-36} {3,-14} {4,-15}\n", - "Attachment Name", "Local ID", "Item ID", "Attach Point", "Position"); + ConsoleTable ct = new ConsoleTable() { Indent = 2 }; + ct.Columns.Add(new ConsoleTableColumn("Attachment Name", 36)); + ct.Columns.Add(new ConsoleTableColumn("Local ID", 10)); + ct.Columns.Add(new ConsoleTableColumn("Item ID", 36)); + ct.Columns.Add(new ConsoleTableColumn("Attach Point", 14)); + ct.Columns.Add(new ConsoleTableColumn("Position", 15)); + +// sb.AppendFormat( +// " {0,-36} {1,-10} {2,-36} {3,-14} {4,-15}\n", +// "Attachment Name", "Local ID", "Item ID", "Attach Point", "Position"); List attachmentObjects = sp.GetAttachments(); foreach (SceneObjectGroup attachmentObject in attachmentObjects) @@ -164,13 +171,24 @@ namespace OpenSim.Region.OptionalModules.Avatar.Attachments // } // else // { - sb.AppendFormat( - " {0,-36} {1,-10} {2,-36} {3,-14} {4,-15}\n", - attachmentObject.Name, attachmentObject.LocalId, attachmentObject.FromItemID, - (AttachmentPoint)attachmentObject.AttachmentPoint, attachmentObject.RootPart.AttachedPos); +// sb.AppendFormat( +// " {0,-36} {1,-10} {2,-36} {3,-14} {4,-15}\n", +// attachmentObject.Name, attachmentObject.LocalId, attachmentObject.FromItemID, +// (AttachmentPoint)attachmentObject.AttachmentPoint, attachmentObject.RootPart.AttachedPos); + ct.Rows.Add( + new ConsoleTableRow( + new List() + { + attachmentObject.Name, + attachmentObject.LocalId.ToString(), + attachmentObject.FromItemID.ToString(), + ((AttachmentPoint)attachmentObject.AttachmentPoint).ToString(), + attachmentObject.RootPart.AttachedPos.ToString() + })); // } } + ct.AddToStringBuilder(sb); sb.Append("\n"); } } From ab4e6a02a52bfd473ea3c2050774103ec8eb3934 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 11 May 2012 00:37:20 +0100 Subject: [PATCH 192/547] If a bot is not connected, show region name "(none)" instead of throwing an exception in the "show bots" command of pCampbot --- OpenSim/Tools/pCampBot/BotManager.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/OpenSim/Tools/pCampBot/BotManager.cs b/OpenSim/Tools/pCampBot/BotManager.cs index 0f501b788b..fd32a6aa6e 100644 --- a/OpenSim/Tools/pCampBot/BotManager.cs +++ b/OpenSim/Tools/pCampBot/BotManager.cs @@ -302,9 +302,11 @@ namespace pCampBot { foreach (Bot pb in m_lBot) { + Simulator currentSim = pb.Client.Network.CurrentSim; + MainConsole.Instance.OutputFormat( outputFormat, - pb.Name, pb.Client.Network.CurrentSim.Name, pb.IsConnected ? "Connected" : "Disconnected"); + pb.Name, currentSim != null ? currentSim.Name : "(none)", pb.IsConnected ? "Connected" : "Disconnected"); } } } From dc39ec82fa8343657ad9b45a7d9cfeb27bf26e79 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 11 May 2012 00:53:21 +0100 Subject: [PATCH 193/547] Change bot.IsConnected to be ConnectionState with Disconnected, Connecting, Connnected and Disconnecting states --- OpenSim/Tools/pCampBot/Bot.cs | 23 ++++++++++++++++++++--- OpenSim/Tools/pCampBot/BotManager.cs | 4 ++-- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/OpenSim/Tools/pCampBot/Bot.cs b/OpenSim/Tools/pCampBot/Bot.cs index da090dda64..2b4a171f5a 100644 --- a/OpenSim/Tools/pCampBot/Bot.cs +++ b/OpenSim/Tools/pCampBot/Bot.cs @@ -43,6 +43,14 @@ using Timer = System.Timers.Timer; namespace pCampBot { + public enum ConnectionState + { + Disconnected, + Connecting, + Connected, + Disconnecting + } + public class Bot { private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); @@ -86,7 +94,7 @@ namespace pCampBot /// /// Is this bot connected to the grid? /// - public bool IsConnected { get; private set; } + public ConnectionState ConnectionState { get; private set; } public string FirstName { get; private set; } public string LastName { get; private set; } @@ -130,6 +138,8 @@ namespace pCampBot BotManager bm, List behaviours, string firstName, string lastName, string password, string loginUri) { + ConnectionState = ConnectionState.Disconnected; + behaviours.ForEach(b => b.Initialize(this)); Client = new GridClient(); @@ -178,6 +188,8 @@ namespace pCampBot /// public void shutdown() { + ConnectionState = ConnectionState.Disconnecting; + if (m_actionThread != null) m_actionThread.Abort(); @@ -209,9 +221,11 @@ namespace pCampBot Client.Network.Disconnected += this.Network_OnDisconnected; Client.Objects.ObjectUpdate += Objects_NewPrim; + ConnectionState = ConnectionState.Connecting; + if (Client.Network.Login(FirstName, LastName, Password, "pCampBot", "Your name")) { - IsConnected = true; + ConnectionState = ConnectionState.Connected; Thread.Sleep(Random.Next(1000, 10000)); m_actionThread = new Thread(Action); @@ -241,6 +255,8 @@ namespace pCampBot } else { + ConnectionState = ConnectionState.Disconnected; + m_log.ErrorFormat( "{0} {1} cannot login: {2}", FirstName, LastName, Client.Network.LoginMessage); @@ -439,6 +455,8 @@ namespace pCampBot public void Network_OnDisconnected(object sender, DisconnectedEventArgs args) { + ConnectionState = ConnectionState.Disconnected; + m_log.DebugFormat( "[BOT]: Bot {0} disconnected reason {1}, message {2}", Name, args.Reason, args.Message); @@ -456,7 +474,6 @@ namespace pCampBot && OnDisconnected != null) // if (OnDisconnected != null) { - IsConnected = false; OnDisconnected(this, EventType.DISCONNECTED); } } diff --git a/OpenSim/Tools/pCampBot/BotManager.cs b/OpenSim/Tools/pCampBot/BotManager.cs index fd32a6aa6e..d4bbc2acde 100644 --- a/OpenSim/Tools/pCampBot/BotManager.cs +++ b/OpenSim/Tools/pCampBot/BotManager.cs @@ -242,7 +242,7 @@ namespace pCampBot lock (m_lBot) { - if (m_lBot.TrueForAll(b => !b.IsConnected)) + if (m_lBot.TrueForAll(b => b.ConnectionState == ConnectionState.Disconnected)) Environment.Exit(0); break; @@ -306,7 +306,7 @@ namespace pCampBot MainConsole.Instance.OutputFormat( outputFormat, - pb.Name, currentSim != null ? currentSim.Name : "(none)", pb.IsConnected ? "Connected" : "Disconnected"); + pb.Name, currentSim != null ? currentSim.Name : "(none)", pb.ConnectionState); } } } From 93b615c51df3dec8276aead52141534a7ed32ff9 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 11 May 2012 01:37:03 +0100 Subject: [PATCH 194/547] Do each bot shutdown on its own threads to prevent one slow shutdown holding up all the rest. This does increase the aggressiveness of shutdown Also prevents the bot list being locked for a long period, which was preventing commands such as "show bots" from working during shutdown --- OpenSim/Tools/pCampBot/BotManager.cs | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/OpenSim/Tools/pCampBot/BotManager.cs b/OpenSim/Tools/pCampBot/BotManager.cs index d4bbc2acde..d06c55b111 100644 --- a/OpenSim/Tools/pCampBot/BotManager.cs +++ b/OpenSim/Tools/pCampBot/BotManager.cs @@ -251,13 +251,21 @@ namespace pCampBot } /// - /// Shutting down all bots + /// Shut down all bots /// + /// + /// We launch each shutdown on its own thread so that a slow shutting down bot doesn't hold up all the others. + /// public void doBotShutdown() { lock (m_lBot) - foreach (Bot pb in m_lBot) - pb.shutdown(); + { + foreach (Bot bot in m_lBot) + { + Bot thisBot = bot; + Util.FireAndForget(o => thisBot.shutdown()); + } + } } /// @@ -271,11 +279,8 @@ namespace pCampBot private void HandleShutdown(string module, string[] cmd) { - Util.FireAndForget(o => - { - m_log.Warn("[BOTMANAGER]: Shutting down bots"); - doBotShutdown(); - }); + m_log.Info("[BOTMANAGER]: Shutting down bots"); + doBotShutdown(); } private void HandleShowRegions(string module, string[] cmd) From 0ddf3c5289f32fc5ed3283d493f305286058e48c Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 11 May 2012 01:56:00 +0100 Subject: [PATCH 195/547] Do bot startup on another thread so console is responsive during this process --- OpenSim/Tools/pCampBot/BotManager.cs | 1 + OpenSim/Tools/pCampBot/pCampBot.cs | 5 ++++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/OpenSim/Tools/pCampBot/BotManager.cs b/OpenSim/Tools/pCampBot/BotManager.cs index d06c55b111..6d4bdb102d 100644 --- a/OpenSim/Tools/pCampBot/BotManager.cs +++ b/OpenSim/Tools/pCampBot/BotManager.cs @@ -222,6 +222,7 @@ namespace pCampBot Thread pbThread = new Thread(pb.startup); pbThread.Name = pb.Name; pbThread.IsBackground = true; + pbThread.Start(); } diff --git a/OpenSim/Tools/pCampBot/pCampBot.cs b/OpenSim/Tools/pCampBot/pCampBot.cs index ec5ad04fce..52e750185a 100644 --- a/OpenSim/Tools/pCampBot/pCampBot.cs +++ b/OpenSim/Tools/pCampBot/pCampBot.cs @@ -27,6 +27,7 @@ using System; using System.Reflection; +using System.Threading; using log4net; using Nini.Config; using OpenSim.Framework; @@ -67,7 +68,9 @@ namespace pCampBot BotManager bm = new BotManager(); //startup specified number of bots. 1 is the default - bm.dobotStartup(botcount, config); + Thread startBotThread = new Thread(o => bm.dobotStartup(botcount, config)); + startBotThread.Name = "Initial start bots thread"; + startBotThread.Start(); while (true) { From 9c392f6a6894d532917a3b4b44720fa1e6e30be7 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 11 May 2012 02:05:32 +0100 Subject: [PATCH 196/547] Stagger multiple bot logins by 5 seconds to make this part of the test more 'realistic' TODO: Need to make this value configurable by a command line parameter to pCampbot --- OpenSim/Tools/pCampBot/BotManager.cs | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/OpenSim/Tools/pCampBot/BotManager.cs b/OpenSim/Tools/pCampBot/BotManager.cs index 6d4bdb102d..b9eabbfffc 100644 --- a/OpenSim/Tools/pCampBot/BotManager.cs +++ b/OpenSim/Tools/pCampBot/BotManager.cs @@ -49,6 +49,14 @@ namespace pCampBot { private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + public const int DefaultLoginDelay = 5000; + + /// + /// Delay between logins of multiple bots. + /// + /// TODO: This value needs to be configurable by a command line argument. + public int LoginDelay { get; set; } + /// /// Command console /// @@ -84,6 +92,8 @@ namespace pCampBot /// public BotManager() { + LoginDelay = DefaultLoginDelay; + Rng = new Random(Environment.TickCount); AssetsReceived = new Dictionary(); RegionsKnown = new Dictionary(); @@ -224,6 +234,9 @@ namespace pCampBot pbThread.IsBackground = true; pbThread.Start(); + + // Stagger logins + Thread.Sleep(LoginDelay); } /// From f231ac39de7348965b5c4c04d8b29a885501c90d Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 11 May 2012 02:23:18 +0100 Subject: [PATCH 197/547] Increase minimum period between bot actions to 3 seconds, so that teleport doesn't fall under the minimum 2 second limits that clients take to process it --- OpenSim/Tools/pCampBot/Bot.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/OpenSim/Tools/pCampBot/Bot.cs b/OpenSim/Tools/pCampBot/Bot.cs index 2b4a171f5a..95dba9f4a5 100644 --- a/OpenSim/Tools/pCampBot/Bot.cs +++ b/OpenSim/Tools/pCampBot/Bot.cs @@ -167,10 +167,10 @@ namespace pCampBot Behaviours.ForEach( b => { + Thread.Sleep(Random.Next(3000, 10000)); + // m_log.DebugFormat("[pCAMPBOT]: For {0} performing action {1}", Name, b.GetType()); b.Action(); - - Thread.Sleep(Random.Next(1000, 10000)); } ); } From 480216f50f40bdb9709f9c6eec189a2ca027f395 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 11 May 2012 02:38:29 +0100 Subject: [PATCH 198/547] Print out more information on connecting bots --- OpenSim/Tools/pCampBot/Bot.cs | 2 +- OpenSim/Tools/pCampBot/BotManager.cs | 26 ++++++++++++++++++-------- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/OpenSim/Tools/pCampBot/Bot.cs b/OpenSim/Tools/pCampBot/Bot.cs index 95dba9f4a5..b6cd287202 100644 --- a/OpenSim/Tools/pCampBot/Bot.cs +++ b/OpenSim/Tools/pCampBot/Bot.cs @@ -168,7 +168,7 @@ namespace pCampBot b => { Thread.Sleep(Random.Next(3000, 10000)); - + // m_log.DebugFormat("[pCAMPBOT]: For {0} performing action {1}", Name, b.GetType()); b.Action(); } diff --git a/OpenSim/Tools/pCampBot/BotManager.cs b/OpenSim/Tools/pCampBot/BotManager.cs index b9eabbfffc..d615b3fb8a 100644 --- a/OpenSim/Tools/pCampBot/BotManager.cs +++ b/OpenSim/Tools/pCampBot/BotManager.cs @@ -161,28 +161,34 @@ namespace pCampBot Array.ForEach( cs.GetString("behaviours", "p").Split(new char[] { ',' }), b => behaviourSwitches.Add(b)); + MainConsole.Instance.OutputFormat( + "[BOT MANAGER]: Starting {0} bots connecting to {1}, named {2} {3}_", + botcount, + loginUri, + firstName, + lastNameStem); + + MainConsole.Instance.OutputFormat("[BOT MANAGER]: Delay between logins is {0}ms", LoginDelay); + for (int i = 0; i < botcount; i++) { string lastName = string.Format("{0}_{1}", lastNameStem, i); + // We must give each bot its own list of instantiated behaviours since they store state. List behaviours = new List(); - + // Hard-coded for now if (behaviourSwitches.Contains("p")) behaviours.Add(new PhysicsBehaviour()); - + if (behaviourSwitches.Contains("g")) behaviours.Add(new GrabbingBehaviour()); - + if (behaviourSwitches.Contains("t")) behaviours.Add(new TeleportBehaviour()); - + if (behaviourSwitches.Contains("c")) behaviours.Add(new CrossBehaviour()); - - MainConsole.Instance.OutputFormat( - "[BOT MANAGER]: Bot {0} {1} configured for behaviours {2}", - firstName, lastName, string.Join(",", behaviours.ConvertAll(b => b.Name).ToArray())); StartBot(this, behaviours, firstName, lastName, password, loginUri); } @@ -221,6 +227,10 @@ namespace pCampBot BotManager bm, List behaviours, string firstName, string lastName, string password, string loginUri) { + MainConsole.Instance.OutputFormat( + "[BOT MANAGER]: Starting bot {0} {1}, behaviours are {2}", + firstName, lastName, string.Join(",", behaviours.ConvertAll(b => b.Name).ToArray())); + Bot pb = new Bot(bm, behaviours, firstName, lastName, password, loginUri); pb.OnConnected += handlebotEvent; From b0b7b45b943dd94546bcfcf5d3bb871cfe35b507 Mon Sep 17 00:00:00 2001 From: Oren Hurvitz Date: Thu, 3 May 2012 19:38:35 +0300 Subject: [PATCH 199/547] Save the Telehub and its Spawn Points in the OAR Signed-off-by: BlueWall --- OpenSim/Framework/RegionSettings.cs | 29 ++++++++++++++- .../External/RegionSettingsSerializer.cs | 37 ++++++++++++++++++- .../Tests/RegionSettingsSerializerTests.cs | 8 ++++ .../World/Archiver/ArchiveReadRequest.cs | 25 ++++++++++++- .../ArchiveWriteRequestPreparation.cs | 2 +- .../World/Archiver/Tests/ArchiverTests.cs | 4 ++ 6 files changed, 100 insertions(+), 5 deletions(-) diff --git a/OpenSim/Framework/RegionSettings.cs b/OpenSim/Framework/RegionSettings.cs index 4ce3392057..011a97a9a3 100644 --- a/OpenSim/Framework/RegionSettings.cs +++ b/OpenSim/Framework/RegionSettings.cs @@ -29,6 +29,7 @@ using System; using System.Collections.Generic; using System.IO; using OpenMetaverse; +using System.Runtime.Serialization; namespace OpenSim.Framework { @@ -71,6 +72,32 @@ namespace OpenSim.Framework return pos + offset; } + + /// + /// Returns a string representation of this SpawnPoint. + /// + /// + public override string ToString() + { + return string.Format("{0},{1},{2}", Yaw, Pitch, Distance); + } + + /// + /// Generate a SpawnPoint from a string + /// + /// + public static SpawnPoint Parse(string str) + { + string[] parts = str.Split(','); + if (parts.Length != 3) + throw new ArgumentException("Invalid string: " + str); + + SpawnPoint sp = new SpawnPoint(); + sp.Yaw = float.Parse(parts[0]); + sp.Pitch = float.Parse(parts[1]); + sp.Distance = float.Parse(parts[2]); + return sp; + } } public class RegionSettings @@ -456,7 +483,7 @@ namespace OpenSim.Framework } // Connected Telehub object - private UUID m_TelehubObject; + private UUID m_TelehubObject = UUID.Zero; public UUID TelehubObject { get diff --git a/OpenSim/Framework/Serialization/External/RegionSettingsSerializer.cs b/OpenSim/Framework/Serialization/External/RegionSettingsSerializer.cs index 931898ce10..f18435d308 100644 --- a/OpenSim/Framework/Serialization/External/RegionSettingsSerializer.cs +++ b/OpenSim/Framework/Serialization/External/RegionSettingsSerializer.cs @@ -30,6 +30,8 @@ using System.Text; using System.Xml; using OpenMetaverse; using OpenSim.Framework; +using log4net; +using System.Reflection; namespace OpenSim.Framework.Serialization.External { @@ -187,7 +189,29 @@ namespace OpenSim.Framework.Serialization.External break; } } - + + xtr.ReadEndElement(); + + if (xtr.IsStartElement("Telehub")) + { + xtr.ReadStartElement("Telehub"); + + while (xtr.Read() && xtr.NodeType != XmlNodeType.EndElement) + { + switch (xtr.Name) + { + case "TelehubObject": + settings.TelehubObject = UUID.Parse(xtr.ReadElementContentAsString()); + break; + case "SpawnPoint": + string str = xtr.ReadElementContentAsString(); + SpawnPoint sp = SpawnPoint.Parse(str); + settings.AddSpawnPoint(sp); + break; + } + } + } + xtr.Close(); sr.Close(); @@ -243,7 +267,16 @@ namespace OpenSim.Framework.Serialization.External xtw.WriteElementString("SunPosition", settings.SunPosition.ToString()); // Note: 'SunVector' isn't saved because this value is owned by the Sun Module, which // calculates it automatically according to the date and other factors. - xtw.WriteEndElement(); + xtw.WriteEndElement(); + + xtw.WriteStartElement("Telehub"); + if (settings.TelehubObject != UUID.Zero) + { + xtw.WriteElementString("TelehubObject", settings.TelehubObject.ToString()); + foreach (SpawnPoint sp in settings.SpawnPoints()) + xtw.WriteElementString("SpawnPoint", sp.ToString()); + } + xtw.WriteEndElement(); xtw.WriteEndElement(); diff --git a/OpenSim/Framework/Serialization/Tests/RegionSettingsSerializerTests.cs b/OpenSim/Framework/Serialization/Tests/RegionSettingsSerializerTests.cs index a61e4af65d..09b6f6ddad 100644 --- a/OpenSim/Framework/Serialization/Tests/RegionSettingsSerializerTests.cs +++ b/OpenSim/Framework/Serialization/Tests/RegionSettingsSerializerTests.cs @@ -78,6 +78,10 @@ namespace OpenSim.Framework.Serialization.Tests true 12 + + 00000000-0000-0000-0000-111111111111 + 1,-2,0.33 + "; private RegionSettings m_rs; @@ -116,6 +120,8 @@ namespace OpenSim.Framework.Serialization.Tests m_rs.TerrainTexture4 = UUID.Parse("00000000-0000-0000-0000-000000000080"); m_rs.UseEstateSun = true; m_rs.WaterHeight = 23; + m_rs.TelehubObject = UUID.Parse("00000000-0000-0000-0000-111111111111"); + m_rs.AddSpawnPoint(SpawnPoint.Parse("1,-2,0.33")); } [Test] @@ -129,6 +135,8 @@ namespace OpenSim.Framework.Serialization.Tests Assert.That(deserRs.TerrainTexture2, Is.EqualTo(m_rs.TerrainTexture2)); Assert.That(deserRs.DisablePhysics, Is.EqualTo(m_rs.DisablePhysics)); Assert.That(deserRs.TerrainLowerLimit, Is.EqualTo(m_rs.TerrainLowerLimit)); + Assert.That(deserRs.TelehubObject, Is.EqualTo(m_rs.TelehubObject)); + Assert.That(deserRs.SpawnPoints()[0].ToString(), Is.EqualTo(m_rs.SpawnPoints()[0].ToString())); } } } diff --git a/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs b/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs index a6dbaba7d7..bf0ff7516b 100644 --- a/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs +++ b/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs @@ -245,6 +245,8 @@ namespace OpenSim.Region.CoreModules.World.Archiver // Reload serialized prims m_log.InfoFormat("[ARCHIVER]: Loading {0} scene objects. Please wait.", serialisedSceneObjects.Count); + UUID oldTelehubUUID = m_scene.RegionInfo.RegionSettings.TelehubObject; + IRegionSerialiserModule serialiser = m_scene.RequestModuleInterface(); int sceneObjectsLoadedCount = 0; @@ -266,11 +268,21 @@ namespace OpenSim.Region.CoreModules.World.Archiver SceneObjectGroup sceneObject = serialiser.DeserializeGroupFromXml2(serialisedSceneObject); + bool isTelehub = (sceneObject.UUID == oldTelehubUUID); + // For now, give all incoming scene objects new uuids. This will allow scenes to be cloned // on the same region server and multiple examples a single object archive to be imported // to the same scene (when this is possible). sceneObject.ResetIDs(); + if (isTelehub) + { + // Change the Telehub Object to the new UUID + m_scene.RegionInfo.RegionSettings.TelehubObject = sceneObject.UUID; + m_scene.RegionInfo.RegionSettings.Save(); + oldTelehubUUID = UUID.Zero; + } + // Try to retain the original creator/owner/lastowner if their uuid is present on this grid // or creator data is present. Otherwise, use the estate owner instead. foreach (SceneObjectPart part in sceneObject.Parts) @@ -329,7 +341,14 @@ namespace OpenSim.Region.CoreModules.World.Archiver int ignoredObjects = serialisedSceneObjects.Count - sceneObjectsLoadedCount; if (ignoredObjects > 0) - m_log.WarnFormat("[ARCHIVER]: Ignored {0} scene objects that already existed in the scene", ignoredObjects); + m_log.WarnFormat("[ARCHIVER]: Ignored {0} scene objects that already existed in the scene", ignoredObjects); + + if (oldTelehubUUID != UUID.Zero) + { + m_log.WarnFormat("Telehub object not found: {0}", oldTelehubUUID); + m_scene.RegionInfo.RegionSettings.TelehubObject = UUID.Zero; + m_scene.RegionInfo.RegionSettings.ClearSpawnPoints(); + } } /// @@ -505,6 +524,10 @@ namespace OpenSim.Region.CoreModules.World.Archiver currentRegionSettings.TerrainTexture4 = loadedRegionSettings.TerrainTexture4; currentRegionSettings.UseEstateSun = loadedRegionSettings.UseEstateSun; currentRegionSettings.WaterHeight = loadedRegionSettings.WaterHeight; + currentRegionSettings.TelehubObject = loadedRegionSettings.TelehubObject; + currentRegionSettings.ClearSpawnPoints(); + foreach (SpawnPoint sp in loadedRegionSettings.SpawnPoints()) + currentRegionSettings.AddSpawnPoint(sp); currentRegionSettings.Save(); diff --git a/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestPreparation.cs b/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestPreparation.cs index eabe46e936..5679ad5dcb 100644 --- a/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestPreparation.cs +++ b/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestPreparation.cs @@ -328,7 +328,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver /// public string CreateControlFile(Dictionary options) { - int majorVersion = MAX_MAJOR_VERSION, minorVersion = 7; + int majorVersion = MAX_MAJOR_VERSION, minorVersion = 8; // // if (options.ContainsKey("version")) // { diff --git a/OpenSim/Region/CoreModules/World/Archiver/Tests/ArchiverTests.cs b/OpenSim/Region/CoreModules/World/Archiver/Tests/ArchiverTests.cs index 053c6f59d4..394ca27123 100644 --- a/OpenSim/Region/CoreModules/World/Archiver/Tests/ArchiverTests.cs +++ b/OpenSim/Region/CoreModules/World/Archiver/Tests/ArchiverTests.cs @@ -534,6 +534,8 @@ namespace OpenSim.Region.CoreModules.World.Archiver.Tests rs.TerrainTexture4 = UUID.Parse("00000000-0000-0000-0000-000000000080"); rs.UseEstateSun = true; rs.WaterHeight = 23; + rs.TelehubObject = UUID.Parse("00000000-0000-0000-0000-111111111111"); + rs.AddSpawnPoint(SpawnPoint.Parse("1,-2,0.33")); tar.WriteFile(ArchiveConstants.SETTINGS_PATH + "region1.xml", RegionSettingsSerializer.Serialize(rs)); @@ -580,6 +582,8 @@ namespace OpenSim.Region.CoreModules.World.Archiver.Tests Assert.That(loadedRs.TerrainTexture4, Is.EqualTo(UUID.Parse("00000000-0000-0000-0000-000000000080"))); Assert.That(loadedRs.UseEstateSun, Is.True); Assert.That(loadedRs.WaterHeight, Is.EqualTo(23)); + Assert.AreEqual(UUID.Zero, loadedRs.TelehubObject); // because no object was found with the original UUID + Assert.AreEqual(0, loadedRs.SpawnPoints().Count); } /// From 8b958e7e74d8e4b462c6a59c2854c5072ff8c746 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Sat, 12 May 2012 02:36:56 +0100 Subject: [PATCH 200/547] Revert "Save the Telehub and its Spawn Points in the OAR" This reverts commit b0b7b45b943dd94546bcfcf5d3bb871cfe35b507. Sorry BlueWall, I wanted to discuss an aspect of the data storage but I couldn't assign bugs in 'patch included' state to myself until I changed mantis just now and I forgot to mention it on irc. I wouldn't normally revert but thinks get tricky when it comes to data formats. Essentially, I would like to see the Yaw, Pitch and Distance values as separate XML entities (as used in other aspects such as vectors, quaternions) rather than as a . delimited string We can discuss this more with Oren in opensimulator.org/mantis/view.php?id=6008 --- OpenSim/Framework/RegionSettings.cs | 29 +-------------- .../External/RegionSettingsSerializer.cs | 37 +------------------ .../Tests/RegionSettingsSerializerTests.cs | 8 ---- .../World/Archiver/ArchiveReadRequest.cs | 25 +------------ .../ArchiveWriteRequestPreparation.cs | 2 +- .../World/Archiver/Tests/ArchiverTests.cs | 4 -- 6 files changed, 5 insertions(+), 100 deletions(-) diff --git a/OpenSim/Framework/RegionSettings.cs b/OpenSim/Framework/RegionSettings.cs index 011a97a9a3..4ce3392057 100644 --- a/OpenSim/Framework/RegionSettings.cs +++ b/OpenSim/Framework/RegionSettings.cs @@ -29,7 +29,6 @@ using System; using System.Collections.Generic; using System.IO; using OpenMetaverse; -using System.Runtime.Serialization; namespace OpenSim.Framework { @@ -72,32 +71,6 @@ namespace OpenSim.Framework return pos + offset; } - - /// - /// Returns a string representation of this SpawnPoint. - /// - /// - public override string ToString() - { - return string.Format("{0},{1},{2}", Yaw, Pitch, Distance); - } - - /// - /// Generate a SpawnPoint from a string - /// - /// - public static SpawnPoint Parse(string str) - { - string[] parts = str.Split(','); - if (parts.Length != 3) - throw new ArgumentException("Invalid string: " + str); - - SpawnPoint sp = new SpawnPoint(); - sp.Yaw = float.Parse(parts[0]); - sp.Pitch = float.Parse(parts[1]); - sp.Distance = float.Parse(parts[2]); - return sp; - } } public class RegionSettings @@ -483,7 +456,7 @@ namespace OpenSim.Framework } // Connected Telehub object - private UUID m_TelehubObject = UUID.Zero; + private UUID m_TelehubObject; public UUID TelehubObject { get diff --git a/OpenSim/Framework/Serialization/External/RegionSettingsSerializer.cs b/OpenSim/Framework/Serialization/External/RegionSettingsSerializer.cs index f18435d308..931898ce10 100644 --- a/OpenSim/Framework/Serialization/External/RegionSettingsSerializer.cs +++ b/OpenSim/Framework/Serialization/External/RegionSettingsSerializer.cs @@ -30,8 +30,6 @@ using System.Text; using System.Xml; using OpenMetaverse; using OpenSim.Framework; -using log4net; -using System.Reflection; namespace OpenSim.Framework.Serialization.External { @@ -189,29 +187,7 @@ namespace OpenSim.Framework.Serialization.External break; } } - - xtr.ReadEndElement(); - - if (xtr.IsStartElement("Telehub")) - { - xtr.ReadStartElement("Telehub"); - - while (xtr.Read() && xtr.NodeType != XmlNodeType.EndElement) - { - switch (xtr.Name) - { - case "TelehubObject": - settings.TelehubObject = UUID.Parse(xtr.ReadElementContentAsString()); - break; - case "SpawnPoint": - string str = xtr.ReadElementContentAsString(); - SpawnPoint sp = SpawnPoint.Parse(str); - settings.AddSpawnPoint(sp); - break; - } - } - } - + xtr.Close(); sr.Close(); @@ -267,16 +243,7 @@ namespace OpenSim.Framework.Serialization.External xtw.WriteElementString("SunPosition", settings.SunPosition.ToString()); // Note: 'SunVector' isn't saved because this value is owned by the Sun Module, which // calculates it automatically according to the date and other factors. - xtw.WriteEndElement(); - - xtw.WriteStartElement("Telehub"); - if (settings.TelehubObject != UUID.Zero) - { - xtw.WriteElementString("TelehubObject", settings.TelehubObject.ToString()); - foreach (SpawnPoint sp in settings.SpawnPoints()) - xtw.WriteElementString("SpawnPoint", sp.ToString()); - } - xtw.WriteEndElement(); + xtw.WriteEndElement(); xtw.WriteEndElement(); diff --git a/OpenSim/Framework/Serialization/Tests/RegionSettingsSerializerTests.cs b/OpenSim/Framework/Serialization/Tests/RegionSettingsSerializerTests.cs index 09b6f6ddad..a61e4af65d 100644 --- a/OpenSim/Framework/Serialization/Tests/RegionSettingsSerializerTests.cs +++ b/OpenSim/Framework/Serialization/Tests/RegionSettingsSerializerTests.cs @@ -78,10 +78,6 @@ namespace OpenSim.Framework.Serialization.Tests true 12 - - 00000000-0000-0000-0000-111111111111 - 1,-2,0.33 - "; private RegionSettings m_rs; @@ -120,8 +116,6 @@ namespace OpenSim.Framework.Serialization.Tests m_rs.TerrainTexture4 = UUID.Parse("00000000-0000-0000-0000-000000000080"); m_rs.UseEstateSun = true; m_rs.WaterHeight = 23; - m_rs.TelehubObject = UUID.Parse("00000000-0000-0000-0000-111111111111"); - m_rs.AddSpawnPoint(SpawnPoint.Parse("1,-2,0.33")); } [Test] @@ -135,8 +129,6 @@ namespace OpenSim.Framework.Serialization.Tests Assert.That(deserRs.TerrainTexture2, Is.EqualTo(m_rs.TerrainTexture2)); Assert.That(deserRs.DisablePhysics, Is.EqualTo(m_rs.DisablePhysics)); Assert.That(deserRs.TerrainLowerLimit, Is.EqualTo(m_rs.TerrainLowerLimit)); - Assert.That(deserRs.TelehubObject, Is.EqualTo(m_rs.TelehubObject)); - Assert.That(deserRs.SpawnPoints()[0].ToString(), Is.EqualTo(m_rs.SpawnPoints()[0].ToString())); } } } diff --git a/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs b/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs index bf0ff7516b..a6dbaba7d7 100644 --- a/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs +++ b/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs @@ -245,8 +245,6 @@ namespace OpenSim.Region.CoreModules.World.Archiver // Reload serialized prims m_log.InfoFormat("[ARCHIVER]: Loading {0} scene objects. Please wait.", serialisedSceneObjects.Count); - UUID oldTelehubUUID = m_scene.RegionInfo.RegionSettings.TelehubObject; - IRegionSerialiserModule serialiser = m_scene.RequestModuleInterface(); int sceneObjectsLoadedCount = 0; @@ -268,21 +266,11 @@ namespace OpenSim.Region.CoreModules.World.Archiver SceneObjectGroup sceneObject = serialiser.DeserializeGroupFromXml2(serialisedSceneObject); - bool isTelehub = (sceneObject.UUID == oldTelehubUUID); - // For now, give all incoming scene objects new uuids. This will allow scenes to be cloned // on the same region server and multiple examples a single object archive to be imported // to the same scene (when this is possible). sceneObject.ResetIDs(); - if (isTelehub) - { - // Change the Telehub Object to the new UUID - m_scene.RegionInfo.RegionSettings.TelehubObject = sceneObject.UUID; - m_scene.RegionInfo.RegionSettings.Save(); - oldTelehubUUID = UUID.Zero; - } - // Try to retain the original creator/owner/lastowner if their uuid is present on this grid // or creator data is present. Otherwise, use the estate owner instead. foreach (SceneObjectPart part in sceneObject.Parts) @@ -341,14 +329,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver int ignoredObjects = serialisedSceneObjects.Count - sceneObjectsLoadedCount; if (ignoredObjects > 0) - m_log.WarnFormat("[ARCHIVER]: Ignored {0} scene objects that already existed in the scene", ignoredObjects); - - if (oldTelehubUUID != UUID.Zero) - { - m_log.WarnFormat("Telehub object not found: {0}", oldTelehubUUID); - m_scene.RegionInfo.RegionSettings.TelehubObject = UUID.Zero; - m_scene.RegionInfo.RegionSettings.ClearSpawnPoints(); - } + m_log.WarnFormat("[ARCHIVER]: Ignored {0} scene objects that already existed in the scene", ignoredObjects); } /// @@ -524,10 +505,6 @@ namespace OpenSim.Region.CoreModules.World.Archiver currentRegionSettings.TerrainTexture4 = loadedRegionSettings.TerrainTexture4; currentRegionSettings.UseEstateSun = loadedRegionSettings.UseEstateSun; currentRegionSettings.WaterHeight = loadedRegionSettings.WaterHeight; - currentRegionSettings.TelehubObject = loadedRegionSettings.TelehubObject; - currentRegionSettings.ClearSpawnPoints(); - foreach (SpawnPoint sp in loadedRegionSettings.SpawnPoints()) - currentRegionSettings.AddSpawnPoint(sp); currentRegionSettings.Save(); diff --git a/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestPreparation.cs b/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestPreparation.cs index 5679ad5dcb..eabe46e936 100644 --- a/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestPreparation.cs +++ b/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestPreparation.cs @@ -328,7 +328,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver /// public string CreateControlFile(Dictionary options) { - int majorVersion = MAX_MAJOR_VERSION, minorVersion = 8; + int majorVersion = MAX_MAJOR_VERSION, minorVersion = 7; // // if (options.ContainsKey("version")) // { diff --git a/OpenSim/Region/CoreModules/World/Archiver/Tests/ArchiverTests.cs b/OpenSim/Region/CoreModules/World/Archiver/Tests/ArchiverTests.cs index 394ca27123..053c6f59d4 100644 --- a/OpenSim/Region/CoreModules/World/Archiver/Tests/ArchiverTests.cs +++ b/OpenSim/Region/CoreModules/World/Archiver/Tests/ArchiverTests.cs @@ -534,8 +534,6 @@ namespace OpenSim.Region.CoreModules.World.Archiver.Tests rs.TerrainTexture4 = UUID.Parse("00000000-0000-0000-0000-000000000080"); rs.UseEstateSun = true; rs.WaterHeight = 23; - rs.TelehubObject = UUID.Parse("00000000-0000-0000-0000-111111111111"); - rs.AddSpawnPoint(SpawnPoint.Parse("1,-2,0.33")); tar.WriteFile(ArchiveConstants.SETTINGS_PATH + "region1.xml", RegionSettingsSerializer.Serialize(rs)); @@ -582,8 +580,6 @@ namespace OpenSim.Region.CoreModules.World.Archiver.Tests Assert.That(loadedRs.TerrainTexture4, Is.EqualTo(UUID.Parse("00000000-0000-0000-0000-000000000080"))); Assert.That(loadedRs.UseEstateSun, Is.True); Assert.That(loadedRs.WaterHeight, Is.EqualTo(23)); - Assert.AreEqual(UUID.Zero, loadedRs.TelehubObject); // because no object was found with the original UUID - Assert.AreEqual(0, loadedRs.SpawnPoints().Count); } /// From 9d66792c2a06a667dc81e249e9ac81b6236b9126 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Sat, 12 May 2012 03:04:47 +0100 Subject: [PATCH 201/547] Fix mono compiler warning. Last jenkins failure looked like a glitch. --- OpenSim/Tests/Common/Helpers/SceneHelpers.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Tests/Common/Helpers/SceneHelpers.cs b/OpenSim/Tests/Common/Helpers/SceneHelpers.cs index dc24418145..78f94347bd 100644 --- a/OpenSim/Tests/Common/Helpers/SceneHelpers.cs +++ b/OpenSim/Tests/Common/Helpers/SceneHelpers.cs @@ -66,7 +66,7 @@ namespace OpenSim.Tests.Common private AgentCircuitManager m_acm = new AgentCircuitManager(); private ISimulationDataService m_simDataService = OpenSim.Server.Base.ServerUtils.LoadPlugin("OpenSim.Tests.Common.dll", null); - private IEstateDataService m_estateDataService; + private IEstateDataService m_estateDataService = null; private LocalAssetServicesConnector m_assetService; private LocalAuthenticationServicesConnector m_authenticationService; From 7c229c8b812b0975133a2612b34225c7c9403f1b Mon Sep 17 00:00:00 2001 From: BlueWall Date: Sun, 13 May 2012 17:11:44 -0400 Subject: [PATCH 202/547] Add configurable SpawnPointRouting Will use one of three selected methods to route avatar landing points when using Telehubs. The setting is in [Startup] using SpawnPointRouting = closest/random/sequence closest: The default setting. Routes avatar to the nearest SpawnPoint to the location. random: Picks random SpawnPoints to land the avatar. sequence: Follows a sequence to place the avatar on the next available SpawnPoint location Conflicts: OpenSim/Region/Framework/Scenes/Scene.cs --- OpenSim/Region/Framework/Scenes/Scene.cs | 81 ++++++++++---- .../Region/Framework/Scenes/ScenePresence.cs | 103 ++++++++++++++---- 2 files changed, 146 insertions(+), 38 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 3d2213a9cc..2a2830f47d 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -569,6 +569,15 @@ namespace OpenSim.Region.Framework.Scenes get { return m_sceneGraph.Entities; } } + // can be closest/random/sequence + private string m_SpawnPointRouting = "closest"; + // used in sequence see: SpawnPoint() + private int m_SpawnPoint; + public string SpawnPointRouting + { + get { return m_SpawnPointRouting; } + } + #endregion Properties #region Constructors @@ -586,7 +595,7 @@ namespace OpenSim.Region.Framework.Scenes Random random = new Random(); - m_lastAllocatedLocalId = (uint)(random.NextDouble() * (double)(uint.MaxValue/2))+(uint)(uint.MaxValue/4); + m_lastAllocatedLocalId = (uint)(random.NextDouble() * (double)(uint.MaxValue / 2)) + (uint)(uint.MaxValue / 4); m_moduleLoader = moduleLoader; m_authenticateHandler = authen; m_sceneGridService = sceneGridService; @@ -678,7 +687,7 @@ namespace OpenSim.Region.Framework.Scenes { IConfig startupConfig = m_config.Configs["Startup"]; - m_defaultDrawDistance = startupConfig.GetFloat("DefaultDrawDistance",m_defaultDrawDistance); + m_defaultDrawDistance = startupConfig.GetFloat("DefaultDrawDistance", m_defaultDrawDistance); m_useBackup = startupConfig.GetBoolean("UseSceneBackup", m_useBackup); if (!m_useBackup) m_log.InfoFormat("[SCENE]: Backup has been disabled for {0}", RegionInfo.RegionName); @@ -711,7 +720,7 @@ namespace OpenSim.Region.Framework.Scenes m_clampPrimSize = true; } - m_useTrashOnDelete = startupConfig.GetBoolean("UseTrashOnDelete",m_useTrashOnDelete); + m_useTrashOnDelete = startupConfig.GetBoolean("UseTrashOnDelete", m_useTrashOnDelete); m_trustBinaries = startupConfig.GetBoolean("TrustBinaries", m_trustBinaries); m_allowScriptCrossings = startupConfig.GetBoolean("AllowScriptCrossing", m_allowScriptCrossings); m_dontPersistBefore = @@ -723,6 +732,8 @@ namespace OpenSim.Region.Framework.Scenes m_defaultScriptEngine = startupConfig.GetString("DefaultScriptEngine", "XEngine"); + m_SpawnPointRouting = startupConfig.GetString("SpawnPointRouting", "closest"); + IConfig packetConfig = m_config.Configs["PacketPool"]; if (packetConfig != null) { @@ -3389,7 +3400,7 @@ namespace OpenSim.Region.Framework.Scenes public bool NewUserConnection(AgentCircuitData agent, uint teleportFlags, out string reason, bool requirePresenceLookup) { bool vialogin = ((teleportFlags & (uint)TPFlags.ViaLogin) != 0 || - (teleportFlags & (uint)TPFlags.ViaHGLogin) != 0); + (teleportFlags & (uint)TPFlags.ViaHGLogin) != 0); bool viahome = ((teleportFlags & (uint)TPFlags.ViaHome) != 0); bool godlike = ((teleportFlags & (uint)TPFlags.Godlike) != 0); @@ -3405,8 +3416,17 @@ namespace OpenSim.Region.Framework.Scenes // Don't disable this log message - it's too helpful m_log.DebugFormat( "[SCENE]: Region {0} told of incoming {1} agent {2} {3} {4} (circuit code {5}, IP {6}, viewer {7}, teleportflags ({8}), position {9})", - RegionInfo.RegionName, (agent.child ? "child" : "root"),agent.firstname, agent.lastname, - agent.AgentID, agent.circuitcode, agent.IPAddress, agent.Viewer, ((TPFlags)teleportFlags).ToString(), agent.startpos); + RegionInfo.RegionName, + (agent.child ? "child" : "root"), + agent.firstname, + agent.lastname, + agent.AgentID, + agent.circuitcode, + agent.IPAddress, + agent.Viewer, + ((TPFlags)teleportFlags).ToString(), + agent.startpos + ); if (LoginsDisabled) { @@ -3421,7 +3441,11 @@ namespace OpenSim.Region.Framework.Scenes // We have a zombie from a crashed session. // Or the same user is trying to be root twice here, won't work. // Kill it. - m_log.DebugFormat("[SCENE]: Zombie scene presence detected for {0} in {1}", agent.AgentID, RegionInfo.RegionName); + m_log.DebugFormat( + "[SCENE]: Zombie scene presence detected for {0} in {1}", + agent.AgentID, + RegionInfo.RegionName + ); sp.ControllingClient.Close(); sp = null; } @@ -3445,8 +3469,7 @@ namespace OpenSim.Region.Framework.Scenes { if (!VerifyUserPresence(agent, out reason)) return false; - } - catch (Exception e) + } catch (Exception e) { m_log.ErrorFormat( "[SCENE]: Exception verifying presence {0}{1}", e.Message, e.StackTrace); @@ -3458,8 +3481,7 @@ namespace OpenSim.Region.Framework.Scenes { if (!AuthorizeUser(agent, out reason)) return false; - } - catch (Exception e) + } catch (Exception e) { m_log.ErrorFormat( "[SCENE]: Exception authorizing user {0}{1}", e.Message, e.StackTrace); @@ -3476,8 +3498,7 @@ namespace OpenSim.Region.Framework.Scenes CapsModule.SetAgentCapsSeeds(agent); CapsModule.CreateCaps(agent.AgentID); } - } - else + } else { // Let the SP know how we got here. This has a lot of interesting // uses down the line. @@ -3500,7 +3521,7 @@ namespace OpenSim.Region.Framework.Scenes agent.teleportFlags = teleportFlags; m_authenticateHandler.AddNewCircuit(agent.circuitcode, agent); - if (vialogin) + if (vialogin) { // CleanDroppedAttachments(); @@ -3541,8 +3562,7 @@ namespace OpenSim.Region.Framework.Scenes agent.startpos.Z = 720; } } - } - else + } else { if (agent.startpos.X > EastBorders[0].BorderLine.Z) { @@ -3568,10 +3588,19 @@ namespace OpenSim.Region.Framework.Scenes SceneObjectGroup telehub = GetSceneObjectGroup(RegionInfo.RegionSettings.TelehubObject); // Can have multiple SpawnPoints List spawnpoints = RegionInfo.RegionSettings.SpawnPoints(); - if ( spawnpoints.Count > 1) + if (spawnpoints.Count > 1) { - // We have multiple SpawnPoints, Route the agent to a random one - agent.startpos = spawnpoints[Util.RandomClass.Next(spawnpoints.Count)].GetLocation(telehub.AbsolutePosition, telehub.GroupRotation); + // We have multiple SpawnPoints, Route the agent to a random or sequential one + if (SpawnPointRouting == "random") + agent.startpos = spawnpoints[Util.RandomClass.Next(spawnpoints.Count) - 1].GetLocation( + telehub.AbsolutePosition, + telehub.GroupRotation + ); + else + agent.startpos = spawnpoints[SpawnPoint()].GetLocation( + telehub.AbsolutePosition, + telehub.GroupRotation + ); } else { @@ -5257,5 +5286,19 @@ namespace OpenSim.Region.Framework.Scenes } } } + + // manage and select spawn points in sequence + public int SpawnPoint() + { + int spawnpoints = RegionInfo.RegionSettings.SpawnPoints().Count; + + if (spawnpoints == 0) + return 0; + + m_SpawnPoint++; + if (m_SpawnPoint > spawnpoints) + m_SpawnPoint = 1; + return m_SpawnPoint - 1; + } } } diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index b737f91f0f..bdcef71159 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs @@ -3934,28 +3934,93 @@ namespace OpenSim.Region.Framework.Scenes if (spawnPoints.Length == 0) return; - float distance = 9999; - int closest = -1; + int index; + bool selected = false; - for (int i = 0 ; i < spawnPoints.Length ; i++) + switch (m_scene.SpawnPointRouting) { - Vector3 spawnPosition = spawnPoints[i].GetLocation(telehub.AbsolutePosition, telehub.GroupRotation); - Vector3 offset = spawnPosition - pos; - float d = Vector3.Mag(offset); - if (d >= distance) - continue; - ILandObject land = m_scene.LandChannel.GetLandObject(spawnPosition.X, spawnPosition.Y); - if (land == null) - continue; - if (land.IsEitherBannedOrRestricted(UUID)) - continue; - distance = d; - closest = i; - } - if (closest == -1) - return; + case "closest": - pos = spawnPoints[closest].GetLocation(telehub.AbsolutePosition, telehub.GroupRotation); + float distance = 9999; + int closest = -1; + + for (int i = 0; i < spawnPoints.Length; i++) + { + Vector3 spawnPosition = spawnPoints[i].GetLocation( + telehub.AbsolutePosition, + telehub.GroupRotation + ); + Vector3 offset = spawnPosition - pos; + float d = Vector3.Mag(offset); + if (d >= distance) + continue; + ILandObject land = m_scene.LandChannel.GetLandObject(spawnPosition.X, spawnPosition.Y); + if (land == null) + continue; + if (land.IsEitherBannedOrRestricted(UUID)) + continue; + distance = d; + closest = i; + } + if (closest == -1) + return; + + pos = spawnPoints[closest].GetLocation(telehub.AbsolutePosition, telehub.GroupRotation); + return; + + case "random": + + do + { + index = Util.RandomClass.Next(spawnPoints.Length - 1); + + Vector3 spawnPosition = spawnPoints[index].GetLocation( + telehub.AbsolutePosition, + telehub.GroupRotation + ); + // SpawnPoint sp = spawnPoints[index]; + + ILandObject land = m_scene.LandChannel.GetLandObject(spawnPosition.X, spawnPosition.Y); + if (land == null || land.IsEitherBannedOrRestricted(UUID)) + selected = false; + else + selected = true; + + } while ( selected == false); + + pos = spawnPoints[index].GetLocation( + telehub.AbsolutePosition, + telehub.GroupRotation + ); + return; + + case "sequence": + + do + { + index = m_scene.SpawnPoint(); + + Vector3 spawnPosition = spawnPoints[index].GetLocation( + telehub.AbsolutePosition, + telehub.GroupRotation + ); + // SpawnPoint sp = spawnPoints[index]; + + ILandObject land = m_scene.LandChannel.GetLandObject(spawnPosition.X, spawnPosition.Y); + if (land == null || land.IsEitherBannedOrRestricted(UUID)) + selected = false; + else + selected = true; + + } while (selected == false); + + pos = spawnPoints[index].GetLocation(telehub.AbsolutePosition, telehub.GroupRotation); + ; + return; + + default: + return; + } } } } From 30a272ba318c2cacc27f6244dcf829c37a789a7c Mon Sep 17 00:00:00 2001 From: Chris Koeritz Date: Sun, 13 May 2012 16:58:47 -0400 Subject: [PATCH 203/547] Modifications for SMTP in OpenSimulator. Email size limit was fixed (was out of step with documentation at 1024, so boosted to 4096). Added configuration item for maximum email size. Redundant sleep inside email module was fixed (LSL Api was already sleeping). Added sleep time configuration item for snooze between email sending for LSL Api. Added two new configuration items (email_max_size and email_pause_time) into the example OpenSim.ini, plus fixed a spelling error (llimits) and odd tabbing. Signed-off-by: BlueWall --- .../Scripting/EMailModules/EmailModule.cs | 24 ++++------------ .../Shared/Api/Implementation/LSL_Api.cs | 28 ++++++++++++++----- bin/OpenSim.ini.example | 11 ++++++-- 3 files changed, 34 insertions(+), 29 deletions(-) diff --git a/OpenSim/Region/CoreModules/Scripting/EMailModules/EmailModule.cs b/OpenSim/Region/CoreModules/Scripting/EMailModules/EmailModule.cs index 9255791c76..e91e8b9f45 100644 --- a/OpenSim/Region/CoreModules/Scripting/EMailModules/EmailModule.cs +++ b/OpenSim/Region/CoreModules/Scripting/EMailModules/EmailModule.cs @@ -64,6 +64,8 @@ namespace OpenSim.Region.CoreModules.Scripting.EmailModules private TimeSpan m_QueueTimeout = new TimeSpan(2, 0, 0); // 2 hours without llGetNextEmail drops the queue private string m_InterObjectHostname = "lsl.opensim.local"; + private int m_MaxEmailSize = 4096; // largest email allowed by default, as per lsl docs. + // Scenes by Region Handle private Dictionary m_Scenes = new Dictionary(); @@ -127,6 +129,7 @@ namespace OpenSim.Region.CoreModules.Scripting.EmailModules SMTP_SERVER_PORT = SMTPConfig.GetInt("SMTP_SERVER_PORT", SMTP_SERVER_PORT); SMTP_SERVER_LOGIN = SMTPConfig.GetString("SMTP_SERVER_LOGIN", SMTP_SERVER_LOGIN); SMTP_SERVER_PASSWORD = SMTPConfig.GetString("SMTP_SERVER_PASSWORD", SMTP_SERVER_PASSWORD); + m_MaxEmailSize = SMTPConfig.GetInt("email_max_size", m_MaxEmailSize); } catch (Exception e) { @@ -176,18 +179,6 @@ namespace OpenSim.Region.CoreModules.Scripting.EmailModules get { return true; } } - /// - /// Delay function using thread in seconds - /// - /// - private void DelayInSeconds(int delay) - { - delay = (int)((float)delay * 1000); - if (delay == 0) - return; - System.Threading.Thread.Sleep(delay); - } - private bool IsLocal(UUID objectID) { string unused; @@ -267,10 +258,9 @@ namespace OpenSim.Region.CoreModules.Scripting.EmailModules m_log.Error("[EMAIL] REGEX Problem in EMail Address: "+address); return; } - //FIXME:Check if subject + body = 4096 Byte - if ((subject.Length + body.Length) > 1024) + if ((subject.Length + body.Length) > m_MaxEmailSize) { - m_log.Error("[EMAIL] subject + body > 1024 Byte"); + m_log.Error("[EMAIL] subject + body larger than limit of " + m_MaxEmailSize + " bytes"); return; } @@ -345,10 +335,6 @@ namespace OpenSim.Region.CoreModules.Scripting.EmailModules // TODO FIX } } - - //DONE: Message as Second Life style - //20 second delay - AntiSpam System - for now only 10 seconds - DelayInSeconds(10); } /// diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index 5b5cab860c..5bff2e9368 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -106,6 +106,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api protected IUrlModule m_UrlModule = null; protected Dictionary m_userInfoCache = new Dictionary(); + protected int EMAIL_PAUSE_TIME = 20; // documented delay value for smtp. public void Initialize(IScriptEngine ScriptEngine, SceneObjectPart host, TaskInventoryItem item) { @@ -113,6 +114,18 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api m_host = host; m_item = item; + LoadLimits(); // read script limits from config. + + m_TransferModule = + m_ScriptEngine.World.RequestModuleInterface(); + m_UrlModule = m_ScriptEngine.World.RequestModuleInterface(); + + AsyncCommands = new AsyncCommandManager(ScriptEngine); + } + + /* load configuration items that affect script, object and run-time behavior. */ + private void LoadLimits() + { m_ScriptDelayFactor = m_ScriptEngine.Config.GetFloat("ScriptDelayFactor", 1.0f); m_ScriptDistanceFactor = @@ -125,12 +138,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api m_ScriptEngine.Config.GetInt("NotecardLineReadCharsMax", 255); if (m_notecardLineReadCharsMax > 65535) m_notecardLineReadCharsMax = 65535; - - m_TransferModule = - m_ScriptEngine.World.RequestModuleInterface(); - m_UrlModule = m_ScriptEngine.World.RequestModuleInterface(); - - AsyncCommands = new AsyncCommandManager(ScriptEngine); + // load limits for particular subsystems. + IConfig SMTPConfig; + if ((SMTPConfig = m_ScriptEngine.ConfigSource.Configs["SMTP"]) != null) { + // there's an smtp config, so load in the snooze time. + EMAIL_PAUSE_TIME = SMTPConfig.GetInt("email_pause_time", EMAIL_PAUSE_TIME); + } } public override Object InitializeLifetimeService() @@ -2877,6 +2890,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public virtual void llSleep(double sec) { +// m_log.Info("llSleep snoozing " + sec + "s."); m_host.AddScriptLPS(1); Thread.Sleep((int)(sec * 1000)); } @@ -3130,7 +3144,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api } emailModule.SendEmail(m_host.UUID, address, subject, message); - ScriptSleep(20000); + llSleep(EMAIL_PAUSE_TIME); } public void llGetNextEmail(string address, string subject) diff --git a/bin/OpenSim.ini.example b/bin/OpenSim.ini.example index 50366a675d..8e7e45989b 100755 --- a/bin/OpenSim.ini.example +++ b/bin/OpenSim.ini.example @@ -273,6 +273,12 @@ ;# {host_domain_header_from} {[Startup]emailmodule:DefaultEmailModule enabled:true} {From address to use in the sent email header?} {} 127.0.0.1 ; host_domain_header_from = "127.0.0.1" + ;# {email_pause_time} {[Startup]emailmodule:DefaultEmailModule enabled:true} {Period in seconds to delay after an email is sent.} {} 20 + ; email_pause_time = 20 + + ;# {email_max_size} {[Startup]emailmodule:DefaultEmailModule enabled:true} {Maximum total size of email in bytes.} {} 4096 + ; email_max_size = 4096 + ;# {SMTP_SERVER_HOSTNAME} {[Startup]emailmodule:DefaultEmailModule enabled:true} {SMTP server name?} {} 127.0.0.1 ; SMTP_SERVER_HOSTNAME = "127.0.0.1" @@ -285,7 +291,6 @@ ;# {SMTP_SERVER_PASSWORD} {[Startup]emailmodule:DefaultEmailModule enabled:true} {SMTP server password} {} ; SMTP_SERVER_PASSWORD = "" - [Network] ;; Configure the remote console user here. This will not actually be used ;; unless you use -console=rest at startup. @@ -677,7 +682,7 @@ ;; Sets the multiplier for the scripting delays ; ScriptDelayFactor = 1.0 - ;; The factor the 10 m distances llimits are multiplied by + ;; The factor the 10 m distances limits are multiplied by ; ScriptDistanceLimitFactor = 1.0 ;; Maximum length of notecard line read @@ -780,7 +785,7 @@ ;; groups service if the service is using these keys ; XmlRpcServiceReadKey = 1234 ; XmlRpcServiceWriteKey = 1234 - + [InterestManagement] ;# {UpdatePrioritizationScheme} {} {Update prioritization scheme?} {BestAvatarResponsiveness Time Distance SimpleAngularDistance FrontBack} BestAvatarResponsiveness ;; This section controls how state updates are prioritized for each client From 847127f83c4a6fbfb9be0ecef3904393e6968908 Mon Sep 17 00:00:00 2001 From: BlueWall Date: Mon, 14 May 2012 00:15:56 -0400 Subject: [PATCH 204/547] Oops - missed the config changes --- bin/OpenSim.ini.example | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/bin/OpenSim.ini.example b/bin/OpenSim.ini.example index 8e7e45989b..9b88816893 100755 --- a/bin/OpenSim.ini.example +++ b/bin/OpenSim.ini.example @@ -241,6 +241,14 @@ ;; server to send mail through. ; emailmodule = DefaultEmailModule + ;# {SpawnPointRouting} {} {Set routing method for Telehub Spawnpoints} {closest random sequential} closest + ;; SpawnPointRouting adjusts the landing for incoming avatars. + ;; "closest" will place the avatar at the SpawnPoint located in the closest + ;; available spot to the destination (typically map click/landmark). + ;; "random" will place the avatar on a randomly selected spawnpoint; + ;; "sequential" will place the avatar on the next sequential SpawnPoint + ; SpawnPointRouting = closest + [Estates] ; If these values are commented out then the user will be asked for estate details when required (this is the normal case). ; If these values are uncommented then they will be used to create a default estate as necessary. From fad557485c78e15380ec35c0dbcf8556a96d29f7 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Mon, 14 May 2012 18:06:48 +0100 Subject: [PATCH 205/547] Add more region information to some teleport related logging --- .../EntityTransfer/EntityTransferModule.cs | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs index cd588e5d86..9766a25da4 100644 --- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs +++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs @@ -53,7 +53,6 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer public const int DefaultMaxTransferDistance = 4095; public const bool EnableWaitForCallbackFromTeleportDestDefault = true; - /// /// The maximum distance, in standard region units (256m) that an agent is allowed to transfer. /// @@ -531,8 +530,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer { // Region doesn't take it m_log.WarnFormat( - "[ENTITY TRANSFER MODULE]: UpdateAgent failed on teleport of {0} to {1}. Returning avatar to source region.", - sp.Name, finalDestination.RegionName); + "[ENTITY TRANSFER MODULE]: UpdateAgent failed on teleport of {0} to {1} from {2}. Returning avatar to source region.", + sp.Name, finalDestination.RegionName, sp.Scene.RegionInfo.RegionName); Fail(sp, finalDestination, logout); return; @@ -564,8 +563,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer if (EnableWaitForCallbackFromTeleportDest && !WaitForCallback(sp.UUID)) { m_log.WarnFormat( - "[ENTITY TRANSFER MODULE]: Teleport of {0} to {1} failed due to no callback from destination region. Returning avatar to source region.", - sp.Name, finalDestination.RegionName); + "[ENTITY TRANSFER MODULE]: Teleport of {0} to {1} from {2} failed due to no callback from destination region. Returning avatar to source region.", + sp.Name, finalDestination.RegionName, sp.Scene.RegionInfo.RegionName); Fail(sp, finalDestination, logout); return; @@ -661,8 +660,10 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer protected virtual void SetCallbackURL(AgentData agent, RegionInfo region) { agent.CallbackURI = region.ServerURI + "agent/" + agent.AgentID.ToString() + "/" + region.RegionID.ToString() + "/release/"; - m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Set callback URL to {0}", agent.CallbackURI); + m_log.DebugFormat( + "[ENTITY TRANSFER MODULE]: Set release callback URL to {0} in {1}", + agent.CallbackURI, region.RegionName); } protected virtual void AgentHasMovedAway(ScenePresence sp, bool logout) @@ -2014,4 +2015,4 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer #endregion } -} +} \ No newline at end of file From c2aa3b90d9d367bcaeba93352ef6b0f513e663f7 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Mon, 14 May 2012 18:36:26 +0100 Subject: [PATCH 206/547] Set the agent in transit teleport flag at the first available opportunity (i.e. when IsInTransit() was being checked) to close down a race condition. On EntityTransferModule.DoTeleport() there was an IsInTransit() check to prevent multiple simultaneous teleport attempts. However, the SetInTransit() was only performed later on, which left a window in which multiple threads could pass the IsInTransit() check. This has been seen in the field and the results aren't pretty. This commit effectively combines the IsInTransit() and SetInTransit() checks so there is no such window. More failure cases are made to to call ResetInTransit() to adjust to this move. --- .../EntityTransfer/EntityTransferModule.cs | 54 ++++++++++++++----- 1 file changed, 40 insertions(+), 14 deletions(-) diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs index 9766a25da4..d0aead5a7c 100644 --- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs +++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs @@ -210,6 +210,9 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer sp.Name, sp.AbsolutePosition, sp.Scene.RegionInfo.RegionName, position, destinationRegionName, e.Message, e.StackTrace); + // Make sure that we clear the in-transit flag so that future teleport attempts don't always fail. + ResetFromTransit(sp.UUID); + sp.ControllingClient.SendTeleportFailed("Internal error"); } } @@ -384,7 +387,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer return; } - if (IsInTransit(sp.UUID)) // Avie is already on the way. Caller shouldn't do this. + if (!SetInTransit(sp.UUID)) // Avie is already on the way. Caller shouldn't do this. { m_log.DebugFormat( "[ENTITY TRANSFER MODULE]: Ignoring teleport request of {0} {1} to {2} ({3}) {4}/{5} - agent is already in transit.", @@ -432,8 +435,11 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer if (!m_aScene.SimulationService.QueryAccess(finalDestination, sp.ControllingClient.AgentId, Vector3.Zero, out version, out reason)) { sp.ControllingClient.SendTeleportFailed("Teleport failed: " + reason); + ResetFromTransit(sp.UUID); + return; } + m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Destination is running version {0}", version); sp.ControllingClient.SendTeleportStart(teleportFlags); @@ -473,13 +479,16 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer bool logout = false; if (!CreateAgent(sp, reg, finalDestination, agentCircuit, teleportFlags, out reason, out logout)) { - sp.ControllingClient.SendTeleportFailed(String.Format("Teleport refused: {0}", - reason)); + sp.ControllingClient.SendTeleportFailed( + String.Format("Teleport refused: {0}", reason)); + ResetFromTransit(sp.UUID); + return; } // OK, it got this agent. Let's close some child agents sp.CloseChildAgents(newRegionX, newRegionY); + IClientIPEndpoint ipepClient; if (NeedsNewAgent(sp.DrawDistance, oldRegionX, newRegionX, oldRegionY, newRegionY)) { @@ -516,8 +525,6 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer capsPath = finalDestination.ServerURI + CapsUtil.GetCapsSeedPath(agentCircuit.CapsPath); } - SetInTransit(sp.UUID); - // Let's send a full update of the agent. This is a synchronous call. AgentData agent = new AgentData(); sp.CopyTo(agent); @@ -1956,25 +1963,43 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer return count > 0; } - protected void SetInTransit(UUID id) + /// + /// Set that an agent is in the process of being teleported. + /// + /// The ID of the agent being teleported + /// true if the agent was not already in transit, false if it was + protected bool SetInTransit(UUID id) { lock (m_agentsInTransit) { if (!m_agentsInTransit.Contains(id)) + { m_agentsInTransit.Add(id); - } - } - - protected bool IsInTransit(UUID id) - { - lock (m_agentsInTransit) - { - if (m_agentsInTransit.Contains(id)) return true; + } } + return false; } + /// + /// Show whether the given agent is being teleported. + /// + /// true if the agent is in the process of being teleported, false otherwise. + /// The agent ID + protected bool IsInTransit(UUID id) + { + lock (m_agentsInTransit) + return m_agentsInTransit.Contains(id); + } + + /// + /// Set that an agent is no longer being teleported. + /// + /// + /// + /// true if the agent was flagged as being teleported when this method was called, false otherwise + /// protected bool ResetFromTransit(UUID id) { lock (m_agentsInTransit) @@ -1985,6 +2010,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer return true; } } + return false; } From deeac6931242f1bbb05f0ec36c31a147b32d4b26 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Mon, 14 May 2012 18:48:40 +0100 Subject: [PATCH 207/547] minor: comment out individual attachment transfer log messages for now --- OpenSim/Region/Framework/Scenes/Scene.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 2a2830f47d..2bf3638f6c 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -2576,10 +2576,10 @@ namespace OpenSim.Region.Framework.Scenes { SceneObjectGroup grp = sceneObject; - m_log.DebugFormat( - "[ATTACHMENT]: Received attachment {0}, inworld asset id {1}", grp.FromItemID, grp.UUID); - m_log.DebugFormat( - "[ATTACHMENT]: Attach to avatar {0} at position {1}", sp.UUID, grp.AbsolutePosition); +// m_log.DebugFormat( +// "[ATTACHMENT]: Received attachment {0}, inworld asset id {1}", grp.FromItemID, grp.UUID); +// m_log.DebugFormat( +// "[ATTACHMENT]: Attach to avatar {0} at position {1}", sp.UUID, grp.AbsolutePosition); RootPrim.RemFlag(PrimFlags.TemporaryOnRez); From af6c85308adced4ac4a51bf14bd2beb7f22c6555 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Mon, 14 May 2012 18:57:02 +0100 Subject: [PATCH 208/547] minor: add explanative comment to 'missing baked texture' logging commonly seen on inter-simulator teleports where avatar baked textures are not available from the asset service. --- .../Avatar/AvatarFactory/AvatarFactoryModule.cs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs b/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs index 0ed10d2864..705233c2d7 100644 --- a/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs @@ -371,11 +371,21 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory if (missingTexturesOnly) { if (m_scene.AssetService.Get(face.TextureID.ToString()) != null) + { continue; + } else + { + // On inter-simulator teleports, this occurs if baked textures are not being stored by the + // grid asset service (which means that they are not available to the new region and so have + // to be re-requested from the client). + // + // The only available core OpenSimulator behaviour right now + // is not to store these textures, temporarily or otherwise. m_log.DebugFormat( "[AVFACTORY]: Missing baked texture {0} ({1}) for {2}, requesting rebake.", face.TextureID, idx, sp.Name); + } } else { From d7fd9b159a7af813cfd6901a65e0ed43a6e1593d Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Mon, 14 May 2012 19:36:26 +0100 Subject: [PATCH 209/547] set executable bit for Ionic.Zip.dll for running OpenSimulator under cygwin --- bin/Ionic.Zip.dll | Bin 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 bin/Ionic.Zip.dll diff --git a/bin/Ionic.Zip.dll b/bin/Ionic.Zip.dll old mode 100644 new mode 100755 From 52a32878a9573681e3b56d0151c4a0903719eadf Mon Sep 17 00:00:00 2001 From: Oren Hurvitz Date: Thu, 3 May 2012 19:38:35 +0300 Subject: [PATCH 210/547] Save the Telehub and its Spawn Points in the OAR --- OpenSim/Framework/RegionSettings.cs | 29 ++++++++++++++- .../External/RegionSettingsSerializer.cs | 37 ++++++++++++++++++- .../Tests/RegionSettingsSerializerTests.cs | 8 ++++ .../World/Archiver/ArchiveReadRequest.cs | 25 ++++++++++++- .../ArchiveWriteRequestPreparation.cs | 2 +- .../World/Archiver/Tests/ArchiverTests.cs | 4 ++ 6 files changed, 100 insertions(+), 5 deletions(-) diff --git a/OpenSim/Framework/RegionSettings.cs b/OpenSim/Framework/RegionSettings.cs index 4ce3392057..47dbcecaeb 100644 --- a/OpenSim/Framework/RegionSettings.cs +++ b/OpenSim/Framework/RegionSettings.cs @@ -29,6 +29,7 @@ using System; using System.Collections.Generic; using System.IO; using OpenMetaverse; +using System.Runtime.Serialization; namespace OpenSim.Framework { @@ -71,6 +72,32 @@ namespace OpenSim.Framework return pos + offset; } + + /// + /// Returns a string representation of this SpawnPoint. + /// + /// + public override string ToString() + { + return string.Format("{0},{1},{2}", Yaw, Pitch, Distance); + } + + /// + /// Generate a SpawnPoint from a string + /// + /// + public static SpawnPoint Parse(string str) + { + string[] parts = str.Split(','); + if (parts.Length != 3) + throw new ArgumentException("Invalid string: " + str); + + SpawnPoint sp = new SpawnPoint(); + sp.Yaw = float.Parse(parts[0]); + sp.Pitch = float.Parse(parts[1]); + sp.Distance = float.Parse(parts[2]); + return sp; + } } public class RegionSettings @@ -456,7 +483,7 @@ namespace OpenSim.Framework } // Connected Telehub object - private UUID m_TelehubObject; + private UUID m_TelehubObject = UUID.Zero; public UUID TelehubObject { get diff --git a/OpenSim/Framework/Serialization/External/RegionSettingsSerializer.cs b/OpenSim/Framework/Serialization/External/RegionSettingsSerializer.cs index 931898ce10..f18435d308 100644 --- a/OpenSim/Framework/Serialization/External/RegionSettingsSerializer.cs +++ b/OpenSim/Framework/Serialization/External/RegionSettingsSerializer.cs @@ -30,6 +30,8 @@ using System.Text; using System.Xml; using OpenMetaverse; using OpenSim.Framework; +using log4net; +using System.Reflection; namespace OpenSim.Framework.Serialization.External { @@ -187,7 +189,29 @@ namespace OpenSim.Framework.Serialization.External break; } } - + + xtr.ReadEndElement(); + + if (xtr.IsStartElement("Telehub")) + { + xtr.ReadStartElement("Telehub"); + + while (xtr.Read() && xtr.NodeType != XmlNodeType.EndElement) + { + switch (xtr.Name) + { + case "TelehubObject": + settings.TelehubObject = UUID.Parse(xtr.ReadElementContentAsString()); + break; + case "SpawnPoint": + string str = xtr.ReadElementContentAsString(); + SpawnPoint sp = SpawnPoint.Parse(str); + settings.AddSpawnPoint(sp); + break; + } + } + } + xtr.Close(); sr.Close(); @@ -243,7 +267,16 @@ namespace OpenSim.Framework.Serialization.External xtw.WriteElementString("SunPosition", settings.SunPosition.ToString()); // Note: 'SunVector' isn't saved because this value is owned by the Sun Module, which // calculates it automatically according to the date and other factors. - xtw.WriteEndElement(); + xtw.WriteEndElement(); + + xtw.WriteStartElement("Telehub"); + if (settings.TelehubObject != UUID.Zero) + { + xtw.WriteElementString("TelehubObject", settings.TelehubObject.ToString()); + foreach (SpawnPoint sp in settings.SpawnPoints()) + xtw.WriteElementString("SpawnPoint", sp.ToString()); + } + xtw.WriteEndElement(); xtw.WriteEndElement(); diff --git a/OpenSim/Framework/Serialization/Tests/RegionSettingsSerializerTests.cs b/OpenSim/Framework/Serialization/Tests/RegionSettingsSerializerTests.cs index a61e4af65d..09b6f6ddad 100644 --- a/OpenSim/Framework/Serialization/Tests/RegionSettingsSerializerTests.cs +++ b/OpenSim/Framework/Serialization/Tests/RegionSettingsSerializerTests.cs @@ -78,6 +78,10 @@ namespace OpenSim.Framework.Serialization.Tests true 12 + + 00000000-0000-0000-0000-111111111111 + 1,-2,0.33 + "; private RegionSettings m_rs; @@ -116,6 +120,8 @@ namespace OpenSim.Framework.Serialization.Tests m_rs.TerrainTexture4 = UUID.Parse("00000000-0000-0000-0000-000000000080"); m_rs.UseEstateSun = true; m_rs.WaterHeight = 23; + m_rs.TelehubObject = UUID.Parse("00000000-0000-0000-0000-111111111111"); + m_rs.AddSpawnPoint(SpawnPoint.Parse("1,-2,0.33")); } [Test] @@ -129,6 +135,8 @@ namespace OpenSim.Framework.Serialization.Tests Assert.That(deserRs.TerrainTexture2, Is.EqualTo(m_rs.TerrainTexture2)); Assert.That(deserRs.DisablePhysics, Is.EqualTo(m_rs.DisablePhysics)); Assert.That(deserRs.TerrainLowerLimit, Is.EqualTo(m_rs.TerrainLowerLimit)); + Assert.That(deserRs.TelehubObject, Is.EqualTo(m_rs.TelehubObject)); + Assert.That(deserRs.SpawnPoints()[0].ToString(), Is.EqualTo(m_rs.SpawnPoints()[0].ToString())); } } } diff --git a/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs b/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs index a6dbaba7d7..bf0ff7516b 100644 --- a/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs +++ b/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs @@ -245,6 +245,8 @@ namespace OpenSim.Region.CoreModules.World.Archiver // Reload serialized prims m_log.InfoFormat("[ARCHIVER]: Loading {0} scene objects. Please wait.", serialisedSceneObjects.Count); + UUID oldTelehubUUID = m_scene.RegionInfo.RegionSettings.TelehubObject; + IRegionSerialiserModule serialiser = m_scene.RequestModuleInterface(); int sceneObjectsLoadedCount = 0; @@ -266,11 +268,21 @@ namespace OpenSim.Region.CoreModules.World.Archiver SceneObjectGroup sceneObject = serialiser.DeserializeGroupFromXml2(serialisedSceneObject); + bool isTelehub = (sceneObject.UUID == oldTelehubUUID); + // For now, give all incoming scene objects new uuids. This will allow scenes to be cloned // on the same region server and multiple examples a single object archive to be imported // to the same scene (when this is possible). sceneObject.ResetIDs(); + if (isTelehub) + { + // Change the Telehub Object to the new UUID + m_scene.RegionInfo.RegionSettings.TelehubObject = sceneObject.UUID; + m_scene.RegionInfo.RegionSettings.Save(); + oldTelehubUUID = UUID.Zero; + } + // Try to retain the original creator/owner/lastowner if their uuid is present on this grid // or creator data is present. Otherwise, use the estate owner instead. foreach (SceneObjectPart part in sceneObject.Parts) @@ -329,7 +341,14 @@ namespace OpenSim.Region.CoreModules.World.Archiver int ignoredObjects = serialisedSceneObjects.Count - sceneObjectsLoadedCount; if (ignoredObjects > 0) - m_log.WarnFormat("[ARCHIVER]: Ignored {0} scene objects that already existed in the scene", ignoredObjects); + m_log.WarnFormat("[ARCHIVER]: Ignored {0} scene objects that already existed in the scene", ignoredObjects); + + if (oldTelehubUUID != UUID.Zero) + { + m_log.WarnFormat("Telehub object not found: {0}", oldTelehubUUID); + m_scene.RegionInfo.RegionSettings.TelehubObject = UUID.Zero; + m_scene.RegionInfo.RegionSettings.ClearSpawnPoints(); + } } /// @@ -505,6 +524,10 @@ namespace OpenSim.Region.CoreModules.World.Archiver currentRegionSettings.TerrainTexture4 = loadedRegionSettings.TerrainTexture4; currentRegionSettings.UseEstateSun = loadedRegionSettings.UseEstateSun; currentRegionSettings.WaterHeight = loadedRegionSettings.WaterHeight; + currentRegionSettings.TelehubObject = loadedRegionSettings.TelehubObject; + currentRegionSettings.ClearSpawnPoints(); + foreach (SpawnPoint sp in loadedRegionSettings.SpawnPoints()) + currentRegionSettings.AddSpawnPoint(sp); currentRegionSettings.Save(); diff --git a/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestPreparation.cs b/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestPreparation.cs index eabe46e936..5679ad5dcb 100644 --- a/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestPreparation.cs +++ b/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestPreparation.cs @@ -328,7 +328,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver /// public string CreateControlFile(Dictionary options) { - int majorVersion = MAX_MAJOR_VERSION, minorVersion = 7; + int majorVersion = MAX_MAJOR_VERSION, minorVersion = 8; // // if (options.ContainsKey("version")) // { diff --git a/OpenSim/Region/CoreModules/World/Archiver/Tests/ArchiverTests.cs b/OpenSim/Region/CoreModules/World/Archiver/Tests/ArchiverTests.cs index 053c6f59d4..394ca27123 100644 --- a/OpenSim/Region/CoreModules/World/Archiver/Tests/ArchiverTests.cs +++ b/OpenSim/Region/CoreModules/World/Archiver/Tests/ArchiverTests.cs @@ -534,6 +534,8 @@ namespace OpenSim.Region.CoreModules.World.Archiver.Tests rs.TerrainTexture4 = UUID.Parse("00000000-0000-0000-0000-000000000080"); rs.UseEstateSun = true; rs.WaterHeight = 23; + rs.TelehubObject = UUID.Parse("00000000-0000-0000-0000-111111111111"); + rs.AddSpawnPoint(SpawnPoint.Parse("1,-2,0.33")); tar.WriteFile(ArchiveConstants.SETTINGS_PATH + "region1.xml", RegionSettingsSerializer.Serialize(rs)); @@ -580,6 +582,8 @@ namespace OpenSim.Region.CoreModules.World.Archiver.Tests Assert.That(loadedRs.TerrainTexture4, Is.EqualTo(UUID.Parse("00000000-0000-0000-0000-000000000080"))); Assert.That(loadedRs.UseEstateSun, Is.True); Assert.That(loadedRs.WaterHeight, Is.EqualTo(23)); + Assert.AreEqual(UUID.Zero, loadedRs.TelehubObject); // because no object was found with the original UUID + Assert.AreEqual(0, loadedRs.SpawnPoints().Count); } /// From e7819ce909e7d0bd7494db9af8a8d5dc4212a6cb Mon Sep 17 00:00:00 2001 From: Melanie Date: Tue, 15 May 2012 01:02:38 +0100 Subject: [PATCH 211/547] Port Avination's collision fixes to core. --- OpenSim/Data/Tests/RegionTests.cs | 1 - .../Framework/Scenes/SceneObjectGroup.cs | 11 - .../Framework/Scenes/SceneObjectPart.cs | 688 +++++------------- .../Serialization/SceneObjectSerializer.cs | 7 + .../Shared/Api/Implementation/LSL_Api.cs | 21 +- 5 files changed, 202 insertions(+), 526 deletions(-) diff --git a/OpenSim/Data/Tests/RegionTests.cs b/OpenSim/Data/Tests/RegionTests.cs index 1f03ec5c20..474609bb08 100644 --- a/OpenSim/Data/Tests/RegionTests.cs +++ b/OpenSim/Data/Tests/RegionTests.cs @@ -632,7 +632,6 @@ namespace OpenSim.Data.Tests .IgnoreProperty(x=>x.RegionUUID) .IgnoreProperty(x=>x.Scene) .IgnoreProperty(x=>x.Parts) - .IgnoreProperty(x=>x.PassCollision) .IgnoreProperty(x=>x.RootPart)); } diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs index 05bea8dd88..20d7a01bd7 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs @@ -505,17 +505,6 @@ namespace OpenSim.Region.Framework.Scenes get { return true; } } - private bool m_passCollision; - public bool PassCollision - { - get { return m_passCollision; } - set - { - m_passCollision = value; - HasGroupChanged = true; - } - } - public bool IsSelected { get { return m_isSelected; } diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index f911ef87a7..35986cf5b2 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs @@ -254,7 +254,8 @@ namespace OpenSim.Region.Framework.Scenes private readonly Stack m_undo = new Stack(5); private readonly Stack m_redo = new Stack(5); - private bool m_passTouches; + private bool m_passTouches = false; + private bool m_passCollisions = false; protected Vector3 m_acceleration; protected Vector3 m_angularVelocity; @@ -541,6 +542,7 @@ namespace OpenSim.Region.Framework.Scenes } } + [XmlIgnore] public bool PassTouches { get { return m_passTouches; } @@ -553,8 +555,18 @@ namespace OpenSim.Region.Framework.Scenes } } - - + public bool PassCollisions + { + get { return m_passCollisions; } + set + { + m_passCollisions = value; + + if (ParentGroup != null) + ParentGroup.HasGroupChanged = true; + } + } + public Dictionary CollisionFilter { get { return m_CollisionFilter; } @@ -2000,12 +2012,155 @@ namespace OpenSim.Region.Framework.Scenes { } + private bool CollisionFilteredOut(SceneObjectPart dest, UUID objectID, string objectName) + { + if(dest.CollisionFilter.Count == 0) + return false; + + if (dest.CollisionFilter.ContainsValue(objectID.ToString()) || + dest.CollisionFilter.ContainsValue(objectID.ToString() + objectName) || + dest.CollisionFilter.ContainsValue(UUID.Zero.ToString() + objectName)) + { + if (dest.CollisionFilter.ContainsKey(1)) + return false; + return true; + } + + if (dest.CollisionFilter.ContainsKey(1)) + return true; + + return false; + } + + private DetectedObject CreateDetObject(SceneObjectPart obj) + { + DetectedObject detobj = new DetectedObject(); + detobj.keyUUID = obj.UUID; + detobj.nameStr = obj.Name; + detobj.ownerUUID = obj.OwnerID; + detobj.posVector = obj.AbsolutePosition; + detobj.rotQuat = obj.GetWorldRotation(); + detobj.velVector = obj.Velocity; + detobj.colliderType = 0; + detobj.groupUUID = obj.GroupID; + + return detobj; + } + + private DetectedObject CreateDetObject(ScenePresence av) + { + DetectedObject detobj = new DetectedObject(); + detobj.keyUUID = av.UUID; + detobj.nameStr = av.ControllingClient.Name; + detobj.ownerUUID = av.UUID; + detobj.posVector = av.AbsolutePosition; + detobj.rotQuat = av.Rotation; + detobj.velVector = av.Velocity; + detobj.colliderType = 0; + detobj.groupUUID = av.ControllingClient.ActiveGroupId; + + return detobj; + } + + private DetectedObject CreateDetObjectForGround() + { + DetectedObject detobj = new DetectedObject(); + detobj.keyUUID = UUID.Zero; + detobj.nameStr = ""; + detobj.ownerUUID = UUID.Zero; + detobj.posVector = ParentGroup.RootPart.AbsolutePosition; + detobj.rotQuat = Quaternion.Identity; + detobj.velVector = Vector3.Zero; + detobj.colliderType = 0; + detobj.groupUUID = UUID.Zero; + + return detobj; + } + + private ColliderArgs CreateColliderArgs(SceneObjectPart dest, List colliders) + { + ColliderArgs colliderArgs = new ColliderArgs(); + List colliding = new List(); + foreach (uint localId in colliders) + { + if (localId == 0) + continue; + + SceneObjectPart obj = ParentGroup.Scene.GetSceneObjectPart(localId); + if (obj != null) + { + if (!dest.CollisionFilteredOut(this, obj.UUID, obj.Name)) + colliding.Add(CreateDetObject(obj)); + } + else + { + ScenePresence av = ParentGroup.Scene.GetScenePresence(localId); + if (av != null && (!av.IsChildAgent)) + { + if (!dest.CollisionFilteredOut(this, av.UUID, av.Name)) + colliding.Add(CreateDetObject(av)); + } + } + } + + colliderArgs.Colliders = colliding; + + return colliderArgs; + } + + private delegate void ScriptCollidingNotification(uint localID, ColliderArgs message); + + private void SendCollisionEvent(scriptEvents ev, List colliders, ScriptCollidingNotification notify) + { + bool sendToRoot = false; + ColliderArgs CollidingMessage; + + if (colliders.Count > 0) + { + if ((ScriptEvents & ev) != 0) + { + CollidingMessage = CreateColliderArgs(this, colliders); + + if (CollidingMessage.Colliders.Count > 0) + notify(LocalId, CollidingMessage); + + if (PassCollisions) + sendToRoot = true; + } + else + { + if ((ParentGroup.RootPart.ScriptEvents & ev) != 0) + sendToRoot = true; + } + if (sendToRoot && ParentGroup.RootPart != this) + { + CollidingMessage = CreateColliderArgs(ParentGroup.RootPart, colliders); + if (CollidingMessage.Colliders.Count > 0) + notify(ParentGroup.RootPart.LocalId, CollidingMessage); + } + } + } + + private void SendLandCollisionEvent(scriptEvents ev, ScriptCollidingNotification notify) + { + if ((ParentGroup.RootPart.ScriptEvents & ev) != 0) + { + ColliderArgs LandCollidingMessage = new ColliderArgs(); + List colliding = new List(); + + colliding.Add(CreateDetObjectForGround()); + LandCollidingMessage.Colliders = colliding; + + notify(LocalId, LandCollidingMessage); + } + } + public void PhysicsCollision(EventArgs e) { -// m_log.DebugFormat("Invoking PhysicsCollision on {0} {1} {2}", Name, LocalId, UUID); + if (ParentGroup.Scene == null || ParentGroup.IsDeleted) + return; // single threaded here - CollisionEventUpdate a = (CollisionEventUpdate)e; Dictionary collissionswith = a.m_objCollisionList; List thisHitColliders = new List(); @@ -2018,528 +2173,41 @@ namespace OpenSim.Region.Framework.Scenes { thisHitColliders.Add(localid); if (!m_lastColliders.Contains(localid)) - { startedColliders.Add(localid); - } - //m_log.Debug("[OBJECT]: Collided with:" + localid.ToString() + " at depth of: " + collissionswith[localid].ToString()); } // calculate things that ended colliding foreach (uint localID in m_lastColliders) { if (!thisHitColliders.Contains(localID)) - { endedColliders.Add(localID); - } } //add the items that started colliding this time to the last colliders list. foreach (uint localID in startedColliders) - { m_lastColliders.Add(localID); - } + // remove things that ended colliding from the last colliders list foreach (uint localID in endedColliders) - { m_lastColliders.Remove(localID); - } - - if (ParentGroup.IsDeleted) - return; // play the sound. if (startedColliders.Count > 0 && CollisionSound != UUID.Zero && CollisionSoundVolume > 0.0f) - { SendSound(CollisionSound.ToString(), CollisionSoundVolume, true, (byte)0, 0, false, false); - } - if ((ParentGroup.RootPart.ScriptEvents & scriptEvents.collision_start) != 0) + SendCollisionEvent(scriptEvents.collision_start, startedColliders, ParentGroup.Scene.EventManager.TriggerScriptCollidingStart); + SendCollisionEvent(scriptEvents.collision , m_lastColliders , ParentGroup.Scene.EventManager.TriggerScriptColliding); + SendCollisionEvent(scriptEvents.collision_end , endedColliders , ParentGroup.Scene.EventManager.TriggerScriptCollidingEnd); + + if (startedColliders.Contains(0)) { - // do event notification - if (startedColliders.Count > 0) - { - ColliderArgs StartCollidingMessage = new ColliderArgs(); - List colliding = new List(); - foreach (uint localId in startedColliders) - { - if (localId == 0) - continue; - - if (ParentGroup.Scene == null) - return; - - SceneObjectPart obj = ParentGroup.Scene.GetSceneObjectPart(localId); - string data = ""; - if (obj != null) - { - if (ParentGroup.RootPart.CollisionFilter.ContainsValue(obj.UUID.ToString()) - || ParentGroup.RootPart.CollisionFilter.ContainsValue(obj.Name)) - { - bool found = ParentGroup.RootPart.CollisionFilter.TryGetValue(1, out data); - //If it is 1, it is to accept ONLY collisions from this object - if (found) - { - DetectedObject detobj = new DetectedObject(); - detobj.keyUUID = obj.UUID; - detobj.nameStr = obj.Name; - detobj.ownerUUID = obj.OwnerID; - detobj.posVector = obj.AbsolutePosition; - detobj.rotQuat = obj.GetWorldRotation(); - detobj.velVector = obj.Velocity; - detobj.colliderType = 0; - detobj.groupUUID = obj.GroupID; - colliding.Add(detobj); - } - //If it is 0, it is to not accept collisions from this object - else - { - } - } - else - { - bool found = ParentGroup.RootPart.CollisionFilter.TryGetValue(1, out data); - //If it is 1, it is to accept ONLY collisions from this object, so this other object will not work - if (!found) - { - DetectedObject detobj = new DetectedObject(); - detobj.keyUUID = obj.UUID; - detobj.nameStr = obj.Name; - detobj.ownerUUID = obj.OwnerID; - detobj.posVector = obj.AbsolutePosition; - detobj.rotQuat = obj.GetWorldRotation(); - detobj.velVector = obj.Velocity; - detobj.colliderType = 0; - detobj.groupUUID = obj.GroupID; - colliding.Add(detobj); - } - } - } - else - { - ParentGroup.Scene.ForEachRootScenePresence(delegate(ScenePresence av) - { - if (av.LocalId == localId) - { - if (ParentGroup.RootPart.CollisionFilter.ContainsValue(av.UUID.ToString()) - || ParentGroup.RootPart.CollisionFilter.ContainsValue(av.Name)) - { - bool found = ParentGroup.RootPart.CollisionFilter.TryGetValue(1, out data); - //If it is 1, it is to accept ONLY collisions from this avatar - if (found) - { - DetectedObject detobj = new DetectedObject(); - detobj.keyUUID = av.UUID; - detobj.nameStr = av.ControllingClient.Name; - detobj.ownerUUID = av.UUID; - detobj.posVector = av.AbsolutePosition; - detobj.rotQuat = av.Rotation; - detobj.velVector = av.Velocity; - detobj.colliderType = 0; - detobj.groupUUID = av.ControllingClient.ActiveGroupId; - colliding.Add(detobj); - } - //If it is 0, it is to not accept collisions from this avatar - else - { - } - } - else - { - bool found = ParentGroup.RootPart.CollisionFilter.TryGetValue(1, out data); - //If it is 1, it is to accept ONLY collisions from this avatar, so this other avatar will not work - if (!found) - { - DetectedObject detobj = new DetectedObject(); - detobj.keyUUID = av.UUID; - detobj.nameStr = av.ControllingClient.Name; - detobj.ownerUUID = av.UUID; - detobj.posVector = av.AbsolutePosition; - detobj.rotQuat = av.Rotation; - detobj.velVector = av.Velocity; - detobj.colliderType = 0; - detobj.groupUUID = av.ControllingClient.ActiveGroupId; - colliding.Add(detobj); - } - } - - } - }); - } - } - - if (colliding.Count > 0) - { - StartCollidingMessage.Colliders = colliding; - - if (ParentGroup.Scene == null) - return; - -// if (m_parentGroup.PassCollision == true) -// { -// //TODO: Add pass to root prim! -// } - - ParentGroup.Scene.EventManager.TriggerScriptCollidingStart(LocalId, StartCollidingMessage); - } - } - } - - if ((ParentGroup.RootPart.ScriptEvents & scriptEvents.collision) != 0) - { - if (m_lastColliders.Count > 0) - { - ColliderArgs CollidingMessage = new ColliderArgs(); - List colliding = new List(); - foreach (uint localId in m_lastColliders) - { - // always running this check because if the user deletes the object it would return a null reference. - if (localId == 0) - continue; - - if (ParentGroup.Scene == null) - return; - - SceneObjectPart obj = ParentGroup.Scene.GetSceneObjectPart(localId); - string data = ""; - if (obj != null) - { - if (ParentGroup.RootPart.CollisionFilter.ContainsValue(obj.UUID.ToString()) - || ParentGroup.RootPart.CollisionFilter.ContainsValue(obj.Name)) - { - bool found = ParentGroup.RootPart.CollisionFilter.TryGetValue(1,out data); - //If it is 1, it is to accept ONLY collisions from this object - if (found) - { - DetectedObject detobj = new DetectedObject(); - detobj.keyUUID = obj.UUID; - detobj.nameStr = obj.Name; - detobj.ownerUUID = obj.OwnerID; - detobj.posVector = obj.AbsolutePosition; - detobj.rotQuat = obj.GetWorldRotation(); - detobj.velVector = obj.Velocity; - detobj.colliderType = 0; - detobj.groupUUID = obj.GroupID; - colliding.Add(detobj); - } - //If it is 0, it is to not accept collisions from this object - else - { - } - } - else - { - bool found = ParentGroup.RootPart.CollisionFilter.TryGetValue(1,out data); - //If it is 1, it is to accept ONLY collisions from this object, so this other object will not work - if (!found) - { - DetectedObject detobj = new DetectedObject(); - detobj.keyUUID = obj.UUID; - detobj.nameStr = obj.Name; - detobj.ownerUUID = obj.OwnerID; - detobj.posVector = obj.AbsolutePosition; - detobj.rotQuat = obj.GetWorldRotation(); - detobj.velVector = obj.Velocity; - detobj.colliderType = 0; - detobj.groupUUID = obj.GroupID; - colliding.Add(detobj); - } - } - } - else - { - ParentGroup.Scene.ForEachRootScenePresence(delegate(ScenePresence av) - { - if (av.LocalId == localId) - { - if (ParentGroup.RootPart.CollisionFilter.ContainsValue(av.UUID.ToString()) - || ParentGroup.RootPart.CollisionFilter.ContainsValue(av.Name)) - { - bool found = ParentGroup.RootPart.CollisionFilter.TryGetValue(1, out data); - //If it is 1, it is to accept ONLY collisions from this avatar - if (found) - { - DetectedObject detobj = new DetectedObject(); - detobj.keyUUID = av.UUID; - detobj.nameStr = av.ControllingClient.Name; - detobj.ownerUUID = av.UUID; - detobj.posVector = av.AbsolutePosition; - detobj.rotQuat = av.Rotation; - detobj.velVector = av.Velocity; - detobj.colliderType = 0; - detobj.groupUUID = av.ControllingClient.ActiveGroupId; - colliding.Add(detobj); - } - //If it is 0, it is to not accept collisions from this avatar - else - { - } - } - else - { - bool found = ParentGroup.RootPart.CollisionFilter.TryGetValue(1, out data); - //If it is 1, it is to accept ONLY collisions from this avatar, so this other avatar will not work - if (!found) - { - DetectedObject detobj = new DetectedObject(); - detobj.keyUUID = av.UUID; - detobj.nameStr = av.ControllingClient.Name; - detobj.ownerUUID = av.UUID; - detobj.posVector = av.AbsolutePosition; - detobj.rotQuat = av.Rotation; - detobj.velVector = av.Velocity; - detobj.colliderType = 0; - detobj.groupUUID = av.ControllingClient.ActiveGroupId; - colliding.Add(detobj); - } - } - - } - }); - } - } - if (colliding.Count > 0) - { - CollidingMessage.Colliders = colliding; - - if (ParentGroup.Scene == null) - return; - - ParentGroup.Scene.EventManager.TriggerScriptColliding(LocalId, CollidingMessage); - } - } - } - - if ((ParentGroup.RootPart.ScriptEvents & scriptEvents.collision_end) != 0) - { - if (endedColliders.Count > 0) - { - ColliderArgs EndCollidingMessage = new ColliderArgs(); - List colliding = new List(); - foreach (uint localId in endedColliders) - { - if (localId == 0) - continue; - - if (ParentGroup.Scene == null) - return; - - SceneObjectPart obj = ParentGroup.Scene.GetSceneObjectPart(localId); - string data = ""; - if (obj != null) - { - if (ParentGroup.RootPart.CollisionFilter.ContainsValue(obj.UUID.ToString()) || ParentGroup.RootPart.CollisionFilter.ContainsValue(obj.Name)) - { - bool found = ParentGroup.RootPart.CollisionFilter.TryGetValue(1,out data); - //If it is 1, it is to accept ONLY collisions from this object - if (found) - { - DetectedObject detobj = new DetectedObject(); - detobj.keyUUID = obj.UUID; - detobj.nameStr = obj.Name; - detobj.ownerUUID = obj.OwnerID; - detobj.posVector = obj.AbsolutePosition; - detobj.rotQuat = obj.GetWorldRotation(); - detobj.velVector = obj.Velocity; - detobj.colliderType = 0; - detobj.groupUUID = obj.GroupID; - colliding.Add(detobj); - } - //If it is 0, it is to not accept collisions from this object - else - { - } - } - else - { - bool found = ParentGroup.RootPart.CollisionFilter.TryGetValue(1,out data); - //If it is 1, it is to accept ONLY collisions from this object, so this other object will not work - if (!found) - { - DetectedObject detobj = new DetectedObject(); - detobj.keyUUID = obj.UUID; - detobj.nameStr = obj.Name; - detobj.ownerUUID = obj.OwnerID; - detobj.posVector = obj.AbsolutePosition; - detobj.rotQuat = obj.GetWorldRotation(); - detobj.velVector = obj.Velocity; - detobj.colliderType = 0; - detobj.groupUUID = obj.GroupID; - colliding.Add(detobj); - } - } - } - else - { - ParentGroup.Scene.ForEachRootScenePresence(delegate(ScenePresence av) - { - if (av.LocalId == localId) - { - if (ParentGroup.RootPart.CollisionFilter.ContainsValue(av.UUID.ToString()) - || ParentGroup.RootPart.CollisionFilter.ContainsValue(av.Name)) - { - bool found = ParentGroup.RootPart.CollisionFilter.TryGetValue(1, out data); - //If it is 1, it is to accept ONLY collisions from this avatar - if (found) - { - DetectedObject detobj = new DetectedObject(); - detobj.keyUUID = av.UUID; - detobj.nameStr = av.ControllingClient.Name; - detobj.ownerUUID = av.UUID; - detobj.posVector = av.AbsolutePosition; - detobj.rotQuat = av.Rotation; - detobj.velVector = av.Velocity; - detobj.colliderType = 0; - detobj.groupUUID = av.ControllingClient.ActiveGroupId; - colliding.Add(detobj); - } - //If it is 0, it is to not accept collisions from this avatar - else - { - } - } - else - { - bool found = ParentGroup.RootPart.CollisionFilter.TryGetValue(1, out data); - //If it is 1, it is to accept ONLY collisions from this avatar, so this other avatar will not work - if (!found) - { - DetectedObject detobj = new DetectedObject(); - detobj.keyUUID = av.UUID; - detobj.nameStr = av.ControllingClient.Name; - detobj.ownerUUID = av.UUID; - detobj.posVector = av.AbsolutePosition; - detobj.rotQuat = av.Rotation; - detobj.velVector = av.Velocity; - detobj.colliderType = 0; - detobj.groupUUID = av.ControllingClient.ActiveGroupId; - colliding.Add(detobj); - } - } - - } - }); - } - } - - if (colliding.Count > 0) - { - EndCollidingMessage.Colliders = colliding; - - if (ParentGroup.Scene == null) - return; - - ParentGroup.Scene.EventManager.TriggerScriptCollidingEnd(LocalId, EndCollidingMessage); - } - } - } - - if ((ParentGroup.RootPart.ScriptEvents & scriptEvents.land_collision_start) != 0) - { - if (startedColliders.Count > 0) - { - ColliderArgs LandStartCollidingMessage = new ColliderArgs(); - List colliding = new List(); - foreach (uint localId in startedColliders) - { - if (localId == 0) - { - //Hope that all is left is ground! - DetectedObject detobj = new DetectedObject(); - detobj.keyUUID = UUID.Zero; - detobj.nameStr = ""; - detobj.ownerUUID = UUID.Zero; - detobj.posVector = ParentGroup.RootPart.AbsolutePosition; - detobj.rotQuat = Quaternion.Identity; - detobj.velVector = Vector3.Zero; - detobj.colliderType = 0; - detobj.groupUUID = UUID.Zero; - colliding.Add(detobj); - } - } - - if (colliding.Count > 0) - { - LandStartCollidingMessage.Colliders = colliding; - - if (ParentGroup.Scene == null) - return; - - ParentGroup.Scene.EventManager.TriggerScriptLandCollidingStart(LocalId, LandStartCollidingMessage); - } - } - } - - if ((ParentGroup.RootPart.ScriptEvents & scriptEvents.land_collision) != 0) - { - if (m_lastColliders.Count > 0) - { - ColliderArgs LandCollidingMessage = new ColliderArgs(); - List colliding = new List(); - foreach (uint localId in startedColliders) - { - if (localId == 0) - { - //Hope that all is left is ground! - DetectedObject detobj = new DetectedObject(); - detobj.keyUUID = UUID.Zero; - detobj.nameStr = ""; - detobj.ownerUUID = UUID.Zero; - detobj.posVector = ParentGroup.RootPart.AbsolutePosition; - detobj.rotQuat = Quaternion.Identity; - detobj.velVector = Vector3.Zero; - detobj.colliderType = 0; - detobj.groupUUID = UUID.Zero; - colliding.Add(detobj); - } - } - - if (colliding.Count > 0) - { - LandCollidingMessage.Colliders = colliding; - - if (ParentGroup.Scene == null) - return; - - ParentGroup.Scene.EventManager.TriggerScriptLandColliding(LocalId, LandCollidingMessage); - } - } - } - - if ((ParentGroup.RootPart.ScriptEvents & scriptEvents.land_collision_end) != 0) - { - if (endedColliders.Count > 0) - { - ColliderArgs LandEndCollidingMessage = new ColliderArgs(); - List colliding = new List(); - foreach (uint localId in startedColliders) - { - if (localId == 0) - { - //Hope that all is left is ground! - DetectedObject detobj = new DetectedObject(); - detobj.keyUUID = UUID.Zero; - detobj.nameStr = ""; - detobj.ownerUUID = UUID.Zero; - detobj.posVector = ParentGroup.RootPart.AbsolutePosition; - detobj.rotQuat = Quaternion.Identity; - detobj.velVector = Vector3.Zero; - detobj.colliderType = 0; - detobj.groupUUID = UUID.Zero; - colliding.Add(detobj); - } - } - - if (colliding.Count > 0) - { - LandEndCollidingMessage.Colliders = colliding; - - if (ParentGroup.Scene == null) - return; - - ParentGroup.Scene.EventManager.TriggerScriptLandCollidingEnd(LocalId, LandEndCollidingMessage); - } - } + if (m_lastColliders.Contains(0)) + SendLandCollisionEvent(scriptEvents.land_collision, ParentGroup.Scene.EventManager.TriggerScriptLandColliding); + else + SendLandCollisionEvent(scriptEvents.land_collision_start, ParentGroup.Scene.EventManager.TriggerScriptLandCollidingStart); } + if (endedColliders.Contains(0)) + SendLandCollisionEvent(scriptEvents.land_collision_end, ParentGroup.Scene.EventManager.TriggerScriptLandCollidingEnd); } public void PhysicsOutOfBounds(Vector3 pos) @@ -4328,6 +3996,12 @@ namespace OpenSim.Region.Framework.Scenes ((AggregateScriptEvents & scriptEvents.land_collision_start) != 0) || ((AggregateScriptEvents & scriptEvents.land_collision) != 0) || ((AggregateScriptEvents & scriptEvents.land_collision_end) != 0) || + ((ParentGroup.RootPart.AggregateScriptEvents & scriptEvents.collision) != 0) || + ((ParentGroup.RootPart.AggregateScriptEvents & scriptEvents.collision_end) != 0) || + ((ParentGroup.RootPart.AggregateScriptEvents & scriptEvents.collision_start) != 0) || + ((ParentGroup.RootPart.AggregateScriptEvents & scriptEvents.land_collision_start) != 0) || + ((ParentGroup.RootPart.AggregateScriptEvents & scriptEvents.land_collision) != 0) || + ((ParentGroup.RootPart.AggregateScriptEvents & scriptEvents.land_collision_end) != 0) || (CollisionSound != UUID.Zero) ) { @@ -4652,6 +4326,12 @@ namespace OpenSim.Region.Framework.Scenes ((AggregateScriptEvents & scriptEvents.land_collision_start) != 0) || ((AggregateScriptEvents & scriptEvents.land_collision) != 0) || ((AggregateScriptEvents & scriptEvents.land_collision_end) != 0) || + ((ParentGroup.RootPart.AggregateScriptEvents & scriptEvents.collision) != 0) || + ((ParentGroup.RootPart.AggregateScriptEvents & scriptEvents.collision_end) != 0) || + ((ParentGroup.RootPart.AggregateScriptEvents & scriptEvents.collision_start) != 0) || + ((ParentGroup.RootPart.AggregateScriptEvents & scriptEvents.land_collision_start) != 0) || + ((ParentGroup.RootPart.AggregateScriptEvents & scriptEvents.land_collision) != 0) || + ((ParentGroup.RootPart.AggregateScriptEvents & scriptEvents.land_collision_end) != 0) || (CollisionSound != UUID.Zero) ) { diff --git a/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs b/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs index e6b88a35c5..a11dc4965d 100644 --- a/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs +++ b/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs @@ -301,6 +301,7 @@ namespace OpenSim.Region.Framework.Scenes.Serialization m_SOPXmlProcessors.Add("Name", ProcessName); m_SOPXmlProcessors.Add("Material", ProcessMaterial); m_SOPXmlProcessors.Add("PassTouches", ProcessPassTouches); + m_SOPXmlProcessors.Add("PassCollisions", ProcessPassCollisions); m_SOPXmlProcessors.Add("RegionHandle", ProcessRegionHandle); m_SOPXmlProcessors.Add("ScriptAccessPin", ProcessScriptAccessPin); m_SOPXmlProcessors.Add("GroupPosition", ProcessGroupPosition); @@ -485,6 +486,11 @@ namespace OpenSim.Region.Framework.Scenes.Serialization obj.PassTouches = Util.ReadBoolean(reader); } + private static void ProcessPassCollisions(SceneObjectPart obj, XmlTextReader reader) + { + obj.PassCollisions = Util.ReadBoolean(reader); + } + private static void ProcessRegionHandle(SceneObjectPart obj, XmlTextReader reader) { obj.RegionHandle = (ulong)reader.ReadElementContentAsLong("RegionHandle", String.Empty); @@ -1153,6 +1159,7 @@ namespace OpenSim.Region.Framework.Scenes.Serialization writer.WriteElementString("Name", sop.Name); writer.WriteElementString("Material", sop.Material.ToString()); writer.WriteElementString("PassTouches", sop.PassTouches.ToString().ToLower()); + writer.WriteElementString("PassCollisions", sop.PassCollisions.ToString().ToLower()); writer.WriteElementString("RegionHandle", sop.RegionHandle.ToString()); writer.WriteElementString("ScriptAccessPin", sop.ScriptAccessPin.ToString()); diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index 5bff2e9368..d213c353ef 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -2929,14 +2929,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api { m_host.AddScriptLPS(1); m_host.CollisionFilter.Clear(); - if (id != null) - { - m_host.CollisionFilter.Add(accept,id); - } - else - { - m_host.CollisionFilter.Add(accept,name); - } + UUID objectID; + + if (!UUID.TryParse(id, out objectID)) + objectID = UUID.Zero; + + if (objectID == UUID.Zero && name == "") + return; + + m_host.CollisionFilter.Add(accept,objectID.ToString() + name); } public void llTakeControls(int controls, int accept, int pass_on) @@ -4466,11 +4467,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api m_host.AddScriptLPS(1); if (pass == 0) { - m_host.ParentGroup.PassCollision = false; + m_host.PassCollisions = false; } else { - m_host.ParentGroup.PassCollision = true; + m_host.PassCollisions = true; } } From 069bcd45e51798c9be88237ece85dcd14eefe575 Mon Sep 17 00:00:00 2001 From: Melanie Date: Tue, 15 May 2012 02:27:21 +0100 Subject: [PATCH 212/547] Try to fix sqlite breakage --- OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index 35986cf5b2..ae8f25dc9e 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs @@ -4285,6 +4285,9 @@ namespace OpenSim.Region.Framework.Scenes public void aggregateScriptEvents() { + if (ParentGroup.RootPart == null) + return; + AggregateScriptEvents = 0; // Aggregate script events From 65e1d7b2d7a9c08799118263219bf77526f34fa5 Mon Sep 17 00:00:00 2001 From: Melanie Date: Tue, 15 May 2012 03:16:12 +0100 Subject: [PATCH 213/547] Guard against null root part on SQLite. This really needs to be fixed so SQLite loads roots before children like MySQL does. --- OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index ae8f25dc9e..e3f06f8fbc 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs @@ -4285,7 +4285,7 @@ namespace OpenSim.Region.Framework.Scenes public void aggregateScriptEvents() { - if (ParentGroup.RootPart == null) + if (ParentGroup == null || ParentGroup.RootPart == null) return; AggregateScriptEvents = 0; From 1ce576b115c5f735794d2e0fe8f24e00fa9f7614 Mon Sep 17 00:00:00 2001 From: dahlia Date: Mon, 14 May 2012 19:34:18 -0700 Subject: [PATCH 214/547] Add another null check to Melanie's last commit. Seems to eliminate sqlite errors in log but no idea if it's working properly --- OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index ae8f25dc9e..e3f06f8fbc 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs @@ -4285,7 +4285,7 @@ namespace OpenSim.Region.Framework.Scenes public void aggregateScriptEvents() { - if (ParentGroup.RootPart == null) + if (ParentGroup == null || ParentGroup.RootPart == null) return; AggregateScriptEvents = 0; From 02f3b116c6531f89314be6bc58115537147e512b Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Tue, 15 May 2012 22:43:47 +0100 Subject: [PATCH 215/547] Allow use of regular expressions in "show object name", "show part name" and "delete object name" console commands if --regex switch is used. Deleteing objects by name, creator uuid or owner uuid now requires confirmation to avoid accidental deletion. --- .../Objects/Commands/ObjectCommandsModule.cs | 321 ++++++++++++------ bin/Ionic.Zip.dll | Bin 2 files changed, 214 insertions(+), 107 deletions(-) mode change 100755 => 100644 bin/Ionic.Zip.dll diff --git a/OpenSim/Region/CoreModules/World/Objects/Commands/ObjectCommandsModule.cs b/OpenSim/Region/CoreModules/World/Objects/Commands/ObjectCommandsModule.cs index 5e928f3e8f..830d9cbc1b 100644 --- a/OpenSim/Region/CoreModules/World/Objects/Commands/ObjectCommandsModule.cs +++ b/OpenSim/Region/CoreModules/World/Objects/Commands/ObjectCommandsModule.cs @@ -29,8 +29,10 @@ using System; using System.Collections.Generic; using System.Reflection; using System.Text; +using System.Text.RegularExpressions; using log4net; using Mono.Addins; +using NDesk.Options; using Nini.Config; using OpenMetaverse; using OpenSim.Framework; @@ -78,25 +80,31 @@ namespace OpenSim.Region.CoreModules.World.Objects.Commands m_scene = scene; m_console = MainConsole.Instance; - m_console.Commands.AddCommand("Objects", false, "delete object owner", - "delete object owner ", - "Delete a scene object by owner", HandleDeleteObject); + m_console.Commands.AddCommand( + "Objects", false, "delete object owner", + "delete object owner ", + "Delete a scene object by owner", HandleDeleteObject); - m_console.Commands.AddCommand("Objects", false, "delete object creator", - "delete object creator ", - "Delete a scene object by creator", HandleDeleteObject); + m_console.Commands.AddCommand( + "Objects", false, "delete object creator", + "delete object creator ", + "Delete a scene object by creator", HandleDeleteObject); - m_console.Commands.AddCommand("Objects", false, "delete object uuid", - "delete object uuid ", - "Delete a scene object by uuid", HandleDeleteObject); + m_console.Commands.AddCommand( + "Objects", false, "delete object uuid", + "delete object uuid ", + "Delete a scene object by uuid", HandleDeleteObject); - m_console.Commands.AddCommand("Objects", false, "delete object name", - "delete object name ", - "Delete a scene object by name", HandleDeleteObject); + m_console.Commands.AddCommand( + "Objects", false, "delete object name", + "delete object name [--regex] ", + "Delete a scene object by name.\nIf --regex is specified then the name is treatead as a regular expression", + HandleDeleteObject); - m_console.Commands.AddCommand("Objects", false, "delete object outside", - "delete object outside", - "Delete all scene objects outside region boundaries", HandleDeleteObject); + m_console.Commands.AddCommand( + "Objects", false, "delete object outside", + "delete object outside", + "Delete all scene objects outside region boundaries", HandleDeleteObject); m_console.Commands.AddCommand( "Objects", @@ -109,8 +117,9 @@ namespace OpenSim.Region.CoreModules.World.Objects.Commands "Objects", false, "show object name", - "show object name ", - "Show details of scene objects with the given name", HandleShowObjectByName); + "show object name [--regex] ", + "Show details of scene objects with the given name.\nIf --regex is specified then the name is treatead as a regular expression", + HandleShowObjectByName); m_console.Commands.AddCommand( "Objects", @@ -123,8 +132,9 @@ namespace OpenSim.Region.CoreModules.World.Objects.Commands "Objects", false, "show part name", - "show part name ", - "Show details of scene object parts with the given name", HandleShowPartByName); + "show part name [--regex] ", + "Show details of scene object parts with the given name.\nIf --regex is specified then the name is treatead as a regular expression", + HandleShowPartByName); } public void RemoveRegion(Scene scene) @@ -169,22 +179,38 @@ namespace OpenSim.Region.CoreModules.World.Objects.Commands m_console.OutputFormat(sb.ToString()); } - private void HandleShowObjectByName(string module, string[] cmd) + private void HandleShowObjectByName(string module, string[] cmdparams) { if (!(m_console.ConsoleScene == null || m_console.ConsoleScene == m_scene)) return; - if (cmd.Length < 4) + bool useRegex = false; + OptionSet options = new OptionSet().Add("regex", v=> useRegex = v != null ); + + List mainParams = options.Parse(cmdparams); + + if (mainParams.Count < 4) { - m_console.OutputFormat("Usage: show object name "); + m_console.OutputFormat("Usage: show object name [--regex] "); return; } - string name = cmd[3]; + string name = mainParams[3]; List sceneObjects = new List(); + Action searchAction; - m_scene.ForEachSOG(so => { if (so.Name == name) { sceneObjects.Add(so); }}); + if (useRegex) + { + Regex nameRegex = new Regex(name); + searchAction = so => { if (nameRegex.IsMatch(so.Name)) { sceneObjects.Add(so); }}; + } + else + { + searchAction = so => { if (so.Name == name) { sceneObjects.Add(so); }}; + } + + m_scene.ForEachSOG(searchAction); if (sceneObjects.Count == 0) { @@ -235,22 +261,39 @@ namespace OpenSim.Region.CoreModules.World.Objects.Commands m_console.OutputFormat(sb.ToString()); } - private void HandleShowPartByName(string module, string[] cmd) + private void HandleShowPartByName(string module, string[] cmdparams) { if (!(m_console.ConsoleScene == null || m_console.ConsoleScene == m_scene)) return; - if (cmd.Length < 4) + bool useRegex = false; + OptionSet options = new OptionSet().Add("regex", v=> useRegex = v != null ); + + List mainParams = options.Parse(cmdparams); + + if (mainParams.Count < 4) { - m_console.OutputFormat("Usage: show part name "); + m_console.OutputFormat("Usage: show part name [--regex] "); return; } - string name = cmd[3]; + string name = mainParams[3]; List parts = new List(); - m_scene.ForEachSOG(so => so.ForEachPart(sop => { if (sop.Name == name) { parts.Add(sop); } })); + Action searchAction; + + if (useRegex) + { + Regex nameRegex = new Regex(name); + searchAction = so => so.ForEachPart(sop => { if (nameRegex.IsMatch(sop.Name)) { parts.Add(sop); } }); + } + else + { + searchAction = so => so.ForEachPart(sop => { if (sop.Name == name) { parts.Add(sop); } }); + } + + m_scene.ForEachSOG(searchAction); if (parts.Count == 0) { @@ -312,96 +355,121 @@ namespace OpenSim.Region.CoreModules.World.Objects.Commands o = cmd[3]; } - List deletes = new List(); - + List deletes = null; UUID match; + bool requireConfirmation = true; switch (mode) { - case "owner": - if (!UUID.TryParse(o, out match)) - return; + case "owner": + if (!UUID.TryParse(o, out match)) + return; - m_scene.ForEachSOG(delegate (SceneObjectGroup g) - { - if (g.OwnerID == match && !g.IsAttachment) - deletes.Add(g); - }); + deletes = new List(); -// if (deletes.Count == 0) -// m_console.OutputFormat("No objects were found with owner {0}", match); - - break; - - case "creator": - if (!UUID.TryParse(o, out match)) - return; - - m_scene.ForEachSOG(delegate (SceneObjectGroup g) - { - if (g.RootPart.CreatorID == match && !g.IsAttachment) - deletes.Add(g); - }); - -// if (deletes.Count == 0) -// m_console.OutputFormat("No objects were found with creator {0}", match); - - break; - - case "uuid": - if (!UUID.TryParse(o, out match)) - return; - - m_scene.ForEachSOG(delegate (SceneObjectGroup g) - { - if (g.UUID == match && !g.IsAttachment) - deletes.Add(g); - }); - -// if (deletes.Count == 0) -// m_console.OutputFormat("No objects were found with uuid {0}", match); - - break; - - case "name": - m_scene.ForEachSOG(delegate (SceneObjectGroup g) - { - if (g.RootPart.Name == o && !g.IsAttachment) - deletes.Add(g); - }); - -// if (deletes.Count == 0) -// m_console.OutputFormat("No objects were found with name {0}", o); - - break; - - case "outside": - m_scene.ForEachSOG(delegate (SceneObjectGroup g) - { - SceneObjectPart rootPart = g.RootPart; - bool delete = false; - - if (rootPart.GroupPosition.Z < 0.0 || rootPart.GroupPosition.Z > 10000.0) + m_scene.ForEachSOG(delegate (SceneObjectGroup g) { - delete = true; - } - else - { - ILandObject parcel - = m_scene.LandChannel.GetLandObject(rootPart.GroupPosition.X, rootPart.GroupPosition.Y); + if (g.OwnerID == match && !g.IsAttachment) + deletes.Add(g); + }); + + // if (deletes.Count == 0) + // m_console.OutputFormat("No objects were found with owner {0}", match); + + break; + + case "creator": + if (!UUID.TryParse(o, out match)) + return; - if (parcel == null || parcel.LandData.Name == "NO LAND") + deletes = new List(); + + m_scene.ForEachSOG(delegate (SceneObjectGroup g) + { + if (g.RootPart.CreatorID == match && !g.IsAttachment) + deletes.Add(g); + }); + + // if (deletes.Count == 0) + // m_console.OutputFormat("No objects were found with creator {0}", match); + + break; + + case "uuid": + if (!UUID.TryParse(o, out match)) + return; + + requireConfirmation = false; + deletes = new List(); + + m_scene.ForEachSOG(delegate (SceneObjectGroup g) + { + if (g.UUID == match && !g.IsAttachment) + deletes.Add(g); + }); + + // if (deletes.Count == 0) + // m_console.OutputFormat("No objects were found with uuid {0}", match); + + break; + + case "name": + deletes = GetDeleteCandidatesByName(module, cmd); + break; + + case "outside": + deletes = new List(); + + m_scene.ForEachSOG(delegate (SceneObjectGroup g) + { + SceneObjectPart rootPart = g.RootPart; + bool delete = false; + + if (rootPart.GroupPosition.Z < 0.0 || rootPart.GroupPosition.Z > 10000.0) + { delete = true; - } + } + else + { + ILandObject parcel + = m_scene.LandChannel.GetLandObject(rootPart.GroupPosition.X, rootPart.GroupPosition.Y); + + if (parcel == null || parcel.LandData.Name == "NO LAND") + delete = true; + } + + if (delete && !g.IsAttachment && !deletes.Contains(g)) + deletes.Add(g); + }); + + if (deletes.Count == 0) + m_console.OutputFormat("No objects were found outside region bounds"); + + break; - if (delete && !g.IsAttachment && !deletes.Contains(g)) - deletes.Add(g); - }); + default: + m_console.OutputFormat("Unrecognized mode {0}", mode); + return; + } -// if (deletes.Count == 0) -// m_console.OutputFormat("No objects were found outside region bounds"); + if (deletes == null || deletes.Count <= 0) + return; - break; + if (requireConfirmation) + { + string response = MainConsole.Instance.CmdPrompt( + string.Format( + "Are you sure that you want to delete {0} objects from {1}", + deletes.Count, m_scene.RegionInfo.RegionName), + "n"); + + if (response.ToLower() != "y") + { + MainConsole.Instance.OutputFormat( + "Aborting delete of {0} objects from {1}", deletes.Count, m_scene.RegionInfo.RegionName); + + return; + } } m_console.OutputFormat("Deleting {0} objects in {1}", deletes.Count, m_scene.RegionInfo.RegionName); @@ -412,5 +480,44 @@ namespace OpenSim.Region.CoreModules.World.Objects.Commands m_scene.DeleteSceneObject(g, false); } } + + private List GetDeleteCandidatesByName(string module, string[] cmdparams) + { + if (!(m_console.ConsoleScene == null || m_console.ConsoleScene == m_scene)) + return null; + + bool useRegex = false; + OptionSet options = new OptionSet().Add("regex", v=> useRegex = v != null ); + + List mainParams = options.Parse(cmdparams); + + if (mainParams.Count < 4) + { + m_console.OutputFormat("Usage: delete object name [--regex] "); + return null; + } + + string name = mainParams[3]; + + List sceneObjects = new List(); + Action searchAction; + + if (useRegex) + { + Regex nameRegex = new Regex(name); + searchAction = so => { if (nameRegex.IsMatch(so.Name)) { sceneObjects.Add(so); }}; + } + else + { + searchAction = so => { if (so.Name == name) { sceneObjects.Add(so); }}; + } + + m_scene.ForEachSOG(searchAction); + + if (sceneObjects.Count == 0) + m_console.OutputFormat("No objects with name {0} found in {1}", name, m_scene.RegionInfo.RegionName); + + return sceneObjects; + } } } \ No newline at end of file diff --git a/bin/Ionic.Zip.dll b/bin/Ionic.Zip.dll old mode 100755 new mode 100644 From 1b5ce8c10e492308eeb44c82fee0c65cec855327 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Tue, 15 May 2012 23:43:59 +0100 Subject: [PATCH 216/547] Fix issue where loading OARs could sometimes result in link numbers being reordered. This was because the parts in scene objects were sometimes not serialized in link order. This is perfectly fine since the parts still have the right link numbers, but an extra fix to adjust for this had not been done in the SerialiserModule methods that OAR loading used. Add regression test for same. Addresses http://opensimulator.org/mantis/view.php?id=5948, http://opensimulator.org/mantis/view.php?id=5749 --- .../World/Archiver/ArchiveReadRequest.cs | 4 +- .../World/Archiver/Tests/ArchiverTests.cs | 53 +++++++++++++++++++ .../Framework/Scenes/SceneObjectPart.cs | 13 ++++- OpenSim/Tests/Common/Helpers/SceneHelpers.cs | 8 +-- 4 files changed, 72 insertions(+), 6 deletions(-) diff --git a/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs b/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs index bf0ff7516b..11eca12527 100644 --- a/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs +++ b/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs @@ -41,6 +41,7 @@ using OpenSim.Framework.Serialization.External; using OpenSim.Region.CoreModules.World.Terrain; using OpenSim.Region.Framework.Interfaces; using OpenSim.Region.Framework.Scenes; +using OpenSim.Region.Framework.Scenes.Serialization; using OpenSim.Services.Interfaces; namespace OpenSim.Region.CoreModules.World.Archiver @@ -266,7 +267,8 @@ namespace OpenSim.Region.CoreModules.World.Archiver } */ - SceneObjectGroup sceneObject = serialiser.DeserializeGroupFromXml2(serialisedSceneObject); + SceneObjectGroup sceneObject = SceneObjectSerializer.FromXml2Format(serialisedSceneObject); +// SceneObjectGroup sceneObject = serialiser.DeserializeGroupFromXml2(serialisedSceneObject); bool isTelehub = (sceneObject.UUID == oldTelehubUUID); diff --git a/OpenSim/Region/CoreModules/World/Archiver/Tests/ArchiverTests.cs b/OpenSim/Region/CoreModules/World/Archiver/Tests/ArchiverTests.cs index 394ca27123..5deaf5264b 100644 --- a/OpenSim/Region/CoreModules/World/Archiver/Tests/ArchiverTests.cs +++ b/OpenSim/Region/CoreModules/World/Archiver/Tests/ArchiverTests.cs @@ -291,6 +291,59 @@ namespace OpenSim.Region.CoreModules.World.Archiver.Tests // TODO: Test presence of more files and contents of files. } + /// + /// Test loading an OpenSim Region Archive where the scene object parts are not ordered by link number (e.g. + /// 2 can come after 3). + /// + [Test] + public void TestLoadOarUnorderedParts() + { + TestHelpers.InMethod(); + + UUID ownerId = TestHelpers.ParseTail(0xaaaa); + + MemoryStream archiveWriteStream = new MemoryStream(); + TarArchiveWriter tar = new TarArchiveWriter(archiveWriteStream); + + tar.WriteFile( + ArchiveConstants.CONTROL_FILE_PATH, + new ArchiveWriteRequestPreparation(null, (Stream)null, Guid.Empty).CreateControlFile(new Dictionary())); + + SceneObjectGroup sog1 = SceneHelpers.CreateSceneObject(1, ownerId, "obj1-", 0x11); + SceneObjectPart sop2 + = SceneHelpers.CreateSceneObjectPart("obj1-Part2", TestHelpers.ParseTail(0x12), ownerId); + SceneObjectPart sop3 + = SceneHelpers.CreateSceneObjectPart("obj1-Part3", TestHelpers.ParseTail(0x13), ownerId); + + // Add the parts so they will be written out in reverse order to the oar + sog1.AddPart(sop3); + sop3.LinkNum = 3; + sog1.AddPart(sop2); + sop2.LinkNum = 2; + + tar.WriteFile( + ArchiveConstants.CreateOarObjectPath(sog1.Name, sog1.UUID, sog1.AbsolutePosition), + SceneObjectSerializer.ToXml2Format(sog1)); + + tar.Close(); + + MemoryStream archiveReadStream = new MemoryStream(archiveWriteStream.ToArray()); + + lock (this) + { + m_scene.EventManager.OnOarFileLoaded += LoadCompleted; + m_archiverModule.DearchiveRegion(archiveReadStream); + } + + Assert.That(m_lastErrorMessage, Is.Null); + + SceneObjectPart part2 = m_scene.GetSceneObjectPart("obj1-Part2"); + Assert.That(part2.LinkNum, Is.EqualTo(2)); + + SceneObjectPart part3 = m_scene.GetSceneObjectPart("obj1-Part3"); + Assert.That(part3.LinkNum, Is.EqualTo(3)); + } + /// /// Test loading an OpenSim Region Archive. /// diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index f911ef87a7..1a940aa699 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs @@ -932,7 +932,18 @@ namespace OpenSim.Region.Framework.Scenes public int LinkNum { get { return m_linkNum; } - set { m_linkNum = value; } + set + { +// if (ParentGroup != null) +// { +// m_log.DebugFormat( +// "[SCENE OBJECT PART]: Setting linknum of {0}@{1} to {2} from {3}", +// Name, AbsolutePosition, value, m_linkNum); +// Util.PrintCallStack(); +// } + + m_linkNum = value; + } } public byte ClickAction diff --git a/OpenSim/Tests/Common/Helpers/SceneHelpers.cs b/OpenSim/Tests/Common/Helpers/SceneHelpers.cs index 78f94347bd..59829d994f 100644 --- a/OpenSim/Tests/Common/Helpers/SceneHelpers.cs +++ b/OpenSim/Tests/Common/Helpers/SceneHelpers.cs @@ -624,7 +624,7 @@ namespace OpenSim.Tests.Common /// /// /// The prefix to be given to part names. This will be suffixed with "Part" - /// (e.g. mynamePart0 for the root part) + /// (e.g. mynamePart1 for the root part) /// /// /// The hexadecimal last part of the UUID for parts created. A UUID of the form "00000000-0000-0000-0000-{0:XD12}" @@ -637,14 +637,14 @@ namespace OpenSim.Tests.Common SceneObjectGroup sog = new SceneObjectGroup( - CreateSceneObjectPart(string.Format("{0}Part0", partNamePrefix), new UUID(rawSogId), ownerId)); + CreateSceneObjectPart(string.Format("{0}Part1", partNamePrefix), new UUID(rawSogId), ownerId)); if (parts > 1) - for (int i = 1; i < parts; i++) + for (int i = 2; i <= parts; i++) sog.AddPart( CreateSceneObjectPart( string.Format("{0}Part{1}", partNamePrefix, i), - new UUID(string.Format("00000000-0000-0000-0000-{0:X12}", uuidTail + i)), + new UUID(string.Format("00000000-0000-0000-0000-{0:X12}", uuidTail + i - 1)), ownerId)); return sog; From 23ae24b4061f7c1e1bc1c0d5428374ccf4e25891 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Wed, 16 May 2012 00:10:42 +0100 Subject: [PATCH 217/547] Route OAR SOG loading through the common SceneObjectSerializer.FromXml2Format() rather than the functionally identical but buggy Xml2ToSOG(). Remove buggy Xml2ToSOG(). --- .../World/Archiver/ArchiveReadRequest.cs | 3 +- .../Serialization/SceneObjectSerializer.cs | 45 ------------ .../Scenes/Serialization/SceneXmlLoader.cs | 72 ++----------------- 3 files changed, 5 insertions(+), 115 deletions(-) diff --git a/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs b/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs index 11eca12527..2b61800c94 100644 --- a/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs +++ b/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs @@ -267,8 +267,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver } */ - SceneObjectGroup sceneObject = SceneObjectSerializer.FromXml2Format(serialisedSceneObject); -// SceneObjectGroup sceneObject = serialiser.DeserializeGroupFromXml2(serialisedSceneObject); + SceneObjectGroup sceneObject = serialiser.DeserializeGroupFromXml2(serialisedSceneObject); bool isTelehub = (sceneObject.UUID == oldTelehubUUID); diff --git a/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs b/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs index a11dc4965d..0b34156495 100644 --- a/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs +++ b/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs @@ -1424,51 +1424,6 @@ namespace OpenSim.Region.Framework.Scenes.Serialization } } - //////// Read ///////// - public static bool Xml2ToSOG(XmlTextReader reader, SceneObjectGroup sog) - { - reader.Read(); - reader.ReadStartElement("SceneObjectGroup"); - SceneObjectPart root = Xml2ToSOP(reader); - if (root != null) - sog.SetRootPart(root); - else - { - return false; - } - - if (sog.UUID == UUID.Zero) - sog.UUID = sog.RootPart.UUID; - - reader.Read(); // OtherParts - - while (!reader.EOF) - { - switch (reader.NodeType) - { - case XmlNodeType.Element: - if (reader.Name == "SceneObjectPart") - { - SceneObjectPart child = Xml2ToSOP(reader); - if (child != null) - sog.AddPart(child); - } - else - { - //Logger.Log("Found unexpected prim XML element " + reader.Name, Helpers.LogLevel.Debug); - reader.Read(); - } - break; - case XmlNodeType.EndElement: - default: - reader.Read(); - break; - } - - } - return true; - } - public static SceneObjectPart Xml2ToSOP(XmlTextReader reader) { SceneObjectPart obj = new SceneObjectPart(); diff --git a/OpenSim/Region/Framework/Scenes/Serialization/SceneXmlLoader.cs b/OpenSim/Region/Framework/Scenes/Serialization/SceneXmlLoader.cs index d214eba1fc..a3485d29e6 100644 --- a/OpenSim/Region/Framework/Scenes/Serialization/SceneXmlLoader.cs +++ b/OpenSim/Region/Framework/Scenes/Serialization/SceneXmlLoader.cs @@ -223,50 +223,7 @@ namespace OpenSim.Region.Framework.Scenes.Serialization public static SceneObjectGroup DeserializeGroupFromXml2(string xmlString) { - XmlDocument doc = new XmlDocument(); - XmlNode rootNode; - - XmlTextReader reader = new XmlTextReader(new StringReader(xmlString)); - reader.WhitespaceHandling = WhitespaceHandling.None; - doc.Load(reader); - reader.Close(); - rootNode = doc.FirstChild; - - // This is to deal with neighbouring regions that are still surrounding the group xml with the - // tag. It should be possible to remove the first part of this if statement once we go past 0.5.9 (or - // when some other changes forces all regions to upgrade). - // This might seem rather pointless since prim crossing from this revision to an earlier revision remains - // broken. But it isn't much work to accomodate the old format here. - if (rootNode.LocalName.Equals("scene")) - { - foreach (XmlNode aPrimNode in rootNode.ChildNodes) - { - // There is only ever one prim. This oddity should be removeable post 0.5.9 - //return SceneObjectSerializer.FromXml2Format(aPrimNode.OuterXml); - using (reader = new XmlTextReader(new StringReader(aPrimNode.OuterXml))) - { - SceneObjectGroup obj = new SceneObjectGroup(); - if (SceneObjectSerializer.Xml2ToSOG(reader, obj)) - return obj; - - return null; - } - } - - return null; - } - else - { - //return SceneObjectSerializer.FromXml2Format(rootNode.OuterXml); - using (reader = new XmlTextReader(new StringReader(rootNode.OuterXml))) - { - SceneObjectGroup obj = new SceneObjectGroup(); - if (SceneObjectSerializer.Xml2ToSOG(reader, obj)) - return obj; - - return null; - } - } + return SceneObjectSerializer.FromXml2Format(xmlString); } /// @@ -307,8 +264,8 @@ namespace OpenSim.Region.Framework.Scenes.Serialization ICollection sceneObjects = new List(); foreach (XmlNode aPrimNode in rootNode.ChildNodes) { - SceneObjectGroup obj = CreatePrimFromXml2(scene, aPrimNode.OuterXml); - if (obj != null && startScripts) + SceneObjectGroup obj = DeserializeGroupFromXml2(aPrimNode.OuterXml); + if (startScripts) sceneObjects.Add(obj); } @@ -319,27 +276,6 @@ namespace OpenSim.Region.Framework.Scenes.Serialization } } - /// - /// Create a prim from the xml2 representation. - /// - /// - /// - /// The scene object created. null if the scene object already existed - protected static SceneObjectGroup CreatePrimFromXml2(Scene scene, string xmlData) - { - //SceneObjectGroup obj = SceneObjectSerializer.FromXml2Format(xmlData); - using (XmlTextReader reader = new XmlTextReader(new StringReader(xmlData))) - { - SceneObjectGroup obj = new SceneObjectGroup(); - SceneObjectSerializer.Xml2ToSOG(reader, obj); - - if (scene.AddRestoredSceneObject(obj, true, false)) - return obj; - else - return null; - } - } - #endregion } -} +} \ No newline at end of file From e444cb9da4fd112733634dbda8b2844e69097ec4 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 17 May 2012 00:33:04 +0100 Subject: [PATCH 218/547] Remove redundant "Teleport failed:" from reason when QueryAccess fails for the destination simulator. This part of the string is already provided by the viewer. Also adds more reason logging for diagnostics when teleports are refused/fail. --- .../EntityTransfer/EntityTransferModule.cs | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs index d0aead5a7c..5dbe5e4966 100644 --- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs +++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs @@ -432,11 +432,16 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer string reason; string version; - if (!m_aScene.SimulationService.QueryAccess(finalDestination, sp.ControllingClient.AgentId, Vector3.Zero, out version, out reason)) + if (!m_aScene.SimulationService.QueryAccess( + finalDestination, sp.ControllingClient.AgentId, Vector3.Zero, out version, out reason)) { - sp.ControllingClient.SendTeleportFailed("Teleport failed: " + reason); + sp.ControllingClient.SendTeleportFailed(reason); ResetFromTransit(sp.UUID); + m_log.DebugFormat( + "[ENTITY TRANSFER MODULE]: {0} was stopped from teleporting from {1} to {2} because {3}", + sp.Name, sp.Scene.RegionInfo.RegionName, finalDestination.RegionName, reason); + return; } @@ -479,10 +484,13 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer bool logout = false; if (!CreateAgent(sp, reg, finalDestination, agentCircuit, teleportFlags, out reason, out logout)) { - sp.ControllingClient.SendTeleportFailed( - String.Format("Teleport refused: {0}", reason)); + sp.ControllingClient.SendTeleportFailed(String.Format("Teleport refused: {0}", reason)); ResetFromTransit(sp.UUID); + m_log.DebugFormat( + "[ENTITY TRANSFER MODULE]: Teleport of {0} from {1} to {2} was refused because {3}", + sp.Name, sp.Scene.RegionInfo.RegionName, finalDestination.RegionName, reason); + return; } From bdcf2d1348c6770a42a91ca5b3c7d74d2307b0c1 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 17 May 2012 01:27:59 +0100 Subject: [PATCH 219/547] Add regression TestSameSimulatorSeparatedRegionsQueryAccessFails() --- .../Tests/ScenePresenceTeleportTests.cs | 76 +++++++++++++++++++ OpenSim/Tests/Common/TestHelpers.cs | 2 +- 2 files changed, 77 insertions(+), 1 deletion(-) diff --git a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTeleportTests.cs b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTeleportTests.cs index ea4fb66b4e..7c76bedfaa 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTeleportTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTeleportTests.cs @@ -37,6 +37,7 @@ using OpenSim.Region.Framework.Interfaces; using OpenSim.Region.CoreModules.Framework; using OpenSim.Region.CoreModules.Framework.EntityTransfer; using OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation; +using OpenSim.Region.CoreModules.World.Permissions; using OpenSim.Tests.Common; using OpenSim.Tests.Common.Mock; using System.IO; @@ -161,6 +162,81 @@ namespace OpenSim.Region.Framework.Scenes.Tests // Assert.That(sp.Lookat, Is.EqualTo(teleportLookAt)); } + /// + /// Test teleport procedures when the target simulator returns false when queried about access. + /// + [Test] + public void TestSameSimulatorSeparatedRegionsQueryAccessFails() + { + TestHelpers.InMethod(); + TestHelpers.EnableLogging(); + + UUID userId = TestHelpers.ParseTail(0x1); + Vector3 preTeleportPosition = new Vector3(30, 31, 32); + + EntityTransferModule etm = new EntityTransferModule(); + LocalSimulationConnectorModule lscm = new LocalSimulationConnectorModule(); + + IConfigSource config = new IniConfigSource(); + config.AddConfig("Modules"); + config.Configs["Modules"].Set("EntityTransferModule", etm.Name); + config.Configs["Modules"].Set("SimulationServices", lscm.Name); + + config.AddConfig("EntityTransfer"); + + // In order to run a single threaded regression test we do not want the entity transfer module waiting + // for a callback from the destination scene before removing its avatar data. + config.Configs["EntityTransfer"].Set("wait_for_callback", false); + + config.AddConfig("Startup"); + config.Configs["Startup"].Set("serverside_object_permissions", true); + + SceneHelpers sh = new SceneHelpers(); + TestScene sceneA = sh.SetupScene("sceneA", TestHelpers.ParseTail(0x100), 1000, 1000); + TestScene sceneB = sh.SetupScene("sceneB", TestHelpers.ParseTail(0x200), 1002, 1000); + + // We need to set up the permisions module on scene B so that our later use of agent limit to deny + // QueryAccess won't succeed anyway because administrators are always allowed in and the default + // IsAdministrator if no permissions module is present is true. + SceneHelpers.SetupSceneModules(sceneB, config, new object[] { new PermissionsModule() }); + + // Shared scene modules + SceneHelpers.SetupSceneModules(new Scene[] { sceneA, sceneB }, config, etm, lscm); + + Vector3 teleportPosition = new Vector3(10, 11, 12); + Vector3 teleportLookAt = new Vector3(20, 21, 22); + + ScenePresence sp = SceneHelpers.AddScenePresence(sceneA, userId, sh.SceneManager); + sp.AbsolutePosition = preTeleportPosition; + + // Make sceneB return false on query access + sceneB.RegionInfo.RegionSettings.AgentLimit = 0; + + sceneA.RequestTeleportLocation( + sp.ControllingClient, + sceneB.RegionInfo.RegionHandle, + teleportPosition, + teleportLookAt, + (uint)TeleportFlags.ViaLocation); + +// ((TestClient)sp.ControllingClient).CompleteTeleportClientSide(); + + Assert.That(sceneB.GetScenePresence(userId), Is.Null); + + ScenePresence sceneASp = sceneA.GetScenePresence(userId); + Assert.That(sceneASp, Is.Not.Null); + Assert.That(sceneASp.Scene.RegionInfo.RegionName, Is.EqualTo(sceneA.RegionInfo.RegionName)); + Assert.That(sceneASp.AbsolutePosition, Is.EqualTo(preTeleportPosition)); + + // TODO: Add assertions to check correct circuit details in both scenes. + + // Lookat is sent to the client only - sp.Lookat does not yield the same thing (calculation from camera + // position instead). +// Assert.That(sp.Lookat, Is.EqualTo(teleportLookAt)); + + TestHelpers.DisableLogging(); + } + [Test] public void TestSameSimulatorNeighbouringRegionsTeleport() { diff --git a/OpenSim/Tests/Common/TestHelpers.cs b/OpenSim/Tests/Common/TestHelpers.cs index 6744fcac97..a241a3cbe6 100644 --- a/OpenSim/Tests/Common/TestHelpers.cs +++ b/OpenSim/Tests/Common/TestHelpers.cs @@ -61,7 +61,7 @@ namespace OpenSim.Tests.Common private static Stream DisableLoggingConfigStream = new MemoryStream( Encoding.UTF8.GetBytes( - // ""))); +// "")); //""))); // "")); // ""))); From 6b6a00a3d593ce164d23135cb3fe570a511e1793 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 17 May 2012 01:30:50 +0100 Subject: [PATCH 220/547] minor: Remove redundant EstateOwner != UUID.Zero check in IsAdministrator because checking EstateOwner == user Due to an earlier check we already know that user != UUID.Zero so if EstateOwner == UUID.Zero, EstateOwner == user can never be true --- .../World/Permissions/PermissionsModule.cs | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs b/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs index 7d75fad332..555509c34e 100644 --- a/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs +++ b/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs @@ -450,19 +450,17 @@ namespace OpenSim.Region.CoreModules.World.Permissions } /// - /// Is the given user an administrator (in other words, a god)? + /// Is the user regarded as an administrator? /// /// /// protected bool IsAdministrator(UUID user) { - if (user == UUID.Zero) return false; - - if (m_scene.RegionInfo.EstateSettings.EstateOwner != UUID.Zero) - { - if (m_scene.RegionInfo.EstateSettings.EstateOwner == user && m_RegionOwnerIsGod) - return true; - } + if (user == UUID.Zero) + return false; + + if (m_scene.RegionInfo.EstateSettings.EstateOwner == user && m_RegionOwnerIsGod) + return true; if (IsEstateManager(user) && m_RegionManagerIsGod) return true; From f0c9cb8dc0eeccf2c686ff8ceacc7e1acceb543d Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 17 May 2012 01:34:04 +0100 Subject: [PATCH 221/547] Comment out TestSameSimulatorSeparatedRegionsQueryAccessFails() regression test logging accidentally left in --- .../Framework/Scenes/Tests/ScenePresenceTeleportTests.cs | 4 ++-- OpenSim/Tests/Common/TestHelpers.cs | 6 ++++++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTeleportTests.cs b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTeleportTests.cs index 7c76bedfaa..a35127197a 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTeleportTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTeleportTests.cs @@ -169,7 +169,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests public void TestSameSimulatorSeparatedRegionsQueryAccessFails() { TestHelpers.InMethod(); - TestHelpers.EnableLogging(); +// TestHelpers.EnableLogging(); UUID userId = TestHelpers.ParseTail(0x1); Vector3 preTeleportPosition = new Vector3(30, 31, 32); @@ -234,7 +234,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests // position instead). // Assert.That(sp.Lookat, Is.EqualTo(teleportLookAt)); - TestHelpers.DisableLogging(); +// TestHelpers.DisableLogging(); } [Test] diff --git a/OpenSim/Tests/Common/TestHelpers.cs b/OpenSim/Tests/Common/TestHelpers.cs index a241a3cbe6..d38d692ed6 100644 --- a/OpenSim/Tests/Common/TestHelpers.cs +++ b/OpenSim/Tests/Common/TestHelpers.cs @@ -100,6 +100,12 @@ namespace OpenSim.Tests.Common /// /// Disable logging whilst running the tests. /// + /// + /// Remember, if a regression test throws an exception before completing this will not be invoked if it's at + /// the end of the test. + /// TODO: Always invoke this after every test - probably need to make all test cases inherit from a common + /// TestCase class where this can be done. + /// public static void DisableLogging() { log4net.Config.XmlConfigurator.Configure(DisableLoggingConfigStream); From d19fb6fb0c7983126e327b80686c25c9d7f0fcfc Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 17 May 2012 03:12:31 +0100 Subject: [PATCH 222/547] Add regression TestSameSimulatorSeparatedRegionsCreateAgentFails() --- .../Tests/ScenePresenceTeleportTests.cs | 67 +++++++++++++++++++ 1 file changed, 67 insertions(+) diff --git a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTeleportTests.cs b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTeleportTests.cs index a35127197a..78393948bd 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTeleportTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTeleportTests.cs @@ -234,6 +234,73 @@ namespace OpenSim.Region.Framework.Scenes.Tests // position instead). // Assert.That(sp.Lookat, Is.EqualTo(teleportLookAt)); +// TestHelpers.DisableLogging(); + } + + /// + /// Test teleport procedures when the target simulator returns false when queried about access. + /// + [Test] + public void TestSameSimulatorSeparatedRegionsCreateAgentFails() + { + TestHelpers.InMethod(); +// TestHelpers.EnableLogging(); + + UUID userId = TestHelpers.ParseTail(0x1); + Vector3 preTeleportPosition = new Vector3(30, 31, 32); + + EntityTransferModule etm = new EntityTransferModule(); + LocalSimulationConnectorModule lscm = new LocalSimulationConnectorModule(); + + IConfigSource config = new IniConfigSource(); + config.AddConfig("Modules"); + config.Configs["Modules"].Set("EntityTransferModule", etm.Name); + config.Configs["Modules"].Set("SimulationServices", lscm.Name); + + config.AddConfig("EntityTransfer"); + + // In order to run a single threaded regression test we do not want the entity transfer module waiting + // for a callback from the destination scene before removing its avatar data. + config.Configs["EntityTransfer"].Set("wait_for_callback", false); + + SceneHelpers sh = new SceneHelpers(); + TestScene sceneA = sh.SetupScene("sceneA", TestHelpers.ParseTail(0x100), 1000, 1000); + TestScene sceneB = sh.SetupScene("sceneB", TestHelpers.ParseTail(0x200), 1002, 1000); + + // Shared scene modules + SceneHelpers.SetupSceneModules(new Scene[] { sceneA, sceneB }, config, etm, lscm); + + Vector3 teleportPosition = new Vector3(10, 11, 12); + Vector3 teleportLookAt = new Vector3(20, 21, 22); + + ScenePresence sp = SceneHelpers.AddScenePresence(sceneA, userId, sh.SceneManager); + sp.AbsolutePosition = preTeleportPosition; + + // Make sceneB refuse CreateAgent + sceneB.LoginsDisabled = true; + + sceneA.RequestTeleportLocation( + sp.ControllingClient, + sceneB.RegionInfo.RegionHandle, + teleportPosition, + teleportLookAt, + (uint)TeleportFlags.ViaLocation); + +// ((TestClient)sp.ControllingClient).CompleteTeleportClientSide(); + + Assert.That(sceneB.GetScenePresence(userId), Is.Null); + + ScenePresence sceneASp = sceneA.GetScenePresence(userId); + Assert.That(sceneASp, Is.Not.Null); + Assert.That(sceneASp.Scene.RegionInfo.RegionName, Is.EqualTo(sceneA.RegionInfo.RegionName)); + Assert.That(sceneASp.AbsolutePosition, Is.EqualTo(preTeleportPosition)); + + // TODO: Add assertions to check correct circuit details in both scenes. + + // Lookat is sent to the client only - sp.Lookat does not yield the same thing (calculation from camera + // position instead). +// Assert.That(sp.Lookat, Is.EqualTo(teleportLookAt)); + // TestHelpers.DisableLogging(); } From c45b5a3d1cffe506b8f3d3002e186942a0d6b1b4 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 17 May 2012 03:27:05 +0100 Subject: [PATCH 223/547] minor: improve method doc for TestSameSimulatorSeparatedRegionsCreateAgentFails() --- .../Region/Framework/Scenes/Tests/ScenePresenceTeleportTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTeleportTests.cs b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTeleportTests.cs index 78393948bd..41bff7f92e 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTeleportTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTeleportTests.cs @@ -238,7 +238,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests } /// - /// Test teleport procedures when the target simulator returns false when queried about access. + /// Test teleport procedures when the target simulator create agent step is refused. /// [Test] public void TestSameSimulatorSeparatedRegionsCreateAgentFails() From 0aa7baf49a9defdd7d7355198b95abe57639bc26 Mon Sep 17 00:00:00 2001 From: BlueWall Date: Wed, 16 May 2012 23:17:42 -0400 Subject: [PATCH 224/547] Fix boo-boo in OpenSim.ini.example affecting telehub sequential routing Configuration value should be "sequence" instead of "sequential" --- bin/OpenSim.ini.example | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/OpenSim.ini.example b/bin/OpenSim.ini.example index 9b88816893..9f418a40dd 100755 --- a/bin/OpenSim.ini.example +++ b/bin/OpenSim.ini.example @@ -241,12 +241,12 @@ ;; server to send mail through. ; emailmodule = DefaultEmailModule - ;# {SpawnPointRouting} {} {Set routing method for Telehub Spawnpoints} {closest random sequential} closest + ;# {SpawnPointRouting} {} {Set routing method for Telehub Spawnpoints} {closest random sequence} closest ;; SpawnPointRouting adjusts the landing for incoming avatars. ;; "closest" will place the avatar at the SpawnPoint located in the closest ;; available spot to the destination (typically map click/landmark). ;; "random" will place the avatar on a randomly selected spawnpoint; - ;; "sequential" will place the avatar on the next sequential SpawnPoint + ;; "sequence" will place the avatar on the next sequential SpawnPoint ; SpawnPointRouting = closest [Estates] From 295bb3227d0c7d108d73ef7be4fd1dd59f7afc21 Mon Sep 17 00:00:00 2001 From: BlueWall Date: Thu, 17 May 2012 00:47:19 -0400 Subject: [PATCH 225/547] Force the default Telehub router if no matches are found in the config. --- .../Region/Framework/Scenes/ScenePresence.cs | 57 +++++++++---------- 1 file changed, 28 insertions(+), 29 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index bdcef71159..0d5c218d34 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs @@ -3939,35 +3939,6 @@ namespace OpenSim.Region.Framework.Scenes switch (m_scene.SpawnPointRouting) { - case "closest": - - float distance = 9999; - int closest = -1; - - for (int i = 0; i < spawnPoints.Length; i++) - { - Vector3 spawnPosition = spawnPoints[i].GetLocation( - telehub.AbsolutePosition, - telehub.GroupRotation - ); - Vector3 offset = spawnPosition - pos; - float d = Vector3.Mag(offset); - if (d >= distance) - continue; - ILandObject land = m_scene.LandChannel.GetLandObject(spawnPosition.X, spawnPosition.Y); - if (land == null) - continue; - if (land.IsEitherBannedOrRestricted(UUID)) - continue; - distance = d; - closest = i; - } - if (closest == -1) - return; - - pos = spawnPoints[closest].GetLocation(telehub.AbsolutePosition, telehub.GroupRotation); - return; - case "random": do @@ -4019,7 +3990,35 @@ namespace OpenSim.Region.Framework.Scenes return; default: + case "closest": + + float distance = 9999; + int closest = -1; + + for (int i = 0; i < spawnPoints.Length; i++) + { + Vector3 spawnPosition = spawnPoints[i].GetLocation( + telehub.AbsolutePosition, + telehub.GroupRotation + ); + Vector3 offset = spawnPosition - pos; + float d = Vector3.Mag(offset); + if (d >= distance) + continue; + ILandObject land = m_scene.LandChannel.GetLandObject(spawnPosition.X, spawnPosition.Y); + if (land == null) + continue; + if (land.IsEitherBannedOrRestricted(UUID)) + continue; + distance = d; + closest = i; + } + if (closest == -1) + return; + + pos = spawnPoints[closest].GetLocation(telehub.AbsolutePosition, telehub.GroupRotation); return; + } } } From 4d34763f8c90dfe87a8a5930bf05fe36b86d15df Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 17 May 2012 23:33:26 +0100 Subject: [PATCH 226/547] Check agent limit against root agent count rather than both root and child agents From sl docs such as http://community.secondlife.com/t5/English-Knowledge-Base/Managing-Private-Regions/ta-p/700115 agent should apply to avatars only. This makes sense from a user perspective, and also from a code perspective since child agents with no physics or actions take up a fraction of root agent resources. As such, the check is now only performed in Scene.QueryAccess() - cross and teleport check this before allowing an agent to translocate. This also removes an off-by-one error that could occur in certain circumstances on teleport when a new child agent was double counted when a pre-teleport agent update was performed. This does not affect an existing bug where limits or other QueryAccess() checks are not applied to avatars logging directly into a region. --- OpenSim/Region/Framework/Scenes/Scene.cs | 47 +++++++++++++------ OpenSim/Region/Framework/Scenes/SceneGraph.cs | 5 -- .../Region/Framework/Scenes/ScenePresence.cs | 13 ++++- 3 files changed, 43 insertions(+), 22 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 2bf3638f6c..3cce370262 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -2646,7 +2646,8 @@ namespace OpenSim.Region.Framework.Scenes if (sp == null) { m_log.DebugFormat( - "[SCENE]: Adding new child scene presence {0} to scene {1} at pos {2}", client.Name, RegionInfo.RegionName, client.StartPos); + "[SCENE]: Adding new child scene presence {0} {1} to scene {2} at pos {3}", + client.Name, client.AgentId, RegionInfo.RegionName, client.StartPos); m_clientManager.Add(client); SubscribeToClientEvents(client); @@ -3905,8 +3906,7 @@ namespace OpenSim.Region.Framework.Scenes // XPTO: if this agent is not allowed here as root, always return false - // We have to wait until the viewer contacts this region after receiving EAC. - // That calls AddNewClient, which finally creates the ScenePresence + // TODO: This check should probably be in QueryAccess(). ILandObject nearestParcel = GetNearestAllowedParcel(cAgentData.AgentID, Constants.RegionSize / 2, Constants.RegionSize / 2); if (nearestParcel == null) { @@ -3917,14 +3917,8 @@ namespace OpenSim.Region.Framework.Scenes return false; } - int num = m_sceneGraph.GetNumberOfScenePresences(); - - if (num >= RegionInfo.RegionSettings.AgentLimit) - { - if (!Permissions.IsAdministrator(cAgentData.AgentID)) - return false; - } - + // We have to wait until the viewer contacts this region after receiving EAC. + // That calls AddNewClient, which finally creates the ScenePresence ScenePresence childAgentUpdate = WaitGetScenePresence(cAgentData.AgentID); if (childAgentUpdate != null) @@ -3968,14 +3962,28 @@ namespace OpenSim.Region.Framework.Scenes return false; } + /// + /// Poll until the requested ScenePresence appears or we timeout. + /// + /// The scene presence is found, else null. + /// protected virtual ScenePresence WaitGetScenePresence(UUID agentID) { int ntimes = 10; - ScenePresence childAgentUpdate = null; - while ((childAgentUpdate = GetScenePresence(agentID)) == null && (ntimes-- > 0)) + ScenePresence sp = null; + while ((sp = GetScenePresence(agentID)) == null && (ntimes-- > 0)) Thread.Sleep(1000); - return childAgentUpdate; + if (sp == null) + m_log.WarnFormat( + "[SCENE PRESENCE]: Did not find presence with id {0} in {1} before timeout", + agentID, RegionInfo.RegionName); +// else +// m_log.DebugFormat( +// "[SCENE PRESENCE]: Found presence {0} {1} {2} in {3} after {4} waits", +// sp.Name, sp.UUID, sp.IsChildAgent ? "child" : "root", RegionInfo.RegionName, 10 - ntimes); + + return sp; } public virtual bool IncomingRetrieveRootAgent(UUID id, out IAgentData agent) @@ -5177,13 +5185,22 @@ namespace OpenSim.Region.Framework.Scenes // child agent creation, thereby emulating the SL behavior. public bool QueryAccess(UUID agentID, Vector3 position, out string reason) { - int num = m_sceneGraph.GetNumberOfScenePresences(); + // FIXME: Root agent count is currently known to be inaccurate. This forces a recount before we check. + // However, the long term fix is to make sure root agent count is always accurate. + m_sceneGraph.RecalculateStats(); + + int num = m_sceneGraph.GetRootAgentCount(); if (num >= RegionInfo.RegionSettings.AgentLimit) { if (!Permissions.IsAdministrator(agentID)) { reason = "The region is full"; + + m_log.DebugFormat( + "[SCENE]: Denying presence with id {0} entry into {1} since region is at agent limit of {2}", + agentID, RegionInfo.RegionName, RegionInfo.RegionSettings.AgentLimit); + return false; } } diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs index 481592277d..ddf1550c0a 100644 --- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs +++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs @@ -779,11 +779,6 @@ namespace OpenSim.Region.Framework.Scenes return m_scenePresenceArray; } - public int GetNumberOfScenePresences() - { - return m_scenePresenceArray.Count; - } - /// /// Request a scene presence by UUID. Fast, indexed lookup. /// diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index bdcef71159..558fd9c564 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs @@ -1169,6 +1169,12 @@ namespace OpenSim.Region.Framework.Scenes Scene.SimulationService.ReleaseAgent(m_originRegionID, UUID, m_callbackURI); m_callbackURI = null; } +// else +// { +// m_log.DebugFormat( +// "[SCENE PRESENCE]: No callback provided on CompleteMovement of {0} {1} to {2}", +// client.Name, client.AgentId, m_scene.RegionInfo.RegionName); +// } ValidateAndSendAppearanceAndAgentData(); @@ -2508,7 +2514,7 @@ namespace OpenSim.Region.Framework.Scenes // If we are using the the cached appearance then send it out to everyone if (cachedappearance) { - m_log.DebugFormat("[SCENEPRESENCE]: baked textures are in the cache for {0}", Name); + m_log.DebugFormat("[SCENE PRESENCE]: baked textures are in the cache for {0}", Name); // If the avatars baked textures are all in the cache, then we have a // complete appearance... send it out, if not, then we'll send it when @@ -2970,7 +2976,7 @@ namespace OpenSim.Region.Framework.Scenes public void ChildAgentDataUpdate(AgentData cAgentData) { - //m_log.Debug(" >>> ChildAgentDataUpdate <<< " + Scene.RegionInfo.RegionName); +// m_log.Debug(" >>> ChildAgentDataUpdate <<< " + Scene.RegionInfo.RegionName); if (!IsChildAgent) return; @@ -3110,6 +3116,9 @@ namespace OpenSim.Region.Framework.Scenes m_originRegionID = cAgent.RegionID; m_callbackURI = cAgent.CallbackURI; +// m_log.DebugFormat( +// "[SCENE PRESENCE]: Set callback for {0} in {1} to {2} in CopyFrom()", +// Name, m_scene.RegionInfo.RegionName, m_callbackURI); m_pos = cAgent.Position; m_velocity = cAgent.Velocity; From b18c8c8e78172abebb82491700a0b5f9f40c1d66 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 17 May 2012 23:59:43 +0100 Subject: [PATCH 227/547] Don't eagerly clear frame collision events when physics actors subscribe and unsubscribe from collisions, in order to avoid a race condition. Since this is done directly from ScenePresence, it can lead to a race condition with the simulator loop. There's no real point doing it anyway since the clear will be done very shortly afterwards by the simulate loop and either there are no events (for a new avatar) or events don't matter (for a departing avatar). This matches existing behaviour in OdePrim --- OpenSim/Region/Physics/OdePlugin/ODECharacter.cs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs b/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs index 8397eb4331..1b1c44a95f 100644 --- a/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs +++ b/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs @@ -1261,14 +1261,20 @@ namespace OpenSim.Region.Physics.OdePlugin { m_requestedUpdateFrequency = ms; m_eventsubscription = ms; - CollisionEventsThisFrame.Clear(); + + // Don't clear collision event reporting here. This is called directly from scene code and so can lead + // to a race condition with the simulate loop + _parent_scene.AddCollisionEventReporting(this); } public override void UnSubscribeEvents() { CollisionEventsThisFrame.Clear(); - _parent_scene.RemoveCollisionEventReporting(this); + + // Don't clear collision event reporting here. This is called directly from scene code and so can lead + // to a race condition with the simulate loop + m_requestedUpdateFrequency = 0; m_eventsubscription = 0; } From 6501b1b1bb297eb5ed8a44447f771c7b73b0e905 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 18 May 2012 00:38:29 +0100 Subject: [PATCH 228/547] refactor: move EventQueueGet path generation into common method. Rename some local variables in line with code conventions. Add commented out EQG log lines for future use. --- .../Caps/EventQueue/EventQueueGetModule.cs | 53 ++++++++++++------- .../Region/Physics/OdePlugin/ODECharacter.cs | 2 +- 2 files changed, 34 insertions(+), 21 deletions(-) diff --git a/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/EventQueueGetModule.cs b/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/EventQueueGetModule.cs index 1a35d22c3b..005461916c 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/EventQueueGetModule.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/EventQueueGetModule.cs @@ -235,19 +235,19 @@ namespace OpenSim.Region.ClientStack.Linden // ClientClosed(client.AgentId); // } - private void ClientClosed(UUID AgentID, Scene scene) + private void ClientClosed(UUID agentID, Scene scene) { -// m_log.DebugFormat("[EVENTQUEUE]: Closed client {0} in region {1}", AgentID, m_scene.RegionInfo.RegionName); +// m_log.DebugFormat("[EVENTQUEUE]: Closed client {0} in region {1}", agentID, m_scene.RegionInfo.RegionName); int count = 0; - while (queues.ContainsKey(AgentID) && queues[AgentID].Count > 0 && count++ < 5) + while (queues.ContainsKey(agentID) && queues[agentID].Count > 0 && count++ < 5) { Thread.Sleep(1000); } lock (queues) { - queues.Remove(AgentID); + queues.Remove(agentID); } List removeitems = new List(); @@ -256,7 +256,7 @@ namespace OpenSim.Region.ClientStack.Linden foreach (UUID ky in m_AvatarQueueUUIDMapping.Keys) { // m_log.DebugFormat("[EVENTQUEUE]: Found key {0} in m_AvatarQueueUUIDMapping while looking for {1}", ky, AgentID); - if (ky == AgentID) + if (ky == agentID) { removeitems.Add(ky); } @@ -267,7 +267,10 @@ namespace OpenSim.Region.ClientStack.Linden UUID eventQueueGetUuid = m_AvatarQueueUUIDMapping[ky]; m_AvatarQueueUUIDMapping.Remove(ky); - MainServer.Instance.RemovePollServiceHTTPHandler("","/CAPS/EQG/" + eventQueueGetUuid.ToString() + "/"); + string eqgPath = GenerateEqgCapPath(eventQueueGetUuid); + MainServer.Instance.RemovePollServiceHTTPHandler("", eqgPath); + +// m_log.DebugFormat("[EVENT QUEUE GET MODULE]: Removed EQG handler {0} for {1}", eqgPath, agentID); } } @@ -281,7 +284,7 @@ namespace OpenSim.Region.ClientStack.Linden { searchval = m_QueueUUIDAvatarMapping[ky]; - if (searchval == AgentID) + if (searchval == agentID) { removeitems.Add(ky); } @@ -305,6 +308,15 @@ namespace OpenSim.Region.ClientStack.Linden //} } + /// + /// Generate an Event Queue Get handler path for the given eqg uuid. + /// + /// + private string GenerateEqgCapPath(UUID eqgUuid) + { + return string.Format("/CAPS/EQG/{0}/", eqgUuid); + } + public void OnRegisterCaps(UUID agentID, Caps caps) { // Register an event queue for the client @@ -316,8 +328,7 @@ namespace OpenSim.Region.ClientStack.Linden // Let's instantiate a Queue for this agent right now TryGetQueue(agentID); - string capsBase = "/CAPS/EQG/"; - UUID EventQueueGetUUID = UUID.Zero; + UUID eventQueueGetUUID; lock (m_AvatarQueueUUIDMapping) { @@ -325,37 +336,35 @@ namespace OpenSim.Region.ClientStack.Linden if (m_AvatarQueueUUIDMapping.ContainsKey(agentID)) { //m_log.DebugFormat("[EVENTQUEUE]: Found Existing UUID!"); - EventQueueGetUUID = m_AvatarQueueUUIDMapping[agentID]; + eventQueueGetUUID = m_AvatarQueueUUIDMapping[agentID]; } else { - EventQueueGetUUID = UUID.Random(); + eventQueueGetUUID = UUID.Random(); //m_log.DebugFormat("[EVENTQUEUE]: Using random UUID!"); } } lock (m_QueueUUIDAvatarMapping) { - if (!m_QueueUUIDAvatarMapping.ContainsKey(EventQueueGetUUID)) - m_QueueUUIDAvatarMapping.Add(EventQueueGetUUID, agentID); + if (!m_QueueUUIDAvatarMapping.ContainsKey(eventQueueGetUUID)) + m_QueueUUIDAvatarMapping.Add(eventQueueGetUUID, agentID); } lock (m_AvatarQueueUUIDMapping) { if (!m_AvatarQueueUUIDMapping.ContainsKey(agentID)) - m_AvatarQueueUUIDMapping.Add(agentID, EventQueueGetUUID); + m_AvatarQueueUUIDMapping.Add(agentID, eventQueueGetUUID); } + string eventQueueGetPath = GenerateEqgCapPath(eventQueueGetUUID); + // Register this as a caps handler // FIXME: Confusingly, we need to register separate as a capability so that the client is told about // EventQueueGet when it receive capability information, but then we replace the rest handler immediately // afterwards with the poll service. So for now, we'll pass a null instead to simplify code reading, but // really it should be possible to directly register the poll handler as a capability. - caps.RegisterHandler( - "EventQueueGet", - new RestHTTPHandler( - "POST", capsBase + EventQueueGetUUID.ToString() + "/", null)); - + caps.RegisterHandler("EventQueueGet", new RestHTTPHandler("POST", eventQueueGetPath, null)); // delegate(Hashtable m_dhttpMethod) // { // return ProcessQueue(m_dhttpMethod, agentID, caps); @@ -364,9 +373,13 @@ namespace OpenSim.Region.ClientStack.Linden // This will persist this beyond the expiry of the caps handlers // TODO: Add EventQueueGet name/description for diagnostics MainServer.Instance.AddPollServiceHTTPHandler( - capsBase + EventQueueGetUUID.ToString() + "/", + eventQueueGetPath, new PollServiceEventArgs(null, HasEvents, GetEvents, NoEvents, agentID)); +// m_log.DebugFormat( +// "[EVENT QUEUE GET MODULE]: Registered EQG handler {0} for {1} in {2}", +// eventQueueGetPath, agentID, m_scene.RegionInfo.RegionName); + Random rnd = new Random(Environment.TickCount); lock (m_ids) { diff --git a/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs b/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs index 1b1c44a95f..54b69a2c73 100644 --- a/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs +++ b/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs @@ -1274,7 +1274,7 @@ namespace OpenSim.Region.Physics.OdePlugin // Don't clear collision event reporting here. This is called directly from scene code and so can lead // to a race condition with the simulate loop - + m_requestedUpdateFrequency = 0; m_eventsubscription = 0; } From 565c73751cd1ac9b09393a0801591ced04d7e635 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 18 May 2012 00:49:39 +0100 Subject: [PATCH 229/547] Invoke log4net configurator in pCampBot.exe in order to get OpenSim sylte logging --- OpenSim/Tools/pCampBot/pCampBot.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/OpenSim/Tools/pCampBot/pCampBot.cs b/OpenSim/Tools/pCampBot/pCampBot.cs index 52e750185a..9e82577be5 100644 --- a/OpenSim/Tools/pCampBot/pCampBot.cs +++ b/OpenSim/Tools/pCampBot/pCampBot.cs @@ -29,6 +29,7 @@ using System; using System.Reflection; using System.Threading; using log4net; +using log4net.Config; using Nini.Config; using OpenSim.Framework; using OpenSim.Framework.Console; @@ -52,6 +53,8 @@ namespace pCampBot [STAThread] public static void Main(string[] args) { + XmlConfigurator.Configure(); + IConfig config = ParseConfig(args); if (config.Get("help") != null || config.Get("loginuri") == null) { From 45af29291acd22700d9fc4c442655d2e3f19a0b0 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 18 May 2012 03:43:36 +0100 Subject: [PATCH 230/547] Add level 2 debug eq logging which logs event queue polls. Refactor: eq message logging into common method. --- .../Caps/EventQueue/EventQueueGetModule.cs | 55 +++++++++++-------- 1 file changed, 32 insertions(+), 23 deletions(-) diff --git a/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/EventQueueGetModule.cs b/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/EventQueueGetModule.cs index 005461916c..6ac19cc5b0 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/EventQueueGetModule.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/EventQueueGetModule.cs @@ -109,10 +109,11 @@ namespace OpenSim.Region.ClientStack.Linden "Comms", false, "debug eq", - "debug eq [0|1]", - "Turn on event queue debugging", - "debug eq 1 will turn on event queue debugging. This will log all outgoing event queue messages to clients.\n" - + "debug eq 0 will turn off event queue debugging.", + "debug eq [0|1|2]", + "Turn on event queue debugging", + "<= 0 - turns off all event queue logging", + ">= 1 - turns on outgoing event logging", + ">= 2 - turns on poll notification", HandleDebugEq); } else @@ -270,7 +271,9 @@ namespace OpenSim.Region.ClientStack.Linden string eqgPath = GenerateEqgCapPath(eventQueueGetUuid); MainServer.Instance.RemovePollServiceHTTPHandler("", eqgPath); -// m_log.DebugFormat("[EVENT QUEUE GET MODULE]: Removed EQG handler {0} for {1}", eqgPath, agentID); + m_log.DebugFormat( + "[EVENT QUEUE GET MODULE]: Removed EQG handler {0} for {1} in {2}", + eqgPath, agentID, m_scene.RegionInfo.RegionName); } } @@ -376,9 +379,9 @@ namespace OpenSim.Region.ClientStack.Linden eventQueueGetPath, new PollServiceEventArgs(null, HasEvents, GetEvents, NoEvents, agentID)); -// m_log.DebugFormat( -// "[EVENT QUEUE GET MODULE]: Registered EQG handler {0} for {1} in {2}", -// eventQueueGetPath, agentID, m_scene.RegionInfo.RegionName); + m_log.DebugFormat( + "[EVENT QUEUE GET MODULE]: Registered EQG handler {0} for {1} in {2}", + eventQueueGetPath, agentID, m_scene.RegionInfo.RegionName); Random rnd = new Random(Environment.TickCount); lock (m_ids) @@ -401,9 +404,25 @@ namespace OpenSim.Region.ClientStack.Linden return false; } + /// + /// Logs a debug line for an outbound event queue message if appropriate. + /// + /// Element containing message + private void LogOutboundDebugMessage(OSD element, UUID agentId) + { + if (element is OSDMap) + { + OSDMap ev = (OSDMap)element; + m_log.DebugFormat( + "Eq OUT {0,-30} to {1,-20} {2,-20}", + ev["message"], m_scene.GetScenePresence(agentId).Name, m_scene.RegionInfo.RegionName); + } + } + public Hashtable GetEvents(UUID requestID, UUID pAgentId, string request) { -// m_log.DebugFormat("[EVENT QUEUE GET MODULE]: Invoked GetEvents() for {0}", pAgentId); + if (DebugLevel >= 2) + m_log.DebugFormat("POLLED FOR EQ MESSAGES BY {0} in {1}", pAgentId, m_scene.RegionInfo.RegionName); Queue queue = TryGetQueue(pAgentId); OSD element; @@ -427,13 +446,8 @@ namespace OpenSim.Region.ClientStack.Linden } else { - if (DebugLevel > 0 && element is OSDMap) - { - OSDMap ev = (OSDMap)element; - m_log.DebugFormat( - "[EVENT QUEUE GET MODULE]: Eq OUT {0} to {1}", - ev["message"], m_scene.GetScenePresence(pAgentId).Name); - } + if (DebugLevel > 0) + LogOutboundDebugMessage(element, pAgentId); array.Add(element); @@ -443,13 +457,8 @@ namespace OpenSim.Region.ClientStack.Linden { element = queue.Dequeue(); - if (DebugLevel > 0 && element is OSDMap) - { - OSDMap ev = (OSDMap)element; - m_log.DebugFormat( - "[EVENT QUEUE GET MODULE]: Eq OUT {0} to {1}", - ev["message"], m_scene.GetScenePresence(pAgentId).Name); - } + if (DebugLevel > 0) + LogOutboundDebugMessage(element, pAgentId); array.Add(element); thisID++; From 90722875e8518a6679441b0225ae2f11245bcfe0 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 18 May 2012 03:44:31 +0100 Subject: [PATCH 231/547] Add millisecond logging to pCampBot for debugging purposes --- bin/pCampBot.exe.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/pCampBot.exe.config b/bin/pCampBot.exe.config index 3f19ee855d..9cfb7e91e4 100644 --- a/bin/pCampBot.exe.config +++ b/bin/pCampBot.exe.config @@ -8,7 +8,7 @@ - + From 0147dc63028e2d77a568c6d9d5af1c9f05286f62 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 18 May 2012 03:50:23 +0100 Subject: [PATCH 232/547] Fix build break. Comment out EQG deregister/register logging. --- .../Caps/EventQueue/EventQueueGetModule.cs | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/EventQueueGetModule.cs b/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/EventQueueGetModule.cs index 6ac19cc5b0..ae759caae2 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/EventQueueGetModule.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/EventQueueGetModule.cs @@ -110,10 +110,10 @@ namespace OpenSim.Region.ClientStack.Linden false, "debug eq", "debug eq [0|1|2]", - "Turn on event queue debugging", - "<= 0 - turns off all event queue logging", - ">= 1 - turns on outgoing event logging", - ">= 2 - turns on poll notification", + "Turn on event queue debugging" + + "<= 0 - turns off all event queue logging" + + ">= 1 - turns on outgoing event logging" + + ">= 2 - turns on poll notification", HandleDebugEq); } else @@ -271,9 +271,9 @@ namespace OpenSim.Region.ClientStack.Linden string eqgPath = GenerateEqgCapPath(eventQueueGetUuid); MainServer.Instance.RemovePollServiceHTTPHandler("", eqgPath); - m_log.DebugFormat( - "[EVENT QUEUE GET MODULE]: Removed EQG handler {0} for {1} in {2}", - eqgPath, agentID, m_scene.RegionInfo.RegionName); +// m_log.DebugFormat( +// "[EVENT QUEUE GET MODULE]: Removed EQG handler {0} for {1} in {2}", +// eqgPath, agentID, m_scene.RegionInfo.RegionName); } } @@ -379,9 +379,9 @@ namespace OpenSim.Region.ClientStack.Linden eventQueueGetPath, new PollServiceEventArgs(null, HasEvents, GetEvents, NoEvents, agentID)); - m_log.DebugFormat( - "[EVENT QUEUE GET MODULE]: Registered EQG handler {0} for {1} in {2}", - eventQueueGetPath, agentID, m_scene.RegionInfo.RegionName); +// m_log.DebugFormat( +// "[EVENT QUEUE GET MODULE]: Registered EQG handler {0} for {1} in {2}", +// eventQueueGetPath, agentID, m_scene.RegionInfo.RegionName); Random rnd = new Random(Environment.TickCount); lock (m_ids) From c05f87b50c32c08818c291c76e46cb558083d35d Mon Sep 17 00:00:00 2001 From: BlueWall Date: Fri, 18 May 2012 17:47:00 -0400 Subject: [PATCH 233/547] Provide Telehub setting to allow use of landmarks Setting to allow use of landmarks to override telehub routing. Default is off. --- OpenSim/Region/Framework/Scenes/Scene.cs | 7 +++++++ OpenSim/Region/Framework/Scenes/ScenePresence.cs | 3 ++- bin/OpenSim.ini.example | 5 +++++ 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 3cce370262..d09b8957cf 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -577,6 +577,12 @@ namespace OpenSim.Region.Framework.Scenes { get { return m_SpawnPointRouting; } } + // allow landmarks to pass + private bool m_TelehubAllowLandmarks; + public bool TelehubAllowLandmarks + { + get { return m_TelehubAllowLandmarks; } + } #endregion Properties @@ -733,6 +739,7 @@ namespace OpenSim.Region.Framework.Scenes m_defaultScriptEngine = startupConfig.GetString("DefaultScriptEngine", "XEngine"); m_SpawnPointRouting = startupConfig.GetString("SpawnPointRouting", "closest"); + m_TelehubAllowLandmarks = startupConfig.GetBoolean("TelehubAllowLandmark", false); IConfig packetConfig = m_config.Configs["PacketPool"]; if (packetConfig != null) diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index 0c66e49ff8..602217596c 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs @@ -3929,7 +3929,8 @@ namespace OpenSim.Region.Framework.Scenes { if ((m_teleportFlags & (TeleportFlags.ViaLogin | TeleportFlags.ViaRegionID)) == (TeleportFlags.ViaLogin | TeleportFlags.ViaRegionID) || - (m_teleportFlags & TeleportFlags.ViaLandmark) != 0 || + // (m_teleportFlags & TeleportFlags.ViaLandmark) != 0 || + (m_scene.TelehubAllowLandmarks == true ? false : ((m_teleportFlags & TeleportFlags.ViaLandmark) != 0 )) || (m_teleportFlags & TeleportFlags.ViaLocation) != 0 || (m_teleportFlags & Constants.TeleportFlags.ViaHGLogin) != 0) { diff --git a/bin/OpenSim.ini.example b/bin/OpenSim.ini.example index 9f418a40dd..aa29c079ca 100755 --- a/bin/OpenSim.ini.example +++ b/bin/OpenSim.ini.example @@ -249,6 +249,11 @@ ;; "sequence" will place the avatar on the next sequential SpawnPoint ; SpawnPointRouting = closest + ;# {TelehubAllowLandmark} {} {Allow users with landmarks to override telehub routing} {true false} false + ;; TelehubAllowLandmark allows users with landmarks to override telehub routing and land at the landmark coordinates when set to true + ;; default is false + ; TelehubAllowLandmark = false + [Estates] ; If these values are commented out then the user will be asked for estate details when required (this is the normal case). ; If these values are uncommented then they will be used to create a default estate as necessary. From 896cd459391809d2fb140fe345c78f8b952232d8 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 18 May 2012 23:55:18 +0100 Subject: [PATCH 234/547] Fix issue where a new outfit folder is not created when a new outfit is saved if there are no previous outfits This was because AddFolder() was disallowing these though they are legal. --- .../Services/InventoryService/XInventoryService.cs | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/OpenSim/Services/InventoryService/XInventoryService.cs b/OpenSim/Services/InventoryService/XInventoryService.cs index 15156d0537..eed88bd391 100644 --- a/OpenSim/Services/InventoryService/XInventoryService.cs +++ b/OpenSim/Services/InventoryService/XInventoryService.cs @@ -307,14 +307,20 @@ namespace OpenSim.Services.InventoryService if (check != null) return false; - if (folder.Type == (short)AssetType.Folder || folder.Type == (short)AssetType.Unknown || - GetFolderForType(folder.Owner, (AssetType)(folder.Type)) == null) + if (folder.Type == (short)AssetType.Folder + || folder.Type == (short)AssetType.Unknown + || folder.Type == (short)AssetType.OutfitFolder + || GetFolderForType(folder.Owner, (AssetType)(folder.Type)) == null) { XInventoryFolder xFolder = ConvertFromOpenSim(folder); return m_Database.StoreFolder(xFolder); } else - m_log.DebugFormat("[XINVENTORY]: Folder {0} of type {1} already exists", folder.Name, folder.Type); + { + m_log.WarnFormat( + "[XINVENTORY]: Folder of type {0} already exists when tried to add {1} to {2} for {3}", + folder.Type, folder.Name, folder.ParentID, folder.Owner); + } return false; } From 9fa0577c7e4e710a5751c01b568b6453d513558e Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Sat, 19 May 2012 00:00:52 +0100 Subject: [PATCH 235/547] Enable FetchInventoryDescendents2 and FetchInventory2 caps by default. This appears to be required now for LL 3.3.1 to work properly. Without this, LL 3.3.1 continually pushes LLInventoryModelFetchDescendentsResponder::error 499 to its log. This cap will be ignored by older viewers - UDP inventory will work normally. --- bin/OpenSimDefaults.ini | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/bin/OpenSimDefaults.ini b/bin/OpenSimDefaults.ini index cb9ef224fb..7962ef8930 100644 --- a/bin/OpenSimDefaults.ini +++ b/bin/OpenSimDefaults.ini @@ -601,13 +601,12 @@ Cap_ViewerStartAuction = "" Cap_ViewerStats = "" - ; The various fetch inventory caps are supported by OpenSim, but may - ; lead to poor sim performance if served by the simulators, - ; so they are currently disabled by default. + ; Capabilities for fetching inventory over HTTP rather than UDP ; FetchInventoryDescendents2 and FetchInventory2 are the ones used in the latest Linden Lab viewers (from some point in the v2 series and above) + ; It appears that Linden Lab viewer 3.3.1 onwards will not work properly if FetchInventoryDescendents2 and FetchInventory2 are not enabled Cap_WebFetchInventoryDescendents = "" - Cap_FetchInventoryDescendents2 = "" - Cap_FetchInventory2 = "" + Cap_FetchInventoryDescendents2 = "localhost" + Cap_FetchInventory2 = "localhost" [Chat] From 895dadbdbdc0468fd1a0a9e146e1bf65279a2de7 Mon Sep 17 00:00:00 2001 From: BlueWall Date: Fri, 18 May 2012 19:32:26 -0400 Subject: [PATCH 236/547] Cleanup + change properties to set fields with private set : Thanks Justin for the tip. --- OpenSim/Region/Framework/Scenes/Scene.cs | 6 ++++-- OpenSim/Region/Framework/Scenes/ScenePresence.cs | 1 - 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index d09b8957cf..29eed677bd 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -576,12 +576,14 @@ namespace OpenSim.Region.Framework.Scenes public string SpawnPointRouting { get { return m_SpawnPointRouting; } + private set { m_SpawnPointRouting = value; } } // allow landmarks to pass private bool m_TelehubAllowLandmarks; public bool TelehubAllowLandmarks { get { return m_TelehubAllowLandmarks; } + private set { m_TelehubAllowLandmarks = value; } } #endregion Properties @@ -738,8 +740,8 @@ namespace OpenSim.Region.Framework.Scenes m_defaultScriptEngine = startupConfig.GetString("DefaultScriptEngine", "XEngine"); - m_SpawnPointRouting = startupConfig.GetString("SpawnPointRouting", "closest"); - m_TelehubAllowLandmarks = startupConfig.GetBoolean("TelehubAllowLandmark", false); + SpawnPointRouting = startupConfig.GetString("SpawnPointRouting", "closest"); + TelehubAllowLandmarks = startupConfig.GetBoolean("TelehubAllowLandmark", false); IConfig packetConfig = m_config.Configs["PacketPool"]; if (packetConfig != null) diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index 602217596c..3adafc1b74 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs @@ -3929,7 +3929,6 @@ namespace OpenSim.Region.Framework.Scenes { if ((m_teleportFlags & (TeleportFlags.ViaLogin | TeleportFlags.ViaRegionID)) == (TeleportFlags.ViaLogin | TeleportFlags.ViaRegionID) || - // (m_teleportFlags & TeleportFlags.ViaLandmark) != 0 || (m_scene.TelehubAllowLandmarks == true ? false : ((m_teleportFlags & TeleportFlags.ViaLandmark) != 0 )) || (m_teleportFlags & TeleportFlags.ViaLocation) != 0 || (m_teleportFlags & Constants.TeleportFlags.ViaHGLogin) != 0) From 247a56593fe132e6412612248ceaacaf324c50d8 Mon Sep 17 00:00:00 2001 From: BlueWall Date: Fri, 18 May 2012 19:56:46 -0400 Subject: [PATCH 237/547] Further refinement on properties --- OpenSim/Region/Framework/Scenes/Scene.cs | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 29eed677bd..5a0f56441f 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -569,21 +569,18 @@ namespace OpenSim.Region.Framework.Scenes get { return m_sceneGraph.Entities; } } - // can be closest/random/sequence - private string m_SpawnPointRouting = "closest"; + // used in sequence see: SpawnPoint() private int m_SpawnPoint; + // can be closest/random/sequence public string SpawnPointRouting { - get { return m_SpawnPointRouting; } - private set { m_SpawnPointRouting = value; } + get; private set; } // allow landmarks to pass - private bool m_TelehubAllowLandmarks; public bool TelehubAllowLandmarks { - get { return m_TelehubAllowLandmarks; } - private set { m_TelehubAllowLandmarks = value; } + get; private set; } #endregion Properties From 2b60a5c5d64f38caf243119105416c1101c6eb6c Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Sat, 19 May 2012 02:45:17 +0100 Subject: [PATCH 238/547] Add is_megaregion flag into oar control file. Not currently read - for future use. Please do not rely on this remaining here. An adaptation of part of Garmin's patch from http://opensimulator.org/mantis/view.php?id=5975, thanks! Flag only written if the SW corner OAR is saved - this is the only one that captures object data presently (though not land or terrain data). This adds an IRegionCombinerModule interface and the necessary methods on RegionCombinerModule --- .../ArchiveWriteRequestPreparation.cs | 89 +++++++++++++------ .../World/Archiver/ArchiverModule.cs | 20 +++-- .../Interfaces/IRegionCombinerModule.cs | 51 +++++++++++ .../RegionCombinerModule.cs | 22 ++++- 4 files changed, 142 insertions(+), 40 deletions(-) create mode 100644 OpenSim/Region/Framework/Interfaces/IRegionCombinerModule.cs diff --git a/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestPreparation.cs b/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestPreparation.cs index 5679ad5dcb..838b741fdc 100644 --- a/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestPreparation.cs +++ b/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestPreparation.cs @@ -67,7 +67,8 @@ namespace OpenSim.Region.CoreModules.World.Archiver /// Determine whether this archive will save assets. Default is true. /// public bool SaveAssets { get; set; } - + + protected ArchiverModule m_module; protected Scene m_scene; protected Stream m_saveStream; protected Guid m_requestId; @@ -75,13 +76,13 @@ namespace OpenSim.Region.CoreModules.World.Archiver /// /// Constructor /// - /// + /// Calling module /// The path to which to save data. /// The id associated with this request /// /// If there was a problem opening a stream for the file specified by the savePath /// - public ArchiveWriteRequestPreparation(Scene scene, string savePath, Guid requestId) : this(scene, requestId) + public ArchiveWriteRequestPreparation(ArchiverModule module, string savePath, Guid requestId) : this(module, requestId) { try { @@ -99,17 +100,23 @@ namespace OpenSim.Region.CoreModules.World.Archiver /// /// Constructor. /// - /// + /// Calling module /// The stream to which to save data. /// The id associated with this request - public ArchiveWriteRequestPreparation(Scene scene, Stream saveStream, Guid requestId) : this(scene, requestId) + public ArchiveWriteRequestPreparation(ArchiverModule module, Stream saveStream, Guid requestId) : this(module, requestId) { m_saveStream = saveStream; } - protected ArchiveWriteRequestPreparation(Scene scene, Guid requestId) + protected ArchiveWriteRequestPreparation(ArchiverModule module, Guid requestId) { - m_scene = scene; + m_module = module; + + // FIXME: This is only here for regression test purposes since they do not supply a module. Need to fix + // this. + if (m_module != null) + m_scene = m_module.Scene; + m_requestId = requestId; SaveAssets = true; @@ -364,32 +371,56 @@ namespace OpenSim.Region.CoreModules.World.Archiver //if (majorVersion == 1) //{ // m_log.WarnFormat("[ARCHIVER]: Please be aware that version 1.0 OARs are not compatible with OpenSim 0.7.0.2 and earlier. Please use the --version=0 option if you want to produce a compatible OAR"); - //} + //} + + String s; - StringWriter sw = new StringWriter(); - XmlTextWriter xtw = new XmlTextWriter(sw); - xtw.Formatting = Formatting.Indented; - xtw.WriteStartDocument(); - xtw.WriteStartElement("archive"); - xtw.WriteAttributeString("major_version", majorVersion.ToString()); - xtw.WriteAttributeString("minor_version", minorVersion.ToString()); + using (StringWriter sw = new StringWriter()) + { + using (XmlTextWriter xtw = new XmlTextWriter(sw)) + { + xtw.Formatting = Formatting.Indented; + xtw.WriteStartDocument(); + xtw.WriteStartElement("archive"); + xtw.WriteAttributeString("major_version", majorVersion.ToString()); + xtw.WriteAttributeString("minor_version", minorVersion.ToString()); + + xtw.WriteStartElement("creation_info"); + DateTime now = DateTime.UtcNow; + TimeSpan t = now - new DateTime(1970, 1, 1); + xtw.WriteElementString("datetime", ((int)t.TotalSeconds).ToString()); + xtw.WriteElementString("id", UUID.Random().ToString()); + xtw.WriteEndElement(); + + xtw.WriteElementString("assets_included", SaveAssets.ToString()); + + bool isMegaregion; - xtw.WriteStartElement("creation_info"); - DateTime now = DateTime.UtcNow; - TimeSpan t = now - new DateTime(1970, 1, 1); - xtw.WriteElementString("datetime", ((int)t.TotalSeconds).ToString()); - xtw.WriteElementString("id", UUID.Random().ToString()); - xtw.WriteEndElement(); + // FIXME: This is only here for regression test purposes since they do not supply a module. Need to fix + // this, possibly by doing control file creation somewhere else. + if (m_module != null && m_module.RegionCombinerModule != null) + { + IRegionCombinerModule mod = m_module.RegionCombinerModule; + isMegaregion = mod.IsMegaregion && mod.IsRootRegion(m_scene.RegionInfo.RegionID); + } + else + { + isMegaregion = false; + } + + xtw.WriteElementString("is_megaregion", isMegaregion.ToString()); + + xtw.WriteEndElement(); + + xtw.Flush(); + xtw.Close(); + } - xtw.WriteElementString("assets_included", SaveAssets.ToString()); + s = sw.ToString(); + } - xtw.WriteEndElement(); - - xtw.Flush(); - xtw.Close(); - - String s = sw.ToString(); - sw.Close(); +// Console.WriteLine( +// "[ARCHIVE WRITE REQUEST PREPARATION]: Control file for {0} is: {1}", m_scene.RegionInfo.RegionName, s); return s; } diff --git a/OpenSim/Region/CoreModules/World/Archiver/ArchiverModule.cs b/OpenSim/Region/CoreModules/World/Archiver/ArchiverModule.cs index f5a5a8d1be..bf3b1240a4 100644 --- a/OpenSim/Region/CoreModules/World/Archiver/ArchiverModule.cs +++ b/OpenSim/Region/CoreModules/World/Archiver/ArchiverModule.cs @@ -45,7 +45,8 @@ namespace OpenSim.Region.CoreModules.World.Archiver private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - private Scene m_scene; + public Scene Scene { get; private set; } + public IRegionCombinerModule RegionCombinerModule { get; private set; } /// /// The file used to load and save an opensimulator archive if no filename has been specified @@ -70,13 +71,14 @@ namespace OpenSim.Region.CoreModules.World.Archiver public void AddRegion(Scene scene) { - m_scene = scene; - m_scene.RegisterModuleInterface(this); + Scene = scene; + Scene.RegisterModuleInterface(this); //m_log.DebugFormat("[ARCHIVER]: Enabled for region {0}", scene.RegionInfo.RegionName); } public void RegionLoaded(Scene scene) { + RegionCombinerModule = scene.RequestModuleInterface(); } public void RemoveRegion(Scene scene) @@ -165,9 +167,9 @@ namespace OpenSim.Region.CoreModules.World.Archiver public void ArchiveRegion(string savePath, Guid requestId, Dictionary options) { m_log.InfoFormat( - "[ARCHIVER]: Writing archive for region {0} to {1}", m_scene.RegionInfo.RegionName, savePath); + "[ARCHIVER]: Writing archive for region {0} to {1}", Scene.RegionInfo.RegionName, savePath); - new ArchiveWriteRequestPreparation(m_scene, savePath, requestId).ArchiveRegion(options); + new ArchiveWriteRequestPreparation(this, savePath, requestId).ArchiveRegion(options); } public void ArchiveRegion(Stream saveStream) @@ -182,7 +184,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver public void ArchiveRegion(Stream saveStream, Guid requestId, Dictionary options) { - new ArchiveWriteRequestPreparation(m_scene, saveStream, requestId).ArchiveRegion(options); + new ArchiveWriteRequestPreparation(this, saveStream, requestId).ArchiveRegion(options); } public void DearchiveRegion(string loadPath) @@ -193,9 +195,9 @@ namespace OpenSim.Region.CoreModules.World.Archiver public void DearchiveRegion(string loadPath, bool merge, bool skipAssets, Guid requestId) { m_log.InfoFormat( - "[ARCHIVER]: Loading archive to region {0} from {1}", m_scene.RegionInfo.RegionName, loadPath); + "[ARCHIVER]: Loading archive to region {0} from {1}", Scene.RegionInfo.RegionName, loadPath); - new ArchiveReadRequest(m_scene, loadPath, merge, skipAssets, requestId).DearchiveRegion(); + new ArchiveReadRequest(Scene, loadPath, merge, skipAssets, requestId).DearchiveRegion(); } public void DearchiveRegion(Stream loadStream) @@ -205,7 +207,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver public void DearchiveRegion(Stream loadStream, bool merge, bool skipAssets, Guid requestId) { - new ArchiveReadRequest(m_scene, loadStream, merge, skipAssets, requestId).DearchiveRegion(); + new ArchiveReadRequest(Scene, loadStream, merge, skipAssets, requestId).DearchiveRegion(); } } } diff --git a/OpenSim/Region/Framework/Interfaces/IRegionCombinerModule.cs b/OpenSim/Region/Framework/Interfaces/IRegionCombinerModule.cs new file mode 100644 index 0000000000..30e49b12a6 --- /dev/null +++ b/OpenSim/Region/Framework/Interfaces/IRegionCombinerModule.cs @@ -0,0 +1,51 @@ +/* + * Copyright (c) Contributors, http://opensimulator.org/ + * See CONTRIBUTORS.TXT for a full list of copyright holders. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the OpenSimulator Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using OpenSim.Region.Framework.Scenes; +using System.IO; +using OpenMetaverse; + +namespace OpenSim.Region.Framework.Interfaces +{ + public interface IRegionCombinerModule + { + /// + /// Is this simulator hosting a megaregion? + /// + /// + bool IsMegaregion { get; } + + /// + /// Does the given id belong to the root region of the megaregion? + /// + bool IsRootRegion(UUID sceneId); + } +} \ No newline at end of file diff --git a/OpenSim/Region/RegionCombinerModule/RegionCombinerModule.cs b/OpenSim/Region/RegionCombinerModule/RegionCombinerModule.cs index a142f26be2..37b3037ca6 100644 --- a/OpenSim/Region/RegionCombinerModule/RegionCombinerModule.cs +++ b/OpenSim/Region/RegionCombinerModule/RegionCombinerModule.cs @@ -43,9 +43,8 @@ using Mono.Addins; [assembly: AddinDependency("OpenSim", "0.5")] namespace OpenSim.Region.RegionCombinerModule { - [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule")] - public class RegionCombinerModule : ISharedRegionModule + public class RegionCombinerModule : ISharedRegionModule, IRegionCombinerModule { private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); @@ -59,6 +58,15 @@ namespace OpenSim.Region.RegionCombinerModule get { return null; } } + public bool IsMegaregion + { + get + { + lock (m_startingScenes) + return m_startingScenes.Count > 1; + } + } + private Dictionary m_regions = new Dictionary(); private bool enabledYN = false; private Dictionary m_startingScenes = new Dictionary(); @@ -69,9 +77,11 @@ namespace OpenSim.Region.RegionCombinerModule enabledYN = myConfig.GetBoolean("CombineContiguousRegions", false); if (enabledYN) + { MainConsole.Instance.Commands.AddCommand( "RegionCombinerModule", false, "fix-phantoms", "fix-phantoms", "Fixes phantom objects after an import to megaregions", FixPhantoms); + } } public void Close() @@ -80,6 +90,8 @@ namespace OpenSim.Region.RegionCombinerModule public void AddRegion(Scene scene) { + if (enabledYN) + scene.RegisterModuleInterface(this); } public void RemoveRegion(Scene scene) @@ -96,6 +108,12 @@ namespace OpenSim.Region.RegionCombinerModule } } + public bool IsRootRegion(UUID sceneId) + { + lock (m_regions) + return m_regions.ContainsKey(sceneId); + } + private void NewPresence(ScenePresence presence) { if (presence.IsChildAgent) From 26dfcf5395474041e6719da20d7ecb847dd0ee38 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Sat, 19 May 2012 03:07:24 +0100 Subject: [PATCH 239/547] Add some method doc to RegionCombinerModule. Clean up log messages. --- .../RegionCombinerModule.cs | 39 ++++++++++++++----- 1 file changed, 29 insertions(+), 10 deletions(-) diff --git a/OpenSim/Region/RegionCombinerModule/RegionCombinerModule.cs b/OpenSim/Region/RegionCombinerModule/RegionCombinerModule.cs index 37b3037ca6..3af5cc2b29 100644 --- a/OpenSim/Region/RegionCombinerModule/RegionCombinerModule.cs +++ b/OpenSim/Region/RegionCombinerModule/RegionCombinerModule.cs @@ -67,8 +67,22 @@ namespace OpenSim.Region.RegionCombinerModule } } + /// + /// This holds the root regions for the megaregions. + /// + /// + /// At this point we can actually assume there is only ever one megaregion (and hence only one entry here). + /// private Dictionary m_regions = new Dictionary(); + + /// + /// Is this module enabled? + /// private bool enabledYN = false; + + /// + /// The scenes that comprise the megaregion. + /// private Dictionary m_startingScenes = new Dictionary(); public void Initialise(IConfigSource source) @@ -448,9 +462,9 @@ namespace OpenSim.Region.RegionCombinerModule if (!connectedYN) { DoWorkForRootRegion(regionConnections, scene); - } } + // Set up infinite borders around the entire AABB of the combined ConnectedRegions AdjustLargeRegionBounds(); } @@ -469,9 +483,10 @@ namespace OpenSim.Region.RegionCombinerModule conn.UpdateExtents(extents); - m_log.DebugFormat("Scene: {0} to the west of Scene{1} Offset: {2}. Extents:{3}", - conn.RegionScene.RegionInfo.RegionName, - regionConnections.RegionScene.RegionInfo.RegionName, offset, extents); + m_log.DebugFormat( + "[REGION COMBINER MODULE]: Scene {0} to the west of Scene {1}, Offset: {2}, Extents: {3}", + conn.RegionScene.RegionInfo.RegionName, + regionConnections.RegionScene.RegionInfo.RegionName, offset, extents); scene.BordersLocked = true; conn.RegionScene.BordersLocked = true; @@ -547,9 +562,10 @@ namespace OpenSim.Region.RegionCombinerModule ConnectedRegion.RegionScene = scene; conn.ConnectedRegions.Add(ConnectedRegion); - m_log.DebugFormat("Scene: {0} to the northeast of Scene{1} Offset: {2}. Extents:{3}", - conn.RegionScene.RegionInfo.RegionName, - regionConnections.RegionScene.RegionInfo.RegionName, offset, extents); + m_log.DebugFormat( + "[REGION COMBINER MODULE]: Scene: {0} to the northeast of Scene {1}, Offset: {2}, Extents: {3}", + conn.RegionScene.RegionInfo.RegionName, + regionConnections.RegionScene.RegionInfo.RegionName, offset, extents); conn.RegionScene.PhysicsScene.Combine(null, Vector3.Zero, extents); scene.PhysicsScene.Combine(conn.RegionScene.PhysicsScene, offset, Vector3.Zero); @@ -602,9 +618,10 @@ namespace OpenSim.Region.RegionCombinerModule conn.ConnectedRegions.Add(ConnectedRegion); - m_log.DebugFormat("Scene: {0} to the NorthEast of Scene{1} Offset: {2}. Extents:{3}", - conn.RegionScene.RegionInfo.RegionName, - regionConnections.RegionScene.RegionInfo.RegionName, offset, extents); + m_log.DebugFormat( + "[REGION COMBINER MODULE]: Scene: {0} to the NorthEast of Scene {1}, Offset: {2}, Extents: {3}", + conn.RegionScene.RegionInfo.RegionName, + regionConnections.RegionScene.RegionInfo.RegionName, offset, extents); conn.RegionScene.PhysicsScene.Combine(null, Vector3.Zero, extents); scene.PhysicsScene.Combine(conn.RegionScene.PhysicsScene, offset, Vector3.Zero); @@ -681,6 +698,8 @@ namespace OpenSim.Region.RegionCombinerModule private void DoWorkForRootRegion(RegionConnections regionConnections, Scene scene) { + m_log.DebugFormat("[REGION COMBINER MODULE]: Adding root region {0}", scene.RegionInfo.RegionName); + RegionData rdata = new RegionData(); rdata.Offset = Vector3.Zero; rdata.RegionId = scene.RegionInfo.originRegionID; From 3f2a727b6d6b0cf6c2e2c7ef11ebd0f3f1fefa83 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Sat, 19 May 2012 03:17:21 +0100 Subject: [PATCH 240/547] Remove recent IRegionCombinerModule.IsMegaregion(). In theory, there can be more than one megaregion in a simulator, separated by water. Rename IsRootRegion() to IsRootForMegaregion() --- .../Archiver/ArchiveWriteRequestPreparation.cs | 2 +- .../Framework/Interfaces/IRegionCombinerModule.cs | 10 ++-------- .../RegionCombinerModule/RegionCombinerModule.cs | 13 ++----------- 3 files changed, 5 insertions(+), 20 deletions(-) diff --git a/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestPreparation.cs b/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestPreparation.cs index 838b741fdc..e54774b339 100644 --- a/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestPreparation.cs +++ b/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestPreparation.cs @@ -401,7 +401,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver if (m_module != null && m_module.RegionCombinerModule != null) { IRegionCombinerModule mod = m_module.RegionCombinerModule; - isMegaregion = mod.IsMegaregion && mod.IsRootRegion(m_scene.RegionInfo.RegionID); + isMegaregion = mod.IsRootForMegaregion(m_scene.RegionInfo.RegionID); } else { diff --git a/OpenSim/Region/Framework/Interfaces/IRegionCombinerModule.cs b/OpenSim/Region/Framework/Interfaces/IRegionCombinerModule.cs index 30e49b12a6..ca4ed5cb2e 100644 --- a/OpenSim/Region/Framework/Interfaces/IRegionCombinerModule.cs +++ b/OpenSim/Region/Framework/Interfaces/IRegionCombinerModule.cs @@ -38,14 +38,8 @@ namespace OpenSim.Region.Framework.Interfaces public interface IRegionCombinerModule { /// - /// Is this simulator hosting a megaregion? + /// Does the given id belong to the root region of a megaregion? /// - /// - bool IsMegaregion { get; } - - /// - /// Does the given id belong to the root region of the megaregion? - /// - bool IsRootRegion(UUID sceneId); + bool IsRootForMegaregion(UUID sceneId); } } \ No newline at end of file diff --git a/OpenSim/Region/RegionCombinerModule/RegionCombinerModule.cs b/OpenSim/Region/RegionCombinerModule/RegionCombinerModule.cs index 3af5cc2b29..fadc30d39f 100644 --- a/OpenSim/Region/RegionCombinerModule/RegionCombinerModule.cs +++ b/OpenSim/Region/RegionCombinerModule/RegionCombinerModule.cs @@ -58,20 +58,11 @@ namespace OpenSim.Region.RegionCombinerModule get { return null; } } - public bool IsMegaregion - { - get - { - lock (m_startingScenes) - return m_startingScenes.Count > 1; - } - } - /// /// This holds the root regions for the megaregions. /// /// - /// At this point we can actually assume there is only ever one megaregion (and hence only one entry here). + /// Usually there is only ever one megaregion (and hence only one entry here). /// private Dictionary m_regions = new Dictionary(); @@ -122,7 +113,7 @@ namespace OpenSim.Region.RegionCombinerModule } } - public bool IsRootRegion(UUID sceneId) + public bool IsRootForMegaregion(UUID sceneId) { lock (m_regions) return m_regions.ContainsKey(sceneId); From 4e5ac27928f0bdcb5bd7c772dbdcdd049d6ab4c4 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Sat, 19 May 2012 03:45:58 +0100 Subject: [PATCH 241/547] Make the megaregion total area given to the physics module accurate instead of over-inflated. This was previously over-inflated because adding a region to the NE of the root region resulted in double counting of regions already added. An accurate extent will also be necessary for other purposes. --- .../RegionCombinerModule/RegionCombinerModule.cs | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/OpenSim/Region/RegionCombinerModule/RegionCombinerModule.cs b/OpenSim/Region/RegionCombinerModule/RegionCombinerModule.cs index fadc30d39f..a2050b22e3 100644 --- a/OpenSim/Region/RegionCombinerModule/RegionCombinerModule.cs +++ b/OpenSim/Region/RegionCombinerModule/RegionCombinerModule.cs @@ -595,9 +595,15 @@ namespace OpenSim.Region.RegionCombinerModule ((conn.Y * (int)Constants.RegionSize))); Vector3 extents = Vector3.Zero; - extents.Y = regionConnections.YEnd + conn.YEnd; - extents.X = regionConnections.XEnd + conn.XEnd; - conn.UpdateExtents(extents); + + // We do not want to inflate the extents for regions strictly to the NE of the root region, since this + // would double count regions strictly to the north and east that have already been added. +// extents.Y = regionConnections.YEnd + conn.YEnd; +// extents.X = regionConnections.XEnd + conn.XEnd; +// conn.UpdateExtents(extents); + + extents.Y = conn.YEnd; + extents.X = conn.XEnd; scene.BordersLocked = true; conn.RegionScene.BordersLocked = true; From d7f90dee1ce0bd84200f327ce3f62697c876ef5b Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Sat, 19 May 2012 03:56:25 +0100 Subject: [PATCH 242/547] Correct some log messages in RegionCombinerModule about the position of the root region of a megaregion relative to an added region --- .../Region/RegionCombinerModule/RegionCombinerModule.cs | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/OpenSim/Region/RegionCombinerModule/RegionCombinerModule.cs b/OpenSim/Region/RegionCombinerModule/RegionCombinerModule.cs index a2050b22e3..95db22b90e 100644 --- a/OpenSim/Region/RegionCombinerModule/RegionCombinerModule.cs +++ b/OpenSim/Region/RegionCombinerModule/RegionCombinerModule.cs @@ -229,8 +229,6 @@ namespace OpenSim.Region.RegionCombinerModule westBorder.CrossDirection = Cardinals.W; scene.WestBorders[0] = westBorder; - - RegionConnections regionConnections = new RegionConnections(); regionConnections.ConnectedRegions = new List(); regionConnections.RegionScene = scene; @@ -475,7 +473,7 @@ namespace OpenSim.Region.RegionCombinerModule conn.UpdateExtents(extents); m_log.DebugFormat( - "[REGION COMBINER MODULE]: Scene {0} to the west of Scene {1}, Offset: {2}, Extents: {3}", + "[REGION COMBINER MODULE]: Root region {0} is to the west of region {1}, Offset: {2}, Extents: {3}", conn.RegionScene.RegionInfo.RegionName, regionConnections.RegionScene.RegionInfo.RegionName, offset, extents); @@ -554,7 +552,7 @@ namespace OpenSim.Region.RegionCombinerModule conn.ConnectedRegions.Add(ConnectedRegion); m_log.DebugFormat( - "[REGION COMBINER MODULE]: Scene: {0} to the northeast of Scene {1}, Offset: {2}, Extents: {3}", + "[REGION COMBINER MODULE]: Root region {0} is to the south of region {1}, Offset: {2}, Extents: {3}", conn.RegionScene.RegionInfo.RegionName, regionConnections.RegionScene.RegionInfo.RegionName, offset, extents); @@ -616,7 +614,7 @@ namespace OpenSim.Region.RegionCombinerModule conn.ConnectedRegions.Add(ConnectedRegion); m_log.DebugFormat( - "[REGION COMBINER MODULE]: Scene: {0} to the NorthEast of Scene {1}, Offset: {2}, Extents: {3}", + "[REGION COMBINER MODULE]: Region {0} is to the southwest of Scene {1}, Offset: {2}, Extents: {3}", conn.RegionScene.RegionInfo.RegionName, regionConnections.RegionScene.RegionInfo.RegionName, offset, extents); From fb8705dd4de2dc28b283b105f21c56e2ca9d89ff Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Sat, 19 May 2012 04:01:05 +0100 Subject: [PATCH 243/547] refactor: Rename connection paramaters from "conn" and "regionConnections" so that it's easy to tell whether they refer to the root region connection or a new region connection --- .../RegionCombinerModule.cs | 256 +++++++++--------- 1 file changed, 131 insertions(+), 125 deletions(-) diff --git a/OpenSim/Region/RegionCombinerModule/RegionCombinerModule.cs b/OpenSim/Region/RegionCombinerModule/RegionCombinerModule.cs index 95db22b90e..b3750ca574 100644 --- a/OpenSim/Region/RegionCombinerModule/RegionCombinerModule.cs +++ b/OpenSim/Region/RegionCombinerModule/RegionCombinerModule.cs @@ -229,22 +229,21 @@ namespace OpenSim.Region.RegionCombinerModule westBorder.CrossDirection = Cardinals.W; scene.WestBorders[0] = westBorder; - RegionConnections regionConnections = new RegionConnections(); - regionConnections.ConnectedRegions = new List(); - regionConnections.RegionScene = scene; - regionConnections.RegionLandChannel = scene.LandChannel; - regionConnections.RegionId = scene.RegionInfo.originRegionID; - regionConnections.X = scene.RegionInfo.RegionLocX; - regionConnections.Y = scene.RegionInfo.RegionLocY; - regionConnections.XEnd = (int)Constants.RegionSize; - regionConnections.YEnd = (int)Constants.RegionSize; - + RegionConnections newConn = new RegionConnections(); + newConn.ConnectedRegions = new List(); + newConn.RegionScene = scene; + newConn.RegionLandChannel = scene.LandChannel; + newConn.RegionId = scene.RegionInfo.originRegionID; + newConn.X = scene.RegionInfo.RegionLocX; + newConn.Y = scene.RegionInfo.RegionLocY; + newConn.XEnd = (int)Constants.RegionSize; + newConn.YEnd = (int)Constants.RegionSize; lock (m_regions) { bool connectedYN = false; - foreach (RegionConnections conn in m_regions.Values) + foreach (RegionConnections rootConn in m_regions.Values) { #region commented /* @@ -410,12 +409,12 @@ namespace OpenSim.Region.RegionCombinerModule //xxx - if ((((int)conn.X * (int)Constants.RegionSize) + conn.XEnd - >= (regionConnections.X * (int)Constants.RegionSize)) - && (((int)conn.Y * (int)Constants.RegionSize) - >= (regionConnections.Y * (int)Constants.RegionSize))) + if ((((int)rootConn.X * (int)Constants.RegionSize) + rootConn.XEnd + >= (newConn.X * (int)Constants.RegionSize)) + && (((int)rootConn.Y * (int)Constants.RegionSize) + >= (newConn.Y * (int)Constants.RegionSize))) { - connectedYN = DoWorkForOneRegionOverPlusXY(conn, regionConnections, scene); + connectedYN = DoWorkForOneRegionOverPlusXY(rootConn, newConn, scene); break; } @@ -423,12 +422,12 @@ namespace OpenSim.Region.RegionCombinerModule //xyx //xxx //xxx - if ((((int)conn.X * (int)Constants.RegionSize) - >= (regionConnections.X * (int)Constants.RegionSize)) - && (((int)conn.Y * (int)Constants.RegionSize) + conn.YEnd - >= (regionConnections.Y * (int)Constants.RegionSize))) + if ((((int)rootConn.X * (int)Constants.RegionSize) + >= (newConn.X * (int)Constants.RegionSize)) + && (((int)rootConn.Y * (int)Constants.RegionSize) + rootConn.YEnd + >= (newConn.Y * (int)Constants.RegionSize))) { - connectedYN = DoWorkForOneRegionOverXPlusY(conn, regionConnections, scene); + connectedYN = DoWorkForOneRegionOverXPlusY(rootConn, newConn, scene); break; } @@ -436,12 +435,12 @@ namespace OpenSim.Region.RegionCombinerModule //xxy //xxx //xxx - if ((((int)conn.X * (int)Constants.RegionSize) + conn.XEnd - >= (regionConnections.X * (int)Constants.RegionSize)) - && (((int)conn.Y * (int)Constants.RegionSize) + conn.YEnd - >= (regionConnections.Y * (int)Constants.RegionSize))) + if ((((int)rootConn.X * (int)Constants.RegionSize) + rootConn.XEnd + >= (newConn.X * (int)Constants.RegionSize)) + && (((int)rootConn.Y * (int)Constants.RegionSize) + rootConn.YEnd + >= (newConn.Y * (int)Constants.RegionSize))) { - connectedYN = DoWorkForOneRegionOverPlusXPlusY(conn, regionConnections, scene); + connectedYN = DoWorkForOneRegionOverPlusXPlusY(rootConn, newConn, scene); break; } @@ -450,7 +449,7 @@ namespace OpenSim.Region.RegionCombinerModule // If !connectYN means that this region is a root region if (!connectedYN) { - DoWorkForRootRegion(regionConnections, scene); + DoWorkForRootRegion(newConn, scene); } } @@ -458,59 +457,57 @@ namespace OpenSim.Region.RegionCombinerModule AdjustLargeRegionBounds(); } - private bool DoWorkForOneRegionOverPlusXY(RegionConnections conn, RegionConnections regionConnections, Scene scene) + private bool DoWorkForOneRegionOverPlusXY(RegionConnections rootConn, RegionConnections newConn, Scene scene) { Vector3 offset = Vector3.Zero; - offset.X = (((regionConnections.X * (int)Constants.RegionSize)) - - ((conn.X * (int)Constants.RegionSize))); - offset.Y = (((regionConnections.Y * (int)Constants.RegionSize)) - - ((conn.Y * (int)Constants.RegionSize))); + offset.X = (((newConn.X * (int)Constants.RegionSize)) - + ((rootConn.X * (int)Constants.RegionSize))); + offset.Y = (((newConn.Y * (int)Constants.RegionSize)) - + ((rootConn.Y * (int)Constants.RegionSize))); Vector3 extents = Vector3.Zero; - extents.Y = conn.YEnd; - extents.X = conn.XEnd + regionConnections.XEnd; + extents.Y = rootConn.YEnd; + extents.X = rootConn.XEnd + newConn.XEnd; - conn.UpdateExtents(extents); + rootConn.UpdateExtents(extents); m_log.DebugFormat( "[REGION COMBINER MODULE]: Root region {0} is to the west of region {1}, Offset: {2}, Extents: {3}", - conn.RegionScene.RegionInfo.RegionName, - regionConnections.RegionScene.RegionInfo.RegionName, offset, extents); + rootConn.RegionScene.RegionInfo.RegionName, + newConn.RegionScene.RegionInfo.RegionName, offset, extents); scene.BordersLocked = true; - conn.RegionScene.BordersLocked = true; + rootConn.RegionScene.BordersLocked = true; RegionData ConnectedRegion = new RegionData(); ConnectedRegion.Offset = offset; ConnectedRegion.RegionId = scene.RegionInfo.originRegionID; ConnectedRegion.RegionScene = scene; - conn.ConnectedRegions.Add(ConnectedRegion); + rootConn.ConnectedRegions.Add(ConnectedRegion); // Inform root region Physics about the extents of this region - conn.RegionScene.PhysicsScene.Combine(null, Vector3.Zero, extents); + rootConn.RegionScene.PhysicsScene.Combine(null, Vector3.Zero, extents); // Inform Child region that it needs to forward it's terrain to the root region - scene.PhysicsScene.Combine(conn.RegionScene.PhysicsScene, offset, Vector3.Zero); + scene.PhysicsScene.Combine(rootConn.RegionScene.PhysicsScene, offset, Vector3.Zero); // Extend the borders as appropriate - lock (conn.RegionScene.EastBorders) - conn.RegionScene.EastBorders[0].BorderLine.Z += (int)Constants.RegionSize; + lock (rootConn.RegionScene.EastBorders) + rootConn.RegionScene.EastBorders[0].BorderLine.Z += (int)Constants.RegionSize; - lock (conn.RegionScene.NorthBorders) - conn.RegionScene.NorthBorders[0].BorderLine.Y += (int)Constants.RegionSize; + lock (rootConn.RegionScene.NorthBorders) + rootConn.RegionScene.NorthBorders[0].BorderLine.Y += (int)Constants.RegionSize; - lock (conn.RegionScene.SouthBorders) - conn.RegionScene.SouthBorders[0].BorderLine.Y += (int)Constants.RegionSize; + lock (rootConn.RegionScene.SouthBorders) + rootConn.RegionScene.SouthBorders[0].BorderLine.Y += (int)Constants.RegionSize; lock (scene.WestBorders) { - - - scene.WestBorders[0].BorderLine.Z = (int)((scene.RegionInfo.RegionLocX - conn.RegionScene.RegionInfo.RegionLocX) * (int)Constants.RegionSize); //auto teleport West + scene.WestBorders[0].BorderLine.Z = (int)((scene.RegionInfo.RegionLocX - rootConn.RegionScene.RegionInfo.RegionLocX) * (int)Constants.RegionSize); //auto teleport West // Trigger auto teleport to root region - scene.WestBorders[0].TriggerRegionX = conn.RegionScene.RegionInfo.RegionLocX; - scene.WestBorders[0].TriggerRegionY = conn.RegionScene.RegionInfo.RegionLocY; + scene.WestBorders[0].TriggerRegionX = rootConn.RegionScene.RegionInfo.RegionLocX; + scene.WestBorders[0].TriggerRegionY = rootConn.RegionScene.RegionInfo.RegionLocY; } // Reset Terrain.. since terrain loads before we get here, we need to load @@ -519,57 +516,60 @@ namespace OpenSim.Region.RegionCombinerModule scene.PhysicsScene.SetTerrain(scene.Heightmap.GetFloatsSerialised()); // Unlock borders - conn.RegionScene.BordersLocked = false; + rootConn.RegionScene.BordersLocked = false; scene.BordersLocked = false; // Create a client event forwarder and add this region's events to the root region. - if (conn.ClientEventForwarder != null) - conn.ClientEventForwarder.AddSceneToEventForwarding(scene); + if (rootConn.ClientEventForwarder != null) + rootConn.ClientEventForwarder.AddSceneToEventForwarding(scene); return true; } - private bool DoWorkForOneRegionOverXPlusY(RegionConnections conn, RegionConnections regionConnections, Scene scene) + private bool DoWorkForOneRegionOverXPlusY(RegionConnections rootConn, RegionConnections newConn, Scene scene) { Vector3 offset = Vector3.Zero; - offset.X = (((regionConnections.X * (int)Constants.RegionSize)) - - ((conn.X * (int)Constants.RegionSize))); - offset.Y = (((regionConnections.Y * (int)Constants.RegionSize)) - - ((conn.Y * (int)Constants.RegionSize))); + offset.X = (((newConn.X * (int)Constants.RegionSize)) - + ((rootConn.X * (int)Constants.RegionSize))); + offset.Y = (((newConn.Y * (int)Constants.RegionSize)) - + ((rootConn.Y * (int)Constants.RegionSize))); Vector3 extents = Vector3.Zero; - extents.Y = regionConnections.YEnd + conn.YEnd; - extents.X = conn.XEnd; - conn.UpdateExtents(extents); + extents.Y = newConn.YEnd + rootConn.YEnd; + extents.X = rootConn.XEnd; + rootConn.UpdateExtents(extents); scene.BordersLocked = true; - conn.RegionScene.BordersLocked = true; + rootConn.RegionScene.BordersLocked = true; RegionData ConnectedRegion = new RegionData(); ConnectedRegion.Offset = offset; ConnectedRegion.RegionId = scene.RegionInfo.originRegionID; ConnectedRegion.RegionScene = scene; - conn.ConnectedRegions.Add(ConnectedRegion); + rootConn.ConnectedRegions.Add(ConnectedRegion); m_log.DebugFormat( "[REGION COMBINER MODULE]: Root region {0} is to the south of region {1}, Offset: {2}, Extents: {3}", - conn.RegionScene.RegionInfo.RegionName, - regionConnections.RegionScene.RegionInfo.RegionName, offset, extents); + rootConn.RegionScene.RegionInfo.RegionName, + newConn.RegionScene.RegionInfo.RegionName, offset, extents); - conn.RegionScene.PhysicsScene.Combine(null, Vector3.Zero, extents); - scene.PhysicsScene.Combine(conn.RegionScene.PhysicsScene, offset, Vector3.Zero); + rootConn.RegionScene.PhysicsScene.Combine(null, Vector3.Zero, extents); + scene.PhysicsScene.Combine(rootConn.RegionScene.PhysicsScene, offset, Vector3.Zero); + + lock (rootConn.RegionScene.NorthBorders) + rootConn.RegionScene.NorthBorders[0].BorderLine.Z += (int)Constants.RegionSize; + + lock (rootConn.RegionScene.EastBorders) + rootConn.RegionScene.EastBorders[0].BorderLine.Y += (int)Constants.RegionSize; + + lock (rootConn.RegionScene.WestBorders) + rootConn.RegionScene.WestBorders[0].BorderLine.Y += (int)Constants.RegionSize; - lock (conn.RegionScene.NorthBorders) - conn.RegionScene.NorthBorders[0].BorderLine.Z += (int)Constants.RegionSize; - lock (conn.RegionScene.EastBorders) - conn.RegionScene.EastBorders[0].BorderLine.Y += (int)Constants.RegionSize; - lock (conn.RegionScene.WestBorders) - conn.RegionScene.WestBorders[0].BorderLine.Y += (int)Constants.RegionSize; lock (scene.SouthBorders) { - scene.SouthBorders[0].BorderLine.Z = (int)((scene.RegionInfo.RegionLocY - conn.RegionScene.RegionInfo.RegionLocY) * (int)Constants.RegionSize); //auto teleport south - scene.SouthBorders[0].TriggerRegionX = conn.RegionScene.RegionInfo.RegionLocX; - scene.SouthBorders[0].TriggerRegionY = conn.RegionScene.RegionInfo.RegionLocY; + scene.SouthBorders[0].BorderLine.Z = (int)((scene.RegionInfo.RegionLocY - rootConn.RegionScene.RegionInfo.RegionLocY) * (int)Constants.RegionSize); //auto teleport south + scene.SouthBorders[0].TriggerRegionX = rootConn.RegionScene.RegionInfo.RegionLocX; + scene.SouthBorders[0].TriggerRegionY = rootConn.RegionScene.RegionInfo.RegionLocY; } // Reset Terrain.. since terrain normally loads first. @@ -578,19 +578,21 @@ namespace OpenSim.Region.RegionCombinerModule //conn.RegionScene.PhysicsScene.SetTerrain(conn.RegionScene.Heightmap.GetFloatsSerialised()); scene.BordersLocked = false; - conn.RegionScene.BordersLocked = false; - if (conn.ClientEventForwarder != null) - conn.ClientEventForwarder.AddSceneToEventForwarding(scene); + rootConn.RegionScene.BordersLocked = false; + + if (rootConn.ClientEventForwarder != null) + rootConn.ClientEventForwarder.AddSceneToEventForwarding(scene); + return true; } - private bool DoWorkForOneRegionOverPlusXPlusY(RegionConnections conn, RegionConnections regionConnections, Scene scene) + private bool DoWorkForOneRegionOverPlusXPlusY(RegionConnections rootConn, RegionConnections newConn, Scene scene) { Vector3 offset = Vector3.Zero; - offset.X = (((regionConnections.X * (int)Constants.RegionSize)) - - ((conn.X * (int)Constants.RegionSize))); - offset.Y = (((regionConnections.Y * (int)Constants.RegionSize)) - - ((conn.Y * (int)Constants.RegionSize))); + offset.X = (((newConn.X * (int)Constants.RegionSize)) - + ((rootConn.X * (int)Constants.RegionSize))); + offset.Y = (((newConn.Y * (int)Constants.RegionSize)) - + ((rootConn.Y * (int)Constants.RegionSize))); Vector3 extents = Vector3.Zero; @@ -600,68 +602,70 @@ namespace OpenSim.Region.RegionCombinerModule // extents.X = regionConnections.XEnd + conn.XEnd; // conn.UpdateExtents(extents); - extents.Y = conn.YEnd; - extents.X = conn.XEnd; + extents.Y = rootConn.YEnd; + extents.X = rootConn.XEnd; scene.BordersLocked = true; - conn.RegionScene.BordersLocked = true; + rootConn.RegionScene.BordersLocked = true; RegionData ConnectedRegion = new RegionData(); ConnectedRegion.Offset = offset; ConnectedRegion.RegionId = scene.RegionInfo.originRegionID; ConnectedRegion.RegionScene = scene; - conn.ConnectedRegions.Add(ConnectedRegion); + rootConn.ConnectedRegions.Add(ConnectedRegion); m_log.DebugFormat( "[REGION COMBINER MODULE]: Region {0} is to the southwest of Scene {1}, Offset: {2}, Extents: {3}", - conn.RegionScene.RegionInfo.RegionName, - regionConnections.RegionScene.RegionInfo.RegionName, offset, extents); + rootConn.RegionScene.RegionInfo.RegionName, + newConn.RegionScene.RegionInfo.RegionName, offset, extents); - conn.RegionScene.PhysicsScene.Combine(null, Vector3.Zero, extents); - scene.PhysicsScene.Combine(conn.RegionScene.PhysicsScene, offset, Vector3.Zero); - lock (conn.RegionScene.NorthBorders) + rootConn.RegionScene.PhysicsScene.Combine(null, Vector3.Zero, extents); + scene.PhysicsScene.Combine(rootConn.RegionScene.PhysicsScene, offset, Vector3.Zero); + + lock (rootConn.RegionScene.NorthBorders) { - if (conn.RegionScene.NorthBorders.Count == 1)// && 2) + if (rootConn.RegionScene.NorthBorders.Count == 1)// && 2) { //compound border // already locked above - conn.RegionScene.NorthBorders[0].BorderLine.Z += (int)Constants.RegionSize; + rootConn.RegionScene.NorthBorders[0].BorderLine.Z += (int)Constants.RegionSize; - lock (conn.RegionScene.EastBorders) - conn.RegionScene.EastBorders[0].BorderLine.Y += (int)Constants.RegionSize; - lock (conn.RegionScene.WestBorders) - conn.RegionScene.WestBorders[0].BorderLine.Y += (int)Constants.RegionSize; + lock (rootConn.RegionScene.EastBorders) + rootConn.RegionScene.EastBorders[0].BorderLine.Y += (int)Constants.RegionSize; + + lock (rootConn.RegionScene.WestBorders) + rootConn.RegionScene.WestBorders[0].BorderLine.Y += (int)Constants.RegionSize; } } lock (scene.SouthBorders) { - scene.SouthBorders[0].BorderLine.Z = (int)((scene.RegionInfo.RegionLocY - conn.RegionScene.RegionInfo.RegionLocY) * (int)Constants.RegionSize); //auto teleport south - scene.SouthBorders[0].TriggerRegionX = conn.RegionScene.RegionInfo.RegionLocX; - scene.SouthBorders[0].TriggerRegionY = conn.RegionScene.RegionInfo.RegionLocY; + scene.SouthBorders[0].BorderLine.Z = (int)((scene.RegionInfo.RegionLocY - rootConn.RegionScene.RegionInfo.RegionLocY) * (int)Constants.RegionSize); //auto teleport south + scene.SouthBorders[0].TriggerRegionX = rootConn.RegionScene.RegionInfo.RegionLocX; + scene.SouthBorders[0].TriggerRegionY = rootConn.RegionScene.RegionInfo.RegionLocY; } - lock (conn.RegionScene.EastBorders) + lock (rootConn.RegionScene.EastBorders) { - if (conn.RegionScene.EastBorders.Count == 1)// && conn.RegionScene.EastBorders.Count == 2) + if (rootConn.RegionScene.EastBorders.Count == 1)// && conn.RegionScene.EastBorders.Count == 2) { - conn.RegionScene.EastBorders[0].BorderLine.Z += (int)Constants.RegionSize; - lock (conn.RegionScene.NorthBorders) - conn.RegionScene.NorthBorders[0].BorderLine.Y += (int)Constants.RegionSize; - lock (conn.RegionScene.SouthBorders) - conn.RegionScene.SouthBorders[0].BorderLine.Y += (int)Constants.RegionSize; + rootConn.RegionScene.EastBorders[0].BorderLine.Z += (int)Constants.RegionSize; + lock (rootConn.RegionScene.NorthBorders) + rootConn.RegionScene.NorthBorders[0].BorderLine.Y += (int)Constants.RegionSize; + lock (rootConn.RegionScene.SouthBorders) + rootConn.RegionScene.SouthBorders[0].BorderLine.Y += (int)Constants.RegionSize; } } lock (scene.WestBorders) { - scene.WestBorders[0].BorderLine.Z = (int)((scene.RegionInfo.RegionLocX - conn.RegionScene.RegionInfo.RegionLocX) * (int)Constants.RegionSize); //auto teleport West - scene.WestBorders[0].TriggerRegionX = conn.RegionScene.RegionInfo.RegionLocX; - scene.WestBorders[0].TriggerRegionY = conn.RegionScene.RegionInfo.RegionLocY; + scene.WestBorders[0].BorderLine.Z = (int)((scene.RegionInfo.RegionLocX - rootConn.RegionScene.RegionInfo.RegionLocX) * (int)Constants.RegionSize); //auto teleport West + scene.WestBorders[0].TriggerRegionX = rootConn.RegionScene.RegionInfo.RegionLocX; + scene.WestBorders[0].TriggerRegionY = rootConn.RegionScene.RegionInfo.RegionLocY; } /* @@ -680,18 +684,17 @@ namespace OpenSim.Region.RegionCombinerModule scene.PhysicsScene.SetTerrain(scene.Heightmap.GetFloatsSerialised()); //conn.RegionScene.PhysicsScene.SetTerrain(conn.RegionScene.Heightmap.GetFloatsSerialised()); scene.BordersLocked = false; - conn.RegionScene.BordersLocked = false; + rootConn.RegionScene.BordersLocked = false; - if (conn.ClientEventForwarder != null) - conn.ClientEventForwarder.AddSceneToEventForwarding(scene); + if (rootConn.ClientEventForwarder != null) + rootConn.ClientEventForwarder.AddSceneToEventForwarding(scene); return true; //scene.PhysicsScene.Combine(conn.RegionScene.PhysicsScene, offset,extents); - } - private void DoWorkForRootRegion(RegionConnections regionConnections, Scene scene) + private void DoWorkForRootRegion(RegionConnections rootConn, Scene scene) { m_log.DebugFormat("[REGION COMBINER MODULE]: Adding root region {0}", scene.RegionInfo.RegionName); @@ -700,28 +703,31 @@ namespace OpenSim.Region.RegionCombinerModule rdata.RegionId = scene.RegionInfo.originRegionID; rdata.RegionScene = scene; // save it's land channel - regionConnections.RegionLandChannel = scene.LandChannel; + rootConn.RegionLandChannel = scene.LandChannel; // Substitue our landchannel RegionCombinerLargeLandChannel lnd = new RegionCombinerLargeLandChannel(rdata, scene.LandChannel, - regionConnections.ConnectedRegions); + rootConn.ConnectedRegions); + scene.LandChannel = lnd; + // Forward the permissions modules of each of the connected regions to the root region lock (m_regions) { - foreach (RegionData r in regionConnections.ConnectedRegions) + foreach (RegionData r in rootConn.ConnectedRegions) { - ForwardPermissionRequests(regionConnections, r.RegionScene); + ForwardPermissionRequests(rootConn, r.RegionScene); } } + // Create the root region's Client Event Forwarder - regionConnections.ClientEventForwarder = new RegionCombinerClientEventForwarder(regionConnections); + rootConn.ClientEventForwarder = new RegionCombinerClientEventForwarder(rootConn); // Sets up the CoarseLocationUpdate forwarder for this root region scene.EventManager.OnNewPresence += SetCourseLocationDelegate; // Adds this root region to a dictionary of regions that are connectable - m_regions.Add(scene.RegionInfo.originRegionID, regionConnections); + m_regions.Add(scene.RegionInfo.originRegionID, rootConn); } private void SetCourseLocationDelegate(ScenePresence presence) From 824a3a114b1142325f523e2039ed070cce9ea850 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Sat, 19 May 2012 04:22:30 +0100 Subject: [PATCH 244/547] refactor: Add RegionConnection.PosX and PosY to return position in meters rather than copy/pasting the necessary calculations in lots of places. --- .../RegionCombinerModule.cs | 36 +++++------------- .../RegionCombinerModule/RegionConnections.cs | 37 +++++++++++++++++-- 2 files changed, 43 insertions(+), 30 deletions(-) diff --git a/OpenSim/Region/RegionCombinerModule/RegionCombinerModule.cs b/OpenSim/Region/RegionCombinerModule/RegionCombinerModule.cs index b3750ca574..81ed3394e3 100644 --- a/OpenSim/Region/RegionCombinerModule/RegionCombinerModule.cs +++ b/OpenSim/Region/RegionCombinerModule/RegionCombinerModule.cs @@ -408,11 +408,7 @@ namespace OpenSim.Region.RegionCombinerModule //xxy //xxx - - if ((((int)rootConn.X * (int)Constants.RegionSize) + rootConn.XEnd - >= (newConn.X * (int)Constants.RegionSize)) - && (((int)rootConn.Y * (int)Constants.RegionSize) - >= (newConn.Y * (int)Constants.RegionSize))) + if (rootConn.PosX + rootConn.XEnd >= newConn.PosX && rootConn.PosY >= newConn.PosY) { connectedYN = DoWorkForOneRegionOverPlusXY(rootConn, newConn, scene); break; @@ -422,10 +418,7 @@ namespace OpenSim.Region.RegionCombinerModule //xyx //xxx //xxx - if ((((int)rootConn.X * (int)Constants.RegionSize) - >= (newConn.X * (int)Constants.RegionSize)) - && (((int)rootConn.Y * (int)Constants.RegionSize) + rootConn.YEnd - >= (newConn.Y * (int)Constants.RegionSize))) + if (rootConn.PosX >= newConn.PosX && rootConn.PosY + rootConn.YEnd >= newConn.PosY) { connectedYN = DoWorkForOneRegionOverXPlusY(rootConn, newConn, scene); break; @@ -435,10 +428,7 @@ namespace OpenSim.Region.RegionCombinerModule //xxy //xxx //xxx - if ((((int)rootConn.X * (int)Constants.RegionSize) + rootConn.XEnd - >= (newConn.X * (int)Constants.RegionSize)) - && (((int)rootConn.Y * (int)Constants.RegionSize) + rootConn.YEnd - >= (newConn.Y * (int)Constants.RegionSize))) + if (rootConn.PosX + rootConn.XEnd >= newConn.PosX && rootConn.PosY + rootConn.YEnd >= newConn.PosY) { connectedYN = DoWorkForOneRegionOverPlusXPlusY(rootConn, newConn, scene); break; @@ -460,10 +450,8 @@ namespace OpenSim.Region.RegionCombinerModule private bool DoWorkForOneRegionOverPlusXY(RegionConnections rootConn, RegionConnections newConn, Scene scene) { Vector3 offset = Vector3.Zero; - offset.X = (((newConn.X * (int)Constants.RegionSize)) - - ((rootConn.X * (int)Constants.RegionSize))); - offset.Y = (((newConn.Y * (int)Constants.RegionSize)) - - ((rootConn.Y * (int)Constants.RegionSize))); + offset.X = newConn.PosX - rootConn.PosX; + offset.Y = newConn.PosY - rootConn.PosY; Vector3 extents = Vector3.Zero; extents.Y = rootConn.YEnd; @@ -529,10 +517,8 @@ namespace OpenSim.Region.RegionCombinerModule private bool DoWorkForOneRegionOverXPlusY(RegionConnections rootConn, RegionConnections newConn, Scene scene) { Vector3 offset = Vector3.Zero; - offset.X = (((newConn.X * (int)Constants.RegionSize)) - - ((rootConn.X * (int)Constants.RegionSize))); - offset.Y = (((newConn.Y * (int)Constants.RegionSize)) - - ((rootConn.Y * (int)Constants.RegionSize))); + offset.X = newConn.PosX - rootConn.PosX; + offset.Y = newConn.PosY - rootConn.PosY; Vector3 extents = Vector3.Zero; extents.Y = newConn.YEnd + rootConn.YEnd; @@ -589,10 +575,8 @@ namespace OpenSim.Region.RegionCombinerModule private bool DoWorkForOneRegionOverPlusXPlusY(RegionConnections rootConn, RegionConnections newConn, Scene scene) { Vector3 offset = Vector3.Zero; - offset.X = (((newConn.X * (int)Constants.RegionSize)) - - ((rootConn.X * (int)Constants.RegionSize))); - offset.Y = (((newConn.Y * (int)Constants.RegionSize)) - - ((rootConn.Y * (int)Constants.RegionSize))); + offset.X = newConn.PosX - rootConn.PosX; + offset.Y = newConn.PosY - rootConn.PosY; Vector3 extents = Vector3.Zero; @@ -622,7 +606,7 @@ namespace OpenSim.Region.RegionCombinerModule rootConn.RegionScene.PhysicsScene.Combine(null, Vector3.Zero, extents); scene.PhysicsScene.Combine(rootConn.RegionScene.PhysicsScene, offset, Vector3.Zero); - + lock (rootConn.RegionScene.NorthBorders) { if (rootConn.RegionScene.NorthBorders.Count == 1)// && 2) diff --git a/OpenSim/Region/RegionCombinerModule/RegionConnections.cs b/OpenSim/Region/RegionCombinerModule/RegionConnections.cs index 3aa9f20f1a..fba51d2efa 100644 --- a/OpenSim/Region/RegionCombinerModule/RegionConnections.cs +++ b/OpenSim/Region/RegionCombinerModule/RegionConnections.cs @@ -28,6 +28,7 @@ using System; using System.Collections.Generic; using OpenMetaverse; +using OpenSim.Framework; using OpenSim.Region.Framework.Interfaces; using OpenSim.Region.Framework.Scenes; @@ -49,17 +50,45 @@ namespace OpenSim.Region.RegionCombinerModule /// LargeLandChannel for combined region /// public ILandChannel RegionLandChannel; + + /// + /// The x map co-ordinate for this region (where each co-ordinate is a Constants.RegionSize block). + /// public uint X; + + /// + /// The y co-ordinate for this region (where each cor-odinate is a Constants.RegionSize block). + /// public uint Y; - public int XEnd; - public int YEnd; + + /// + /// The X meters position of this connection. + /// + public uint PosX { get { return X * Constants.RegionSize; } } + + /// + /// The Y meters co-ordinate of this connection. + /// + public uint PosY { get { return Y * Constants.RegionSize; } } + + /// + /// The size of the megaregion in meters. + /// + public uint XEnd; + + /// + /// The size of the megaregion in meters. + /// + public uint YEnd; + public List ConnectedRegions; public RegionCombinerPermissionModule PermissionModule; public RegionCombinerClientEventForwarder ClientEventForwarder; + public void UpdateExtents(Vector3 extents) { - XEnd = (int)extents.X; - YEnd = (int)extents.Y; + XEnd = (uint)extents.X; + YEnd = (uint)extents.Y; } } } \ No newline at end of file From 5759313f7f3ff121d20e5eb44013e2bbb4bc2eee Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Sat, 19 May 2012 04:56:47 +0100 Subject: [PATCH 245/547] Add size of region to OAR control file. Megaregions (sw root OARs when saved) will have a size larger than 256x256 Not yet read. Do not rely on this information yet, it may change. --- .../ArchiveWriteRequestPreparation.cs | 38 ++++++++++++------- .../Interfaces/IRegionCombinerModule.cs | 16 +++++++- .../RegionCombinerModule.cs | 19 +++++++++- 3 files changed, 56 insertions(+), 17 deletions(-) diff --git a/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestPreparation.cs b/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestPreparation.cs index e54774b339..504f09ba5b 100644 --- a/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestPreparation.cs +++ b/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestPreparation.cs @@ -391,36 +391,46 @@ namespace OpenSim.Region.CoreModules.World.Archiver xtw.WriteElementString("datetime", ((int)t.TotalSeconds).ToString()); xtw.WriteElementString("id", UUID.Random().ToString()); xtw.WriteEndElement(); - - xtw.WriteElementString("assets_included", SaveAssets.ToString()); - + + xtw.WriteStartElement("region_info"); + bool isMegaregion; + Vector2 size; + IRegionCombinerModule rcMod = null; // FIXME: This is only here for regression test purposes since they do not supply a module. Need to fix // this, possibly by doing control file creation somewhere else. - if (m_module != null && m_module.RegionCombinerModule != null) - { - IRegionCombinerModule mod = m_module.RegionCombinerModule; - isMegaregion = mod.IsRootForMegaregion(m_scene.RegionInfo.RegionID); - } + if (m_module != null) + rcMod = m_module.RegionCombinerModule; + + if (rcMod != null) + isMegaregion = rcMod.IsRootForMegaregion(m_scene.RegionInfo.RegionID); else - { isMegaregion = false; - } - + + if (isMegaregion) + size = rcMod.GetSizeOfMegaregion(m_scene.RegionInfo.RegionID); + else + size = new Vector2((float)Constants.RegionSize, (float)Constants.RegionSize); + xtw.WriteElementString("is_megaregion", isMegaregion.ToString()); + xtw.WriteElementString("size_in_meters", string.Format("{0},{1}", size.X, size.Y)); + + xtw.WriteEndElement(); + xtw.WriteElementString("assets_included", SaveAssets.ToString()); + xtw.WriteEndElement(); xtw.Flush(); - xtw.Close(); } s = sw.ToString(); } -// Console.WriteLine( -// "[ARCHIVE WRITE REQUEST PREPARATION]: Control file for {0} is: {1}", m_scene.RegionInfo.RegionName, s); + if (m_scene != null) + Console.WriteLine( + "[ARCHIVE WRITE REQUEST PREPARATION]: Control file for {0} is: {1}", m_scene.RegionInfo.RegionName, s); return s; } diff --git a/OpenSim/Region/Framework/Interfaces/IRegionCombinerModule.cs b/OpenSim/Region/Framework/Interfaces/IRegionCombinerModule.cs index ca4ed5cb2e..e03ac5a26f 100644 --- a/OpenSim/Region/Framework/Interfaces/IRegionCombinerModule.cs +++ b/OpenSim/Region/Framework/Interfaces/IRegionCombinerModule.cs @@ -40,6 +40,20 @@ namespace OpenSim.Region.Framework.Interfaces /// /// Does the given id belong to the root region of a megaregion? /// - bool IsRootForMegaregion(UUID sceneId); + bool IsRootForMegaregion(UUID regionId); + + /// + /// Gets the size of megaregion. + /// + /// + /// Returns size in meters. + /// Do not rely on this method remaining the same - this area is actively under development. + /// + /// + /// The id of the root region for a megaregion. + /// This may change in the future to allow any region id that makes up a megaregion. + /// Currently, will throw an exception if this does not match a root region. + /// + Vector2 GetSizeOfMegaregion(UUID regionId); } } \ No newline at end of file diff --git a/OpenSim/Region/RegionCombinerModule/RegionCombinerModule.cs b/OpenSim/Region/RegionCombinerModule/RegionCombinerModule.cs index 81ed3394e3..98becce8ba 100644 --- a/OpenSim/Region/RegionCombinerModule/RegionCombinerModule.cs +++ b/OpenSim/Region/RegionCombinerModule/RegionCombinerModule.cs @@ -113,10 +113,25 @@ namespace OpenSim.Region.RegionCombinerModule } } - public bool IsRootForMegaregion(UUID sceneId) + public bool IsRootForMegaregion(UUID regionId) { lock (m_regions) - return m_regions.ContainsKey(sceneId); + return m_regions.ContainsKey(regionId); + } + + public Vector2 GetSizeOfMegaregion(UUID regionId) + { + lock (m_regions) + { + if (m_regions.ContainsKey(regionId)) + { + RegionConnections rootConn = m_regions[regionId]; + + return new Vector2((float)rootConn.XEnd, (float)rootConn.YEnd); + } + } + + throw new Exception(string.Format("Region with id {0} not found", regionId)); } private void NewPresence(ScenePresence presence) From 0db60eea85f16b0b428190590b8e8ca1392a2e35 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Sat, 19 May 2012 04:59:36 +0100 Subject: [PATCH 246/547] Improve locking of RegionCombinerModule.m_regions --- .../RegionCombinerModule.cs | 53 ++++++++++--------- 1 file changed, 29 insertions(+), 24 deletions(-) diff --git a/OpenSim/Region/RegionCombinerModule/RegionCombinerModule.cs b/OpenSim/Region/RegionCombinerModule/RegionCombinerModule.cs index 98becce8ba..40daf1343c 100644 --- a/OpenSim/Region/RegionCombinerModule/RegionCombinerModule.cs +++ b/OpenSim/Region/RegionCombinerModule/RegionCombinerModule.cs @@ -58,6 +58,11 @@ namespace OpenSim.Region.RegionCombinerModule get { return null; } } + /// + /// Is this module enabled? + /// + private bool enabledYN = false; + /// /// This holds the root regions for the megaregions. /// @@ -66,11 +71,6 @@ namespace OpenSim.Region.RegionCombinerModule /// private Dictionary m_regions = new Dictionary(); - /// - /// Is this module enabled? - /// - private bool enabledYN = false; - /// /// The scenes that comprise the megaregion. /// @@ -717,16 +717,16 @@ namespace OpenSim.Region.RegionCombinerModule { ForwardPermissionRequests(rootConn, r.RegionScene); } + + // Create the root region's Client Event Forwarder + rootConn.ClientEventForwarder = new RegionCombinerClientEventForwarder(rootConn); + + // Sets up the CoarseLocationUpdate forwarder for this root region + scene.EventManager.OnNewPresence += SetCourseLocationDelegate; + + // Adds this root region to a dictionary of regions that are connectable + m_regions.Add(scene.RegionInfo.originRegionID, rootConn); } - - // Create the root region's Client Event Forwarder - rootConn.ClientEventForwarder = new RegionCombinerClientEventForwarder(rootConn); - - // Sets up the CoarseLocationUpdate forwarder for this root region - scene.EventManager.OnNewPresence += SetCourseLocationDelegate; - - // Adds this root region to a dictionary of regions that are connectable - m_regions.Add(scene.RegionInfo.originRegionID, rootConn); } private void SetCourseLocationDelegate(ScenePresence presence) @@ -983,6 +983,7 @@ namespace OpenSim.Region.RegionCombinerModule return true; } } + oborder = null; return false; } @@ -992,14 +993,19 @@ namespace OpenSim.Region.RegionCombinerModule pPosition = pPosition/(int) Constants.RegionSize; int OffsetX = (int) pPosition.X; int OffsetY = (int) pPosition.Y; - foreach (RegionConnections regConn in m_regions.Values) + + lock (m_regions) { - foreach (RegionData reg in regConn.ConnectedRegions) + foreach (RegionConnections regConn in m_regions.Values) { - if (reg.Offset.X == OffsetX && reg.Offset.Y == OffsetY) - return reg; + foreach (RegionData reg in regConn.ConnectedRegions) + { + if (reg.Offset.X == OffsetX && reg.Offset.Y == OffsetY) + return reg; + } } } + return new RegionData(); } @@ -1055,18 +1061,17 @@ namespace OpenSim.Region.RegionCombinerModule } #region console commands + public void FixPhantoms(string module, string[] cmdparams) { - List scenes = new List(m_startingScenes.Values); + List scenes = new List(m_startingScenes.Values); + foreach (Scene s in scenes) { - s.ForEachSOG(delegate(SceneObjectGroup e) - { - e.AbsolutePosition = e.AbsolutePosition; - } - ); + s.ForEachSOG(so => so.AbsolutePosition = so.AbsolutePosition); } } + #endregion } } From 16d303f7cd631d05cba24c95546da0f7d0d6c774 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Mon, 21 May 2012 19:38:43 +0100 Subject: [PATCH 247/547] Fix bug where outfit folders could not be renamed. Outfit folders are a type of system folder whose details are allowed to change. --- .../InventoryService/XInventoryService.cs | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/OpenSim/Services/InventoryService/XInventoryService.cs b/OpenSim/Services/InventoryService/XInventoryService.cs index eed88bd391..2ce1babae0 100644 --- a/OpenSim/Services/InventoryService/XInventoryService.cs +++ b/OpenSim/Services/InventoryService/XInventoryService.cs @@ -327,27 +327,36 @@ namespace OpenSim.Services.InventoryService public virtual bool UpdateFolder(InventoryFolderBase folder) { - //m_log.DebugFormat("[XINVENTORY]: Update folder {0} {1} ({2})", folder.Name, folder.Type, folder.ID); +// m_log.DebugFormat("[XINVENTORY]: Update folder {0} {1} ({2})", folder.Name, folder.Type, folder.ID); + XInventoryFolder xFolder = ConvertFromOpenSim(folder); InventoryFolderBase check = GetFolder(folder); + if (check == null) return AddFolder(folder); - if (check.Type != -1 || xFolder.type != -1) + if ((check.Type != (short)AssetType.Unknown || xFolder.type != (short)AssetType.Unknown) + && (check.Type != (short)AssetType.OutfitFolder || xFolder.type != (short)AssetType.OutfitFolder)) { if (xFolder.version < check.Version) { - //m_log.DebugFormat("[XINVENTORY]: {0} < {1} can't do", xFolder.version, check.Version); +// m_log.DebugFormat("[XINVENTORY]: {0} < {1} can't do", xFolder.version, check.Version); return false; } + check.Version = (ushort)xFolder.version; xFolder = ConvertFromOpenSim(check); - //m_log.DebugFormat("[XINVENTORY]: Storing {0} {1} {2}", xFolder.folderName, xFolder.version, xFolder.type); + +// m_log.DebugFormat( +// "[XINVENTORY]: Storing version only update to system folder {0} {1} {2}", +// xFolder.folderName, xFolder.version, xFolder.type); + return m_Database.StoreFolder(xFolder); } if (xFolder.version < check.Version) xFolder.version = check.Version; + xFolder.folderID = check.ID; return m_Database.StoreFolder(xFolder); From 7e97f0e8989ff1bc7fab80c726dfef23dffc5cca Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Mon, 21 May 2012 21:00:22 +0100 Subject: [PATCH 248/547] minor: extend commented out LinkInventoryItem log message for future use --- OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | 10 +++++----- OpenSim/Services/InventoryService/XInventoryService.cs | 6 +++--- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs index 8a26df1dc2..79c9309be8 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs @@ -939,8 +939,8 @@ namespace OpenSim.Region.Framework.Scenes sbyte invType, sbyte type, UUID olditemID) { // m_log.DebugFormat( -// "[AGENT INVENTORY]: Received request from {0} to create inventory item link {1} in folder {2} pointing to {3}", -// remoteClient.Name, name, folderID, olditemID); +// "[AGENT INVENTORY]: Received request from {0} to create inventory item link {1} in folder {2} pointing to {3}, assetType {4}, inventoryType {5}", +// remoteClient.Name, name, folderID, olditemID, (AssetType)type, (InventoryType)invType); if (!Permissions.CanCreateUserInventory(invType, remoteClient.AgentId)) return; @@ -973,10 +973,10 @@ namespace OpenSim.Region.Framework.Scenes asset.Type = type; asset.Name = name; asset.Description = description; - + CreateNewInventoryItem( - remoteClient, remoteClient.AgentId.ToString(), string.Empty, folderID, name, 0, callbackID, asset, invType, - (uint)PermissionMask.All, (uint)PermissionMask.All, (uint)PermissionMask.All, + remoteClient, remoteClient.AgentId.ToString(), string.Empty, folderID, name, 0, callbackID, asset, invType, + (uint)PermissionMask.All, (uint)PermissionMask.All, (uint)PermissionMask.All, (uint)PermissionMask.All, (uint)PermissionMask.All, Util.UnixTimeSinceEpoch()); } else diff --git a/OpenSim/Services/InventoryService/XInventoryService.cs b/OpenSim/Services/InventoryService/XInventoryService.cs index 2ce1babae0..3355428cf4 100644 --- a/OpenSim/Services/InventoryService/XInventoryService.cs +++ b/OpenSim/Services/InventoryService/XInventoryService.cs @@ -302,7 +302,8 @@ namespace OpenSim.Services.InventoryService public virtual bool AddFolder(InventoryFolderBase folder) { - //m_log.DebugFormat("[XINVENTORY]: Add folder {0} type {1} in parent {2}", folder.Name, folder.Type, folder.ParentID); +// m_log.DebugFormat("[XINVENTORY]: Add folder {0} type {1} in parent {2}", folder.Name, folder.Type, folder.ParentID); + InventoryFolderBase check = GetFolder(folder); if (check != null) return false; @@ -346,7 +347,7 @@ namespace OpenSim.Services.InventoryService check.Version = (ushort)xFolder.version; xFolder = ConvertFromOpenSim(check); - + // m_log.DebugFormat( // "[XINVENTORY]: Storing version only update to system folder {0} {1} {2}", // xFolder.folderName, xFolder.version, xFolder.type); @@ -442,7 +443,6 @@ namespace OpenSim.Services.InventoryService public virtual bool UpdateItem(InventoryItemBase item) { -// throw new Exception("urrgh"); if (!m_AllowDelete) if (item.AssetType == (sbyte)AssetType.Link || item.AssetType == (sbyte)AssetType.LinkFolder) return false; From 9ab0c81c1dfb95e423d73599bd1fc66778749f0d Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Mon, 21 May 2012 21:33:59 +0100 Subject: [PATCH 249/547] Setting 'in transit' on a local teleport as well as inter-region teleports. This is to eliminate possible race conditions if two teleport calls are made concurrently, where at least one is a local teleport. This is pretty much impossible on a manual user teleport but can happen on script-invoked teleports. --- .../Framework/EntityTransfer/EntityTransferModule.cs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs index 5dbe5e4966..36e9da62d1 100644 --- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs +++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs @@ -230,6 +230,13 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer "[ENTITY TRANSFER MODULE]: Teleport for {0} to {1} within {2}", sp.Name, position, sp.Scene.RegionInfo.RegionName); + if (!SetInTransit(sp.UUID)) + { + m_log.DebugFormat( + "[ENTITY TRANSFER MODULE]: Ignoring within region teleport request of {0} {1} to {2} - agent is already in transit.", + sp.Name, sp.UUID, position); + } + // Teleport within the same region if (IsOutsideRegion(sp.Scene, position) || position.Z < 0) { @@ -268,6 +275,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer { sp.Scene.EventManager.TriggerOnScriptChangedEvent(grp.LocalId, (uint)Changed.TELEPORT); } + + ResetFromTransit(sp.UUID); } /// From ff429a259b41f1205a6b153bb6da383d9a9f5daf Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Wed, 23 May 2012 01:58:10 +0100 Subject: [PATCH 250/547] Fix bug where an avatar that had an object they owned attached through llAttachToAvatar() or osForceAttachToAvatar() would wrongly have next permissions come into play when they detached that object and rezzed it in scene. This is because the attachments module code was setting the 'object slam' bit by using PermissionMask.All Solution here is to route the attachment item creation call through the existing inventory code in BasicInventoryAccessModule rather than copy/pasted code in AttachmentsModule itself. --- .../Avatar/Attachments/AttachmentsModule.cs | 206 ++++++------------ .../Tests/AttachmentsModuleTests.cs | 13 +- .../InventoryAccess/InventoryAccessModule.cs | 59 +++-- .../Interfaces/IInventoryAccessModule.cs | 10 +- .../Scenes/AsyncSceneObjectGroupDeleter.cs | 2 +- .../Scenes/SceneObjectPartInventory.cs | 7 + .../CoalescedSceneObjectsSerializer.cs | 20 +- OpenSim/Tests/Common/Helpers/SceneHelpers.cs | 7 +- 8 files changed, 155 insertions(+), 169 deletions(-) diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs index 2e1948d231..d099511e8e 100644 --- a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs @@ -49,6 +49,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments private Scene m_scene; private IDialogModule m_dialogModule; + private IInventoryAccessModule m_invAccessModule; /// /// Are attachments enabled? @@ -87,7 +88,10 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments m_scene.EventManager.OnNewClient -= SubscribeToClientEvents; } - public void RegionLoaded(Scene scene) {} + public void RegionLoaded(Scene scene) + { + m_invAccessModule = m_scene.RequestModuleInterface(); + } public void Close() { @@ -578,90 +582,23 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments /// The user inventory item created that holds the attachment. private InventoryItemBase AddSceneObjectAsNewAttachmentInInv(IScenePresence sp, SceneObjectGroup grp) { + if (m_invAccessModule == null) + return null; + // m_log.DebugFormat( // "[ATTACHMENTS MODULE]: Called AddSceneObjectAsAttachment for object {0} {1} for {2}", // grp.Name, grp.LocalId, remoteClient.Name); - Vector3 inventoryStoredPosition = new Vector3 - (((grp.AbsolutePosition.X > (int)Constants.RegionSize) - ? Constants.RegionSize - 6 - : grp.AbsolutePosition.X) - , - (grp.AbsolutePosition.Y > (int)Constants.RegionSize) - ? Constants.RegionSize - 6 - : grp.AbsolutePosition.Y, - grp.AbsolutePosition.Z); - - Vector3 originalPosition = grp.AbsolutePosition; - - grp.AbsolutePosition = inventoryStoredPosition; - - // If we're being called from a script, then trying to serialize that same script's state will not complete - // in any reasonable time period. Therefore, we'll avoid it. The worst that can happen is that if - // the client/server crashes rather than logging out normally, the attachment's scripts will resume - // without state on relog. Arguably, this is what we want anyway. - string sceneObjectXml = SceneObjectSerializer.ToOriginalXmlFormat(grp, false); - - grp.AbsolutePosition = originalPosition; - - AssetBase asset = m_scene.CreateAsset( - grp.GetPartName(grp.LocalId), - grp.GetPartDescription(grp.LocalId), - (sbyte)AssetType.Object, - Utils.StringToBytes(sceneObjectXml), - sp.UUID); - - m_scene.AssetService.Store(asset); - - InventoryItemBase item = new InventoryItemBase(); - item.CreatorId = grp.RootPart.CreatorID.ToString(); - item.CreatorData = grp.RootPart.CreatorData; - item.Owner = sp.UUID; - item.ID = UUID.Random(); - item.AssetID = asset.FullID; - item.Description = asset.Description; - item.Name = asset.Name; - item.AssetType = asset.Type; - item.InvType = (int)InventoryType.Object; - - InventoryFolderBase folder = m_scene.InventoryService.GetFolderForType(sp.UUID, AssetType.Object); - if (folder != null) - item.Folder = folder.ID; - else // oopsies - item.Folder = UUID.Zero; - - if ((sp.UUID != grp.RootPart.OwnerID) && m_scene.Permissions.PropagatePermissions()) - { - item.BasePermissions = grp.RootPart.NextOwnerMask; - item.CurrentPermissions = grp.RootPart.NextOwnerMask; - item.NextPermissions = grp.RootPart.NextOwnerMask; - item.EveryOnePermissions = grp.RootPart.EveryoneMask & grp.RootPart.NextOwnerMask; - item.GroupPermissions = grp.RootPart.GroupMask & grp.RootPart.NextOwnerMask; - } - else - { - item.BasePermissions = grp.RootPart.BaseMask; - item.CurrentPermissions = grp.RootPart.OwnerMask; - item.NextPermissions = grp.RootPart.NextOwnerMask; - item.EveryOnePermissions = grp.RootPart.EveryoneMask; - item.GroupPermissions = grp.RootPart.GroupMask; - } - item.CreationDate = Util.UnixTimeSinceEpoch(); + InventoryItemBase newItem = m_invAccessModule.CopyToInventory( + DeRezAction.TakeCopy, + m_scene.InventoryService.GetFolderForType(sp.UUID, AssetType.Object).ID, + new List { grp }, + sp.ControllingClient, true)[0]; // sets itemID so client can show item as 'attached' in inventory - grp.FromItemID = item.ID; + grp.FromItemID = newItem.ID; - if (m_scene.AddInventoryItem(item)) - { - sp.ControllingClient.SendInventoryItemCreateUpdate(item, 0); - } - else - { - if (m_dialogModule != null) - m_dialogModule.SendAlertToUser(sp.ControllingClient, "Operation failed"); - } - - return item; + return newItem; } // What makes this method odd and unique is it tries to detach using an UUID.... Yay for standards. @@ -709,70 +646,69 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments private SceneObjectGroup RezSingleAttachmentFromInventoryInternal( IScenePresence sp, UUID itemID, UUID assetID, uint attachmentPt) { - IInventoryAccessModule invAccess = m_scene.RequestModuleInterface(); - if (invAccess != null) + if (m_invAccessModule == null) + return null; + + lock (sp.AttachmentsSyncLock) { - lock (sp.AttachmentsSyncLock) + SceneObjectGroup objatt; + + if (itemID != UUID.Zero) + objatt = m_invAccessModule.RezObject(sp.ControllingClient, + itemID, Vector3.Zero, Vector3.Zero, UUID.Zero, (byte)1, true, + false, false, sp.UUID, true); + else + objatt = m_invAccessModule.RezObject(sp.ControllingClient, + null, assetID, Vector3.Zero, Vector3.Zero, UUID.Zero, (byte)1, true, + false, false, sp.UUID, true); + + // m_log.DebugFormat( + // "[ATTACHMENTS MODULE]: Retrieved single object {0} for attachment to {1} on point {2}", + // objatt.Name, remoteClient.Name, AttachmentPt); + + if (objatt != null) { - SceneObjectGroup objatt; + // HasGroupChanged is being set from within RezObject. Ideally it would be set by the caller. + objatt.HasGroupChanged = false; + bool tainted = false; + if (attachmentPt != 0 && attachmentPt != objatt.AttachmentPoint) + tainted = true; - if (itemID != UUID.Zero) - objatt = invAccess.RezObject(sp.ControllingClient, - itemID, Vector3.Zero, Vector3.Zero, UUID.Zero, (byte)1, true, - false, false, sp.UUID, true); - else - objatt = invAccess.RezObject(sp.ControllingClient, - null, assetID, Vector3.Zero, Vector3.Zero, UUID.Zero, (byte)1, true, - false, false, sp.UUID, true); - - // m_log.DebugFormat( - // "[ATTACHMENTS MODULE]: Retrieved single object {0} for attachment to {1} on point {2}", - // objatt.Name, remoteClient.Name, AttachmentPt); - - if (objatt != null) + // This will throw if the attachment fails + try { - // HasGroupChanged is being set from within RezObject. Ideally it would be set by the caller. - objatt.HasGroupChanged = false; - bool tainted = false; - if (attachmentPt != 0 && attachmentPt != objatt.AttachmentPoint) - tainted = true; - - // This will throw if the attachment fails - try - { - AttachObject(sp, objatt, attachmentPt, false); - } - catch (Exception e) - { - m_log.ErrorFormat( - "[ATTACHMENTS MODULE]: Failed to attach {0} {1} for {2}, exception {3}{4}", - objatt.Name, objatt.UUID, sp.Name, e.Message, e.StackTrace); - - // Make sure the object doesn't stick around and bail - sp.RemoveAttachment(objatt); - m_scene.DeleteSceneObject(objatt, false); - return null; - } - - if (tainted) - objatt.HasGroupChanged = true; - - // Fire after attach, so we don't get messy perms dialogs - // 4 == AttachedRez - objatt.CreateScriptInstances(0, true, m_scene.DefaultScriptEngine, 4); - objatt.ResumeScripts(); - - // Do this last so that event listeners have access to all the effects of the attachment - m_scene.EventManager.TriggerOnAttach(objatt.LocalId, itemID, sp.UUID); - - return objatt; + AttachObject(sp, objatt, attachmentPt, false); } - else + catch (Exception e) { - m_log.WarnFormat( - "[ATTACHMENTS MODULE]: Could not retrieve item {0} for attaching to avatar {1} at point {2}", - itemID, sp.Name, attachmentPt); + m_log.ErrorFormat( + "[ATTACHMENTS MODULE]: Failed to attach {0} {1} for {2}, exception {3}{4}", + objatt.Name, objatt.UUID, sp.Name, e.Message, e.StackTrace); + + // Make sure the object doesn't stick around and bail + sp.RemoveAttachment(objatt); + m_scene.DeleteSceneObject(objatt, false); + return null; } + + if (tainted) + objatt.HasGroupChanged = true; + + // Fire after attach, so we don't get messy perms dialogs + // 4 == AttachedRez + objatt.CreateScriptInstances(0, true, m_scene.DefaultScriptEngine, 4); + objatt.ResumeScripts(); + + // Do this last so that event listeners have access to all the effects of the attachment + m_scene.EventManager.TriggerOnAttach(objatt.LocalId, itemID, sp.UUID); + + return objatt; + } + else + { + m_log.WarnFormat( + "[ATTACHMENTS MODULE]: Could not retrieve item {0} for attaching to avatar {1} at point {2}", + itemID, sp.Name, attachmentPt); } } diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs index 42d07fd2d6..5e89eec25d 100644 --- a/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs +++ b/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs @@ -99,12 +99,12 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests public void TestAddAttachmentFromGround() { TestHelpers.InMethod(); -// log4net.Config.XmlConfigurator.Configure(); +// TestHelpers.EnableLogging(); AddPresence(); string attName = "att"; - SceneObjectGroup so = SceneHelpers.AddSceneObject(scene, attName).ParentGroup; + SceneObjectGroup so = SceneHelpers.AddSceneObject(scene, attName, m_presence.UUID).ParentGroup; m_attMod.AttachObject(m_presence, so, (uint)AttachmentPoint.Chest, false); @@ -123,6 +123,15 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests Assert.That( m_presence.Appearance.GetAttachpoint(attSo.FromItemID), Is.EqualTo((int)AttachmentPoint.Chest)); + + InventoryItemBase attachmentItem = scene.InventoryService.GetItem(new InventoryItemBase(attSo.FromItemID)); + Assert.That(attachmentItem, Is.Not.Null); + Assert.That(attachmentItem.Name, Is.EqualTo(attName)); + + InventoryFolderBase targetFolder = scene.InventoryService.GetFolderForType(m_presence.UUID, AssetType.Object); + Assert.That(attachmentItem.Folder, Is.EqualTo(targetFolder.ID)); + +// TestHelpers.DisableLogging(); } [Test] diff --git a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs index 8171487545..f219d4c914 100644 --- a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs +++ b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs @@ -295,9 +295,12 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess return UUID.Zero; } - public virtual UUID CopyToInventory(DeRezAction action, UUID folderID, - List objectGroups, IClientAPI remoteClient) + public virtual List CopyToInventory( + DeRezAction action, UUID folderID, + List objectGroups, IClientAPI remoteClient, bool asAttachment) { + List copiedItems = new List(); + Dictionary> bundlesToCopy = new Dictionary>(); if (CoalesceMultipleObjectsToInventory) @@ -324,16 +327,16 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess } } - // This is method scoped and will be returned. It will be the - // last created asset id - UUID assetID = UUID.Zero; +// m_log.DebugFormat( +// "[INVENTORY ACCESS MODULE]: Copying {0} object bundles to folder {1} action {2} for {3}", +// bundlesToCopy.Count, folderID, action, remoteClient.Name); // Each iteration is really a separate asset being created, // with distinct destinations as well. foreach (List bundle in bundlesToCopy.Values) - assetID = CopyBundleToInventory(action, folderID, bundle, remoteClient); + copiedItems.Add(CopyBundleToInventory(action, folderID, bundle, remoteClient, asAttachment)); - return assetID; + return copiedItems; } /// @@ -344,12 +347,13 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess /// /// /// - /// - protected UUID CopyBundleToInventory( - DeRezAction action, UUID folderID, List objlist, IClientAPI remoteClient) + /// Should be true if the bundle is being copied as an attachment. This prevents + /// attempted serialization of any script state which would abort any operating scripts. + /// The inventory item created by the copy + protected InventoryItemBase CopyBundleToInventory( + DeRezAction action, UUID folderID, List objlist, IClientAPI remoteClient, + bool asAttachment) { - UUID assetID = UUID.Zero; - CoalescedSceneObjects coa = new CoalescedSceneObjects(UUID.Zero); Dictionary originalPositions = new Dictionary(); @@ -385,18 +389,27 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess string itemXml; + // If we're being called from a script, then trying to serialize that same script's state will not complete + // in any reasonable time period. Therefore, we'll avoid it. The worst that can happen is that if + // the client/server crashes rather than logging out normally, the attachment's scripts will resume + // without state on relog. Arguably, this is what we want anyway. if (objlist.Count > 1) - itemXml = CoalescedSceneObjectsSerializer.ToXml(coa); + itemXml = CoalescedSceneObjectsSerializer.ToXml(coa, !asAttachment); else - itemXml = SceneObjectSerializer.ToOriginalXmlFormat(objlist[0]); + itemXml = SceneObjectSerializer.ToOriginalXmlFormat(objlist[0], !asAttachment); // Restore the position of each group now that it has been stored to inventory. foreach (SceneObjectGroup objectGroup in objlist) objectGroup.AbsolutePosition = originalPositions[objectGroup.UUID]; InventoryItemBase item = CreateItemForObject(action, remoteClient, objlist[0], folderID); + +// m_log.DebugFormat( +// "[INVENTORY ACCESS MODULE]: Created item is {0}", +// item != null ? item.ID.ToString() : "NULL"); + if (item == null) - return UUID.Zero; + return null; // Can't know creator is the same, so null it in inventory if (objlist.Count > 1) @@ -406,7 +419,8 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess } else { - item.CreatorId = objlist[0].RootPart.CreatorID.ToString(); + item.CreatorId = objlist[0].RootPart.CreatorID.ToString(); + item.CreatorData = objlist[0].RootPart.CreatorData; item.SaleType = objlist[0].RootPart.ObjectSaleType; item.SalePrice = objlist[0].RootPart.SalePrice; } @@ -419,8 +433,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess objlist[0].OwnerID.ToString()); m_Scene.AssetService.Store(asset); - item.AssetID = asset.FullID; - assetID = asset.FullID; + item.AssetID = asset.FullID; if (DeRezAction.SaveToExistingUserInventoryItem == action) { @@ -453,9 +466,9 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess // This is a hook to do some per-asset post-processing for subclasses that need that if (remoteClient != null) - ExportAsset(remoteClient.AgentId, assetID); + ExportAsset(remoteClient.AgentId, asset.FullID); - return assetID; + return item; } protected virtual void ExportAsset(UUID agentID, UUID assetID) @@ -643,7 +656,6 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess { // Catch all. Use lost & found // - folder = m_Scene.InventoryService.GetFolderForType(userID, AssetType.LostAndFoundFolder); } } @@ -964,8 +976,9 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess so.FromFolderID = item.Folder; -// Console.WriteLine("rootPart.OwnedID {0}, item.Owner {1}, item.CurrentPermissions {2:X}", -// rootPart.OwnerID, item.Owner, item.CurrentPermissions); +// m_log.DebugFormat( +// "[INVENTORY ACCESS MODULE]: rootPart.OwnedID {0}, item.Owner {1}, item.CurrentPermissions {2:X}", +// rootPart.OwnerID, item.Owner, item.CurrentPermissions); if ((rootPart.OwnerID != item.Owner) || (item.CurrentPermissions & 16) != 0) diff --git a/OpenSim/Region/Framework/Interfaces/IInventoryAccessModule.cs b/OpenSim/Region/Framework/Interfaces/IInventoryAccessModule.cs index 1904011b17..3576e35798 100644 --- a/OpenSim/Region/Framework/Interfaces/IInventoryAccessModule.cs +++ b/OpenSim/Region/Framework/Interfaces/IInventoryAccessModule.cs @@ -49,11 +49,15 @@ namespace OpenSim.Region.Framework.Interfaces /// /// /// + /// + /// Should be true if the object(s) are begin taken as attachments. False otherwise. + /// /// - /// Returns the UUID of the newly created item asset (not the item itself). - /// FIXME: This is not very useful. It would be far more useful to return a list of items instead. + /// A list of the items created. If there was more than one object and objects are not being coaleseced in + /// inventory, then the order of items is in the same order as the input objects. /// - UUID CopyToInventory(DeRezAction action, UUID folderID, List objectGroups, IClientAPI remoteClient); + List CopyToInventory( + DeRezAction action, UUID folderID, List objectGroups, IClientAPI remoteClient, bool asAttachment); /// /// Rez an object into the scene from the user's inventory diff --git a/OpenSim/Region/Framework/Scenes/AsyncSceneObjectGroupDeleter.cs b/OpenSim/Region/Framework/Scenes/AsyncSceneObjectGroupDeleter.cs index 834464b2c8..f555b49f58 100644 --- a/OpenSim/Region/Framework/Scenes/AsyncSceneObjectGroupDeleter.cs +++ b/OpenSim/Region/Framework/Scenes/AsyncSceneObjectGroupDeleter.cs @@ -155,7 +155,7 @@ namespace OpenSim.Region.Framework.Scenes { IInventoryAccessModule invAccess = m_scene.RequestModuleInterface(); if (invAccess != null) - invAccess.CopyToInventory(x.action, x.folderID, x.objectGroups, x.remoteClient); + invAccess.CopyToInventory(x.action, x.folderID, x.objectGroups, x.remoteClient, false); if (x.permissionToDelete) { diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs index 3734e03994..d27d9e1dad 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs @@ -1027,10 +1027,16 @@ namespace OpenSim.Region.Framework.Scenes public void ApplyNextOwnerPermissions() { + Util.PrintCallStack(); + lock (m_items) { foreach (TaskInventoryItem item in m_items.Values) { +// m_log.DebugFormat ( +// "[SCENE OBJECT PART INVENTORY]: Applying next permissions {0} to {1} in {2} with current {3}, base {4}, everyone {5}", +// item.NextPermissions, item.Name, m_part.Name, item.CurrentPermissions, item.BasePermissions, item.EveryonePermissions); + if (item.InvType == (int)InventoryType.Object && (item.CurrentPermissions & 7) != 0) { if ((item.CurrentPermissions & ((uint)PermissionMask.Copy >> 13)) == 0) @@ -1040,6 +1046,7 @@ namespace OpenSim.Region.Framework.Scenes if ((item.CurrentPermissions & ((uint)PermissionMask.Modify >> 13)) == 0) item.CurrentPermissions &= ~(uint)PermissionMask.Modify; } + item.CurrentPermissions &= item.NextPermissions; item.BasePermissions &= item.NextPermissions; item.EveryonePermissions &= item.NextPermissions; diff --git a/OpenSim/Region/Framework/Scenes/Serialization/CoalescedSceneObjectsSerializer.cs b/OpenSim/Region/Framework/Scenes/Serialization/CoalescedSceneObjectsSerializer.cs index 55455cc434..a4f730d375 100644 --- a/OpenSim/Region/Framework/Scenes/Serialization/CoalescedSceneObjectsSerializer.cs +++ b/OpenSim/Region/Framework/Scenes/Serialization/CoalescedSceneObjectsSerializer.cs @@ -47,14 +47,30 @@ namespace OpenSim.Region.Framework.Scenes.Serialization /// public class CoalescedSceneObjectsSerializer { - private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); /// /// Serialize coalesced objects to Xml /// /// + /// + /// If true then serialize script states. This will halt any running scripts + /// /// public static string ToXml(CoalescedSceneObjects coa) + { + return ToXml(coa, true); + } + + /// + /// Serialize coalesced objects to Xml + /// + /// + /// + /// If true then serialize script states. This will halt any running scripts + /// + /// + public static string ToXml(CoalescedSceneObjects coa, bool doScriptStates) { using (StringWriter sw = new StringWriter()) { @@ -91,7 +107,7 @@ namespace OpenSim.Region.Framework.Scenes.Serialization writer.WriteAttributeString("offsety", offsets[i].Y.ToString()); writer.WriteAttributeString("offsetz", offsets[i].Z.ToString()); - SceneObjectSerializer.ToOriginalXmlFormat(obj, writer, true); + SceneObjectSerializer.ToOriginalXmlFormat(obj, writer, doScriptStates); writer.WriteEndElement(); // SceneObjectGroup } diff --git a/OpenSim/Tests/Common/Helpers/SceneHelpers.cs b/OpenSim/Tests/Common/Helpers/SceneHelpers.cs index 59829d994f..239afc0aee 100644 --- a/OpenSim/Tests/Common/Helpers/SceneHelpers.cs +++ b/OpenSim/Tests/Common/Helpers/SceneHelpers.cs @@ -566,7 +566,7 @@ namespace OpenSim.Tests.Common /// public static SceneObjectPart AddSceneObject(Scene scene) { - return AddSceneObject(scene, "Test Object"); + return AddSceneObject(scene, "Test Object", UUID.Zero); } /// @@ -574,10 +574,11 @@ namespace OpenSim.Tests.Common /// /// /// + /// /// - public static SceneObjectPart AddSceneObject(Scene scene, string name) + public static SceneObjectPart AddSceneObject(Scene scene, string name, UUID ownerId) { - SceneObjectPart part = CreateSceneObjectPart(name, UUID.Random(), UUID.Zero); + SceneObjectPart part = CreateSceneObjectPart(name, UUID.Random(), ownerId); //part.UpdatePrimFlags(false, false, true); //part.ObjectFlags |= (uint)PrimFlags.Phantom; From ec8745cf511de3a452a882a44034c55baf2350a1 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Wed, 23 May 2012 02:05:48 +0100 Subject: [PATCH 251/547] minor: Make log class names in InventoryAccessModule uniform --- .../InventoryAccess/InventoryAccessModule.cs | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs index f219d4c914..69767c1b99 100644 --- a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs +++ b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs @@ -175,7 +175,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess sbyte assetType, byte wearableType, uint nextOwnerMask, int creationDate) { - m_log.DebugFormat("[AGENT INVENTORY]: Received request to create inventory item {0} in folder {1}", name, folderID); + m_log.DebugFormat("[INVENTORY ACCESS MODULE]: Received request to create inventory item {0} in folder {1}", name, folderID); if (!m_Scene.Permissions.CanCreateUserInventory(invType, remoteClient.AgentId)) return; @@ -210,7 +210,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess else { m_log.ErrorFormat( - "ScenePresence for agent uuid {0} unexpectedly not found in CreateNewInventoryItem", + "[INVENTORY ACCESS MODULE]: ScenePresence for agent uuid {0} unexpectedly not found in CreateNewInventoryItem", remoteClient.AgentId); } } @@ -288,7 +288,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess else { m_log.ErrorFormat( - "[AGENT INVENTORY]: Could not find item {0} for caps inventory update", + "[INVENTORY ACCESS MODULE]: Could not find item {0} for caps inventory update", itemID); } @@ -605,7 +605,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess if (null == item) { m_log.DebugFormat( - "[AGENT INVENTORY]: Object {0} {1} scheduled for save to inventory has already been deleted.", + "[INVENTORY ACCESS MODULE]: Object {0} {1} scheduled for save to inventory has already been deleted.", so.Name, so.UUID); return null; @@ -706,7 +706,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess if (item == null) { m_log.WarnFormat( - "[InventoryAccessModule]: Could not find item {0} for {1} in RezObject()", + "[INVENTORY ACCESS MODULE]: Could not find item {0} for {1} in RezObject()", itemID, remoteClient.Name); return null; @@ -738,7 +738,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess else { m_log.WarnFormat( - "[InventoryAccessModule]: Could not find asset {0} for {1} in RezObject()", + "[INVENTORY ACCESS MODULE]: Could not find asset {0} for {1} in RezObject()", assetID, remoteClient.Name); } @@ -815,7 +815,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess group = objlist[i]; // m_log.DebugFormat( -// "[InventoryAccessModule]: Preparing to rez {0} {1} {2} ownermask={3:X} nextownermask={4:X} groupmask={5:X} everyonemask={6:X} for {7}", +// "[INVENTORY ACCESS MODULE]: Preparing to rez {0} {1} {2} ownermask={3:X} nextownermask={4:X} groupmask={5:X} everyonemask={6:X} for {7}", // group.Name, group.LocalId, group.UUID, // group.RootPart.OwnerMask, group.RootPart.NextOwnerMask, group.RootPart.GroupMask, group.RootPart.EveryoneMask, // remoteClient.Name); @@ -823,7 +823,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess // Vector3 storedPosition = group.AbsolutePosition; if (group.UUID == UUID.Zero) { - m_log.Debug("[InventoryAccessModule]: Object has UUID.Zero! Position 3"); + m_log.Debug("[INVENTORY ACCESS MODULE]: Object has UUID.Zero! Position 3"); } foreach (SceneObjectPart part in group.Parts) @@ -886,7 +886,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess } // m_log.DebugFormat( -// "[InventoryAccessModule]: Rezzed {0} {1} {2} ownermask={3:X} nextownermask={4:X} groupmask={5:X} everyonemask={6:X} for {7}", +// "[INVENTORY ACCESS MODULE]: Rezzed {0} {1} {2} ownermask={3:X} nextownermask={4:X} groupmask={5:X} everyonemask={6:X} for {7}", // group.Name, group.LocalId, group.UUID, // group.RootPart.OwnerMask, group.RootPart.NextOwnerMask, group.RootPart.GroupMask, group.RootPart.EveryoneMask, // remoteClient.Name); @@ -1101,7 +1101,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess if (assetRequestItem.AssetID != requestID) { m_log.WarnFormat( - "[CLIENT]: {0} requested asset {1} from item {2} but this does not match item's asset {3}", + "[INVENTORY ACCESS MODULE]: {0} requested asset {1} from item {2} but this does not match item's asset {3}", Name, requestID, itemID, assetRequestItem.AssetID); return false; From 68918d632f0521941f67fe2c7b9c87ed048e2b92 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Wed, 23 May 2012 02:09:31 +0100 Subject: [PATCH 252/547] Fetch the dialog module reference in AttachmentsModule in RegionLoaded() not AddRegion() The reference is not guaranteed to be there when AddRegion() is called but will definitely be present at RegionLoaded() if it's going to be present at all. --- .../Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs index d099511e8e..510b483ed1 100644 --- a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs @@ -71,7 +71,6 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments public void AddRegion(Scene scene) { m_scene = scene; - m_dialogModule = m_scene.RequestModuleInterface(); m_scene.RegisterModuleInterface(this); if (Enabled) @@ -90,6 +89,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments public void RegionLoaded(Scene scene) { + m_dialogModule = m_scene.RequestModuleInterface(); m_invAccessModule = m_scene.RequestModuleInterface(); } From 050007b44da97bf155fca95cadc32cb27924e263 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Wed, 23 May 2012 02:30:16 +0100 Subject: [PATCH 253/547] Lay out "show region" information in an easier to read line by line format --- OpenSim/Services/GridService/GridService.cs | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/OpenSim/Services/GridService/GridService.cs b/OpenSim/Services/GridService/GridService.cs index 3dc87bc5d5..b17fca799a 100644 --- a/OpenSim/Services/GridService/GridService.cs +++ b/OpenSim/Services/GridService/GridService.cs @@ -509,19 +509,21 @@ namespace OpenSim.Services.GridService return; } - MainConsole.Instance.Output("Region Name Region UUID"); - MainConsole.Instance.Output("Location URI"); - MainConsole.Instance.Output("Owner ID Flags"); - MainConsole.Instance.Output("-------------------------------------------------------------------------------"); + ICommandConsole con = MainConsole.Instance; + foreach (RegionData r in regions) { OpenSim.Data.RegionFlags flags = (OpenSim.Data.RegionFlags)Convert.ToInt32(r.Data["flags"]); - MainConsole.Instance.Output(String.Format("{0,-20} {1}\n{2,-20} {3}\n{4,-39} {5}\n\n", - r.RegionName, r.RegionID, - String.Format("{0},{1}", r.posX / Constants.RegionSize, r.posY / Constants.RegionSize), - r.Data["serverURI"], - r.Data["owner_uuid"], flags)); + + con.OutputFormat("{0,-11}: {1}", "Region Name", r.RegionName); + con.OutputFormat("{0,-11}: {1}", "Region ID", r.RegionID); + con.OutputFormat("{0,-11}: {1}", "Location", r.coordX, r.coordY); + con.OutputFormat("{0,-11}: {1}", "URI", r.Data["serverURI"]); + con.OutputFormat("{0,-11}: {1}", "Owner ID", r.Data["owner_uuid"]); + con.OutputFormat("{0,-11}: {1}", "Flags", flags); + con.Output("\n"); } + return; } From c6ce41bfbab310eae2366ad494a0dbb42cebc070 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Wed, 23 May 2012 02:31:53 +0100 Subject: [PATCH 254/547] Add missing Y co-ord in "show region" console command information --- OpenSim/Services/GridService/GridService.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Services/GridService/GridService.cs b/OpenSim/Services/GridService/GridService.cs index b17fca799a..9d81eb5355 100644 --- a/OpenSim/Services/GridService/GridService.cs +++ b/OpenSim/Services/GridService/GridService.cs @@ -517,7 +517,7 @@ namespace OpenSim.Services.GridService con.OutputFormat("{0,-11}: {1}", "Region Name", r.RegionName); con.OutputFormat("{0,-11}: {1}", "Region ID", r.RegionID); - con.OutputFormat("{0,-11}: {1}", "Location", r.coordX, r.coordY); + con.OutputFormat("{0,-11}: {1},{2}", "Location", r.coordX, r.coordY); con.OutputFormat("{0,-11}: {1}", "URI", r.Data["serverURI"]); con.OutputFormat("{0,-11}: {1}", "Owner ID", r.Data["owner_uuid"]); con.OutputFormat("{0,-11}: {1}", "Flags", flags); From 2222d979cc723ee2f3bad92ffe4991d074b2403a Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Wed, 23 May 2012 02:37:38 +0100 Subject: [PATCH 255/547] refactor: rename ConsoleTable -> ConsoleDisplayTable for clarity --- .../Console/{ConsoleTable.cs => ConsoleDisplayTable.cs} | 4 ++-- .../Avatar/Attachments/AttachmentsCommandModule.cs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) rename OpenSim/Framework/Console/{ConsoleTable.cs => ConsoleDisplayTable.cs} (98%) diff --git a/OpenSim/Framework/Console/ConsoleTable.cs b/OpenSim/Framework/Console/ConsoleDisplayTable.cs similarity index 98% rename from OpenSim/Framework/Console/ConsoleTable.cs rename to OpenSim/Framework/Console/ConsoleDisplayTable.cs index be3025be7f..49d5a179d0 100644 --- a/OpenSim/Framework/Console/ConsoleTable.cs +++ b/OpenSim/Framework/Console/ConsoleDisplayTable.cs @@ -38,7 +38,7 @@ namespace OpenSim.Framework.Console /// /// Currently subject to change. If you use this, be prepared to change your code when this class changes. /// - public class ConsoleTable + public class ConsoleDisplayTable { /// /// Default number of spaces between table columns. @@ -65,7 +65,7 @@ namespace OpenSim.Framework.Console /// public int TableSpacing { get; set; } - public ConsoleTable() + public ConsoleDisplayTable() { TableSpacing = DefaultTableSpacing; Columns = new List(); diff --git a/OpenSim/Region/OptionalModules/Avatar/Attachments/AttachmentsCommandModule.cs b/OpenSim/Region/OptionalModules/Avatar/Attachments/AttachmentsCommandModule.cs index a95514c642..df32a1d623 100644 --- a/OpenSim/Region/OptionalModules/Avatar/Attachments/AttachmentsCommandModule.cs +++ b/OpenSim/Region/OptionalModules/Avatar/Attachments/AttachmentsCommandModule.cs @@ -145,7 +145,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.Attachments { sb.AppendFormat("Attachments for {0}\n", sp.Name); - ConsoleTable ct = new ConsoleTable() { Indent = 2 }; + ConsoleDisplayTable ct = new ConsoleDisplayTable() { Indent = 2 }; ct.Columns.Add(new ConsoleTableColumn("Attachment Name", 36)); ct.Columns.Add(new ConsoleTableColumn("Local ID", 10)); ct.Columns.Add(new ConsoleTableColumn("Item ID", 36)); From 059a1e90b92c3c1ca027c0ec59f3628d87a954a6 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Wed, 23 May 2012 03:19:25 +0100 Subject: [PATCH 256/547] Add ConsoleDisplayList for more consistent formatting of console output in list form. Convert "show region" to use this structure rather than hand-constructing --- .../Framework/Console/ConsoleDisplayList.cs | 112 ++++++++++++++++++ OpenSim/Services/GridService/GridService.cs | 18 +-- 2 files changed, 121 insertions(+), 9 deletions(-) create mode 100644 OpenSim/Framework/Console/ConsoleDisplayList.cs diff --git a/OpenSim/Framework/Console/ConsoleDisplayList.cs b/OpenSim/Framework/Console/ConsoleDisplayList.cs new file mode 100644 index 0000000000..68855091d4 --- /dev/null +++ b/OpenSim/Framework/Console/ConsoleDisplayList.cs @@ -0,0 +1,112 @@ +/* + * Copyright (c) Contributors, http://opensimulator.org/ + * See CONTRIBUTORS.TXT for a full list of copyright holders. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the OpenSimulator Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace OpenSim.Framework.Console +{ + /// + /// Used to generated a formatted table for the console. + /// + /// + /// Currently subject to change. If you use this, be prepared to change your code when this class changes. + /// + public class ConsoleDisplayList + { + /// + /// The default divider between key and value for a list item. + /// + public const string DefaultKeyValueDivider = " : "; + + /// + /// The divider used between key and value for a list item. + /// + public string KeyValueDivider { get; set; } + + /// + /// Table rows + /// + public List> Rows { get; private set; } + + /// + /// Number of spaces to indent the list. + /// + public int Indent { get; set; } + + public ConsoleDisplayList() + { + Rows = new List>(); + KeyValueDivider = DefaultKeyValueDivider; + } + + public override string ToString() + { + StringBuilder sb = new StringBuilder(); + AddToStringBuilder(sb); + return sb.ToString(); + } + + public void AddToStringBuilder(StringBuilder sb) + { + string formatString = GetFormatString(); +// System.Console.WriteLine("FORMAT STRING [{0}]", formatString); + + // rows + foreach (KeyValuePair row in Rows) + sb.AppendFormat(formatString, row.Key, row.Value); + } + + /// + /// Gets the format string for the table. + /// + private string GetFormatString() + { + StringBuilder formatSb = new StringBuilder(); + + int longestKey = -1; + + foreach (KeyValuePair row in Rows) + if (row.Key.Length > longestKey) + longestKey = row.Key.Length; + + formatSb.Append(' ', Indent); + + // Can only do left formatting for now + formatSb.AppendFormat("{{0,-{0}}}{1}{{1}}\n", longestKey, KeyValueDivider); + + return formatSb.ToString(); + } + + public void AddRow(object key, object value) + { + Rows.Add(new KeyValuePair(key.ToString(), value.ToString())); + } + } +} \ No newline at end of file diff --git a/OpenSim/Services/GridService/GridService.cs b/OpenSim/Services/GridService/GridService.cs index 9d81eb5355..8a60ca5467 100644 --- a/OpenSim/Services/GridService/GridService.cs +++ b/OpenSim/Services/GridService/GridService.cs @@ -509,19 +509,19 @@ namespace OpenSim.Services.GridService return; } - ICommandConsole con = MainConsole.Instance; - foreach (RegionData r in regions) { OpenSim.Data.RegionFlags flags = (OpenSim.Data.RegionFlags)Convert.ToInt32(r.Data["flags"]); - con.OutputFormat("{0,-11}: {1}", "Region Name", r.RegionName); - con.OutputFormat("{0,-11}: {1}", "Region ID", r.RegionID); - con.OutputFormat("{0,-11}: {1},{2}", "Location", r.coordX, r.coordY); - con.OutputFormat("{0,-11}: {1}", "URI", r.Data["serverURI"]); - con.OutputFormat("{0,-11}: {1}", "Owner ID", r.Data["owner_uuid"]); - con.OutputFormat("{0,-11}: {1}", "Flags", flags); - con.Output("\n"); + ConsoleDisplayList dispList = new ConsoleDisplayList(); + dispList.AddRow("Region Name", r.RegionName); + dispList.AddRow("Region ID", r.RegionID); + dispList.AddRow("Location", string.Format("{0},{1}", r.coordX, r.coordY)); + dispList.AddRow("URI", r.Data["serverURI"]); + dispList.AddRow("Owner ID", r.Data["owner_uuid"]); + dispList.AddRow("Flags", flags); + + MainConsole.Instance.Output(dispList.ToString()); } return; From 8f88c17df969b1fd3e4a93747201e9436c9a1fcd Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Wed, 23 May 2012 03:23:37 +0100 Subject: [PATCH 257/547] refactor: Rename ConsoleTableRow and ConsoleTableColumn to ConsoleDisplayTableRow and ConsoleDisplayTableColumn --- .../Framework/Console/ConsoleDisplayTable.cs | 18 +++++++++--------- .../Attachments/AttachmentsCommandModule.cs | 12 ++++++------ 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/OpenSim/Framework/Console/ConsoleDisplayTable.cs b/OpenSim/Framework/Console/ConsoleDisplayTable.cs index 49d5a179d0..e9d1628b1d 100644 --- a/OpenSim/Framework/Console/ConsoleDisplayTable.cs +++ b/OpenSim/Framework/Console/ConsoleDisplayTable.cs @@ -48,12 +48,12 @@ namespace OpenSim.Framework.Console /// /// Table columns. /// - public List Columns { get; private set; } + public List Columns { get; private set; } /// /// Table rows /// - public List Rows { get; private set; } + public List Rows { get; private set; } /// /// Number of spaces to indent the table. @@ -68,8 +68,8 @@ namespace OpenSim.Framework.Console public ConsoleDisplayTable() { TableSpacing = DefaultTableSpacing; - Columns = new List(); - Rows = new List(); + Columns = new List(); + Rows = new List(); } public override string ToString() @@ -88,7 +88,7 @@ namespace OpenSim.Framework.Console sb.AppendFormat(formatString, Columns.ConvertAll(c => c.Header).ToArray()); // rows - foreach (ConsoleTableRow row in Rows) + foreach (ConsoleDisplayTableRow row in Rows) sb.AppendFormat(formatString, row.Cells.ToArray()); } @@ -115,23 +115,23 @@ namespace OpenSim.Framework.Console } } - public struct ConsoleTableColumn + public struct ConsoleDisplayTableColumn { public string Header { get; set; } public int Width { get; set; } - public ConsoleTableColumn(string header, int width) : this() + public ConsoleDisplayTableColumn(string header, int width) : this() { Header = header; Width = width; } } - public struct ConsoleTableRow + public struct ConsoleDisplayTableRow { public List Cells { get; private set; } - public ConsoleTableRow(List cells) : this() + public ConsoleDisplayTableRow(List cells) : this() { Cells = cells; } diff --git a/OpenSim/Region/OptionalModules/Avatar/Attachments/AttachmentsCommandModule.cs b/OpenSim/Region/OptionalModules/Avatar/Attachments/AttachmentsCommandModule.cs index df32a1d623..1b9e3ace5c 100644 --- a/OpenSim/Region/OptionalModules/Avatar/Attachments/AttachmentsCommandModule.cs +++ b/OpenSim/Region/OptionalModules/Avatar/Attachments/AttachmentsCommandModule.cs @@ -146,11 +146,11 @@ namespace OpenSim.Region.OptionalModules.Avatar.Attachments sb.AppendFormat("Attachments for {0}\n", sp.Name); ConsoleDisplayTable ct = new ConsoleDisplayTable() { Indent = 2 }; - ct.Columns.Add(new ConsoleTableColumn("Attachment Name", 36)); - ct.Columns.Add(new ConsoleTableColumn("Local ID", 10)); - ct.Columns.Add(new ConsoleTableColumn("Item ID", 36)); - ct.Columns.Add(new ConsoleTableColumn("Attach Point", 14)); - ct.Columns.Add(new ConsoleTableColumn("Position", 15)); + ct.Columns.Add(new ConsoleDisplayTableColumn("Attachment Name", 36)); + ct.Columns.Add(new ConsoleDisplayTableColumn("Local ID", 10)); + ct.Columns.Add(new ConsoleDisplayTableColumn("Item ID", 36)); + ct.Columns.Add(new ConsoleDisplayTableColumn("Attach Point", 14)); + ct.Columns.Add(new ConsoleDisplayTableColumn("Position", 15)); // sb.AppendFormat( // " {0,-36} {1,-10} {2,-36} {3,-14} {4,-15}\n", @@ -176,7 +176,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.Attachments // attachmentObject.Name, attachmentObject.LocalId, attachmentObject.FromItemID, // (AttachmentPoint)attachmentObject.AttachmentPoint, attachmentObject.RootPart.AttachedPos); ct.Rows.Add( - new ConsoleTableRow( + new ConsoleDisplayTableRow( new List() { attachmentObject.Name, From ee98b9c394900f55684e33829be1c182e84b2cab Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Wed, 23 May 2012 04:10:45 +0100 Subject: [PATCH 258/547] Add "show scene" command which lists stats for the currently selected console scene(s) This includes prim count, script count, avatar count, etc. Information is currently the same as "show stats", though show stats can only show one scene at a time because it listens for the latest outgoing stats packet (a bad approach that needs to change). Might be better to tie this module into the other stats module to display arbitrary stats rather than fetching directly from scene.SimStatsReporter. Console command is "show scene" because "show region" already exists for the grid service, which is unfortunate. Might need to make a distinction between "scene" relating to a live scene and "region" relating to more static region data (url, coords, etc.) --- .../World/Region/RegionCommandsModule.cs | 155 ++++++++++++++++++ OpenSim/Region/Framework/Scenes/Scene.cs | 7 +- 2 files changed, 161 insertions(+), 1 deletion(-) create mode 100644 OpenSim/Region/CoreModules/World/Region/RegionCommandsModule.cs diff --git a/OpenSim/Region/CoreModules/World/Region/RegionCommandsModule.cs b/OpenSim/Region/CoreModules/World/Region/RegionCommandsModule.cs new file mode 100644 index 0000000000..be4f497360 --- /dev/null +++ b/OpenSim/Region/CoreModules/World/Region/RegionCommandsModule.cs @@ -0,0 +1,155 @@ +/* + * Copyright (c) Contributors, http://opensimulator.org/ + * See CONTRIBUTORS.TXT for a full list of copyright holders. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the OpenSimulator Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using System; +using System.Collections.Generic; +using System.Reflection; +using System.Text; +using System.Text.RegularExpressions; +using log4net; +using Mono.Addins; +using NDesk.Options; +using Nini.Config; +using OpenMetaverse; +using OpenSim.Framework; +using OpenSim.Framework.Console; +using OpenSim.Framework.Statistics; +using OpenSim.Region.Framework.Interfaces; +using OpenSim.Region.Framework.Scenes; + +namespace OpenSim.Region.CoreModules.World.Objects.Commands +{ + /// + /// A module that holds commands for manipulating objects in the scene. + /// + [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "RegionCommandsModule")] + public class RegionCommandsModule : INonSharedRegionModule + { + private Scene m_scene; + private ICommandConsole m_console; + + public string Name { get { return "Region Commands Module"; } } + + public Type ReplaceableInterface { get { return null; } } + + public void Initialise(IConfigSource source) + { +// m_log.DebugFormat("[OBJECT COMMANDS MODULE]: INITIALIZED MODULE"); + } + + public void PostInitialise() + { +// m_log.DebugFormat("[OBJECT COMMANDS MODULE]: POST INITIALIZED MODULE"); + } + + public void Close() + { +// m_log.DebugFormat("[OBJECT COMMANDS MODULE]: CLOSED MODULE"); + } + + public void AddRegion(Scene scene) + { +// m_log.DebugFormat("[OBJECT COMMANDS MODULE]: REGION {0} ADDED", scene.RegionInfo.RegionName); + + m_scene = scene; + m_console = MainConsole.Instance; + + m_console.Commands.AddCommand( + "Regions", false, "show scene", + "show scene", + "Show live scene information for the currently selected region.", HandleShowScene); + } + + public void RemoveRegion(Scene scene) + { +// m_log.DebugFormat("[OBJECTS COMMANDS MODULE]: REGION {0} REMOVED", scene.RegionInfo.RegionName); + } + + public void RegionLoaded(Scene scene) + { +// m_log.DebugFormat("[OBJECTS COMMANDS MODULE]: REGION {0} LOADED", scene.RegionInfo.RegionName); + } + + private void HandleShowScene(string module, string[] cmd) + { + if (!(MainConsole.Instance.ConsoleScene == null || MainConsole.Instance.ConsoleScene == m_scene)) + return; + + SimStatsReporter r = m_scene.StatsReporter; + float[] stats = r.LastReportedSimStats; + + float timeDilation = stats[0]; + float simFps = stats[1]; + float physicsFps = stats[2]; + float agentUpdates = stats[3]; + float rootAgents = stats[4]; + float childAgents = stats[5]; + float totalPrims = stats[6]; + float activePrims = stats[7]; + float totalFrameTime = stats[8]; +// float netFrameTime = stats.StatsBlock[9].StatValue; // Ignored - not used by OpenSimulator + float physicsFrameTime = stats[10]; + float otherFrameTime = stats[11]; +// float imageFrameTime = stats.StatsBlock[12].StatValue; // Ignored + float inPacketsPerSecond = stats[13]; + float outPacketsPerSecond = stats[14]; + float unackedBytes = stats[15]; +// float agentFrameTime = stats.StatsBlock[16].StatValue; // Not really used + float pendingDownloads = stats[17]; + float pendingUploads = stats[18]; + float activeScripts = stats[19]; + float scriptLinesPerSecond = stats[20]; + + StringBuilder sb = new StringBuilder(); + sb.AppendFormat("Scene statistics for {0}\n", m_scene.RegionInfo.RegionName); + + ConsoleDisplayList dispList = new ConsoleDisplayList(); + dispList.AddRow("Time Dilation", timeDilation); + dispList.AddRow("Sim FPS", simFps); + dispList.AddRow("Physics FPS", physicsFps); + dispList.AddRow("Avatars", rootAgents); + dispList.AddRow("Child agents", childAgents); + dispList.AddRow("Total prims", totalPrims); + dispList.AddRow("Scripts", activeScripts); + dispList.AddRow("Script lines processed per second", scriptLinesPerSecond); + dispList.AddRow("Physics enabled prims", activePrims); + dispList.AddRow("Total frame time", totalFrameTime); + dispList.AddRow("Physics frame time", physicsFrameTime); + dispList.AddRow("Other frame time", otherFrameTime); + dispList.AddRow("Agent Updates per second", agentUpdates); + dispList.AddRow("Packets processed from clients per second", inPacketsPerSecond); + dispList.AddRow("Packets sent to clients per second", outPacketsPerSecond); + dispList.AddRow("Bytes unacknowledged by clients", unackedBytes); + dispList.AddRow("Pending asset downloads to clients", pendingDownloads); + dispList.AddRow("Pending asset uploads from clients", pendingUploads); + + dispList.AddToStringBuilder(sb); + + MainConsole.Instance.Output(sb.ToString()); + } + } +} \ No newline at end of file diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 5a0f56441f..fbe56f6b36 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -77,7 +77,12 @@ namespace OpenSim.Region.Framework.Scenes public bool DebugUpdates { get; private set; } public SynchronizeSceneHandler SynchronizeScene; - public SimStatsReporter StatsReporter; + + /// + /// Statistical information for this scene. + /// + public SimStatsReporter StatsReporter { get; private set; } + public List NorthBorders = new List(); public List EastBorders = new List(); public List SouthBorders = new List(); From 4d1986c0e480466383fa0a79a1305fe108430d68 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Wed, 23 May 2012 04:20:54 +0100 Subject: [PATCH 259/547] minor: Change [OBJECT COMMANDS MODULE] log strings to [REGION COMMANDS MODULE] strings, though all these are currently commented out anyway --- .../CoreModules/World/Region/RegionCommandsModule.cs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/OpenSim/Region/CoreModules/World/Region/RegionCommandsModule.cs b/OpenSim/Region/CoreModules/World/Region/RegionCommandsModule.cs index be4f497360..2838e0c356 100644 --- a/OpenSim/Region/CoreModules/World/Region/RegionCommandsModule.cs +++ b/OpenSim/Region/CoreModules/World/Region/RegionCommandsModule.cs @@ -58,22 +58,22 @@ namespace OpenSim.Region.CoreModules.World.Objects.Commands public void Initialise(IConfigSource source) { -// m_log.DebugFormat("[OBJECT COMMANDS MODULE]: INITIALIZED MODULE"); +// m_log.DebugFormat("[REGION COMMANDS MODULE]: INITIALIZED MODULE"); } public void PostInitialise() { -// m_log.DebugFormat("[OBJECT COMMANDS MODULE]: POST INITIALIZED MODULE"); +// m_log.DebugFormat("[REGION COMMANDS MODULE]: POST INITIALIZED MODULE"); } public void Close() { -// m_log.DebugFormat("[OBJECT COMMANDS MODULE]: CLOSED MODULE"); +// m_log.DebugFormat("[REGION COMMANDS MODULE]: CLOSED MODULE"); } public void AddRegion(Scene scene) { -// m_log.DebugFormat("[OBJECT COMMANDS MODULE]: REGION {0} ADDED", scene.RegionInfo.RegionName); +// m_log.DebugFormat("[REGION COMMANDS MODULE]: REGION {0} ADDED", scene.RegionInfo.RegionName); m_scene = scene; m_console = MainConsole.Instance; @@ -86,12 +86,12 @@ namespace OpenSim.Region.CoreModules.World.Objects.Commands public void RemoveRegion(Scene scene) { -// m_log.DebugFormat("[OBJECTS COMMANDS MODULE]: REGION {0} REMOVED", scene.RegionInfo.RegionName); +// m_log.DebugFormat("[REGION COMMANDS MODULE]: REGION {0} REMOVED", scene.RegionInfo.RegionName); } public void RegionLoaded(Scene scene) { -// m_log.DebugFormat("[OBJECTS COMMANDS MODULE]: REGION {0} LOADED", scene.RegionInfo.RegionName); +// m_log.DebugFormat("[REGION COMMANDS MODULE]: REGION {0} LOADED", scene.RegionInfo.RegionName); } private void HandleShowScene(string module, string[] cmd) From 682d4075e3fe7c52d4c29d00ba9dc0456b7322f3 Mon Sep 17 00:00:00 2001 From: BlueWall Date: Wed, 23 May 2012 15:07:03 -0400 Subject: [PATCH 260/547] Fix llGetSimulatorHostname to return configured hostname --- OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs | 4 ++++ OpenSim/Region/Framework/Interfaces/IUrlModule.cs | 1 + .../Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | 3 ++- 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs b/OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs index d58fc0feac..d2cd163eba 100644 --- a/OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs +++ b/OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs @@ -84,6 +84,10 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp private IHttpServer m_HttpsServer = null; private string m_ExternalHostNameForLSL = ""; + public string ExternalHostNameForLSL + { + get { return m_ExternalHostNameForLSL; } + } public Type ReplaceableInterface { diff --git a/OpenSim/Region/Framework/Interfaces/IUrlModule.cs b/OpenSim/Region/Framework/Interfaces/IUrlModule.cs index 1b911666e4..457444cd83 100644 --- a/OpenSim/Region/Framework/Interfaces/IUrlModule.cs +++ b/OpenSim/Region/Framework/Interfaces/IUrlModule.cs @@ -34,6 +34,7 @@ namespace OpenSim.Region.Framework.Interfaces { public interface IUrlModule { + string ExternalHostNameForLSL { get; } UUID RequestURL(IScriptModule engine, SceneObjectPart host, UUID itemID); UUID RequestSecureURL(IScriptModule engine, SceneObjectPart host, UUID itemID); void ReleaseURL(string url); diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index d213c353ef..4b2880837e 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -8743,7 +8743,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public LSL_String llGetSimulatorHostname() { m_host.AddScriptLPS(1); - return System.Environment.MachineName; + IUrlModule UrlModule = World.RequestModuleInterface(); + return UrlModule.ExternalHostNameForLSL; } // From b490050165571bb9da87c3457db1a4b0b5c96dee Mon Sep 17 00:00:00 2001 From: BlueWall Date: Wed, 23 May 2012 16:58:04 -0400 Subject: [PATCH 261/547] Format cleanup --- OpenSim/Data/Null/NullSimulationData.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/OpenSim/Data/Null/NullSimulationData.cs b/OpenSim/Data/Null/NullSimulationData.cs index b7889767da..18a4818742 100644 --- a/OpenSim/Data/Null/NullSimulationData.cs +++ b/OpenSim/Data/Null/NullSimulationData.cs @@ -77,8 +77,8 @@ namespace OpenSim.Data.Null } public RegionSettings LoadRegionSettings(UUID regionUUID) - { - RegionSettings rs = new RegionSettings(); + { + RegionSettings rs = new RegionSettings(); rs.RegionUUID = regionUUID; return rs; } From bc543c1797c629a8584dd2e74d3c5f7a67de96c9 Mon Sep 17 00:00:00 2001 From: PixelTomsen Date: Wed, 23 May 2012 21:06:25 +0200 Subject: [PATCH 262/547] Environment Module - allows Environment settings for Viewer3 warning: includes database region store migrations for mssql, mysql, sqlite enable/disable this module: Cap_EnvironmentSettings = "localhost" (for enable) Cap_EnvironmentSettings = "" (for disable) at ClientStack.LindenCaps section (OpenSimDefaults.ini file) or owerwrite in OpenSim.ini mantis: http://opensimulator.org/mantis/view.php?id=5860 Signed-off-by: BlueWall --- .../Capabilities/LLSDEnvironmentSettings.cs | 68 ++++++ OpenSim/Data/MSSQL/MSSQLSimulationData.cs | 66 ++++++ .../MSSQL/Resources/RegionStore.migrations | 14 ++ OpenSim/Data/MySQL/MySQLSimulationData.cs | 62 +++++ .../MySQL/Resources/RegionStore.migrations | 11 + OpenSim/Data/Null/NullSimulationData.cs | 18 ++ .../SQLite/Resources/RegionStore.migrations | 11 + OpenSim/Data/SQLite/SQLiteSimulationData.cs | 101 +++++++- .../LightShare/EnvironmentModule.cs | 224 ++++++++++++++++++ .../Interfaces/IEnvironmentModule.cs | 36 +++ .../Interfaces/ISimulationDataService.cs | 21 ++ .../Interfaces/ISimulationDataStore.cs | 20 ++ .../Simulation/SimulationDataService.cs | 16 ++ .../Tests/Common/Mock/MockRegionDataPlugin.cs | 35 ++- bin/OpenSimDefaults.ini | 3 +- 15 files changed, 703 insertions(+), 3 deletions(-) create mode 100644 OpenSim/Capabilities/LLSDEnvironmentSettings.cs create mode 100644 OpenSim/Region/CoreModules/LightShare/EnvironmentModule.cs create mode 100644 OpenSim/Region/Framework/Interfaces/IEnvironmentModule.cs diff --git a/OpenSim/Capabilities/LLSDEnvironmentSettings.cs b/OpenSim/Capabilities/LLSDEnvironmentSettings.cs new file mode 100644 index 0000000000..39019af22c --- /dev/null +++ b/OpenSim/Capabilities/LLSDEnvironmentSettings.cs @@ -0,0 +1,68 @@ +/* + * Copyright (c) Contributors, http://opensimulator.org/ + * See CONTRIBUTORS.TXT for a full list of copyright holders. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the OpenSimulator Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using System; +using System.Collections.Generic; +using OpenMetaverse; + +namespace OpenSim.Framework.Capabilities +{ + [OSDMap] + public class LLSDEnvironmentRequest + { + public UUID messageID; + public UUID regionID; + } + + [OSDMap] + public class LLSDEnvironmentSetResponse + { + public UUID regionID; + public UUID messageID; + public Boolean success; + public String fail_reason; + } + + public class EnvironmentSettings + { + /// + /// generates a empty llsd settings response for viewer + /// + /// the message UUID + /// the region UUID + public static string EmptySettings(UUID messageID, UUID regionID) + { + OSDArray arr = new OSDArray(); + LLSDEnvironmentRequest msg = new LLSDEnvironmentRequest(); + msg.messageID = messageID; + msg.regionID = regionID; + arr.Array.Add(msg); + return LLSDHelpers.SerialiseLLSDReply(arr); + } + } + +} diff --git a/OpenSim/Data/MSSQL/MSSQLSimulationData.cs b/OpenSim/Data/MSSQL/MSSQLSimulationData.cs index d9dfe864ec..3f29f5b36d 100644 --- a/OpenSim/Data/MSSQL/MSSQLSimulationData.cs +++ b/OpenSim/Data/MSSQL/MSSQLSimulationData.cs @@ -1181,6 +1181,72 @@ VALUES // } #endregion } + + #region Environment Settings + public string LoadRegionEnvironmentSettings(UUID regionUUID) + { + string sql = "select * from [regionenvironment] where region_id = @region_id"; + using (SqlConnection conn = new SqlConnection(m_connectionString)) + using (SqlCommand cmd = new SqlCommand(sql, conn)) + { + cmd.Parameters.Add(_Database.CreateParameter("@region_id", regionUUID)); + conn.Open(); + using (SqlDataReader result = cmd.ExecuteReader()) + { + if (!result.Read()) + { + return String.Empty; + } + else + { + return Convert.ToString(result["llsd_settings"]); + } + } + } + } + + public void StoreRegionEnvironmentSettings(UUID regionUUID, string settings) + { + { + string sql = "DELETE FROM [regionenvironment] WHERE region_id = @region_id"; + using (SqlConnection conn = new SqlConnection(m_connectionString)) + + using (SqlCommand cmd = new SqlCommand(sql, conn)) + { + cmd.Parameters.Add(_Database.CreateParameter("@region_id", regionUUID)); + conn.Open(); + cmd.ExecuteNonQuery(); + } + + sql = "INSERT INTO [regionenvironment] (region_id, llsd_settings) VALUES (@region_id, @llsd_settings)"; + + using (SqlConnection conn = new SqlConnection(m_connectionString)) + + using (SqlCommand cmd = new SqlCommand(sql, conn)) + { + cmd.Parameters.Add(_Database.CreateParameter("@region_id", regionUUID)); + cmd.Parameters.Add(_Database.CreateParameter("@llsd_settings", settings)); + + conn.Open(); + cmd.ExecuteNonQuery(); + } + } + } + + public void RemoveRegionEnvironmentSettings(UUID regionUUID) + { + string sql = "delete from [regionenvironment] where region_id = @region_id"; + using (SqlConnection conn = new SqlConnection(m_connectionString)) + using (SqlCommand cmd = new SqlCommand(sql, conn)) + { + cmd.Parameters.Add(_Database.CreateParameter("@region_id", regionUUID)); + + conn.Open(); + cmd.ExecuteNonQuery(); + } + } + #endregion + /// /// Loads the settings of a region. /// diff --git a/OpenSim/Data/MSSQL/Resources/RegionStore.migrations b/OpenSim/Data/MSSQL/Resources/RegionStore.migrations index d6a3be9282..350e548a0a 100644 --- a/OpenSim/Data/MSSQL/Resources/RegionStore.migrations +++ b/OpenSim/Data/MSSQL/Resources/RegionStore.migrations @@ -1134,3 +1134,17 @@ ALTER TABLE landaccesslist ADD Expires integer NOT NULL DEFAULT 0; COMMIT +:VERSION 37 #---------------- Environment Settings + +BEGIN TRANSACTION + +CREATE TABLE [dbo].[regionenvironment]( + [region_id] [uniqueidentifier] NOT NULL, + [llsd_settings] [varchar](max) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + PRIMARY KEY CLUSTERED +( + [region_id] ASC +)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY] +) ON [PRIMARY] + +COMMIT diff --git a/OpenSim/Data/MySQL/MySQLSimulationData.cs b/OpenSim/Data/MySQL/MySQLSimulationData.cs index b2a1481ee9..1a2e11333a 100644 --- a/OpenSim/Data/MySQL/MySQLSimulationData.cs +++ b/OpenSim/Data/MySQL/MySQLSimulationData.cs @@ -969,6 +969,68 @@ namespace OpenSim.Data.MySQL } } + #region RegionEnvironmentSettings + public string LoadRegionEnvironmentSettings(UUID regionUUID) + { + using (MySqlConnection dbcon = new MySqlConnection(m_connectionString)) + { + dbcon.Open(); + + string command = "select * from `regionenvironment` where region_id = ?region_id"; + + using (MySqlCommand cmd = new MySqlCommand(command)) + { + cmd.Connection = dbcon; + + cmd.Parameters.AddWithValue("?region_id", regionUUID.ToString()); + + IDataReader result = ExecuteReader(cmd); + if (!result.Read()) + { + return String.Empty; + } + else + { + return Convert.ToString(result["llsd_settings"]); + } + } + } + } + + public void StoreRegionEnvironmentSettings(UUID regionUUID, string settings) + { + using (MySqlConnection dbcon = new MySqlConnection(m_connectionString)) + { + dbcon.Open(); + + using (MySqlCommand cmd = dbcon.CreateCommand()) + { + cmd.CommandText = "REPLACE INTO `regionenvironment` (`region_id`, `llsd_settings`) VALUES (?region_id, ?llsd_settings)"; + + cmd.Parameters.AddWithValue("region_id", regionUUID); + cmd.Parameters.AddWithValue("llsd_settings", settings); + + ExecuteNonQuery(cmd); + } + } + } + + public void RemoveRegionEnvironmentSettings(UUID regionUUID) + { + using (MySqlConnection dbcon = new MySqlConnection(m_connectionString)) + { + dbcon.Open(); + + using (MySqlCommand cmd = dbcon.CreateCommand()) + { + cmd.CommandText = "delete from `regionenvironment` where region_id = ?region_id"; + cmd.Parameters.AddWithValue("?region_id", regionUUID.ToString()); + ExecuteNonQuery(cmd); + } + } + } + #endregion + public void StoreRegionSettings(RegionSettings rs) { lock (m_dbLock) diff --git a/OpenSim/Data/MySQL/Resources/RegionStore.migrations b/OpenSim/Data/MySQL/Resources/RegionStore.migrations index 099beaf769..4a925fb9bd 100644 --- a/OpenSim/Data/MySQL/Resources/RegionStore.migrations +++ b/OpenSim/Data/MySQL/Resources/RegionStore.migrations @@ -883,4 +883,15 @@ ALTER TABLE `regionsettings` MODIFY COLUMN `TelehubObject` VARCHAR(36) NOT NULL COMMIT; +:VERSION 44 #--------------------- Environment Settings + +BEGIN; + +CREATE TABLE `regionenvironment` ( + `region_id` varchar(36) NOT NULL, + `llsd_settings` TEXT NOT NULL, + PRIMARY KEY (`region_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +COMMIT; diff --git a/OpenSim/Data/Null/NullSimulationData.cs b/OpenSim/Data/Null/NullSimulationData.cs index 18a4818742..8f2314ff1f 100644 --- a/OpenSim/Data/Null/NullSimulationData.cs +++ b/OpenSim/Data/Null/NullSimulationData.cs @@ -76,6 +76,24 @@ namespace OpenSim.Data.Null //This connector doesn't support the windlight module yet } + #region Environment Settings + public string LoadRegionEnvironmentSettings(UUID regionUUID) + { + //This connector doesn't support the Environment module yet + return string.Empty; + } + + public void StoreRegionEnvironmentSettings(UUID regionUUID, string settings) + { + //This connector doesn't support the Environment module yet + } + + public void RemoveRegionEnvironmentSettings(UUID regionUUID) + { + //This connector doesn't support the Environment module yet + } + #endregion + public RegionSettings LoadRegionSettings(UUID regionUUID) { RegionSettings rs = new RegionSettings(); diff --git a/OpenSim/Data/SQLite/Resources/RegionStore.migrations b/OpenSim/Data/SQLite/Resources/RegionStore.migrations index 1ceddf98a1..e872977634 100644 --- a/OpenSim/Data/SQLite/Resources/RegionStore.migrations +++ b/OpenSim/Data/SQLite/Resources/RegionStore.migrations @@ -564,3 +564,14 @@ COMMIT; BEGIN; ALTER TABLE `regionsettings` ADD COLUMN `parcel_tile_ID` char(36) NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000'; COMMIT; + +:VERSION 26 + +BEGIN; + +CREATE TABLE `regionenvironment` ( + `region_id` varchar(36) NOT NULL DEFAULT '000000-0000-0000-0000-000000000000' PRIMARY KEY, + `llsd_settings` TEXT NOT NULL +); + +COMMIT; diff --git a/OpenSim/Data/SQLite/SQLiteSimulationData.cs b/OpenSim/Data/SQLite/SQLiteSimulationData.cs index 7e7c08a74f..f40e86644c 100644 --- a/OpenSim/Data/SQLite/SQLiteSimulationData.cs +++ b/OpenSim/Data/SQLite/SQLiteSimulationData.cs @@ -61,6 +61,7 @@ namespace OpenSim.Data.SQLite private const string regionbanListSelect = "select * from regionban"; private const string regionSettingsSelect = "select * from regionsettings"; private const string regionWindlightSelect = "select * from regionwindlight"; + private const string regionEnvironmentSelect = "select * from regionenvironment"; private const string regionSpawnPointsSelect = "select * from spawn_points"; private DataSet ds; @@ -72,6 +73,7 @@ namespace OpenSim.Data.SQLite private SqliteDataAdapter landAccessListDa; private SqliteDataAdapter regionSettingsDa; private SqliteDataAdapter regionWindlightDa; + private SqliteDataAdapter regionEnvironmentDa; private SqliteDataAdapter regionSpawnPointsDa; private SqliteConnection m_conn; @@ -146,6 +148,9 @@ namespace OpenSim.Data.SQLite SqliteCommand regionWindlightSelectCmd = new SqliteCommand(regionWindlightSelect, m_conn); regionWindlightDa = new SqliteDataAdapter(regionWindlightSelectCmd); + SqliteCommand regionEnvironmentSelectCmd = new SqliteCommand(regionEnvironmentSelect, m_conn); + regionEnvironmentDa = new SqliteDataAdapter(regionEnvironmentSelectCmd); + SqliteCommand regionSpawnPointsSelectCmd = new SqliteCommand(regionSpawnPointsSelect, m_conn); regionSpawnPointsDa = new SqliteDataAdapter(regionSpawnPointsSelectCmd); @@ -179,6 +184,9 @@ namespace OpenSim.Data.SQLite ds.Tables.Add(createRegionWindlightTable()); setupRegionWindlightCommands(regionWindlightDa, m_conn); + ds.Tables.Add(createRegionEnvironmentTable()); + setupRegionEnvironmentCommands(regionEnvironmentDa, m_conn); + ds.Tables.Add(createRegionSpawnPointsTable()); setupRegionSpawnPointsCommands(regionSpawnPointsDa, m_conn); @@ -258,6 +266,15 @@ namespace OpenSim.Data.SQLite m_log.ErrorFormat("[SQLITE REGION DB]: Caught fill error on regionwindlight table :{0}", e.Message); } + try + { + regionEnvironmentDa.Fill(ds.Tables["regionenvironment"]); + } + catch (Exception e) + { + m_log.ErrorFormat("[SQLITE REGION DB]: Caught fill error on regionenvironment table :{0}", e.Message); + } + try { regionSpawnPointsDa.Fill(ds.Tables["spawn_points"]); @@ -278,12 +295,13 @@ namespace OpenSim.Data.SQLite CreateDataSetMapping(landAccessListDa, "landaccesslist"); CreateDataSetMapping(regionSettingsDa, "regionsettings"); CreateDataSetMapping(regionWindlightDa, "regionwindlight"); + CreateDataSetMapping(regionEnvironmentDa, "regionenvironment"); CreateDataSetMapping(regionSpawnPointsDa, "spawn_points"); } } catch (Exception e) { - m_log.ErrorFormat("[SQLITE REGION DB]: ", e); + m_log.ErrorFormat("[SQLITE REGION DB]: {0} - {1}", e.Message, e.StackTrace); Environment.Exit(23); } return; @@ -341,6 +359,11 @@ namespace OpenSim.Data.SQLite regionWindlightDa.Dispose(); regionWindlightDa = null; } + if (regionEnvironmentDa != null) + { + regionEnvironmentDa.Dispose(); + regionEnvironmentDa = null; + } if (regionSpawnPointsDa != null) { regionSpawnPointsDa.Dispose(); @@ -474,6 +497,63 @@ namespace OpenSim.Data.SQLite } } + #region Region Environment Settings + public string LoadRegionEnvironmentSettings(UUID regionUUID) + { + lock (ds) + { + DataTable environmentTable = ds.Tables["regionenvironment"]; + DataRow row = environmentTable.Rows.Find(regionUUID.ToString()); + if (row == null) + { + return String.Empty; + } + + return (String)row["llsd_settings"]; + } + } + + public void StoreRegionEnvironmentSettings(UUID regionUUID, string settings) + { + lock (ds) + { + DataTable environmentTable = ds.Tables["regionenvironment"]; + DataRow row = environmentTable.Rows.Find(regionUUID.ToString()); + + if (row == null) + { + row = environmentTable.NewRow(); + row["region_id"] = regionUUID.ToString(); + row["llsd_settings"] = settings; + environmentTable.Rows.Add(row); + } + else + { + row["llsd_settings"] = settings; + } + + regionEnvironmentDa.Update(ds, "regionenvironment"); + } + } + + public void RemoveRegionEnvironmentSettings(UUID regionUUID) + { + lock (ds) + { + DataTable environmentTable = ds.Tables["regionenvironment"]; + DataRow row = environmentTable.Rows.Find(regionUUID.ToString()); + + if (row != null) + { + row.Delete(); + } + + regionEnvironmentDa.Update(ds, "regionenvironment"); + } + } + + #endregion + public RegionSettings LoadRegionSettings(UUID regionUUID) { lock (ds) @@ -1430,6 +1510,17 @@ namespace OpenSim.Data.SQLite return regionwindlight; } + private static DataTable createRegionEnvironmentTable() + { + DataTable regionEnvironment = new DataTable("regionenvironment"); + createCol(regionEnvironment, "region_id", typeof(String)); + createCol(regionEnvironment, "llsd_settings", typeof(String)); + + regionEnvironment.PrimaryKey = new DataColumn[] { regionEnvironment.Columns["region_id"] }; + + return regionEnvironment; + } + private static DataTable createRegionSpawnPointsTable() { DataTable spawn_points = new DataTable("spawn_points"); @@ -2691,6 +2782,14 @@ namespace OpenSim.Data.SQLite da.UpdateCommand.Connection = conn; } + private void setupRegionEnvironmentCommands(SqliteDataAdapter da, SqliteConnection conn) + { + da.InsertCommand = createInsertCommand("regionenvironment", ds.Tables["regionenvironment"]); + da.InsertCommand.Connection = conn; + da.UpdateCommand = createUpdateCommand("regionenvironment", "region_id=:region_id", ds.Tables["regionenvironment"]); + da.UpdateCommand.Connection = conn; + } + private void setupRegionSpawnPointsCommands(SqliteDataAdapter da, SqliteConnection conn) { da.InsertCommand = createInsertCommand("spawn_points", ds.Tables["spawn_points"]); diff --git a/OpenSim/Region/CoreModules/LightShare/EnvironmentModule.cs b/OpenSim/Region/CoreModules/LightShare/EnvironmentModule.cs new file mode 100644 index 0000000000..1526886d7a --- /dev/null +++ b/OpenSim/Region/CoreModules/LightShare/EnvironmentModule.cs @@ -0,0 +1,224 @@ +/* + * Copyright (c) Contributors, http://opensimulator.org/ + * See CONTRIBUTORS.TXT for a full list of copyright holders. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the OpenSimulator Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using System; +using System.Reflection; +using OpenMetaverse; +using OpenSim.Framework; +using OpenSim.Framework.Capabilities; +using OpenSim.Framework.Servers.HttpServer; +using OpenSim.Region.Framework.Interfaces; +using OpenSim.Region.Framework.Scenes; +using log4net; +using Nini.Config; +using Mono.Addins; + +using Caps = OpenSim.Framework.Capabilities.Caps; + + +namespace OpenSim.Region.CoreModules.World.LightShare +{ + [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "EnvironmentModule")] + + public class EnvironmentModule : INonSharedRegionModule, IEnvironmentModule + { + private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + + private Scene m_scene = null; + private UUID regionID = UUID.Zero; + private static bool Enabled = false; + + private static readonly string capsName = "EnvironmentSettings"; + private static readonly string capsBase = "/CAPS/0020/"; + + private LLSDEnvironmentSetResponse setResponse = null; + + #region INonSharedRegionModule + public void Initialise(IConfigSource source) + { + IConfig config = source.Configs["ClientStack.LindenCaps"]; + + if (null == config) + return; + + if (config.GetString("Cap_EnvironmentSettings", String.Empty) != "localhost") + { + m_log.InfoFormat("[{0}]: Module is disabled.", Name); + return; + } + + Enabled = true; + + m_log.InfoFormat("[{0}]: Module is enabled.", Name); + } + + public void Close() + { + } + + public string Name + { + get { return "EnvironmentModule"; } + } + + public Type ReplaceableInterface + { + get { return null; } + } + + public void AddRegion(Scene scene) + { + if (!Enabled) + return; + + scene.RegisterModuleInterface(this); + m_scene = scene; + regionID = scene.RegionInfo.RegionID; + } + + public void RegionLoaded(Scene scene) + { + if (!Enabled) + return; + + setResponse = new LLSDEnvironmentSetResponse(); + scene.EventManager.OnRegisterCaps += OnRegisterCaps; + } + + public void RemoveRegion(Scene scene) + { + if (Enabled) + return; + + scene.EventManager.OnRegisterCaps -= OnRegisterCaps; + m_scene = null; + } + #endregion + + #region IEnvironmentModule + public void ResetEnvironmentSettings(UUID regionUUID) + { + if (!Enabled) + return; + + m_scene.SimulationDataService.RemoveRegionEnvironmentSettings(regionUUID); + } + #endregion + + #region Events + private void OnRegisterCaps(UUID agentID, Caps caps) + { +// m_log.DebugFormat("[{0}]: Register capability for agentID {1} in region {2}", +// Name, agentID, caps.RegionName); + + string capsPath = capsBase + UUID.Random(); + + // Get handler + caps.RegisterHandler( + capsName, + new RestStreamHandler( + "GET", + capsPath, + (request, path, param, httpRequest, httpResponse) + => GetEnvironmentSettings(request, path, param, agentID, caps), + capsName, + agentID.ToString())); + + // Set handler + caps.HttpListener.AddStreamHandler( + new RestStreamHandler( + "POST", + capsPath, + (request, path, param, httpRequest, httpResponse) + => SetEnvironmentSettings(request, path, param, agentID, caps), + capsName, + agentID.ToString())); + } + #endregion + + private string GetEnvironmentSettings(string request, string path, string param, + UUID agentID, Caps caps) + { +// m_log.DebugFormat("[{0}]: Environment GET handle for agentID {1} in region {2}", +// Name, agentID, caps.RegionName); + + string env = String.Empty; + + try + { + env = m_scene.SimulationDataService.LoadRegionEnvironmentSettings(regionID); + } + catch (Exception e) + { + m_log.ErrorFormat("[{0}]: Unable to load environment settings for region {1}, Exception: {2} - {3}", + Name, caps.RegionName, e.Message, e.StackTrace); + } + + if (String.IsNullOrEmpty(env)) + env = EnvironmentSettings.EmptySettings(UUID.Zero, regionID); + + return env; + } + + private string SetEnvironmentSettings(string request, string path, string param, + UUID agentID, Caps caps) + { + +// m_log.DebugFormat("[{0}]: Environment SET handle from agentID {1} in region {2}", +// Name, agentID, caps.RegionName); + + setResponse.regionID = regionID; + setResponse.success = false; + + if (!m_scene.Permissions.CanIssueEstateCommand(agentID, false)) + { + setResponse.fail_reason = "Insufficient estate permissions, settings has not been saved."; + return LLSDHelpers.SerialiseLLSDReply(setResponse); + } + + try + { + m_scene.SimulationDataService.StoreRegionEnvironmentSettings(regionID, request); + setResponse.success = true; + + m_log.InfoFormat("[{0}]: New Environment settings has been saved from agentID {1} in region {2}", + Name, agentID, caps.RegionName); + } + catch (Exception e) + { + m_log.ErrorFormat("[{0}]: Environment settings has not been saved for region {1}, Exception: {2} - {3}", + Name, caps.RegionName, e.Message, e.StackTrace); + + setResponse.success = false; + setResponse.fail_reason = String.Format("Environment Set for region {0} has failed, settings has not been saved.", caps.RegionName); + } + + return LLSDHelpers.SerialiseLLSDReply(setResponse); + } + } +} + diff --git a/OpenSim/Region/Framework/Interfaces/IEnvironmentModule.cs b/OpenSim/Region/Framework/Interfaces/IEnvironmentModule.cs new file mode 100644 index 0000000000..7a7b78202d --- /dev/null +++ b/OpenSim/Region/Framework/Interfaces/IEnvironmentModule.cs @@ -0,0 +1,36 @@ +/* + * Copyright (c) Contributors, http://opensimulator.org/ + * See CONTRIBUTORS.TXT for a full list of copyright holders. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the OpenSimulator Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using OpenMetaverse; + +namespace OpenSim.Region.Framework.Interfaces +{ + public interface IEnvironmentModule + { + void ResetEnvironmentSettings(UUID regionUUID); + } +} diff --git a/OpenSim/Region/Framework/Interfaces/ISimulationDataService.cs b/OpenSim/Region/Framework/Interfaces/ISimulationDataService.cs index 5295a72976..0fcafcc515 100644 --- a/OpenSim/Region/Framework/Interfaces/ISimulationDataService.cs +++ b/OpenSim/Region/Framework/Interfaces/ISimulationDataService.cs @@ -95,5 +95,26 @@ namespace OpenSim.Region.Framework.Interfaces RegionLightShareData LoadRegionWindlightSettings(UUID regionUUID); void StoreRegionWindlightSettings(RegionLightShareData wl); void RemoveRegionWindlightSettings(UUID regionID); + + /// + /// Load Environment settings from region storage + /// + /// the region UUID + /// LLSD string for viewer + string LoadRegionEnvironmentSettings(UUID regionUUID); + + /// + /// Store Environment settings into region storage + /// + /// the region UUID + /// LLSD string from viewer + void StoreRegionEnvironmentSettings(UUID regionUUID, string settings); + + /// + /// Delete Environment settings from region storage + /// + /// the region UUID + void RemoveRegionEnvironmentSettings(UUID regionUUID); + } } diff --git a/OpenSim/Region/Framework/Interfaces/ISimulationDataStore.cs b/OpenSim/Region/Framework/Interfaces/ISimulationDataStore.cs index 615f3770d1..e424976226 100644 --- a/OpenSim/Region/Framework/Interfaces/ISimulationDataStore.cs +++ b/OpenSim/Region/Framework/Interfaces/ISimulationDataStore.cs @@ -107,6 +107,26 @@ namespace OpenSim.Region.Framework.Interfaces void StoreRegionWindlightSettings(RegionLightShareData wl); void RemoveRegionWindlightSettings(UUID regionID); + /// + /// Load Environment settings from region storage + /// + /// the region UUID + /// LLSD string for viewer + string LoadRegionEnvironmentSettings(UUID regionUUID); + + /// + /// Store Environment settings into region storage + /// + /// the region UUID + /// LLSD string from viewer + void StoreRegionEnvironmentSettings(UUID regionUUID, string settings); + + /// + /// Delete Environment settings from region storage + /// + /// the region UUID + void RemoveRegionEnvironmentSettings(UUID regionUUID); + void Shutdown(); } } diff --git a/OpenSim/Services/Connectors/Simulation/SimulationDataService.cs b/OpenSim/Services/Connectors/Simulation/SimulationDataService.cs index ccef50b473..c9cbbfa500 100644 --- a/OpenSim/Services/Connectors/Simulation/SimulationDataService.cs +++ b/OpenSim/Services/Connectors/Simulation/SimulationDataService.cs @@ -148,5 +148,21 @@ namespace OpenSim.Services.Connectors { m_database.RemoveRegionWindlightSettings(regionID); } + + public string LoadRegionEnvironmentSettings(UUID regionUUID) + { + return m_database.LoadRegionEnvironmentSettings(regionUUID); + } + + public void StoreRegionEnvironmentSettings(UUID regionUUID, string settings) + { + m_database.StoreRegionEnvironmentSettings(regionUUID, settings); + } + + public void RemoveRegionEnvironmentSettings(UUID regionUUID) + { + m_database.RemoveRegionEnvironmentSettings(regionUUID); + } + } } diff --git a/OpenSim/Tests/Common/Mock/MockRegionDataPlugin.cs b/OpenSim/Tests/Common/Mock/MockRegionDataPlugin.cs index 579d41ca03..1845eb94f3 100644 --- a/OpenSim/Tests/Common/Mock/MockRegionDataPlugin.cs +++ b/OpenSim/Tests/Common/Mock/MockRegionDataPlugin.cs @@ -112,6 +112,21 @@ namespace OpenSim.Data.Null { m_store.StoreRegionWindlightSettings(wl); } + + public string LoadRegionEnvironmentSettings(UUID regionUUID) + { + return m_store.LoadRegionEnvironmentSettings(regionUUID); + } + + public void StoreRegionEnvironmentSettings(UUID regionUUID, string settings) + { + m_store.StoreRegionEnvironmentSettings(regionUUID, settings); + } + + public void RemoveRegionEnvironmentSettings(UUID regionUUID) + { + m_store.RemoveRegionEnvironmentSettings(regionUUID); + } } /// @@ -158,7 +173,25 @@ namespace OpenSim.Data.Null { //This connector doesn't support the windlight module yet } - + + #region Environment Settings + public string LoadRegionEnvironmentSettings(UUID regionUUID) + { + //This connector doesn't support the Environment module yet + return string.Empty; + } + + public void StoreRegionEnvironmentSettings(UUID regionUUID, string settings) + { + //This connector doesn't support the Environment module yet + } + + public void RemoveRegionEnvironmentSettings(UUID regionUUID) + { + //This connector doesn't support the Environment module yet + } + #endregion + public RegionSettings LoadRegionSettings(UUID regionUUID) { RegionSettings rs = null; diff --git a/bin/OpenSimDefaults.ini b/bin/OpenSimDefaults.ini index 7962ef8930..5da3ba2c9b 100644 --- a/bin/OpenSimDefaults.ini +++ b/bin/OpenSimDefaults.ini @@ -534,7 +534,7 @@ ; silly vanity "Facelights" dead. Sorry, head mounted miner's lamps ; will also be affected. ; - ;DisableFacelights = "false(1815) + ;DisableFacelights = false [ClientStack.LindenCaps] ;; Long list of capabilities taken from @@ -549,6 +549,7 @@ Cap_CopyInventoryFromNotecard = "localhost" Cap_DispatchRegionInfo = "" Cap_EstateChangeInfo = "" + Cap_EnvironmentSettings = "localhost" Cap_EventQueueGet = "localhost" Cap_FetchInventory = "" Cap_ObjectMedia = "localhost" From 459c7635afdbc4002cacbf5780185645a4296f6a Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 24 May 2012 00:31:14 +0100 Subject: [PATCH 263/547] If an agent is still registered as 'in transit' by the source region, don't allow an immediate teleport back. This is to help relieve a race condition when an agent teleports then immediately attempts to teleport back before the source region has properly cleaned up/demoted the old ScenePresence. This is rare in viewers but much more possible via scripting or region module. However, more needs to be done since virtually all clean up happens after the transit flag is cleared . Possibly need to add a 'cleaning up' state to in transit. This change required making the EntityTransferModule and HGEntityTransferModule per-region rather than shared, in order to allow separate transit lists. Changes were also required in LocalSimulationConnector. Tested in standalone, grid and with local and remote region crossings with attachments. --- .../EntityTransfer/EntityTransferModule.cs | 69 +++---- .../EntityTransfer/HGEntityTransferModule.cs | 59 +++--- .../Simulation/LocalSimulationConnector.cs | 186 +++++++++--------- .../Interfaces/IEntityTransferModule.cs | 7 + OpenSim/Region/Framework/Scenes/Scene.cs | 67 +++++-- .../Tests/ScenePresenceTeleportTests.cs | 42 ++-- 6 files changed, 235 insertions(+), 195 deletions(-) diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs index 36e9da62d1..408d63da10 100644 --- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs +++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs @@ -46,7 +46,7 @@ using Nini.Config; namespace OpenSim.Region.CoreModules.Framework.EntityTransfer { - public class EntityTransferModule : ISharedRegionModule, IEntityTransferModule + public class EntityTransferModule : INonSharedRegionModule, IEntityTransferModule { private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); @@ -65,9 +65,11 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer public bool EnableWaitForCallbackFromTeleportDest { get; set; } protected bool m_Enabled = false; - protected Scene m_aScene; - protected List m_Scenes = new List(); + + protected Scene m_scene; + protected List m_agentsInTransit; + private ExpiringCache> m_bannedRegions = new ExpiringCache>(); @@ -129,10 +131,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer if (!m_Enabled) return; - if (m_aScene == null) - m_aScene = scene; + m_scene = scene; - m_Scenes.Add(scene); scene.RegisterModuleInterface(this); scene.EventManager.OnNewClient += OnNewClient; } @@ -143,27 +143,11 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer client.OnTeleportLandmarkRequest += RequestTeleportLandmark; } - public virtual void Close() - { - if (!m_Enabled) - return; - } + public virtual void Close() {} - public virtual void RemoveRegion(Scene scene) - { - if (!m_Enabled) - return; - if (scene == m_aScene) - m_aScene = null; + public virtual void RemoveRegion(Scene scene) {} - m_Scenes.Remove(scene); - } - - public virtual void RegionLoaded(Scene scene) - { - if (!m_Enabled) - return; - } + public virtual void RegionLoaded(Scene scene) {} #endregion @@ -294,7 +278,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer { uint x = 0, y = 0; Utils.LongToUInts(regionHandle, out x, out y); - GridRegion reg = m_aScene.GridService.GetRegionByPosition(sp.Scene.RegionInfo.ScopeID, (int)x, (int)y); + GridRegion reg = m_scene.GridService.GetRegionByPosition(sp.Scene.RegionInfo.ScopeID, (int)x, (int)y); if (reg != null) { @@ -441,7 +425,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer string reason; string version; - if (!m_aScene.SimulationService.QueryAccess( + if (!m_scene.SimulationService.QueryAccess( finalDestination, sp.ControllingClient.AgentId, Vector3.Zero, out version, out reason)) { sp.ControllingClient.SendTeleportFailed(reason); @@ -660,7 +644,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer EnableChildAgents(sp); // Finally, kill the agent we just created at the destination. - m_aScene.SimulationService.CloseAgent(finalDestination, sp.UUID); + m_scene.SimulationService.CloseAgent(finalDestination, sp.UUID); sp.Scene.EventManager.TriggerTeleportFail(sp.ControllingClient, logout); } @@ -668,7 +652,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer protected virtual bool CreateAgent(ScenePresence sp, GridRegion reg, GridRegion finalDestination, AgentCircuitData agentCircuit, uint teleportFlags, out string reason, out bool logout) { logout = false; - bool success = m_aScene.SimulationService.CreateAgent(finalDestination, agentCircuit, teleportFlags, out reason); + bool success = m_scene.SimulationService.CreateAgent(finalDestination, agentCircuit, teleportFlags, out reason); if (success) sp.Scene.EventManager.TriggerTeleportStart(sp.ControllingClient, reg, finalDestination, teleportFlags, logout); @@ -678,7 +662,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer protected virtual bool UpdateAgent(GridRegion reg, GridRegion finalDestination, AgentData agent) { - return m_aScene.SimulationService.UpdateAgent(finalDestination, agent); + return m_scene.SimulationService.UpdateAgent(finalDestination, agent); } protected virtual void SetCallbackURL(AgentData agent, RegionInfo region) @@ -730,7 +714,6 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer return false; } - #endregion #region Landmark Teleport @@ -742,7 +725,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer /// public virtual void RequestTeleportLandmark(IClientAPI remoteClient, AssetLandmark lm) { - GridRegion info = m_aScene.GridService.GetRegionByUUID(UUID.Zero, lm.RegionID); + GridRegion info = m_scene.GridService.GetRegionByUUID(UUID.Zero, lm.RegionID); if (info == null) { @@ -763,12 +746,12 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer m_log.DebugFormat( "[ENTITY TRANSFER MODULE]: Request to teleport {0} {1} home", client.Name, client.AgentId); - //OpenSim.Services.Interfaces.PresenceInfo pinfo = m_aScene.PresenceService.GetAgent(client.SessionId); - GridUserInfo uinfo = m_aScene.GridUserService.GetGridUserInfo(client.AgentId.ToString()); + //OpenSim.Services.Interfaces.PresenceInfo pinfo = m_scene.PresenceService.GetAgent(client.SessionId); + GridUserInfo uinfo = m_scene.GridUserService.GetGridUserInfo(client.AgentId.ToString()); if (uinfo != null) { - GridRegion regionInfo = m_aScene.GridService.GetRegionByUUID(UUID.Zero, uinfo.HomeRegionID); + GridRegion regionInfo = m_scene.GridService.GetRegionByUUID(UUID.Zero, uinfo.HomeRegionID); if (regionInfo == null) { // can't find the Home region: Tell viewer and abort @@ -1625,7 +1608,6 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer #region Agent Arrived public void AgentArrivedAtDestination(UUID id) { - m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Agent {0} released", id); ResetFromTransit(id); } @@ -1896,8 +1878,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer //// And the new channel... //if (m_interregionCommsOut != null) // successYN = m_interregionCommsOut.SendCreateObject(newRegionHandle, grp, true); - if (m_aScene.SimulationService != null) - successYN = m_aScene.SimulationService.CreateObject(destination, newPosition, grp, true); + if (m_scene.SimulationService != null) + successYN = m_scene.SimulationService.CreateObject(destination, newPosition, grp, true); if (successYN) { @@ -2004,7 +1986,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer /// /// true if the agent is in the process of being teleported, false otherwise. /// The agent ID - protected bool IsInTransit(UUID id) + public bool IsInTransit(UUID id) { lock (m_agentsInTransit) return m_agentsInTransit.Contains(id); @@ -2024,10 +2006,19 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer if (m_agentsInTransit.Contains(id)) { m_agentsInTransit.Remove(id); + + m_log.DebugFormat( + "[ENTITY TRANSFER MODULE]: Agent {0} cleared from transit in {1}", + id, m_scene.RegionInfo.RegionName); + return true; } } + m_log.WarnFormat( + "[ENTITY TRANSFER MODULE]: Agent {0} requested to clear from transit in {1} but was already cleared.", + id, m_scene.RegionInfo.RegionName); + return false; } diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs index b578bcb788..412466714c 100644 --- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs +++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs @@ -45,11 +45,11 @@ using Nini.Config; namespace OpenSim.Region.CoreModules.Framework.EntityTransfer { - public class HGEntityTransferModule : EntityTransferModule, ISharedRegionModule, IEntityTransferModule, IUserAgentVerificationModule + public class HGEntityTransferModule + : EntityTransferModule, INonSharedRegionModule, IEntityTransferModule, IUserAgentVerificationModule { private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - private bool m_Initialized = false; private int m_levelHGTeleport = 0; private GatekeeperServiceConnector m_GatekeeperConnector; @@ -64,6 +64,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer public override void Initialise(IConfigSource source) { IConfig moduleConfig = source.Configs["Modules"]; + if (moduleConfig != null) { string name = moduleConfig.GetString("EntityTransferModule", ""); @@ -82,10 +83,9 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer public override void AddRegion(Scene scene) { base.AddRegion(scene); + if (m_Enabled) - { scene.RegisterModuleInterface(this); - } } protected override void OnNewClient(IClientAPI client) @@ -98,24 +98,18 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer public override void RegionLoaded(Scene scene) { base.RegionLoaded(scene); + if (m_Enabled) - if (!m_Initialized) - { - m_GatekeeperConnector = new GatekeeperServiceConnector(scene.AssetService); - m_Initialized = true; - - } - + m_GatekeeperConnector = new GatekeeperServiceConnector(scene.AssetService); } + public override void RemoveRegion(Scene scene) { base.AddRegion(scene); - if (m_Enabled) - { - scene.UnregisterModuleInterface(this); - } - } + if (m_Enabled) + scene.UnregisterModuleInterface(this); + } #endregion @@ -123,8 +117,9 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer protected override GridRegion GetFinalDestination(GridRegion region) { - int flags = m_aScene.GridService.GetRegionFlags(m_aScene.RegionInfo.ScopeID, region.RegionID); + int flags = m_scene.GridService.GetRegionFlags(m_scene.RegionInfo.ScopeID, region.RegionID); m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: region {0} flags: {1}", region.RegionID, flags); + if ((flags & (int)OpenSim.Data.RegionFlags.Hyperlink) != 0) { m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: Destination region {0} is hyperlink", region.RegionID); @@ -135,6 +130,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer m_log.WarnFormat("[HG ENTITY TRANSFER MODULE]: GetHyperlinkRegion to Gatekeeper {0} failed", region.ServerURI); return real_destination; } + return region; } @@ -143,7 +139,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer if (base.NeedsClosing(drawdist, oldRegionX, newRegionX, oldRegionY, newRegionY, reg)) return true; - int flags = m_aScene.GridService.GetRegionFlags(m_aScene.RegionInfo.ScopeID, reg.RegionID); + int flags = m_scene.GridService.GetRegionFlags(m_scene.RegionInfo.ScopeID, reg.RegionID); if (flags == -1 /* no region in DB */ || (flags & (int)OpenSim.Data.RegionFlags.Hyperlink) != 0) return true; @@ -156,7 +152,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer if (logout) { // Log them out of this grid - m_aScene.PresenceService.LogoutAgent(sp.ControllingClient.SessionId); + m_scene.PresenceService.LogoutAgent(sp.ControllingClient.SessionId); } } @@ -165,7 +161,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: CreateAgent {0} {1}", reg.ServerURI, finalDestination.ServerURI); reason = string.Empty; logout = false; - int flags = m_aScene.GridService.GetRegionFlags(m_aScene.RegionInfo.ScopeID, reg.RegionID); + int flags = m_scene.GridService.GetRegionFlags(m_scene.RegionInfo.ScopeID, reg.RegionID); if (flags == -1 /* no region in DB */ || (flags & (int)OpenSim.Data.RegionFlags.Hyperlink) != 0) { // this user is going to another grid @@ -205,7 +201,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer "[ENTITY TRANSFER MODULE]: Request to teleport {0} {1} home", client.Name, client.AgentId); // Let's find out if this is a foreign user or a local user - IUserManagement uMan = m_aScene.RequestModuleInterface(); + IUserManagement uMan = m_scene.RequestModuleInterface(); if (uMan != null && uMan.IsLocalGridUser(id)) { // local grid user @@ -262,19 +258,21 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer { m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: Teleporting agent via landmark to {0} region {1} position {2}", (lm.Gatekeeper == string.Empty) ? "local" : lm.Gatekeeper, lm.RegionID, lm.Position); + if (lm.Gatekeeper == string.Empty) { base.RequestTeleportLandmark(remoteClient, lm); return; } - GridRegion info = m_aScene.GridService.GetRegionByUUID(UUID.Zero, lm.RegionID); + GridRegion info = m_scene.GridService.GetRegionByUUID(UUID.Zero, lm.RegionID); // Local region? if (info != null) { ((Scene)(remoteClient.Scene)).RequestTeleportLocation(remoteClient, info.RegionHandle, lm.Position, Vector3.Zero, (uint)(Constants.TeleportFlags.SetLastToTarget | Constants.TeleportFlags.ViaLandmark)); + return; } else @@ -285,6 +283,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer GridRegion gatekeeper = new GridRegion(); gatekeeper.ServerURI = lm.Gatekeeper; GridRegion finalDestination = gConn.GetHyperlinkRegion(gatekeeper, new UUID(lm.RegionID)); + if (finalDestination != null) { ScenePresence sp = scene.GetScenePresence(remoteClient.AgentId); @@ -314,8 +313,12 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer IUserAgentService security = new UserAgentServiceConnector(url); return security.VerifyClient(aCircuit.SessionID, token); } - else - m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: Agent {0} {1} does not have a HomeURI OH NO!", aCircuit.firstname, aCircuit.lastname); + else + { + m_log.DebugFormat( + "[HG ENTITY TRANSFER MODULE]: Agent {0} {1} does not have a HomeURI OH NO!", + aCircuit.firstname, aCircuit.lastname); + } return false; } @@ -332,8 +335,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer } // Let's find out if this is a foreign user or a local user - IUserManagement uMan = m_aScene.RequestModuleInterface(); - UserAccount account = m_aScene.UserAccountService.GetUserAccount(m_aScene.RegionInfo.ScopeID, obj.AgentId); + IUserManagement uMan = m_scene.RequestModuleInterface(); + UserAccount account = m_scene.UserAccountService.GetUserAccount(m_scene.RegionInfo.ScopeID, obj.AgentId); if (uMan != null && uMan.IsLocalGridUser(obj.AgentId)) { // local grid user @@ -356,7 +359,6 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer #endregion - private GridRegion MakeRegion(AgentCircuitData aCircuit) { GridRegion region = new GridRegion(); @@ -373,6 +375,5 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer region.InternalEndPoint = new System.Net.IPEndPoint(System.Net.IPAddress.Parse("0.0.0.0"), (int)0); return region; } - } -} +} \ No newline at end of file diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/LocalSimulationConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/LocalSimulationConnector.cs index 90f27c4806..270daad49e 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/LocalSimulationConnector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/LocalSimulationConnector.cs @@ -26,6 +26,7 @@ */ using System; using System.Collections.Generic; +using System.Linq; using System.Reflection; using log4net; using Nini.Config; @@ -41,22 +42,20 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation public class LocalSimulationConnectorModule : ISharedRegionModule, ISimulationService { private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - // Version of this service + + /// + /// Version of this service + /// private const string m_Version = "SIMULATION/0.1"; - private List m_sceneList = new List(); - - private IEntityTransferModule m_AgentTransferModule; - protected IEntityTransferModule AgentTransferModule - { - get - { - if (m_AgentTransferModule == null) - m_AgentTransferModule = m_sceneList[0].RequestModuleInterface(); - return m_AgentTransferModule; - } - } + /// + /// Map region ID to scene. + /// + private Dictionary m_scenes = new Dictionary(); + /// + /// Is this module enabled? + /// private bool m_ModuleEnabled = false; #region IRegionModule @@ -129,12 +128,14 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation /// public void RemoveScene(Scene scene) { - lock (m_sceneList) + lock (m_scenes) { - if (m_sceneList.Contains(scene)) - { - m_sceneList.Remove(scene); - } + if (m_scenes.ContainsKey(scene.RegionInfo.RegionID)) + m_scenes.Remove(scene.RegionInfo.RegionID); + else + m_log.WarnFormat( + "[LOCAL SIMULATION CONNECTOR]: Tried to remove region {0} but it was not present", + scene.RegionInfo.RegionName); } } @@ -144,13 +145,14 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation /// public void Init(Scene scene) { - if (!m_sceneList.Contains(scene)) + lock (m_scenes) { - lock (m_sceneList) - { - m_sceneList.Add(scene); - } - + if (!m_scenes.ContainsKey(scene.RegionInfo.RegionID)) + m_scenes[scene.RegionInfo.RegionID] = scene; + else + m_log.WarnFormat( + "[LOCAL SIMULATION CONNECTOR]: Tried to add region {0} but it is already present", + scene.RegionInfo.RegionName); } } @@ -160,13 +162,14 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation public IScene GetScene(ulong regionhandle) { - foreach (Scene s in m_sceneList) + foreach (Scene s in m_scenes.Values) { if (s.RegionInfo.RegionHandle == regionhandle) return s; } + // ? weird. should not happen - return m_sceneList[0]; + return m_scenes.Values.ToArray()[0]; } public ISimulationService GetInnerService() @@ -187,13 +190,10 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation return false; } - foreach (Scene s in m_sceneList) + if (m_scenes.ContainsKey(destination.RegionID)) { - if (s.RegionInfo.RegionHandle == destination.RegionHandle) - { // m_log.DebugFormat("[LOCAL SIMULATION CONNECTOR]: Found region {0} to send SendCreateChildAgent", destination.RegionName); - return s.NewUserConnection(aCircuit, teleportFlags, out reason); - } + return m_scenes[destination.RegionID].NewUserConnection(aCircuit, teleportFlags, out reason); } reason = "Did not find region " + destination.RegionName; @@ -205,17 +205,13 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation if (destination == null) return false; - foreach (Scene s in m_sceneList) + if (m_scenes.ContainsKey(destination.RegionID)) { - if (s.RegionInfo.RegionHandle == destination.RegionHandle) - { // m_log.DebugFormat( // "[LOCAL SIMULATION CONNECTOR]: Found region {0} {1} to send AgentUpdate", // s.RegionInfo.RegionName, destination.RegionHandle); - s.IncomingChildAgentDataUpdate(cAgentData); - return true; - } + return m_scenes[destination.RegionID].IncomingChildAgentDataUpdate(cAgentData); } // m_log.DebugFormat("[LOCAL COMMS]: Did not find region {0} for ChildAgentUpdate", regionHandle); @@ -231,11 +227,12 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation // simulator so when we receive the update we need to hand it to each of the // scenes; scenes each check to see if the is a scene presence for the avatar // note that we really don't need the GridRegion for this call - foreach (Scene s in m_sceneList) + foreach (Scene s in m_scenes.Values) { //m_log.Debug("[LOCAL COMMS]: Found region to send ChildAgentUpdate"); s.IncomingChildAgentDataUpdate(cAgentData); } + //m_log.Debug("[LOCAL COMMS]: region not found for ChildAgentUpdate"); return true; } @@ -247,14 +244,15 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation if (destination == null) return false; - foreach (Scene s in m_sceneList) + if (m_scenes.ContainsKey(destination.RegionID)) { - if (s.RegionInfo.RegionHandle == destination.RegionHandle) - { - //m_log.Debug("[LOCAL COMMS]: Found region to send ChildAgentUpdate"); - return s.IncomingRetrieveRootAgent(id, out agent); - } +// m_log.DebugFormat( +// "[LOCAL SIMULATION CONNECTOR]: Found region {0} {1} to send AgentUpdate", +// s.RegionInfo.RegionName, destination.RegionHandle); + + return m_scenes[destination.RegionID].IncomingRetrieveRootAgent(id, out agent); } + //m_log.Debug("[LOCAL COMMS]: region not found for ChildAgentUpdate"); return false; } @@ -266,27 +264,31 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation if (destination == null) return false; - foreach (Scene s in m_sceneList) + if (m_scenes.ContainsKey(destination.RegionID)) { - if (s.RegionInfo.RegionID == destination.RegionID) - return s.QueryAccess(id, position, out reason); +// m_log.DebugFormat( +// "[LOCAL SIMULATION CONNECTOR]: Found region {0} {1} to send AgentUpdate", +// s.RegionInfo.RegionName, destination.RegionHandle); + + return m_scenes[destination.RegionID].QueryAccess(id, position, out reason); } + //m_log.Debug("[LOCAL COMMS]: region not found for QueryAccess"); return false; } - public bool ReleaseAgent(UUID origin, UUID id, string uri) + public bool ReleaseAgent(UUID originId, UUID agentId, string uri) { - foreach (Scene s in m_sceneList) + if (m_scenes.ContainsKey(originId)) { - if (s.RegionInfo.RegionID == origin) - { -// m_log.Debug("[LOCAL COMMS]: Found region to SendReleaseAgent"); - AgentTransferModule.AgentArrivedAtDestination(id); - return true; -// return s.IncomingReleaseAgent(id); - } +// m_log.DebugFormat( +// "[LOCAL SIMULATION CONNECTOR]: Found region {0} {1} to send AgentUpdate", +// s.RegionInfo.RegionName, destination.RegionHandle); + + m_scenes[originId].EntityTransferModule.AgentArrivedAtDestination(agentId); + return true; } + //m_log.Debug("[LOCAL COMMS]: region not found in SendReleaseAgent " + origin); return false; } @@ -296,17 +298,16 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation if (destination == null) return false; - foreach (Scene s in m_sceneList) + if (m_scenes.ContainsKey(destination.RegionID)) { - if (s.RegionInfo.RegionID == destination.RegionID) - { - //m_log.Debug("[LOCAL COMMS]: Found region to SendCloseAgent"); - // Let's spawn a threadlet right here, because this may take - // a while - Util.FireAndForget(delegate { s.IncomingCloseAgent(id); }); - return true; - } +// m_log.DebugFormat( +// "[LOCAL SIMULATION CONNECTOR]: Found region {0} {1} to send AgentUpdate", +// s.RegionInfo.RegionName, destination.RegionHandle); + + Util.FireAndForget(delegate { m_scenes[destination.RegionID].IncomingCloseAgent(id); }); + return true; } + //m_log.Debug("[LOCAL COMMS]: region not found in SendCloseAgent"); return false; } @@ -320,25 +321,28 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation if (destination == null) return false; - foreach (Scene s in m_sceneList) + if (m_scenes.ContainsKey(destination.RegionID)) { - if (s.RegionInfo.RegionHandle == destination.RegionHandle) +// m_log.DebugFormat( +// "[LOCAL SIMULATION CONNECTOR]: Found region {0} {1} to send AgentUpdate", +// s.RegionInfo.RegionName, destination.RegionHandle); + + Scene s = m_scenes[destination.RegionID]; + + if (isLocalCall) { - //m_log.Debug("[LOCAL COMMS]: Found region to SendCreateObject"); - if (isLocalCall) - { - // We need to make a local copy of the object - ISceneObject sogClone = sog.CloneForNewScene(); - sogClone.SetState(sog.GetStateSnapshot(), s); - return s.IncomingCreateObject(newPosition, sogClone); - } - else - { - // Use the object as it came through the wire - return s.IncomingCreateObject(newPosition, sog); - } + // We need to make a local copy of the object + ISceneObject sogClone = sog.CloneForNewScene(); + sogClone.SetState(sog.GetStateSnapshot(), s); + return s.IncomingCreateObject(newPosition, sogClone); + } + else + { + // Use the object as it came through the wire + return s.IncomingCreateObject(newPosition, sog); } } + return false; } @@ -347,13 +351,15 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation if (destination == null) return false; - foreach (Scene s in m_sceneList) + if (m_scenes.ContainsKey(destination.RegionID)) { - if (s.RegionInfo.RegionHandle == destination.RegionHandle) - { - return s.IncomingCreateObject(userID, itemID); - } +// m_log.DebugFormat( +// "[LOCAL SIMULATION CONNECTOR]: Found region {0} {1} to send AgentUpdate", +// s.RegionInfo.RegionName, destination.RegionHandle); + + return m_scenes[destination.RegionID].IncomingCreateObject(userID, itemID); } + return false; } @@ -364,20 +370,18 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation public bool IsLocalRegion(ulong regionhandle) { - foreach (Scene s in m_sceneList) + foreach (Scene s in m_scenes.Values) if (s.RegionInfo.RegionHandle == regionhandle) return true; + return false; } public bool IsLocalRegion(UUID id) { - foreach (Scene s in m_sceneList) - if (s.RegionInfo.RegionID == id) - return true; - return false; + return m_scenes.ContainsKey(id); } #endregion } -} +} \ No newline at end of file diff --git a/OpenSim/Region/Framework/Interfaces/IEntityTransferModule.cs b/OpenSim/Region/Framework/Interfaces/IEntityTransferModule.cs index 18e9e3c021..75c44d5823 100644 --- a/OpenSim/Region/Framework/Interfaces/IEntityTransferModule.cs +++ b/OpenSim/Region/Framework/Interfaces/IEntityTransferModule.cs @@ -74,6 +74,13 @@ namespace OpenSim.Region.Framework.Interfaces /// void TeleportHome(UUID id, IClientAPI client); + /// + /// Show whether the given agent is being teleported. + /// + /// true if the agent is in the process of being teleported, false otherwise. + /// The agent ID + bool IsInTransit(UUID id); + bool Cross(ScenePresence agent, bool isFlying); void AgentArrivedAtDestination(UUID agent); diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index fbe56f6b36..755b1e6c1c 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -166,7 +166,6 @@ namespace OpenSim.Region.Framework.Scenes protected IConfigSource m_config; protected IRegionSerialiserModule m_serialiser; protected IDialogModule m_dialogModule; - protected IEntityTransferModule m_teleportModule; protected ICapabilitiesModule m_capsModule; protected IGroupsModule m_groupsModule; @@ -498,6 +497,7 @@ namespace OpenSim.Region.Framework.Scenes } public IAttachmentsModule AttachmentsModule { get; set; } + public IEntityTransferModule EntityTransferModule { get; private set; } public IAvatarFactoryModule AvatarFactory { @@ -924,8 +924,8 @@ namespace OpenSim.Region.Framework.Scenes List old = new List(); old.Add(otherRegion.RegionHandle); agent.DropOldNeighbours(old); - if (m_teleportModule != null && agent.PresenceType != PresenceType.Npc) - m_teleportModule.EnableChildAgent(agent, otherRegion); + if (EntityTransferModule != null && agent.PresenceType != PresenceType.Npc) + EntityTransferModule.EnableChildAgent(agent, otherRegion); }); } catch (NullReferenceException) @@ -1062,8 +1062,8 @@ namespace OpenSim.Region.Framework.Scenes { ForEachRootScenePresence(delegate(ScenePresence agent) { - if (m_teleportModule != null && agent.PresenceType != PresenceType.Npc) - m_teleportModule.EnableChildAgent(agent, r); + if (EntityTransferModule != null && agent.PresenceType != PresenceType.Npc) + EntityTransferModule.EnableChildAgent(agent, r); }); } catch (NullReferenceException) @@ -1238,7 +1238,7 @@ namespace OpenSim.Region.Framework.Scenes m_serialiser = RequestModuleInterface(); m_dialogModule = RequestModuleInterface(); m_capsModule = RequestModuleInterface(); - m_teleportModule = RequestModuleInterface(); + EntityTransferModule = RequestModuleInterface(); m_groupsModule = RequestModuleInterface(); } @@ -2275,8 +2275,8 @@ namespace OpenSim.Region.Framework.Scenes return; } - if (m_teleportModule != null) - m_teleportModule.Cross(grp, attemptedPosition, silent); + if (EntityTransferModule != null) + EntityTransferModule.Cross(grp, attemptedPosition, silent); } public Border GetCrossedBorder(Vector3 position, Cardinals gridline) @@ -3078,8 +3078,10 @@ namespace OpenSim.Region.Framework.Scenes /// The IClientAPI for the client public virtual void TeleportClientHome(UUID agentId, IClientAPI client) { - if (m_teleportModule != null) - m_teleportModule.TeleportHome(agentId, client); + if (EntityTransferModule != null) + { + EntityTransferModule.TeleportHome(agentId, client); + } else { m_log.DebugFormat("[SCENE]: Unable to teleport user home: no AgentTransferModule is active"); @@ -3638,7 +3640,6 @@ namespace OpenSim.Region.Framework.Scenes private bool TestLandRestrictions(AgentCircuitData agent, ILandObject land, out string reason) { - bool banned = land.IsBannedFromLand(agent.AgentID); bool restricted = land.IsRestrictedFromLand(agent.AgentID); @@ -4131,8 +4132,10 @@ namespace OpenSim.Region.Framework.Scenes position.Y -= shifty; } - if (m_teleportModule != null) - m_teleportModule.Teleport(sp, regionHandle, position, lookAt, teleportFlags); + if (EntityTransferModule != null) + { + EntityTransferModule.Teleport(sp, regionHandle, position, lookAt, teleportFlags); + } else { m_log.DebugFormat("[SCENE]: Unable to perform teleports: no AgentTransferModule is active"); @@ -4143,8 +4146,10 @@ namespace OpenSim.Region.Framework.Scenes public bool CrossAgentToNewRegion(ScenePresence agent, bool isFlying) { - if (m_teleportModule != null) - return m_teleportModule.Cross(agent, isFlying); + if (EntityTransferModule != null) + { + return EntityTransferModule.Cross(agent, isFlying); + } else { m_log.DebugFormat("[SCENE]: Unable to cross agent to neighbouring region, because there is no AgentTransferModule"); @@ -5188,14 +5193,34 @@ namespace OpenSim.Region.Framework.Scenes throw new Exception(error); } - // This method is called across the simulation connector to - // determine if a given agent is allowed in this region - // AS A ROOT AGENT. Returning false here will prevent them - // from logging into the region, teleporting into the region - // or corssing the broder walking, but will NOT prevent - // child agent creation, thereby emulating the SL behavior. + /// + /// This method is called across the simulation connector to + /// determine if a given agent is allowed in this region + /// AS A ROOT AGENT + /// + /// + /// Returning false here will prevent them + /// from logging into the region, teleporting into the region + /// or corssing the broder walking, but will NOT prevent + /// child agent creation, thereby emulating the SL behavior. + /// + /// + /// + /// + /// public bool QueryAccess(UUID agentID, Vector3 position, out string reason) { + if (EntityTransferModule.IsInTransit(agentID)) + { + reason = "Agent is already in transit on this region"; + + m_log.DebugFormat( + "[SCENE]: Denying agent {0} entry into {1} since region already has them registered as in transit", + agentID, RegionInfo.RegionName); + + return false; + } + // FIXME: Root agent count is currently known to be inaccurate. This forces a recount before we check. // However, the long term fix is to make sure root agent count is always accurate. m_sceneGraph.RecalculateStats(); diff --git a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTeleportTests.cs b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTeleportTests.cs index 41bff7f92e..ccfe4ff218 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTeleportTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTeleportTests.cs @@ -110,12 +110,13 @@ namespace OpenSim.Region.Framework.Scenes.Tests UUID userId = TestHelpers.ParseTail(0x1); - EntityTransferModule etm = new EntityTransferModule(); + EntityTransferModule etmA = new EntityTransferModule(); + EntityTransferModule etmB = new EntityTransferModule(); LocalSimulationConnectorModule lscm = new LocalSimulationConnectorModule(); IConfigSource config = new IniConfigSource(); IConfig modulesConfig = config.AddConfig("Modules"); - modulesConfig.Set("EntityTransferModule", etm.Name); + modulesConfig.Set("EntityTransferModule", etmA.Name); modulesConfig.Set("SimulationServices", lscm.Name); IConfig entityTransferConfig = config.AddConfig("EntityTransfer"); @@ -127,7 +128,9 @@ namespace OpenSim.Region.Framework.Scenes.Tests TestScene sceneA = sh.SetupScene("sceneA", TestHelpers.ParseTail(0x100), 1000, 1000); TestScene sceneB = sh.SetupScene("sceneB", TestHelpers.ParseTail(0x200), 1002, 1000); - SceneHelpers.SetupSceneModules(new Scene[] { sceneA, sceneB }, config, etm, lscm); + SceneHelpers.SetupSceneModules(sceneA, config, etmA); + SceneHelpers.SetupSceneModules(sceneB, config, etmB); + SceneHelpers.SetupSceneModules(new Scene[] { sceneA, sceneB }, config, lscm); Vector3 teleportPosition = new Vector3(10, 11, 12); Vector3 teleportLookAt = new Vector3(20, 21, 22); @@ -174,12 +177,14 @@ namespace OpenSim.Region.Framework.Scenes.Tests UUID userId = TestHelpers.ParseTail(0x1); Vector3 preTeleportPosition = new Vector3(30, 31, 32); - EntityTransferModule etm = new EntityTransferModule(); + EntityTransferModule etmA = new EntityTransferModule(); + EntityTransferModule etmB = new EntityTransferModule(); + LocalSimulationConnectorModule lscm = new LocalSimulationConnectorModule(); IConfigSource config = new IniConfigSource(); config.AddConfig("Modules"); - config.Configs["Modules"].Set("EntityTransferModule", etm.Name); + config.Configs["Modules"].Set("EntityTransferModule", etmA.Name); config.Configs["Modules"].Set("SimulationServices", lscm.Name); config.AddConfig("EntityTransfer"); @@ -195,13 +200,15 @@ namespace OpenSim.Region.Framework.Scenes.Tests TestScene sceneA = sh.SetupScene("sceneA", TestHelpers.ParseTail(0x100), 1000, 1000); TestScene sceneB = sh.SetupScene("sceneB", TestHelpers.ParseTail(0x200), 1002, 1000); + SceneHelpers.SetupSceneModules(sceneA, config, etmA ); + // We need to set up the permisions module on scene B so that our later use of agent limit to deny // QueryAccess won't succeed anyway because administrators are always allowed in and the default // IsAdministrator if no permissions module is present is true. - SceneHelpers.SetupSceneModules(sceneB, config, new object[] { new PermissionsModule() }); + SceneHelpers.SetupSceneModules(sceneB, config, new object[] { new PermissionsModule(), etmB }); // Shared scene modules - SceneHelpers.SetupSceneModules(new Scene[] { sceneA, sceneB }, config, etm, lscm); + SceneHelpers.SetupSceneModules(new Scene[] { sceneA, sceneB }, config, lscm); Vector3 teleportPosition = new Vector3(10, 11, 12); Vector3 teleportLookAt = new Vector3(20, 21, 22); @@ -249,12 +256,13 @@ namespace OpenSim.Region.Framework.Scenes.Tests UUID userId = TestHelpers.ParseTail(0x1); Vector3 preTeleportPosition = new Vector3(30, 31, 32); - EntityTransferModule etm = new EntityTransferModule(); + EntityTransferModule etmA = new EntityTransferModule(); + EntityTransferModule etmB = new EntityTransferModule(); LocalSimulationConnectorModule lscm = new LocalSimulationConnectorModule(); IConfigSource config = new IniConfigSource(); config.AddConfig("Modules"); - config.Configs["Modules"].Set("EntityTransferModule", etm.Name); + config.Configs["Modules"].Set("EntityTransferModule", etmA.Name); config.Configs["Modules"].Set("SimulationServices", lscm.Name); config.AddConfig("EntityTransfer"); @@ -267,8 +275,11 @@ namespace OpenSim.Region.Framework.Scenes.Tests TestScene sceneA = sh.SetupScene("sceneA", TestHelpers.ParseTail(0x100), 1000, 1000); TestScene sceneB = sh.SetupScene("sceneB", TestHelpers.ParseTail(0x200), 1002, 1000); + SceneHelpers.SetupSceneModules(sceneA, config, etmA); + SceneHelpers.SetupSceneModules(sceneB, config, etmB); + // Shared scene modules - SceneHelpers.SetupSceneModules(new Scene[] { sceneA, sceneB }, config, etm, lscm); + SceneHelpers.SetupSceneModules(new Scene[] { sceneA, sceneB }, config, lscm); Vector3 teleportPosition = new Vector3(10, 11, 12); Vector3 teleportLookAt = new Vector3(20, 21, 22); @@ -312,12 +323,13 @@ namespace OpenSim.Region.Framework.Scenes.Tests UUID userId = TestHelpers.ParseTail(0x1); - EntityTransferModule etm = new EntityTransferModule(); + EntityTransferModule etmA = new EntityTransferModule(); + EntityTransferModule etmB = new EntityTransferModule(); LocalSimulationConnectorModule lscm = new LocalSimulationConnectorModule(); IConfigSource config = new IniConfigSource(); IConfig modulesConfig = config.AddConfig("Modules"); - modulesConfig.Set("EntityTransferModule", etm.Name); + modulesConfig.Set("EntityTransferModule", etmA.Name); modulesConfig.Set("SimulationServices", lscm.Name); IConfig entityTransferConfig = config.AddConfig("EntityTransfer"); @@ -329,9 +341,9 @@ namespace OpenSim.Region.Framework.Scenes.Tests TestScene sceneA = sh.SetupScene("sceneA", TestHelpers.ParseTail(0x100), 1000, 1000); TestScene sceneB = sh.SetupScene("sceneB", TestHelpers.ParseTail(0x200), 1001, 1000); - SceneHelpers.SetupSceneModules(new Scene[] { sceneA, sceneB }, config, etm, lscm); - SceneHelpers.SetupSceneModules(sceneA, new CapabilitiesModule()); - SceneHelpers.SetupSceneModules(sceneB, new CapabilitiesModule()); + SceneHelpers.SetupSceneModules(new Scene[] { sceneA, sceneB }, config, lscm); + SceneHelpers.SetupSceneModules(sceneA, config, new CapabilitiesModule(), etmA); + SceneHelpers.SetupSceneModules(sceneB, config, new CapabilitiesModule(), etmB); Vector3 teleportPosition = new Vector3(10, 11, 12); Vector3 teleportLookAt = new Vector3(20, 21, 22); From 38ce9d45a523db277d3eb4d3ed310b7cd9ca6b43 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 24 May 2012 01:00:18 +0100 Subject: [PATCH 264/547] Make ISimulationScene.GetScene() used the more efficient region id for lookup rather than the region handle. --- .../Simulation/LocalSimulationConnector.cs | 20 +++++++++++++------ .../Simulation/RemoteSimulationConnector.cs | 4 ++-- .../Handlers/Simulation/AgentHandlers.cs | 4 ++-- .../Handlers/Simulation/ObjectHandlers.cs | 2 +- .../Simulation/SimulationServiceConnector.cs | 2 +- .../Services/Interfaces/ISimulationService.cs | 12 ++++++++++- 6 files changed, 31 insertions(+), 13 deletions(-) diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/LocalSimulationConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/LocalSimulationConnector.cs index 270daad49e..026c6c884c 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/LocalSimulationConnector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/LocalSimulationConnector.cs @@ -160,16 +160,24 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation #region ISimulation - public IScene GetScene(ulong regionhandle) + public IScene GetScene(UUID regionId) { - foreach (Scene s in m_scenes.Values) + if (m_scenes.ContainsKey(regionId)) { - if (s.RegionInfo.RegionHandle == regionhandle) - return s; + return m_scenes[regionId]; } + else + { + // FIXME: This was pre-existing behaviour but possibly not a good idea, since it hides an error rather + // than making it obvious and fixable. Need to see if the error message comes up in practice. + Scene s = m_scenes.Values.ToArray()[0]; - // ? weird. should not happen - return m_scenes.Values.ToArray()[0]; + m_log.ErrorFormat( + "[LOCAL SIMULATION CONNECTOR]: Region with id {0} not found. Returning {1} {2} instead", + regionId, s.RegionInfo.RegionName, s.RegionInfo.RegionID); + + return s; + } } public ISimulationService GetInnerService() diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/RemoteSimulationConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/RemoteSimulationConnector.cs index eaf9506332..3d2851806f 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/RemoteSimulationConnector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/RemoteSimulationConnector.cs @@ -151,9 +151,9 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation #region IInterregionComms - public IScene GetScene(ulong handle) + public IScene GetScene(UUID regionId) { - return m_localBackend.GetScene(handle); + return m_localBackend.GetScene(regionId); } public ISimulationService GetInnerService() diff --git a/OpenSim/Server/Handlers/Simulation/AgentHandlers.cs b/OpenSim/Server/Handlers/Simulation/AgentHandlers.cs index 5c9be8f0de..99ae7f0405 100644 --- a/OpenSim/Server/Handlers/Simulation/AgentHandlers.cs +++ b/OpenSim/Server/Handlers/Simulation/AgentHandlers.cs @@ -546,7 +546,7 @@ namespace OpenSim.Server.Handlers.Simulation AgentData agent = new AgentData(); try { - agent.Unpack(args, m_SimulationService.GetScene(destination.RegionHandle)); + agent.Unpack(args, m_SimulationService.GetScene(destination.RegionID)); } catch (Exception ex) { @@ -566,7 +566,7 @@ namespace OpenSim.Server.Handlers.Simulation AgentPosition agent = new AgentPosition(); try { - agent.Unpack(args, m_SimulationService.GetScene(destination.RegionHandle)); + agent.Unpack(args, m_SimulationService.GetScene(destination.RegionID)); } catch (Exception ex) { diff --git a/OpenSim/Server/Handlers/Simulation/ObjectHandlers.cs b/OpenSim/Server/Handlers/Simulation/ObjectHandlers.cs index f0d8f69827..a4d03ba891 100644 --- a/OpenSim/Server/Handlers/Simulation/ObjectHandlers.cs +++ b/OpenSim/Server/Handlers/Simulation/ObjectHandlers.cs @@ -161,7 +161,7 @@ namespace OpenSim.Server.Handlers.Simulation if (args.ContainsKey("extra") && args["extra"] != null) extraStr = args["extra"].AsString(); - IScene s = m_SimulationService.GetScene(destination.RegionHandle); + IScene s = m_SimulationService.GetScene(destination.RegionID); ISceneObject sog = null; try { diff --git a/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs b/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs index cb003d1dd2..cc46ba88c1 100644 --- a/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs +++ b/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs @@ -62,7 +62,7 @@ namespace OpenSim.Services.Connectors.Simulation //m_Region = region; } - public IScene GetScene(ulong regionHandle) + public IScene GetScene(UUID regionId) { return null; } diff --git a/OpenSim/Services/Interfaces/ISimulationService.cs b/OpenSim/Services/Interfaces/ISimulationService.cs index 36fd6fcaa9..4e52532415 100644 --- a/OpenSim/Services/Interfaces/ISimulationService.cs +++ b/OpenSim/Services/Interfaces/ISimulationService.cs @@ -35,7 +35,17 @@ namespace OpenSim.Services.Interfaces { public interface ISimulationService { - IScene GetScene(ulong regionHandle); + /// + /// Retrieve the scene with the given region ID. + /// + /// + /// Region identifier. + /// + /// + /// The scene. + /// + IScene GetScene(UUID regionId); + ISimulationService GetInnerService(); #region Agents From f4cd4c8e284c8f1166028fe7f1585948a8c7c22f Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 24 May 2012 04:33:36 +0100 Subject: [PATCH 265/547] Comment out accidentally left in log line that was printing out the control file on OAR save --- .../World/Archiver/ArchiveWriteRequestPreparation.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestPreparation.cs b/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestPreparation.cs index 504f09ba5b..4edaaca594 100644 --- a/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestPreparation.cs +++ b/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestPreparation.cs @@ -428,9 +428,9 @@ namespace OpenSim.Region.CoreModules.World.Archiver s = sw.ToString(); } - if (m_scene != null) - Console.WriteLine( - "[ARCHIVE WRITE REQUEST PREPARATION]: Control file for {0} is: {1}", m_scene.RegionInfo.RegionName, s); +// if (m_scene != null) +// Console.WriteLine( +// "[ARCHIVE WRITE REQUEST PREPARATION]: Control file for {0} is: {1}", m_scene.RegionInfo.RegionName, s); return s; } From 87f9aa9d0814fa4b5a89ad7f9794b096dfcbbeb0 Mon Sep 17 00:00:00 2001 From: SignpostMarv Date: Thu, 24 May 2012 15:47:40 +0100 Subject: [PATCH 266/547] porting IDE tooltip-friendly documentation tweaks from Aurora-Sim Signed-off-by: BlueWall --- .../Servers/HttpServer/OSHttpStatusCodes.cs | 347 +++++++++++------- 1 file changed, 218 insertions(+), 129 deletions(-) diff --git a/OpenSim/Framework/Servers/HttpServer/OSHttpStatusCodes.cs b/OpenSim/Framework/Servers/HttpServer/OSHttpStatusCodes.cs index 5625227340..3fc08321b7 100644 --- a/OpenSim/Framework/Servers/HttpServer/OSHttpStatusCodes.cs +++ b/OpenSim/Framework/Servers/HttpServer/OSHttpStatusCodes.cs @@ -28,143 +28,232 @@ namespace OpenSim.Framework.Servers.HttpServer { /// - /// HTTP status codes (almost) as defined by W3C in - /// http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html + /// HTTP status codes (almost) as defined by W3C in http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html /// public enum OSHttpStatusCode: int { - // 1xx Informational status codes providing a provisional - // response. - // 100 Tells client that to keep on going sending its request - InfoContinue = 100, - // 101 Server understands request, proposes to switch to different - // application level protocol - InfoSwitchingProtocols = 101, + #region 1xx Informational status codes providing a provisional response. + /// + /// 100 Tells client that to keep on going sending its request + /// + InfoContinue = 100, - // 2xx Success codes - // 200 Request successful - SuccessOk = 200, - // 201 Request successful, new resource created - SuccessOkCreated = 201, - // 202 Request accepted, processing still on-going - SuccessOkAccepted = 202, - // 203 Request successful, meta information not authoritative - SuccessOkNonAuthoritativeInformation = 203, - // 204 Request successful, nothing to return in the body - SuccessOkNoContent = 204, - // 205 Request successful, reset displayed content - SuccessOkResetContent = 205, - // 206 Request successful, partial content returned - SuccessOkPartialContent = 206, + /// + /// 101 Server understands request, proposes to switch to different application level protocol + /// + InfoSwitchingProtocols = 101, - // 3xx Redirect code: user agent needs to go somewhere else - // 300 Redirect: different presentation forms available, take - // a pick - RedirectMultipleChoices = 300, - // 301 Redirect: requested resource has moved and now lives - // somewhere else - RedirectMovedPermanently = 301, - // 302 Redirect: Resource temporarily somewhere else, location - // might change - RedirectFound = 302, - // 303 Redirect: See other as result of a POST - RedirectSeeOther = 303, - // 304 Redirect: Resource still the same as before - RedirectNotModified = 304, - // 305 Redirect: Resource must be accessed via proxy provided - // in location field - RedirectUseProxy = 305, - // 307 Redirect: Resource temporarily somewhere else, location - // might change - RedirectMovedTemporarily = 307, + #endregion - // 4xx Client error: the client borked the request - // 400 Client error: bad request, server does not grok what - // the client wants - ClientErrorBadRequest = 400, - // 401 Client error: the client is not authorized, response - // provides WWW-Authenticate header field with a challenge - ClientErrorUnauthorized = 401, - // 402 Client error: Payment required (reserved for future use) - ClientErrorPaymentRequired = 402, - // 403 Client error: Server understood request, will not - // deliver, do not try again. - ClientErrorForbidden = 403, - // 404 Client error: Server cannot find anything matching the - // client request. - ClientErrorNotFound = 404, - // 405 Client error: The method specified by the client in the - // request is not allowed for the resource requested - ClientErrorMethodNotAllowed = 405, - // 406 Client error: Server cannot generate suitable response - // for the resource and content characteristics requested by - // the client - ClientErrorNotAcceptable = 406, - // 407 Client error: Similar to 401, Server requests that - // client authenticate itself with the proxy first - ClientErrorProxyAuthRequired = 407, - // 408 Client error: Server got impatient with client and - // decided to give up waiting for the client's request to - // arrive - ClientErrorRequestTimeout = 408, - // 409 Client error: Server could not fulfill the request for - // a resource as there is a conflict with the current state of - // the resource but thinks client can do something about this - ClientErrorConflict = 409, - // 410 Client error: The resource has moved somewhere else, - // but server has no clue where. - ClientErrorGone = 410, - // 411 Client error: The server is picky again and insists on - // having a content-length header field in the request - ClientErrorLengthRequired = 411, - // 412 Client error: one or more preconditions supplied in the - // client's request is false - ClientErrorPreconditionFailed = 412, - // 413 Client error: For fear of reflux, the server refuses to - // swallow that much data. - ClientErrorRequestEntityToLarge = 413, - // 414 Client error: The server considers the Request-URI to - // be indecently long and refuses to even look at it. - ClientErrorRequestURITooLong = 414, - // 415 Client error: The server has no clue about the media - // type requested by the client (contrary to popular belief it - // is not a warez server) - ClientErrorUnsupportedMediaType = 415, - // 416 Client error: The requested range cannot be delivered - // by the server. + #region 2xx Success codes + + /// + /// 200 Request successful + /// + SuccessOk = 200, + + /// + /// 201 Request successful, new resource created + /// + SuccessOkCreated = 201, + + /// + /// 202 Request accepted, processing still on-going + /// + SuccessOkAccepted = 202, + + /// + /// 203 Request successful, meta information not authoritative + /// + SuccessOkNonAuthoritativeInformation = 203, + + /// + /// 204 Request successful, nothing to return in the body + /// + SuccessOkNoContent = 204, + + /// + /// 205 Request successful, reset displayed content + /// + SuccessOkResetContent = 205, + + /// + /// 206 Request successful, partial content returned + /// + SuccessOkPartialContent = 206, + + #endregion + + #region 3xx Redirect code: user agent needs to go somewhere else + + /// + /// 300 Redirect: different presentation forms available, take a pick + /// + RedirectMultipleChoices = 300, + + /// + /// 301 Redirect: requested resource has moved and now lives somewhere else + /// + RedirectMovedPermanently = 301, + + /// + /// 302 Redirect: Resource temporarily somewhere else, location might change + /// + RedirectFound = 302, + + /// + /// 303 Redirect: See other as result of a POST + /// + RedirectSeeOther = 303, + + /// + /// 304 Redirect: Resource still the same as before + /// + RedirectNotModified = 304, + + /// + /// 305 Redirect: Resource must be accessed via proxy provided in location field + /// + RedirectUseProxy = 305, + + /// + /// 307 Redirect: Resource temporarily somewhere else, location might change + /// + RedirectMovedTemporarily = 307, + + #endregion + + #region 4xx Client error: the client borked the request + + /// + /// 400 Client error: bad request, server does not grok what the client wants + /// + ClientErrorBadRequest = 400, + + /// + /// 401 Client error: the client is not authorized, response provides WWW-Authenticate header field with a challenge + /// + ClientErrorUnauthorized = 401, + + /// + /// 402 Client error: Payment required (reserved for future use) + /// + ClientErrorPaymentRequired = 402, + + /// + /// 403 Client error: Server understood request, will not deliver, do not try again. + ClientErrorForbidden = 403, + + /// + /// 404 Client error: Server cannot find anything matching the client request. + /// + ClientErrorNotFound = 404, + + /// + /// 405 Client error: The method specified by the client in the request is not allowed for the resource requested + /// + ClientErrorMethodNotAllowed = 405, + + /// + /// 406 Client error: Server cannot generate suitable response for the resource and content characteristics requested by the client + /// + ClientErrorNotAcceptable = 406, + + /// + /// 407 Client error: Similar to 401, Server requests that client authenticate itself with the proxy first + /// + ClientErrorProxyAuthRequired = 407, + + /// + /// 408 Client error: Server got impatient with client and decided to give up waiting for the client's request to arrive + /// + ClientErrorRequestTimeout = 408, + + /// + /// 409 Client error: Server could not fulfill the request for a resource as there is a conflict with the current state of the resource but thinks client can do something about this + /// + ClientErrorConflict = 409, + + /// + /// 410 Client error: The resource has moved somewhere else, but server has no clue where. + /// + ClientErrorGone = 410, + + /// + /// 411 Client error: The server is picky again and insists on having a content-length header field in the request + /// + ClientErrorLengthRequired = 411, + + /// + /// 412 Client error: one or more preconditions supplied in the client's request is false + /// + ClientErrorPreconditionFailed = 412, + + /// + /// 413 Client error: For fear of reflux, the server refuses to swallow that much data. + /// + ClientErrorRequestEntityToLarge = 413, + + /// + /// 414 Client error: The server considers the Request-URI to be indecently long and refuses to even look at it. + /// + ClientErrorRequestURITooLong = 414, + + /// + /// 415 Client error: The server has no clue about the media type requested by the client (contrary to popular belief it is not a warez server) + /// + ClientErrorUnsupportedMediaType = 415, + + /// + /// 416 Client error: The requested range cannot be delivered by the server. + /// ClientErrorRequestRangeNotSatisfiable = 416, - // 417 Client error: The expectations of the client as - // expressed in one or more Expect header fields cannot be met - // by the server, the server is awfully sorry about this. - ClientErrorExpectationFailed = 417, - // 499 Client error: Wildcard error. - ClientErrorJoker = 499, - // 5xx Server errors (rare) - // 500 Server error: something really strange and unexpected - // happened - ServerErrorInternalError = 500, - // 501 Server error: The server does not do the functionality - // required to carry out the client request. not at - // all. certainly not before breakfast. but also not after - // breakfast. - ServerErrorNotImplemented = 501, - // 502 Server error: While acting as a proxy or a gateway, the - // server got ditched by the upstream server and as a - // consequence regretfully cannot fulfill the client's request - ServerErrorBadGateway = 502, - // 503 Server error: Due to unforseen circumstances the server - // cannot currently deliver the service requested. Retry-After - // header might indicate when to try again. - ServerErrorServiceUnavailable = 503, - // 504 Server error: The server blames the upstream server - // for not being able to deliver the service requested and - // claims that the upstream server is too slow delivering the - // goods. - ServerErrorGatewayTimeout = 504, - // 505 Server error: The server does not support the HTTP - // version conveyed in the client's request. - ServerErrorHttpVersionNotSupported = 505, + /// + /// 417 Client error: The expectations of the client as expressed in one or more Expect header fields cannot be met by the server, the server is awfully sorry about this. + /// + ClientErrorExpectationFailed = 417, + + /// + /// 499 Client error: Wildcard error. + /// + ClientErrorJoker = 499, + + #endregion + + #region 5xx Server errors (rare) + + /// + /// 500 Server error: something really strange and unexpected happened + /// + ServerErrorInternalError = 500, + + /// + /// 501 Server error: The server does not do the functionality required to carry out the client request. not at all. certainly not before breakfast. but also not after breakfast. + /// + ServerErrorNotImplemented = 501, + + /// + /// 502 Server error: While acting as a proxy or a gateway, the server got ditched by the upstream server and as a consequence regretfully cannot fulfill the client's request + /// + ServerErrorBadGateway = 502, + + /// + /// 503 Server error: Due to unforseen circumstances the server cannot currently deliver the service requested. Retry-After header might indicate when to try again. + /// + ServerErrorServiceUnavailable = 503, + + /// + /// 504 Server error: The server blames the upstream server for not being able to deliver the service requested and claims that the upstream server is too slow delivering the goods. + /// + ServerErrorGatewayTimeout = 504, + + /// + /// 505 Server error: The server does not support the HTTP version conveyed in the client's request. + /// + ServerErrorHttpVersionNotSupported = 505, + + #endregion } } From 99cebec4ab819e93a2162be3fa4556ac5153ec8a Mon Sep 17 00:00:00 2001 From: SignpostMarv Date: Thu, 24 May 2012 16:01:46 +0100 Subject: [PATCH 267/547] adding status codes from rfc 6585 Signed-off-by: BlueWall --- .../Servers/HttpServer/OSHttpStatusCodes.cs | 24 +++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/OpenSim/Framework/Servers/HttpServer/OSHttpStatusCodes.cs b/OpenSim/Framework/Servers/HttpServer/OSHttpStatusCodes.cs index 3fc08321b7..a736c8b753 100644 --- a/OpenSim/Framework/Servers/HttpServer/OSHttpStatusCodes.cs +++ b/OpenSim/Framework/Servers/HttpServer/OSHttpStatusCodes.cs @@ -28,9 +28,9 @@ namespace OpenSim.Framework.Servers.HttpServer { /// - /// HTTP status codes (almost) as defined by W3C in http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html + /// HTTP status codes (almost) as defined by W3C in http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html and IETF in http://tools.ietf.org/html/rfc6585 /// - public enum OSHttpStatusCode: int + public enum OSHttpStatusCode : int { #region 1xx Informational status codes providing a provisional response. @@ -215,6 +215,21 @@ namespace OpenSim.Framework.Servers.HttpServer /// ClientErrorExpectationFailed = 417, + /// + /// 428 Client error :The 428 status code indicates that the origin server requires the request to be conditional. + /// + ClientErrorPreconditionRequired = 428, + + /// + /// 429 Client error: The 429 status code indicates that the user has sent too many requests in a given amount of time ("rate limiting"). + /// + ClientErrorTooManyRequests = 429, + + /// + /// 431 Client error: The 431 status code indicates that the server is unwilling to process the request because its header fields are too large. The request MAY be resubmitted after reducing the size of the request header fields. + /// + ClientErrorRequestHeaderFieldsTooLarge = 431, + /// /// 499 Client error: Wildcard error. /// @@ -254,6 +269,11 @@ namespace OpenSim.Framework.Servers.HttpServer /// ServerErrorHttpVersionNotSupported = 505, + /// + /// 511 Server error: The 511 status code indicates that the client needs to authenticate to gain network access. + /// + ServerErrorNetworkAuthenticationRequired = 511, + #endregion } } From 5c9086ade688b457e9aa9cd0d2099985b7336b71 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 24 May 2012 22:26:02 +0100 Subject: [PATCH 268/547] Fix issue where a dns resolution failure on the final destination might leave the user unable to teleport since the transit flag was not being reset. This moves the 'already in transit' check further up and resets the flag if dns resolution fails and in the new required places. --- .../EntityTransfer/EntityTransferModule.cs | 454 +++++++++--------- 1 file changed, 231 insertions(+), 223 deletions(-) diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs index 408d63da10..4988e93269 100644 --- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs +++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs @@ -358,6 +358,30 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer ScenePresence sp, GridRegion reg, GridRegion finalDestination, Vector3 position, Vector3 lookAt, uint teleportFlags) { + // Record that this agent is in transit so that we can prevent simultaneous requests and do later detection + // of whether the destination region completes the teleport. + if (!SetInTransit(sp.UUID)) + { + m_log.DebugFormat( + "[ENTITY TRANSFER MODULE]: Ignoring teleport request of {0} {1} to {2} ({3}) {4}/{5} - agent is already in transit.", + sp.Name, sp.UUID, reg.ServerURI, finalDestination.ServerURI, finalDestination.RegionName, position); + + return; + } + + if (reg == null || finalDestination == null) + { + sp.ControllingClient.SendTeleportFailed("Unable to locate destination"); + ResetFromTransit(sp.UUID); + + return; + } + + m_log.DebugFormat( + "[ENTITY TRANSFER MODULE]: Teleporting {0} {1} from {2} to {3} ({4}) {5}/{6}", + sp.Name, sp.UUID, sp.Scene.RegionInfo.RegionName, + reg.ServerURI, finalDestination.ServerURI, finalDestination.RegionName, position); + RegionInfo sourceRegion = sp.Scene.RegionInfo; if (!IsWithinMaxTeleportDistance(sourceRegion, finalDestination)) @@ -369,31 +393,13 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer sourceRegion.RegionName, sourceRegion.RegionLocX, sourceRegion.RegionLocY, MaxTransferDistance)); + ResetFromTransit(sp.UUID); + return; } IEventQueue eq = sp.Scene.RequestModuleInterface(); - if (reg == null || finalDestination == null) - { - sp.ControllingClient.SendTeleportFailed("Unable to locate destination"); - return; - } - - if (!SetInTransit(sp.UUID)) // Avie is already on the way. Caller shouldn't do this. - { - m_log.DebugFormat( - "[ENTITY TRANSFER MODULE]: Ignoring teleport request of {0} {1} to {2} ({3}) {4}/{5} - agent is already in transit.", - sp.Name, sp.UUID, reg.ServerURI, finalDestination.ServerURI, finalDestination.RegionName, position); - - return; - } - - m_log.DebugFormat( - "[ENTITY TRANSFER MODULE]: Teleporting {0} {1} from {2} to {3} ({4}) {5}/{6}", - sp.Name, sp.UUID, sp.Scene.RegionInfo.RegionName, - reg.ServerURI, finalDestination.ServerURI, finalDestination.RegionName, position); - uint newRegionX = (uint)(reg.RegionHandle >> 40); uint newRegionY = (((uint)(reg.RegionHandle)) >> 8); uint oldRegionX = (uint)(sp.Scene.RegionInfo.RegionHandle >> 40); @@ -405,17 +411,24 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer // This may be a costly operation. The reg.ExternalEndPoint field is not a passive field, // it's actually doing a lot of work. IPEndPoint endPoint = finalDestination.ExternalEndPoint; - if (endPoint.Address != null) - { - // Fixing a bug where teleporting while sitting results in the avatar ending up removed from - // both regions - if (sp.ParentID != (uint)0) - sp.StandUp(); - if (!sp.ValidateAttachments()) - m_log.DebugFormat( - "[ENTITY TRANSFER MODULE]: Failed validation of all attachments for teleport of {0} from {1} to {2}. Continuing.", - sp.Name, sp.Scene.RegionInfo.RegionName, finalDestination.RegionName); + if (endPoint.Address == null) + { + sp.ControllingClient.SendTeleportFailed("Remote Region appears to be down"); + ResetFromTransit(sp.UUID); + + return; + } + + // Fixing a bug where teleporting while sitting results in the avatar ending up removed from + // both regions + if (sp.ParentID != (uint)0) + sp.StandUp(); + + if (!sp.ValidateAttachments()) + m_log.DebugFormat( + "[ENTITY TRANSFER MODULE]: Failed validation of all attachments for teleport of {0} from {1} to {2}. Continuing.", + sp.Name, sp.Scene.RegionInfo.RegionName, finalDestination.RegionName); // if (!sp.ValidateAttachments()) // { @@ -423,211 +436,206 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer // return; // } - string reason; - string version; - if (!m_scene.SimulationService.QueryAccess( - finalDestination, sp.ControllingClient.AgentId, Vector3.Zero, out version, out reason)) - { - sp.ControllingClient.SendTeleportFailed(reason); - ResetFromTransit(sp.UUID); - - m_log.DebugFormat( - "[ENTITY TRANSFER MODULE]: {0} was stopped from teleporting from {1} to {2} because {3}", - sp.Name, sp.Scene.RegionInfo.RegionName, finalDestination.RegionName, reason); - - return; - } - - m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Destination is running version {0}", version); - - sp.ControllingClient.SendTeleportStart(teleportFlags); - - // the avatar.Close below will clear the child region list. We need this below for (possibly) - // closing the child agents, so save it here (we need a copy as it is Clear()-ed). - //List childRegions = avatar.KnownRegionHandles; - // Compared to ScenePresence.CrossToNewRegion(), there's no obvious code to handle a teleport - // failure at this point (unlike a border crossing failure). So perhaps this can never fail - // once we reach here... - //avatar.Scene.RemoveCapsHandler(avatar.UUID); - - string capsPath = String.Empty; - - AgentCircuitData currentAgentCircuit = sp.Scene.AuthenticateHandler.GetAgentCircuitData(sp.ControllingClient.CircuitCode); - AgentCircuitData agentCircuit = sp.ControllingClient.RequestClientInfo(); - agentCircuit.startpos = position; - agentCircuit.child = true; - agentCircuit.Appearance = sp.Appearance; - if (currentAgentCircuit != null) - { - agentCircuit.ServiceURLs = currentAgentCircuit.ServiceURLs; - agentCircuit.IPAddress = currentAgentCircuit.IPAddress; - agentCircuit.Viewer = currentAgentCircuit.Viewer; - agentCircuit.Channel = currentAgentCircuit.Channel; - agentCircuit.Mac = currentAgentCircuit.Mac; - agentCircuit.Id0 = currentAgentCircuit.Id0; - } - - if (NeedsNewAgent(sp.DrawDistance, oldRegionX, newRegionX, oldRegionY, newRegionY)) - { - // brand new agent, let's create a new caps seed - agentCircuit.CapsPath = CapsUtil.GetRandomCapsObjectPath(); - } - - // Let's create an agent there if one doesn't exist yet. - bool logout = false; - if (!CreateAgent(sp, reg, finalDestination, agentCircuit, teleportFlags, out reason, out logout)) - { - sp.ControllingClient.SendTeleportFailed(String.Format("Teleport refused: {0}", reason)); - ResetFromTransit(sp.UUID); - - m_log.DebugFormat( - "[ENTITY TRANSFER MODULE]: Teleport of {0} from {1} to {2} was refused because {3}", - sp.Name, sp.Scene.RegionInfo.RegionName, finalDestination.RegionName, reason); - - return; - } - - // OK, it got this agent. Let's close some child agents - sp.CloseChildAgents(newRegionX, newRegionY); - - IClientIPEndpoint ipepClient; - if (NeedsNewAgent(sp.DrawDistance, oldRegionX, newRegionX, oldRegionY, newRegionY)) - { - //sp.ControllingClient.SendTeleportProgress(teleportFlags, "Creating agent..."); - #region IP Translation for NAT - // Uses ipepClient above - if (sp.ClientView.TryGet(out ipepClient)) - { - endPoint.Address = NetworkUtil.GetIPFor(ipepClient.EndPoint, endPoint.Address); - } - #endregion - capsPath = finalDestination.ServerURI + CapsUtil.GetCapsSeedPath(agentCircuit.CapsPath); - - if (eq != null) - { - eq.EnableSimulator(destinationHandle, endPoint, sp.UUID); - - // ES makes the client send a UseCircuitCode message to the destination, - // which triggers a bunch of things there. - // So let's wait - Thread.Sleep(200); - - eq.EstablishAgentCommunication(sp.UUID, endPoint, capsPath); - - } - else - { - sp.ControllingClient.InformClientOfNeighbour(destinationHandle, endPoint); - } - } - else - { - agentCircuit.CapsPath = sp.Scene.CapsModule.GetChildSeed(sp.UUID, reg.RegionHandle); - capsPath = finalDestination.ServerURI + CapsUtil.GetCapsSeedPath(agentCircuit.CapsPath); - } - - // Let's send a full update of the agent. This is a synchronous call. - AgentData agent = new AgentData(); - sp.CopyTo(agent); - agent.Position = position; - SetCallbackURL(agent, sp.Scene.RegionInfo); - - //sp.ControllingClient.SendTeleportProgress(teleportFlags, "Updating agent..."); - - if (!UpdateAgent(reg, finalDestination, agent)) - { - // Region doesn't take it - m_log.WarnFormat( - "[ENTITY TRANSFER MODULE]: UpdateAgent failed on teleport of {0} to {1} from {2}. Returning avatar to source region.", - sp.Name, finalDestination.RegionName, sp.Scene.RegionInfo.RegionName); - - Fail(sp, finalDestination, logout); - return; - } - - sp.ControllingClient.SendTeleportProgress(teleportFlags | (uint)TeleportFlags.DisableCancel, "sending_dest"); + string reason; + string version; + if (!m_scene.SimulationService.QueryAccess( + finalDestination, sp.ControllingClient.AgentId, Vector3.Zero, out version, out reason)) + { + sp.ControllingClient.SendTeleportFailed(reason); + ResetFromTransit(sp.UUID); m_log.DebugFormat( - "[ENTITY TRANSFER MODULE]: Sending new CAPS seed url {0} from {1} to {2}", - capsPath, sp.Scene.RegionInfo.RegionName, sp.Name); + "[ENTITY TRANSFER MODULE]: {0} was stopped from teleporting from {1} to {2} because {3}", + sp.Name, sp.Scene.RegionInfo.RegionName, finalDestination.RegionName, reason); + + return; + } + + m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Destination is running version {0}", version); + + sp.ControllingClient.SendTeleportStart(teleportFlags); + + // the avatar.Close below will clear the child region list. We need this below for (possibly) + // closing the child agents, so save it here (we need a copy as it is Clear()-ed). + //List childRegions = avatar.KnownRegionHandles; + // Compared to ScenePresence.CrossToNewRegion(), there's no obvious code to handle a teleport + // failure at this point (unlike a border crossing failure). So perhaps this can never fail + // once we reach here... + //avatar.Scene.RemoveCapsHandler(avatar.UUID); + + string capsPath = String.Empty; + + AgentCircuitData currentAgentCircuit = sp.Scene.AuthenticateHandler.GetAgentCircuitData(sp.ControllingClient.CircuitCode); + AgentCircuitData agentCircuit = sp.ControllingClient.RequestClientInfo(); + agentCircuit.startpos = position; + agentCircuit.child = true; + agentCircuit.Appearance = sp.Appearance; + if (currentAgentCircuit != null) + { + agentCircuit.ServiceURLs = currentAgentCircuit.ServiceURLs; + agentCircuit.IPAddress = currentAgentCircuit.IPAddress; + agentCircuit.Viewer = currentAgentCircuit.Viewer; + agentCircuit.Channel = currentAgentCircuit.Channel; + agentCircuit.Mac = currentAgentCircuit.Mac; + agentCircuit.Id0 = currentAgentCircuit.Id0; + } + + if (NeedsNewAgent(sp.DrawDistance, oldRegionX, newRegionX, oldRegionY, newRegionY)) + { + // brand new agent, let's create a new caps seed + agentCircuit.CapsPath = CapsUtil.GetRandomCapsObjectPath(); + } + + // Let's create an agent there if one doesn't exist yet. + bool logout = false; + if (!CreateAgent(sp, reg, finalDestination, agentCircuit, teleportFlags, out reason, out logout)) + { + sp.ControllingClient.SendTeleportFailed(String.Format("Teleport refused: {0}", reason)); + ResetFromTransit(sp.UUID); + + m_log.DebugFormat( + "[ENTITY TRANSFER MODULE]: Teleport of {0} from {1} to {2} was refused because {3}", + sp.Name, sp.Scene.RegionInfo.RegionName, finalDestination.RegionName, reason); + + return; + } + + // OK, it got this agent. Let's close some child agents + sp.CloseChildAgents(newRegionX, newRegionY); + + IClientIPEndpoint ipepClient; + if (NeedsNewAgent(sp.DrawDistance, oldRegionX, newRegionX, oldRegionY, newRegionY)) + { + //sp.ControllingClient.SendTeleportProgress(teleportFlags, "Creating agent..."); + #region IP Translation for NAT + // Uses ipepClient above + if (sp.ClientView.TryGet(out ipepClient)) + { + endPoint.Address = NetworkUtil.GetIPFor(ipepClient.EndPoint, endPoint.Address); + } + #endregion + capsPath = finalDestination.ServerURI + CapsUtil.GetCapsSeedPath(agentCircuit.CapsPath); if (eq != null) { - eq.TeleportFinishEvent(destinationHandle, 13, endPoint, - 0, teleportFlags, capsPath, sp.UUID); + eq.EnableSimulator(destinationHandle, endPoint, sp.UUID); + + // ES makes the client send a UseCircuitCode message to the destination, + // which triggers a bunch of things there. + // So let's wait + Thread.Sleep(200); + + eq.EstablishAgentCommunication(sp.UUID, endPoint, capsPath); + } else { - sp.ControllingClient.SendRegionTeleport(destinationHandle, 13, endPoint, 4, - teleportFlags, capsPath); - } - - // Let's set this to true tentatively. This does not trigger OnChildAgent - sp.IsChildAgent = true; - - // TeleportFinish makes the client send CompleteMovementIntoRegion (at the destination), which - // trigers a whole shebang of things there, including MakeRoot. So let's wait for confirmation - // that the client contacted the destination before we close things here. - if (EnableWaitForCallbackFromTeleportDest && !WaitForCallback(sp.UUID)) - { - m_log.WarnFormat( - "[ENTITY TRANSFER MODULE]: Teleport of {0} to {1} from {2} failed due to no callback from destination region. Returning avatar to source region.", - sp.Name, finalDestination.RegionName, sp.Scene.RegionInfo.RegionName); - - Fail(sp, finalDestination, logout); - return; - } - - // For backwards compatibility - if (version == "Unknown" || version == string.Empty) - { - // CrossAttachmentsIntoNewRegion is a synchronous call. We shouldn't need to wait after it - m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Old simulator, sending attachments one by one..."); - CrossAttachmentsIntoNewRegion(finalDestination, sp, true); - } - - // May need to logout or other cleanup - AgentHasMovedAway(sp, logout); - - // Well, this is it. The agent is over there. - KillEntity(sp.Scene, sp.LocalId); - - // Now let's make it officially a child agent - sp.MakeChildAgent(); - -// sp.Scene.CleanDroppedAttachments(); - - // Finally, let's close this previously-known-as-root agent, when the jump is outside the view zone - - if (NeedsClosing(sp.DrawDistance, oldRegionX, newRegionX, oldRegionY, newRegionY, reg)) - { - // We need to delay here because Imprudence viewers, unlike v1 or v3, have a short (<200ms, <500ms) delay before - // they regard the new region as the current region after receiving the AgentMovementComplete - // response. If close is sent before then, it will cause the viewer to quit instead. - // However, if this delay is longer, then a viewer can teleport back to this region and experience - // a failure because the old ScenePresence has not yet been cleaned up. - Thread.Sleep(2000); - - sp.Close(); - sp.Scene.IncomingCloseAgent(sp.UUID); - } - else - { - // now we have a child agent in this region. - sp.Reset(); - } - - // REFACTORING PROBLEM. Well, not a problem, but this method is HORRIBLE! - if (sp.Scene.NeedSceneCacheClear(sp.UUID)) - { - m_log.DebugFormat( - "[ENTITY TRANSFER MODULE]: User {0} is going to another region, profile cache removed", - sp.UUID); + sp.ControllingClient.InformClientOfNeighbour(destinationHandle, endPoint); } } else { - sp.ControllingClient.SendTeleportFailed("Remote Region appears to be down"); + agentCircuit.CapsPath = sp.Scene.CapsModule.GetChildSeed(sp.UUID, reg.RegionHandle); + capsPath = finalDestination.ServerURI + CapsUtil.GetCapsSeedPath(agentCircuit.CapsPath); + } + + // Let's send a full update of the agent. This is a synchronous call. + AgentData agent = new AgentData(); + sp.CopyTo(agent); + agent.Position = position; + SetCallbackURL(agent, sp.Scene.RegionInfo); + + //sp.ControllingClient.SendTeleportProgress(teleportFlags, "Updating agent..."); + + if (!UpdateAgent(reg, finalDestination, agent)) + { + // Region doesn't take it + m_log.WarnFormat( + "[ENTITY TRANSFER MODULE]: UpdateAgent failed on teleport of {0} to {1} from {2}. Returning avatar to source region.", + sp.Name, finalDestination.RegionName, sp.Scene.RegionInfo.RegionName); + + Fail(sp, finalDestination, logout); + return; + } + + sp.ControllingClient.SendTeleportProgress(teleportFlags | (uint)TeleportFlags.DisableCancel, "sending_dest"); + + m_log.DebugFormat( + "[ENTITY TRANSFER MODULE]: Sending new CAPS seed url {0} from {1} to {2}", + capsPath, sp.Scene.RegionInfo.RegionName, sp.Name); + + if (eq != null) + { + eq.TeleportFinishEvent(destinationHandle, 13, endPoint, + 0, teleportFlags, capsPath, sp.UUID); + } + else + { + sp.ControllingClient.SendRegionTeleport(destinationHandle, 13, endPoint, 4, + teleportFlags, capsPath); + } + + // Let's set this to true tentatively. This does not trigger OnChildAgent + sp.IsChildAgent = true; + + // TeleportFinish makes the client send CompleteMovementIntoRegion (at the destination), which + // trigers a whole shebang of things there, including MakeRoot. So let's wait for confirmation + // that the client contacted the destination before we close things here. + if (EnableWaitForCallbackFromTeleportDest && !WaitForCallback(sp.UUID)) + { + m_log.WarnFormat( + "[ENTITY TRANSFER MODULE]: Teleport of {0} to {1} from {2} failed due to no callback from destination region. Returning avatar to source region.", + sp.Name, finalDestination.RegionName, sp.Scene.RegionInfo.RegionName); + + Fail(sp, finalDestination, logout); + return; + } + + // For backwards compatibility + if (version == "Unknown" || version == string.Empty) + { + // CrossAttachmentsIntoNewRegion is a synchronous call. We shouldn't need to wait after it + m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Old simulator, sending attachments one by one..."); + CrossAttachmentsIntoNewRegion(finalDestination, sp, true); + } + + // May need to logout or other cleanup + AgentHasMovedAway(sp, logout); + + // Well, this is it. The agent is over there. + KillEntity(sp.Scene, sp.LocalId); + + // Now let's make it officially a child agent + sp.MakeChildAgent(); + +// sp.Scene.CleanDroppedAttachments(); + + // Finally, let's close this previously-known-as-root agent, when the jump is outside the view zone + + if (NeedsClosing(sp.DrawDistance, oldRegionX, newRegionX, oldRegionY, newRegionY, reg)) + { + // We need to delay here because Imprudence viewers, unlike v1 or v3, have a short (<200ms, <500ms) delay before + // they regard the new region as the current region after receiving the AgentMovementComplete + // response. If close is sent before then, it will cause the viewer to quit instead. + // However, if this delay is longer, then a viewer can teleport back to this region and experience + // a failure because the old ScenePresence has not yet been cleaned up. + Thread.Sleep(2000); + + sp.Close(); + sp.Scene.IncomingCloseAgent(sp.UUID); + } + else + { + // now we have a child agent in this region. + sp.Reset(); + } + + // REFACTORING PROBLEM. Well, not a problem, but this method is HORRIBLE! + if (sp.Scene.NeedSceneCacheClear(sp.UUID)) + { + m_log.DebugFormat( + "[ENTITY TRANSFER MODULE]: User {0} is going to another region, profile cache removed", + sp.UUID); } } From cd225215b1284b4a50e5ebb928c1aecc3f005e05 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 24 May 2012 22:40:24 +0100 Subject: [PATCH 269/547] Now that the EntityTransferModule is per-region, fetch the event queue module once rather than repeatedly via scene presences --- .../EntityTransfer/EntityTransferModule.cs | 40 ++++++++++--------- 1 file changed, 22 insertions(+), 18 deletions(-) diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs index 4988e93269..361e4535ce 100644 --- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs +++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs @@ -73,6 +73,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer private ExpiringCache> m_bannedRegions = new ExpiringCache>(); + private IEventQueue m_eqModule; + #region ISharedRegionModule public Type ReplaceableInterface @@ -147,7 +149,13 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer public virtual void RemoveRegion(Scene scene) {} - public virtual void RegionLoaded(Scene scene) {} + public virtual void RegionLoaded(Scene scene) + { + if (!m_Enabled) + return; + + m_eqModule = m_scene.RequestModuleInterface(); + } #endregion @@ -398,8 +406,6 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer return; } - IEventQueue eq = sp.Scene.RequestModuleInterface(); - uint newRegionX = (uint)(reg.RegionHandle >> 40); uint newRegionY = (((uint)(reg.RegionHandle)) >> 8); uint oldRegionX = (uint)(sp.Scene.RegionInfo.RegionHandle >> 40); @@ -416,7 +422,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer { sp.ControllingClient.SendTeleportFailed("Remote Region appears to be down"); ResetFromTransit(sp.UUID); - + return; } @@ -516,16 +522,16 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer #endregion capsPath = finalDestination.ServerURI + CapsUtil.GetCapsSeedPath(agentCircuit.CapsPath); - if (eq != null) + if (m_eqModule != null) { - eq.EnableSimulator(destinationHandle, endPoint, sp.UUID); + m_eqModule.EnableSimulator(destinationHandle, endPoint, sp.UUID); // ES makes the client send a UseCircuitCode message to the destination, // which triggers a bunch of things there. // So let's wait Thread.Sleep(200); - eq.EstablishAgentCommunication(sp.UUID, endPoint, capsPath); + m_eqModule.EstablishAgentCommunication(sp.UUID, endPoint, capsPath); } else @@ -564,10 +570,9 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer "[ENTITY TRANSFER MODULE]: Sending new CAPS seed url {0} from {1} to {2}", capsPath, sp.Scene.RegionInfo.RegionName, sp.Name); - if (eq != null) + if (m_eqModule != null) { - eq.TeleportFinishEvent(destinationHandle, 13, endPoint, - 0, teleportFlags, capsPath, sp.UUID); + m_eqModule.TeleportFinishEvent(destinationHandle, 13, endPoint, 0, teleportFlags, capsPath, sp.UUID); } else { @@ -1122,11 +1127,11 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Sending new CAPS seed url {0} to client {1}", capsPath, agent.UUID); - IEventQueue eq = agent.Scene.RequestModuleInterface(); - if (eq != null) + if (m_eqModule != null) { - eq.CrossRegion(neighbourHandle, pos, vel2 /* agent.Velocity */, neighbourRegion.ExternalEndPoint, - capsPath, agent.UUID, agent.ControllingClient.SessionId); + m_eqModule.CrossRegion( + neighbourHandle, pos, vel2 /* agent.Velocity */, neighbourRegion.ExternalEndPoint, + capsPath, agent.UUID, agent.ControllingClient.SessionId); } else { @@ -1474,8 +1479,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer if (regionAccepted && newAgent) { - IEventQueue eq = sp.Scene.RequestModuleInterface(); - if (eq != null) + if (m_eqModule != null) { #region IP Translation for NAT IClientIPEndpoint ipepClient; @@ -1489,8 +1493,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer "and EstablishAgentCommunication with seed cap {4}", scene.RegionInfo.RegionName, sp.Name, reg.RegionName, reg.RegionHandle, capsPath); - eq.EnableSimulator(reg.RegionHandle, endPoint, sp.UUID); - eq.EstablishAgentCommunication(sp.UUID, endPoint, capsPath); + m_eqModule.EnableSimulator(reg.RegionHandle, endPoint, sp.UUID); + m_eqModule.EstablishAgentCommunication(sp.UUID, endPoint, capsPath); } else { From cc53d91d2f53adf952703f7fb91a7ab33c7a5d8a Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 24 May 2012 22:46:45 +0100 Subject: [PATCH 270/547] On inter-region teleport, only stand the avatar up if the QueryAccess call to the destination scene actually succeeds. --- .../EntityTransfer/EntityTransferModule.cs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs index 361e4535ce..5afe553545 100644 --- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs +++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs @@ -153,7 +153,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer { if (!m_Enabled) return; - + m_eqModule = m_scene.RequestModuleInterface(); } @@ -426,11 +426,6 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer return; } - // Fixing a bug where teleporting while sitting results in the avatar ending up removed from - // both regions - if (sp.ParentID != (uint)0) - sp.StandUp(); - if (!sp.ValidateAttachments()) m_log.DebugFormat( "[ENTITY TRANSFER MODULE]: Failed validation of all attachments for teleport of {0} from {1} to {2}. Continuing.", @@ -457,7 +452,12 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer return; } - m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Destination is running version {0}", version); + m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Destination is running version {0}", version); + + // Fixing a bug where teleporting while sitting results in the avatar ending up removed from + // both regions + if (sp.ParentID != (uint)0) + sp.StandUp(); sp.ControllingClient.SendTeleportStart(teleportFlags); From 93ff27053a2d46a934bb6a1780ccfecd505ab44f Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 24 May 2012 22:59:52 +0100 Subject: [PATCH 271/547] Don't actually proceed on a within-region teleport if another is already taking place, rather than just (falsely) logging that we're not going to proceed. An oversight from recent commit 9ab0c81 --- .../Framework/EntityTransfer/EntityTransferModule.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs index 5afe553545..b5717cdccd 100644 --- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs +++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs @@ -227,6 +227,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer m_log.DebugFormat( "[ENTITY TRANSFER MODULE]: Ignoring within region teleport request of {0} {1} to {2} - agent is already in transit.", sp.Name, sp.UUID, position); + + return; } // Teleport within the same region From 7cceab12956dcb8ebeff129375888541831f7976 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 25 May 2012 01:41:00 +0100 Subject: [PATCH 272/547] In remote QueryAccess, also receive the actual status (true|false) instead of always true no matter what the callee actually returned. This was due to two things 1) SimulationServiceConnector.QueryAccess was always looking to the outer result["success"]. But if a "_Result" map is returned (which is certainly the case right now), then the true success is _Result["success"], result["success"] is always true no matter what 2) If QueryAccess was false at the destination, then AgentHandlers.DoQueryAccess() was never putting this in the result. The default action of SerializeJsonString() is not to put false booleans in the JSON!!!, so this has to be explicitly set. --- OpenSim/Server/Handlers/Simulation/AgentHandlers.cs | 7 +++++-- .../Connectors/Simulation/SimulationServiceConnector.cs | 4 ++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/OpenSim/Server/Handlers/Simulation/AgentHandlers.cs b/OpenSim/Server/Handlers/Simulation/AgentHandlers.cs index 99ae7f0405..012b14e575 100644 --- a/OpenSim/Server/Handlers/Simulation/AgentHandlers.cs +++ b/OpenSim/Server/Handlers/Simulation/AgentHandlers.cs @@ -144,13 +144,16 @@ namespace OpenSim.Server.Handlers.Simulation responsedata["int_response_code"] = HttpStatusCode.OK; - OSDMap resp = new OSDMap(2); + OSDMap resp = new OSDMap(3); resp["success"] = OSD.FromBoolean(result); resp["reason"] = OSD.FromString(reason); resp["version"] = OSD.FromString(version); - responsedata["str_response_string"] = OSDParser.SerializeJsonString(resp); + // We must preserve defaults here, otherwise a false "success" will not be put into the JSON map! + responsedata["str_response_string"] = OSDParser.SerializeJsonString(resp, true); + +// Console.WriteLine("str_response_string [{0}]", responsedata["str_response_string"]); } protected virtual void DoAgentGet(Hashtable request, Hashtable responsedata, UUID id, UUID regionID) diff --git a/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs b/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs index cc46ba88c1..032beb532c 100644 --- a/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs +++ b/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs @@ -320,6 +320,10 @@ namespace OpenSim.Services.Connectors.Simulation { OSDMap data = (OSDMap)result["_Result"]; + // FIXME: If there is a _Result map then it's the success key here that indicates the true success + // or failure, not the sibling result node. + success = data["success"]; + reason = data["reason"].AsString(); if (data["version"] != null && data["version"].AsString() != string.Empty) version = data["version"].AsString(); From 40c78b06246d1131e07982dc6a9366666d9ea031 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 25 May 2012 02:02:53 +0100 Subject: [PATCH 273/547] Stop it being possible for an agent to teleport back to its source region before the source region has finished cleaning up old agent data and structures. If this is allowed, then the client usually gets forcibly logged out and data structures might be put into bad states. To prevent this, the binary state machine of EMT.m_agentsInTransit is replaced with a 4 state machine (Preparing, Transferring, ReceivedAtDestination, CleaningUp). This is necessary because the source region needs to know when the destination region has received the user but a teleport back cannot happen until the source region has cleaned up. Tested on standalone, grid and with v1 and v3 clients. --- .../EntityTransfer/EntityTransferModule.cs | 201 +++++++++++++++--- .../Interfaces/IEntityTransferModule.cs | 2 +- OpenSim/Region/Framework/Scenes/Scene.cs | 6 +- 3 files changed, 175 insertions(+), 34 deletions(-) diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs index b5717cdccd..ddb621d81d 100644 --- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs +++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs @@ -46,6 +46,29 @@ using Nini.Config; namespace OpenSim.Region.CoreModules.Framework.EntityTransfer { + /// + /// The possible states that an agent can be in when its being transferred between regions. + /// + /// + /// This is a state machine. + /// + /// [Entry] => Preparing + /// Preparing => { Transferring || CleaningUp || [Exit] } + /// Transferring => { ReceivedAtDestination || CleaningUp } + /// ReceivedAtDestination => CleaningUp + /// CleaningUp => [Exit] + /// + /// In other words, agents normally travel throwing Preparing => Transferring => ReceivedAtDestination => CleaningUp + /// However, any state can transition to CleaningUp if the teleport has failed. + /// + enum AgentTransferState + { + Preparing, // The agent is being prepared for transfer + Transferring, // The agent is in the process of being transferred to a destination + ReceivedAtDestination, // The destination has notified us that the agent has been successfully received + CleaningUp // The agent is being changed to child/removed after a transfer + } + public class EntityTransferModule : INonSharedRegionModule, IEntityTransferModule { private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); @@ -68,7 +91,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer protected Scene m_scene; - protected List m_agentsInTransit; + private Dictionary m_agentsInTransit; private ExpiringCache> m_bannedRegions = new ExpiringCache>(); @@ -120,7 +143,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer MaxTransferDistance = DefaultMaxTransferDistance; } - m_agentsInTransit = new List(); + m_agentsInTransit = new Dictionary(); m_Enabled = true; } @@ -259,17 +282,22 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer position.Z = newPosZ; } + UpdateInTransit(sp.UUID, AgentTransferState.Transferring); + sp.ControllingClient.SendTeleportStart(teleportFlags); sp.ControllingClient.SendLocalTeleport(position, lookAt, teleportFlags); sp.Velocity = Vector3.Zero; sp.Teleport(position); + UpdateInTransit(sp.UUID, AgentTransferState.ReceivedAtDestination); + foreach (SceneObjectGroup grp in sp.GetAttachments()) { sp.Scene.EventManager.TriggerOnScriptChangedEvent(grp.LocalId, (uint)Changed.TELEPORT); } + UpdateInTransit(sp.UUID, AgentTransferState.CleaningUp); ResetFromTransit(sp.UUID); } @@ -454,7 +482,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer return; } - m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Destination is running version {0}", version); + m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Destination is running version {0}", version); // Fixing a bug where teleporting while sitting results in the avatar ending up removed from // both regions @@ -508,6 +536,9 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer return; } + // Past this point we have to attempt clean up if the teleport fails, so update transfer state. + UpdateInTransit(sp.UUID, AgentTransferState.Transferring); + // OK, it got this agent. Let's close some child agents sp.CloseChildAgents(newRegionX, newRegionY); @@ -598,6 +629,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer return; } + UpdateInTransit(sp.UUID, AgentTransferState.CleaningUp); + // For backwards compatibility if (version == "Unknown" || version == string.Empty) { @@ -624,8 +657,9 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer // We need to delay here because Imprudence viewers, unlike v1 or v3, have a short (<200ms, <500ms) delay before // they regard the new region as the current region after receiving the AgentMovementComplete // response. If close is sent before then, it will cause the viewer to quit instead. - // However, if this delay is longer, then a viewer can teleport back to this region and experience - // a failure because the old ScenePresence has not yet been cleaned up. + // + // This sleep can be increased if necessary. However, whilst it's active, + // an agent cannot teleport back to this region if it has teleported away. Thread.Sleep(2000); sp.Close(); @@ -644,6 +678,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer "[ENTITY TRANSFER MODULE]: User {0} is going to another region, profile cache removed", sp.UUID); } + + ResetFromTransit(sp.UUID); } protected virtual void Fail(ScenePresence sp, GridRegion finalDestination, bool logout) @@ -1089,6 +1125,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer Vector3 vel2 = new Vector3(agent.Velocity.X, agent.Velocity.Y, 0); agent.RemoveFromPhysicalScene(); + SetInTransit(agent.UUID); AgentData cAgent = new AgentData(); @@ -1100,6 +1137,9 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer // We don't need the callback anymnore cAgent.CallbackURI = String.Empty; + // Beyond this point, extra cleanup is needed beyond removing transit state + UpdateInTransit(agent.UUID, AgentTransferState.Transferring); + if (!m_scene.SimulationService.UpdateAgent(neighbourRegion, cAgent)) { // region doesn't take it @@ -1141,8 +1181,16 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer capsPath); } - // SUCCESS! + // SUCCESS! + UpdateInTransit(agent.UUID, AgentTransferState.ReceivedAtDestination); + + // Unlike a teleport, here we do not wait for the destination region to confirm the receipt. + UpdateInTransit(agent.UUID, AgentTransferState.CleaningUp); + agent.MakeChildAgent(); + + // FIXME: Possibly this should occur lower down after other commands to close other agents, + // but not sure yet what the side effects would be. ResetFromTransit(agent.UUID); // now we have a child agent in this region. Request all interesting data about other (root) agents @@ -1622,7 +1670,37 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer #region Agent Arrived public void AgentArrivedAtDestination(UUID id) { - ResetFromTransit(id); + lock (m_agentsInTransit) + { + if (!m_agentsInTransit.ContainsKey(id)) + { + m_log.WarnFormat( + "[ENTITY TRANSFER MODULE]: Region {0} received notification of arrival in destination scene of agent {1} but no teleport request is active", + m_scene.RegionInfo.RegionName, id); + + return; + } + + AgentTransferState currentState = m_agentsInTransit[id]; + + if (currentState == AgentTransferState.ReceivedAtDestination) + { + // An anomoly but don't make this an outright failure - destination region could be overzealous in sending notification. + m_log.WarnFormat( + "[ENTITY TRANSFER MODULE]: Region {0} received notification of arrival in destination scene of agent {1} but notification has already previously been received", + m_scene.RegionInfo.RegionName, id); + } + else if (currentState != AgentTransferState.Transferring) + { + m_log.ErrorFormat( + "[ENTITY TRANSFER MODULE]: Region {0} received notification of arrival in destination scene of agent {1} but agent is in transfer state {2}", + m_scene.RegionInfo.RegionName, id, currentState); + + return; + } + + m_agentsInTransit[id] = AgentTransferState.ReceivedAtDestination; + } } #endregion @@ -1964,10 +2042,29 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer #region Misc - protected bool WaitForCallback(UUID id) + private bool WaitForCallback(UUID id) { + lock (m_agentsInTransit) + { + if (!IsInTransit(id)) + throw new Exception( + string.Format( + "Asked to wait for destination callback for agent with ID {0} but it is not in transit")); + + AgentTransferState currentState = m_agentsInTransit[id]; + + if (currentState != AgentTransferState.Transferring && currentState != AgentTransferState.ReceivedAtDestination) + throw new Exception( + string.Format( + "Asked to wait for destination callback for agent with ID {0} but it is in state {1}", + currentState)); + } + int count = 200; - while (m_agentsInTransit.Contains(id) && count-- > 0) + + // There should be no race condition here since no other code should be removing the agent transfer or + // changing the state to another other than Transferring => ReceivedAtDestination. + while (m_agentsInTransit[id] != AgentTransferState.ReceivedAtDestination && count-- > 0) { // m_log.Debug(" >>> Waiting... " + count); Thread.Sleep(100); @@ -1977,17 +2074,17 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer } /// - /// Set that an agent is in the process of being teleported. + /// Set that an agent is in transit. /// /// The ID of the agent being teleported /// true if the agent was not already in transit, false if it was - protected bool SetInTransit(UUID id) + private bool SetInTransit(UUID id) { lock (m_agentsInTransit) { - if (!m_agentsInTransit.Contains(id)) + if (!m_agentsInTransit.ContainsKey(id)) { - m_agentsInTransit.Add(id); + m_agentsInTransit[id] = AgentTransferState.Preparing; return true; } } @@ -1996,29 +2093,73 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer } /// - /// Show whether the given agent is being teleported. - /// - /// true if the agent is in the process of being teleported, false otherwise. - /// The agent ID - public bool IsInTransit(UUID id) - { - lock (m_agentsInTransit) - return m_agentsInTransit.Contains(id); - } - - /// - /// Set that an agent is no longer being teleported. + /// Updates the state of an agent that is already in transit. /// + /// + /// /// - /// - /// true if the agent was flagged as being teleported when this method was called, false otherwise - /// - protected bool ResetFromTransit(UUID id) + /// Illegal transitions will throw an Exception + private void UpdateInTransit(UUID id, AgentTransferState newState) { lock (m_agentsInTransit) { - if (m_agentsInTransit.Contains(id)) + // Illegal to try and update an agent that's not actually in transit. + if (!m_agentsInTransit.ContainsKey(id)) + throw new Exception(string.Format("Agent with ID {0} is not registered as in transit", id)); + + AgentTransferState oldState = m_agentsInTransit[id]; + + bool transitionOkay = false; + + if (newState == AgentTransferState.CleaningUp && oldState != AgentTransferState.CleaningUp) + transitionOkay = true; + else if (newState == AgentTransferState.Transferring && oldState == AgentTransferState.Preparing) + transitionOkay = true; + else if (newState == AgentTransferState.ReceivedAtDestination && oldState == AgentTransferState.Transferring) + transitionOkay = true; + + if (transitionOkay) + m_agentsInTransit[id] = newState; + else + throw new Exception( + string.Format( + "Agent with ID {0} is not allowed to move from old transit state {1} to new state {2}", + id, oldState, newState)); + } + } + + public bool IsInTransit(UUID id) + { + lock (m_agentsInTransit) + return m_agentsInTransit.ContainsKey(id); + } + + /// + /// Removes an agent from the transit state machine. + /// + /// + /// true if the agent was flagged as being teleported when this method was called, false otherwise + private bool ResetFromTransit(UUID id) + { + lock (m_agentsInTransit) + { + if (m_agentsInTransit.ContainsKey(id)) { + AgentTransferState state = m_agentsInTransit[id]; + + if (state == AgentTransferState.Transferring || state == AgentTransferState.ReceivedAtDestination) + { + // FIXME: For now, we allow exit from any state since a thrown exception in teleport is now guranteed + // to be handled properly - ResetFromTransit() could be invoked at any step along the process + m_log.WarnFormat( + "[ENTITY TRANSFER MODULE]: Agent with ID should not exit directly from state {1}, should go to {2} state first", + state, AgentTransferState.CleaningUp); + +// throw new Exception( +// "Agent with ID {0} cannot exit directly from state {1}, it must go to {2} state first", +// state, AgentTransferState.CleaningUp); + } + m_agentsInTransit.Remove(id); m_log.DebugFormat( diff --git a/OpenSim/Region/Framework/Interfaces/IEntityTransferModule.cs b/OpenSim/Region/Framework/Interfaces/IEntityTransferModule.cs index 75c44d5823..69be83eb41 100644 --- a/OpenSim/Region/Framework/Interfaces/IEntityTransferModule.cs +++ b/OpenSim/Region/Framework/Interfaces/IEntityTransferModule.cs @@ -77,8 +77,8 @@ namespace OpenSim.Region.Framework.Interfaces /// /// Show whether the given agent is being teleported. /// - /// true if the agent is in the process of being teleported, false otherwise. /// The agent ID + /// true if the agent is in the process of being teleported, false otherwise. bool IsInTransit(UUID id); bool Cross(ScenePresence agent, bool isFlying); diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 755b1e6c1c..98a75e49a9 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -5212,10 +5212,10 @@ namespace OpenSim.Region.Framework.Scenes { if (EntityTransferModule.IsInTransit(agentID)) { - reason = "Agent is already in transit on this region"; + reason = "Agent is still in transit from this region"; - m_log.DebugFormat( - "[SCENE]: Denying agent {0} entry into {1} since region already has them registered as in transit", + m_log.WarnFormat( + "[SCENE]: Denying agent {0} entry into {1} since region still has them registered as in transit", agentID, RegionInfo.RegionName); return false; From 96cde407ab0d40856fb10b3b9f304433ffe734a2 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 25 May 2012 02:37:22 +0100 Subject: [PATCH 274/547] Fix bug where a failed QueryAccess to a remove region would always have the reason "Communications failure" no matter what the destination region actually returned --- .../Simulation/RemoteSimulationConnector.cs | 3 +- .../Simulation/SimulationServiceConnector.cs | 33 +++++++++++-------- 2 files changed, 21 insertions(+), 15 deletions(-) diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/RemoteSimulationConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/RemoteSimulationConnector.cs index 3d2851806f..f980f688cc 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/RemoteSimulationConnector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/RemoteSimulationConnector.cs @@ -226,13 +226,13 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation return m_remoteConnector.RetrieveAgent(destination, id, out agent); return false; - } public bool QueryAccess(GridRegion destination, UUID id, Vector3 position, out string version, out string reason) { reason = "Communications failure"; version = "Unknown"; + if (destination == null) return false; @@ -245,7 +245,6 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation return m_remoteConnector.QueryAccess(destination, id, position, out version, out reason); return false; - } public bool ReleaseAgent(UUID origin, UUID id, string uri) diff --git a/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs b/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs index 032beb532c..95c4f87b77 100644 --- a/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs +++ b/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs @@ -328,25 +328,32 @@ namespace OpenSim.Services.Connectors.Simulation if (data["version"] != null && data["version"].AsString() != string.Empty) version = data["version"].AsString(); - m_log.DebugFormat("[REMOTE SIMULATION CONNECTOR]: QueryAccess to {0} returned {1} version {2} ({3})", uri, success, version, data["version"].AsString()); + m_log.DebugFormat( + "[REMOTE SIMULATION CONNECTOR]: QueryAccess to {0} returned {1}, reason {2}, version {3} ({4})", + uri, success, reason, version, data["version"].AsString()); } if (!success) { - if (result.ContainsKey("Message")) + // If we don't check this then OpenSimulator 0.7.3.1 and some period before will never see the + // actual failure message + if (!result.ContainsKey("_Result")) { - string message = result["Message"].AsString(); - if (message == "Service request failed: [MethodNotAllowed] MethodNotAllowed") // Old style region + if (result.ContainsKey("Message")) { - m_log.Info("[REMOTE SIMULATION CONNECTOR]: The above web util error was caused by a TP to a sim that doesn't support QUERYACCESS and can be ignored"); - return true; + string message = result["Message"].AsString(); + if (message == "Service request failed: [MethodNotAllowed] MethodNotAllowed") // Old style region + { + m_log.Info("[REMOTE SIMULATION CONNECTOR]: The above web util error was caused by a TP to a sim that doesn't support QUERYACCESS and can be ignored"); + return true; + } + + reason = result["Message"]; + } + else + { + reason = "Communications failure"; } - - reason = result["Message"]; - } - else - { - reason = "Communications failure"; } return false; @@ -356,7 +363,7 @@ namespace OpenSim.Services.Connectors.Simulation } catch (Exception e) { - m_log.WarnFormat("[REMOTE SIMULATION CONNECTOR] QueryAcess failed with exception; {0}",e.ToString()); + m_log.WarnFormat("[REMOTE SIMULATION CONNECTOR] QueryAcesss failed with exception; {0}",e.ToString()); } return false; From 9f1fc7ea8816e8a052e41b58d4cde077bc58b9e5 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 25 May 2012 02:54:37 +0100 Subject: [PATCH 275/547] Remove a call stack debugging line accidentally left in from a few days ago at SceneObjectPartInventory.ApplyNextOwnerPermissions(). --- OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs index d27d9e1dad..aaf9ffac7b 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs @@ -1027,8 +1027,6 @@ namespace OpenSim.Region.Framework.Scenes public void ApplyNextOwnerPermissions() { - Util.PrintCallStack(); - lock (m_items) { foreach (TaskInventoryItem item in m_items.Values) From 888210ea4af0f9d41263193d450d73eba5d866fc Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 25 May 2012 03:06:26 +0100 Subject: [PATCH 276/547] refactor: make ETM.CrossAgentToNewRegionAsync neighbourRegion == null check return earlier to simplify method --- .../EntityTransfer/EntityTransferModule.cs | 204 +++++++++--------- 1 file changed, 103 insertions(+), 101 deletions(-) diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs index ddb621d81d..7295383cd0 100644 --- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs +++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs @@ -1106,119 +1106,121 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer ScenePresence agent, Vector3 pos, uint neighbourx, uint neighboury, GridRegion neighbourRegion, bool isFlying, string version) { + if (neighbourRegion == null) + return agent; + try { ulong neighbourHandle = Utils.UIntsToLong((uint)(neighbourx * Constants.RegionSize), (uint)(neighboury * Constants.RegionSize)); - m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Crossing agent {0} {1} to {2}-{3} running version {4}", agent.Firstname, agent.Lastname, neighbourx, neighboury, version); + m_log.DebugFormat( + "[ENTITY TRANSFER MODULE]: Crossing agent {0} {1} to {2}-{3} running version {4}", + agent.Firstname, agent.Lastname, neighbourx, neighboury, version); Scene m_scene = agent.Scene; - - if (neighbourRegion != null) + + if (!agent.ValidateAttachments()) + m_log.DebugFormat( + "[ENTITY TRANSFER MODULE]: Failed validation of all attachments for region crossing of {0} from {1} to {2}. Continuing.", + agent.Name, agent.Scene.RegionInfo.RegionName, neighbourRegion.RegionName); + + pos = pos + agent.Velocity; + Vector3 vel2 = new Vector3(agent.Velocity.X, agent.Velocity.Y, 0); + + agent.RemoveFromPhysicalScene(); + + SetInTransit(agent.UUID); + + AgentData cAgent = new AgentData(); + agent.CopyTo(cAgent); + cAgent.Position = pos; + if (isFlying) + cAgent.ControlFlags |= (uint)AgentManager.ControlFlags.AGENT_CONTROL_FLY; + + // We don't need the callback anymnore + cAgent.CallbackURI = String.Empty; + + // Beyond this point, extra cleanup is needed beyond removing transit state + UpdateInTransit(agent.UUID, AgentTransferState.Transferring); + + if (!m_scene.SimulationService.UpdateAgent(neighbourRegion, cAgent)) { - if (!agent.ValidateAttachments()) - m_log.DebugFormat( - "[ENTITY TRANSFER MODULE]: Failed validation of all attachments for region crossing of {0} from {1} to {2}. Continuing.", - agent.Name, agent.Scene.RegionInfo.RegionName, neighbourRegion.RegionName); - - pos = pos + agent.Velocity; - Vector3 vel2 = new Vector3(agent.Velocity.X, agent.Velocity.Y, 0); - - agent.RemoveFromPhysicalScene(); - - SetInTransit(agent.UUID); - - AgentData cAgent = new AgentData(); - agent.CopyTo(cAgent); - cAgent.Position = pos; - if (isFlying) - cAgent.ControlFlags |= (uint)AgentManager.ControlFlags.AGENT_CONTROL_FLY; - - // We don't need the callback anymnore - cAgent.CallbackURI = String.Empty; - - // Beyond this point, extra cleanup is needed beyond removing transit state - UpdateInTransit(agent.UUID, AgentTransferState.Transferring); - - if (!m_scene.SimulationService.UpdateAgent(neighbourRegion, cAgent)) - { - // region doesn't take it - ReInstantiateScripts(agent); - agent.AddToPhysicalScene(isFlying); - ResetFromTransit(agent.UUID); - return agent; - } - - //AgentCircuitData circuitdata = m_controllingClient.RequestClientInfo(); - agent.ControllingClient.RequestClientInfo(); - - //m_log.Debug("BEFORE CROSS"); - //Scene.DumpChildrenSeeds(UUID); - //DumpKnownRegions(); - string agentcaps; - if (!agent.KnownRegions.TryGetValue(neighbourRegion.RegionHandle, out agentcaps)) - { - m_log.ErrorFormat("[ENTITY TRANSFER MODULE]: No ENTITY TRANSFER MODULE information for region handle {0}, exiting CrossToNewRegion.", - neighbourRegion.RegionHandle); - return agent; - } - // No turning back - agent.IsChildAgent = true; - - string capsPath = neighbourRegion.ServerURI + CapsUtil.GetCapsSeedPath(agentcaps); - - m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Sending new CAPS seed url {0} to client {1}", capsPath, agent.UUID); - - if (m_eqModule != null) - { - m_eqModule.CrossRegion( - neighbourHandle, pos, vel2 /* agent.Velocity */, neighbourRegion.ExternalEndPoint, - capsPath, agent.UUID, agent.ControllingClient.SessionId); - } - else - { - agent.ControllingClient.CrossRegion(neighbourHandle, pos, agent.Velocity, neighbourRegion.ExternalEndPoint, - capsPath); - } - - // SUCCESS! - UpdateInTransit(agent.UUID, AgentTransferState.ReceivedAtDestination); - - // Unlike a teleport, here we do not wait for the destination region to confirm the receipt. - UpdateInTransit(agent.UUID, AgentTransferState.CleaningUp); - - agent.MakeChildAgent(); - - // FIXME: Possibly this should occur lower down after other commands to close other agents, - // but not sure yet what the side effects would be. + // region doesn't take it + ReInstantiateScripts(agent); + agent.AddToPhysicalScene(isFlying); ResetFromTransit(agent.UUID); + return agent; + } - // now we have a child agent in this region. Request all interesting data about other (root) agents - agent.SendOtherAgentsAvatarDataToMe(); - agent.SendOtherAgentsAppearanceToMe(); + //AgentCircuitData circuitdata = m_controllingClient.RequestClientInfo(); + agent.ControllingClient.RequestClientInfo(); - // Backwards compatibility. Best effort - if (version == "Unknown" || version == string.Empty) - { - m_log.DebugFormat("[ENTITY TRANSFER MODULE]: neighbor with old version, passing attachments one by one..."); - Thread.Sleep(3000); // wait a little now that we're not waiting for the callback - CrossAttachmentsIntoNewRegion(neighbourRegion, agent, true); - } + //m_log.Debug("BEFORE CROSS"); + //Scene.DumpChildrenSeeds(UUID); + //DumpKnownRegions(); + string agentcaps; + if (!agent.KnownRegions.TryGetValue(neighbourRegion.RegionHandle, out agentcaps)) + { + m_log.ErrorFormat("[ENTITY TRANSFER MODULE]: No ENTITY TRANSFER MODULE information for region handle {0}, exiting CrossToNewRegion.", + neighbourRegion.RegionHandle); + return agent; + } + // No turning back + agent.IsChildAgent = true; + + string capsPath = neighbourRegion.ServerURI + CapsUtil.GetCapsSeedPath(agentcaps); + + m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Sending new CAPS seed url {0} to client {1}", capsPath, agent.UUID); + + if (m_eqModule != null) + { + m_eqModule.CrossRegion( + neighbourHandle, pos, vel2 /* agent.Velocity */, neighbourRegion.ExternalEndPoint, + capsPath, agent.UUID, agent.ControllingClient.SessionId); + } + else + { + agent.ControllingClient.CrossRegion(neighbourHandle, pos, agent.Velocity, neighbourRegion.ExternalEndPoint, + capsPath); + } + + // SUCCESS! + UpdateInTransit(agent.UUID, AgentTransferState.ReceivedAtDestination); + + // Unlike a teleport, here we do not wait for the destination region to confirm the receipt. + UpdateInTransit(agent.UUID, AgentTransferState.CleaningUp); + + agent.MakeChildAgent(); + + // FIXME: Possibly this should occur lower down after other commands to close other agents, + // but not sure yet what the side effects would be. + ResetFromTransit(agent.UUID); + + // now we have a child agent in this region. Request all interesting data about other (root) agents + agent.SendOtherAgentsAvatarDataToMe(); + agent.SendOtherAgentsAppearanceToMe(); + + // Backwards compatibility. Best effort + if (version == "Unknown" || version == string.Empty) + { + m_log.DebugFormat("[ENTITY TRANSFER MODULE]: neighbor with old version, passing attachments one by one..."); + Thread.Sleep(3000); // wait a little now that we're not waiting for the callback + CrossAttachmentsIntoNewRegion(neighbourRegion, agent, true); + } - // Next, let's close the child agent connections that are too far away. - agent.CloseChildAgents(neighbourx, neighboury); - - AgentHasMovedAway(agent, false); - - // the user may change their profile information in other region, - // so the userinfo in UserProfileCache is not reliable any more, delete it - // REFACTORING PROBLEM. Well, not a problem, but this method is HORRIBLE! - if (agent.Scene.NeedSceneCacheClear(agent.UUID)) - { - m_log.DebugFormat( - "[ENTITY TRANSFER MODULE]: User {0} is going to another region", agent.UUID); - } + // Next, let's close the child agent connections that are too far away. + agent.CloseChildAgents(neighbourx, neighboury); + + AgentHasMovedAway(agent, false); + + // the user may change their profile information in other region, + // so the userinfo in UserProfileCache is not reliable any more, delete it + // REFACTORING PROBLEM. Well, not a problem, but this method is HORRIBLE! + if (agent.Scene.NeedSceneCacheClear(agent.UUID)) + { + m_log.DebugFormat( + "[ENTITY TRANSFER MODULE]: User {0} is going to another region", agent.UUID); } //m_log.Debug("AFTER CROSS"); From ab59c0a658c25f129255198f27704cdbbcb13d6b Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 25 May 2012 03:39:10 +0100 Subject: [PATCH 277/547] on agent cross, remove from physics scene after its been placed in transit, not before. --- .../Framework/EntityTransfer/EntityTransferModule.cs | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs index 7295383cd0..a5fb0c2fb5 100644 --- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs +++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs @@ -1111,6 +1111,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer try { + SetInTransit(agent.UUID); + ulong neighbourHandle = Utils.UIntsToLong((uint)(neighbourx * Constants.RegionSize), (uint)(neighboury * Constants.RegionSize)); m_log.DebugFormat( @@ -1129,8 +1131,6 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer agent.RemoveFromPhysicalScene(); - SetInTransit(agent.UUID); - AgentData cAgent = new AgentData(); agent.CopyTo(cAgent); cAgent.Position = pos; @@ -1146,9 +1146,12 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer if (!m_scene.SimulationService.UpdateAgent(neighbourRegion, cAgent)) { // region doesn't take it + UpdateInTransit(agent.UUID, AgentTransferState.CleaningUp); + ReInstantiateScripts(agent); agent.AddToPhysicalScene(isFlying); ResetFromTransit(agent.UUID); + return agent; } @@ -1208,7 +1211,6 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer CrossAttachmentsIntoNewRegion(neighbourRegion, agent, true); } - // Next, let's close the child agent connections that are too far away. agent.CloseChildAgents(neighbourx, neighboury); @@ -1232,6 +1234,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer m_log.ErrorFormat( "[ENTITY TRANSFER MODULE]: Problem crossing user {0} to new region {1} from {2}. Exception {3}{4}", agent.Name, neighbourRegion.RegionName, agent.Scene.RegionInfo.RegionName, e.Message, e.StackTrace); + + // TODO: Might be worth attempting other restoration here such as reinstantiation of scripts, etc. } return agent; From 67ebe80dd95ffa2c5e9b071497b472f9c99f00f8 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 25 May 2012 04:03:16 +0100 Subject: [PATCH 278/547] Resolve some mono compiler warnings. --- .../Avatar/Attachments/AttachmentsModule.cs | 2 -- .../Avatar/Friends/HGFriendsModule.cs | 13 ++++++--- .../EntityTransfer/EntityTransferModule.cs | 2 +- .../EntityTransfer/HGEntityTransferModule.cs | 2 +- .../HGInventoryAccessModule.cs | 5 ++-- .../HypergridServiceInConnectorModule.cs | 3 +- .../Asset/HGAssetBroker.cs | 2 +- .../World/Terrain/FileLoaders/TIFF.cs | 2 +- .../World/Terrain/FileLoaders/Terragen.cs | 28 +++++++++++-------- 9 files changed, 33 insertions(+), 26 deletions(-) diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs index 510b483ed1..88071f6184 100644 --- a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs @@ -48,7 +48,6 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); private Scene m_scene; - private IDialogModule m_dialogModule; private IInventoryAccessModule m_invAccessModule; /// @@ -89,7 +88,6 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments public void RegionLoaded(Scene scene) { - m_dialogModule = m_scene.RequestModuleInterface(); m_invAccessModule = m_scene.RequestModuleInterface(); } diff --git a/OpenSim/Region/CoreModules/Avatar/Friends/HGFriendsModule.cs b/OpenSim/Region/CoreModules/Avatar/Friends/HGFriendsModule.cs index 3728b85a16..06f27e23df 100644 --- a/OpenSim/Region/CoreModules/Avatar/Friends/HGFriendsModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Friends/HGFriendsModule.cs @@ -415,12 +415,13 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends protected override void StoreBackwards(UUID friendID, UUID agentID) { - Boolean agentIsLocal = true; - Boolean friendIsLocal = true; + bool agentIsLocal = true; +// bool friendIsLocal = true; + if (UserManagementModule != null) { agentIsLocal = UserManagementModule.IsLocalGridUser(agentID); - friendIsLocal = UserManagementModule.IsLocalGridUser(friendID); +// friendIsLocal = UserManagementModule.IsLocalGridUser(friendID); } // Is the requester a local user? @@ -507,7 +508,11 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends { friendUUI = finfo.Friend; theFriendUUID = friendUUI; - UUID utmp = UUID.Zero; String url = String.Empty; String first = String.Empty, last = String.Empty, tmp = String.Empty; + UUID utmp = UUID.Zero; + string url = String.Empty; + string first = String.Empty; + string last = String.Empty; + // If it's confirming the friendship, we already have the full UUI with the secret if (Util.ParseUniversalUserIdentifier(theFriendUUID, out utmp, out url, out first, out last, out secret)) { diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs index a5fb0c2fb5..ae9fb53aa3 100644 --- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs +++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs @@ -1240,7 +1240,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer return agent; } - + private void CrossAgentToNewRegionCompleted(IAsyncResult iar) { CrossAgentToNewRegionDelegate icon = (CrossAgentToNewRegionDelegate)iar.AsyncState; diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs index 412466714c..0fdd4578a9 100644 --- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs +++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs @@ -336,7 +336,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer // Let's find out if this is a foreign user or a local user IUserManagement uMan = m_scene.RequestModuleInterface(); - UserAccount account = m_scene.UserAccountService.GetUserAccount(m_scene.RegionInfo.ScopeID, obj.AgentId); +// UserAccount account = m_scene.UserAccountService.GetUserAccount(m_scene.RegionInfo.ScopeID, obj.AgentId); if (uMan != null && uMan.IsLocalGridUser(obj.AgentId)) { // local grid user diff --git a/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGInventoryAccessModule.cs b/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGInventoryAccessModule.cs index a71584a91b..cf72b58832 100644 --- a/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGInventoryAccessModule.cs +++ b/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGInventoryAccessModule.cs @@ -364,8 +364,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess { m_log.DebugFormat("[HG INVENTORY ACCESS MODULE]: Changing root inventory for user {0}", client.Name); InventoryCollection content = m_Scene.InventoryService.GetFolderContent(client.AgentId, root.ID); - List fids = new List(); - List iids = new List(); + List keep = new List(); foreach (InventoryFolderBase f in content.Folders) @@ -395,4 +394,4 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess #endregion } -} +} \ No newline at end of file diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsIn/Hypergrid/HypergridServiceInConnectorModule.cs b/OpenSim/Region/CoreModules/ServiceConnectorsIn/Hypergrid/HypergridServiceInConnectorModule.cs index 8df1c7b49c..a7dd0dd4dd 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsIn/Hypergrid/HypergridServiceInConnectorModule.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsIn/Hypergrid/HypergridServiceInConnectorModule.cs @@ -122,7 +122,8 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsIn.Hypergrid ISimulationService simService = scene.RequestModuleInterface(); IFriendsSimConnector friendsConn = scene.RequestModuleInterface(); Object[] args = new Object[] { m_Config }; - IFriendsService friendsService = ServerUtils.LoadPlugin(m_LocalServiceDll, args); +// IFriendsService friendsService = ServerUtils.LoadPlugin(m_LocalServiceDll, args) + ServerUtils.LoadPlugin(m_LocalServiceDll, args); m_HypergridHandler = new GatekeeperServiceInConnector(m_Config, MainServer.Instance, simService); diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Asset/HGAssetBroker.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Asset/HGAssetBroker.cs index 8395f8321d..008465fcc9 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Asset/HGAssetBroker.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Asset/HGAssetBroker.cs @@ -149,7 +149,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Asset m_aScene = scene; - scene.RegisterModuleInterface(this); + m_aScene.RegisterModuleInterface(this); } public void RemoveRegion(Scene scene) diff --git a/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/TIFF.cs b/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/TIFF.cs index 5d2f8937b4..b416b82a17 100644 --- a/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/TIFF.cs +++ b/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/TIFF.cs @@ -59,7 +59,7 @@ namespace OpenSim.Region.CoreModules.World.Terrain.FileLoaders } //Returns true if this extension is supported for terrain save-tile - public bool SupportsTileSave() + public override bool SupportsTileSave() { return false; } diff --git a/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/Terragen.cs b/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/Terragen.cs index 1ebf91654c..71c71e6cd5 100644 --- a/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/Terragen.cs +++ b/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/Terragen.cs @@ -65,7 +65,7 @@ namespace OpenSim.Region.CoreModules.World.Terrain.FileLoaders bool eof = false; int fileXPoints = 0; - int fileYPoints = 0; +// int fileYPoints = 0; // Terragen file while (eof == false) @@ -75,7 +75,7 @@ namespace OpenSim.Region.CoreModules.World.Terrain.FileLoaders { case "SIZE": fileXPoints = bs.ReadInt16() + 1; - fileYPoints = fileXPoints; +// fileYPoints = fileXPoints; bs.ReadInt16(); break; case "XPTS": @@ -83,7 +83,8 @@ namespace OpenSim.Region.CoreModules.World.Terrain.FileLoaders bs.ReadInt16(); break; case "YPTS": - fileYPoints = bs.ReadInt16(); +// fileYPoints = bs.ReadInt16(); + bs.ReadInt16(); bs.ReadInt16(); break; case "ALTW": @@ -164,10 +165,8 @@ namespace OpenSim.Region.CoreModules.World.Terrain.FileLoaders bool eof = false; if (Encoding.ASCII.GetString(bs.ReadBytes(16)) == "TERRAGENTERRAIN ") { - - int fileWidth = w; - int fileHeight = h; - +// int fileWidth = w; +// int fileHeight = h; // Terragen file while (eof == false) @@ -176,17 +175,22 @@ namespace OpenSim.Region.CoreModules.World.Terrain.FileLoaders switch (tmp) { case "SIZE": - int sztmp = bs.ReadInt16() + 1; - fileWidth = sztmp; - fileHeight = sztmp; +// int sztmp = bs.ReadInt16() + 1; +// fileWidth = sztmp; +// fileHeight = sztmp; + bs.ReadInt16(); + bs.ReadInt16(); + bs.ReadInt16(); bs.ReadInt16(); break; case "XPTS": - fileWidth = bs.ReadInt16(); +// fileWidth = bs.ReadInt16(); + bs.ReadInt16(); bs.ReadInt16(); break; case "YPTS": - fileHeight = bs.ReadInt16(); +// fileHeight = bs.ReadInt16(); + bs.ReadInt16(); bs.ReadInt16(); break; case "ALTW": From 120f8145fcfe2cdc4e39a92e5838a2a41eb51406 Mon Sep 17 00:00:00 2001 From: Talun Date: Wed, 23 May 2012 00:33:45 +0100 Subject: [PATCH 279/547] Mantis 6028 osAvatarStopAnimation not stopping animations via UUID Corrected to stop animations using the animation UUID similar to llStopAnimation. See http://opensimulator.org/wiki/OsAvatarStopAnimation --- .../Shared/Api/Implementation/OSSL_Api.cs | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs index ad1a3585ca..5dbd9ec21e 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs @@ -957,16 +957,20 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api ScenePresence target = (ScenePresence)World.Entities[avatarID]; if (target != null) { - UUID animID = UUID.Zero; - lock (m_host.TaskInventory) + UUID animID = new UUID(); + if (!UUID.TryParse(animation, out animID)) { - foreach (KeyValuePair inv in m_host.TaskInventory) + animID = UUID.Zero; + lock (m_host.TaskInventory) { - if (inv.Value.Name == animation) + foreach (KeyValuePair inv in m_host.TaskInventory) { - if (inv.Value.Type == (int)AssetType.Animation) - animID = inv.Value.AssetID; - continue; + if (inv.Value.Name == animation) + { + if (inv.Value.Type == (int)AssetType.Animation) + animID = inv.Value.AssetID; + continue; + } } } } From ff53add54dbc666e585b928ba51b4babb7441611 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Sat, 26 May 2012 00:36:01 +0100 Subject: [PATCH 280/547] refactor: replace LSL_Api.InventoryKey(string) largely with SceneObjectPartInventory.GetInventoryItem(string) Also gets llStopAnimation() to call KeyOrName rather than duplicating logic. --- .../Framework/Interfaces/IEntityInventory.cs | 13 +++++ .../Scenes/SceneObjectPartInventory.cs | 22 +++++--- .../Shared/Api/Implementation/LSL_Api.cs | 52 ++++++------------- 3 files changed, 42 insertions(+), 45 deletions(-) diff --git a/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs b/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs index 30ed7d100d..4370fcc96f 100644 --- a/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs +++ b/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs @@ -163,6 +163,19 @@ namespace OpenSim.Region.Framework.Interfaces /// List GetInventoryItems(); + /// + /// Gets an inventory item by name + /// + /// + /// This method returns the first inventory item that matches the given name. In SL this is all you need + /// since each item in a prim inventory must have a unique name. + /// + /// + /// + /// The inventory item. Null if no such item was found. + /// + TaskInventoryItem GetInventoryItem(string name); + /// /// Get inventory items by name. /// diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs index aaf9ffac7b..8810903700 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs @@ -582,14 +582,20 @@ namespace OpenSim.Region.Framework.Scenes return item; } - /// - /// Get inventory items by name. - /// - /// - /// - /// A list of inventory items with that name. - /// If no inventory item has that name then an empty list is returned. - /// + public TaskInventoryItem GetInventoryItem(string name) + { + lock (m_items) + { + foreach (TaskInventoryItem item in m_items.Values) + { + if (item.Name == name) + return item; + } + } + + return null; + } + public List GetInventoryItems(string name) { List items = new List(); diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index 4b2880837e..9908a398a5 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -104,9 +104,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api protected int m_scriptConsoleChannel = 0; protected bool m_scriptConsoleChannelEnabled = false; protected IUrlModule m_UrlModule = null; - protected Dictionary m_userInfoCache = - new Dictionary(); - protected int EMAIL_PAUSE_TIME = 20; // documented delay value for smtp. + protected Dictionary m_userInfoCache = new Dictionary(); + protected int EMAIL_PAUSE_TIME = 20; // documented delay value for smtp. public void Initialize(IScriptEngine ScriptEngine, SceneObjectPart host, TaskInventoryItem item) { @@ -304,25 +303,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api return UUID.Zero; } - protected UUID InventoryKey(string name) - { - m_host.AddScriptLPS(1); - - lock (m_host.TaskInventory) - { - foreach (KeyValuePair inv in m_host.TaskInventory) - { - if (inv.Value.Name == name) - { - return inv.Value.AssetID; - } - } - } - - return UUID.Zero; - } - - /// /// accepts a valid UUID, -or- a name of an inventory item. /// Returns a valid UUID or UUID.Zero if key invalid and item not found @@ -332,19 +312,22 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api /// protected UUID KeyOrName(string k) { - UUID key = UUID.Zero; + UUID key; // if we can parse the string as a key, use it. - if (UUID.TryParse(k, out key)) - { - return key; - } // else try to locate the name in inventory of object. found returns key, - // not found returns UUID.Zero which will translate to the default particle texture - else + // not found returns UUID.Zero + if (!UUID.TryParse(k, out key)) { - return InventoryKey(k); + TaskInventoryItem item = m_host.Inventory.GetInventoryItem(k); + + if (item != null) + key = item.AssetID; + else + key = UUID.Zero; } + + return key; } // convert a LSL_Rotation to a Quaternion @@ -3315,17 +3298,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_TRIGGER_ANIMATION) != 0) { - UUID animID = new UUID(); - - if (!UUID.TryParse(anim, out animID)) - { - animID = InventoryKey(anim); - } - ScenePresence presence = World.GetScenePresence(m_item.PermsGranter); if (presence != null) { + UUID animID = KeyOrName(anim); + if (animID == UUID.Zero) presence.Animator.RemoveAnimation(anim); else From f2a5fad18f30d24cd8911de829ecb1a07b475e38 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Sat, 26 May 2012 00:54:00 +0100 Subject: [PATCH 281/547] Use SceneObjectPartInventory.GetInventoryItem() in OSSL.AvatarStopAnimation instead of searching the task inventory manually. --- .../Shared/Api/Implementation/OSSL_Api.cs | 26 +++++++++---------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs index 5dbd9ec21e..7ea8b7a4fb 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs @@ -952,27 +952,25 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api UUID avatarID = (UUID)avatar; m_host.AddScriptLPS(1); + + // FIXME: What we really want to do here is factor out the similar code in llStopAnimation() to a common + // method (though see that doesn't do the is animation check, which is probably a bug) and have both + // these functions call that common code. However, this does mean navigating the brain-dead requirement + // of calling InitLSL() if (World.Entities.ContainsKey(avatarID) && World.Entities[avatarID] is ScenePresence) { ScenePresence target = (ScenePresence)World.Entities[avatarID]; if (target != null) { - UUID animID = new UUID(); + UUID animID; + if (!UUID.TryParse(animation, out animID)) { - animID = UUID.Zero; - lock (m_host.TaskInventory) - { - foreach (KeyValuePair inv in m_host.TaskInventory) - { - if (inv.Value.Name == animation) - { - if (inv.Value.Type == (int)AssetType.Animation) - animID = inv.Value.AssetID; - continue; - } - } - } + TaskInventoryItem item = m_host.Inventory.GetInventoryItem(animation); + if (item != null && item.Type == (int)AssetType.Animation) + animID = item.AssetID; + else + animID = UUID.Zero; } if (animID == UUID.Zero) From d6476b627752c99a6aea5093d080d3633aa6dde8 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Sat, 26 May 2012 01:03:53 +0100 Subject: [PATCH 282/547] Use GetInventoryItem() in LSL_Api.InventoryKey(string name, int type). Also removes small bug where calling this method would add 1 to LPS, evne though all callers already did this. --- .../Shared/Api/Implementation/LSL_Api.cs | 24 ++++++------------- 1 file changed, 7 insertions(+), 17 deletions(-) diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index 9908a398a5..6438bccc1d 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -284,23 +284,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api protected UUID InventoryKey(string name, int type) { - m_host.AddScriptLPS(1); + TaskInventoryItem item = m_host.Inventory.GetInventoryItem(name); - lock (m_host.TaskInventory) - { - foreach (KeyValuePair inv in m_host.TaskInventory) - { - if (inv.Value.Name == name) - { - if (inv.Value.Type != type) - return UUID.Zero; - - return inv.Value.AssetID; - } - } - } - - return UUID.Zero; + if (item != null && item.Type == type) + return item.AssetID; + else + return UUID.Zero; } /// @@ -1707,14 +1696,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api return rgb; } + if (face >= 0 && face < GetNumberOfSides(part)) { texcolor = tex.GetFace((uint)face).RGBA; rgb.x = texcolor.R; rgb.y = texcolor.G; rgb.z = texcolor.B; + return rgb; - } else { From 33b66009e43fa7c488b06c557dc46273288750d4 Mon Sep 17 00:00:00 2001 From: "Blake.Bourque" Date: Wed, 23 May 2012 07:38:03 -0400 Subject: [PATCH 283/547] One can now get hyoergrid region co-ordinates with llRequestSimulatorData --- .../Shared/Api/Implementation/LSL_Api.cs | 26 +++++++++++++++---- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index 6438bccc1d..84493b1c24 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -9098,7 +9098,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api GridRegion info; - if (m_ScriptEngine.World.RegionInfo.RegionName == simulator) + if (m_ScriptEngine.World.RegionInfo.RegionName == simulator) //Det data for this simulator? + info = new GridRegion(m_ScriptEngine.World.RegionInfo); else info = m_ScriptEngine.World.GridService.GetRegionByName(m_ScriptEngine.World.RegionInfo.ScopeID, simulator); @@ -9111,10 +9112,25 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api ScriptSleep(1000); return UUID.Zero.ToString(); } - reply = new LSL_Vector( - info.RegionLocX, - info.RegionLocY, - 0).ToString(); + if (m_ScriptEngine.World.RegionInfo.RegionName != simulator) + { + //Hypergrid Region co-ordinates + uint rx = 0, ry = 0; + Utils.LongToUInts(Convert.ToUInt64(info.RegionSecret), out rx, out ry); + + reply = new LSL_Vector( + rx, + ry, + 0).ToString(); + } + else + { + //Local-cooridnates + reply = new LSL_Vector( + info.RegionLocX, + info.RegionLocY, + 0).ToString(); + } break; case ScriptBaseClass.DATA_SIM_STATUS: if (info != null) From 3ac3be99ae73aae1bf9b3cfad7dfd6c018357c83 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Sat, 26 May 2012 01:35:33 +0100 Subject: [PATCH 284/547] Add Blake/Techplex to CONTRIBUTORS. Thanks! --- CONTRIBUTORS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CONTRIBUTORS.txt b/CONTRIBUTORS.txt index 8350802a8b..608a032eb0 100644 --- a/CONTRIBUTORS.txt +++ b/CONTRIBUTORS.txt @@ -146,6 +146,7 @@ what it is today. * Stefan_Boom / stoehr * Strawberry Fride * Talun +* TechplexEngineer (Blake Bourque) * TBG Renfold * tglion * tlaukkan/Tommil (Tommi S. E. Laukkanen, Bubble Cloud) From 43a6f286209e87ebaeabc9e1f966444fa2fac18e Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Sat, 26 May 2012 01:55:35 +0100 Subject: [PATCH 285/547] If restating a region, clean up the physics scene after the main scene has been closed not before. If this is done before then on ODE agent update calls still incoming can fail as they try to use a raycastmanager that has been disposed. Bullet plugin does nothing on Dispose() However, I wouldn't be at all surprised if individual region restarting was buggy in lots of other areas. --- OpenSim/Region/Framework/Scenes/Scene.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 98a75e49a9..ce386be205 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -1032,13 +1032,13 @@ namespace OpenSim.Region.Framework.Scenes } } + m_log.Error("[REGION]: Closing"); + Close(); + if (PhysicsScene != null) { PhysicsScene.Dispose(); - } - - m_log.Error("[REGION]: Closing"); - Close(); + } m_log.Error("[REGION]: Firing Region Restart Message"); From 0b72f773c7df849b335895d7c7a6cfe949f59f00 Mon Sep 17 00:00:00 2001 From: Talun Date: Tue, 22 May 2012 23:06:40 +0100 Subject: [PATCH 286/547] Mantis 6025 llRequestPermissions auto grant for NPCs. If the script requesting permissions is owned by either the NPC or the NPCs owner (if the NPC is created as owned) then grant any permissions automatically. --- .../Shared/Api/Implementation/LSL_Api.cs | 24 ++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index 84493b1c24..f3787a01fe 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -3406,9 +3406,31 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api } ScenePresence presence = World.GetScenePresence(agentID); - if (presence != null) { + // If permissions are being requested from an NPC and were not implicitly granted above then + // auto grant all reuqested permissions if the script is owned by the NPC or the NPCs owner + INPCModule npcModule = World.RequestModuleInterface(); + if (npcModule != null && npcModule.IsNPC(agentID, World)) + { + if (agentID == m_host.ParentGroup.OwnerID || npcModule.GetOwner(agentID) == m_host.ParentGroup.OwnerID) + { + lock (m_host.TaskInventory) + { + m_host.TaskInventory[m_item.ItemID].PermsGranter = agentID; + m_host.TaskInventory[m_item.ItemID].PermsMask = perm; + } + + m_ScriptEngine.PostScriptEvent(m_item.ItemID, new EventParams( + "run_time_permissions", new Object[] { + new LSL_Integer(perm) }, + new DetectParams[0])); + } + // it is an NPC, exit even if the permissions werent granted above, they are not going to answer + // the question! + return; + } + string ownerName = resolveName(m_host.ParentGroup.RootPart.OwnerID); if (ownerName == String.Empty) ownerName = "(hippos)"; From 7fd38788b4a654983c11efbcddb107feb4b3634a Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Sat, 26 May 2012 02:14:32 +0100 Subject: [PATCH 287/547] minor: code formatting from 0b72f773 --- .../Shared/Api/Implementation/LSL_Api.cs | 23 +++++++++---------- 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index f3787a01fe..deb68b83f4 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -3421,11 +3421,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api m_host.TaskInventory[m_item.ItemID].PermsMask = perm; } - m_ScriptEngine.PostScriptEvent(m_item.ItemID, new EventParams( - "run_time_permissions", new Object[] { - new LSL_Integer(perm) }, - new DetectParams[0])); + m_ScriptEngine.PostScriptEvent( + m_item.ItemID, + new EventParams( + "run_time_permissions", new Object[] { new LSL_Integer(perm) }, new DetectParams[0])); } + // it is an NPC, exit even if the permissions werent granted above, they are not going to answer // the question! return; @@ -3454,10 +3455,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api } // Requested agent is not in range, refuse perms - m_ScriptEngine.PostScriptEvent(m_item.ItemID, new EventParams( - "run_time_permissions", new Object[] { - new LSL_Integer(0) }, - new DetectParams[0])); + m_ScriptEngine.PostScriptEvent( + m_item.ItemID, + new EventParams("run_time_permissions", new Object[] { new LSL_Integer(0) }, new DetectParams[0])); } void handleScriptAnswer(IClientAPI client, UUID taskID, UUID itemID, int answer) @@ -3476,10 +3476,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api m_host.TaskInventory[m_item.ItemID].PermsMask = answer; } - m_ScriptEngine.PostScriptEvent(m_item.ItemID, new EventParams( - "run_time_permissions", new Object[] { - new LSL_Integer(answer) }, - new DetectParams[0])); + m_ScriptEngine.PostScriptEvent( + m_item.ItemID, + new EventParams("run_time_permissions", new Object[] { new LSL_Integer(answer) }, new DetectParams[0])); } public LSL_String llGetPermissionsKey() From 8f87f55d053a69bf1f5b2758d51871c4c76e15b9 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Mon, 28 May 2012 22:14:37 +0100 Subject: [PATCH 288/547] If handling the failure of teleport, move agent state to CleaningUp when we start the handling. Also fixes the log warning from ResetInTransit() if the state is cleared direct from Transferring or ReceiveAtDestination, as pointed out in mantis 5426 --- .../Framework/EntityTransfer/EntityTransferModule.cs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs index ae9fb53aa3..ab1424d2db 100644 --- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs +++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs @@ -684,13 +684,14 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer protected virtual void Fail(ScenePresence sp, GridRegion finalDestination, bool logout) { + UpdateInTransit(sp.UUID, AgentTransferState.CleaningUp); + // Client never contacted destination. Let's restore everything back sp.ControllingClient.SendTeleportFailed("Problems connecting to destination."); // Fail. Reset it back sp.IsChildAgent = false; ReInstantiateScripts(sp); - ResetFromTransit(sp.UUID); EnableChildAgents(sp); @@ -698,6 +699,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer m_scene.SimulationService.CloseAgent(finalDestination, sp.UUID); sp.Scene.EventManager.TriggerTeleportFail(sp.ControllingClient, logout); + + ResetFromTransit(sp.UUID); } protected virtual bool CreateAgent(ScenePresence sp, GridRegion reg, GridRegion finalDestination, AgentCircuitData agentCircuit, uint teleportFlags, out string reason, out bool logout) @@ -2158,8 +2161,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer // FIXME: For now, we allow exit from any state since a thrown exception in teleport is now guranteed // to be handled properly - ResetFromTransit() could be invoked at any step along the process m_log.WarnFormat( - "[ENTITY TRANSFER MODULE]: Agent with ID should not exit directly from state {1}, should go to {2} state first", - state, AgentTransferState.CleaningUp); + "[ENTITY TRANSFER MODULE]: Agent with ID {0} should not exit directly from state {1}, should go to {2} state first", + id, state, AgentTransferState.CleaningUp); // throw new Exception( // "Agent with ID {0} cannot exit directly from state {1}, it must go to {2} state first", From 79f3ce2e9f3563165ee640f917f944ec4b370ac7 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Mon, 28 May 2012 23:06:00 +0100 Subject: [PATCH 289/547] refactor: factor out entity transfer state machine into a separate class to make code more analyzable --- .../EntityTransfer/EntityTransferModule.cs | 284 ++++-------------- .../EntityTransferStateMachine.cs | 269 +++++++++++++++++ .../EntityTransfer/HGEntityTransferModule.cs | 16 +- 3 files changed, 330 insertions(+), 239 deletions(-) create mode 100644 OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferStateMachine.cs diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs index ab1424d2db..f2926eaf1f 100644 --- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs +++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs @@ -46,35 +46,12 @@ using Nini.Config; namespace OpenSim.Region.CoreModules.Framework.EntityTransfer { - /// - /// The possible states that an agent can be in when its being transferred between regions. - /// - /// - /// This is a state machine. - /// - /// [Entry] => Preparing - /// Preparing => { Transferring || CleaningUp || [Exit] } - /// Transferring => { ReceivedAtDestination || CleaningUp } - /// ReceivedAtDestination => CleaningUp - /// CleaningUp => [Exit] - /// - /// In other words, agents normally travel throwing Preparing => Transferring => ReceivedAtDestination => CleaningUp - /// However, any state can transition to CleaningUp if the teleport has failed. - /// - enum AgentTransferState - { - Preparing, // The agent is being prepared for transfer - Transferring, // The agent is in the process of being transferred to a destination - ReceivedAtDestination, // The destination has notified us that the agent has been successfully received - CleaningUp // The agent is being changed to child/removed after a transfer - } - public class EntityTransferModule : INonSharedRegionModule, IEntityTransferModule { private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); public const int DefaultMaxTransferDistance = 4095; - public const bool EnableWaitForCallbackFromTeleportDestDefault = true; + public const bool WaitForAgentArrivedAtDestinationDefault = true; /// /// The maximum distance, in standard region units (256m) that an agent is allowed to transfer. @@ -85,13 +62,17 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer /// If true then on a teleport, the source region waits for a callback from the destination region. If /// a callback fails to arrive within a set time then the user is pulled back into the source region. /// - public bool EnableWaitForCallbackFromTeleportDest { get; set; } + public bool WaitForAgentArrivedAtDestination { get; set; } protected bool m_Enabled = false; - protected Scene m_scene; + public Scene Scene { get; private set; } - private Dictionary m_agentsInTransit; + /// + /// Handles recording and manipulation of state for entities that are in transfer within or between regions + /// (cross or teleport). + /// + private EntityTransferStateMachine m_entityTransferStateMachine; private ExpiringCache> m_bannedRegions = new ExpiringCache>(); @@ -133,8 +114,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer IConfig transferConfig = source.Configs["EntityTransfer"]; if (transferConfig != null) { - EnableWaitForCallbackFromTeleportDest - = transferConfig.GetBoolean("wait_for_callback", EnableWaitForCallbackFromTeleportDestDefault); + WaitForAgentArrivedAtDestination + = transferConfig.GetBoolean("wait_for_callback", WaitForAgentArrivedAtDestinationDefault); MaxTransferDistance = transferConfig.GetInt("max_distance", DefaultMaxTransferDistance); } @@ -143,7 +124,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer MaxTransferDistance = DefaultMaxTransferDistance; } - m_agentsInTransit = new Dictionary(); + m_entityTransferStateMachine = new EntityTransferStateMachine(this); + m_Enabled = true; } @@ -156,7 +138,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer if (!m_Enabled) return; - m_scene = scene; + Scene = scene; scene.RegisterModuleInterface(this); scene.EventManager.OnNewClient += OnNewClient; @@ -177,7 +159,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer if (!m_Enabled) return; - m_eqModule = m_scene.RequestModuleInterface(); + m_eqModule = Scene.RequestModuleInterface(); } #endregion @@ -226,7 +208,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer e.Message, e.StackTrace); // Make sure that we clear the in-transit flag so that future teleport attempts don't always fail. - ResetFromTransit(sp.UUID); + m_entityTransferStateMachine.ResetFromTransit(sp.UUID); sp.ControllingClient.SendTeleportFailed("Internal error"); } @@ -245,7 +227,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer "[ENTITY TRANSFER MODULE]: Teleport for {0} to {1} within {2}", sp.Name, position, sp.Scene.RegionInfo.RegionName); - if (!SetInTransit(sp.UUID)) + if (!m_entityTransferStateMachine.SetInTransit(sp.UUID)) { m_log.DebugFormat( "[ENTITY TRANSFER MODULE]: Ignoring within region teleport request of {0} {1} to {2} - agent is already in transit.", @@ -282,7 +264,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer position.Z = newPosZ; } - UpdateInTransit(sp.UUID, AgentTransferState.Transferring); + m_entityTransferStateMachine.UpdateInTransit(sp.UUID, AgentTransferState.Transferring); sp.ControllingClient.SendTeleportStart(teleportFlags); @@ -290,15 +272,15 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer sp.Velocity = Vector3.Zero; sp.Teleport(position); - UpdateInTransit(sp.UUID, AgentTransferState.ReceivedAtDestination); + m_entityTransferStateMachine.UpdateInTransit(sp.UUID, AgentTransferState.ReceivedAtDestination); foreach (SceneObjectGroup grp in sp.GetAttachments()) { sp.Scene.EventManager.TriggerOnScriptChangedEvent(grp.LocalId, (uint)Changed.TELEPORT); } - UpdateInTransit(sp.UUID, AgentTransferState.CleaningUp); - ResetFromTransit(sp.UUID); + m_entityTransferStateMachine.UpdateInTransit(sp.UUID, AgentTransferState.CleaningUp); + m_entityTransferStateMachine.ResetFromTransit(sp.UUID); } /// @@ -316,7 +298,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer { uint x = 0, y = 0; Utils.LongToUInts(regionHandle, out x, out y); - GridRegion reg = m_scene.GridService.GetRegionByPosition(sp.Scene.RegionInfo.ScopeID, (int)x, (int)y); + GridRegion reg = Scene.GridService.GetRegionByPosition(sp.Scene.RegionInfo.ScopeID, (int)x, (int)y); if (reg != null) { @@ -398,7 +380,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer { // Record that this agent is in transit so that we can prevent simultaneous requests and do later detection // of whether the destination region completes the teleport. - if (!SetInTransit(sp.UUID)) + if (!m_entityTransferStateMachine.SetInTransit(sp.UUID)) { m_log.DebugFormat( "[ENTITY TRANSFER MODULE]: Ignoring teleport request of {0} {1} to {2} ({3}) {4}/{5} - agent is already in transit.", @@ -410,7 +392,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer if (reg == null || finalDestination == null) { sp.ControllingClient.SendTeleportFailed("Unable to locate destination"); - ResetFromTransit(sp.UUID); + m_entityTransferStateMachine.ResetFromTransit(sp.UUID); return; } @@ -431,7 +413,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer sourceRegion.RegionName, sourceRegion.RegionLocX, sourceRegion.RegionLocY, MaxTransferDistance)); - ResetFromTransit(sp.UUID); + m_entityTransferStateMachine.ResetFromTransit(sp.UUID); return; } @@ -451,7 +433,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer if (endPoint.Address == null) { sp.ControllingClient.SendTeleportFailed("Remote Region appears to be down"); - ResetFromTransit(sp.UUID); + m_entityTransferStateMachine.ResetFromTransit(sp.UUID); return; } @@ -469,11 +451,11 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer string reason; string version; - if (!m_scene.SimulationService.QueryAccess( + if (!Scene.SimulationService.QueryAccess( finalDestination, sp.ControllingClient.AgentId, Vector3.Zero, out version, out reason)) { sp.ControllingClient.SendTeleportFailed(reason); - ResetFromTransit(sp.UUID); + m_entityTransferStateMachine.ResetFromTransit(sp.UUID); m_log.DebugFormat( "[ENTITY TRANSFER MODULE]: {0} was stopped from teleporting from {1} to {2} because {3}", @@ -527,7 +509,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer if (!CreateAgent(sp, reg, finalDestination, agentCircuit, teleportFlags, out reason, out logout)) { sp.ControllingClient.SendTeleportFailed(String.Format("Teleport refused: {0}", reason)); - ResetFromTransit(sp.UUID); + m_entityTransferStateMachine.ResetFromTransit(sp.UUID); m_log.DebugFormat( "[ENTITY TRANSFER MODULE]: Teleport of {0} from {1} to {2} was refused because {3}", @@ -537,7 +519,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer } // Past this point we have to attempt clean up if the teleport fails, so update transfer state. - UpdateInTransit(sp.UUID, AgentTransferState.Transferring); + m_entityTransferStateMachine.UpdateInTransit(sp.UUID, AgentTransferState.Transferring); // OK, it got this agent. Let's close some child agents sp.CloseChildAgents(newRegionX, newRegionY); @@ -619,7 +601,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer // TeleportFinish makes the client send CompleteMovementIntoRegion (at the destination), which // trigers a whole shebang of things there, including MakeRoot. So let's wait for confirmation // that the client contacted the destination before we close things here. - if (EnableWaitForCallbackFromTeleportDest && !WaitForCallback(sp.UUID)) + if (!m_entityTransferStateMachine.WaitForAgentArrivedAtDestination(sp.UUID)) { m_log.WarnFormat( "[ENTITY TRANSFER MODULE]: Teleport of {0} to {1} from {2} failed due to no callback from destination region. Returning avatar to source region.", @@ -629,7 +611,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer return; } - UpdateInTransit(sp.UUID, AgentTransferState.CleaningUp); + m_entityTransferStateMachine.UpdateInTransit(sp.UUID, AgentTransferState.CleaningUp); // For backwards compatibility if (version == "Unknown" || version == string.Empty) @@ -679,12 +661,12 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer sp.UUID); } - ResetFromTransit(sp.UUID); + m_entityTransferStateMachine.ResetFromTransit(sp.UUID); } protected virtual void Fail(ScenePresence sp, GridRegion finalDestination, bool logout) { - UpdateInTransit(sp.UUID, AgentTransferState.CleaningUp); + m_entityTransferStateMachine.UpdateInTransit(sp.UUID, AgentTransferState.CleaningUp); // Client never contacted destination. Let's restore everything back sp.ControllingClient.SendTeleportFailed("Problems connecting to destination."); @@ -696,17 +678,17 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer EnableChildAgents(sp); // Finally, kill the agent we just created at the destination. - m_scene.SimulationService.CloseAgent(finalDestination, sp.UUID); + Scene.SimulationService.CloseAgent(finalDestination, sp.UUID); sp.Scene.EventManager.TriggerTeleportFail(sp.ControllingClient, logout); - ResetFromTransit(sp.UUID); + m_entityTransferStateMachine.ResetFromTransit(sp.UUID); } protected virtual bool CreateAgent(ScenePresence sp, GridRegion reg, GridRegion finalDestination, AgentCircuitData agentCircuit, uint teleportFlags, out string reason, out bool logout) { logout = false; - bool success = m_scene.SimulationService.CreateAgent(finalDestination, agentCircuit, teleportFlags, out reason); + bool success = Scene.SimulationService.CreateAgent(finalDestination, agentCircuit, teleportFlags, out reason); if (success) sp.Scene.EventManager.TriggerTeleportStart(sp.ControllingClient, reg, finalDestination, teleportFlags, logout); @@ -716,7 +698,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer protected virtual bool UpdateAgent(GridRegion reg, GridRegion finalDestination, AgentData agent) { - return m_scene.SimulationService.UpdateAgent(finalDestination, agent); + return Scene.SimulationService.UpdateAgent(finalDestination, agent); } protected virtual void SetCallbackURL(AgentData agent, RegionInfo region) @@ -779,7 +761,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer /// public virtual void RequestTeleportLandmark(IClientAPI remoteClient, AssetLandmark lm) { - GridRegion info = m_scene.GridService.GetRegionByUUID(UUID.Zero, lm.RegionID); + GridRegion info = Scene.GridService.GetRegionByUUID(UUID.Zero, lm.RegionID); if (info == null) { @@ -800,12 +782,12 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer m_log.DebugFormat( "[ENTITY TRANSFER MODULE]: Request to teleport {0} {1} home", client.Name, client.AgentId); - //OpenSim.Services.Interfaces.PresenceInfo pinfo = m_scene.PresenceService.GetAgent(client.SessionId); - GridUserInfo uinfo = m_scene.GridUserService.GetGridUserInfo(client.AgentId.ToString()); + //OpenSim.Services.Interfaces.PresenceInfo pinfo = Scene.PresenceService.GetAgent(client.SessionId); + GridUserInfo uinfo = Scene.GridUserService.GetGridUserInfo(client.AgentId.ToString()); if (uinfo != null) { - GridRegion regionInfo = m_scene.GridService.GetRegionByUUID(UUID.Zero, uinfo.HomeRegionID); + GridRegion regionInfo = Scene.GridService.GetRegionByUUID(UUID.Zero, uinfo.HomeRegionID); if (regionInfo == null) { // can't find the Home region: Tell viewer and abort @@ -1114,7 +1096,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer try { - SetInTransit(agent.UUID); + m_entityTransferStateMachine.SetInTransit(agent.UUID); ulong neighbourHandle = Utils.UIntsToLong((uint)(neighbourx * Constants.RegionSize), (uint)(neighboury * Constants.RegionSize)); @@ -1144,16 +1126,16 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer cAgent.CallbackURI = String.Empty; // Beyond this point, extra cleanup is needed beyond removing transit state - UpdateInTransit(agent.UUID, AgentTransferState.Transferring); + m_entityTransferStateMachine.UpdateInTransit(agent.UUID, AgentTransferState.Transferring); if (!m_scene.SimulationService.UpdateAgent(neighbourRegion, cAgent)) { // region doesn't take it - UpdateInTransit(agent.UUID, AgentTransferState.CleaningUp); + m_entityTransferStateMachine.UpdateInTransit(agent.UUID, AgentTransferState.CleaningUp); ReInstantiateScripts(agent); agent.AddToPhysicalScene(isFlying); - ResetFromTransit(agent.UUID); + m_entityTransferStateMachine.ResetFromTransit(agent.UUID); return agent; } @@ -1191,16 +1173,16 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer } // SUCCESS! - UpdateInTransit(agent.UUID, AgentTransferState.ReceivedAtDestination); + m_entityTransferStateMachine.UpdateInTransit(agent.UUID, AgentTransferState.ReceivedAtDestination); // Unlike a teleport, here we do not wait for the destination region to confirm the receipt. - UpdateInTransit(agent.UUID, AgentTransferState.CleaningUp); + m_entityTransferStateMachine.UpdateInTransit(agent.UUID, AgentTransferState.CleaningUp); agent.MakeChildAgent(); // FIXME: Possibly this should occur lower down after other commands to close other agents, // but not sure yet what the side effects would be. - ResetFromTransit(agent.UUID); + m_entityTransferStateMachine.ResetFromTransit(agent.UUID); // now we have a child agent in this region. Request all interesting data about other (root) agents agent.SendOtherAgentsAvatarDataToMe(); @@ -1675,41 +1657,11 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer #endregion - #region Agent Arrived + public void AgentArrivedAtDestination(UUID id) { - lock (m_agentsInTransit) - { - if (!m_agentsInTransit.ContainsKey(id)) - { - m_log.WarnFormat( - "[ENTITY TRANSFER MODULE]: Region {0} received notification of arrival in destination scene of agent {1} but no teleport request is active", - m_scene.RegionInfo.RegionName, id); - - return; - } - - AgentTransferState currentState = m_agentsInTransit[id]; - - if (currentState == AgentTransferState.ReceivedAtDestination) - { - // An anomoly but don't make this an outright failure - destination region could be overzealous in sending notification. - m_log.WarnFormat( - "[ENTITY TRANSFER MODULE]: Region {0} received notification of arrival in destination scene of agent {1} but notification has already previously been received", - m_scene.RegionInfo.RegionName, id); - } - else if (currentState != AgentTransferState.Transferring) - { - m_log.ErrorFormat( - "[ENTITY TRANSFER MODULE]: Region {0} received notification of arrival in destination scene of agent {1} but agent is in transfer state {2}", - m_scene.RegionInfo.RegionName, id, currentState); - - return; - } - - m_agentsInTransit[id] = AgentTransferState.ReceivedAtDestination; - } + m_entityTransferStateMachine.SetAgentArrivedAtDestination(id); } #endregion @@ -1979,8 +1931,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer //// And the new channel... //if (m_interregionCommsOut != null) // successYN = m_interregionCommsOut.SendCreateObject(newRegionHandle, grp, true); - if (m_scene.SimulationService != null) - successYN = m_scene.SimulationService.CreateObject(destination, newPosition, grp, true); + if (Scene.SimulationService != null) + successYN = Scene.SimulationService.CreateObject(destination, newPosition, grp, true); if (successYN) { @@ -2051,139 +2003,9 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer #region Misc - private bool WaitForCallback(UUID id) - { - lock (m_agentsInTransit) - { - if (!IsInTransit(id)) - throw new Exception( - string.Format( - "Asked to wait for destination callback for agent with ID {0} but it is not in transit")); - - AgentTransferState currentState = m_agentsInTransit[id]; - - if (currentState != AgentTransferState.Transferring && currentState != AgentTransferState.ReceivedAtDestination) - throw new Exception( - string.Format( - "Asked to wait for destination callback for agent with ID {0} but it is in state {1}", - currentState)); - } - - int count = 200; - - // There should be no race condition here since no other code should be removing the agent transfer or - // changing the state to another other than Transferring => ReceivedAtDestination. - while (m_agentsInTransit[id] != AgentTransferState.ReceivedAtDestination && count-- > 0) - { -// m_log.Debug(" >>> Waiting... " + count); - Thread.Sleep(100); - } - - return count > 0; - } - - /// - /// Set that an agent is in transit. - /// - /// The ID of the agent being teleported - /// true if the agent was not already in transit, false if it was - private bool SetInTransit(UUID id) - { - lock (m_agentsInTransit) - { - if (!m_agentsInTransit.ContainsKey(id)) - { - m_agentsInTransit[id] = AgentTransferState.Preparing; - return true; - } - } - - return false; - } - - /// - /// Updates the state of an agent that is already in transit. - /// - /// - /// - /// - /// Illegal transitions will throw an Exception - private void UpdateInTransit(UUID id, AgentTransferState newState) - { - lock (m_agentsInTransit) - { - // Illegal to try and update an agent that's not actually in transit. - if (!m_agentsInTransit.ContainsKey(id)) - throw new Exception(string.Format("Agent with ID {0} is not registered as in transit", id)); - - AgentTransferState oldState = m_agentsInTransit[id]; - - bool transitionOkay = false; - - if (newState == AgentTransferState.CleaningUp && oldState != AgentTransferState.CleaningUp) - transitionOkay = true; - else if (newState == AgentTransferState.Transferring && oldState == AgentTransferState.Preparing) - transitionOkay = true; - else if (newState == AgentTransferState.ReceivedAtDestination && oldState == AgentTransferState.Transferring) - transitionOkay = true; - - if (transitionOkay) - m_agentsInTransit[id] = newState; - else - throw new Exception( - string.Format( - "Agent with ID {0} is not allowed to move from old transit state {1} to new state {2}", - id, oldState, newState)); - } - } - public bool IsInTransit(UUID id) { - lock (m_agentsInTransit) - return m_agentsInTransit.ContainsKey(id); - } - - /// - /// Removes an agent from the transit state machine. - /// - /// - /// true if the agent was flagged as being teleported when this method was called, false otherwise - private bool ResetFromTransit(UUID id) - { - lock (m_agentsInTransit) - { - if (m_agentsInTransit.ContainsKey(id)) - { - AgentTransferState state = m_agentsInTransit[id]; - - if (state == AgentTransferState.Transferring || state == AgentTransferState.ReceivedAtDestination) - { - // FIXME: For now, we allow exit from any state since a thrown exception in teleport is now guranteed - // to be handled properly - ResetFromTransit() could be invoked at any step along the process - m_log.WarnFormat( - "[ENTITY TRANSFER MODULE]: Agent with ID {0} should not exit directly from state {1}, should go to {2} state first", - id, state, AgentTransferState.CleaningUp); - -// throw new Exception( -// "Agent with ID {0} cannot exit directly from state {1}, it must go to {2} state first", -// state, AgentTransferState.CleaningUp); - } - - m_agentsInTransit.Remove(id); - - m_log.DebugFormat( - "[ENTITY TRANSFER MODULE]: Agent {0} cleared from transit in {1}", - id, m_scene.RegionInfo.RegionName); - - return true; - } - } - - m_log.WarnFormat( - "[ENTITY TRANSFER MODULE]: Agent {0} requested to clear from transit in {1} but was already cleared.", - id, m_scene.RegionInfo.RegionName); - - return false; + return m_entityTransferStateMachine.IsInTransit(id); } protected void ReInstantiateScripts(ScenePresence sp) diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferStateMachine.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferStateMachine.cs new file mode 100644 index 0000000000..d0cab49563 --- /dev/null +++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferStateMachine.cs @@ -0,0 +1,269 @@ +/* + * Copyright (c) Contributors, http://opensimulator.org/ + * See CONTRIBUTORS.TXT for a full list of copyright holders. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the OpenSimulator Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using System; +using System.Collections.Generic; +using System.Net; +using System.Reflection; +using System.Threading; +using OpenMetaverse; +using log4net; +using Nini.Config; +using OpenSim.Framework; +using OpenSim.Framework.Capabilities; +using OpenSim.Framework.Client; +using OpenSim.Region.Framework.Interfaces; +using OpenSim.Region.Framework.Scenes; +using OpenSim.Region.Physics.Manager; +using OpenSim.Services.Interfaces; +using GridRegion = OpenSim.Services.Interfaces.GridRegion; + +namespace OpenSim.Region.CoreModules.Framework.EntityTransfer +{ + /// + /// The possible states that an agent can be in when its being transferred between regions. + /// + /// + /// This is a state machine. + /// + /// [Entry] => Preparing + /// Preparing => { Transferring || CleaningUp || [Exit] } + /// Transferring => { ReceivedAtDestination || CleaningUp } + /// ReceivedAtDestination => CleaningUp + /// CleaningUp => [Exit] + /// + /// In other words, agents normally travel throwing Preparing => Transferring => ReceivedAtDestination => CleaningUp + /// However, any state can transition to CleaningUp if the teleport has failed. + /// + enum AgentTransferState + { + Preparing, // The agent is being prepared for transfer + Transferring, // The agent is in the process of being transferred to a destination + ReceivedAtDestination, // The destination has notified us that the agent has been successfully received + CleaningUp // The agent is being changed to child/removed after a transfer + } + + /// + /// Records the state of entities when they are in transfer within or between regions (cross or teleport). + /// + public class EntityTransferStateMachine + { + private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + + /// + /// If true then on a teleport, the source region waits for a callback from the destination region. If + /// a callback fails to arrive within a set time then the user is pulled back into the source region. + /// + public bool EnableWaitForAgentArrivedAtDestination { get; set; } + + private EntityTransferModule m_mod; + + private Dictionary m_agentsInTransit = new Dictionary(); + + public EntityTransferStateMachine(EntityTransferModule module) + { + m_mod = module; + } + + /// + /// Set that an agent is in transit. + /// + /// The ID of the agent being teleported + /// true if the agent was not already in transit, false if it was + internal bool SetInTransit(UUID id) + { + lock (m_agentsInTransit) + { + if (!m_agentsInTransit.ContainsKey(id)) + { + m_agentsInTransit[id] = AgentTransferState.Preparing; + return true; + } + } + + return false; + } + + /// + /// Updates the state of an agent that is already in transit. + /// + /// + /// + /// + /// Illegal transitions will throw an Exception + internal void UpdateInTransit(UUID id, AgentTransferState newState) + { + lock (m_agentsInTransit) + { + // Illegal to try and update an agent that's not actually in transit. + if (!m_agentsInTransit.ContainsKey(id)) + throw new Exception( + string.Format( + "Agent with ID {0} is not registered as in transit in {1}", + id, m_mod.Scene.RegionInfo.RegionName)); + + AgentTransferState oldState = m_agentsInTransit[id]; + + bool transitionOkay = false; + + if (newState == AgentTransferState.CleaningUp && oldState != AgentTransferState.CleaningUp) + transitionOkay = true; + else if (newState == AgentTransferState.Transferring && oldState == AgentTransferState.Preparing) + transitionOkay = true; + else if (newState == AgentTransferState.ReceivedAtDestination && oldState == AgentTransferState.Transferring) + transitionOkay = true; + + if (transitionOkay) + m_agentsInTransit[id] = newState; + else + throw new Exception( + string.Format( + "Agent with ID {0} is not allowed to move from old transit state {1} to new state {2} in {3}", + id, oldState, newState, m_mod.Scene.RegionInfo.RegionName)); + } + } + + internal bool IsInTransit(UUID id) + { + lock (m_agentsInTransit) + return m_agentsInTransit.ContainsKey(id); + } + + /// + /// Removes an agent from the transit state machine. + /// + /// + /// true if the agent was flagged as being teleported when this method was called, false otherwise + internal bool ResetFromTransit(UUID id) + { + lock (m_agentsInTransit) + { + if (m_agentsInTransit.ContainsKey(id)) + { + AgentTransferState state = m_agentsInTransit[id]; + + if (state == AgentTransferState.Transferring || state == AgentTransferState.ReceivedAtDestination) + { + // FIXME: For now, we allow exit from any state since a thrown exception in teleport is now guranteed + // to be handled properly - ResetFromTransit() could be invoked at any step along the process + m_log.WarnFormat( + "[ENTITY TRANSFER STATE MACHINE]: Agent with ID {0} should not exit directly from state {1}, should go to {2} state first in {3}", + id, state, AgentTransferState.CleaningUp, m_mod.Scene.RegionInfo.RegionName); + +// throw new Exception( +// "Agent with ID {0} cannot exit directly from state {1}, it must go to {2} state first", +// state, AgentTransferState.CleaningUp); + } + + m_agentsInTransit.Remove(id); + + m_log.DebugFormat( + "[ENTITY TRANSFER STATE MACHINE]: Agent {0} cleared from transit in {1}", + id, m_mod.Scene.RegionInfo.RegionName); + + return true; + } + } + + m_log.WarnFormat( + "[ENTITY TRANSFER STATE MACHINE]: Agent {0} requested to clear from transit in {1} but was already cleared", + id, m_mod.Scene.RegionInfo.RegionName); + + return false; + } + + internal bool WaitForAgentArrivedAtDestination(UUID id) + { + if (!m_mod.WaitForAgentArrivedAtDestination) + return true; + + lock (m_agentsInTransit) + { + if (!IsInTransit(id)) + throw new Exception( + string.Format( + "Asked to wait for destination callback for agent with ID {0} in {1} but agent is not in transit", + id, m_mod.Scene.RegionInfo.RegionName)); + + AgentTransferState currentState = m_agentsInTransit[id]; + + if (currentState != AgentTransferState.Transferring && currentState != AgentTransferState.ReceivedAtDestination) + throw new Exception( + string.Format( + "Asked to wait for destination callback for agent with ID {0} in {1} but agent is in state {2}", + id, m_mod.Scene.RegionInfo.RegionName, currentState)); + } + + int count = 200; + + // There should be no race condition here since no other code should be removing the agent transfer or + // changing the state to another other than Transferring => ReceivedAtDestination. + while (m_agentsInTransit[id] != AgentTransferState.ReceivedAtDestination && count-- > 0) + { +// m_log.Debug(" >>> Waiting... " + count); + Thread.Sleep(100); + } + + return count > 0; + } + + internal void SetAgentArrivedAtDestination(UUID id) + { + lock (m_agentsInTransit) + { + if (!m_agentsInTransit.ContainsKey(id)) + { + m_log.WarnFormat( + "[ENTITY TRANSFER STATE MACHINE]: Region {0} received notification of arrival in destination of agent {1} but no teleport request is active", + m_mod.Scene.RegionInfo.RegionName, id); + + return; + } + + AgentTransferState currentState = m_agentsInTransit[id]; + + if (currentState == AgentTransferState.ReceivedAtDestination) + { + // An anomoly but don't make this an outright failure - destination region could be overzealous in sending notification. + m_log.WarnFormat( + "[ENTITY TRANSFER STATE MACHINE]: Region {0} received notification of arrival in destination of agent {1} but notification has already previously been received", + m_mod.Scene.RegionInfo.RegionName, id); + } + else if (currentState != AgentTransferState.Transferring) + { + m_log.ErrorFormat( + "[ENTITY TRANSFER STATE MACHINE]: Region {0} received notification of arrival in destination of agent {1} but agent is in state {2}", + m_mod.Scene.RegionInfo.RegionName, id, currentState); + + return; + } + + m_agentsInTransit[id] = AgentTransferState.ReceivedAtDestination; + } + } + } +} \ No newline at end of file diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs index 0fdd4578a9..43a72e279d 100644 --- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs +++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs @@ -117,7 +117,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer protected override GridRegion GetFinalDestination(GridRegion region) { - int flags = m_scene.GridService.GetRegionFlags(m_scene.RegionInfo.ScopeID, region.RegionID); + int flags = Scene.GridService.GetRegionFlags(Scene.RegionInfo.ScopeID, region.RegionID); m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: region {0} flags: {1}", region.RegionID, flags); if ((flags & (int)OpenSim.Data.RegionFlags.Hyperlink) != 0) @@ -139,7 +139,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer if (base.NeedsClosing(drawdist, oldRegionX, newRegionX, oldRegionY, newRegionY, reg)) return true; - int flags = m_scene.GridService.GetRegionFlags(m_scene.RegionInfo.ScopeID, reg.RegionID); + int flags = Scene.GridService.GetRegionFlags(Scene.RegionInfo.ScopeID, reg.RegionID); if (flags == -1 /* no region in DB */ || (flags & (int)OpenSim.Data.RegionFlags.Hyperlink) != 0) return true; @@ -152,7 +152,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer if (logout) { // Log them out of this grid - m_scene.PresenceService.LogoutAgent(sp.ControllingClient.SessionId); + Scene.PresenceService.LogoutAgent(sp.ControllingClient.SessionId); } } @@ -161,7 +161,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: CreateAgent {0} {1}", reg.ServerURI, finalDestination.ServerURI); reason = string.Empty; logout = false; - int flags = m_scene.GridService.GetRegionFlags(m_scene.RegionInfo.ScopeID, reg.RegionID); + int flags = Scene.GridService.GetRegionFlags(Scene.RegionInfo.ScopeID, reg.RegionID); if (flags == -1 /* no region in DB */ || (flags & (int)OpenSim.Data.RegionFlags.Hyperlink) != 0) { // this user is going to another grid @@ -201,7 +201,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer "[ENTITY TRANSFER MODULE]: Request to teleport {0} {1} home", client.Name, client.AgentId); // Let's find out if this is a foreign user or a local user - IUserManagement uMan = m_scene.RequestModuleInterface(); + IUserManagement uMan = Scene.RequestModuleInterface(); if (uMan != null && uMan.IsLocalGridUser(id)) { // local grid user @@ -265,7 +265,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer return; } - GridRegion info = m_scene.GridService.GetRegionByUUID(UUID.Zero, lm.RegionID); + GridRegion info = Scene.GridService.GetRegionByUUID(UUID.Zero, lm.RegionID); // Local region? if (info != null) @@ -335,8 +335,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer } // Let's find out if this is a foreign user or a local user - IUserManagement uMan = m_scene.RequestModuleInterface(); -// UserAccount account = m_scene.UserAccountService.GetUserAccount(m_scene.RegionInfo.ScopeID, obj.AgentId); + IUserManagement uMan = Scene.RequestModuleInterface(); +// UserAccount account = Scene.UserAccountService.GetUserAccount(Scene.RegionInfo.ScopeID, obj.AgentId); if (uMan != null && uMan.IsLocalGridUser(obj.AgentId)) { // local grid user From c46b31a9b4cc8a1a731b0e109cd2ebd52c1425d6 Mon Sep 17 00:00:00 2001 From: Melanie Date: Tue, 29 May 2012 16:58:08 +0200 Subject: [PATCH 290/547] Re-add script collisions that were lost in a merge --- OpenSim/Region/Framework/Scenes/ScenePresence.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index 225d4c9c02..1adf13ee24 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs @@ -3513,6 +3513,8 @@ namespace OpenSim.Region.Framework.Scenes } } + RaiseCollisionScriptEvents(coldata); + // Gods do not take damage and Invulnerable is set depending on parcel/region flags if (Invulnerable || GodLevel > 0) return; From b660c4991bf5982bc22690357e2dd6a4b015d9e9 Mon Sep 17 00:00:00 2001 From: Melanie Date: Tue, 29 May 2012 18:18:47 +0100 Subject: [PATCH 291/547] Fix collision filtering. The filter should be checked on the receiving part! --- .../Region/Framework/Scenes/SceneObjectPart.cs | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index dc76d22931..17c766191f 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs @@ -2023,21 +2023,21 @@ namespace OpenSim.Region.Framework.Scenes { } - private bool CollisionFilteredOut(SceneObjectPart dest, UUID objectID, string objectName) + public bool CollisionFilteredOut(UUID objectID, string objectName) { - if(dest.CollisionFilter.Count == 0) + if(CollisionFilter.Count == 0) return false; - if (dest.CollisionFilter.ContainsValue(objectID.ToString()) || - dest.CollisionFilter.ContainsValue(objectID.ToString() + objectName) || - dest.CollisionFilter.ContainsValue(UUID.Zero.ToString() + objectName)) + if (CollisionFilter.ContainsValue(objectID.ToString()) || + CollisionFilter.ContainsValue(objectID.ToString() + objectName) || + CollisionFilter.ContainsValue(UUID.Zero.ToString() + objectName)) { - if (dest.CollisionFilter.ContainsKey(1)) + if (CollisionFilter.ContainsKey(1)) return false; return true; } - if (dest.CollisionFilter.ContainsKey(1)) + if (CollisionFilter.ContainsKey(1)) return true; return false; @@ -2100,7 +2100,7 @@ namespace OpenSim.Region.Framework.Scenes SceneObjectPart obj = ParentGroup.Scene.GetSceneObjectPart(localId); if (obj != null) { - if (!dest.CollisionFilteredOut(this, obj.UUID, obj.Name)) + if (!dest.CollisionFilteredOut(obj.UUID, obj.Name)) colliding.Add(CreateDetObject(obj)); } else @@ -2108,7 +2108,7 @@ namespace OpenSim.Region.Framework.Scenes ScenePresence av = ParentGroup.Scene.GetScenePresence(localId); if (av != null && (!av.IsChildAgent)) { - if (!dest.CollisionFilteredOut(this, av.UUID, av.Name)) + if (!dest.CollisionFilteredOut(av.UUID, av.Name)) colliding.Add(CreateDetObject(av)); } } From bf0b8170f7617fe9524b691b59ca7a7b660aec30 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Tue, 29 May 2012 23:35:20 +0100 Subject: [PATCH 292/547] Add console command "teleport user" to allow teleport from the region console See "help teleport user" on the console for more details --- .../Avatar/Commands/UserCommandsModule.cs | 189 ++++++++++++++++++ 1 file changed, 189 insertions(+) create mode 100644 OpenSim/Region/CoreModules/Avatar/Commands/UserCommandsModule.cs diff --git a/OpenSim/Region/CoreModules/Avatar/Commands/UserCommandsModule.cs b/OpenSim/Region/CoreModules/Avatar/Commands/UserCommandsModule.cs new file mode 100644 index 0000000000..4bcd2ac499 --- /dev/null +++ b/OpenSim/Region/CoreModules/Avatar/Commands/UserCommandsModule.cs @@ -0,0 +1,189 @@ +/* + * Copyright (c) Contributors, http://opensimulator.org/ + * See CONTRIBUTORS.TXT for a full list of copyright holders. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the OpenSimulator Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using System; +using System.Collections.Generic; +using System.Reflection; +using System.Text; +using System.Text.RegularExpressions; +using log4net; +using Mono.Addins; +using NDesk.Options; +using Nini.Config; +using OpenMetaverse; +using OpenSim.Framework; +using OpenSim.Framework.Console; +using OpenSim.Framework.Statistics; +using OpenSim.Region.Framework.Interfaces; +using OpenSim.Region.Framework.Scenes; + +namespace OpenSim.Region.CoreModules.Avatars.Commands +{ + /// + /// A module that holds commands for manipulating objects in the scene. + /// + [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "UserCommandsModule")] + public class UserCommandsModule : ISharedRegionModule + { +// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + + public const string TeleportUserCommandSyntax = "teleport user "; + + public static Regex InterRegionDestinationRegex + = new Regex(@"^(?.+)/(?\d+)/(?\d+)/(?\d+)$", RegexOptions.Compiled); + + public static Regex WithinRegionDestinationRegex + = new Regex(@"^(?\d+)/(?\d+)/(?\d+)$", RegexOptions.Compiled); + + private Dictionary m_scenes = new Dictionary(); + + public string Name { get { return "User Commands Module"; } } + + public Type ReplaceableInterface { get { return null; } } + + public void Initialise(IConfigSource source) + { +// m_log.DebugFormat("[USER COMMANDS MODULE]: INITIALIZED MODULE"); + } + + public void PostInitialise() + { +// m_log.DebugFormat("[USER COMMANDS MODULE]: POST INITIALIZED MODULE"); + } + + public void Close() + { +// m_log.DebugFormat("[USER COMMANDS MODULE]: CLOSED MODULE"); + } + + public void AddRegion(Scene scene) + { +// m_log.DebugFormat("[USER COMMANDS MODULE]: REGION {0} ADDED", scene.RegionInfo.RegionName); + + lock (m_scenes) + m_scenes[scene.RegionInfo.RegionID] = scene; + + scene.AddCommand( + "Users", + this, + "teleport user", + TeleportUserCommandSyntax, + "Teleport a user in this simulator to the given destination", + " is in format []///, e.g. regionone/20/30/40 or just 20/30/40 to teleport within same region." + + "\nIf the region contains a space then the whole destination must be in quotes, e.g. \"region one/20/30/40\"", + HandleTeleportUser); + } + + public void RemoveRegion(Scene scene) + { +// m_log.DebugFormat("[USER COMMANDS MODULE]: REGION {0} REMOVED", scene.RegionInfo.RegionName); + + lock (m_scenes) + m_scenes.Remove(scene.RegionInfo.RegionID); + } + + public void RegionLoaded(Scene scene) + { +// m_log.DebugFormat("[USER COMMANDS MODULE]: REGION {0} LOADED", scene.RegionInfo.RegionName); + } + + private ScenePresence GetUser(string firstName, string lastName) + { + ScenePresence userFound = null; + + lock (m_scenes) + { + foreach (Scene scene in m_scenes.Values) + { + ScenePresence user = scene.GetScenePresence(firstName, lastName); + if (user != null && !user.IsChildAgent) + { + userFound = user; + break; + } + } + } + + return userFound; + } + + private void HandleTeleportUser(string module, string[] cmd) + { + if (cmd.Length < 5) + { + MainConsole.Instance.OutputFormat("Usage: " + TeleportUserCommandSyntax); + return; + } + + string firstName = cmd[2]; + string lastName = cmd[3]; + string rawDestination = cmd[4]; + + ScenePresence user = GetUser(firstName, lastName); + + if (user == null) + { + MainConsole.Instance.OutputFormat("No user found with name {0} {1}", firstName, lastName); + return; + } + +// MainConsole.Instance.OutputFormat("rawDestination [{0}]", rawDestination); + + Match m = WithinRegionDestinationRegex.Match(rawDestination); + + if (!m.Success) + { + m = InterRegionDestinationRegex.Match(rawDestination); + + if (!m.Success) + { + MainConsole.Instance.OutputFormat("Invalid destination {0}", rawDestination); + return; + } + } + + string regionName + = m.Groups["regionName"].Success ? m.Groups["regionName"].Value : user.Scene.RegionInfo.RegionName; + + MainConsole.Instance.OutputFormat( + "Teleporting {0} to {1},{2},{3} in {4}", + user.Name, + m.Groups["x"], m.Groups["y"], m.Groups["z"], + regionName); + + user.Scene.RequestTeleportLocation( + user.ControllingClient, + regionName, + new Vector3( + float.Parse(m.Groups["x"].Value), + float.Parse(m.Groups["y"].Value), + float.Parse(m.Groups["z"].Value)), + user.Lookat, + (uint)TeleportFlags.ViaLocation); + } + } +} \ No newline at end of file From 0b02a4d42e989609a4e1ba39d2aee9a7f9655613 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 31 May 2012 01:52:26 +0100 Subject: [PATCH 293/547] Add an optional mechanism for physics modules to collect and return arbitrary stats. If active, the physics module can return arbitrary stat counters that can be seen via the MonitoringModule (http://opensimulator.org/wiki/Monitoring_Module) This is only active in OdeScene if collect_stats = true in [ODEPhysicsSettings]. This patch allows OdeScene to collect elapsed time information for calls to the ODE native collision methods to assess what proportion of time this takes compared to total physics processing. This data is returned as ODENativeCollisionFrameMS in the monitoring module, updated every 3 seconds. The performance effect of collecting stats is probably extremely minor, dwarfed by the rest of the physics code. --- OpenSim/Region/Application/OpenSim.cs | 3 +- .../Framework/Monitoring/MonitorModule.cs | 108 ++++++++------ .../Framework/Scenes/SimStatsReporter.cs | 48 +++++- .../Region/Physics/Manager/PhysicsScene.cs | 14 ++ OpenSim/Region/Physics/OdePlugin/OdeScene.cs | 139 ++++++++++++++++-- bin/OpenSimDefaults.ini | 30 ++-- 6 files changed, 271 insertions(+), 71 deletions(-) diff --git a/OpenSim/Region/Application/OpenSim.cs b/OpenSim/Region/Application/OpenSim.cs index 6796f2bd33..c0913c5296 100644 --- a/OpenSim/Region/Application/OpenSim.cs +++ b/OpenSim/Region/Application/OpenSim.cs @@ -28,6 +28,7 @@ using System; using System.Collections; using System.Collections.Generic; +using System.Diagnostics; using System.IO; using System.Reflection; using System.Text; @@ -138,7 +139,7 @@ namespace OpenSim m_log.Info("===================================================================="); m_log.Info("========================= STARTING OPENSIM ========================="); m_log.Info("===================================================================="); - + //m_log.InfoFormat("[OPENSIM MAIN]: GC Is Server GC: {0}", GCSettings.IsServerGC.ToString()); // http://msdn.microsoft.com/en-us/library/bb384202.aspx //GCSettings.LatencyMode = GCLatencyMode.Batch; diff --git a/OpenSim/Region/CoreModules/Framework/Monitoring/MonitorModule.cs b/OpenSim/Region/CoreModules/Framework/Monitoring/MonitorModule.cs index 7f8271d401..4a8c369335 100644 --- a/OpenSim/Region/CoreModules/Framework/Monitoring/MonitorModule.cs +++ b/OpenSim/Region/CoreModules/Framework/Monitoring/MonitorModule.cs @@ -49,7 +49,16 @@ namespace OpenSim.Region.CoreModules.Framework.Monitoring public bool Enabled { get; private set; } private Scene m_scene; - private readonly List m_monitors = new List(); + + /// + /// These are monitors where we know the static details in advance. + /// + /// + /// Dynamic monitors also exist (we don't know any of the details of what stats we get back here) + /// but these are currently hardcoded. + /// + private readonly List m_staticMonitors = new List(); + private readonly List m_alerts = new List(); private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); @@ -84,9 +93,18 @@ namespace OpenSim.Region.CoreModules.Framework.Monitoring public void DebugMonitors(string module, string[] args) { - foreach (IMonitor monitor in m_monitors) + foreach (IMonitor monitor in m_staticMonitors) { - m_log.Info("[MonitorModule]: " + m_scene.RegionInfo.RegionName + " reports " + monitor.GetFriendlyName() + " = " + monitor.GetFriendlyValue()); + m_log.InfoFormat( + "[MONITOR MODULE]: {0} reports {1} = {2}", + m_scene.RegionInfo.RegionName, monitor.GetFriendlyName(), monitor.GetFriendlyValue()); + } + + foreach (KeyValuePair tuple in m_scene.StatsReporter.GetExtraSimStats()) + { + m_log.InfoFormat( + "[MONITOR MODULE]: {0} reports {1} = {2}", + m_scene.RegionInfo.RegionName, tuple.Key, tuple.Value); } } @@ -106,11 +124,12 @@ namespace OpenSim.Region.CoreModules.Framework.Monitoring { string monID = (string) request["monitor"]; - foreach (IMonitor monitor in m_monitors) + foreach (IMonitor monitor in m_staticMonitors) { string elemName = monitor.ToString(); if (elemName.StartsWith(monitor.GetType().Namespace)) elemName = elemName.Substring(monitor.GetType().Namespace.Length + 1); + if (elemName == monID || monitor.ToString() == monID) { Hashtable ereply3 = new Hashtable(); @@ -123,6 +142,9 @@ namespace OpenSim.Region.CoreModules.Framework.Monitoring } } + // FIXME: Arguably this should also be done with dynamic monitors but I'm not sure what the above code + // is even doing. Why are we inspecting the type of the monitor??? + // No monitor with that name Hashtable ereply2 = new Hashtable(); @@ -134,12 +156,18 @@ namespace OpenSim.Region.CoreModules.Framework.Monitoring } string xml = ""; - foreach (IMonitor monitor in m_monitors) + foreach (IMonitor monitor in m_staticMonitors) { string elemName = monitor.GetName(); xml += "<" + elemName + ">" + monitor.GetValue().ToString() + ""; // m_log.DebugFormat("[MONITOR MODULE]: {0} = {1}", elemName, monitor.GetValue()); } + + foreach (KeyValuePair tuple in m_scene.StatsReporter.GetExtraSimStats()) + { + xml += "<" + tuple.Key + ">" + tuple.Value + ""; + } + xml += ""; Hashtable ereply = new Hashtable(); @@ -156,20 +184,20 @@ namespace OpenSim.Region.CoreModules.Framework.Monitoring if (!Enabled) return; - m_monitors.Add(new AgentCountMonitor(m_scene)); - m_monitors.Add(new ChildAgentCountMonitor(m_scene)); - m_monitors.Add(new GCMemoryMonitor()); - m_monitors.Add(new ObjectCountMonitor(m_scene)); - m_monitors.Add(new PhysicsFrameMonitor(m_scene)); - m_monitors.Add(new PhysicsUpdateFrameMonitor(m_scene)); - m_monitors.Add(new PWSMemoryMonitor()); - m_monitors.Add(new ThreadCountMonitor()); - m_monitors.Add(new TotalFrameMonitor(m_scene)); - m_monitors.Add(new EventFrameMonitor(m_scene)); - m_monitors.Add(new LandFrameMonitor(m_scene)); - m_monitors.Add(new LastFrameTimeMonitor(m_scene)); + m_staticMonitors.Add(new AgentCountMonitor(m_scene)); + m_staticMonitors.Add(new ChildAgentCountMonitor(m_scene)); + m_staticMonitors.Add(new GCMemoryMonitor()); + m_staticMonitors.Add(new ObjectCountMonitor(m_scene)); + m_staticMonitors.Add(new PhysicsFrameMonitor(m_scene)); + m_staticMonitors.Add(new PhysicsUpdateFrameMonitor(m_scene)); + m_staticMonitors.Add(new PWSMemoryMonitor()); + m_staticMonitors.Add(new ThreadCountMonitor()); + m_staticMonitors.Add(new TotalFrameMonitor(m_scene)); + m_staticMonitors.Add(new EventFrameMonitor(m_scene)); + m_staticMonitors.Add(new LandFrameMonitor(m_scene)); + m_staticMonitors.Add(new LastFrameTimeMonitor(m_scene)); - m_monitors.Add( + m_staticMonitors.Add( new GenericMonitor( m_scene, "TimeDilationMonitor", @@ -177,7 +205,7 @@ namespace OpenSim.Region.CoreModules.Framework.Monitoring m => m.Scene.StatsReporter.LastReportedSimStats[0], m => m.GetValue().ToString())); - m_monitors.Add( + m_staticMonitors.Add( new GenericMonitor( m_scene, "SimFPSMonitor", @@ -185,7 +213,7 @@ namespace OpenSim.Region.CoreModules.Framework.Monitoring m => m.Scene.StatsReporter.LastReportedSimStats[1], m => string.Format("{0}", m.GetValue()))); - m_monitors.Add( + m_staticMonitors.Add( new GenericMonitor( m_scene, "PhysicsFPSMonitor", @@ -193,7 +221,7 @@ namespace OpenSim.Region.CoreModules.Framework.Monitoring m => m.Scene.StatsReporter.LastReportedSimStats[2], m => string.Format("{0}", m.GetValue()))); - m_monitors.Add( + m_staticMonitors.Add( new GenericMonitor( m_scene, "AgentUpdatesPerSecondMonitor", @@ -201,15 +229,7 @@ namespace OpenSim.Region.CoreModules.Framework.Monitoring m => m.Scene.StatsReporter.LastReportedSimStats[3], m => string.Format("{0} per second", m.GetValue()))); - m_monitors.Add( - new GenericMonitor( - m_scene, - "ObjectUpdatesPerSecondMonitor", - "Object Updates", - m => m.Scene.StatsReporter.LastReportedObjectUpdates, - m => string.Format("{0} per second", m.GetValue()))); - - m_monitors.Add( + m_staticMonitors.Add( new GenericMonitor( m_scene, "ActiveObjectCountMonitor", @@ -217,7 +237,7 @@ namespace OpenSim.Region.CoreModules.Framework.Monitoring m => m.Scene.StatsReporter.LastReportedSimStats[7], m => string.Format("{0}", m.GetValue()))); - m_monitors.Add( + m_staticMonitors.Add( new GenericMonitor( m_scene, "ActiveScriptsMonitor", @@ -225,7 +245,7 @@ namespace OpenSim.Region.CoreModules.Framework.Monitoring m => m.Scene.StatsReporter.LastReportedSimStats[19], m => string.Format("{0}", m.GetValue()))); - m_monitors.Add( + m_staticMonitors.Add( new GenericMonitor( m_scene, "ScriptEventsPerSecondMonitor", @@ -233,7 +253,7 @@ namespace OpenSim.Region.CoreModules.Framework.Monitoring m => m.Scene.StatsReporter.LastReportedSimStats[20], m => string.Format("{0} per second", m.GetValue()))); - m_monitors.Add( + m_staticMonitors.Add( new GenericMonitor( m_scene, "InPacketsPerSecondMonitor", @@ -241,7 +261,7 @@ namespace OpenSim.Region.CoreModules.Framework.Monitoring m => m.Scene.StatsReporter.LastReportedSimStats[13], m => string.Format("{0} per second", m.GetValue()))); - m_monitors.Add( + m_staticMonitors.Add( new GenericMonitor( m_scene, "OutPacketsPerSecondMonitor", @@ -249,7 +269,7 @@ namespace OpenSim.Region.CoreModules.Framework.Monitoring m => m.Scene.StatsReporter.LastReportedSimStats[14], m => string.Format("{0} per second", m.GetValue()))); - m_monitors.Add( + m_staticMonitors.Add( new GenericMonitor( m_scene, "UnackedBytesMonitor", @@ -257,7 +277,7 @@ namespace OpenSim.Region.CoreModules.Framework.Monitoring m => m.Scene.StatsReporter.LastReportedSimStats[15], m => string.Format("{0}", m.GetValue()))); - m_monitors.Add( + m_staticMonitors.Add( new GenericMonitor( m_scene, "PendingDownloadsMonitor", @@ -265,7 +285,7 @@ namespace OpenSim.Region.CoreModules.Framework.Monitoring m => m.Scene.StatsReporter.LastReportedSimStats[17], m => string.Format("{0}", m.GetValue()))); - m_monitors.Add( + m_staticMonitors.Add( new GenericMonitor( m_scene, "PendingUploadsMonitor", @@ -273,7 +293,7 @@ namespace OpenSim.Region.CoreModules.Framework.Monitoring m => m.Scene.StatsReporter.LastReportedSimStats[18], m => string.Format("{0}", m.GetValue()))); - m_monitors.Add( + m_staticMonitors.Add( new GenericMonitor( m_scene, "TotalFrameTimeMonitor", @@ -281,7 +301,7 @@ namespace OpenSim.Region.CoreModules.Framework.Monitoring m => m.Scene.StatsReporter.LastReportedSimStats[8], m => string.Format("{0} ms", m.GetValue()))); - m_monitors.Add( + m_staticMonitors.Add( new GenericMonitor( m_scene, "NetFrameTimeMonitor", @@ -289,7 +309,7 @@ namespace OpenSim.Region.CoreModules.Framework.Monitoring m => m.Scene.StatsReporter.LastReportedSimStats[9], m => string.Format("{0} ms", m.GetValue()))); - m_monitors.Add( + m_staticMonitors.Add( new GenericMonitor( m_scene, "PhysicsFrameTimeMonitor", @@ -297,7 +317,7 @@ namespace OpenSim.Region.CoreModules.Framework.Monitoring m => m.Scene.StatsReporter.LastReportedSimStats[10], m => string.Format("{0} ms", m.GetValue()))); - m_monitors.Add( + m_staticMonitors.Add( new GenericMonitor( m_scene, "SimulationFrameTimeMonitor", @@ -305,7 +325,7 @@ namespace OpenSim.Region.CoreModules.Framework.Monitoring m => m.Scene.StatsReporter.LastReportedSimStats[12], m => string.Format("{0} ms", m.GetValue()))); - m_monitors.Add( + m_staticMonitors.Add( new GenericMonitor( m_scene, "AgentFrameTimeMonitor", @@ -313,7 +333,7 @@ namespace OpenSim.Region.CoreModules.Framework.Monitoring m => m.Scene.StatsReporter.LastReportedSimStats[16], m => string.Format("{0} ms", m.GetValue()))); - m_monitors.Add( + m_staticMonitors.Add( new GenericMonitor( m_scene, "ImagesFrameTimeMonitor", @@ -321,7 +341,7 @@ namespace OpenSim.Region.CoreModules.Framework.Monitoring m => m.Scene.StatsReporter.LastReportedSimStats[11], m => string.Format("{0} ms", m.GetValue()))); - m_alerts.Add(new DeadlockAlert(m_monitors.Find(x => x is LastFrameTimeMonitor) as LastFrameTimeMonitor)); + m_alerts.Add(new DeadlockAlert(m_staticMonitors.Find(x => x is LastFrameTimeMonitor) as LastFrameTimeMonitor)); foreach (IAlert alert in m_alerts) { diff --git a/OpenSim/Region/Framework/Scenes/SimStatsReporter.cs b/OpenSim/Region/Framework/Scenes/SimStatsReporter.cs index 5c56264ec4..08d8d7c28f 100644 --- a/OpenSim/Region/Framework/Scenes/SimStatsReporter.cs +++ b/OpenSim/Region/Framework/Scenes/SimStatsReporter.cs @@ -26,7 +26,7 @@ */ using System; -//using System.Collections.Generic; +using System.Collections.Generic; using System.Timers; using OpenMetaverse.Packets; using OpenSim.Framework; @@ -35,10 +35,18 @@ using OpenSim.Region.Framework.Interfaces; namespace OpenSim.Region.Framework.Scenes { + /// + /// Collect statistics from the scene to send to the client and for access by other monitoring tools. + /// + /// + /// FIXME: This should be a monitoring region module + /// public class SimStatsReporter { -// private static readonly log4net.ILog m_log -// = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); + private static readonly log4net.ILog m_log + = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); + + public const string LastReportedObjectUpdateStatName = "LastReportedObjectUpdates"; public delegate void SendStatResult(SimStats stats); @@ -100,6 +108,14 @@ namespace OpenSim.Region.Framework.Scenes get { return lastReportedSimStats; } } + /// + /// Extra sim statistics that are used by monitors but not sent to the client. + /// + /// + /// The keys are the stat names. + /// + private Dictionary m_lastReportedExtraSimStats = new Dictionary(); + // Sending a stats update every 3 seconds- private int statsUpdatesEveryMS = 3000; private float statsUpdateFactor = 0; @@ -334,7 +350,20 @@ namespace OpenSim.Region.Framework.Scenes } // Extra statistics that aren't currently sent to clients - LastReportedObjectUpdates = m_objectUpdates / statsUpdateFactor; + lock (m_lastReportedExtraSimStats) + { + m_lastReportedExtraSimStats[LastReportedObjectUpdateStatName] = m_objectUpdates / statsUpdateFactor; + + Dictionary physicsStats = m_scene.PhysicsScene.GetStats(); + + if (physicsStats != null) + { + foreach (KeyValuePair tuple in physicsStats) + { + m_lastReportedExtraSimStats[tuple.Key] = tuple.Value / statsUpdateFactor; + } + } + } resetvalues(); } @@ -487,7 +516,10 @@ namespace OpenSim.Region.Framework.Scenes public void AddPendingDownloads(int count) { m_pendingDownloads += count; - if (m_pendingDownloads < 0) m_pendingDownloads = 0; + + if (m_pendingDownloads < 0) + m_pendingDownloads = 0; + //m_log.InfoFormat("[stats]: Adding {0} to pending downloads to make {1}", count, m_pendingDownloads); } @@ -509,5 +541,11 @@ namespace OpenSim.Region.Framework.Scenes } #endregion + + public Dictionary GetExtraSimStats() + { + lock (m_lastReportedExtraSimStats) + return new Dictionary(m_lastReportedExtraSimStats); + } } } diff --git a/OpenSim/Region/Physics/Manager/PhysicsScene.cs b/OpenSim/Region/Physics/Manager/PhysicsScene.cs index 2a6163c0e5..b32cd30bec 100644 --- a/OpenSim/Region/Physics/Manager/PhysicsScene.cs +++ b/OpenSim/Region/Physics/Manager/PhysicsScene.cs @@ -192,8 +192,22 @@ namespace OpenSim.Region.Physics.Manager public abstract void AddPhysicsActorTaint(PhysicsActor prim); + /// + /// Perform a simulation of the current physics scene over the given timestep. + /// + /// + /// The number of frames simulated over that period. public abstract float Simulate(float timeStep); + /// + /// Get statistics about this scene. + /// + /// This facility is currently experimental and subject to change. + /// + /// A dictionary where the key is the statistic name. If no statistics are supplied then returns null. + /// + public virtual Dictionary GetStats() { return null; } + public abstract void GetResults(); public abstract void SetTerrain(float[] heightMap); diff --git a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs index 409b27be02..fa659453c1 100644 --- a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs +++ b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs @@ -131,6 +131,41 @@ namespace OpenSim.Region.Physics.OdePlugin /// internal static Object UniversalColliderSyncObject = new Object(); + /// + /// Is stats collecting enabled for this ODE scene? + /// + public bool CollectStats { get; set; } + + /// + /// Statistics for this scene. + /// + private Dictionary m_stats = new Dictionary(); + + /// + /// Stat name for recording the number of milliseconds that ODE spends in native collision code. + /// + public const string ODENativeCollisionFrameMsStatName = "ODENativeCollisionFrameMS"; + + /// + /// Used to hold tick numbers for stat collection purposes. + /// + private int m_nativeCollisionTickRecorder; + + /// + /// A messy way to tell if we need to avoid adding a collision time because this was already done in the callback. + /// + private bool m_inCollisionTiming; + + /// + /// Used in calculating physics frame time dilation + /// + private int tickCountFrameRun; + + /// + /// Used in calculating physics frame time dilation + /// + private int latertickcount; + private Random fluidRandomizer = new Random(Environment.TickCount); private const uint m_regionWidth = Constants.RegionSize; @@ -345,9 +380,6 @@ namespace OpenSim.Region.Physics.OdePlugin private OdePrim cp1; private OdeCharacter cc2; private OdePrim cp2; - private int tickCountFrameRun; - - private int latertickcount=0; //private int cStartStop = 0; //private string cDictKey = ""; @@ -440,6 +472,8 @@ namespace OpenSim.Region.Physics.OdePlugin // Initialize the mesh plugin public override void Initialise(IMesher meshmerizer, IConfigSource config) { + m_stats[ODENativeCollisionFrameMsStatName] = 0; + mesher = meshmerizer; m_config = config; // Defaults @@ -464,6 +498,8 @@ namespace OpenSim.Region.Physics.OdePlugin IConfig physicsconfig = m_config.Configs["ODEPhysicsSettings"]; if (physicsconfig != null) { + CollectStats = physicsconfig.GetBoolean("collect_stats", false); + gravityx = physicsconfig.GetFloat("world_gravityx", 0f); gravityy = physicsconfig.GetFloat("world_gravityy", 0f); gravityz = physicsconfig.GetFloat("world_gravityz", -9.8f); @@ -764,6 +800,62 @@ namespace OpenSim.Region.Physics.OdePlugin #region Collision Detection + /// + /// Collides two geometries. + /// + /// + /// + /// /param> + /// + /// + /// + private int CollideGeoms( + IntPtr geom1, IntPtr geom2, int maxContacts, Ode.NET.d.ContactGeom[] contactsArray, int contactGeomSize) + { + int count; + + lock (OdeScene.UniversalColliderSyncObject) + { + // We do this inside the lock so that we don't count any delay in acquiring it + if (CollectStats) + m_nativeCollisionTickRecorder = Util.EnvironmentTickCount(); + + count = d.Collide(geom1, geom2, maxContacts, contactsArray, contactGeomSize); + } + + // We do this outside the lock so that any waiting threads aren't held up, though the effect is probably + // negligable + if (CollectStats) + m_stats[ODENativeCollisionFrameMsStatName] + += Util.EnvironmentTickCountSubtract(m_nativeCollisionTickRecorder); + + return count; + } + + /// + /// Collide two spaces or a space and a geometry. + /// + /// + /// /param> + /// + private void CollideSpaces(IntPtr space1, IntPtr space2, IntPtr data) + { + if (CollectStats) + { + m_inCollisionTiming = true; + m_nativeCollisionTickRecorder = Util.EnvironmentTickCount(); + } + + d.SpaceCollide2(space1, space2, data, nearCallback); + + if (CollectStats && m_inCollisionTiming) + { + m_stats[ODENativeCollisionFrameMsStatName] + += Util.EnvironmentTickCountSubtract(m_nativeCollisionTickRecorder); + m_inCollisionTiming = false; + } + } + /// /// This is our near callback. A geometry is near a body /// @@ -772,6 +864,13 @@ namespace OpenSim.Region.Physics.OdePlugin /// another geometry or space private void near(IntPtr space, IntPtr g1, IntPtr g2) { + if (CollectStats && m_inCollisionTiming) + { + m_stats[ODENativeCollisionFrameMsStatName] + += Util.EnvironmentTickCountSubtract(m_nativeCollisionTickRecorder); + m_inCollisionTiming = false; + } + // m_log.DebugFormat("[PHYSICS]: Colliding {0} and {1} in {2}", g1, g2, space); // no lock here! It's invoked from within Simulate(), which is thread-locked @@ -789,7 +888,7 @@ namespace OpenSim.Region.Physics.OdePlugin // contact points in the space try { - d.SpaceCollide2(g1, g2, IntPtr.Zero, nearCallback); + CollideSpaces(g1, g2, IntPtr.Zero); } catch (AccessViolationException) { @@ -832,6 +931,7 @@ namespace OpenSim.Region.Physics.OdePlugin // Figure out how many contact points we have int count = 0; + try { // Colliding Geom To Geom @@ -843,8 +943,7 @@ namespace OpenSim.Region.Physics.OdePlugin if (b1 != IntPtr.Zero && b2 != IntPtr.Zero && d.AreConnectedExcluding(b1, b2, d.JointType.Contact)) return; - lock (OdeScene.UniversalColliderSyncObject) - count = d.Collide(g1, g2, contacts.Length, contacts, d.ContactGeom.SizeOf); + count = CollideGeoms(g1, g2, contacts.Length, contacts, d.ContactGeom.SizeOf); if (count > contacts.Length) m_log.Error("[ODE SCENE]: Got " + count + " contacts when we asked for a maximum of " + contacts.Length); @@ -1578,7 +1677,7 @@ namespace OpenSim.Region.Physics.OdePlugin // and we'll run it again on all of them. try { - d.SpaceCollide2(space, chr.Shell, IntPtr.Zero, nearCallback); + CollideSpaces(space, chr.Shell, IntPtr.Zero); } catch (AccessViolationException) { @@ -1593,6 +1692,9 @@ namespace OpenSim.Region.Physics.OdePlugin //} } +// if (framecount % 55 == 0) +// m_log.DebugFormat("Processed {0} collisions", _perloopContact.Count); + List removeprims = null; foreach (OdePrim chr in _activeprims) { @@ -1604,7 +1706,7 @@ namespace OpenSim.Region.Physics.OdePlugin { if (space != IntPtr.Zero && chr.prim_geom != IntPtr.Zero && chr.m_taintremove == false) { - d.SpaceCollide2(space, chr.prim_geom, IntPtr.Zero, nearCallback); + CollideSpaces(space, chr.prim_geom, IntPtr.Zero); } else { @@ -2689,7 +2791,7 @@ namespace OpenSim.Region.Physics.OdePlugin /// It calls the methods that report back to the object owners.. (scenepresence, SceneObjectGroup) /// /// - /// + /// The number of frames simulated over that period. public override float Simulate(float timeStep) { if (framecount >= int.MaxValue) @@ -3190,7 +3292,7 @@ namespace OpenSim.Region.Physics.OdePlugin public override bool IsThreaded { // for now we won't be multithreaded - get { return (false); } + get { return false; } } #region ODE Specific Terrain Fixes @@ -3955,5 +4057,22 @@ namespace OpenSim.Region.Physics.OdePlugin ds.SetViewpoint(ref xyz, ref hpr); } #endif + + public override Dictionary GetStats() + { + if (!CollectStats) + return null; + + Dictionary returnStats; + + lock (OdeLock) + { + returnStats = new Dictionary(m_stats); + + m_stats[ODENativeCollisionFrameMsStatName] = 0; + } + + return returnStats; + } } } \ No newline at end of file diff --git a/bin/OpenSimDefaults.ini b/bin/OpenSimDefaults.ini index 5da3ba2c9b..27d86e8f8c 100644 --- a/bin/OpenSimDefaults.ini +++ b/bin/OpenSimDefaults.ini @@ -675,6 +675,25 @@ [ODEPhysicsSettings] + ; ## + ; ## Physics stats settings + ; + + ; If collect_stats is enabled, then extra stat information is collected which is accessible via the MonitorModule + ; (see http://opensimulator.org/wiki/Monitoring_Module for more details). + collect_stats = false + + ; ## + ; ## Physics logging settings - logfiles are saved to *.DIF files + ; ## + + ; default is false + ;physics_logging = true + ;; every n simulation iterations, the physics snapshot file is updated + ;physics_logging_interval = 50 + ;; append to existing physics logfile, or overwrite existing logfiles? + ;physics_logging_append_existing_logfile = true + ;## ;## World Settings ;## @@ -823,17 +842,6 @@ ; number^2 physical level of detail of the sculpt texture. 16x16 - 256 verticies mesh_physical_lod = 16 - ; ## - ; ## Physics logging settings - logfiles are saved to *.DIF files - ; ## - - ; default is false - ;physics_logging = true - ;; every n simulation iterations, the physics snapshot file is updated - ;physics_logging_interval = 50 - ;; append to existing physics logfile, or overwrite existing logfiles? - ;physics_logging_append_existing_logfile = true - ; ## ; ## Joint support ; ## From 878b67b333320070f643dfdd11e0a9c6ff453543 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 1 Jun 2012 00:26:11 +0100 Subject: [PATCH 294/547] Fix OdeScene.GetTopColliders() to return the top 25 colliders rather than the first 25 that had non-zero collision scores. Also zeros collisions scores on all prims after report collection, not just the top 25. As before, this collision scores are only reset after a report is requested, which may give unrealistic numbers on the first request. So to see more realistic scores, ignore the first report and then refresh the request after a couple of seconds or so. --- OpenSim/Region/Physics/OdePlugin/OdeScene.cs | 32 ++++++++------------ 1 file changed, 13 insertions(+), 19 deletions(-) diff --git a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs index fa659453c1..25b3266f2b 100644 --- a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs +++ b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs @@ -30,20 +30,21 @@ using System; using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Linq; using System.Reflection; using System.Runtime.InteropServices; using System.Threading; -using System.IO; -using System.Diagnostics; using log4net; using Nini.Config; using Ode.NET; +using OpenMetaverse; #if USE_DRAWSTUFF using Drawstuff.NET; #endif using OpenSim.Framework; using OpenSim.Region.Physics.Manager; -using OpenMetaverse; namespace OpenSim.Region.Physics.OdePlugin { @@ -3868,26 +3869,19 @@ namespace OpenSim.Region.Physics.OdePlugin public override Dictionary GetTopColliders() { - Dictionary returncolliders = new Dictionary(); - int cnt = 0; + Dictionary topColliders; + lock (_prims) { - foreach (OdePrim prm in _prims) - { - if (prm.CollisionScore > 0) - { - returncolliders.Add(prm.LocalID, prm.CollisionScore); - cnt++; - prm.CollisionScore = 0f; - if (cnt > 25) - { - break; - } - } - } + List orderedPrims = new List(_prims); + orderedPrims.OrderByDescending(p => p.CollisionScore).Take(25); + topColliders = orderedPrims.ToDictionary(p => p.LocalID, p => p.CollisionScore); + + foreach (OdePrim p in _prims) + p.CollisionScore = 0; } - return returncolliders; + return topColliders; } public override bool SupportsRayCast() From 93fa9e89918f41db01229c61a228724d380552ac Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 1 Jun 2012 00:56:13 +0100 Subject: [PATCH 295/547] Add ODE avatar and prim collision numbers if extra stats collection is enabled. --- OpenSim/Region/Physics/OdePlugin/OdeScene.cs | 39 +++++++++++++++++--- 1 file changed, 34 insertions(+), 5 deletions(-) diff --git a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs index 25b3266f2b..864cdc23d1 100644 --- a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs +++ b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs @@ -147,6 +147,16 @@ namespace OpenSim.Region.Physics.OdePlugin /// public const string ODENativeCollisionFrameMsStatName = "ODENativeCollisionFrameMS"; + /// + /// Stat name for the number of avatar collisions with another entity. + /// + public const string ODEAvatarCollisionsStatName = "ODEAvatarCollisions"; + + /// + /// Stat name for the number of prim collisions with another entity. + /// + public const string ODEPrimCollisionsStatName = "ODEPrimCollisions"; + /// /// Used to hold tick numbers for stat collection purposes. /// @@ -157,6 +167,12 @@ namespace OpenSim.Region.Physics.OdePlugin /// private bool m_inCollisionTiming; + /// + /// A temporary holder for the number of avatar collisions in a frame, so we can work out how many object + /// collisions occured using the _perloopcontact if stats collection is enabled. + /// + private int m_tempAvatarCollisionsThisFrame; + /// /// Used in calculating physics frame time dilation /// @@ -473,7 +489,7 @@ namespace OpenSim.Region.Physics.OdePlugin // Initialize the mesh plugin public override void Initialise(IMesher meshmerizer, IConfigSource config) { - m_stats[ODENativeCollisionFrameMsStatName] = 0; + InitializeExtraStats(); mesher = meshmerizer; m_config = config; @@ -1455,7 +1471,7 @@ namespace OpenSim.Region.Physics.OdePlugin break; } } - //m_log.DebugFormat("[Collsion]: Depth {0}", Math.Abs(contact.depth - contactGeom.depth)); + //m_log.DebugFormat("[Collision]: Depth {0}", Math.Abs(contact.depth - contactGeom.depth)); //m_log.DebugFormat("[Collision]: <{0},{1},{2}>", Math.Abs(contactGeom.normal.X - contact.normal.X), Math.Abs(contactGeom.normal.Y - contact.normal.Y), Math.Abs(contactGeom.normal.Z - contact.normal.Z)); } } @@ -1693,8 +1709,11 @@ namespace OpenSim.Region.Physics.OdePlugin //} } -// if (framecount % 55 == 0) -// m_log.DebugFormat("Processed {0} collisions", _perloopContact.Count); + if (CollectStats) + { + m_tempAvatarCollisionsThisFrame = _perloopContact.Count; + m_stats[ODEAvatarCollisionsStatName] += m_tempAvatarCollisionsThisFrame; + } List removeprims = null; foreach (OdePrim chr in _activeprims) @@ -1728,6 +1747,9 @@ namespace OpenSim.Region.Physics.OdePlugin } } + if (CollectStats) + m_stats[ODEPrimCollisionsStatName] += _perloopContact.Count - m_tempAvatarCollisionsThisFrame; + if (removeprims != null) { foreach (OdePrim chr in removeprims) @@ -4063,10 +4085,17 @@ namespace OpenSim.Region.Physics.OdePlugin { returnStats = new Dictionary(m_stats); - m_stats[ODENativeCollisionFrameMsStatName] = 0; + InitializeExtraStats(); } return returnStats; } + + private void InitializeExtraStats() + { + m_stats[ODENativeCollisionFrameMsStatName] = 0; + m_stats[ODEAvatarCollisionsStatName] = 0; + m_stats[ODEPrimCollisionsStatName] = 0; + } } } \ No newline at end of file From 8301f7b17f8e524d2412f927530da95f711bd6ac Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 1 Jun 2012 00:57:55 +0100 Subject: [PATCH 296/547] minor: comment out currently unused OdeScene.sCollisionData --- OpenSim/Region/Physics/OdePlugin/OdeScene.cs | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs index 864cdc23d1..ace0ba515f 100644 --- a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs +++ b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs @@ -55,15 +55,15 @@ namespace OpenSim.Region.Physics.OdePlugin End = 2 } - public struct sCollisionData - { - public uint ColliderLocalId; - public uint CollidedWithLocalId; - public int NumberOfCollisions; - public int CollisionType; - public int StatusIndicator; - public int lastframe; - } +// public struct sCollisionData +// { +// public uint ColliderLocalId; +// public uint CollidedWithLocalId; +// public int NumberOfCollisions; +// public int CollisionType; +// public int StatusIndicator; +// public int lastframe; +// } [Flags] public enum CollisionCategories : int From e1f8d2adb0dc1dffad8caf47611217b1f7f14f47 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 1 Jun 2012 01:12:30 +0100 Subject: [PATCH 297/547] Stop adding an unnecessary duplicate _perloopcontact if the avatar is standing on a prim. This has already been added earlier on in the method. --- OpenSim/Region/Physics/OdePlugin/OdeScene.cs | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs index ace0ba515f..55c7e5a571 100644 --- a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs +++ b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs @@ -1229,14 +1229,12 @@ namespace OpenSim.Region.Physics.OdePlugin { _perloopContact.Add(curContact); - // If we're colliding against terrain if (name1 == "Terrain" || name2 == "Terrain") { - // If we're moving if ((p2.PhysicsActorType == (int) ActorTypes.Agent) && (Math.Abs(p2.Velocity.X) > 0.01f || Math.Abs(p2.Velocity.Y) > 0.01f)) { - // Use the movement terrain contact + // Avatar is moving on terrain, use the movement terrain contact AvatarMovementTerrainContact.geom = curContact; if (m_global_contactcount < maxContactsbeforedeath) @@ -1249,7 +1247,7 @@ namespace OpenSim.Region.Physics.OdePlugin { if (p2.PhysicsActorType == (int)ActorTypes.Agent) { - // Use the non moving terrain contact + // Avatar is standing on terrain, use the non moving terrain contact TerrainContact.geom = curContact; if (m_global_contactcount < maxContactsbeforedeath) @@ -1344,13 +1342,11 @@ namespace OpenSim.Region.Physics.OdePlugin } else { - // we're colliding with prim or avatar - // check if we're moving if ((p2.PhysicsActorType == (int)ActorTypes.Agent)) { if ((Math.Abs(p2.Velocity.X) > 0.01f || Math.Abs(p2.Velocity.Y) > 0.01f)) { - // Use the Movement prim contact + // Avatar is moving on a prim, use the Movement prim contact AvatarMovementprimContact.geom = curContact; if (m_global_contactcount < maxContactsbeforedeath) @@ -1361,9 +1357,8 @@ namespace OpenSim.Region.Physics.OdePlugin } else { - // Use the non movement contact + // Avatar is standing still on a prim, use the non movement contact contact.geom = curContact; - _perloopContact.Add(curContact); if (m_global_contactcount < maxContactsbeforedeath) { From c33c8db8256225b5ec09c0767c8b65341964d678 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 1 Jun 2012 01:15:27 +0100 Subject: [PATCH 298/547] Rename new collision stats to 'contacts' - there are/can be multiple contacts per collision and this is what is actually being measured. --- OpenSim/Region/Physics/OdePlugin/OdeScene.cs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs index 55c7e5a571..32dac22bfb 100644 --- a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs +++ b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs @@ -150,12 +150,12 @@ namespace OpenSim.Region.Physics.OdePlugin /// /// Stat name for the number of avatar collisions with another entity. /// - public const string ODEAvatarCollisionsStatName = "ODEAvatarCollisions"; + public const string ODEAvatarContactsStatsName = "ODEAvatarContacts"; /// /// Stat name for the number of prim collisions with another entity. /// - public const string ODEPrimCollisionsStatName = "ODEPrimCollisions"; + public const string ODEPrimContactsStatName = "ODEPrimContacts"; /// /// Used to hold tick numbers for stat collection purposes. @@ -1707,7 +1707,7 @@ namespace OpenSim.Region.Physics.OdePlugin if (CollectStats) { m_tempAvatarCollisionsThisFrame = _perloopContact.Count; - m_stats[ODEAvatarCollisionsStatName] += m_tempAvatarCollisionsThisFrame; + m_stats[ODEAvatarContactsStatsName] += m_tempAvatarCollisionsThisFrame; } List removeprims = null; @@ -1743,7 +1743,7 @@ namespace OpenSim.Region.Physics.OdePlugin } if (CollectStats) - m_stats[ODEPrimCollisionsStatName] += _perloopContact.Count - m_tempAvatarCollisionsThisFrame; + m_stats[ODEPrimContactsStatName] += _perloopContact.Count - m_tempAvatarCollisionsThisFrame; if (removeprims != null) { @@ -4089,8 +4089,8 @@ namespace OpenSim.Region.Physics.OdePlugin private void InitializeExtraStats() { m_stats[ODENativeCollisionFrameMsStatName] = 0; - m_stats[ODEAvatarCollisionsStatName] = 0; - m_stats[ODEPrimCollisionsStatName] = 0; + m_stats[ODEAvatarContactsStatsName] = 0; + m_stats[ODEPrimContactsStatName] = 0; } } } \ No newline at end of file From 8333b928fa3353304358ed55293b52478a39ab6e Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 1 Jun 2012 01:27:19 +0100 Subject: [PATCH 299/547] Break down native ODE collision frame time stat into native space collision and geom collision stats --- OpenSim/Region/Physics/OdePlugin/OdeScene.cs | 26 +++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs index 32dac22bfb..d4c0b85e4a 100644 --- a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs +++ b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs @@ -147,6 +147,16 @@ namespace OpenSim.Region.Physics.OdePlugin /// public const string ODENativeCollisionFrameMsStatName = "ODENativeCollisionFrameMS"; + /// + /// Stat name for recording the number of milliseconds that ODE spends in native space collision code. + /// + public const string ODENativeSpaceCollisionFrameMsStatName = "ODENativeSpaceCollisionFrameMS"; + + /// + /// Stat name for recording the number of milliseconds that ODE spends in native geom collision code. + /// + public const string ODENativeGeomCollisionFrameMsStatName = "ODENativeGeomCollisionFrameMS"; + /// /// Stat name for the number of avatar collisions with another entity. /// @@ -843,7 +853,7 @@ namespace OpenSim.Region.Physics.OdePlugin // We do this outside the lock so that any waiting threads aren't held up, though the effect is probably // negligable if (CollectStats) - m_stats[ODENativeCollisionFrameMsStatName] + m_stats[ODENativeGeomCollisionFrameMsStatName] += Util.EnvironmentTickCountSubtract(m_nativeCollisionTickRecorder); return count; @@ -867,7 +877,7 @@ namespace OpenSim.Region.Physics.OdePlugin if (CollectStats && m_inCollisionTiming) { - m_stats[ODENativeCollisionFrameMsStatName] + m_stats[ODENativeSpaceCollisionFrameMsStatName] += Util.EnvironmentTickCountSubtract(m_nativeCollisionTickRecorder); m_inCollisionTiming = false; } @@ -883,7 +893,7 @@ namespace OpenSim.Region.Physics.OdePlugin { if (CollectStats && m_inCollisionTiming) { - m_stats[ODENativeCollisionFrameMsStatName] + m_stats[ODENativeSpaceCollisionFrameMsStatName] += Util.EnvironmentTickCountSubtract(m_nativeCollisionTickRecorder); m_inCollisionTiming = false; } @@ -4079,6 +4089,10 @@ namespace OpenSim.Region.Physics.OdePlugin lock (OdeLock) { returnStats = new Dictionary(m_stats); + + returnStats[ODENativeCollisionFrameMsStatName] + = returnStats[ODENativeSpaceCollisionFrameMsStatName] + + returnStats[ODENativeGeomCollisionFrameMsStatName]; InitializeExtraStats(); } @@ -4088,7 +4102,11 @@ namespace OpenSim.Region.Physics.OdePlugin private void InitializeExtraStats() { - m_stats[ODENativeCollisionFrameMsStatName] = 0; + // No need to zero since this is calculated by addition + // m_stats[ODENativeCollisionFrameMsStatName] = 0; + + m_stats[ODENativeSpaceCollisionFrameMsStatName] = 0; + m_stats[ODENativeGeomCollisionFrameMsStatName] = 0; m_stats[ODEAvatarContactsStatsName] = 0; m_stats[ODEPrimContactsStatName] = 0; } From f2c8c7a7b8cd6a3d3cbbaafa2ba266658b7d0998 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 1 Jun 2012 01:37:19 +0100 Subject: [PATCH 300/547] Add total ODE frame time optional stat, as a sanity check on the main scene physics stat --- OpenSim/Region/Physics/OdePlugin/OdeScene.cs | 28 +++++++++++++++----- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs index d4c0b85e4a..ab03696472 100644 --- a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs +++ b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs @@ -142,6 +142,14 @@ namespace OpenSim.Region.Physics.OdePlugin /// private Dictionary m_stats = new Dictionary(); + /// + /// Stat name for the total time spent in ODE frame processing. + /// + /// + /// A sanity check for the main scene loop physics time. + /// + public const string ODETotalFrameMsStatName = "ODETotalFrameMS"; + /// /// Stat name for recording the number of milliseconds that ODE spends in native collision code. /// @@ -170,7 +178,7 @@ namespace OpenSim.Region.Physics.OdePlugin /// /// Used to hold tick numbers for stat collection purposes. /// - private int m_nativeCollisionTickRecorder; + private int m_nativeCollisionStartTick; /// /// A messy way to tell if we need to avoid adding a collision time because this was already done in the callback. @@ -845,7 +853,7 @@ namespace OpenSim.Region.Physics.OdePlugin { // We do this inside the lock so that we don't count any delay in acquiring it if (CollectStats) - m_nativeCollisionTickRecorder = Util.EnvironmentTickCount(); + m_nativeCollisionStartTick = Util.EnvironmentTickCount(); count = d.Collide(geom1, geom2, maxContacts, contactsArray, contactGeomSize); } @@ -854,7 +862,7 @@ namespace OpenSim.Region.Physics.OdePlugin // negligable if (CollectStats) m_stats[ODENativeGeomCollisionFrameMsStatName] - += Util.EnvironmentTickCountSubtract(m_nativeCollisionTickRecorder); + += Util.EnvironmentTickCountSubtract(m_nativeCollisionStartTick); return count; } @@ -870,7 +878,7 @@ namespace OpenSim.Region.Physics.OdePlugin if (CollectStats) { m_inCollisionTiming = true; - m_nativeCollisionTickRecorder = Util.EnvironmentTickCount(); + m_nativeCollisionStartTick = Util.EnvironmentTickCount(); } d.SpaceCollide2(space1, space2, data, nearCallback); @@ -878,7 +886,7 @@ namespace OpenSim.Region.Physics.OdePlugin if (CollectStats && m_inCollisionTiming) { m_stats[ODENativeSpaceCollisionFrameMsStatName] - += Util.EnvironmentTickCountSubtract(m_nativeCollisionTickRecorder); + += Util.EnvironmentTickCountSubtract(m_nativeCollisionStartTick); m_inCollisionTiming = false; } } @@ -894,7 +902,7 @@ namespace OpenSim.Region.Physics.OdePlugin if (CollectStats && m_inCollisionTiming) { m_stats[ODENativeSpaceCollisionFrameMsStatName] - += Util.EnvironmentTickCountSubtract(m_nativeCollisionTickRecorder); + += Util.EnvironmentTickCountSubtract(m_nativeCollisionStartTick); m_inCollisionTiming = false; } @@ -2822,6 +2830,8 @@ namespace OpenSim.Region.Physics.OdePlugin /// The number of frames simulated over that period. public override float Simulate(float timeStep) { + int startFrameTick = Util.EnvironmentTickCount(); + if (framecount >= int.MaxValue) framecount = 0; @@ -3087,6 +3097,9 @@ namespace OpenSim.Region.Physics.OdePlugin tickCountFrameRun = Util.EnvironmentTickCount(); } + if (CollectStats) + m_stats[ODETotalFrameMsStatName] += Util.EnvironmentTickCount() - startFrameTick; + return fps; } @@ -4089,7 +4102,7 @@ namespace OpenSim.Region.Physics.OdePlugin lock (OdeLock) { returnStats = new Dictionary(m_stats); - + returnStats[ODENativeCollisionFrameMsStatName] = returnStats[ODENativeSpaceCollisionFrameMsStatName] + returnStats[ODENativeGeomCollisionFrameMsStatName]; @@ -4105,6 +4118,7 @@ namespace OpenSim.Region.Physics.OdePlugin // No need to zero since this is calculated by addition // m_stats[ODENativeCollisionFrameMsStatName] = 0; + m_stats[ODETotalFrameMsStatName] = 0; m_stats[ODENativeSpaceCollisionFrameMsStatName] = 0; m_stats[ODENativeGeomCollisionFrameMsStatName] = 0; m_stats[ODEAvatarContactsStatsName] = 0; From 5cc9b820e5b0a9490e6499ee5151c5e698c3e110 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 1 Jun 2012 01:58:28 +0100 Subject: [PATCH 301/547] Add option native step frame ms stat --- OpenSim/Region/Physics/OdePlugin/OdeScene.cs | 30 ++++++++++++++------ 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs index ab03696472..04c4722b37 100644 --- a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs +++ b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs @@ -150,6 +150,11 @@ namespace OpenSim.Region.Physics.OdePlugin /// public const string ODETotalFrameMsStatName = "ODETotalFrameMS"; + /// + /// The amount of time spent in native code that actually steps through the simulation. + /// + public const string ODENativeStepFrameMsStatName = "ODENativeStepFrameMS"; + /// /// Stat name for recording the number of milliseconds that ODE spends in native collision code. /// @@ -2821,23 +2826,23 @@ namespace OpenSim.Region.Physics.OdePlugin /// /// This is our main simulate loop + /// + /// /// It's thread locked by a Mutex in the scene. /// It holds Collisions, it instructs ODE to step through the physical reactions /// It moves the objects around in memory /// It calls the methods that report back to the object owners.. (scenepresence, SceneObjectGroup) - /// + /// /// /// The number of frames simulated over that period. public override float Simulate(float timeStep) { - int startFrameTick = Util.EnvironmentTickCount(); + int startFrameTick = CollectStats ? Util.EnvironmentTickCount() : 0; + int quickStepTick = 0; if (framecount >= int.MaxValue) framecount = 0; - //if (m_worldOffset != Vector3.Zero) - // return 0; - framecount++; float fps = 0; @@ -2845,7 +2850,7 @@ namespace OpenSim.Region.Physics.OdePlugin float timeLeft = timeStep; //m_log.Info(timeStep.ToString()); -// step_time += timeStep; +// step_time += timeSte // // // If We're loaded down by something else, // // or debugging with the Visual Studio project on pause @@ -3007,9 +3012,15 @@ namespace OpenSim.Region.Physics.OdePlugin // "[PHYSICS]: Collision contacts to process this frame = {0}", m_global_contactcount); m_global_contactcount = 0; - + + if (CollectStats) + quickStepTick = Util.EnvironmentTickCount(); + d.WorldQuickStep(world, ODE_STEPSIZE); + if (CollectStats) + m_stats[ODENativeStepFrameMsStatName] += Util.EnvironmentTickCountSubtract(quickStepTick); + d.JointGroupEmpty(contactgroup); } catch (Exception e) @@ -3077,7 +3088,7 @@ namespace OpenSim.Region.Physics.OdePlugin d.WorldExportDIF(world, fname, physics_logging_append_existing_logfile, prefix); } - latertickcount = Util.EnvironmentTickCount() - tickCountFrameRun; + latertickcount = Util.EnvironmentTickCountSubtract(tickCountFrameRun); // OpenSimulator above does 10 fps. 10 fps = means that the main thread loop and physics // has a max of 100 ms to run theoretically. @@ -3098,7 +3109,7 @@ namespace OpenSim.Region.Physics.OdePlugin } if (CollectStats) - m_stats[ODETotalFrameMsStatName] += Util.EnvironmentTickCount() - startFrameTick; + m_stats[ODETotalFrameMsStatName] += Util.EnvironmentTickCountSubtract(startFrameTick); return fps; } @@ -4119,6 +4130,7 @@ namespace OpenSim.Region.Physics.OdePlugin // m_stats[ODENativeCollisionFrameMsStatName] = 0; m_stats[ODETotalFrameMsStatName] = 0; + m_stats[ODENativeStepFrameMsStatName] = 0; m_stats[ODENativeSpaceCollisionFrameMsStatName] = 0; m_stats[ODENativeGeomCollisionFrameMsStatName] = 0; m_stats[ODEAvatarContactsStatsName] = 0; From 5f44be99ef63f2f5ef7bcf73f61c29318d657e59 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 1 Jun 2012 02:25:42 +0100 Subject: [PATCH 302/547] Add avatar and prim update milliseconds per frame optional stats --- OpenSim/Region/Physics/OdePlugin/OdeScene.cs | 38 ++++++++++++++++---- 1 file changed, 31 insertions(+), 7 deletions(-) diff --git a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs index 04c4722b37..f1fa38eeee 100644 --- a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs +++ b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs @@ -151,25 +151,35 @@ namespace OpenSim.Region.Physics.OdePlugin public const string ODETotalFrameMsStatName = "ODETotalFrameMS"; /// - /// The amount of time spent in native code that actually steps through the simulation. + /// Stat name for the amount of time spent in native code that actually steps through the simulation. /// public const string ODENativeStepFrameMsStatName = "ODENativeStepFrameMS"; /// - /// Stat name for recording the number of milliseconds that ODE spends in native collision code. + /// Stat name for the number of milliseconds that ODE spends in native collision code. /// public const string ODENativeCollisionFrameMsStatName = "ODENativeCollisionFrameMS"; /// - /// Stat name for recording the number of milliseconds that ODE spends in native space collision code. + /// Stat name for the number of milliseconds that ODE spends in native space collision code. /// public const string ODENativeSpaceCollisionFrameMsStatName = "ODENativeSpaceCollisionFrameMS"; /// - /// Stat name for recording the number of milliseconds that ODE spends in native geom collision code. + /// Stat name for the number of milliseconds that ODE spends in native geom collision code. /// public const string ODENativeGeomCollisionFrameMsStatName = "ODENativeGeomCollisionFrameMS"; + /// + /// Stat name for the milliseconds spent updating avatar position and velocity + /// + public const string ODEAvatarUpdateFrameMsStatName = "ODEAvatarUpdateFrameMS"; + + /// + /// Stat name for the milliseconds spent updating prim position and velocity + /// + public const string ODEPrimUpdateFrameMsStatName = "ODEPrimUpdateFrameMS"; + /// /// Stat name for the number of avatar collisions with another entity. /// @@ -2838,7 +2848,7 @@ namespace OpenSim.Region.Physics.OdePlugin public override float Simulate(float timeStep) { int startFrameTick = CollectStats ? Util.EnvironmentTickCount() : 0; - int quickStepTick = 0; + int tempTick = 0;; if (framecount >= int.MaxValue) framecount = 0; @@ -3014,12 +3024,12 @@ namespace OpenSim.Region.Physics.OdePlugin m_global_contactcount = 0; if (CollectStats) - quickStepTick = Util.EnvironmentTickCount(); + tempTick = Util.EnvironmentTickCount(); d.WorldQuickStep(world, ODE_STEPSIZE); if (CollectStats) - m_stats[ODENativeStepFrameMsStatName] += Util.EnvironmentTickCountSubtract(quickStepTick); + m_stats[ODENativeStepFrameMsStatName] += Util.EnvironmentTickCountSubtract(tempTick); d.JointGroupEmpty(contactgroup); } @@ -3031,6 +3041,9 @@ namespace OpenSim.Region.Physics.OdePlugin timeLeft -= ODE_STEPSIZE; } + if (CollectStats) + tempTick = Util.EnvironmentTickCount(); + foreach (OdeCharacter actor in _characters) { if (actor.bad) @@ -3054,6 +3067,12 @@ namespace OpenSim.Region.Physics.OdePlugin defects.Clear(); } + if (CollectStats) + { + m_stats[ODEAvatarUpdateFrameMsStatName] += Util.EnvironmentTickCountSubtract(tempTick); + tempTick = Util.EnvironmentTickCount(); + } + //if (timeStep < 0.2f) foreach (OdePrim prim in _activeprims) @@ -3067,6 +3086,9 @@ namespace OpenSim.Region.Physics.OdePlugin } } + if (CollectStats) + m_stats[ODEPrimUpdateFrameMsStatName] += Util.EnvironmentTickCountSubtract(tempTick); + //DumpJointInfo(); // Finished with all sim stepping. If requested, dump world state to file for debugging. @@ -4135,6 +4157,8 @@ namespace OpenSim.Region.Physics.OdePlugin m_stats[ODENativeGeomCollisionFrameMsStatName] = 0; m_stats[ODEAvatarContactsStatsName] = 0; m_stats[ODEPrimContactsStatName] = 0; + m_stats[ODEAvatarUpdateFrameMsStatName] = 0; + m_stats[ODEPrimUpdateFrameMsStatName] = 0; } } } \ No newline at end of file From 31343aa7c3182f4b7e05d7dc01c4c43bd2d43596 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 1 Jun 2012 02:33:44 +0100 Subject: [PATCH 303/547] Add optional stat that records milliseconds spent notifying collision listeners in physics frames --- OpenSim/Region/Physics/OdePlugin/OdeScene.cs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs index f1fa38eeee..0b9ad614b6 100644 --- a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs +++ b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs @@ -170,6 +170,11 @@ namespace OpenSim.Region.Physics.OdePlugin /// public const string ODENativeGeomCollisionFrameMsStatName = "ODENativeGeomCollisionFrameMS"; + /// + /// Stat name for time spent notifying listeners of collisions + /// + public const string ODECollisionNotificationFrameMsStatName = "ODECollisionNotificationFrameMS"; + /// /// Stat name for the milliseconds spent updating avatar position and velocity /// @@ -2998,6 +3003,9 @@ namespace OpenSim.Region.Physics.OdePlugin collision_optimized(); + if (CollectStats) + tempTick = Util.EnvironmentTickCount(); + foreach (PhysicsActor obj in _collisionEventPrim.Values) { // m_log.DebugFormat("[PHYSICS]: Assessing {0} {1} for collision events", obj.SOPName, obj.LocalID); @@ -3024,7 +3032,12 @@ namespace OpenSim.Region.Physics.OdePlugin m_global_contactcount = 0; if (CollectStats) + { + m_stats[ODECollisionNotificationFrameMsStatName] + += Util.EnvironmentTickCountSubtract(tempTick); + tempTick = Util.EnvironmentTickCount(); + } d.WorldQuickStep(world, ODE_STEPSIZE); @@ -4155,6 +4168,7 @@ namespace OpenSim.Region.Physics.OdePlugin m_stats[ODENativeStepFrameMsStatName] = 0; m_stats[ODENativeSpaceCollisionFrameMsStatName] = 0; m_stats[ODENativeGeomCollisionFrameMsStatName] = 0; + m_stats[ODECollisionNotificationFrameMsStatName] = 0; m_stats[ODEAvatarContactsStatsName] = 0; m_stats[ODEPrimContactsStatName] = 0; m_stats[ODEAvatarUpdateFrameMsStatName] = 0; From d1b5f8d9d76e3c7c4c23f485dd070e3775e8e85f Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 1 Jun 2012 02:35:11 +0100 Subject: [PATCH 304/547] Remove recent optional native collision frame milliseconds stat Unnecessary since this has now been broken down into space collisions and geom collisions --- OpenSim/Region/Physics/OdePlugin/OdeScene.cs | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs index 0b9ad614b6..948930bf39 100644 --- a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs +++ b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs @@ -155,11 +155,6 @@ namespace OpenSim.Region.Physics.OdePlugin /// public const string ODENativeStepFrameMsStatName = "ODENativeStepFrameMS"; - /// - /// Stat name for the number of milliseconds that ODE spends in native collision code. - /// - public const string ODENativeCollisionFrameMsStatName = "ODENativeCollisionFrameMS"; - /// /// Stat name for the number of milliseconds that ODE spends in native space collision code. /// @@ -3035,7 +3030,7 @@ namespace OpenSim.Region.Physics.OdePlugin { m_stats[ODECollisionNotificationFrameMsStatName] += Util.EnvironmentTickCountSubtract(tempTick); - + tempTick = Util.EnvironmentTickCount(); } @@ -4149,10 +4144,6 @@ namespace OpenSim.Region.Physics.OdePlugin { returnStats = new Dictionary(m_stats); - returnStats[ODENativeCollisionFrameMsStatName] - = returnStats[ODENativeSpaceCollisionFrameMsStatName] - + returnStats[ODENativeGeomCollisionFrameMsStatName]; - InitializeExtraStats(); } @@ -4161,9 +4152,6 @@ namespace OpenSim.Region.Physics.OdePlugin private void InitializeExtraStats() { - // No need to zero since this is calculated by addition - // m_stats[ODENativeCollisionFrameMsStatName] = 0; - m_stats[ODETotalFrameMsStatName] = 0; m_stats[ODENativeStepFrameMsStatName] = 0; m_stats[ODENativeSpaceCollisionFrameMsStatName] = 0; From 9ff8efc72014d8d5e971c3ceb7ec83bf9c19d69f Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 1 Jun 2012 03:03:48 +0100 Subject: [PATCH 305/547] Collection optional avatar and prim taint frame millisecond times --- OpenSim/Region/Physics/OdePlugin/OdeScene.cs | 43 ++++++++++++++++---- 1 file changed, 36 insertions(+), 7 deletions(-) diff --git a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs index 948930bf39..63b999ec29 100644 --- a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs +++ b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs @@ -150,6 +150,16 @@ namespace OpenSim.Region.Physics.OdePlugin /// public const string ODETotalFrameMsStatName = "ODETotalFrameMS"; + /// + /// Stat name for amount of time spent processing avatar taints per frame + /// + public const string ODEAvatarTaintMsStatName = "ODEAvatarTaintFrameMS"; + + /// + /// Stat name for amount of time spent processing prim taints per frame + /// + public const string ODEPrimTaintMsStatName = "ODEPrimTaintFrameMS"; + /// /// Stat name for the amount of time spent in native code that actually steps through the simulation. /// @@ -2848,7 +2858,7 @@ namespace OpenSim.Region.Physics.OdePlugin public override float Simulate(float timeStep) { int startFrameTick = CollectStats ? Util.EnvironmentTickCount() : 0; - int tempTick = 0;; + int tempTick = 0, tempTick2 = 0; if (framecount >= int.MaxValue) framecount = 0; @@ -2926,6 +2936,9 @@ namespace OpenSim.Region.Physics.OdePlugin { try { + if (CollectStats) + tempTick = Util.EnvironmentTickCount(); + lock (_taintedActors) { foreach (OdeCharacter character in _taintedActors) @@ -2934,6 +2947,13 @@ namespace OpenSim.Region.Physics.OdePlugin _taintedActors.Clear(); } + if (CollectStats) + { + tempTick2 = Util.EnvironmentTickCount(); + m_stats[ODEAvatarTaintMsStatName] += Util.EnvironmentTickCountSubtract(tempTick2, tempTick); + tempTick = tempTick2; + } + lock (_taintedPrims) { foreach (OdePrim prim in _taintedPrims) @@ -2964,6 +2984,13 @@ namespace OpenSim.Region.Physics.OdePlugin _taintedPrims.Clear(); } + if (CollectStats) + { + tempTick2 = Util.EnvironmentTickCount(); + m_stats[ODEPrimTaintMsStatName] += Util.EnvironmentTickCountSubtract(tempTick2, tempTick); + tempTick = tempTick2; + } + // Move characters foreach (OdeCharacter actor in _characters) actor.Move(defects); @@ -3028,10 +3055,9 @@ namespace OpenSim.Region.Physics.OdePlugin if (CollectStats) { - m_stats[ODECollisionNotificationFrameMsStatName] - += Util.EnvironmentTickCountSubtract(tempTick); - - tempTick = Util.EnvironmentTickCount(); + tempTick2 = Util.EnvironmentTickCount(); + m_stats[ODECollisionNotificationFrameMsStatName] += Util.EnvironmentTickCountSubtract(tempTick2, tempTick); + tempTick = tempTick2; } d.WorldQuickStep(world, ODE_STEPSIZE); @@ -3077,8 +3103,9 @@ namespace OpenSim.Region.Physics.OdePlugin if (CollectStats) { - m_stats[ODEAvatarUpdateFrameMsStatName] += Util.EnvironmentTickCountSubtract(tempTick); - tempTick = Util.EnvironmentTickCount(); + tempTick2 = Util.EnvironmentTickCount(); + m_stats[ODEAvatarUpdateFrameMsStatName] += Util.EnvironmentTickCountSubtract(tempTick2, tempTick); + tempTick = tempTick2; } //if (timeStep < 0.2f) @@ -4153,6 +4180,8 @@ namespace OpenSim.Region.Physics.OdePlugin private void InitializeExtraStats() { m_stats[ODETotalFrameMsStatName] = 0; + m_stats[ODEAvatarTaintMsStatName] = 0; + m_stats[ODEPrimTaintMsStatName] = 0; m_stats[ODENativeStepFrameMsStatName] = 0; m_stats[ODENativeSpaceCollisionFrameMsStatName] = 0; m_stats[ODENativeGeomCollisionFrameMsStatName] = 0; From d34b84b53137f5516f790563588676ac5fbf0e49 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 1 Jun 2012 03:23:19 +0100 Subject: [PATCH 306/547] Add avatar forces calculation, prim force and raycasting per frame millisecond optional stats --- OpenSim/Region/Physics/OdePlugin/OdeScene.cs | 53 +++++++++++++++++--- 1 file changed, 46 insertions(+), 7 deletions(-) diff --git a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs index 63b999ec29..e44375b714 100644 --- a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs +++ b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs @@ -151,17 +151,32 @@ namespace OpenSim.Region.Physics.OdePlugin public const string ODETotalFrameMsStatName = "ODETotalFrameMS"; /// - /// Stat name for amount of time spent processing avatar taints per frame + /// Stat name for time spent processing avatar taints per frame /// public const string ODEAvatarTaintMsStatName = "ODEAvatarTaintFrameMS"; /// - /// Stat name for amount of time spent processing prim taints per frame + /// Stat name for time spent processing prim taints per frame /// public const string ODEPrimTaintMsStatName = "ODEPrimTaintFrameMS"; /// - /// Stat name for the amount of time spent in native code that actually steps through the simulation. + /// Stat name for time spent calculating avatar forces per frame. + /// + public const string ODEAvatarForcesFrameMsStatName = "ODEAvatarForcesFrameMS"; + + /// + /// Stat name for time spent calculating prim forces per frame + /// + public const string ODEPrimForcesFrameMsStatName = "ODEPrimForcesFrameMS"; + + /// + /// Stat name for time spent fulfilling raycasting requests per frame + /// + public const string ODERaycastingFrameMsStatName = "ODERaycastingFrameMS"; + + /// + /// Stat name for time spent in native code that actually steps through the simulation. /// public const string ODENativeStepFrameMsStatName = "ODENativeStepFrameMS"; @@ -171,7 +186,7 @@ namespace OpenSim.Region.Physics.OdePlugin public const string ODENativeSpaceCollisionFrameMsStatName = "ODENativeSpaceCollisionFrameMS"; /// - /// Stat name for the number of milliseconds that ODE spends in native geom collision code. + /// Stat name for milliseconds that ODE spends in native geom collision code. /// public const string ODENativeGeomCollisionFrameMsStatName = "ODENativeGeomCollisionFrameMS"; @@ -181,7 +196,7 @@ namespace OpenSim.Region.Physics.OdePlugin public const string ODECollisionNotificationFrameMsStatName = "ODECollisionNotificationFrameMS"; /// - /// Stat name for the milliseconds spent updating avatar position and velocity + /// Stat name for milliseconds spent updating avatar position and velocity /// public const string ODEAvatarUpdateFrameMsStatName = "ODEAvatarUpdateFrameMS"; @@ -191,12 +206,12 @@ namespace OpenSim.Region.Physics.OdePlugin public const string ODEPrimUpdateFrameMsStatName = "ODEPrimUpdateFrameMS"; /// - /// Stat name for the number of avatar collisions with another entity. + /// Stat name for avatar collisions with another entity. /// public const string ODEAvatarContactsStatsName = "ODEAvatarContacts"; /// - /// Stat name for the number of prim collisions with another entity. + /// Stat name for prim collisions with another entity. /// public const string ODEPrimContactsStatName = "ODEPrimContacts"; @@ -3010,6 +3025,13 @@ namespace OpenSim.Region.Physics.OdePlugin defects.Clear(); } + if (CollectStats) + { + tempTick2 = Util.EnvironmentTickCount(); + m_stats[ODEAvatarForcesFrameMsStatName] += Util.EnvironmentTickCountSubtract(tempTick2, tempTick); + tempTick = tempTick2; + } + // Move other active objects foreach (OdePrim prim in _activeprims) { @@ -3017,12 +3039,26 @@ namespace OpenSim.Region.Physics.OdePlugin prim.Move(timeStep); } + if (CollectStats) + { + tempTick2 = Util.EnvironmentTickCount(); + m_stats[ODEPrimForcesFrameMsStatName] += Util.EnvironmentTickCountSubtract(tempTick2, tempTick); + tempTick = tempTick2; + } + //if ((framecount % m_randomizeWater) == 0) // randomizeWater(waterlevel); //int RayCastTimeMS = m_rayCastManager.ProcessQueuedRequests(); m_rayCastManager.ProcessQueuedRequests(); + if (CollectStats) + { + tempTick2 = Util.EnvironmentTickCount(); + m_stats[ODERaycastingFrameMsStatName] += Util.EnvironmentTickCountSubtract(tempTick2, tempTick); + tempTick = tempTick2; + } + collision_optimized(); if (CollectStats) @@ -4182,6 +4218,9 @@ namespace OpenSim.Region.Physics.OdePlugin m_stats[ODETotalFrameMsStatName] = 0; m_stats[ODEAvatarTaintMsStatName] = 0; m_stats[ODEPrimTaintMsStatName] = 0; + m_stats[ODEAvatarForcesFrameMsStatName] = 0; + m_stats[ODEPrimForcesFrameMsStatName] = 0; + m_stats[ODERaycastingFrameMsStatName] = 0; m_stats[ODENativeStepFrameMsStatName] = 0; m_stats[ODENativeSpaceCollisionFrameMsStatName] = 0; m_stats[ODENativeGeomCollisionFrameMsStatName] = 0; From 200376b3c4717e9ae00b67ef5f2a57383952f2d5 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 1 Jun 2012 03:49:42 +0100 Subject: [PATCH 307/547] Add optional stat for the other collision time per frame not spent in ODE native spaces or geom collision code --- OpenSim/Region/Physics/OdePlugin/OdeScene.cs | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs index e44375b714..859045390c 100644 --- a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs +++ b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs @@ -190,6 +190,11 @@ namespace OpenSim.Region.Physics.OdePlugin /// public const string ODENativeGeomCollisionFrameMsStatName = "ODENativeGeomCollisionFrameMS"; + /// + /// Time spent in collision processing that is not spent in native space or geom collision code. + /// + public const string ODEOtherCollisionFrameMsStatName = "ODEOtherCollisionFrameMS"; + /// /// Stat name for time spent notifying listeners of collisions /// @@ -3062,7 +3067,11 @@ namespace OpenSim.Region.Physics.OdePlugin collision_optimized(); if (CollectStats) - tempTick = Util.EnvironmentTickCount(); + { + tempTick2 = Util.EnvironmentTickCount(); + m_stats[ODEOtherCollisionFrameMsStatName] += Util.EnvironmentTickCountSubtract(tempTick2, tempTick); + tempTick = tempTick2; + } foreach (PhysicsActor obj in _collisionEventPrim.Values) { @@ -4210,6 +4219,11 @@ namespace OpenSim.Region.Physics.OdePlugin InitializeExtraStats(); } + returnStats[ODEOtherCollisionFrameMsStatName] + = returnStats[ODEOtherCollisionFrameMsStatName] + - returnStats[ODENativeSpaceCollisionFrameMsStatName] + - returnStats[ODENativeGeomCollisionFrameMsStatName]; + return returnStats; } @@ -4224,6 +4238,7 @@ namespace OpenSim.Region.Physics.OdePlugin m_stats[ODENativeStepFrameMsStatName] = 0; m_stats[ODENativeSpaceCollisionFrameMsStatName] = 0; m_stats[ODENativeGeomCollisionFrameMsStatName] = 0; + m_stats[ODEOtherCollisionFrameMsStatName] = 0; m_stats[ODECollisionNotificationFrameMsStatName] = 0; m_stats[ODEAvatarContactsStatsName] = 0; m_stats[ODEPrimContactsStatName] = 0; From 4e06a46dc5e6d0fb6a894932e706e4a01351ec64 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 1 Jun 2012 04:07:39 +0100 Subject: [PATCH 308/547] If OdeScene.Near() returns no collision contacts, then exit as early as possible. All subsequent code is only relevant if there are contacts. --- OpenSim/Region/Physics/OdePlugin/OdeScene.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs index 859045390c..c26c9c581a 100644 --- a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs +++ b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs @@ -1025,6 +1025,10 @@ namespace OpenSim.Region.Physics.OdePlugin count = CollideGeoms(g1, g2, contacts.Length, contacts, d.ContactGeom.SizeOf); + // All code after this is only relevant if we have any collisions + if (count <= 0) + return; + if (count > contacts.Length) m_log.Error("[ODE SCENE]: Got " + count + " contacts when we asked for a maximum of " + contacts.Length); } From 6375db1533e6c625d7b6394542f74141092ff780 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 1 Jun 2012 04:23:36 +0100 Subject: [PATCH 309/547] Add optional total avatars, total prims and active prims stats to ODE plugin. These will act as a sanity check with the main scene stats, to show that physics scene entities are being managed properly. Total prims will not match scene total prims since physics total does not include phantom prims --- OpenSim/Region/Physics/OdePlugin/OdeScene.cs | 21 ++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs index c26c9c581a..c6ecc68ae9 100644 --- a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs +++ b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs @@ -142,6 +142,21 @@ namespace OpenSim.Region.Physics.OdePlugin /// private Dictionary m_stats = new Dictionary(); + /// + /// Stat name for total number of avatars in this ODE scene. + /// + public const string ODETotalAvatarsStatName = "ODETotalAvatars"; + + /// + /// Stat name for total number of prims in this ODE scene. + /// + public const string ODETotalPrimsStatName = "ODETotalPrims"; + + /// + /// Stat name for total number of prims with active physics in this ODE scene. + /// + public const string ODEActivePrimsStatName = "ODEActivePrims"; + /// /// Stat name for the total time spent in ODE frame processing. /// @@ -4220,6 +4235,12 @@ namespace OpenSim.Region.Physics.OdePlugin { returnStats = new Dictionary(m_stats); + // FIXME: This is a SUPER DUMB HACK until we can establish stats that aren't subject to a division by + // 3 from the SimStatsReporter. + returnStats[ODETotalAvatarsStatName] = _characters.Count * 3; + returnStats[ODETotalPrimsStatName] = _prims.Count * 3; + returnStats[ODEActivePrimsStatName] = _activeprims.Count * 3; + InitializeExtraStats(); } From 72219eae7d3dac01e73ab5fdf84f05f8d0fa00cf Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 1 Jun 2012 04:45:42 +0100 Subject: [PATCH 310/547] Instead of updating sim stats root agent, child, objects and scripts accounts every single scene frame, update in the once every 3 seconds SimStatsReporter run --- OpenSim/Region/Framework/Scenes/Scene.cs | 5 --- .../Framework/Scenes/SimStatsReporter.cs | 42 +++++++------------ 2 files changed, 14 insertions(+), 33 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index ce386be205..702e3220f6 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -1462,10 +1462,6 @@ namespace OpenSim.Region.Framework.Scenes StatsReporter.AddPhysicsFPS(physicsFPS); StatsReporter.AddTimeDilation(TimeDilation); StatsReporter.AddFPS(1); - StatsReporter.SetRootAgents(m_sceneGraph.GetRootAgentCount()); - StatsReporter.SetChildAgents(m_sceneGraph.GetChildAgentCount()); - StatsReporter.SetObjects(m_sceneGraph.GetTotalObjectsCount()); - StatsReporter.SetActiveObjects(m_sceneGraph.GetActiveObjectsCount()); // frameMS currently records work frame times, not total frame times (work + any required sleep to // reach min frame time. @@ -1474,7 +1470,6 @@ namespace OpenSim.Region.Framework.Scenes StatsReporter.addAgentMS(agentMS); StatsReporter.addPhysicsMS(physicsMS + physicsMS2); StatsReporter.addOtherMS(otherMS); - StatsReporter.SetActiveScripts(m_sceneGraph.GetActiveScriptsCount()); StatsReporter.addScriptLines(m_sceneGraph.GetScriptLPS()); if (LoginsDisabled && Frame == 20) diff --git a/OpenSim/Region/Framework/Scenes/SimStatsReporter.cs b/OpenSim/Region/Framework/Scenes/SimStatsReporter.cs index 08d8d7c28f..87af311a06 100644 --- a/OpenSim/Region/Framework/Scenes/SimStatsReporter.cs +++ b/OpenSim/Region/Framework/Scenes/SimStatsReporter.cs @@ -207,6 +207,10 @@ namespace OpenSim.Region.Framework.Scenes m_report.Close(); } + /// + /// Sets the number of milliseconds between stat updates. + /// + /// public void SetUpdateMS(int ms) { statsUpdatesEveryMS = ms; @@ -254,6 +258,16 @@ namespace OpenSim.Region.Framework.Scenes physfps = 0; #endregion + + m_rootAgents = m_scene.SceneGraph.GetRootAgentCount(); + m_childAgents = m_scene.SceneGraph.GetChildAgentCount(); + m_numPrim = m_scene.SceneGraph.GetTotalObjectsCount(); + m_activePrim = m_scene.SceneGraph.GetActiveObjectsCount(); + m_activeScripts = m_scene.SceneGraph.GetActiveScriptsCount(); + + // FIXME: Checking for stat sanity is a complex approach. What we really need to do is fix the code + // so that stat numbers are always consistent. + CheckStatSanity(); //Our time dilation is 0.91 when we're running a full speed, // therefore to make sure we get an appropriate range, @@ -408,13 +422,6 @@ namespace OpenSim.Region.Framework.Scenes m_timeDilation = td; } - public void SetRootAgents(int rootAgents) - { - m_rootAgents = rootAgents; - CheckStatSanity(); - - } - internal void CheckStatSanity() { if (m_rootAgents < 0 || m_childAgents < 0) @@ -431,22 +438,6 @@ namespace OpenSim.Region.Framework.Scenes } } - public void SetChildAgents(int childAgents) - { - m_childAgents = childAgents; - CheckStatSanity(); - } - - public void SetObjects(int objects) - { - m_numPrim = objects; - } - - public void SetActiveObjects(int objects) - { - m_activePrim = objects; - } - public void AddFPS(int frames) { m_fps += frames; @@ -528,11 +519,6 @@ namespace OpenSim.Region.Framework.Scenes m_scriptLinesPerSecond += count; } - public void SetActiveScripts(int count) - { - m_activeScripts = count; - } - public void AddPacketsStats(int inPackets, int outPackets, int unAckedBytes) { AddInPackets(inPackets); From 01a2b0b289933febc95523de02275c9bd573b10e Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Sat, 2 Jun 2012 04:57:10 +0100 Subject: [PATCH 311/547] Fix various issues with http inventory 1) The return messages were being wrongly populated with the names of asset, inventory and sale types when their corresponding integers should have been used instead. 2) Folders with links were including the linked items in the descendents figure, when only the links should be included. 3) Links and linked items in link folders were not being included in the return data, and not in the correct order. Now that these issues have been addressed, outfits and attachments appear to work consistently when HTTP inventory is enabled (as is now the default). --- .../FetchInventory2/FetchInventory2Handler.cs | 30 +---- .../WebFetchInvDescHandler.cs | 125 +++++++++++------- OpenSim/Capabilities/LLSDInventoryItem.cs | 6 +- .../InventoryService/XInventoryService.cs | 2 +- 4 files changed, 85 insertions(+), 78 deletions(-) diff --git a/OpenSim/Capabilities/Handlers/FetchInventory2/FetchInventory2Handler.cs b/OpenSim/Capabilities/Handlers/FetchInventory2/FetchInventory2Handler.cs index 717a097c70..c0ca1e1896 100644 --- a/OpenSim/Capabilities/Handlers/FetchInventory2/FetchInventory2Handler.cs +++ b/OpenSim/Capabilities/Handlers/FetchInventory2/FetchInventory2Handler.cs @@ -101,18 +101,8 @@ namespace OpenSim.Capabilities.Handlers llsdItem.item_id = invItem.ID; llsdItem.name = invItem.Name; llsdItem.parent_id = invItem.Folder; - - try - { - llsdItem.type = Utils.AssetTypeToString((AssetType)invItem.AssetType); - llsdItem.inv_type = Utils.InventoryTypeToString((InventoryType)invItem.InvType); - } - catch (Exception e) - { - m_log.ErrorFormat( - "[WEB FETCH INV DESC HANDLER]: Problem setting asset {0} inventory {1} types while converting inventory item {2}: {3}", - invItem.AssetType, invItem.InvType, invItem.Name, e.Message); - } + llsdItem.type = invItem.AssetType; + llsdItem.inv_type = invItem.InvType; llsdItem.permissions = new LLSDPermissions(); llsdItem.permissions.creator_id = invItem.CreatorIdAsUuid; @@ -126,21 +116,7 @@ namespace OpenSim.Capabilities.Handlers llsdItem.permissions.owner_mask = (int)invItem.CurrentPermissions; llsdItem.sale_info = new LLSDSaleInfo(); llsdItem.sale_info.sale_price = invItem.SalePrice; - switch (invItem.SaleType) - { - default: - llsdItem.sale_info.sale_type = "not"; - break; - case 1: - llsdItem.sale_info.sale_type = "original"; - break; - case 2: - llsdItem.sale_info.sale_type = "copy"; - break; - case 3: - llsdItem.sale_info.sale_type = "contents"; - break; - } + llsdItem.sale_info.sale_type = invItem.SaleType; return llsdItem; } diff --git a/OpenSim/Capabilities/Handlers/WebFetchInventoryDescendents/WebFetchInvDescHandler.cs b/OpenSim/Capabilities/Handlers/WebFetchInventoryDescendents/WebFetchInvDescHandler.cs index d5c062b831..b3196d99db 100644 --- a/OpenSim/Capabilities/Handlers/WebFetchInventoryDescendents/WebFetchInvDescHandler.cs +++ b/OpenSim/Capabilities/Handlers/WebFetchInventoryDescendents/WebFetchInvDescHandler.cs @@ -156,11 +156,12 @@ namespace OpenSim.Capabilities.Handlers inv.Folders = new List(); inv.Items = new List(); int version = 0; + int descendents = 0; inv = Fetch( invFetch.owner_id, invFetch.folder_id, invFetch.owner_id, - invFetch.fetch_folders, invFetch.fetch_items, invFetch.sort_order, out version); + invFetch.fetch_folders, invFetch.fetch_items, invFetch.sort_order, out version, out descendents); if (inv != null && inv.Folders != null) { @@ -168,6 +169,8 @@ namespace OpenSim.Capabilities.Handlers { contents.categories.Array.Add(ConvertInventoryFolder(invFolder)); } + + descendents += inv.Folders; } if (inv != null && inv.Items != null) @@ -178,7 +181,7 @@ namespace OpenSim.Capabilities.Handlers } } - contents.descendents = contents.items.Array.Count + contents.categories.Array.Count; + contents.descendents = descendents; contents.version = version; // m_log.DebugFormat( @@ -206,7 +209,7 @@ namespace OpenSim.Capabilities.Handlers /// An empty InventoryCollection if the inventory look up failed private InventoryCollection Fetch( UUID agentID, UUID folderID, UUID ownerID, - bool fetchFolders, bool fetchItems, int sortOrder, out int version) + bool fetchFolders, bool fetchItems, int sortOrder, out int version, out int descendents) { // m_log.DebugFormat( // "[WEB FETCH INV DESC HANDLER]: Fetching folders ({0}), items ({1}) from {2} for agent {3}", @@ -215,6 +218,8 @@ namespace OpenSim.Capabilities.Handlers // FIXME MAYBE: We're not handling sortOrder! version = 0; + descendents = 0; + InventoryFolderImpl fold; if (m_LibraryService != null && m_LibraryService.LibraryRootFolder != null && agentID == m_LibraryService.LibraryRootFolder.Owner) { @@ -223,6 +228,7 @@ namespace OpenSim.Capabilities.Handlers InventoryCollection ret = new InventoryCollection(); ret.Folders = new List(); ret.Items = fold.RequestListOfItems(); + descendents = ret.Folders.Count + ret.Items.Count; return ret; } @@ -246,24 +252,73 @@ namespace OpenSim.Capabilities.Handlers version = containingFolder.Version; -// if (fetchItems) + if (fetchItems) + { + List itemsToReturn = contents.Items; + List originalItems = new List(itemsToReturn); + + // descendents must only include the links, not the linked items we add + descendents = originalItems.Count; + + // Second, add target items for links in this folder + foreach (InventoryItemBase item in originalItems) + { + if (item.AssetType == (int)AssetType.Link) + { + InventoryItemBase linkedItem = m_InventoryService.GetItem(new InventoryItemBase(item.AssetID)); + + // Take care of genuinely broken links where the target doesn't exist + // HACK: Also, don't follow up links that just point to other links. In theory this is legitimate, + // but no viewer has been observed to set these up and this is the lazy way of avoiding cycles + // rather than having to keep track of every folder requested in the recursion. + if (linkedItem != null && linkedItem.AssetType != (int)AssetType.Link) + itemsToReturn.Insert(0, linkedItem); + } + } + + // First, scan for folder links and add target items in those folders. + foreach (InventoryItemBase item in originalItems) + { + if (item.AssetType == (int)AssetType.LinkFolder) + { + InventoryCollection linkedFolderContents = m_InventoryService.GetFolderContent(ownerID, item.AssetID); + List links = linkedFolderContents.Items; + + // Second, insert the links contained in this linked folder. + itemsToReturn.InsertRange(0, links); + + // Third, insert the real items linked by the links in this linked folder. + foreach (InventoryItemBase link in linkedFolderContents.Items) + { + // Take care of genuinely broken links where the target doesn't exist + // HACK: Also, don't follow up links that just point to other links. In theory this is legitimate, + // but no viewer has been observed to set these up and this is the lazy way of avoiding cycles + // rather than having to keep track of every folder requested in the recursion. + if (link != null) + { +// m_log.DebugFormat( +// "[WEB FETCH INV DESC HANDLER]: Adding item {0} {1} from folder {2} linked from {3}", +// link.Name, (AssetType)link.AssetType, item.AssetID, containingFolder.Name); + + InventoryItemBase linkedItem + = m_InventoryService.GetItem(new InventoryItemBase(link.AssetID)); + + itemsToReturn.Insert(0, linkedItem); + } + } + } + } + } + +// foreach (InventoryItemBase item in contents.Items) // { -// List linkedItemsToAdd = new List(); -// -// foreach (InventoryItemBase item in contents.Items) -// { -// if (item.AssetType == (int)AssetType.Link) -// { -// InventoryItemBase linkedItem = m_InventoryService.GetItem(new InventoryItemBase(item.AssetID)); -// -// // Take care of genuinely broken links where the target doesn't exist -// // HACK: Also, don't follow up links that just point to other links. In theory this is legitimate, -// // but no viewer has been observed to set these up and this is the lazy way of avoiding cycles -// // rather than having to keep track of every folder requested in the recursion. -// if (linkedItem != null && linkedItem.AssetType != (int)AssetType.Link) -// linkedItemsToAdd.Insert(0, linkedItem); -// } -// } +// m_log.DebugFormat( +// "[WEB FETCH INV DESC HANDLER]: Returning item {0}, type {1}, parent {2} in {3} {4}", +// item.Name, (AssetType)item.AssetType, item.Folder, containingFolder.Name, containingFolder.ID); +// } + + // ===== + // // foreach (InventoryItemBase linkedItem in linkedItemsToAdd) // { @@ -365,18 +420,8 @@ namespace OpenSim.Capabilities.Handlers llsdItem.item_id = invItem.ID; llsdItem.name = invItem.Name; llsdItem.parent_id = invItem.Folder; - - try - { - llsdItem.type = Utils.AssetTypeToString((AssetType)invItem.AssetType); - llsdItem.inv_type = Utils.InventoryTypeToString((InventoryType)invItem.InvType); - } - catch (Exception e) - { - m_log.ErrorFormat( - "[WEB FETCH INV DESC HANDLER]: Problem setting asset {0} inventory {1} types while converting inventory item {2}: {3}", - invItem.AssetType, invItem.InvType, invItem.Name, e.Message); - } + llsdItem.type = invItem.AssetType; + llsdItem.inv_type = invItem.InvType; llsdItem.permissions = new LLSDPermissions(); llsdItem.permissions.creator_id = invItem.CreatorIdAsUuid; @@ -390,21 +435,7 @@ namespace OpenSim.Capabilities.Handlers llsdItem.permissions.owner_mask = (int)invItem.CurrentPermissions; llsdItem.sale_info = new LLSDSaleInfo(); llsdItem.sale_info.sale_price = invItem.SalePrice; - switch (invItem.SaleType) - { - default: - llsdItem.sale_info.sale_type = "not"; - break; - case 1: - llsdItem.sale_info.sale_type = "original"; - break; - case 2: - llsdItem.sale_info.sale_type = "copy"; - break; - case 3: - llsdItem.sale_info.sale_type = "contents"; - break; - } + llsdItem.sale_info.sale_type = invItem.SaleType; return llsdItem; } diff --git a/OpenSim/Capabilities/LLSDInventoryItem.cs b/OpenSim/Capabilities/LLSDInventoryItem.cs index 426a6cbaf5..958e8079b4 100644 --- a/OpenSim/Capabilities/LLSDInventoryItem.cs +++ b/OpenSim/Capabilities/LLSDInventoryItem.cs @@ -37,8 +37,8 @@ namespace OpenSim.Framework.Capabilities public UUID asset_id; public UUID item_id; public LLSDPermissions permissions; - public string type; - public string inv_type; + public int type; + public int inv_type; public int flags; public LLSDSaleInfo sale_info; @@ -65,7 +65,7 @@ namespace OpenSim.Framework.Capabilities public class LLSDSaleInfo { public int sale_price; - public string sale_type; + public int sale_type; } [OSDMap] diff --git a/OpenSim/Services/InventoryService/XInventoryService.cs b/OpenSim/Services/InventoryService/XInventoryService.cs index 3355428cf4..7518b86f0b 100644 --- a/OpenSim/Services/InventoryService/XInventoryService.cs +++ b/OpenSim/Services/InventoryService/XInventoryService.cs @@ -436,7 +436,7 @@ namespace OpenSim.Services.InventoryService public virtual bool AddItem(InventoryItemBase item) { // m_log.DebugFormat( -// "[XINVENTORY SERVICE]: Adding item {0} to folder {1} for {2}", item.ID, item.Folder, item.Owner); +// "[XINVENTORY SERVICE]: Adding item {0} {1} to folder {2} for {3}", item.Name, item.ID, item.Folder, item.Owner); return m_Database.StoreItem(ConvertFromOpenSim(item)); } From 2de5479c3f0df84ab76365dc3a6eb618012c3153 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Sat, 2 Jun 2012 05:01:56 +0100 Subject: [PATCH 312/547] minor: tidy up some comments --- .../WebFetchInventoryDescendents/WebFetchInvDescHandler.cs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/OpenSim/Capabilities/Handlers/WebFetchInventoryDescendents/WebFetchInvDescHandler.cs b/OpenSim/Capabilities/Handlers/WebFetchInventoryDescendents/WebFetchInvDescHandler.cs index b3196d99db..1594c55938 100644 --- a/OpenSim/Capabilities/Handlers/WebFetchInventoryDescendents/WebFetchInvDescHandler.cs +++ b/OpenSim/Capabilities/Handlers/WebFetchInventoryDescendents/WebFetchInvDescHandler.cs @@ -260,7 +260,7 @@ namespace OpenSim.Capabilities.Handlers // descendents must only include the links, not the linked items we add descendents = originalItems.Count; - // Second, add target items for links in this folder + // Add target items for links in this folder before the links themselves. foreach (InventoryItemBase item in originalItems) { if (item.AssetType == (int)AssetType.Link) @@ -276,7 +276,7 @@ namespace OpenSim.Capabilities.Handlers } } - // First, scan for folder links and add target items in those folders. + // Now scan for folder links and insert the items they target and those links at the head of the return data foreach (InventoryItemBase item in originalItems) { if (item.AssetType == (int)AssetType.LinkFolder) @@ -284,10 +284,8 @@ namespace OpenSim.Capabilities.Handlers InventoryCollection linkedFolderContents = m_InventoryService.GetFolderContent(ownerID, item.AssetID); List links = linkedFolderContents.Items; - // Second, insert the links contained in this linked folder. itemsToReturn.InsertRange(0, links); - // Third, insert the real items linked by the links in this linked folder. foreach (InventoryItemBase link in linkedFolderContents.Items) { // Take care of genuinely broken links where the target doesn't exist From 729d90173f82f5ac51b8b69ee8b3362599ffd2f1 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Sat, 2 Jun 2012 05:03:56 +0100 Subject: [PATCH 313/547] Fix build break whree accidentally did inv.Folders rather than inv.Folders.Count in a minor change. --- .../WebFetchInventoryDescendents/WebFetchInvDescHandler.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Capabilities/Handlers/WebFetchInventoryDescendents/WebFetchInvDescHandler.cs b/OpenSim/Capabilities/Handlers/WebFetchInventoryDescendents/WebFetchInvDescHandler.cs index 1594c55938..849cad2115 100644 --- a/OpenSim/Capabilities/Handlers/WebFetchInventoryDescendents/WebFetchInvDescHandler.cs +++ b/OpenSim/Capabilities/Handlers/WebFetchInventoryDescendents/WebFetchInvDescHandler.cs @@ -170,7 +170,7 @@ namespace OpenSim.Capabilities.Handlers contents.categories.Array.Add(ConvertInventoryFolder(invFolder)); } - descendents += inv.Folders; + descendents += inv.Folders.Count; } if (inv != null && inv.Items != null) From 5c646e26031400961dcfe3d7c4bd84512a1bc7cb Mon Sep 17 00:00:00 2001 From: Melanie Date: Mon, 4 Jun 2012 18:22:09 +0100 Subject: [PATCH 314/547] Remove the "Profile" config as it's covered by the replaceable interface --- .../CoreModules/Avatar/Profile/BasicProfileModule.cs | 8 -------- 1 file changed, 8 deletions(-) diff --git a/OpenSim/Region/CoreModules/Avatar/Profile/BasicProfileModule.cs b/OpenSim/Region/CoreModules/Avatar/Profile/BasicProfileModule.cs index 8101ca21c3..87ca3277be 100644 --- a/OpenSim/Region/CoreModules/Avatar/Profile/BasicProfileModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Profile/BasicProfileModule.cs @@ -57,14 +57,6 @@ namespace OpenSim.Region.CoreModules.Avatar.Profile public void Initialise(IConfigSource config) { - // This can be reduced later as the loader will determine - // whether we are needed - if (config.Configs["Profile"] != null) - { - if (config.Configs["Profile"].GetString("Module", string.Empty) != "BasicProfileModule") - return; - } - m_log.DebugFormat("[PROFILE MODULE]: Basic Profile Module enabled"); m_Enabled = true; } From f94ef37b46c680e3d74b21cdb2e2a89f482bcc62 Mon Sep 17 00:00:00 2001 From: Robert Adams Date: Mon, 4 Jun 2012 10:26:39 -0700 Subject: [PATCH 315/547] Correct the delegate specification in EventManager.TriggerTerrainTainted. Looks like the wrong one was cut and pasted. --- OpenSim/Region/Framework/Scenes/EventManager.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Region/Framework/Scenes/EventManager.cs b/OpenSim/Region/Framework/Scenes/EventManager.cs index f97b0a9a19..f92ed8e599 100644 --- a/OpenSim/Region/Framework/Scenes/EventManager.cs +++ b/OpenSim/Region/Framework/Scenes/EventManager.cs @@ -923,7 +923,7 @@ namespace OpenSim.Region.Framework.Scenes OnTerrainTaintedDelegate handlerTerrainTainted = OnTerrainTainted; if (handlerTerrainTainted != null) { - foreach (OnTerrainTickDelegate d in handlerTerrainTainted.GetInvocationList()) + foreach (OnTerrainTaintedDelegate d in handlerTerrainTainted.GetInvocationList()) { try { From 9707a2d57c4a4a8e818e0e9b0ec57c5b7abcb70c Mon Sep 17 00:00:00 2001 From: Melanie Date: Mon, 4 Jun 2012 18:24:02 +0100 Subject: [PATCH 316/547] Remove profile from basic configuration --- bin/config-include/Grid.ini | 3 --- bin/config-include/Standalone.ini | 3 --- 2 files changed, 6 deletions(-) diff --git a/bin/config-include/Grid.ini b/bin/config-include/Grid.ini index 95d62649ca..cb3a5c86d6 100644 --- a/bin/config-include/Grid.ini +++ b/bin/config-include/Grid.ini @@ -29,9 +29,6 @@ SimulationServiceInConnector = true LibraryModule = true -[Profile] - Module = "BasicProfileModule" - [SimulationDataStore] LocalServiceModule = "OpenSim.Services.Connectors.dll:SimulationDataService" diff --git a/bin/config-include/Standalone.ini b/bin/config-include/Standalone.ini index 74d9d2eb3e..ba72fe747d 100644 --- a/bin/config-include/Standalone.ini +++ b/bin/config-include/Standalone.ini @@ -25,9 +25,6 @@ GridInfoServiceInConnector = true MapImageServiceInConnector = true -[Profile] - Module = "BasicProfileModule" - [SimulationDataStore] LocalServiceModule = "OpenSim.Services.Connectors.dll:SimulationDataService" From 3229e32b4e818c6a0897800d8770c95f90ee3a94 Mon Sep 17 00:00:00 2001 From: BlueWall Date: Mon, 4 Jun 2012 17:22:46 -0400 Subject: [PATCH 317/547] Add replaceable region modules to the "show modules" command --- OpenSim/Region/Application/OpenSim.cs | 78 +++++++++++++++++---------- 1 file changed, 49 insertions(+), 29 deletions(-) diff --git a/OpenSim/Region/Application/OpenSim.cs b/OpenSim/Region/Application/OpenSim.cs index c0913c5296..76ac82797b 100644 --- a/OpenSim/Region/Application/OpenSim.cs +++ b/OpenSim/Region/Application/OpenSim.cs @@ -971,8 +971,7 @@ namespace OpenSim if (showParams.Length > 1 && showParams[1] == "full") { agents = m_sceneManager.GetCurrentScenePresences(); - } - else + } else { agents = m_sceneManager.GetCurrentSceneAvatars(); } @@ -981,7 +980,8 @@ namespace OpenSim MainConsole.Instance.Output( String.Format("{0,-16} {1,-16} {2,-37} {3,-11} {4,-16} {5,-30}", "Firstname", "Lastname", - "Agent ID", "Root/Child", "Region", "Position")); + "Agent ID", "Root/Child", "Region", "Position") + ); foreach (ScenePresence presence in agents) { @@ -991,8 +991,7 @@ namespace OpenSim if (regionInfo == null) { regionName = "Unresolvable"; - } - else + } else { regionName = regionInfo.RegionName; } @@ -1005,7 +1004,8 @@ namespace OpenSim presence.UUID, presence.IsChildAgent ? "Child" : "Root", regionName, - presence.AbsolutePosition.ToString())); + presence.AbsolutePosition.ToString()) + ); } MainConsole.Instance.Output(String.Empty); @@ -1014,16 +1014,20 @@ namespace OpenSim case "connections": System.Text.StringBuilder connections = new System.Text.StringBuilder("Connections:\n"); m_sceneManager.ForEachScene( - delegate(Scene scene) - { - scene.ForEachClient( - delegate(IClientAPI client) - { - connections.AppendFormat("{0}: {1} ({2}) from {3} on circuit {4}\n", - scene.RegionInfo.RegionName, client.Name, client.AgentId, client.RemoteEndPoint, client.CircuitCode); - } + delegate(Scene scene) { + scene.ForEachClient( + delegate(IClientAPI client) { + connections.AppendFormat( + "{0}: {1} ({2}) from {3} on circuit {4}\n", + scene.RegionInfo.RegionName, + client.Name, + client.AgentId, + client.RemoteEndPoint, + client.CircuitCode ); } + ); + } ); MainConsole.Instance.Output(connections.ToString()); @@ -1032,13 +1036,17 @@ namespace OpenSim case "circuits": System.Text.StringBuilder acd = new System.Text.StringBuilder("Agent Circuits:\n"); m_sceneManager.ForEachScene( - delegate(Scene scene) - { - //this.HttpServer. - acd.AppendFormat("{0}:\n", scene.RegionInfo.RegionName); - foreach (AgentCircuitData aCircuit in scene.AuthenticateHandler.GetAgentCircuits().Values) - acd.AppendFormat("\t{0} {1} ({2})\n", aCircuit.firstname, aCircuit.lastname, (aCircuit.child ? "Child" : "Root")); - } + delegate(Scene scene) { + //this.HttpServer. + acd.AppendFormat("{0}:\n", scene.RegionInfo.RegionName); + foreach (AgentCircuitData aCircuit in scene.AuthenticateHandler.GetAgentCircuits().Values) + acd.AppendFormat( + "\t{0} {1} ({2})\n", + aCircuit.firstname, + aCircuit.lastname, + (aCircuit.child ? "Child" : "Root") + ); + } ); MainConsole.Instance.Output(acd.ToString()); @@ -1079,17 +1087,29 @@ namespace OpenSim } m_sceneManager.ForEachScene( - delegate(Scene scene) + delegate(Scene scene) { + m_log.Error("The currently loaded modules in " + scene.RegionInfo.RegionName + " are:"); + foreach (IRegionModule module in scene.Modules.Values) { - m_log.Error("The currently loaded modules in " + scene.RegionInfo.RegionName + " are:"); - foreach (IRegionModule module in scene.Modules.Values) + if (!module.IsSharedModule) { - if (!module.IsSharedModule) - { - m_log.Error("Region Module: " + module.Name); - } + m_log.Error("Region Module: " + module.Name); } - }); + } + } + ); + + m_sceneManager.ForEachScene( + delegate(Scene scene) { + MainConsole.Instance.Output("Loaded new region modules in" + scene.RegionInfo.RegionName + " are:"); + foreach (IRegionModuleBase module in scene.RegionModules.Values) + { + Type type = module.GetType().GetInterface("ISharedRegionModule"); + string module_type = type != null ? "Shared" : "Non-Shared"; + MainConsole.Instance.OutputFormat("New Region Module ({0}): {1}", module_type, module.Name); + } + } + ); MainConsole.Instance.Output(""); break; From a7f4804f53f391d5d67bf3484733ab5e41bc34be Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Mon, 4 Jun 2012 23:07:53 +0100 Subject: [PATCH 318/547] Properly show per frame millisecond statistics per frame, not as amount of time taken per second. This is to make these statistics actually match their names (and also be more accurate as number of frames can vary under heavy load) Currently using scene frames (11.23 every second) instead of physics frames (56.18 per second) --- .../Framework/Scenes/SimStatsReporter.cs | 63 ++++++++++++------- 1 file changed, 41 insertions(+), 22 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/SimStatsReporter.cs b/OpenSim/Region/Framework/Scenes/SimStatsReporter.cs index 87af311a06..11c321bec0 100644 --- a/OpenSim/Region/Framework/Scenes/SimStatsReporter.cs +++ b/OpenSim/Region/Framework/Scenes/SimStatsReporter.cs @@ -117,11 +117,16 @@ namespace OpenSim.Region.Framework.Scenes private Dictionary m_lastReportedExtraSimStats = new Dictionary(); // Sending a stats update every 3 seconds- - private int statsUpdatesEveryMS = 3000; - private float statsUpdateFactor = 0; + private int m_statsUpdatesEveryMS = 3000; + private float m_statsUpdateFactor = 0; private float m_timeDilation = 0; private int m_fps = 0; + /// + /// Number of the last frame on which we processed a stats udpate. + /// + private uint m_lastUpdateFrame; + /// /// Our nominal fps target, as expected in fps stats when a sim is running normally. /// @@ -188,12 +193,12 @@ namespace OpenSim.Region.Framework.Scenes { m_scene = scene; m_reportedFpsCorrectionFactor = scene.MinFrameTime * m_nominalReportedFps; - statsUpdateFactor = (float)(statsUpdatesEveryMS / 1000); + m_statsUpdateFactor = (float)(m_statsUpdatesEveryMS / 1000); ReportingRegion = scene.RegionInfo; m_objectCapacity = scene.RegionInfo.ObjectCapacity; m_report.AutoReset = true; - m_report.Interval = statsUpdatesEveryMS; + m_report.Interval = m_statsUpdatesEveryMS; m_report.Elapsed += statsHeartBeat; m_report.Enabled = true; @@ -213,9 +218,9 @@ namespace OpenSim.Region.Framework.Scenes /// public void SetUpdateMS(int ms) { - statsUpdatesEveryMS = ms; - statsUpdateFactor = (float)(statsUpdatesEveryMS / 1000); - m_report.Interval = statsUpdatesEveryMS; + m_statsUpdatesEveryMS = ms; + m_statsUpdateFactor = (float)(m_statsUpdatesEveryMS / 1000); + m_report.Interval = m_statsUpdatesEveryMS; } private void statsHeartBeat(object sender, EventArgs e) @@ -247,7 +252,7 @@ namespace OpenSim.Region.Framework.Scenes int reportedFPS = (int)(m_fps * m_reportedFpsCorrectionFactor); // save the reported value so there is something available for llGetRegionFPS - lastReportedSimFPS = reportedFPS / statsUpdateFactor; + lastReportedSimFPS = reportedFPS / m_statsUpdateFactor; float physfps = ((m_pfps / 1000)); @@ -279,6 +284,14 @@ namespace OpenSim.Region.Framework.Scenes // 'statsUpdateFactor' is how often stats packets are sent in seconds. Used below to change // values to X-per-second values. + uint thisFrame = m_scene.Frame; + float framesUpdated = (float)(thisFrame - m_lastUpdateFrame); + m_lastUpdateFrame = thisFrame; + + // Avoid div-by-zero if somehow we've not updated any frames. + if (framesUpdated == 0) + framesUpdated = 1; + for (int i = 0; i < 21; i++) { sb[i] = new SimStatsPacket.StatBlock(); @@ -288,13 +301,13 @@ namespace OpenSim.Region.Framework.Scenes sb[0].StatValue = (Single.IsNaN(m_timeDilation)) ? 0.1f : m_timeDilation ; //((((m_timeDilation + (0.10f * statsUpdateFactor)) /10) / statsUpdateFactor)); sb[1].StatID = (uint) Stats.SimFPS; - sb[1].StatValue = reportedFPS / statsUpdateFactor; + sb[1].StatValue = reportedFPS / m_statsUpdateFactor; sb[2].StatID = (uint) Stats.PhysicsFPS; - sb[2].StatValue = physfps / statsUpdateFactor; + sb[2].StatValue = physfps / m_statsUpdateFactor; sb[3].StatID = (uint) Stats.AgentUpdates; - sb[3].StatValue = (m_agentUpdates / statsUpdateFactor); + sb[3].StatValue = (m_agentUpdates / m_statsUpdateFactor); sb[4].StatID = (uint) Stats.Agents; sb[4].StatValue = m_rootAgents; @@ -309,31 +322,31 @@ namespace OpenSim.Region.Framework.Scenes sb[7].StatValue = m_activePrim; sb[8].StatID = (uint)Stats.FrameMS; - sb[8].StatValue = m_frameMS / statsUpdateFactor; + sb[8].StatValue = m_frameMS / framesUpdated; sb[9].StatID = (uint)Stats.NetMS; - sb[9].StatValue = m_netMS / statsUpdateFactor; + sb[9].StatValue = m_netMS / framesUpdated; sb[10].StatID = (uint)Stats.PhysicsMS; - sb[10].StatValue = m_physicsMS / statsUpdateFactor; + sb[10].StatValue = m_physicsMS / framesUpdated; sb[11].StatID = (uint)Stats.ImageMS ; - sb[11].StatValue = m_imageMS / statsUpdateFactor; + sb[11].StatValue = m_imageMS / framesUpdated; sb[12].StatID = (uint)Stats.OtherMS; - sb[12].StatValue = m_otherMS / statsUpdateFactor; + sb[12].StatValue = m_otherMS / framesUpdated; sb[13].StatID = (uint)Stats.InPacketsPerSecond; - sb[13].StatValue = (m_inPacketsPerSecond / statsUpdateFactor); + sb[13].StatValue = (m_inPacketsPerSecond / m_statsUpdateFactor); sb[14].StatID = (uint)Stats.OutPacketsPerSecond; - sb[14].StatValue = (m_outPacketsPerSecond / statsUpdateFactor); + sb[14].StatValue = (m_outPacketsPerSecond / m_statsUpdateFactor); sb[15].StatID = (uint)Stats.UnAckedBytes; sb[15].StatValue = m_unAckedBytes; sb[16].StatID = (uint)Stats.AgentMS; - sb[16].StatValue = m_agentMS / statsUpdateFactor; + sb[16].StatValue = m_agentMS / framesUpdated; sb[17].StatID = (uint)Stats.PendingDownloads; sb[17].StatValue = m_pendingDownloads; @@ -345,7 +358,7 @@ namespace OpenSim.Region.Framework.Scenes sb[19].StatValue = m_activeScripts; sb[20].StatID = (uint)Stats.ScriptLinesPerSecond; - sb[20].StatValue = m_scriptLinesPerSecond / statsUpdateFactor; + sb[20].StatValue = m_scriptLinesPerSecond / m_statsUpdateFactor; for (int i = 0; i < 21; i++) { @@ -366,7 +379,7 @@ namespace OpenSim.Region.Framework.Scenes // Extra statistics that aren't currently sent to clients lock (m_lastReportedExtraSimStats) { - m_lastReportedExtraSimStats[LastReportedObjectUpdateStatName] = m_objectUpdates / statsUpdateFactor; + m_lastReportedExtraSimStats[LastReportedObjectUpdateStatName] = m_objectUpdates / m_statsUpdateFactor; Dictionary physicsStats = m_scene.PhysicsScene.GetStats(); @@ -374,7 +387,13 @@ namespace OpenSim.Region.Framework.Scenes { foreach (KeyValuePair tuple in physicsStats) { - m_lastReportedExtraSimStats[tuple.Key] = tuple.Value / statsUpdateFactor; + // FIXME: An extremely dirty hack to divide MS stats per frame rather than per second + // Need to change things so that stats source can indicate whether they are per second or + // per frame. + if (tuple.Key.EndsWith("MS")) + m_lastReportedExtraSimStats[tuple.Key] = tuple.Value / framesUpdated; + else + m_lastReportedExtraSimStats[tuple.Key] = tuple.Value / m_statsUpdateFactor; } } } From 655625ab872659cd8aff1fe5b11dc568c91aee6d Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Tue, 5 Jun 2012 00:17:55 +0100 Subject: [PATCH 319/547] Start sending spare frame time MS viewer stat. Make frame time correctly display total frame time, not just non-spare time. This makes it easier to see when components of frame time exceed normal permitted frame time. Currently reflect scene frame times. --- OpenSim/Region/Framework/Scenes/Scene.cs | 90 +++++++------- .../Framework/Scenes/SimStatsReporter.cs | 112 ++++++++++++------ 2 files changed, 124 insertions(+), 78 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 702e3220f6..ae35cb9e46 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -219,6 +219,7 @@ namespace OpenSim.Region.Framework.Scenes private int backupMS; private int terrainMS; private int landMS; + private int spareMS; /// /// Tick at which the last frame was processed. @@ -1360,43 +1361,41 @@ namespace OpenSim.Region.Framework.Scenes endFrame = Frame + frames; float physicsFPS = 0f; - int tmpPhysicsMS, tmpPhysicsMS2, tmpAgentMS, tmpTempOnRezMS, evMS, backMS, terMS; - int previousFrameTick; - int maintc; + int previousFrameTick, tmpMS; + int maintc = Util.EnvironmentTickCount(); while (!m_shuttingDown && (endFrame == null || Frame < endFrame)) { - maintc = Util.EnvironmentTickCount(); ++Frame; // m_log.DebugFormat("[SCENE]: Processing frame {0} in {1}", Frame, RegionInfo.RegionName); - agentMS = tempOnRezMS = eventMS = backupMS = terrainMS = landMS = 0; + agentMS = tempOnRezMS = eventMS = backupMS = terrainMS = landMS = spareMS = 0; try { // Apply taints in terrain module to terrain in physics scene if (Frame % m_update_terrain == 0) { - terMS = Util.EnvironmentTickCount(); + tmpMS = Util.EnvironmentTickCount(); UpdateTerrain(); - terrainMS = Util.EnvironmentTickCountSubtract(terMS); + terrainMS = Util.EnvironmentTickCountSubtract(tmpMS); } - tmpPhysicsMS2 = Util.EnvironmentTickCount(); + tmpMS = Util.EnvironmentTickCount(); if ((Frame % m_update_physics == 0) && m_physics_enabled) m_sceneGraph.UpdatePreparePhysics(); - physicsMS2 = Util.EnvironmentTickCountSubtract(tmpPhysicsMS2); + physicsMS2 = Util.EnvironmentTickCountSubtract(tmpMS); // Apply any pending avatar force input to the avatar's velocity - tmpAgentMS = Util.EnvironmentTickCount(); + tmpMS = Util.EnvironmentTickCount(); if (Frame % m_update_entitymovement == 0) m_sceneGraph.UpdateScenePresenceMovement(); - agentMS = Util.EnvironmentTickCountSubtract(tmpAgentMS); + agentMS = Util.EnvironmentTickCountSubtract(tmpMS); // Perform the main physics update. This will do the actual work of moving objects and avatars according to their // velocity - tmpPhysicsMS = Util.EnvironmentTickCount(); + tmpMS = Util.EnvironmentTickCount(); if (Frame % m_update_physics == 0) { if (m_physics_enabled) @@ -1405,9 +1404,9 @@ namespace OpenSim.Region.Framework.Scenes if (SynchronizeScene != null) SynchronizeScene(this); } - physicsMS = Util.EnvironmentTickCountSubtract(tmpPhysicsMS); + physicsMS = Util.EnvironmentTickCountSubtract(tmpMS); - tmpAgentMS = Util.EnvironmentTickCount(); + tmpMS = Util.EnvironmentTickCount(); // Check if any objects have reached their targets CheckAtTargets(); @@ -1422,29 +1421,29 @@ namespace OpenSim.Region.Framework.Scenes if (Frame % m_update_presences == 0) m_sceneGraph.UpdatePresences(); - agentMS += Util.EnvironmentTickCountSubtract(tmpAgentMS); + agentMS += Util.EnvironmentTickCountSubtract(tmpMS); // Delete temp-on-rez stuff if (Frame % m_update_temp_cleaning == 0 && !m_cleaningTemps) { - tmpTempOnRezMS = Util.EnvironmentTickCount(); + tmpMS = Util.EnvironmentTickCount(); m_cleaningTemps = true; Util.FireAndForget(delegate { CleanTempObjects(); m_cleaningTemps = false; }); - tempOnRezMS = Util.EnvironmentTickCountSubtract(tmpTempOnRezMS); + tempOnRezMS = Util.EnvironmentTickCountSubtract(tmpMS); } if (Frame % m_update_events == 0) { - evMS = Util.EnvironmentTickCount(); + tmpMS = Util.EnvironmentTickCount(); UpdateEvents(); - eventMS = Util.EnvironmentTickCountSubtract(evMS); + eventMS = Util.EnvironmentTickCountSubtract(tmpMS); } if (Frame % m_update_backup == 0) { - backMS = Util.EnvironmentTickCount(); + tmpMS = Util.EnvironmentTickCount(); UpdateStorageBackup(); - backupMS = Util.EnvironmentTickCountSubtract(backMS); + backupMS = Util.EnvironmentTickCountSubtract(tmpMS); } //if (Frame % m_update_land == 0) @@ -1453,24 +1452,6 @@ namespace OpenSim.Region.Framework.Scenes // UpdateLand(); // landMS = Util.EnvironmentTickCountSubtract(ldMS); //} - - frameMS = Util.EnvironmentTickCountSubtract(maintc); - otherMS = tempOnRezMS + eventMS + backupMS + terrainMS + landMS; - - // if (Frame%m_update_avatars == 0) - // UpdateInWorldTime(); - StatsReporter.AddPhysicsFPS(physicsFPS); - StatsReporter.AddTimeDilation(TimeDilation); - StatsReporter.AddFPS(1); - - // frameMS currently records work frame times, not total frame times (work + any required sleep to - // reach min frame time. - StatsReporter.addFrameMS(frameMS); - - StatsReporter.addAgentMS(agentMS); - StatsReporter.addPhysicsMS(physicsMS + physicsMS2); - StatsReporter.addOtherMS(otherMS); - StatsReporter.addScriptLines(m_sceneGraph.GetScriptLPS()); if (LoginsDisabled && Frame == 20) { @@ -1521,13 +1502,34 @@ namespace OpenSim.Region.Framework.Scenes previousFrameTick = m_lastFrameTick; m_lastFrameTick = Util.EnvironmentTickCount(); - maintc = Util.EnvironmentTickCountSubtract(m_lastFrameTick, maintc); - maintc = (int)(MinFrameTime * 1000) - maintc; + tmpMS = Util.EnvironmentTickCountSubtract(m_lastFrameTick, maintc); + tmpMS = (int)(MinFrameTime * 1000) - tmpMS; - if (maintc > 0) - Thread.Sleep(maintc); + if (tmpMS > 0) + { + Thread.Sleep(tmpMS); + spareMS += tmpMS; + } - // Optionally warn if a frame takes double the amount of time that it should. + frameMS = Util.EnvironmentTickCountSubtract(maintc); + maintc = Util.EnvironmentTickCount(); + + otherMS = tempOnRezMS + eventMS + backupMS + terrainMS + landMS; + + // if (Frame%m_update_avatars == 0) + // UpdateInWorldTime(); + StatsReporter.AddPhysicsFPS(physicsFPS); + StatsReporter.AddTimeDilation(TimeDilation); + StatsReporter.AddFPS(1); + + StatsReporter.addFrameMS(frameMS); + StatsReporter.addAgentMS(agentMS); + StatsReporter.addPhysicsMS(physicsMS + physicsMS2); + StatsReporter.addOtherMS(otherMS); + StatsReporter.AddSpareMS(spareMS); + StatsReporter.addScriptLines(m_sceneGraph.GetScriptLPS()); + + // Optionally warn if a frame takes double the amount of time that it should. if (DebugUpdates && Util.EnvironmentTickCountSubtract( m_lastFrameTick, previousFrameTick) > (int)(MinFrameTime * 1000 * 2)) diff --git a/OpenSim/Region/Framework/Scenes/SimStatsReporter.cs b/OpenSim/Region/Framework/Scenes/SimStatsReporter.cs index 11c321bec0..88e0b05369 100644 --- a/OpenSim/Region/Framework/Scenes/SimStatsReporter.cs +++ b/OpenSim/Region/Framework/Scenes/SimStatsReporter.cs @@ -56,10 +56,17 @@ namespace OpenSim.Region.Framework.Scenes public event YourStatsAreWrong OnStatsIncorrect; - private SendStatResult handlerSendStatResult = null; + private SendStatResult handlerSendStatResult; - private YourStatsAreWrong handlerStatsIncorrect = null; + private YourStatsAreWrong handlerStatsIncorrect; + /// + /// These are the IDs of stats sent in the StatsPacket to the viewer. + /// + /// + /// Some of these are not relevant to OpenSimulator since it is architected differently to other simulators + /// (e.g. script instructions aren't executed as part of the frame loop so 'script time' is tricky). + /// public enum Stats : uint { TimeDilation = 0, @@ -83,7 +90,20 @@ namespace OpenSim.Region.Framework.Scenes OutPacketsPerSecond = 18, PendingDownloads = 19, PendingUploads = 20, + VirtualSizeKb = 21, + ResidentSizeKb = 22, + PendingLocalUploads = 23, UnAckedBytes = 24, + PhysicsPinnedTasks = 25, + PhysicsLodTasks = 26, + SimPhysicsStepMs = 27, + SimPhysicsShapeMs = 28, + SimPhysicsOtherMs = 29, + SimPhysicsMemory = 30, + ScriptEps = 31, + SimSpareMs = 32, + SimSleepMs = 33, + SimIoPumpTime = 34 } /// @@ -118,9 +138,9 @@ namespace OpenSim.Region.Framework.Scenes // Sending a stats update every 3 seconds- private int m_statsUpdatesEveryMS = 3000; - private float m_statsUpdateFactor = 0; - private float m_timeDilation = 0; - private int m_fps = 0; + private float m_statsUpdateFactor; + private float m_timeDilation; + private int m_fps; /// /// Number of the last frame on which we processed a stats udpate. @@ -143,41 +163,42 @@ namespace OpenSim.Region.Framework.Scenes private float m_reportedFpsCorrectionFactor = 5; // saved last reported value so there is something available for llGetRegionFPS - private float lastReportedSimFPS = 0; - private float[] lastReportedSimStats = new float[21]; - private float m_pfps = 0; + private float lastReportedSimFPS; + private float[] lastReportedSimStats = new float[22]; + private float m_pfps; /// /// Number of agent updates requested in this stats cycle /// - private int m_agentUpdates = 0; + private int m_agentUpdates; /// /// Number of object updates requested in this stats cycle /// private int m_objectUpdates; - private int m_frameMS = 0; - private int m_netMS = 0; - private int m_agentMS = 0; - private int m_physicsMS = 0; - private int m_imageMS = 0; - private int m_otherMS = 0; + private int m_frameMS; + private int m_spareMS; + private int m_netMS; + private int m_agentMS; + private int m_physicsMS; + private int m_imageMS; + private int m_otherMS; //Ckrinke: (3-21-08) Comment out to remove a compiler warning. Bring back into play when needed. //Ckrinke private int m_scriptMS = 0; - private int m_rootAgents = 0; - private int m_childAgents = 0; - private int m_numPrim = 0; - private int m_inPacketsPerSecond = 0; - private int m_outPacketsPerSecond = 0; - private int m_activePrim = 0; - private int m_unAckedBytes = 0; - private int m_pendingDownloads = 0; - private int m_pendingUploads = 0; - private int m_activeScripts = 0; - private int m_scriptLinesPerSecond = 0; + private int m_rootAgents; + private int m_childAgents; + private int m_numPrim; + private int m_inPacketsPerSecond; + private int m_outPacketsPerSecond; + private int m_activePrim; + private int m_unAckedBytes; + private int m_pendingDownloads; + private int m_pendingUploads = 0; // FIXME: Not currently filled in + private int m_activeScripts; + private int m_scriptLinesPerSecond; private int m_objectCapacity = 45000; @@ -199,7 +220,7 @@ namespace OpenSim.Region.Framework.Scenes m_objectCapacity = scene.RegionInfo.ObjectCapacity; m_report.AutoReset = true; m_report.Interval = m_statsUpdatesEveryMS; - m_report.Elapsed += statsHeartBeat; + m_report.Elapsed += TriggerStatsHeartbeat; m_report.Enabled = true; if (StatsManager.SimExtraStats != null) @@ -208,7 +229,7 @@ namespace OpenSim.Region.Framework.Scenes public void Close() { - m_report.Elapsed -= statsHeartBeat; + m_report.Elapsed -= TriggerStatsHeartbeat; m_report.Close(); } @@ -223,9 +244,23 @@ namespace OpenSim.Region.Framework.Scenes m_report.Interval = m_statsUpdatesEveryMS; } + private void TriggerStatsHeartbeat(object sender, EventArgs args) + { + try + { + statsHeartBeat(sender, args); + } + catch (Exception e) + { + m_log.Warn(string.Format( + "[SIM STATS REPORTER] Update for {0} failed with exception ", + m_scene.RegionInfo.RegionName), e); + } + } + private void statsHeartBeat(object sender, EventArgs e) { - SimStatsPacket.StatBlock[] sb = new SimStatsPacket.StatBlock[21]; + SimStatsPacket.StatBlock[] sb = new SimStatsPacket.StatBlock[22]; SimStatsPacket.RegionBlock rb = new SimStatsPacket.RegionBlock(); // Know what's not thread safe in Mono... modifying timers. @@ -292,7 +327,7 @@ namespace OpenSim.Region.Framework.Scenes if (framesUpdated == 0) framesUpdated = 1; - for (int i = 0; i < 21; i++) + for (int i = 0; i < 22; i++) { sb[i] = new SimStatsPacket.StatBlock(); } @@ -359,8 +394,11 @@ namespace OpenSim.Region.Framework.Scenes sb[20].StatID = (uint)Stats.ScriptLinesPerSecond; sb[20].StatValue = m_scriptLinesPerSecond / m_statsUpdateFactor; - - for (int i = 0; i < 21; i++) + + sb[21].StatID = (uint)Stats.SimSpareMs; + sb[21].StatValue = m_spareMS / framesUpdated; + + for (int i = 0; i < 22; i++) { lastReportedSimStats[i] = sb[i].StatValue; } @@ -398,11 +436,11 @@ namespace OpenSim.Region.Framework.Scenes } } - resetvalues(); + ResetValues(); } } - private void resetvalues() + private void ResetValues() { m_timeDilation = 0; m_fps = 0; @@ -420,6 +458,7 @@ namespace OpenSim.Region.Framework.Scenes m_physicsMS = 0; m_imageMS = 0; m_otherMS = 0; + m_spareMS = 0; //Ckrinke This variable is not used, so comment to remove compiler warning until it is used. //Ckrinke m_scriptMS = 0; @@ -498,6 +537,11 @@ namespace OpenSim.Region.Framework.Scenes m_frameMS += ms; } + public void AddSpareMS(int ms) + { + m_spareMS += ms; + } + public void addNetMS(int ms) { m_netMS += ms; From 96d1ba90d7f801c779924ea04656d0fb53ea9d32 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Tue, 5 Jun 2012 00:27:51 +0100 Subject: [PATCH 320/547] Scale down per frame MS stats to match scaled simulator FPS stat. This makes frame time stats properly tally with fps, which saves confusion and makes it easier to interpret numbers. In some ways this is not so artifical - physics FPS runs at the higher rate. --- OpenSim/Region/Framework/Scenes/SimStatsReporter.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Region/Framework/Scenes/SimStatsReporter.cs b/OpenSim/Region/Framework/Scenes/SimStatsReporter.cs index 88e0b05369..742d42a7e0 100644 --- a/OpenSim/Region/Framework/Scenes/SimStatsReporter.cs +++ b/OpenSim/Region/Framework/Scenes/SimStatsReporter.cs @@ -320,7 +320,7 @@ namespace OpenSim.Region.Framework.Scenes // values to X-per-second values. uint thisFrame = m_scene.Frame; - float framesUpdated = (float)(thisFrame - m_lastUpdateFrame); + float framesUpdated = (float)(thisFrame - m_lastUpdateFrame) * m_reportedFpsCorrectionFactor; m_lastUpdateFrame = thisFrame; // Avoid div-by-zero if somehow we've not updated any frames. From 01280e9b9447f41347f7e22302c9d94503398882 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Tue, 5 Jun 2012 00:34:18 +0100 Subject: [PATCH 321/547] Remove unused ScenePresence list structure in llGetAgentList() --- OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index deb68b83f4..fb0fdc998d 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -5583,7 +5583,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api } } } - List presenceIds = new List(); World.ForEachRootScenePresence( delegate (ScenePresence ssp) From 008c6a4610fa7b710a9e2546cc09d9fee57e5795 Mon Sep 17 00:00:00 2001 From: Talun Date: Fri, 1 Jun 2012 00:39:26 +0100 Subject: [PATCH 322/547] Mantis 4597 AgentPaused packet is ignored. The packet was actually being handled but not acted on. This change extends the default timeout for paused clients to 5 minutes and makes both the paused and non-paused timeout periods configurable. --- .../ClientStack/Linden/UDP/LLUDPServer.cs | 18 +++++++++++++++--- bin/OpenSimDefaults.ini | 13 +++++++++++++ 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs index edf91cb685..32ba590718 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs @@ -155,7 +155,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP private int m_defaultRTO = 0; private int m_maxRTO = 0; - + private int m_ackTimeout = 0; + private int m_pausedAckTimeout = 0; private bool m_disableFacelights = false; public Socket Server { get { return null; } } @@ -198,11 +199,15 @@ namespace OpenSim.Region.ClientStack.LindenUDP m_defaultRTO = config.GetInt("DefaultRTO", 0); m_maxRTO = config.GetInt("MaxRTO", 0); m_disableFacelights = config.GetBoolean("DisableFacelights", false); + m_ackTimeout = 1000 * config.GetInt("AckTimeout", 60); + m_pausedAckTimeout = 1000 * config.GetInt("PausedAckTimeout", 300); } else { PrimUpdatesPerCallback = 100; TextureSendLimit = 20; + m_ackTimeout = 1000 * 60; // 1 minute + m_pausedAckTimeout = 1000 * 300; // 5 minutes } #region BinaryStats @@ -491,8 +496,15 @@ namespace OpenSim.Region.ClientStack.LindenUDP return; // Disconnect an agent if no packets are received for some time - //FIXME: Make 60 an .ini setting - if ((Environment.TickCount & Int32.MaxValue) - udpClient.TickLastPacketReceived > 1000 * 60) + int timeoutTicks = m_ackTimeout; + + // Allow more slack if the client is "paused" eg file upload dialogue is open + // Some sort of limit is needed in case the client crashes, loses its network connection + // or some other disaster prevents it from sendung the AgentResume + if (udpClient.IsPaused) + timeoutTicks = m_pausedAckTimeout; + + if ((Environment.TickCount & Int32.MaxValue) - udpClient.TickLastPacketReceived > timeoutTicks) { m_log.Warn("[LLUDPSERVER]: Ack timeout, disconnecting " + udpClient.AgentID); StatsManager.SimExtraStats.AddAbnormalClientThreadTermination(); diff --git a/bin/OpenSimDefaults.ini b/bin/OpenSimDefaults.ini index 27d86e8f8c..c67e45a0ff 100644 --- a/bin/OpenSimDefaults.ini +++ b/bin/OpenSimDefaults.ini @@ -536,6 +536,19 @@ ; ;DisableFacelights = false + ; The time to wait before disconecting an unresponsive client. + ; The time is in seconds. The default is one minute + ; + ;AckTimeout = 60 + + ; The time to wait before disconecting an unresponsive paused client. + ; A client can be paused when the file selection dialog is open during file upload. + ; This gives extra time to find files via the dialog but will still disconnect if + ; the client crashes or loses its network connection + ; The time is in seconds. The default is five minutes. + ; + ;PausedAckTimeout = 300 + [ClientStack.LindenCaps] ;; Long list of capabilities taken from ;; http://wiki.secondlife.com/wiki/Current_Sim_Capabilities From 42179578fc5292d9bd12aeccc45948d908c42d1a Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Tue, 5 Jun 2012 01:33:58 +0100 Subject: [PATCH 323/547] Allow fix-phantoms command to appear even if CombineContiguousRegions = false, since this allows one to go back from a megaregion to normal regions. Adapted from a patch by Garmin Kawaguichi in http://opensimulator.org/mantis/view.php?id=6027 Garmin says that fix-phantoms allows one to reset objects when going back from megaregion to normal regions as well as the othe rway around. Thanks! --- .../RegionCombinerModule.cs | 24 +++++++++---------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/OpenSim/Region/RegionCombinerModule/RegionCombinerModule.cs b/OpenSim/Region/RegionCombinerModule/RegionCombinerModule.cs index 40daf1343c..355502863c 100644 --- a/OpenSim/Region/RegionCombinerModule/RegionCombinerModule.cs +++ b/OpenSim/Region/RegionCombinerModule/RegionCombinerModule.cs @@ -61,7 +61,7 @@ namespace OpenSim.Region.RegionCombinerModule /// /// Is this module enabled? /// - private bool enabledYN = false; + private bool m_combineContiguousRegions = false; /// /// This holds the root regions for the megaregions. @@ -79,14 +79,12 @@ namespace OpenSim.Region.RegionCombinerModule public void Initialise(IConfigSource source) { IConfig myConfig = source.Configs["Startup"]; - enabledYN = myConfig.GetBoolean("CombineContiguousRegions", false); + m_combineContiguousRegions = myConfig.GetBoolean("CombineContiguousRegions", false); - if (enabledYN) - { - MainConsole.Instance.Commands.AddCommand( - "RegionCombinerModule", false, "fix-phantoms", "fix-phantoms", - "Fixes phantom objects after an import to megaregions", FixPhantoms); - } + MainConsole.Instance.Commands.AddCommand( + "RegionCombinerModule", false, "fix-phantoms", "fix-phantoms", + "Fixes phantom objects after an import to a megaregion or a change from a megaregion back to normal regions", + FixPhantoms); } public void Close() @@ -95,7 +93,7 @@ namespace OpenSim.Region.RegionCombinerModule public void AddRegion(Scene scene) { - if (enabledYN) + if (m_combineContiguousRegions) scene.RegisterModuleInterface(this); } @@ -105,7 +103,10 @@ namespace OpenSim.Region.RegionCombinerModule public void RegionLoaded(Scene scene) { - if (enabledYN) + lock (m_startingScenes) + m_startingScenes.Add(scene.RegionInfo.originRegionID, scene); + + if (m_combineContiguousRegions) { RegionLoadedDoWork(scene); @@ -208,7 +209,6 @@ namespace OpenSim.Region.RegionCombinerModule { return; } - } } @@ -220,8 +220,6 @@ namespace OpenSim.Region.RegionCombinerModule return; // */ - lock (m_startingScenes) - m_startingScenes.Add(scene.RegionInfo.originRegionID, scene); // Give each region a standard set of non-infinite borders Border northBorder = new Border(); From a5410c2c19bfef9242d9cfcfc1b4fea67f470fd5 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Tue, 5 Jun 2012 01:37:40 +0100 Subject: [PATCH 324/547] minor: Add user feedback when executing fix-phantoms --- OpenSim/Region/RegionCombinerModule/RegionCombinerModule.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/OpenSim/Region/RegionCombinerModule/RegionCombinerModule.cs b/OpenSim/Region/RegionCombinerModule/RegionCombinerModule.cs index 355502863c..204c4ff5fb 100644 --- a/OpenSim/Region/RegionCombinerModule/RegionCombinerModule.cs +++ b/OpenSim/Region/RegionCombinerModule/RegionCombinerModule.cs @@ -1066,6 +1066,8 @@ namespace OpenSim.Region.RegionCombinerModule foreach (Scene s in scenes) { + MainConsole.Instance.OutputFormat("Fixing phantoms for {0}", s.RegionInfo.RegionName); + s.ForEachSOG(so => so.AbsolutePosition = so.AbsolutePosition); } } From 6adc810eaaf067e25ac88b023a20543577a2d5fd Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Tue, 5 Jun 2012 19:40:16 +0100 Subject: [PATCH 325/547] Stop accidentally reading 4 Int16s instead of 2 in SIZE section of Terragen file when loaded from a stream. Fixes a bug introduced 2 weeks ago in 67ebe80 Thanks to Plugh for pointing this out. --- .../Region/CoreModules/World/Terrain/FileLoaders/Terragen.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/Terragen.cs b/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/Terragen.cs index 71c71e6cd5..7a0db2664c 100644 --- a/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/Terragen.cs +++ b/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/Terragen.cs @@ -178,8 +178,6 @@ namespace OpenSim.Region.CoreModules.World.Terrain.FileLoaders // int sztmp = bs.ReadInt16() + 1; // fileWidth = sztmp; // fileHeight = sztmp; - bs.ReadInt16(); - bs.ReadInt16(); bs.ReadInt16(); bs.ReadInt16(); break; From abf94627f6752c81eec6ebe0412bdcb725a66037 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Wed, 6 Jun 2012 02:45:36 +0100 Subject: [PATCH 326/547] Ensure closure of bitmap and memory stream with using() statements in WorldViewModule. If this has any effect then it will only be to the map images returned via requests to the /worldview simulator HTTP path (not enabled by default) --- .../World/WorldView/WorldViewModule.cs | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/OpenSim/Region/OptionalModules/World/WorldView/WorldViewModule.cs b/OpenSim/Region/OptionalModules/World/WorldView/WorldViewModule.cs index 48c242db51..1aee39a5b9 100644 --- a/OpenSim/Region/OptionalModules/World/WorldView/WorldViewModule.cs +++ b/OpenSim/Region/OptionalModules/World/WorldView/WorldViewModule.cs @@ -113,14 +113,15 @@ namespace OpenSim.Region.OptionalModules.World.WorldView if (!m_Enabled) return new Byte[0]; - Bitmap bmp = m_Generator.CreateViewImage(pos, rot, fov, width, - height, usetex); + using (Bitmap bmp = m_Generator.CreateViewImage(pos, rot, fov, width, height, usetex)) + { + using (MemoryStream str = new MemoryStream()) + { + bmp.Save(str, ImageFormat.Jpeg); - MemoryStream str = new MemoryStream(); - - bmp.Save(str, ImageFormat.Jpeg); - - return str.ToArray(); + return str.ToArray(); + } + } } } } From 3b250211803ee5a39888c6c5bd05b60d253a22b6 Mon Sep 17 00:00:00 2001 From: SignpostMarv Date: Tue, 5 Jun 2012 15:11:45 +0100 Subject: [PATCH 327/547] enabling all corners of a sim to be set in one call --- .../World/Estate/EstateManagementCommands.cs | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/OpenSim/Region/CoreModules/World/Estate/EstateManagementCommands.cs b/OpenSim/Region/CoreModules/World/Estate/EstateManagementCommands.cs index d2bbea34b8..3b84d5728f 100644 --- a/OpenSim/Region/CoreModules/World/Estate/EstateManagementCommands.cs +++ b/OpenSim/Region/CoreModules/World/Estate/EstateManagementCommands.cs @@ -73,7 +73,7 @@ namespace OpenSim.Region.CoreModules.World.Estate "set terrain heights [] []", "Sets the terrain texture heights on corner # to /, if or are specified, it will only " + "set it on regions with a matching coordinate. Specify -1 in or to wildcard" + - " that coordinate. Corner # SW = 0, NW = 1, SE = 2, NE = 3.", + " that coordinate. Corner # SW = 0, NW = 1, SE = 2, NE = 3, all corners = -1.", consoleSetTerrainHeights); m_module.Scene.AddCommand( @@ -143,6 +143,16 @@ namespace OpenSim.Region.CoreModules.World.Estate switch (corner) { + case -1: + m_module.Scene.RegionInfo.RegionSettings.Elevation1SW = lowValue; + m_module.Scene.RegionInfo.RegionSettings.Elevation2SW = highValue; + m_module.Scene.RegionInfo.RegionSettings.Elevation1NW = lowValue; + m_module.Scene.RegionInfo.RegionSettings.Elevation2NW = highValue; + m_module.Scene.RegionInfo.RegionSettings.Elevation1SE = lowValue; + m_module.Scene.RegionInfo.RegionSettings.Elevation2SE = highValue; + m_module.Scene.RegionInfo.RegionSettings.Elevation1NE = lowValue; + m_module.Scene.RegionInfo.RegionSettings.Elevation2NE = highValue; + break; case 0: m_module.Scene.RegionInfo.RegionSettings.Elevation1SW = lowValue; m_module.Scene.RegionInfo.RegionSettings.Elevation2SW = highValue; From 2b0de66216ca57cf2eac52e777bb362023f8f30a Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Wed, 6 Jun 2012 04:11:16 +0100 Subject: [PATCH 328/547] Actively dispose of Bitmaps in Warp3D image module and world map module once we've finished with them. This might help with memory leakage issues though I suspect it won't. --- .../World/Warp3DMap/MapImageModule.cs | 76 ++-- .../World/Warp3DMap/TerrainSplat.cs | 380 +++++++++--------- .../World/WorldMap/WorldMapModule.cs | 7 +- 3 files changed, 248 insertions(+), 215 deletions(-) diff --git a/OpenSim/Region/CoreModules/World/Warp3DMap/MapImageModule.cs b/OpenSim/Region/CoreModules/World/Warp3DMap/MapImageModule.cs index 4f4e296b27..3538b4673a 100644 --- a/OpenSim/Region/CoreModules/World/Warp3DMap/MapImageModule.cs +++ b/OpenSim/Region/CoreModules/World/Warp3DMap/MapImageModule.cs @@ -204,7 +204,10 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap Bitmap bitmap = renderer.Scene.getImage(); if (m_useAntiAliasing) - bitmap = ImageUtils.ResizeImage(bitmap, viewport.Width, viewport.Height); + { + using (Bitmap origBitmap = bitmap) + bitmap = ImageUtils.ResizeImage(origBitmap, viewport.Width, viewport.Height); + } return bitmap; } @@ -318,8 +321,17 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap uint globalX, globalY; Utils.LongToUInts(m_scene.RegionInfo.RegionHandle, out globalX, out globalY); - Bitmap image = TerrainSplat.Splat(heightmap, textureIDs, startHeights, heightRanges, new Vector3d(globalX, globalY, 0.0), m_scene.AssetService, textureTerrain); - warp_Texture texture = new warp_Texture(image); + warp_Texture texture; + + using ( + Bitmap image + = TerrainSplat.Splat( + heightmap, textureIDs, startHeights, heightRanges, + new Vector3d(globalX, globalY, 0.0), m_scene.AssetService, textureTerrain)) + { + texture = new warp_Texture(image); + } + warp_Material material = new warp_Material(texture); material.setReflectivity(50); renderer.Scene.addMaterial("TerrainColor", material); @@ -546,42 +558,46 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap { try { - Bitmap bitmap = (Bitmap)J2kImage.FromStream(stream); - width = bitmap.Width; - height = bitmap.Height; + int pixelBytes; - BitmapData bitmapData = bitmap.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadOnly, bitmap.PixelFormat); - int pixelBytes = (bitmap.PixelFormat == PixelFormat.Format24bppRgb) ? 3 : 4; - - // Sum up the individual channels - unsafe + using (Bitmap bitmap = (Bitmap)J2kImage.FromStream(stream)) { - if (pixelBytes == 4) + width = bitmap.Width; + height = bitmap.Height; + + BitmapData bitmapData = bitmap.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadOnly, bitmap.PixelFormat); + pixelBytes = (bitmap.PixelFormat == PixelFormat.Format24bppRgb) ? 3 : 4; + + // Sum up the individual channels + unsafe { - for (int y = 0; y < height; y++) + if (pixelBytes == 4) { - byte* row = (byte*)bitmapData.Scan0 + (y * bitmapData.Stride); - - for (int x = 0; x < width; x++) + for (int y = 0; y < height; y++) { - b += row[x * pixelBytes + 0]; - g += row[x * pixelBytes + 1]; - r += row[x * pixelBytes + 2]; - a += row[x * pixelBytes + 3]; + byte* row = (byte*)bitmapData.Scan0 + (y * bitmapData.Stride); + + for (int x = 0; x < width; x++) + { + b += row[x * pixelBytes + 0]; + g += row[x * pixelBytes + 1]; + r += row[x * pixelBytes + 2]; + a += row[x * pixelBytes + 3]; + } } } - } - else - { - for (int y = 0; y < height; y++) + else { - byte* row = (byte*)bitmapData.Scan0 + (y * bitmapData.Stride); - - for (int x = 0; x < width; x++) + for (int y = 0; y < height; y++) { - b += row[x * pixelBytes + 0]; - g += row[x * pixelBytes + 1]; - r += row[x * pixelBytes + 2]; + byte* row = (byte*)bitmapData.Scan0 + (y * bitmapData.Stride); + + for (int x = 0; x < width; x++) + { + b += row[x * pixelBytes + 0]; + g += row[x * pixelBytes + 1]; + r += row[x * pixelBytes + 2]; + } } } } diff --git a/OpenSim/Region/CoreModules/World/Warp3DMap/TerrainSplat.cs b/OpenSim/Region/CoreModules/World/Warp3DMap/TerrainSplat.cs index 7bf675daff..91252f7396 100644 --- a/OpenSim/Region/CoreModules/World/Warp3DMap/TerrainSplat.cs +++ b/OpenSim/Region/CoreModules/World/Warp3DMap/TerrainSplat.cs @@ -84,218 +84,234 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap Debug.Assert(heightRanges.Length == 4); Bitmap[] detailTexture = new Bitmap[4]; + Bitmap output = null; + BitmapData outputData = null; - if (textureTerrain) + try { - // Swap empty terrain textureIDs with default IDs - for (int i = 0; i < textureIDs.Length; i++) + if (textureTerrain) { - if (textureIDs[i] == UUID.Zero) - textureIDs[i] = DEFAULT_TERRAIN_DETAIL[i]; - } - - #region Texture Fetching - - if (assetService != null) - { - for (int i = 0; i < 4; i++) + // Swap empty terrain textureIDs with default IDs + for (int i = 0; i < textureIDs.Length; i++) { - AssetBase asset; - UUID cacheID = UUID.Combine(TERRAIN_CACHE_MAGIC, textureIDs[i]); - - // Try to fetch a cached copy of the decoded/resized version of this texture - asset = assetService.GetCached(cacheID.ToString()); - if (asset != null) + if (textureIDs[i] == UUID.Zero) + textureIDs[i] = DEFAULT_TERRAIN_DETAIL[i]; + } + + #region Texture Fetching + + if (assetService != null) + { + for (int i = 0; i < 4; i++) { - try - { - using (System.IO.MemoryStream stream = new System.IO.MemoryStream(asset.Data)) - detailTexture[i] = (Bitmap)Image.FromStream(stream); - } - catch (Exception ex) - { - m_log.Warn("Failed to decode cached terrain texture " + cacheID + - " (textureID: " + textureIDs[i] + "): " + ex.Message); - } - } - - if (detailTexture[i] == null) - { - // Try to fetch the original JPEG2000 texture, resize if needed, and cache as PNG - asset = assetService.Get(textureIDs[i].ToString()); + AssetBase asset; + UUID cacheID = UUID.Combine(TERRAIN_CACHE_MAGIC, textureIDs[i]); + + // Try to fetch a cached copy of the decoded/resized version of this texture + asset = assetService.GetCached(cacheID.ToString()); if (asset != null) { - try { detailTexture[i] = (Bitmap)CSJ2K.J2kImage.FromBytes(asset.Data); } + try + { + using (System.IO.MemoryStream stream = new System.IO.MemoryStream(asset.Data)) + detailTexture[i] = (Bitmap)Image.FromStream(stream); + } catch (Exception ex) { - m_log.Warn("Failed to decode terrain texture " + asset.ID + ": " + ex.Message); + m_log.Warn("Failed to decode cached terrain texture " + cacheID + + " (textureID: " + textureIDs[i] + "): " + ex.Message); } } - - if (detailTexture[i] != null) + + if (detailTexture[i] == null) { - Bitmap bitmap = detailTexture[i]; - - // Make sure this texture is the correct size, otherwise resize - if (bitmap.Width != 256 || bitmap.Height != 256) - bitmap = ImageUtils.ResizeImage(bitmap, 256, 256); - - // Save the decoded and resized texture to the cache - byte[] data; - using (System.IO.MemoryStream stream = new System.IO.MemoryStream()) + // Try to fetch the original JPEG2000 texture, resize if needed, and cache as PNG + asset = assetService.Get(textureIDs[i].ToString()); + if (asset != null) { - bitmap.Save(stream, ImageFormat.Png); - data = stream.ToArray(); + try { detailTexture[i] = (Bitmap)CSJ2K.J2kImage.FromBytes(asset.Data); } + catch (Exception ex) + { + m_log.Warn("Failed to decode terrain texture " + asset.ID + ": " + ex.Message); + } } - - // Cache a PNG copy of this terrain texture - AssetBase newAsset = new AssetBase + + if (detailTexture[i] != null) { - Data = data, - Description = "PNG", - Flags = AssetFlags.Collectable, - FullID = cacheID, - ID = cacheID.ToString(), - Local = true, - Name = String.Empty, - Temporary = true, - Type = (sbyte)AssetType.Unknown - }; - newAsset.Metadata.ContentType = "image/png"; - assetService.Store(newAsset); + Bitmap bitmap = detailTexture[i]; + + // Make sure this texture is the correct size, otherwise resize + if (bitmap.Width != 256 || bitmap.Height != 256) + { + using (Bitmap origBitmap = bitmap) + { + bitmap = ImageUtils.ResizeImage(origBitmap, 256, 256); + } + } + + // Save the decoded and resized texture to the cache + byte[] data; + using (System.IO.MemoryStream stream = new System.IO.MemoryStream()) + { + bitmap.Save(stream, ImageFormat.Png); + data = stream.ToArray(); + } + + // Cache a PNG copy of this terrain texture + AssetBase newAsset = new AssetBase + { + Data = data, + Description = "PNG", + Flags = AssetFlags.Collectable, + FullID = cacheID, + ID = cacheID.ToString(), + Local = true, + Name = String.Empty, + Temporary = true, + Type = (sbyte)AssetType.Unknown + }; + newAsset.Metadata.ContentType = "image/png"; + assetService.Store(newAsset); + } } } } + + #endregion Texture Fetching } - - #endregion Texture Fetching - } - - // Fill in any missing textures with a solid color - for (int i = 0; i < 4; i++) - { - if (detailTexture[i] == null) + + // Fill in any missing textures with a solid color + for (int i = 0; i < 4; i++) { - // Create a solid color texture for this layer - detailTexture[i] = new Bitmap(256, 256, PixelFormat.Format24bppRgb); - using (Graphics gfx = Graphics.FromImage(detailTexture[i])) + if (detailTexture[i] == null) { - using (SolidBrush brush = new SolidBrush(DEFAULT_TERRAIN_COLOR[i])) - gfx.FillRectangle(brush, 0, 0, 256, 256); + // Create a solid color texture for this layer + detailTexture[i] = new Bitmap(256, 256, PixelFormat.Format24bppRgb); + using (Graphics gfx = Graphics.FromImage(detailTexture[i])) + { + using (SolidBrush brush = new SolidBrush(DEFAULT_TERRAIN_COLOR[i])) + gfx.FillRectangle(brush, 0, 0, 256, 256); + } } } - } - - #region Layer Map - - float[] layermap = new float[256 * 256]; - - for (int y = 0; y < 256; y++) - { - for (int x = 0; x < 256; x++) - { - float height = heightmap[y * 256 + x]; - - float pctX = (float)x / 255f; - float pctY = (float)y / 255f; - - // Use bilinear interpolation between the four corners of start height and - // height range to select the current values at this position - float startHeight = ImageUtils.Bilinear( - startHeights[0], - startHeights[2], - startHeights[1], - startHeights[3], - pctX, pctY); - startHeight = Utils.Clamp(startHeight, 0f, 255f); - - float heightRange = ImageUtils.Bilinear( - heightRanges[0], - heightRanges[2], - heightRanges[1], - heightRanges[3], - pctX, pctY); - heightRange = Utils.Clamp(heightRange, 0f, 255f); - - // Generate two frequencies of perlin noise based on our global position - // The magic values were taken from http://opensimulator.org/wiki/Terrain_Splatting - Vector3 vec = new Vector3 - ( - ((float)regionPosition.X + x) * 0.20319f, - ((float)regionPosition.Y + y) * 0.20319f, - height * 0.25f - ); - - float lowFreq = Perlin.noise2(vec.X * 0.222222f, vec.Y * 0.222222f) * 6.5f; - float highFreq = Perlin.turbulence2(vec.X, vec.Y, 2f) * 2.25f; - float noise = (lowFreq + highFreq) * 2f; - - // Combine the current height, generated noise, start height, and height range parameters, then scale all of it - float layer = ((height + noise - startHeight) / heightRange) * 4f; - if (Single.IsNaN(layer)) layer = 0f; - layermap[y * 256 + x] = Utils.Clamp(layer, 0f, 3f); - } - } - - #endregion Layer Map - - #region Texture Compositing - - Bitmap output = new Bitmap(256, 256, PixelFormat.Format24bppRgb); - BitmapData outputData = output.LockBits(new Rectangle(0, 0, 256, 256), ImageLockMode.WriteOnly, PixelFormat.Format24bppRgb); - - unsafe - { - // Get handles to all of the texture data arrays - BitmapData[] datas = new BitmapData[] - { - detailTexture[0].LockBits(new Rectangle(0, 0, 256, 256), ImageLockMode.ReadOnly, detailTexture[0].PixelFormat), - detailTexture[1].LockBits(new Rectangle(0, 0, 256, 256), ImageLockMode.ReadOnly, detailTexture[1].PixelFormat), - detailTexture[2].LockBits(new Rectangle(0, 0, 256, 256), ImageLockMode.ReadOnly, detailTexture[2].PixelFormat), - detailTexture[3].LockBits(new Rectangle(0, 0, 256, 256), ImageLockMode.ReadOnly, detailTexture[3].PixelFormat) - }; - - int[] comps = new int[] - { - (datas[0].PixelFormat == PixelFormat.Format32bppArgb) ? 4 : 3, - (datas[1].PixelFormat == PixelFormat.Format32bppArgb) ? 4 : 3, - (datas[2].PixelFormat == PixelFormat.Format32bppArgb) ? 4 : 3, - (datas[3].PixelFormat == PixelFormat.Format32bppArgb) ? 4 : 3 - }; - + + #region Layer Map + + float[] layermap = new float[256 * 256]; + for (int y = 0; y < 256; y++) { for (int x = 0; x < 256; x++) { - float layer = layermap[y * 256 + x]; - - // Select two textures - int l0 = (int)Math.Floor(layer); - int l1 = Math.Min(l0 + 1, 3); - - byte* ptrA = (byte*)datas[l0].Scan0 + y * datas[l0].Stride + x * comps[l0]; - byte* ptrB = (byte*)datas[l1].Scan0 + y * datas[l1].Stride + x * comps[l1]; - byte* ptrO = (byte*)outputData.Scan0 + y * outputData.Stride + x * 3; - - float aB = *(ptrA + 0); - float aG = *(ptrA + 1); - float aR = *(ptrA + 2); - - float bB = *(ptrB + 0); - float bG = *(ptrB + 1); - float bR = *(ptrB + 2); - - float layerDiff = layer - l0; - - // Interpolate between the two selected textures - *(ptrO + 0) = (byte)Math.Floor(aB + layerDiff * (bB - aB)); - *(ptrO + 1) = (byte)Math.Floor(aG + layerDiff * (bG - aG)); - *(ptrO + 2) = (byte)Math.Floor(aR + layerDiff * (bR - aR)); + float height = heightmap[y * 256 + x]; + + float pctX = (float)x / 255f; + float pctY = (float)y / 255f; + + // Use bilinear interpolation between the four corners of start height and + // height range to select the current values at this position + float startHeight = ImageUtils.Bilinear( + startHeights[0], + startHeights[2], + startHeights[1], + startHeights[3], + pctX, pctY); + startHeight = Utils.Clamp(startHeight, 0f, 255f); + + float heightRange = ImageUtils.Bilinear( + heightRanges[0], + heightRanges[2], + heightRanges[1], + heightRanges[3], + pctX, pctY); + heightRange = Utils.Clamp(heightRange, 0f, 255f); + + // Generate two frequencies of perlin noise based on our global position + // The magic values were taken from http://opensimulator.org/wiki/Terrain_Splatting + Vector3 vec = new Vector3 + ( + ((float)regionPosition.X + x) * 0.20319f, + ((float)regionPosition.Y + y) * 0.20319f, + height * 0.25f + ); + + float lowFreq = Perlin.noise2(vec.X * 0.222222f, vec.Y * 0.222222f) * 6.5f; + float highFreq = Perlin.turbulence2(vec.X, vec.Y, 2f) * 2.25f; + float noise = (lowFreq + highFreq) * 2f; + + // Combine the current height, generated noise, start height, and height range parameters, then scale all of it + float layer = ((height + noise - startHeight) / heightRange) * 4f; + if (Single.IsNaN(layer)) layer = 0f; + layermap[y * 256 + x] = Utils.Clamp(layer, 0f, 3f); } } - + + #endregion Layer Map + + #region Texture Compositing + + output = new Bitmap(256, 256, PixelFormat.Format24bppRgb); + outputData = output.LockBits(new Rectangle(0, 0, 256, 256), ImageLockMode.WriteOnly, PixelFormat.Format24bppRgb); + + unsafe + { + // Get handles to all of the texture data arrays + BitmapData[] datas = new BitmapData[] + { + detailTexture[0].LockBits(new Rectangle(0, 0, 256, 256), ImageLockMode.ReadOnly, detailTexture[0].PixelFormat), + detailTexture[1].LockBits(new Rectangle(0, 0, 256, 256), ImageLockMode.ReadOnly, detailTexture[1].PixelFormat), + detailTexture[2].LockBits(new Rectangle(0, 0, 256, 256), ImageLockMode.ReadOnly, detailTexture[2].PixelFormat), + detailTexture[3].LockBits(new Rectangle(0, 0, 256, 256), ImageLockMode.ReadOnly, detailTexture[3].PixelFormat) + }; + + int[] comps = new int[] + { + (datas[0].PixelFormat == PixelFormat.Format32bppArgb) ? 4 : 3, + (datas[1].PixelFormat == PixelFormat.Format32bppArgb) ? 4 : 3, + (datas[2].PixelFormat == PixelFormat.Format32bppArgb) ? 4 : 3, + (datas[3].PixelFormat == PixelFormat.Format32bppArgb) ? 4 : 3 + }; + + for (int y = 0; y < 256; y++) + { + for (int x = 0; x < 256; x++) + { + float layer = layermap[y * 256 + x]; + + // Select two textures + int l0 = (int)Math.Floor(layer); + int l1 = Math.Min(l0 + 1, 3); + + byte* ptrA = (byte*)datas[l0].Scan0 + y * datas[l0].Stride + x * comps[l0]; + byte* ptrB = (byte*)datas[l1].Scan0 + y * datas[l1].Stride + x * comps[l1]; + byte* ptrO = (byte*)outputData.Scan0 + y * outputData.Stride + x * 3; + + float aB = *(ptrA + 0); + float aG = *(ptrA + 1); + float aR = *(ptrA + 2); + + float bB = *(ptrB + 0); + float bG = *(ptrB + 1); + float bR = *(ptrB + 2); + + float layerDiff = layer - l0; + + // Interpolate between the two selected textures + *(ptrO + 0) = (byte)Math.Floor(aB + layerDiff * (bB - aB)); + *(ptrO + 1) = (byte)Math.Floor(aG + layerDiff * (bG - aG)); + *(ptrO + 2) = (byte)Math.Floor(aR + layerDiff * (bR - aR)); + } + } + + for (int i = 0; i < 4; i++) + detailTexture[i].UnlockBits(datas[i]); + } + } + finally + { for (int i = 0; i < 4; i++) - detailTexture[i].UnlockBits(datas[i]); + if (detailTexture[i] != null) + detailTexture[i].Dispose(); } output.UnlockBits(outputData); diff --git a/OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs b/OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs index 2335bea2a4..c1c6b49705 100644 --- a/OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs +++ b/OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs @@ -1343,14 +1343,14 @@ namespace OpenSim.Region.CoreModules.World.WorldMap if (terrain == null) return; + m_log.DebugFormat("[WORLDMAP]: Generating map image for {0}", m_scene.RegionInfo.RegionName); + byte[] data = terrain.WriteJpeg2000Image(); if (data == null) return; byte[] overlay = GenerateOverlay(); - m_log.Debug("[WORLDMAP]: STORING MAPTILE IMAGE"); - UUID terrainImageID = UUID.Random(); UUID parcelImageID = UUID.Zero; @@ -1365,7 +1365,8 @@ namespace OpenSim.Region.CoreModules.World.WorldMap asset.Flags = AssetFlags.Maptile; // Store the new one - m_log.DebugFormat("[WORLDMAP]: Storing map tile {0}", asset.ID); + m_log.DebugFormat("[WORLDMAP]: Storing map tile {0} for {1}", asset.ID, m_scene.RegionInfo.RegionName); + m_scene.AssetService.Store(asset); if (overlay != null) From 53c25a47780b5b1167f8e574dc8e9b935a0d5ddd Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Wed, 6 Jun 2012 04:15:00 +0100 Subject: [PATCH 329/547] Rename MapImageModule for Warp3D to Warp3DImageModule to match its class name and make it easier to distinguish between map image modules. --- .../World/Warp3DMap/{MapImageModule.cs => Warp3DImageModule.cs} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename OpenSim/Region/CoreModules/World/Warp3DMap/{MapImageModule.cs => Warp3DImageModule.cs} (100%) diff --git a/OpenSim/Region/CoreModules/World/Warp3DMap/MapImageModule.cs b/OpenSim/Region/CoreModules/World/Warp3DMap/Warp3DImageModule.cs similarity index 100% rename from OpenSim/Region/CoreModules/World/Warp3DMap/MapImageModule.cs rename to OpenSim/Region/CoreModules/World/Warp3DMap/Warp3DImageModule.cs From 514dd85199331d8246c3a0dfc9cf782f61f48ef6 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Wed, 6 Jun 2012 04:18:38 +0100 Subject: [PATCH 330/547] minor: Change log messages on Warp3DImageModule to show they are from this module --- .../World/Warp3DMap/Warp3DImageModule.cs | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/OpenSim/Region/CoreModules/World/Warp3DMap/Warp3DImageModule.cs b/OpenSim/Region/CoreModules/World/Warp3DMap/Warp3DImageModule.cs index 3538b4673a..9002a9f330 100644 --- a/OpenSim/Region/CoreModules/World/Warp3DMap/Warp3DImageModule.cs +++ b/OpenSim/Region/CoreModules/World/Warp3DMap/Warp3DImageModule.cs @@ -54,8 +54,7 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap private static readonly UUID TEXTURE_METADATA_MAGIC = new UUID("802dc0e0-f080-4931-8b57-d1be8611c4f3"); private static readonly Color4 WATER_COLOR = new Color4(29, 72, 96, 216); - private static readonly ILog m_log = - LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); private Scene m_scene; private IRendering m_primMesher; @@ -88,11 +87,11 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap if (renderers.Count > 0) { m_primMesher = RenderingLoader.LoadRenderer(renderers[0]); - m_log.Debug("[MAPTILE]: Loaded prim mesher " + m_primMesher.ToString()); + m_log.DebugFormat("[WARP 3D IMAGE MODULE]: Loaded prim mesher {0}", m_primMesher); } else { - m_log.Debug("[MAPTILE]: No prim mesher loaded, prim rendering will be disabled"); + m_log.Debug("[WARP 3D IMAGE MODULE]: No prim mesher loaded, prim rendering will be disabled"); } m_scene.RegisterModuleInterface(this); @@ -150,7 +149,7 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap } catch { - m_log.Warn("[MAPTILE]: Failed to load StartupConfig"); + m_log.Warn("[WARP 3D IMAGE MODULE]: Failed to load StartupConfig"); } m_colors.Clear(); @@ -222,7 +221,7 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap catch (Exception e) { // JPEG2000 encoder failed - m_log.Error("[MAPTILE]: Failed generating terrain map: " + e); + m_log.Error("[WARP 3D IMAGE MODULE]: Failed generating terrain map: ", e); } return null; @@ -619,7 +618,10 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap } catch (Exception ex) { - m_log.WarnFormat("[MAPTILE]: Error decoding JPEG2000 texture {0} ({1} bytes): {2}", textureID, j2kData.Length, ex.Message); + m_log.WarnFormat( + "[WARP 3D IMAGE MODULE]: Error decoding JPEG2000 texture {0} ({1} bytes): {2}", + textureID, j2kData.Length, ex.Message); + width = 0; height = 0; return new Color4(0.5f, 0.5f, 0.5f, 1.0f); From 34cb8a2ab3189952cb74a16cf5246a2da3847b7c Mon Sep 17 00:00:00 2001 From: Melanie Date: Wed, 6 Jun 2012 20:35:00 +0200 Subject: [PATCH 331/547] Fix not sending TransferInfo when an asset is not found. This clogs up the sound pipeline in the viewer. --- .../ClientStack/Linden/UDP/LLClientView.cs | 33 ++++++++++++++++--- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs index 98954026cd..18d8045fe0 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs @@ -2777,6 +2777,19 @@ namespace OpenSim.Region.ClientStack.LindenUDP } } + public void SendAssetNotFound(AssetRequestToClient req) + { + TransferInfoPacket Transfer = new TransferInfoPacket(); + Transfer.TransferInfo.ChannelType = 2; + Transfer.TransferInfo.Status = -2; + Transfer.TransferInfo.TargetType = 0; + Transfer.TransferInfo.Params = req.Params; + Transfer.TransferInfo.Size = 0; + Transfer.TransferInfo.TransferID = req.TransferRequestID; + Transfer.Header.Zerocoded = true; + OutPacket(Transfer, ThrottleOutPacketType.Asset); + } + public void SendTexture(AssetBase TextureAsset) { @@ -12181,14 +12194,27 @@ namespace OpenSim.Region.ClientStack.LindenUDP /// protected void AssetReceived(string id, Object sender, AssetBase asset) { - if (asset == null) - return; - TransferRequestPacket transferRequest = (TransferRequestPacket)sender; UUID requestID = UUID.Zero; byte source = (byte)SourceType.Asset; + AssetRequestToClient req = new AssetRequestToClient(); + + if (asset == null) + { + req.AssetInf = null; + req.AssetRequestSource = source; + req.IsTextureRequest = false; + req.NumPackets = 0; + req.Params = transferRequest.TransferInfo.Params; + req.RequestAssetID = requestID; + req.TransferRequestID = transferRequest.TransferInfo.TransferID; + + SendAssetNotFound(req); + return; + } + if (transferRequest.TransferInfo.SourceType == (int)SourceType.Asset) { requestID = new UUID(transferRequest.TransferInfo.Params, 0); @@ -12205,7 +12231,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP return; // The asset is known to exist and is in our cache, so add it to the AssetRequests list - AssetRequestToClient req = new AssetRequestToClient(); req.AssetInf = asset; req.AssetRequestSource = source; req.IsTextureRequest = false; From e09a74493f374b2fc837596f496b4338c49e074f Mon Sep 17 00:00:00 2001 From: Melanie Date: Wed, 6 Jun 2012 20:35:37 +0200 Subject: [PATCH 332/547] Reverse the logic of a conditional. Clears up a merge artefact. --- .../Framework/EntityTransfer/EntityTransferModule.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs index 7db2491a73..b9897c430e 100644 --- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs +++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs @@ -430,7 +430,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer // This may be a costly operation. The reg.ExternalEndPoint field is not a passive field, // it's actually doing a lot of work. IPEndPoint endPoint = finalDestination.ExternalEndPoint; - if (endPoint != null && endPoint.Address != null) + if (endPoint == null || endPoint.Address == null) { sp.ControllingClient.SendTeleportFailed("Remote Region appears to be down"); m_entityTransferStateMachine.ResetFromTransit(sp.UUID); From 67483a6e50e491b65ce5fdbd36e06ba697772b36 Mon Sep 17 00:00:00 2001 From: Melanie Date: Wed, 6 Jun 2012 20:36:47 +0200 Subject: [PATCH 333/547] Remove two causes of recursive locking. Merge artefact cleanup. --- .../Framework/Scenes/SceneObjectPartInventory.cs | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs index f5b98256cf..81477e7a42 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs @@ -176,16 +176,14 @@ namespace OpenSim.Region.Framework.Scenes /// public void ChangeInventoryOwner(UUID ownerId) { - m_items.LockItemsForWrite(true); - if (0 == Items.Count) - { - m_items.LockItemsForWrite(false); - return; - } + List items = GetInventoryItems(); + if (items.Count == 0) + return; + + m_items.LockItemsForWrite(true); HasInventoryChanged = true; m_part.ParentGroup.HasGroupChanged = true; - List items = GetInventoryItems(); foreach (TaskInventoryItem item in items) { if (ownerId != item.OwnerID) @@ -766,8 +764,8 @@ namespace OpenSim.Region.Framework.Scenes { if (item.Name == name) { - return item; m_items.LockItemsForRead(false); + return item; } } m_items.LockItemsForRead(false); From a12336390feda38cad0814ee62c1bfae43250030 Mon Sep 17 00:00:00 2001 From: Melanie Date: Wed, 6 Jun 2012 20:37:29 +0200 Subject: [PATCH 334/547] Remove useless logging of a bare-names stack trace. It's meaningless to a non-programmer and insufficient for a programmer. Add commented debug output and data collection to troubleshoot future locking issues. --- OpenSim/Framework/TaskInventoryDictionary.cs | 89 +++++++++++++------- 1 file changed, 57 insertions(+), 32 deletions(-) diff --git a/OpenSim/Framework/TaskInventoryDictionary.cs b/OpenSim/Framework/TaskInventoryDictionary.cs index 814758ae54..4d07746d2a 100644 --- a/OpenSim/Framework/TaskInventoryDictionary.cs +++ b/OpenSim/Framework/TaskInventoryDictionary.cs @@ -52,10 +52,10 @@ namespace OpenSim.Framework private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); private Thread LockedByThread; - private string WriterStack; +// private string WriterStack; - private Dictionary ReadLockers = - new Dictionary(); +// private Dictionary ReadLockers = +// new Dictionary(); /// /// An advanced lock for inventory data @@ -98,14 +98,25 @@ namespace OpenSim.Framework m_log.Error("[TaskInventoryDictionary] Recursive read lock requested. This should not happen and means something needs to be fixed. For now though, it's safe to continue."); try { - StackTrace stackTrace = new StackTrace(); // get call stack - StackFrame[] stackFrames = stackTrace.GetFrames(); // get method calls (frames) + // That call stack is useful for end users only. RealProgrammers need a full dump. Commented. + // StackTrace stackTrace = new StackTrace(); // get call stack + // StackFrame[] stackFrames = stackTrace.GetFrames(); // get method calls (frames) + // + // // write call stack method names + // foreach (StackFrame stackFrame in stackFrames) + // { + // m_log.Error("[SceneObjectGroup.m_parts] "+(stackFrame.GetMethod().Name)); // write method name + // } - // write call stack method names - foreach (StackFrame stackFrame in stackFrames) - { - m_log.Error("[SceneObjectGroup.m_parts] "+(stackFrame.GetMethod().Name)); // write method name - } + // The below is far more useful +// System.Console.WriteLine("------------------------------------------"); +// System.Console.WriteLine("My call stack:\n" + Environment.StackTrace); +// System.Console.WriteLine("------------------------------------------"); +// foreach (KeyValuePair kvp in ReadLockers) +// { +// System.Console.WriteLine("Locker name {0} call stack:\n" + kvp.Value, kvp.Key.Name); +// System.Console.WriteLine("------------------------------------------"); +// } } catch {} @@ -114,6 +125,16 @@ namespace OpenSim.Framework if (m_itemLock.RecursiveWriteCount > 0) { m_log.Error("[TaskInventoryDictionary] Recursive write lock requested. This should not happen and means something needs to be fixed."); +// try +// { +// System.Console.WriteLine("------------------------------------------"); +// System.Console.WriteLine("My call stack:\n" + Environment.StackTrace); +// System.Console.WriteLine("------------------------------------------"); +// System.Console.WriteLine("Locker's call stack:\n" + WriterStack); +// System.Console.WriteLine("------------------------------------------"); +// } +// catch +// {} m_itemLock.ExitWriteLock(); } @@ -123,15 +144,16 @@ namespace OpenSim.Framework if (m_itemLock.IsWriteLockHeld) { m_itemLock = new System.Threading.ReaderWriterLockSlim(); - System.Console.WriteLine("------------------------------------------"); - System.Console.WriteLine("My call stack:\n" + Environment.StackTrace); - System.Console.WriteLine("------------------------------------------"); - System.Console.WriteLine("Locker's call stack:\n" + WriterStack); - System.Console.WriteLine("------------------------------------------"); - LockedByThread = null; - ReadLockers.Clear(); +// System.Console.WriteLine("------------------------------------------"); +// System.Console.WriteLine("My call stack:\n" + Environment.StackTrace); +// System.Console.WriteLine("------------------------------------------"); +// System.Console.WriteLine("Locker's call stack:\n" + WriterStack); +// System.Console.WriteLine("------------------------------------------"); +// LockedByThread = null; +// ReadLockers.Clear(); } } +// ReadLockers[Thread.CurrentThread] = Environment.StackTrace; } else { @@ -139,6 +161,8 @@ namespace OpenSim.Framework { m_itemLock.ExitReadLock(); } +// if (m_itemLock.RecursiveReadCount == 0) +// ReadLockers.Remove(Thread.CurrentThread); } } @@ -158,6 +182,7 @@ namespace OpenSim.Framework if (m_itemLock.RecursiveWriteCount > 0) { m_log.Error("[TaskInventoryDictionary] Recursive write lock requested. This should not happen and means something needs to be fixed."); + m_itemLock.ExitWriteLock(); } while (!m_itemLock.TryEnterWriteLock(60000)) @@ -165,30 +190,30 @@ namespace OpenSim.Framework if (m_itemLock.IsWriteLockHeld) { m_log.Error("Thread lock detected while trying to aquire WRITE lock in TaskInventoryDictionary. Locked by thread " + LockedByThread.Name + ". I'm going to try to solve the thread lock automatically to preserve region stability, but this needs to be fixed."); - System.Console.WriteLine("------------------------------------------"); - System.Console.WriteLine("My call stack:\n" + Environment.StackTrace); - System.Console.WriteLine("------------------------------------------"); - System.Console.WriteLine("Locker's call stack:\n" + WriterStack); - System.Console.WriteLine("------------------------------------------"); +// System.Console.WriteLine("------------------------------------------"); +// System.Console.WriteLine("My call stack:\n" + Environment.StackTrace); +// System.Console.WriteLine("------------------------------------------"); +// System.Console.WriteLine("Locker's call stack:\n" + WriterStack); +// System.Console.WriteLine("------------------------------------------"); } else { m_log.Error("Thread lock detected while trying to aquire WRITE lock in TaskInventoryDictionary. Locked by a reader. I'm going to try to solve the thread lock automatically to preserve region stability, but this needs to be fixed."); - System.Console.WriteLine("------------------------------------------"); - System.Console.WriteLine("My call stack:\n" + Environment.StackTrace); - System.Console.WriteLine("------------------------------------------"); - foreach (KeyValuePair kvp in ReadLockers) - { - System.Console.WriteLine("Locker name {0} call stack:\n" + kvp.Value, kvp.Key.Name); - System.Console.WriteLine("------------------------------------------"); - } +// System.Console.WriteLine("------------------------------------------"); +// System.Console.WriteLine("My call stack:\n" + Environment.StackTrace); +// System.Console.WriteLine("------------------------------------------"); +// foreach (KeyValuePair kvp in ReadLockers) +// { +// System.Console.WriteLine("Locker name {0} call stack:\n" + kvp.Value, kvp.Key.Name); +// System.Console.WriteLine("------------------------------------------"); +// } } m_itemLock = new System.Threading.ReaderWriterLockSlim(); - ReadLockers.Clear(); +// ReadLockers.Clear(); } LockedByThread = Thread.CurrentThread; - WriterStack = Environment.StackTrace; +// WriterStack = Environment.StackTrace; } else { From b02db11c6990986a65e6790b5520b15d1c47e51e Mon Sep 17 00:00:00 2001 From: Melanie Date: Wed, 6 Jun 2012 20:38:42 +0200 Subject: [PATCH 335/547] Remove a null ref when an avatar's attachment gets the avatar velocity while the avatar is logging in or out. Also remove some unlocking calls without matching locking call. Merge artefact cleanup, again. --- .../ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index 5905958a87..e0b24dc514 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -2498,12 +2498,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api { m_host.AddScriptLPS(1); - Vector3 vel; + Vector3 vel = Vector3.Zero; if (m_host.ParentGroup.IsAttachment) { ScenePresence avatar = m_host.ParentGroup.Scene.GetScenePresence(m_host.ParentGroup.AttachedAvatar); - vel = avatar.Velocity; + if (avatar != null) + vel = avatar.Velocity; } else { @@ -10401,7 +10402,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api ShoutError("No permissions to track the camera"); return new LSL_Vector(); } - m_host.TaskInventory.LockItemsForRead(false); // ScenePresence presence = World.GetScenePresence(m_host.OwnerID); ScenePresence presence = World.GetScenePresence(m_item.PermsGranter); @@ -10425,7 +10425,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api ShoutError("No permissions to track the camera"); return new LSL_Rotation(); } - m_host.TaskInventory.LockItemsForRead(false); // ScenePresence presence = World.GetScenePresence(m_host.OwnerID); ScenePresence presence = World.GetScenePresence(m_item.PermsGranter); From 98b46d48fefc7801b7c9e496000e9329f4266e5e Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 7 Jun 2012 02:44:13 +0100 Subject: [PATCH 336/547] Allow the thread watchdog to accept an alarm method that is invoked if the timeout is breached. This alarm can then invoke this to log extra information. This is used in LLUDPServer to show which client was being processed when incoming and outgoing udp watchdog alarms are triggered. --- .../HttpServer/PollServiceRequestManager.cs | 2 + OpenSim/Framework/Watchdog.cs | 40 ++++++----- OpenSim/Region/Application/OpenSim.cs | 10 ++- .../ClientStack/Linden/UDP/LLUDPServer.cs | 69 +++++++++++++++++-- 4 files changed, 96 insertions(+), 25 deletions(-) diff --git a/OpenSim/Framework/Servers/HttpServer/PollServiceRequestManager.cs b/OpenSim/Framework/Servers/HttpServer/PollServiceRequestManager.cs index 0062d4ef15..f96fd1fa20 100644 --- a/OpenSim/Framework/Servers/HttpServer/PollServiceRequestManager.cs +++ b/OpenSim/Framework/Servers/HttpServer/PollServiceRequestManager.cs @@ -66,6 +66,7 @@ namespace OpenSim.Framework.Servers.HttpServer ThreadPriority.Normal, false, true, + null, int.MaxValue); } @@ -75,6 +76,7 @@ namespace OpenSim.Framework.Servers.HttpServer ThreadPriority.Normal, false, true, + null, 1000 * 60 * 10); } diff --git a/OpenSim/Framework/Watchdog.cs b/OpenSim/Framework/Watchdog.cs index e93e50e2ca..7552cd15b6 100644 --- a/OpenSim/Framework/Watchdog.cs +++ b/OpenSim/Framework/Watchdog.cs @@ -42,7 +42,7 @@ namespace OpenSim.Framework const double WATCHDOG_INTERVAL_MS = 2500.0d; /// Maximum timeout in milliseconds before a thread is considered dead - const int WATCHDOG_TIMEOUT_MS = 5000; + public const int WATCHDOG_TIMEOUT_MS = 5000; [System.Diagnostics.DebuggerDisplay("{Thread.Name}")] public class ThreadWatchdogInfo @@ -58,7 +58,7 @@ namespace OpenSim.Framework public int FirstTick { get; private set; } /// - /// First time this heartbeat update was invoked + /// Last time this heartbeat update was invoked /// public int LastTick { get; set; } @@ -77,6 +77,11 @@ namespace OpenSim.Framework /// public bool AlarmIfTimeout { get; set; } + /// + /// Method execute if alarm goes off. If null then no alarm method is fired. + /// + public Func AlarmMethod { get; set; } + public ThreadWatchdogInfo(Thread thread, int timeout) { Thread = thread; @@ -87,16 +92,10 @@ namespace OpenSim.Framework } /// - /// This event is called whenever a tracked thread is stopped or - /// has not called UpdateThread() in time - /// - /// The thread that has been identified as dead - /// The last time this thread called UpdateThread() - public delegate void WatchdogTimeout(Thread thread, int lastTick); - - /// This event is called whenever a tracked thread is - /// stopped or has not called UpdateThread() in time - public static event WatchdogTimeout OnWatchdogTimeout; + /// This event is called whenever a tracked thread is + /// stopped or has not called UpdateThread() in time< + /// /summary> + public static event Action OnWatchdogTimeout; private static readonly ILog m_log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); private static Dictionary m_threads; @@ -123,7 +122,7 @@ namespace OpenSim.Framework public static Thread StartThread( ThreadStart start, string name, ThreadPriority priority, bool isBackground, bool alarmIfTimeout) { - return StartThread(start, name, priority, isBackground, alarmIfTimeout, WATCHDOG_TIMEOUT_MS); + return StartThread(start, name, priority, isBackground, alarmIfTimeout, null, WATCHDOG_TIMEOUT_MS); } /// @@ -135,17 +134,24 @@ namespace OpenSim.Framework /// True to run this thread as a background /// thread, otherwise false /// Trigger an alarm function is we have timed out + /// + /// Alarm method to call if alarmIfTimeout is true and there is a timeout. + /// Normally, this will just return some useful debugging information. + /// /// Number of milliseconds to wait until we issue a warning about timeout. /// The newly created Thread object public static Thread StartThread( - ThreadStart start, string name, ThreadPriority priority, bool isBackground, bool alarmIfTimeout, int timeout) + ThreadStart start, string name, ThreadPriority priority, bool isBackground, + bool alarmIfTimeout, Func alarmMethod, int timeout) { Thread thread = new Thread(start); thread.Name = name; thread.Priority = priority; thread.IsBackground = isBackground; - ThreadWatchdogInfo twi = new ThreadWatchdogInfo(thread, timeout) { AlarmIfTimeout = alarmIfTimeout }; + ThreadWatchdogInfo twi + = new ThreadWatchdogInfo(thread, timeout) + { AlarmIfTimeout = alarmIfTimeout, AlarmMethod = alarmMethod }; m_log.DebugFormat( "[WATCHDOG]: Started tracking thread {0}, ID {1}", twi.Thread.Name, twi.Thread.ManagedThreadId); @@ -258,7 +264,7 @@ namespace OpenSim.Framework /// private static void WatchdogTimerElapsed(object sender, System.Timers.ElapsedEventArgs e) { - WatchdogTimeout callback = OnWatchdogTimeout; + Action callback = OnWatchdogTimeout; if (callback != null) { @@ -296,7 +302,7 @@ namespace OpenSim.Framework if (callbackInfos != null) foreach (ThreadWatchdogInfo callbackInfo in callbackInfos) - callback(callbackInfo.Thread, callbackInfo.LastTick); + callback(callbackInfo); } m_watchdogTimer.Start(); diff --git a/OpenSim/Region/Application/OpenSim.cs b/OpenSim/Region/Application/OpenSim.cs index 76ac82797b..caba236a9c 100644 --- a/OpenSim/Region/Application/OpenSim.cs +++ b/OpenSim/Region/Application/OpenSim.cs @@ -438,12 +438,16 @@ namespace OpenSim } } - private void WatchdogTimeoutHandler(System.Threading.Thread thread, int lastTick) + private void WatchdogTimeoutHandler(Watchdog.ThreadWatchdogInfo twi) { int now = Environment.TickCount & Int32.MaxValue; - m_log.ErrorFormat("[WATCHDOG]: Timeout detected for thread \"{0}\". ThreadState={1}. Last tick was {2}ms ago", - thread.Name, thread.ThreadState, now - lastTick); + m_log.ErrorFormat( + "[WATCHDOG]: Timeout detected for thread \"{0}\". ThreadState={1}. Last tick was {2}ms ago. {3}", + twi.Thread.Name, + twi.Thread.ThreadState, + now - twi.LastTick, + twi.AlarmMethod != null ? string.Format("Data: {0}", twi.AlarmMethod()) : ""); } #region Console Commands diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs index 32ba590718..e37adb86b8 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs @@ -163,6 +163,16 @@ namespace OpenSim.Region.ClientStack.LindenUDP private int m_malformedCount = 0; // Guard against a spamming attack + /// + /// Record current outgoing client for monitoring purposes. + /// + private IClientAPI m_currentOutgoingClient; + + /// + /// Recording current incoming client for monitoring purposes. + /// + private IClientAPI m_currentIncomingClient; + public LLUDPServer(IPAddress listenIP, ref uint port, int proxyPortOffsetParm, bool allow_alternate_port, IConfigSource configSource, AgentCircuitManager circuitManager) : base(listenIP, (int)port) { @@ -244,19 +254,56 @@ namespace OpenSim.Region.ClientStack.LindenUDP if (m_scene == null) throw new InvalidOperationException("[LLUDPSERVER]: Cannot LLUDPServer.Start() without an IScene reference"); - m_log.Info("[LLUDPSERVER]: Starting the LLUDP server in " + (m_asyncPacketHandling ? "asynchronous" : "synchronous") + " mode"); + m_log.InfoFormat( + "[LLUDPSERVER]: Starting the LLUDP server in {0} mode", + m_asyncPacketHandling ? "asynchronous" : "synchronous"); base.Start(m_recvBufferSize, m_asyncPacketHandling); // Start the packet processing threads Watchdog.StartThread( - IncomingPacketHandler, "Incoming Packets (" + m_scene.RegionInfo.RegionName + ")", ThreadPriority.Normal, false, true); + IncomingPacketHandler, + string.Format("Incoming Packets ({0})", m_scene.RegionInfo.RegionName), + ThreadPriority.Normal, + false, + true, + GetWatchdogIncomingAlarmData, + Watchdog.WATCHDOG_TIMEOUT_MS); + Watchdog.StartThread( - OutgoingPacketHandler, "Outgoing Packets (" + m_scene.RegionInfo.RegionName + ")", ThreadPriority.Normal, false, true); + OutgoingPacketHandler, + string.Format("Outgoing Packets ({0})", m_scene.RegionInfo.RegionName), + ThreadPriority.Normal, + false, + true, + GetWatchdogOutgoingAlarmData, + Watchdog.WATCHDOG_TIMEOUT_MS); m_elapsedMSSinceLastStatReport = Environment.TickCount; } + /// + /// If the outgoing UDP thread times out, then return client that was being processed to help with debugging. + /// + /// + private string GetWatchdogIncomingAlarmData() + { + return string.Format( + "Client is {0}", + m_currentIncomingClient != null ? m_currentIncomingClient.Name : "none"); + } + + /// + /// If the outgoing UDP thread times out, then return client that was being processed to help with debugging. + /// + /// + private string GetWatchdogOutgoingAlarmData() + { + return string.Format( + "Client is {0}", + m_currentOutgoingClient != null ? m_currentOutgoingClient.Name : "none"); + } + public new void Stop() { m_log.Info("[LLUDPSERVER]: Shutting down the LLUDP server for " + m_scene.RegionInfo.RegionName); @@ -1173,6 +1220,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP // client. m_packetSent will be set to true if a packet is sent m_scene.ForEachClient(clientPacketHandler); + m_currentOutgoingClient = null; + // If nothing was sent, sleep for the minimum amount of time before a // token bucket could get more tokens if (!m_packetSent) @@ -1191,6 +1240,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP private void ClientOutgoingPacketHandler(IClientAPI client) { + m_currentOutgoingClient = client; + try { if (client is LLClientView) @@ -1216,8 +1267,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP } catch (Exception ex) { - m_log.Error("[LLUDPSERVER]: OutgoingPacketHandler iteration for " + client.Name + - " threw an exception: " + ex.Message, ex); + m_log.Error( + string.Format("[LLUDPSERVER]: OutgoingPacketHandler iteration for {0} threw ", client.Name), ex); } } @@ -1243,6 +1294,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP { nticks++; watch1.Start(); + m_currentOutgoingClient = client; + try { if (client is LLClientView) @@ -1344,6 +1397,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP // Make sure this client is still alive if (m_scene.TryGetClient(udpClient.AgentID, out client)) { + m_currentIncomingClient = client; + try { // Process this packet @@ -1361,6 +1416,10 @@ namespace OpenSim.Region.ClientStack.LindenUDP m_log.ErrorFormat("[LLUDPSERVER]: Client packet handler for {0} for packet {1} threw an exception", udpClient.AgentID, packet.Type); m_log.Error(e.Message, e); } + finally + { + m_currentIncomingClient = null; + } } else { From 7550b97e65fa873b42624648747cec3e12a8e689 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 7 Jun 2012 04:00:29 +0100 Subject: [PATCH 337/547] Log warning if we try to remove a UDP client that has already been removed. --- OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs index e37adb86b8..09bb52c046 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs @@ -1114,6 +1114,12 @@ namespace OpenSim.Region.ClientStack.LindenUDP client.IsLoggingOut = true; client.Close(); } + else + { + m_log.WarnFormat( + "[LLUDPSERVER]: Tried to remove client with id {0} but not such client in {1}", + udpClient.AgentID, m_scene.RegionInfo.RegionName); + } } private void IncomingPacketHandler() From a1e857932a2019c3e93e1b708486f37e9bb86b26 Mon Sep 17 00:00:00 2001 From: BlueWall Date: Thu, 7 Jun 2012 10:15:40 -0400 Subject: [PATCH 338/547] Make change to fix Windows builds --- OpenSim/Framework/Servers/HttpServer/OSHttpRequest.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Framework/Servers/HttpServer/OSHttpRequest.cs b/OpenSim/Framework/Servers/HttpServer/OSHttpRequest.cs index fc8daf3732..3171759aa3 100644 --- a/OpenSim/Framework/Servers/HttpServer/OSHttpRequest.cs +++ b/OpenSim/Framework/Servers/HttpServer/OSHttpRequest.cs @@ -107,7 +107,7 @@ namespace OpenSim.Framework.Servers.HttpServer public bool IsSecured { - get { return _context.Secured; } + get { return _context.IsSecured; } } public bool KeepAlive From d5cc9596838a9335e5e9ed0877d26b802ee6c8e3 Mon Sep 17 00:00:00 2001 From: Talun Date: Thu, 7 Jun 2012 16:00:00 +0100 Subject: [PATCH 339/547] Mantis 6044 Building master currently fails. Add missing reference to System.Core Signed-off-by: BlueWall --- prebuild.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/prebuild.xml b/prebuild.xml index 5003ae7661..d02f2b939f 100644 --- a/prebuild.xml +++ b/prebuild.xml @@ -126,6 +126,7 @@ ../../../../bin/ + From 39cb2063bf7cd771514e4d69da1dab55a6a511a2 Mon Sep 17 00:00:00 2001 From: Melanie Date: Thu, 7 Jun 2012 19:02:43 +0200 Subject: [PATCH 340/547] Add collision sounds to the asset set --- bin/assets/AssetSets.xml | 6 + .../CollisionSoundsAssetSet.xml | 341 ++++++++++++++++++ .../CollisionSoundsAssetSet/attribution.txt | 8 + .../snd_FleshFlesh.ogg | Bin 0 -> 8829 bytes .../snd_FleshGlass.ogg | Bin 0 -> 8537 bytes .../snd_FleshMetal.ogg | Bin 0 -> 12830 bytes .../snd_FleshPlastic.ogg | Bin 0 -> 8858 bytes .../snd_FleshRubber.ogg | Bin 0 -> 10037 bytes .../snd_FleshStone.ogg | Bin 0 -> 10985 bytes .../CollisionSoundsAssetSet/snd_FleshWood.ogg | Bin 0 -> 8835 bytes .../snd_GlassFlesh.ogg | Bin 0 -> 8579 bytes .../snd_GlassGlass.ogg | Bin 0 -> 5456 bytes .../snd_GlassMetal.ogg | Bin 0 -> 13092 bytes .../snd_GlassPlastic.ogg | Bin 0 -> 6797 bytes .../snd_GlassRubber.ogg | Bin 0 -> 9760 bytes .../snd_GlassStone.ogg | Bin 0 -> 11185 bytes .../CollisionSoundsAssetSet/snd_GlassWood.ogg | Bin 0 -> 7048 bytes .../snd_MetalFlesh.ogg | Bin 0 -> 12917 bytes .../snd_MetalGlass.ogg | Bin 0 -> 13500 bytes .../snd_MetalMetal.ogg | Bin 0 -> 13513 bytes .../snd_MetalPlastic.ogg | Bin 0 -> 12814 bytes .../snd_MetalRubber.ogg | Bin 0 -> 13008 bytes .../snd_MetalStone.ogg | Bin 0 -> 13578 bytes .../CollisionSoundsAssetSet/snd_MetalWood.ogg | Bin 0 -> 13040 bytes .../snd_PlasticFlesh.ogg | Bin 0 -> 8510 bytes .../snd_PlasticGlass.ogg | Bin 0 -> 6797 bytes .../snd_PlasticMetal.ogg | Bin 0 -> 12814 bytes .../snd_PlasticPlastic.ogg | Bin 0 -> 6635 bytes .../snd_PlasticRubber.ogg | Bin 0 -> 9648 bytes .../snd_PlasticStone.ogg | Bin 0 -> 10640 bytes .../snd_PlasticWood.ogg | Bin 0 -> 6845 bytes .../snd_RubberFlesh.ogg | Bin 0 -> 9758 bytes .../snd_RubberGlass.ogg | Bin 0 -> 9871 bytes .../snd_RubberMetal.ogg | Bin 0 -> 12797 bytes .../snd_RubberPlastic.ogg | Bin 0 -> 9648 bytes .../snd_RubberRubber.ogg | Bin 0 -> 9647 bytes .../snd_RubberStone.ogg | Bin 0 -> 10850 bytes .../snd_RubberWood.ogg | Bin 0 -> 9716 bytes .../snd_StoneFlesh.ogg | Bin 0 -> 10896 bytes .../snd_StoneGlass.ogg | Bin 0 -> 11188 bytes .../snd_StoneMetal.ogg | Bin 0 -> 13517 bytes .../snd_StonePlastic.ogg | Bin 0 -> 11196 bytes .../snd_StoneRubber.ogg | Bin 0 -> 10885 bytes .../snd_StoneStone.ogg | Bin 0 -> 11040 bytes .../CollisionSoundsAssetSet/snd_StoneWood.ogg | Bin 0 -> 10947 bytes .../snd_TerrainFlesh.ogg | Bin 0 -> 8750 bytes .../snd_TerrainGlass.ogg | Bin 0 -> 8126 bytes .../snd_TerrainMetal.ogg | Bin 0 -> 12839 bytes .../snd_TerrainPlastic.ogg | Bin 0 -> 7920 bytes .../snd_TerrainRubber.ogg | Bin 0 -> 9480 bytes .../snd_TerrainStone.ogg | Bin 0 -> 10807 bytes .../snd_TerrainWood.ogg | Bin 0 -> 7999 bytes .../CollisionSoundsAssetSet/snd_WoodFlesh.ogg | Bin 0 -> 8827 bytes .../CollisionSoundsAssetSet/snd_WoodGlass.ogg | Bin 0 -> 7057 bytes .../CollisionSoundsAssetSet/snd_WoodMetal.ogg | Bin 0 -> 12818 bytes .../snd_WoodPlastic.ogg | Bin 0 -> 6990 bytes .../snd_WoodRubber.ogg | Bin 0 -> 9626 bytes .../CollisionSoundsAssetSet/snd_WoodStone.ogg | Bin 0 -> 10931 bytes .../CollisionSoundsAssetSet/snd_WoodWood.ogg | Bin 0 -> 6696 bytes 59 files changed, 355 insertions(+) create mode 100644 bin/assets/CollisionSoundsAssetSet/CollisionSoundsAssetSet.xml create mode 100644 bin/assets/CollisionSoundsAssetSet/attribution.txt create mode 100644 bin/assets/CollisionSoundsAssetSet/snd_FleshFlesh.ogg create mode 100644 bin/assets/CollisionSoundsAssetSet/snd_FleshGlass.ogg create mode 100644 bin/assets/CollisionSoundsAssetSet/snd_FleshMetal.ogg create mode 100644 bin/assets/CollisionSoundsAssetSet/snd_FleshPlastic.ogg create mode 100644 bin/assets/CollisionSoundsAssetSet/snd_FleshRubber.ogg create mode 100644 bin/assets/CollisionSoundsAssetSet/snd_FleshStone.ogg create mode 100644 bin/assets/CollisionSoundsAssetSet/snd_FleshWood.ogg create mode 100644 bin/assets/CollisionSoundsAssetSet/snd_GlassFlesh.ogg create mode 100644 bin/assets/CollisionSoundsAssetSet/snd_GlassGlass.ogg create mode 100644 bin/assets/CollisionSoundsAssetSet/snd_GlassMetal.ogg create mode 100644 bin/assets/CollisionSoundsAssetSet/snd_GlassPlastic.ogg create mode 100644 bin/assets/CollisionSoundsAssetSet/snd_GlassRubber.ogg create mode 100644 bin/assets/CollisionSoundsAssetSet/snd_GlassStone.ogg create mode 100644 bin/assets/CollisionSoundsAssetSet/snd_GlassWood.ogg create mode 100644 bin/assets/CollisionSoundsAssetSet/snd_MetalFlesh.ogg create mode 100644 bin/assets/CollisionSoundsAssetSet/snd_MetalGlass.ogg create mode 100644 bin/assets/CollisionSoundsAssetSet/snd_MetalMetal.ogg create mode 100644 bin/assets/CollisionSoundsAssetSet/snd_MetalPlastic.ogg create mode 100644 bin/assets/CollisionSoundsAssetSet/snd_MetalRubber.ogg create mode 100644 bin/assets/CollisionSoundsAssetSet/snd_MetalStone.ogg create mode 100644 bin/assets/CollisionSoundsAssetSet/snd_MetalWood.ogg create mode 100644 bin/assets/CollisionSoundsAssetSet/snd_PlasticFlesh.ogg create mode 100644 bin/assets/CollisionSoundsAssetSet/snd_PlasticGlass.ogg create mode 100644 bin/assets/CollisionSoundsAssetSet/snd_PlasticMetal.ogg create mode 100644 bin/assets/CollisionSoundsAssetSet/snd_PlasticPlastic.ogg create mode 100644 bin/assets/CollisionSoundsAssetSet/snd_PlasticRubber.ogg create mode 100644 bin/assets/CollisionSoundsAssetSet/snd_PlasticStone.ogg create mode 100644 bin/assets/CollisionSoundsAssetSet/snd_PlasticWood.ogg create mode 100644 bin/assets/CollisionSoundsAssetSet/snd_RubberFlesh.ogg create mode 100644 bin/assets/CollisionSoundsAssetSet/snd_RubberGlass.ogg create mode 100644 bin/assets/CollisionSoundsAssetSet/snd_RubberMetal.ogg create mode 100644 bin/assets/CollisionSoundsAssetSet/snd_RubberPlastic.ogg create mode 100644 bin/assets/CollisionSoundsAssetSet/snd_RubberRubber.ogg create mode 100644 bin/assets/CollisionSoundsAssetSet/snd_RubberStone.ogg create mode 100644 bin/assets/CollisionSoundsAssetSet/snd_RubberWood.ogg create mode 100644 bin/assets/CollisionSoundsAssetSet/snd_StoneFlesh.ogg create mode 100644 bin/assets/CollisionSoundsAssetSet/snd_StoneGlass.ogg create mode 100644 bin/assets/CollisionSoundsAssetSet/snd_StoneMetal.ogg create mode 100644 bin/assets/CollisionSoundsAssetSet/snd_StonePlastic.ogg create mode 100644 bin/assets/CollisionSoundsAssetSet/snd_StoneRubber.ogg create mode 100644 bin/assets/CollisionSoundsAssetSet/snd_StoneStone.ogg create mode 100644 bin/assets/CollisionSoundsAssetSet/snd_StoneWood.ogg create mode 100644 bin/assets/CollisionSoundsAssetSet/snd_TerrainFlesh.ogg create mode 100644 bin/assets/CollisionSoundsAssetSet/snd_TerrainGlass.ogg create mode 100644 bin/assets/CollisionSoundsAssetSet/snd_TerrainMetal.ogg create mode 100644 bin/assets/CollisionSoundsAssetSet/snd_TerrainPlastic.ogg create mode 100644 bin/assets/CollisionSoundsAssetSet/snd_TerrainRubber.ogg create mode 100644 bin/assets/CollisionSoundsAssetSet/snd_TerrainStone.ogg create mode 100644 bin/assets/CollisionSoundsAssetSet/snd_TerrainWood.ogg create mode 100644 bin/assets/CollisionSoundsAssetSet/snd_WoodFlesh.ogg create mode 100644 bin/assets/CollisionSoundsAssetSet/snd_WoodGlass.ogg create mode 100644 bin/assets/CollisionSoundsAssetSet/snd_WoodMetal.ogg create mode 100644 bin/assets/CollisionSoundsAssetSet/snd_WoodPlastic.ogg create mode 100644 bin/assets/CollisionSoundsAssetSet/snd_WoodRubber.ogg create mode 100644 bin/assets/CollisionSoundsAssetSet/snd_WoodStone.ogg create mode 100644 bin/assets/CollisionSoundsAssetSet/snd_WoodWood.ogg diff --git a/bin/assets/AssetSets.xml b/bin/assets/AssetSets.xml index c13ea422ee..829f845e5d 100644 --- a/bin/assets/AssetSets.xml +++ b/bin/assets/AssetSets.xml @@ -67,6 +67,12 @@
+ +
+ +
+ +
diff --git a/bin/assets/CollisionSoundsAssetSet/CollisionSoundsAssetSet.xml b/bin/assets/CollisionSoundsAssetSet/CollisionSoundsAssetSet.xml new file mode 100644 index 0000000000..7498ae0af8 --- /dev/null +++ b/bin/assets/CollisionSoundsAssetSet/CollisionSoundsAssetSet.xml @@ -0,0 +1,341 @@ + + + +
+ + + + +
+
+ + + + +
+
+ + + + +
+
+ + + + +
+
+ + + + +
+
+ + + + +
+
+ + + + +
+
+ + + + +
+
+ + + + +
+
+ + + + +
+
+ + + + +
+
+ + + + +
+
+ + + + +
+
+ + + + +
+
+ + + + +
+
+ + + + +
+
+ + + + +
+
+ + + + +
+
+ + + + +
+
+ + + + +
+
+ + + + +
+
+ + + + +
+
+ + + + +
+
+ + + + +
+
+ + + + +
+
+ + + + +
+
+ + + + +
+
+ + + + +
+
+ + + + +
+
+ + + + +
+
+ + + + +
+
+ + + + +
+
+ + + + +
+
+ + + + +
+
+ + + + +
+
+ + + + +
+
+ + + + +
+
+ + + + +
+
+ + + + +
+
+ + + + +
+
+ + + + +
+
+ + + + +
+
+ + + + +
+
+ + + + +
+
+ + + + +
+
+ + + + +
+
+ + + + +
+
+ + + + +
+
+ + + + +
+
+ + + + +
+
+ + + + +
+
+ + + + +
+
+ + + + +
+
+ + + + +
+
+ + + + +
+
+ + + + +
+
diff --git a/bin/assets/CollisionSoundsAssetSet/attribution.txt b/bin/assets/CollisionSoundsAssetSet/attribution.txt new file mode 100644 index 0000000000..876419b0f0 --- /dev/null +++ b/bin/assets/CollisionSoundsAssetSet/attribution.txt @@ -0,0 +1,8 @@ +thanvannispen - http://www.freesound.org/people/thanvannispen/sounds/30012/ +hoobtastic - http://www.freesound.org/people/hoobtastic/sounds/132627/ +kbnevel - http://www.freesound.org/people/kbnevel/sounds/119859/ +adcbicycle - http://www.freesound.org/people/adcbicycle/sounds/13856/ +adcbicycle - http://www.freesound.org/people/adcbicycle/sounds/13855/ +110110010 - http://www.freesound.org/people/110110010/sounds/66397/ +qubodup - http://www.freesound.org/people/qubodup/sounds/50941/ +vibe_crc - http://www.freesound.org/people/vibe_crc/sounds/59317/ \ No newline at end of file diff --git a/bin/assets/CollisionSoundsAssetSet/snd_FleshFlesh.ogg b/bin/assets/CollisionSoundsAssetSet/snd_FleshFlesh.ogg new file mode 100644 index 0000000000000000000000000000000000000000..5f3aeb71ec21805af84b6bae24c2e914f6c23dec GIT binary patch literal 8829 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 X_$lb@CnyH&p= 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 literal 0 HcmV?d00001 diff --git a/bin/assets/CollisionSoundsAssetSet/snd_FleshPlastic.ogg b/bin/assets/CollisionSoundsAssetSet/snd_FleshPlastic.ogg new file mode 100644 index 0000000000000000000000000000000000000000..acf53e54de9d27812729552e692d863253621237 GIT binary patch literal 8858 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 C?|sSu literal 0 HcmV?d00001 diff --git a/bin/assets/CollisionSoundsAssetSet/snd_FleshRubber.ogg b/bin/assets/CollisionSoundsAssetSet/snd_FleshRubber.ogg new file mode 100644 index 0000000000000000000000000000000000000000..6373610569d3daa613a3e8e423b5c8705fe6526e GIT binary patch literal 10037 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 literal 0 HcmV?d00001 diff --git a/bin/assets/CollisionSoundsAssetSet/snd_FleshStone.ogg b/bin/assets/CollisionSoundsAssetSet/snd_FleshStone.ogg new file mode 100644 index 0000000000000000000000000000000000000000..eccbbb84f4161e6dbb8bce2d6db2ba9f7bf96eca GIT binary patch literal 10985 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 hPr5IKD!B#m3N3IfrfC@l8}1c$KchHz#4 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 gbBd8(V=4`5>+R{#J2 literal 0 HcmV?d00001 diff --git a/bin/assets/CollisionSoundsAssetSet/snd_GlassGlass.ogg b/bin/assets/CollisionSoundsAssetSet/snd_GlassGlass.ogg new file mode 100644 index 0000000000000000000000000000000000000000..1806a5547930817982ca5a03fea013c39f3395ca GIT binary patch literal 5456 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 literal 0 HcmV?d00001 diff --git a/bin/assets/CollisionSoundsAssetSet/snd_GlassMetal.ogg b/bin/assets/CollisionSoundsAssetSet/snd_GlassMetal.ogg new file mode 100644 index 0000000000000000000000000000000000000000..f1470244aa81943909cc253b854bc3582021416a GIT binary patch literal 13092 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 z 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 wj=Wff(qD6t<8 literal 0 HcmV?d00001 diff --git a/bin/assets/CollisionSoundsAssetSet/snd_MetalFlesh.ogg b/bin/assets/CollisionSoundsAssetSet/snd_MetalFlesh.ogg new file mode 100644 index 0000000000000000000000000000000000000000..c11d19f59b25eb7661da4873cf1dcb83f1e39854 GIT binary patch literal 12917 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
yd$m3{K`ho%^m7dQE$lJmD1DH1^v3iPB32$z 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 literal 0 HcmV?d00001 diff --git a/bin/assets/CollisionSoundsAssetSet/snd_MetalPlastic.ogg b/bin/assets/CollisionSoundsAssetSet/snd_MetalPlastic.ogg new file mode 100644 index 0000000000000000000000000000000000000000..5674907f99731295fdd74268f6496529ca1e3402 GIT binary patch literal 12814 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 OtaRlveX7N<2mTLWUFL!S literal 0 HcmV?d00001 diff --git a/bin/assets/CollisionSoundsAssetSet/snd_MetalRubber.ogg b/bin/assets/CollisionSoundsAssetSet/snd_MetalRubber.ogg new file mode 100644 index 0000000000000000000000000000000000000000..0f9ba2e9bdd9cdd5a30c45904f9930960b792ebb GIT binary patch literal 13008 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

2aZ>}dgs zvQ*rB16q&9MBJ)rA0RmZP-PO$IL@Hy z*^v3{y1ci!{*%&^xHDU5w%^BQCQH`w zPJDQxIpWFfz~{p1H2$NgH@KHi{X>-=;D{?0Q|r86F;3(y4@;;gHF=y-hvszGxDqPz zIA5&i3;Uxd=l407TlL2J+F9(|Q$IP72anVB#t6Qo?U5WmrKp|OhL~;YFm0v8!%b0{ z7qPaV*>Wov(h-zFv8uw*NLNM1%T%f_(s+cPfxqoSu@)-WKT-KKqt$9>ze_AW!TN^M z!&Ls^cd(G1k>#(R{9yYd+WPy^1uo!^N<4qqi6un;hes6@QuIEhqxYiFJC?;f^WgPR z$5g-*=osxql(mfia6Pd_<@=qf;^&zP0|xly5AIZCdTD8irRbDqD>NC1=5ZvsEH>1J z24t@{P*TM5y?8)Xl3v~Ts#GffOe(VFjO-mru*;jwI-lt}-j1fIMv_tJ<&gc^;~?C( z_iokKb>G}xf5nCXwPCbw7HHlbWp|ab=k(7O-|iE zWjdrNqb0_7&M$c6f5FiFUj5+vdyS-nitp#&&z;&BKbDm)tPOO;kf57YRM7nxy`+ed zpH-EVS9B@y#DMU6jfwy6dumOOqA)#)+WK8fZOWrV_Oa>SXa?J$cjW<7uyQXH?Hqy? z@TO+RQ#wQ)v0SGzqQa$8-Rj=U3D~3N4>!aha^>idXwv8_Pgb{H0Bdc*b^g8&vEu)Tu4y z!!E4f_$%>EoAVxeQmgtIoDod*_0#Ax=3#&A3bcxuwo56CwoL5)nBr>4BJC~kcsR1U zNo&mHkg`mSC(B7sN$}Bql(+IMfo$8pXi)M_pT8C=%vhv$MwwecId_9l@@0DN>rCM0 zWd(*u!oOcuTz`y#UB)7X_I@T<)wKitQ8@1k-tSUnkMR@1GafG|(HCXuea@P)YaKZb zmvisp?q2=A>NzbXe)jZ-$3uUKJDFtm5@TPVr`+`z3Keb~XA>b2akWUSSjS=Yrd>Zg zN*&6&qgN33b+&)Cb+W%t+vYR=a^g{QSt)u2{x5}(*zv=^^j$`Q<0JV7=leKL{<5f~ z<~gC5P9lnT=FYPG%ZjEXsD)=J+eY&o8H#jEQ-sx-d!UZc&!&3jyLOHo^>Na~AD#(&A1m2*JK0vW-s@`?%TdZ!8>^u=%mqT9{%SFbtS=U-qj`P=y z0W`0;4cHU}AFZwJtmge|#;VCU;=AYo% zdSe^Xp|?dC8Qk1IJtS&Y$(?nwpJ~R%&a#*ykEtnTwRbJlU!bI!vyVG*&_is@h}Gie wjqVfN4!k&s_@Zx_g68WEr9eE9nkqF#pXf#RR74z2wA^Yl*mf9udJ7NuKX_>?*#H0l literal 0 HcmV?d00001 diff --git a/bin/assets/CollisionSoundsAssetSet/snd_MetalStone.ogg b/bin/assets/CollisionSoundsAssetSet/snd_MetalStone.ogg new file mode 100644 index 0000000000000000000000000000000000000000..dc489d8bad9deaeb4d3d3a4dc6cdcc069ec99de1 GIT binary patch literal 13578 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 literal 0 HcmV?d00001 diff --git a/bin/assets/CollisionSoundsAssetSet/snd_MetalWood.ogg b/bin/assets/CollisionSoundsAssetSet/snd_MetalWood.ogg new file mode 100644 index 0000000000000000000000000000000000000000..de04317eaabb3fd8d74bdd960546bc97a35c2860 GIT binary patch literal 13040 zcmaia1zc6nx9>i5>Y-CSG>4K@P*6bf00IXN4bmOb(%m6(=#XxZPC*puk`|B>C8R+@ zRCpWx{qO((?t7nmH?xP?vu4(sS?jyjUb8{P(o!A30RFj5;C~x>AB=S&3=nrmXA^6e z>n@0N&GgojUn4eU~Pv~cw>b~YDRcXY5eg~>X) zIhZ+n!ql&SgHO(u<}hJiJ_z<-NpPvhnh*dFoX4*O>k0S}j{*QF02r~rZzNeLz>Cm% z9G+=t`Ri5>Ut}6OvWMCyC0sydp01o`Pf^`L(QBg~3_BiKUQR^onB{1A5 zwG~nPcPDJ74#f?{whp6kRy<-IYyecFggj#?Ir6$PiC_$)2CHy-=YGbLEN24F(%c{d zfqq!9lE7AB(v$mJr3G>Kzi~8tkRs%1m_R7;PivZ1ci|-;m|d#`hM&j;Pb^R$T&TO)(XtE!w;~uIb`ZENC0M_+tfL!a0;{T^u=%kqc z??u9@pA(P(b=l`c-{-_4gJkJ*=EnV_;eG(LsRWX{$5}|uMX1k33@mc4(gSFvk?%@3 z|7C=0vjczxKYfoA{Q#&9B+sO?u$GJXtc&t2sETWi{Lfe5AH0AYVa&Eju?fHvj5q$H zmH?0~bspYhqQ8>B0TFp$U>P4Wjz>gqWPHsnBhQ?C8>x}W-ddKH`Nx8Gqcm%vE#ZUd zJ-O*0GF(O#h%$=)wmeBQajVKEz&@IdtQ);F#^5;Xi45GbIc;#R&WDWk(pGY?6^YJd zZ*0~0%kLjplo@7?z7<^sXGG3t+P2~wfUO^9S$iY+*M0vTJ`$kaj6YKMW(UE1<8VyK z8H*W{7+hc6NXq5!hZi!$#>pbef>n_;>_x6Ye|8Q7fDq^(6#uLG1LeOcE=-K#9OS4U z78v5bt}44n?{C+1Lmw0IgDB<}22mW_xSr!uEh=wY)HtKdRfI+&;6;Bu3N$LrEM5|a z=8uzvr8y76OF*yqPs1IsjFH?L|Bo_uNUui93YKvJ9(6%+lm<%6-CifvZJ{~T;G^5} ztncz{>{F_+{|>DG@*Dtknvg#}i8hJh@5>5)B8C6g!2j|bC-S}o`hf%%#X1({3GR_2 zA(dmHaWWY-A!T(6gK-MCNlJ6|y9SfO=94J%X?OFvCUd=JU!A6Z9OkdvEYG_Ahv!_o z2$N{sntUSGzda|HBkr?E9J4|qi%ue&XNqNHMp=5!R#`s5fAbuxsFJj(l8C5{h&YbO z6zj;0^45I2!Rqa{|F!&==g2v;fCcm%8E2ON@SHAw`p2L*)p08y|J|ebIH*up8LIy@ z004Bw6Dj_QBWg&VX{7Kpk_V+B{y%#RNSzi^o)iKVn+yOn0Kg0yIRqNz953Y{u8qgP z&VrpMij()AI-~?DNF++kPn zDsU2j3*LlzAL1z>66642LWCrMhoX_A@b!4)Apci-Bto<#OMO%n?^ehlKTdWq6kbHH zJ__%n4;hyHnic#(k^=x>T@dh=;t(>E0if)_$}^U+Bq2p|Rz)(IF>>=+GUeH1p%Ecr zH4W4d8ERSswLqziYGPF;Q&#@2fg+PZQJ^MMlu?cLV?yS08mL7|)O3^i0;Qi;irccF zvJUt-15({)Q+%J!*c+t%!%CU_539SV*(PB%SCkscTt@??<8H2VhSHkxRRpQ(%5xMb zR1<3M#2%I6yXuNE&@!JpL+McZ>CJ|&p8Bp*Uvr+Fb_1!#Gv>z4Zp$3j8P+!WrR5nM z<>h7NP4?y0ReJfG<@x1+wL^DF{+{57SRT4THrqHpL*ozorTufKX_C1a}Z=OaV|RMNZ$%ht9PIS z`+ASL9vO?o6kNh7pFHHn_vE|jdQ3I z6vY3j*O9)RkKSP6E=b6(t0MF@?LWgGvt8(Q`gwot)UDtZ5q{qb5F3zdY>*8~K%oU3K1}oIy$6<7Ng6N?~t0HU|(NmngFpW5c{;VWYgcTe;fyB)# zQbpM2p=Xe`wZ&5=yRbq^gf$O(Lf59OcS<*g#1ty9QD`=*fM3*bO#oSKdJ;ex1|nL@^b1XKHt=?w4vf9>4FhNpMNr0QBYXKivKD13chH%1gaVFI#B zM8<$K^z2%TQ*1y&1~R&Fecr`R_;gCQ@>+%>_=a$K(R!i@Mx6jmKq3I&Joh?;T)VAg z1aeft8tObO%84&EEXrQytRw}8qlP8%SQ|%0;qaarQ9RZnN<~hd9!*;~9NYyDn0Nef zTO8%c9tZ)k4n80adT}odj5|0qMbyC`s0+zWp-e^8pk0c{O+npKyWEiCq%j?pA}a_5i>mi&x?BLT11@OiPaI(d;&A~9>H<)%s3p{7Sag$K2#k#M zAvZXCvx09(;ZcCg0N+)^qF@D;0tsNgmlq6HMd*oZ0ur$W1N-1buGa)Kk^lfWpMe=s zjhdNDP(m&kGcf?q>zIiU#mz&@!h2!pL?kE<+)|k{5vaQ!&1(W$cLxSS!%o;83c{*a z_c5ZXN87fVv1rDmQg{{wapQW1EdnIij6Cv04x29r+aE;}_or;yp7O$5L|HOBCV zk()&EZ)82jgZHF?IZiS4b?O1WWUup&7?1!y_JRb_4f^XU%O&pLiOIiP`2U|xl!18` zi6;2A?xm)~`Z7DQyl6%@ng?__1o&tYBOHbVhxB|jspK!5K!W~B zZCVLBkghGbbXy*H zoeP2x#k`Kf%$qC)gG_cptM4#Xt@;r_01*HS;885xF|jb~DQ)MolH#6v5wJiPl7LBm_-3S2ns2g9lI;9>51>6bzJrkW=@A zfCT34Hg2!VvOj4kjDoElQ}&9OsvxK7XQ9X(T%_7WeC6k0ExsfCZ-J0xEn8S z#zPZG5=oQD&>(yPU*3n_g61&j3$`MScx`+HQu`qTb< zp6+`1mwbJmz7`|yW{^cEB7OzGlDrbT!np#j@UQT$2!CDSU4H$#_G!;dH=3Jn^x;Qd zCtFvnuAbb&`KYR&2j3n)E)^1<6T%~=AVx*91=E8^b>(y2@jPK8r2kIPiw79rof*kw zYuI>aIkclP_oslBZ*kOCw@r85^mmr>9-q;tzW(ZYWp3ls=jzKfu0iD#|4W{j#JnG6 zoh(_MuB#XZgREmpN>p&2mbnYXW{*~dZ`^ttNb?-0%ZL&PSZEiFHv>e0Ldi}IzAhjr zE-~*%eeW+Sk3?U`A3neQ9OZ8Qiqf(~J{3z>QDQU54-$&(|7P%nn@5p5(7coNy!DrS zXagXLv8izPY)6zyw`kD~)@(Dti4Mx?9%j9x%{@;+%al^gx&S~vFNL)(W?b0c8>{0R z5y|NN6i#sd(U!`}TM3#%Ezjd!PEkp9<+?QYHkNn$vm1BfCHF1s!`Jm+!Y}MyBBpG4 zd|c!jB6<4A* z7lj{~1GO016lne>78hud&8)lU{XE}H;yk-+Ig0>1x&qH#NtRr`u zNJHhlCM~;Cy&EeMnDl}Y`(Rl0c(j561hDgo0|5?z6>h*DAW?@8+{1j)Wcj8k=d}ID z_T^4&$Nmp{wRhhagXNTy%ojT2ilyr{zSd~I;%BpM=ENVlT@q$5$ZW33q^&gNRxf<> zlN|=GD6^W*Au0?oI~016kf^#DH5k%BQ9GJ#G^mvL?p3Y(!7zz)k&eMs;5c9Gz;`-r zchwTbmnF41^gwDMP{nWx^WIzbRx2+oFF-Gce4$`Km)wlPQi%ZOTI!L zW&UiUlS@3EeW|jerP2HNmG(lEGNoYih6fp|Bsk44)4g_LlK8|LZ{DXuy#{BH?2ylB#;tJ7A3wna#1=FLW{< zH~4_y)`~xE#DLug+N_hS=(~6FJ0QRPb3?H4KTmCoMx^?$5~xMI{jJS~0~qme0>ILR z(0DL4Wn$3o-dqj8 z{@7OO5*vFs_-69Y`7MV8(>ktLKkZi3u10Zpb%HL*I`AXwno_uH=SC#}>~6 z3^8G5kM<*&YfLaWL^Qv0Mr-7K7SD1xf+yT!<6h$04mzLC4oLW-X^zwT2+Mdrsk(Vb53e7SvpPA&XSj!D zXl#%1{Pw(fP-=?CK+Y4!pgJ}L1?TAe7{FG_8LG54CpVjie1Q>~K3X6Q= zqwR!KNIllyE2I+n%{}WwH@NB4$%r+Q?6;QMpLfN!RETcN}KB%4td7$jR!|8x0IGf`32wpEPg#>-Rt@4PorAG z^Al-y%4ynnnjb`5@g0>U=vv8R9q*6K87j}CP;qp9r+{h5>1!rWmuj@~&#z}wWgUXB zX)B?y+Pqn4PS`LsWL?NMBv=IR>4SF$1C#b-oXQQnC{Eg6r+NC>7hgybI&WlZbAZms zDcOLhPb!_iiUUI%{zJ9!&b`%RpeqSNG=u>dd2!(JmD2<;@ptZ9XB+MP@Lg=FU()WN zYp|R9Y2v?e^Y!$zVh3m4#6&jc^g>{NJ4U~Za0)9MUFwtkC_#|f7~9YU-Ec7}ihdp=_^3KfDsVwFN__d7%C2sO|^jkx2OI&w`sp=#&W5%t3@Gi(~%(&Z(Ok&)lN$+QPc<+0)J4*Z9Vd$hirW(}JPHpde@I|YHNDK!f5P!!4iz$Wi&hG7Z z=~(Q)DMZ|H{HR$%vBuD@B%<#ZuPVqRdmOj}FtG!Oa_?gf-+YcO0Ic9l0BVs*=JvWf z&kD9JSKOWQvy4TY}tpqwmoIIM!lpX=lOa9*B%qGi4$VK4gTB~KcAr@gj7 z;V3;@LXJwWPCDx}nYCb|&UaqlZgw5D)K%uhr*Ad3Ot{O=7s7}z;QpY2L-&CDPkvO z(>WI1#HSt2oE>ztKiAZh)So>y@J?f3=#!r5^QK{HIVYg{-H}!dYm9W0fa{(kUc^t% z5ThT4@U?z`Py1Opj237OzLuos3{Z9B;IXnOz^YXxS!`*b|H^;qY}I;OHGauJBlD#g z_bXk&Nmiwf;F);^<{EZ+)+V6<$C^n~GOcJo^1$D{TwkghOY7D>N>k@mJm%DGy^JEB zooX*8>qhB0Y~YI3_3Iw*ckyN`=iQm7CwZRjEmf37fIBGk+`?b;r}kvqkLq4^KSMmq z%9VQgq$2=$2q!lPk{%BxSU!<_5@yR60@*==DVur^1h}{{f!RgOd4G8}PN}ryM%|PB z-KS5EC#!wypJX^5zj1VY|9-uQ?Q(6)ON`b~Tbi05Lba80N%#A6**q zuv}6BTf~+J3;X#Nj~kDGs1a^##}*D#b`ZAd?^L)geuP5v(4DIo`oKK==-w4UN|IS) zFRGyhyxvrqjOjF&2=|T2!XJ4)aE!6KvDX#NzpU#=$9T)x9_oio zVb@lE$mTk<#r=c}Tyl^{W7#F}*2Z_dxAtg?yot&sUg^gG4oESL_Ea$eu|SRLO&LWz z(u_sdP2cv@m952#SDm?CeY(p_s*_e&kqTv~|4~{9(5nr`-ofE4!g*PEjF9>~lrc zppPwpswfH7nOUR3C@p^Cz(X+al~bvV*%<{XJhNgbINBqHs2{P4>vqjx+sK#^n33if zw^;*W-_)vsXEhS7Wo?vQYCzOv6?a}qD@Sr;9CU13PlhkP5!>ckVs}( zq^$Gh~!!-{}br^0%;etxa>L$M_!| ze~7E5DisB$yE_RU?05+(H}i*2&oGJ!0Z6Tl8Ki5S=7j9reVJ0@vVrI;9%7LX?*uN| zv^TV>nk?LVUhF!zqHamk8hIn$l#q?H(>FU6ReMh zK0pA~5y^=e*~v)SqHfiwids&cMZHOn?>K!L3>5`_9NYz2xny1*4@>XbPCRGn_%%2~ z;#Hgyp=HTsW1*SkSR`d!*PEIWhHwvnf2->j2hKS}vD}U;s*Lt=tp}<2qvt!a$nTb1%M}hAzJ4%YjIYNQdNg^Z0cJSn^avM0$ z2w!|6lcnn^m-b>HXmSF4AYd6hDHNw1m% zVduX#s!+7{X8rxOU1h`i0jIM{?fqHp8Cd!ZQ(4c zjmXr=UXWaMHY(~C#_2ud_wKH<*abgw@dSJV+f!LEE-N$$5T#GcVywHnT;402PxGCk|F6X6U+E#6~aXz{)g5l0yE8KEI|4_N>OT8Vt+{(7bH_RD>CvaC-0 zpKbeMmq*#vaUnaxDA&&=-w$0k&`8Mt zG$}?I3R7q(4eFDecsmu#aLbY5qdp4>tz(pxZ;6DxMRnV>DXKT$I-eFpM5o8^UKq{- zi{r0{cb5IK>hJuT&JN2Dx$Kaq@5jR5c9LY(N?Cdlx?)Q8b%EBb-jHC;!ymfAGr)IP zRsS=#(0H=H{Y&nQ-dNIS3~SS^&v)qnL%FH#8($u23Qtf{p6y2k@eyVbJr9DM5E=Ob zMp~?ldfCsV)HZFuORDp)86NFi94fIKzp0$33BLKV!pKh4!!ZMe%eJmeGxly%N7Yp$ z{rj|fLGKNOXspRqyiM-RZRD-eAq9$OZ}VQM+)+xlxbq37(;Nu~tI8oF{>%4I zFZzW$H}_&akMaqc8&a`>T<~lv!H*d}+wz_)gXULl)osh4j_E^v^|r^sS3f*1UQQ9> z9#xPOxOgfyC$f^qCyH>4QCyf{XloPPi5fMOrjm%5cT`4)`M~MEC{Xd?^}@&vuhbhN zto!7lo2MRdl5{VAlB;g(*b&1mG=3qr+7^rkgr==}qi`cXdah4SF56*9^Sb?4a5n*J>O|BS4+jA5RCsY?(rJh z$YkylM#>iKy)J^7g?{3rb`LQk@f$48~Fs{T~{GH0A~St}kN$dQe4h`AZ> zt|sz6-~W|0HCBWn4&NYnSk7o0e8594*t=l8@u|bZ@p670-K^!D^y%0masOaP{DImz@yDw4>zfX8E(1(~f<3Ra0ymWDx!bhj@T8wt5vcDXoxIZy9p0Rl9)Rzgi!jYiB_ zM3UpWYDNKniwr36x#~BiRibeC@64Nc1cTcrn4(^D`t_fPLZ47!gg%{Xm=Gsq!roME z#Ja0LKS&c~gx87lV{$1OX-n=PjO&>mF^BxkA%@Q^V;Pq6AexcY{`a2a*YX_%0i#X$ zj}t$cObE~^TUncI9b%yq@}Bp6KQ?Nh$wp#ZAV9`CAf0v$@9Fa>Cs=dgYukmZ`qBPh z<9BjK{1I372^KF$HjdfWckLoDLee(-`9>GGSrKkiDzfAwQN_>V$CmFKG3HtZeog(A zD00(&()tD}+>(OmrMIFG%W2k`1@S>Cj$z;I`(zpH3VpS}vd`K!Q;EAaR=RW5AJaP+ z2df|5!8wZ4T=D+ye(`YTToNJCr(}5;4`UwUNdlgJwGI&oHiW$#77XKUTXxOIYfR`P zT8@(-ptyGwx4DgQor7G;+BF6b_{S3vuTD&OuhWQ|62er|0~K)iTwySZP)$4GP@zuK z>e@GY#0~pCqzY_;L&u`w)f+t#uQtY9*ls{Ww|tF9Y_Lkh3Tp3`4E*S=e!Tve1{#5p z_;}>GZrp8mmy1oq^K);47l?7hp5nAane7>WoqS5f?r)55VgvU+43;HPJS;T}Tbtf* zX{GCBp`Ww9r>qb?hjwqL3cu6OE1OJM|9opZOeEQv3RdWD@yejw(ck_KDoFQEm1z(q zQ^QC;-^Q7R5{uD$O+5Wj`S%OJLro!*pqfXqVNT=ioeJkG;FtA@0JOdo9a2!;;L)2c zx8I-k-le>lt9NRB&~br0x~XE#ndFj_fiB24>7inqe3wu73Ag^T0N83G!N~L|O3qf; z#s5+i{pI%H(_m`{m>dptaHlN$=1VE57P|CMQX(d(B&!1^=}=iLnXM0bOqL#L!MFxG0!MksgZtyFOBD5f<u~yu6-sd*zZhcpO-j>(vso=s7H_XlX9s*P2m#Ij^%XraSB8y%}DA;~~xLqht~x1FwUVdP;in?O#46 zx9;b)u*@f#G|s=eO=n#G-lA}i%lQ5PKIWMBD~5)b40%NkP9AifANnZ~j?Q0nvC>Z| zn>7;TIwrQynOwKXL(L}tjEFWiI$*qy`^O<9G!Mq2*<0t8`sek-dc<*OQZ z&>xc}6Ha{eEJZV>*e3>C?6)fo7P3g@>=kj#%9SX4#RHOBCnt1sc!#9hOwHpZN%7{W zSSP!~(q57PC|X4T^4ctw@`sFOO7S#%{fx=1e>O76NZ_3w_DJI##PvrFM)|bO)~Gy? z`Z}B6-Xd4K@yq7v#d9hWEuH3tnbXw}l{|>u2^1HdO<*xf8K5{X#rTF>*GcY3blWOw z!(gzP6u)zYK(&4B4d8PK#f;DYY@Rs_#C*B(d|JT3&bhOvs`b<;WTV=7)loktQ z2xI`OJSdbtolb(_`=OxlGa7Qel_XrwRJDrT7I||s`6Ngat{Eh`k;L6l=W3ExUdtVn+%Pk$ht4$v0}pnN{2oKA-9-oex_r}zn-`l9rhBh zhVM=WclY3j6Fp4uJFReyK+pJxyRd6Ls#t%k6!@6T>_kjfPGL1`_){zvTS#33b&A#8 zH@K;jAG&Pxx0Tis*GtZyyuv1P8%-Y>E@a*p?aO14efn9&^uj&C3m9Uol3>l@&MZyi z|M0joqq*c;`v*J2;q%g;dXMh33f24dz1ULh(L-?R9=*3zbmOWCe$O$MS);WYkh}^l ztGDy1DCF5v3Hwf17E;H9ZrdzjY-6srwZfgslnUw(^?GNWd^Ra1Rr5yNEmYI=w^Dw4 z{kP#2HgbQ1_BHC@u%BVd>a=dg0kX9foj4~)nqt2~O1>~jJV~Cn+NU`ylXEnDX&7et zuF#GT%869XeM%3#R|XZo!` z4OVdK)k3-Ho3bJ8ilwRszpD}JJya1fuF?;t*|K}Q@F1Gf{qQ#~8IA|y72P1BdMzh* z`$hfdCsG*g7sHsi%!>6zm#^Qi@XHcaA9l;H&L?7mu#`usc5b=XLeetRA@hiPH7x#K=TxOya+??`n zDuDE%D=~GTOmUVyn;~#Vgq@{~+&8Kz#oB7V7@=MKadx}!P>TQ@WrbNN!H8=Qz_l5= zvbNS$ROi*q^qyaa@ytsvuu5WYxniy^g&P7whp+LmfCf*dKob3EPQJboBpc#n@k>VS z*UGo3yJdp{4|5@6hrcK^C=W8y%>Z5rji8K5MZME)zAW9`YE$_>l#(KQ9;wC&9-C}) zv=Z`C2ZQ;C4oxE$$IwMjn8X6}rN(#L&%U#Dt?{!F<765?0w4<2dA(K^6X16wC91i+ zyR12;FGBAhf8)|OXIv6yhG8uNKD$WBM_l4Q9h6O2Lv6XUi_F*ls7*9%(Np{w%44|vk}}n1 z%{^Gb#p9(`mU8q<7Vq&w{0kY^fyq_ef|F-YXFYn$KDkzYxi`s2gE@XDKP8zoW)}TO zI`-(|^RJWnhytxikFli^C1eby#k+-&-+k>8Ob@U!^CqH84_?*N>mae|ESVe5xy`XB z{OYtNEzZSk!$7+SkUf**xj1yXK9O9P`8@Zp}l_Gxpt|Mh*-tF*n+Gjv{6(QjL~*N-c;D zx=zk~a#=SP)9ULRRwy59eC?DLxs@kYjzSCHmb^nPm{4Q(%<)}CeF5fYVQ1`b{R6IE zH{A)QV#2Y7Ra86Ly>EOvD0KUEz}oMI^6~ch*{~SrJTT3X*(+B?%warBgXOS{cJ^~@e)DtrBF%Ik_{$b zwRlpGrso@Gi@s8plu&^GhchG&Sxr;fAx|SPhCT{E(JYUzjh%2&JhfL#e9oVqS^oMi z>HfR6n$U%GTn{G=OVk+Dz%E8@dfZd>#%rn+4gl4#uWv~kRWH_{>M?TbNKAEJlHuO1@=13Dx3M_g-dDs8mN(|cu7u(+t7+8+6 z|Nek+{l6RI20b$vi~XIlb{*jXFjKBtmFT5Qv772|NK<9WqIA_N-OEZAZXesdx$krM z`^}Yq+U57vBmOI%{k>jX^>;hPG?(f}8$6<_#WU$#?rjqnH|0YqLbkS zt|U40X?j%iEz~x{zLE>Ix2R5BCENm^mi`J*OMhb%OC!-K9-$da$hcb_4kc~A&vrN) z$n;UMs!zt-iZJNlA~C*l#?~b~pVY1bUb$p{hf{Xh{qC0%q7k!GOFu%mkvO53Gk(eK zyWeyvebOGIn2s*Lx(Cd~sbc-w#Eq>ra8dWR0Uny`BNa!6Q)d9=~gr< zE8Tpv*fqg+RPUYEwn%1^zytpg9mP=Eg(P5|!XHOp$p8VN+YsyVh8F75$*ek literal 0 HcmV?d00001 diff --git a/bin/assets/CollisionSoundsAssetSet/snd_PlasticFlesh.ogg b/bin/assets/CollisionSoundsAssetSet/snd_PlasticFlesh.ogg new file mode 100644 index 0000000000000000000000000000000000000000..a9d698310c5be9954e4cfbf231750fe513c036e1 GIT binary patch literal 8510 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 literal 0 HcmV?d00001 diff --git a/bin/assets/CollisionSoundsAssetSet/snd_PlasticMetal.ogg b/bin/assets/CollisionSoundsAssetSet/snd_PlasticMetal.ogg new file mode 100644 index 0000000000000000000000000000000000000000..4dd270f3a78f3932a649fdba4dbb83502f966ce8 GIT binary patch literal 12814 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 OR=RSTKGkA40RIO$z2sZ~ literal 0 HcmV?d00001 diff --git a/bin/assets/CollisionSoundsAssetSet/snd_PlasticPlastic.ogg b/bin/assets/CollisionSoundsAssetSet/snd_PlasticPlastic.ogg new file mode 100644 index 0000000000000000000000000000000000000000..9994745da3715c995247bc03e33375da92cbff9c GIT binary patch literal 6635 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 P5)6_FGg*^W69E4YeZwvz literal 0 HcmV?d00001 diff --git a/bin/assets/CollisionSoundsAssetSet/snd_PlasticStone.ogg b/bin/assets/CollisionSoundsAssetSet/snd_PlasticStone.ogg new file mode 100644 index 0000000000000000000000000000000000000000..9865c6e68d22aedec5c62124d0bf041a80b3c960 GIT binary patch literal 10640 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 literal 0 HcmV?d00001 diff --git a/bin/assets/CollisionSoundsAssetSet/snd_PlasticWood.ogg b/bin/assets/CollisionSoundsAssetSet/snd_PlasticWood.ogg new file mode 100644 index 0000000000000000000000000000000000000000..9f921b98cce10984ada5bb5587be5e3a15b91059 GIT binary patch literal 6845 zcmai32|UzY_x}yDlWdI|Jwvt`ONJpM3Q-J_VH8ps#y-^8o)$gIQnF;3#Dr`^WK?4b zZCb{@FJr4vS&HzaQfc|$89mSY{NMlo^S-~&o$LPYx%ZrV&iS76JNLuE*VhT+gMK}W z25W<@NWo~>7Fa|GmE<4Foq}0b{8|zT;|=Oy4&0r8Kir*MN_@MRu2jI!|Mj%;uQ5^t z^n?D#{B#_szQ`bdk_(SL(gvxgtGiv-P*0D0j`iSYY3^)g3MTcnb&a%j_0+(WQ;1Jk zq$ibZ>J$>}?}gkG5+3YLJ%M!M{snJTUoz4_M;EqkO%lptw+jps2Kz8}NOp8jDiMOD zAn2$HN;1R82F0KiXq?ERS#w8h-GnS!0vqm?glYP#Lt?$g;)(}Z4nzjk(!ui70 zQ>ghk|9wWKNTG|46F8B_AJx2qOR7r(gS$|w!V<3QAYeu_Yo$0@0=FYwP>P3x?mU9p zqEwng6-8gqKPRf!f{d}#dsCdT&-l&tq7>t|8r3}(V%pVxcstCXi&y1+L66g+UAUQ? zU!4d~478S5sQws@212v(&X|guAW!rBfI(t>g zSU=U1XO?Kd7G5B{TYOCtSa6}>HIm*#U+%<7(x>vvWUux=N^riaUSF1VmFK~rE`?XX zm#DUEc7ApbJ+#Y4oX%JqoshmN#4PIra|$y#l1&PpV4Z&-U8rp2AlU2LL!Z80FAGKq zw5#eh_0DVje!-&ba8B1F+$7kMFnTqxUc>{8zIf*>bc%52{vAGMz;B+z@TS~z$fy)S zlB`mRQpT3BOOhG+m=;v=mgJN@__CP&1O;_Q*g2l&NC=9R;-UDjjtAv66c?voM7L>F zb?CKgal48qUB+{_o=EK$#{d*-82}U~*G%VyR^qG!88sX?O$LpCM={nS3OE(%ooX(q zzzdT2ENUC76hy^89k-;?y+N_}AFcaOgrl@7XuW#cPWq-qXX1efitCl|u{&`d!{OsY zQR73&M>fX)JFxza90&wWEH5T$q$EspPRu?Fku?YZ6*PNzS8JF1%l!>}2TCZ$R!Rk_RKmBei7rJ5jE+zXE10Y{rMe{}DOd5K+dZ zys}Og_*dlQYoxq1O4(|YuHu@mb|TX^fnJuK_ol2+^xq=K?_z1z#nKBGXD*~@BxL$0 z(97!!gW4+R8vbkhJ973?RX_ugV?|Z@N8~hO5W7J%v9#=$*K{=P1qKbX+W1cgKu}|< zxGgV_I1;o62?m1%ZKAX3e~uVH9mLxAV}W5WLy!UlZ3Rw_mAXhxwFovnD2$m_SyzA) zEO-i!EtS$2$4MxMrJAdo)}`Z~h%ZkNG~_JpVv<$2rywOBmmIR0G7<)9PXKa+plD1B z<|&-oWz(8(*@Y3wrM2MH85w;xDD6zRK1#Jj+Ur$LQJ+m~F%52eF}GOSD}f0%K|Vih9I-#so>)Wa#*#;ziO=PUgSF%_`7;MH!^idQUBN2{P{W5Z zqmFPW9$CLw*~{`+84`zT4IIOWjzqGnGto7I?7Bicz=^U2R44lpIU=!^IP#G~%#4~0 zBYGSlkE{?~<ioV^>UV0dAZgNR>f+$)?DrN@&;xb>(7vV8x z2ne|>rdX6$%Zf;M;8@e~RpVEm!i#Q-i!@&X*nn}dA=747prpwcZ3Ke^m1bm}q|j_+ zm=xhHve+3Ts1&*n&qmPp;{%jv1L!8CbBaw%PKGqz4@K)E2o*5);{yw5975pjk^#~? zWU)NnUz^tF7EsnS;Fh$(OG75F)4T(RBbxm4x9>)za2+#3&L=62tfwmRDe}FK1jRC&E2jhT*^(1cPeI$ zOJD%A2?$qZz-{rjYvcoiG1Hsy{!Fg$GPb;X3J~rTXi≪1b*^rW|@Gp2-;?Bm;sM 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 F{{yh#!4Lod literal 0 HcmV?d00001 diff --git a/bin/assets/CollisionSoundsAssetSet/snd_RubberFlesh.ogg b/bin/assets/CollisionSoundsAssetSet/snd_RubberFlesh.ogg new file mode 100644 index 0000000000000000000000000000000000000000..b56f7dc773b3297e59d1da9ca1c9076ef5808b46 GIT binary patch literal 9758 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�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 Rzl|drq!4AXrKlzX{vYv(EGPf~ literal 0 HcmV?d00001 diff --git a/bin/assets/CollisionSoundsAssetSet/snd_RubberRubber.ogg b/bin/assets/CollisionSoundsAssetSet/snd_RubberRubber.ogg new file mode 100644 index 0000000000000000000000000000000000000000..c84f8e5083fd1de5d1eff0b41e1f0653eb3c48e4 GIT binary patch literal 9647 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 literal 0 HcmV?d00001 diff --git a/bin/assets/CollisionSoundsAssetSet/snd_RubberWood.ogg b/bin/assets/CollisionSoundsAssetSet/snd_RubberWood.ogg new file mode 100644 index 0000000000000000000000000000000000000000..ebb24e34f74c121fbd3ab3e56ad37ead25a57c07 GIT binary patch literal 9716 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 literal 0 HcmV?d00001 diff --git a/bin/assets/CollisionSoundsAssetSet/snd_StoneGlass.ogg b/bin/assets/CollisionSoundsAssetSet/snd_StoneGlass.ogg new file mode 100644 index 0000000000000000000000000000000000000000..b2b33cfc0706165c5ff0561270aa26e675086928 GIT binary patch literal 11188 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 PkH&P#!R*DZ_`v@GJ7@I8 literal 0 HcmV?d00001 diff --git a/bin/assets/CollisionSoundsAssetSet/snd_StoneRubber.ogg b/bin/assets/CollisionSoundsAssetSet/snd_StoneRubber.ogg new file mode 100644 index 0000000000000000000000000000000000000000..4b756ffac030fc528a3d4105f9463c317957d807 GIT binary patch literal 10885 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 UOIs7isg1AY5~kd-3Uh$}1Mw2oy8r+H literal 0 HcmV?d00001 diff --git a/bin/assets/CollisionSoundsAssetSet/snd_StoneWood.ogg b/bin/assets/CollisionSoundsAssetSet/snd_StoneWood.ogg new file mode 100644 index 0000000000000000000000000000000000000000..4a5b7f36fb17a2be103654a6a6a7880d35ce77b2 GIT binary patch literal 10947 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 G^ZY+<{0?&f literal 0 HcmV?d00001 diff --git a/bin/assets/CollisionSoundsAssetSet/snd_TerrainMetal.ogg b/bin/assets/CollisionSoundsAssetSet/snd_TerrainMetal.ogg new file mode 100644 index 0000000000000000000000000000000000000000..919c59be38cc5b5b3515da5c69d201a81c8e5184 GIT binary patch literal 12839 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 Y3{V{R_&}^yeuev{S^IE2`x^280S1B87ytkO literal 0 HcmV?d00001 diff --git a/bin/assets/CollisionSoundsAssetSet/snd_TerrainPlastic.ogg b/bin/assets/CollisionSoundsAssetSet/snd_TerrainPlastic.ogg new file mode 100644 index 0000000000000000000000000000000000000000..23fa3293559ea647661f5b5cc713b129ff52d829 GIT binary patch literal 7920 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 Ee?!~KK>z>% literal 0 HcmV?d00001 diff --git a/bin/assets/CollisionSoundsAssetSet/snd_TerrainRubber.ogg b/bin/assets/CollisionSoundsAssetSet/snd_TerrainRubber.ogg new file mode 100644 index 0000000000000000000000000000000000000000..c18d242816e77bfcf2a6c5df8a62d7741bf0ad29 GIT binary patch literal 9480 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 F{{y?rzAOL$ literal 0 HcmV?d00001 diff --git a/bin/assets/CollisionSoundsAssetSet/snd_TerrainStone.ogg b/bin/assets/CollisionSoundsAssetSet/snd_TerrainStone.ogg new file mode 100644 index 0000000000000000000000000000000000000000..6bd9e094483bd33e8aa878c4b95150e200bec8c0 GIT binary patch literal 10807 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�VfXX1}DNnUqVOO!bHs^#1N`m6%?L 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 literal 0 HcmV?d00001 diff --git a/bin/assets/CollisionSoundsAssetSet/snd_TerrainWood.ogg b/bin/assets/CollisionSoundsAssetSet/snd_TerrainWood.ogg new file mode 100644 index 0000000000000000000000000000000000000000..f405517e94194ff0a422d3b5ad6212f359f554c1 GIT binary patch literal 7999 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 literal 0 HcmV?d00001 diff --git a/bin/assets/CollisionSoundsAssetSet/snd_WoodFlesh.ogg b/bin/assets/CollisionSoundsAssetSet/snd_WoodFlesh.ogg new file mode 100644 index 0000000000000000000000000000000000000000..02621c252092b224918f8c04dd84fdcdb920ab82 GIT binary patch literal 8827 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 literal 0 HcmV?d00001 diff --git a/bin/assets/CollisionSoundsAssetSet/snd_WoodGlass.ogg b/bin/assets/CollisionSoundsAssetSet/snd_WoodGlass.ogg new file mode 100644 index 0000000000000000000000000000000000000000..03b7fb501f9103b143f37ba3972459949a04daa3 GIT binary patch literal 7057 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 F{{W6=488yW literal 0 HcmV?d00001 diff --git a/bin/assets/CollisionSoundsAssetSet/snd_WoodMetal.ogg b/bin/assets/CollisionSoundsAssetSet/snd_WoodMetal.ogg new file mode 100644 index 0000000000000000000000000000000000000000..e26afae646e8fa36eca48bfeb25d2b88cd822c36 GIT binary patch literal 12818 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 Qw7lJ;aST37xnscp0Y~ZA?*IS* literal 0 HcmV?d00001 diff --git a/bin/assets/CollisionSoundsAssetSet/snd_WoodPlastic.ogg b/bin/assets/CollisionSoundsAssetSet/snd_WoodPlastic.ogg new file mode 100644 index 0000000000000000000000000000000000000000..abe419b5fdac75588a627c96e8259464b4f1e042 GIT binary patch literal 6990 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 literal 0 HcmV?d00001 diff --git a/bin/assets/CollisionSoundsAssetSet/snd_WoodRubber.ogg b/bin/assets/CollisionSoundsAssetSet/snd_WoodRubber.ogg new file mode 100644 index 0000000000000000000000000000000000000000..30ccc324356df166ae7037f18ee1cf7139143abb GIT binary patch literal 9626 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 literal 0 HcmV?d00001 diff --git a/bin/assets/CollisionSoundsAssetSet/snd_WoodStone.ogg b/bin/assets/CollisionSoundsAssetSet/snd_WoodStone.ogg new file mode 100644 index 0000000000000000000000000000000000000000..ad9681846bc4dff50d393aff0a142cbbebebb562 GIT binary patch literal 10931 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 LNu^3qKA`;{mdm$z literal 0 HcmV?d00001 diff --git a/bin/assets/CollisionSoundsAssetSet/snd_WoodWood.ogg b/bin/assets/CollisionSoundsAssetSet/snd_WoodWood.ogg new file mode 100644 index 0000000000000000000000000000000000000000..76ae52c7cf802ca9c856c6e0727cf436ef46d071 GIT binary patch literal 6696 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 R#W1bf$J_3O(qzua{|{R5fBygg literal 0 HcmV?d00001 From de87e4871b6eb3852e8f7175f637adaf14a74ccf Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 7 Jun 2012 23:35:21 +0100 Subject: [PATCH 341/547] Don't send kill object messages to clients when a child agent is closed. --- OpenSim/Region/Framework/Scenes/Scene.cs | 39 +++++++++++++----------- 1 file changed, 21 insertions(+), 18 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index ae35cb9e46..f291022e0f 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -3274,26 +3274,29 @@ namespace OpenSim.Region.Framework.Scenes { m_eventManager.TriggerOnRemovePresence(agentID); - if (AttachmentsModule != null && !isChildAgent && avatar.PresenceType != PresenceType.Npc) + if (!isChildAgent) { - IUserManagement uMan = RequestModuleInterface(); - // Don't save attachments for HG visitors, it - // messes up their inventory. When a HG visitor logs - // out on a foreign grid, their attachments will be - // reloaded in the state they were in when they left - // the home grid. This is best anyway as the visited - // grid may use an incompatible script engine. - if (uMan == null || uMan.IsLocalGridUser(avatar.UUID)) - AttachmentsModule.SaveChangedAttachments(avatar, false); - } - - ForEachClient( - delegate(IClientAPI client) + if (AttachmentsModule != null && avatar.PresenceType != PresenceType.Npc) { - //We can safely ignore null reference exceptions. It means the avatar is dead and cleaned up anyway - try { client.SendKillObject(avatar.RegionHandle, new List { avatar.LocalId }); } - catch (NullReferenceException) { } - }); + IUserManagement uMan = RequestModuleInterface(); + // Don't save attachments for HG visitors, it + // messes up their inventory. When a HG visitor logs + // out on a foreign grid, their attachments will be + // reloaded in the state they were in when they left + // the home grid. This is best anyway as the visited + // grid may use an incompatible script engine. + if (uMan == null || uMan.IsLocalGridUser(avatar.UUID)) + AttachmentsModule.SaveChangedAttachments(avatar, false); + } + + ForEachClient( + delegate(IClientAPI client) + { + //We can safely ignore null reference exceptions. It means the avatar is dead and cleaned up anyway + try { client.SendKillObject(avatar.RegionHandle, new List { avatar.LocalId }); } + catch (NullReferenceException) { } + }); + } IAgentAssetTransactions agentTransactions = this.RequestModuleInterface(); if (agentTransactions != null) From 0c5fefacb415fb916ffece839c95c155ec718254 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 7 Jun 2012 23:51:04 +0100 Subject: [PATCH 342/547] Record the fact that child agents can have asset transactions. Also change code to grab the agent asset transaction module once. --- .../AssetTransactionModule.cs | 15 +++++----- .../InventoryAccess/InventoryAccessModule.cs | 2 +- .../Framework/Scenes/Scene.Inventory.cs | 29 ++++++++----------- OpenSim/Region/Framework/Scenes/Scene.cs | 12 ++++---- 4 files changed, 26 insertions(+), 32 deletions(-) diff --git a/OpenSim/Region/CoreModules/Agent/AssetTransaction/AssetTransactionModule.cs b/OpenSim/Region/CoreModules/Agent/AssetTransaction/AssetTransactionModule.cs index 874693e8ea..708198923a 100644 --- a/OpenSim/Region/CoreModules/Agent/AssetTransaction/AssetTransactionModule.cs +++ b/OpenSim/Region/CoreModules/Agent/AssetTransaction/AssetTransactionModule.cs @@ -42,8 +42,7 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction public class AssetTransactionModule : INonSharedRegionModule, IAgentAssetTransactions { -// private static readonly ILog m_log = LogManager.GetLogger( -// MethodBase.GetCurrentMethod().DeclaringType); + private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); protected Scene m_Scene; private bool m_dumpAssetsToFile = false; @@ -209,15 +208,15 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction /// and comes through this method. ///

- public void AddStreamHandler(string httpMethod, string path, RestMethod method) { if (!IsEnabled) diff --git a/OpenSim/Capabilities/Handlers/GetTexture/GetTextureHandler.cs b/OpenSim/Capabilities/Handlers/GetTexture/GetTextureHandler.cs index abdbc7268b..ae6c44bb6a 100644 --- a/OpenSim/Capabilities/Handlers/GetTexture/GetTextureHandler.cs +++ b/OpenSim/Capabilities/Handlers/GetTexture/GetTextureHandler.cs @@ -77,7 +77,6 @@ namespace OpenSim.Capabilities.Handlers { m_log.Error("[GETTEXTURE]: Cannot fetch texture " + textureStr + " without an asset service"); httpResponse.StatusCode = (int)System.Net.HttpStatusCode.NotFound; - return null; } UUID textureID; @@ -115,7 +114,6 @@ namespace OpenSim.Capabilities.Handlers // "[GETTEXTURE]: For texture {0} sending back response {1}, data length {2}", // textureID, httpResponse.StatusCode, httpResponse.ContentLength); - httpResponse.Send(); return null; } diff --git a/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs b/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs index 401dfd3e26..ef6e2594c4 100644 --- a/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs +++ b/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs @@ -408,7 +408,10 @@ namespace OpenSim.Framework.Servers.HttpServer string uriString = request.RawUrl; // string reqnum = "unknown"; - int tickstart = Environment.TickCount; + int requestStartTick = Environment.TickCount; + + // Will be adjusted later on. + int requestEndTick = requestStartTick; IRequestHandler requestHandler = null; @@ -433,6 +436,7 @@ namespace OpenSim.Framework.Servers.HttpServer { if (HandleAgentRequest(agentHandler, request, response)) { + requestEndTick = Environment.TickCount; return; } } @@ -442,6 +446,7 @@ namespace OpenSim.Framework.Servers.HttpServer string path = request.RawUrl; string handlerKey = GetHandlerKey(request.HttpMethod, path); + byte[] buffer = null; if (TryGetStreamHandler(handlerKey, out requestHandler)) { @@ -450,9 +455,6 @@ namespace OpenSim.Framework.Servers.HttpServer "[BASE HTTP SERVER]: Found stream handler for {0} {1} {2} {3}", request.HttpMethod, request.Url.PathAndQuery, requestHandler.Name, requestHandler.Description); - // Okay, so this is bad, but should be considered temporary until everything is IStreamHandler. - byte[] buffer = null; - response.ContentType = requestHandler.ContentType; // Lets do this defaulting before in case handler has varying content type. if (requestHandler is IStreamedRequestHandler) @@ -507,8 +509,8 @@ namespace OpenSim.Framework.Servers.HttpServer //m_log.Warn("[HTTP]: " + requestBody); } - DoHTTPGruntWork(HTTPRequestHandler.Handle(path, keysvals), response); - return; + + buffer = DoHTTPGruntWork(HTTPRequestHandler.Handle(path, keysvals), response); } else { @@ -521,133 +523,100 @@ namespace OpenSim.Framework.Servers.HttpServer buffer = memoryStream.ToArray(); } } + } + else + { + switch (request.ContentType) + { + case null: + case "text/html": + + if (DebugLevel >= 1) + m_log.DebugFormat( + "[BASE HTTP SERVER]: Found a {0} content type handler for {1} {2}", + request.ContentType, request.HttpMethod, request.Url.PathAndQuery); + + buffer = HandleHTTPRequest(request, response); + break; + + case "application/llsd+xml": + case "application/xml+llsd": + case "application/llsd+json": + + if (DebugLevel >= 1) + m_log.DebugFormat( + "[BASE HTTP SERVER]: Found a {0} content type handler for {1} {2}", + request.ContentType, request.HttpMethod, request.Url.PathAndQuery); + + buffer = HandleLLSDRequests(request, response); + break; + + case "text/xml": + case "application/xml": + case "application/json": + default: + //m_log.Info("[Debug BASE HTTP SERVER]: in default handler"); + // Point of note.. the DoWeHaveA methods check for an EXACT path + // if (request.RawUrl.Contains("/CAPS/EQG")) + // { + // int i = 1; + // } + //m_log.Info("[Debug BASE HTTP SERVER]: Checking for LLSD Handler"); + if (DoWeHaveALLSDHandler(request.RawUrl)) + { + if (DebugLevel >= 1) + m_log.DebugFormat( + "[BASE HTTP SERVER]: Found a {0} content type handler for {1} {2}", + request.ContentType, request.HttpMethod, request.Url.PathAndQuery); + + buffer = HandleLLSDRequests(request, response); + } + // m_log.DebugFormat("[BASE HTTP SERVER]: Checking for HTTP Handler for request {0}", request.RawUrl); + else if (DoWeHaveAHTTPHandler(request.RawUrl)) + { + if (DebugLevel >= 1) + m_log.DebugFormat( + "[BASE HTTP SERVER]: Found a {0} content type handler for {1} {2}", + request.ContentType, request.HttpMethod, request.Url.PathAndQuery); + + buffer = HandleHTTPRequest(request, response); + } + else + { + + if (DebugLevel >= 1) + m_log.DebugFormat( + "[BASE HTTP SERVER]: Assuming a generic XMLRPC request for {0} {1}", + request.HttpMethod, request.Url.PathAndQuery); + + // generic login request. + buffer = HandleXmlRpcRequests(request, response); + } + + break; + } + } - request.InputStream.Close(); - - // HTTP IN support. The script engine takes it from here - // Nothing to worry about for us. - // - if (buffer == null) - return; + request.InputStream.Close(); + if (buffer != null) + { if (!response.SendChunked) response.ContentLength64 = buffer.LongLength; - try - { - response.OutputStream.Write(buffer, 0, buffer.Length); - //response.OutputStream.Close(); - } - catch (HttpListenerException) - { - m_log.WarnFormat("[BASE HTTP SERVER]: HTTP request abnormally terminated."); - } - //response.OutputStream.Close(); - try - { - response.Send(); - //response.FreeContext(); - } - catch (SocketException e) - { - // This has to be here to prevent a Linux/Mono crash - m_log.Warn(String.Format("[BASE HTTP SERVER]: XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux. ", e.Message), e); - } - catch (IOException e) - { - m_log.Warn(String.Format("[BASE HTTP SERVER]: XmlRpcRequest issue {0}. ", e.Message), e); - } - - return; + response.OutputStream.Write(buffer, 0, buffer.Length); } - if (request.AcceptTypes != null && request.AcceptTypes.Length > 0) - { - foreach (string strAccept in request.AcceptTypes) - { - if (strAccept.Contains("application/llsd+xml") || - strAccept.Contains("application/llsd+json")) - { - if (DebugLevel >= 1) - m_log.DebugFormat( - "[BASE HTTP SERVER]: Found application/llsd+xml accept header handler for {0} {1}", - request.HttpMethod, request.Url.PathAndQuery); + // Do not include the time taken to actually send the response to the caller in the measurement + // time. This is to avoid logging when it's the client that is slow to process rather than the + // server + requestEndTick = Environment.TickCount; - HandleLLSDRequests(request, response); - return; - } - } - } + response.Send(); - switch (request.ContentType) - { - case null: - case "text/html": + //response.OutputStream.Close(); - if (DebugLevel >= 1) - m_log.DebugFormat( - "[BASE HTTP SERVER]: Found a {0} content type handler for {1} {2}", - request.ContentType, request.HttpMethod, request.Url.PathAndQuery); - - HandleHTTPRequest(request, response); - return; - - case "application/llsd+xml": - case "application/xml+llsd": - case "application/llsd+json": - - if (DebugLevel >= 1) - m_log.DebugFormat( - "[BASE HTTP SERVER]: Found a {0} content type handler for {1} {2}", - request.ContentType, request.HttpMethod, request.Url.PathAndQuery); - - HandleLLSDRequests(request, response); - return; - - case "text/xml": - case "application/xml": - case "application/json": - default: - //m_log.Info("[Debug BASE HTTP SERVER]: in default handler"); - // Point of note.. the DoWeHaveA methods check for an EXACT path - // if (request.RawUrl.Contains("/CAPS/EQG")) - // { - // int i = 1; - // } - //m_log.Info("[Debug BASE HTTP SERVER]: Checking for LLSD Handler"); - if (DoWeHaveALLSDHandler(request.RawUrl)) - { - if (DebugLevel >= 1) - m_log.DebugFormat( - "[BASE HTTP SERVER]: Found a {0} content type handler for {1} {2}", - request.ContentType, request.HttpMethod, request.Url.PathAndQuery); - - HandleLLSDRequests(request, response); - return; - } - -// m_log.DebugFormat("[BASE HTTP SERVER]: Checking for HTTP Handler for request {0}", request.RawUrl); - if (DoWeHaveAHTTPHandler(request.RawUrl)) - { - if (DebugLevel >= 1) - m_log.DebugFormat( - "[BASE HTTP SERVER]: Found a {0} content type handler for {1} {2}", - request.ContentType, request.HttpMethod, request.Url.PathAndQuery); - - HandleHTTPRequest(request, response); - return; - } - - if (DebugLevel >= 1) - m_log.DebugFormat( - "[BASE HTTP SERVER]: Assuming a generic XMLRPC request for {0} {1}", - request.HttpMethod, request.Url.PathAndQuery); - - // generic login request. - HandleXmlRpcRequests(request, response); - - return; - } + //response.FreeContext(); } catch (SocketException e) { @@ -672,8 +641,8 @@ namespace OpenSim.Framework.Servers.HttpServer finally { // Every month or so this will wrap and give bad numbers, not really a problem - // since its just for reporting, tickdiff limit can be adjusted - int tickdiff = Environment.TickCount - tickstart; + // since its just for reporting + int tickdiff = requestEndTick - requestStartTick; if (tickdiff > 3000) { m_log.InfoFormat( @@ -805,7 +774,7 @@ namespace OpenSim.Framework.Servers.HttpServer ///
/// /// - private void HandleXmlRpcRequests(OSHttpRequest request, OSHttpResponse response) + private byte[] HandleXmlRpcRequests(OSHttpRequest request, OSHttpResponse response) { Stream requestStream = request.InputStream; @@ -817,7 +786,7 @@ namespace OpenSim.Framework.Servers.HttpServer requestStream.Close(); //m_log.Debug(requestBody); requestBody = requestBody.Replace("", ""); - string responseString = String.Empty; + string responseString = null; XmlRpcRequest xmlRprcRequest = null; try @@ -895,6 +864,7 @@ namespace OpenSim.Framework.Servers.HttpServer String.Format("Requested method [{0}] not found", methodName)); } + response.ContentType = "text/xml"; responseString = XmlRpcResponseSerializer.Singleton.Serialize(xmlRpcResponse); } else @@ -904,82 +874,25 @@ namespace OpenSim.Framework.Servers.HttpServer response.StatusCode = 404; response.StatusDescription = "Not Found"; response.ProtocolVersion = "HTTP/1.0"; - byte[] buf = Encoding.UTF8.GetBytes("Not found"); + responseString = "Not found"; response.KeepAlive = false; m_log.ErrorFormat( "[BASE HTTP SERVER]: Handler not found for http request {0} {1}", request.HttpMethod, request.Url.PathAndQuery); - - response.SendChunked = false; - response.ContentLength64 = buf.Length; - response.ContentEncoding = Encoding.UTF8; - - try - { - response.OutputStream.Write(buf, 0, buf.Length); - } - catch (Exception ex) - { - m_log.Warn("[BASE HTTP SERVER]: Error - " + ex.Message); - } - finally - { - try - { - response.Send(); - //response.FreeContext(); - } - catch (SocketException e) - { - // This has to be here to prevent a Linux/Mono crash - m_log.Warn(String.Format("[BASE HTTP SERVER]: XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux. ", e.Message), e); - } - catch (IOException e) - { - m_log.Warn(String.Format("[BASE HTTP SERVER]: XmlRpcRequest issue {0} ", e.Message), e); - } - } - return; - //responseString = "Error"; } } - response.ContentType = "text/xml"; - byte[] buffer = Encoding.UTF8.GetBytes(responseString); response.SendChunked = false; response.ContentLength64 = buffer.Length; response.ContentEncoding = Encoding.UTF8; - try - { - response.OutputStream.Write(buffer, 0, buffer.Length); - } - catch (Exception ex) - { - m_log.Warn("[BASE HTTP SERVER]: Error - " + ex.Message); - } - finally - { - try - { - response.Send(); - //response.FreeContext(); - } - catch (SocketException e) - { - // This has to be here to prevent a Linux/Mono crash - m_log.Warn(String.Format("[BASE HTTP SERVER]: XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux. ", e.Message), e); - } - catch (IOException e) - { - m_log.Warn(String.Format("[BASE HTTP SERVER]: XmlRpcRequest issue {0} ", e.Message), e); - } - } + + return buffer; } - private void HandleLLSDRequests(OSHttpRequest request, OSHttpResponse response) + private byte[] HandleLLSDRequests(OSHttpRequest request, OSHttpResponse response) { //m_log.Warn("[BASE HTTP SERVER]: We've figured out it's a LLSD Request"); Stream requestStream = request.InputStream; @@ -1065,34 +978,7 @@ namespace OpenSim.Framework.Servers.HttpServer response.ContentEncoding = Encoding.UTF8; response.KeepAlive = true; - try - { - response.OutputStream.Write(buffer, 0, buffer.Length); - } - catch (Exception ex) - { - m_log.Warn("[BASE HTTP SERVER]: Error - " + ex.Message); - } - finally - { - //response.OutputStream.Close(); - try - { - response.Send(); - response.OutputStream.Flush(); - //response.FreeContext(); - //response.OutputStream.Close(); - } - catch (IOException e) - { - m_log.Warn(String.Format("[BASE HTTP SERVER]: LLSD IOException {0} ", e.Message), e); - } - catch (SocketException e) - { - // This has to be here to prevent a Linux/Mono crash - m_log.Warn(String.Format("[BASE HTTP SERVER]: LLSD issue {0}.\nNOTE: this may be spurious on Linux. ", e.Message), e); - } - } + return buffer; } private byte[] BuildLLSDResponse(OSHttpRequest request, OSHttpResponse response, OSD llsdResponse) @@ -1357,7 +1243,7 @@ namespace OpenSim.Framework.Servers.HttpServer } - public void HandleHTTPRequest(OSHttpRequest request, OSHttpResponse response) + public byte[] HandleHTTPRequest(OSHttpRequest request, OSHttpResponse response) { // m_log.DebugFormat( // "[BASE HTTP SERVER]: HandleHTTPRequest for request to {0}, method {1}", @@ -1367,15 +1253,14 @@ namespace OpenSim.Framework.Servers.HttpServer { case "OPTIONS": response.StatusCode = (int)OSHttpStatusCode.SuccessOk; - return; + return null; default: - HandleContentVerbs(request, response); - return; + return HandleContentVerbs(request, response); } } - private void HandleContentVerbs(OSHttpRequest request, OSHttpResponse response) + private byte[] HandleContentVerbs(OSHttpRequest request, OSHttpResponse response) { // m_log.DebugFormat("[BASE HTTP SERVER]: HandleContentVerbs for request to {0}", request.RawUrl); @@ -1391,6 +1276,8 @@ namespace OpenSim.Framework.Servers.HttpServer // to display the form, or process it. // a better way would be nifty. + byte[] buffer; + Stream requestStream = request.InputStream; Encoding encoding = Encoding.UTF8; @@ -1451,14 +1338,14 @@ namespace OpenSim.Framework.Servers.HttpServer if (foundHandler) { Hashtable responsedata1 = requestprocessor(keysvals); - DoHTTPGruntWork(responsedata1,response); + buffer = DoHTTPGruntWork(responsedata1,response); //SendHTML500(response); } else { // m_log.Warn("[BASE HTTP SERVER]: Handler Not Found"); - SendHTML404(response, host); + buffer = SendHTML404(response, host); } } else @@ -1468,16 +1355,18 @@ namespace OpenSim.Framework.Servers.HttpServer if (foundHandler) { Hashtable responsedata2 = requestprocessor(keysvals); - DoHTTPGruntWork(responsedata2, response); + buffer = DoHTTPGruntWork(responsedata2, response); //SendHTML500(response); } else { // m_log.Warn("[BASE HTTP SERVER]: Handler Not Found2"); - SendHTML404(response, host); + buffer = SendHTML404(response, host); } } + + return buffer; } private bool TryGetHTTPHandlerPathBased(string path, out GenericHTTPMethod httpHandler) @@ -1545,14 +1434,13 @@ namespace OpenSim.Framework.Servers.HttpServer } } - internal void DoHTTPGruntWork(Hashtable responsedata, OSHttpResponse response) + internal byte[] DoHTTPGruntWork(Hashtable responsedata, OSHttpResponse response) { //m_log.Info("[BASE HTTP SERVER]: Doing HTTP Grunt work with response"); int responsecode = (int)responsedata["int_response_code"]; string responseString = (string)responsedata["str_response_string"]; string contentType = (string)responsedata["content_type"]; - if (responsedata.ContainsKey("error_status_text")) { response.StatusDescription = (string)responsedata["error_status_text"]; @@ -1616,38 +1504,10 @@ namespace OpenSim.Framework.Servers.HttpServer response.ContentLength64 = buffer.Length; response.ContentEncoding = Encoding.UTF8; - try - { - response.OutputStream.Write(buffer, 0, buffer.Length); - } - catch (Exception ex) - { - m_log.Warn("[HTTPD]: Error - " + ex.Message); - } - finally - { - //response.OutputStream.Close(); - try - { - response.OutputStream.Flush(); - response.Send(); - - //if (!response.KeepAlive && response.ReuseContext) - // response.FreeContext(); - } - catch (SocketException e) - { - // This has to be here to prevent a Linux/Mono crash - m_log.Warn(String.Format("[BASE HTTP SERVER]: XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux. ", e.Message), e); - } - catch (IOException e) - { - m_log.Warn(String.Format("[BASE HTTP SERVER]: XmlRpcRequest issue {0} ", e.Message), e); - } - } + return buffer; } - public void SendHTML404(OSHttpResponse response, string host) + public byte[] SendHTML404(OSHttpResponse response, string host) { // I know this statuscode is dumb, but the client doesn't respond to 404s and 500s response.StatusCode = 404; @@ -1660,31 +1520,10 @@ namespace OpenSim.Framework.Servers.HttpServer response.ContentLength64 = buffer.Length; response.ContentEncoding = Encoding.UTF8; - try - { - response.OutputStream.Write(buffer, 0, buffer.Length); - } - catch (Exception ex) - { - m_log.Warn("[BASE HTTP SERVER]: Error - " + ex.Message); - } - finally - { - //response.OutputStream.Close(); - try - { - response.Send(); - //response.FreeContext(); - } - catch (SocketException e) - { - // This has to be here to prevent a Linux/Mono crash - m_log.Warn(String.Format("[BASE HTTP SERVER]: XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux. ", e.Message), e); - } - } + return buffer; } - public void SendHTML500(OSHttpResponse response) + public byte[] SendHTML500(OSHttpResponse response) { // I know this statuscode is dumb, but the client doesn't respond to 404s and 500s response.StatusCode = (int)OSHttpStatusCode.SuccessOk; @@ -1696,28 +1535,8 @@ namespace OpenSim.Framework.Servers.HttpServer response.SendChunked = false; response.ContentLength64 = buffer.Length; response.ContentEncoding = Encoding.UTF8; - try - { - response.OutputStream.Write(buffer, 0, buffer.Length); - } - catch (Exception ex) - { - m_log.Warn("[BASE HTTP SERVER]: Error - " + ex.Message); - } - finally - { - //response.OutputStream.Close(); - try - { - response.Send(); - //response.FreeContext(); - } - catch (SocketException e) - { - // This has to be here to prevent a Linux/Mono crash - m_log.Warn(String.Format("[BASE HTTP SERVER] XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux. ", e.Message), e); - } - } + + return buffer; } public void Start() diff --git a/OpenSim/Framework/Servers/HttpServer/Interfaces/IOSHttpResponse.cs b/OpenSim/Framework/Servers/HttpServer/Interfaces/IOSHttpResponse.cs index 33a1663358..f61b090be4 100644 --- a/OpenSim/Framework/Servers/HttpServer/Interfaces/IOSHttpResponse.cs +++ b/OpenSim/Framework/Servers/HttpServer/Interfaces/IOSHttpResponse.cs @@ -128,11 +128,5 @@ namespace OpenSim.Framework.Servers.HttpServer /// string containing the header field /// value void AddHeader(string key, string value); - - /// - /// Send the response back to the remote client - /// - void Send(); } -} - +} \ No newline at end of file diff --git a/OpenSim/Framework/Servers/HttpServer/OSHttpResponse.cs b/OpenSim/Framework/Servers/HttpServer/OSHttpResponse.cs index f9227ace62..89fb5d4562 100644 --- a/OpenSim/Framework/Servers/HttpServer/OSHttpResponse.cs +++ b/OpenSim/Framework/Servers/HttpServer/OSHttpResponse.cs @@ -321,13 +321,12 @@ namespace OpenSim.Framework.Servers.HttpServer { _httpResponse.Body.Flush(); _httpResponse.Send(); - } + public void FreeContext() { if (_httpClientContext != null) _httpClientContext.Close(); } - } } \ No newline at end of file diff --git a/OpenSim/Framework/Servers/HttpServer/PollServiceRequestManager.cs b/OpenSim/Framework/Servers/HttpServer/PollServiceRequestManager.cs index f96fd1fa20..3252251702 100644 --- a/OpenSim/Framework/Servers/HttpServer/PollServiceRequestManager.cs +++ b/OpenSim/Framework/Servers/HttpServer/PollServiceRequestManager.cs @@ -140,9 +140,8 @@ namespace OpenSim.Framework.Servers.HttpServer foreach (object o in m_requests) { PollServiceHttpRequest req = (PollServiceHttpRequest) o; - m_server.DoHTTPGruntWork( - req.PollServiceArgs.NoEvents(req.RequestID, req.PollServiceArgs.Id), - new OSHttpResponse(new HttpResponse(req.HttpContext, req.Request), req.HttpContext)); + PollServiceWorkerThread.DoHTTPGruntWork( + m_server, req, req.PollServiceArgs.NoEvents(req.RequestID, req.PollServiceArgs.Id)); } m_requests.Clear(); @@ -151,6 +150,7 @@ namespace OpenSim.Framework.Servers.HttpServer { t.Abort(); } + m_running = false; } } diff --git a/OpenSim/Framework/Servers/HttpServer/PollServiceWorkerThread.cs b/OpenSim/Framework/Servers/HttpServer/PollServiceWorkerThread.cs index 5e171f00f8..299542103a 100644 --- a/OpenSim/Framework/Servers/HttpServer/PollServiceWorkerThread.cs +++ b/OpenSim/Framework/Servers/HttpServer/PollServiceWorkerThread.cs @@ -90,15 +90,16 @@ namespace OpenSim.Framework.Servers.HttpServer } Hashtable responsedata = req.PollServiceArgs.GetEvents(req.RequestID, req.PollServiceArgs.Id, str.ReadToEnd()); - m_server.DoHTTPGruntWork(responsedata, - new OSHttpResponse(new HttpResponse(req.HttpContext, req.Request),req.HttpContext)); + DoHTTPGruntWork(m_server, req, responsedata); } else { if ((Environment.TickCount - req.RequestTime) > m_timeout) { - m_server.DoHTTPGruntWork(req.PollServiceArgs.NoEvents(req.RequestID, req.PollServiceArgs.Id), - new OSHttpResponse(new HttpResponse(req.HttpContext, req.Request),req.HttpContext)); + DoHTTPGruntWork( + m_server, + req, + req.PollServiceArgs.NoEvents(req.RequestID, req.PollServiceArgs.Id)); } else { @@ -119,5 +120,47 @@ namespace OpenSim.Framework.Servers.HttpServer { m_request.Enqueue(pPollServiceHttpRequest); } + + /// + /// FIXME: This should be part of BaseHttpServer + /// + internal static void DoHTTPGruntWork(BaseHttpServer server, PollServiceHttpRequest req, Hashtable responsedata) + { + OSHttpResponse response + = new OSHttpResponse(new HttpResponse(req.HttpContext, req.Request), req.HttpContext); + + byte[] buffer + = server.DoHTTPGruntWork( + responsedata, new OSHttpResponse(new HttpResponse(req.HttpContext, req.Request), req.HttpContext)); + + response.SendChunked = false; + response.ContentLength64 = buffer.Length; + response.ContentEncoding = Encoding.UTF8; + + try + { + response.OutputStream.Write(buffer, 0, buffer.Length); + } + catch (Exception ex) + { + m_log.Warn(string.Format("[POLL SERVICE WORKER THREAD]: Error ", ex)); + } + finally + { + //response.OutputStream.Close(); + try + { + response.OutputStream.Flush(); + response.Send(); + + //if (!response.KeepAlive && response.ReuseContext) + // response.FreeContext(); + } + catch (Exception e) + { + m_log.Warn(String.Format("[POLL SERVICE WORKER THREAD]: Error ", e)); + } + } + } } -} +} \ No newline at end of file From 4e18e71089eb1ef84bad8f09dd4a9d18f09bec5e Mon Sep 17 00:00:00 2001 From: Melanie Date: Wed, 13 Jun 2012 02:32:25 +0100 Subject: [PATCH 369/547] Committing the Avination implementation of llCastRay. This is a complete rewrite wich does it's thing independently of physics. Enjoy! --- .../Shared/Api/Implementation/LSL_Api.cs | 453 ++++++++++++++---- 1 file changed, 349 insertions(+), 104 deletions(-) diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index 89f2068ea5..a8679e2cb1 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -10781,155 +10781,400 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api return rq.ToString(); } + private struct Tri + { + public Vector3 p1; + public Vector3 p2; + public Vector3 p3; + } + + private bool InBoundingBox(ScenePresence avatar, Vector3 point) + { + float height = avatar.Appearance.AvatarHeight; + Vector3 b1 = avatar.AbsolutePosition + new Vector3(-0.22f, -0.22f, -height/2); + Vector3 b2 = avatar.AbsolutePosition + new Vector3(0.22f, 0.22f, height/2); + + if (point.X > b1.X && point.X < b2.X && + point.Y > b1.Y && point.Y < b2.Y && + point.Z > b1.Z && point.Z < b2.Z) + return true; + return false; + } + + private ContactResult[] AvatarIntersection(Vector3 rayStart, Vector3 rayEnd) + { + List contacts = new List(); + + Vector3 ab = rayEnd - rayStart; + + World.ForEachScenePresence(delegate(ScenePresence sp) + { + Vector3 ac = sp.AbsolutePosition - rayStart; + Vector3 bc = sp.AbsolutePosition - rayEnd; + + double d = Math.Abs(Vector3.Mag(Vector3.Cross(ab, ac)) / Vector3.Distance(rayStart, rayEnd)); + + if (d > 1.5) + return; + + double d2 = Vector3.Dot(Vector3.Negate(ab), ac); + + if (d2 > 0) + return; + + double dp = Math.Sqrt(Vector3.Mag(ac) * Vector3.Mag(ac) - d * d); + Vector3 p = rayStart + Vector3.Divide(Vector3.Multiply(ab, (float)dp), (float)Vector3.Mag(ab)); + + if (!InBoundingBox(sp, p)) + return; + + ContactResult result = new ContactResult (); + result.ConsumerID = sp.LocalId; + result.Depth = Vector3.Distance(rayStart, p); + result.Normal = Vector3.Zero; + result.Pos = p; + + contacts.Add(result); + }); + + return contacts.ToArray(); + } + + private ContactResult[] ObjectIntersection(Vector3 rayStart, Vector3 rayEnd, bool includePhysical, bool includeNonPhysical, bool includePhantom) + { + Ray ray = new Ray(rayStart, Vector3.Normalize(rayEnd - rayStart)); + List contacts = new List(); + + Vector3 ab = rayEnd - rayStart; + + World.ForEachSOG(delegate(SceneObjectGroup group) + { + if (m_host.ParentGroup == group) + return; + + if (group.IsAttachment) + return; + + if (group.RootPart.PhysActor == null) + { + if (!includePhantom) + return; + } + else + { + if (group.RootPart.PhysActor.IsPhysical) + { + if (!includePhysical) + return; + } + else + { + if (!includeNonPhysical) + return; + } + } + + // Find the radius ouside of which we don't even need to hit test + float minX; + float maxX; + float minY; + float maxY; + float minZ; + float maxZ; + + float radius = 0.0f; + + group.GetAxisAlignedBoundingBoxRaw(out minX, out maxX, out minY, out maxY, out minZ, out maxZ); + + if (Math.Abs(minX) > radius) + radius = Math.Abs(minX); + if (Math.Abs(minY) > radius) + radius = Math.Abs(minY); + if (Math.Abs(minZ) > radius) + radius = Math.Abs(minZ); + if (Math.Abs(maxX) > radius) + radius = Math.Abs(maxX); + if (Math.Abs(maxY) > radius) + radius = Math.Abs(maxY); + if (Math.Abs(maxZ) > radius) + radius = Math.Abs(maxZ); + + Vector3 ac = group.AbsolutePosition - rayStart; + Vector3 bc = group.AbsolutePosition - rayEnd; + + double d = Math.Abs(Vector3.Mag(Vector3.Cross(ab, ac)) / Vector3.Distance(rayStart, rayEnd)); + + // Too far off ray, don't bother + if (d > radius) + return; + + // Behind ray, drop + double d2 = Vector3.Dot(Vector3.Negate(ab), ac); + if (d2 > 0) + return; + + EntityIntersection intersection = group.TestIntersection(ray, true, false); + // Miss. + if (!intersection.HitTF) + return; + + ContactResult result = new ContactResult (); + result.ConsumerID = group.LocalId; + result.Depth = intersection.distance; + result.Normal = intersection.normal; + result.Pos = intersection.ipoint; + + contacts.Add(result); + }); + + return contacts.ToArray(); + } + + private ContactResult? GroundIntersection(Vector3 rayStart, Vector3 rayEnd) + { + double[,] heightfield = World.Heightmap.GetDoubles(); + List contacts = new List(); + + double min = 2048.0; + double max = 0.0; + + // Find the min and max of the heightfield + for (int x = 0 ; x < World.Heightmap.Width ; x++) + { + for (int y = 0 ; y < World.Heightmap.Height ; y++) + { + if (heightfield[x, y] > max) + max = heightfield[x, y]; + if (heightfield[x, y] < min) + min = heightfield[x, y]; + } + } + + + // A ray extends past rayEnd, but doesn't go back before + // rayStart. If the start is above the highest point of the ground + // and the ray goes up, we can't hit the ground. Ever. + if (rayStart.Z > max && rayEnd.Z >= rayStart.Z) + return null; + + // Same for going down + if (rayStart.Z < min && rayEnd.Z <= rayStart.Z) + return null; + + List trilist = new List(); + + // Create our triangle list + for (int x = 1 ; x < World.Heightmap.Width ; x++) + { + for (int y = 1 ; y < World.Heightmap.Height ; y++) + { + Tri t1 = new Tri(); + Tri t2 = new Tri(); + + Vector3 p1 = new Vector3(x-1, y-1, (float)heightfield[x-1, y-1]); + Vector3 p2 = new Vector3(x, y-1, (float)heightfield[x, y-1]); + Vector3 p3 = new Vector3(x, y, (float)heightfield[x, y]); + Vector3 p4 = new Vector3(x-1, y, (float)heightfield[x-1, y]); + + t1.p1 = p1; + t1.p2 = p2; + t1.p3 = p3; + + t2.p1 = p3; + t2.p2 = p4; + t2.p3 = p1; + + trilist.Add(t1); + trilist.Add(t2); + } + } + + // Ray direction + Vector3 rayDirection = rayEnd - rayStart; + + foreach (Tri t in trilist) + { + // Compute triangle plane normal and edges + Vector3 u = t.p2 - t.p1; + Vector3 v = t.p3 - t.p1; + Vector3 n = Vector3.Cross(u, v); + + if (n == Vector3.Zero) + continue; + + Vector3 w0 = rayStart - t.p1; + double a = -Vector3.Dot(n, w0); + double b = Vector3.Dot(n, rayDirection); + + // Not intersecting the plane, or in plane (same thing) + // Ignoring this MAY cause the ground to not be detected + // sometimes + if (Math.Abs(b) < 0.000001) + continue; + + double r = a / b; + + // ray points away from plane + if (r < 0.0) + continue; + + Vector3 ip = rayStart + Vector3.Multiply(rayDirection, (float)r); + + float uu = Vector3.Dot(u, u); + float uv = Vector3.Dot(u, v); + float vv = Vector3.Dot(v, v); + Vector3 w = ip - t.p1; + float wu = Vector3.Dot(w, u); + float wv = Vector3.Dot(w, v); + float d = uv * uv - uu * vv; + + float cs = (uv * wv - vv * wu) / d; + if (cs < 0 || cs > 1.0) + continue; + float ct = (uv * wu - uu * wv) / d; + if (ct < 0 || (cs + ct) > 1.0) + continue; + + // Add contact point + ContactResult result = new ContactResult (); + result.ConsumerID = 0; + result.Depth = Vector3.Distance(rayStart, ip); + result.Normal = n; + result.Pos = ip; + + contacts.Add(result); + } + + if (contacts.Count == 0) + return null; + + contacts.Sort(delegate(ContactResult a, ContactResult b) + { + return (int)(a.Depth - b.Depth); + }); + + return contacts[0]; + } + public LSL_List llCastRay(LSL_Vector start, LSL_Vector end, LSL_List options) { + LSL_List list = new LSL_List(); + m_host.AddScriptLPS(1); - Vector3 dir = new Vector3((float)(end-start).x, (float)(end-start).y, (float)(end-start).z); - Vector3 startvector = new Vector3((float)start.x, (float)start.y, (float)start.z); - Vector3 endvector = new Vector3((float)end.x, (float)end.y, (float)end.z); + Vector3 rayStart = new Vector3((float)start.x, (float)start.y, (float)start.z); + Vector3 rayEnd = new Vector3((float)end.x, (float)end.y, (float)end.z); + Vector3 dir = rayEnd - rayStart; - int count = 0; -// int detectPhantom = 0; + float dist = Vector3.Mag(dir); + + int count = 1; + bool detectPhantom = false; int dataFlags = 0; int rejectTypes = 0; for (int i = 0; i < options.Length; i += 2) { if (options.GetLSLIntegerItem(i) == ScriptBaseClass.RC_MAX_HITS) - { count = options.GetLSLIntegerItem(i + 1); - } -// else if (options.GetLSLIntegerItem(i) == ScriptBaseClass.RC_DETECT_PHANTOM) -// { -// detectPhantom = options.GetLSLIntegerItem(i + 1); -// } + else if (options.GetLSLIntegerItem(i) == ScriptBaseClass.RC_DETECT_PHANTOM) + detectPhantom = (options.GetLSLIntegerItem(i + 1) > 0); else if (options.GetLSLIntegerItem(i) == ScriptBaseClass.RC_DATA_FLAGS) - { dataFlags = options.GetLSLIntegerItem(i + 1); - } else if (options.GetLSLIntegerItem(i) == ScriptBaseClass.RC_REJECT_TYPES) - { rejectTypes = options.GetLSLIntegerItem(i + 1); - } } - LSL_List list = new LSL_List(); - List results = World.PhysicsScene.RaycastWorld(startvector, dir, dir.Length(), count); + if (count > 16) + count = 16; - double distance = Util.GetDistanceTo(startvector, endvector); - - if (distance == 0) - distance = 0.001; - - Vector3 posToCheck = startvector; - ITerrainChannel channel = World.RequestModuleInterface(); + List results = new List(); bool checkTerrain = !((rejectTypes & ScriptBaseClass.RC_REJECT_LAND) == ScriptBaseClass.RC_REJECT_LAND); bool checkAgents = !((rejectTypes & ScriptBaseClass.RC_REJECT_AGENTS) == ScriptBaseClass.RC_REJECT_AGENTS); bool checkNonPhysical = !((rejectTypes & ScriptBaseClass.RC_REJECT_NONPHYSICAL) == ScriptBaseClass.RC_REJECT_NONPHYSICAL); bool checkPhysical = !((rejectTypes & ScriptBaseClass.RC_REJECT_PHYSICAL) == ScriptBaseClass.RC_REJECT_PHYSICAL); - for (float i = 0; i <= distance; i += 0.1f) + + if (checkTerrain) { - posToCheck = startvector + (dir * (i / (float)distance)); - - if (checkTerrain && channel[(int)(posToCheck.X + startvector.X), (int)(posToCheck.Y + startvector.Y)] < posToCheck.Z) - { - ContactResult result = new ContactResult(); - result.ConsumerID = 0; - result.Depth = 0; - result.Normal = Vector3.Zero; - result.Pos = posToCheck; - results.Add(result); - checkTerrain = false; - } - - if (checkAgents) - { - World.ForEachRootScenePresence(delegate(ScenePresence sp) - { - if (sp.AbsolutePosition.ApproxEquals(posToCheck, sp.PhysicsActor.Size.X)) - { - ContactResult result = new ContactResult (); - result.ConsumerID = sp.LocalId; - result.Depth = 0; - result.Normal = Vector3.Zero; - result.Pos = posToCheck; - results.Add(result); - } - }); - } + ContactResult? groundContact = GroundIntersection(rayStart, rayEnd); + if (groundContact != null) + results.Add((ContactResult)groundContact); } - int refcount = 0; + if (checkAgents) + { + ContactResult[] agentHits = AvatarIntersection(rayStart, rayEnd); + foreach (ContactResult r in agentHits) + results.Add(r); + } + + if (checkPhysical || checkNonPhysical || detectPhantom) + { + ContactResult[] objectHits = ObjectIntersection(rayStart, rayEnd, checkPhysical, checkNonPhysical, detectPhantom); + foreach (ContactResult r in objectHits) + results.Add(r); + } + + results.Sort(delegate(ContactResult a, ContactResult b) + { + return a.Depth.CompareTo(b.Depth); + }); + + int values = 0; + SceneObjectGroup thisgrp = m_host.ParentGroup; + foreach (ContactResult result in results) { - if ((rejectTypes & ScriptBaseClass.RC_REJECT_LAND) - == ScriptBaseClass.RC_REJECT_LAND && result.ConsumerID == 0) + if (result.Depth > dist) continue; - ISceneEntity entity = World.GetSceneObjectPart(result.ConsumerID); + // physics ray can return colisions with host prim + if (m_host.LocalId == result.ConsumerID) + continue; - if (entity == null && (rejectTypes & ScriptBaseClass.RC_REJECT_AGENTS) != ScriptBaseClass.RC_REJECT_AGENTS) - entity = World.GetScenePresence(result.ConsumerID); //Only check if we should be looking for agents + UUID itemID = UUID.Zero; + int linkNum = 0; - if (entity == null) + SceneObjectPart part = World.GetSceneObjectPart(result.ConsumerID); + // It's a prim! + if (part != null) { - list.Add(UUID.Zero); + // dont detect members of same object ??? + if (part.ParentGroup == thisgrp) + continue; - if ((dataFlags & ScriptBaseClass.RC_GET_LINK_NUM) == ScriptBaseClass.RC_GET_LINK_NUM) - list.Add(0); - - list.Add(result.Pos); - - if ((dataFlags & ScriptBaseClass.RC_GET_NORMAL) == ScriptBaseClass.RC_GET_NORMAL) - list.Add(result.Normal); - - continue; //Can't find it, so add UUID.Zero - } - - /*if (detectPhantom == 0 && intersection.obj is ISceneChildEntity && - ((ISceneChildEntity)intersection.obj).PhysActor == null) - continue;*/ //Can't do this ATM, physics engine knows only of non phantom objects - - if (entity is SceneObjectPart) - { - PhysicsActor pa = ((SceneObjectPart)entity).PhysActor; - - if (pa != null && pa.IsPhysical) - { - if (!checkPhysical) - continue; - } + if ((dataFlags & ScriptBaseClass.RC_GET_ROOT_KEY) == ScriptBaseClass.RC_GET_ROOT_KEY) + itemID = part.ParentGroup.UUID; else - { - if (!checkNonPhysical) - continue; - } + itemID = part.UUID; + + linkNum = part.LinkNum; + } + else + { + ScenePresence sp = World.GetScenePresence(result.ConsumerID); + /// It it a boy? a girl? + if (sp != null) + itemID = sp.UUID; } - refcount++; - if ((dataFlags & ScriptBaseClass.RC_GET_ROOT_KEY) == ScriptBaseClass.RC_GET_ROOT_KEY && entity is SceneObjectPart) - list.Add(((SceneObjectPart)entity).ParentGroup.UUID); - else - list.Add(entity.UUID); + list.Add(new LSL_String(itemID.ToString())); + list.Add(new LSL_String(result.Pos.ToString())); if ((dataFlags & ScriptBaseClass.RC_GET_LINK_NUM) == ScriptBaseClass.RC_GET_LINK_NUM) - { - if (entity is SceneObjectPart) - list.Add(((SceneObjectPart)entity).LinkNum); - else - list.Add(0); - } - - list.Add(result.Pos); + list.Add(new LSL_Integer(linkNum)); if ((dataFlags & ScriptBaseClass.RC_GET_NORMAL) == ScriptBaseClass.RC_GET_NORMAL) - list.Add(result.Normal); + list.Add(new LSL_Vector(result.Normal.X, result.Normal.Y, result.Normal.Z)); + + values++; + if (values >= count) + break; } - list.Add(refcount); //The status code, either the # of contacts, RCERR_SIM_PERF_LOW, or RCERR_CAST_TIME_EXCEEDED + list.Add(new LSL_Integer(values)); return list; } From 7c0843aad196f9198fd59605e1bbecee141ed067 Mon Sep 17 00:00:00 2001 From: BlueWall Date: Tue, 12 Jun 2012 21:52:52 -0400 Subject: [PATCH 370/547] Add the updated OpenSimDefaults.ini for the prior timer_Interval patch. --- bin/OpenSimDefaults.ini | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/bin/OpenSimDefaults.ini b/bin/OpenSimDefaults.ini index 0e1a3af525..1b8a4b6446 100644 --- a/bin/OpenSimDefaults.ini +++ b/bin/OpenSimDefaults.ini @@ -33,6 +33,10 @@ ; Console commands run every 20 minutes ; timer_Script = "filename" + ; timer_Script time interval (default 20 min) + ; The time is 60 per minute + ; timer_Interval = 1200 + ; ## ; ## SYSTEM ; ## From 5145356467244d6a4d66cd36eef22a23d6fc73a1 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Wed, 13 Jun 2012 03:49:22 +0100 Subject: [PATCH 371/547] Add "deregister region" by uuid command to grid service to allow manual deregistration of simulators. Useful if a simulator has crashed without removing its regions and those regions have been reconfigured differently --- OpenSim/Services/GridService/GridService.cs | 45 +++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/OpenSim/Services/GridService/GridService.cs b/OpenSim/Services/GridService/GridService.cs index 8a60ca5467..11897f8809 100644 --- a/OpenSim/Services/GridService/GridService.cs +++ b/OpenSim/Services/GridService/GridService.cs @@ -84,6 +84,13 @@ namespace OpenSim.Services.GridService if (MainConsole.Instance != null) { + MainConsole.Instance.Commands.AddCommand("Regions", true, + "deregister region", + "deregister region ", + "Deregister a region manually.", + String.Empty, + HandleDeregisterRegion); + MainConsole.Instance.Commands.AddCommand("Regions", true, "show region", "show region ", @@ -495,6 +502,44 @@ namespace OpenSim.Services.GridService return -1; } + private void HandleDeregisterRegion(string module, string[] cmd) + { + if (cmd.Length != 3) + { + MainConsole.Instance.Output("Syntax: degregister region "); + return; + } + + string rawRegionUuid = cmd[2]; + UUID regionUuid; + + if (!UUID.TryParse(rawRegionUuid, out regionUuid)) + { + MainConsole.Instance.OutputFormat("{0} is not a valid region uuid", rawRegionUuid); + return; + } + + GridRegion region = GetRegionByUUID(UUID.Zero, regionUuid); + + if (region == null) + { + MainConsole.Instance.OutputFormat("No region with UUID {0}", regionUuid); + return; + } + + if (DeregisterRegion(regionUuid)) + { + MainConsole.Instance.OutputFormat("Deregistered {0} {1}", region.RegionName, regionUuid); + } + else + { + // I don't think this can ever occur if we know that the region exists. + MainConsole.Instance.OutputFormat("Error deregistering {0} {1}", region.RegionName, regionUuid); + } + + return; + } + private void HandleShowRegion(string module, string[] cmd) { if (cmd.Length != 3) From 1f34c8277d2584f0b43a43555f8b0abded4a1aa4 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Wed, 13 Jun 2012 04:05:02 +0100 Subject: [PATCH 372/547] In the osGetGrid functions, if the [GridInfo] section does not exist then return "Configuration Error", as already happens if there is no GridInfoURI --- .../ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs index 7ea8b7a4fb..7fa25f559e 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs @@ -1965,7 +1965,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api { string retval = String.Empty; IConfigSource config = m_ScriptEngine.ConfigSource; - string url = config.Configs["GridInfo"].GetString("GridInfoURI", String.Empty); + string url = null; + + IConfig gridInfoConfig = config.Configs["GridInfo"]; + + if (gridInfoConfig != null) + url = gridInfoConfig.GetString("GridInfoURI", String.Empty); if (String.IsNullOrEmpty(url)) return "Configuration Error!"; From f726150afdf3fd85f3ec08585fd84f75b5852e79 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Wed, 13 Jun 2012 23:39:23 +0100 Subject: [PATCH 373/547] Add ObjectUpdate as one of the packets that can be screened out when setting debug packet level --- OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs index c4f167e2a1..ad39b509cc 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs @@ -11650,7 +11650,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP if (DebugPacketLevel <= 100 && (packet.Type == PacketType.AvatarAnimation || packet.Type == PacketType.ViewerEffect)) logPacket = false; - if (DebugPacketLevel <= 50 && packet.Type == PacketType.ImprovedTerseObjectUpdate) + if (DebugPacketLevel <= 50 + & (packet.Type == PacketType.ImprovedTerseObjectUpdate || packet.Type == PacketType.ObjectUpdate)) logPacket = false; if (DebugPacketLevel <= 25 && packet.Type == PacketType.ObjectPropertiesFamily) From cf080a68d657e082dd61dacc24ffd17240154e90 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Wed, 13 Jun 2012 23:42:22 +0100 Subject: [PATCH 374/547] Remove long obsolete and unused IClientAPI.KillEndDone() --- OpenSim/Framework/IClientAPI.cs | 2 -- OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs | 4 ---- .../Agent/InternetRelayClientView/Server/IRCClientView.cs | 5 ----- OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs | 4 ---- OpenSim/Tests/Common/Mock/TestClient.cs | 4 ---- 5 files changed, 19 deletions(-) diff --git a/OpenSim/Framework/IClientAPI.cs b/OpenSim/Framework/IClientAPI.cs index 2ea6de547a..4cc2e2c9c3 100644 --- a/OpenSim/Framework/IClientAPI.cs +++ b/OpenSim/Framework/IClientAPI.cs @@ -1414,8 +1414,6 @@ namespace OpenSim.Framework void SendGroupVoteHistory(UUID groupID, UUID transactionID, GroupVoteHistory[] Votes); - void KillEndDone(); - bool AddGenericPacketHandler(string MethodName, GenericMessage handler); void SendRebakeAvatarTextures(UUID textureID); diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs index ad39b509cc..4e0dadb95d 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs @@ -11861,10 +11861,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP return string.Empty; } - public void KillEndDone() - { - } - #region IClientCore private readonly Dictionary m_clientInterfaces = new Dictionary(); diff --git a/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs b/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs index 43548e673f..3a3252853d 100644 --- a/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs +++ b/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs @@ -1626,11 +1626,6 @@ namespace OpenSim.Region.OptionalModules.Agent.InternetRelayClientView.Server } - public void KillEndDone() - { - - } - public bool AddGenericPacketHandler(string MethodName, GenericMessage handler) { return true; diff --git a/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs b/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs index e57e5e6f97..b3e10698fd 100644 --- a/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs +++ b/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs @@ -1044,10 +1044,6 @@ namespace OpenSim.Region.OptionalModules.World.NPC { } - public void KillEndDone() - { - } - public void SendEventInfoReply (EventData info) { } diff --git a/OpenSim/Tests/Common/Mock/TestClient.cs b/OpenSim/Tests/Common/Mock/TestClient.cs index 36049a1386..376465c053 100644 --- a/OpenSim/Tests/Common/Mock/TestClient.cs +++ b/OpenSim/Tests/Common/Mock/TestClient.cs @@ -1123,10 +1123,6 @@ namespace OpenSim.Tests.Common.Mock { } - public void KillEndDone() - { - } - public void SendEventInfoReply (EventData info) { } From 16ffc764bf57dcc85461f2e5c6457ee8237e78c9 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Wed, 13 Jun 2012 23:54:32 +0100 Subject: [PATCH 375/547] minor: refactor part of LLClientView.ProcessEntityUpdates() to remove duplicate code --- .../Region/ClientStack/Linden/UDP/LLClientView.cs | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs index 4e0dadb95d..85d83f8486 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs @@ -3780,16 +3780,19 @@ namespace OpenSim.Region.ClientStack.LindenUDP if (!canUseImproved && !canUseCompressed) { + ObjectUpdatePacket.ObjectDataBlock updateBlock; + if (update.Entity is ScenePresence) { - objectUpdateBlocks.Value.Add(CreateAvatarUpdateBlock((ScenePresence)update.Entity)); - objectUpdates.Value.Add(update); + updateBlock = CreateAvatarUpdateBlock((ScenePresence)update.Entity); } else { - objectUpdateBlocks.Value.Add(CreatePrimUpdateBlock((SceneObjectPart)update.Entity, this.m_agentId)); - objectUpdates.Value.Add(update); + updateBlock = CreatePrimUpdateBlock((SceneObjectPart)update.Entity, AgentId); } + + objectUpdateBlocks.Value.Add(updateBlock); + objectUpdates.Value.Add(update); } else if (!canUseImproved) { @@ -3814,7 +3817,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP #endregion Block Construction } - #region Packet Sending ushort timeDilation = Utils.FloatToUInt16(avgTimeDilation, 0.0f, 1.0f); From 6a77a656753fd5433cbb105649b8dd1e3cf83337 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 14 Jun 2012 00:35:26 +0100 Subject: [PATCH 376/547] minor: remove unnecessary IsAttachment = false setting for new object in UploadObjectAssetModule, property always starts as false --- .../Linden/Caps/ObjectCaps/UploadObjectAssetModule.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/OpenSim/Region/ClientStack/Linden/Caps/ObjectCaps/UploadObjectAssetModule.cs b/OpenSim/Region/ClientStack/Linden/Caps/ObjectCaps/UploadObjectAssetModule.cs index f0f398417f..ba902b2a3b 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/ObjectCaps/UploadObjectAssetModule.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/ObjectCaps/UploadObjectAssetModule.cs @@ -333,7 +333,6 @@ namespace OpenSim.Region.ClientStack.Linden grp.AbsolutePosition = obj.Position; prim.RotationOffset = obj.Rotation; - grp.IsAttachment = false; // Required for linking grp.RootPart.ClearUpdateSchedule(); From cba8b4f8b8c2566426216e395561cdf4ae49c72e Mon Sep 17 00:00:00 2001 From: Melanie Date: Wed, 6 Jun 2012 20:35:00 +0200 Subject: [PATCH 377/547] Fix not sending TransferInfo when an asset is not found. This clogs up the sound pipeline in the viewer. --- .../ClientStack/Linden/UDP/LLClientView.cs | 33 ++++++++++++++++--- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs index 85d83f8486..8f55208a21 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs @@ -2719,6 +2719,19 @@ namespace OpenSim.Region.ClientStack.LindenUDP } } + public void SendAssetNotFound(AssetRequestToClient req) + { + TransferInfoPacket Transfer = new TransferInfoPacket(); + Transfer.TransferInfo.ChannelType = 2; + Transfer.TransferInfo.Status = -2; + Transfer.TransferInfo.TargetType = 0; + Transfer.TransferInfo.Params = req.Params; + Transfer.TransferInfo.Size = 0; + Transfer.TransferInfo.TransferID = req.TransferRequestID; + Transfer.Header.Zerocoded = true; + OutPacket(Transfer, ThrottleOutPacketType.Asset); + } + public void SendTexture(AssetBase TextureAsset) { @@ -11980,14 +11993,27 @@ namespace OpenSim.Region.ClientStack.LindenUDP /// protected void AssetReceived(string id, Object sender, AssetBase asset) { - if (asset == null) - return; - TransferRequestPacket transferRequest = (TransferRequestPacket)sender; UUID requestID = UUID.Zero; byte source = (byte)SourceType.Asset; + AssetRequestToClient req = new AssetRequestToClient(); + + if (asset == null) + { + req.AssetInf = null; + req.AssetRequestSource = source; + req.IsTextureRequest = false; + req.NumPackets = 0; + req.Params = transferRequest.TransferInfo.Params; + req.RequestAssetID = requestID; + req.TransferRequestID = transferRequest.TransferInfo.TransferID; + + SendAssetNotFound(req); + return; + } + if (transferRequest.TransferInfo.SourceType == (int)SourceType.Asset) { requestID = new UUID(transferRequest.TransferInfo.Params, 0); @@ -12004,7 +12030,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP return; // The asset is known to exist and is in our cache, so add it to the AssetRequests list - AssetRequestToClient req = new AssetRequestToClient(); req.AssetInf = asset; req.AssetRequestSource = source; req.IsTextureRequest = false; From a4290048e5333d34910fd8c4dfd6cb9b5819d1c1 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 14 Jun 2012 01:12:16 +0100 Subject: [PATCH 378/547] Add SOG.HasPrivateAttachmentPoint to tell if a SOG has a private attachment point. HUDs attachment points are private. Change SOP.SendFullUpdateToClient() and SoundModule.PlayAttachedSound() to use this rather than different magic number formulations. This also corrects a bug in PlayAttachedSound() where the code assumed that all attachment points over 30 were HUDs. It appears this is no longer true with Neck and Root (Avatar Center) --- .../CoreModules/World/Sound/SoundModule.cs | 7 ++----- .../Region/Framework/Scenes/SceneObjectGroup.cs | 16 ++++++++++++++++ .../Region/Framework/Scenes/SceneObjectPart.cs | 5 +++-- 3 files changed, 21 insertions(+), 7 deletions(-) diff --git a/OpenSim/Region/CoreModules/World/Sound/SoundModule.cs b/OpenSim/Region/CoreModules/World/Sound/SoundModule.cs index 93b10052fc..d768a1ac16 100644 --- a/OpenSim/Region/CoreModules/World/Sound/SoundModule.cs +++ b/OpenSim/Region/CoreModules/World/Sound/SoundModule.cs @@ -78,11 +78,8 @@ namespace OpenSim.Region.CoreModules.World.Sound if (grp.IsAttachment) { - if (grp.AttachmentPoint > 30) // HUD - { - if (sp.ControllingClient.AgentId != grp.OwnerID) - return; - } + if (grp.HasPrivateAttachmentPoint && sp.ControllingClient.AgentId != grp.OwnerID) + return; if (sp.ControllingClient.AgentId == grp.OwnerID) dis = 0; diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs index 20d7a01bd7..619296ed61 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs @@ -180,6 +180,22 @@ namespace OpenSim.Region.Framework.Scenes } } + /// + /// If this scene object has an attachment point then indicate whether there is a point where + /// attachments are perceivable by avatars other than the avatar to which this object is attached. + /// + /// + /// HUDs are not perceivable by other avatars. + /// + public bool HasPrivateAttachmentPoint + { + get + { + return AttachmentPoint >= (uint)OpenMetaverse.AttachmentPoint.HUDCenter2 + && AttachmentPoint <= (uint)OpenMetaverse.AttachmentPoint.HUDBottomRight; + } + } + public void ClearPartAttachmentData() { AttachmentPoint = 0; diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index 17c766191f..7640fc04b8 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs @@ -2573,8 +2573,9 @@ namespace OpenSim.Region.Framework.Scenes if (ParentGroup.IsDeleted) return; - if (ParentGroup.IsAttachment && (ParentGroup.AttachedAvatar != remoteClient.AgentId) && - (ParentGroup.AttachmentPoint >= 31) && (ParentGroup.AttachmentPoint <= 38)) + if (ParentGroup.IsAttachment + && ParentGroup.AttachedAvatar != remoteClient.AgentId + && ParentGroup.HasPrivateAttachmentPoint) return; if (remoteClient.AgentId == OwnerID) From 917d753f1c1474b4ed3f905d8dd95db2e0e2fc9e Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 14 Jun 2012 01:36:37 +0100 Subject: [PATCH 379/547] Fix a race condition where an object update for a hud could be sent to non-owner avatars if the hud was attached directly from within the region. If this happens, then the non-owners would see unremovable huds that they did not own until relog, and sometimes even beyond that. This was due to a race between the entity update and the attachment code when moving an object from within scene to a hud. --- .../ClientStack/Linden/UDP/LLClientView.cs | 27 ++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs index 85d83f8486..83e49f318e 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs @@ -3722,8 +3722,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP } } - ++updatesThisCall; - #region UpdateFlags to packet type conversion PrimUpdateFlags updateFlags = (PrimUpdateFlags)update.Flags; @@ -3788,7 +3786,15 @@ namespace OpenSim.Region.ClientStack.LindenUDP } else { - updateBlock = CreatePrimUpdateBlock((SceneObjectPart)update.Entity, AgentId); + SceneObjectPart part = (SceneObjectPart)update.Entity; + updateBlock = CreatePrimUpdateBlock(part, AgentId); + + // If the part has become a private hud since the update was scheduled then we do not + // want to send it to other avatars. + if (part.ParentGroup.IsAttachment + && part.ParentGroup.HasPrivateAttachmentPoint + && part.ParentGroup.AttachedAvatar != AgentId) + continue; } objectUpdateBlocks.Value.Add(updateBlock); @@ -3811,6 +3817,19 @@ namespace OpenSim.Region.ClientStack.LindenUDP { // Everything else goes here terseUpdateBlocks.Value.Add(CreateImprovedTerseBlock(update.Entity, updateFlags.HasFlag(PrimUpdateFlags.Textures))); + + if (update.Entity is SceneObjectPart) + { + SceneObjectPart part = (SceneObjectPart)update.Entity; + + // If the part has become a private hud since the update was scheduled then we do not + // want to send it to other avatars. + if (part.ParentGroup.IsAttachment + && part.ParentGroup.HasPrivateAttachmentPoint + && part.ParentGroup.AttachedAvatar != AgentId) + continue; + } + terseUpdates.Value.Add(update); } } @@ -3880,6 +3899,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP // If any of the packets created from this call go unacknowledged, all of the updates will be resent OutPacket(packet, ThrottleOutPacketType.Task, true, delegate(OutgoingPacket oPacket) { ResendPrimUpdates(terseUpdates.Value, oPacket); }); } + + ++updatesThisCall; } #endregion Packet Sending From 3c3ea196201b56407ccf6c21229064f7954c716d Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 14 Jun 2012 02:26:38 +0100 Subject: [PATCH 380/547] Fix a bug where scene objects attached as HUDs through scripts would not disappear for other avatars. We do this by sending a kill message for that object to all other avatars apart from the one that has the hud. --- .../Avatar/Attachments/AttachmentsModule.cs | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs index 88071f6184..d47b1abbf5 100644 --- a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs @@ -562,6 +562,19 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments { m_scene.SendKillObject(new List { so.RootPart.LocalId }); } + else if (so.HasPrivateAttachmentPoint) + { +// m_log.DebugFormat( +// "[ATTACHMENTS MODULE]: Killing private HUD {0} for avatars other than {1} at attachment point {2}", +// so.Name, sp.Name, so.AttachmentPoint); + + // Remove the client from everyone in the + m_scene.ForEachClient( + client => + { if (client.AgentId != so.AttachedAvatar) + client.SendKillObject(m_scene.RegionInfo.RegionHandle, new List() { so.LocalId }); + }); + } so.IsSelected = false; // fudge.... so.ScheduleGroupForFullUpdate(); From 1aa746925314dea88ab18cef6cb91072993f1bd3 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 14 Jun 2012 02:30:40 +0100 Subject: [PATCH 381/547] correct wrong incomplete comment from previous commit 3c3ea19 in AttachmentsModule --- .../Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs index d47b1abbf5..b74c0ba646 100644 --- a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs @@ -568,7 +568,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments // "[ATTACHMENTS MODULE]: Killing private HUD {0} for avatars other than {1} at attachment point {2}", // so.Name, sp.Name, so.AttachmentPoint); - // Remove the client from everyone in the + // As this scene object can now only be seen by the attaching avatar, tell everybody else in the + // scene that it's no longer in their awareness. m_scene.ForEachClient( client => { if (client.AgentId != so.AttachedAvatar) From 3888b9a670656cbcdcb5e6cd46365927a1888f27 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 14 Jun 2012 03:32:44 +0100 Subject: [PATCH 382/547] If we're going to discard a terse update block because it's now someone else's hud, then don't still add it to the list of blocks for the update message. --- OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs index 9f32c33d0b..4ea977eefd 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs @@ -3828,9 +3828,10 @@ namespace OpenSim.Region.ClientStack.LindenUDP } else { - // Everything else goes here - terseUpdateBlocks.Value.Add(CreateImprovedTerseBlock(update.Entity, updateFlags.HasFlag(PrimUpdateFlags.Textures))); + ImprovedTerseObjectUpdatePacket.ObjectDataBlock terseUpdateBlock + = CreateImprovedTerseBlock(update.Entity, updateFlags.HasFlag(PrimUpdateFlags.Textures)); + // Everything else goes here if (update.Entity is SceneObjectPart) { SceneObjectPart part = (SceneObjectPart)update.Entity; @@ -3843,6 +3844,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP continue; } + terseUpdateBlocks.Value.Add(terseUpdateBlock); terseUpdates.Value.Add(update); } } From 2c6555021fdcf5dcd08a19d41412acf20f514b14 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 14 Jun 2012 03:49:54 +0100 Subject: [PATCH 383/547] Fix very recent regression in 917d753 where I put the ++updatesThisCall outside the batching part of ProcessEntityUpdates() This stopped any batching happening and since this method is called periodically updates were sent very slowly --- OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs index 4ea977eefd..4cb7a3a5d4 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs @@ -3848,6 +3848,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP terseUpdates.Value.Add(update); } } + + ++updatesThisCall; #endregion Block Construction } @@ -3914,8 +3916,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP // If any of the packets created from this call go unacknowledged, all of the updates will be resent OutPacket(packet, ThrottleOutPacketType.Task, true, delegate(OutgoingPacket oPacket) { ResendPrimUpdates(terseUpdates.Value, oPacket); }); } - - ++updatesThisCall; } #endregion Packet Sending From f4b02f8e39b9e437a5f5ce4ffc307354fa39bd39 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 14 Jun 2012 04:29:15 +0100 Subject: [PATCH 384/547] Fix a regression in BaseHttpServer.HandleXmlRpcRequests() from recent c6e3752 Accidentally make responseString null by default instead of String.Empty. It needs to be something in case the XmlRpcRequest deserialize throws an exception due to bad xml (a failure which we silently swallow!) --- OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs b/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs index ef6e2594c4..9064464239 100644 --- a/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs +++ b/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs @@ -786,7 +786,7 @@ namespace OpenSim.Framework.Servers.HttpServer requestStream.Close(); //m_log.Debug(requestBody); requestBody = requestBody.Replace("", ""); - string responseString = null; + string responseString = String.Empty; XmlRpcRequest xmlRprcRequest = null; try From 9825861f4ac8d78665c33e2630824d97b356e642 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 14 Jun 2012 23:46:09 +0100 Subject: [PATCH 385/547] Shuffle "debug http" levels so that 1 and 2 now cause different levels of warn to be logged if we receive invalid xml for xmlrpc. --- .../Servers/HttpServer/BaseHttpServer.cs | 35 ++++++++++++++----- OpenSim/Region/Application/OpenSim.cs | 9 ++--- 2 files changed, 32 insertions(+), 12 deletions(-) diff --git a/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs b/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs index 9064464239..35a0be41de 100644 --- a/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs +++ b/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs @@ -82,6 +82,11 @@ namespace OpenSim.Framework.Servers.HttpServer /// /// Control the printing of certain debug messages. /// + /// + /// If DebugLevel >= 1, then short warnings are logged when receiving bad input data. + /// If DebugLevel >= 2, then long warnings are logged when receiving bad input data. + /// If DebugLevel >= 3, then short notices about all incoming non-poll HTTP requests are logged. + /// public int DebugLevel { get; set; } public uint SSLPort @@ -450,7 +455,7 @@ namespace OpenSim.Framework.Servers.HttpServer if (TryGetStreamHandler(handlerKey, out requestHandler)) { - if (DebugLevel >= 1) + if (DebugLevel >= 3) m_log.DebugFormat( "[BASE HTTP SERVER]: Found stream handler for {0} {1} {2} {3}", request.HttpMethod, request.Url.PathAndQuery, requestHandler.Name, requestHandler.Description); @@ -531,7 +536,7 @@ namespace OpenSim.Framework.Servers.HttpServer case null: case "text/html": - if (DebugLevel >= 1) + if (DebugLevel >= 3) m_log.DebugFormat( "[BASE HTTP SERVER]: Found a {0} content type handler for {1} {2}", request.ContentType, request.HttpMethod, request.Url.PathAndQuery); @@ -543,7 +548,7 @@ namespace OpenSim.Framework.Servers.HttpServer case "application/xml+llsd": case "application/llsd+json": - if (DebugLevel >= 1) + if (DebugLevel >= 3) m_log.DebugFormat( "[BASE HTTP SERVER]: Found a {0} content type handler for {1} {2}", request.ContentType, request.HttpMethod, request.Url.PathAndQuery); @@ -564,7 +569,7 @@ namespace OpenSim.Framework.Servers.HttpServer //m_log.Info("[Debug BASE HTTP SERVER]: Checking for LLSD Handler"); if (DoWeHaveALLSDHandler(request.RawUrl)) { - if (DebugLevel >= 1) + if (DebugLevel >= 3) m_log.DebugFormat( "[BASE HTTP SERVER]: Found a {0} content type handler for {1} {2}", request.ContentType, request.HttpMethod, request.Url.PathAndQuery); @@ -574,7 +579,7 @@ namespace OpenSim.Framework.Servers.HttpServer // m_log.DebugFormat("[BASE HTTP SERVER]: Checking for HTTP Handler for request {0}", request.RawUrl); else if (DoWeHaveAHTTPHandler(request.RawUrl)) { - if (DebugLevel >= 1) + if (DebugLevel >= 3) m_log.DebugFormat( "[BASE HTTP SERVER]: Found a {0} content type handler for {1} {2}", request.ContentType, request.HttpMethod, request.Url.PathAndQuery); @@ -583,8 +588,7 @@ namespace OpenSim.Framework.Servers.HttpServer } else { - - if (DebugLevel >= 1) + if (DebugLevel >= 3) m_log.DebugFormat( "[BASE HTTP SERVER]: Assuming a generic XMLRPC request for {0} {1}", request.HttpMethod, request.Url.PathAndQuery); @@ -793,8 +797,23 @@ namespace OpenSim.Framework.Servers.HttpServer { xmlRprcRequest = (XmlRpcRequest) (new XmlRpcRequestDeserializer()).Deserialize(requestBody); } - catch (XmlException) + catch (XmlException e) { + if (DebugLevel >= 1) + { + if (DebugLevel >= 2) + m_log.Warn( + string.Format( + "[BASE HTTP SERVER]: Got XMLRPC request with invalid XML from {0}. XML was '{1}'. Sending blank response. Exception ", + request.RemoteIPEndPoint, requestBody), + e); + else + { + m_log.WarnFormat( + "[BASE HTTP SERVER]: Got XMLRPC request with invalid XML from {0}, length {1}. Sending blank response.", + request.RemoteIPEndPoint, requestBody.Length); + } + } } if (xmlRprcRequest != null) diff --git a/OpenSim/Region/Application/OpenSim.cs b/OpenSim/Region/Application/OpenSim.cs index 57a3c69b07..96d41a490a 100644 --- a/OpenSim/Region/Application/OpenSim.cs +++ b/OpenSim/Region/Application/OpenSim.cs @@ -250,10 +250,11 @@ namespace OpenSim m_console.Commands.AddCommand("Comms", false, "debug http", "debug http ", - "Turn on inbound http request debugging for everything except the event queue (see debug eq).", - "If level >= 2 then the handler used to service the request is logged.\n" - + "If level >= 1 then incoming HTTP requests are logged.\n" - + "If level <= 0 then no extra http logging is done.\n", + "Turn on inbound non-poll http request debugging for everything except the event queue (see debug eq).", + "If level <= 0, then no extra logging is done.\n" + + "If level >= 1, then short warnings are logged when receiving bad input data.\n" + + "If level >= 2, then long warnings are logged when receiving bad input data.\n" + + "If level >= 3, then short notices about all incoming non-poll HTTP requests are logged.\n", Debug); m_console.Commands.AddCommand("Comms", false, "debug teleport", "debug teleport", "Toggle teleport route debugging", Debug); From 93ba0332c4ccbb0c60e6d60fff71dc7d1567c9dd Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 14 Jun 2012 23:54:12 +0100 Subject: [PATCH 386/547] minor: Extend 'debug http' usage statement to 0..3 from 0..2 --- OpenSim/Region/Application/OpenSim.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Region/Application/OpenSim.cs b/OpenSim/Region/Application/OpenSim.cs index 96d41a490a..00ae880c19 100644 --- a/OpenSim/Region/Application/OpenSim.cs +++ b/OpenSim/Region/Application/OpenSim.cs @@ -927,7 +927,7 @@ namespace OpenSim } } - MainConsole.Instance.Output("Usage: debug http 0..2"); + MainConsole.Instance.Output("Usage: debug http 0..3"); break; case "scene": From 6993a26ba599ae38dc6f66332980657d5621987a Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 15 Jun 2012 00:40:12 +0100 Subject: [PATCH 387/547] Get rid of some unnecessary null checks in RegionApplicationBase.StartupSpecific() - a constructor can never return null. Also adds some method doc to MainServer --- OpenSim/Framework/Servers/MainServer.cs | 33 ++++++++++++++++--- .../ClientStack/RegionApplicationBase.cs | 14 +++----- 2 files changed, 33 insertions(+), 14 deletions(-) diff --git a/OpenSim/Framework/Servers/MainServer.cs b/OpenSim/Framework/Servers/MainServer.cs index b8ab8d9b26..ea972ef5fb 100644 --- a/OpenSim/Framework/Servers/MainServer.cs +++ b/OpenSim/Framework/Servers/MainServer.cs @@ -47,20 +47,43 @@ namespace OpenSim.Framework.Servers set { instance = value; } } - public static IHttpServer GetHttpServer(uint port) - { - return GetHttpServer(port,null); - } - + /// + /// Add an already started HTTP server to the collection of known servers. + /// + /// public static void AddHttpServer(BaseHttpServer server) { m_Servers.Add(server.Port, server); } + /// + /// Get the default http server or an http server for a specific port. + /// + /// + /// If the requested HTTP server doesn't already exist then a new one is instantiated and started. + /// + /// + /// If 0 then the default HTTP server is returned. + public static IHttpServer GetHttpServer(uint port) + { + return GetHttpServer(port, null); + } + + /// + /// Get the default http server, an http server for a specific port + /// and/or an http server bound to a specific address + /// + /// + /// If the requested HTTP server doesn't already exist then a new one is instantiated and started. + /// + /// + /// If 0 then the default HTTP server is returned. + /// A specific IP address to bind to. If null then the default IP address is used. public static IHttpServer GetHttpServer(uint port, IPAddress ipaddr) { if (port == 0) return Instance; + if (instance != null && port == Instance.Port) return Instance; diff --git a/OpenSim/Region/ClientStack/RegionApplicationBase.cs b/OpenSim/Region/ClientStack/RegionApplicationBase.cs index 6e78d6d774..27a5879cba 100644 --- a/OpenSim/Region/ClientStack/RegionApplicationBase.cs +++ b/OpenSim/Region/ClientStack/RegionApplicationBase.cs @@ -99,17 +99,13 @@ namespace OpenSim.Region.ClientStack // "OOB" Server if (m_networkServersInfo.ssl_listener) { - BaseHttpServer server = null; - server = new BaseHttpServer( + BaseHttpServer server = new BaseHttpServer( m_networkServersInfo.https_port, m_networkServersInfo.ssl_listener, m_networkServersInfo.cert_path, m_networkServersInfo.cert_pass); - // Add the server to m_Servers - if(server != null) - { - m_log.InfoFormat("[REGION SERVER]: Starting HTTPS server on port {0}", server.Port); - MainServer.AddHttpServer(server); - server.Start(); - } + + m_log.InfoFormat("[REGION SERVER]: Starting HTTPS server on port {0}", server.Port); + MainServer.AddHttpServer(server); + server.Start(); } base.StartupSpecific(); From 10e87f9cdc6c2cbd01da863e01abca8f7e671f9c Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 15 Jun 2012 00:59:53 +0100 Subject: [PATCH 388/547] Make XMLRPCModule use an existing HTTP server if one already exists on the desired port. --- .../Region/CoreModules/Scripting/XMLRPC/XMLRPCModule.cs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/OpenSim/Region/CoreModules/Scripting/XMLRPC/XMLRPCModule.cs b/OpenSim/Region/CoreModules/Scripting/XMLRPC/XMLRPCModule.cs index 40ffcb4a70..0003af2cc9 100644 --- a/OpenSim/Region/CoreModules/Scripting/XMLRPC/XMLRPCModule.cs +++ b/OpenSim/Region/CoreModules/Scripting/XMLRPC/XMLRPCModule.cs @@ -131,11 +131,12 @@ namespace OpenSim.Region.CoreModules.Scripting.XMLRPC { // Start http server // Attach xmlrpc handlers - m_log.Info("[XML RPC MODULE]: " + - "Starting up XMLRPC Server on port " + m_remoteDataPort + " for llRemoteData commands."); - BaseHttpServer httpServer = new BaseHttpServer((uint) m_remoteDataPort); +// m_log.InfoFormat( +// "[XML RPC MODULE]: Starting up XMLRPC Server on port {0} for llRemoteData commands.", +// m_remoteDataPort); + + IHttpServer httpServer = MainServer.GetHttpServer((uint)m_remoteDataPort); httpServer.AddXmlRPCHandler("llRemoteData", XmlRpcRemoteData); - httpServer.Start(); } } From 478acfff34b94c7c42bdb927be531b669c43af72 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 15 Jun 2012 01:24:36 +0100 Subject: [PATCH 389/547] When setting debug http level, do this for all known http servers, not just the main instance. --- .../Servers/HttpServer/BaseHttpServer.cs | 20 ++++----- OpenSim/Framework/Servers/MainServer.cs | 41 ++++++++++++++----- OpenSim/Region/Application/OpenSim.cs | 2 +- 3 files changed, 41 insertions(+), 22 deletions(-) diff --git a/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs b/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs index 35a0be41de..6b52485523 100644 --- a/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs +++ b/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs @@ -53,6 +53,16 @@ namespace OpenSim.Framework.Servers.HttpServer private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); private HttpServerLogWriter httpserverlog = new HttpServerLogWriter(); + /// + /// Control the printing of certain debug messages. + /// + /// + /// If DebugLevel >= 1, then short warnings are logged when receiving bad input data. + /// If DebugLevel >= 2, then long warnings are logged when receiving bad input data. + /// If DebugLevel >= 3, then short notices about all incoming non-poll HTTP requests are logged. + /// + public int DebugLevel { get; set; } + private volatile int NotSocketErrors = 0; public volatile bool HTTPDRunning = false; @@ -79,16 +89,6 @@ namespace OpenSim.Framework.Servers.HttpServer private PollServiceRequestManager m_PollServiceManager; - /// - /// Control the printing of certain debug messages. - /// - /// - /// If DebugLevel >= 1, then short warnings are logged when receiving bad input data. - /// If DebugLevel >= 2, then long warnings are logged when receiving bad input data. - /// If DebugLevel >= 3, then short notices about all incoming non-poll HTTP requests are logged. - /// - public int DebugLevel { get; set; } - public uint SSLPort { get { return m_sslport; } diff --git a/OpenSim/Framework/Servers/MainServer.cs b/OpenSim/Framework/Servers/MainServer.cs index ea972ef5fb..efac6e1128 100644 --- a/OpenSim/Framework/Servers/MainServer.cs +++ b/OpenSim/Framework/Servers/MainServer.cs @@ -38,8 +38,23 @@ namespace OpenSim.Framework.Servers private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); private static BaseHttpServer instance = null; - private static Dictionary m_Servers = - new Dictionary(); + private static Dictionary m_Servers = new Dictionary(); + + public static int DebugLevel + { + get { return s_debugLevel; } + set + { + s_debugLevel = value; + Instance.DebugLevel = s_debugLevel; + + lock (m_Servers) + foreach (BaseHttpServer server in m_Servers.Values) + server.DebugLevel = s_debugLevel; + } + } + + private static int s_debugLevel; public static BaseHttpServer Instance { @@ -53,7 +68,8 @@ namespace OpenSim.Framework.Servers /// public static void AddHttpServer(BaseHttpServer server) { - m_Servers.Add(server.Port, server); + lock (m_Servers) + m_Servers.Add(server.Port, server); } /// @@ -87,18 +103,21 @@ namespace OpenSim.Framework.Servers if (instance != null && port == Instance.Port) return Instance; - if (m_Servers.ContainsKey(port)) - return m_Servers[port]; + lock (m_Servers) + { + if (m_Servers.ContainsKey(port)) + return m_Servers[port]; - m_Servers[port] = new BaseHttpServer(port); + m_Servers[port] = new BaseHttpServer(port); - if (ipaddr != null) - m_Servers[port].ListenIPAddress = ipaddr; + if (ipaddr != null) + m_Servers[port].ListenIPAddress = ipaddr; - m_log.InfoFormat("[MAIN HTTP SERVER]: Starting main http server on port {0}", port); - m_Servers[port].Start(); + m_log.InfoFormat("[MAIN HTTP SERVER]: Starting main http server on port {0}", port); + m_Servers[port].Start(); + } return m_Servers[port]; } } -} +} \ No newline at end of file diff --git a/OpenSim/Region/Application/OpenSim.cs b/OpenSim/Region/Application/OpenSim.cs index 00ae880c19..9043137532 100644 --- a/OpenSim/Region/Application/OpenSim.cs +++ b/OpenSim/Region/Application/OpenSim.cs @@ -921,7 +921,7 @@ namespace OpenSim int newDebug; if (int.TryParse(args[2], out newDebug)) { - MainServer.Instance.DebugLevel = newDebug; + MainServer.DebugLevel = newDebug; MainConsole.Instance.OutputFormat("Debug http level set to {0}", newDebug); break; } From aeed4d3041af75cf18d140208cc4c744a73d0492 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 15 Jun 2012 01:27:29 +0100 Subject: [PATCH 390/547] minor: Tell user the current debug http level if "debug http" console command is executed without a level parameter --- OpenSim/Region/Application/OpenSim.cs | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/OpenSim/Region/Application/OpenSim.cs b/OpenSim/Region/Application/OpenSim.cs index 9043137532..abb30a9117 100644 --- a/OpenSim/Region/Application/OpenSim.cs +++ b/OpenSim/Region/Application/OpenSim.cs @@ -249,12 +249,13 @@ namespace OpenSim Debug); m_console.Commands.AddCommand("Comms", false, "debug http", - "debug http ", + "debug http []", "Turn on inbound non-poll http request debugging for everything except the event queue (see debug eq).", "If level <= 0, then no extra logging is done.\n" + "If level >= 1, then short warnings are logged when receiving bad input data.\n" + "If level >= 2, then long warnings are logged when receiving bad input data.\n" - + "If level >= 3, then short notices about all incoming non-poll HTTP requests are logged.\n", + + "If level >= 3, then short notices about all incoming non-poll HTTP requests are logged.\n" + + "If no level is specified then the current level is returned.", Debug); m_console.Commands.AddCommand("Comms", false, "debug teleport", "debug teleport", "Toggle teleport route debugging", Debug); @@ -926,8 +927,15 @@ namespace OpenSim break; } } + else if (args.Length == 2) + { + MainConsole.Instance.OutputFormat("Current debug http level is {0}", MainServer.DebugLevel); + } + else + { + MainConsole.Instance.Output("Usage: debug http 0..3"); + } - MainConsole.Instance.Output("Usage: debug http 0..3"); break; case "scene": From 257b1b517dec58bf902bac63bc7ab7080286d415 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 15 Jun 2012 02:03:50 +0100 Subject: [PATCH 391/547] Add main instance to internal MainServer.m_Servers list to simplify internal logic. This does require the server to be added before it is set as the main Instance --- .../Servers/HttpServer/BaseHttpServer.cs | 8 --- OpenSim/Framework/Servers/MainServer.cs | 64 ++++++++++++++++++- .../Caps/EventQueue/Tests/EventQueueTests.cs | 11 +++- .../ClientStack/RegionApplicationBase.cs | 1 + OpenSim/Server/Base/HttpServerBase.cs | 13 +--- 5 files changed, 75 insertions(+), 22 deletions(-) diff --git a/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs b/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs index 6b52485523..0db1329ad2 100644 --- a/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs +++ b/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs @@ -53,14 +53,6 @@ namespace OpenSim.Framework.Servers.HttpServer private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); private HttpServerLogWriter httpserverlog = new HttpServerLogWriter(); - /// - /// Control the printing of certain debug messages. - /// - /// - /// If DebugLevel >= 1, then short warnings are logged when receiving bad input data. - /// If DebugLevel >= 2, then long warnings are logged when receiving bad input data. - /// If DebugLevel >= 3, then short notices about all incoming non-poll HTTP requests are logged. - /// public int DebugLevel { get; set; } private volatile int NotSocketErrors = 0; diff --git a/OpenSim/Framework/Servers/MainServer.cs b/OpenSim/Framework/Servers/MainServer.cs index efac6e1128..becbbc21b8 100644 --- a/OpenSim/Framework/Servers/MainServer.cs +++ b/OpenSim/Framework/Servers/MainServer.cs @@ -25,6 +25,7 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +using System; using System.Collections.Generic; using System.Reflection; using System.Net; @@ -40,13 +41,20 @@ namespace OpenSim.Framework.Servers private static BaseHttpServer instance = null; private static Dictionary m_Servers = new Dictionary(); + /// + /// Control the printing of certain debug messages. + /// + /// + /// If DebugLevel >= 1, then short warnings are logged when receiving bad input data. + /// If DebugLevel >= 2, then long warnings are logged when receiving bad input data. + /// If DebugLevel >= 3, then short notices about all incoming non-poll HTTP requests are logged. + /// public static int DebugLevel { get { return s_debugLevel; } set { s_debugLevel = value; - Instance.DebugLevel = s_debugLevel; lock (m_Servers) foreach (BaseHttpServer server in m_Servers.Values) @@ -56,20 +64,70 @@ namespace OpenSim.Framework.Servers private static int s_debugLevel; + /// + /// Set the main HTTP server instance. + /// + /// + /// This will be used to register all handlers that listen to the default port. + /// + /// + /// Thrown if the HTTP server has not already been registered via AddHttpServer() + /// public static BaseHttpServer Instance { get { return instance; } - set { instance = value; } + + set + { + lock (m_Servers) + if (!m_Servers.ContainsValue(value)) + throw new Exception("HTTP server must already have been registered to be set as the main instance"); + + instance = value; + } } /// - /// Add an already started HTTP server to the collection of known servers. + /// Register an already started HTTP server to the collection of known servers. /// /// public static void AddHttpServer(BaseHttpServer server) { lock (m_Servers) + { + if (m_Servers.ContainsKey(server.Port)) + throw new Exception(string.Format("HTTP server for port {0} already exists.", server.Port)); + m_Servers.Add(server.Port, server); + } + } + + /// + /// Removes the http server listening on the given port. + /// + /// + /// It is the responsibility of the caller to do clean up. + /// + /// + /// + public static bool RemoveHttpServer(uint port) + { + lock (m_Servers) + return m_Servers.Remove(port); + } + + /// + /// Does this collection of servers contain one with the given port? + /// + /// + /// Unlike GetHttpServer, this will not instantiate a server if one does not exist on that port. + /// + /// + /// true if a server with the given port is registered, false otherwise. + public static bool ContainsHttpServer(uint port) + { + lock (m_Servers) + return m_Servers.ContainsKey(port); } /// diff --git a/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/Tests/EventQueueTests.cs b/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/Tests/EventQueueTests.cs index c25b58cf8f..cd70410680 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/Tests/EventQueueTests.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/Tests/EventQueueTests.cs @@ -51,7 +51,16 @@ namespace OpenSim.Region.ClientStack.Linden.Tests [SetUp] public void SetUp() { - MainServer.Instance = new BaseHttpServer(9999, false, 9998, ""); + uint port = 9999; + uint sslPort = 9998; + + // This is an unfortunate bit of clean up we have to do because MainServer manages things through static + // variables and the VM is not restarted between tests. + MainServer.RemoveHttpServer(port); + + BaseHttpServer server = new BaseHttpServer(port, false, sslPort, ""); + MainServer.AddHttpServer(server); + MainServer.Instance = server; IConfigSource config = new IniConfigSource(); config.AddConfig("Startup"); diff --git a/OpenSim/Region/ClientStack/RegionApplicationBase.cs b/OpenSim/Region/ClientStack/RegionApplicationBase.cs index 27a5879cba..c4324e8592 100644 --- a/OpenSim/Region/ClientStack/RegionApplicationBase.cs +++ b/OpenSim/Region/ClientStack/RegionApplicationBase.cs @@ -94,6 +94,7 @@ namespace OpenSim.Region.ClientStack m_log.InfoFormat("[REGION SERVER]: Starting HTTP server on port {0}", m_httpServerPort); m_httpServer.Start(); + MainServer.AddHttpServer(m_httpServer); MainServer.Instance = m_httpServer; // "OOB" Server diff --git a/OpenSim/Server/Base/HttpServerBase.cs b/OpenSim/Server/Base/HttpServerBase.cs index d47155984f..7014303203 100644 --- a/OpenSim/Server/Base/HttpServerBase.cs +++ b/OpenSim/Server/Base/HttpServerBase.cs @@ -138,6 +138,7 @@ namespace OpenSim.Server.Base m_HttpServer = new BaseHttpServer(port, ssl_main, cert_path, cert_pass); } + MainServer.AddHttpServer(m_HttpServer); MainServer.Instance = m_HttpServer; // If https_listener = true, then add an ssl listener on the https_port... @@ -157,16 +158,8 @@ namespace OpenSim.Server.Base System.Console.WriteLine("Password for X509 certificate is missing, server can't start."); Thread.CurrentThread.Abort(); } - // Add our https_server - BaseHttpServer server = null; - server = new BaseHttpServer(https_port, ssl_listener, cert_path, cert_pass); - if (server != null) - { - m_Log.InfoFormat("[SERVER]: Starting HTTPS server on port {0}", https_port); - m_Servers.Add(https_port,server); - } - else - System.Console.WriteLine(String.Format("Failed to start HTTPS server on port {0}",https_port)); + + m_Servers.Add(https_port, new BaseHttpServer(https_port, ssl_listener, cert_path, cert_pass)); } } From 94517c8d5c63f9e8a1ea9a83b04db956f27aa25d Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 15 Jun 2012 02:51:52 +0100 Subject: [PATCH 392/547] Make the "debug http" command available for robust as well as the simulator. This allows one to see incoming requests as they happen. This required making everything use the common MainServer class for registering and retrieving http servers, rather than duplicate structures. --- .../Servers/HttpServer/BaseHttpServer.cs | 3 + OpenSim/Framework/Servers/MainServer.cs | 60 +++++++++++++- OpenSim/Region/Application/OpenSim.cs | 34 +------- OpenSim/Server/Base/HttpServerBase.cs | 78 +++++-------------- OpenSim/Server/ServerMain.cs | 26 +++---- prebuild.xml | 1 + 6 files changed, 92 insertions(+), 110 deletions(-) diff --git a/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs b/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs index 0db1329ad2..3de7f9ca72 100644 --- a/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs +++ b/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs @@ -1557,6 +1557,9 @@ namespace OpenSim.Framework.Servers.HttpServer private void StartHTTP() { + m_log.InfoFormat( + "[BASE HTTP SERVER]: Starting {0} server on port {1}", UseSSL ? "HTTPS" : "HTTP", Port); + try { //m_httpListener = new HttpListener(); diff --git a/OpenSim/Framework/Servers/MainServer.cs b/OpenSim/Framework/Servers/MainServer.cs index becbbc21b8..07ff60c326 100644 --- a/OpenSim/Framework/Servers/MainServer.cs +++ b/OpenSim/Framework/Servers/MainServer.cs @@ -30,13 +30,15 @@ using System.Collections.Generic; using System.Reflection; using System.Net; using log4net; +using OpenSim.Framework; +using OpenSim.Framework.Console; using OpenSim.Framework.Servers.HttpServer; namespace OpenSim.Framework.Servers { public class MainServer { - private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); +// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); private static BaseHttpServer instance = null; private static Dictionary m_Servers = new Dictionary(); @@ -87,6 +89,57 @@ namespace OpenSim.Framework.Servers } } + /// + /// Get all the registered servers. + /// + /// + /// Returns a copy of the dictionary so this can be iterated through without locking. + /// + /// + public static Dictionary Servers + { + get { return new Dictionary(m_Servers); } + } + + + public static void RegisterHttpConsoleCommands(ICommandConsole console) + { + console.Commands.AddCommand( + "Comms", false, "debug http", "debug http []", + "Turn on inbound non-poll http request debugging.", + "If level <= 0, then no extra logging is done.\n" + + "If level >= 1, then short warnings are logged when receiving bad input data.\n" + + "If level >= 2, then long warnings are logged when receiving bad input data.\n" + + "If level >= 3, then short notices about all incoming non-poll HTTP requests are logged.\n" + + "If no level is specified then the current level is returned.", + HandleDebugHttpCommand); + } + + /// + /// Turn on some debugging values for OpenSim. + /// + /// + private static void HandleDebugHttpCommand(string module, string[] args) + { + if (args.Length == 3) + { + int newDebug; + if (int.TryParse(args[2], out newDebug)) + { + MainServer.DebugLevel = newDebug; + MainConsole.Instance.OutputFormat("Debug http level set to {0}", newDebug); + } + } + else if (args.Length == 2) + { + MainConsole.Instance.OutputFormat("Current debug http level is {0}", MainServer.DebugLevel); + } + else + { + MainConsole.Instance.Output("Usage: debug http 0..3"); + } + } + /// /// Register an already started HTTP server to the collection of known servers. /// @@ -171,11 +224,10 @@ namespace OpenSim.Framework.Servers if (ipaddr != null) m_Servers[port].ListenIPAddress = ipaddr; - m_log.InfoFormat("[MAIN HTTP SERVER]: Starting main http server on port {0}", port); m_Servers[port].Start(); - } - return m_Servers[port]; + return m_Servers[port]; + } } } } \ No newline at end of file diff --git a/OpenSim/Region/Application/OpenSim.cs b/OpenSim/Region/Application/OpenSim.cs index abb30a9117..faa9e096ec 100644 --- a/OpenSim/Region/Application/OpenSim.cs +++ b/OpenSim/Region/Application/OpenSim.cs @@ -231,6 +231,8 @@ namespace OpenSim /// private void RegisterConsoleCommands() { + MainServer.RegisterHttpConsoleCommands(m_console); + m_console.Commands.AddCommand("Objects", false, "force update", "force update", "Force the update of all objects on clients", @@ -248,16 +250,6 @@ namespace OpenSim + "If an avatar name is given then only packets from that avatar are logged", Debug); - m_console.Commands.AddCommand("Comms", false, "debug http", - "debug http []", - "Turn on inbound non-poll http request debugging for everything except the event queue (see debug eq).", - "If level <= 0, then no extra logging is done.\n" - + "If level >= 1, then short warnings are logged when receiving bad input data.\n" - + "If level >= 2, then long warnings are logged when receiving bad input data.\n" - + "If level >= 3, then short notices about all incoming non-poll HTTP requests are logged.\n" - + "If no level is specified then the current level is returned.", - Debug); - m_console.Commands.AddCommand("Comms", false, "debug teleport", "debug teleport", "Toggle teleport route debugging", Debug); m_console.Commands.AddCommand("Regions", false, "debug scene", @@ -916,28 +908,6 @@ namespace OpenSim break; - case "http": - if (args.Length == 3) - { - int newDebug; - if (int.TryParse(args[2], out newDebug)) - { - MainServer.DebugLevel = newDebug; - MainConsole.Instance.OutputFormat("Debug http level set to {0}", newDebug); - break; - } - } - else if (args.Length == 2) - { - MainConsole.Instance.OutputFormat("Current debug http level is {0}", MainServer.DebugLevel); - } - else - { - MainConsole.Instance.Output("Usage: debug http 0..3"); - } - - break; - case "scene": if (args.Length == 4) { diff --git a/OpenSim/Server/Base/HttpServerBase.cs b/OpenSim/Server/Base/HttpServerBase.cs index 7014303203..7ba0ca8053 100644 --- a/OpenSim/Server/Base/HttpServerBase.cs +++ b/OpenSim/Server/Base/HttpServerBase.cs @@ -42,42 +42,9 @@ namespace OpenSim.Server.Base { // Logger // - private static readonly ILog m_Log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + private static readonly ILog m_Log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - // The http server instance - // - protected BaseHttpServer m_HttpServer = null; - protected uint m_Port = 0; - protected Dictionary m_Servers = - new Dictionary(); - protected uint m_consolePort = 0; - - public IHttpServer HttpServer - { - get { return m_HttpServer; } - } - - public uint DefaultPort - { - get { return m_Port; } - } - - public IHttpServer GetHttpServer(uint port) - { - m_Log.InfoFormat("[SERVER]: Requested port {0}", port); - if (port == m_Port) - return HttpServer; - - if (m_Servers.ContainsKey(port)) - return m_Servers[port]; - - m_Servers[port] = new BaseHttpServer(port); - - m_Log.InfoFormat("[SERVER]: Starting new HTTP server on port {0}", port); - m_Servers[port].Start(); - - return m_Servers[port]; - } + private uint m_consolePort; // Handle all the automagical stuff // @@ -94,19 +61,21 @@ namespace OpenSim.Server.Base System.Console.WriteLine("Section 'Network' not found, server can't start"); Thread.CurrentThread.Abort(); } + uint port = (uint)networkConfig.GetInt("port", 0); if (port == 0) { - Thread.CurrentThread.Abort(); } - // + bool ssl_main = networkConfig.GetBoolean("https_main",false); bool ssl_listener = networkConfig.GetBoolean("https_listener",false); m_consolePort = (uint)networkConfig.GetInt("ConsolePort", 0); - m_Port = port; + + BaseHttpServer httpServer = null; + // // This is where to make the servers: // @@ -118,8 +87,7 @@ namespace OpenSim.Server.Base // if ( !ssl_main ) { - m_HttpServer = new BaseHttpServer(port); - + httpServer = new BaseHttpServer(port); } else { @@ -135,11 +103,12 @@ namespace OpenSim.Server.Base System.Console.WriteLine("Password for X509 certificate is missing, server can't start."); Thread.CurrentThread.Abort(); } - m_HttpServer = new BaseHttpServer(port, ssl_main, cert_path, cert_pass); + + httpServer = new BaseHttpServer(port, ssl_main, cert_path, cert_pass); } - MainServer.AddHttpServer(m_HttpServer); - MainServer.Instance = m_HttpServer; + MainServer.AddHttpServer(httpServer); + MainServer.Instance = httpServer; // If https_listener = true, then add an ssl listener on the https_port... if ( ssl_listener == true ) { @@ -159,34 +128,23 @@ namespace OpenSim.Server.Base Thread.CurrentThread.Abort(); } - m_Servers.Add(https_port, new BaseHttpServer(https_port, ssl_listener, cert_path, cert_pass)); + MainServer.AddHttpServer(new BaseHttpServer(https_port, ssl_listener, cert_path, cert_pass)); } } protected override void Initialise() { - m_Log.InfoFormat("[SERVER]: Starting HTTP server on port {0}", m_HttpServer.Port); - m_HttpServer.Start(); + foreach (BaseHttpServer s in MainServer.Servers.Values) + s.Start(); - if (m_Servers.Count > 0) - { - foreach (BaseHttpServer s in m_Servers.Values) - { - if (!s.UseSSL) - m_Log.InfoFormat("[SERVER]: Starting HTTP server on port {0}", s.Port); - else - m_Log.InfoFormat("[SERVER]: Starting HTTPS server on port {0}", s.Port); - - s.Start(); - } - } + MainServer.RegisterHttpConsoleCommands(MainConsole.Instance); if (MainConsole.Instance is RemoteConsole) { if (m_consolePort == 0) - ((RemoteConsole)MainConsole.Instance).SetServer(m_HttpServer); + ((RemoteConsole)MainConsole.Instance).SetServer(MainServer.Instance); else - ((RemoteConsole)MainConsole.Instance).SetServer(GetHttpServer(m_consolePort)); + ((RemoteConsole)MainConsole.Instance).SetServer(MainServer.GetHttpServer(m_consolePort)); } } } diff --git a/OpenSim/Server/ServerMain.cs b/OpenSim/Server/ServerMain.cs index 9503c4cff6..21fb6785c3 100644 --- a/OpenSim/Server/ServerMain.cs +++ b/OpenSim/Server/ServerMain.cs @@ -30,6 +30,7 @@ using log4net; using System.Reflection; using System; using System.Collections.Generic; +using OpenSim.Framework.Servers; using OpenSim.Framework.Servers.HttpServer; using OpenSim.Server.Base; using OpenSim.Server.Handlers.Base; @@ -92,27 +93,24 @@ namespace OpenSim.Server if (parts.Length > 1) friendlyName = parts[1]; - IHttpServer server = m_Server.HttpServer; - if (port != 0) - server = m_Server.GetHttpServer(port); + IHttpServer server; - if (port != m_Server.DefaultPort && port != 0) - m_log.InfoFormat("[SERVER]: Loading {0} on port {1}", friendlyName, port); + if (port != 0) + server = MainServer.GetHttpServer(port); else - m_log.InfoFormat("[SERVER]: Loading {0}", friendlyName); + server = MainServer.Instance; + + m_log.InfoFormat("[SERVER]: Loading {0} on port {1}", friendlyName, server.Port); IServiceConnector connector = null; - Object[] modargs = new Object[] { m_Server.Config, server, - configName }; - connector = ServerUtils.LoadPlugin(conn, - modargs); + Object[] modargs = new Object[] { m_Server.Config, server, configName }; + connector = ServerUtils.LoadPlugin(conn, modargs); + if (connector == null) { modargs = new Object[] { m_Server.Config, server }; - connector = - ServerUtils.LoadPlugin(conn, - modargs); + connector = ServerUtils.LoadPlugin(conn, modargs); } if (connector != null) @@ -132,4 +130,4 @@ namespace OpenSim.Server return 0; } } -} +} \ No newline at end of file diff --git a/prebuild.xml b/prebuild.xml index d02f2b939f..45f58c7e7c 100644 --- a/prebuild.xml +++ b/prebuild.xml @@ -1385,6 +1385,7 @@ + From c935f0346750d510e5c3c3c2ff62c84609a115e3 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 15 Jun 2012 03:32:43 +0100 Subject: [PATCH 393/547] Put all debug console commands into a single Debug section rather than scattering them over other categories --- OpenSim/Framework/Servers/MainServer.cs | 2 +- OpenSim/Region/Application/OpenSim.cs | 6 +++--- .../Linden/Caps/EventQueue/EventQueueGetModule.cs | 2 +- .../CoreModules/World/Permissions/PermissionsModule.cs | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/OpenSim/Framework/Servers/MainServer.cs b/OpenSim/Framework/Servers/MainServer.cs index 07ff60c326..8dc0e3a71d 100644 --- a/OpenSim/Framework/Servers/MainServer.cs +++ b/OpenSim/Framework/Servers/MainServer.cs @@ -105,7 +105,7 @@ namespace OpenSim.Framework.Servers public static void RegisterHttpConsoleCommands(ICommandConsole console) { console.Commands.AddCommand( - "Comms", false, "debug http", "debug http []", + "Debug", false, "debug http", "debug http []", "Turn on inbound non-poll http request debugging.", "If level <= 0, then no extra logging is done.\n" + "If level >= 1, then short warnings are logged when receiving bad input data.\n" diff --git a/OpenSim/Region/Application/OpenSim.cs b/OpenSim/Region/Application/OpenSim.cs index faa9e096ec..04ff4e62e6 100644 --- a/OpenSim/Region/Application/OpenSim.cs +++ b/OpenSim/Region/Application/OpenSim.cs @@ -238,7 +238,7 @@ namespace OpenSim "Force the update of all objects on clients", HandleForceUpdate); - m_console.Commands.AddCommand("Comms", false, "debug packet", + m_console.Commands.AddCommand("Debug", false, "debug packet", "debug packet [ ]", "Turn on packet debugging", "If level > 255 then all incoming and outgoing packets are logged.\n" @@ -250,9 +250,9 @@ namespace OpenSim + "If an avatar name is given then only packets from that avatar are logged", Debug); - m_console.Commands.AddCommand("Comms", false, "debug teleport", "debug teleport", "Toggle teleport route debugging", Debug); + m_console.Commands.AddCommand("Debug", false, "debug teleport", "debug teleport", "Toggle teleport route debugging", Debug); - m_console.Commands.AddCommand("Regions", false, "debug scene", + m_console.Commands.AddCommand("Debug", false, "debug scene", "debug scene ", "Turn on scene debugging", Debug); diff --git a/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/EventQueueGetModule.cs b/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/EventQueueGetModule.cs index ae759caae2..594b229f20 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/EventQueueGetModule.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/EventQueueGetModule.cs @@ -106,7 +106,7 @@ namespace OpenSim.Region.ClientStack.Linden scene.EventManager.OnRegisterCaps += OnRegisterCaps; MainConsole.Instance.Commands.AddCommand( - "Comms", + "Debug", false, "debug eq", "debug eq [0|1|2]", diff --git a/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs b/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs index 555509c34e..4f72463b7c 100644 --- a/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs +++ b/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs @@ -221,7 +221,7 @@ namespace OpenSim.Region.CoreModules.World.Permissions "Force permissions on or off", HandleForcePermissions); - m_scene.AddCommand("Users", this, "debug permissions", + m_scene.AddCommand("Debug", this, "debug permissions", "debug permissions ", "Turn on permissions debugging", HandleDebugPermissions); From aaa30dcebc223d74d59ecb5d9f8e1e69532efb7c Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 15 Jun 2012 05:01:36 +0100 Subject: [PATCH 394/547] Add region name to UseCircuitCode log messages --- OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs index 5126d845ad..44c65e0460 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs @@ -986,8 +986,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP UseCircuitCodePacket uccp = (UseCircuitCodePacket)array[1]; m_log.DebugFormat( - "[LLUDPSERVER]: Handling UseCircuitCode request for circuit {0} from {1}", - uccp.CircuitCode.Code, buffer.RemoteEndPoint); + "[LLUDPSERVER]: Handling UseCircuitCode request for circuit {0} to {1} from IP {2}", + uccp.CircuitCode.Code, m_scene.RegionInfo.RegionName, buffer.RemoteEndPoint); remoteEndPoint = (IPEndPoint)buffer.RemoteEndPoint; @@ -1016,8 +1016,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP { // Don't create clients for unauthorized requesters. m_log.WarnFormat( - "[LLUDPSERVER]: Connection request for client {0} connecting with unnotified circuit code {1} from {2}", - uccp.CircuitCode.ID, uccp.CircuitCode.Code, remoteEndPoint); + "[LLUDPSERVER]: Ignoring connection request for {0} to {1} with unknown circuit code {2} from IP {3}", + uccp.CircuitCode.ID, m_scene.RegionInfo.RegionName, uccp.CircuitCode.Code, remoteEndPoint); } // m_log.DebugFormat( From 22f25dfcab4a5c0d4df0a3df74a6337ab80c5ee8 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Sat, 16 Jun 2012 03:32:47 +0100 Subject: [PATCH 395/547] Implement max_external_urls_per_simulator setting in [LL-Functions] to allow configuration of how many urls can be set up by llRequestURL() Defaults remains as 100. This setting is per simulator instead of per region due to how the url script module is structured. --- .../Region/CoreModules/Scripting/LSLHttp/UrlModule.cs | 9 ++++++++- bin/OpenSimDefaults.ini | 4 +++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs b/OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs index d2cd163eba..77dfcc6dd2 100644 --- a/OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs +++ b/OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs @@ -76,7 +76,9 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp private Dictionary m_UrlMap = new Dictionary(); - + /// + /// Maximum number of external urls that can be set up by this module. + /// private int m_TotalUrls = 100; private uint https_port = 0; @@ -107,6 +109,11 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp { https_port = (uint) config.Configs["Network"].GetInt("https_port",0); } + + IConfig llFunctionsConfig = config.Configs["LL-Functions"]; + + if (llFunctionsConfig != null) + m_TotalUrls = llFunctionsConfig.GetInt("max_urls_per_simulator", m_TotalUrls); } public void PostInitialise() diff --git a/bin/OpenSimDefaults.ini b/bin/OpenSimDefaults.ini index 1b8a4b6446..ededdc054e 100644 --- a/bin/OpenSimDefaults.ini +++ b/bin/OpenSimDefaults.ini @@ -1168,7 +1168,9 @@ ; Maximum number of llListen events we allow per script ; Set this to 0 to have no limit imposed. max_listens_per_script = 64 - + + ; Maximum number of external urls that scripts can set up in this simulator (e.g. via llRequestURL()) + max_external_urls_per_simulator = 100 [DataSnapshot] ; The following set of configs pertains to search. From ed513fc7bee7945a71ad9cb66d83ac68335a7774 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Sat, 16 Jun 2012 03:43:45 +0100 Subject: [PATCH 396/547] Fix bug introduced in commit c6e3752 (13 Jun 2012) where poll responses would always return OK even if some other status code had been set --- .../Framework/Servers/HttpServer/PollServiceWorkerThread.cs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/OpenSim/Framework/Servers/HttpServer/PollServiceWorkerThread.cs b/OpenSim/Framework/Servers/HttpServer/PollServiceWorkerThread.cs index 299542103a..35a8dee169 100644 --- a/OpenSim/Framework/Servers/HttpServer/PollServiceWorkerThread.cs +++ b/OpenSim/Framework/Servers/HttpServer/PollServiceWorkerThread.cs @@ -129,9 +129,7 @@ namespace OpenSim.Framework.Servers.HttpServer OSHttpResponse response = new OSHttpResponse(new HttpResponse(req.HttpContext, req.Request), req.HttpContext); - byte[] buffer - = server.DoHTTPGruntWork( - responsedata, new OSHttpResponse(new HttpResponse(req.HttpContext, req.Request), req.HttpContext)); + byte[] buffer = server.DoHTTPGruntWork(responsedata, response); response.SendChunked = false; response.ContentLength64 = buffer.Length; From 7119de56ffb9c37b6baa57c5f30b81ac3f86c91c Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Sat, 16 Jun 2012 04:12:53 +0100 Subject: [PATCH 397/547] Change read config paramter from max_urls_per_simulator to max_external_urls_per_simulator, which is what it was meant to be --- OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs b/OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs index 77dfcc6dd2..61afc762e2 100644 --- a/OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs +++ b/OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs @@ -113,7 +113,7 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp IConfig llFunctionsConfig = config.Configs["LL-Functions"]; if (llFunctionsConfig != null) - m_TotalUrls = llFunctionsConfig.GetInt("max_urls_per_simulator", m_TotalUrls); + m_TotalUrls = llFunctionsConfig.GetInt("max_external_urls_per_simulator", m_TotalUrls); } public void PostInitialise() From 2ed768cbf5734f6b0c8825beecc4347bf9537f6f Mon Sep 17 00:00:00 2001 From: BlueWall Date: Sat, 16 Jun 2012 06:25:12 -0400 Subject: [PATCH 398/547] Adjust Robust*.ini.examples V3 webprofile entries --- bin/Robust.HG.ini.example | 14 +++++++++----- bin/Robust.ini.example | 10 +++++++--- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/bin/Robust.HG.ini.example b/bin/Robust.HG.ini.example index 9887ab5763..63a13d7fab 100644 --- a/bin/Robust.HG.ini.example +++ b/bin/Robust.HG.ini.example @@ -237,12 +237,16 @@ ServiceConnectors = "8003/OpenSim.Server.Handlers.dll:AssetServiceConnector,8003 WelcomeMessage = "Welcome, Avatar!" AllowRemoteSetLoginLevel = "false" - - ; For V2 map - MapTileURL = "http://127.0.0.1:8002"; - ; For WebProfiles (V3) - ProfileServerURL = "http://127.0.0.1/profiles/[AGENT_NAME]" + ; For V2/3 Web Profiles + ; Work in progress: The ProfileServerURL/OpenIDServerURL are + ; being used in a development viewer as support for webprofiles + ; is being developed across the componets + ; + ; ProfileServerURL = "http://127.0.0.1/profiles/[AGENT_NAME]" + ; + ; For V2/V3 webapp authentication SSO + ; OpenIDServerURL = "http://127.0.0.1/openid/openidserver/" ; If you run this login server behind a proxy, set this to true ; HasProxy = false diff --git a/bin/Robust.ini.example b/bin/Robust.ini.example index f70d13bd96..5a9d61341c 100644 --- a/bin/Robust.ini.example +++ b/bin/Robust.ini.example @@ -225,10 +225,14 @@ ServiceConnectors = "8003/OpenSim.Server.Handlers.dll:AssetServiceConnector,8003 MapTileURL = "http://127.0.0.1:8002"; ; For V2/3 Web Profiles - ProfileServerURL = "http://127.0.0.1/profiles/[AGENT_NAME]" - + ; Work in progress: The ProfileServerURL/OpenIDServerURL are + ; being used in a development viewer as support for webprofiles + ; is being developed across the componets + ; + ; ProfileServerURL = "http://127.0.0.1/profiles/[AGENT_NAME]" + ; ; For V2/V3 webapp authentication SSO - OpenIDServerURL = "http://127.0.0.1/openid/openidserver/" + ; OpenIDServerURL = "http://127.0.0.1/openid/openidserver/" ; If you run this login server behind a proxy, set this to true ; HasProxy = false From 5c5b359bcb80e8bdea2086cae117312541083787 Mon Sep 17 00:00:00 2001 From: BlueWall Date: Sat, 16 Jun 2012 07:24:27 -0400 Subject: [PATCH 399/547] Oops! putting back the entry for map urls --- bin/Robust.HG.ini.example | 3 +++ 1 file changed, 3 insertions(+) diff --git a/bin/Robust.HG.ini.example b/bin/Robust.HG.ini.example index 63a13d7fab..3eecdd916f 100644 --- a/bin/Robust.HG.ini.example +++ b/bin/Robust.HG.ini.example @@ -238,6 +238,9 @@ ServiceConnectors = "8003/OpenSim.Server.Handlers.dll:AssetServiceConnector,8003 WelcomeMessage = "Welcome, Avatar!" AllowRemoteSetLoginLevel = "false" + ; For V2 map + MapTileURL = "http://127.0.0.1:8002"; + ; For V2/3 Web Profiles ; Work in progress: The ProfileServerURL/OpenIDServerURL are ; being used in a development viewer as support for webprofiles From 8e7032ece87d3e0e75f091ea84d482151e90795e Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Tue, 19 Jun 2012 01:53:50 +0100 Subject: [PATCH 400/547] minor: Add a little more detail to IOException logging in XEngine.SetXMLState() Also removes superflous Close() commands for statements taking place within using() constructs Also adds some comment out debug log messages for future use. --- .../Region/ScriptEngine/XEngine/XEngine.cs | 25 +++++++++++-------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs index a9b6e6754f..35c338d25a 100644 --- a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs +++ b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs @@ -1743,6 +1743,8 @@ namespace OpenSim.Region.ScriptEngine.XEngine public bool SetXMLState(UUID itemID, string xml) { +// m_log.DebugFormat("[XEngine]: Writing state for script item with ID {0}", itemID); + if (xml == String.Empty) return false; @@ -1803,14 +1805,15 @@ namespace OpenSim.Region.ScriptEngine.XEngine { using (FileStream fs = File.Create(path)) { +// m_log.DebugFormat("[XEngine]: Writing assembly file {0}", path); + fs.Write(filedata, 0, filedata.Length); - fs.Close(); } } catch (IOException ex) { // if there already exists a file at that location, it may be locked. - m_log.ErrorFormat("[XEngine]: File {0} already exists! {1}", path, ex.Message); + m_log.ErrorFormat("[XEngine]: Error whilst writing assembly file {0}, {1}", path, ex.Message); } string textpath = path + ".text"; @@ -1820,16 +1823,16 @@ namespace OpenSim.Region.ScriptEngine.XEngine { using (StreamWriter sw = new StreamWriter(fs)) { +// m_log.DebugFormat("[XEngine]: Writing .text file {0}", textpath); + sw.Write(base64); - sw.Close(); } - fs.Close(); } } catch (IOException ex) { // if there already exists a file at that location, it may be locked. - m_log.ErrorFormat("[XEngine]: File {0} already exists! {1}", textpath, ex.Message); + m_log.ErrorFormat("[XEngine]: Error whilst writing .text file {0}, {1}", textpath, ex.Message); } } } @@ -1843,16 +1846,16 @@ namespace OpenSim.Region.ScriptEngine.XEngine { using (StreamWriter ssw = new StreamWriter(sfs)) { +// m_log.DebugFormat("[XEngine]: Writing state file {0}", statepath); + ssw.Write(stateE.OuterXml); - ssw.Close(); } - sfs.Close(); } } catch (IOException ex) { // if there already exists a file at that location, it may be locked. - m_log.ErrorFormat("[XEngine]: File {0} already exists! {1}", statepath, ex.Message); + m_log.ErrorFormat("[XEngine]: Error whilst writing state file {0}, {1}", statepath, ex.Message); } XmlNodeList mapL = rootE.GetElementsByTagName("LineMap"); @@ -1869,16 +1872,16 @@ namespace OpenSim.Region.ScriptEngine.XEngine { using (StreamWriter msw = new StreamWriter(mfs)) { +// m_log.DebugFormat("[XEngine]: Writing linemap file {0}", mappath); + msw.Write(mapE.InnerText); - msw.Close(); } - mfs.Close(); } } catch (IOException ex) { // if there already exists a file at that location, it may be locked. - m_log.ErrorFormat("[XEngine]: File {0} already exists! {1}", mappath, ex.Message); + m_log.ErrorFormat("[XEngine]: Linemap file {0} already exists! {1}", mappath, ex.Message); } } From ef686ead37f475ad9e16f637fe1efc41cfbbd6f4 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Tue, 19 Jun 2012 02:11:46 +0100 Subject: [PATCH 401/547] Like the assembly and text files, only write the c#-lsl linemap in XEngine.SetXMLState() if the trust binaries flag is set. This doesn't affect other locations where the map is written, such as on script compilation. --- .../Region/ScriptEngine/XEngine/XEngine.cs | 54 +++++++++---------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs index 35c338d25a..aedf2c1f25 100644 --- a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs +++ b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs @@ -1835,6 +1835,33 @@ namespace OpenSim.Region.ScriptEngine.XEngine m_log.ErrorFormat("[XEngine]: Error whilst writing .text file {0}, {1}", textpath, ex.Message); } } + + XmlNodeList mapL = rootE.GetElementsByTagName("LineMap"); + if (mapL.Count > 0) + { + XmlElement mapE = (XmlElement)mapL[0]; + + string mappath = Path.Combine(m_ScriptEnginesPath, World.RegionInfo.RegionID.ToString()); + mappath = Path.Combine(mappath, mapE.GetAttribute("Filename")); + + try + { + using (FileStream mfs = File.Create(mappath)) + { + using (StreamWriter msw = new StreamWriter(mfs)) + { + // m_log.DebugFormat("[XEngine]: Writing linemap file {0}", mappath); + + msw.Write(mapE.InnerText); + } + } + } + catch (IOException ex) + { + // if there already exists a file at that location, it may be locked. + m_log.ErrorFormat("[XEngine]: Linemap file {0} already exists! {1}", mappath, ex.Message); + } + } } string statepath = Path.Combine(m_ScriptEnginesPath, World.RegionInfo.RegionID.ToString()); @@ -1858,33 +1885,6 @@ namespace OpenSim.Region.ScriptEngine.XEngine m_log.ErrorFormat("[XEngine]: Error whilst writing state file {0}, {1}", statepath, ex.Message); } - XmlNodeList mapL = rootE.GetElementsByTagName("LineMap"); - if (mapL.Count > 0) - { - XmlElement mapE = (XmlElement)mapL[0]; - - string mappath = Path.Combine(m_ScriptEnginesPath, World.RegionInfo.RegionID.ToString()); - mappath = Path.Combine(mappath, mapE.GetAttribute("Filename")); - - try - { - using (FileStream mfs = File.Create(mappath)) - { - using (StreamWriter msw = new StreamWriter(mfs)) - { -// m_log.DebugFormat("[XEngine]: Writing linemap file {0}", mappath); - - msw.Write(mapE.InnerText); - } - } - } - catch (IOException ex) - { - // if there already exists a file at that location, it may be locked. - m_log.ErrorFormat("[XEngine]: Linemap file {0} already exists! {1}", mappath, ex.Message); - } - } - return true; } From e23d7ff9c0a2e4f106650359255f1fbe52abf21c Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Wed, 20 Jun 2012 00:05:48 +0100 Subject: [PATCH 402/547] minor: If logging because mesh/sculpt data isn't present for an object, log object UUID rather than local id, since UUID doesn't potentially vary between simulator starts. --- OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index 7640fc04b8..9303ff4801 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs @@ -1625,7 +1625,7 @@ namespace OpenSim.Region.Framework.Scenes else m_log.WarnFormat( "[SCENE OBJECT PART]: Part {0} {1} requested mesh/sculpt data for asset id {2} from asset service but received no data", - Name, LocalId, id); + Name, UUID, id); } /// From 9737e6d52eb7ebb815accca0a1b2f3fee381e680 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Wed, 20 Jun 2012 00:07:03 +0100 Subject: [PATCH 403/547] If RegionReady is active, don't falsely say that logins are enabled in the main scene loop before RegionReady is signalled when initial script compilation finishes. Also raises this logging level to Info from Debug since this information is of high importance. This matches the behaviour of the RegionReady module --- OpenSim/Region/Framework/Scenes/Scene.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 1305d83018..385febf99d 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -1474,11 +1474,11 @@ namespace OpenSim.Region.Framework.Scenes LoginLock = false; EventManager.TriggerLoginsEnabled(RegionInfo.RegionName); } - m_log.DebugFormat("[REGION]: Enabling logins for {0}", RegionInfo.RegionName); // For RegionReady lockouts - if(LoginLock == false) + if (!LoginLock) { + m_log.InfoFormat("[REGION]: Enabling logins for {0}", RegionInfo.RegionName); LoginsDisabled = false; } From 0fa303b1cf244b3066395413e640318b2122c19f Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Wed, 20 Jun 2012 00:10:19 +0100 Subject: [PATCH 404/547] Log how many scripts are candidates for starting and how many are actually started. Adds DebugLevel infrastructure to XEngine though currently commented out and unused. --- .../Framework/Interfaces/IEntityInventory.cs | 19 ++- .../Framework/Scenes/Scene.Inventory.cs | 21 +++- .../Scenes/SceneObjectGroup.Inventory.cs | 18 ++- .../Scenes/SceneObjectPartInventory.cs | 116 +++++++++--------- .../Region/ScriptEngine/XEngine/XEngine.cs | 64 +++++++++- 5 files changed, 169 insertions(+), 69 deletions(-) diff --git a/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs b/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs index 4370fcc96f..1c9bdce832 100644 --- a/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs +++ b/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs @@ -81,7 +81,12 @@ namespace OpenSim.Region.Framework.Interfaces /// /// Start all the scripts contained in this entity's inventory /// - void CreateScriptInstances(int startParam, bool postOnRez, string engine, int stateSource); + /// + /// + /// + /// + /// Number of scripts started. + int CreateScriptInstances(int startParam, bool postOnRez, string engine, int stateSource); ArrayList GetScriptErrors(UUID itemID); void ResumeScripts(); @@ -102,7 +107,11 @@ namespace OpenSim.Region.Framework.Interfaces /// /// /// - void CreateScriptInstance( + /// + /// true if the script instance was valid for starting, false otherwise. This does not guarantee + /// that the script was actually started, just that the script was valid (i.e. its asset data could be found, etc.) + /// + bool CreateScriptInstance( TaskInventoryItem item, int startParam, bool postOnRez, string engine, int stateSource); /// @@ -113,7 +122,11 @@ namespace OpenSim.Region.Framework.Interfaces /// /// /// - void CreateScriptInstance(UUID itemId, int startParam, bool postOnRez, string engine, int stateSource); + /// + /// true if the script instance was valid for starting, false otherwise. This does not guarantee + /// that the script was actually started, just that the script was valid (i.e. its asset data could be found, etc.) + /// + bool CreateScriptInstance(UUID itemId, int startParam, bool postOnRez, string engine, int stateSource); /// /// Stop a script which is in this prim's inventory. diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs index b59fd05578..e4132817ac 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs @@ -60,19 +60,32 @@ namespace OpenSim.Region.Framework.Scenes /// /// Creates all the scripts in the scene which should be started. /// - public void CreateScriptInstances() + /// + /// Number of scripts that were valid for starting. This does not guarantee that all these scripts + /// were actually started, but just that the start could be attempt (e.g. the asset data for the script could be found) + /// + public int CreateScriptInstances() { - m_log.Info("[PRIM INVENTORY]: Creating scripts in scene"); + m_log.InfoFormat("[SCENE]: Initializing script instances in {0}", RegionInfo.RegionName); + + int scriptsValidForStarting = 0; EntityBase[] entities = Entities.GetEntities(); foreach (EntityBase group in entities) { if (group is SceneObjectGroup) { - ((SceneObjectGroup) group).CreateScriptInstances(0, false, DefaultScriptEngine, 0); + scriptsValidForStarting + += ((SceneObjectGroup) group).CreateScriptInstances(0, false, DefaultScriptEngine, 0); ((SceneObjectGroup) group).ResumeScripts(); } } + + m_log.InfoFormat( + "[SCENE]: Initialized {0} script instances in {1}", + scriptsValidForStarting, RegionInfo.RegionName); + + return scriptsValidForStarting; } /// @@ -80,7 +93,7 @@ namespace OpenSim.Region.Framework.Scenes /// public void StartScripts() { - m_log.Info("[PRIM INVENTORY]: Starting scripts in scene"); + m_log.InfoFormat("[SCENE]: Starting scripts in {0}, please wait.", RegionInfo.RegionName); IScriptModule[] engines = RequestModuleInterfaces(); diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs index 10012d016a..2866b546eb 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs @@ -54,16 +54,28 @@ namespace OpenSim.Region.Framework.Scenes /// /// Start the scripts contained in all the prims in this group. /// - public void CreateScriptInstances(int startParam, bool postOnRez, - string engine, int stateSource) + /// + /// + /// + /// + /// + /// Number of scripts that were valid for starting. This does not guarantee that all these scripts + /// were actually started, but just that the start could be attempt (e.g. the asset data for the script could be found) + /// + public int CreateScriptInstances(int startParam, bool postOnRez, string engine, int stateSource) { + int scriptsStarted = 0; + // Don't start scripts if they're turned off in the region! if (!m_scene.RegionInfo.RegionSettings.DisableScripts) { SceneObjectPart[] parts = m_parts.GetArray(); for (int i = 0; i < parts.Length; i++) - parts[i].Inventory.CreateScriptInstances(startParam, postOnRez, engine, stateSource); + scriptsStarted + += parts[i].Inventory.CreateScriptInstances(startParam, postOnRez, engine, stateSource); } + + return scriptsStarted; } /// diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs index 8810903700..c223474f90 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs @@ -217,14 +217,16 @@ namespace OpenSim.Region.Framework.Scenes } } - /// - /// Start all the scripts contained in this prim's inventory - /// - public void CreateScriptInstances(int startParam, bool postOnRez, string engine, int stateSource) + public int CreateScriptInstances(int startParam, bool postOnRez, string engine, int stateSource) { + int scriptsValidForStarting = 0; + List scripts = GetInventoryItems(InventoryType.LSL); foreach (TaskInventoryItem item in scripts) - CreateScriptInstance(item, startParam, postOnRez, engine, stateSource); + if (CreateScriptInstance(item, startParam, postOnRez, engine, stateSource)) + scriptsValidForStarting++; + + return scriptsValidForStarting; } public ArrayList GetScriptErrors(UUID itemID) @@ -264,61 +266,65 @@ namespace OpenSim.Region.Framework.Scenes /// Start a script which is in this prim's inventory. /// /// - /// - public void CreateScriptInstance(TaskInventoryItem item, int startParam, bool postOnRez, string engine, int stateSource) + /// true if the script instance was created, false otherwise + public bool CreateScriptInstance(TaskInventoryItem item, int startParam, bool postOnRez, string engine, int stateSource) { // m_log.DebugFormat("[PRIM INVENTORY]: Starting script {0} {1} in prim {2} {3} in {4}", // item.Name, item.ItemID, m_part.Name, m_part.UUID, m_part.ParentGroup.Scene.RegionInfo.RegionName); if (!m_part.ParentGroup.Scene.Permissions.CanRunScript(item.ItemID, m_part.UUID, item.OwnerID)) - return; + return false; m_part.AddFlag(PrimFlags.Scripted); - if (!m_part.ParentGroup.Scene.RegionInfo.RegionSettings.DisableScripts) + if (m_part.ParentGroup.Scene.RegionInfo.RegionSettings.DisableScripts) + return false; + + if (stateSource == 2 && // Prim crossing + m_part.ParentGroup.Scene.m_trustBinaries) { - if (stateSource == 2 && // Prim crossing - m_part.ParentGroup.Scene.m_trustBinaries) + lock (m_items) { - lock (m_items) - { - m_items[item.ItemID].PermsMask = 0; - m_items[item.ItemID].PermsGranter = UUID.Zero; - } - - m_part.ParentGroup.Scene.EventManager.TriggerRezScript( - m_part.LocalId, item.ItemID, String.Empty, startParam, postOnRez, engine, stateSource); - m_part.ParentGroup.AddActiveScriptCount(1); - m_part.ScheduleFullUpdate(); - return; + m_items[item.ItemID].PermsMask = 0; + m_items[item.ItemID].PermsGranter = UUID.Zero; + } + + m_part.ParentGroup.Scene.EventManager.TriggerRezScript( + m_part.LocalId, item.ItemID, String.Empty, startParam, postOnRez, engine, stateSource); + m_part.ParentGroup.AddActiveScriptCount(1); + m_part.ScheduleFullUpdate(); + return true; + } + + AssetBase asset = m_part.ParentGroup.Scene.AssetService.Get(item.AssetID.ToString()); + if (null == asset) + { + m_log.ErrorFormat( + "[PRIM INVENTORY]: Couldn't start script {0}, {1} at {2} in {3} since asset ID {4} could not be found", + item.Name, item.ItemID, m_part.AbsolutePosition, + m_part.ParentGroup.Scene.RegionInfo.RegionName, item.AssetID); + + return false; + } + else + { + if (m_part.ParentGroup.m_savedScriptState != null) + item.OldItemID = RestoreSavedScriptState(item.LoadedItemID, item.OldItemID, item.ItemID); + + lock (m_items) + { + m_items[item.ItemID].OldItemID = item.OldItemID; + m_items[item.ItemID].PermsMask = 0; + m_items[item.ItemID].PermsGranter = UUID.Zero; } - AssetBase asset = m_part.ParentGroup.Scene.AssetService.Get(item.AssetID.ToString()); - if (null == asset) - { - m_log.ErrorFormat( - "[PRIM INVENTORY]: Couldn't start script {0}, {1} at {2} in {3} since asset ID {4} could not be found", - item.Name, item.ItemID, m_part.AbsolutePosition, - m_part.ParentGroup.Scene.RegionInfo.RegionName, item.AssetID); - } - else - { - if (m_part.ParentGroup.m_savedScriptState != null) - item.OldItemID = RestoreSavedScriptState(item.LoadedItemID, item.OldItemID, item.ItemID); + string script = Utils.BytesToString(asset.Data); + m_part.ParentGroup.Scene.EventManager.TriggerRezScript( + m_part.LocalId, item.ItemID, script, startParam, postOnRez, engine, stateSource); + m_part.ParentGroup.AddActiveScriptCount(1); + m_part.ScheduleFullUpdate(); - lock (m_items) - { - m_items[item.ItemID].OldItemID = item.OldItemID; - m_items[item.ItemID].PermsMask = 0; - m_items[item.ItemID].PermsGranter = UUID.Zero; - } - - string script = Utils.BytesToString(asset.Data); - m_part.ParentGroup.Scene.EventManager.TriggerRezScript( - m_part.LocalId, item.ItemID, script, startParam, postOnRez, engine, stateSource); - m_part.ParentGroup.AddActiveScriptCount(1); - m_part.ScheduleFullUpdate(); - } + return true; } } @@ -384,22 +390,22 @@ namespace OpenSim.Region.Framework.Scenes return stateID; } - /// - /// Start a script which is in this prim's inventory. - /// - /// - /// A - /// - public void CreateScriptInstance(UUID itemId, int startParam, bool postOnRez, string engine, int stateSource) + public bool CreateScriptInstance(UUID itemId, int startParam, bool postOnRez, string engine, int stateSource) { TaskInventoryItem item = GetInventoryItem(itemId); if (item != null) - CreateScriptInstance(item, startParam, postOnRez, engine, stateSource); + { + return CreateScriptInstance(item, startParam, postOnRez, engine, stateSource); + } else + { m_log.ErrorFormat( "[PRIM INVENTORY]: Couldn't start script with ID {0} since it couldn't be found for prim {1}, {2} at {3} in {4}", itemId, m_part.Name, m_part.UUID, m_part.AbsolutePosition, m_part.ParentGroup.Scene.RegionInfo.RegionName); + + return false; + } } /// diff --git a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs index aedf2c1f25..3f623de3b2 100644 --- a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs +++ b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs @@ -62,6 +62,14 @@ namespace OpenSim.Region.ScriptEngine.XEngine { private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + /// + /// Control the printing of certain debug messages. + /// + /// + /// If DebugLevel >= 1, then we log every time that a script is started. + /// +// public int DebugLevel { get; set; } + private SmartThreadPool m_ThreadPool; private int m_MaxScriptQueue; private Scene m_Scene; @@ -216,9 +224,8 @@ namespace OpenSim.Region.ScriptEngine.XEngine AppDomain.CurrentDomain.AssemblyResolve += OnAssemblyResolve; - m_log.InfoFormat("[XEngine] Initializing scripts in region {0}", - scene.RegionInfo.RegionName); m_Scene = scene; + m_log.InfoFormat("[XEngine]: Initializing scripts in region {0}", m_Scene.RegionInfo.RegionName); m_MinThreads = m_ScriptConfig.GetInt("MinThreads", 2); m_MaxThreads = m_ScriptConfig.GetInt("MaxThreads", 100); @@ -321,8 +328,41 @@ namespace OpenSim.Region.ScriptEngine.XEngine "Starts all stopped scripts." + "If a is given then only that script will be started. Otherwise, all suitable scripts are started.", (module, cmdparams) => HandleScriptsAction(cmdparams, HandleStartScript)); + +// MainConsole.Instance.Commands.AddCommand( +// "Debug", false, "debug xengine", "debug xengine []", +// "Turn on detailed xengine debugging.", +// "If level <= 0, then no extra logging is done.\n" +// + "If level >= 1, then we log every time that a script is started.", +// HandleDebugLevelCommand); } + /// + /// Change debug level + /// + /// + /// +// private void HandleDebugLevelCommand(string module, string[] args) +// { +// if (args.Length == 3) +// { +// int newDebug; +// if (int.TryParse(args[2], out newDebug)) +// { +// DebugLevel = newDebug; +// MainConsole.Instance.OutputFormat("Debug level set to {0}", newDebug); +// } +// } +// else if (args.Length == 2) +// { +// MainConsole.Instance.OutputFormat("Current debug level is {0}", DebugLevel); +// } +// else +// { +// MainConsole.Instance.Output("Usage: debug xengine 0..1"); +// } +// } + /// /// Parse the raw item id into a script instance from the command params if it's present. /// @@ -825,8 +865,23 @@ namespace OpenSim.Region.ScriptEngine.XEngine } object[] o; + + int scriptsStarted = 0; + while (m_CompileQueue.Dequeue(out o)) - DoOnRezScript(o); + { + if (DoOnRezScript(o)) + { + scriptsStarted++; + +// if (scriptsStarted % 50 == 0) +// m_log.DebugFormat( +// "[XEngine]: Started {0} scripts in {1}", scriptsStarted, m_Scene.RegionInfo.RegionName); + } + } + + m_log.DebugFormat( + "[XEngine]: Completed starting {0} scripts on {1}", scriptsStarted, m_Scene.RegionInfo.RegionName); // NOTE: Despite having a lockless queue, this lock is required // to make sure there is never no compile thread while there @@ -1066,7 +1121,8 @@ namespace OpenSim.Region.ScriptEngine.XEngine part.ParentGroup.RootPart.Name, item.Name, startParam, postOnRez, stateSource, m_MaxScriptQueue); - + +// if (DebugLevel >= 1) m_log.DebugFormat( "[XEngine] Loaded script {0}.{1}, item UUID {2}, prim UUID {3} @ {4}.{5}", part.ParentGroup.RootPart.Name, item.Name, itemID, part.UUID, From 881e92a7260a5823867b8f93b88c1b706a13cb56 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Wed, 20 Jun 2012 00:19:50 +0100 Subject: [PATCH 405/547] Raise some IO associated Exception logging in XEngine to error level, in line with other similar cases. Remove more unnecessary Close() calls - these are being triggered by the Dispose() called when exiting the using statement for these sdk io objects. --- OpenSim/Region/ScriptEngine/XEngine/XEngine.cs | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs index 3f623de3b2..35b58ee195 100644 --- a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs +++ b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs @@ -1715,14 +1715,15 @@ namespace OpenSim.Region.ScriptEngine.XEngine FileMode.Open, FileAccess.Read)) { tfs.Read(tdata, 0, tdata.Length); - tfs.Close(); } assem = new System.Text.ASCIIEncoding().GetString(tdata); } catch (Exception e) { - m_log.DebugFormat("[XEngine]: Unable to open script textfile {0}, reason: {1}", assemName+".text", e.Message); + m_log.ErrorFormat( + "[XEngine]: Unable to open script textfile {0}{1}, reason: {2}", + assemName, ".text", e.Message); } } } @@ -1739,16 +1740,15 @@ namespace OpenSim.Region.ScriptEngine.XEngine using (FileStream fs = File.Open(assemName, FileMode.Open, FileAccess.Read)) { fs.Read(data, 0, data.Length); - fs.Close(); } assem = System.Convert.ToBase64String(data); } catch (Exception e) { - m_log.DebugFormat("[XEngine]: Unable to open script assembly {0}, reason: {1}", assemName, e.Message); + m_log.ErrorFormat( + "[XEngine]: Unable to open script assembly {0}, reason: {1}", assemName, e.Message); } - } } @@ -1761,9 +1761,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine using (StreamReader msr = new StreamReader(mfs)) { map = msr.ReadToEnd(); - msr.Close(); } - mfs.Close(); } } From 625e5e913a52b26f9af343d6c5bb33c3f8a4ead8 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Wed, 20 Jun 2012 00:24:39 +0100 Subject: [PATCH 406/547] Comment out recently added log message detailing number of scripts started when compile queue empties for now --- OpenSim/Region/ScriptEngine/XEngine/XEngine.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs index 35b58ee195..e961e76b6c 100644 --- a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs +++ b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs @@ -880,8 +880,8 @@ namespace OpenSim.Region.ScriptEngine.XEngine } } - m_log.DebugFormat( - "[XEngine]: Completed starting {0} scripts on {1}", scriptsStarted, m_Scene.RegionInfo.RegionName); +// m_log.DebugFormat( +// "[XEngine]: Completed starting {0} scripts on {1}", scriptsStarted, m_Scene.RegionInfo.RegionName); // NOTE: Despite having a lockless queue, this lock is required // to make sure there is never no compile thread while there From 6b3f9fcde00c9581e5d4f74df2b21ff6bd303f63 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Wed, 20 Jun 2012 00:42:54 +0100 Subject: [PATCH 407/547] Comment out the neighbour and land in connectors from info logging that they are starting up --- OpenSim/Framework/Servers/BaseOpenSimServer.cs | 2 +- .../ServiceConnectorsIn/Land/LandServiceInConnectorModule.cs | 2 +- .../Neighbour/NeighbourServiceInConnectorModule.cs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/OpenSim/Framework/Servers/BaseOpenSimServer.cs b/OpenSim/Framework/Servers/BaseOpenSimServer.cs index 06a8021b5f..88c3ebbe01 100644 --- a/OpenSim/Framework/Servers/BaseOpenSimServer.cs +++ b/OpenSim/Framework/Servers/BaseOpenSimServer.cs @@ -320,7 +320,7 @@ namespace OpenSim.Framework.Servers TimeSpan timeTaken = DateTime.Now - m_startuptime; - m_log.InfoFormat("[STARTUP]: Startup took {0}m {1}s", timeTaken.Minutes, timeTaken.Seconds); +// m_log.InfoFormat("[STARTUP]: Startup took {0}m {1}s", timeTaken.Minutes, timeTaken.Seconds); } /// diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsIn/Land/LandServiceInConnectorModule.cs b/OpenSim/Region/CoreModules/ServiceConnectorsIn/Land/LandServiceInConnectorModule.cs index c8f45f69b9..2f3c350c52 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsIn/Land/LandServiceInConnectorModule.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsIn/Land/LandServiceInConnectorModule.cs @@ -75,7 +75,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsIn.Land if (!m_Enabled) return; - m_log.Info("[LAND IN CONNECTOR]: Starting..."); +// m_log.Info("[LAND IN CONNECTOR]: Starting..."); } public void Close() diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsIn/Neighbour/NeighbourServiceInConnectorModule.cs b/OpenSim/Region/CoreModules/ServiceConnectorsIn/Neighbour/NeighbourServiceInConnectorModule.cs index 3fd89b9b24..b544ab3be5 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsIn/Neighbour/NeighbourServiceInConnectorModule.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsIn/Neighbour/NeighbourServiceInConnectorModule.cs @@ -74,7 +74,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsIn.Neighbour if (!m_Enabled) return; - m_log.Info("[NEIGHBOUR IN CONNECTOR]: Starting..."); +// m_log.Info("[NEIGHBOUR IN CONNECTOR]: Starting..."); } public void Close() From 4cfaa01c0a5e36f4414141a38541067460121a9b Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Wed, 20 Jun 2012 01:06:55 +0100 Subject: [PATCH 408/547] Remove STARTUP COMPLETE message from the startuplogo.txt file and into main logging --- OpenSim/Framework/Servers/BaseOpenSimServer.cs | 4 +++- bin/startuplogo.txt | 1 - 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/OpenSim/Framework/Servers/BaseOpenSimServer.cs b/OpenSim/Framework/Servers/BaseOpenSimServer.cs index 88c3ebbe01..62ea9e3cc5 100644 --- a/OpenSim/Framework/Servers/BaseOpenSimServer.cs +++ b/OpenSim/Framework/Servers/BaseOpenSimServer.cs @@ -320,7 +320,9 @@ namespace OpenSim.Framework.Servers TimeSpan timeTaken = DateTime.Now - m_startuptime; -// m_log.InfoFormat("[STARTUP]: Startup took {0}m {1}s", timeTaken.Minutes, timeTaken.Seconds); + m_log.InfoFormat( + "[STARTUP]: Non-script portion of startup took {0}m {1}s. PLEASE WAIT FOR LOGINS TO BE ENABLED ON REGIONS.", + timeTaken.Minutes, timeTaken.Seconds); } /// diff --git a/bin/startuplogo.txt b/bin/startuplogo.txt index 0d11e7725e..e69de29bb2 100644 --- a/bin/startuplogo.txt +++ b/bin/startuplogo.txt @@ -1 +0,0 @@ -STARTUP COMPLETE From 7b6c0232a54c4c083e16c028fd475121b20b8bff Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Wed, 20 Jun 2012 01:10:18 +0100 Subject: [PATCH 409/547] Change default logging level for XEngine to WARN instead of DEBUG. This is to reduce log spam from script loading, which is especially spammy for avatar movements with scripted attachments. All important messages are at warn or above. If you still want/need to see these messages, set in the section of OpenSim.exe.config. This affects no other package logs, which still output at the root configured level (currently DEBUG by default). --- bin/OpenSim.exe.config | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/bin/OpenSim.exe.config b/bin/OpenSim.exe.config index 4a49fc5631..f1e3709688 100755 --- a/bin/OpenSim.exe.config +++ b/bin/OpenSim.exe.config @@ -31,5 +31,10 @@ + + + + + From 6c312bce7f12efa856ad0e86662c4cffc56a1e75 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Wed, 20 Jun 2012 01:28:55 +0100 Subject: [PATCH 410/547] minor: Lower flotsam asset cache warning about not having a FlotsamCache.ini to debug It's perfectly okay not to have this section. --- OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs b/OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs index dd6026bd93..fab489dbd4 100644 --- a/OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs +++ b/OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs @@ -143,7 +143,7 @@ namespace Flotsam.RegionModules.AssetCache IConfig assetConfig = source.Configs["AssetCache"]; if (assetConfig == null) { - m_log.Warn( + m_log.Debug( "[FLOTSAM ASSET CACHE]: AssetCache section missing from config (not copied config-include/FlotsamCache.ini.example? Using defaults."); } else From 9ec9dafae6d8de93332c510ee7fa0159059dd983 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Wed, 20 Jun 2012 01:33:25 +0100 Subject: [PATCH 411/547] Lower warn logging on not having friends/group module on permissions to debug. It's a valid configuration not to have these modules, but I think it's still worth logging the fact that certain permissions won't work (always return true) --- .../Region/CoreModules/World/Permissions/PermissionsModule.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs b/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs index 4f72463b7c..7a8a57c833 100644 --- a/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs +++ b/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs @@ -348,12 +348,12 @@ namespace OpenSim.Region.CoreModules.World.Permissions m_friendsModule = m_scene.RequestModuleInterface(); if (m_friendsModule == null) - m_log.Warn("[PERMISSIONS]: Friends module not found, friend permissions will not work"); + m_log.Debug("[PERMISSIONS]: Friends module not found, friend permissions will not work"); m_groupsModule = m_scene.RequestModuleInterface(); if (m_groupsModule == null) - m_log.Warn("[PERMISSIONS]: Groups module not found, group permissions will not work"); + m_log.Debug("[PERMISSIONS]: Groups module not found, group permissions will not work"); m_moapModule = m_scene.RequestModuleInterface(); From b23425c7c499d423235a724bc10c2cccc823132c Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Wed, 20 Jun 2012 02:26:58 +0100 Subject: [PATCH 412/547] As with LLSDInventoryItem from commit 01a2b0b, send type values in LLSDInventoryFolder for inventory CAPs as integers rather than strings. Should also resolve some issues with exceptions being thrown in some inventory fetches. --- .../WebFetchInvDescHandler.cs | 8 ++------ OpenSim/Capabilities/LLSDInventoryFolder.cs | 4 ++-- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/OpenSim/Capabilities/Handlers/WebFetchInventoryDescendents/WebFetchInvDescHandler.cs b/OpenSim/Capabilities/Handlers/WebFetchInventoryDescendents/WebFetchInvDescHandler.cs index 849cad2115..515637eac0 100644 --- a/OpenSim/Capabilities/Handlers/WebFetchInventoryDescendents/WebFetchInvDescHandler.cs +++ b/OpenSim/Capabilities/Handlers/WebFetchInventoryDescendents/WebFetchInvDescHandler.cs @@ -393,12 +393,8 @@ namespace OpenSim.Capabilities.Handlers llsdFolder.folder_id = invFolder.ID; llsdFolder.parent_id = invFolder.ParentID; llsdFolder.name = invFolder.Name; - - if (invFolder.Type == (short)AssetType.Unknown || !Enum.IsDefined(typeof(AssetType), (sbyte)invFolder.Type)) - llsdFolder.type = "-1"; - else - llsdFolder.type = Utils.AssetTypeToString((AssetType)invFolder.Type); - llsdFolder.preferred_type = "-1"; + llsdFolder.type = invFolder.Type; + llsdFolder.preferred_type = -1; return llsdFolder; } diff --git a/OpenSim/Capabilities/LLSDInventoryFolder.cs b/OpenSim/Capabilities/LLSDInventoryFolder.cs index 3c216e9c15..d085430e8a 100644 --- a/OpenSim/Capabilities/LLSDInventoryFolder.cs +++ b/OpenSim/Capabilities/LLSDInventoryFolder.cs @@ -35,7 +35,7 @@ namespace OpenSim.Framework.Capabilities public UUID folder_id; public UUID parent_id; public string name; - public string type; - public string preferred_type; + public int type; + public int preferred_type; } } From 714db90832522d8035df744594afd07b227af232 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Wed, 20 Jun 2012 22:46:01 +0100 Subject: [PATCH 413/547] refactor: use SOG.HasPrivateAttachmentPoint in SOP.SendTerseUpdateToClient() instead of attachmentpoint magic numbers. --- OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index 9303ff4801..3d8135826b 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs @@ -4431,8 +4431,9 @@ namespace OpenSim.Region.Framework.Scenes if (ParentGroup.IsDeleted) return; - if (ParentGroup.IsAttachment && ((ParentGroup.RootPart != this) || - ((ParentGroup.AttachedAvatar != remoteClient.AgentId) && (ParentGroup.AttachmentPoint >= 31) && (ParentGroup.AttachmentPoint <= 38)))) + if (ParentGroup.IsAttachment + && (ParentGroup.RootPart != this + || ParentGroup.AttachedAvatar != remoteClient.AgentId && ParentGroup.HasPrivateAttachmentPoint)) return; // Causes this thread to dig into the Client Thread Data. From 68ea096f1b1276e09510633d48313d6e870d0d97 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Wed, 20 Jun 2012 23:25:07 +0100 Subject: [PATCH 414/547] Use HasPrivateAttachmentPoint properties in SOG.DeleteGroupFromScene() instead of magic numbers --- OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs index 619296ed61..18877c1e3b 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs @@ -1205,8 +1205,9 @@ namespace OpenSim.Region.Framework.Scenes part.ClearUpdateSchedule(); if (part == m_rootPart) { - if (!IsAttachment || (AttachedAvatar == avatar.ControllingClient.AgentId) || - (AttachmentPoint < 31) || (AttachmentPoint > 38)) + if (!IsAttachment + || AttachedAvatar == avatar.ControllingClient.AgentId + || !HasPrivateAttachmentPoint) avatar.ControllingClient.SendKillObject(m_regionHandle, new List { part.LocalId }); } } From 5709bed548aa4897d84bb616a2c344e158fe89ff Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 21 Jun 2012 02:09:14 +0100 Subject: [PATCH 415/547] Add state file location to errors logged when there's some issue with retrieving state (e.g. exceeds memory limit) --- .../Region/ScriptEngine/Shared/Instance/ScriptInstance.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs index 329e36131b..b8bcb35161 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs @@ -331,15 +331,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance else { m_log.ErrorFormat( - "[SCRIPT INSTANCE]: Unable to load script state from assembly {0}: Memory limit exceeded", - assembly); + "[SCRIPT INSTANCE]: Unable to load script state file {0} from assembly {1}: Memory limit exceeded", + savedState, assembly); } } catch (Exception e) { m_log.ErrorFormat( - "[SCRIPT INSTANCE]: Unable to load script state from assembly {0}. XML is {1}. Exception {2}{3}", - assembly, xml, e.Message, e.StackTrace); + "[SCRIPT INSTANCE]: Unable to load script state file {0} from assembly {1}. XML is {2}. Exception {3}{4}", + savedState, assembly, xml, e.Message, e.StackTrace); } } // else From afcabf5244415f2d78391cb03269dc9979b5b3d2 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 21 Jun 2012 02:13:03 +0100 Subject: [PATCH 416/547] Retrigger build - last jenkins run was glitched --- OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs index b8bcb35161..8c53b1fb54 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs @@ -354,7 +354,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance public void Init() { - if (!m_startOnInit) return; + if (!m_startOnInit) + return; if (m_startedFromSavedState) { From d24122b706cb3ec4ac9c8d1efc30e511a07e1aa7 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 21 Jun 2012 02:24:44 +0100 Subject: [PATCH 417/547] Add item id, name, prim name and id to log message when state exists but loading fails. Drop logging about memory limit exceeded to warn from error --- .../ScriptEngine/Shared/Instance/ScriptInstance.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs index 8c53b1fb54..5dfe58e2f9 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs @@ -330,16 +330,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance } else { - m_log.ErrorFormat( - "[SCRIPT INSTANCE]: Unable to load script state file {0} from assembly {1}: Memory limit exceeded", - savedState, assembly); + m_log.WarnFormat( + "[SCRIPT INSTANCE]: Unable to load script state file {0} for script {1} {2} in {3} {4} (assembly {5}). Memory limit exceeded", + savedState, ScriptName, ItemID, PrimName, ObjectID, assembly); } } catch (Exception e) { m_log.ErrorFormat( - "[SCRIPT INSTANCE]: Unable to load script state file {0} from assembly {1}. XML is {2}. Exception {3}{4}", - savedState, assembly, xml, e.Message, e.StackTrace); + "[SCRIPT INSTANCE]: Unable to load script state file {0} for script {1} {2} in {3} {4} (assembly {5}). XML is {6}. Exception {7}{8}", + savedState, ScriptName, ItemID, PrimName, ObjectID, assembly, xml, e.Message, e.StackTrace); } } // else From 06617ffd06c743cebffa768bc56a979f473b5b5b Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 22 Jun 2012 00:18:30 +0100 Subject: [PATCH 418/547] Add regression test for updating attachment position --- .../Tests/AttachmentsModuleTests.cs | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs index 5e89eec25d..94c00304de 100644 --- a/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs +++ b/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs @@ -303,6 +303,36 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests Assert.That(presence.Appearance.GetAttachpoint(attItemId), Is.EqualTo((int)AttachmentPoint.Chest)); } + [Test] + public void TestUpdateAttachmentPosition() + { + TestHelpers.InMethod(); + + UUID userId = TestHelpers.ParseTail(0x1); + UUID attItemId = TestHelpers.ParseTail(0x2); + UUID attAssetId = TestHelpers.ParseTail(0x3); + string attName = "att"; + + UserAccountHelpers.CreateUserWithInventory(scene, userId); + InventoryItemBase attItem + = UserInventoryHelpers.CreateInventoryItem( + scene, attName, attItemId, attAssetId, userId, InventoryType.Object); + + AgentCircuitData acd = SceneHelpers.GenerateAgentData(userId); + acd.Appearance = new AvatarAppearance(); + acd.Appearance.SetAttachment((int)AttachmentPoint.Chest, attItem.ID, attItem.AssetID); + ScenePresence sp = SceneHelpers.AddScenePresence(scene, acd); + + SceneObjectGroup attSo = sp.GetAttachments()[0]; + + Vector3 newPosition = new Vector3(1, 2, 4); + + scene.SceneGraph.UpdatePrimGroupPosition(attSo.LocalId, newPosition, sp.ControllingClient); + + Assert.That(attSo.AbsolutePosition, Is.EqualTo(sp.AbsolutePosition)); + Assert.That(attSo.RootPart.AttachedPos, Is.EqualTo(newPosition)); + } + // I'm commenting this test because scene setup NEEDS InventoryService to // be non-null //[Test] From 798846c5b6c05f37c661dde70fb9aaf51306e407 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 22 Jun 2012 00:39:41 +0100 Subject: [PATCH 419/547] refactor AttachmentsModule tests to use a common method for standard attachment item setup --- .../Tests/AttachmentsModuleTests.cs | 139 +++++++++--------- 1 file changed, 69 insertions(+), 70 deletions(-) diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs index 94c00304de..8f4a807182 100644 --- a/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs +++ b/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs @@ -58,6 +58,21 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests private AttachmentsModule m_attMod; private ScenePresence m_presence; + /// + /// Standard user ID + /// + private UUID m_userId = TestHelpers.ParseTail(0x1); + +// /// +// /// Standard attachment item ID +// /// +// private UUID m_attItemId = TestHelpers.ParseTail(0x10); +// +// /// +// /// Standard attachment asset ID +// /// +// private UUID m_attAssetId = TestHelpers.ParseTail(0x11); + [TestFixtureSetUp] public void FixtureInit() { @@ -86,13 +101,27 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests } /// - /// Add the standard presence for a test. + /// Creates an attachment item in the given user's inventory. Does not attach. /// - private void AddPresence() + /// + /// A user with the given ID and an inventory must already exist. + /// + /// + /// The attachment item. + /// + /// + /// + /// + /// + private InventoryItemBase CreateAttachmentItem(UUID userId, string attName, int rawItemId, int rawAssetId) { - UUID userId = TestHelpers.ParseTail(0x1); - UserAccountHelpers.CreateUserWithInventory(scene, userId); - m_presence = SceneHelpers.AddScenePresence(scene, userId); + return UserInventoryHelpers.CreateInventoryItem( + scene, + attName, + TestHelpers.ParseTail(rawItemId), + TestHelpers.ParseTail(rawAssetId), + userId, + InventoryType.Object); } [Test] @@ -101,7 +130,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests TestHelpers.InMethod(); // TestHelpers.EnableLogging(); - AddPresence(); + UserAccountHelpers.CreateUserWithInventory(scene, m_userId); + m_presence = SceneHelpers.AddScenePresence(scene, m_userId); + string attName = "att"; SceneObjectGroup so = SceneHelpers.AddSceneObject(scene, attName, m_presence.UUID).ParentGroup; @@ -140,24 +171,20 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests TestHelpers.InMethod(); // log4net.Config.XmlConfigurator.Configure(); - AddPresence(); + UserAccountHelpers.CreateUserWithInventory(scene, m_userId); + m_presence = SceneHelpers.AddScenePresence(scene, m_userId); - UUID attItemId = TestHelpers.ParseTail(0x2); - UUID attAssetId = TestHelpers.ParseTail(0x3); - string attName = "att"; - - UserInventoryHelpers.CreateInventoryItem( - scene, attName, attItemId, attAssetId, m_presence.UUID, InventoryType.Object); + InventoryItemBase attItem = CreateAttachmentItem(m_userId, "att", 0x10, 0x20); m_attMod.RezSingleAttachmentFromInventory( - m_presence, attItemId, (uint)AttachmentPoint.Chest); + m_presence, attItem.ID, (uint)AttachmentPoint.Chest); // Check scene presence status Assert.That(m_presence.HasAttachments(), Is.True); List attachments = m_presence.GetAttachments(); Assert.That(attachments.Count, Is.EqualTo(1)); SceneObjectGroup attSo = attachments[0]; - Assert.That(attSo.Name, Is.EqualTo(attName)); + Assert.That(attSo.Name, Is.EqualTo(attItem.Name)); Assert.That(attSo.AttachmentPoint, Is.EqualTo((byte)AttachmentPoint.Chest)); Assert.That(attSo.IsAttachment); Assert.That(attSo.UsesPhysics, Is.False); @@ -165,7 +192,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests // Check appearance status Assert.That(m_presence.Appearance.GetAttachments().Count, Is.EqualTo(1)); - Assert.That(m_presence.Appearance.GetAttachpoint(attItemId), Is.EqualTo((int)AttachmentPoint.Chest)); + Assert.That(m_presence.Appearance.GetAttachpoint(attItem.ID), Is.EqualTo((int)AttachmentPoint.Chest)); } [Test] @@ -174,17 +201,14 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests TestHelpers.InMethod(); // log4net.Config.XmlConfigurator.Configure(); - AddPresence(); + UserAccountHelpers.CreateUserWithInventory(scene, m_userId); + m_presence = SceneHelpers.AddScenePresence(scene, m_userId); - UUID attItemId = TestHelpers.ParseTail(0x2); - UUID attAssetId = TestHelpers.ParseTail(0x3); - string attName = "att"; + InventoryItemBase attItem = CreateAttachmentItem(m_userId, "att", 0x10, 0x20); - UserInventoryHelpers.CreateInventoryItem( - scene, attName, attItemId, attAssetId, m_presence.UUID, InventoryType.Object); - - ISceneEntity so = m_attMod.RezSingleAttachmentFromInventory( - m_presence, attItemId, (uint)AttachmentPoint.Chest); + ISceneEntity so + = m_attMod.RezSingleAttachmentFromInventory( + m_presence, attItem.ID, (uint)AttachmentPoint.Chest); m_attMod.DetachSingleAttachmentToGround(m_presence, so.LocalId); // Check scene presence status @@ -196,7 +220,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests Assert.That(m_presence.Appearance.GetAttachments().Count, Is.EqualTo(0)); // Check item status - Assert.That(scene.InventoryService.GetItem(new InventoryItemBase(attItemId)), Is.Null); + Assert.That(scene.InventoryService.GetItem(new InventoryItemBase(attItem.ID)), Is.Null); // Check object in scene Assert.That(scene.GetSceneObjectGroup("att"), Is.Not.Null); @@ -208,18 +232,14 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests TestHelpers.InMethod(); // log4net.Config.XmlConfigurator.Configure(); - AddPresence(); + UserAccountHelpers.CreateUserWithInventory(scene, m_userId); + m_presence = SceneHelpers.AddScenePresence(scene, m_userId); - UUID attItemId = TestHelpers.ParseTail(0x2); - UUID attAssetId = TestHelpers.ParseTail(0x3); - string attName = "att"; - - UserInventoryHelpers.CreateInventoryItem( - scene, attName, attItemId, attAssetId, m_presence.UUID, InventoryType.Object); + InventoryItemBase attItem = CreateAttachmentItem(m_userId, "att", 0x10, 0x20); m_attMod.RezSingleAttachmentFromInventory( - m_presence, attItemId, (uint)AttachmentPoint.Chest); - m_attMod.DetachSingleAttachmentToInv(m_presence, attItemId); + m_presence, attItem.ID, (uint)AttachmentPoint.Chest); + m_attMod.DetachSingleAttachmentToInv(m_presence, attItem.ID); // Check status on scene presence Assert.That(m_presence.HasAttachments(), Is.False); @@ -227,7 +247,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests Assert.That(attachments.Count, Is.EqualTo(0)); // Check item status - Assert.That(m_presence.Appearance.GetAttachpoint(attItemId), Is.EqualTo(0)); + Assert.That(m_presence.Appearance.GetAttachpoint(attItem.ID), Is.EqualTo(0)); } /// @@ -239,17 +259,10 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests TestHelpers.InMethod(); // log4net.Config.XmlConfigurator.Configure(); - UUID userId = TestHelpers.ParseTail(0x1); - UUID attItemId = TestHelpers.ParseTail(0x2); - UUID attAssetId = TestHelpers.ParseTail(0x3); - string attName = "att"; + UserAccountHelpers.CreateUserWithInventory(scene, m_userId); + InventoryItemBase attItem = CreateAttachmentItem(m_userId, "att", 0x10, 0x20); - UserAccountHelpers.CreateUserWithInventory(scene, userId); - InventoryItemBase attItem - = UserInventoryHelpers.CreateInventoryItem( - scene, attName, attItemId, attAssetId, userId, InventoryType.Object); - - AgentCircuitData acd = SceneHelpers.GenerateAgentData(userId); + AgentCircuitData acd = SceneHelpers.GenerateAgentData(m_userId); acd.Appearance = new AvatarAppearance(); acd.Appearance.SetAttachment((int)AttachmentPoint.Chest, attItem.ID, attItem.AssetID); ScenePresence presence = SceneHelpers.AddScenePresence(scene, acd); @@ -268,17 +281,10 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests TestHelpers.InMethod(); // log4net.Config.XmlConfigurator.Configure(); - UUID userId = TestHelpers.ParseTail(0x1); - UUID attItemId = TestHelpers.ParseTail(0x2); - UUID attAssetId = TestHelpers.ParseTail(0x3); - string attName = "att"; + UserAccountHelpers.CreateUserWithInventory(scene, m_userId); + InventoryItemBase attItem = CreateAttachmentItem(m_userId, "att", 0x10, 0x20); - UserAccountHelpers.CreateUserWithInventory(scene, userId); - InventoryItemBase attItem - = UserInventoryHelpers.CreateInventoryItem( - scene, attName, attItemId, attAssetId, userId, InventoryType.Object); - - AgentCircuitData acd = SceneHelpers.GenerateAgentData(userId); + AgentCircuitData acd = SceneHelpers.GenerateAgentData(m_userId); acd.Appearance = new AvatarAppearance(); acd.Appearance.SetAttachment((int)AttachmentPoint.Chest, attItem.ID, attItem.AssetID); ScenePresence presence = SceneHelpers.AddScenePresence(scene, acd); @@ -288,7 +294,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests Assert.That(attachments.Count, Is.EqualTo(1)); SceneObjectGroup attSo = attachments[0]; - Assert.That(attSo.Name, Is.EqualTo(attName)); + Assert.That(attSo.Name, Is.EqualTo(attItem.Name)); Assert.That(attSo.AttachmentPoint, Is.EqualTo((byte)AttachmentPoint.Chest)); Assert.That(attSo.IsAttachment); Assert.That(attSo.UsesPhysics, Is.False); @@ -298,9 +304,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests List retreivedAttachments = presence.Appearance.GetAttachments(); Assert.That(retreivedAttachments.Count, Is.EqualTo(1)); Assert.That(retreivedAttachments[0].AttachPoint, Is.EqualTo((int)AttachmentPoint.Chest)); - Assert.That(retreivedAttachments[0].ItemID, Is.EqualTo(attItemId)); - Assert.That(retreivedAttachments[0].AssetID, Is.EqualTo(attAssetId)); - Assert.That(presence.Appearance.GetAttachpoint(attItemId), Is.EqualTo((int)AttachmentPoint.Chest)); + Assert.That(retreivedAttachments[0].ItemID, Is.EqualTo(attItem.ID)); + Assert.That(retreivedAttachments[0].AssetID, Is.EqualTo(attItem.AssetID)); + Assert.That(presence.Appearance.GetAttachpoint(attItem.ID), Is.EqualTo((int)AttachmentPoint.Chest)); } [Test] @@ -308,17 +314,10 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests { TestHelpers.InMethod(); - UUID userId = TestHelpers.ParseTail(0x1); - UUID attItemId = TestHelpers.ParseTail(0x2); - UUID attAssetId = TestHelpers.ParseTail(0x3); - string attName = "att"; + UserAccountHelpers.CreateUserWithInventory(scene, m_userId); + InventoryItemBase attItem = CreateAttachmentItem(m_userId, "att", 0x10, 0x20); - UserAccountHelpers.CreateUserWithInventory(scene, userId); - InventoryItemBase attItem - = UserInventoryHelpers.CreateInventoryItem( - scene, attName, attItemId, attAssetId, userId, InventoryType.Object); - - AgentCircuitData acd = SceneHelpers.GenerateAgentData(userId); + AgentCircuitData acd = SceneHelpers.GenerateAgentData(m_userId); acd.Appearance = new AvatarAppearance(); acd.Appearance.SetAttachment((int)AttachmentPoint.Chest, attItem.ID, attItem.AssetID); ScenePresence sp = SceneHelpers.AddScenePresence(scene, acd); From fda39c11bf8e440414f44e8233aa67818da51036 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 22 Jun 2012 01:33:27 +0100 Subject: [PATCH 420/547] Fix bug where attachments would not retain position if just rotated and not moved. This was because we were not setting AttachedPos in SOG.UpdateGroupPositionPR, unlike UpdateGroupPosition --- OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs index 18877c1e3b..1e900a0746 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs @@ -2911,6 +2911,11 @@ namespace OpenSim.Region.Framework.Scenes m_scene.PhysicsScene.AddPhysicsActorTaint(actor); } + if (IsAttachment) + { + m_rootPart.AttachedPos = pos; + } + AbsolutePosition = pos; HasGroupChanged = true; From 4cf49369b51c21a0eadd719eb46f53d207e1e5f7 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 22 Jun 2012 01:39:39 +0100 Subject: [PATCH 421/547] Stop flicking IsAttachment false and then true in AttachmentsModule.UpdateAttachmentPosition() in order to avoid a hud update race condition. Previously, setting IsAttachment to false then true was necessary to serialize the updated attachment object information. However, UpdateAttachmentPosition no longer does this update. Whilst IsAttachment is set to false there is a race condition where the update thread can wrongly send hud object updates to clients that do not own the hud, resulting in screen artifacts. --- .../Avatar/Attachments/AttachmentsModule.cs | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs index b74c0ba646..a2b95ebb0b 100644 --- a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs @@ -408,17 +408,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments if (!Enabled) return; - // First we save the - // attachment point information, then we update the relative - // positioning. Then we have to mark the object as NOT an - // attachment. This is necessary in order to correctly save - // and retrieve GroupPosition information for the attachment. - // Finally, we restore the object's attachment status. - uint attachmentPoint = sog.AttachmentPoint; sog.UpdateGroupPosition(pos); - sog.IsAttachment = false; - sog.AbsolutePosition = sog.RootPart.AttachedPos; - sog.AttachmentPoint = attachmentPoint; sog.HasGroupChanged = true; } From f907182ab28cd761bebd398dab38f9a997ecd19d Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 22 Jun 2012 01:57:14 +0100 Subject: [PATCH 422/547] Eliminate unnecessary extra call to TriggerEmptyScriptCompileQueue in XEngine.DoOnRezScriptQueue() The later invocation of this function will happen on an empty compile queue. --- OpenSim/Region/ScriptEngine/XEngine/XEngine.cs | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs index e961e76b6c..26df758357 100644 --- a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs +++ b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs @@ -855,13 +855,6 @@ namespace OpenSim.Region.ScriptEngine.XEngine { m_InitialStartup = false; System.Threading.Thread.Sleep(15000); - - if (m_CompileQueue.Count == 0) - { - // No scripts on region, so won't get triggered later - // by the queue becoming empty so we trigger it here - m_Scene.EventManager.TriggerEmptyScriptCompileQueue(0, String.Empty); - } } object[] o; @@ -889,11 +882,11 @@ namespace OpenSim.Region.ScriptEngine.XEngine // due to a race condition // lock (m_CompileQueue) - { m_CurrentCompile = null; - } + m_Scene.EventManager.TriggerEmptyScriptCompileQueue(m_ScriptFailCount, m_ScriptErrorMessage); + m_ScriptFailCount = 0; return null; From 9f3feeff8d3a00b965b2151477df5b0b2de3ff1d Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 22 Jun 2012 02:10:27 +0100 Subject: [PATCH 423/547] If starting scripts on initial sim start, provide INFO level log feedback each time 50 scripts have been started. This is to provide an indication of what's happening now that the default isn't to report every single script start. Changes XEngine logging level in OpenSim.exe.config from WARN to INFO. --- OpenSim/Framework/Servers/BaseOpenSimServer.cs | 2 +- OpenSim/Region/ScriptEngine/XEngine/XEngine.cs | 16 ++++++++++------ bin/OpenSim.exe.config | 2 +- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/OpenSim/Framework/Servers/BaseOpenSimServer.cs b/OpenSim/Framework/Servers/BaseOpenSimServer.cs index 62ea9e3cc5..9459f76a5e 100644 --- a/OpenSim/Framework/Servers/BaseOpenSimServer.cs +++ b/OpenSim/Framework/Servers/BaseOpenSimServer.cs @@ -321,7 +321,7 @@ namespace OpenSim.Framework.Servers TimeSpan timeTaken = DateTime.Now - m_startuptime; m_log.InfoFormat( - "[STARTUP]: Non-script portion of startup took {0}m {1}s. PLEASE WAIT FOR LOGINS TO BE ENABLED ON REGIONS.", + "[STARTUP]: Non-script portion of startup took {0}m {1}s. PLEASE WAIT FOR LOGINS TO BE ENABLED ON REGIONS ONCE SCRIPTS HAVE STARTED.", timeTaken.Minutes, timeTaken.Seconds); } diff --git a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs index 26df758357..40f48e376d 100644 --- a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs +++ b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs @@ -853,7 +853,8 @@ namespace OpenSim.Region.ScriptEngine.XEngine { if (m_InitialStartup) { - m_InitialStartup = false; + // This delay exists to stop mono problems where script compilation and startup would stop the sim + // working properly for the session. System.Threading.Thread.Sleep(15000); } @@ -867,14 +868,16 @@ namespace OpenSim.Region.ScriptEngine.XEngine { scriptsStarted++; -// if (scriptsStarted % 50 == 0) -// m_log.DebugFormat( -// "[XEngine]: Started {0} scripts in {1}", scriptsStarted, m_Scene.RegionInfo.RegionName); + if (m_InitialStartup) + if (scriptsStarted % 50 == 0) + m_log.InfoFormat( + "[XEngine]: Started {0} scripts in {1}", scriptsStarted, m_Scene.RegionInfo.RegionName); } } -// m_log.DebugFormat( -// "[XEngine]: Completed starting {0} scripts on {1}", scriptsStarted, m_Scene.RegionInfo.RegionName); + if (m_InitialStartup) + m_log.InfoFormat( + "[XEngine]: Completed starting {0} scripts on {1}", scriptsStarted, m_Scene.RegionInfo.RegionName); // NOTE: Despite having a lockless queue, this lock is required // to make sure there is never no compile thread while there @@ -888,6 +891,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine m_ScriptErrorMessage); m_ScriptFailCount = 0; + m_InitialStartup = false; return null; } diff --git a/bin/OpenSim.exe.config b/bin/OpenSim.exe.config index f1e3709688..e3107abc87 100755 --- a/bin/OpenSim.exe.config +++ b/bin/OpenSim.exe.config @@ -33,7 +33,7 @@ - + From 80a41e670dd9bbd2771fbcf250362cefa2797306 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 22 Jun 2012 02:23:25 +0100 Subject: [PATCH 424/547] Avoid race condition between m_PrimObjects iteration in XEngine.PostObjectEvent and places where the list is modified by extending the m_PrimObjects lock. --- .../Region/ScriptEngine/XEngine/XEngine.cs | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs index 40f48e376d..25b27b90c5 100644 --- a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs +++ b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs @@ -1363,22 +1363,22 @@ namespace OpenSim.Region.ScriptEngine.XEngine return false; uuids = m_PrimObjects[localID]; - } - foreach (UUID itemID in uuids) - { - IScriptInstance instance = null; - try + foreach (UUID itemID in uuids) { - if (m_Scripts.ContainsKey(itemID)) - instance = m_Scripts[itemID]; - } - catch { /* ignore race conditions */ } - - if (instance != null) - { - instance.PostEvent(p); - result = true; + IScriptInstance instance = null; + try + { + if (m_Scripts.ContainsKey(itemID)) + instance = m_Scripts[itemID]; + } + catch { /* ignore race conditions */ } + + if (instance != null) + { + instance.PostEvent(p); + result = true; + } } } From dca04c7b61abb7b7ea70299a192425ce3bd05937 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 22 Jun 2012 23:16:18 +0100 Subject: [PATCH 425/547] Avoid a race condition where an incoming request to a script external URL can trigger an exception is the URL was being removed at the same time. This involves three steps 1) Return gracefully in UrlModule.HttpRequestHandler() instead of throwing an exception when the url cannot be found in its index 2) Return true instead of false in HasEvents() if no matching request is found in the map. This call will only happen in the first place for raced requests. 3) Return a 404 in GetEvents() if the request is not in the index, rather than a blank 200 OK. Many thanks to Tom Haines in http://opensimulator.org/mantis/view.php?id=6051 for doing some of the work on this. --- .../HttpServer/PollServiceEventArgs.cs | 9 +- .../HttpServer/PollServiceHttpRequest.cs | 7 +- .../Scripting/LSLHttp/UrlModule.cs | 114 ++++++++++++------ 3 files changed, 87 insertions(+), 43 deletions(-) diff --git a/OpenSim/Framework/Servers/HttpServer/PollServiceEventArgs.cs b/OpenSim/Framework/Servers/HttpServer/PollServiceEventArgs.cs index 9d512c6249..3089351a69 100644 --- a/OpenSim/Framework/Servers/HttpServer/PollServiceEventArgs.cs +++ b/OpenSim/Framework/Servers/HttpServer/PollServiceEventArgs.cs @@ -28,6 +28,7 @@ using System; using System.Collections; using OpenMetaverse; + namespace OpenSim.Framework.Servers.HttpServer { public delegate void RequestMethod(UUID requestID, Hashtable request); @@ -44,7 +45,11 @@ namespace OpenSim.Framework.Servers.HttpServer public NoEventsMethod NoEvents; public RequestMethod Request; public UUID Id; - public PollServiceEventArgs(RequestMethod pRequest, HasEventsMethod pHasEvents, GetEventsMethod pGetEvents, NoEventsMethod pNoEvents,UUID pId) + + public PollServiceEventArgs( + RequestMethod pRequest, + HasEventsMethod pHasEvents, GetEventsMethod pGetEvents, NoEventsMethod pNoEvents, + UUID pId) { Request = pRequest; HasEvents = pHasEvents; @@ -53,4 +58,4 @@ namespace OpenSim.Framework.Servers.HttpServer Id = pId; } } -} +} \ No newline at end of file diff --git a/OpenSim/Framework/Servers/HttpServer/PollServiceHttpRequest.cs b/OpenSim/Framework/Servers/HttpServer/PollServiceHttpRequest.cs index 553a7eb123..723530ae15 100644 --- a/OpenSim/Framework/Servers/HttpServer/PollServiceHttpRequest.cs +++ b/OpenSim/Framework/Servers/HttpServer/PollServiceHttpRequest.cs @@ -31,7 +31,6 @@ using OpenMetaverse; namespace OpenSim.Framework.Servers.HttpServer { - public class PollServiceHttpRequest { public readonly PollServiceEventArgs PollServiceArgs; @@ -39,7 +38,9 @@ namespace OpenSim.Framework.Servers.HttpServer public readonly IHttpRequest Request; public readonly int RequestTime; public readonly UUID RequestID; - public PollServiceHttpRequest(PollServiceEventArgs pPollServiceArgs, IHttpClientContext pHttpContext, IHttpRequest pRequest) + + public PollServiceHttpRequest( + PollServiceEventArgs pPollServiceArgs, IHttpClientContext pHttpContext, IHttpRequest pRequest) { PollServiceArgs = pPollServiceArgs; HttpContext = pHttpContext; @@ -48,4 +49,4 @@ namespace OpenSim.Framework.Servers.HttpServer RequestID = UUID.Random(); } } -} +} \ No newline at end of file diff --git a/OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs b/OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs index 61afc762e2..5c05500718 100644 --- a/OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs +++ b/OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs @@ -64,17 +64,25 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp public string uri; } + /// + /// This module provides external URLs for in-world scripts. + /// public class UrlModule : ISharedRegionModule, IUrlModule { private static readonly ILog m_log = LogManager.GetLogger( MethodBase.GetCurrentMethod().DeclaringType); - private Dictionary m_RequestMap = - new Dictionary(); + /// + /// Indexs the URL request metadata (which script requested it, outstanding requests, etc.) by the request ID + /// randomly generated when a request is received for this URL. + /// + private Dictionary m_RequestMap = new Dictionary(); - private Dictionary m_UrlMap = - new Dictionary(); + /// + /// Indexs the URL request metadata (which script requested it, outstanding requests, etc.) by the full URL + /// + private Dictionary m_UrlMap = new Dictionary(); /// /// Maximum number of external urls that can be set up by this module. @@ -224,7 +232,6 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp urlData.urlcode = urlcode; urlData.requests = new Dictionary(); - m_UrlMap[url] = urlData; string uri = "/lslhttps/" + urlcode.ToString() + "/"; @@ -286,7 +293,7 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp { if (m_RequestMap.ContainsKey(requestId)) { - UrlData urlData=m_RequestMap[requestId]; + UrlData urlData = m_RequestMap[requestId]; string value; if (urlData.requests[requestId].headers.TryGetValue(header,out value)) return value; @@ -295,6 +302,7 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp { m_log.Warn("[HttpRequestHandler] There was no http-in request with id " + requestId); } + return String.Empty; } @@ -339,6 +347,7 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp { RemoveUrl(url.Value); removeURLs.Add(url.Key); + foreach (UUID req in url.Value.requests.Keys) m_RequestMap.Remove(req); } @@ -349,20 +358,31 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp } } - private void RemoveUrl(UrlData data) { - m_HttpServer.RemoveHTTPHandler("", "/lslhttp/"+data.urlcode.ToString()+"/"); + m_HttpServer.RemoveHTTPHandler("", "/lslhttp/" + data.urlcode.ToString() + "/"); } private Hashtable NoEvents(UUID requestID, UUID sessionID) { Hashtable response = new Hashtable(); UrlData url; + lock (m_RequestMap) { + // We need to return a 404 here in case the request URL was removed at exactly the same time that a + // request was made. In this case, the request thread can outrace llRemoveURL() and still be polling + // for the request ID. if (!m_RequestMap.ContainsKey(requestID)) + { + response["int_response_code"] = 404; + response["str_response_string"] = ""; + response["keepalive"] = false; + response["reusecontext"] = false; + return response; + } + url = m_RequestMap[requestID]; } @@ -384,53 +404,57 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp return response; } - return response; } private bool HasEvents(UUID requestID, UUID sessionID) { - UrlData url=null; + UrlData url = null; lock (m_RequestMap) { + // We return true here because an external URL request that happened at the same time as an llRemoveURL() + // can still make it through to HttpRequestHandler(). That will return without setting up a request + // when it detects that the URL has been removed. The poller, however, will continue to ask for + // events for that request, so here we will signal that there are events and in GetEvents we will + // return a 404. if (!m_RequestMap.ContainsKey(requestID)) { - return false; + return true; } + url = m_RequestMap[requestID]; if (!url.requests.ContainsKey(requestID)) { - return false; + return true; } } - if (System.Environment.TickCount-url.requests[requestID].startTime>25000) + // Trigger return of timeout response. + if (System.Environment.TickCount - url.requests[requestID].startTime > 25000) { return true; } - if (url.requests[requestID].requestDone) - return true; - else - return false; - + return url.requests[requestID].requestDone; } + private Hashtable GetEvents(UUID requestID, UUID sessionID, string request) { - UrlData url = null; + UrlData url = null; RequestData requestData = null; lock (m_RequestMap) { if (!m_RequestMap.ContainsKey(requestID)) - return NoEvents(requestID,sessionID); + return NoEvents(requestID, sessionID); + url = m_RequestMap[requestID]; requestData = url.requests[requestID]; } if (!requestData.requestDone) - return NoEvents(requestID,sessionID); + return NoEvents(requestID, sessionID); Hashtable response = new Hashtable(); @@ -443,6 +467,7 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp response["reusecontext"] = false; return response; } + //put response response["int_response_code"] = requestData.responseCode; response["str_response_string"] = requestData.responseBody; @@ -459,6 +484,7 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp return response; } + public void HttpRequestHandler(UUID requestID, Hashtable request) { lock (request) @@ -483,11 +509,22 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp pathInfo = uri.Substring(pos3); - UrlData url = null; - if (!is_ssl) - url = m_UrlMap["http://" + m_ExternalHostNameForLSL + ":" + m_HttpServer.Port.ToString() + uri_tmp]; - else - url = m_UrlMap["https://" + m_ExternalHostNameForLSL + ":" + m_HttpsServer.Port.ToString() + uri_tmp]; + UrlData urlData = null; + + lock (m_UrlMap) + { + string url; + + if (is_ssl) + url = "https://" + m_ExternalHostNameForLSL + ":" + m_HttpsServer.Port.ToString() + uri_tmp; + else + url = "http://" + m_ExternalHostNameForLSL + ":" + m_HttpServer.Port.ToString() + uri_tmp; + + // Avoid a race - the request URL may have been released via llRequestUrl() whilst this + // request was being processed. + if (!m_UrlMap.TryGetValue(url, out urlData)) + return; + } //for llGetHttpHeader support we need to store original URI here //to make x-path-info / x-query-string / x-script-url / x-remote-ip headers @@ -520,11 +557,10 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp queryString = queryString + key + "=" + val + "&"; } } + if (queryString.Length > 1) queryString = queryString.Substring(0, queryString.Length - 1); - } - } //if this machine is behind DNAT/port forwarding, currently this is being @@ -532,26 +568,28 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp requestData.headers["x-remote-ip"] = requestData.headers["remote_addr"]; requestData.headers["x-path-info"] = pathInfo; requestData.headers["x-query-string"] = queryString; - requestData.headers["x-script-url"] = url.url; + requestData.headers["x-script-url"] = urlData.url; //requestData.ev = new ManualResetEvent(false); - lock (url.requests) + lock (urlData.requests) { - url.requests.Add(requestID, requestData); - } - lock (m_RequestMap) - { - //add to request map - m_RequestMap.Add(requestID, url); + urlData.requests.Add(requestID, requestData); } - url.engine.PostScriptEvent(url.itemID, "http_request", new Object[] { requestID.ToString(), request["http-method"].ToString(), request["body"].ToString() }); + lock (m_RequestMap) + { + m_RequestMap.Add(requestID, urlData); + } + + urlData.engine.PostScriptEvent( + urlData.itemID, + "http_request", + new Object[] { requestID.ToString(), request["http-method"].ToString(), request["body"].ToString() }); //send initial response? // Hashtable response = new Hashtable(); return; - } catch (Exception we) { From 78143769bfdf316bbec63e6232bf9be993eb078a Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 22 Jun 2012 23:49:52 +0100 Subject: [PATCH 426/547] Resolve various race conditions between accessing and removing external script URLs by more consistently locking on m_UrlMap --- .../Scripting/LSLHttp/UrlModule.cs | 280 +++++++++--------- 1 file changed, 148 insertions(+), 132 deletions(-) diff --git a/OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs b/OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs index 5c05500718..05d54f03a2 100644 --- a/OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs +++ b/OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs @@ -41,13 +41,39 @@ using OpenSim.Region.Framework.Scenes; namespace OpenSim.Region.CoreModules.Scripting.LSLHttp { + /// + /// Data describing an external URL set up by a script. + /// public class UrlData { + /// + /// Scene object part hosting the script + /// public UUID hostID; + + /// + /// The item ID of the script that requested the URL. + /// public UUID itemID; + + /// + /// The script engine that runs the script. + /// public IScriptModule engine; + + /// + /// The generated URL. + /// public string url; + + /// + /// The random UUID component of the generated URL. + /// public UUID urlcode; + + /// + /// The external requests currently being processed or awaiting retrieval for this URL. + /// public Dictionary requests; } @@ -77,6 +103,10 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp /// Indexs the URL request metadata (which script requested it, outstanding requests, etc.) by the request ID /// randomly generated when a request is received for this URL. /// + /// + /// Manipulation or retrieval from this dictionary must be locked on m_UrlMap to preserve consistency with + /// m_UrlMap + /// private Dictionary m_RequestMap = new Dictionary(); /// @@ -113,10 +143,9 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp { m_ExternalHostNameForLSL = config.Configs["Network"].GetString("ExternalHostNameForLSL", System.Environment.MachineName); bool ssl_enabled = config.Configs["Network"].GetBoolean("https_listener",false); + if (ssl_enabled) - { https_port = (uint) config.Configs["Network"].GetInt("https_port",0); - } IConfig llFunctionsConfig = config.Configs["LL-Functions"]; @@ -275,32 +304,38 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp public void HttpResponse(UUID request, int status, string body) { - if (m_RequestMap.ContainsKey(request)) + lock (m_UrlMap) { - UrlData urlData = m_RequestMap[request]; - urlData.requests[request].responseCode = status; - urlData.requests[request].responseBody = body; - //urlData.requests[request].ev.Set(); - urlData.requests[request].requestDone =true; - } - else - { - m_log.Info("[HttpRequestHandler] There is no http-in request with id " + request.ToString()); + if (m_RequestMap.ContainsKey(request)) + { + UrlData urlData = m_RequestMap[request]; + urlData.requests[request].responseCode = status; + urlData.requests[request].responseBody = body; + //urlData.requests[request].ev.Set(); + urlData.requests[request].requestDone =true; + } + else + { + m_log.Info("[HttpRequestHandler] There is no http-in request with id " + request.ToString()); + } } } public string GetHttpHeader(UUID requestId, string header) { - if (m_RequestMap.ContainsKey(requestId)) + lock (m_UrlMap) { - UrlData urlData = m_RequestMap[requestId]; - string value; - if (urlData.requests[requestId].headers.TryGetValue(header,out value)) - return value; - } - else - { - m_log.Warn("[HttpRequestHandler] There was no http-in request with id " + requestId); + if (m_RequestMap.ContainsKey(requestId)) + { + UrlData urlData = m_RequestMap[requestId]; + string value; + if (urlData.requests[requestId].headers.TryGetValue(header, out value)) + return value; + } + else + { + m_log.Warn("[HttpRequestHandler] There was no http-in request with id " + requestId); + } } return String.Empty; @@ -308,7 +343,8 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp public int GetFreeUrls() { - return m_TotalUrls - m_UrlMap.Count; + lock (m_UrlMap) + return m_TotalUrls - m_UrlMap.Count; } public void ScriptRemoved(UUID itemID) @@ -366,9 +402,9 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp private Hashtable NoEvents(UUID requestID, UUID sessionID) { Hashtable response = new Hashtable(); - UrlData url; + UrlData urlData; - lock (m_RequestMap) + lock (m_UrlMap) { // We need to return a 404 here in case the request URL was removed at exactly the same time that a // request was made. In this case, the request thread can outrace llRemoveURL() and still be polling @@ -383,25 +419,22 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp return response; } - url = m_RequestMap[requestID]; - } + urlData = m_RequestMap[requestID]; - if (System.Environment.TickCount - url.requests[requestID].startTime > 25000) - { - response["int_response_code"] = 500; - response["str_response_string"] = "Script timeout"; - response["content_type"] = "text/plain"; - response["keepalive"] = false; - response["reusecontext"] = false; - - //remove from map - lock (url) + if (System.Environment.TickCount - urlData.requests[requestID].startTime > 25000) { - url.requests.Remove(requestID); + response["int_response_code"] = 500; + response["str_response_string"] = "Script timeout"; + response["content_type"] = "text/plain"; + response["keepalive"] = false; + response["reusecontext"] = false; + + //remove from map + urlData.requests.Remove(requestID); m_RequestMap.Remove(requestID); - } - return response; + return response; + } } return response; @@ -409,9 +442,7 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp private bool HasEvents(UUID requestID, UUID sessionID) { - UrlData url = null; - - lock (m_RequestMap) + lock (m_UrlMap) { // We return true here because an external URL request that happened at the same time as an llRemoveURL() // can still make it through to HttpRequestHandler(). That will return without setting up a request @@ -423,61 +454,61 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp return true; } - url = m_RequestMap[requestID]; - if (!url.requests.ContainsKey(requestID)) + UrlData urlData = m_RequestMap[requestID]; + + if (!urlData.requests.ContainsKey(requestID)) { return true; } - } - // Trigger return of timeout response. - if (System.Environment.TickCount - url.requests[requestID].startTime > 25000) - { - return true; - } + // Trigger return of timeout response. + if (System.Environment.TickCount - urlData.requests[requestID].startTime > 25000) + { + return true; + } - return url.requests[requestID].requestDone; + return urlData.requests[requestID].requestDone; + } } private Hashtable GetEvents(UUID requestID, UUID sessionID, string request) { - UrlData url = null; - RequestData requestData = null; + Hashtable response; - lock (m_RequestMap) + lock (m_UrlMap) { + UrlData url = null; + RequestData requestData = null; + if (!m_RequestMap.ContainsKey(requestID)) return NoEvents(requestID, sessionID); url = m_RequestMap[requestID]; requestData = url.requests[requestID]; - } - if (!requestData.requestDone) - return NoEvents(requestID, sessionID); - - Hashtable response = new Hashtable(); + if (!requestData.requestDone) + return NoEvents(requestID, sessionID); - if (System.Environment.TickCount - requestData.startTime > 25000) - { - response["int_response_code"] = 500; - response["str_response_string"] = "Script timeout"; + response = new Hashtable(); + + if (System.Environment.TickCount - requestData.startTime > 25000) + { + response["int_response_code"] = 500; + response["str_response_string"] = "Script timeout"; + response["content_type"] = "text/plain"; + response["keepalive"] = false; + response["reusecontext"] = false; + return response; + } + + //put response + response["int_response_code"] = requestData.responseCode; + response["str_response_string"] = requestData.responseBody; response["content_type"] = "text/plain"; response["keepalive"] = false; response["reusecontext"] = false; - return response; - } - //put response - response["int_response_code"] = requestData.responseCode; - response["str_response_string"] = requestData.responseBody; - response["content_type"] = "text/plain"; - response["keepalive"] = false; - response["reusecontext"] = false; - - //remove from map - lock (url) - { + //remove from map url.requests.Remove(requestID); m_RequestMap.Remove(requestID); } @@ -487,44 +518,41 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp public void HttpRequestHandler(UUID requestID, Hashtable request) { - lock (request) - { - string uri = request["uri"].ToString(); - bool is_ssl = uri.Contains("lslhttps"); + string uri = request["uri"].ToString(); + bool is_ssl = uri.Contains("lslhttps"); - try - { - Hashtable headers = (Hashtable)request["headers"]; + try + { + Hashtable headers = (Hashtable)request["headers"]; // string uri_full = "http://" + m_ExternalHostNameForLSL + ":" + m_HttpServer.Port.ToString() + uri;// "/lslhttp/" + urlcode.ToString() + "/"; - int pos1 = uri.IndexOf("/");// /lslhttp - int pos2 = uri.IndexOf("/", pos1 + 1);// /lslhttp/ - int pos3 = uri.IndexOf("/", pos2 + 1);// /lslhttp// - string uri_tmp = uri.Substring(0, pos3 + 1); - //HTTP server code doesn't provide us with QueryStrings - string pathInfo; - string queryString; - queryString = ""; + int pos1 = uri.IndexOf("/");// /lslhttp + int pos2 = uri.IndexOf("/", pos1 + 1);// /lslhttp/ + int pos3 = uri.IndexOf("/", pos2 + 1);// /lslhttp// + string uri_tmp = uri.Substring(0, pos3 + 1); + //HTTP server code doesn't provide us with QueryStrings + string pathInfo; + string queryString; + queryString = ""; - pathInfo = uri.Substring(pos3); + pathInfo = uri.Substring(pos3); - UrlData urlData = null; + UrlData urlData = null; - lock (m_UrlMap) - { - string url; + lock (m_UrlMap) + { + string url; - if (is_ssl) - url = "https://" + m_ExternalHostNameForLSL + ":" + m_HttpsServer.Port.ToString() + uri_tmp; - else - url = "http://" + m_ExternalHostNameForLSL + ":" + m_HttpServer.Port.ToString() + uri_tmp; + if (is_ssl) + url = "https://" + m_ExternalHostNameForLSL + ":" + m_HttpsServer.Port.ToString() + uri_tmp; + else + url = "http://" + m_ExternalHostNameForLSL + ":" + m_HttpServer.Port.ToString() + uri_tmp; - // Avoid a race - the request URL may have been released via llRequestUrl() whilst this - // request was being processed. - if (!m_UrlMap.TryGetValue(url, out urlData)) - return; - } + // Avoid a race - the request URL may have been released via llRequestUrl() whilst this + // request was being processed. + if (!m_UrlMap.TryGetValue(url, out urlData)) + return; //for llGetHttpHeader support we need to store original URI here //to make x-path-info / x-query-string / x-script-url / x-remote-ip headers @@ -544,6 +572,7 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp string value = (string)header.Value; requestData.headers.Add(key, value); } + foreach (DictionaryEntry de in request) { if (de.Key.ToString() == "querystringkeys") @@ -570,34 +599,21 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp requestData.headers["x-query-string"] = queryString; requestData.headers["x-script-url"] = urlData.url; - //requestData.ev = new ManualResetEvent(false); - lock (urlData.requests) - { - urlData.requests.Add(requestID, requestData); - } - - lock (m_RequestMap) - { - m_RequestMap.Add(requestID, urlData); - } - - urlData.engine.PostScriptEvent( - urlData.itemID, - "http_request", - new Object[] { requestID.ToString(), request["http-method"].ToString(), request["body"].ToString() }); - - //send initial response? -// Hashtable response = new Hashtable(); - - return; - } - catch (Exception we) - { - //Hashtable response = new Hashtable(); - m_log.Warn("[HttpRequestHandler]: http-in request failed"); - m_log.Warn(we.Message); - m_log.Warn(we.StackTrace); + urlData.requests.Add(requestID, requestData); + m_RequestMap.Add(requestID, urlData); } + + urlData.engine.PostScriptEvent( + urlData.itemID, + "http_request", + new Object[] { requestID.ToString(), request["http-method"].ToString(), request["body"].ToString() }); + } + catch (Exception we) + { + //Hashtable response = new Hashtable(); + m_log.Warn("[HttpRequestHandler]: http-in request failed"); + m_log.Warn(we.Message); + m_log.Warn(we.StackTrace); } } @@ -606,4 +622,4 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp ScriptRemoved(itemID); } } -} +} \ No newline at end of file From 6d3ee8bb39d47ed7b32e8905fa0b2fc31c5a9f80 Mon Sep 17 00:00:00 2001 From: BlueWall Date: Sat, 23 Jun 2012 04:11:31 -0400 Subject: [PATCH 427/547] Fix script "Running" behavior Unchecking "Running" box in script editor now persists. This fixes http://opensimulator.org/mantis/view.php?id=6057 --- .../Region/Framework/Interfaces/IScriptModule.cs | 2 ++ OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | 14 ++++++++++++++ .../ScriptEngine/Interfaces/IScriptInstance.cs | 10 ++++++++++ .../ScriptEngine/Shared/Instance/ScriptInstance.cs | 9 +++++++++ .../Shared/Instance/ScriptSerializer.cs | 11 +++++++++++ OpenSim/Region/ScriptEngine/XEngine/XEngine.cs | 7 +++++++ 6 files changed, 53 insertions(+) diff --git a/OpenSim/Region/Framework/Interfaces/IScriptModule.cs b/OpenSim/Region/Framework/Interfaces/IScriptModule.cs index 0d488dffd7..cbaf24139d 100644 --- a/OpenSim/Region/Framework/Interfaces/IScriptModule.cs +++ b/OpenSim/Region/Framework/Interfaces/IScriptModule.cs @@ -75,6 +75,8 @@ namespace OpenSim.Region.Framework.Interfaces /// The item ID of the script. bool GetScriptState(UUID itemID); + void SetRunEnable(UUID instanceID, bool enable); + void SaveAllState(); /// diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs index e4132817ac..9ff8467086 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs @@ -2143,10 +2143,24 @@ namespace OpenSim.Region.Framework.Scenes if (part == null) return; + IScriptModule[] engines = RequestModuleInterfaces(); + if (running) + { + foreach (IScriptModule engine in engines) + { + engine.SetRunEnable(itemID, true); + } EventManager.TriggerStartScript(part.LocalId, itemID); + } else + { + foreach (IScriptModule engine in engines) + { + engine.SetRunEnable(itemID, false); + } EventManager.TriggerStopScript(part.LocalId, itemID); + } } public void GetScriptRunning(IClientAPI controllingClient, UUID objectID, UUID itemID) diff --git a/OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs b/OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs index b04f6b6624..ec13b6cc01 100644 --- a/OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs +++ b/OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs @@ -63,6 +63,16 @@ namespace OpenSim.Region.ScriptEngine.Interfaces /// bool Running { get; set; } + /// + /// Gets or sets a value indicating whether this + /// is run. + /// For viewer script editor control + /// + /// + /// true if run; otherwise, false. + /// + bool Run { get; set; } + /// /// Is the script suspended? /// diff --git a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs index 5dfe58e2f9..306090e60c 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs @@ -120,6 +120,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance public bool Running { get; set; } + public bool Run { get; set; } + public bool Suspended { get { return m_Suspended; } @@ -215,6 +217,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance m_postOnRez = postOnRez; m_AttachedAvatar = part.ParentGroup.AttachedAvatar; m_RegionID = part.ParentGroup.Scene.RegionInfo.RegionID; + Run = true; if (part != null) { @@ -359,6 +362,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance if (m_startedFromSavedState) { + if (!Run) + return; + Start(); if (m_postOnRez) { @@ -391,6 +397,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance } else { + if (!Run) + return; + Start(); PostEvent(new EventParams("state_entry", new Object[0], new DetectParams[0])); diff --git a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptSerializer.cs b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptSerializer.cs index bcdc7bf5dd..797bce3ce1 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptSerializer.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptSerializer.cs @@ -55,6 +55,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance public static string Serialize(ScriptInstance instance) { bool running = instance.Running; + bool enabled = instance.Run; XmlDocument xmldoc = new XmlDocument(); @@ -77,6 +78,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance rootElement.AppendChild(run); + XmlElement run_enable = xmldoc.CreateElement("", "Run", ""); + run_enable.AppendChild(xmldoc.CreateTextNode( + enabled.ToString())); + + rootElement.AppendChild(run_enable); + Dictionary vars = instance.GetVars(); XmlElement variables = xmldoc.CreateElement("", "Variables", ""); @@ -225,6 +232,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance { object varValue; XmlNodeList partL = rootNode.ChildNodes; + instance.Run = true; foreach (XmlNode part in partL) { @@ -236,6 +244,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance case "Running": instance.Running=bool.Parse(part.InnerText); break; + case "Run": + instance.Run = bool.Parse(part.InnerText); + break; case "Variables": XmlNodeList varL = part.ChildNodes; foreach (XmlNode var in varL) diff --git a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs index 25b27b90c5..06ed9d6deb 100644 --- a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs +++ b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs @@ -1503,6 +1503,13 @@ namespace OpenSim.Region.ScriptEngine.XEngine } } + public void SetRunEnable(UUID instanceID, bool enable) + { + IScriptInstance instance = GetInstance(instanceID); + if (instance != null) + instance.Run = enable; + } + public bool GetScriptState(UUID itemID) { IScriptInstance instance = GetInstance(itemID); From 5301648cff6b451fef4cca0baf8cda1bdb1455a6 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Mon, 25 Jun 2012 21:08:19 +0100 Subject: [PATCH 428/547] In AttachmentsModule.DetachSingleAttachmentToInvInternal(), remove attachment before changing properties for correct inventory serialization. Serialization of attachments requires IsAttachment = false so that correct positions are serialized instead of avatar position. However, doing this when a hud is still attached allows race conditions with update threads, resulting in hud artifacts on other viewers. This change sets SOG.IsDeleted before serialization changes take place (IsDeleted itself is not a serialized property). LLClientView then screens out any deleted SOGs before sending updates to viewers. --- .../ClientStack/Linden/UDP/LLClientView.cs | 33 ++++++++++++++++++- .../Avatar/Attachments/AttachmentsModule.cs | 2 +- .../Scenes/Tests/SceneObjectBasicTests.cs | 9 +++++ 3 files changed, 42 insertions(+), 2 deletions(-) diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs index 4cb7a3a5d4..8874585625 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs @@ -3808,6 +3808,15 @@ namespace OpenSim.Region.ClientStack.LindenUDP && part.ParentGroup.HasPrivateAttachmentPoint && part.ParentGroup.AttachedAvatar != AgentId) continue; + + // If the part has since been deleted, then drop the update. In the case of attachments, + // this is to avoid spurious updates to other viewers since post-processing of attachments + // has to change the IsAttachment flag for various reasons (which will end up in a pass + // of the test above). + // + // Actual deletions (kills) happen in another method. + if (part.ParentGroup.IsDeleted) + continue; } objectUpdateBlocks.Value.Add(updateBlock); @@ -3815,7 +3824,20 @@ namespace OpenSim.Region.ClientStack.LindenUDP } else if (!canUseImproved) { - compressedUpdateBlocks.Value.Add(CreateCompressedUpdateBlock((SceneObjectPart)update.Entity, updateFlags)); + SceneObjectPart part = (SceneObjectPart)update.Entity; + ObjectUpdateCompressedPacket.ObjectDataBlock compressedBlock + = CreateCompressedUpdateBlock(part, updateFlags); + + // If the part has since been deleted, then drop the update. In the case of attachments, + // this is to avoid spurious updates to other viewers since post-processing of attachments + // has to change the IsAttachment flag for various reasons (which will end up in a pass + // of the test above). + // + // Actual deletions (kills) happen in another method. + if (part.ParentGroup.IsDeleted) + continue; + + compressedUpdateBlocks.Value.Add(compressedBlock); compressedUpdates.Value.Add(update); } else @@ -3842,6 +3864,15 @@ namespace OpenSim.Region.ClientStack.LindenUDP && part.ParentGroup.HasPrivateAttachmentPoint && part.ParentGroup.AttachedAvatar != AgentId) continue; + + // If the part has since been deleted, then drop the update. In the case of attachments, + // this is to avoid spurious updates to other viewers since post-processing of attachments + // has to change the IsAttachment flag for various reasons (which will end up in a pass + // of the test above). + // + // Actual deletions (kills) happen in another method. + if (part.ParentGroup.IsDeleted) + continue; } terseUpdateBlocks.Value.Add(terseUpdateBlock); diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs index a2b95ebb0b..99e01539e4 100644 --- a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs @@ -628,6 +628,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments { m_scene.EventManager.TriggerOnAttach(group.LocalId, itemID, UUID.Zero); sp.RemoveAttachment(group); + m_scene.DeleteSceneObject(group, false); // Prepare sog for storage group.AttachedAvatar = UUID.Zero; @@ -636,7 +637,6 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments group.AbsolutePosition = group.RootPart.AttachedPos; UpdateKnownItem(sp, group, true); - m_scene.DeleteSceneObject(group, false); return; } diff --git a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectBasicTests.cs b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectBasicTests.cs index 453e077c8a..81add43062 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectBasicTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectBasicTests.cs @@ -187,8 +187,13 @@ namespace OpenSim.Region.Framework.Scenes.Tests TestScene scene = new SceneHelpers().SetupScene(); SceneObjectPart part = SceneHelpers.AddSceneObject(scene); + + Assert.That(part.ParentGroup.IsDeleted, Is.False); + scene.DeleteSceneObject(part.ParentGroup, false); + Assert.That(part.ParentGroup.IsDeleted, Is.True); + SceneObjectPart retrievedPart = scene.GetSceneObjectPart(part.LocalId); Assert.That(retrievedPart, Is.Null); } @@ -219,8 +224,12 @@ namespace OpenSim.Region.Framework.Scenes.Tests Assert.That(retrievedPart, Is.Not.Null); + Assert.That(part.ParentGroup.IsDeleted, Is.False); + sogd.InventoryDeQueueAndDelete(); + Assert.That(part.ParentGroup.IsDeleted, Is.True); + SceneObjectPart retrievedPart2 = scene.GetSceneObjectPart(part.LocalId); Assert.That(retrievedPart2, Is.Null); } From e5b739aaebace6b028f3f6bf05d21ff7a7c5affe Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Mon, 25 Jun 2012 22:48:13 +0100 Subject: [PATCH 429/547] When attachments are being saved and deleted for a closing root agent, delete first to avoid a hud race condition with update threads. If delete doesn't occur first then the update thread can outrace the IsAttachment = false necessary to save attachments and send hud artifacts to other viewers. --- .../Avatar/Attachments/AttachmentsModule.cs | 33 ++++++++++++------- .../Interfaces/IAttachmentsModule.cs | 11 +++++-- OpenSim/Region/Framework/Scenes/Scene.cs | 24 +++++++------- .../Region/Framework/Scenes/ScenePresence.cs | 3 -- 4 files changed, 42 insertions(+), 29 deletions(-) diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs index 99e01539e4..2b0e4ab5b3 100644 --- a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs @@ -152,31 +152,40 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments } } - public void SaveChangedAttachments(IScenePresence sp, bool saveAllScripted) + public void DeRezAttachments(IScenePresence sp, bool saveChanged, bool saveAllScripted) { -// m_log.DebugFormat("[ATTACHMENTS MODULE]: Saving changed attachments for {0}", sp.Name); - if (!Enabled) return; - foreach (SceneObjectGroup grp in sp.GetAttachments()) +// m_log.DebugFormat("[ATTACHMENTS MODULE]: Saving changed attachments for {0}", sp.Name); + + lock (sp.AttachmentsSyncLock) { - grp.IsAttachment = false; - grp.AbsolutePosition = grp.RootPart.AttachedPos; - UpdateKnownItem(sp, grp, saveAllScripted); - grp.IsAttachment = true; + foreach (SceneObjectGroup grp in sp.GetAttachments()) + { + grp.Scene.DeleteSceneObject(grp, false); + + if (saveChanged || saveAllScripted) + { + grp.IsAttachment = false; + grp.AbsolutePosition = grp.RootPart.AttachedPos; + UpdateKnownItem(sp, grp, saveAllScripted); + } + } + + sp.ClearAttachments(); } } public void DeleteAttachmentsFromScene(IScenePresence sp, bool silent) { -// m_log.DebugFormat( -// "[ATTACHMENTS MODULE]: Deleting attachments from scene {0} for {1}, silent = {2}", -// m_scene.RegionInfo.RegionName, sp.Name, silent); - if (!Enabled) return; +// m_log.DebugFormat( +// "[ATTACHMENTS MODULE]: Deleting attachments from scene {0} for {1}, silent = {2}", +// m_scene.RegionInfo.RegionName, sp.Name, silent); + foreach (SceneObjectGroup sop in sp.GetAttachments()) { sop.Scene.DeleteSceneObject(sop, silent); diff --git a/OpenSim/Region/Framework/Interfaces/IAttachmentsModule.cs b/OpenSim/Region/Framework/Interfaces/IAttachmentsModule.cs index eb071650bc..fde5de1561 100644 --- a/OpenSim/Region/Framework/Interfaces/IAttachmentsModule.cs +++ b/OpenSim/Region/Framework/Interfaces/IAttachmentsModule.cs @@ -43,10 +43,15 @@ namespace OpenSim.Region.Framework.Interfaces void RezAttachments(IScenePresence sp); /// - /// Save the attachments that have change on this presence. + /// Derez the attachements for a scene presence that is closing. /// - /// - void SaveChangedAttachments(IScenePresence sp, bool saveAllScripted); + /// + /// Attachment changes are saved. + /// + /// The presence closing + /// Save changed attachments. + /// Save attachments with scripts even if they haven't changed. + void DeRezAttachments(IScenePresence sp, bool saveChanged, bool saveAllScripted); /// /// Delete all the presence's attachments from the scene diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 385febf99d..d44911604a 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -500,6 +500,7 @@ namespace OpenSim.Region.Framework.Scenes public IAttachmentsModule AttachmentsModule { get; set; } public IEntityTransferModule EntityTransferModule { get; private set; } public IAgentAssetTransactions AgentTransactionsModule { get; private set; } + public IUserManagement UserManagementModule { get; private set; } public IAvatarFactoryModule AvatarFactory { @@ -1243,6 +1244,7 @@ namespace OpenSim.Region.Framework.Scenes EntityTransferModule = RequestModuleInterface(); m_groupsModule = RequestModuleInterface(); AgentTransactionsModule = RequestModuleInterface(); + UserManagementModule = RequestModuleInterface(); } #endregion @@ -2021,9 +2023,8 @@ namespace OpenSim.Region.Framework.Scenes sceneObject.SetGroup(groupID, null); } - IUserManagement uman = RequestModuleInterface(); - if (uman != null) - sceneObject.RootPart.CreatorIdentification = uman.GetUserUUI(ownerID); + if (UserManagementModule != null) + sceneObject.RootPart.CreatorIdentification = UserManagementModule.GetUserUUI(ownerID); sceneObject.ScheduleGroupForFullUpdate(); @@ -2711,14 +2712,13 @@ namespace OpenSim.Region.Framework.Scenes /// private void CacheUserName(ScenePresence sp, AgentCircuitData aCircuit) { - IUserManagement uMan = RequestModuleInterface(); - if (uMan != null) + if (UserManagementModule != null) { string first = aCircuit.firstname, last = aCircuit.lastname; if (sp.PresenceType == PresenceType.Npc) { - uMan.AddUser(aCircuit.AgentID, first, last); + UserManagementModule.AddUser(aCircuit.AgentID, first, last); } else { @@ -2737,7 +2737,7 @@ namespace OpenSim.Region.Framework.Scenes } } - uMan.AddUser(aCircuit.AgentID, first, last, homeURL); + UserManagementModule.AddUser(aCircuit.AgentID, first, last, homeURL); } } } @@ -3292,17 +3292,19 @@ namespace OpenSim.Region.Framework.Scenes if (!isChildAgent) { - if (AttachmentsModule != null && avatar.PresenceType != PresenceType.Npc) + if (AttachmentsModule != null) { - IUserManagement uMan = RequestModuleInterface(); // Don't save attachments for HG visitors, it // messes up their inventory. When a HG visitor logs // out on a foreign grid, their attachments will be // reloaded in the state they were in when they left // the home grid. This is best anyway as the visited // grid may use an incompatible script engine. - if (uMan == null || uMan.IsLocalGridUser(avatar.UUID)) - AttachmentsModule.SaveChangedAttachments(avatar, false); + bool saveChanged + = avatar.PresenceType != PresenceType.Npc + && (UserManagementModule == null || UserManagementModule.IsLocalGridUser(avatar.UUID)); + + AttachmentsModule.DeRezAttachments(avatar, saveChanged, false); } ForEachClient( diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index 3909fd4706..909c7c86d7 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs @@ -3416,9 +3416,6 @@ namespace OpenSim.Region.Framework.Scenes public void Close() { - if (!IsChildAgent && m_scene.AttachmentsModule != null) - m_scene.AttachmentsModule.DeleteAttachmentsFromScene(this, false); - // Clear known regions KnownRegions = new Dictionary(); From f5316984abfcf72870c7e4d50c95c1cabc8cc588 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Mon, 25 Jun 2012 23:31:22 +0100 Subject: [PATCH 430/547] minor: update currently commented out log message at top of AvatarFactoryModule.SetAppearance() for future use --- .../CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs b/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs index 705233c2d7..68a4cde969 100644 --- a/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs @@ -128,7 +128,9 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory /// public void SetAppearance(IScenePresence sp, Primitive.TextureEntry textureEntry, byte[] visualParams) { - // m_log.InfoFormat("[AVFACTORY]: start SetAppearance for {0}", client.AgentId); +// m_log.DebugFormat( +// "[AVFACTORY]: start SetAppearance for {0}, te {1}, visualParams {2}", +// sp.Name, textureEntry, visualParams); // TODO: This is probably not necessary any longer, just assume the // textureEntry set implies that the appearance transaction is complete From 854f2a913cdedfa252b69d5c3118d35604ab6b4a Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Mon, 25 Jun 2012 23:55:14 +0100 Subject: [PATCH 431/547] Add "show region at" command to grid service to get the details of a region at a specific location. "show region" command becomes "show region name" to disambiguate This is the same format as used by "show object name", etc. "deregister region" also becomes "deregister region id" --- OpenSim/Services/GridService/GridService.cs | 95 +++++++++++++++------ 1 file changed, 71 insertions(+), 24 deletions(-) diff --git a/OpenSim/Services/GridService/GridService.cs b/OpenSim/Services/GridService/GridService.cs index 11897f8809..7d2dadb7c4 100644 --- a/OpenSim/Services/GridService/GridService.cs +++ b/OpenSim/Services/GridService/GridService.cs @@ -85,19 +85,26 @@ namespace OpenSim.Services.GridService if (MainConsole.Instance != null) { MainConsole.Instance.Commands.AddCommand("Regions", true, - "deregister region", - "deregister region ", + "deregister region id", + "deregister region id ", "Deregister a region manually.", String.Empty, HandleDeregisterRegion); MainConsole.Instance.Commands.AddCommand("Regions", true, - "show region", - "show region ", + "show region name", + "show region name ", "Show details on a region", String.Empty, HandleShowRegion); + MainConsole.Instance.Commands.AddCommand("Regions", true, + "show region at", + "show region at ", + "Show details on a region at the given co-ordinate.", + "For example, show region at 1000 1000", + HandleShowRegionAt); + MainConsole.Instance.Commands.AddCommand("Regions", true, "set region flags", "set region flags ", @@ -504,13 +511,13 @@ namespace OpenSim.Services.GridService private void HandleDeregisterRegion(string module, string[] cmd) { - if (cmd.Length != 3) + if (cmd.Length != 4) { - MainConsole.Instance.Output("Syntax: degregister region "); + MainConsole.Instance.Output("Syntax: degregister region id "); return; } - string rawRegionUuid = cmd[2]; + string rawRegionUuid = cmd[3]; UUID regionUuid; if (!UUID.TryParse(rawRegionUuid, out regionUuid)) @@ -542,34 +549,74 @@ namespace OpenSim.Services.GridService private void HandleShowRegion(string module, string[] cmd) { - if (cmd.Length != 3) + if (cmd.Length != 4) { - MainConsole.Instance.Output("Syntax: show region "); + MainConsole.Instance.Output("Syntax: show region name "); return; } - List regions = m_Database.Get(cmd[2], UUID.Zero); + + string regionName = cmd[3]; + + List regions = m_Database.Get(regionName, UUID.Zero); if (regions == null || regions.Count < 1) { - MainConsole.Instance.Output("Region not found"); + MainConsole.Instance.Output("No region with name {0} found", regionName); return; } - foreach (RegionData r in regions) + OutputRegionsToConsole(regions); + } + + private void HandleShowRegionAt(string module, string[] cmd) + { + if (cmd.Length != 5) { - OpenSim.Data.RegionFlags flags = (OpenSim.Data.RegionFlags)Convert.ToInt32(r.Data["flags"]); - - ConsoleDisplayList dispList = new ConsoleDisplayList(); - dispList.AddRow("Region Name", r.RegionName); - dispList.AddRow("Region ID", r.RegionID); - dispList.AddRow("Location", string.Format("{0},{1}", r.coordX, r.coordY)); - dispList.AddRow("URI", r.Data["serverURI"]); - dispList.AddRow("Owner ID", r.Data["owner_uuid"]); - dispList.AddRow("Flags", flags); - - MainConsole.Instance.Output(dispList.ToString()); + MainConsole.Instance.Output("Syntax: show region at "); + return; } - return; + int x, y; + if (!int.TryParse(cmd[3], out x)) + { + MainConsole.Instance.Output("x-coord must be an integer"); + return; + } + + if (!int.TryParse(cmd[4], out y)) + { + MainConsole.Instance.Output("y-coord must be an integer"); + return; + } + + RegionData region = m_Database.Get(x * (int)Constants.RegionSize, y * (int)Constants.RegionSize, UUID.Zero); + if (region == null) + { + MainConsole.Instance.OutputFormat("No region found at {0},{1}", x, y); + return; + } + + OutputRegionToConsole(region); + } + + private void OutputRegionToConsole(RegionData r) + { + OpenSim.Data.RegionFlags flags = (OpenSim.Data.RegionFlags)Convert.ToInt32(r.Data["flags"]); + + ConsoleDisplayList dispList = new ConsoleDisplayList(); + dispList.AddRow("Region Name", r.RegionName); + dispList.AddRow("Region ID", r.RegionID); + dispList.AddRow("Location", string.Format("{0},{1}", r.coordX, r.coordY)); + dispList.AddRow("URI", r.Data["serverURI"]); + dispList.AddRow("Owner ID", r.Data["owner_uuid"]); + dispList.AddRow("Flags", flags); + + MainConsole.Instance.Output(dispList.ToString()); + } + + private void OutputRegionsToConsole(List regions) + { + foreach (RegionData r in regions) + OutputRegionToConsole(r); } private int ParseFlags(int prev, string flags) From 5292b8b8be85696604f4f8086376da568b8342b5 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Tue, 26 Jun 2012 00:34:37 +0100 Subject: [PATCH 432/547] Add "show regions" console command to ROBUST to show all regions currently registered. Command is not added in standalone, which has its own version of "show regions" that can also show estate name --- OpenSim/Services/GridService/GridService.cs | 44 +++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/OpenSim/Services/GridService/GridService.cs b/OpenSim/Services/GridService/GridService.cs index 7d2dadb7c4..e4c32467a2 100644 --- a/OpenSim/Services/GridService/GridService.cs +++ b/OpenSim/Services/GridService/GridService.cs @@ -91,6 +91,18 @@ namespace OpenSim.Services.GridService String.Empty, HandleDeregisterRegion); + // A messy way of stopping this command being added if we are in standalone (since the simulator + // has an identically named command + // + // XXX: We're relying on the OpenSimulator version being registered first, which is not well defined. + if (MainConsole.Instance.Commands.Resolve(new string[] { "show", "regions" }).Length == 0) + MainConsole.Instance.Commands.AddCommand("Regions", true, + "show regions", + "show all regions", + "Show details on all regions", + String.Empty, + HandleShowRegions); + MainConsole.Instance.Commands.AddCommand("Regions", true, "show region name", "show region name ", @@ -547,6 +559,20 @@ namespace OpenSim.Services.GridService return; } + private void HandleShowRegions(string module, string[] cmd) + { + if (cmd.Length != 2) + { + MainConsole.Instance.Output("Syntax: show regions"); + return; + } + + List regions = m_Database.Get(int.MinValue, int.MinValue, int.MaxValue, int.MaxValue, UUID.Zero); + + OutputRegionsToConsoleSummary(regions); + } + + private void HandleShowRegion(string module, string[] cmd) { if (cmd.Length != 4) @@ -619,6 +645,24 @@ namespace OpenSim.Services.GridService OutputRegionToConsole(r); } + private void OutputRegionsToConsoleSummary(List regions) + { + ConsoleDisplayTable dispTable = new ConsoleDisplayTable(); + dispTable.Columns.Add(new ConsoleDisplayTableColumn("Name", 16)); + dispTable.Columns.Add(new ConsoleDisplayTableColumn("ID", 36)); + dispTable.Columns.Add(new ConsoleDisplayTableColumn("Owner ID", 36)); + dispTable.Columns.Add(new ConsoleDisplayTableColumn("Flags", 60)); + + foreach (RegionData r in regions) + { + OpenSim.Data.RegionFlags flags = (OpenSim.Data.RegionFlags)Convert.ToInt32(r.Data["flags"]); + dispTable.Rows.Add( + new ConsoleDisplayTableRow(new List { r.RegionName, r.RegionID.ToString(), r.Data["owner_uuid"].ToString(), flags.ToString() })); + } + + MainConsole.Instance.Output(dispTable.ToString()); + } + private int ParseFlags(int prev, string flags) { OpenSim.Data.RegionFlags f = (OpenSim.Data.RegionFlags)prev; From 1f22b29ca3d172624087185a4e9056a931f19703 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Tue, 26 Jun 2012 00:40:46 +0100 Subject: [PATCH 433/547] Add much easier ConsoleDisplayTable AddColumn() and AddRow() methods. Use these for new "show regions" command rather than old cumbersome stuff. --- OpenSim/Framework/Console/ConsoleDisplayTable.cs | 15 +++++++++++++++ OpenSim/Services/GridService/GridService.cs | 11 +++++------ 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/OpenSim/Framework/Console/ConsoleDisplayTable.cs b/OpenSim/Framework/Console/ConsoleDisplayTable.cs index e9d1628b1d..c620dfe10c 100644 --- a/OpenSim/Framework/Console/ConsoleDisplayTable.cs +++ b/OpenSim/Framework/Console/ConsoleDisplayTable.cs @@ -79,6 +79,16 @@ namespace OpenSim.Framework.Console return sb.ToString(); } + public void AddColumn(string name, int width) + { + Columns.Add(new ConsoleDisplayTableColumn(name, width)); + } + + public void AddRow(params string[] cells) + { + Rows.Add(new ConsoleDisplayTableRow(cells)); + } + public void AddToStringBuilder(StringBuilder sb) { string formatString = GetFormatString(); @@ -135,5 +145,10 @@ namespace OpenSim.Framework.Console { Cells = cells; } + + public ConsoleDisplayTableRow(params string[] cells) : this() + { + Cells = new List(cells); + } } } \ No newline at end of file diff --git a/OpenSim/Services/GridService/GridService.cs b/OpenSim/Services/GridService/GridService.cs index e4c32467a2..842a6979a9 100644 --- a/OpenSim/Services/GridService/GridService.cs +++ b/OpenSim/Services/GridService/GridService.cs @@ -648,16 +648,15 @@ namespace OpenSim.Services.GridService private void OutputRegionsToConsoleSummary(List regions) { ConsoleDisplayTable dispTable = new ConsoleDisplayTable(); - dispTable.Columns.Add(new ConsoleDisplayTableColumn("Name", 16)); - dispTable.Columns.Add(new ConsoleDisplayTableColumn("ID", 36)); - dispTable.Columns.Add(new ConsoleDisplayTableColumn("Owner ID", 36)); - dispTable.Columns.Add(new ConsoleDisplayTableColumn("Flags", 60)); + dispTable.AddColumn("Name", 16); + dispTable.AddColumn("ID", 36); + dispTable.AddColumn("Owner ID", 36); + dispTable.AddColumn("Flags", 60); foreach (RegionData r in regions) { OpenSim.Data.RegionFlags flags = (OpenSim.Data.RegionFlags)Convert.ToInt32(r.Data["flags"]); - dispTable.Rows.Add( - new ConsoleDisplayTableRow(new List { r.RegionName, r.RegionID.ToString(), r.Data["owner_uuid"].ToString(), flags.ToString() })); + dispTable.AddRow(r.RegionName, r.RegionID.ToString(), r.Data["owner_uuid"].ToString(), flags.ToString()); } MainConsole.Instance.Output(dispTable.ToString()); From 988112d4460adb2c6621027145f4fe60b079c7e5 Mon Sep 17 00:00:00 2001 From: BlueWall Date: Tue, 26 Jun 2012 15:14:25 -0400 Subject: [PATCH 434/547] Add stub for llCastRay --- OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs index 06f5617fac..a0b3bc8d4c 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs @@ -954,6 +954,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase return m_LSL_Functions.llRequestDisplayName(id); } + public LSL_List llCastRay(LSL_Vector start, LSL_Vector end, LSL_List options) + { + return m_LSL_Functions.llCastRay(start, end, options); + } + public void llLinkParticleSystem(int linknum, LSL_List rules) { m_LSL_Functions.llLinkParticleSystem(linknum, rules); From 4b6c3fd4bb8e4c989a7f0b4c0687379ea4bc63c1 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Tue, 26 Jun 2012 21:06:47 +0100 Subject: [PATCH 435/547] If crossing attachments into another region pre-fatpack, clone objects before changing properties to avoid hud display race condition with update threads. This matches behaviour in fatpack crossing, where attachments are cloned before their properties are changed. This only applies to crossings to simulators running code released before April 2011. --- .../EntityTransfer/EntityTransferModule.cs | 43 +++++++++++-------- 1 file changed, 26 insertions(+), 17 deletions(-) diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs index 7d82060835..f5ebe970c2 100644 --- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs +++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs @@ -1666,6 +1666,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer #endregion #region Object Transfers + /// /// Move the given scene object into a new region depending on which region its absolute position has moved /// into. @@ -1967,35 +1968,43 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer return successYN; } - protected bool CrossAttachmentsIntoNewRegion(GridRegion destination, ScenePresence sp, bool silent) + /// + /// Cross the attachments for an avatar into the destination region. + /// + /// + /// This is only invoked for simulators released prior to April 2011. Versions of OpenSimulator since then + /// transfer attachments in one go as part of the ChildAgentDataUpdate data passed in the update agent call. + /// + /// + /// + /// + protected void CrossAttachmentsIntoNewRegion(GridRegion destination, ScenePresence sp, bool silent) { - List m_attachments = sp.GetAttachments(); + List attachments = sp.GetAttachments(); - // Validate -// foreach (SceneObjectGroup gobj in m_attachments) -// { -// if (gobj == null || gobj.IsDeleted) -// return false; -// } +// m_log.DebugFormat( +// "[ENTITY TRANSFER MODULE]: Crossing {0} attachments into {1} for {2}", +// m_attachments.Count, destination.RegionName, sp.Name); - foreach (SceneObjectGroup gobj in m_attachments) + foreach (SceneObjectGroup gobj in attachments) { // If the prim group is null then something must have happened to it! if (gobj != null && !gobj.IsDeleted) { - // Set the parent localID to 0 so it transfers over properly. - gobj.RootPart.SetParentLocalId(0); - gobj.AbsolutePosition = gobj.RootPart.AttachedPos; - gobj.IsAttachment = false; + SceneObjectGroup clone = (SceneObjectGroup)gobj.CloneForNewScene(); + clone.RootPart.GroupPosition = gobj.RootPart.AttachedPos; + clone.IsAttachment = false; + //gobj.RootPart.LastOwnerID = gobj.GetFromAssetID(); - m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Sending attachment {0} to region {1}", gobj.UUID, destination.RegionName); - CrossPrimGroupIntoNewRegion(destination, Vector3.Zero, gobj, silent); + m_log.DebugFormat( + "[ENTITY TRANSFER MODULE]: Sending attachment {0} to region {1}", + clone.UUID, destination.RegionName); + + CrossPrimGroupIntoNewRegion(destination, Vector3.Zero, clone, silent); } } sp.ClearAttachments(); - - return true; } #endregion From 32a4ce94f0b896eff0ca5b91b30714e776132acf Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Tue, 26 Jun 2012 22:16:44 +0100 Subject: [PATCH 436/547] Add regression test to check that attachments in source region are deleting when an agent teleports to a neighbouring region --- .../Tests/AttachmentsModuleTests.cs | 137 +++++++++++++++--- .../EntityTransfer/EntityTransferModule.cs | 5 + 2 files changed, 122 insertions(+), 20 deletions(-) diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs index 8f4a807182..695994fe68 100644 --- a/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs +++ b/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs @@ -38,6 +38,8 @@ using OpenMetaverse; using OpenSim.Framework; using OpenSim.Framework.Communications; using OpenSim.Region.CoreModules.Avatar.Attachments; +using OpenSim.Region.CoreModules.Framework; +using OpenSim.Region.CoreModules.Framework.EntityTransfer; using OpenSim.Region.CoreModules.Framework.InventoryAccess; using OpenSim.Region.CoreModules.World.Serialiser; using OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation; @@ -54,7 +56,6 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests [TestFixture] public class AttachmentsModuleTests { - private Scene scene; private AttachmentsModule m_attMod; private ScenePresence m_presence; @@ -80,18 +81,6 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests Util.FireAndForgetMethod = FireAndForgetMethod.None; } - [SetUp] - public void Init() - { - IConfigSource config = new IniConfigSource(); - config.AddConfig("Modules"); - config.Configs["Modules"].Set("InventoryAccessModule", "BasicInventoryAccessModule"); - - scene = new SceneHelpers().SetupScene(); - m_attMod = new AttachmentsModule(); - SceneHelpers.SetupSceneModules(scene, config, m_attMod, new BasicInventoryAccessModule()); - } - [TestFixtureTearDown] public void TearDown() { @@ -100,6 +89,19 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests Util.FireAndForgetMethod = Util.DefaultFireAndForgetMethod; } + private Scene CreateDefaultTestScene() + { + IConfigSource config = new IniConfigSource(); + config.AddConfig("Modules"); + config.Configs["Modules"].Set("InventoryAccessModule", "BasicInventoryAccessModule"); + + Scene scene = new SceneHelpers().SetupScene(); + m_attMod = new AttachmentsModule(); + SceneHelpers.SetupSceneModules(scene, config, m_attMod, new BasicInventoryAccessModule()); + + return scene; + } + /// /// Creates an attachment item in the given user's inventory. Does not attach. /// @@ -109,11 +111,13 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests /// /// The attachment item. /// + /// /// /// /// /// - private InventoryItemBase CreateAttachmentItem(UUID userId, string attName, int rawItemId, int rawAssetId) + private InventoryItemBase CreateAttachmentItem( + Scene scene, UUID userId, string attName, int rawItemId, int rawAssetId) { return UserInventoryHelpers.CreateInventoryItem( scene, @@ -130,6 +134,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests TestHelpers.InMethod(); // TestHelpers.EnableLogging(); + Scene scene = CreateDefaultTestScene(); UserAccountHelpers.CreateUserWithInventory(scene, m_userId); m_presence = SceneHelpers.AddScenePresence(scene, m_userId); @@ -171,10 +176,11 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests TestHelpers.InMethod(); // log4net.Config.XmlConfigurator.Configure(); + Scene scene = CreateDefaultTestScene(); UserAccountHelpers.CreateUserWithInventory(scene, m_userId); m_presence = SceneHelpers.AddScenePresence(scene, m_userId); - InventoryItemBase attItem = CreateAttachmentItem(m_userId, "att", 0x10, 0x20); + InventoryItemBase attItem = CreateAttachmentItem(scene, m_userId, "att", 0x10, 0x20); m_attMod.RezSingleAttachmentFromInventory( m_presence, attItem.ID, (uint)AttachmentPoint.Chest); @@ -201,10 +207,11 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests TestHelpers.InMethod(); // log4net.Config.XmlConfigurator.Configure(); + Scene scene = CreateDefaultTestScene(); UserAccountHelpers.CreateUserWithInventory(scene, m_userId); m_presence = SceneHelpers.AddScenePresence(scene, m_userId); - InventoryItemBase attItem = CreateAttachmentItem(m_userId, "att", 0x10, 0x20); + InventoryItemBase attItem = CreateAttachmentItem(scene, m_userId, "att", 0x10, 0x20); ISceneEntity so = m_attMod.RezSingleAttachmentFromInventory( @@ -232,10 +239,11 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests TestHelpers.InMethod(); // log4net.Config.XmlConfigurator.Configure(); + Scene scene = CreateDefaultTestScene(); UserAccountHelpers.CreateUserWithInventory(scene, m_userId); m_presence = SceneHelpers.AddScenePresence(scene, m_userId); - InventoryItemBase attItem = CreateAttachmentItem(m_userId, "att", 0x10, 0x20); + InventoryItemBase attItem = CreateAttachmentItem(scene, m_userId, "att", 0x10, 0x20); m_attMod.RezSingleAttachmentFromInventory( m_presence, attItem.ID, (uint)AttachmentPoint.Chest); @@ -259,8 +267,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests TestHelpers.InMethod(); // log4net.Config.XmlConfigurator.Configure(); + Scene scene = CreateDefaultTestScene(); UserAccountHelpers.CreateUserWithInventory(scene, m_userId); - InventoryItemBase attItem = CreateAttachmentItem(m_userId, "att", 0x10, 0x20); + InventoryItemBase attItem = CreateAttachmentItem(scene, m_userId, "att", 0x10, 0x20); AgentCircuitData acd = SceneHelpers.GenerateAgentData(m_userId); acd.Appearance = new AvatarAppearance(); @@ -281,8 +290,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests TestHelpers.InMethod(); // log4net.Config.XmlConfigurator.Configure(); + Scene scene = CreateDefaultTestScene(); UserAccountHelpers.CreateUserWithInventory(scene, m_userId); - InventoryItemBase attItem = CreateAttachmentItem(m_userId, "att", 0x10, 0x20); + InventoryItemBase attItem = CreateAttachmentItem(scene, m_userId, "att", 0x10, 0x20); AgentCircuitData acd = SceneHelpers.GenerateAgentData(m_userId); acd.Appearance = new AvatarAppearance(); @@ -314,8 +324,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests { TestHelpers.InMethod(); + Scene scene = CreateDefaultTestScene(); UserAccountHelpers.CreateUserWithInventory(scene, m_userId); - InventoryItemBase attItem = CreateAttachmentItem(m_userId, "att", 0x10, 0x20); + InventoryItemBase attItem = CreateAttachmentItem(scene, m_userId, "att", 0x10, 0x20); AgentCircuitData acd = SceneHelpers.GenerateAgentData(m_userId); acd.Appearance = new AvatarAppearance(); @@ -332,6 +343,92 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests Assert.That(attSo.RootPart.AttachedPos, Is.EqualTo(newPosition)); } + [Test] + public void TestSameSimulatorNeighbouringRegionsTeleport() + { + TestHelpers.InMethod(); +// TestHelpers.EnableLogging(); + + AttachmentsModule attModA = new AttachmentsModule(); + AttachmentsModule attModB = new AttachmentsModule(); + EntityTransferModule etmA = new EntityTransferModule(); + EntityTransferModule etmB = new EntityTransferModule(); + LocalSimulationConnectorModule lscm = new LocalSimulationConnectorModule(); + + IConfigSource config = new IniConfigSource(); + IConfig modulesConfig = config.AddConfig("Modules"); + modulesConfig.Set("EntityTransferModule", etmA.Name); + modulesConfig.Set("SimulationServices", lscm.Name); + IConfig entityTransferConfig = config.AddConfig("EntityTransfer"); + + // In order to run a single threaded regression test we do not want the entity transfer module waiting + // for a callback from the destination scene before removing its avatar data. + entityTransferConfig.Set("wait_for_callback", false); + + SceneHelpers sh = new SceneHelpers(); + TestScene sceneA = sh.SetupScene("sceneA", TestHelpers.ParseTail(0x100), 1000, 1000); + TestScene sceneB = sh.SetupScene("sceneB", TestHelpers.ParseTail(0x200), 1001, 1000); + + SceneHelpers.SetupSceneModules(new Scene[] { sceneA, sceneB }, config, lscm); + SceneHelpers.SetupSceneModules( + sceneA, config, new CapabilitiesModule(), etmA, attModA, new BasicInventoryAccessModule()); + SceneHelpers.SetupSceneModules( + sceneB, config, new CapabilitiesModule(), etmB, attModB, new BasicInventoryAccessModule()); + + UserAccountHelpers.CreateUserWithInventory(sceneA, m_userId); + ScenePresence beforeTeleportSp = SceneHelpers.AddScenePresence(sceneA, m_userId, sh.SceneManager); + beforeTeleportSp.AbsolutePosition = new Vector3(30, 31, 32); + + InventoryItemBase attItem = CreateAttachmentItem(sceneA, m_userId, "att", 0x10, 0x20); + + m_attMod.RezSingleAttachmentFromInventory( + beforeTeleportSp, attItem.ID, (uint)AttachmentPoint.Chest); + + Vector3 teleportPosition = new Vector3(10, 11, 12); + Vector3 teleportLookAt = new Vector3(20, 21, 22); + + sceneA.RequestTeleportLocation( + beforeTeleportSp.ControllingClient, + sceneB.RegionInfo.RegionHandle, + teleportPosition, + teleportLookAt, + (uint)TeleportFlags.ViaLocation); + + ((TestClient)beforeTeleportSp.ControllingClient).CompleteTeleportClientSide(); + + // Check attachments have made it into sceneB + ScenePresence afterTeleportSceneBSp = sceneB.GetScenePresence(m_userId); + + // This is appearance data, as opposed to actually rezzed attachments + List sceneBAttachments = afterTeleportSceneBSp.Appearance.GetAttachments(); + Assert.That(sceneBAttachments.Count, Is.EqualTo(1)); + Assert.That(sceneBAttachments[0].AttachPoint, Is.EqualTo((int)AttachmentPoint.Chest)); + Assert.That(sceneBAttachments[0].ItemID, Is.EqualTo(attItem.ID)); + Assert.That(sceneBAttachments[0].AssetID, Is.EqualTo(attItem.AssetID)); + Assert.That(afterTeleportSceneBSp.Appearance.GetAttachpoint(attItem.ID), Is.EqualTo((int)AttachmentPoint.Chest)); + + // This is the actual attachment + List actualSceneBAttachments = afterTeleportSceneBSp.GetAttachments(); + Assert.That(actualSceneBAttachments.Count, Is.EqualTo(1)); + SceneObjectGroup actualSceneBAtt = actualSceneBAttachments[0]; + Assert.That(actualSceneBAtt.Name, Is.EqualTo(attItem.Name)); + Assert.That(actualSceneBAtt.AttachmentPoint, Is.EqualTo((uint)AttachmentPoint.Chest)); + + // Check attachments have been removed from sceneA + ScenePresence afterTeleportSceneASp = sceneA.GetScenePresence(m_userId); + + // Since this is appearance data, it is still present on the child avatar! + List sceneAAttachments = afterTeleportSceneASp.Appearance.GetAttachments(); + Assert.That(sceneAAttachments.Count, Is.EqualTo(1)); + Assert.That(afterTeleportSceneASp.Appearance.GetAttachpoint(attItem.ID), Is.EqualTo((int)AttachmentPoint.Chest)); + + // This is the actual attachment, which should no longer exist + List actualSceneAAttachments = afterTeleportSceneASp.GetAttachments(); + Assert.That(actualSceneAAttachments.Count, Is.EqualTo(0)); + +// TestHelpers.DisableLogging(); + } + // I'm commenting this test because scene setup NEEDS InventoryService to // be non-null //[Test] diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs index f5ebe970c2..46738f687d 100644 --- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs +++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs @@ -709,6 +709,11 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer agent.CallbackURI, region.RegionName); } + /// + /// Clean up operations once an agent has moved away through cross or teleport. + /// + /// + /// protected virtual void AgentHasMovedAway(ScenePresence sp, bool logout) { if (sp.Scene.AttachmentsModule != null) From 4329cc7b8a698acc6154f3e195c6261c61014916 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Tue, 26 Jun 2012 22:21:54 +0100 Subject: [PATCH 437/547] refactor: make m_presence a local variable in all AttachmentsModuleTests since it doesn't need to be global and some tests set up more than one sp --- .../Tests/AttachmentsModuleTests.cs | 51 +++++++++---------- 1 file changed, 25 insertions(+), 26 deletions(-) diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs index 695994fe68..4c750bc6e6 100644 --- a/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs +++ b/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs @@ -57,7 +57,6 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests public class AttachmentsModuleTests { private AttachmentsModule m_attMod; - private ScenePresence m_presence; /// /// Standard user ID @@ -136,17 +135,17 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests Scene scene = CreateDefaultTestScene(); UserAccountHelpers.CreateUserWithInventory(scene, m_userId); - m_presence = SceneHelpers.AddScenePresence(scene, m_userId); + ScenePresence sp = SceneHelpers.AddScenePresence(scene, m_userId); string attName = "att"; - SceneObjectGroup so = SceneHelpers.AddSceneObject(scene, attName, m_presence.UUID).ParentGroup; + SceneObjectGroup so = SceneHelpers.AddSceneObject(scene, attName, sp.UUID).ParentGroup; - m_attMod.AttachObject(m_presence, so, (uint)AttachmentPoint.Chest, false); + m_attMod.AttachObject(sp, so, (uint)AttachmentPoint.Chest, false); // Check status on scene presence - Assert.That(m_presence.HasAttachments(), Is.True); - List attachments = m_presence.GetAttachments(); + Assert.That(sp.HasAttachments(), Is.True); + List attachments = sp.GetAttachments(); Assert.That(attachments.Count, Is.EqualTo(1)); SceneObjectGroup attSo = attachments[0]; Assert.That(attSo.Name, Is.EqualTo(attName)); @@ -157,14 +156,14 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests // Check item status Assert.That( - m_presence.Appearance.GetAttachpoint(attSo.FromItemID), + sp.Appearance.GetAttachpoint(attSo.FromItemID), Is.EqualTo((int)AttachmentPoint.Chest)); InventoryItemBase attachmentItem = scene.InventoryService.GetItem(new InventoryItemBase(attSo.FromItemID)); Assert.That(attachmentItem, Is.Not.Null); Assert.That(attachmentItem.Name, Is.EqualTo(attName)); - InventoryFolderBase targetFolder = scene.InventoryService.GetFolderForType(m_presence.UUID, AssetType.Object); + InventoryFolderBase targetFolder = scene.InventoryService.GetFolderForType(sp.UUID, AssetType.Object); Assert.That(attachmentItem.Folder, Is.EqualTo(targetFolder.ID)); // TestHelpers.DisableLogging(); @@ -178,16 +177,16 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests Scene scene = CreateDefaultTestScene(); UserAccountHelpers.CreateUserWithInventory(scene, m_userId); - m_presence = SceneHelpers.AddScenePresence(scene, m_userId); + ScenePresence sp = SceneHelpers.AddScenePresence(scene, m_userId); InventoryItemBase attItem = CreateAttachmentItem(scene, m_userId, "att", 0x10, 0x20); m_attMod.RezSingleAttachmentFromInventory( - m_presence, attItem.ID, (uint)AttachmentPoint.Chest); + sp, attItem.ID, (uint)AttachmentPoint.Chest); // Check scene presence status - Assert.That(m_presence.HasAttachments(), Is.True); - List attachments = m_presence.GetAttachments(); + Assert.That(sp.HasAttachments(), Is.True); + List attachments = sp.GetAttachments(); Assert.That(attachments.Count, Is.EqualTo(1)); SceneObjectGroup attSo = attachments[0]; Assert.That(attSo.Name, Is.EqualTo(attItem.Name)); @@ -197,8 +196,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests Assert.That(attSo.IsTemporary, Is.False); // Check appearance status - Assert.That(m_presence.Appearance.GetAttachments().Count, Is.EqualTo(1)); - Assert.That(m_presence.Appearance.GetAttachpoint(attItem.ID), Is.EqualTo((int)AttachmentPoint.Chest)); + Assert.That(sp.Appearance.GetAttachments().Count, Is.EqualTo(1)); + Assert.That(sp.Appearance.GetAttachpoint(attItem.ID), Is.EqualTo((int)AttachmentPoint.Chest)); } [Test] @@ -209,22 +208,22 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests Scene scene = CreateDefaultTestScene(); UserAccountHelpers.CreateUserWithInventory(scene, m_userId); - m_presence = SceneHelpers.AddScenePresence(scene, m_userId); + ScenePresence sp = SceneHelpers.AddScenePresence(scene, m_userId); InventoryItemBase attItem = CreateAttachmentItem(scene, m_userId, "att", 0x10, 0x20); ISceneEntity so = m_attMod.RezSingleAttachmentFromInventory( - m_presence, attItem.ID, (uint)AttachmentPoint.Chest); - m_attMod.DetachSingleAttachmentToGround(m_presence, so.LocalId); + sp, attItem.ID, (uint)AttachmentPoint.Chest); + m_attMod.DetachSingleAttachmentToGround(sp, so.LocalId); // Check scene presence status - Assert.That(m_presence.HasAttachments(), Is.False); - List attachments = m_presence.GetAttachments(); + Assert.That(sp.HasAttachments(), Is.False); + List attachments = sp.GetAttachments(); Assert.That(attachments.Count, Is.EqualTo(0)); // Check appearance status - Assert.That(m_presence.Appearance.GetAttachments().Count, Is.EqualTo(0)); + Assert.That(sp.Appearance.GetAttachments().Count, Is.EqualTo(0)); // Check item status Assert.That(scene.InventoryService.GetItem(new InventoryItemBase(attItem.ID)), Is.Null); @@ -241,21 +240,21 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests Scene scene = CreateDefaultTestScene(); UserAccountHelpers.CreateUserWithInventory(scene, m_userId); - m_presence = SceneHelpers.AddScenePresence(scene, m_userId); + ScenePresence sp = SceneHelpers.AddScenePresence(scene, m_userId); InventoryItemBase attItem = CreateAttachmentItem(scene, m_userId, "att", 0x10, 0x20); m_attMod.RezSingleAttachmentFromInventory( - m_presence, attItem.ID, (uint)AttachmentPoint.Chest); - m_attMod.DetachSingleAttachmentToInv(m_presence, attItem.ID); + sp, attItem.ID, (uint)AttachmentPoint.Chest); + m_attMod.DetachSingleAttachmentToInv(sp, attItem.ID); // Check status on scene presence - Assert.That(m_presence.HasAttachments(), Is.False); - List attachments = m_presence.GetAttachments(); + Assert.That(sp.HasAttachments(), Is.False); + List attachments = sp.GetAttachments(); Assert.That(attachments.Count, Is.EqualTo(0)); // Check item status - Assert.That(m_presence.Appearance.GetAttachpoint(attItem.ID), Is.EqualTo(0)); + Assert.That(sp.Appearance.GetAttachpoint(attItem.ID), Is.EqualTo(0)); } /// From 2b82c421adf23cc47e1dc4f6da941b7cd2a407b6 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Tue, 26 Jun 2012 22:31:25 +0100 Subject: [PATCH 438/547] refactor: Use local attachment module variables instead of global m_attMod. This also avoids confusion between tests where one sets up m_attMod and another accidentally uses it after failing to set one up itself. --- .../Tests/AttachmentsModuleTests.cs | 21 +++++++++---------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs index 4c750bc6e6..d233faf149 100644 --- a/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs +++ b/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs @@ -56,8 +56,6 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests [TestFixture] public class AttachmentsModuleTests { - private AttachmentsModule m_attMod; - /// /// Standard user ID /// @@ -95,8 +93,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests config.Configs["Modules"].Set("InventoryAccessModule", "BasicInventoryAccessModule"); Scene scene = new SceneHelpers().SetupScene(); - m_attMod = new AttachmentsModule(); - SceneHelpers.SetupSceneModules(scene, config, m_attMod, new BasicInventoryAccessModule()); + SceneHelpers.SetupSceneModules(scene, config, new AttachmentsModule(), new BasicInventoryAccessModule()); return scene; } @@ -141,7 +138,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests SceneObjectGroup so = SceneHelpers.AddSceneObject(scene, attName, sp.UUID).ParentGroup; - m_attMod.AttachObject(sp, so, (uint)AttachmentPoint.Chest, false); + scene.AttachmentsModule.AttachObject(sp, so, (uint)AttachmentPoint.Chest, false); // Check status on scene presence Assert.That(sp.HasAttachments(), Is.True); @@ -181,7 +178,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests InventoryItemBase attItem = CreateAttachmentItem(scene, m_userId, "att", 0x10, 0x20); - m_attMod.RezSingleAttachmentFromInventory( + scene.AttachmentsModule.RezSingleAttachmentFromInventory( sp, attItem.ID, (uint)AttachmentPoint.Chest); // Check scene presence status @@ -213,9 +210,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests InventoryItemBase attItem = CreateAttachmentItem(scene, m_userId, "att", 0x10, 0x20); ISceneEntity so - = m_attMod.RezSingleAttachmentFromInventory( + = scene.AttachmentsModule.RezSingleAttachmentFromInventory( sp, attItem.ID, (uint)AttachmentPoint.Chest); - m_attMod.DetachSingleAttachmentToGround(sp, so.LocalId); + scene.AttachmentsModule.DetachSingleAttachmentToGround(sp, so.LocalId); // Check scene presence status Assert.That(sp.HasAttachments(), Is.False); @@ -244,9 +241,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests InventoryItemBase attItem = CreateAttachmentItem(scene, m_userId, "att", 0x10, 0x20); - m_attMod.RezSingleAttachmentFromInventory( + scene.AttachmentsModule.RezSingleAttachmentFromInventory( sp, attItem.ID, (uint)AttachmentPoint.Chest); - m_attMod.DetachSingleAttachmentToInv(sp, attItem.ID); + scene.AttachmentsModule.DetachSingleAttachmentToInv(sp, attItem.ID); // Check status on scene presence Assert.That(sp.HasAttachments(), Is.False); @@ -364,6 +361,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests // for a callback from the destination scene before removing its avatar data. entityTransferConfig.Set("wait_for_callback", false); + modulesConfig.Set("InventoryAccessModule", "BasicInventoryAccessModule"); + SceneHelpers sh = new SceneHelpers(); TestScene sceneA = sh.SetupScene("sceneA", TestHelpers.ParseTail(0x100), 1000, 1000); TestScene sceneB = sh.SetupScene("sceneB", TestHelpers.ParseTail(0x200), 1001, 1000); @@ -380,7 +379,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests InventoryItemBase attItem = CreateAttachmentItem(sceneA, m_userId, "att", 0x10, 0x20); - m_attMod.RezSingleAttachmentFromInventory( + sceneA.AttachmentsModule.RezSingleAttachmentFromInventory( beforeTeleportSp, attItem.ID, (uint)AttachmentPoint.Chest); Vector3 teleportPosition = new Vector3(10, 11, 12); From 99954c14980817adae427ab8ac4cdf07cbad0d7d Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Tue, 26 Jun 2012 22:53:08 +0100 Subject: [PATCH 439/547] refactor: Remove unnecessary AttachmentModuleTests.m_userId in favour of local variables --- .../Tests/AttachmentsModuleTests.cs | 66 ++++++++----------- .../Common/Helpers/UserAccountHelpers.cs | 5 ++ 2 files changed, 31 insertions(+), 40 deletions(-) diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs index d233faf149..ddfc6cb004 100644 --- a/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs +++ b/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs @@ -45,6 +45,7 @@ using OpenSim.Region.CoreModules.World.Serialiser; using OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation; using OpenSim.Region.Framework.Scenes; using OpenSim.Region.Framework.Interfaces; +using OpenSim.Services.Interfaces; using OpenSim.Tests.Common; using OpenSim.Tests.Common.Mock; @@ -56,21 +57,6 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests [TestFixture] public class AttachmentsModuleTests { - /// - /// Standard user ID - /// - private UUID m_userId = TestHelpers.ParseTail(0x1); - -// /// -// /// Standard attachment item ID -// /// -// private UUID m_attItemId = TestHelpers.ParseTail(0x10); -// -// /// -// /// Standard attachment asset ID -// /// -// private UUID m_attAssetId = TestHelpers.ParseTail(0x11); - [TestFixtureSetUp] public void FixtureInit() { @@ -131,8 +117,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests // TestHelpers.EnableLogging(); Scene scene = CreateDefaultTestScene(); - UserAccountHelpers.CreateUserWithInventory(scene, m_userId); - ScenePresence sp = SceneHelpers.AddScenePresence(scene, m_userId); + UserAccount ua1 = UserAccountHelpers.CreateUserWithInventory(scene, 0x1); + ScenePresence sp = SceneHelpers.AddScenePresence(scene, ua1.PrincipalID); string attName = "att"; @@ -173,10 +159,10 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests // log4net.Config.XmlConfigurator.Configure(); Scene scene = CreateDefaultTestScene(); - UserAccountHelpers.CreateUserWithInventory(scene, m_userId); - ScenePresence sp = SceneHelpers.AddScenePresence(scene, m_userId); + UserAccount ua1 = UserAccountHelpers.CreateUserWithInventory(scene, 0x1); + ScenePresence sp = SceneHelpers.AddScenePresence(scene, ua1.PrincipalID); - InventoryItemBase attItem = CreateAttachmentItem(scene, m_userId, "att", 0x10, 0x20); + InventoryItemBase attItem = CreateAttachmentItem(scene, ua1.PrincipalID, "att", 0x10, 0x20); scene.AttachmentsModule.RezSingleAttachmentFromInventory( sp, attItem.ID, (uint)AttachmentPoint.Chest); @@ -204,10 +190,10 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests // log4net.Config.XmlConfigurator.Configure(); Scene scene = CreateDefaultTestScene(); - UserAccountHelpers.CreateUserWithInventory(scene, m_userId); - ScenePresence sp = SceneHelpers.AddScenePresence(scene, m_userId); + UserAccount ua1 = UserAccountHelpers.CreateUserWithInventory(scene, 0x1); + ScenePresence sp = SceneHelpers.AddScenePresence(scene, ua1.PrincipalID); - InventoryItemBase attItem = CreateAttachmentItem(scene, m_userId, "att", 0x10, 0x20); + InventoryItemBase attItem = CreateAttachmentItem(scene, ua1.PrincipalID, "att", 0x10, 0x20); ISceneEntity so = scene.AttachmentsModule.RezSingleAttachmentFromInventory( @@ -236,10 +222,10 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests // log4net.Config.XmlConfigurator.Configure(); Scene scene = CreateDefaultTestScene(); - UserAccountHelpers.CreateUserWithInventory(scene, m_userId); - ScenePresence sp = SceneHelpers.AddScenePresence(scene, m_userId); + UserAccount ua1 = UserAccountHelpers.CreateUserWithInventory(scene, 0x1); + ScenePresence sp = SceneHelpers.AddScenePresence(scene, ua1.PrincipalID); - InventoryItemBase attItem = CreateAttachmentItem(scene, m_userId, "att", 0x10, 0x20); + InventoryItemBase attItem = CreateAttachmentItem(scene, ua1.PrincipalID, "att", 0x10, 0x20); scene.AttachmentsModule.RezSingleAttachmentFromInventory( sp, attItem.ID, (uint)AttachmentPoint.Chest); @@ -264,10 +250,10 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests // log4net.Config.XmlConfigurator.Configure(); Scene scene = CreateDefaultTestScene(); - UserAccountHelpers.CreateUserWithInventory(scene, m_userId); - InventoryItemBase attItem = CreateAttachmentItem(scene, m_userId, "att", 0x10, 0x20); + UserAccount ua1 = UserAccountHelpers.CreateUserWithInventory(scene, 0x1); + InventoryItemBase attItem = CreateAttachmentItem(scene, ua1.PrincipalID, "att", 0x10, 0x20); - AgentCircuitData acd = SceneHelpers.GenerateAgentData(m_userId); + AgentCircuitData acd = SceneHelpers.GenerateAgentData(ua1.PrincipalID); acd.Appearance = new AvatarAppearance(); acd.Appearance.SetAttachment((int)AttachmentPoint.Chest, attItem.ID, attItem.AssetID); ScenePresence presence = SceneHelpers.AddScenePresence(scene, acd); @@ -287,10 +273,10 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests // log4net.Config.XmlConfigurator.Configure(); Scene scene = CreateDefaultTestScene(); - UserAccountHelpers.CreateUserWithInventory(scene, m_userId); - InventoryItemBase attItem = CreateAttachmentItem(scene, m_userId, "att", 0x10, 0x20); + UserAccount ua1 = UserAccountHelpers.CreateUserWithInventory(scene, 0x1); + InventoryItemBase attItem = CreateAttachmentItem(scene, ua1.PrincipalID, "att", 0x10, 0x20); - AgentCircuitData acd = SceneHelpers.GenerateAgentData(m_userId); + AgentCircuitData acd = SceneHelpers.GenerateAgentData(ua1.PrincipalID); acd.Appearance = new AvatarAppearance(); acd.Appearance.SetAttachment((int)AttachmentPoint.Chest, attItem.ID, attItem.AssetID); ScenePresence presence = SceneHelpers.AddScenePresence(scene, acd); @@ -321,10 +307,10 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests TestHelpers.InMethod(); Scene scene = CreateDefaultTestScene(); - UserAccountHelpers.CreateUserWithInventory(scene, m_userId); - InventoryItemBase attItem = CreateAttachmentItem(scene, m_userId, "att", 0x10, 0x20); + UserAccount ua1 = UserAccountHelpers.CreateUserWithInventory(scene, 0x1); + InventoryItemBase attItem = CreateAttachmentItem(scene, ua1.PrincipalID, "att", 0x10, 0x20); - AgentCircuitData acd = SceneHelpers.GenerateAgentData(m_userId); + AgentCircuitData acd = SceneHelpers.GenerateAgentData(ua1.PrincipalID); acd.Appearance = new AvatarAppearance(); acd.Appearance.SetAttachment((int)AttachmentPoint.Chest, attItem.ID, attItem.AssetID); ScenePresence sp = SceneHelpers.AddScenePresence(scene, acd); @@ -373,11 +359,11 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests SceneHelpers.SetupSceneModules( sceneB, config, new CapabilitiesModule(), etmB, attModB, new BasicInventoryAccessModule()); - UserAccountHelpers.CreateUserWithInventory(sceneA, m_userId); - ScenePresence beforeTeleportSp = SceneHelpers.AddScenePresence(sceneA, m_userId, sh.SceneManager); + UserAccount ua1 = UserAccountHelpers.CreateUserWithInventory(sceneA, 0x1); + ScenePresence beforeTeleportSp = SceneHelpers.AddScenePresence(sceneA, ua1.PrincipalID, sh.SceneManager); beforeTeleportSp.AbsolutePosition = new Vector3(30, 31, 32); - InventoryItemBase attItem = CreateAttachmentItem(sceneA, m_userId, "att", 0x10, 0x20); + InventoryItemBase attItem = CreateAttachmentItem(sceneA, ua1.PrincipalID, "att", 0x10, 0x20); sceneA.AttachmentsModule.RezSingleAttachmentFromInventory( beforeTeleportSp, attItem.ID, (uint)AttachmentPoint.Chest); @@ -395,7 +381,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests ((TestClient)beforeTeleportSp.ControllingClient).CompleteTeleportClientSide(); // Check attachments have made it into sceneB - ScenePresence afterTeleportSceneBSp = sceneB.GetScenePresence(m_userId); + ScenePresence afterTeleportSceneBSp = sceneB.GetScenePresence(ua1.PrincipalID); // This is appearance data, as opposed to actually rezzed attachments List sceneBAttachments = afterTeleportSceneBSp.Appearance.GetAttachments(); @@ -413,7 +399,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests Assert.That(actualSceneBAtt.AttachmentPoint, Is.EqualTo((uint)AttachmentPoint.Chest)); // Check attachments have been removed from sceneA - ScenePresence afterTeleportSceneASp = sceneA.GetScenePresence(m_userId); + ScenePresence afterTeleportSceneASp = sceneA.GetScenePresence(ua1.PrincipalID); // Since this is appearance data, it is still present on the child avatar! List sceneAAttachments = afterTeleportSceneASp.Appearance.GetAttachments(); diff --git a/OpenSim/Tests/Common/Helpers/UserAccountHelpers.cs b/OpenSim/Tests/Common/Helpers/UserAccountHelpers.cs index b73df2ca4c..3d3e65c58c 100644 --- a/OpenSim/Tests/Common/Helpers/UserAccountHelpers.cs +++ b/OpenSim/Tests/Common/Helpers/UserAccountHelpers.cs @@ -126,6 +126,11 @@ namespace OpenSim.Tests.Common return CreateUserWithInventory(scene, "Bill", "Bailey", userId, "troll"); } + public static UserAccount CreateUserWithInventory(Scene scene, int userId) + { + return CreateUserWithInventory(scene, "Bill", "Bailey", TestHelpers.ParseTail(userId), "troll"); + } + public static UserAccount CreateUserWithInventory( Scene scene, string firstName, string lastName, UUID userId, string pw) { From 25245179868990b07d4431e2dc2e800a4de372e5 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Tue, 26 Jun 2012 22:54:41 +0100 Subject: [PATCH 440/547] minor: correct GridService "show regions" cibsike cinnabd usage statement --- OpenSim/Services/GridService/GridService.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Services/GridService/GridService.cs b/OpenSim/Services/GridService/GridService.cs index 842a6979a9..36cd573c6b 100644 --- a/OpenSim/Services/GridService/GridService.cs +++ b/OpenSim/Services/GridService/GridService.cs @@ -98,7 +98,7 @@ namespace OpenSim.Services.GridService if (MainConsole.Instance.Commands.Resolve(new string[] { "show", "regions" }).Length == 0) MainConsole.Instance.Commands.AddCommand("Regions", true, "show regions", - "show all regions", + "show regions", "Show details on all regions", String.Empty, HandleShowRegions); From 97437feb06060fa58f8209e32c362bfe91c279f5 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Tue, 26 Jun 2012 23:05:10 +0100 Subject: [PATCH 441/547] Show region positions in "show regions" robust console command --- OpenSim/Services/GridService/GridService.cs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/OpenSim/Services/GridService/GridService.cs b/OpenSim/Services/GridService/GridService.cs index 36cd573c6b..aab403a203 100644 --- a/OpenSim/Services/GridService/GridService.cs +++ b/OpenSim/Services/GridService/GridService.cs @@ -650,13 +650,19 @@ namespace OpenSim.Services.GridService ConsoleDisplayTable dispTable = new ConsoleDisplayTable(); dispTable.AddColumn("Name", 16); dispTable.AddColumn("ID", 36); + dispTable.AddColumn("Position", 11); dispTable.AddColumn("Owner ID", 36); dispTable.AddColumn("Flags", 60); foreach (RegionData r in regions) { OpenSim.Data.RegionFlags flags = (OpenSim.Data.RegionFlags)Convert.ToInt32(r.Data["flags"]); - dispTable.AddRow(r.RegionName, r.RegionID.ToString(), r.Data["owner_uuid"].ToString(), flags.ToString()); + dispTable.AddRow( + r.RegionName, + r.RegionID.ToString(), + string.Format("{0},{1}", r.coordX, r.coordY), + r.Data["owner_uuid"].ToString(), + flags.ToString()); } MainConsole.Instance.Output(dispTable.ToString()); From 0b298777907d29027336813d84e589f0cb78419b Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Tue, 26 Jun 2012 23:15:15 +0100 Subject: [PATCH 442/547] Fix output for help on some object region console commands --- .../World/Objects/Commands/ObjectCommandsModule.cs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/OpenSim/Region/CoreModules/World/Objects/Commands/ObjectCommandsModule.cs b/OpenSim/Region/CoreModules/World/Objects/Commands/ObjectCommandsModule.cs index 830d9cbc1b..e5cd3e2133 100644 --- a/OpenSim/Region/CoreModules/World/Objects/Commands/ObjectCommandsModule.cs +++ b/OpenSim/Region/CoreModules/World/Objects/Commands/ObjectCommandsModule.cs @@ -98,7 +98,8 @@ namespace OpenSim.Region.CoreModules.World.Objects.Commands m_console.Commands.AddCommand( "Objects", false, "delete object name", "delete object name [--regex] ", - "Delete a scene object by name.\nIf --regex is specified then the name is treatead as a regular expression", + "Delete a scene object by name.", + "If --regex is specified then the name is treatead as a regular expression", HandleDeleteObject); m_console.Commands.AddCommand( @@ -118,7 +119,8 @@ namespace OpenSim.Region.CoreModules.World.Objects.Commands false, "show object name", "show object name [--regex] ", - "Show details of scene objects with the given name.\nIf --regex is specified then the name is treatead as a regular expression", + "Show details of scene objects with the given name.", + "If --regex is specified then the name is treatead as a regular expression", HandleShowObjectByName); m_console.Commands.AddCommand( @@ -133,7 +135,8 @@ namespace OpenSim.Region.CoreModules.World.Objects.Commands false, "show part name", "show part name [--regex] ", - "Show details of scene object parts with the given name.\nIf --regex is specified then the name is treatead as a regular expression", + "Show details of scene object parts with the given name.", + "If --regex is specified then the name is treatead as a regular expression", HandleShowPartByName); } From 87ca820f9bc19fc1f8c7b88a87bdef59e0a5bd0b Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Tue, 26 Jun 2012 23:28:48 +0100 Subject: [PATCH 443/547] Replace "kill uuid" console command with the more consistent "delete object uuid", which was present in the last opensim release. --- OpenSim/Region/Application/OpenSim.cs | 56 --------------------------- 1 file changed, 56 deletions(-) diff --git a/OpenSim/Region/Application/OpenSim.cs b/OpenSim/Region/Application/OpenSim.cs index 04ff4e62e6..56ad5c9e47 100644 --- a/OpenSim/Region/Application/OpenSim.cs +++ b/OpenSim/Region/Application/OpenSim.cs @@ -409,10 +409,6 @@ namespace OpenSim m_console.Commands.AddCommand("General", false, "modules unload", "modules unload ", "Unload a module", HandleModules); - - m_console.Commands.AddCommand("Objects", false, "kill uuid", - "kill uuid ", - "Kill an object by UUID", KillUUID); } public override void ShutdownSpecific() @@ -1309,58 +1305,6 @@ namespace OpenSim return result; } - /// - /// Kill an object given its UUID. - /// - /// - protected void KillUUID(string module, string[] cmdparams) - { - if (cmdparams.Length > 2) - { - UUID id = UUID.Zero; - SceneObjectGroup grp = null; - Scene sc = null; - - if (!UUID.TryParse(cmdparams[2], out id)) - { - MainConsole.Instance.Output("[KillUUID]: Error bad UUID format!"); - return; - } - - m_sceneManager.ForEachScene( - delegate(Scene scene) - { - SceneObjectPart part = scene.GetSceneObjectPart(id); - if (part == null) - return; - - grp = part.ParentGroup; - sc = scene; - }); - - if (grp == null) - { - MainConsole.Instance.Output(String.Format("[KillUUID]: Given UUID {0} not found!", id)); - } - else - { - MainConsole.Instance.Output(String.Format("[KillUUID]: Found UUID {0} in scene {1}", id, sc.RegionInfo.RegionName)); - try - { - sc.DeleteSceneObject(grp, false); - } - catch (Exception e) - { - m_log.ErrorFormat("[KillUUID]: Error while removing objects from scene: " + e); - } - } - } - else - { - MainConsole.Instance.Output("[KillUUID]: Usage: kill uuid "); - } - } - #endregion } } From 5bec5bcf714a94129070cf1b6219984496cbd6c2 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Wed, 27 Jun 2012 00:00:49 +0100 Subject: [PATCH 444/547] Automatically disable log4net before each regression test so that logging is confined to a single test if it's turned on. This involves making test classes inherit from a common OpenSimTestCase. This will be applied to more classes as required. --- .../Tests/AttachmentsModuleTests.cs | 4 +- .../Tests/InventoryArchiveTestCase.cs | 2 +- OpenSim/Tests/Common/OpenSimTestCase.cs | 46 +++++++++++++++++++ OpenSim/Tests/Common/TestHelpers.cs | 3 +- 4 files changed, 50 insertions(+), 5 deletions(-) create mode 100644 OpenSim/Tests/Common/OpenSimTestCase.cs diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs index ddfc6cb004..65722fe379 100644 --- a/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs +++ b/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs @@ -55,7 +55,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests /// Attachment tests /// [TestFixture] - public class AttachmentsModuleTests + public class AttachmentsModuleTests : OpenSimTestCase { [TestFixtureSetUp] public void FixtureInit() @@ -409,8 +409,6 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests // This is the actual attachment, which should no longer exist List actualSceneAAttachments = afterTeleportSceneASp.GetAttachments(); Assert.That(actualSceneAAttachments.Count, Is.EqualTo(0)); - -// TestHelpers.DisableLogging(); } // I'm commenting this test because scene setup NEEDS InventoryService to diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiveTestCase.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiveTestCase.cs index 90ae69d6ff..f9d4b785d6 100644 --- a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiveTestCase.cs +++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiveTestCase.cs @@ -48,7 +48,7 @@ using OpenSim.Tests.Common.Mock; namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests { [TestFixture] - public class InventoryArchiveTestCase + public class InventoryArchiveTestCase : OpenSimTestCase { protected ManualResetEvent mre = new ManualResetEvent(false); diff --git a/OpenSim/Tests/Common/OpenSimTestCase.cs b/OpenSim/Tests/Common/OpenSimTestCase.cs new file mode 100644 index 0000000000..8c40923017 --- /dev/null +++ b/OpenSim/Tests/Common/OpenSimTestCase.cs @@ -0,0 +1,46 @@ +/* + * Copyright (c) Contributors, http://opensimulator.org/ + * See CONTRIBUTORS.TXT for a full list of copyright holders. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the OpenSimulator Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using System; +using NUnit.Framework; + +namespace OpenSim.Tests.Common +{ + [TestFixture] + public class OpenSimTestCase + { + [SetUp] + public virtual void SetUp() + { +// TestHelpers.InMethod(); + // Disable logging for each test so that one where logging is enabled doesn't cause all subsequent tests + // to have logging on if it failed with an exception. + TestHelpers.DisableLogging(); + } + } +} + diff --git a/OpenSim/Tests/Common/TestHelpers.cs b/OpenSim/Tests/Common/TestHelpers.cs index d38d692ed6..30121fef6a 100644 --- a/OpenSim/Tests/Common/TestHelpers.cs +++ b/OpenSim/Tests/Common/TestHelpers.cs @@ -58,7 +58,7 @@ namespace OpenSim.Tests.Common ")); - private static Stream DisableLoggingConfigStream + private static MemoryStream DisableLoggingConfigStream = new MemoryStream( Encoding.UTF8.GetBytes( // "")); @@ -109,6 +109,7 @@ namespace OpenSim.Tests.Common public static void DisableLogging() { log4net.Config.XmlConfigurator.Configure(DisableLoggingConfigStream); + DisableLoggingConfigStream.Position = 0; } /// From d0432133172f4147f7401f214c703611978423cd Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Wed, 27 Jun 2012 00:41:46 +0100 Subject: [PATCH 445/547] refactor: Move ScenePresence <-> AgentData attachments copying code into AttachmentsModule. --- .../Avatar/Attachments/AttachmentsModule.cs | 50 +++++++++++++++++++ .../Interfaces/IAttachmentsModule.cs | 14 ++++++ .../Framework/Interfaces/IScenePresence.cs | 6 +++ .../Region/Framework/Scenes/ScenePresence.cs | 41 ++------------- 4 files changed, 74 insertions(+), 37 deletions(-) diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs index 2b0e4ab5b3..4a7fbcee96 100644 --- a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs @@ -100,6 +100,56 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments #region IAttachmentsModule + public void CopyAttachments(IScenePresence sp, AgentData ad) + { + lock (sp.AttachmentsSyncLock) + { + // Attachment objects + List attachments = sp.GetAttachments(); + if (attachments.Count > 0) + { + ad.AttachmentObjects = new List(); + ad.AttachmentObjectStates = new List(); + // IScriptModule se = m_scene.RequestModuleInterface(); + sp.InTransitScriptStates.Clear(); + + foreach (SceneObjectGroup sog in attachments) + { + // We need to make a copy and pass that copy + // because of transfers withn the same sim + ISceneObject clone = sog.CloneForNewScene(); + // Attachment module assumes that GroupPosition holds the offsets...! + ((SceneObjectGroup)clone).RootPart.GroupPosition = sog.RootPart.AttachedPos; + ((SceneObjectGroup)clone).IsAttachment = false; + ad.AttachmentObjects.Add(clone); + string state = sog.GetStateSnapshot(); + ad.AttachmentObjectStates.Add(state); + sp.InTransitScriptStates.Add(state); + // Let's remove the scripts of the original object here + sog.RemoveScriptInstances(true); + } + } + } + } + + public void CopyAttachments(AgentData ad, IScenePresence sp) + { + if (ad.AttachmentObjects != null && ad.AttachmentObjects.Count > 0) + { + lock (sp.AttachmentsSyncLock) + sp.ClearAttachments(); + + int i = 0; + foreach (ISceneObject so in ad.AttachmentObjects) + { + ((SceneObjectGroup)so).LocalId = 0; + ((SceneObjectGroup)so).RootPart.ClearUpdateSchedule(); + so.SetState(ad.AttachmentObjectStates[i++], m_scene); + m_scene.IncomingCreateObject(Vector3.Zero, so); + } + } + } + /// /// RezAttachments. This should only be called upon login on the first region. /// Attachment rezzings on crossings and TPs are done in a different way. diff --git a/OpenSim/Region/Framework/Interfaces/IAttachmentsModule.cs b/OpenSim/Region/Framework/Interfaces/IAttachmentsModule.cs index fde5de1561..375d3345a2 100644 --- a/OpenSim/Region/Framework/Interfaces/IAttachmentsModule.cs +++ b/OpenSim/Region/Framework/Interfaces/IAttachmentsModule.cs @@ -35,6 +35,20 @@ namespace OpenSim.Region.Framework.Interfaces { public interface IAttachmentsModule { + /// + /// Copy attachment data from a ScenePresence into the AgentData structure for transmission to another simulator + /// + /// + /// + void CopyAttachments(IScenePresence sp, AgentData ad); + + /// + /// Copy attachment data from an AgentData structure into a ScenePresence. + /// + /// + /// + void CopyAttachments(AgentData ad, IScenePresence sp); + /// /// RezAttachments. This should only be called upon login on the first region. /// Attachment rezzings on crossings and TPs are done in a different way. diff --git a/OpenSim/Region/Framework/Interfaces/IScenePresence.cs b/OpenSim/Region/Framework/Interfaces/IScenePresence.cs index 5e43843faf..19a8236427 100644 --- a/OpenSim/Region/Framework/Interfaces/IScenePresence.cs +++ b/OpenSim/Region/Framework/Interfaces/IScenePresence.cs @@ -40,6 +40,12 @@ namespace OpenSim.Region.Framework.Interfaces /// public interface IScenePresence : ISceneAgent { + /// + /// Copy of the script states while the agent is in transit. This state may + /// need to be placed back in case of transfer fail. + /// + List InTransitScriptStates { get; } + /// /// The AttachmentsModule synchronizes on this to avoid race conditions between commands to add and remove attachments. /// diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index 909c7c86d7..c7a670f2c2 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs @@ -3084,31 +3084,8 @@ namespace OpenSim.Region.Framework.Scenes } catch { } - // Attachment objects - List attachments = GetAttachments(); - if (attachments.Count > 0) - { - cAgent.AttachmentObjects = new List(); - cAgent.AttachmentObjectStates = new List(); -// IScriptModule se = m_scene.RequestModuleInterface(); - InTransitScriptStates.Clear(); - - foreach (SceneObjectGroup sog in attachments) - { - // We need to make a copy and pass that copy - // because of transfers withn the same sim - ISceneObject clone = sog.CloneForNewScene(); - // Attachment module assumes that GroupPosition holds the offsets...! - ((SceneObjectGroup)clone).RootPart.GroupPosition = sog.RootPart.AttachedPos; - ((SceneObjectGroup)clone).IsAttachment = false; - cAgent.AttachmentObjects.Add(clone); - string state = sog.GetStateSnapshot(); - cAgent.AttachmentObjectStates.Add(state); - InTransitScriptStates.Add(state); - // Let's remove the scripts of the original object here - sog.RemoveScriptInstances(true); - } - } + if (Scene.AttachmentsModule != null) + Scene.AttachmentsModule.CopyAttachments(this, cAgent); } private void CopyFrom(AgentData cAgent) @@ -3178,18 +3155,8 @@ namespace OpenSim.Region.Framework.Scenes if (cAgent.Anims != null) Animator.Animations.FromArray(cAgent.Anims); - if (cAgent.AttachmentObjects != null && cAgent.AttachmentObjects.Count > 0) - { - m_attachments = new List(); - int i = 0; - foreach (ISceneObject so in cAgent.AttachmentObjects) - { - ((SceneObjectGroup)so).LocalId = 0; - ((SceneObjectGroup)so).RootPart.ClearUpdateSchedule(); - so.SetState(cAgent.AttachmentObjectStates[i++], m_scene); - m_scene.IncomingCreateObject(Vector3.Zero, so); - } - } + if (Scene.AttachmentsModule != null) + Scene.AttachmentsModule.CopyAttachments(cAgent, this); } public bool CopyAgent(out IAgentData agent) From bb48060b447a1b9c85f8652cd4bd177558d3bb0d Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Wed, 27 Jun 2012 00:50:36 +0100 Subject: [PATCH 446/547] Fix issue in InventoryArchiveTestCase where it didn't call down to OpenSimTestCase.SetUp() --- .../Inventory/Archiver/Tests/InventoryArchiveTestCase.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiveTestCase.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiveTestCase.cs index f9d4b785d6..1056865590 100644 --- a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiveTestCase.cs +++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiveTestCase.cs @@ -84,8 +84,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests protected string m_coaItemName = "Coalesced Item"; [SetUp] - public virtual void SetUp() + public override void SetUp() { + base.SetUp(); m_iarStream = new MemoryStream(m_iarStreamBytes); } From f9769a9fcb84a68622abe23160274796937ae0d4 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 28 Jun 2012 00:37:23 +0100 Subject: [PATCH 447/547] minor: reuse colon index calculation in XEngine.OnRezScript. The index if a colon is found on the first line will always be the same as for the whole script. --- OpenSim/Region/ScriptEngine/XEngine/XEngine.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs index 06ed9d6deb..73d384d098 100644 --- a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs +++ b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs @@ -768,12 +768,12 @@ namespace OpenSim.Region.ScriptEngine.XEngine int colon = firstline.IndexOf(':'); if (firstline.Length > 2 && firstline.Substring(0, 2) == "//" && colon != -1) { - string engineName = firstline.Substring(2, colon-2); + string engineName = firstline.Substring(2, colon - 2); if (names.Contains(engineName)) { engine = engineName; - script = "//" + script.Substring(script.IndexOf(':')+1); + script = "//" + script.Substring(colon + 1); } else { From 25baa2d894e9bbbb173eb4e6ebe1478d2e3c1265 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 28 Jun 2012 00:58:36 +0100 Subject: [PATCH 448/547] Avoid reporting false positives when a colon is in a comment in the first line of a script where the user was not trying to select a different script engine. This works by only posting the "Selected engine unavailable" message if we're falling back on XEngine and the language is one handled by XEngine. In cases where the language is not handled or not allowed, the user will still be notified by the later compiler error. This avoids the overwhelming majority of false positives where the first line contains a : for other reasons (e.g. source control systems, vim settings, etc.) Ultimately, I think it would be better to detect script language/engine with a mechanism that didn't just rely on : detection (e.g like #! in unix scripts). --- .../Region/ScriptEngine/XEngine/XEngine.cs | 54 +++++++++++++------ 1 file changed, 39 insertions(+), 15 deletions(-) diff --git a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs index 73d384d098..a709be34f6 100644 --- a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs +++ b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs @@ -779,24 +779,48 @@ namespace OpenSim.Region.ScriptEngine.XEngine { if (engine == ScriptEngineName) { - SceneObjectPart part = - m_Scene.GetSceneObjectPart( - localID); - - TaskInventoryItem item = - part.Inventory.GetInventoryItem(itemID); + // If we are falling back on XEngine as the default engine, then only complain to the user + // if a script language has been explicitly set and it's one that we recognize. If it's + // explicitly not allowed or the script is not in LSL then the user will be informed by a later compiler message. + // + // This avoids the overwhelming number of false positives where we're in this code because + // there's a colon in a comment in the first line of a script for entirely + // unrelated reasons (e.g. vim settings). + // + // TODO: A better fix would be to deprecate simple : detection and look for some less likely + // string to begin the comment (like #! in unix shell scripts). + bool scriptExplicitlyInXEngineLanguage = false; + string restOfScript = script.Substring(colon + 1); - ScenePresence presence = - m_Scene.GetScenePresence( - item.OwnerID); + // FIXME: These are hardcoded because they are currently hardcoded in Compiler.cs + if (restOfScript.StartsWith("c#") + || restOfScript.StartsWith("vb") + || restOfScript.StartsWith("lsl") + || restOfScript.StartsWith("js") + || restOfScript.StartsWith("yp")) + scriptExplicitlyInXEngineLanguage = true; - if (presence != null) + if (scriptExplicitlyInXEngineLanguage) { - presence.ControllingClient.SendAgentAlertMessage( - "Selected engine unavailable. "+ - "Running script on "+ - ScriptEngineName, - false); + SceneObjectPart part = + m_Scene.GetSceneObjectPart( + localID); + + TaskInventoryItem item = + part.Inventory.GetInventoryItem(itemID); + + ScenePresence presence = + m_Scene.GetScenePresence( + item.OwnerID); + + if (presence != null) + { + presence.ControllingClient.SendAgentAlertMessage( + "Selected engine unavailable. "+ + "Running script on "+ + ScriptEngineName, + false); + } } } } From 972b0b52f9acedf13114fbed2ec35bb63adeea79 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 28 Jun 2012 21:30:36 +0100 Subject: [PATCH 449/547] If rest of first line after colon is blank then still warn about running in XEngine if engine specified does not exist. This is to take account of situations where the user was intending to specify a script engine using colon using its default language. This probably generates few false positive as scripts are less likely to end a first line colon with a comment for other purposes. --- .../Region/ScriptEngine/XEngine/XEngine.cs | 27 ++++++++++++------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs index a709be34f6..35fac4e57a 100644 --- a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs +++ b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs @@ -780,27 +780,34 @@ namespace OpenSim.Region.ScriptEngine.XEngine if (engine == ScriptEngineName) { // If we are falling back on XEngine as the default engine, then only complain to the user - // if a script language has been explicitly set and it's one that we recognize. If it's + // if a script language has been explicitly set and it's one that we recognize or there are + // no non-whitespace characters after the colon. + // + // If the script is // explicitly not allowed or the script is not in LSL then the user will be informed by a later compiler message. // + // If the colon ends the line then we'll risk the false positive as this is more likely + // to signal a real scriptengine line where the user wants to use the default compile language. + // // This avoids the overwhelming number of false positives where we're in this code because // there's a colon in a comment in the first line of a script for entirely // unrelated reasons (e.g. vim settings). // // TODO: A better fix would be to deprecate simple : detection and look for some less likely // string to begin the comment (like #! in unix shell scripts). - bool scriptExplicitlyInXEngineLanguage = false; - string restOfScript = script.Substring(colon + 1); + bool warnRunningInXEngine = false; + string restOfFirstLine = firstline.Substring(colon + 1); // FIXME: These are hardcoded because they are currently hardcoded in Compiler.cs - if (restOfScript.StartsWith("c#") - || restOfScript.StartsWith("vb") - || restOfScript.StartsWith("lsl") - || restOfScript.StartsWith("js") - || restOfScript.StartsWith("yp")) - scriptExplicitlyInXEngineLanguage = true; + if (restOfFirstLine.StartsWith("c#") + || restOfFirstLine.StartsWith("vb") + || restOfFirstLine.StartsWith("lsl") + || restOfFirstLine.StartsWith("js") + || restOfFirstLine.StartsWith("yp") + || restOfFirstLine.Length == 0) + warnRunningInXEngine = true; - if (scriptExplicitlyInXEngineLanguage) + if (warnRunningInXEngine) { SceneObjectPart part = m_Scene.GetSceneObjectPart( From a1a22a2f1034a1feb67b141abf4b138248cdb356 Mon Sep 17 00:00:00 2001 From: Melanie Date: Thu, 28 Jun 2012 22:02:20 +0100 Subject: [PATCH 450/547] Revert "Mantis 5977 Corrections to llRegionSayTo" This reverts commit 679da63da617d031e5e7ae3f2d2a29db1a23ace3. Conflicts: OpenSim/Region/CoreModules/Avatar/Chat/ChatModule.cs --- OpenSim/Framework/OSChatMessage.cs | 20 ----- .../CoreModules/Avatar/Chat/ChatModule.cs | 50 ++++-------- .../Scripting/WorldComm/WorldCommModule.cs | 78 +++++++++---------- .../Region/Framework/Interfaces/IWorldComm.cs | 2 +- .../Framework/Scenes/Scene.PacketHandlers.cs | 26 +------ .../Shared/Api/Implementation/LSL_Api.cs | 10 +-- 6 files changed, 63 insertions(+), 123 deletions(-) diff --git a/OpenSim/Framework/OSChatMessage.cs b/OpenSim/Framework/OSChatMessage.cs index 455756db71..54fa2756d2 100644 --- a/OpenSim/Framework/OSChatMessage.cs +++ b/OpenSim/Framework/OSChatMessage.cs @@ -51,12 +51,10 @@ namespace OpenSim.Framework protected object m_senderObject; protected ChatTypeEnum m_type; protected UUID m_fromID; - protected UUID m_toID; public OSChatMessage() { m_position = new Vector3(); - m_toID = UUID.Zero; } /// @@ -104,15 +102,6 @@ namespace OpenSim.Framework set { m_from = value; } } - /// - /// The name of the sender (needed for scripts) - /// - public string To - { - get { return m_from; } - set { m_from = value; } - } - #region IEventArgs Members /// TODO: Sender and SenderObject should just be Sender and of @@ -142,15 +131,6 @@ namespace OpenSim.Framework set { m_fromID = value; } } - /// - /// The single recipient or all if not set. - /// - public UUID TargetUUID - { - get { return m_toID; } - set { m_toID = value; } - } - /// /// /// diff --git a/OpenSim/Region/CoreModules/Avatar/Chat/ChatModule.cs b/OpenSim/Region/CoreModules/Avatar/Chat/ChatModule.cs index 6ffc7e61ff..56498551c1 100644 --- a/OpenSim/Region/CoreModules/Avatar/Chat/ChatModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Chat/ChatModule.cs @@ -197,7 +197,6 @@ namespace OpenSim.Region.CoreModules.Avatar.Chat string fromName = c.From; string fromNamePrefix = ""; UUID fromID = UUID.Zero; - UUID targetID = c.TargetUUID; string message = c.Message; IScene scene = c.Scene; Vector3 fromPos = c.Position; @@ -236,31 +235,17 @@ namespace OpenSim.Region.CoreModules.Avatar.Chat message = message.Substring(0, 1000); // m_log.DebugFormat( -// "[CHAT]: DCTA: fromID {0} fromName {1}, region{2}, cType {3}, sType {4}, targetID {5}", -// fromID, fromName, scene.RegionInfo.RegionName, c.Type, sourceType, targetID); +// "[CHAT]: DCTA: fromID {0} fromName {1}, region{2}, cType {3}, sType {4}", +// fromID, fromName, scene.RegionInfo.RegionName, c.Type, sourceType); HashSet receiverIDs = new HashSet(); - + foreach (Scene s in m_scenes) { - if (targetID == UUID.Zero) - { - // This should use ForEachClient, but clients don't have a position. - // If camera is moved into client, then camera position can be used - s.ForEachRootScenePresence( - delegate(ScenePresence presence) - { - if (TrySendChatMessage(presence, fromPos, regionPos, fromID, fromName, c.Type, message, sourceType, false)) - receiverIDs.Add(presence.UUID); - } - ); - } - else - { - // This is a send to a specific client eg from llRegionSayTo - // no need to check distance etc, jand send is as say - ScenePresence presence = s.GetScenePresence(targetID); - if (presence != null && !presence.IsChildAgent) + // This should use ForEachClient, but clients don't have a position. + // If camera is moved into client, then camera position can be used + s.ForEachRootScenePresence( + delegate(ScenePresence presence) { ILandObject Presencecheck = s.LandChannel.GetLandObject(presence.AbsolutePosition.X, presence.AbsolutePosition.Y); if (Presencecheck != null) @@ -271,14 +256,14 @@ namespace OpenSim.Region.CoreModules.Avatar.Chat // objects on a parcel with access restrictions if (c.Sender == null || Presencecheck.IsEitherBannedOrRestricted(c.Sender.AgentId) != true) { - if (TrySendChatMessage(presence, fromPos, regionPos, fromID, fromNamePrefix + fromName, c.Type, message, sourceType, false)) + if (TrySendChatMessage(presence, fromPos, regionPos, fromID, fromNamePrefix + fromName, c.Type, message, sourceType)) receiverIDs.Add(presence.UUID); } } } - } + ); } - + (scene as Scene).EventManager.TriggerOnChatToClients( fromID, receiverIDs, message, c.Type, fromPos, fromName, sourceType, ChatAudibleLevel.Fully); } @@ -358,7 +343,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Chat /// precondition protected virtual bool TrySendChatMessage(ScenePresence presence, Vector3 fromPos, Vector3 regionPos, UUID fromAgentID, string fromName, ChatTypeEnum type, - string message, ChatSourceType src, bool ignoreDistance) + string message, ChatSourceType src) { // don't send stuff to child agents if (presence.IsChildAgent) return false; @@ -369,15 +354,12 @@ namespace OpenSim.Region.CoreModules.Avatar.Chat presence.Scene.RegionInfo.RegionLocY * Constants.RegionSize, 0); int dis = (int)Util.GetDistanceTo(toRegionPos, fromRegionPos); - - if (!ignoreDistance) + + if (type == ChatTypeEnum.Whisper && dis > m_whisperdistance || + type == ChatTypeEnum.Say && dis > m_saydistance || + type == ChatTypeEnum.Shout && dis > m_shoutdistance) { - if (type == ChatTypeEnum.Whisper && dis > m_whisperdistance || - type == ChatTypeEnum.Say && dis > m_saydistance || - type == ChatTypeEnum.Shout && dis > m_shoutdistance) - { - return false; - } + return false; } // TODO: should change so the message is sent through the avatar rather than direct to the ClientView diff --git a/OpenSim/Region/CoreModules/Scripting/WorldComm/WorldCommModule.cs b/OpenSim/Region/CoreModules/Scripting/WorldComm/WorldCommModule.cs index 8358bc0c64..176c86de12 100644 --- a/OpenSim/Region/CoreModules/Scripting/WorldComm/WorldCommModule.cs +++ b/OpenSim/Region/CoreModules/Scripting/WorldComm/WorldCommModule.cs @@ -308,56 +308,56 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm /// /// Message. /// - public void DeliverMessageTo(UUID target, int channel, Vector3 pos, string name, UUID id, string msg) + public bool DeliverMessageTo(UUID target, int channel, Vector3 pos, string name, UUID id, string msg, out string error) { + error = null; // Is id an avatar? ScenePresence sp = m_scene.GetScenePresence(target); if (sp != null) { - // ignore if a child agent this is restricted to inside one region - if (sp.IsChildAgent) - return; - - // Send message to the avatar. - // Channel zero only goes to the avatar - // non zero channel messages only go to the attachments + // Send message to avatar if (channel == 0) { - m_scene.SimChatToAgent(target, Utils.StringToBytes(msg), pos, name, id, false); - } - else - { - List attachments = sp.GetAttachments(); - if (attachments.Count == 0) - return; - - // Get uuid of attachments - List targets = new List(); - foreach (SceneObjectGroup sog in attachments) - { - if (!sog.IsDeleted) - targets.Add(sog.UUID); - } - - // Need to check each attachment - foreach (ListenerInfo li in m_listenerManager.GetListeners(UUID.Zero, channel, name, id, msg)) - { - if (li.GetHostID().Equals(id)) - continue; - - if (m_scene.GetSceneObjectPart(li.GetHostID()) == null) - continue; - - if (targets.Contains(li.GetHostID())) - QueueMessage(new ListenerInfo(li, name, id, msg)); - } + m_scene.SimChatBroadcast(Utils.StringToBytes(msg), ChatTypeEnum.Broadcast, 0, pos, name, id, false); } - return; + List attachments = sp.GetAttachments(); + + if (attachments.Count == 0) + return true; + + // Get uuid of attachments + List targets = new List(); + foreach (SceneObjectGroup sog in attachments) + { + if (!sog.IsDeleted) + targets.Add(sog.UUID); + } + + // Need to check each attachment + foreach (ListenerInfo li in m_listenerManager.GetListeners(UUID.Zero, channel, name, id, msg)) + { + if (li.GetHostID().Equals(id)) + continue; + + if (m_scene.GetSceneObjectPart(li.GetHostID()) == null) + continue; + + if (targets.Contains(li.GetHostID())) + QueueMessage(new ListenerInfo(li, name, id, msg)); + } + + return true; + } + + // Need to toss an error here + if (channel == 0) + { + error = "Cannot use llRegionSayTo to message objects on channel 0"; + return false; } - // No avatar found so look for an object foreach (ListenerInfo li in m_listenerManager.GetListeners(UUID.Zero, channel, name, id, msg)) { // Dont process if this message is from yourself! @@ -375,7 +375,7 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm } } - return; + return true; } protected void QueueMessage(ListenerInfo li) diff --git a/OpenSim/Region/Framework/Interfaces/IWorldComm.cs b/OpenSim/Region/Framework/Interfaces/IWorldComm.cs index 4e74781b9b..e8e375e037 100644 --- a/OpenSim/Region/Framework/Interfaces/IWorldComm.cs +++ b/OpenSim/Region/Framework/Interfaces/IWorldComm.cs @@ -103,7 +103,7 @@ namespace OpenSim.Region.Framework.Interfaces /// /// Message. /// - void DeliverMessageTo(UUID target, int channel, Vector3 pos, string name, UUID id, string msg); + bool DeliverMessageTo(UUID target, int channel, Vector3 pos, string name, UUID id, string msg, out string error); /// /// Are there any listen events ready to be dispatched? diff --git a/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs b/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs index cf68ff4273..3ef1e29782 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs @@ -38,9 +38,8 @@ namespace OpenSim.Region.Framework.Scenes { public partial class Scene { - protected void SimChat(byte[] message, ChatTypeEnum type, int channel, Vector3 fromPos, string fromName, - UUID fromID, UUID targetID, bool fromAgent, bool broadcast) + UUID fromID, bool fromAgent, bool broadcast) { OSChatMessage args = new OSChatMessage(); @@ -64,20 +63,14 @@ namespace OpenSim.Region.Framework.Scenes } args.From = fromName; - args.TargetUUID = targetID; + //args. if (broadcast) EventManager.TriggerOnChatBroadcast(this, args); else EventManager.TriggerOnChatFromWorld(this, args); } - - protected void SimChat(byte[] message, ChatTypeEnum type, int channel, Vector3 fromPos, string fromName, - UUID fromID, bool fromAgent, bool broadcast) - { - SimChat(message, type, channel, fromPos, fromName, fromID, UUID.Zero, fromAgent, broadcast); - } - + /// /// /// @@ -115,19 +108,6 @@ namespace OpenSim.Region.Framework.Scenes { SimChat(message, type, channel, fromPos, fromName, fromID, fromAgent, true); } - /// - /// - /// - /// - /// - /// - /// - /// - /// - public void SimChatToAgent(UUID targetID, byte[] message, Vector3 fromPos, string fromName, UUID fromID, bool fromAgent) - { - SimChat(message, ChatTypeEnum.Say, 0, fromPos, fromName, fromID, targetID, fromAgent, false); - } /// /// Invoked when the client requests a prim. diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index 41de257b32..ffa19d9fb6 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -921,22 +921,20 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public void llRegionSayTo(string target, int channel, string msg) { + string error = String.Empty; + if (msg.Length > 1023) msg = msg.Substring(0, 1023); m_host.AddScriptLPS(1); - if (channel == ScriptBaseClass.DEBUG_CHANNEL) - { - return; - } - UUID TargetID; UUID.TryParse(target, out TargetID); IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface(); if (wComm != null) - wComm.DeliverMessageTo(TargetID, channel, m_host.AbsolutePosition, m_host.Name, m_host.UUID, msg); + if (!wComm.DeliverMessageTo(TargetID, channel, m_host.AbsolutePosition, m_host.Name, m_host.UUID, msg, out error)) + LSLError(error); } public LSL_Integer llListen(int channelID, string name, string ID, string msg) From f263d6a910f5c382756da04dd423db4a46b1eeb7 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 28 Jun 2012 22:48:49 +0100 Subject: [PATCH 451/547] Remove code that tried to delete an attachment back to inventory if RezSingleAttachmentFromInventoryInternal() returned null. null would only ever be returned if the item couldn't be located within inventory and this would happen immediately. In this case, derezzing wouldn't work anyway since there is no item to derez. --- .../CoreModules/Avatar/Attachments/AttachmentsModule.cs | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs index 4a7fbcee96..e3ee2fcc04 100644 --- a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs @@ -365,12 +365,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments return null; } - SceneObjectGroup att = RezSingleAttachmentFromInventoryInternal(sp, itemID, UUID.Zero, AttachmentPt); - - if (att == null) - DetachSingleAttachmentToInv(sp, itemID); - - return att; + return RezSingleAttachmentFromInventoryInternal(sp, itemID, UUID.Zero, AttachmentPt); } public void RezMultipleAttachmentsFromInventory(IScenePresence sp, List> rezlist) From 571fd966cbcb4e718703bc194384f6bf84c211df Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 28 Jun 2012 23:01:12 +0100 Subject: [PATCH 452/547] Rather than iterating through all SOGs in the scene looking for the one that matches out fromItemID on detach, go through the agent's attachment sog list instead. --- .../Avatar/Attachments/AttachmentsModule.cs | 35 ++++++++----------- 1 file changed, 14 insertions(+), 21 deletions(-) diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs index e3ee2fcc04..e9f0488396 100644 --- a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs @@ -666,34 +666,27 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments if (itemID == UUID.Zero) // If this happened, someone made a mistake.... return; - // We can NOT use the dictionries here, as we are looking - // for an entity by the fromAssetID, which is NOT the prim UUID - EntityBase[] detachEntities = m_scene.GetEntities(); - SceneObjectGroup group; - lock (sp.AttachmentsSyncLock) { - foreach (EntityBase entity in detachEntities) + List attachments = sp.GetAttachments(); + + foreach (SceneObjectGroup group in attachments) { - if (entity is SceneObjectGroup) + if (group.FromItemID == itemID) { - group = (SceneObjectGroup)entity; - if (group.FromItemID == itemID) - { - m_scene.EventManager.TriggerOnAttach(group.LocalId, itemID, UUID.Zero); - sp.RemoveAttachment(group); - m_scene.DeleteSceneObject(group, false); + m_scene.EventManager.TriggerOnAttach(group.LocalId, itemID, UUID.Zero); + sp.RemoveAttachment(group); + m_scene.DeleteSceneObject(group, false); - // Prepare sog for storage - group.AttachedAvatar = UUID.Zero; - group.RootPart.SetParentLocalId(0); - group.IsAttachment = false; - group.AbsolutePosition = group.RootPart.AttachedPos; + // Prepare sog for storage + group.AttachedAvatar = UUID.Zero; + group.RootPart.SetParentLocalId(0); + group.IsAttachment = false; + group.AbsolutePosition = group.RootPart.AttachedPos; - UpdateKnownItem(sp, group, true); + UpdateKnownItem(sp, group, true); - return; - } + return; } } } From bfa6896678872a4e796ec4de22e83b6cead3ba17 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 28 Jun 2012 23:31:23 +0100 Subject: [PATCH 453/547] Change AttachmentsModule.DetachSingleAttachmentToInv() to accept a SOG directly instead of an item ID to then shuffle through attachments, saving CPU busywork. Almost all callers already had the sog to hand. Still checking that it's really an attachment, but now by inspecting SOG.AttachedAvatar --- .../Avatar/Attachments/AttachmentsModule.cs | 78 ++++++++++--------- .../Tests/AttachmentsModuleTests.cs | 7 +- .../Interfaces/IAttachmentsModule.cs | 6 +- .../Framework/Interfaces/IScenePresence.cs | 4 + .../Shared/Api/Implementation/LSL_Api.cs | 15 ++-- 5 files changed, 58 insertions(+), 52 deletions(-) diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs index e9f0488396..af30a8e68e 100644 --- a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs @@ -302,10 +302,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments // At the moment we can only deal with a single attachment if (attachments.Count != 0) { - UUID oldAttachmentItemID = attachments[0].FromItemID; - - if (oldAttachmentItemID != UUID.Zero) - DetachSingleAttachmentToInvInternal(sp, oldAttachmentItemID); + if (attachments[0].FromItemID != UUID.Zero) + DetachSingleAttachmentToInvInternal(sp, attachments[0]); else m_log.WarnFormat( "[ATTACHMENTS MODULE]: When detaching existing attachment {0} {1} at point {2} to make way for {3} {4} for {5}, couldn't find the associated item ID to adjust inventory attachment record!", @@ -442,18 +440,27 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments m_scene.EventManager.TriggerOnAttach(so.LocalId, so.UUID, UUID.Zero); } - public void DetachSingleAttachmentToInv(IScenePresence sp, UUID itemID) + public void DetachSingleAttachmentToInv(IScenePresence sp, SceneObjectGroup so) { lock (sp.AttachmentsSyncLock) { // Save avatar attachment information // m_log.Debug("[ATTACHMENTS MODULE]: Detaching from UserID: " + sp.UUID + ", ItemID: " + itemID); - bool changed = sp.Appearance.DetachAttachment(itemID); + if (so.AttachedAvatar != sp.UUID) + { + m_log.WarnFormat( + "[ATTACHMENTS MODULE]: Tried to detach object {0} from {1} {2} but attached avatar id was {3} in {4}", + so.Name, sp.Name, sp.UUID, so.AttachedAvatar, m_scene.RegionInfo.RegionName); + + return; + } + + bool changed = sp.Appearance.DetachAttachment(so.FromItemID); if (changed && m_scene.AvatarFactory != null) m_scene.AvatarFactory.QueueAppearanceSave(sp.UUID); - DetachSingleAttachmentToInvInternal(sp, itemID); + DetachSingleAttachmentToInvInternal(sp, so); } } @@ -657,39 +664,21 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments return newItem; } - // What makes this method odd and unique is it tries to detach using an UUID.... Yay for standards. - // To LocalId or UUID, *THAT* is the question. How now Brown UUID?? - private void DetachSingleAttachmentToInvInternal(IScenePresence sp, UUID itemID) + private void DetachSingleAttachmentToInvInternal(IScenePresence sp, SceneObjectGroup so) { // m_log.DebugFormat("[ATTACHMENTS MODULE]: Detaching item {0} to inventory for {1}", itemID, sp.Name); - if (itemID == UUID.Zero) // If this happened, someone made a mistake.... - return; + m_scene.EventManager.TriggerOnAttach(so.LocalId, so.FromItemID, UUID.Zero); + sp.RemoveAttachment(so); + m_scene.DeleteSceneObject(so, false); - lock (sp.AttachmentsSyncLock) - { - List attachments = sp.GetAttachments(); + // Prepare sog for storage + so.AttachedAvatar = UUID.Zero; + so.RootPart.SetParentLocalId(0); + so.IsAttachment = false; + so.AbsolutePosition = so.RootPart.AttachedPos; - foreach (SceneObjectGroup group in attachments) - { - if (group.FromItemID == itemID) - { - m_scene.EventManager.TriggerOnAttach(group.LocalId, itemID, UUID.Zero); - sp.RemoveAttachment(group); - m_scene.DeleteSceneObject(group, false); - - // Prepare sog for storage - group.AttachedAvatar = UUID.Zero; - group.RootPart.SetParentLocalId(0); - group.IsAttachment = false; - group.AbsolutePosition = group.RootPart.AttachedPos; - - UpdateKnownItem(sp, group, true); - - return; - } - } - } + UpdateKnownItem(sp, so, true); } private SceneObjectGroup RezSingleAttachmentFromInventoryInternal( @@ -897,8 +886,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments ScenePresence sp = m_scene.GetScenePresence(remoteClient.AgentId); SceneObjectGroup group = m_scene.GetGroupByPrim(objectLocalID); + if (sp != null && group != null) - DetachSingleAttachmentToInv(sp, group.FromItemID); + DetachSingleAttachmentToInv(sp, group); } private void Client_OnDetachAttachmentIntoInv(UUID itemID, IClientAPI remoteClient) @@ -908,7 +898,21 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments ScenePresence sp = m_scene.GetScenePresence(remoteClient.AgentId); if (sp != null) - DetachSingleAttachmentToInv(sp, itemID); + { + lock (sp.AttachmentsSyncLock) + { + List attachments = sp.GetAttachments(); + + foreach (SceneObjectGroup group in attachments) + { + if (group.FromItemID == itemID) + { + DetachSingleAttachmentToInv(sp, group); + return; + } + } + } + } } private void Client_OnObjectDrop(uint soLocalId, IClientAPI remoteClient) diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs index 65722fe379..b0c087fb56 100644 --- a/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs +++ b/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs @@ -227,9 +227,10 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests InventoryItemBase attItem = CreateAttachmentItem(scene, ua1.PrincipalID, "att", 0x10, 0x20); - scene.AttachmentsModule.RezSingleAttachmentFromInventory( - sp, attItem.ID, (uint)AttachmentPoint.Chest); - scene.AttachmentsModule.DetachSingleAttachmentToInv(sp, attItem.ID); + SceneObjectGroup so + = (SceneObjectGroup)scene.AttachmentsModule.RezSingleAttachmentFromInventory( + sp, attItem.ID, (uint)AttachmentPoint.Chest); + scene.AttachmentsModule.DetachSingleAttachmentToInv(sp, so); // Check status on scene presence Assert.That(sp.HasAttachments(), Is.False); diff --git a/OpenSim/Region/Framework/Interfaces/IAttachmentsModule.cs b/OpenSim/Region/Framework/Interfaces/IAttachmentsModule.cs index 375d3345a2..ba35a41046 100644 --- a/OpenSim/Region/Framework/Interfaces/IAttachmentsModule.cs +++ b/OpenSim/Region/Framework/Interfaces/IAttachmentsModule.cs @@ -109,11 +109,11 @@ namespace OpenSim.Region.Framework.Interfaces void DetachSingleAttachmentToGround(IScenePresence sp, uint objectLocalID); /// - /// Detach the given item so that it remains in the user's inventory. + /// Detach the given attachment so that it remains in the user's inventory. /// /// /param> - /// - void DetachSingleAttachmentToInv(IScenePresence sp, UUID itemID); + /// The attachment to detach. + void DetachSingleAttachmentToInv(IScenePresence sp, SceneObjectGroup grp); /// /// Update the position of an attachment. diff --git a/OpenSim/Region/Framework/Interfaces/IScenePresence.cs b/OpenSim/Region/Framework/Interfaces/IScenePresence.cs index 19a8236427..e6b926ce8c 100644 --- a/OpenSim/Region/Framework/Interfaces/IScenePresence.cs +++ b/OpenSim/Region/Framework/Interfaces/IScenePresence.cs @@ -72,6 +72,10 @@ namespace OpenSim.Region.Framework.Interfaces /// List GetAttachments(uint attachmentPoint); + /// + /// Does this avatar have any attachments? + /// + /// bool HasAttachments(); // Don't use these methods directly. Instead, use the AttachmentsModule diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index a8679e2cb1..12eb098033 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -2990,15 +2990,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api private void DetachWrapper(object o) { - SceneObjectPart host = (SceneObjectPart)o; - - SceneObjectGroup grp = host.ParentGroup; - UUID itemID = grp.FromItemID; - ScenePresence presence = World.GetScenePresence(host.OwnerID); - - IAttachmentsModule attachmentsModule = m_ScriptEngine.World.AttachmentsModule; - if (attachmentsModule != null) - attachmentsModule.DetachSingleAttachmentToInv(presence, itemID); + if (World.AttachmentsModule != null) + { + SceneObjectPart host = (SceneObjectPart)o; + ScenePresence presence = World.GetScenePresence(host.OwnerID); + World.AttachmentsModule.DetachSingleAttachmentToInv(presence, host.ParentGroup); + } } public void llAttachToAvatar(int attachmentPoint) From f202c36106815949e56c58612770a00c65ab80a3 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 29 Jun 2012 00:03:22 +0100 Subject: [PATCH 454/547] Add IScene.Name for code clarity to replace the RegionInfo.RegionName used in many, many log messages. --- OpenSim/Framework/IScene.cs | 5 ++ .../ClientStack/Linden/UDP/Tests/MockScene.cs | 3 +- OpenSim/Region/Framework/Scenes/Scene.cs | 50 +++++++++---------- OpenSim/Region/Framework/Scenes/SceneBase.cs | 12 +++-- 4 files changed, 38 insertions(+), 32 deletions(-) diff --git a/OpenSim/Framework/IScene.cs b/OpenSim/Framework/IScene.cs index b2604f4a39..a9432c2df3 100644 --- a/OpenSim/Framework/IScene.cs +++ b/OpenSim/Framework/IScene.cs @@ -56,6 +56,11 @@ namespace OpenSim.Framework public interface IScene { + /// + /// The name of this scene. + /// + string Name { get; } + RegionInfo RegionInfo { get; } RegionStatus RegionStatus { get; set; } diff --git a/OpenSim/Region/ClientStack/Linden/UDP/Tests/MockScene.cs b/OpenSim/Region/ClientStack/Linden/UDP/Tests/MockScene.cs index d76927be9f..119a677f80 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/Tests/MockScene.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/Tests/MockScene.cs @@ -44,9 +44,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP.Tests } protected int m_objectNameCallsReceived; - public MockScene() + public MockScene() : base(new RegionInfo(1000, 1000, null, null)) { - m_regInfo = new RegionInfo(1000, 1000, null, null); m_regStatus = RegionStatus.Up; } diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index d44911604a..c28979e391 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -614,8 +614,7 @@ namespace OpenSim.Region.Framework.Scenes m_sceneGridService = sceneGridService; m_SimulationDataService = simDataService; m_EstateDataService = estateDataService; - m_regionHandle = m_regInfo.RegionHandle; - m_regionName = m_regInfo.RegionName; + m_regionHandle = RegionInfo.RegionHandle; m_asyncSceneObjectDeleter = new AsyncSceneObjectGroupDeleter(this); m_asyncSceneObjectDeleter.Enabled = true; @@ -630,7 +629,7 @@ namespace OpenSim.Region.Framework.Scenes // resave. // FIXME: It shouldn't be up to the database plugins to create this data - we should do it when a new // region is set up and avoid these gyrations. - RegionSettings rs = simDataService.LoadRegionSettings(m_regInfo.RegionID); + RegionSettings rs = simDataService.LoadRegionSettings(RegionInfo.RegionID); bool updatedTerrainTextures = false; if (rs.TerrainTexture1 == UUID.Zero) { @@ -659,10 +658,10 @@ namespace OpenSim.Region.Framework.Scenes if (updatedTerrainTextures) rs.Save(); - m_regInfo.RegionSettings = rs; + RegionInfo.RegionSettings = rs; if (estateDataService != null) - m_regInfo.EstateSettings = estateDataService.LoadEstateSettings(m_regInfo.RegionID, false); + RegionInfo.EstateSettings = estateDataService.LoadEstateSettings(RegionInfo.RegionID, false); #endregion Region Settings @@ -828,7 +827,7 @@ namespace OpenSim.Region.Framework.Scenes StatsReporter.OnStatsIncorrect += m_sceneGraph.RecalculateStats; } - public Scene(RegionInfo regInfo) + public Scene(RegionInfo regInfo) : base(regInfo) { PhysicalPrims = true; CollidablePrims = true; @@ -855,7 +854,6 @@ namespace OpenSim.Region.Framework.Scenes WestBorders.Add(westBorder); BordersLocked = false; - m_regInfo = regInfo; m_eventManager = new EventManager(); m_permissions = new ScenePermissions(this); @@ -1199,8 +1197,8 @@ namespace OpenSim.Region.Framework.Scenes m_sceneGraph.Close(); - if (!GridService.DeregisterRegion(m_regInfo.RegionID)) - m_log.WarnFormat("[SCENE]: Deregister from grid failed for region {0}", m_regInfo.RegionName); + if (!GridService.DeregisterRegion(RegionInfo.RegionID)) + m_log.WarnFormat("[SCENE]: Deregister from grid failed for region {0}", Name); // call the base class Close method. base.Close(); @@ -1720,14 +1718,14 @@ namespace OpenSim.Region.Framework.Scenes public void StoreWindlightProfile(RegionLightShareData wl) { - m_regInfo.WindlightSettings = wl; + RegionInfo.WindlightSettings = wl; SimulationDataService.StoreRegionWindlightSettings(wl); m_eventManager.TriggerOnSaveNewWindlightProfile(); } public void LoadWindlightProfile() { - m_regInfo.WindlightSettings = SimulationDataService.LoadRegionWindlightSettings(RegionInfo.RegionID); + RegionInfo.WindlightSettings = SimulationDataService.LoadRegionWindlightSettings(RegionInfo.RegionID); m_eventManager.TriggerOnSaveNewWindlightProfile(); } @@ -2218,7 +2216,7 @@ namespace OpenSim.Region.Framework.Scenes ForceSceneObjectBackup(so); so.DetachFromBackup(); - SimulationDataService.RemoveObject(so.UUID, m_regInfo.RegionID); + SimulationDataService.RemoveObject(so.UUID, RegionInfo.RegionID); } // We need to keep track of this state in case this group is still queued for further backup. @@ -2553,7 +2551,7 @@ namespace OpenSim.Region.Framework.Scenes // If the user is banned, we won't let any of their objects // enter. Period. // - if (m_regInfo.EstateSettings.IsBanned(sceneObject.OwnerID)) + if (RegionInfo.EstateSettings.IsBanned(sceneObject.OwnerID)) { m_log.InfoFormat("[INTERREGION]: Denied prim crossing for banned avatar {0}", sceneObject.OwnerID); @@ -3734,9 +3732,9 @@ namespace OpenSim.Region.Framework.Scenes } } - if (m_regInfo.EstateSettings != null) + if (RegionInfo.EstateSettings != null) { - if (m_regInfo.EstateSettings.IsBanned(agent.AgentID)) + if (RegionInfo.EstateSettings.IsBanned(agent.AgentID)) { m_log.WarnFormat("[CONNECTION BEGIN]: Denied access to: {0} ({1} {2}) at {3} because the user is on the banlist", agent.AgentID, agent.firstname, agent.lastname, RegionInfo.RegionName); @@ -3768,7 +3766,7 @@ namespace OpenSim.Region.Framework.Scenes } bool groupAccess = false; - UUID[] estateGroups = m_regInfo.EstateSettings.EstateGroups; + UUID[] estateGroups = RegionInfo.EstateSettings.EstateGroups; if (estateGroups != null) { @@ -3786,8 +3784,8 @@ namespace OpenSim.Region.Framework.Scenes m_log.ErrorFormat("[CONNECTION BEGIN]: EstateGroups is null!"); } - if (!m_regInfo.EstateSettings.PublicAccess && - !m_regInfo.EstateSettings.HasAccess(agent.AgentID) && + if (!RegionInfo.EstateSettings.PublicAccess && + !RegionInfo.EstateSettings.HasAccess(agent.AgentID) && !groupAccess) { m_log.WarnFormat("[CONNECTION BEGIN]: Denied access to: {0} ({1} {2}) at {3} because the user does not have access to the estate", @@ -3860,7 +3858,7 @@ namespace OpenSim.Region.Framework.Scenes // if (loggingOffUser != null) // { // UUID localRegionSecret = UUID.Zero; -// bool parsedsecret = UUID.TryParse(m_regInfo.regionSecret, out localRegionSecret); +// bool parsedsecret = UUID.TryParse(RegionInfo.regionSecret, out localRegionSecret); // // // Region Secret is used here in case a new sessionid overwrites an old one on the user server. // // Will update the user server in a few revisions to use it. @@ -4079,13 +4077,13 @@ namespace OpenSim.Region.Framework.Scenes ScenePresence sp = GetScenePresence(remoteClient.AgentId); if (sp != null) { - uint regionX = m_regInfo.RegionLocX; - uint regionY = m_regInfo.RegionLocY; + uint regionX = RegionInfo.RegionLocX; + uint regionY = RegionInfo.RegionLocY; Utils.LongToUInts(regionHandle, out regionX, out regionY); - int shiftx = (int) regionX - (int) m_regInfo.RegionLocX * (int)Constants.RegionSize; - int shifty = (int) regionY - (int) m_regInfo.RegionLocY * (int)Constants.RegionSize; + int shiftx = (int) regionX - (int) RegionInfo.RegionLocX * (int)Constants.RegionSize; + int shifty = (int) regionY - (int) RegionInfo.RegionLocY * (int)Constants.RegionSize; position.X += shiftx; position.Y += shifty; @@ -4108,7 +4106,7 @@ namespace OpenSim.Region.Framework.Scenes if (!result) { - regionHandle = m_regInfo.RegionHandle; + regionHandle = RegionInfo.RegionHandle; } else { @@ -4614,7 +4612,7 @@ namespace OpenSim.Region.Framework.Scenes public void DeleteFromStorage(UUID uuid) { - SimulationDataService.RemoveObject(uuid, m_regInfo.RegionID); + SimulationDataService.RemoveObject(uuid, RegionInfo.RegionID); } public int GetHealth() @@ -5039,7 +5037,7 @@ namespace OpenSim.Region.Framework.Scenes IEstateDataService estateDataService = EstateDataService; if (estateDataService != null) { - m_regInfo.EstateSettings = estateDataService.LoadEstateSettings(m_regInfo.RegionID, false); + RegionInfo.EstateSettings = estateDataService.LoadEstateSettings(RegionInfo.RegionID, false); TriggerEstateSunUpdate(); } } diff --git a/OpenSim/Region/Framework/Scenes/SceneBase.cs b/OpenSim/Region/Framework/Scenes/SceneBase.cs index 9c6b8842f9..f50fbfcdbf 100644 --- a/OpenSim/Region/Framework/Scenes/SceneBase.cs +++ b/OpenSim/Region/Framework/Scenes/SceneBase.cs @@ -51,6 +51,8 @@ namespace OpenSim.Region.Framework.Scenes #endregion #region Fields + + public string Name { get { return RegionInfo.RegionName; } } public IConfigSource Config { @@ -146,6 +148,11 @@ namespace OpenSim.Region.Framework.Scenes #endregion + public SceneBase(RegionInfo regInfo) + { + RegionInfo = regInfo; + } + #region Update Methods /// @@ -209,10 +216,7 @@ namespace OpenSim.Region.Framework.Scenes /// /// /// - public virtual RegionInfo RegionInfo - { - get { return m_regInfo; } - } + public virtual RegionInfo RegionInfo { get; private set; } #region admin stuff From 0f6b7b6a41ef40e8798638b79c4c62f00556a093 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 29 Jun 2012 00:11:44 +0100 Subject: [PATCH 455/547] If a link points to a non-existing item in FetchInventory caps, then don't try to add it to the return data rather than suffering an exception later on --- .../WebFetchInventoryDescendents/WebFetchInvDescHandler.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/OpenSim/Capabilities/Handlers/WebFetchInventoryDescendents/WebFetchInvDescHandler.cs b/OpenSim/Capabilities/Handlers/WebFetchInventoryDescendents/WebFetchInvDescHandler.cs index 515637eac0..9a6ca8640a 100644 --- a/OpenSim/Capabilities/Handlers/WebFetchInventoryDescendents/WebFetchInvDescHandler.cs +++ b/OpenSim/Capabilities/Handlers/WebFetchInventoryDescendents/WebFetchInvDescHandler.cs @@ -301,7 +301,8 @@ namespace OpenSim.Capabilities.Handlers InventoryItemBase linkedItem = m_InventoryService.GetItem(new InventoryItemBase(link.AssetID)); - itemsToReturn.Insert(0, linkedItem); + if (linkedItem != null) + itemsToReturn.Insert(0, linkedItem); } } } From 1a7be7b00eaef0140f2dc13f3e14d8150c393b08 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 29 Jun 2012 00:36:50 +0100 Subject: [PATCH 456/547] Fix a regression where we stopped removing avatars from collision event reporting on logout, rather than stopping clearing their collision events. This occurred in b18c8c8 (Thu May 17 2012). This was a cause of very occasional race conditions and likely memory leakage as clients came and went from the region. --- OpenSim/Region/Physics/OdePlugin/ODECharacter.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs b/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs index 54b69a2c73..f3b0630843 100644 --- a/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs +++ b/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs @@ -1270,7 +1270,7 @@ namespace OpenSim.Region.Physics.OdePlugin public override void UnSubscribeEvents() { - CollisionEventsThisFrame.Clear(); + _parent_scene.RemoveCollisionEventReporting(this); // Don't clear collision event reporting here. This is called directly from scene code and so can lead // to a race condition with the simulate loop From e420f815dc9be9c7fc93cb94c86517d97abbed86 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 29 Jun 2012 00:54:40 +0100 Subject: [PATCH 457/547] refactor: rename _collisionEventPrim to m_collisionEventActors and _collisionEventPrimChanges to m_collisionEventActorsChanges to reflect their actual contents. These dictionaries handle all actor types, not just physical prims. --- OpenSim/Region/Physics/OdePlugin/OdeScene.cs | 24 ++++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs index c6ecc68ae9..79de99e89c 100644 --- a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs +++ b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs @@ -387,12 +387,12 @@ namespace OpenSim.Region.Physics.OdePlugin /// /// A dictionary of actors that should receive collision events. /// - private readonly Dictionary _collisionEventPrim = new Dictionary(); + private readonly Dictionary m_collisionEventActors = new Dictionary(); /// /// A dictionary of collision event changes that are waiting to be processed. /// - private readonly Dictionary _collisionEventPrimChanges = new Dictionary(); + private readonly Dictionary m_collisionEventActorsChanges = new Dictionary(); /// /// Maps a unique geometry id (a memory location) to a physics actor name. @@ -1908,8 +1908,8 @@ namespace OpenSim.Region.Physics.OdePlugin { // m_log.DebugFormat("[PHYSICS]: Adding {0} {1} to collision event reporting", obj.SOPName, obj.LocalID); - lock (_collisionEventPrimChanges) - _collisionEventPrimChanges[obj.LocalID] = obj; + lock (m_collisionEventActorsChanges) + m_collisionEventActorsChanges[obj.LocalID] = obj; } /// @@ -1920,8 +1920,8 @@ namespace OpenSim.Region.Physics.OdePlugin { // m_log.DebugFormat("[PHYSICS]: Removing {0} {1} from collision event reporting", obj.SOPName, obj.LocalID); - lock (_collisionEventPrimChanges) - _collisionEventPrimChanges[obj.LocalID] = null; + lock (m_collisionEventActorsChanges) + m_collisionEventActorsChanges[obj.LocalID] = null; } #region Add/Remove Entities @@ -2930,17 +2930,17 @@ namespace OpenSim.Region.Physics.OdePlugin // We change _collisionEventPrimChanges to avoid locking _collisionEventPrim itself and causing potential // deadlock if the collision event tries to lock something else later on which is already locked by a // caller that is adding or removing the collision event. - lock (_collisionEventPrimChanges) + lock (m_collisionEventActorsChanges) { - foreach (KeyValuePair kvp in _collisionEventPrimChanges) + foreach (KeyValuePair kvp in m_collisionEventActorsChanges) { if (kvp.Value == null) - _collisionEventPrim.Remove(kvp.Key); + m_collisionEventActors.Remove(kvp.Key); else - _collisionEventPrim[kvp.Key] = kvp.Value; + m_collisionEventActors[kvp.Key] = kvp.Value; } - _collisionEventPrimChanges.Clear(); + m_collisionEventActorsChanges.Clear(); } if (SupportsNINJAJoints) @@ -3092,7 +3092,7 @@ namespace OpenSim.Region.Physics.OdePlugin tempTick = tempTick2; } - foreach (PhysicsActor obj in _collisionEventPrim.Values) + foreach (PhysicsActor obj in m_collisionEventActors.Values) { // m_log.DebugFormat("[PHYSICS]: Assessing {0} {1} for collision events", obj.SOPName, obj.LocalID); From 0229e90dcc579cee8fe3321a78f6d75b5d70486e Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 29 Jun 2012 01:02:35 +0100 Subject: [PATCH 458/547] Move update of the final optional ODE total frame stat inside the OdeLock rather than outside to avoid a very occasional race condition with the stat collection thread --- OpenSim/Region/Physics/OdePlugin/OdeScene.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs index 79de99e89c..32e81e2ea1 100644 --- a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs +++ b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs @@ -3227,10 +3227,10 @@ namespace OpenSim.Region.Physics.OdePlugin } tickCountFrameRun = Util.EnvironmentTickCount(); - } - if (CollectStats) - m_stats[ODETotalFrameMsStatName] += Util.EnvironmentTickCountSubtract(startFrameTick); + if (CollectStats) + m_stats[ODETotalFrameMsStatName] += Util.EnvironmentTickCountSubtract(startFrameTick); + } return fps; } From 56c776066c71a6ed88d6cd2455f27860d1136530 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Sat, 30 Jun 2012 01:05:57 +0100 Subject: [PATCH 459/547] Remove code listed for removal in 0.7.3 that handled script restart for incoming attachments from pre-fatpack regions (versions of OpenSimulator more than a year old) --- OpenSim/Region/Framework/Scenes/Scene.cs | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index c28979e391..0f23cc7f44 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -2494,22 +2494,6 @@ namespace OpenSim.Region.Framework.Scenes newObject.RootPart.ParentGroup.CreateScriptInstances(0, false, DefaultScriptEngine, GetStateSource(newObject)); newObject.ResumeScripts(); } - else - { - ScenePresence sp; - if (TryGetScenePresence(newObject.OwnerID, out sp)) - { - // If the scene presence is here and already a root - // agent, we came from a ;egacy region. Start the scripts - // here as they used to start. - // TODO: Remove in 0.7.3 - if (!sp.IsChildAgent) - { - newObject.RootPart.ParentGroup.CreateScriptInstances(0, false, DefaultScriptEngine, GetStateSource(newObject)); - newObject.ResumeScripts(); - } - } - } // Do this as late as possible so that listeners have full access to the incoming object EventManager.TriggerOnIncomingSceneObject(newObject); From a4551b027bc3f9dfcf79f74210a1156abfb7bb2f Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Sat, 30 Jun 2012 01:14:49 +0100 Subject: [PATCH 460/547] Removing unused handling of incoming create object by userID and itemID only. It appears this was never actually used since attachments were rezzed in other code. This was never available on remote simulator comms, only local. --- .../Simulation/LocalSimulationConnector.cs | 18 ------- .../Simulation/RemoteSimulationConnector.cs | 9 +--- OpenSim/Region/Framework/Scenes/Scene.cs | 22 --------- .../Handlers/Simulation/ObjectHandlers.cs | 48 ------------------- .../Services/Interfaces/ISimulationService.cs | 10 ---- 5 files changed, 1 insertion(+), 106 deletions(-) diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/LocalSimulationConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/LocalSimulationConnector.cs index 026c6c884c..09a3bd604f 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/LocalSimulationConnector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/LocalSimulationConnector.cs @@ -354,24 +354,6 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation return false; } - public bool CreateObject(GridRegion destination, UUID userID, UUID itemID) - { - if (destination == null) - return false; - - if (m_scenes.ContainsKey(destination.RegionID)) - { -// m_log.DebugFormat( -// "[LOCAL SIMULATION CONNECTOR]: Found region {0} {1} to send AgentUpdate", -// s.RegionInfo.RegionName, destination.RegionHandle); - - return m_scenes[destination.RegionID].IncomingCreateObject(userID, itemID); - } - - return false; - } - - #endregion /* IInterregionComms */ #region Misc diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/RemoteSimulationConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/RemoteSimulationConnector.cs index f980f688cc..bd4a23b873 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/RemoteSimulationConnector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/RemoteSimulationConnector.cs @@ -300,13 +300,6 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation return false; } - public bool CreateObject(GridRegion destination, UUID userID, UUID itemID) - { - // Not Implemented - return false; - } - #endregion /* IInterregionComms */ - } -} +} \ No newline at end of file diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 0f23cc7f44..293c72a8c9 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -2501,28 +2501,6 @@ namespace OpenSim.Region.Framework.Scenes return true; } - /// - /// Attachment rezzing - /// - /// Agent Unique ID - /// Object ID - /// False - public virtual bool IncomingCreateObject(UUID userID, UUID itemID) - { - m_log.DebugFormat(" >>> IncomingCreateObject(userID, itemID) <<< {0} {1}", userID, itemID); - - // Commented out since this is as yet unused and is arguably not the appropriate place to do this, as - // attachments are being rezzed elsewhere in AddNewClient() -// ScenePresence sp = GetScenePresence(userID); -// if (sp != null && AttachmentsModule != null) -// { -// uint attPt = (uint)sp.Appearance.GetAttachpoint(itemID); -// AttachmentsModule.RezSingleAttachmentFromInventory(sp.ControllingClient, itemID, attPt); -// } - - return false; - } - /// /// Adds a Scene Object group to the Scene. /// Verifies that the creator of the object is not banned from the simulator. diff --git a/OpenSim/Server/Handlers/Simulation/ObjectHandlers.cs b/OpenSim/Server/Handlers/Simulation/ObjectHandlers.cs index a4d03ba891..dbb1a15ae7 100644 --- a/OpenSim/Server/Handlers/Simulation/ObjectHandlers.cs +++ b/OpenSim/Server/Handlers/Simulation/ObjectHandlers.cs @@ -93,11 +93,6 @@ namespace OpenSim.Server.Handlers.Simulation DoObjectPost(request, responsedata, regionID); return responsedata; } - else if (method.Equals("PUT")) - { - DoObjectPut(request, responsedata, regionID); - return responsedata; - } //else if (method.Equals("DELETE")) //{ // DoObjectDelete(request, responsedata, agentID, action, regionHandle); @@ -219,48 +214,5 @@ namespace OpenSim.Server.Handlers.Simulation { return m_SimulationService.CreateObject(destination, newPosition, sog, false); } - - protected virtual void DoObjectPut(Hashtable request, Hashtable responsedata, UUID regionID) - { - OSDMap args = Utils.GetOSDMap((string)request["body"]); - if (args == null) - { - responsedata["int_response_code"] = 400; - responsedata["str_response_string"] = "false"; - return; - } - - // retrieve the input arguments - int x = 0, y = 0; - UUID uuid = UUID.Zero; - string regionname = string.Empty; - if (args.ContainsKey("destination_x") && args["destination_x"] != null) - Int32.TryParse(args["destination_x"].AsString(), out x); - if (args.ContainsKey("destination_y") && args["destination_y"] != null) - Int32.TryParse(args["destination_y"].AsString(), out y); - if (args.ContainsKey("destination_uuid") && args["destination_uuid"] != null) - UUID.TryParse(args["destination_uuid"].AsString(), out uuid); - if (args.ContainsKey("destination_name") && args["destination_name"] != null) - regionname = args["destination_name"].ToString(); - - GridRegion destination = new GridRegion(); - destination.RegionID = uuid; - destination.RegionLocX = x; - destination.RegionLocY = y; - destination.RegionName = regionname; - - UUID userID = UUID.Zero, itemID = UUID.Zero; - if (args.ContainsKey("userid") && args["userid"] != null) - userID = args["userid"].AsUUID(); - if (args.ContainsKey("itemid") && args["itemid"] != null) - itemID = args["itemid"].AsUUID(); - - // This is the meaning of PUT object - bool result = m_SimulationService.CreateObject(destination, userID, itemID); - - responsedata["int_response_code"] = 200; - responsedata["str_response_string"] = result.ToString(); - } - } } diff --git a/OpenSim/Services/Interfaces/ISimulationService.cs b/OpenSim/Services/Interfaces/ISimulationService.cs index 4e52532415..b10a85c24e 100644 --- a/OpenSim/Services/Interfaces/ISimulationService.cs +++ b/OpenSim/Services/Interfaces/ISimulationService.cs @@ -110,16 +110,6 @@ namespace OpenSim.Services.Interfaces /// bool CreateObject(GridRegion destination, Vector3 newPosition, ISceneObject sog, bool isLocalCall); - /// - /// Create an object from the user's inventory in the destination region. - /// This message is used primarily by clients. - /// - /// - /// - /// - /// - bool CreateObject(GridRegion destination, UUID userID, UUID itemID); - #endregion Objects } From 1926de5a0599051c27c065fb06da3dc536e6784a Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Sat, 30 Jun 2012 01:25:27 +0100 Subject: [PATCH 461/547] Remove some mono compiler warnings --- .../External/LandDataSerializer.cs | 2 +- .../External/UserInventoryItemSerializer.cs | 2 +- .../BasicPhysicsPlugin/BasicPhysicsPrim.cs | 5 ++-- OpenSim/Server/Base/HttpServerBase.cs | 4 +-- .../HypergridService/GatekeeperService.cs | 2 -- .../HypergridService/HGFriendsService.cs | 26 +++++++++---------- .../HGSuitcaseInventoryService.cs | 4 +-- 7 files changed, 21 insertions(+), 24 deletions(-) diff --git a/OpenSim/Framework/Serialization/External/LandDataSerializer.cs b/OpenSim/Framework/Serialization/External/LandDataSerializer.cs index a12877a692..e8d82d3820 100644 --- a/OpenSim/Framework/Serialization/External/LandDataSerializer.cs +++ b/OpenSim/Framework/Serialization/External/LandDataSerializer.cs @@ -42,7 +42,7 @@ namespace OpenSim.Framework.Serialization.External /// public class LandDataSerializer { - private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); +// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); protected static UTF8Encoding m_utf8Encoding = new UTF8Encoding(); diff --git a/OpenSim/Framework/Serialization/External/UserInventoryItemSerializer.cs b/OpenSim/Framework/Serialization/External/UserInventoryItemSerializer.cs index 57da7ca0e4..88f9581afd 100644 --- a/OpenSim/Framework/Serialization/External/UserInventoryItemSerializer.cs +++ b/OpenSim/Framework/Serialization/External/UserInventoryItemSerializer.cs @@ -44,7 +44,7 @@ namespace OpenSim.Framework.Serialization.External /// public class UserInventoryItemSerializer { - private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); +// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); private static Dictionary> m_InventoryItemXmlProcessors = new Dictionary>(); diff --git a/OpenSim/Region/Physics/BasicPhysicsPlugin/BasicPhysicsPrim.cs b/OpenSim/Region/Physics/BasicPhysicsPlugin/BasicPhysicsPrim.cs index b89eeed329..47d7df3cc1 100644 --- a/OpenSim/Region/Physics/BasicPhysicsPlugin/BasicPhysicsPrim.cs +++ b/OpenSim/Region/Physics/BasicPhysicsPlugin/BasicPhysicsPrim.cs @@ -37,7 +37,7 @@ namespace OpenSim.Region.Physics.BasicPhysicsPlugin public class BasicPhysicsPrim : PhysicsActor { private Vector3 _size; - private PrimitiveBaseShape _shape; +// private PrimitiveBaseShape _shape; public BasicPhysicsPrim( string name, uint localId, Vector3 position, Vector3 size, Quaternion orientation, PrimitiveBaseShape shape) @@ -136,7 +136,8 @@ namespace OpenSim.Region.Physics.BasicPhysicsPlugin public override PrimitiveBaseShape Shape { - set { _shape = value; } +// set { _shape = value; } + set {} } public override float Mass diff --git a/OpenSim/Server/Base/HttpServerBase.cs b/OpenSim/Server/Base/HttpServerBase.cs index 7ba0ca8053..29b1c00822 100644 --- a/OpenSim/Server/Base/HttpServerBase.cs +++ b/OpenSim/Server/Base/HttpServerBase.cs @@ -40,9 +40,7 @@ namespace OpenSim.Server.Base { public class HttpServerBase : ServicesServerBase { - // Logger - // - private static readonly ILog m_Log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); +// private static readonly ILog m_Log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); private uint m_consolePort; diff --git a/OpenSim/Services/HypergridService/GatekeeperService.cs b/OpenSim/Services/HypergridService/GatekeeperService.cs index 149a0abb4f..47d22b95fd 100644 --- a/OpenSim/Services/HypergridService/GatekeeperService.cs +++ b/OpenSim/Services/HypergridService/GatekeeperService.cs @@ -370,8 +370,6 @@ namespace OpenSim.Services.HypergridService return false; } } - - return false; } // Check that the service token was generated for *this* grid. diff --git a/OpenSim/Services/HypergridService/HGFriendsService.cs b/OpenSim/Services/HypergridService/HGFriendsService.cs index 39524ab93e..98423d765c 100644 --- a/OpenSim/Services/HypergridService/HGFriendsService.cs +++ b/OpenSim/Services/HypergridService/HGFriendsService.cs @@ -276,19 +276,19 @@ namespace OpenSim.Services.HypergridService } } - // Lastly, let's notify the rest who may be online somewhere else - foreach (string user in usersToBeNotified) - { - UUID id = new UUID(user); - //m_UserAgentService.LocateUser(id); - //etc... - //if (m_TravelingAgents.ContainsKey(id) && m_TravelingAgents[id].GridExternalName != m_GridName) - //{ - // string url = m_TravelingAgents[id].GridExternalName; - // // forward - //} - //m_log.WarnFormat("[HGFRIENDS SERVICE]: User {0} is visiting another grid. HG Status notifications still not implemented.", user); - } +// // Lastly, let's notify the rest who may be online somewhere else +// foreach (string user in usersToBeNotified) +// { +// UUID id = new UUID(user); +// //m_UserAgentService.LocateUser(id); +// //etc... +// //if (m_TravelingAgents.ContainsKey(id) && m_TravelingAgents[id].GridExternalName != m_GridName) +// //{ +// // string url = m_TravelingAgents[id].GridExternalName; +// // // forward +// //} +// //m_log.WarnFormat("[HGFRIENDS SERVICE]: User {0} is visiting another grid. HG Status notifications still not implemented.", user); +// } // and finally, let's send the online friends if (online) diff --git a/OpenSim/Services/HypergridService/HGSuitcaseInventoryService.cs b/OpenSim/Services/HypergridService/HGSuitcaseInventoryService.cs index 53fbea6436..6e4b68c8bd 100644 --- a/OpenSim/Services/HypergridService/HGSuitcaseInventoryService.cs +++ b/OpenSim/Services/HypergridService/HGSuitcaseInventoryService.cs @@ -57,7 +57,7 @@ namespace OpenSim.Services.HypergridService private string m_HomeURL; private IUserAccountService m_UserAccountService; - private UserAccountCache m_Cache; +// private UserAccountCache m_Cache; private ExpiringCache> m_SuitcaseTrees = new ExpiringCache>(); @@ -92,7 +92,7 @@ namespace OpenSim.Services.HypergridService // Preferred m_HomeURL = invConfig.GetString("HomeURI", m_HomeURL); - m_Cache = UserAccountCache.CreateUserAccountCache(m_UserAccountService); +// m_Cache = UserAccountCache.CreateUserAccountCache(m_UserAccountService); } m_log.Debug("[HG SUITCASE INVENTORY SERVICE]: Starting..."); From d32cf2157670889c571a34f1a4473d672e29627d Mon Sep 17 00:00:00 2001 From: Melanie Date: Sun, 1 Jul 2012 18:30:59 +0100 Subject: [PATCH 462/547] Add preservation of running state of scripts when drag-copying. --- OpenSim/Framework/TaskInventoryItem.cs | 12 +++++++ .../Framework/Interfaces/IScriptModule.cs | 4 ++- .../Scenes/SceneObjectPartInventory.cs | 36 ++++++++++++++++++- .../Region/ScriptEngine/XEngine/XEngine.cs | 12 +++++++ 4 files changed, 62 insertions(+), 2 deletions(-) diff --git a/OpenSim/Framework/TaskInventoryItem.cs b/OpenSim/Framework/TaskInventoryItem.cs index 362d3652b4..3b40381c61 100644 --- a/OpenSim/Framework/TaskInventoryItem.cs +++ b/OpenSim/Framework/TaskInventoryItem.cs @@ -73,6 +73,9 @@ namespace OpenSim.Framework private bool _ownerChanged = false; + // This used ONLY during copy. It can't be relied on at other times! + private bool _scriptRunning = true; + public UUID AssetID { get { return _assetID; @@ -350,6 +353,15 @@ namespace OpenSim.Framework } } + public bool ScriptRunning { + get { + return _scriptRunning; + } + set { + _scriptRunning = value; + } + } + // See ICloneable #region ICloneable Members diff --git a/OpenSim/Region/Framework/Interfaces/IScriptModule.cs b/OpenSim/Region/Framework/Interfaces/IScriptModule.cs index cbaf24139d..42dbedcd56 100644 --- a/OpenSim/Region/Framework/Interfaces/IScriptModule.cs +++ b/OpenSim/Region/Framework/Interfaces/IScriptModule.cs @@ -69,6 +69,8 @@ namespace OpenSim.Region.Framework.Interfaces ArrayList GetScriptErrors(UUID itemID); + bool HasScript(UUID itemID, out bool running); + /// /// Returns true if a script is running. /// @@ -101,4 +103,4 @@ namespace OpenSim.Region.Framework.Interfaces /// Dictionary GetObjectScriptsExecutionTimes(); } -} \ No newline at end of file +} diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs index c223474f90..6427014906 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs @@ -89,6 +89,7 @@ namespace OpenSim.Region.Framework.Scenes { m_items = value; m_inventorySerial++; + QueryScriptStates(); } } @@ -217,6 +218,36 @@ namespace OpenSim.Region.Framework.Scenes } } + private void QueryScriptStates() + { + if (m_part == null || m_part.ParentGroup == null) + return; + + IScriptModule[] engines = m_part.ParentGroup.Scene.RequestModuleInterfaces(); + if (engines == null) // No engine at all + return; + + lock (Items) + { + foreach (TaskInventoryItem item in Items.Values) + { + if (item.InvType == (int)InventoryType.LSL) + { + foreach (IScriptModule e in engines) + { + bool running; + + if (e.HasScript(item.ItemID, out running)) + { + item.ScriptRunning = running; + break; + } + } + } + } + } + } + public int CreateScriptInstances(int startParam, bool postOnRez, string engine, int stateSource) { int scriptsValidForStarting = 0; @@ -321,6 +352,9 @@ namespace OpenSim.Region.Framework.Scenes string script = Utils.BytesToString(asset.Data); m_part.ParentGroup.Scene.EventManager.TriggerRezScript( m_part.LocalId, item.ItemID, script, startParam, postOnRez, engine, stateSource); + if (!item.ScriptRunning) + m_part.ParentGroup.Scene.EventManager.TriggerStopScript( + m_part.LocalId, item.ItemID); m_part.ParentGroup.AddActiveScriptCount(1); m_part.ScheduleFullUpdate(); @@ -1251,4 +1285,4 @@ namespace OpenSim.Region.Framework.Scenes } } } -} \ No newline at end of file +} diff --git a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs index 35fac4e57a..7f3bd765f0 100644 --- a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs +++ b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs @@ -2081,5 +2081,17 @@ namespace OpenSim.Region.ScriptEngine.XEngine // else // m_log.DebugFormat("[XEngine]: Could not find script with ID {0} to resume", itemID); } + + public bool HasScript(UUID itemID, out bool running) + { + running = true; + + IScriptInstance instance = GetInstance(itemID); + if (instance == null) + return false; + + running = instance.Running; + return true; + } } } From 3399596e0e2df2d0e260ba88ce8a0166de8cbff2 Mon Sep 17 00:00:00 2001 From: Michelle Argus Date: Mon, 2 Jul 2012 19:12:10 +0200 Subject: [PATCH 463/547] Adds a list of viewers that are allowed or banned from the region. Signed-off-by: Melanie --- OpenSim/Region/Framework/Scenes/Scene.cs | 65 ++++++++++++++++++++++++ bin/OpenSim.ini.example | 17 +++++++ 2 files changed, 82 insertions(+) mode change 100755 => 100644 bin/OpenSim.ini.example diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 293c72a8c9..2493df1e97 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -120,6 +120,9 @@ namespace OpenSim.Region.Framework.Scenes { get { return m_defaultDrawDistance; } } + + private List m_AllowedViewers = new List(); + private List m_BanedViewers = new List(); // TODO: need to figure out how allow client agents but deny // root agents when ACL denies access to root agent @@ -779,6 +782,24 @@ namespace OpenSim.Region.Framework.Scenes } } + string grant = startupConfig.GetString("AllowedViewerList", String.Empty); + if (grant.Length > 0) + { + foreach (string viewer in grant.Split(',')) + { + m_AllowedViewers.Add(viewer.Trim().ToLower()); + } + } + + grant = startupConfig.GetString("BannedViewerList", String.Empty); + if (grant.Length > 0) + { + foreach (string viewer in grant.Split(',')) + { + m_BanedViewers.Add(viewer.Trim().ToLower()); + } + } + MinFrameTime = startupConfig.GetFloat( "MinFrameTime", MinFrameTime); m_update_backup = startupConfig.GetInt( "UpdateStorageEveryNFrames", m_update_backup); m_update_coarse_locations = startupConfig.GetInt( "UpdateCoarseLocationsEveryNFrames", m_update_coarse_locations); @@ -3417,6 +3438,50 @@ namespace OpenSim.Region.Framework.Scenes return false; } + //Check if the viewer is banned or in the viewer access list + //We check if the substring is listed for higher flexebility + bool ViewerDenied = true; + + //Check if the specific viewer is listed in the allowed viewer list + if (m_AllowedViewers.Count > 0) + { + foreach (string viewer in m_AllowedViewers) + { + if (viewer == agent.Viewer.Substring(0, viewer.Length).Trim().ToLower()) + { + ViewerDenied = false; + break; + } + } + } + else + { + ViewerDenied = false; + } + + //Check if the viewer is in the banned list + if (m_BanedViewers.Count > 0) + { + foreach (string viewer in m_BanedViewers) + { + if (viewer == agent.Viewer.Substring(0, viewer.Length).Trim().ToLower()) + { + ViewerDenied = true; + break; + } + } + } + + if (ViewerDenied) + { + m_log.DebugFormat( + "[SCENE]: Access denied for {0} {1} using {2}", + agent.firstname, agent.lastname, agent.Viewer); + reason = "Access denied, your viewer is banned by the region owner"; + return false; + } + + ScenePresence sp = GetScenePresence(agent.AgentID); if (sp != null && !sp.IsChildAgent) diff --git a/bin/OpenSim.ini.example b/bin/OpenSim.ini.example old mode 100755 new mode 100644 index aa29c079ca..741877e7ab --- a/bin/OpenSim.ini.example +++ b/bin/OpenSim.ini.example @@ -254,6 +254,23 @@ ;; default is false ; TelehubAllowLandmark = false + ;# Comma separated list of viewers which may gain access to the regions. + ;; One can use a Substring of the viewer name to enable only certain subversions + ;; Example: Agent uses the viewer "Imprudence 1.3.2.0" + ;; - "Imprudence" has access + ;; - "Imprudence 1.3" has access + ;; - "Imprudence 1.3.1" has no access + ;; AllowedViewerList = + + ;# Comma separated list of viewers which may not gain access to the regions. + ;; One can use a Substring of the viewer name to disable only certain subversions + ;; Example: Agent uses the viewer "Imprudence 1.3.2.0" + ;; - "Imprudence" has no access + ;; - "Imprudence 1.3" has no access + ;; - "Imprudence 1.3.1" has access + ; BannedViewerList = + + [Estates] ; If these values are commented out then the user will be asked for estate details when required (this is the normal case). ; If these values are uncommented then they will be used to create a default estate as necessary. From 3c9b9a848f6c9723a3cc46f0de8ad802ece7e2a7 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Tue, 3 Jul 2012 22:58:58 +0100 Subject: [PATCH 464/547] Fix issue in database tests where sogs being stored are not in a scene. This puts an extra m_part.ParentGroup.Scene == null check at the top of SceneObjectPartInventory.QueryScriptStates() --- OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs index 6427014906..866311a298 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs @@ -220,7 +220,7 @@ namespace OpenSim.Region.Framework.Scenes private void QueryScriptStates() { - if (m_part == null || m_part.ParentGroup == null) + if (m_part == null || m_part.ParentGroup == null || m_part.ParentGroup.Scene == null) return; IScriptModule[] engines = m_part.ParentGroup.Scene.RequestModuleInterfaces(); From 8183c2926d563aa15cfc53f624353e1779061721 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Tue, 3 Jul 2012 23:19:11 +0100 Subject: [PATCH 465/547] minor: Add some method doc to HasGroupChanged and Schedule GroupForFull/PartUpdate() to indicate when region modules need to invoke them --- .../Framework/Scenes/SceneObjectGroup.cs | 23 +++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs index 1e900a0746..96cc3766be 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs @@ -108,6 +108,15 @@ namespace OpenSim.Region.Framework.Scenes private long timeFirstChanged; private long timeLastChanged; + /// + /// This indicates whether the object has changed such that it needs to be repersisted to permenant storage + /// (the database). + /// + /// + /// Ultimately, this should be managed such that region modules can change it at the end of a set of operations + /// so that either all changes are preserved or none at all. However, currently, a large amount of internal + /// code will set this anyway when some object properties are changed. + /// public bool HasGroupChanged { set @@ -1817,8 +1826,13 @@ namespace OpenSim.Region.Framework.Scenes } /// - /// Schedule a full update for this scene object + /// Schedule a full update for this scene object to all interested viewers. /// + /// + /// Ultimately, this should be managed such that region modules can invoke it at the end of a set of operations + /// so that either all changes are sent at once. However, currently, a large amount of internal + /// code will set this anyway when some object properties are changed. + /// public void ScheduleGroupForFullUpdate() { // if (IsAttachment) @@ -1837,8 +1851,13 @@ namespace OpenSim.Region.Framework.Scenes } /// - /// Schedule a terse update for this scene object + /// Schedule a terse update for this scene object to all interested viewers. /// + /// + /// Ultimately, this should be managed such that region modules can invoke it at the end of a set of operations + /// so that either all changes are sent at once. However, currently, a large amount of internal + /// code will set this anyway when some object properties are changed. + /// public void ScheduleGroupForTerseUpdate() { // m_log.DebugFormat("[SOG]: Scheduling terse update for {0} {1}", Name, UUID); From f7b48025777a653589b7860e94aaa3230497ffa3 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Tue, 3 Jul 2012 23:26:02 +0100 Subject: [PATCH 466/547] Correct spelling mistake m_BanedViewers to m_BannedViewers --- OpenSim/Region/Framework/Scenes/Scene.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 2493df1e97..36d39eac79 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -122,7 +122,7 @@ namespace OpenSim.Region.Framework.Scenes } private List m_AllowedViewers = new List(); - private List m_BanedViewers = new List(); + private List m_BannedViewers = new List(); // TODO: need to figure out how allow client agents but deny // root agents when ACL denies access to root agent @@ -796,7 +796,7 @@ namespace OpenSim.Region.Framework.Scenes { foreach (string viewer in grant.Split(',')) { - m_BanedViewers.Add(viewer.Trim().ToLower()); + m_BannedViewers.Add(viewer.Trim().ToLower()); } } @@ -3460,9 +3460,9 @@ namespace OpenSim.Region.Framework.Scenes } //Check if the viewer is in the banned list - if (m_BanedViewers.Count > 0) + if (m_BannedViewers.Count > 0) { - foreach (string viewer in m_BanedViewers) + foreach (string viewer in m_BannedViewers) { if (viewer == agent.Viewer.Substring(0, viewer.Length).Trim().ToLower()) { From 5691a8b860b22939e2b608d6d8400b5260b25cf3 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Wed, 4 Jul 2012 00:15:03 +0100 Subject: [PATCH 467/547] refactor: rename Watchdog.WATCHDOG_TIMEOUT_MS to DEFAULT_WATCHDOG_TIMEOUT_MS to reflect what it actually is --- OpenSim/Framework/Watchdog.cs | 6 +++--- OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/OpenSim/Framework/Watchdog.cs b/OpenSim/Framework/Watchdog.cs index 7552cd15b6..2b3a719daf 100644 --- a/OpenSim/Framework/Watchdog.cs +++ b/OpenSim/Framework/Watchdog.cs @@ -41,8 +41,8 @@ namespace OpenSim.Framework /// Timer interval in milliseconds for the watchdog timer const double WATCHDOG_INTERVAL_MS = 2500.0d; - /// Maximum timeout in milliseconds before a thread is considered dead - public const int WATCHDOG_TIMEOUT_MS = 5000; + /// Default timeout in milliseconds before a thread is considered dead + public const int DEFAULT_WATCHDOG_TIMEOUT_MS = 5000; [System.Diagnostics.DebuggerDisplay("{Thread.Name}")] public class ThreadWatchdogInfo @@ -122,7 +122,7 @@ namespace OpenSim.Framework public static Thread StartThread( ThreadStart start, string name, ThreadPriority priority, bool isBackground, bool alarmIfTimeout) { - return StartThread(start, name, priority, isBackground, alarmIfTimeout, null, WATCHDOG_TIMEOUT_MS); + return StartThread(start, name, priority, isBackground, alarmIfTimeout, null, DEFAULT_WATCHDOG_TIMEOUT_MS); } /// diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs index 44c65e0460..468d5246ef 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs @@ -270,7 +270,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP false, true, GetWatchdogIncomingAlarmData, - Watchdog.WATCHDOG_TIMEOUT_MS); + Watchdog.DEFAULT_WATCHDOG_TIMEOUT_MS); Watchdog.StartThread( OutgoingPacketHandler, @@ -279,7 +279,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP false, true, GetWatchdogOutgoingAlarmData, - Watchdog.WATCHDOG_TIMEOUT_MS); + Watchdog.DEFAULT_WATCHDOG_TIMEOUT_MS); m_elapsedMSSinceLastStatReport = Environment.TickCount; } From 58b13d51a7eddb442e38e6dc6790a9e7cf68bad7 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Wed, 4 Jul 2012 20:57:48 +0100 Subject: [PATCH 468/547] refactor: make llGiveInventory() use existing GetInventoryItem() method rather than iterate through TaskInventory itself. --- .../Shared/Api/Implementation/LSL_Api.cs | 35 ++++++------------- 1 file changed, 11 insertions(+), 24 deletions(-) diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index 12eb098033..8a3efa7461 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -3860,11 +3860,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public void llGiveInventory(string destination, string inventory) { m_host.AddScriptLPS(1); - bool found = false; + UUID destId = UUID.Zero; - UUID objId = UUID.Zero; - int assetType = 0; - string objName = String.Empty; if (!UUID.TryParse(destination, out destId)) { @@ -3872,28 +3869,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api return; } - // move the first object found with this inventory name - lock (m_host.TaskInventory) - { - foreach (KeyValuePair inv in m_host.TaskInventory) - { - if (inv.Value.Name == inventory) - { - found = true; - objId = inv.Key; - assetType = inv.Value.Type; - objName = inv.Value.Name; - break; - } - } - } + TaskInventoryItem item = m_host.Inventory.GetInventoryItem(inventory); - if (!found) + if (item == null) { llSay(0, String.Format("Could not find object '{0}'", inventory)); throw new Exception(String.Format("The inventory object '{0}' could not be found", inventory)); } + UUID objId = item.ItemID; + // check if destination is an object if (World.GetSceneObjectPart(destId) != null) { @@ -3924,21 +3909,23 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api return; byte[] bucket = new byte[17]; - bucket[0] = (byte)assetType; + bucket[0] = (byte)item.Type; byte[] objBytes = agentItem.ID.GetBytes(); Array.Copy(objBytes, 0, bucket, 1, 16); GridInstantMessage msg = new GridInstantMessage(World, - m_host.UUID, m_host.Name+", an object owned by "+ - resolveName(m_host.OwnerID)+",", destId, + m_host.UUID, m_host.Name + ", an object owned by " + + resolveName(m_host.OwnerID) + ",", destId, (byte)InstantMessageDialog.TaskInventoryOffered, - false, objName+"\n"+m_host.Name+" is located at "+ + false, item.Name + "\n" + m_host.Name + " is located at " + World.RegionInfo.RegionName+" "+ m_host.AbsolutePosition.ToString(), agentItem.ID, true, m_host.AbsolutePosition, bucket); + if (m_TransferModule != null) m_TransferModule.SendInstantMessage(msg, delegate(bool success) {}); + ScriptSleep(3000); } } From ae64d089c669a9f953fc0992ca4de3a700395def Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Wed, 4 Jul 2012 21:05:51 +0100 Subject: [PATCH 469/547] refactor: In llRemoveInventory() use existing GetInventoryItem() method rather than have it iterate through TaskInventory itself. --- .../Shared/Api/Implementation/LSL_Api.cs | 23 ++++++++----------- 1 file changed, 9 insertions(+), 14 deletions(-) diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index 8a3efa7461..b52ebac0bc 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -3934,20 +3934,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api { m_host.AddScriptLPS(1); - lock (m_host.TaskInventory) - { - foreach (TaskInventoryItem item in m_host.TaskInventory.Values) - { - if (item.Name == name) - { - if (item.ItemID == m_item.ItemID) - throw new ScriptDeleteException(); - else - m_host.Inventory.RemoveInventoryItem(item.ItemID); - return; - } - } - } + TaskInventoryItem item = m_host.Inventory.GetInventoryItem(name); + + if (item == null) + return; + + if (item.ItemID == m_item.ItemID) + throw new ScriptDeleteException(); + else + m_host.Inventory.RemoveInventoryItem(item.ItemID); } public void llSetText(string text, LSL_Vector color, double alpha) From 3717812ce090cae850449ed82463545c079df68d Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Wed, 4 Jul 2012 21:15:00 +0100 Subject: [PATCH 470/547] refactor: In llCollisionSound() use existing GetInventoryItem() method rather than have it iterate through TaskInventory itself. --- .../Shared/Api/Implementation/LSL_Api.cs | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index b52ebac0bc..ff4b690a19 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -4290,18 +4290,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api UUID soundId = UUID.Zero; if (!UUID.TryParse(impact_sound, out soundId)) { - lock (m_host.TaskInventory) - { - foreach (TaskInventoryItem item in m_host.TaskInventory.Values) - { - if (item.Type == (int)AssetType.Sound && item.Name == impact_sound) - { - soundId = item.AssetID; - break; - } - } - } + TaskInventoryItem item = m_host.Inventory.GetInventoryItem(impact_sound); + + if (item != null && item.Type == (int)AssetType.Sound) + soundId = item.AssetID; } + m_host.CollisionSound = soundId; m_host.CollisionSoundVolume = (float)impact_volume; } From 3769739ca75bd28a126034a74848012164db31b6 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Wed, 4 Jul 2012 21:19:16 +0100 Subject: [PATCH 471/547] In llRequestInventoryData() use GetInventoryItems() rather than cloning TaskInventory directory GetInventoryItems() returns a new list and so is equivalent, and creates this list under lock whereas Clone() is not thread-safe --- .../Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index ff4b690a19..66d99a2b52 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -4084,9 +4084,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api { m_host.AddScriptLPS(1); - TaskInventoryDictionary itemDictionary = (TaskInventoryDictionary)m_host.TaskInventory.Clone(); - - foreach (TaskInventoryItem item in itemDictionary.Values) + foreach (TaskInventoryItem item in m_host.Inventory.GetInventoryItems()) { if (item.Type == 3 && item.Name == name) { @@ -4118,6 +4116,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api return tid.ToString(); } } + ScriptSleep(1000); return String.Empty; } From 4b2b14dad12d5a8f64609e7eeb3da62a5ca2f8b1 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Wed, 4 Jul 2012 21:22:43 +0100 Subject: [PATCH 472/547] In llMessageLinked() use GetInventoryItems() rather than cloning TaskInventory directory GetInventoryItems() returns a new list and so is equivalent, and creates this list under lock whereas Clone() is not thread-safe --- .../ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index 66d99a2b52..f57f752ba8 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -4116,7 +4116,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api return tid.ToString(); } } - + ScriptSleep(1000); return String.Empty; } @@ -4333,9 +4333,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api UUID partItemID; foreach (SceneObjectPart part in parts) { - TaskInventoryDictionary itemsDictionary = (TaskInventoryDictionary)part.TaskInventory.Clone(); - - foreach (TaskInventoryItem item in itemsDictionary.Values) + foreach (TaskInventoryItem item in part.Inventory.GetInventoryItems()) { if (item.Type == ScriptBaseClass.INVENTORY_SCRIPT) { From 0e3fce9b5c26ee21dee64f8667e7b47b71dbdb3a Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Wed, 4 Jul 2012 21:25:58 +0100 Subject: [PATCH 473/547] refactor: In llGetInventoryKey() use existing GetInventoryItem() --- .../Shared/Api/Implementation/LSL_Api.cs | 24 +++++++------------ 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index f57f752ba8..b0602fc636 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -4703,22 +4703,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api { m_host.AddScriptLPS(1); - lock (m_host.TaskInventory) + TaskInventoryItem item = m_host.Inventory.GetInventoryItem(name); + + if (item == null) + return UUID.Zero.ToString(); + + if ((item.CurrentPermissions + & (uint)(PermissionMask.Copy | PermissionMask.Transfer | PermissionMask.Modify)) + == (uint)(PermissionMask.Copy | PermissionMask.Transfer | PermissionMask.Modify)) { - foreach (KeyValuePair inv in m_host.TaskInventory) - { - if (inv.Value.Name == name) - { - if ((inv.Value.CurrentPermissions & (uint)(PermissionMask.Copy | PermissionMask.Transfer | PermissionMask.Modify)) == (uint)(PermissionMask.Copy | PermissionMask.Transfer | PermissionMask.Modify)) - { - return inv.Value.AssetID.ToString(); - } - else - { - return UUID.Zero.ToString(); - } - } - } + return item.AssetID.ToString(); } return UUID.Zero.ToString(); From dff7cae2ee78942d97f8481b16e0f682dfcce038 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Wed, 4 Jul 2012 21:33:35 +0100 Subject: [PATCH 474/547] refactor: replace use of LSL_Api.GetTaskInventoryItem() with existing GetInventoryItem() --- .../Shared/Api/Implementation/LSL_Api.cs | 33 +++++++------------ 1 file changed, 11 insertions(+), 22 deletions(-) diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index b0602fc636..813fffdaed 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -6296,20 +6296,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api } } - protected UUID GetTaskInventoryItem(string name) - { - lock (m_host.TaskInventory) - { - foreach (KeyValuePair inv in m_host.TaskInventory) - { - if (inv.Value.Name == name) - return inv.Key; - } - } - - return UUID.Zero; - } - public void llGiveInventoryList(string destination, string category, LSL_List inventory) { m_host.AddScriptLPS(1); @@ -6322,16 +6308,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api foreach (Object item in inventory.Data) { + string rawItemString = item.ToString(); + UUID itemID; - if (UUID.TryParse(item.ToString(), out itemID)) + if (UUID.TryParse(rawItemString, out itemID)) { itemList.Add(itemID); } else { - itemID = GetTaskInventoryItem(item.ToString()); - if (itemID != UUID.Zero) - itemList.Add(itemID); + TaskInventoryItem taskItem = m_host.Inventory.GetInventoryItem(rawItemString); + + if (taskItem != null) + itemList.Add(taskItem.ItemID); } } @@ -6349,11 +6338,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api Array.Copy(objBytes, 0, bucket, 1, 16); GridInstantMessage msg = new GridInstantMessage(World, - m_host.UUID, m_host.Name+", an object owned by "+ - resolveName(m_host.OwnerID)+",", destID, + m_host.UUID, m_host.Name + ", an object owned by " + + resolveName(m_host.OwnerID) + ",", destID, (byte)InstantMessageDialog.InventoryOffered, - false, category+"\n"+m_host.Name+" is located at "+ - World.RegionInfo.RegionName+" "+ + false, category + "\n" + m_host.Name + " is located at " + + World.RegionInfo.RegionName + " " + m_host.AbsolutePosition.ToString(), folderID, true, m_host.AbsolutePosition, bucket); From 857494f6bdef5aef8cfcbee84ca668c2371bfdf0 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Wed, 4 Jul 2012 21:36:44 +0100 Subject: [PATCH 475/547] refactor: In llRemoteLoadScriptPin() use existing GetInventoryItem() --- .../Shared/Api/Implementation/LSL_Api.cs | 25 ++++--------------- 1 file changed, 5 insertions(+), 20 deletions(-) diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index 813fffdaed..a1620e7bab 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -6644,9 +6644,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public void llRemoteLoadScriptPin(string target, string name, int pin, int running, int start_param) { m_host.AddScriptLPS(1); - bool found = false; + UUID destId = UUID.Zero; - UUID srcId = UUID.Zero; if (!UUID.TryParse(target, out destId)) { @@ -6661,31 +6660,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api } // copy the first script found with this inventory name - lock (m_host.TaskInventory) - { - foreach (KeyValuePair inv in m_host.TaskInventory) - { - if (inv.Value.Name == name) - { - // make sure the object is a script - if (10 == inv.Value.Type) - { - found = true; - srcId = inv.Key; - break; - } - } - } - } + TaskInventoryItem item = m_host.Inventory.GetInventoryItem(name); - if (!found) + // make sure the object is a script + if (item == null || item.Type != 10) { llSay(0, "Could not find script " + name); return; } // the rest of the permission checks are done in RezScript, so check the pin there as well - World.RezScriptFromPrim(srcId, m_host, destId, pin, running, start_param); + World.RezScriptFromPrim(item.ItemID, m_host, destId, pin, running, start_param); // this will cause the delay even if the script pin or permissions were wrong - seems ok ScriptSleep(3000); From f9fa34408dd178eb202e0cc1336da67cc0a494f0 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Wed, 4 Jul 2012 21:42:04 +0100 Subject: [PATCH 476/547] refactor: in llGetInventoryPermMask use existing GetInventoryItem() --- .../Shared/Api/Implementation/LSL_Api.cs | 40 +++++++++---------- 1 file changed, 18 insertions(+), 22 deletions(-) diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index a1620e7bab..a173d649ab 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -6644,7 +6644,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public void llRemoteLoadScriptPin(string target, string name, int pin, int running, int start_param) { m_host.AddScriptLPS(1); - + UUID destId = UUID.Zero; if (!UUID.TryParse(target, out destId)) @@ -9032,31 +9032,27 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api } } - public LSL_Integer llGetInventoryPermMask(string item, int mask) + public LSL_Integer llGetInventoryPermMask(string itemName, int mask) { m_host.AddScriptLPS(1); - lock (m_host.TaskInventory) + TaskInventoryItem item = m_host.Inventory.GetInventoryItem(itemName); + + if (item == null) + return -1; + + switch (mask) { - foreach (KeyValuePair inv in m_host.TaskInventory) - { - if (inv.Value.Name == item) - { - switch (mask) - { - case 0: - return (int)inv.Value.BasePermissions; - case 1: - return (int)inv.Value.CurrentPermissions; - case 2: - return (int)inv.Value.GroupPermissions; - case 3: - return (int)inv.Value.EveryonePermissions; - case 4: - return (int)inv.Value.NextPermissions; - } - } - } + case 0: + return (int)item.BasePermissions; + case 1: + return (int)item.CurrentPermissions; + case 2: + return (int)item.GroupPermissions; + case 3: + return (int)item.EveryonePermissions; + case 4: + return (int)item.NextPermissions; } return -1; From d933bdbd59da50e2c335b65870416ac8e5035d3a Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Wed, 4 Jul 2012 21:47:20 +0100 Subject: [PATCH 477/547] refactor: In llGetInventoryPermMask() use existing GetInventoryItem() --- .../Shared/Api/Implementation/LSL_Api.cs | 45 +++++++++---------- 1 file changed, 21 insertions(+), 24 deletions(-) diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index a173d649ab..fce09bf6e4 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -9058,38 +9058,35 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api return -1; } - public void llSetInventoryPermMask(string item, int mask, int value) + public void llSetInventoryPermMask(string itemName, int mask, int value) { m_host.AddScriptLPS(1); + if (m_ScriptEngine.Config.GetBoolean("AllowGodFunctions", false)) { if (World.Permissions.CanRunConsoleCommand(m_host.OwnerID)) { - lock (m_host.TaskInventory) + TaskInventoryItem item = m_host.Inventory.GetInventoryItem(itemName); + + if (item != null) { - foreach (KeyValuePair inv in m_host.TaskInventory) + switch (mask) { - if (inv.Value.Name == item) - { - switch (mask) - { - case 0: - inv.Value.BasePermissions = (uint)value; - break; - case 1: - inv.Value.CurrentPermissions = (uint)value; - break; - case 2: - inv.Value.GroupPermissions = (uint)value; - break; - case 3: - inv.Value.EveryonePermissions = (uint)value; - break; - case 4: - inv.Value.NextPermissions = (uint)value; - break; - } - } + case 0: + item.BasePermissions = (uint)value; + break; + case 1: + item.CurrentPermissions = (uint)value; + break; + case 2: + item.GroupPermissions = (uint)value; + break; + case 3: + item.EveryonePermissions = (uint)value; + break; + case 4: + item.NextPermissions = (uint)value; + break; } } } From f2b0377c28623ee915387fef37c88ab3b7694ba8 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Wed, 4 Jul 2012 21:49:21 +0100 Subject: [PATCH 478/547] refactor: In llGetInventoryCreator() use existing GetInventoryItem() --- .../Shared/Api/Implementation/LSL_Api.cs | 20 ++++++++----------- 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index fce09bf6e4..338ae88cf1 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -9093,24 +9093,20 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api } } - public LSL_String llGetInventoryCreator(string item) + public LSL_String llGetInventoryCreator(string itemName) { m_host.AddScriptLPS(1); - lock (m_host.TaskInventory) + TaskInventoryItem item = m_host.Inventory.GetInventoryItem(itemName); + + if (item == null) { - foreach (KeyValuePair inv in m_host.TaskInventory) - { - if (inv.Value.Name == item) - { - return inv.Value.CreatorID.ToString(); - } - } + llSay(0, "No item name '" + item + "'"); + + return String.Empty; } - llSay(0, "No item name '" + item + "'"); - - return String.Empty; + return item.CreatorID.ToString(); } public void llOwnerSay(string msg) From 9fac7fd932aa929e350fb4795f5036f7dd0cf78f Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Wed, 4 Jul 2012 21:50:52 +0100 Subject: [PATCH 479/547] refactor: In llGetInventoryType() use existing GetInventoryItem() --- .../Shared/Api/Implementation/LSL_Api.cs | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index 338ae88cf1..a8a2a501a7 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -9656,18 +9656,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api { m_host.AddScriptLPS(1); - lock (m_host.TaskInventory) - { - foreach (KeyValuePair inv in m_host.TaskInventory) - { - if (inv.Value.Name == name) - { - return inv.Value.Type; - } - } - } + TaskInventoryItem item = m_host.Inventory.GetInventoryItem(name); - return -1; + if (item == null) + return -1; + + return item.Type; } public void llSetPayPrice(int price, LSL_List quick_pay_buttons) From eacba4fc0b1e3a34f8bae140c402eacb68ecbb94 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Wed, 4 Jul 2012 21:54:30 +0100 Subject: [PATCH 480/547] refactor: use existing GetInventoryItem() in GetScriptByName(), itself renamed from ScriptByName() --- .../Shared/Api/Implementation/LSL_Api.cs | 22 ++++++++----------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index a8a2a501a7..38f146f2dd 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -192,7 +192,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api m_host.AddScriptLPS(1); - if ((item = ScriptByName(name)) != UUID.Zero) + if ((item = GetScriptByName(name)) != UUID.Zero) m_ScriptEngine.ResetScript(item); else ShoutError("llResetOtherScript: script "+name+" not found"); @@ -204,7 +204,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api m_host.AddScriptLPS(1); - if ((item = ScriptByName(name)) != UUID.Zero) + if ((item = GetScriptByName(name)) != UUID.Zero) { return m_ScriptEngine.GetScriptState(item) ?1:0; } @@ -226,7 +226,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api // These functions are supposed to be robust, // so get the state one step at a time. - if ((item = ScriptByName(name)) != UUID.Zero) + if ((item = GetScriptByName(name)) != UUID.Zero) { m_ScriptEngine.SetScriptState(item, run == 0 ? false : true); } @@ -10455,18 +10455,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api return new LSL_List(); } - internal UUID ScriptByName(string name) + internal UUID GetScriptByName(string name) { - lock (m_host.TaskInventory) - { - foreach (TaskInventoryItem item in m_host.TaskInventory.Values) - { - if (item.Type == 10 && item.Name == name) - return item.ItemID; - } - } + TaskInventoryItem item = m_host.Inventory.GetInventoryItem(name); - return UUID.Zero; + if (item == null || item.Type != 10) + return UUID.Zero; + + return item.ItemID; } internal void ShoutError(string msg) From 1816ecb747708fea73eec08d3e51a8a2b8c7bd06 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Wed, 4 Jul 2012 21:57:57 +0100 Subject: [PATCH 481/547] refactor: In llGetNumberOfNotecardLines() use existing GetInventoryItem() rather than inspecting a clone of the TaskInventory dictionary that was not cloned thread-safe --- .../Shared/Api/Implementation/LSL_Api.cs | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index 38f146f2dd..2b8c4c1dab 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -10502,20 +10502,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api { m_host.AddScriptLPS(1); - TaskInventoryDictionary itemsDictionary = (TaskInventoryDictionary)m_host.TaskInventory.Clone(); - UUID assetID = UUID.Zero; if (!UUID.TryParse(name, out assetID)) { - foreach (TaskInventoryItem item in itemsDictionary.Values) - { - if (item.Type == 7 && item.Name == name) - { - assetID = item.AssetID; - break; - } - } + TaskInventoryItem item = m_host.Inventory.GetInventoryItem(name); + + if (item != null && item.Type == 7) + assetID = item.AssetID; } if (assetID == UUID.Zero) From 2f998fce1f51e9991852144c940281fedffbbbca Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Wed, 4 Jul 2012 22:00:39 +0100 Subject: [PATCH 482/547] refactor: In llGetNotecardLine() use existing GetInventoryItem() rather than inspecting a clone of the TaskInventory dictionary that was not cloned thread-safe --- .../Shared/Api/Implementation/LSL_Api.cs | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index 2b8c4c1dab..cf65abbae2 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -10558,20 +10558,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api { m_host.AddScriptLPS(1); - TaskInventoryDictionary itemsDictionary = (TaskInventoryDictionary)m_host.TaskInventory.Clone(); - UUID assetID = UUID.Zero; if (!UUID.TryParse(name, out assetID)) { - foreach (TaskInventoryItem item in itemsDictionary.Values) - { - if (item.Type == 7 && item.Name == name) - { - assetID = item.AssetID; - break; - } - } + TaskInventoryItem item = m_host.Inventory.GetInventoryItem(name); + + if (item != null && item.Type == 7) + assetID = item.AssetID; } if (assetID == UUID.Zero) From 7b327848d0a74296e0180bb8d27544e6c5570215 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Wed, 4 Jul 2012 22:21:47 +0100 Subject: [PATCH 483/547] Use GetInventoryItem() in llRezAtRoot rather than iterating through a cloned dictionary --- .../Shared/Api/Implementation/LSL_Api.cs | 94 +++++++++---------- 1 file changed, 45 insertions(+), 49 deletions(-) diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index cf65abbae2..0a25454242 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -2738,67 +2738,63 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api { m_host.AddScriptLPS(1); - Util.FireAndForget(delegate (object x) + Util.FireAndForget(x => { if (Double.IsNaN(rot.x) || Double.IsNaN(rot.y) || Double.IsNaN(rot.z) || Double.IsNaN(rot.s)) return; + float dist = (float)llVecDist(llGetPos(), pos); if (dist > m_ScriptDistanceFactor * 10.0f) return; - //Clone is thread-safe - TaskInventoryDictionary partInventory = (TaskInventoryDictionary)m_host.TaskInventory.Clone(); + TaskInventoryItem item = m_host.Inventory.GetInventoryItem(inventory); - foreach (KeyValuePair inv in partInventory) + if (item == null) { - if (inv.Value.Name == inventory) - { - // make sure we're an object. - if (inv.Value.InvType != (int)InventoryType.Object) - { - llSay(0, "Unable to create requested object. Object is missing from database."); - return; - } - - Vector3 llpos = new Vector3((float)pos.x, (float)pos.y, (float)pos.z); - Vector3 llvel = new Vector3((float)vel.x, (float)vel.y, (float)vel.z); - - // need the magnitude later - // float velmag = (float)Util.GetMagnitude(llvel); - - SceneObjectGroup new_group = World.RezObject(m_host, inv.Value, llpos, Rot2Quaternion(rot), llvel, param); - - // If either of these are null, then there was an unknown error. - if (new_group == null) - continue; - - // objects rezzed with this method are die_at_edge by default. - new_group.RootPart.SetDieAtEdge(true); - - new_group.ResumeScripts(); - - m_ScriptEngine.PostObjectEvent(m_host.LocalId, new EventParams( - "object_rez", new Object[] { - new LSL_String( - new_group.RootPart.UUID.ToString()) }, - new DetectParams[0])); - - float groupmass = new_group.GetMass(); - - PhysicsActor pa = new_group.RootPart.PhysActor; - - if (pa != null && pa.IsPhysical && llvel != Vector3.Zero) - { - //Recoil. - llApplyImpulse(new LSL_Vector(llvel.X * groupmass, llvel.Y * groupmass, llvel.Z * groupmass), 0); - } - // Variable script delay? (see (http://wiki.secondlife.com/wiki/LSL_Delay) - return; - } + llSay(0, "Could not find object " + inventory); + return; } - llSay(0, "Could not find object " + inventory); + if (item.InvType != (int)InventoryType.Object) + { + llSay(0, "Unable to create requested object. Object is missing from database."); + return; + } + + Vector3 llpos = new Vector3((float)pos.x, (float)pos.y, (float)pos.z); + Vector3 llvel = new Vector3((float)vel.x, (float)vel.y, (float)vel.z); + + // need the magnitude later + // float velmag = (float)Util.GetMagnitude(llvel); + + SceneObjectGroup new_group = World.RezObject(m_host, item, llpos, Rot2Quaternion(rot), llvel, param); + + // If either of these are null, then there was an unknown error. + if (new_group == null) + return; + + // objects rezzed with this method are die_at_edge by default. + new_group.RootPart.SetDieAtEdge(true); + + new_group.ResumeScripts(); + + m_ScriptEngine.PostObjectEvent(m_host.LocalId, new EventParams( + "object_rez", new Object[] { + new LSL_String( + new_group.RootPart.UUID.ToString()) }, + new DetectParams[0])); + + float groupmass = new_group.GetMass(); + + PhysicsActor pa = new_group.RootPart.PhysActor; + + if (pa != null && pa.IsPhysical && llvel != Vector3.Zero) + { + //Recoil. + llApplyImpulse(new LSL_Vector(llvel.X * groupmass, llvel.Y * groupmass, llvel.Z * groupmass), 0); + } + // Variable script delay? (see (http://wiki.secondlife.com/wiki/LSL_Delay) }); //ScriptSleep((int)((groupmass * velmag) / 10)); From 951b45b80fd504b4874b9ec3e0fbff49a25cb46f Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 5 Jul 2012 00:05:06 +0100 Subject: [PATCH 484/547] Add OSSL function osForceAttachToAvatarFromInventory() This works like osForceAttachToAvatar() but allows an object to be directly specified from the script object's inventory rather than forcing it to be rezzed in the scene first. Still only attaches objects to the owner of the script. This allows one to bypass the complicated co-ordination of first rezzing objects in the scene before attaching them. Threat level high. --- .../Tests/AttachmentsModuleTests.cs | 2 +- .../World/Media/Moap/Tests/MoapTests.cs | 4 +- .../Scenes/Tests/SceneObjectBasicTests.cs | 22 +-- .../Scenes/Tests/SceneObjectLinkingTests.cs | 24 +-- .../Scenes/Tests/SceneObjectResizeTests.cs | 2 +- .../Scenes/Tests/ScenePresenceSitTests.cs | 8 +- .../Scenes/Tests/TaskInventoryTests.cs | 9 +- .../World/NPC/Tests/NPCModuleTests.cs | 4 +- .../Shared/Api/Implementation/OSSL_Api.cs | 54 +++++- .../Shared/Api/Interface/IOSSL_Api.cs | 7 + .../Shared/Api/Runtime/OSSL_Stub.cs | 5 + .../Shared/Tests/LSL_ApiLinkingTests.cs | 7 +- .../ScriptEngine/Shared/Tests/LSL_ApiTest.cs | 2 +- .../Shared/Tests/OSSL_ApiAttachmentTests.cs | 178 ++++++++++++++++++ .../Shared/Tests/OSSL_ApiNpcTests.cs | 6 +- OpenSim/Tests/Common/Helpers/SceneHelpers.cs | 10 +- .../Common/Helpers/TaskInventoryHelpers.cs | 47 ++++- 17 files changed, 340 insertions(+), 51 deletions(-) create mode 100644 OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiAttachmentTests.cs diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs index b0c087fb56..78569539c6 100644 --- a/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs +++ b/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs @@ -122,7 +122,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests string attName = "att"; - SceneObjectGroup so = SceneHelpers.AddSceneObject(scene, attName, sp.UUID).ParentGroup; + SceneObjectGroup so = SceneHelpers.AddSceneObject(scene, attName, sp.UUID); scene.AttachmentsModule.AttachObject(sp, so, (uint)AttachmentPoint.Chest, false); diff --git a/OpenSim/Region/CoreModules/World/Media/Moap/Tests/MoapTests.cs b/OpenSim/Region/CoreModules/World/Media/Moap/Tests/MoapTests.cs index 0545250db7..396095afe5 100644 --- a/OpenSim/Region/CoreModules/World/Media/Moap/Tests/MoapTests.cs +++ b/OpenSim/Region/CoreModules/World/Media/Moap/Tests/MoapTests.cs @@ -63,7 +63,7 @@ namespace OpenSim.Region.CoreModules.World.Media.Moap.Tests TestHelpers.InMethod(); // log4net.Config.XmlConfigurator.Configure(); - SceneObjectPart part = SceneHelpers.AddSceneObject(m_scene); + SceneObjectPart part = SceneHelpers.AddSceneObject(m_scene).RootPart; MediaEntry me = new MediaEntry(); m_module.SetMediaEntry(part, 1, me); @@ -88,7 +88,7 @@ namespace OpenSim.Region.CoreModules.World.Media.Moap.Tests string homeUrl = "opensimulator.org"; - SceneObjectPart part = SceneHelpers.AddSceneObject(m_scene); + SceneObjectPart part = SceneHelpers.AddSceneObject(m_scene).RootPart; MediaEntry me = new MediaEntry() { HomeURL = homeUrl }; m_module.SetMediaEntry(part, 1, me); diff --git a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectBasicTests.cs b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectBasicTests.cs index 81add43062..3398a53fb8 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectBasicTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectBasicTests.cs @@ -186,15 +186,15 @@ namespace OpenSim.Region.Framework.Scenes.Tests TestHelpers.InMethod(); TestScene scene = new SceneHelpers().SetupScene(); - SceneObjectPart part = SceneHelpers.AddSceneObject(scene); + SceneObjectGroup so = SceneHelpers.AddSceneObject(scene); - Assert.That(part.ParentGroup.IsDeleted, Is.False); + Assert.That(so.IsDeleted, Is.False); - scene.DeleteSceneObject(part.ParentGroup, false); + scene.DeleteSceneObject(so, false); - Assert.That(part.ParentGroup.IsDeleted, Is.True); + Assert.That(so.IsDeleted, Is.True); - SceneObjectPart retrievedPart = scene.GetSceneObjectPart(part.LocalId); + SceneObjectPart retrievedPart = scene.GetSceneObjectPart(so.LocalId); Assert.That(retrievedPart, Is.Null); } @@ -215,22 +215,22 @@ namespace OpenSim.Region.Framework.Scenes.Tests AsyncSceneObjectGroupDeleter sogd = scene.SceneObjectGroupDeleter; sogd.Enabled = false; - SceneObjectPart part = SceneHelpers.AddSceneObject(scene); + SceneObjectGroup so = SceneHelpers.AddSceneObject(scene); IClientAPI client = SceneHelpers.AddScenePresence(scene, agentId).ControllingClient; - scene.DeRezObjects(client, new System.Collections.Generic.List() { part.LocalId }, UUID.Zero, DeRezAction.Delete, UUID.Zero); + scene.DeRezObjects(client, new System.Collections.Generic.List() { so.LocalId }, UUID.Zero, DeRezAction.Delete, UUID.Zero); - SceneObjectPart retrievedPart = scene.GetSceneObjectPart(part.LocalId); + SceneObjectPart retrievedPart = scene.GetSceneObjectPart(so.LocalId); Assert.That(retrievedPart, Is.Not.Null); - Assert.That(part.ParentGroup.IsDeleted, Is.False); + Assert.That(so.IsDeleted, Is.False); sogd.InventoryDeQueueAndDelete(); - Assert.That(part.ParentGroup.IsDeleted, Is.True); + Assert.That(so.IsDeleted, Is.True); - SceneObjectPart retrievedPart2 = scene.GetSceneObjectPart(part.LocalId); + SceneObjectPart retrievedPart2 = scene.GetSceneObjectPart(so.LocalId); Assert.That(retrievedPart2, Is.Null); } diff --git a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectLinkingTests.cs b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectLinkingTests.cs index 1add3ddb8c..0e525c92de 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectLinkingTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectLinkingTests.cs @@ -72,10 +72,10 @@ namespace OpenSim.Region.Framework.Scenes.Tests bool debugtest = false; Scene scene = new SceneHelpers().SetupScene(); - SceneObjectPart part1 = SceneHelpers.AddSceneObject(scene); - SceneObjectGroup grp1 = part1.ParentGroup; - SceneObjectPart part2 = SceneHelpers.AddSceneObject(scene); - SceneObjectGroup grp2 = part2.ParentGroup; + SceneObjectGroup grp1 = SceneHelpers.AddSceneObject(scene); + SceneObjectPart part1 = grp1.RootPart; + SceneObjectGroup grp2 = SceneHelpers.AddSceneObject(scene); + SceneObjectPart part2 = grp2.RootPart; grp1.AbsolutePosition = new Vector3(10, 10, 10); grp2.AbsolutePosition = Vector3.Zero; @@ -154,14 +154,14 @@ namespace OpenSim.Region.Framework.Scenes.Tests bool debugtest = false; Scene scene = new SceneHelpers().SetupScene(); - SceneObjectPart part1 = SceneHelpers.AddSceneObject(scene); - SceneObjectGroup grp1 = part1.ParentGroup; - SceneObjectPart part2 = SceneHelpers.AddSceneObject(scene); - SceneObjectGroup grp2 = part2.ParentGroup; - SceneObjectPart part3 = SceneHelpers.AddSceneObject(scene); - SceneObjectGroup grp3 = part3.ParentGroup; - SceneObjectPart part4 = SceneHelpers.AddSceneObject(scene); - SceneObjectGroup grp4 = part4.ParentGroup; + SceneObjectGroup grp1 = SceneHelpers.AddSceneObject(scene); + SceneObjectPart part1 = grp1.RootPart; + SceneObjectGroup grp2 = SceneHelpers.AddSceneObject(scene); + SceneObjectPart part2 = grp2.RootPart; + SceneObjectGroup grp3 = SceneHelpers.AddSceneObject(scene); + SceneObjectPart part3 = grp3.RootPart; + SceneObjectGroup grp4 = SceneHelpers.AddSceneObject(scene); + SceneObjectPart part4 = grp4.RootPart; grp1.AbsolutePosition = new Vector3(10, 10, 10); grp2.AbsolutePosition = Vector3.Zero; diff --git a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectResizeTests.cs b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectResizeTests.cs index 0a94c1900d..e9318594ce 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectResizeTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectResizeTests.cs @@ -53,7 +53,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests // log4net.Config.XmlConfigurator.Configure(); Scene scene = new SceneHelpers().SetupScene(); - SceneObjectGroup g1 = SceneHelpers.AddSceneObject(scene).ParentGroup; + SceneObjectGroup g1 = SceneHelpers.AddSceneObject(scene); g1.GroupResize(new Vector3(2, 3, 4)); diff --git a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceSitTests.cs b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceSitTests.cs index 313e350cbc..ed39be1fec 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceSitTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceSitTests.cs @@ -64,7 +64,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests Vector3 startPos = new Vector3(10.1f, 0, 0); m_sp.AbsolutePosition = startPos; - SceneObjectPart part = SceneHelpers.AddSceneObject(m_scene); + SceneObjectPart part = SceneHelpers.AddSceneObject(m_scene).RootPart; m_sp.HandleAgentRequestSit(m_sp.ControllingClient, m_sp.UUID, part.UUID, Vector3.Zero); @@ -82,7 +82,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests Vector3 startPos = new Vector3(9.9f, 0, 0); m_sp.AbsolutePosition = startPos; - SceneObjectPart part = SceneHelpers.AddSceneObject(m_scene); + SceneObjectPart part = SceneHelpers.AddSceneObject(m_scene).RootPart; m_sp.HandleAgentRequestSit(m_sp.ControllingClient, m_sp.UUID, part.UUID, Vector3.Zero); @@ -100,7 +100,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests Vector3 startPos = new Vector3(1, 1, 1); m_sp.AbsolutePosition = startPos; - SceneObjectPart part = SceneHelpers.AddSceneObject(m_scene); + SceneObjectPart part = SceneHelpers.AddSceneObject(m_scene).RootPart; m_sp.HandleAgentRequestSit(m_sp.ControllingClient, m_sp.UUID, part.UUID, Vector3.Zero); @@ -133,7 +133,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests Vector3 startPos = new Vector3(128, 128, 30); m_sp.AbsolutePosition = startPos; - SceneObjectPart part = SceneHelpers.AddSceneObject(m_scene); + SceneObjectPart part = SceneHelpers.AddSceneObject(m_scene).RootPart; part.SitTargetPosition = new Vector3(0, 0, 1); m_sp.HandleAgentRequestSit(m_sp.ControllingClient, m_sp.UUID, part.UUID, Vector3.Zero); diff --git a/OpenSim/Region/Framework/Scenes/Tests/TaskInventoryTests.cs b/OpenSim/Region/Framework/Scenes/Tests/TaskInventoryTests.cs index d15141b3b2..a51e4e377b 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/TaskInventoryTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/TaskInventoryTests.cs @@ -128,7 +128,9 @@ namespace OpenSim.Region.Framework.Tests UserAccount user1 = UserAccountHelpers.CreateUserWithInventory(scene); SceneObjectGroup sog1 = SceneHelpers.CreateSceneObject(1, user1.PrincipalID); SceneObjectPart sop1 = sog1.RootPart; - TaskInventoryItem sopItem1 = TaskInventoryHelpers.AddNotecard(scene, sop1); + TaskInventoryItem sopItem1 + = TaskInventoryHelpers.AddNotecard( + scene, sop1, "ncItem", TestHelpers.ParseTail(0x800), TestHelpers.ParseTail(0x900)); InventoryFolderBase folder = InventoryArchiveUtils.FindFolderByPath(scene.InventoryService, user1.PrincipalID, "Objects")[0]; @@ -156,8 +158,11 @@ namespace OpenSim.Region.Framework.Tests Scene scene = new SceneHelpers().SetupScene(); UserAccount user1 = UserAccountHelpers.CreateUserWithInventory(scene); SceneObjectGroup sog1 = SceneHelpers.CreateSceneObject(1, user1.PrincipalID); + SceneObjectPart sop1 = sog1.RootPart; - TaskInventoryItem sopItem1 = TaskInventoryHelpers.AddNotecard(scene, sop1); + TaskInventoryItem sopItem1 + = TaskInventoryHelpers.AddNotecard( + scene, sop1, "ncItem", TestHelpers.ParseTail(0x800), TestHelpers.ParseTail(0x900)); // Perform test scene.MoveTaskInventoryItem(user1.PrincipalID, UUID.Zero, sop1, sopItem1.ItemID); diff --git a/OpenSim/Region/OptionalModules/World/NPC/Tests/NPCModuleTests.cs b/OpenSim/Region/OptionalModules/World/NPC/Tests/NPCModuleTests.cs index 65dad2d62f..91799667ab 100644 --- a/OpenSim/Region/OptionalModules/World/NPC/Tests/NPCModuleTests.cs +++ b/OpenSim/Region/OptionalModules/World/NPC/Tests/NPCModuleTests.cs @@ -301,7 +301,7 @@ namespace OpenSim.Region.OptionalModules.World.NPC.Tests UUID npcId = m_npcMod.CreateNPC("John", "Smith", startPos, UUID.Zero, true, m_scene, sp.Appearance); ScenePresence npc = m_scene.GetScenePresence(npcId); - SceneObjectPart part = SceneHelpers.AddSceneObject(m_scene); + SceneObjectPart part = SceneHelpers.AddSceneObject(m_scene).RootPart; part.SitTargetPosition = new Vector3(0, 0, 1); m_npcMod.Sit(npc.UUID, part.UUID, m_scene); @@ -333,7 +333,7 @@ namespace OpenSim.Region.OptionalModules.World.NPC.Tests UUID npcId = m_npcMod.CreateNPC("John", "Smith", startPos, UUID.Zero, true, m_scene, sp.Appearance); ScenePresence npc = m_scene.GetScenePresence(npcId); - SceneObjectPart part = SceneHelpers.AddSceneObject(m_scene); + SceneObjectPart part = SceneHelpers.AddSceneObject(m_scene).RootPart; m_npcMod.Sit(npc.UUID, part.UUID, m_scene); diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs index 7fa25f559e..fa9364d809 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs @@ -126,7 +126,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api [Serializable] public class OSSL_Api : MarshalByRefObject, IOSSL_Api, IScriptApi { -// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); public const string GridInfoServiceConfigSectionName = "GridInfoService"; @@ -3151,6 +3151,58 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api ((LSL_Api)m_LSL_Api).AttachToAvatar(attachmentPoint); } + public void osForceAttachToAvatarFromInventory(string itemName, int attachmentPoint) + { + CheckThreatLevel(ThreatLevel.High, "osForceAttachToAvatarFromInventory"); + + IAttachmentsModule attachmentsModule = m_ScriptEngine.World.AttachmentsModule; + + if (attachmentsModule == null) + return; + + m_host.AddScriptLPS(1); + + InitLSL(); + + TaskInventoryItem item = m_host.Inventory.GetInventoryItem(itemName); + + if (item == null) + { + ((LSL_Api)m_LSL_Api).llSay(0, string.Format("Could not find object '{0}'", itemName)); + throw new Exception(String.Format("The inventory item '{0}' could not be found", itemName)); + } + + if (item.InvType != (int)InventoryType.Object) + { + // FIXME: Temporary null check for regression tests since they dont' have the infrastructure to set + // up the api reference. + if (m_LSL_Api != null) + ((LSL_Api)m_LSL_Api).llSay(0, string.Format("Unable to attach, item '{0}' is not an object.", itemName)); + + throw new Exception(String.Format("The inventory item '{0}' is not an object", itemName)); + + return; + } + + ScenePresence sp = World.GetScenePresence(m_host.OwnerID); + + if (sp == null) + return; + + InventoryItemBase newItem = World.MoveTaskInventoryItem(sp.UUID, UUID.Zero, m_host, item.ItemID); + + if (newItem == null) + { + m_log.ErrorFormat( + "[OSSL API]: Could not create user inventory item {0} for {1}, attach point {2} in {3}", + itemName, m_host.Name, attachmentPoint, World.Name); + + return; + } + + attachmentsModule.RezSingleAttachmentFromInventory(sp, newItem.ID, (uint)attachmentPoint); + } + public void osForceDetachFromAvatar() { CheckThreatLevel(ThreatLevel.High, "osForceDetachFromAvatar"); diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs index e92518d6a7..a8335aac37 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs @@ -106,6 +106,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces /// The attachment point. For example, ATTACH_CHEST void osForceAttachToAvatar(int attachment); + /// + /// Attach the inventory item in the object containing this script to the avatar that owns it without checking for PERMISSION_ATTACH + /// + /// Tha name of the item. If this is not found then a warning is said to the owner + /// The attachment point. For example, ATTACH_CHEST + void osForceAttachToAvatarFromInventory(string itemName, int attachment); + /// /// Detach the object containing this script from the avatar it is attached to without checking for PERMISSION_ATTACH /// diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs index d230662c54..500ed96685 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs @@ -296,6 +296,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase m_OSSL_Functions.osForceAttachToAvatar(attachmentPoint); } + public void osForceAttachToAvatarFromInventory(string itemName, int attachmentPoint) + { + m_OSSL_Functions.osForceAttachToAvatarFromInventory(itemName, attachmentPoint); + } + public void osForceDetachFromAvatar() { m_OSSL_Functions.osForceDetachFromAvatar(); diff --git a/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiLinkingTests.cs b/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiLinkingTests.cs index bc3b790362..2565ae7136 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiLinkingTests.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiLinkingTests.cs @@ -89,7 +89,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests // FIXME: This should really be a script item (with accompanying script) TaskInventoryItem grp1Item - = TaskInventoryHelpers.AddNotecard(m_scene, grp1.RootPart); + = TaskInventoryHelpers.AddNotecard( + m_scene, grp1.RootPart, "ncItem", TestHelpers.ParseTail(0x800), TestHelpers.ParseTail(0x900)); grp1Item.PermsMask |= ScriptBaseClass.PERMISSION_CHANGE_LINKS; SceneObjectGroup grp2 = SceneHelpers.CreateSceneObject(2, ownerId, "grp2-", 0x20); @@ -122,7 +123,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests // FIXME: This should really be a script item (with accompanying script) TaskInventoryItem grp1Item - = TaskInventoryHelpers.AddNotecard(m_scene, grp1.RootPart); + = TaskInventoryHelpers.AddNotecard( + m_scene, grp1.RootPart, "ncItem", TestHelpers.ParseTail(0x800), TestHelpers.ParseTail(0x900)); + grp1Item.PermsMask |= ScriptBaseClass.PERMISSION_CHANGE_LINKS; LSL_Api apiGrp1 = new LSL_Api(); diff --git a/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiTest.cs b/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiTest.cs index f96a156a6e..c41d1e7acf 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiTest.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiTest.cs @@ -59,7 +59,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests config.Set("Enabled", "true"); Scene scene = new SceneHelpers().SetupScene(); - SceneObjectPart part = SceneHelpers.AddSceneObject(scene); + SceneObjectPart part = SceneHelpers.AddSceneObject(scene).RootPart; XEngine.XEngine engine = new XEngine.XEngine(); engine.Initialise(initConfigSource); diff --git a/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiAttachmentTests.cs b/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiAttachmentTests.cs new file mode 100644 index 0000000000..537b8aa0e5 --- /dev/null +++ b/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiAttachmentTests.cs @@ -0,0 +1,178 @@ +/* + * Copyright (c) Contributors, http://opensimulator.org/ + * See CONTRIBUTORS.TXT for a full list of copyright holders. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the OpenSimulator Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using System; +using System.Collections.Generic; +using System.Reflection; +using System.Text; +using log4net; +using Nini.Config; +using NUnit.Framework; +using OpenMetaverse; +using OpenMetaverse.Assets; +using OpenMetaverse.StructuredData; +using OpenSim.Framework; +using OpenSim.Region.CoreModules.Avatar.Attachments; +using OpenSim.Region.CoreModules.Framework.InventoryAccess; +using OpenSim.Region.Framework.Scenes; +using OpenSim.Region.ScriptEngine.Shared; +using OpenSim.Region.ScriptEngine.Shared.Api; +using OpenSim.Services.Interfaces; +using OpenSim.Tests.Common; +using OpenSim.Tests.Common.Mock; + +namespace OpenSim.Region.ScriptEngine.Shared.Tests +{ + /// + /// Tests for OSSL attachment functions + /// + /// + /// TODO: Add tests for all functions + /// + [TestFixture] + public class OSSL_ApiAttachmentTests : OpenSimTestCase + { + protected Scene m_scene; + protected XEngine.XEngine m_engine; + + [SetUp] + public override void SetUp() + { + base.SetUp(); + + IConfigSource initConfigSource = new IniConfigSource(); + + IConfig xengineConfig = initConfigSource.AddConfig("XEngine"); + xengineConfig.Set("Enabled", "true"); + xengineConfig.Set("AllowOSFunctions", "true"); + xengineConfig.Set("OSFunctionThreatLevel", "Severe"); + + IConfig modulesConfig = initConfigSource.AddConfig("Modules"); + modulesConfig.Set("InventoryAccessModule", "BasicInventoryAccessModule"); + + m_scene = new SceneHelpers().SetupScene(); + SceneHelpers.SetupSceneModules( + m_scene, initConfigSource, new AttachmentsModule(), new BasicInventoryAccessModule()); + + m_engine = new XEngine.XEngine(); + m_engine.Initialise(initConfigSource); + m_engine.AddRegion(m_scene); + } + + [Test] + public void TestOsForceAttachToAvatarFromInventory() + { + TestHelpers.InMethod(); +// TestHelpers.EnableLogging(); + + string taskInvObjItemName = "sphere"; + UUID taskInvObjItemId = UUID.Parse("00000000-0000-0000-0000-100000000000"); + AttachmentPoint attachPoint = AttachmentPoint.Chin; + + UserAccount ua1 = UserAccountHelpers.CreateUserWithInventory(m_scene, 0x1); + ScenePresence sp = SceneHelpers.AddScenePresence(m_scene, ua1.PrincipalID); + SceneObjectGroup inWorldObj = SceneHelpers.AddSceneObject(m_scene, "inWorldObj", ua1.PrincipalID); + TaskInventoryItem scriptItem = TaskInventoryHelpers.AddScript(m_scene, inWorldObj.RootPart); + + new LSL_Api().Initialize(m_engine, inWorldObj.RootPart, scriptItem); + OSSL_Api osslApi = new OSSL_Api(); + osslApi.Initialize(m_engine, inWorldObj.RootPart, scriptItem); + +// SceneObjectGroup sog1 = SceneHelpers.CreateSceneObject(1, ua1.PrincipalID); + + // Create an object embedded inside the first + TaskInventoryHelpers.AddSceneObject(m_scene, inWorldObj.RootPart, taskInvObjItemName, taskInvObjItemId, ua1.PrincipalID); + + osslApi.osForceAttachToAvatarFromInventory(taskInvObjItemName, (int)attachPoint); + + // Check scene presence status + Assert.That(sp.HasAttachments(), Is.True); + List attachments = sp.GetAttachments(); + Assert.That(attachments.Count, Is.EqualTo(1)); + SceneObjectGroup attSo = attachments[0]; + Assert.That(attSo.Name, Is.EqualTo(taskInvObjItemName)); + Assert.That(attSo.AttachmentPoint, Is.EqualTo((uint)attachPoint)); + Assert.That(attSo.IsAttachment); + Assert.That(attSo.UsesPhysics, Is.False); + Assert.That(attSo.IsTemporary, Is.False); + + // Check appearance status + List attachmentsInAppearance = sp.Appearance.GetAttachments(); + Assert.That(attachmentsInAppearance.Count, Is.EqualTo(1)); + Assert.That(sp.Appearance.GetAttachpoint(attachmentsInAppearance[0].ItemID), Is.EqualTo((uint)attachPoint)); + } + + /// + /// Make sure we can't force attach anything other than objects. + /// + [Test] + public void TestOsForceAttachToAvatarFromInventoryNotObject() + { + TestHelpers.InMethod(); +// TestHelpers.EnableLogging(); + + string taskInvObjItemName = "sphere"; + UUID taskInvObjItemId = UUID.Parse("00000000-0000-0000-0000-100000000000"); + AttachmentPoint attachPoint = AttachmentPoint.Chin; + + UserAccount ua1 = UserAccountHelpers.CreateUserWithInventory(m_scene, 0x1); + ScenePresence sp = SceneHelpers.AddScenePresence(m_scene, ua1.PrincipalID); + SceneObjectGroup inWorldObj = SceneHelpers.AddSceneObject(m_scene, "inWorldObj", ua1.PrincipalID); + TaskInventoryItem scriptItem = TaskInventoryHelpers.AddScript(m_scene, inWorldObj.RootPart); + + new LSL_Api().Initialize(m_engine, inWorldObj.RootPart, scriptItem); + OSSL_Api osslApi = new OSSL_Api(); + osslApi.Initialize(m_engine, inWorldObj.RootPart, scriptItem); + + // Create an object embedded inside the first + TaskInventoryHelpers.AddNotecard( + m_scene, inWorldObj.RootPart, taskInvObjItemName, taskInvObjItemId, TestHelpers.ParseTail(0x900)); + + bool exceptionCaught = false; + + try + { + osslApi.osForceAttachToAvatarFromInventory(taskInvObjItemName, (int)attachPoint); + } + catch (Exception e) + { + exceptionCaught = true; + } + + Assert.That(exceptionCaught, Is.True); + + // Check scene presence status + Assert.That(sp.HasAttachments(), Is.False); + List attachments = sp.GetAttachments(); + Assert.That(attachments.Count, Is.EqualTo(0)); + + // Check appearance status + List attachmentsInAppearance = sp.Appearance.GetAttachments(); + Assert.That(attachmentsInAppearance.Count, Is.EqualTo(0)); + } + } +} \ No newline at end of file diff --git a/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiNpcTests.cs b/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiNpcTests.cs index 0ccd8897c3..813e53b954 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiNpcTests.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiNpcTests.cs @@ -52,14 +52,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests /// Tests for OSSL NPC API /// [TestFixture] - public class OSSL_NpcApiAppearanceTest + public class OSSL_NpcApiAppearanceTest : OpenSimTestCase { protected Scene m_scene; protected XEngine.XEngine m_engine; [SetUp] - public void SetUp() + public override void SetUp() { + base.SetUp(); + IConfigSource initConfigSource = new IniConfigSource(); IConfig config = initConfigSource.AddConfig("XEngine"); config.Set("Enabled", "true"); diff --git a/OpenSim/Tests/Common/Helpers/SceneHelpers.cs b/OpenSim/Tests/Common/Helpers/SceneHelpers.cs index 239afc0aee..3a2e42082e 100644 --- a/OpenSim/Tests/Common/Helpers/SceneHelpers.cs +++ b/OpenSim/Tests/Common/Helpers/SceneHelpers.cs @@ -564,7 +564,7 @@ namespace OpenSim.Tests.Common /// /// /// - public static SceneObjectPart AddSceneObject(Scene scene) + public static SceneObjectGroup AddSceneObject(Scene scene) { return AddSceneObject(scene, "Test Object", UUID.Zero); } @@ -576,16 +576,16 @@ namespace OpenSim.Tests.Common /// /// /// - public static SceneObjectPart AddSceneObject(Scene scene, string name, UUID ownerId) + public static SceneObjectGroup AddSceneObject(Scene scene, string name, UUID ownerId) { - SceneObjectPart part = CreateSceneObjectPart(name, UUID.Random(), ownerId); + SceneObjectGroup so = new SceneObjectGroup(CreateSceneObjectPart(name, UUID.Random(), ownerId)); //part.UpdatePrimFlags(false, false, true); //part.ObjectFlags |= (uint)PrimFlags.Phantom; - scene.AddNewSceneObject(new SceneObjectGroup(part), false); + scene.AddNewSceneObject(so, false); - return part; + return so; } /// diff --git a/OpenSim/Tests/Common/Helpers/TaskInventoryHelpers.cs b/OpenSim/Tests/Common/Helpers/TaskInventoryHelpers.cs index 7058d1e568..9607f1fc69 100644 --- a/OpenSim/Tests/Common/Helpers/TaskInventoryHelpers.cs +++ b/OpenSim/Tests/Common/Helpers/TaskInventoryHelpers.cs @@ -45,29 +45,66 @@ namespace OpenSim.Tests.Common /// /// /// + /// + /// + /// /// The item that was added - public static TaskInventoryItem AddNotecard(Scene scene, SceneObjectPart part) + public static TaskInventoryItem AddNotecard(Scene scene, SceneObjectPart part, string itemName, UUID itemID, UUID assetID) { AssetNotecard nc = new AssetNotecard(); nc.BodyText = "Hello World!"; nc.Encode(); - UUID ncAssetUuid = new UUID("00000000-0000-0000-1000-000000000000"); - UUID ncItemUuid = new UUID("00000000-0000-0000-1100-000000000000"); + AssetBase ncAsset - = AssetHelpers.CreateAsset(ncAssetUuid, AssetType.Notecard, nc.AssetData, UUID.Zero); + = AssetHelpers.CreateAsset(assetID, AssetType.Notecard, nc.AssetData, UUID.Zero); scene.AssetService.Store(ncAsset); + TaskInventoryItem ncItem = new TaskInventoryItem - { Name = "ncItem", AssetID = ncAssetUuid, ItemID = ncItemUuid, + { Name = itemName, AssetID = assetID, ItemID = itemID, Type = (int)AssetType.Notecard, InvType = (int)InventoryType.Notecard }; part.Inventory.AddInventoryItem(ncItem, true); return ncItem; } + /// + /// Add a blank script to the given part. + /// + /// + /// TODO: Accept input for item and asset IDs to avoid mysterious script failures that try to use any of these + /// functions more than once in a test. + /// + /// + /// + /// The item that was added + public static TaskInventoryItem AddScript(Scene scene, SceneObjectPart part) + { + AssetScriptText ast = new AssetScriptText(); + ast.Encode(); + + UUID assetUuid = new UUID("00000000-0000-0000-1000-000000000000"); + UUID itemUuid = new UUID("00000000-0000-0000-1100-000000000000"); + AssetBase asset + = AssetHelpers.CreateAsset(assetUuid, AssetType.LSLText, ast.AssetData, UUID.Zero); + scene.AssetService.Store(asset); + TaskInventoryItem item + = new TaskInventoryItem + { Name = "scriptItem", AssetID = assetUuid, ItemID = itemUuid, + Type = (int)AssetType.LSLText, InvType = (int)InventoryType.LSL }; + part.Inventory.AddInventoryItem(item, true); + + return item; + } + /// /// Add a scene object item to the given part. /// + /// + /// TODO: Accept input for item and asset IDs to avoid mysterious script failures that try to use any of these + /// functions more than once in a test. + /// + /// /// /// /// From 510e809abae3c126d68ffe2b0645b4697f5b56b2 Mon Sep 17 00:00:00 2001 From: SignpostMarv Date: Wed, 4 Jul 2012 00:53:16 +0100 Subject: [PATCH 485/547] porting console commands from raw2sculpt 3.2 --- .../World/Terrain/TerrainModule.cs | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs b/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs index 2eac0faa9c..3f848ed1f7 100644 --- a/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs +++ b/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs @@ -1108,6 +1108,32 @@ namespace OpenSim.Region.CoreModules.World.Terrain CheckForTerrainUpdates(); } + private void InterfaceMinTerrain(Object[] args) + { + int x, y; + for (x = 0; x < m_channel.Width; x++) + { + for (y = 0; y < m_channel.Height; y++) + { + m_channel[x, y] = Math.Max((double)args[0], m_channel[x, y]); + } + } + CheckForTerrainUpdates(); + } + + private void InterfaceMaxTerrain(Object[] args) + { + int x, y; + for (x = 0; x < m_channel.Width; x++) + { + for (y = 0; y < m_channel.Height; y++) + { + m_channel[x, y] = Math.Min((double)args[0], m_channel[x, y]); + } + } + CheckForTerrainUpdates(); + } + private void InterfaceShowDebugStats(Object[] args) { double max = Double.MinValue; @@ -1248,6 +1274,12 @@ namespace OpenSim.Region.CoreModules.World.Terrain rescaleCommand.AddArgument("min", "min terrain height after rescaling", "Double"); rescaleCommand.AddArgument("max", "max terrain height after rescaling", "Double"); + Command minCommand = new Command("min", CommandIntentions.COMMAND_HAZARDOUS, InterfaceMinTerrain, "Sets the minimum terrain height to the specified value."); + minCommand.AddArgument("min", "terrain height to use as minimum", "Double"); + + Command maxCommand = new Command("max", CommandIntentions.COMMAND_HAZARDOUS, InterfaceMaxTerrain, "Sets the maximum terrain height to the specified value."); + maxCommand.AddArgument("min", "terrain height to use as maximum", "Double"); + // Debug Command showDebugStatsCommand = @@ -1279,6 +1311,8 @@ namespace OpenSim.Region.CoreModules.World.Terrain m_commander.RegisterCommand("effect", pluginRunCommand); m_commander.RegisterCommand("flip", flipCommand); m_commander.RegisterCommand("rescale", rescaleCommand); + m_commander.RegisterCommand("min", minCommand); + m_commander.RegisterCommand("max", maxCommand); // Add this to our scene so scripts can call these functions m_scene.RegisterModuleCommander(m_commander); From 462f7bccf93d3c4ceb1619fd92f048a87204f417 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 5 Jul 2012 20:58:20 +0100 Subject: [PATCH 486/547] minor: Add more information to OSFunctionThreatLevel and clarify some text in using PARCEL_OWNER, PARCEL_GROUP_MEMBER, ESTATE_MANAGER, ESTATE_OWNER permission categories --- bin/OpenSim.ini.example | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/bin/OpenSim.ini.example b/bin/OpenSim.ini.example index 741877e7ab..c07e1abeea 100644 --- a/bin/OpenSim.ini.example +++ b/bin/OpenSim.ini.example @@ -673,8 +673,11 @@ ; AllowLightShareFunctions = false ;# {OSFunctionThreatLevel} {Enabled:true AllowOSFunctions:true} {OSFunction threat level? (DANGEROUS!)} {None VeryLow Low Moderate High VeryHigh Severe} VeryLow - ;; Threat level to allow, one of None, VeryLow, Low, Moderate, High, - ;; VeryHigh, Severe + ;; Threat level to allow, one of None, VeryLow, Low, Moderate, High, VeryHigh, Severe + ;; See http://opensimulator.org/wiki/Threat_level for more information on these levels. + ;; We do not recommend that use set a general level above Low unless you have a high level of trust + ;; in all the users that can run scripts in your simulator. It is safer to explicitly + ;; allow certain types of user to run higher threat level OSSL functions, as detailed later on. OSFunctionThreatLevel = VeryLow ; OS Functions enable/disable @@ -691,10 +694,10 @@ ; Allow_osSetRegionWaterHeight = 888760cb-a3cf-43ac-8ea4-8732fd3ee2bb ; Comma separated list of owner classes that allow the function for a particular class of owners. Choices are - ; - PARCEL_GROUP_MEMBER: allow if objectgroup is the same group as the parcel - ; - PARCEL_OWNER: allow if the objectowner is parcelowner - ; - ESTATE_MANAGER: allow if the object owner is a estate manager - ; - ESTATE_OWNER: allow if objectowner is estateowner + ; - PARCEL_GROUP_MEMBER: allow if the object group is the same group as the parcel + ; - PARCEL_OWNER: allow if the object owner is the parcel owner + ; - ESTATE_MANAGER: allow if the object owner is an estate manager + ; - ESTATE_OWNER: allow if the object owner is the estate owner ; Allow_osSetRegionWaterHeight = 888760cb-a3cf-43ac-8ea4-8732fd3ee2bb, PARCEL_OWNER, ESTATE_OWNER>, ... ; You can also use script creators as the uuid From 8674604ff5760335f08fa910381608757e89ad21 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 5 Jul 2012 21:10:59 +0100 Subject: [PATCH 487/547] regrade osFormatString, osMatchString and osReplaceString to VeryLow. I can't see that these present any real hazard to sim functioning. --- .../ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs index fa9364d809..7385dd9294 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs @@ -2125,7 +2125,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public LSL_String osFormatString(string str, LSL_List strings) { - CheckThreatLevel(ThreatLevel.Low, "osFormatString"); + CheckThreatLevel(ThreatLevel.VeryLow, "osFormatString"); m_host.AddScriptLPS(1); return String.Format(str, strings.Data); @@ -2133,7 +2133,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public LSL_List osMatchString(string src, string pattern, int start) { - CheckThreatLevel(ThreatLevel.High, "osMatchString"); + CheckThreatLevel(ThreatLevel.VeryLow, "osMatchString"); m_host.AddScriptLPS(1); LSL_List result = new LSL_List(); @@ -2175,7 +2175,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public LSL_String osReplaceString(string src, string pattern, string replace, int count, int start) { - CheckThreatLevel(ThreatLevel.High, "osReplaceString"); + CheckThreatLevel(ThreatLevel.VeryLow, "osReplaceString"); m_host.AddScriptLPS(1); // Normalize indices (if negative). From db9616f7baa45fc15a9afded024655d4ad442556 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 5 Jul 2012 21:30:20 +0100 Subject: [PATCH 488/547] minor: add client name to various login service log messages to disambiguate messages from concurrent logins. Also adds destination resolution debug log message showing region endpoint. Adding endpoint to the log helps to find issues where the region external host information has been wrongly configured --- .../Services/LLLoginService/LLLoginService.cs | 56 ++++++++++++++----- 1 file changed, 43 insertions(+), 13 deletions(-) diff --git a/OpenSim/Services/LLLoginService/LLLoginService.cs b/OpenSim/Services/LLLoginService/LLLoginService.cs index 9acba114da..495dc5297c 100644 --- a/OpenSim/Services/LLLoginService/LLLoginService.cs +++ b/OpenSim/Services/LLLoginService/LLLoginService.cs @@ -257,7 +257,9 @@ namespace OpenSim.Services.LLLoginService if (!am.Success) { - m_log.InfoFormat("[LLOGIN SERVICE]: Login failed, reason: client {0} is not allowed", clientVersion); + m_log.InfoFormat( + "[LLOGIN SERVICE]: Login failed for {0} {1}, reason: client {2} is not allowed", + firstName, lastName, clientVersion); return LLFailedLoginResponse.LoginBlockedProblem; } } @@ -269,7 +271,9 @@ namespace OpenSim.Services.LLLoginService if (dm.Success) { - m_log.InfoFormat("[LLOGIN SERVICE]: Login failed, reason: client {0} is denied", clientVersion); + m_log.InfoFormat( + "[LLOGIN SERVICE]: Login failed for {0} {1}, reason: client {2} is denied", + firstName, lastName, clientVersion); return LLFailedLoginResponse.LoginBlockedProblem; } } @@ -280,13 +284,16 @@ namespace OpenSim.Services.LLLoginService UserAccount account = m_UserAccountService.GetUserAccount(scopeID, firstName, lastName); if (account == null) { - m_log.InfoFormat("[LLOGIN SERVICE]: Login failed, reason: user not found"); + m_log.InfoFormat( + "[LLOGIN SERVICE]: Login failed for {0} {1}, reason: user not found", firstName, lastName); return LLFailedLoginResponse.UserProblem; } if (account.UserLevel < m_MinLoginLevel) { - m_log.InfoFormat("[LLOGIN SERVICE]: Login failed, reason: login is blocked for user level {0}", account.UserLevel); + m_log.InfoFormat( + "[LLOGIN SERVICE]: Login failed for {0} {1}, reason: user level is {2} but minimum login level is {3}", + firstName, lastName, m_MinLoginLevel, account.UserLevel); return LLFailedLoginResponse.LoginBlockedProblem; } @@ -297,7 +304,8 @@ namespace OpenSim.Services.LLLoginService { if (account.ScopeID != scopeID && account.ScopeID != UUID.Zero) { - m_log.InfoFormat("[LLOGIN SERVICE]: Login failed, reason: user not found"); + m_log.InfoFormat( + "[LLOGIN SERVICE]: Login failed, reason: user {0} {1} not found", firstName, lastName); return LLFailedLoginResponse.UserProblem; } } @@ -316,7 +324,9 @@ namespace OpenSim.Services.LLLoginService UUID secureSession = UUID.Zero; if ((token == string.Empty) || (token != string.Empty && !UUID.TryParse(token, out secureSession))) { - m_log.InfoFormat("[LLOGIN SERVICE]: Login failed, reason: authentication failed"); + m_log.InfoFormat( + "[LLOGIN SERVICE]: Login failed for {0} {1}, reason: authentication failed", + firstName, lastName); return LLFailedLoginResponse.UserProblem; } @@ -325,13 +335,18 @@ namespace OpenSim.Services.LLLoginService // if (m_RequireInventory && m_InventoryService == null) { - m_log.WarnFormat("[LLOGIN SERVICE]: Login failed, reason: inventory service not set up"); + m_log.WarnFormat( + "[LLOGIN SERVICE]: Login failed for {0} {1}, reason: inventory service not set up", + firstName, lastName); return LLFailedLoginResponse.InventoryProblem; } + List inventorySkel = m_InventoryService.GetInventorySkeleton(account.PrincipalID); if (m_RequireInventory && ((inventorySkel == null) || (inventorySkel != null && inventorySkel.Count == 0))) { - m_log.InfoFormat("[LLOGIN SERVICE]: Login failed, reason: unable to retrieve user inventory"); + m_log.InfoFormat( + "[LLOGIN SERVICE]: Login failed, for {0} {1}, reason: unable to retrieve user inventory", + firstName, lastName); return LLFailedLoginResponse.InventoryProblem; } @@ -345,9 +360,12 @@ namespace OpenSim.Services.LLLoginService if (m_PresenceService != null) { success = m_PresenceService.LoginAgent(account.PrincipalID.ToString(), session, secureSession); + if (!success) { - m_log.InfoFormat("[LLOGIN SERVICE]: Login failed, reason: could not login presence"); + m_log.InfoFormat( + "[LLOGIN SERVICE]: Login failed for {0} {1}, reason: could not login presence", + firstName, lastName); return LLFailedLoginResponse.GridProblem; } } @@ -380,9 +398,18 @@ namespace OpenSim.Services.LLLoginService if (destination == null) { m_PresenceService.LogoutAgent(session); - m_log.InfoFormat("[LLOGIN SERVICE]: Login failed, reason: destination not found"); + + m_log.InfoFormat( + "[LLOGIN SERVICE]: Login failed for {0} {1}, reason: destination not found", + firstName, lastName); return LLFailedLoginResponse.GridProblem; } + else + { + m_log.DebugFormat( + "[LLOGIN SERVICE]: Found destination {0}, endpoint {1} for {2} {3}", + destination.RegionName, destination.ExternalEndPoint, firstName, lastName); + } if (account.UserLevel >= 200) flags |= TeleportFlags.Godlike; @@ -406,7 +433,7 @@ namespace OpenSim.Services.LLLoginService if (aCircuit == null) { m_PresenceService.LogoutAgent(session); - m_log.InfoFormat("[LLOGIN SERVICE]: Login failed, reason: {0}", reason); + m_log.InfoFormat("[LLOGIN SERVICE]: Login failed for {0} {1}, reason: {2}", firstName, lastName, reason); return new LLFailedLoginResponse("key", reason, "false"); } @@ -427,7 +454,8 @@ namespace OpenSim.Services.LLLoginService where, startLocation, position, lookAt, gestures, m_WelcomeMessage, home, clientIP, m_MapTileURL, m_ProfileURL, m_OpenIDURL, m_SearchURL, m_Currency, m_DSTZone); - m_log.DebugFormat("[LLOGIN SERVICE]: All clear. Sending login response to client."); + m_log.DebugFormat("[LLOGIN SERVICE]: All clear. Sending login response to {0} {1}", firstName, lastName); + return response; } catch (Exception e) @@ -446,7 +474,9 @@ namespace OpenSim.Services.LLLoginService { flags = TeleportFlags.ViaLogin; - m_log.DebugFormat("[LLOGIN SERVICE]: FindDestination for start location {0}", startLocation); + m_log.DebugFormat( + "[LLOGIN SERVICE]: Finding destination matching start location {0} for {1}", + startLocation, account.Name); gatekeeper = null; where = "home"; From 7e73f609e5f61040358ec247d371306165945ca1 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 5 Jul 2012 23:15:59 +0100 Subject: [PATCH 489/547] Log warning if time between invocations of the watchdog thread is twice the timer setting. This is to help detect situations where thread timeout warnings are being generated because of general machine issues rather than deadlock, network or other problems. --- OpenSim/Framework/Watchdog.cs | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/OpenSim/Framework/Watchdog.cs b/OpenSim/Framework/Watchdog.cs index 2b3a719daf..8a74f538f7 100644 --- a/OpenSim/Framework/Watchdog.cs +++ b/OpenSim/Framework/Watchdog.cs @@ -101,12 +101,24 @@ namespace OpenSim.Framework private static Dictionary m_threads; private static System.Timers.Timer m_watchdogTimer; + /// + /// Last time the watchdog thread ran. + /// + /// + /// Should run every WATCHDOG_INTERVAL_MS + /// + public static int LastWatchdogThreadTick { get; private set; } + static Watchdog() { m_threads = new Dictionary(); m_watchdogTimer = new System.Timers.Timer(WATCHDOG_INTERVAL_MS); m_watchdogTimer.AutoReset = false; m_watchdogTimer.Elapsed += WatchdogTimerElapsed; + + // Set now so we don't get alerted on the first run + LastWatchdogThreadTick = Environment.TickCount & Int32.MaxValue; + m_watchdogTimer.Start(); } @@ -264,6 +276,16 @@ namespace OpenSim.Framework /// private static void WatchdogTimerElapsed(object sender, System.Timers.ElapsedEventArgs e) { + int now = Environment.TickCount & Int32.MaxValue; + int msElapsed = now - LastWatchdogThreadTick; + + if (msElapsed > WATCHDOG_INTERVAL_MS * 2) + m_log.WarnFormat( + "[WATCHDOG]: {0} ms since Watchdog last ran. Interval should be approximately {1} ms", + msElapsed, WATCHDOG_INTERVAL_MS); + + LastWatchdogThreadTick = Environment.TickCount & Int32.MaxValue; + Action callback = OnWatchdogTimeout; if (callback != null) @@ -272,8 +294,6 @@ namespace OpenSim.Framework lock (m_threads) { - int now = Environment.TickCount & Int32.MaxValue; - foreach (ThreadWatchdogInfo threadInfo in m_threads.Values) { if (threadInfo.Thread.ThreadState == ThreadState.Stopped) From 843112340e3220e6bef5a05d8607efb478e19013 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 6 Jul 2012 00:37:45 +0100 Subject: [PATCH 490/547] Log MONO_THREADS_PER_CPU value on simulator startup, or "unset" if it is not set --- OpenSim/Region/Application/Application.cs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/OpenSim/Region/Application/Application.cs b/OpenSim/Region/Application/Application.cs index c1300380cf..ebfebc4443 100644 --- a/OpenSim/Region/Application/Application.cs +++ b/OpenSim/Region/Application/Application.cs @@ -92,9 +92,14 @@ namespace OpenSim m_log.Info("[OPENSIM MAIN]: configured log4net using default OpenSim.exe.config"); } - m_log.DebugFormat( + m_log.InfoFormat( "[OPENSIM MAIN]: System Locale is {0}", System.Threading.Thread.CurrentThread.CurrentCulture); + string monoThreadsPerCpu = System.Environment.GetEnvironmentVariable("MONO_THREADS_PER_CPU"); + + m_log.InfoFormat( + "[OPENSIM MAIN]: Environment variable MONO_THREADS_PER_CPU is {0}", monoThreadsPerCpu ?? "unset"); + // Increase the number of IOCP threads available. Mono defaults to a tragically low number int workerThreads, iocpThreads; System.Threading.ThreadPool.GetMaxThreads(out workerThreads, out iocpThreads); @@ -109,7 +114,6 @@ namespace OpenSim // Check if the system is compatible with OpenSimulator. // Ensures that the minimum system requirements are met - m_log.Info("Performing compatibility checks... \n"); string supported = String.Empty; if (Util.IsEnvironmentSupported(ref supported)) { From f6e5791ecd0b75ae4a6a85c66874af7047f6f55b Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 6 Jul 2012 22:07:19 +0100 Subject: [PATCH 491/547] refactor: extract method UpdateUserInventoryWithAttachment() from AttachObject() for better code comprehension --- .../Avatar/Attachments/AttachmentsModule.cs | 67 +++++++++++-------- 1 file changed, 38 insertions(+), 29 deletions(-) diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs index af30a8e68e..9eb0e383c0 100644 --- a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs @@ -292,31 +292,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments group.AttachmentPoint = attachmentPt; group.AbsolutePosition = attachPos; - - // We also don't want to do any of the inventory operations for an NPC. + if (sp.PresenceType != PresenceType.Npc) - { - // Remove any previous attachments - List attachments = sp.GetAttachments(attachmentPt); - - // At the moment we can only deal with a single attachment - if (attachments.Count != 0) - { - if (attachments[0].FromItemID != UUID.Zero) - DetachSingleAttachmentToInvInternal(sp, attachments[0]); - else - m_log.WarnFormat( - "[ATTACHMENTS MODULE]: When detaching existing attachment {0} {1} at point {2} to make way for {3} {4} for {5}, couldn't find the associated item ID to adjust inventory attachment record!", - attachments[0].Name, attachments[0].LocalId, attachmentPt, group.Name, group.LocalId, sp.Name); - } - - // Add the new attachment to inventory if we don't already have it. - UUID newAttachmentItemID = group.FromItemID; - if (newAttachmentItemID == UUID.Zero) - newAttachmentItemID = AddSceneObjectAsNewAttachmentInInv(sp, group).ID; - - ShowAttachInUserInventory(sp, attachmentPt, newAttachmentItemID, group); - } + UpdateUserInventoryWithAttachment(sp, group, attachmentPt); AttachToAgent(sp, group, attachmentPt, attachPos, silent); } @@ -324,6 +302,30 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments return true; } + private void UpdateUserInventoryWithAttachment(IScenePresence sp, SceneObjectGroup group, uint attachmentPt) + { + // Remove any previous attachments + List attachments = sp.GetAttachments(attachmentPt); + + // At the moment we can only deal with a single attachment + if (attachments.Count != 0) + { + if (attachments[0].FromItemID != UUID.Zero) + DetachSingleAttachmentToInvInternal(sp, attachments[0]); + else + m_log.WarnFormat( + "[ATTACHMENTS MODULE]: When detaching existing attachment {0} {1} at point {2} to make way for {3} {4} for {5}, couldn't find the associated item ID to adjust inventory attachment record!", + attachments[0].Name, attachments[0].LocalId, attachmentPt, group.Name, group.LocalId, sp.Name); + } + + // Add the new attachment to inventory if we don't already have it. + UUID newAttachmentItemID = group.FromItemID; + if (newAttachmentItemID == UUID.Zero) + newAttachmentItemID = AddSceneObjectAsNewAttachmentInInv(sp, group).ID; + + ShowAttachInUserInventory(sp, attachmentPt, newAttachmentItemID, group); + } + public ISceneEntity RezSingleAttachmentFromInventory(IScenePresence sp, UUID itemID, uint AttachmentPt) { if (!Enabled) @@ -652,11 +654,12 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments // "[ATTACHMENTS MODULE]: Called AddSceneObjectAsAttachment for object {0} {1} for {2}", // grp.Name, grp.LocalId, remoteClient.Name); - InventoryItemBase newItem = m_invAccessModule.CopyToInventory( - DeRezAction.TakeCopy, - m_scene.InventoryService.GetFolderForType(sp.UUID, AssetType.Object).ID, - new List { grp }, - sp.ControllingClient, true)[0]; + InventoryItemBase newItem + = m_invAccessModule.CopyToInventory( + DeRezAction.TakeCopy, + m_scene.InventoryService.GetFolderForType(sp.UUID, AssetType.Object).ID, + new List { grp }, + sp.ControllingClient, true)[0]; // sets itemID so client can show item as 'attached' in inventory grp.FromItemID = newItem.ID; @@ -782,7 +785,13 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments item = m_scene.InventoryService.GetItem(item); bool changed = sp.Appearance.SetAttachment((int)AttachmentPt, itemID, item.AssetID); if (changed && m_scene.AvatarFactory != null) + { +// m_log.DebugFormat( +// "[ATTACHMENTS MODULE]: Queueing appearance save for {0}, attachment {1} point {2} in ShowAttachInUserInventory()", +// sp.Name, att.Name, AttachmentPt); + m_scene.AvatarFactory.QueueAppearanceSave(sp.UUID); + } } #endregion From 43a2da9edb9a234ee10735a234d2ad253a33cb7a Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 6 Jul 2012 22:33:16 +0100 Subject: [PATCH 492/547] Pull prim crossing/teleport checks up into Scene.IncomingCreateObject() from Scene.AddObject() Only IncomingCreateObject() needs these checks. General object adding does not need to perform crossing perm checks --- OpenSim/Region/Framework/Scenes/Scene.cs | 41 ++++++++++++++++-------- 1 file changed, 27 insertions(+), 14 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 36d39eac79..6239d5184b 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -2495,7 +2495,16 @@ namespace OpenSim.Region.Framework.Scenes } catch (Exception e) { - m_log.WarnFormat("[SCENE]: Problem casting object, exception {0}{1}", e.Message, e.StackTrace); + m_log.WarnFormat("[INTERREGION]: Problem casting object, exception {0}{1}", e.Message, e.StackTrace); + return false; + } + + // If the user is banned, we won't let any of their objects + // enter. Period. + // + if (RegionInfo.EstateSettings.IsBanned(newObject.OwnerID)) + { + m_log.InfoFormat("[INTERREGION]: Denied prim crossing for banned avatar {0}", newObject.OwnerID); return false; } @@ -2504,14 +2513,28 @@ namespace OpenSim.Region.Framework.Scenes if (!AddSceneObject(newObject)) { - m_log.DebugFormat("[SCENE]: Problem adding scene object {0} in {1} ", sog.UUID, RegionInfo.RegionName); + m_log.DebugFormat( + "[INTERREGION]: Problem adding scene object {0} in {1} ", newObject.UUID, RegionInfo.RegionName); return false; } - // For attachments, we need to wait until the agent is root - // before we restart the scripts, or else some functions won't work. if (!newObject.IsAttachment) { + // FIXME: It would be better to never add the scene object at all rather than add it and then delete + // it + if (!Permissions.CanObjectEntry(newObject.UUID, true, newObject.AbsolutePosition)) + { + // Deny non attachments based on parcel settings + // + m_log.Info("[INTERREGION]: Denied prim crossing because of parcel settings"); + + DeleteSceneObject(newObject, false); + + return false; + } + + // For attachments, we need to wait until the agent is root + // before we restart the scripts, or else some functions won't work. newObject.RootPart.ParentGroup.CreateScriptInstances(0, false, DefaultScriptEngine, GetStateSource(newObject)); newObject.ResumeScripts(); } @@ -2531,16 +2554,6 @@ namespace OpenSim.Region.Framework.Scenes /// True if the SceneObjectGroup was added, False if it was not public bool AddSceneObject(SceneObjectGroup sceneObject) { - // If the user is banned, we won't let any of their objects - // enter. Period. - // - if (RegionInfo.EstateSettings.IsBanned(sceneObject.OwnerID)) - { - m_log.InfoFormat("[INTERREGION]: Denied prim crossing for banned avatar {0}", sceneObject.OwnerID); - - return false; - } - sceneObject.SetScene(this); // Force allocation of new LocalId From 1b1f841c6aaf2453b3aca0eade84855ae658e655 Mon Sep 17 00:00:00 2001 From: Talun Date: Tue, 3 Jul 2012 11:10:09 +0100 Subject: [PATCH 493/547] Mantis 6063 osNpcTouch. Allow NPCS to touch obects. --- .../Region/Framework/Interfaces/INPCModule.cs | 8 ++++ .../OptionalModules/World/NPC/NPCAvatar.cs | 39 +++++++++++++++++++ .../OptionalModules/World/NPC/NPCModule.cs | 10 +++++ .../Shared/Api/Implementation/OSSL_Api.cs | 35 +++++++++++++++++ .../Shared/Api/Interface/IOSSL_Api.cs | 1 + .../Shared/Api/Runtime/OSSL_Stub.cs | 5 +++ 6 files changed, 98 insertions(+) diff --git a/OpenSim/Region/Framework/Interfaces/INPCModule.cs b/OpenSim/Region/Framework/Interfaces/INPCModule.cs index 860483d461..d582149d57 100644 --- a/OpenSim/Region/Framework/Interfaces/INPCModule.cs +++ b/OpenSim/Region/Framework/Interfaces/INPCModule.cs @@ -183,6 +183,14 @@ namespace OpenSim.Region.Framework.Interfaces /// true if the stand succeeded, false if not bool Stand(UUID agentID, Scene scene); + /// + /// Get the NPC to touch an object. + /// + /// + /// + /// true if the touch is actually attempted, false if not + bool Touch(UUID agentID, UUID partID); + /// /// Delete an NPC. /// diff --git a/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs b/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs index b3e10698fd..43a09ec25c 100644 --- a/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs +++ b/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs @@ -104,6 +104,45 @@ namespace OpenSim.Region.OptionalModules.World.NPC OnMoneyTransferRequest(m_uuid, target, amount, 1, "Payment"); } + public bool Touch(UUID target) + { + SceneObjectPart part = m_scene.GetSceneObjectPart(target); + if (part == null) + return false; + bool objectTouchable = hasTouchEvents(part); // Only touch an object that is scripted to respond + if (!objectTouchable && !part.IsRoot) + objectTouchable = hasTouchEvents(part.ParentGroup.RootPart); + if (!objectTouchable) + return false; + // Set up the surface args as if the touch is from a client that does not support this + SurfaceTouchEventArgs surfaceArgs = new SurfaceTouchEventArgs(); + surfaceArgs.FaceIndex = -1; // TOUCH_INVALID_FACE + surfaceArgs.Binormal = Vector3.Zero; // TOUCH_INVALID_VECTOR + surfaceArgs.Normal = Vector3.Zero; // TOUCH_INVALID_VECTOR + surfaceArgs.STCoord = new Vector3(-1.0f, -1.0f, 0.0f); // TOUCH_INVALID_TEXCOORD + surfaceArgs.UVCoord = surfaceArgs.STCoord; // TOUCH_INVALID_TEXCOORD + List touchArgs = new List(); + touchArgs.Add(surfaceArgs); + Vector3 offset = part.OffsetPosition * -1.0f; + if (OnGrabObject == null) + return false; + OnGrabObject(part.LocalId, offset, this, touchArgs); + if (OnGrabUpdate != null) + OnGrabUpdate(part.UUID, offset, part.ParentGroup.RootPart.GroupPosition, this, touchArgs); + if (OnDeGrabObject != null) + OnDeGrabObject(part.LocalId, this, touchArgs); + return true; + } + + private bool hasTouchEvents(SceneObjectPart part) + { + if ((part.ScriptEvents & scriptEvents.touch) != 0 || + (part.ScriptEvents & scriptEvents.touch_start) != 0 || + (part.ScriptEvents & scriptEvents.touch_end) != 0) + return true; + return false; + } + public void InstantMessage(UUID target, string message) { OnInstantMessage(this, new GridInstantMessage(m_scene, diff --git a/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs b/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs index d3456ab61a..1e85fb4089 100644 --- a/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs +++ b/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs @@ -305,6 +305,16 @@ namespace OpenSim.Region.OptionalModules.World.NPC return false; } + public bool Touch(UUID agentID, UUID objectID) + { + lock (m_avatars) + { + if (m_avatars.ContainsKey(agentID)) + return m_avatars[agentID].Touch(objectID); + return false; + } + } + public UUID GetOwner(UUID agentID) { lock (m_avatars) diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs index 7385dd9294..61394afe91 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs @@ -2677,6 +2677,41 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api } } + public void osNpcTouch(LSL_Key npcLSL_Key, LSL_Key object_key, LSL_Integer link_num) + { + CheckThreatLevel(ThreatLevel.High, "osNpcTouch"); + m_host.AddScriptLPS(1); + INPCModule module = World.RequestModuleInterface(); + int linkNum = link_num.value; + if (module != null || (linkNum < 0 && linkNum != ScriptBaseClass.LINK_THIS)) + { + UUID npcId; + if (!UUID.TryParse(npcLSL_Key, out npcId) || !module.CheckPermissions(npcId, m_host.OwnerID)) + return; + SceneObjectPart part = null; + UUID objectId; + if (UUID.TryParse(LSL_String.ToString(object_key), out objectId)) + part = World.GetSceneObjectPart(objectId); + if (part == null) + return; + if (linkNum != ScriptBaseClass.LINK_THIS) + { + if (linkNum == 0 || linkNum == ScriptBaseClass.LINK_ROOT) + { // 0 and 1 are treated as root, find the root if the current part isnt it + if (!part.IsRoot) + part = part.ParentGroup.RootPart; + } + else + { // Find the prim with the given link number if not found then fail silently + part = part.ParentGroup.GetLinkNumPart(linkNum); + if (part == null) + return; + } + } + module.Touch(npcId, part.UUID); + } + } + /// /// Save the current appearance of the script owner permanently to the named notecard. /// diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs index a8335aac37..d38709e2b9 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs @@ -231,6 +231,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces void osNpcRemove(key npc); void osNpcPlayAnimation(LSL_Key npc, string animation); void osNpcStopAnimation(LSL_Key npc, string animation); + void osNpcTouch(LSL_Key npcLSL_Key, LSL_Key object_key, LSL_Integer link_num); void osNpcWhisper(key npc, int channel, string message); LSL_Key osOwnerSaveAppearance(string notecard); diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs index 500ed96685..692bb0a510 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs @@ -626,6 +626,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase m_OSSL_Functions.osNpcWhisper(npc, channel, message); } + public void osNpcTouch(LSL_Key npcLSL_Key, LSL_Key object_key, LSL_Integer link_num) + { + m_OSSL_Functions.osNpcTouch(npcLSL_Key, object_key, link_num); + } + public LSL_Key osOwnerSaveAppearance(string notecard) { return m_OSSL_Functions.osOwnerSaveAppearance(notecard); From ae1f2114f5ccb0422536ec73feb2dbf16c2645fd Mon Sep 17 00:00:00 2001 From: Talun Date: Thu, 5 Jul 2012 23:34:23 +0100 Subject: [PATCH 494/547] Mantis 6077 trim NPC chat on channel zero. This patch trims leading and trailing spaces from NPC chat and suppresses the sending of empty chat strings on open chat channel 0. --- OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs b/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs index 43a09ec25c..9b3400da78 100644 --- a/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs +++ b/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs @@ -192,6 +192,14 @@ namespace OpenSim.Region.OptionalModules.World.NPC private void SendOnChatFromClient(int channel, string message, ChatTypeEnum chatType) { + if (channel == 0) + { + message = message.Trim(); + if (string.IsNullOrEmpty(message)) + { + return; + } + } OSChatMessage chatFromClient = new OSChatMessage(); chatFromClient.Channel = channel; chatFromClient.From = Name; From 056c9a59b2fee1e459915bd1ca908107c7c9695d Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 6 Jul 2012 23:07:50 +0100 Subject: [PATCH 495/547] Add assert to attachment regression tests to check that number of objects in the scene graph --- .../Tests/AttachmentsModuleTests.cs | 14 ++++++++++++++ OpenSim/Region/Framework/Scenes/Scene.cs | 11 +++++++++++ OpenSim/Region/Framework/Scenes/SceneGraph.cs | 18 +++++++++++++----- 3 files changed, 38 insertions(+), 5 deletions(-) diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs index 78569539c6..c1ba8a8e0c 100644 --- a/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs +++ b/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs @@ -149,6 +149,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests InventoryFolderBase targetFolder = scene.InventoryService.GetFolderForType(sp.UUID, AssetType.Object); Assert.That(attachmentItem.Folder, Is.EqualTo(targetFolder.ID)); + Assert.That(scene.GetSceneObjectGroups().Count, Is.EqualTo(1)); + // TestHelpers.DisableLogging(); } @@ -181,6 +183,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests // Check appearance status Assert.That(sp.Appearance.GetAttachments().Count, Is.EqualTo(1)); Assert.That(sp.Appearance.GetAttachpoint(attItem.ID), Is.EqualTo((int)AttachmentPoint.Chest)); + + Assert.That(scene.GetSceneObjectGroups().Count, Is.EqualTo(1)); } [Test] @@ -239,6 +243,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests // Check item status Assert.That(sp.Appearance.GetAttachpoint(attItem.ID), Is.EqualTo(0)); + + Assert.That(scene.GetSceneObjectGroups().Count, Is.EqualTo(0)); } /// @@ -300,6 +306,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests Assert.That(retreivedAttachments[0].ItemID, Is.EqualTo(attItem.ID)); Assert.That(retreivedAttachments[0].AssetID, Is.EqualTo(attItem.AssetID)); Assert.That(presence.Appearance.GetAttachpoint(attItem.ID), Is.EqualTo((int)AttachmentPoint.Chest)); + + Assert.That(scene.GetSceneObjectGroups().Count, Is.EqualTo(1)); } [Test] @@ -399,6 +407,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests Assert.That(actualSceneBAtt.Name, Is.EqualTo(attItem.Name)); Assert.That(actualSceneBAtt.AttachmentPoint, Is.EqualTo((uint)AttachmentPoint.Chest)); + // Teleporting attachments should not end up in the scene graph + Assert.That(sceneB.GetSceneObjectGroups().Count, Is.EqualTo(1)); + // Check attachments have been removed from sceneA ScenePresence afterTeleportSceneASp = sceneA.GetScenePresence(ua1.PrincipalID); @@ -410,6 +421,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests // This is the actual attachment, which should no longer exist List actualSceneAAttachments = afterTeleportSceneASp.GetAttachments(); Assert.That(actualSceneAAttachments.Count, Is.EqualTo(0)); + + // Teleporting attachments should not end up in the scene graph + Assert.That(sceneA.GetSceneObjectGroups().Count, Is.EqualTo(0)); } // I'm commenting this test because scene setup NEEDS InventoryService to diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 6239d5184b..d98c01d937 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -4473,6 +4473,17 @@ namespace OpenSim.Region.Framework.Scenes m_sceneGraph.ForEachScenePresence(action); } + /// + /// Get all the scene object groups. + /// + /// + /// The scene object groups. If the scene is empty then an empty list is returned. + /// + public List GetSceneObjectGroups() + { + return m_sceneGraph.GetSceneObjectGroups(); + } + /// /// Get a group via its UUID /// diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs index a59758f5dc..bc9a585982 100644 --- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs +++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs @@ -957,6 +957,18 @@ namespace OpenSim.Region.Framework.Scenes return result; } + /// + /// Get all the scene object groups. + /// + /// + /// The scene object groups. If the scene is empty then an empty list is returned. + /// + protected internal List GetSceneObjectGroups() + { + lock (SceneObjectGroupsByFullID) + return new List(SceneObjectGroupsByFullID.Values); + } + /// /// Get a group in the scene /// @@ -1100,11 +1112,7 @@ namespace OpenSim.Region.Framework.Scenes /// protected internal void ForEachSOG(Action action) { - List objlist; - lock (SceneObjectGroupsByFullID) - objlist = new List(SceneObjectGroupsByFullID.Values); - - foreach (SceneObjectGroup obj in objlist) + foreach (SceneObjectGroup obj in GetSceneObjectGroups()) { try { From e4a6611865848ffcfa6adedd813534e0a0e4abf3 Mon Sep 17 00:00:00 2001 From: Robert Adams Date: Fri, 6 Jul 2012 10:01:47 -0700 Subject: [PATCH 496/547] Clean up collision reporting code so they are properly passed to the simulator in batches. More comments. --- .../Physics/BulletSPlugin/BSCharacter.cs | 102 +++++++++++------- .../Region/Physics/BulletSPlugin/BSPlugin.cs | 11 ++ .../Region/Physics/BulletSPlugin/BSPrim.cs | 29 ++--- .../Region/Physics/BulletSPlugin/BSScene.cs | 23 +++- 4 files changed, 107 insertions(+), 58 deletions(-) diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs b/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs index b08d5dba4d..dc0c0083f8 100644 --- a/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs @@ -74,7 +74,7 @@ public class BSCharacter : PhysicsActor private float _buoyancy; private int _subscribedEventsMs = 0; - private int _lastCollisionTime = 0; + private int _nextCollisionOkTime = 0; private Vector3 _PIDTarget; private bool _usePID; @@ -360,17 +360,22 @@ public class BSCharacter : PhysicsActor } //m_lastUpdateSent = false; } + public override void AddAngularForce(Vector3 force, bool pushforce) { } public override void SetMomentum(Vector3 momentum) { } + + // Turn on collision events at a rate no faster than one every the given milliseconds public override void SubscribeEvents(int ms) { _subscribedEventsMs = ms; - _lastCollisionTime = Util.EnvironmentTickCount() - _subscribedEventsMs; // make first collision happen + _nextCollisionOkTime = Util.EnvironmentTickCount() - _subscribedEventsMs; // make first collision happen } + // Stop collision events public override void UnSubscribeEvents() { _subscribedEventsMs = 0; } + // Return 'true' if someone has subscribed to events public override bool SubscribedEvents() { return (_subscribedEventsMs > 0); } @@ -386,47 +391,57 @@ public class BSCharacter : PhysicsActor _mass = _density * _avatarVolume; } + // Set to 'true' if the individual changed items should be checked + // (someday RequestPhysicsTerseUpdate() will take a bitmap of changed properties) + const bool SHOULD_CHECK_FOR_INDIVIDUAL_CHANGES = false; + // The physics engine says that properties have updated. Update same and inform // the world that things have changed. public void UpdateProperties(EntityProperties entprop) { bool changed = false; - // we assign to the local variables so the normal set action does not happen - if (_position != entprop.Position) - { + if (SHOULD_CHECK_FOR_INDIVIDUAL_CHANGES) { + // we assign to the local variables so the normal set action does not happen + if (_position != entprop.Position) { + _position = entprop.Position; + changed = true; + } + if (_orientation != entprop.Rotation) { + _orientation = entprop.Rotation; + changed = true; + } + if (_velocity != entprop.Velocity) { + _velocity = entprop.Velocity; + changed = true; + } + if (_acceleration != entprop.Acceleration) { + _acceleration = entprop.Acceleration; + changed = true; + } + if (_rotationalVelocity != entprop.RotationalVelocity) { + _rotationalVelocity = entprop.RotationalVelocity; + changed = true; + } + if (changed) { + // m_log.DebugFormat("{0}: UpdateProperties: id={1}, c={2}, pos={3}, rot={4}", LogHeader, LocalID, changed, _position, _orientation); + // Avatar movement is not done by generating this event. There is code in the heartbeat + // loop that updates avatars. + // base.RequestPhysicsterseUpdate(); + } + } + else { _position = entprop.Position; - changed = true; - } - if (_orientation != entprop.Rotation) - { _orientation = entprop.Rotation; - changed = true; - } - if (_velocity != entprop.Velocity) - { _velocity = entprop.Velocity; - changed = true; - } - if (_acceleration != entprop.Acceleration) - { _acceleration = entprop.Acceleration; - changed = true; - } - if (_rotationalVelocity != entprop.RotationalVelocity) - { _rotationalVelocity = entprop.RotationalVelocity; - changed = true; - } - if (changed) - { - // m_log.DebugFormat("{0}: UpdateProperties: id={1}, c={2}, pos={3}, rot={4}", LogHeader, LocalID, changed, _position, _orientation); - // Avatar movement is not done by generating this event. There is a system that - // checks for avatar updates each heartbeat loop. // base.RequestPhysicsterseUpdate(); } } // Called by the scene when a collision with this object is reported + // The collision, if it should be reported to the character, is placed in a collection + // that will later be sent to the simulator when SendCollisions() is called. CollisionEventUpdate collisionCollection = null; public void Collide(uint collidingWith, ActorTypes type, Vector3 contactPoint, Vector3 contactNormal, float pentrationDepth) { @@ -440,29 +455,34 @@ public class BSCharacter : PhysicsActor } // throttle collisions to the rate specified in the subscription - if (_subscribedEventsMs == 0) return; // don't want collisions - int nowTime = _scene.SimulationNowTime; - if (nowTime < (_lastCollisionTime + _subscribedEventsMs)) return; - _lastCollisionTime = nowTime; + if (_subscribedEventsMs != 0) { + int nowTime = _scene.SimulationNowTime; + if (nowTime >= _nextCollisionOkTime) { + _nextCollisionOkTime = nowTime + _subscribedEventsMs; - if (collisionCollection == null) - collisionCollection = new CollisionEventUpdate(); - collisionCollection.AddCollider(collidingWith, new ContactPoint(contactPoint, contactNormal, pentrationDepth)); + if (collisionCollection == null) + collisionCollection = new CollisionEventUpdate(); + collisionCollection.AddCollider(collidingWith, new ContactPoint(contactPoint, contactNormal, pentrationDepth)); + } + } } public void SendCollisions() { - // if (collisionCollection != null) - // { - // base.SendCollisionUpdate(collisionCollection); - // collisionCollection = null; - // } + /* + if (collisionCollection != null && collisionCollection.Count > 0) + { + base.SendCollisionUpdate(collisionCollection); + collisionCollection = null; + } + */ // Kludge to make a collision call even if there are no collisions. // This causes the avatar animation to get updated. if (collisionCollection == null) collisionCollection = new CollisionEventUpdate(); base.SendCollisionUpdate(collisionCollection); - collisionCollection = null; + collisionCollection.Clear(); + // End kludge } } diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSPlugin.cs b/OpenSim/Region/Physics/BulletSPlugin/BSPlugin.cs index 0730824ce1..0f027b8d6a 100644 --- a/OpenSim/Region/Physics/BulletSPlugin/BSPlugin.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSPlugin.cs @@ -32,6 +32,14 @@ using OpenMetaverse; namespace OpenSim.Region.Physics.BulletSPlugin { + /// + /// Entry for a port of Bullet (http://bulletphysics.org/) to OpenSim. + /// This module interfaces to an unmanaged C++ library which makes the + /// actual calls into the Bullet physics engine. + /// The unmanaged library is found in opensim-libs::trunk/unmanaged/BulletSim/. + /// The unmanaged library is compiled and linked statically with Bullet + /// to create BulletSim.dll and libBulletSim.so (for both 32 and 64 bit). + /// public class BSPlugin : IPhysicsPlugin { //private static readonly log4net.ILog m_log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); @@ -53,6 +61,9 @@ public class BSPlugin : IPhysicsPlugin { if (Util.IsWindows()) Util.LoadArchSpecificWindowsDll("BulletSim.dll"); + // If not Windows, loading is performed by the + // Mono loader as specified in + // "bin/Physics/OpenSim.Region.Physics.BulletSPlugin.dll.config". _mScene = new BSScene(sceneIdentifier); } diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs b/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs index 248d1f2786..130f1ca145 100644 --- a/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs @@ -90,7 +90,7 @@ public sealed class BSPrim : PhysicsActor private BSPrim _parentPrim; private int _subscribedEventsMs = 0; - private int _lastCollisionTime = 0; + private int _nextCollisionOkTime = 0; long _collidingStep; long _collidingGroundStep; @@ -597,7 +597,8 @@ public sealed class BSPrim : PhysicsActor } public override void SubscribeEvents(int ms) { _subscribedEventsMs = ms; - _lastCollisionTime = Util.EnvironmentTickCount() - _subscribedEventsMs; // make first collision happen + // make sure first collision happens + _nextCollisionOkTime = Util.EnvironmentTickCount() - _subscribedEventsMs; } public override void UnSubscribeEvents() { _subscribedEventsMs = 0; @@ -1338,23 +1339,27 @@ public sealed class BSPrim : PhysicsActor _collidingGroundStep = _scene.SimulationStep; } - if (_subscribedEventsMs == 0) return; // nothing in the object is waiting for collision events - // throttle the collisions to the number of milliseconds specified in the subscription - int nowTime = _scene.SimulationNowTime; - if (nowTime < (_lastCollisionTime + _subscribedEventsMs)) return; - _lastCollisionTime = nowTime; + // if someone is subscribed to collision events.... + if (_subscribedEventsMs != 0) { + // throttle the collisions to the number of milliseconds specified in the subscription + int nowTime = _scene.SimulationNowTime; + if (nowTime >= _nextCollisionOkTime) { + _nextCollisionOkTime = nowTime + _subscribedEventsMs; - if (collisionCollection == null) - collisionCollection = new CollisionEventUpdate(); - collisionCollection.AddCollider(collidingWith, new ContactPoint(contactPoint, contactNormal, pentrationDepth)); + if (collisionCollection == null) + collisionCollection = new CollisionEventUpdate(); + collisionCollection.AddCollider(collidingWith, new ContactPoint(contactPoint, contactNormal, pentrationDepth)); + } + } } + // The scene is telling us it's time to pass our collected collisions into the simulator public void SendCollisions() { - if (collisionCollection != null) + if (collisionCollection != null && collisionCollection.Count > 0) { base.SendCollisionUpdate(collisionCollection); - collisionCollection = null; + collisionCollection.Clear(); } } } diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSScene.cs b/OpenSim/Region/Physics/BulletSPlugin/BSScene.cs index 94a0ccf276..417cb5f3f0 100644 --- a/OpenSim/Region/Physics/BulletSPlugin/BSScene.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSScene.cs @@ -52,6 +52,7 @@ using OpenSim.Region.Framework; // Should prim.link() and prim.delink() membership checking happen at taint time? // Mesh sharing. Use meshHash to tell if we already have a hull of that shape and only create once // Do attachments need to be handled separately? Need collision events. Do not collide with VolumeDetect +// Use collision masks for collision with terrain and phantom objects // Implement the genCollisions feature in BulletSim::SetObjectProperties (don't pass up unneeded collisions) // Implement LockAngularMotion // Decide if clearing forces is the right thing to do when setting position (BulletSim::SetObjectTranslation) @@ -62,9 +63,6 @@ using OpenSim.Region.Framework; // Multiple contact points on collision? // See code in ode::near... calls to collision_accounting_events() // (This might not be a problem. ODE collects all the collisions with one object in one tick.) -// Use collision masks for collision with terrain and phantom objects -// Figure out how to not allocate a new Dictionary and List for every collision -// in BSPrim.Collide() and BSCharacter.Collide(). Can the same ones be reused? // Raycast // namespace OpenSim.Region.Physics.BulletSPlugin @@ -405,6 +403,8 @@ public class BSScene : PhysicsScene, IPhysicsParameters // prevent simulation until we've been initialized if (!m_initialized) return 10.0f; + long simulateStartTime = Util.EnvironmentTickCount(); + // update the prim states while we know the physics engine is not busy ProcessTaints(); @@ -437,13 +437,18 @@ public class BSScene : PhysicsScene, IPhysicsParameters } } - // The SendCollision's batch up the collisions on the objects. Now push the collisions into the simulator. + // The above SendCollision's batch up the collisions on the objects. + // Now push the collisions into the simulator. foreach (BSPrim bsp in m_primsWithCollisions) bsp.SendCollisions(); m_primsWithCollisions.Clear(); + + // This is a kludge to get avatar movement updated. + // Don't send collisions only if there were collisions -- send everytime. + // ODE sends collisions even if there are none and this is used to update + // avatar animations and stuff. // foreach (BSCharacter bsc in m_avatarsWithCollisions) // bsc.SendCollisions(); - // This is a kludge to get avatar movement updated. ODE sends collisions even if there isn't any foreach (KeyValuePair kvp in m_avatars) kvp.Value.SendCollisions(); m_avatarsWithCollisions.Clear(); @@ -465,10 +470,12 @@ public class BSScene : PhysicsScene, IPhysicsParameters if (m_avatars.TryGetValue(entprop.ID, out actor)) { actor.UpdateProperties(entprop); + continue; } } } + // If enabled, call into the physics engine to dump statistics if (m_detailedStatsStep > 0) { if ((m_simulationStep % m_detailedStatsStep) == 0) @@ -477,6 +484,11 @@ public class BSScene : PhysicsScene, IPhysicsParameters } } + // this is a waste since the outside routine also calcuates the physics simulation + // period. TODO: There should be a way of computing physics frames from simulator computation. + // long simulateTotalTime = Util.EnvironmentTickCountSubtract(simulateStartTime); + // return (timeStep * (float)simulateTotalTime); + // TODO: FIX THIS: fps calculation wrong. This calculation always returns about 1 in normal operation. return timeStep / (numSubSteps * m_fixedTimeStep) * 1000f; } @@ -528,6 +540,7 @@ public class BSScene : PhysicsScene, IPhysicsParameters public override void SetWaterLevel(float baseheight) { m_waterLevel = baseheight; + // TODO: pass to physics engine so things will float? } public float GetWaterLevel() { From 74014a38548b831ab56fa552f20d26fa29a83332 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 6 Jul 2012 23:13:00 +0100 Subject: [PATCH 497/547] minor: Remove some wrong comments in attachments regression tests --- .../Avatar/Attachments/Tests/AttachmentsModuleTests.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs index c1ba8a8e0c..5dcbd28f59 100644 --- a/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs +++ b/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs @@ -407,7 +407,6 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests Assert.That(actualSceneBAtt.Name, Is.EqualTo(attItem.Name)); Assert.That(actualSceneBAtt.AttachmentPoint, Is.EqualTo((uint)AttachmentPoint.Chest)); - // Teleporting attachments should not end up in the scene graph Assert.That(sceneB.GetSceneObjectGroups().Count, Is.EqualTo(1)); // Check attachments have been removed from sceneA @@ -422,7 +421,6 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests List actualSceneAAttachments = afterTeleportSceneASp.GetAttachments(); Assert.That(actualSceneAAttachments.Count, Is.EqualTo(0)); - // Teleporting attachments should not end up in the scene graph Assert.That(sceneA.GetSceneObjectGroups().Count, Is.EqualTo(0)); } From f1f390cfdfa7485d771e65449889b12b64ad7f56 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 6 Jul 2012 23:22:40 +0100 Subject: [PATCH 498/547] Remove now duplicate interregion object check that should have been removed a few commits ago in 43a2da9 --- OpenSim/Region/Framework/Scenes/Scene.cs | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index d98c01d937..5c7bca029e 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -2600,18 +2600,6 @@ namespace OpenSim.Region.Framework.Scenes else { AddRestoredSceneObject(sceneObject, true, false); - - if (!Permissions.CanObjectEntry(sceneObject.UUID, - true, sceneObject.AbsolutePosition)) - { - // Deny non attachments based on parcel settings - // - m_log.Info("[INTERREGION]: Denied prim crossing because of parcel settings"); - - DeleteSceneObject(sceneObject, false); - - return false; - } } return true; From af9d8de515ff0043d2c19b67a2ce9040b462d12e Mon Sep 17 00:00:00 2001 From: Robert Adams Date: Fri, 6 Jul 2012 15:56:35 -0700 Subject: [PATCH 499/547] BulletSim: update the binaries to the current sources --- bin/lib32/BulletSim.dll | Bin 533504 -> 538112 bytes bin/lib32/libBulletSim.so | Bin 2333901 -> 2334329 bytes bin/lib64/BulletSim.dll | Bin 686080 -> 690688 bytes bin/lib64/libBulletSim.so | Bin 2528521 -> 2529000 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/bin/lib32/BulletSim.dll b/bin/lib32/BulletSim.dll index 2c28063f4cf459e0434456a029c784c1fe6356fb..a3ccb98b8810df27b3e90a0edca9baa9035a8f8a 100755 GIT binary patch delta 75553 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 NJ;L4%@!r&y{{u{Uj=lf@ delta 71625 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
    `?JBTg7b*ZAF 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 m%G7#Dq*U>i-Fhy;Xd$g)eEZ4RDuC!y`;L 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 ohhvE3#*F6Yi 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

    V)PY^mlp%QU$UjFV2 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 delta 803927 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

    a)FFz7h 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ೀ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

    B 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%0A{DtM<+Duj058h5p;#DMk^Qk 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⪙+(g>omZ7~OmvbxmCEeB@Z<8L}PTJt8 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 diff --git a/bin/lib64/BulletSim.dll b/bin/lib64/BulletSim.dll index d9e5e898748b5025db094bd2e45923abfc400772..d91dac159e43db7e15aa88d5777161563c6fceb7 100755 GIT binary patch delta 132086 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

    vs*n&q6qh-}YM>`pHDi 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 z

    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 z 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 K(D=KSKK~DTURuKd delta 128000 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
  1. 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 Sor zuwF{bEou1zOZtwKFP|!(VZZ_@bePFQE}auBk$_>Ah`hHY;+e!FXzs^|p`$!Rti(~?Nvcd9D8U^@U|KxB zca+DaTk>ozW#TO9w|h7($MBcC#G#T$iEu}GcT4^yDPKO+0v}_6@8NLXaR;S>p8KRQ zTnxn?l>nhT#4z14K#cI5UoEKHdB_2qC4hFD6|l(~kqYDRSOJzY8f_hkG0&gGvKmiM zOGB1R>2O;qt+k}nwQqNeEe%~LA%s4V(gE30I^Y~nBR8SDMS!D2CrjAN5)QD0L;ioJ zlR196+R;IbU?>vAF&5uW?kKS#ug$Tr`tU(JrAWX?OGKV(iFi)2L?UKbBiTHH61LC+ z&@Phz;cKNZbdwZ%rtg#@+I>s{rF;v%qrB7t z&$5)0=xH2MEqMQ0@{^@>x;8@sXcH_2B*KmkPbIiRn5EzwOF<7Q?b%IAd#a>#fY=*o zuDtn8WLP^>%y-nTlJK-QB)G$FDeZ8Kr(>}HLtpQZdN%aAB@*${3VCXUys$$4wnCm+ zAto#2ku~zrnswI-DY8OtV+4)7gR`uWAAKNnvOWDGUgf!f;F4(~_^Px1)|&g+o0F!J(-ojFv*J z7;;t6+>+5`2iv+1EtnZwS>Za0AEp|@T-T#%F=!J@UQdno@}ER$)kJs{8htm=AO%c1 zV@%vaYk^%~Z?iehP-yDz&1P+*;oW@2^f`54si`VP@q4~E&>s<*XgG!!nbEo~#V7pt z0yGEkqs2P3Te%!|yJu=s%)Rr8Cf<{s{1ed5JdV$Ke4e6VGWQo&WjoygJsB(5PCL@a zZwRZlgEDB=h5fdJ9%e7&sZKKmzxjKzmH6Q=v>!jOH~J*da0SUTcI`l;3EBoLJJP{q zpOJQ=83eLdv00tbBKs?g9qCLXl?N{4@jIUH4B1JW)bg+30{zzI*$Yw2e0igH+Hj|< zOQi(EW&HG*p0m4>9o(MwTssDO!bqWr5UZ(!5$@*!Es(st1ppqJQz zU9=iZT+XiTqNkwkMYi@g>H?4TY~OEmIJBS70&>xMUi!1KTQ2p-Z@0!8(Nhycf`?V% zW}f(;P)6|YjHQa7`qo8#$M*yL|58m_ESh9^k|BMT&2}H{svhA{ZuinKhK=4w>-xk$ zz|X?$jqy*)iq*{IUat&^dk?s%a_(=ONpkNUR2-z( z5mZnthy@i33Mz_<1uOQt_JWFCDPlv!wIAEAeJ$%My6Uwr*n3;Mu3dM~wYzqm_nSL| z?RkE`_w)Y$e3+Y_oFpg7$;ruyaWp~+vJ$CE_E}VWJ1;So*Z=rsE2M*Y_A{PAx`bK~rK`srC$4ir;>c zJUI!Myr$>tN!VKA-Ukkx<~mw+|0J5SpBKwl&{ekTNo#lT)U&oVC#~0! z^2mNZm}e{$lFt&s777QKBd5Og03UARr{)WqKEmX|4$r5$hp=}^7^S~D#9s+EZ$3Rf z&d>A90SX;Fff3(5mfTMA=Irlz)bk{N$u|C=cR0oOm{{*Q<=xn|2SzcRkcW|DjUf|*8Qd5M%(51JfAul&Y*zd3Xl}zO>@&+O?Svb++KH%ph zi!bb;kCQ3aCEiCQLNz-rjz#EXV`EZ)?p)&YMB=0@?@3wSm-!afeIhNm!t1jV6Y1U+ z{)TOcp&M6uQ})+*Dt8TAq>SCv;Tm7T-X{_Ni%;OONy2_3vLP&AZbZHwCyX1B?BqBK zz0O;+q2p-&bsp?iV5b}hk-kkUq>n#>e*d*U-MP+3@p@hgb-uyNv)f(u**AC@ljsAD zH+1kO#`?8*Du0XjV6pME;1(auZVu6N-sVL#-Ve;F3YomP^QL8TOYGIK8+FU%037sKT)gks>qiwKb*BJ1aS2AC2XG{b8=wT)gaQW3fbws0v^*hqa$2^)n>0m%t z<~0TfW>)zphig+DMP`W>{0AfpJJ=!l1!=xO;^U&wq$fOpr8lFkPk5K2Els0u$6np z6Ip|Sbk0RIU<1FdT4w7nRV(fM!z!cEQJQyt3A#`!9GBU;dYg`n}|N`6XB;z2ueM2jKa*ui-xlUf!9Pd=T5w z*WNereZN#7h?Z93rC6^>I$4P?Ve1P~Ol1t0+PP?FWt4)dKB>$L)6IYRU+j+o^v5gy z8(ZC9AMl!QF|qm0$nPyC;&RogsYVs$XlZi_teWyQ_4c252b0?|_OG z@9Q3PeLts|@MU`&&WRK!+=f*CHf{EIRLUf}un{$Bnn}d4xMo|KNaXB&McMU^@&S{seziMBvids<1uSeKyv zU#7PHo+j6(#l`|DLoklEdf*tqT5=)+QkAR0VEkkk#h6=b^2j0D@ITz4`!I*_;s3xg zD~A|U@li{;`YG#WL&z*}K(qwz#w{HXS|c}ng5Fu21*bYWmcR%9P#qUBjqQkXAaaxg zkwbEdW^8DAnvql7aG$y!FNbw&(zH=GJcj|mD$Z)DCs{-Z6Fc2PU+*d^n|zb}WGBxt zI{B>8$0yLoOA8x)d;)zuv6Mp2ZlVkeZ%$R*a95r;r_pYrAiD=_b`v-F-C_!jb{ECj zmEp9)T?C2}YcYLZbQddm43^t?4^hOm-5NO%!xM~dh=cD&58==6ptY}gAZ3*#QanXD z*G;|vX5s_@BWI)2O{lJ?*vMLzrnjErHG>%V^W3Oibc9|vkH}$SRqIiUyrMOGR#*Qm zugGO$C&MW{pJ>jK!^tzhs3}%22PDz?MPasYERD{O5~_R45+qK`652MPUHL@<_wiy> zvw#Q|;dmc`Mi&tInO29WfGEnwjiFryL}Pv(tC&kck%v8vpkf6@1<%@f&_v;uHXkJM zJ$4>is&HY21{6d~-Hf203yO+tO$41UC<2Q_7L^;Cz{5kbfj`;tOz2kALk;Z9)1l?1 zT3ux+TDX{(Na5{pZnoJ=l*{(I9-ssl^S9gd#7mTN9d%nc^$4>JXcQznF|r<&EF`?M z&2q%5f18>Y61CZcDgybhW(rfJGG=7b=KGUdllnrpRjsktx^0S{U1h$>?`%ANJvJv`&zy z!H?!q^a(-2Wa4T`LCF=x8uo6V9#lzqns{x0p+{C0=LPRuRM6(?7{M^FRTn{~qLMiC zrX|%yu54F}*y%Uyff{bbQC$%S1(#YxMk=hA4-p+q%%!k&6{R}&aCYWn&~|)~k3oXs zsL$ss+U}9J3@uO1%Sk;U-hu{~W6gOzZ+n!4P*LCY&qAnJ@@Sk7H8fk%({wph6y&R5 zc@qkSAR&e9WqDjjSzZoG(JPB2^fKm&0)&$=Vg(%#)GwGt1?QqkwM7rUxPYLiwbA0O z3m75Ps}82%<@p`)d*`?Nc3y7IMLoksZ+<+Vpg+S!H68~`uDT+U*My~WUGW?LF|Q!k zdLoYJgk?rO(UafBSbASitmk)f3tAT;BKT@pUPoX8_JgGlWH$K&PeEJii|v-VuP_T5 zM>?)4O1V!owt?`8AD&+hkmKMI?1%bra0dL&LtI9hXJEqn9DdjEyPK@sv4@2GYByb0 zNfTpMS!<7qds6;Sq=)BHdknvy95KA+IV>(o4oko^!_pE3B}$vad{|dbYypGqv0VLr za9F&e9Tv}e4vR}wheZjH7O+S??WRkvk2I*En9I)tqq9Ydf7rD5^d?fo6v>N&`}#@g zc%`@j<4SOoFQu7b8U7Lh&+ zT!AqlLdu3tj`bapJjS<|T)Sd$&M^<`O#8P~q=~4-{Sm!q6H$*pwg}qTL{#C+V0qL; zG~hqLQnjfV%`fH@w5_RV$mheNMu`Rd9~VK(qktVFU@6{AM6lhfXizgTi_gm;?1!$g zu#{>phVuv61+8q364GFK(p*IG_OR4$Au4d(Ri}|H5Ogh@pnWZXdgEa!&{Fi{3M^Av z0*b@Vf-bg1s#sV`wZg1Y5|$rYA?T4=(56V#*ZE>m5gh%qs^@McO+SZ~o9|wy|v>3#5!jh|vsK-=6N25g@9tTTew5ZF& zVQJe&wB=R>^G_R*!Wuy8MiRns<76m5t!*o=a!p`9YzHJh&V~MGJJHbuUWA~a4x&@7 zjK^~D{)a@c^!;k|98rJ7KQ;$BIGrnE{ct&#+&#_=oOw5{+w(y!2H;pEK+xeZR`^ z>H_KhZ-5v6#}3%ri~lX3JJR>7eA+G0uXYx}rV{fX7}39xD8*J!`hFGt{X9XtdO}L+ z0k!NZeBCNs_%{64d6d!>G|P!hTGJIP^u2p@xvRL$*gbu7H?fnku-i1Khgi-Q-O_XS z6k8B*olf)?RoU3vNi`cC*DdX>mW1pWk`T=cH*KZ2S#6+fVdnQO_x)zv#zaJfo+xL?JrT zU&OK|}A(TBZw>hK%@rB92mllMSSB;B4;wSl4ttND~V!Q=&=+H>4>OL%mU~z|%HsGU?t>0MRg$ znhyhoHMl!P4j1|I_5Nt9_F}AuU856(fl?c#)qyB!OmB)C4tnd*-*j=f_>GzWrimi} z?z;Q*e1zy=?s7_TvMJq8QR|VSVW|aw8hrrG3X(rlKQ9+Ksk{2kO ze3nj(6a{!>BKQownCIM4A{SeAlH5m$F)ZLunlVZ=X20E~TcboT*8Hw)*Mih@w5Y@= zUSB*K@UuaG>n?Eu?|;?0uUC(kv|;xcy+ML-H92o`HTYClk5jiqQ7qv1<5`#??@ddH z6szqozycwon=yeKH0)6;7z!8ILlYWF)BG;w2P15m9><~i*@@kk4s(Kmk%Z; zfG+vwZru+6Mb7QNZ4&mob^Q=qGQfqybaj{o?WRkX>F;m{*-g(&U>YNx=Q)`1(sJ72 zar`^;u*1FIVW$5N<}Qc-HixSk*Cra9f=$Pz%k)c%2xO}+)5R3wRmcaC!Dr8q7eLniCGAn^pwbUZ z_wmc*HdV9>K9yl$kAvr!g+KZJH1Oxa`7Hdg{vG(q_Jw2d_AITODyp-ho9WI}>?v|y zB6F(f>)IQWCwjTj1|U=$<&fIZYG}KJ~|cE&GhU zY-6xV+_nB4@J-pLY2`G`BD2cV`)T4Gr&D}Zuk^w^=@hrii8hBtD!R*F;1tgiEu|bY zSs~LYS~y+oXCWt{G)>fCA5YNI85oH_ouFqkL<`>f1UFccF*8AP{CS*H+;vEmEj-R0 z3{__en1wapdW_rEYpp*fC$)GMaLk_HqocHOHU{s&qvSnDwBp5&%9KTE;T%L7e1r^MN>%4(NFnh!7JC-tUO9kJc;{2U);A zNHt)Zbl%795?}ZBQet)CO_vs7jvTv}3jZX+S*5+y>nBjpX&sEYC!fCLCn4{yr_-gM zvAwR8PQ4bR?yvr!)r-+534c(|C1M_XwTD(Of&bP$WL*L_MBP31c2Gz1X9rJ^AKb+we9(~qRJHKQc|CyaV4{MTn$t`aeq28%u=*MF2NADTRj}R=wKegm%uV9m^b2iVYwL0i}PZ` zg$|kgAQNwrqEK*EK9--FqR_Ugyc{1?OVB@6`F_44QPF>|#)~k%Dp*MM=fUJ!gS!Vy zRbMff&uU3l6BG>@Ps_%*CY{28<{3Odka7b&5KD;>mw+>&hw*Xf(4x*Yc$k+KhZ`$c zT;&~w&T?VJ?+|_$E#rqW%BaDYcbkQpA?uB?kTr&xJVKi2(*|aI+t;B zpBxPnEEJ3XWhoPeN!_&wetiT!Gh&SN?Yp=lVs8(8W;hVI%~1-h$vxwd8&pcP|5x&N zV3F!Spos!Ut`aMwPbR%*mht}+FtrR|e|eJChC8IX74x97!6_hx@kT`bM`Yd zXR@Gy9nJjV`c$?SSNKWm6$-A!ed14Ab$jH~sD?|a z0mg!=w1X){3_3@oZ1%M?eHQs905D67x0b*+bu2B8;Fp2lnPEx=$y$}{IjIb#=`iO% zP>dAWL~vj_zyL!Qo&e8~D?V0`Bk9IEtxbFDBX;Tds-i z?PhXk!~8Bum(RtR!jjSj{v#4I63|lMaabnY!^70|t6dq}TV5L}DnEUN{0_lIQE^o& zw2LhDCm7|yz-rh3+5(Q+1b%LSFk3oGkX5d4J34fm-0J#R{DXYMQZmqOt`5~&lwOY) zh~F-|4v*_bq~Hm{%Skpdw4yZ?NEXrUO+;#tEh6K-f-|K;3Fr+uFBb+w@j?O!duY@0 zw4IJjUSR}1bWW{jN=}q{O|XS+lSPMFB0fZPI~9@YaU>$+wt^bu2fClP4hWWOlsx@U z>E{~^HA%RnB`4c>HK9EPy$3{q*S^pPwumK;FW9@UB?V%6K-8dF3*@nE9)a{?y zPf+eaK7?n08#^_SFUcF6Bu7J=DIWkS(0eeZJ6FXUhq-miLQJJEVwL6NeS>fUXYki1 z7&XGC8ZXNNxBsl4@-!mloi)c(n@tZY$A9N;EnmuY%6MBGS-A{|6ZAF+hw1;06*QnC zpOmBZzu-!}iA?dDI7}hP=ua$jub8n*n(ccN4S>~1Vw53n4T$RxM!mCGA#fk*sUO%W zaI1albp6UMk;lYRM$wDiqD<{$$=_@aG8gtVq)sGDME)Udl~G1snT5L{B(v{Fo6R0% zd^6j9wCUaVh;))dy7%<#O!N0*bF*TKzIU%! zuJAnI+4edt%JJs$c7mT3ji+OWMX?4C<37{-658+XgNe*z|7*CC`RnI!8V%03DURA5 z0Uh;cl0NH*q@#w7)1Mv{8%(UxXgk60GMa83ms|N!RPF?r%q>UB4MZ_YKOsu-XCtvq zka~Lck@jr`bYBOuMkDQe4b9={dJ07Km=V_e znvTJTqhGf!wD}@fFS`d);Y(m{4jahnXpmBn=3EjDbJVGg^{Vv|pv%!t^v@*_@3ZSu z{>!2*>otIeUB)IU+W@+IS&ZTBZ`r8Z74Tdv{pr*d(TVNpM`f>yr~G(dPC1Jxd8q0& z@QUX3rB>H)hT6X-ZNCPDITo(pxdzrO+t`Z&ZlEzb^r9Iz#P)1mYZ)u1%h_tw;->f* zpVHb+I4g0mK%5M-{XUTB{oopcB_{d_CgSKzV7nvWAOf0a1^g`oo?_KRfK+2vH7nqh z3^}4~0cMrRwADdC9`ylgOKGMkh zqNjUoEypwmzPBWdlxjWc#eGDa8>C17EpjuK^DV_>Vn?~ViGCzgkjXFd^jBjq&zt`k z;}Vd@G~uDBX8CaHtEl>G{nSIz#8j_R^(=mmBy8pE8`K%ii>1tdVfqSks1+%IAMz%2 zYRd#1{3giYrp9^~EpJR#%qT-YJQ7b?>mX|VSVZL#C*&jy`He;fm4Dy`ZGS9kvPBK( z-D4bF|9sr07k(m!G3FAX&wmEYU{_n~DgTOHIE5-t^$|hg^pB&0ilSj3p-emDGXF=sR)~_Uu^HMsp93|Q_Ixy7gWa%x#rY0s;{vbm`8nwKleX}zz~nO`r$^;~{Rcg}}X-76?K>g?xkpW*!6xsDmGriuTVi&KtDN>?72i|d0bDLEPMU~#1Tkdx~#f|apI z=i*4`f^=1ta1%d~os(O2R3a`r(p6U?O*}9g*V99k1T$Y};(G163f>{xV57hYr8Vne zqsbA*&_8qSmM|8~&P1^NGH`i9b1ruQ?w+H1l-KKp;q07KsI zv`G*(B$>&=j)tW_2jSkk~dD&q!-VV>z7xuEgNFD(!#g1HLt})!+Y_{`STby8B(rGdJB7{}?u9;JoF zPGQRF0)Qz1M$_ z<&91J;T^7vVLX!a$f2B?kL08IFFOUD8OeX-*ZO>e?bY#TX6 zjfKFV+Y?$emV23A(2lXZ72lP{$vqCh{B)30*EqEEGthqP<9LrovdQH9!y=Ny!0*fW za_)Nkcv2N%nf1QyVA>T$amdvY#>$JtQ29x4^gMh z%6<0ZW~#SE`IF7OL6!&`*G?`umD8 z6fm+|I$7JkfOn4_N+@$%O{;e(3&h&z@Tt2~sp!@lh&x0(R2w3^vbjBfTcM}!#Nxrs z7wF_J#g~=YLN9kIhuN5Av}ZT6sJd+K9;F?7c8WUeQ5JFDo$DADzRbsgk-N#! zqe=!F^s_$Un9_~2@qg$KPAaL4uZ-d}>WtEw2S#)K+!-a_#5V4rmVYXRU0$IkAfQj9 z>1rlZ(w_>kD|7UM=aji7w}=+pNfL|>t<3EjaoT@gX`KJ|EXV8*=~Stk+t@^6YU(#mOWc$6yfT5cbVSxvNGDlYesOoc|}>y z22Il^TvfmXD7#7j`I^ERdpMSsUsndO+CS;;HGKz-c?+v;vHoR>oJec+*K-3k-MPk5=lD#V$0^rXg68< z9O?F;{CAX`wE4cWhh3ljmCxM2mCa0@O_5emfch+bp%reX4Ar9^qF-3v0s7j<$}knB z>P7xlatQvo1n8)@O4sbTzKziyWsXb^qmDaR0e3#)ThwS*5=it`slgr$)N{O3JWXsg z=|$fw0_q7s@|FCcRLR!+*$1GsviJ1|y+cD~sfl%*zO|9k!(^T|P41WET0D`OwMRjnd>YG^+rOZl%m&=ep=_t(7jUv~x4r_JQe^iE>qz z8F}t$$(`yax4T(CdB~;u$)isYWrSwGcFnQn6S3d6J=7|?bI_3DE<{fIj#eU($J*dPk-r#!J#1ot^hA~+y@ zpkApz=EUq%`#Z3*K!5$}K=dLzQd!R&qCm%K+n%&&sM4DaZ%NuPWircbK{JLaADw>= zeP>Glja(_@y?K#G2RK z`V=z*TdSjk^vyGrf?(D)(9g~U{J9P-mo>vA1DfHqb^G!URCf+G7w78GxH-xo-uved zxXiEMG5P|OF;}V4uw`v@w~TMdqFEdN^udNBy?S-gVYsMN2$)jg+Zd%0L(VcUOG`XS zO_1~_Q02fCMhyrXOQe`l!A|g57S;NS*f?~B7JpDWu}VI3KPsg~=T=yC%6?QTuo>kD zqI&iC&Agm8d{n&I_1<*)qcW5gA4c^)DJ482%NSUF#WJyzT=_9M?yaSd|D*(&*ydQ; zVZ#P*ao8M-T8IT+*b=DrF*O+;iiOM%_r4Y&DLQ(H%wbzQtZLSoSE2nWYuS$Vg)DD- zXfUW4E>q+~ieB~o5AieLq(Gq91BGU`d zMQ3$Vz3YAktU3$_tQXE2uuez-7=U@VJVXJ!Z!pB)8o*-DDXZ7dNMZoH98wP1)WIHG z1c1fx^xB0mV=69CNiUUMEyB#z^2*Z7S!C(OX^e}Sld-%s)kRIJ7f{5=Ple$C!S9qE z1bfl0yX7|F8xY z=k!(&EBtZD2994EexfXc<~3m|e@zAi?yGmDMy8U(Xojs-pJcQLw~SQKR{N z@PRH@QN#Iq6VnSoMb`Js0J$lVb^aZKEb((86ZBPw`jO>U1m>jo1#9{!&k?9A+eDJDISYG^c z;1`TvX=)m-2C#t-DL!1yA6P*qPaYkOXF%}=P-poD5NU-7-%ZZ05f|XZrXhl3z6Z8Pn63D)~+M+CG(|yFK{GxkB@1 zZnIA_o^_rw{lzlHh4H(8G2$zg;&RoafR#!+{&FwVQ&uX&AWZuw)5R*~y_x@XhY?Ft zTJdYQncgl@>}@>PQ!b=5w360S>_FXIGQ zs*$m@Pn73W*1=S*o*H2)p^vYpLgRJf9sREe^c73KqI)$|EsT{uOl2CWH%-^c(pW9e z8hYxr8>rU zea_e4_@ozZqdsBzt-r}twqEBt$qR$9zJ=L9w;!vM>~;D#D%oB=%Ela_SMAkSyz_() zdXo;AEweXN-`kAWVcu<~F`d;grf;S{I;)MvDbsr!MeXO_0$k?J6x0PO$GVzmOc%8_ zJHMDRx~RD;+!Hdf9X!wUea3|A5_^=%l|J!zG!0l7J~*^TFEx^DuZuWL*}AH|^Sw3V z=ITHQ>97!=@Yk}2XOHMpyQ+sw&X<3L*1bTb&|GTY9XiUKGU%7?Y7je`reEu>f?{j4 znC|_cPT*aC`#}ABs0CQi2Aa}CU6VZ-Px=8#Gs6&2qo=yq^~P_|34KNKrjkw8nd?5# zqn>Kryff_4?9KamUp9LEs)oH(6F>9z9X0N)dV5S@@$u$*jw$& z3g2356lC9aTl^C{%Q2U-7c3XH?|5drH6KXyQ+@b|;UB1YKebzq{A=v-QHHKfn!uZ|b2=q$a!U=`Hj;Z!;~L~X=3?*BxEVv%IhGU^$t z9%L7nQs7Xvh4Y#?*-RB5kEf|a)oLtYwti%&TG_-rmJl1R#0P-^F zB}Pfo8(|rbYmH8Ig8h2TK$RwJwT~Soax(oqLJi{~58l!35$Y(Op81YCjZ_=3St<1E zNVQ(>WjOr&`l$CA7VySDk$IHb!~+jNq1~|w1lEP8JOLkM;cDtTO5M#o7E#I3=plU? z)f=rwc~!?lP!Y*vr$;2qt7;Gp#;L`Uh~y5dtq(4|r!Au~jhtOYcSozO`Nk>e#4&3B zB3+y$ZKzC{ER%w7VLgpY;F88`lopvhG|d`@yGLWxo1Khvs7>NGZbvR-+zI!Mi4XRv+db-6m3 zexHU${WM5_I!%3o;}3{uOb7L}b)X(RL!GVU3AkYVT}SQtacZVv2rZff^y$!at=W_15^>D>W2Fyz`U(|HgiC|;lPlF4CO*CT2i>wt z&23_f2kOOFt8Y|xpqE~FgBqx?*sj!UGti)OH~r_$YM6;BUFp^qwDyQD`oyhj851*i zq^-K@&wp z%j)eftD_mK*g(I0Rh`P&s=9j58>&UinY#j$%+Fe#E&fWj3i|l_st;pt%Id#Z)qKo! zRZoAQ;u2%gs`|r+Dvr8JmD0OC26^Xt)!#@L*7+gsGAbwh^^B)#SI#oa>3%QOj!<7w zR-f=MlxDKFMf4W0)s@V&RDbtYMGY2_?Y-KUl|4ZHKBy;Hm;HLRkLqd@dz+u`eNyMK zPWknCn;LFnOY&|xsLf#P{8POR*N|20F7j8j&dhBWO;NN+(|#OxXQ}XKj-(J=53b)GnDCPw|xaSi-@+0R`iQyQ`SE+qxQ?Jy%R? zlCJSP30)!ZS?BBI@Ck^yWB6?LeJW=V#HrZ$5uJ9`wzFJmdP**>r^d>g^p|IKL|$Ro{^iCL!u>un~zOEGOZ zE;^jRHTf*H|Fhm34!hd_1-f@hZ4F~}-s(q7YjYV}_e$>?s3n?s?@W`S!=4q*q*CRy zKE(&V1PBo9liE=Z#gNVqrM)mJzLqh-46vTj6cbF%7mMnmhx4^DsMhPw$2)GX5J& zi;#>A83_lf{)eSkhP9TxjIl3hY%P>AEkj>YUOQ~ERDXtuNe5)x1uF4)Z6HYVsy+gq zVc>*Vc`6FEmc>iHl-y?rP#o1D`^V0)MgUU#3GoQ4@3x+}0*GwF1YmfHkz;~=eA z_E}R+PUS%ZD6gJU-ilgDQ%9;@QL7a{98r;P{j$T{F-f|_z_|^mWA}qlfJ{=&59`Hn8u(S?1ZPjapXeSsm-Pc`0wXvq+qwX59ze0~935JiWOKSw#J2UF8 z9X+~kvPb@c9=GEWCs6UaYe$bVo95QieB0c-WAw1>T|0s#BbtFAdyEi?a@%109}wio zMkDzb1ZiL|Wx^dhg3R4W^J-~#ng4A)uC~_8#ERY0t#!0C&SL+f1rb^r+j~uqtgrnp z*qqX&C14z(%W91;g zj%efw3W(OKved=YJ6bDT;5LRM`mNEAP(9SCPI3pm&g2fi$^@A^^p(+C0a4@}UH~=- zjXJ(kMlaD7Tz#0y9(FTe|6%=hd(8`AEzwO~wBHnVbQY!c&|0&f_UO(%waThzi`kAW z!sYTTg(Cx^w&^YVYuJ2m{6+6DKnrDT;0k?ljP{l>k5&4DA=(pOe)MvaQ}U1UQ4T3O z_xZ_8&>m}`NCYJ0cNF8SWwdj+Hk5Twrt%}S@+@MR-eZJzRYc*D882R%=qTg3(C1q99Nl4S85smmSb|fv451{c0PSunJB&3Zs>!uoX#=|*p4Pw6 zhIp+|`N~GZXp_|%W~3|nIi1&6>6|~O(|*xy@p4t#HJ|zsOQW~m9A(JWHcQ~a;W@BG_}lG63IfoC74$q&3o5)7Ps04? z+IbVt+8ApmrBc0dSUYDe1$#{Ntp>@+n`{>DbuDenyhtT?AHbKev0PB zUM|q{r)V$1nj>uLGg58N=-eDD15+Cn&5NmcV&Sv<>KA5dI%7S%(2sMq{Kei+L*px0`W~9m%yI=iXzfzc zz@32KyGgT+GH@21nyanIJ|A(DO}I6c)}G=>OJ(y@$z`7AUFmQq*-3|FK8L=_=c>Ow z{WG)^x@@g|QPPIRpdy~@QmN}at!=ihjz}YB(7}0HIhNRk-pYSNUe)K}!oMQg*a65M>P3itSTr`+O}3>;V1Ad~G{~zT)+@3$?v0aPru! zKK#;w=<_3^zv{ftyT#u})54#%aOYiPpyDIhyFxl`Sg2K4Rd6x(r~QUdp(R=w7CnI) zFG2rynLxiS(f(j7CewhWTA&m!Tf7ux;D;zGzf9}LUX7q7%e0_E*ZLdHQ1Kj00FIeI z8rRP{K9$|+Gl`xr(|%#Io6>^iNHcA?OyfmvM)lqumU$mO0 z{CRpKt0c(<#X_(jJu)rQXyW0mXw@ohf~V^^q{QQ)M^RYE4A|PZ1jJF;YV97IJB$3+ zXzkdV1~g%fRyOaAL6T+&dOiS5CcG0rC)8zscREht^qVh*Fp*xG3JDf&nUT9qU2s{MQ5Wal!k-pg|3C> z+&QU|F(D5hgL{Dtv$ z2gJqt=CThAEh+v7&;`XR8(m-tBg<|q3VLm7xLa%EHqYq9D9Gb?JcQIC+j`N~-I!vw z_SB#5*05tq=|Khl(7f4&_ImX{w7n*_XEZ%Ks(I?38Q3|n+THYSd$nMmZAKZ{1g^^Y zAX<4q+u(dDz$nivh&mk9N=4^=Z>*<3f^G%$R*Yy%VCJww*75J;5syDE7r0K6Vb+oG z0O^vs+rXaI2P}bBOHvvflKyS=ee8yG^PuMGT-jdOm*4t zMcQDC)<%y!t`&v+@IV@LLi-S)Lt4OI&_U})*kyIEH|mmKH7xaS;YH#LZH) z;3QD`QY$)nQY)HgG_?50=$>w{;7IE>k{qxWCG#mQ+;ou|pVEG3JNpqot?gpx%TmT^ zEwb#BKm!k410KU752`{XE}fMhsb%qo%+KqjBT~gPEhyv+ayj0Io}bbB`PBu+0C~>i zK)zZHi99px16X3urou*VE-Xb!XSHdbrR=~($*eo>MYe4`Bbw{Q{?sPo8golpe@;sc zc~;0sQb|^C;x1%`9s%1I!}sQJ7tH+|o65ahAg*`IhLCyqeS(*qF|5DSi1XNhM$+Z; zz}1h<$@791Q2BwEkz=5*%yA)dMDpu0uZn3+jJ&QJd0m%zd3}Tz^4e$JL?bUCuZH>+ z*_b476sqYnlP_glzd0? zbB=R03h$Yp^gCL0w|pQ|FkWtes_cIk?;AVUBIPb-*-K$m=`J>uo5J+=ceUA!t;kQ$ z?}M)GQ-fCgjp_Mph<@&Gttw|~Io=Z zS5H3bFgFJK4ls8@t-IRlgP&P{jsyTjG2#kV!}z3xerUis^(^%!Az%h zFHdtvh0S=UkIiqM&-^Zwwa<8+>!(ij#ZrhHp$?z2(r1bE*+kX6%thD+v);+e+>DiV zU-r#KiA?8j-MFylFFEd1BYez}9?^)0%uHW0YkZR~`IwLL z29Hg&vaor#dDKZKB>ZramXtDkP+SpnSytvGr4=z3W7AI3r6T5oti}miQWWl=Ptf6_ z=FM!xLyGe?=Vs$y(_CNkeKz6&#rc^_6lnASWb{{1 zO+%VeN+DRkX~HVd7E#>XJ^t6f5vPn1XA!K3W0TE{t7vUPbgProLj^;AM2-|?6hf27 z`@+j`?8VMM zr{ogm;wB&3Si&6P(;VxE^(+~MLNpA8Cdfij=3g>o8|5o$u2A^tGr735Jq_;zu%dKJ z+Z#ra@^jhRo%)wFU(WFuIz}UsaZKkTE>N>l<|>|Tz^sw#Uk%)-1BcD?-~k=zJrWNz zozsA0ZXlZ8#Av2o^t%zdW5FwQ*9 z#4awPQVHf3Z0K-GOfUzsmn&#fg1I7_uu{)VFmK7m1}xB*q?lj$u--8=XPvn*D=|{P zx6VwaZ2rR~rnYf8*ODf#H&{-+YE=y$ym&D&uv6@R9# z$!Tb=h>Q%^9j>GqO){~0z9-2!; zJ2|7&Lgw<+AUGoFjcsUlw3*FwF8m(GZ8xLOtPEcqo4VvTVtZ8TniW08#mVqujtoML zq#r8EzBwETY2;8zRt8&lY0~GCl#mOyd0vy@$;yegXl?j}+B}cieSU|Jy~GK$VyC%S z_O-~@*c?{D)@`S`qGJVt`*XsMp!m_nUUqtI}g>c-E#b=C{LqJI5J|fmhIlMsa()hnM)Cb=K2>w zHqR#&AoQAY6X(a4@pI(}NO3u51YD><3A@b&<3lCLRl=QO@5w7CHqX^aVAQ3!QI~Kh z+n-1?(?~Pb2y+<=hY@9r%)HwBp-N=6r?D#|r8=fN4+)yDZJzTHgvCN8NLC_cf@Gx; zjO38w_=Zn-WSMYBf+Hq{ct?}>9&=E^x8*-q^EyZ-R8w)(@=$9UxX0`npCCcP6a(Xs zvKVn>BUpC;?IxrT9S;$kdiDrDFswhp`;amcu|N=D@)?R%@KD4gWe9vCs)WSCz~#ECu546^>YOx6SEck%*M>_M6zrO0dj0)!~$i&61S^GI@$p z$S6|z5gSk$f4YP!S(%Q&LrM>LIt!=tLrQ1ZWXB@GUm&ezvGKj&xa@Gm*gRX6adJvl zP9x%W0|k2E7`Va_n`d44qn?3nCGv&Akrc8Pkd_GEL%s z*+lznez9=b{Dv9d5yp2EzWE)5P>LxrxZ9BaH)A!lnOtwJFR1B0^Y7k+fFzl9fjM7a z?(uRTBEbpCF@)OgHy6qMP1wW1M%dlKGR#*LLMhN}ZJy5dR-=Lk%)#*^N=rya8Q(F+ zH_rGb;4A49VB1jFh@=o|4akS8HqZD{PIeByof43x<&`=ce9(3;s-Yp1y8D)Oiuj}a zvKs;O5jUdRq1YS|uTP^3t|9p0Fu4gTYxDG$VJT(7DYJPNguPD6rTP`F+C1}qWsj9{ z5Is06@M=lo2eCHvKu+~v{~4L=)m;_|ep{#{slchV`K?7FEDXkXz41*mzRdW>mNZ)4 z_*#wc72|u{`0g>jX~uV%@ttjaCmP=o#^+rvB;_krv zvlxUgK}b%QbH-PH$lpl6;@k8&4UBMPU~;FSH_T-koN;qxH2%M5)ER(bQ?M4%YVU%WZ`?7NOYH6hdwAK*CBO^hXT-QG7Aruh+P@k{enRjb_2EY;CAS?W^J$}{i+$Fzr=l{-~E&e-?cP@?=aAf%4 zJNK0=w*f#>M%m1=i;X6a0RWkGz5v)+y1!~c!`-6a=N64XI4am^N>+vrk5O6fPgEt0rRs8NI=*@WhuO60W)Q~ zWF;Pkwb+;Zo7-0|uax`1yvxdWLg}Va$4>1*yb<~I?PKB z^RdHZ4giB4W)6qHaG392+W~v-Fz-9eYYy|Q!#wIR_e!$|sPU)nsIp-otMCINW6&W}3r{`N2fBADjK+V}{xzIt{U# zq0s&(A#v(rH*a=!n7ththuO_EN4f-u|MXsV|C^5Rr+w^hr@nUcbT@lGX)PW3+5L+; zg^sa%Odnv6*tD75{nU|>Q!R3PVy+dRM?VwXH+#pwBy4HJ9GU-r1$vM@{r>~d@kXoM zbkyem4z#_1+FfFX4DI(rv;_L=zo-At6^OTInAPmAga4mv@c*X*ZJjU}oz|{h860^d}T{eRLXX{Id@pp>>i3FRqbjin+BT0%htMT}4p5iv-?qEI4K ztu9OA8x`I9V(L4-)~cw{Wd#*At6gPTbhC(BmDT8?qN1C1S!EUR|2=o+=H9fhkKgb2 zzn{AUN^{?fq|3fKIC&wx|j1#RY!PsvU`fgVk*rbqd*0@n& zN@LB=D}1hG#g9J9wxOrRBFuFQGen zc)HS$zoXUce(#I&D4yCIKIYMW9Byr!`0h@#}QNF^Blz2c)9TQmmE zgkDzhDUE53la@DLw5S=IvhS;Sb$PkpS=Y)RqI74Q8(Ve~T{uk~WOKrzJQ>>g1_D+aW~^rzZ^X{a%!vDA_i-f zzmP_=xx{{^>;hvA#I4YCtdJ7Wp+-cEXp6W>d25t||C+n8hcf0*O{IK!M-zFPiO zhPm6C)7bw{Rs1hAY>bGc@6qeqwi)xM#L23P(;5%e7?YEgp4leSrzk!&O<`)1M%}g! zQp0NMnhq$%_(X+fn;`st7!TQIn+R*iQH|zPGB!oqYfPM=_}FxXEn1#DUh&DP3KLTz zDp0!|&q~`BJ6p+98V^+i0lfk-YoPOx{%?ClL=Qmb(!+FM)_}>IHIUX-Y2LDPnkFq@ zx^&6PCCeMl(PaUbBX+SWK&V;ap$ZU5Hz)n3!H=rV1LuFKA7N-Ey3(X{urDtV%lJfY=DjVS~1WK6f_ z$oIeSG)A6RhOxU8#x?ry)$)6^Tw}Oh^B<`PpE-Yxzohkbd^o0fdO)F>(Yl5Ojpwhd z%;$T-mrQ@@`6%+7QVI@s83SSH4#oR)<}&g-wbK_A#tzf^cPrlCNuJX3u$G&di0aHn zU1~iU@oiNOT7IV;X+EZT%tLDyFCI2wp|ReWb@8G_;jH*HQMy*7OiZemU0#E ze^&XA_Evn0!U%=mQxRdEa8f&p7AeKV$0|N?yTYVT$?+_!;c5(zP<-exg@q?u^l6RD5)zLciwYCoBH_9=|ur zk(!b1Cw_|JLmI;xqZ%)2KV!lNbBD=ubHtxAYlB3iG72wJc&N%Cz0YMn6vF2#{q!=0 z|Msz#{Zxxk)J#xM_5zEQBXfu)oiVRQ^TD31S9+xFy&6+m?mth(do@ONMgtnv>^rj5 zm^pHDNL;K8V#^h_T%<4>)$+>~dM{MyYu0#$!sy)!;~Il4ijUo)klGZc9#)uUeyvDFb->;QC^pe8xa|&C)H}D+F_l6R9f3MK@ zxWl||ruf(~3WLKKako>4DS>a4La)Ze z;ffFFlKQnguJw~TJ~~3_C59_ZX?a>>OxKKmyo!(Oj06XRNBR`hIZYj@6p|WSH2Te| z*L--S(u-+6F;wwU?I&)^HPX>4-aB2PeKDq%6rHx{yNoE>(7Yx8<%mMzi7H`pnwh9o zJO&iKr06tJHb)dQ!T%P`M(EW$hlk!ljHm}u`ec=(%ozIruf)dGAhR-v=+)f+w!{a1 zioA63i;)TF;1^){msXtX<$0d9x6W5$dC-VTY)y&NUUSQ2J)$Jk;~qj6W3Wf=0;P_&U^N#dMJ9 zlrUasZQ`nrj!+pg=b5H{SkEubd8R3+QA*!$Adf^8ZR5Yb@wz6CQHXy_jjBSdi8?+$ zS;;Z4Jofz_(W}!nmfv`qX z{=Y-qR?|ULJC12=IYdHnEl+4nYD{SiovUiX^qXi_d}yhzsq+=CyrgkqgLHKle~$!z zr$q6DLgW77PgKhfv7(^F14_SBrIJr4;n!#`C|Y7l-`Aw^IRo*|?N>?=d|qKf^DP%D z-m4vjS1LZXNy|5C{f87Lbs6ykMn+rn->WdFF`zN@8y&xb5!>rQoj}M;NMqE*Rmvc( zE7Sk5;zOGirXExn*Ud9(I7VO62}OS+=Xyo?(3GyxghulwCG9*81jx8o1db25^NeDc z+Of}6DyDX7x8j5UP)MZoV|^6{zlB`B;1y-^l%AqzB;Z$auSTCnGZ!ZM4 zMiionY#>@U$!ssliIEm#!g!OygvJ&e3g{(jBFP(+ zJavsi({V!cNsXpovmhpR&Nzm`7hm7DcEYYd6bCr-@w=7ZKq}jR=pBO}jkUEppOOAV zDTHoUm@x59#V0lT@7S2rTNFDgb{`>(Dx*#ZJp4WK4SBMM99JaDd!^n~38a3n(EFM^ zuSmSuD^#iM{XNOhcR#mrTpuyU5sCU$gg2-n%%YkYKT;dcSMi~c!kEVJ0>#rg3cVVA z8tH5$4`|+hn&N|sk5F7k1k4DHew{F#p$z=972o@E)7{iW z(yW~S7L&hFeo`9K8vWXTO23!WMZ;E$&OjiVoq?8%)s9x$L_C1_*-cu{tI?;?Z=%)@ zXbfrWoPm8ttH4twcDZtVTI2bR%P(%E-Bqeae1r76q%wuc0SX&*ymzRM*Lq=%QH?Dc zV;bWc6B?6@JXtZ@OG-ziHJZ(ZDpW$c%BW$q%3%8cAOkp`_n%}yt|-OW6024Td-Yu3 zzWy?9&A(ZGb#6=lwP)1kSclUa@E40?5jLz7euhAY&r!l7oko!5)O!FspC zu*ba$Xh%U4bwZurHwFhOL$5|N!#>R)D#I=M)<&nP4Es(|7-HnM5(_FpQX`$J_^`&{ ziHdKTsW5P|*4KP|j+W~oC^}j3b&FQ4Sg@p#l1J;tf2NX$bXyDqjU{$e3tBYBG{!Y1 zG$u73s&S`7DuKjYg%z$_O1TYf`I9=f$BjJ~lmzc%hG-zMf~n};o~>B2U7pxql#iR! zNge|4V{=?~`(2&%_H38;_ZMR#fwzRAR|3SwJOzP1HpXSQ?||IAIHRdfdJs+Ec+PJQ z2i{SBJKk1)z2JQ;$7TA3UW5uel;SQZa0dE=_puf(Q<2g0ZgvK|;Q9DAU#1=>oPeD9 zRv`OJ0)0Tf?0SLsSPzY?1OcPuK%b$Ot(Y(r;ZW-(523evr%E^hWPkgBo&9kJ*8JI4 z5N_lx5R3rwW#*7^+Xps9@H@c!fPC5YMtqp9=LhdIw6gU|QrUVw@R5TlF72e)1pZ)p zBR?**`9pheTe7FUgR}4 zJ+^NJzsAtA^f)JbYRaJo3ZlaNN|tTWN9B9FFQ+{h&?ENv#L(1M{DtLlLZ*PS_h zMD3Nnedq07J$ev+BVSyQPx<7n6oi%GO@m5hyhu35i~w(5V{KuUwLssz@Y@PMaX0|- zR?169h_Zrxh+hL6tQ6T_%Mrp=V{_p-QqU$F&*psj90zxsVmEzMw)WZVI{V;cxtx62 zv$aNNYbyNDLE2aja<+WKgtI0L-n`Zzob+3~DQCNb`JHp5DsC&{J7A0Tt?73{+U9o- ze0mPzH++cl`u$dUr`qf~``~mBmah(-uLR=TV2^dVaa#`)uA^=4Iv17I&C6bWZGKhE z-H7)cB?t>T!yUJhvEa>Xsx8bi);BM^Ki^TxpC>1uT495Qsab6`ahs1V2nVVx|E4dt zJ6N$>wch~ZOJIi;cP5{Ho1e};S>L?u`7EhY`3xhz1@>5vX7br)^Or!l^Q~cjY)=2+LR5{c!AsZ-M?M_`;fp z^Pd{Q^)wSO!OMYJH?1&Ao;*U|uRC zCYQkyxG^t#uA<6~F&MVm{Gc$Vx`CW)9+dgA+i%gOYDN4$*kHxSrQ%U%f_IGNV+6tn ztADmTSn=TNmcQj3A;U|thuVF-cqSj;FVP-Q^D**`@uI@ce?MMa=NXdl7{jylekh7u z%z5Q~PYIv=-LYb_Jg!oBq&QBrs?b-JqCl=cPSi(YS2^f+pw!O<4MO2K9AAUqq+;Hc zL#{e!S6Ov8vfDWdTvSk-mvkj^!#N=`{G_kN?@V0hpptR$lkcSbraW@hyU8wh;2)7( zail0dt_kT>JILY0o3{$KM^)G7lK+b9ehTbXWQBj_{-$7*$IB1_u$CAnJ6Gd6M7r#HtKUV8MP8SG%ESaGb@jm3B zO3+%?LE0Ri1Zp;I&}_QM(46dcs-PaO$RPVj!@lfS$eZC4^X0u*8q^gTvMR`Tviy2C zU0+uep?pO0ZDoT@WQm(fn!1y>z7Lv0?<|K7PcC^rcBXQYs;&DUL54x|YE%I@d;(}H z^HcL_YJCqX!as>CY;cmNJ)fLSUPE8$U=SbV%pqr8cd|Qj^vao0HRNT>d*HvR?7zsPL!+zrqyFyN* zQc}-3=m*er&IBibJMOA0B)i&R6xW&O@F4tRQVa9k zsoRASpOO7mu9z%(t|r)=`>ErC0>;2xnBV4s#m##*8{Zg%jbk*iFT2a!~EJalJd^1unAygZ3`*PCb+rVjeHB~yJn zh4=%Y2U!ONA;gCQu!I;b!XPXevA*>sWd zV3@I!^QVfca(qHZ&+f)Ek?lM=FZFU1kvoXpAsxr%h~i&i zb^E7-f>Y$D(?of`jqiSxp_ofQMr*0Wp>EJx-Q$3jaIQo-F zd`33dO@nuNsb5ns6mb#b>QhA7OnhKRSAd+;wM|1V*=5Ece!1!e_)3r70gYwd&d-!goc!VxF~wLs zL{X3HHi$v8+Xhi2mj%U_hS&$OjQKIJEjU%2&N+GRR57riS1$F^4=~wrst63j*H5$? zw0=g{W`|8fY)8aszJ2A$+lMSOg32Ld{HV(Db3bdjGKc10gIhNXSs?rl z;wG#P+psEaEwIJO8M84kTe|Y{*`jL7n>Xgr+n_mYYdp+GVp4iIWyz6-e{Bw(azhTS zVm*;VVqbwxCcmF8#u@iC23@)N0!$OIF6=AAmBLwpvr^RW4vZglu;pv=r5>$YaaD&DxE-mt4pY_qnHYjH_imksnOY> zI45F^&)9#o$x1Ol&#%S?EV@35w)!ZsQM{Bx9iUC8%bF^2WNC&KR64{-y&coY<#z_5 zeRY*sIACiI)xCj|&C#XUdn)1Zo0duUXi+

    OHvN7!55QN1xZb>wDBwsng$0PAJ;+*3TLMV!+DSN&Gu0HS8EV0C1-Yq$#V5nS zF1wqV*4LzP1Icozw+wC+XvA=pNusfGy2a_b%R*_3wSoj{kQVgt`gm~8!q@`dwRV(| zT64`d;jDgQ-vxW{jp;{u`Y_ZfM1B1NY2gdGB{CO}NP3BP`QI`%^Ha6HE;D;nqW0P4 zL%r*Nj<@@X^z0E=osF$ikXSN%_HW7w9RGy$j2k zm&>p-)}1;3VoX2Dgy2UZ8R8n#gQljfxcqX6snzFPH1ev;pqQm@y2tDOG4=5B_h-S# zyqg9GZ@V?2x1g^c>eH*j3JgUJ17jPrBB(vE=vjcNl(mzSJFcw4*h-fg+1F6Xr({P% z6(ugJOwS&nM`1!U&(x)K?h*C;Oq|{ zXtoGA|eKz-SqYODLv);lsOjXIE&tiR`QZ3w3UnN5_ z=7#bKv2cq3US(Y$u7liGeI#gwnr394m1Dm-C=ugxO0CE)+(@K z!2=1oVdtotvMJ+aqe6rJOw^jNDM9+Bur-OE%h(W~W=wrvV8?_7v%P#reH`MU9;4)Y zAQ~{u)}hItiMOWf6S=If!e#C&vryAIvT~8kv}4&kvmDy0b6X9pXEl0zZdIK%EH|@M z-W#$#0Z`?d3y19tF9zbV|Hp&V|I}*@-t2-t->O;2(@anmje2T2bl>wSpZ&_UZB*x z=Nu@G5(ZK9_>-z_=zh*y^>0Lve`5TL`_3-n3osAF5oSJfdv!4%CU5L(C|6~emeuOP zMCp}NwMnQk)HX7axn5>oq~HEzW18o7oY@zi0dC*anEAKWf}{4f9+E8jYwdR6J^;>L zMHTygAh?0&s?qAve%->dhzFhg41&z8-E!5}H7a@WS4rLe09*<6nqCwW7__(NLFB+2 z=iURB0z=&^fWMSYo&kp1J7nL9A%1YFgF#!`PYC*$E0kb3YUiS7?Fmg?UR$%kAYR8N z8@Q78vfR%;$^3u;reXaP2Gr|Xj~KC*cpIdKf9Bn1L2GkAv>@=s`UI$su0XqjneO8 z(OEunM*L0_&FoK7ZGM}+^I1jRf{*5-E@a2?U~hqHo?(4V57$3Lp*PZ`I5d2EE@ zjNA(YMk&CqGuAtqa%xj^2vrqPKBMjX=M(5rzJsdM@~O=O^65Frus(P@(m-$u&8CaF z-d=X3F?$p)DQ!r~Vx1!tU`pMlwTRhe1xU|5g31DPImhKniDp3&coi8XQ@6Q-!bWQx zA$%=gX(68h-#?#5xR{SRbhIRl4l>v*?Lily2>{Vfk)d1y)&Eve3o&X>R8H`O0akt3 z10xDWYNk1|KTKxTyL|M~3yPLi3O@V!0i2QKwW&Z*i%n=GQB@6rD!y3^AN*qOH=`$s zwHF)@iCA{f5XZxaJitOQjIrhy6l}wO7pdWDuzYguj|$1KAmmP#&Gx8V93NOxh@^4 z-}$4k@5YkSt*CDXu9_eemc})dfljt2DS&Mau|P5 zgC0C&^4jJA8zw}ndS9N|JI_wJ$ZzVtPMep`{aUvlD{Dfm-Q1FkT)6EBcYY=-5) zMc7-m)ZD&Ie%c5ZQU#dSo69Q1(L$7=3pNmyDen$F@JLb#X0MHD<3Z1h2)Lz(@u>Jq z#|r%jo_@O{$=AdTi;-fnz;`&N|E{S*gl_upoL)+;@)v6_Za&x_-BHebv1_myKq7m0 zvRNHZI&EUjGqs%OLH(%AlOih9>;4A_Sa=;e!}Q~I zyhq||Nqjs+H2whw`F23jUw%KTI>KNF+-$AB&6wG?~xZwttA^(YPuVB5G3d)4_> zl$*YbQd3sx16Y1bz~`#H3&fi8R!t_FlMeAsuGSB$R!#+2;Wm`4nwvUvgM(~^Vax&$ z?PUP*8AF=@5!CKn^n3w^3SgiRt^+7na5M!&*ts|!#q$rNQ>jh(7V1l;pO+Z4oUqLD zr2wPTNB0A4EZRZ6Rg1v;<56|c5pW$LVDE@-k0|y!-WSxtdXq6}^G}0aH7grz$_R;r zx@}Gw?j8p!U-5TQno><4%@=P)mM~3~ZoU$fy`9&X|`W=+X5EaS~FL8l`K@w?*L7GEt`n6Nq#Z9Ynf|4`jlASHWK(R9oSk1}1Mfl~Kofj7A-paUoO9c1 zTrALEa?s-pTSq)Yq{5X+uS6@U9#-CEUk-HkjXKV4jE>%NDVB;IIE979jVL-t7M-Ka*}ph9E5fIvM0RNxYhiw;S6eqj{v4o8uqU*AOOS42-nggj z!HjWjd@0AoT|k_j3|oDrC}G5`q#BnM4v%_!O^9fRBWp=k$IgutXZX3bQYri>Ypcr& zG1bKETVqtcYSku{g5BI?=grn?#Z}r2X{wQ1Ta_)44nZ!`u?Gj~ib`rzY7D|p%Pg-1Sa-dO-Ca7}h69e0E^jmifX`4H4 zx|8c6ei#msHWsHrAg+@3*}y`XG^uGek}GW}h^9Lw`bt)JJg-!-8U*6l3CX&E-xjWB zEGr|qG8_s?wUTYD)##GOEvZJ1TIkQfx>*R5TsBCVfR0^hgG6+o%4<{#1F+J`?PP)` zN^zIcR&-p&xuH^`8V6g7L~dxwPWu#PLzM|y<+h>91We48Zm2Rro7^dvo#E-wuqenz zj74=oQD7F0nmCV;s#?6-#|22GeoWjGxl`yAQ=DV!5=iU)Cg@e421AmWX8%G+2vWU3 zC~OMu{nW`YI4A_mc~Po3WTd}T7cCBVf(w>Yz5Z~n44tIW5R#R?Brm!s6rC%SqPn0L zr9=`{uAy$`(v))BDJ3jHVziBONN zI8#^&r0}j{;U;7Z#cW0MB=d2K-fzSn^ALK~YIU@!+oULOqwPwKhOgI>Uw^JI8J-Qr z0Fj}(FBPl8ska#kDHErr>;_fj;^-!N7QN;UD+z$t^#@obwCJ)h%*D)78T5}}6qUP; ze<{oYqLqNnr`1tW>#Zo(#mzX3W_4^{7=W<;f{g8!u!F%UA+74jR1uy-pjAa^n0**6 z1xKrfbm};0R?(_$hq>m_t{PQ)th@C)_|oL`k3^aA8dGV`^#*R>V=W&;8V6J!|Yt{)2Hfzc|2 z{|ZT*Y3jEm zV5$0NmVeO1YW*dk$L1#`^D{Bgq&2VvLk zr(9$IB2b{+5PT(c!&ALPzO4ep-6l#(-58ju1rsRlT>{m#<_B?XlS6F5cK~r=Y=o6U2{H&~yMQq#WXlUqCy}Z=1+#=C zyQl<&!9{%qI`%?K2KZjONsmc$lJ;7}2}yAP=h&~lCklQiHo%FdLPARkmElu{P;3vq z@kwYop-h!Z-Fku7Kw{#t6A$Wfw1dP_hHr8wZh{Nso8!JS-7Hs(T;S14KB8PLtV$)R zNO4dj%2(n8js_a?O{CCX*!KyO&*>ke*{QmtdF1Y}pq}Ugqm4A39Xh1=gs#YWe${Ta zr0}Z=u9W(LRwW{UKv650DvE$wB@M^Eqz-{0SyiRfOb%!vML;BqpduY%WE6$l1g(lZ zhJ}tKzFMjIA)2ecq}T_%tbhaRQN)p1x^a}z1bWo}m`Ick`iJNy%cdFc+k3RMLb2Ki zh&2|9CJYnBX9hS5<$Ojd5*rEt!*9}vO^+c};Y5Zs*j%v&3tUcPv59JdU?#;nS9Y7_ zVb%FxQ3K9D+vOsGkUhC0f{Ms5QGx$m_4_yJ$d%#Q_)Yv@qn8|6tGd2as^5vCfUa;9 zP%mXMAMW9!Kb(@6(;sPQY}B^nQ9z=62T(x10vrXjtysc93dl0`r+})Weq(`a@VjE# zzpQrg{vrxUw^9+2Q>iQ=1*ChV0Thsx7g9im{Tv0Pb6l~|kOC6gfzaKfxcw5 z>HR4n;lhvt8i_NcfF3Fq9#KG6^vc+C$0=G!Nf$TAP(V5n(*qlA=a$^2m?s)q27-~< zPqh9BFudxBA0ncgH%f$7A(G|Oj}Bse2roki(Z4C4V6tAeW2TB`B3MZ+T0CI^m97AY zAc5JR2!a+MM3P+^s)Gg&IOs4ABY$}F0kjYoCSfb9HjHvSB1nkCao?17iKb+iB{xPM zK@l-DQf{~`fxZw#D=vn?VySDw7~#f8S}OX$1elTp&M!(c1n7=n4(Tsj8y`4;>Jk>4{fr$B{(2!d)ujpJ*bS^Zf;Bm|sS6CCFno4d; zZ49SWRH$OZLZ=s)~6IGfCFxXhR?b#R)`5P-tAE+(A1jA&|Srxtrv+5ll;T+HsXg(<=8mmu7+7H#>Km+%{}!ZXzvtZXkFdE{v$FHgpivOXZy`iAQgW}+EOE1=FlOGG{LLH&3#^KE8?$x3xDEkEU|F9fLj-DJs}@q;9yH|l*oaG;*op-sK6Lt8Ijx?QD4 z@0Mnl$Nb#1BOI+Vr!ILPFPI{gt_dv4DLWC=szU+iF)D2Ud~snA-U@Fa8!UO^9XI2h^%BLg}pDO2A>P|%p^R=thszjTe7LP2iDD+hOxr7=V2%OI2>RqB0vGWy*j z#%P~w*a9drQvwcnQFahUjpY=4FCX!385kIKSFOWIyZ$*E+~9rdW$jJ%-Qip5ms#sPG*Iur^p-&X?GUW z-cxi+1xkM;cqnvIfSARE?6weNOg~vnx2NcQuIS7ao%=(lB+?vj+e&i`ZNvoHImmLh z&6cT)H^r(+PRhf4%7H}M5hLjweXG<-G*yi{Kz#1bw-0ezJ@eI}%F0Ggn234BSy4)# z-b-mUglLN5)GqtM+wQMv%xZ>GlI4;r30D)!Xc!hojB{I(9_MDpc9{;fZ85lSa^Y1S z>rH?2fa2E?ma9A+dB3b1!5}*$2(pXNCtm4zxoRYk@sL;U<~I*hz0N^;^v1XsSg(3yfU)x5Tp!&iDv?7g#C3(9eCL zd^Py)&f7j-V$bxYPsn}iaZ7t)emyNUdBegxXvcd`tc{U=r|^;(#tbg;ktv~vwwnY7 zETtK3|M5#=s^>WGi2ZB$j@Ufj5&N^F-w})Y?@xG7YyxtxK3zTVJ+Y)Np-xAt@a-b| z>Cj_`!uP}Wbw+Z%H-LKe-q^nnlvfQEZnWC%ow`u9h8Z}J(uu@hrlS|0v&~cKJa!eZEKFu6+hsa^kt}Y>?1-`) z%@Gwa*2M(o5n(hbEHY^!I_&t9L;~q>ZiO@{ktQo7lDZ1{4=ZhY$SYOEvL+XnGEXZzuJgB;zs-4CJ9DR+KiPRWjGt$IrJ{`s z%(KvW^zoMk&Z7eSWh$Ix?dDNpJWIV5f5G0PzRwRaZj!$|76Y?IR3y%bO7&(jMl^Rh zscAG`1Uq-CG}lAThjBZG(P0=>Qj5XIf%ZOEmvw;~J`S482}~_FAy42KO9s=hIjjuZ zb;Q+d0vKwuxskME+kKih9P`j|@6r}^adzenOy9*rBz2j9$)Pn;ur)fBjw1_%W zuRBZF#?Nc!RRzi5z^c-L07v+Ikdt3&M*zC&CElla&D-)aFIP{0$D6?;ax-~0!yYkf zu}QYUE|_3Iy0%dx{5a0k6{=TBX)niJV+8e)~{NKx`XqjWhOh}9CLi#%aDqK z|96<0cTqDY=B7XH%^+xIpEvVC4O&-BXAD4g_mAF+^<`R<*cK`K=FdJ(1XrIr+AvGj z2nF#+VGozNp_9~1GtY^-i-_o)L?zl^o3y%Tn2E9uvZ+Fqrqhwtr()5;rMQR699&Tn z<+LO&t$%|t24zS=yg?UBNe=Qb)OiTiK?#iH(mD^JZeVomrv&FAR3Ol0F4TDlb+v|} zAqXv|lIp~;BrL_eovy~et!@tk64o15Lyz^7uS*z4(uB9dM8VOy#AZcqS8%P2a)~iE zAXli?SFFo={w>R;(-J)!Lg?hY`au}Vcd2|)@eJg8KKjGC(YaiHL!m;RR4!J$mKalc z6KQZD)GkL61Zzn_dW;USmN=N!S{`7smh^|oTGBsP3|PSyP1crmQNARzy~R!bu;Z#+ zy6OEO2(u&;Qt_Hzt#yZs}k$TLoVoN9CV@Bg8IYxkaMXw zIjiuS1Q*kpx-M5n<5-4HIVV(uw;7g$0yRF|=;M6|sXH_sJB6hcIW3=3U; zLg&F921iO@&J}GnO9;{Ap?pXnB4<_G4yZ3 zZ(#-lMg#ynHUoxr6-J36r_KPH$E;mq$%fGAUbli=^z9xC4f6{GWVMZQSPT;h|rfv~77{d`qDC;hK7&zqM zdeZ^3umH?{m7vnqvV`57n+>Ui6xa!9rFa4i!yX_lCqZPP&6j z2bpq{T&V=*mt&>F&Yoe#*|N)(FT~}!QKS^{y&ml&r@u2R&O64OsR#3XH2kcpBYU7I z$3^t45#mli?egDKj-4S+$ZdZ^H2yNOUPjgdFCYK=eO7}V&T~JJhbvGH{(ZS>>U8>K z*dhUl3-k9qaOfy~tA6!0A1c%rWUn5XJ43lTw{aFD=lcG&+}OXCyG}axePwQRE!Ujm z*OxvNs^ES9Ep^ppaVYaZqoL+vek4c_S@gajy(>uH6{I)Q-XJaQ@B4!E1yX=T8!e?i zz2$WW;DtqXyPw?Kzx_b=NAYhu_t&5)hniVq`rh2*L&$}`+#7(Fk%5Y3BhicVvGB43 zIcn*X*_aH;ZPr=okI;RCO9HTS1sS*9KR6L?#8Km&oxHYLiC(G$7T9Ck6Ymse2^0Du<@8eq|BqH zao;+R<%O^~OhhIp88I@!exuC8&B((P9c|2q!^glw=+pYchJ@E*aX9=b%zo$7GQfsJ z=&J;Cwq1z)2>g@X(%0Q%`nn6nGH#C@Mu;^ZjrazQ=|_@Y;syTSXw3XX)C$a7 zjy`xlSR*Mm}8_2MmGAmb7gvlekc{1vOA%jpS8~yQ-^eF4aq8$?V*bm`h2* zwS|AyCT?+tsK#`h=q=#X+^}6jWA$L4mxJt-IDL#t&GX6hEz;&prf*)&N2Rj$s+7je z(sHN#sVAK;g?rMN=@9J<16Vm4vrT?uwymlC%s&Weel841@m;b_sJpiL=s+7k7weZJ z^N$i2%KLzc?>tc0m$t5c?I?Zj|Hx1N#{T*H?*|y_n|ECOY2Gb{amIMgT+YuVNRF17 z%)%C9ORVakv3RD%iTfMhs2k{fa5CxqD|B4Nv|}VmB48enGa@Z3wF-^@41p&wpk`bK6c@t8e;}gu59kB4FA;8uMGkoW_1ky z<>D_81UaSK263D9?D8(Yx^38P-wiP_k9FH1cCl_7j9JOMdw9iy9R9K$Sj+Bz)yk!? zj+&B1H;c4tB}pRl4?0ICGe6d(%zX-887%k&nZzwNrfoJEtCmNcS~$h)h*NGcX%WYQ z%3Oe}oZL7AoR_?R&TMyyfygd?F|C{U>JMkC=+xm-d}PsAN@>j4j`b#|c|d{dNRXTL z3NU4-!2JDIkTfRnGQP-95E%iY6;h>p$f~L7Tr&L%x01QPg~v+wl|A~(AZ~%_Q`+7> zn-B-43&0zaoy0Ca$#pkT7KpD~rPw|0_9EnG_x7o4 zPdww*kGpn8BM`OINWLKZWnbEI>W$prh}z89#Z3l#5U#b>qoB``wAjxrdsIozUGw6{ zrEv!)5wXbS%gFZ{mL)!7BN|pd8qh)qYLtthKt)?*`27z@FdDSnk67$B4o8nraa>M# z(irw%qywXo@Qq5>gfH*c_gUBXE->tKjHQ6!HI(#qnQ%ck6$kY7^c~jM|3-X)!S6cG z&8Z+;M>o4km-`&_Z+?ww`JDT6O>W&iP3G#!&2j4#4abq~D)iLW_bybITVbKk7=ie7 z?h4VL>8;0yB2#us0h@*SeiY`L=<>0EEBmdt=q6yD;Q2Q2?E6Ow&(8;Mb0-!DKa`E$ zM+@9JBmWb+VfE4Hk=#FNJ?Rv%is)nb-@gxu`M=ul%IUbek{&ss{S?kQRYCU~?ZX0e z7>_!&Oy6Qfx>L(!d7@Lx6@!mCPkhqdU|g6#>6rQp_OE0n;_c8(giK(iY}=Y#C84K1 z;1P64y{xI<|etH^iZl?vAtA*6$qU+LUdzFiq|+pCTp zs)W@p(kiLJ?Om_Eqb@V4yz?-&dhWo3L7q5E^VDU3t@VUZ2jk~;t+JS_;w9}@S@-28 z>`|{dRiTchl_dGmi5j-W@y5)RaUp$f{y_ZHNdeaNxfF+Idid0}?}Kr#o<_o_`z5l~ zb#R_QAMO#=Bhbw0C+y(plFq|}ye_>P&Vo7oyJ*358JN*1>K4?-D4aUj2F0Qy zmVe&LJI#5RG`YHtLxsMff+L<*!P`eOi3@sX+25D1j*21 z0#%ziFe7JhMh5{oM-Mm=q$FbQsDqLSip~spJdEPiRNK%n}McC4vroSTCop1(tJQvg5GzhxL6|$s~1pk+v(TrzszW=+>L+tuCsN zcg6$tCvT?6lb=*(vd#E`W~@`HqMjKK04x`wC6wY|PnGHPMIO5yt>c2^ZXYAtY4Qm2 zGkOZF_#}6bOYBAm9)RDoM{8yKOP-vP`;UBZ*jjK%yPm@j#Yx?A=4k2 zQ<$W!-yCJv&PlIv=B_%{3W*1^b6|I?5~7wJx^9pUxD~?FzUnmcrPY_#Uy8D`Dzmhm zCv|#|AKPgsU!+_;iE8LnDsM`jV3YV79&?0G+m11T9okC`PY$*UU`{W>L$ ziAoBRSKBrlE&1dX6V&-TDTk-q4L3p34g@#E>WgK?ZXqB6a220bV84oXYbY4*9@TG0C`&E&pWY{ISz^FL)xD!eU0Xe5uM zj<+$89xSic=_hUEEVF(y{~0=NdNPV+gYCS&&ijZJfzgw4hT|UqD01*H5jJ>rDdy*I8pWhU#b;pyUE}HD$}R zcQ_}Zoyo8gP~rSm0uDklJ(S^#vuLXj^LmuCOem~-q8ZUb+T~U za=_|_z`Z92BupX)Gofh$hHyF?$?yW$f^hCgey)Haka7X7cQ*&DMhWt5q_}+~HP*V2 z)zR(EwPt*WG#gCmAIJS>(9 z?$qs&@=I947z5~Qh!&K#4_h2tgOCvNGIaa!9F&Itwtc90R-DjFHPK$E>r2Kln6W=> z{r&zC+(OT}wQRPct-%@-{kes~^!_*U0Bn)A_xuySe0nz=#a+0f{T27PBH)kS$jVs$ zE<{2AzBXzU@4C=BI7BHCi9J+1eWM6)duJFqZc6Enck)4ayg&R`wd_0C93jE+fBi1L zdJILL$3Afp`@}Z(h%z*t-lUDb_KIzpxASMeq|FYOWsCd|na?=%44F@MFW3b=Kf>Nh z;c|XVUQPVx?k1kzaa@aD2^BA^E0Td3GTTJl>S%SpEn0n1rgdvp)%R8W3?725nq@G5 zhTfpqD1n5?;;mW1V{ZL{lb^QT_@yMX$dbC%Bs`(bK$%08U{6b6aI!OO8O(ZKOlpuC zZ&pMvE6+>YAXjcDw=y>@} z)`9;%?>Bh|{+#!ls006Y?>BJ={sHedkq7?W-fv=2qpb&QtK&61VD20PK!-V|Lb0sg3Z+l)++%~o`FUYu8(OWee7ZQk;#k~_Pkb=w zn@n98UG3uf>omtxSPwUT(hyv=fMPUX>Ky<*hF}fdF&2P*=zPuJGi&0(7wj5WcR5W~KCvVyT zo<$FCY;>czYW**U0M45gWiZq6cGa^cZI?7<%|Hip4f*Ep8wJpbH~g=IIvPWS%y|)z zA|9^@Te!|Q!L`+0BDIo3XD5Me16wTHx~{e97xc6u5oAZXAEq3e?P7)nh+f_R4i#Q$i!ORu3 z!{l*_iPE4%T$Yh8@J`WK$@YYkEby4TH9PGaC_=L^oDWLj3_ zlDjDHDLJ0R@tg{K${jza*;Ll+eWaK9FYQglGi*qe+Mbk?69p=}eSKThSeC^(hmgIH z6-5Q3iHJlbY;!wH6UwM#m>z~7khfoDGdEHaUyy|#aFW`DUM$$>z&p8<;+_T{y2PEN zJi9S@@n~U-)M-t^OGnBjvbc1VTnAA8Cf5M4Ti-v5NBv@o2%IYe0rFp({i14zu-Mt) zB8j<@ygBWz(n}@Re0ta*b!nY`-(w;ylz8CqS0^}SjPQiN>JX1hH9dPa=(v>b6 zZl(Kp02bLcFiALD0BgO+p|Z#vUTjcXO>GTe*z^eOy#Q8RR84{2DaPp{4Ong-Lwz2C5gKk5AwEIrrQ zXM~CJ^80{l+HXU+n$HCg5M@{R2M#4c>2T0`aT7-`E8FcX+?p1l7L= zfAB-c{M>+bG`#u3KJoEYkNs?DcNtev7>R8aox3qMPw9NTVwgBBh!H2yzhuohJrXUk zurO$)MT3$ToZkc@$ik!ZR7{9lHP=Rm9IIpFNl<>`*p`S_estcO-fSk^F*C6~V({g}YvaZC=HM->)+(NaF4zR?d3# z_Z&$ouA+9D#Z(`Zs_5)m5>(U2Hws+)As!K^G_rV2knF z3e3B}38Z{S{sYe6Xo*-B6n2O(;{R){%FyZm=xPj6e~12gSu2K?X2|_VSdqgMUSdKp z8Fqv7ceUySI_83WGeX|CA{S-A|E^Ve?vPdalH#g-^+#Qm**hM&D)X|9Ux(il#6wr* zOUhPd5zS~-mhiT0Rpzo4{8VXGo_n-axzgn?UzKe|7V%ZhTc9K(aqExL-@!ZDdvT75 zV*L92VaxXPqb=K_>3-R^c<6@6xV3}YFNl_H9MQ5px3p}VGTjF*+qG7Zy$EK@HmPmd z*19od*^XHN%eGdG!g{ExJ4b*Qlme@9fv{}I0@#t{gR!p$H(rR5X-e}fFPP9ViQ$M1 z#jhb)9O`&hp939PJ90XrraD zS7YSg?)}1^{I&=YuO`WFixB<>?;rH(CwPCJZ{ZxI6~Li}Rr_7IJafc5`du}h^=RR8 z_LoYByyDQ#;<_`4zsHsa@KIWQ#EF3!TP2Ee40Z$HTcQ$MlC9I9L{BpF0 zuwbbiiCkb^9WSl(d0lZjpjH%RFNXjm+CxdzEm~OWH|KvO5z_2e-MR_W?Ce-kvNAQ|5-50HdA8eqb((^vMs-%(Czs( z%3-1k&%I`NbQag^C@R0>&JQ~-nb5@5RnAGqIgGCtid<5!SydPgYe>@unrNZ}LL2ek^ zT14tA_vb%d@)h3VKrdfa7I6OycIud8Fhs9p;VhRZEYvL`$rbq36)C!v*+^^L9J$B4 z*2b23*E(m$k95wEp3*Ieb>u(07qJ9`2siX%K+a+Uqz|iH_OMtGqs+{FcVJb;#nPTC$tzDE1dY8Zkv8ci}JT{SW6Dd(3|KVP|UX&uEaU0o}$kGDFp~W|H46eew_DwS98aoe@fHOzZ+vGn7kYF z?M<-zT=3YuN8Ry39rgjZ71TSPErUA$fl!-p?8s3v29wuA^!3{E zyz1VqCqdfha@2cC{kF+P+CM`sPltQJBP7EduIbY|B&M3b1naSh%H1K>>B0D;k z=-xW&2>tEG8?I_7e*+Wv|6+5radPipW=j6Tao;OyhC2mu>2nVXei~u=-00UYq!GLk zm*~E>o@W21Ym77!i&hHGIGUA$`hVL>f#WZZVy9rew^Oi?!|_v&v{UeZVV_|1QSB3) zi;foScK%Zvo&AAdI5>vbE12>Z7T1z_u&`K)on?PQ#IlWxS-FtC9}0Ty$e06>*n?UU z!<)T0c)eu5!7L>4;R?wXf>|#Ivk;_(cMikH_x8}fy!Q}b?{!&p892OM>nMqgd~O^m4?MhGa`~i~E=jQ>dvw)saF)lCx#uRr zI}@&eo2%_BL$=}VUNS#G!7Fs|K}KoSXzPKnCtT4=m@}T3dc+yUOs%&()XlY&B(hCe zVwB8NH$}pmtqBAm@l4*{=}N>M-fI{k0$D2xIs_OP1W4U1b+1*9Pj48TCQrE0aA$ly z3GTAyd$C)%-Wo=5-X)j#P3?C$rkK}N=%DZdjZgm61iGp969f;jZzz`_1biS*-F3PF zYLdwn4kgLg)tYt}{xC`5ic@zsx&~QX)KW$2IPFe{?Bu-*U8Xy&P%7GKkXifH5Lae$ z{Q@N`MjJK&*DeIzS;7V_b7RD?LH_lYpIsFDy>NwLg}$>upVq|~coZnv>k4Z)p53lO zY8BMh3_mJwb|{bzMR>Ep8l-Oa&9yK$YEm~xIAoZsknm0etb`j2b2v;zDB%7Ew>DI= zHH?z26kmXELxfx#Pq3BBph3t*s<0nJl%mQMaSZ>@uB1^Cmm*V#L8--c4Pzep&L}ld zN`*EVOnaEwW z$`(hELP1&6EeMC>;rd7o_k&1o&Acn`V7=L?v(z;4Wrmu0t7Y_$B0 z0V5QS7!Z8BX1L=0ShojZ?!4b+J^ zhrMS7^b)ZYhqh^I-tG{S%&TcZ>UKYIWJp{a^6*aIc`lcytx>Zn&JkmSgxr2At~WwL zwI;*AE9Y9162k9_h=+@kTDYKh#G{CoBJGIKqOp^@dC;YHa(^9rA=4+bI6r6hL1$)3 zK}A3N-ic_4CKrPyry@%2v@ipLFgLX|QQTN^I5%w@q&I^i-fgk+-ecnD5Os3gb@^?$HH97QdNw(_CKaN<(5nKw-9{+jy zGyT#&Ok_TlKM^)o+;Z7{dk|BV|4GHLh#$85@>jXbDHjyJck7Y&UCQqdzFWFK*pfL| zW)ILfXs(na@P33BO!L2clbr|*VrXmI4sO~ z=Xe&bi?^cEx}(MF@qrJl7WD}*5`ZY-Wv;APM>SyQEO$g0to`Isz)`_fpzQG@el!F{ z?{T%M96xcc)NFT8u(oC%F>3+W?bq5Tp1L(?dM?5HtIRUCp*+X7&J1k?vrc&sg+ztU zi=7_b=f#J4zF^kpzOOh;8i$O>-`H4OqNFo)_#ZZ63jFvLmV!O{G6ozev}LyJb!2%@ zPPasb?OLcpEJO3FCrns;+EqxM0_;f)u0-3L5coSMC=|2a{B}@Rsn`aJ)qQaQtP=qN zDpyh|iDa2hq$@3G651tm!IJa=k|8Un-cUa>H=r5Zm>02i-Der?Dx*fdz$pGmK*=-< z6#zIuQR@ud8luD*{O(d5`z+%8w!AFINToLG>~{F-D=C*KQ`0<3^FYICx^h|Ur5fOb z57f8B!@=g?tfX)NCFze#qCOZPqYu;RR4G!JgsdGsvQF?RR`kl5Ds@FF*OPKG#Fa)1 z8yFC+lU*zDJr57)^=-BeAeL%w5L`41R%l3(Ru_~m`Gl_fTbW9*s@RMM1-f=v;Luog zm?Al;C)aJoT9BXzEUcMQoUN*}%MLz$&W%l0UFeQm4DvK3*pKvm}) zbQPVX-55b@iWwM0zD*VuMe2gQbuR-+;70rO=W}_ikaS=>`LZdSrRc9D8i3sO`jLpt9ACUy1UK!MUC}Jvj{`lml~n0kXcRyf zSO~qJP$^dg#zqlvpM%V1S9r#~KcH|1oheS(Dc3H_Fb3pB1HdK}<@4?cD13>k(t3i# zglX$k6!>22>{NNyCcVyiEy+C&sC|^R)>Tab&ZQ<>nhm6}vJFwF^JwCyp&-a11wMIy z3CG~tLPF*`@;fybwCRot+f}ijL284mnZB^h245h>3w4g3v0-mYV|4=OOiH-7t5t*) zoy1F~R+|YdN;Z_Ni!Bob

    %EJfIbjpFom8PUvnTBUf4T_k@>dG=ECzXHkzZ%~Sj zFEtCh;iZiT>`z&+L4B(S4c}6FBa$*+!6u5IpDW=KjDnC!2WjEOO>){@uoC3D{iR(W zB7b30=`b=+>7VpyH(&rI&FcQ6@mkv*lKsBDGU_C*}-Z9!4?Nqy$ZMet`8Wg0O`6ws*PT5!;SSc zYqyd6LyAQ1rtn9jNGc@s8U1M5P&_|W#yUF)NV};JBrml z6zf?u7GViRvsuF<)jHV%nC>wBP4t8q+Zmdh4z3_QVR2tZIB7R#)+!cJvgZfY4wxj50xVw znM%Z|Kki6!RR92`00th*&5uA63|_y zuX#B;SR_ z{X&AfERlH3VlG7$%!lB*UH*C3mSaX3rMe>(q zF<4%LiP73*9O61-0^DsB45blj9F^Ptl8b_1!_={q2tS(S<*E9-+LcpcsS+dG2E&t1 zm(wJnz6I3F!}hbPy8pqL9BE72`%)WRKSrsiP9V{7b1V_PYWxOS4^i>dMu1QL8hCB( zGzKM4;&Dn$e!X5T$?g0)qBm8jO+K&I{q5g7Se{UbM3vA4YXcP{@1{H5^hizBS^;UI z7EuQV5^);C06=*zq^*(WovR|r4rpPs>WC9SQ>8U-T#wls6V^@r-Fy}&9+b_8n||Ef z)GFGAM(2lfdg(2EVoLCzU@A4r1{*K4JU=>8}M-x%(u&YOygC~A$*rJ zC2kx^7^6|6A(9{eU1LRD7Pt`^u0cthFTI*{! z2A=?L^r6y$SoQYbx?4-T4aAgP5`6loos<8|F6#;RJerieV-#;lo}-FZ8edO$uC!s* zo3k+2baf40YmhPMq7kgAq;(0lR+=_&NQ#=TmyA4>KS{GVP)PKq{*b7z4S zJE#;#1jY1fai5}t-w3`iAYQ|@D?H)twQA@6_Ou&u4{{sLs&@l%&Mzp4`IM?EkS>4E z6=h>i?{wcM*qF+$?JBpS!b0o<;?=+uUQykaK_CjgRV8-Ta63!Un8m^E+J#v{+zvxH z9L1&Hr;RG<=MeRzMqmIQN{YtbDf0k`1!q93U=laq$ZwRf1e#EJM#?N8flCMHs}$<;0e?$ zilP^e`#C0KL|B4ZC%k7)JG*Xc)XJ|xJwv~Kk`~V97_EFhYK04ziUK}|L#q%c0!$LE zAF2M9Y@5+Or&r)^b2Sp3rjNsm#*pMib+*Xk7|kUXye1)3E8FGvXr{CjOflE!*hLU? z-4St~QFx3ct_Hpych#649<=)FR1V{v>0nEfn+~aOu+}7ht4(K}DzxN5P4PyjSlP7^ z#|0A&zvA>HJQ;N>nFJ6%z;nGMWo)}y!5+geanT)FV7P}))Zj6hQZ$)-89Bv8QVp9( ztoNFSIwh9ajuN*j4ZetK(B2pgaMwcUoO(Qmr@5ui7RJJ7QI=z*VCrU3n1B8+Q8j&% zK_|X0-z<|SIHdfy8~Zoby&7iuFA@U^pwza!IART{Qe@##N~A*L4UH|#zjv=CpV??j zuB*5DeW{*wsb)8orRoM2&O1L;pG~_>(`RFrd_H@2|?-eV=j8IYvpr48_TiSvBn&TN{ zE&a_&mBxAZnE1Blj*7OvMfJtN{^nMT>~C(@w>NjqyzYEO^SFJ9zJ-k=5}RJAd-90H&#Re@&4v9is0Lzuc^4w!n$FLrjW*P zMFy-UMV|iVkv@Y#&4BXHX~*ZpFVs6k`MH2oc&=zSEXq2Ib*!R_zM?HG{wp^Ye5{fRk_YtsNX4_ z*qUz?Te)!=+4x?yL}s3vdvh=$13~XygyMRN|DyXkbTbja-ey!_uj0+~3FL{_@zWB6 zjKfmdi$P+PTC^T|jw%@+6O4T@Sn)?pq8|(PSH8R|(N|f6x`wtWjVd5 z3b^W$#Kd1M+7{<}MI3wCLGKKP)P0o6+li|PspvYF-{D>J`5h7TtP=3uhbn`fHO^IK zF~|L0X|+~EjXCvNBSXD~rx zs3o=yFNEU=zgdfKKmX^`YbK{PrK3p7dmfo32~V9(&nC~Lk8MZ)O>r#t<{yiJM_qTaMQyhDC%CP>X7JL7h6My=5dGT zBi8yJ&f<88qzj0L!Z6-9r6RL=(>o`=#RF-RvXwvLcEsGrvbDF&pSU@mdGea7%;RxL zd$94hO~J-3sL5vzZ5j-lDsl|NCE4Z#g#IL4r!`kzaT-qrhKW0}mDhJ4I^1;%FK=|V zX4@K8CFTya_Ko?Dz@OSTa_s!mJ`?mzV3QutR^CF&MbA>IZ5I-A54X+D>28zmSS2d@ zTPkv3Wfp@bJW;c_y;8r7weXy3xf0a~2Ana~%?vCNvOzm2(3pm04yIu$5~;=Y*j6Re zT0^C_E3Iq|2DOhLax*S1IU6#;h5WX1CFdq}Y2RY(Euum*ZU=VlD+FAkul9E+?c-Kc zs39Gm&yYsduOpaI^}X*P#i-2%=jY~QI_401X;)oo;tS#z5`WE*_}z*>&vrD#cM?Bm zNc??@|8iUJt3l8G02AEn#=-n}rg?Y^@H9=-yLLA{%!smaQ8*FG;q5emf>wca+$XHa z9l`lK0O`1kDKc38-z&vCZ3+_;-wt}ez=VrW;wOyaGYrcpE>7zL8(C@iPiR2;)aN z7CoD7ZUXoYs#+NIG!jFJ?PBOV>FR}&f_ADEeYLmfDo0Il?@Biz`X>!%O~`y4P}!?# zDrcMLoz}b{=(*Vn(ZiQBB#C{rEPM6*%VQZz@*EaXn#9T&JvCk%DN8U|DLuTYE-~-6!a8hRE-NDVLYQ>-f#&o-` zhEs6#pkbn$+QG_q*sk_I7TmN4LrcM|J>w2Hk7E-Ye(qzpnq2R=^?xHl+T&PrY#9Nq z(C|gBm()+{#<{ zN>4gHT{GnpX)C3_X!am0WKkqN$3l*gbH1{_OPSK|aH3%|iegV4>ez+li3llap)iBi zj1KuZW(~~Xib>Gyg~B}JA92aF-vnb12RDAjNI;T1-$6+ALGq8u@Lo&zHj$KMAwE&b z#Ri;7iX`e(LGsI_(ArqwzeL{s{FnSi8Y`So>bR35%7yyy5DA|e7g*y05%n$z`tFIk zGtROM1!;&+d^A}3H9`Tz(e_^K^~~`Km?{S8zY68pnJE<>_qWnqp>Rj=sUJvnk;D#) zs#e^qKBwjmrEw?g)T{zHK8J>V6-wLva)r8c0_Y8^ezQvQ!q#(<#6602Yd8gFhL{87 z;lxjkQMB1EvdaqE+J~IdAa{^3NK&-qq%rYe2DXg{t~^fFxZ$aO?#?wNCT?G}p7tF7 zs~;L*O!vb5%m(%izlB8a!&c^hK3DvEPiz^nwj%WAWHUZ_O}wv@tAZ;nLeHzfG`I9EX$VX5p#)a- zu#fsjiOje}7Tc(q%eXv;cCt~^cNPt{_2#;cmmI8v+V7De>+I(-pt6~R5@|r+LyHj`}ne@ zNiZ{2B|_*rJ+dPX%bz}J{Sl)D^)37<@R!4r14%)X!=)ihPz5Vb0@y^h4T25DFC@rx z+HBqlaBs6;GYdAOcTZF1^`N)%SS0Yd-W>oOwq{xiMCTdPOXrEZRp*KK zRp;d}?4Tx8JT{SE&s78~KWE^U*69u#H-+h>e*ZW-xuZDF<`uLz%=h;qUvlei;R*%( z&;@7}FZ?ZXxaiWlhGz$t_gm&-x32Q~vM!R{KJ`(2;xmi#y?a2{Rx)4nmF`z6KzCp5 zUuj8XJca$0Y`iFuw26rWi}n)>U;F;h=H552iIcIHe8UnWW_AV}KOSs6clf5gVZ}q) zwnTTK;`bj?f#R^o-=ab?a={&ne$R7@ z7qnSEtzqyIKe2+tD{KTK~rGL~a(r)Vtn@*PZ7x@1SoB*GK zI7Ys_ojdXv8U~k1-JvqJRGRtvaGJ~uDccU%XtM~RV~E*O;lEHilCyOLbm3ME-m~<` z2<3&3z!L1{zi}35RNz{4Cw|#m8*to3lCKmTbe>~-dZ~@0rNPC!VC-fr9PuI$O?1kt zLXaq_{-}^c`c=3TdbfoUO4@ai<~Z@Im6EWcx(#cxW_8f>C)#?A-5xAIQI7geu-Mvr zz4`zMW8IVZB>ddI^`P=!hB2ya-jf!Upc zH)vY7INtpl2-U7aNeKvg3e?6qT>kIp*ke1UkH6MN!2_z6)bmtlSd{`42NwOk@Ri>& zc?ev2(6dzlPll^sx41dmwVL|j_7~dWp4NUK>mXXyxftqBHjzvqtX`aNu$mWbAW~J4 zavlX`DCm_-O>c+->L|v}OKV2Q@;9$BVf$#f4lkD{LE#*%%@R9)U7AQl`MD;ITwNbcoVQ3v=!CqL>&-4}9*Toh6x z%0?lgs?n;Y^;m`K59dDTk~8m}TKWXZZuxnzgkKeM58sGls}L2cKb-0d{oxcL*Pn@X zDdawRkYeVRK^LyuDiKK8Ia&Vu1Q%*WvwU02j2>7c$l6Pq{|o57Kq1k$v@ZW`UJB7e zn3vo4+5C+N@AIds&KKyI{1@e_Q|%eakze6$Paaot0*P1p$L)#Rw6M)a;aT1;2*y4X ztk@<;{pO!&#>6dd+^dC61bX%WL09k9kVUO<#igsTf{^@AuBE;TI2pCpEjwo7p{(DZ z^j)Sd`giyH&1C-f^}CFzSidhy{>S@#=QYCqv-w&~2IM#5F#&x32e@n=zp^?)wsqDc z;7FbIAm4n)x9~(=Q5dqsJeWk9o_R3aR#_P2LEQYsD!Cf`qN9`G!9#Y`OH65s395s# zq?^V~Fk6i{HG?5l4fzLFGox*jC`xaeM0v3%2QO=9YUG4EH1LZ(3DkBHZtf>wJKJ%J z08A4BAeUQ|2is#B#W;xpPZTe(uFn{;oWMS6n`t!u0EGp4zQH#cwsaMkrFx&Ut*N8bpm zppLQn7UZ)n*{ecB#{}tY3^JmKYmH%7gNuZwW_nhGIJQPgwOn<~{snmSZWS$`Jf5a3 z#P9NrA?U0LmJobW(0CQzWV&Er4Z$lFE50=*HAQ0ZgtEIyxVo*CN6zUS5{7NA9D0M$ z)_m1GhDvsXPL&0W-mYzrU6DFNI{3t0mM;Jy``X+Ek%!iiJNF5 zIKkGyK&1DL9*Oi$H|V%CLL65zC;$!dx?mRK1zlLzxjgz1(xghG%vJS+Ws(wY4_5F- zB!vtFD|m)zSbSq0n8DueD=pFcF_d#enPmm?IFgtxnLeMV0$2RcsIN7YcnKO9;^!)To0tNJ}kvhgNR37D(lc|mE$Fpw9G*KEOYDM&MY zjjO>UvKk0Zvs|Wav`K<7<9&CN7Rw97YI2~8th`<7H4Fye)U^U+9Aa_YCfAjU5=9UA zu#&|%YFGlx#R6!yY97R~RQ2uV{~;^bl}Ke$!7zSGIW^#{@Enf(4XfUgnSDQz>FAJh zYGYl0#%HzfR$f9n7NkW3lo;3lh(x}1z4$jj()?IFasU(W2B0D|lCS)Hy!)3GLGKs{ z99x*{wu*9|h&L6SATe$D>@n#=V-&{&7> zpnSaFbj9BaVofCqsJZEG3W#U^T&EZEFE$9>wjPb6^liyD*5V%R!|L2uzku3UN%UyGBU>^^n#1_0mdrG%+uQlx zH4GyN`#!j3@y~I33h#b)NOnp*PU*g`^~Wx9>8f*hrAht1Mh}K_M)8B_lbO;_3DV)6 zU(1x??v_+I^GZUA?A`b|TPHBw9HGRNgty_eTK%@f$m!A_P z?~hya3=%wJ)Hubxj^}jqcp&T@aTEQ%r}%lX1Fl;1s}EAsOIC8NHIRz-s=zG_#w9Ts zf2_G|lrl-Sn%qii^s>11X5wS%FS~m$ir7cQJhBj`8*Y?Cwi&coaMuZL-2tG$c!R5f zXjJ0t5PN@AI>%33Wl`x#yV<8IxKU^TLwmW{LX56Q*2JOB&>_{@zNpB6}ud&PKK1Fo}0iBfb(`aHa54JOoSY&c&sTN$U}_sm)Xu8GO{ zdHu|h)_ZuK4DfO-gRTVdO?R;5;ZN4ZwLwPDT#S_viv?;fG~o z>|be9>NoUgYt*As`VN=Gbf?qqe3}+G0S6VJt5Y?pM#@xubfi>AqZA_DL$c&u7V8M* zYqEU05JEmeH58)E*5eW_B+V$vfJM=G6`I_ug6xDr#|Aa21TC>ktafKZPY6cE*a+0Q z2jU`d4TLsRU%A*SP4Uh2PJw{`yyJ_byW0trS^aJN;OKXH644GRqg5J|*M} zmpNq=-#Wf^eBmy6nKpYSoaK}TzHpUOCh%?K+sHS;H^H}^Z#&;4U%25jJNS0+UBDM! z_{>heoqQMbg%e)B45)y`K3Q8W`&XqPXRI^neL{TJ^uLge$=Dxo;z zU~zjg_^x9U*^$4C7`;O4C)<(=M32UQ+EL(MJeNTGQZKXl5x=cJ zQ<}$3@N`I|(5eSgoj!tj>hL_r|Fc5F>I6%id_jdlX-#qF0%*3W#}X=~8KKsaA!BU7 zG33f}`Ay~QX%e=J-HP};`5P@SD(rG7BH;p7#+nom;V_)rkr?q4p$%9rm0lwXl2dby1Ia1Rb37NZ?AJ89Ok|Ze4|H%nLpj8Ux{(6wS zpo^dBon6c>VR|^2MjpsKdM*CIG6RM6qz?5;!-7ISsPS}yl(6+jjbu{O>wJsrqZY@U zV{L4irQ;FVBShm?o1K|%%{!GOx}>T#8{}W({YHH7s}#lG;o~)Wk{q$zrlhk}-KjTej|Bo+_L6i6|x^>k;N_(?TDwWZs$9lu8 z0ozymAeAs@+}z-pUdO}VwHBN_5KWatU(bj&B+F*ilxTusQc5(Z`$6buj|t=0d~@)j zTboSr*6jTct7W*K%WUSzqrd4pbrdozW2LlamOL>mqy5{_DZ#3fT_YUbiT69TN}4ri zkafiv1~ZJn9S#e zYA~Q}XpszD5ySHY?VG%B1Wvoj9AB7|=b~&zaBtbe6ADJX@ zO)|VfB!OX8A_;_k7)fZ&um=$_;5VAS!p;Y^p93|j@pPcwH!~SEbB1$71s#SiE~5W{4X{Va7k#l-X-4XqgSQo*LFVR7E6i4&2IxZY^M>IEUM` zo$?P7WC-nAC~!OoGIK%qDS*-aHmbzengdPZ7wPTpw}%HkJiiAu1NlsqQF4#n72KLb zk&-9pdwvZwiDffL@X5c*pi(ySL7Vze$i&IpMG=jwX>732ek0c2De9@e%&j8b*_jO- zyZ4BCkK6GtDlqfb<1aNylj9jY*~Qq@YkCBL!=9BPkhNwi4-pv8975^ujY;h4m(^t! z!*?#RMCUM=!dWmMsqOq9;Qtgbne?kc(qlVm@PHv7UgN`Ax~LNsjf#mJ#OO3V-hDU- zdbSWMUA?YF*;}^*WA9^`fuQFqgznj_8WFt***E?XQVv6v2rRtb`&goHcRXSQ3Fu*UKW3Lvm< zUDA4#I2q(SY$q}-Bgl#@2|_Kt`oXR1#fMI38cxOfx`oh%OoY2DXiwRIZucGu4?5%SLV z*sa0xO+XaXKZ2M6a)-!(jhBuxk`EK24YAwjJ{&DTCZ!#_(p}lR{-3HDwro&k`v@AS zvA~*BtHut4?I7l{_(u8U+`$hLIes4EG4AckveJ#=TXTgoq%|PDcWF1d_Ah0fn>h+) z%aAg63Pb$ieA+t`*~_%<{dbM7b88cQy7?TQFPTbsCWe;GQj|nQXzl4GleF05iwuiU zK>V^Tl{Trsd7-x3T6HE+HW=KQ=sPn6(r|%g*Ja6&*-v^j`O*jRVyguBx#vm-H4aHd zIK{+KJRf0_T%OdTzypeRsqLLPWUT`}3-T=t>{1Grczn>W6Ma)cjR3)+Vg()~LxW7E z9pc;4*GNODdQfTTDZ3`gMgY<9E*F%twrE%?J7Qi1Q`%FluyEBrn3u^EOad;{;{vn$ z`RI>QF$PQqZQ^D23xv|XD-8osv$UNO(H_z*fC$4Z8}9>`d{qaWb+-8)E~87OQ=n=d+F zD9y(<#v{7G*>g>x*gl?L1Pimj~abZ8xy zg!O3>GeKQ$h(~%mfpnz|+Ud@wHl_B`A!|Ba!JTF32TrfR&c14h@;V(9j2#S?cO#Id zpslns^*jSXgT+`yX=a*4EUi}rO@L)K@@N|dEeth)y5GNplYUFd*Tt-vxID@j+}mhP z@$=`t-+=Y%*K})VA5Hok}MgY5-8kko8^FOTd*R9Ssr3Tx1+$tg6>-q z-XC=khVts&fCx84H*cB9B;MfAp*E;@>9t0B4WAJKYn$&klV>xLEUbaFpjLXzQO)B2 z4N88bT$Ik0MG}Sx1>{>LY6rQ0sq}W^yT<_vwsVBrLyEq&r0}q~$XRN3E?Dsg=qWb# zpna+KYsLb|1|#Uk5<=7$a6V6Ss_HN1>}`e?oLsQH9jytH(!R87fvp7Y^rYB*?$i^K zG>SB=B^z-HZv7=Pqhn?IuGtd`U*pw?zSTxWo3gdt3GZ&sJldMsAsyn@il^e4EiId# zuLPWvTPmcT_ATwW!YeB2&F})QYUnLf6Tr%VoopVM>1-V*fB;GIt@mMHa2ZA0s=D&6OvnCpaFr>=GmsLFWo!QA_)bdOG6YXYJ|jCWVuJu+GYeAwZ!5$1WA99;j`pE9tXGrj@XHph*55;*oOt2-~DjL_w&vbjl6BG zbvf)DRUGNoj9oMZ8XR70%#4_2$TaYP49rzGs<|9Rt2{m%!mkdhR zejAwQh-DDFr88KTC&L!gL6*gM5SSm49Xs-PUO>rm0av5=G10ms)fUc=*^6*byyCM| zuPW1Sr8nyn7G}f>{B!pK=JExAFhZ{K({{`SO}sQtj7uikoq;W9P5a;LtO6wWmwGQ#C+B#Dv9`g!7I#Q(?r=e#F||B#;I!LxsquOil3TM3=`!vK_G*Z`RC>t ztB#*=-j;$om&D>FJP$&M4wM|{?&ocgc2iyTC{BZeEEH?&H6daQc-ELtN(-y4i8jk~ zj+xM?(fYvzTmA+p0}sX#yj22@o2t*i1u)(2;PEjATx>&PF ztDa6{w6wbLgD$*5;cAP54dIrk-6aQ=Du$#{t9-l6#zZ`(Fpk zpFrQfdEA~i-Qr)-RUQB5ip-|?i8I!kl%wAX zJ2Zw=CPEvM1h;Q0ddjN^KeHO!)|ZcQ@ZvEaa}rl1#8 z$e^XNx|PaGQ}B?r8eeg({^W7KWDRq-(KlpTa|IbC3p^^)63f)naMhn*)EPP!?=2YX7|R^IK1y_-85twtup)wHw2qyOHZmIym$(w$LO^n zfCI~>787K=gkxbou>EU12js@5Lx8%+5N(b5H`*`g4Cx_wDfVUIB8{vQmkCkA9+Hiw zVA?(sPSUb&d_2$Ij@8(<{4ykGynmAW#NVv7To?zVInvL7XH_OA&q<^6wwdP9*S55$ zWdtfUC~R6_moLY-AI_B1c0A4ftlxpIgB@~l=_65|hSBf<_9b4-vaL;<8F zgUNuTL6DS?Y1*D(?4IDp{~6jSS|I8495$-5=>&hokM_iDj-j*Ku5!^^cP+$-m}J83 zXYn|R5g@E~{01#BGvTZ#X|an4Gh9EU(fu(PpvSbDuF%PYeiR*6y)o;3TU6bL)h0FmBT|;n zh+fO$2zqnSEZ89GUZkdC^`}5AC#jM;-em>Os++09wqdWic!rl2tqSdM)1le8r>K>8QEQt;TO@o9-$ls*;GcwtUAc_J~7j z%B;54ARgSlrEoW*1~Enae^0aD$Q3hXG3r|NkA=>_Q}_avQWY4FWD_=aSS0Q*<7LN?loSU+x8^E*u12a& z4TF>6DPX;9LaC$aCD}wFSpI-cCNy`VeC%1u=S*W%+y``+AJA@LFQzG_Ln5VD&`O(UL6e(DemWK2akpEh?Y71FyP_3EL0AjV5t6Gt1<8Vy#b)ROtxRInzSCYS=)@j@j zVEz9x6CCNm7WVj#16RxZ)Yc|nQUdjy;m^zx0f56eV@v3ztWZ`Q%MI5rpzzT+N z+a*++DZ)y1SSfDNP?2FzYukAfD}g$@8Uco<4FqE!3vPVVM)e%Ye0+VjsA(km5g{hU z^#N2=6HbWD@dJRGm4zGV-SV?b!v3wZOC{;=Uc;~c3a37=84N$sE$KT&1B;Di&??Kw8THT4{Vv(EX3lRI5nyo%tnv8{4DJu{E^> zI@&U%txR7GGj5ZBT1{&~7)T$ZmS94E%Tu9**F<2## zlM%=Z9LPmbibWpv#N|>K)@qOW!aILKL(`vuazOa9Iuq@nFUP<4`R|;Auf)LQbQ=oXb7TuhNYhc zvcBWcs^jK2DPF^gf6;=f9)xaaBgyzwCB|sp0m7-nbP@SRDvn5$SZC0H^eT=y>UxO( z+o9c?Y;pOjHND2@C}+&Se8$bbQ-9WitY`-#PZgcINxmdxt0=eBsM8-1YV3HYI#z$m zbjnI);&pgUu!vz)q~|@NY#LD!$EfTKE)xMH4-A=MZi8YS6rs1U&APE(-ApS}d)^O> z6)2X}`W;Mo(R#o-6!p*>h3DRI?R0%bDN*al;8y~G)R~ILx2Fqbl@aI%C4s_$uhuhy z*0)i&7GjVbvFkyNy9A6{EpDfm)7Oaa6 z0(8{6{7>e%p76mQeC#%q!|mGUfOk5Z2D}Xo1KwaZPz#r6wz5Q(Ks3Zha60rCLA0JI zf~V1(D}%1sDJ9gGnvfqh1azTtXdgr^h~SRUYakTS>rl^li0}?<5z>Y3cc4YIM?97$ z1sHUrGk@J|hdDpY4KIbA`)!i>#+MI2@|VxJwXtP1l)&T5WmIwQMg38%H?4gu?Mg&{WlTx)%eFD_ zQQU4EE*>3&X|0*PO__Bj+tIfY>ZfnD|BmDfUDVwI{o$N|Q$Czye5f*nB+O5G7(;!z zpjYp5=(cGC37WDU4NbhyJQ^gV^~(@QH}}E~;z-)>4Et@j-`1d~mE7EhXwL8~5{oir zBu3mH+s>DhlW@k}byKtB^C~_^(A^y2482!j#ngF~X&aHD!@u1kA)v|Wiw~$^nP(&x zGbAdW#VdhM+-{4})qOm9d3;->Rz7G6U9VyluXSp+QoG0nY|+BbN}hRGI!Q-a0w}GE$@#xO?n-XYVy!+?~z)6q}ULfVP$AqYFHe=7w_JRkXA-* zSwj|EH0KymK!*z$By*3~7>A%AvQTL-P~ifXM2D~IVo4XH{TH#?d@}bBS|Ce;>N~Qh z&=Du}h|UuCOW_bF%L?9n2t(GQ+~b7R&du%^*qz5+eK9)>Za@;J*1DcgN~LW>>;@|} zb+Bn-M*~p0z}sA)+iI^h50?AyaiQYGFjYr$>=(#Zxdi5=KwaiKyJynq?B$WqLmj|jg_XBGzJT#>7m=Q8d~-k5v^k|h4b{AIxEJ{us%w?E+uOOQa zwrbj{`4WX1n(UX4sWd3dM!ZDjZ*`jWTQGt7#j9 zbpnxVr^vm<>GyOWstCT53x1gE#$Ic)o(EBqak)|=NB<*IP$CWfMqlAsv`(=Xsk<05 zlZG~0;R$I)!}NXZJgmsX?L1lbrMW5AlT7sWROS)SCHfl^%9Y3@+PipLAfCX!Y4T^lGEr*4<~f^B(z1z_R;-u3NUkB}G^qxf zilCN9)v+1tHL^21Iy=2Cdlp7xPD*4hsm@HtwKsECT}x(vBJ%`y3au;JbbIFIKac^9 zSq}A>UIO(~6ZXX(DX5>;Zm}>f>OGMNb!#^q9$p^DnBs<3?_({QS&XjM%(oNRUsl&v zw1RUbj&GZC0hT!IRzzFamieFrtf9C`qI|~eZsJmAa~2# z1U8+{Uf8AEV(Hhp7{RGc@nWMB`OrUlxYblqwE8|xO3wQw=QicG8X1^^EOYZrw$h>0 zxITs>2O7mlf!1jUg0XJ~H|i#i*mb*gfmS5qjA!`&qQaWhgryoIPNhKHOM6J4syv2I(Z~&Sm%|!eNj2VSJcQfoV7HQo>;DsiTpj;Cx7VbX33! zBy~xX5VL9v9y1Oh(-G<42DeMMAoXAmgURe*a2b+33_{Yqp(J`D(-ibx1|~h9i@gb_ zJ-169VT%RKbSUk(W4{GZ=3|yyRh#CfT{t17Q{^;(7@JROBSd);@us)n;dXodCaN@j zZXKqe{6ICY5T$3o?ZD&(s?Y(Z9Z;l{`XQw;cm%$+o429}dloOVftohyhx%tD?n9fD z@jv@fGA^QH!>UhwMM$&tv+D5dieW;>=1s>0GnAE^h(XV}CmO+P=4Q*^L2 z*Hfd66Eo3vbR8?}(#*8Wm}zoA<&I5c&St790m2VA*H#`e*P3E}vh8S*`D4wtua(WV zwSKlW#WdX(+Ut&OVGEL#Ish$AxNk7w%qUTKk)~6g$a6KBUc`|s%{P?(6-~o*(Wq>$ zVcb*%lZJ{8{hO1mRZn)h*=CQ3x#?C3D|3|j_QYr1e1o7eUoQVQ=i9l(`8F?BoN(#b zht0S#F%6{;o^s!BE}wEh0Xeb(j2?viCO*oPz|7*>+@BVRVzTJF2^9^j2 z=38rw373K=U?4TK=$^$83(F^)ZjVo9gbkT$h!nKm^h!croN?^D$y@bBSKs@l96ify zV<70$6l2x};!m=Rm~`SJvP+qB*T7it#pWTa+f^_Y#PUY0n{n)5%T~8Uf3u%(ZzeK} zjCcBGalR!o>n!oM<_qAgY$Z!@k9?-)nr=Yam6`DCT)Atj$M>~ps!fZg8utRDrOmYH z+*IRIWpS$YyH}My(nQlX%BGpyGTH8#z zLnhey|FtIApP(`lEoft%np|;)(ecc$#lLIwtC9J2h2~d+evB5gvk25yoM~jY=(UnL zo*(YKIK9|P+T{A_myWWY1vPYQP;)WdQcW}S>PMqAuNE_}m`1JH#zZT|d-Rnp|LT?u zF^Yu&bo0tFf)UqPWZ`=eqA#|2HKlA`xt+tdM$M~sHD)UFDp7}ndyGsK1$~ow)v0+k zKblv1X~~u_z0&SkMofSyT1(hv<@2iXqc31VO(L3Cyr$!J^`PP?)9Nq5iKZ1dL;1aO z$h1O9HVD5xbXuJkO{?O(JG1KVq3Pi;+b}sLN-L&?37I- z-GvUTR=C24u2De^L$;~PC2H8SN)Xgy zkDc$-@bXU*wgU^HR~`%Jo5&!Pc`A`TSNpd`PcqNVatSgEGs?oQZLxDRgLwYIxtTgV zobKGnF)^Xz-1Tzb;oJ>!uW{}Pa^LOTjdI`P+$^TI#qM+NcDZxTon*t89L7GcK@WDw zwIqgfN=lo+3EP^J6-vCF#I2d7ia4K$DUI72lfzrF(V$GJ;bL1SY->E9U1Ue2g3jmR zkA<_X^V8tHSqo2qKoA!b< zyowe}(~(L^RMt&)-mThOCE-2!f*%sl+PAiLkTT8UIFRd4?%m!^|38Fx(0g0@7RD-X zXo@YqVe$nw#iAqk^P~ySivkP2fW=k-TLqKj$KVCf8C1F?jT=Si-I({FJ8(%rVAldu z&+#4Mn48KXa{yIF#y^Du8CJ6~;q$rEaPyAucs@hzb8(gu7E8Fqky!P%Sc3}~ASrqQ=0S`$$}%UPunH!)Bq-FT zR`bldO`EOYhgfaqkg(NSa-?&r)JyiUA~(Y}Gizg=_aQ4|F^fv=m3*k)xiLn`8G!T9@_8zk*c)gyz!jpd(ZP|rfG`w0%HG6it4uj`g@eYQrJk zwaoMvllC>Rl{V!8ME67RRE8F+B38&5Myu7nYKJ7t$&rJ+ie6^TMz&DLYPr);6XkFi z;WVVuva){<($Dudk0u9LsnO2Z7>AmRMIT4-U&jV1y~l266Aaz-HI*?I3aoXN~OEg9GRx?m!6Ea>@-F0UXIsl?2A)$DrgFXCy{%hM?_Cn@b3!s8px z=3R*3hugE2H&BT-V5FhGlz=fmMxm*4AXxr&3gmURtqc>#@vz_C$-AZqCGR>;L#fEZ zBw%6AfrUxH!tCf8shF0`xBk=Fm`*TU#>QOA&|OeZkg#Vv@tL&K*qAxxY|NR878`@X zi_-SsKbeg=WDkFJaRpcmjJt=ytGP&5kjY3LR=2_VW#NOhu&ekGq;R(Q80p0?sANUr z+fig=Bt=D#W19&xE*Lh5jWOw&J%LG+(hpICG`7qL;jUop8TBSn;Y5d8?0)JT<7IZK zZrDBc+x=_|jD>m9u`s6AL^19PC*T}1;S%`;x?NW!n=>BsTLaQ6)8f1f2%PmAAdvWL zmnzUzAa^&|ZaJH>BPo+g`KaPVu_WA*^$>~D1{7#gtj7r%q#WHwRq`j)G-(Z@9xfw` zq_ZjpfK06e5`HYJNd~PhQ{uF18K8_Pw3+M z4UMe!O(T;`C6sP#N$+T2?cUh{LlX4-ImaB^CTWG9WQ#creIw#wEt9O?9Dm?2y~~#F z!#q)TZ1u2VIzc#&FKYctHau8<7!6|0U#+!KHCCV%+ztx>E0CQG3&h?7z6ZXfolQPp zSSZdrCbcI{a~xLCbC8lFTEKS1H`(ESJvylzRX>o7nBy=`dC z3B*p~NZ4a+8;;vzU4%$rDISdg&h5>S8ZcC<1!P<7!su33(LoDb=Q%vgvAdisTR2$e zw-e8qpsfwN`O*{pZ3%tj32cxY6(Nct=~_H;x{v&{tE z+>#@F2h-pQRCii499_E_?2@$20TZ4{4c?d#y%Xpz#}$~AF9J)B|I)nM$2dhyoE$_h zztvP1AJ$5t7T#xNhF3Gb!%G;W*e~*zFelrwO&2g4cr;_49Un*z&Vr$|Lm;G{{|v~6 zMUdU^AiLCPrj{?eQ*ZY9K^d%`2>cuT7b9^s@!IoAs<+{d+OnI%ih;-wO>7dVc9b#_e$dnq?i#A2FgjuojcJ z!2BDYR-x}xDXOEjAB9;XjkvLf)7^x;fwIcDv!2z0UXV{90jkbsiDxsKnIBwxrmqXrzkIjPw~l^Vsb?iGh{q?9G2 zA*q>w&-EUQaaVkjv<>fUYrvdZu5?#jH=4y3xX&I%bLxN^OXFuY=&R5(M+dXcn4=`v z4nH%7M%XkwsEkeZ*{-QqvMa~v_nYGj^Pfd+vi}%qJdDc~lK8;Jaj*V2Q>b`arSiuV z-%fBe?dUzjtWz=3F{PWi4B;rII7R;tZSMmgXI16@XCRe;g=dOIvx;k0$JZuOFm=1y z*`j9JNqL4&F!b+~wpca=qZAF0U<+-jn~db~Y1+E7ii$3}xXUWL#Z_5cP?P>4Eq~MU zrv+5XKbdJjN`bbN(*E9`bDxUF4a=1fwElnR(#V=dD+I3EO#F$b!M`9hO7`!}#Jy zZ2CS{bgJnY!K6xIO}J)sKzOAKBm1-Bbm1C>*Sc`6!kXhr4@1EA#f8zsbVYiYDGdtW z;^OHKoXv$+)Clvtk~_0?AqltF-Q1N(My??}alYIa&{3j>_eAokVx(gharSaSC=Z zbd_=~@(qS2g4q$>`53mwoWVD;ZWBXi(R+!ZJj-He(rp=eU3VS@%Z7HFdQof{1Y0R1 z+6W5@B{Y+UpIx;0_~%jg6|X2n@EpM?gWot|;EbJFOirCx0;$p;I*eVAbcb zsvdz=Pk?6XP?>6Gfo3By_m^O<2EUx7P7yGOhC<;CS%(wih@;}|zlow{H0l@bv2TR< zW@(BiJTW|huH&UljN;R%5L*k^lRhmiNvneu0Zsp?-ko$9Z} zHKJsm-ps6FLWjhk!h?Kfrg6$Ai$+XrF5b_$96iIo9X&%O8HU@lr)Fn@y}D}d-qg%Y z@ZhZImWu&6h~@=n=sO0MQ@9Myhh`}p!|g*o@Gnwm25Ey6a0YLpfp;26%53mEF5GGg z3c7#@e32=zlWds!zi%nk*chk`RL zXhr0PV&@M97Y+p%4Fy{*XxSD=v1;QI!u^#AwW_f3>x?MfUP+vcEnTr zWK$llvSD*QFt()t(C?x!du`J_@I)`M-*)?5>~)<>Y2%;QdOR4Egl@e=Lf=ne8r19iAVy|*J+w(|} zSHxOZj8>jEMyB<2=QhiXT(5$!b4d{G(S|!adFjdZHTNX&zi%{pWg?2Al^$kaWHtM%uI@Iev z4VAQcL`h_RdU)nlC6Xuw0M!5qN(c!Mu1`GZa$IZfBFR<=N*gX_7{V@>`)F{cS6ZC& z>s@nu$z5PE3kq)D!lg|UQm?)Vy!OFCN3APE$9<2A6Lbv2Mie*J zT04Yy<>CYvB`*WTtHORPYz2Q_pD!sa4$= zGktQ{fHy>8bq$iw@M(8h;VPm?KVS5Ms)(BAU!PcM1>!}aVOqrQPwi&n7e(~2%$yFy zG(c0+3vd9(MuPm$70?B3GBw~%rWvxI{#PfmB~KIX!4gq~1~ z7t|86i{)l9JQz^Z%?n5CcY(A9Iebn?Wif21Dm;sA*-@)bl-Mv_pm5g{I!T~#%HUr0 zQcIgJZ5)8Ll)M4B(^;Km16tf{)F=#WI&R7KxEZ%3ca-Fjrl9DA4`yx6p@mO8xtFD} zGTw6rY`#m^4bY@G`UHL#sHyX@L+5wFSj9A{BlDY1HC>f}2Lm$A#YT6fjFdb8@mzHK zPhWYNcg6=_e0!|ovX7{O2M7&=qQJd_{{#G&rgqGNgnn^u;a3hV@ljjJ;mz4t{4IiS z`Mkl>CNC~}i_IBMJ5hemG1m|ajrAmnQ3SO1zjC`75&WcUPwF%d{KZBB8d* z82dH7pax=5=K*vjud}+j;?JHu?eiZ}v(OHCXeA=86a;~-s@a?b=K4O zFyYvXnlaM^CRImsI4{~DSH1#`>x@)-uQez499dghDPt$jrnT02+%y_!zI|!t3$jlf z5D}W!pl%viau?gQ^@R01r-}q_y9Ui}g%rmEPPvwLe&!9k2hAXyHCqU)N6;s`12#*} zg~lb?_+4B!l5k*x=7&LuMlIrcZF;hko~XwK>k+cp(=I@Mrj&a~NU1|z22x5{hLIP) z(TX6gl*&&D-PhzO#%{c(XMeE+2J?`2t zl*D*E^h0WH|3~`k`%qhD!*K&ZCnBDk?ar|N^x7I)C!{)pkm{Tj)Efy&!0)3--HGs` zw9MQ>9}y6AJ?DTL-+^Qq5zwBuARttij)3F=s$-hxva=kYrwR9Q2uDYo=ugyA<52Ia zu_cnB3A&}7c7q96bnqr((T3OMafXvMxMgv4r1=O!qUmh;c{xN>;-Qz_Mpl|d3AkGR z7+TRfm>MHmiQe4xGSqLhqD3)b5EBe=FY(KVNCnva$&@mJMnoN+$imC94SK{qVC>&0 z_79T8pM(E#Iwowcb}-=7c^7zd{8!2m_^%@V82sN}#(ytAJx(DG)7||jna+)sp2u@iW_FjO3kXA2$7wBOg{G@$(cdTdr1$`pY@;#ZO#w zjLa=$>jTr5L*Go!>KXO-#CqS5o9VE5yezMTKK+W9W^yzp>XhYS5~qzz1&T}6VoZ>+ z`&W}?NpA-m874Jlz}biL=|q#9j#@Fr8`2l}ze(s~@Lu=40kbDGRul z*P9R8YQqgX2*pS+<(XsZ-bj%D1kZ2`$-CwN;)_r~1zKnN^;j7^Nv{aH4?RHdtx z7(IHzJvSO%0_tY`Tn#AP!feIuLJaLO+g%pcc^P1sqXi3u`L7^1*cIF+HL$s89FUE9 zyE#MV1W+4$fgGGiV{O~Kq&HFX871u?64VVr5j43>%KLH`YS-`^w;4T*X+T~+w+~Lu zy2TG~-hLg?fqm?6sIL?w3|gzbuUvYPF`pBCX6&+ngK*#^Gux>O^-ST{U;h+(fUGi)!v3GoRylm(s3C(sj($ST7rqcnBpu4?D!@-{C&8jBKxaLMd*p@V)2*b+qv4+%db!1M-DM5swk8xLccak+cK#u|YOc*ommIyl7}P zdmKbLkx-eWL`mHAVRN|d?;UdqWP`e4jEt$JmRvAIG!K-C=8emQkx~v^Mur1U%K0@! z^PKw2p9p2AfQ5N1wBtk?k%+XQW%)*oaYmfV5i2cmNxpGfjEmuFIy*zLGMR=gJZ;I? zkXPX&hMiWl9ECV`TL!zjm@WV4jl&Ks+F3~NcVU16ZMc{C#Y3cF*3oaZ43LaJPlPdK z6FpDFAbaQ;AnKoW<*`G3TT=`P_9Hs{20RDHguMfFM@YNF^?a4PkuIXk=uXr42sBs9 zVQ3y*kLO|DY3Izp5z80E3sv_E%Woqm-o{=&WJ7L*Kr>93F+rxXEXZ`3Aj1yi9Btxh zzYcUSEuPQqW6Avc7*Y_^MrpNNT0NIn%~~ycUwP;_BdrrpJRqx)p~W%t#Do0Dc*)Kg z*b3hf#&bRl^1a>YIH1siN)8>|0W}ZJ7hFr;`xdw#%^YH56DV)9<_j%$<1IFIfCp^; zY4>ctz`~zumW`W6P!!Q@L!ya9d~b^}#EB{eLU8lQ5NqSkbTOuKx*8P*5kmwyD@KzG zhg6!MeTxorM)5@w&VC_}ENl5hNdD*Kndz$TvNnvsBei1QQ7C7ja`0`&BK>l&u$4ey zkpfirh;XLWrP84cP*3z0Zy6#Vn)Jk5Ee>esqgG8TzjFuVR)9VXrZ9|WmeVw=URC90 zmbud)FSq25yV)Q&Z;5(trqeAp*X#rpjKgbz&17WPALu(4cKpm}*YC7pi)=TFZk26p z+s5n7#>arW(v3B2X>Am`K5+w~5pX_&UV&+8f9+a3e^=1-OE6A5u%f$AIgI0coe=== zSMoZ7c$KA0yjEy~@{%JucL4-{!;)Nt5HFvN_+XP9G}`5gXTzGn2;2cIEk_~IwU(hYxkYcQqHCYs8U`i@nT`c-IY%D3*e@2j2E*(Ooi9}JSy_(A?r_-s^Tj$ONp~L7 zZM3nXSi!9vn)*y*8!c3Z$;yRKyq(PlkieLtu}y2I39QA{!!t*y?i7rLx4l)qf3+hh zRp}AqQ@H;G+v|Wmm#`yZ*bYKA1QDwzYwwJd)Ck|MTYBwH)M3ceq(h&|= zvn}o%$uvU_SaaXp0c$GE;msVdJ_ksomwlrH)_+t;2W1x8&H;-X9;r}Lf{u(q+uF~; z)8@SKaHAc4!W?J1XYEtW?+5+N0V@?9F?2|=&J#;}v8d5r(t*8JyB*H-04a4@xH(|S zMw*jlltn*}>(!j1v~ltPDYYpe-J4zgCKW;R1vMV&d)09~epw%)&dW|^r*L9ve_5r(DW!O!c1^j* z{Wu5w!RurmSt~n4Xc4bXnK?p&%Mvx|?#e{r$D_>Du`*$nj>P(* zzGLoa`!*=~$X)y`b}5dPIDS&zuWcN^&9-W7pEeV`Zd$E8u6faV8x zH|mhW`;xo8uAkUI#!)Jqvg`TxGY0WYB_kz|9UM*@gN>8J%I|{&aPxSkN|6wby`A{) z?=WR;3TIRFeb-XZ+2PD5Xm5L8HFs+HK{4GuHj$=%RfX9oykU13auUPtZ&mxp)7`n8 zALQyM-d?!}2Ue`oGc%!^9J4qe;?}!?$5()WwpIBki0B+Vdv}hvz(OW#)54keRO4{F zF@gn{jN4U~VXrl?bPFt>eAvJOZ1s(Su5}Qip*q0logk6G#3=yvQ_RtDnw$$uVEQqd z(>DVXsG`1YV4}Ts{;@gN!&I{0>uMoaxtn_j|NL%V^F6u=c&9)6{)(n>{>FL`aBAe` zFeyz(&omDQs-9V?227dPJu@-E+VF8KCe(&wX`TE-++hR}lqvGlG;27ZXN-iiT&e+c zp9AyV0`rCl%-P_DBOskM1bpbhqe40>T=csB3u6g6XH3X~kihuv`tIf&5Py3P2Wp3t zv)=+I0rr^&fur?Rw;GoEnoUeNN^dXa7{Wi?+h>m6Tf->V#}^;ii;ed-=*&f2WN zr@VFFzV;S~^as61nkM}~%+2fi0HtKYyclV!^S_LfzKKPBsxxm~v?=(3$wA=^^G|`x zP4VTPV$YIyN@mh`T>1ZlM0-T}M|ED!1mAIOaFsZQQM^mCq~izQd;0y6pHAe5)1Kg* z3X!KMQz(oljUjMT@M7V1pxWg)m)F%rDK^@{i4PTf`>o(SQ0vL7n;N1hR5bZpMbF6^SuCX;BuH6ca$ zZX#c%go>F6742C<#ikM}PCwcxmHntQ=0^=HL6#qZip2+p`fbh>CBU3e0?e%hfXLw| z{sf3P;vefqvJ2X`A$-(1ioF>W1jfS7fg@peBf0)47_?t}1Sw|v|A_vtGg`n%u+;H; z6d{cLF{lEp%OAd5f=Ih%DSsI39wz%JsPmW2M$8XhkB;u&0otd-FI1*FUypgKUt_FN zozElToE2wBIMZ^kB>5Bkz9%Xbm|W?{`Vf?h{NJ3B%{7sKlj(cLzRs0};oRr+gF+~N zWtG03Tb0sHTiB)OTsF2(@7H&&0@zc@6$Y1z&v1ogIIR-7h?JA2K~u*v56D@_Z+X%0 z`yI9JZhyBQ{?t5f!DR%lF*)4K+L-D%VW6`w7EEIccw@XN`JC6qp%7$ljMGj8d(&w1 zl#Vxkg6oB~E*nGkk0U5n*+#R>=~-8xf8$sRwQ-A%*X*U~SO{oJJ;;4JirP#R-{ohV zV>6QN+-uI10IO>-mkQTv?w$ z#-62`>x~)1|G9uHC6HZEC18;ccqwE4UNA`dkuPl&K9tN+Q=g8`2e&cNnFAxogtJPO z?=Rn@;)h&&(miJ$pXWO5^r3X}Rj+3kk_Y$C;%=S46VP(Pb9hyJ#XqEbGSCGw^q~xR zdQQ(wFCOu8oiTS(Haw{*KwEGQ3Ifa@I`52UaMj5sAMV(xL+MUlc~vz&5x><~^-saP z1a>{8nlmS+#M8l5RmG(eccS|*j%d&CX=T)&Jdpp3w&(UYYtM26O_$nPL3=)#=i;RF zp;Yp)w>mb|9tlACy(=cBdu9tZ+TKK=;wO6#!=%JOT#T$JrIkjcbM4SJ<(pR|xmH@)+e(o6 zgHWN8U$PEWkB_KCOhx6qX|I0vCs$Si)*l#x)1wBx*$|Xl_Gb*m+W(ihv+))nc{$uy z`>KCA^!c|xtIdq;gs46E2HWWJ1NM{<>FBun-^dn@sF(xY`2S@HYtBOkoZ*m(DgaiF zw#uaTrxMsUYxMnpGU{(&1T|^WBSRsXB0f368)AriA&u^5nR_x3r~~7ltL0^o|L4^}!=I|`KP$3rH+v5$3{gCC zjyON>+K`&nBv;p_VB;)5xYs1U;66DdP!I)Lo8}@J%#|K1r|sdh$v8KIvh9H1gHnxB zfOmIjZ$q&gR`DJ+|-_3m}lEOMiwVm{ViWrSP4>ysr>*qfv?0yv)51rMj z)_-9!EgNu6H~b*(Gi|7>u^2Mj#rT!zlXDz;FJT_rYQA$aE?qSXi0PH;;x5IWXA=7r zR_an4c5}6oDmpiPqV=0%?@{`v^dl2Mw>^7;ibL(0J6k#%5S7wCzgTHZdflk^3u^Q( zd*sRWgt(-M$Q7Dw=Ps2MhKpD_*5xAhvzlyk7pP*lqi})jHtbBex#P$5|Uu0EWP^E7#tHev|^^N@utfypl5S}%To$Kof>5phOf?a@9H3_iuwE9ar z7m4e+>h2eWI5b0vwJ? zz&qms?;7bbK$$*Sj8cay(&5m8J}w~LdBqu;+HN4dJf$3>(RkJD2gm5!O%|M7<@PiE z&Q10Hq{WFPUe|A|Y__n~Q>rcXjr!F$AQ4|squ&eVvK7CiR=*uayUR5cx_Lv#)5vfo zj=LMb3t$h0%&}7^s(u#dqZU2z{)&|oD>|+wykncby7iJ=?KC>s-~hYn__C6` z@V0J}ALGE`cBXHXA%!i18KhmeyOqS>H|d`ZlU}<6{0*qU~WTEYq{$Yafk| z8`Y-Z2`)y;2CrJ_FBJZ+Ps#@`Ka=(4(BS4jK*{tof=>!X&Nw0KUd9|8RbQ=CL(`R1 zYgo%^AXv9B_-bPZ9%yzlpKsYI+GM5^ZEXURm7^vw{LX2wkmggByk6@Dm)CcZ zfY~TF09`!kU9(5M3P(+{!E>qH&<0y=XuW*3IlGT~b-)d;Mn$97%QG9W2^0-)mi0ng zVG@QtS>*aQ4YV*oNjK|hqfCZEHAw&m*Fh0Yz*Pdo^Ai?vq5cBc4DOiA2HQ@F6yxxnvGd6nHoX%$;+dCrqi|;0?Z$y;$<-4IK=z_}Z z((PWgMz=rFIet*ro!f8T8*c-0ZDN2-z5$ zdSOYol`P9!5UbH-A03q!ui-yBPj{GzGnl6)?OmHg-TbDBG+$yY8egFJ zKCI)N3RAX=b9Tt>&l^K==w$h6sB-31W7r}n`QgAt)qByEW+bLJN-9ltyWJ#5)<2SD zKlp#;O^Jn+^9PA9e<$Q+a4T*AT0`=8Hqe@<)DAc0a&{>bI{QAF4{ratYO)!@%il_e zhH>6sq5dy^i3OkQ?)!OlIQU2Q;)SQ-Dj-lIK^x!{#x!8k@DCzNi*UG?cua9Msv@QS z;BHxe*o-c|AhEM}ELG!^-caH6`*yq$+IuY~9$+yc1PDLNjK3@~QC1WhDU2fw-s7^! z0rec3pNr+6_c^_;nZy-5)6vt{(_3@C&7xSorNf4CjS@2c&SGZjxQ@84#YA{Occ-^` zwd2wCBTVA+GMiM{I_!4&>Q1jeHwireJWWEwZfk(km z6vjDX?qZrj%)|O2Yi_%g@7`Qp$R~$nVksl147yeiD{6jr@g~~17q!22vWnTZN{3B* zXKm)F=~Qr6#|eCBPuK^He!(XxpX<{}pu%`pdHIh6j1<=^dR@P(geY3JP3svq-Dfu? z8@o4btjzZ^Hm7>4=d+vMIDT)Ib$0_<>CE7zZl27b!cQmL6Q^RuPYFh!LxS8qhS-M2 z04?fbV%8|UHHS0p z(f`|b;C*~pUbAmm;#BPz`7v|b8l&nmy18VJ-?ELzR==h48;VR}k6gRi@0p1)O7Mc) zB9WQdY({$iNBMtFRW`s|2>W~%7hbJA?sg0M1Xz9x6b#W^cuDTp+Th`fjjfjHdt_0@ z@VTQb+|7)f4os4V#nkuco0Tw{5JL!&+1w@fvS;~Uo&e|0q^Dj^49m_Y<&rAB(sJ9$ zGIfErvcyS9Km}SL+fr0+g1N0q2?b~&j1*-{n$mP=Bcf@gRCG0oY|_l(V@Fa7&AsaU zw_m1FV4QRi^pZIPI+_cfax}46pmLfP0Dmk#y890gapY5Ov(O^PeUBe+Qjk&yxDPeu zqNmg=^*(-bGoW3j0bb3@SSEGKHR@fK60BGV_AE;*f;lX9xCTbG7W`kcD;{3R2I4{Z z#OGjBUe_XiQ( z*jfAl1!O=pZP2_UwQ{+3Xtpx{WcuCxzo|PLtGQCry^QY#{j1cZ!LPgW0k=+*)?VI% znpCK(8zt1zwU-DjGSoFMBUxbEsO})(V6h7sn1tp5!=TR<>HwX`1UNhOSvTk8q(VX^ z#0M!+01h-k9uXPnp~;p+X7^~{#p#C4t;S|Z9d8=P0K#*~2F?9~E{uO{u$oSYx7$g* zc1kbu+xK|&12vPOb>jM2qC-O=s8O`OC_!;^eR?}rL#_(4s(7yUFZIe1J=IX0ool}y z1FE-~1hmzgwZWUc9tq>J)$$I;E)1(%Q}RKX8Xn|`1{VFC-QaMZw6 zpN5$!7uG3<+mBnhjO$!F-pz($Hw_=Q+~umocFwJNwy^M5dk+sjUYN_H_(5i6zvXqe zal@WX;cMSS|C&vtGr>kHGrwiU-{IZu2i%&z-*`(;yBA-pV6pX&>U!qA=3 z)}8iIg&&atTlvCEJN6!4dy(y@XM%^_u`66=%w&5T-L>&-w{sa~y4cD%c(Nl|Lcp#O zMSW=3uBGMi8P{?cnb}P!o6BAu3D`bgKmM7Gu>Wu>Lu(?Y_&W?eFID~; z@_QCIK%!dmBcLlt_P9CKGTkc(mJ&Nb!DJN76Lqn)1-Z+E4Pv zBK;=yc1V)dTI2?zyw&G29c4oHA6dkV-vWjH0`!nfdV2G-mIan2)&u5F&|?vD1dqju zGxfl0#My)PjP=O#k90YHULx|ThR1^uJK`SGZq&ddYY3PH5U?Rc!=S1Os`GT`{@0k7*vyaOI6y?^p( zedHyZIF$}#c*n0DsTA=B;L3a2^)*T*vpX@0X1aZhE6DPKH6wC?FVQ;)Mk&-lt}MAG zgFC9moWv2~%pg2wH$J_*0J7su~LF z`^#aqtj#dc82cdsFmvqe>f~mMr{h#a4={PLAiaxEuCgFKh)<#SB%llNDS(S09oGb+ zAWq5`!_a!hGJHR$FBM+nUCBP^f2Oy3Iv;d1H3ByunAO;MAlZtKrF$A+Ib07vejDZq zY}N0qya@ibr5%1e;az?(9=7~0INYT`4DQz1hXuoW?b9D_KWU{~EK=I-lqQCqqokQ- zT*Hw^t1kBK1WrHLUc4IyH~#QijD8NcbC8r&f#hnHwri!5Fa<31BULFKbJu&rtqNz~ z0|N}5UQu$ki*#M6KEHStb5UdqqfR0CdoU28I<_rf&RTczj; z5Kn~Pg})7rIT7VecA3KxIo zHpj(J#{hAJh187TrJgB={p;A`I1aC;KgrG4E9$=kI&W{~NZxChzAW z@_8FLTz2^RvVzDv{P61isHt{h>3evm>(@(>9Zhl4zwaHsKUjRvw@1ADJ)@S=Ig0VU z^nTucWN+Ll`teICj!4$Ze}4r*%(c^uQ_m=^sD{#i`)KKB52X)BZTV$Mul7FIz$4rL z9@?J$MJdqkD*0QCl>**H6N4MITBzlUt@Bb z!K*QOapj6lL->qeZl-f^IK1l9;YA0D4$r5Z=T{}SXM-z%R~zuU0zlQIf`jRxq0%6h z17cSiDDI4-s4ISyu&XbfJm=uDf|vgXV$#XamqF&zokVP^r}ETvun+xqDtP>82o?uY z4#CC^wHG+`oJEO!-WqwvdR<@UH`B6RXsG$Fsb~He!80`pIL$cdtvc3H{RUt%M5oIA zpa&1HipC`0Jmiq%25+@&zIw)TpgNi)X02GTwXgWTY(!l$?H62#NFuje>klLO1SgiUmLXJH!iK|1-Aw|W-=7x`#9_+8=ecr8B6Pc*)hW*l7h z?u*uX`BQ)`T^*O2GzF+1$D8TVI$yAXEhct02>*37!c!}Qb4I6w7t_J{08?&k7)1k2*rE7b<0OU;V4g}C zSdL3+^m;_jgWC<3pr+bPJ@LX?7NnFehFDd6A8A-$`q}_yy<7aGzi&s^7T;^!&;8_H z_l@d57W;j_hr#U61bh6x7izMYR(k9Do4j=cJP)x{?kfP7hckVsMrHdM&%wVg(Z@}O8 zh&<1(Wi6gf6ueuvq1QP|7UAcMF@N80i|490MpwaZdPJ+$-i%xh4rIM`TWFLuIUU@W z=_}UYu11rI+>G6~A3Kl<)@Ng|gq=0&N;XD)oBhsh6&rxhe6@Bltqoq%+TKoE^}{bP zR?lVnp8I5D*VFCO{qU1)yzhGm;lR6=z~g>wlb?TVNeWFrkoryG2R}d_j6F)?j*qJ& zH8w%%;8heKSPaQ$u0a+&2oEa_4*AC@bm^~BoiEeD#|CeW;>T~npUB?_Z2A~5pGK>+ z!CQvlH`HES4x{#lpN@x9<5>SBH?+UEZbPu+=rse+@xA%S+Mhtc#QW!?h2P(Z-~wL3 zdMXndIAWJGMrnCWq7f|IO9FoqAqk0xFZ(N7jC}EAMA}KDu}JS5>%A#=1v|WTeRvB< z3d20CX64n1iuU*WEpuv2dIL!B@{@b6KHmFIuXk&&%wIY;*31L`orfw`Ob$O)gMMbF z-*Z*G@U0%IOwOosHNMN$7^lYMvBT;Mr_@*p)N1lr$J@fQY6gF}Hk?xfzF3|4ZA-s3 zc=K&)_~2Jd@G}QZ05$yFUC!I3)x*x){nB$)%nIQbQBVQ=H-|M}$F#X?v17lN5q+;q(6Y1HYpJok@ub*6@&Jw~`Ei3+}QJRGc**IFl)w!#{l0$zBjpu zYu1)btl#f^sG=$Ms(ZX5C)tUYkIvv?k?DMuapz+=ft?;??QlwU6O_T^g43-#yjWGz z6Qrv`vo!+a;icVY=TGJ0!-EiD4wU4JbUP zp5IB&57F~&6@K!e%UZs8UQ_bL%jO$ieDRztlH^3g(#!tJ@K)rN<&N5Vi!}0D@2#6s zQ@l!3Rm)yz>0?rVe(8?AhxhF$UP$bayk;c~4mhmeBK|)=u~YnwF#^RG=}76t#^m5h zpK11kS5T*VUH8((Ob8Ev`QT2KiH?xYpk>ek3avS)R0>p=0yPSx_*AQa*M(jV#IEv# zY0Y7H124M3D(?3a;zNIf6@_W5Qs++z1opb( zZGpXIgPlh^(^`UfiN9vUFL0#8^Z1&QTN?;X;e}xES-#s;@K$RM6&vcA(4gXQ5z6$8 zp5P}pw~x_0!@97Z7e8ni=y(ZmOrV&G;v)z#Zr;y^7rXLrjmigX+r!!&AWay6*`*|27?n^RB+pLxT2n4RTtGW><MC#r$nG)|~uR}l@+T~;T%4NRmexFJXdaJ&s4ls;2z@=_N z{OHp9rE^*09zxI0i`P}HOdw~Ck8j}aSHFC?0@}ouo z#`mOTM%kOH8`N+Ob`SA8VbE>DiCb>hL~orI7uptYd3yV`%O=#C#XhUYC# zCm+B1``G}@emwfx@#NrF%jJ2iE}?g>%;KjAmgJczueatOiFEmkjl;fYSbyxpsbE7fWXWdp z7Alp+j!yPB))n&4r%7?p>$(dVWy4gJaDTk$q%m9wot(=U-j}L7wB)^w!LyBZ+Z%%e z4CDh?E`anuCy%%4+x&{q?zR$qO4#gm$qlSAyns^9rIa>G*-34U!KQSWf_SmuT(?0a zxB79~)fn`r`d)ZnV;4knzuxQilqzZeE3fAcqIjQ~I0&BorZM?|*Yls2>lu#cU=3v5 zU~pYe@=~op#Kn&oF!3yia=z4J! zBo+x5&^Knn22_mP1j)cacG<-4@x9p~R{V~d0zXMZs>?p!{*i2OjJVZ6v4!HqJK$Ey zezCn39+IfnqIL+fQ}Ob8=NQgesL9`-;6< zE_x$!xf2ZFbUGRl1z0qT@kzJ*+deV5TY^qT~2SbRwUF$v1GML^II%RCPLR z)^wv~eZ(VwC0(~WUAI+;6+Ft2KE(f* z83B!ZW55YO>+Z%Lh6oMI^WM4xjdewK($aPPev1%cH|xgxgBQGY>l^D1HMQ)8;~pgX zF>l>{>AJ^R13yfRbRANmX#bWg0aLR%-bGuu&P_&+ z(GSQ+#!YdfB~>wfdtLH>ZSZd0iv`u_!IO=Sn!-yeGD*HY#kcTZZs0eSoK?Hx*-Y3` z%}jPCwHyv-w}s~{4zFlEZQA0~E^j?;MjPWhfp$?)y(Gfm{tWA4EU8eQ(ela!OW$S8 z{NB2c@*f+R7$iSHaCV%}lF4E(vbH4J7YVNZI@M~ri%SfH_A6|qWkYY`OYsrrI66P+VZyXotV= zQ8j{3hiye_(E2~U79S-Io#>(gO7}QpQxmXm2V%u7d|Nwwe@0r>f`OwdhX&vBh z3hPC&OxedP+d|PO4a}l9V1%35!_()SE}TzQBbm1P2ms9$Aym|6DqCzn$bzZ{BS620 zspdqnmgZ7&Q-OmhD_WTivMnrPbZS8}W!CyF=PdSHu4q%%L^`~zjdB_U!CVSDBQi~- zqrm&>4yfK-g`$1mOS23GXR?jKD`_%hrR>XQTNde}$mVJYI2~T8oOQcXb@$ha;qMX? zO+%R&qk^AlQDI}kRPLa+HwzOAmn*P`HUX#&&Wmnb67=Y0+i#_m4u|j zvs)Rc>hSEvJmTTmqWv1L>ok(lCR+C@ejZ0_9WA?)|13%Snt}qM^-Xjh97oak{3uoO zYC73m>*d?PV)eT|8~#-mU~%BbPR*0)PoLg_bRItWU=kpWdDk*HGGf}=F)kwGMU- zUe`4&FGvRL4sdEoHasSCL>p<}7XEK*iru9Z+wG1@1JVG}gg1CMSRni82MU}A!vMt+L|FEPQ6aS8zB=K*-*ES zFT}kjVgVgKH@@D!7v_pN0VuZQj$=vV+HK z*%mNhpK>colSswwP^(Xy8R**0148@ z))U*HG0|%}Ho)1QY@}0poMW?uD-q6QlGDMNF~np{*#ApYStU!xrm=_ zTJiRt2FM-O+$TiIw%iY%Q2D(Y+2I2nyBo|Y4fWmWSbtOO5hke4SJB|?<>+=w*LKY6 z9s)sspnao;bRDAYAaqUs6Z~)bo3( zjTwqFnu1-$?Iyt(W}rcSH58SLtR}8y6ccc$CqZDIS3~6QhXC zZJCvcthH)5m3@k#jYi)Qm;kmJ+G?!ZE%I{YCvdTee5bl1`r`kdAsWl^8qt`SKLjFZ z^b@JN`!X%}DOf8CLt4nRJPZ&X@*TgdTQ437mts=zf_`NiA~_oajgCl;aS+M%RDR6A z4t@r2*NAvsp9K@Vo*r_FR^kxF;}Hwj$?`gen12Y$tL#8_laWhA^{*rpdjR==YDcmA zMpR!=eyFB_jAf!)$cu0cC2#nSGDa__c(xWbEcy*ng98h3;lhO0$nOo+(IEo|Z9f#k*gn zOE8W#3Fy0cDjh80qnE!@4WYH-O!_M>Q2(RxI2^T7<55qTe?v^JMjxZ@{K^tWOs>{G z90D9`6r$(KSniJHqdSUZJm^lGka}Ikvry-{v!)1Mh!q&gzz?$QQ5#DrPUef3zlOG` z;k`Wdhk@nKMO67tUWgY{)}PYsw2-B_(9%2_eK5@>;i4VVlb30V(y!#HKgzs{5$*& z15wk3>~Fq%lK5N>!%erK+RF>&W2cpVlWDCiv@*PRhQ) z%kShxA2fdYE6UuaC_bBOMkLejP< zM%fmYvTZ5;HQ&|f61olRwQ6;}4yaTpUg8lh5o8^)2^Cj-P)HnYOqLL^cr`fzjXE2XHP!-4o`jZJFjHk?~*~a-?>7;_ne3h zdEE^(3>WXH0X?e>lEWdYa0$|dkF0eLwU|+;XuDA0c{G2lOQB8F*6L4T6H^JNC^oo172qGTu3u`V#=1TVVMZom2U0O{EDs#|6ScLmZU@4l zw{E{=;p>`$4O$;8N!M*}LQTN(mRwr)w-LCH|67^E`kU$=<-xHtkBhCYrCR2^-Ps;2 zXtQ;jvkaEvM8DVR$snq!e%*b-iyC3r4ZH))pfXX|{u#D{fcJos=zA%@m1l?RX-yTN z8es%A;_MmGaO4K8EuVyQ283U*Vn!HqVja%q!s0}RcE~} z9Z+Tptr-L|s6eHWJBx65yBb{7V&2KCtY)bN6KZ?nIdWOGA8^)t_z}z-oZY21uCnY1 z=$Q%XrRdEBZAWf{VhF~LXq?^m35Ie!Zi^gRHcF z+ah(vM!bTF*porWtKMhgyxmpeG?{(B74nLk>d&-l@E+;e5NZb%72L~7cY|-2J)>K;Ilwa~Ds}zam`~29Q=)h8^ zHMIHH(YAhBB4L{R8QHF@4W>!;jw1les_}bPIir!__q4GhY9qnQp$nLw33BIm1{-2_R7^K?32Wkey}ULsN@F6%(-5(0;P$LOSni@D=RYa|R#?4WzMGt^_D-8D#TY=P*LzESN8P;H zbzgepDr;cW?KpkmBq-XUkp2jc9ST-QeI@qPC|Jl}W@_6~zr3#hF(z_{lcK}3A;?SE ztfl*ttospH!7AS7DPf?O|5xSdbfbZyd94*;U=e~&Zw*&4W1WKijBLRuD_eOpIUxh7Uks`aQQVLgt6*&diKvJ^m!e`2%M;C0FI$Bmm*u?=*^ zO~9IJD~bdA*>hs|ta}dZB8{ue&ZzPoJlUG|0?DS5)4P5|pg6~b$dQa%;)7u`_}k3r zG-ANUR8qQvys1-02o4m*!1B8mXM-moK(A|>h6g6^!-d~Rez6(f4`;I(`JmTzA~9)a z3R1j@M#-LK1&sAP!-JNm)1Qi%Zz{@^ikNSz#=h$u<6w*oU)q~=@)^vP4OL%=$h453 zYDjo#wO?kw*5rH>@uhi%iKN7T6wpvB(9*X-5)p18K>6Xh)iV2Q5D(RY&~OUO^S%7d z5=^oF%X#_lDHsi2U4+ya!JJ#AysciBPDG7{Pwivgh ziDLw3(*btmm1Me0@`pz-o4o%oGJ+tYAo|8poct!En6da_fnRmB<{fxS>?Hb0`=C7Ho_%2MU)WnU=I>B~#v91~9r}zlMepye$+$_VN ztUmI@;NpjT7A2Xu1hZ&%GE=>m$6v{K;KU+sSZv}w?d8u>R3!J6CT+=IV?sx}ZtMYw z9C)>zCe2U81%h&PagRD>$dL6K7fI>OPw^{45n9rm36U;AG9-a_`iN@9^Y{WKgI+gB z{ePi2RU9Ic*NXpOOU@EM7NZd%XrdIuIfBtVy+VzRc#$~PCZ*LLyPNXd45<`Wh*ErY zSc+VUlNJwHt;kVtgTd0_sSpjF4yMv+G2E%u#VUF_f*vt+1-)TgXyP2<(PKKwKD>|_ z^Y2TmOuUrsiNs6DXQ9{iuK?Z&n98)U_+N%6Zz*5?4@v%P`7)ctZLpz+B7lroT>YOb zUq1ed#%c2(D_@QfF6{s^;ih0lBgP{?1Lw=)W?eUgSqyyf5@x6&lx$Bl6#oGYfZ#ka zlK8Vo*2OQXIT52Q{(u1-vcJF*ylep}scq4a0VEnaZa6u}R()`<*VW0;Xd}2wnwWfV z$0z;}>t}&kE6WE2d<-~c`Ou)v?Z{6L+xc+KT8fe**ZQpoVtaZfA5K1y!i@DgKdkJN zsfR2t!sfOW@5r{SKbyEom}GUymQC_F+fLYcE||krpZK4!SN*IHV~FNeG4^OeLOEdr zTH@%150S;k_s#MYZvHaP@y)~MlWWu}32@=5yTfU%;nxbhhgU5QfASoGD;i6(DU8^+^^r$653l=j+8rFAw_V($rJ4O~B4i#PtjB`D zmwXe{1RuI;uxNL zmHlK<2eDCU7xhR|{*51O82nM`Jw3@^?B#XyLV8kj+c`az=78ws#}PAF?Y`C!&fs^b z6kh&h-clT~l}i4GeP~`lg_uwwzaI`ccuyoBm~E$ZpRPAn7oCg%IN0ibwD?W(Isb?` znP4C01!j+;BSG=k;pA3KQaYb&)orn(k#go&dmmFU*zMIm zH-4K}`!a{vq;-k9?AQ4m=lpNp@qv$XKt$SGfWJG3xgpr&NW~E)FY;0MsxG*PmnV4H zte1Ov(INVrl*9Re5bg4z~kZ=2D(r%f7?=^2Johg|z+o8*P-SeVZGH zx`+R7_N-a6f}h>Q2Wkv<@7opZ?%V&qy7fI{r`J84yssU{?)ZrbE0`k+?2H@K>fW5K zoKCB%tunrF`LpiF6>;e0!$gZ`H4Q}$Al&yHs-*(jSi^0Bk+JdUwYi#BKF@A2oJ$MJR) zN9=9npJDNw>Y15<8eizOwu#r*aK?!o2zB2Ss;8Onh#Oy#&D~4h)kw{~$m9bZzi;fq zXmL?ute4+WDUx{FTm2Q-QMM(oq4isSA#}kM#c%nUx&){%0T}TM$LdU~_yQfVk~Vyb zzY8GDCy9_NuEQqhKctWj;iq!ze&)+c=Sl3xF#oMEd!Qwzzsa<`;;zT|ZMdQm^OH4$$7uLA@$0vkGi&jt^hD^%q$^4X)#mrx zOvoQimKAwyrq}42r*v|0qH@I;You(*nC%Li)@#%6XI*p!;TC=6f2~xozpOEz@j$557%v^x~}<%u_;nrkmHnJJ=# zu(83620_4P!Ky!hiyr*-=YQ$~VA_-Y`5Snl{KHbbV~g16PwA;#WS z`Pv>au(*CdRYe1gz3Gi}M8wO4=i+C=dAJ#mZ4oasF2+rsj`itqJeyU-?Hu!q_*#j_ ziQmEF+KtCaqF4rxV;Xer-F-oqzb9x7Fwh7a`e+paAA)Q$cw@>j~mQQqZX+)7Ybug_SSGbu(NTs0Y zteQ+P3&WU8YU~yhGshjjw{X=jfY>)p^HwqVh{-gX*z_kLHH9lq z4On)&siX?8won``#D2`U&F+p4blIm%j}|9nU8k5#xK@Vk%(*T z%3oZk7Id8B_vaOWUza#*WKWuisAU5jo>7G8WY=LywvmeuQ4AQ6k$!&R{a(}_j&gX^IWM=a0R zIeLr&(F{xd;8(D|9(JF`kTzhXKcu@bA)MOox2zLFpdjiNj~|8xKw(V!X3VJ9mC#@@ zxNwe|n(k6tvNzX*Ls@lAKEk~`rHE@Dl{r|I?XSmZ;&Ad$TR?%9n@j?Gcs zD^Wf6TYe-u@wz`Utip*=g?kaAyzc7Z6`OLM={5L@m^aVqQPNRK+(*TDpAQ5%!eF$Lu_3fyLU>6iky zOX{?9=FdJciRx<7<$KZOWqN z6rvT*qZ|r3WluYe^Wviu9EM!{G|bGk3-!s)n7?(GfBbrNkJWc>OR<{IP9CDZROizq zC}fY{sRRQg*j9W`Ie$32mMs~2rrVXb+pz+iUa;Bg-l;J#1j*|h&{1dOf#r4oE*eFh zeW$*iGLL3?bM7iWz|@5tDQ~4+t`nS6AYC_v{11>Hn-`RA z`?fWB*Rpqf!0Z0E5`-h_{N^_W;eQ@UH1Sh@c$omQ-p&Tnz0in>`vy`V9VYx<_cw>2 zilj7m)J!YnU=%CtvQfX#3c1U4U2kZ}*N$jN+{%!p;V|NgpYk_RLr!F<-`Eft^+)Ju z4Y`}i-|PP2kq!CvrEYltibBvhcRnFh_mAH^G!WkhkQ{N+`Kn!WtQPy(By~^q;ZnoU6Vwkp7 zQL6Y-%l#imR{T#<#d8f71Hx}X)==ER?*(A-ruh5LH_evf%bRAKZSbX`+r93eL`~Z6 z5c-tOxS@I7D-{cqW{!6ddgKcZLfTaWLU^Be-H$|xfRM1~#2(A~pHYDT)(y>fqpWh{ zvT>o-7mlcPx@EoN$XZ*XtP3rxtM$i%EKMub`Yy}*r4nZ;)ml3|>k&B1Je=z-9yZJz ziGS{kbi+sDx%-l~FGtIBxs^6@1YMrb31pa-HD@%n@yz1##3mg3Soo6_9&dJ2&lf*0 ziG^q(qINltGJLMUR)YqohLG6JY%vZQyd$v^7|7t!J-eJ8@XDz8YKpg+tz5_H)|aET zc(Q%L7%pmY+wc}IDV!b^x#^N&Eq*t7-n7M1y!-o(Y%!Mp(T1r+=k1?zaQFhHj%?@w zKzoG$9!DQ@y2u-D!7Wq@OHUbRMIfQo7rwe|gcyIMKwi&U%(m9yCz20p#aF!ejfsQ{ zTpz{EeG&xcyvS?KJVq&H5JMch@-Af)3UMfQ%#De$7Qr1y)h>X=j0=#NfcKSuA*+`+ z#>UanQUQBkF{}4{ixnDgLSIhY$1UB*`1M;%2Tsenx>N@5wk}G0<9dl)Rf=@0sBt=p z{921cGr0#JnJU@)=sw+aIHNWlUOX-xwoD9XoEc6-VK}WJ9Sk%EgL1+(pO~%bx*ddy z&RwH{6DVr1pnSq_nO2>ud&qB@ajN_TW4)x=nr5Z4D0Uz2UoCfnkDL(EW%!qEk)L#{ zUb}^s*jouL8|xm_R-&RXB9mj=A`FxsoP4<7t>C;LvG|WEuv(F zrFCL#!1*Fv${=7vrOk8x8P3%ZkO5e&A{0lszVw~-I~VAG1WoqW-|GRknSw(weq zjQ!=0qm|>5rr;TEX4h()UOVmX;48kidEIf=0dnEVWrKTtT!^&XZ<6cseS?cj`)5?z zrkd0kM#MJjiOVTMafBC^z7v-1q5f!KyQ2M`pGIxlR~U1)b3=H9@0f#OQS^e>wb5P{ z;6*f}U8i<*pGG$D3ire*iw$5t5Zol7wajQE_+SZsb~u}te-AVeHBuFiFrORNP!k2f z126y2;07NWqLwOypjXOV0)25M!%d$;}wM zcZoOIh~R5kxE!rgCVZ!iabXNpkU|ZA#Bo6J-aF%* zY*t$6$tOeY(NeFCQeUUk-%{#wQMi=o-ce!X8*1Y4LJ2SA zqkSi=R_X6(^bo_)2c_LVmQkhwBTBj$%mzc{Qb_}A$e-a*9fcj@VE00}-o=ABjwz(V zsWk)}hz4<{Cb}Ji@WXlW4Em{X9@O@D`{(@dVkoT%O53vJ62D~@RMvPTmCYJSWp4*; zUj9O$9(7&ac~dGoSi(zVlEq6=7DnUHv)u4B`$^&H@;AfN0gWz0zJq6>Mrj?ME9ov9rx!@w9OeT8PWi;?FfX{yN~iCQNv9HjRyvjFmY)bYxQ@RsGojeJ zYS(jSOem8wDiW2QKgc+eoF9;CY1-~rTX6zpRV$*Ye)=ITb+3(rDWGNB!{=ew;JxH%NnX46<4=R z4?_K`hS~i66mdS&Y`vI$b8dEGsFIgNzPwC1#JyN7_g?j$n1ZUlv=YFxQgVqma&O+O z^zww-q2tC~-x@DPNc@R)5?>MyGs_w&;xj}j>{W^=G7U&RHY;;2eyYr_`r`7cTTLch z_GP0{zR;D2hOGK*-^xtt7MYOFtYog_JM4O6M*$COTtdc%^ir5e(?a%{;lpDIBcjX- zeR|~bjP^ngVd9@sM7xBOpj=q=5us#mpoQwq3XbJr+;si6o}VeSrMM? zDQ;yV{oMq;JlvEQzB)iNwlnvu*l3nw8Eq{djcIG$B;Tp{NO_bh#l(Y_XT*cnwdKk9 zx#|4kkv$U#uxuhJ)xHE^SVNN7;Ud zuk;lmc4YjpBD8g+N!k%uAH$^hN)l2Z7vf~UJdkHxN3Hi<51P->-}CY~r9TnW-(P7| zC_hHBBHX5Se(|u0S;r-m%WS}xS3=V;z~r#bw!=xA?Davjm9v0ocNu5Nav>izr1>f* z`((9WZ<0M=bJzdIu5>D%mY;Y~+_tVQkE?Dh?JxAHT298E3rzM`O3Uqd@|CW<{PXF8APaIEZ~N*7(1|er>KY#^srk z!}2!iZ-)IvNQ{bY^b(nG@w=U{es1ZB&v=MiF~R~sPtAgpWhFgD%Ah<6(P69^)kqlO)9*7CqUIoK_ zVyI?;ORi&bZ3&uQ!tTfTdm>9-42ryIMr3tUwqM9zE)^5Dh*c7X3@3-gs2D-(vdhhj zvM+%wQreCpafX$U^QXzP`tTCRjHT0SD<=HS!}M*_8e>r)MwOL4*kdfBXZCHygm+}^ zVU%a$vk6qMJY{zkY+(hEEVbVg_D&1C#M*jXsFfiVyS$N=QHD>sVAJo7%7=_%OJ`id zWwsW2xYWPlmS)#R<&eA={mE{ZxNRf(s!E-_BiT*zmC(z*{u=FBk*iWK2N+`ZocKOp zewcnjLXs9r+5)$j+4VxE9WEYuCNO*Qq3KR}E9u@n;RV@fc$7_7xx_9>X+^xv?P#4U zd7}(-8;vhS?-DI9ghmb?Y0_43UG-lw4zVu(uA{;eWx>9PA zJwjBiZ3WjQt%c0caIe3dbUCPh?L)Rx%B5SfZDXADc+fJ`x9nZXrGsA8I$tTVo_6U z&~(+Q*C0DyO!kWjqDLGMN(jYgBDtTKH2g%tDMt4nlPbjWab;{w4$xL+1NsArNu_su z(@tn}Z;pDHFPfL`yu^5_A6=l-S@gw`*dzWW5__Ruxgag}g^?IBCA$?R5~mvC`3Dq< z?WTCAIJ|AXa#%@53Bdj%(Qk?cO;?@zoyb~|Xy!31&gr{|F=9|$u?kLNP##H$WnVLv zW~sbrc!=(d7*!33(8ctzUhuFUo#9fd`Hj<+t5)o)94fV$sNBq{qKt}AnM)o^E>jsGbm zN(`)L>+m)wGped`JAH>S&d#^Gt;T1#$@y22Xgar7qKptnY|^+Qg4nil`GA2)%Fb8#+bfI#=OVaY0hTFPO*_HCRln%g4K$QZK+1R zv{9u=OG7)qym(n&V1+x(g3QqS`iV^hEF!y4y z+`H6!!xC$}Lygpm57H0R2-tM0+FA}kn zvh|ZEFVTm*ObK%@*2}$Jy=OEBrq#iCkoY70K;f5~=Z1H7+FjmIiB97uVE(-2Q?2{eijBq_fvgB(!Rzb=;vf zO$Cya1ob}{X7@L=mLMj@`=e05LCkVv^#yc!iPq$0rWVCwxgS>VX=1^&($J##ApJmT z@o?5a?W@Her5e60m@4WNTB+=th%nh!>9E^05P|4WMwGPpuirz5sr~tk@imDTOOFyK z^0VS8-o0HZy+b`Uix(-YLhsAAl==;PoThj(3y<{;3`xbk{AZ4HTLZMIsLC9mm3)#O zpjG3el4at9sqsAtkIzcBirAhJLpbWTqB87^$vOYD`Xef>SM*JkbX;K<1` zUS$;fPh%gIVl*(x6LL`Gi>&*M`F5i+>6a7`b~2(uf$wIuPa?NNK3{Ua0HyLZHiL8A z;k77v4MU2?{sFQNAkR!A!a3y>vtu`IVQqw6#h&GeV@QrD#GV5gfoS0`>DYOY_isnPEOlD%fr{&Y0JoY*w?bF&icc#seE9O z3Qoz^MVyBnT7(YIv8nZh>ibhUGg{UA_)b2xtca*ebHLa_CcasHeQB4_cjX+i{&8dP zpVHhiy@ahdHk{A+azRvfm{>oNp(*@)YS+2s2x-d8WXuxTHE$oT{3+2S3z$2h1_4oS&ol|xdh$xq55De2-d zUCMK-JV_N0jmx z1lcR7SPGE0$jC;9PZc06ep0@sz>vZsKB$7{qBlabOoqY|ypEstj^!U&i1Q*P1+yr( zs%b!**~y#v9l4z!qHSs14j5C&CZFxcW1YVbwdWDT{b330G`)R;O=~GBc`yH7T*7;4-emN_eDT9Z7;>P})KFYA4 zjoJ@uAGiBhbGcW9iN&3G@zmiYKi=A1s#UW9f1vMV~qu0Jipt~OeBR(;5b-hlhr?J^(qkk723 zJQrWB+Qzi%UnyDlPo_F<_Z;$y<)_EvKUHr_CAog4W|D3>vtfVXNT6!8o^|8QF>GEuy&U!l1k&E?o6y~R?+!HTE&Me=J+ALl~?w4}H z%KxdNA~XL>Ig!r)*lK)fi@!oHH1(g+o)9a>X8%Z5_Ll}!d^5t-9jaZ#B7W)H)r_je zPBO#G$ug%&`eWbtST!u4uqfI@RCg{E1NSmg(4C9^)6XVfQKsZXBRx7_@} z`1Q#mTl@wZGDcORyhW83l`~MgPBE(zzEwUgRSAoj$NI$7!yY6%m|gDEd_JC-Xe zn3w8iOAzVw$m2i`nZ;q8t;gNr)Nl0aWd|Gj@*k=XZ_>gsN9mD~>>=-R#Wx(qX&dQM z`GnmnI=)74NVRTNG09HcBYt0!8asTQd0U;YIx(2sM( zNLC9J38Rr}RC_c&DgQ9F-$rPQS2aTCA9y1aqcUP~He2-2)?0T^ANH$#pV#M-+En)_ zzTKKwn<{hAG-qHfvJpd_E2#V2 zHP6aoY!552%@x@k)H^91zpRHSpLCvR)7EJ2-?S?WjzLaO(N%j9!%FG18CtUpck`SYfp-Qn}gyKjxUJ@V3ni97DW1YlI(+6sVvsWUB_Re8@R){~oZdzju>6)H7 zSnNuUYu9S=43)mLfw1Msjmnmvi3@m3qPNeZ5tRIfVK$TkL3iSi?qd?gdf^d9wus+LONG56)LWI= zEE9Iqgvwn<(A+Dp`P8sOs`MRSHRa!694TvuC_9yJRzLG)rjK;ZI)qLBx^Cc74PRLE z%Ot~!tNM~ThJES$5*LrjdwsU~&d5g(h=c0+F4Q_}6R%)-GFI(A)@e$1jAcX(3y z84GdgO;x33k6pZjy1$_2ct9D+syY7m$1WBzcCm=Di#$r?u30RhW$a=ngD>h(bXCqt zJe_@wq&*2Tcky?rE~EywOPW%f8fC@&G_h(fU1(Je<(54oLm{`524pBCP%v&GZxo{c zl4~RfRfwhvdHUO@sGTS1Z%^Gx*(6&e8(nQRWK!S>E~}-2 zFq|6V1AewMDxFz9ay6(TqboA9A|a1&Q_1PC?yil~hsb%N8s_cDrTp~XnXGnyf}E`~ zi+L2N%oKR!aMGR3@Md!{?%DNJM!IUstgQj&D=pHWP*ZcH-e8LWH7P^y5K$v*AgQKT zOjJ!L+0iew%n|<$`Lk;-gE)UC1!}ov?-$2&yL56Qntm^EqT9;4R&{Cw{S>T~f+Ss4 z(Ih@a&OIgJcg;0NG*qM99F#hQ{qT&z476OlJFVeDL&M)mYuIq&3bc{7K1;J1V^+;* zc1=!vjuaiN_K^<047Z#0np$Dl;FAhThL7c`)xp2Am~=Od2(h}b)`ChZ5b3ucS*XO8 zldDCHEh1D6R4QUE8Di&)y;5x$Vu$U$R9rjJbWOxIskM5C9V(I!W=OV()ftkTl;r#j z2TjRX5t4tV=%)HtJ!Cn@NF=2~ma6KX-nwY+Ld-YSwGQ@>b&l-a@}X$7)ENuHG9 zrVM^uDq>ILpxR|DyO$~#&6^-J~F zoEa~Tnq^M5iAVM|(M8?k3FpV#sZ!PKpW87bnK^zDMcvrOgtXqGaXDash*ME6!}k(# z&zkL{TP~Jl_FwWeqkVMuY=WegT8?R*7#99I!$SGGZ=@k>TuV~YnabKSGd-jlZ<|OI zXN%n{v0;4AZpyIxGt+L%vu|G{p8bnytJRp>&6q@7+P33cxLFz>X6R)z9_3lHZFZ}& zP^}3^C(ZTiq^`<^Ej#-wN& zSDm*gACe`X$nE?SiAj9OkzJ}a{?UaJ)ke0Y#pSgm}x&+w0tzGq6kD8pe^ ze?-onlmx>fF}AgkS!=!0Xk*e+kC3TILVe2D)lx<=qN<4VCf_!T*Xc&lD@xJhWhoyC zu$=idSm{?*;&jD?nCcBFr`2p3aY*|a<3nY!^%w+I<(q1Q$mWbi&D+T8( z$JKroQE^1IRwj_PjMT%lPW6;|S>oCYQ^%&7T3m}yz!F*gnz4UM$$1%PS5~RU>W}+L z-LlF!i0#Ja7+l;q{SJ97U5@*3!Z`m>HE8%!I>;+_;5H`KaxK%AHwyWAy6#m|KzSq< z%a2XHLO<={BIFG|BIPxW5WoJPlPNhjDmiumvc#l?M+2#AAs?gXJ|>1gZ(E|#wtq_X z6UCS`0}pRE<_Pm`ESIrCcg@z6XPNq^Om$7&V){(lNes;fn5e?GHSX|_3_Z}SS~@)_ zgIF|c9hi}$MLPrd66Qs|^}=Ue6j>Mba)INw2>GSXu;W?8c%&wy zx0~0*xd%;28B$76WM3vGmvat%&SO-+$vCB)7J5N8WcyGOLwMQ*_d4Cir!h~s#?Am+ z;B`K`i_aMsR^vW|(|?9L7?>4u2TQ_bH22GFxgEy5i&f0?LwC$9XNC=Z0=8RIL4iigmg7sM zr)Ug9aa1sadwix{M$yBzbhKiPgK}qh{WI7vpW|}<^#f(I2x^k8??M$PhuZSPmHse? z=o%(CO4nZ>TILE>%nh{_4V0CNQS5T45%<@`mmv;RG`4>!zELTj0YnFD1>{|gp>`?U z+VLlPWu_S4q}`$Xb;c`pKpZZ3Tqf;wVj#YPBxChkWsBTO$v-l-6 z#=x8hKI5Y4ZqC->$m^|gQlqDI2ImEac5}(&%l##x9i=lGIYM=YI)U}oNv-vhu54r` z{AZI|>L*>%NZbb|aUSa=X1bJ4THxo+2c?rZlT}V;V3VVdODB;km<0b6)7*K&~b-Z_aCb6HDJaaIOTh6p0se7f%P{lB}BsPgDA~P@K zXKo}Tz9gRV;zx7W|A?y9!~RSXB^6;#J3XVu&bnU8I`${bi9bh~%F_IdvdnH2YOM2? z0xx@=HzVJY9i^B%mY3%3gyA~b#sT@bu%lGE$$!M< zg7=tE#&*FBH?dap)GjY=jyNURnD6Cn1ZUP!ZZ^+ex0%i=--e6#NLT7=yXwuBv|laX z_YcOFbOC1UNL5N{BxOy!0@wJSAF9ubAB`VPf3aU@J%_&JcD&0l7%M?lZ4)dHpGu~z zXVs^TkZxFlsBHb#H6`li%Tw3Vr_@&`Hd>WUDc#2RrheJKvGggN!ZC*^RrX6Yi!T(R z@{g#+7!tAujb2LbWLm>k6e&d-+37U0mt0CY-3~pW9R<PrUung(CPyI~m%8(K>QsU+&*QR0P`0agXl5aI)uC<6tysPQ%#qr$EJJGH@uh*#G4}0bZM)Oc@4R$`C zK0lN(NZN}_W$U%7&0;d&utAdL9SQ7k*L2^jtomfKVUDSXWT{RGleW>o3-j1X0Fzp!k zgb{amrXDNG+Q37-vUc&9DZ!!cxn+8fNHHqtCYMX($}cEVZ5Ay2osm zEj;rSzbO)SOsb&Bg^1=E4{lT^;jqu1ir9-()8BN{bPuH%^ANeXQ5_eA)(zzvb|8e7 zcqhIw-d&6e3`H?^E8z`b30xp zBbm442+=%quX)hU)dRc!I7w5QHkx89BB8;8=XP-b@N?zN2rKWJ>Xgy8hQ|+E@eQVM z9O?<%f3)e+51ZzCia+y&j_`zRZBO&rkaDFYyefyHOvh5ya2)1Bev~KA8&`5UWL|Ro zSMH7f&Q0$6-}Aqx>n=5EA;WO$d$H+L6}jy6rQ$$Bcy@S}Q@_N)+&fZ)-P}vEgv}(S zU|ozRJ6<|)|8V#Z66FN7LN==Z9x9LDMSl`~+^hU=`B3d*snVl0-X=rk1ABH-4Q#=y z5?0GB^~3kjZPo^y5owT4QET`p6nQ6wA{7LcL~)|+brlw=A*NU%`3V+wl_gU_p_x0( zBfKTLq=Z*Fq#&Bo7u$VK*i4(({5;1r2QhE#MLgIxY=%b!+Idd%<|X+azl?fhD)SG& zW|YxeY{idV`$qg)YGTuz{x9EVJH2mf@n7*wzn&Z8JG$Blk4TyP*W)wNBAe}{l4ATq zhJ(v%wq{o&x9k>`JtnQx`0r`$>NBwt1#ZMoah(UG1&L<)#lL|K>9JP5N@Qi@)vdW5 z?-6gReQ#J_QxYsUXTO!m(I8zpQR!xgE&8#BljU-92(z=-JB$NiXB}*8QS{_=r3NHrucih( zE(MX#uvWh3XIbl0*2-fsm7is85l{7h@Bsu>{Qw-FPW8gzeg<_y;90OIR z4PG(e%`yLH(R8n8W-$m2<`_ocA&iJtUh{REj z@9VwaqBX$IvJSo`sdGBE=>IB@QcaL;sV2y8v0>ydY{lplQ&4n?UMfZ$+fg<k^M#_o#=)wbWSh zljnWLr5Nv*OVfDNd@M!=Gp=LiHIJpN5aSdhqjDui6Y1A)q%Wlam!DoaiTo~=IJJ#k z>h2%kj|FsqJ@PtyaSmso=WdVh>`}2Xe1_g}w2`K+5>m*j=j&f;dr@wB#1IAR44IE>$f-xjc}%%dQ_eJM$hDht zGc)E}nDXis@>5Lt98=yDY2$M<5#^x|Bq=hZ52Vr|FFn(z>1Ul{#wm%_BMpk{XOWZK zX0PN3qf;W^SJEB&tDRfR@`xp)gKx(3K$#7nD$OEPgjO#zgq-Se_-gOgvLX>u_hw2M zD9g_fszPY4A>@_ETg$3MKwXNYxsDq3xCM#hDrErr$|-t>f3q=4EcRPu3@*%rFzy z#ahG4gA6OF(sRU;cjG}N=22pGtc-eNMI>0n3`T~AwzxM9=SYQySH3Rma$O`NSt7-y zTU~l-rbO*x(M$0|uwqQI>1AT76(yNTrroHQm5$pXawQ|XVxPX3QRes`q#M`Oq4rrRp^OTO4viLr=ut-4ocggJ zSgkZEWoVrhsNVbE-CeWH-n&dLXS9%Y#uDP}3GZwt*Y;}aojDdMMHmUW5l0wZOO;JD z(v%HdQ~yetCIy+8lcwKSJfY*Hgpk+thSx_aQp7j88y3(Na(CURf*=Es`AA4{J54CV z!_HjkpG(t)&D&%+COmB>tHAWjPs{4QWOQBR%YawH&WKBg+IS~imcx*s^k=-{s5$`9 z6RuN3gPUH@DWC9s;2RR-^0quQRUJ26rLLFK6AG`iu z2(m`c9j(B&)2k6Cy2BsDNkdr0k^M*TozCHf7QHpuZge7H5 zE)H1vHZ#*o!g7mB7V3RdA@pJheV zbZ~-c#qO_Vm{nG+r|qKBh<+x0Tk+KK*r&%ZsB}esDh*#fJzSPwQaq5`VWa5q5N`}$ zGW|~!Psi_8Nv>0kUc|tBqfnYJnMq^rWbvj@#dJ=67A4ngqP$@Xr=08eTa1<03?L-N z5GxH`nXgO}?~anLMH4*XD;XeWgisAo8;+NS*D%b?c%(ZlyQ~MM7cuM>nx8*Vl7pMt zz``6!e9RUQA4p4A%s6N^PAlawn~>K=I*Z>kKeW$co&+R&t=Vb*P z%fiB!Ji^Y54XVIvW_9^V&acVAlAGSj@pP5Wu~UCjByfr}hm96+Ix|^^qovnvwlkz> zmnAU6W|EUm=WL^@u#1kQ1oVXJn9#V&7Qd5}X7$h1xS}z=uxv-M?2GBh-Ox|^<=kv? zdyxp|uHP%Zdiy25Zxn)n3 z6hA}J z?9)ehikD*BIS*Nx%ASaZ{0{Be&^i;-`^E_1OT;;!gZQXopx;e|QI zG?cDejCKOa*QxJ5EF~XbEz@oY7Us9;eOMg-h(5Fa0!Ga7nhnfb)3>JY-P}jgKaL@! zFkWP%EDwH1O<8e=59Wpe%E^PLbG*a3@{rM;s!g1clgC+cUuV8CVU!3*m6f>+p_ zJ-En_HI`Q0B!YZyFjg4Jpu>@OeT{PNJVws3L$wRX+oyk|J0hFge~kTV<<^AJV7Y0p znlUye>}cgvXl(q3xz_xdyh~a9l2-hWEEx8$d8pZ1BNxvpam3l*w4k9ABZ)noz6F!)@Fv1^1o`ou#%saPN&(ZXcvYr_DQ?tRW4l8O!=Tw>GpLybnyuu%L*VNHU5sqJqgZ2fbwa(0F(B@P-=_nT7p7*f2jq?oX&zoEV; z8A1G$DeFqft~Oxx5i&cohqqrzDRGK*i0ak_($QX^+7AN@j271d z)#AEP4z2A_k)eMDCq|x3S-QXTa@M_@&rDXP`*MC!;B;xat7^vl{LdG;3OW_?^=cTi=pm^7|}#EK7h_^fzP88hN1!+my&l)^N$^AU+seg1LcHVdYf zX@(2Rvhbm@C@Z{#c#;k_rD67XqdQFNlZDr#vI?Fv@5AMoJljUpnC^woD)=~l>)Sic z@?FxG;oft{s<7hZh4HsEtNgE&MPA}D^zpWS335zrmwL+Pe(;%HmH+(J?T?ZGD2QgT zL&^-k{yb{GP)?GTull>*aW{M{^K;#s_8ja!@d;WzM{OB1|0vu3&y=3O<__mz;Y4>s z)HOes%^@Un%$P61wUe~vm)?(IO#C$ye|wpNBJuaW{tES$@Sr!v-z%M@pnS;|DFc5t z4ZQgV1_l;5)k{OsMxq|8U(uH_E^%f4fRWn<7O-5~C^;wV4>2IjcFB@b+FrVFON31a z%qgh@iwtAtOx1x!c}gmDp2Iz`$ne#`BEtg%i&VQl-i&2q^tDVC2u7uwPd(d~J2K7i zj|(@W3`Z0@+jdC8pztGKJmM0s(QUBlAMnLQ+6E*DjvwFy`(ygypNU=;ptF_yF~)=( zGXM~k9wCZ*iku_q{YXBXk%nDbWq1)L_O4rGo6zNz@rd*C0$<4}Z`@sHoRG-kPp)QqURa%?wO|UPW(%e; zAaG0cLPAGAAA8=8RG`t3!HoR2kdV!Bv-lDL7g0EcBIP17V`6Y>Dn@TAAmY|NYTJUo$F$>A z{7I~@Oqt2b@2UBU@;xQ=A@1bsc`r&LeP8$Hd`x(A*DsW=p-eto7j!UaCEZS%kS<9) zsuwo786T~GsWj}&-B7_x`Y@^b@{v=?FD2_9ouDr#>6aA0-1Z(pI-GooDSi8^R=Jrr zcY4YkPO4G$Y3{Dma*%jLYC$jdOZ}|ZR0~Z!5qdxO)XBf6wl2y2>0@OD(vK=- zf>fR!<~xc6;zf~_b`)Du$;rliv`ziy3osnCvvVuC z#U_V@cAa+q_o(ATud7h@qecm;Xl_UDB~R!}hmAOyB9m>2n~f7yusTkr{xv+Gdn*3S z{jp52#!pA9X#p`s*l*wZv`jVO)*VTqQ?*U&Ky2=tEhNlRNdf+zXyyp( zezR>Gi8Mds+X%-ZTIxN2^3$Z0k@X~w5EuIM|Ja#~%hW_344=Y-E%G2P{j~=eMl+IL zyq$YV>@?QdPcEzv@3wpJ+~-KUs1Z#q$=u89T_Focg(*xv_YLO6}DP<3+Ei$3`=B zhTN#;BdyLRtjKKLsP_Gva#lRiHrf08W62YvNycouzO{fGNnh(mY)OioN%ErY1Id+? z{gGSWPk}sHp z^jd#i?Skf})<8?O*q8ZJ?=x)2s?66~@$!JXy0xCi<>qC1Q=nj0wwL(KYyApln(m#m z{PMb*fcB;Qe_2cQ>W08tEl}4YKGmvM6V?{3*|2J#u$gYQTW*_lX{^^Ut!Tl}*iZxKmoM1qJ2a`n9cQ=)RZ)66t5^9Onl95w4sDI;+uFKnti*b(4K%E((+tzCjdgWm zJW!8K_05g7mfXHCYHDg%H7oIySst~nsq+U~{q=P%buHDk4Q;JvoUE#DwJvL_{jF_{ z*{{uK^>q!G)dw=;&5RrEtV3V?&fKS-^qg5Ri)g7(4p#=M19e(Kp`j&H!;+pdUw^6e ze+6?EwKTUi)p{GNo9fcerVJE1mj_DgR#dk&W<^`-{g;Zr zrDi#RbcQb4QQv-sP%@++5I%-=t_PKB52cK%X7^mJ|NhKttb#?^Ha zW&VuI1=Th6bqiY>>Y8dB*H+dA_W!b+qF5Cwt(lf)T+cjhd7!fHhi!EfJJpTltNd+^ zt##>eSBmp38RiR$mIuar{b9~&XYEr{DXrC1H`Y+p1?ng$gp_dQt)#x%R?Xj1S4&a4 ztf?kdxfx}JWP>_tlR(|lmg=U~70oTHTD1iWN*zWK=cs8ki_zA#O*Qo`%}otg)Mb=1 zty-JE7U2?AOlRI1C9F|Wi5o3V)s2-Du#I(I}^rnp#lZ*top9W@V;D=Jn!2iNG>`$Wev6Sn`_rD zY;3L$s3clYkntFkT6_MXFaGij@-OCbtZwO=hSrQ^pDGPBtq{?1OlY_L>}T_&eiX~z z_{&kQ&yv?Z!k?54nR#C;pjC!^fa)KlTX;`BdE;5gKP>7iUA{Unzoogl)?Z)US||QX z|HS?DyK+g=D@Z*l1Cn1werZb`aYr=NW@Tq>v1xx%x%qZX1QZmfZC_Hob}8u~%Ys5@ z`h7|D^5tU<6ym-#KBo8hHY+{ncjx<7MHOWmsG)pcV6*{TvvLz8GzymnwdDq5oK`g|{q=fC|& z(f^Kq_V51xvVM&GZWd?h$j;JP=FQ@nlEKUZKUEHvQu@~fnp;x&b+%EWmZ|z7Wh^V6 zGKx{7ZImv*G8~k2nUeqSw4qYf_1FZb)tX7Wq_HvOg31lr()#MAm93{9YE`?G1Fc$( zswpbh(1Tgfyvi?)&dg_0P~h+XT(~E>iNAvKJ;~|($^8TTol>(W`SGQDlI!`K&EKQT z_9XA%7$xC<=dT9)GSrm1B>(MOLlw+yF^W2)X;8N0`%*)snj)2jm#X}q(t@F9@AtE8 zs;sZ}*I{(Y;>t@4=1_KKSDIyIg%qs~wU^PvF$M=PQd3PelU3RO-}T?643w$zD=XBh zhX3EuU-5YLQ7U51i~kSxS8$rAncO5}J|(qOyM<%@Cimm}Z%(rsGWkJUUCUZC4U)R( zdQj@q{8CA4Y@$5vz!T+ZDp3}W-;P>QHnT80VH%F^n>PRd>whEd{$KTf!L00rBmVT$ zuA>*UpPEDlql}-F+AA8H*EkxQ93>_5=b!8_l9Iz{MbtW0(1vleraBC!m{z{Rv9`I* zQB&Q7NqBV#m{V(- zSFyPvKd)i9p{b^^t+vily_}{Cei6T`uHVVxOpAlzhk!gg*@1thXW(dF;W(#~DrC%W z-@+x^z<8ziIE8IWXt6ZXj0C-a!nVLE|67%B%2fJdCgUN7aWCTn48ThNwUj}%`hB{_ zN=VxCMvkR)$}Y;)dl^4Sw;T60Q%HX+{a#ws*_KHA!?53|S+gn&TrljHYNeK5V8aT= z42{s4L6Y}|JfTv(j%*tW=9F4pUCJ(_*GYeB-mjjoul)KSpXEEN8s8YxkIC-S7)}|_ zX5wFSJSkOO;_`}y%i0WGn*Q1!7K;UD1jvw8%94`C%bHsn0`;qi!j?KZ`wQEeYQ}V4 zu+)e@v%Qv*NlWa{UF-ScLfUWhn}huOvQ8^27E1@ZQVqab_57EzXYowZt08av|D~ig zP34cWRsO)*RNy~fVOGFRs@{>+ejCT_IhAYZ)A4y?KXLFy@}C=d_+jzPRINuUsHt8( zUJCdePaKf^=XgT$V=CC=BwQ($)}c=DuKcWPX7Xq`=HFz<3Y2|*nPx5XmRWYM&@!*(p7Qq* zg{=QR@0m+|N1K1Hd+Cz$lEsTWWff(W?u-wR6?|DrYow6kX8!7WtE@`Bw49UrXK{0_ zH5`#$Ia!7>Nc(nwRu;@M8#QLfhan6GgDjUVo0oi_8ueV&Tb@}t>(a8qf{L|Y!ULb@ z{v6YNBXvmo_JF*AFAm%zxc~kADxlcR$t8`AR3^Vw1;)obBiWiaRhoHmf#ie? z16CHuh%QY&4QHCkd?(j3ew_KfYK(!g?=Rpz-wMyX=bn4clzeE`#OVY#R-W=O+my<_ z#`uAfT2SB6SgX7)CNo~BXUhG|r`Uh*W8a;_cVrLo%=by7JyB<<$ZQQ7cNg&SQtWIp zZqb|SZQ%hk{iR1-lref@ZoW)sg~b?ukxp9bRaOX%@gsSkRT^cP$-I&B+3<#C-e?on z)HCvDgh6ZU*qi)>zme;VzbDu4O*VF>??2&Q-c7$g{j7A|-sH<6(kU?QQdJ+j)o1h-4RwvRON}q0X2d10U1ZoXOnch+N&Y*>&lCW@Xw^~>ThI4L z89x{!a@z7Xa!8q1HT44wF_BWF98V24F5jn2E&f4UHC;NKl%mxti>xAee{Re3|99MX zj_Yjm5tGi4KzN%Q*YW|OrJ8Za)bNMtDQSOd;w57s<Sdx|F#qHQKeZPso)SuLk zqJr`4Dx66d(D-&MDxKfbMlY+mrKYZINk*MqK%G3(?5HZkG+EOrXS~YHbXq~WcUH-U z2FzJfXfACfcSu!IRmYsH}SzpeNCG+uaLSWwyK_Y)h2+!26f{O-_8BClp*D7$bk3!j zskivj%3=miv9CNe@S$$W)HN$`%yl?OQ_h&vywzGxb@Ux#J zhq!jI414vHGYXkja;=zA^LzLnECp^^Q`;(;9@5;R8a^3cv$E?TF>4lNsd|E{DdRDB zcq+g*=8PGRnP$^1Co3Q(rSi%&s2+c6)r-dXjZEW^i5pFqrE$*cI7^vbc+LtY`Y_|b_-LF8mhl;@vOuy7YD%XEiBzvV${wjG zn^~X+s;!Wj15~8ObQo3blJXsDNX6Xv!%$KgjceRgf#}mqk>A#`T+NA$h>OESPQfzfv0bpDILJ6QymdR+-=W@C$QDXcO-L_l3ioV?iia!{Qr{YZ zwOU2Sr-9R-`r5TG{{A1dGuv6z$)0EL{a4Sft$p*PyrH}|^^+<{Qg)`>w&`&Vd71e< zbKHZz-b3`a{)ju57AB4z8C~=gW5$|x$`}5`l%{!GnpZT?{6KS{y3x_n z)+7@h95OSO=cmqG;aJsrq5~^a-wTefvCZlFPJZP1Q9ue5htN%ITUoubj%Z>rib;bF&n;SCleGdH#fN zPCBE}rD;=Gn&A88&SWRo5jH~Ue}NvSY>48Upgp-`XHvuT5g+bMy5P5=5555-@I)4( z_Q6YG3~qr5cq-HC?X**yp%Xp^y>Kt|!-9{Ihd$T`Z-+7XM>b+hz;~d1p{9L@?em;) zJM_Z)_973be}X)`4fa7hOI%{`=WrDM6XwxFDPYx85xf)n;7hO_9?n*!J+K5u;SsEY z8-{;}np@NEn(%Sb0bhqMxCi=Rg0&6#=W1FJOE=tbG3-Ncx55~_3nt(npuGewLnl0n z^(tOi3H@*djKHg4AB?~l`~^(F`=N8brY&SKKo#5ogK#74hL6I2IByF6hO42rK-2Dk z4tO_o!6@{>A=nOe*aMGYF2Mf&pjNJFP0#_` zp$q;3`rt;`4qt#ha2Q76J8&50u$WRi8~33D=Gf6AJPFprOJFCw3--bxI0%p7#33Cn zfi|`R?S}bqGjzi#tUs!UPS^?0hP|*B4#J0E0zM7xY*Y3Tbi$)pu;GO#LqA*yBd{L! z!CPSrz5o;O0@keAEASt5!tKxti&*>Ohu6Uf?16o7I$ID8!Fg~L_QJfyn)VMp25oFgr=6o|7eNQS0=i%~^uhaKJNyXtz|UY5+K)jV9tSlq z?!$ceAap|y3kB=p3fKvQuovD12jL%}4sT_7h@Gu&hghjv1mA&G@QCl=Z#W%xLl5kS z0XPJE;3#xXC)`WO@308YKOTALfkD^~yWwrHANIl_ct0G4F_>3LK7>VZ$_dEBM`1hM z4twCV?-FiU3WwpjP+Lm4paUM1Pq<+|tcRDtPS^o^;mvRm_CXy!2yM$W?PZt`H9657 z&V%*P3p?RmuovD32jL#5!^2NPo^m1|c3(ukfw7CRcLx5tgm5@XN6=9lvvR>8cpF%R7y z;s-8)_2}aw*a`1~y>MOy{)Zl@!%Lv;JmwC-e0Uvn!`X|GhxM=%-UIvKv~$oayzvL* zQ+UD>(ktU(Ug(6Yp%>l({qP+afm$W<@CX=#`7iF!vs8dDe{cB9S5CoHT1$x=!d;90ta9pd>zK%<;&0`+ywJ3BpzT9+ykrNH_k<$ za2D)_-LN0t3y0ulI0_RmkM!m`4|(_mtb*59ArJG;M-CRkA?Sgla0SdGeGWqxyx;=# z4clQSybbok*%xw8y7a;!;{6(!NBrIaqi{1EhA%^{hJ1Vx`42t{T`&QC@X(9Nzi>J1 zg;&8r_&iL&?a*FJxqJ!XfIe6SuYf^#3+#sX!G8Dz9D;AaQFzd$_^Xcg2rPnLSOqVK zLD&JiVGrzw55gh%G8~0DKIB)Bo?sDl!76wG48j2Hh7s5g?}0<`NjM5Wf_axw&r~B1 zov;d?4TG>2cEg8Y6n+AS;Ze)cTRrs(bijw93%&t;@Sqy>2H%Cf@bFsn24_JXUI1+k z=o99{<#nV#*a7|U9vFceVIS0C44%3Iy+aqYUyl9I38!3!JUjvVVFX6tFJK>h2*%`n zJ@T*!+Ez3^%1hdPYFi4DlZX)p#C!USxF_D0ebbiyf@qc=Dk2H~Z!8#cjy z_z4__hp$9$t8gDWU^R3>KlH)RU?@!EP9Z{czzL!VRB*wpQE^A_t#?Rq$OHgrC7~XkUvQJPr=QS#T6ChIs+< zH7tTHunKm-AiNcJ!#>y#H^U+LJRF5@!Mrw28-+#isw>bpydJj0ZrB6wfl=tZ5`Dq> z(6$g!Uly&pP}Km%=Le77W58ItVws1op#vI0R>RlFrs@+6~YFd!Y-y0)6m^ z5aEU=!yb4#jKWel43|Ug3hGJdfKljz+n^8XupRDzJT}S?e`7i<9a1X49(|(FP zbirP@8V8abC`Dr&*41S4Rs;r zy#I#%upSP?X7hE?!&7=$0gZfL&~c{m*o!MSi0E`@oxQ!l&;f5BmR z%rDVH zupZt8JK@8y7slWqyy$oM8*YU58!*2SeZnDF1&{tO^a)Rf-Ebc4hquBZ_%s}aAHlq^ zrhV-X$iq`%6+9aT;R@IduY>*YPB;Yn;3(V%^KPVm{3G(v39H~mFbG$}Zg?~7hxfrD zI0#4K+c2*SJ@z9HkAYQi`UA+r(_uHPhyCy>I0Peb6g~v=Hjv+75&R5RLH$AG;nF`L z4?7=19&U$2u4x~92V-#hX5?Wn%)1$V z!XlV}Rq&uKxDWGTH#`^i!&~7Hyy7wB;nOhhUx=@*$iwNd3V!f7{(#3kfj?j$j6&C6 zNbk@OwOc5so}_$+*FYDHKp*r!MY@6aKZC#FHW-8N!UUWeBi;Nf?MUc^Zs>*AKtKE? zjKDv@KG^gu{)TtJQTQm#yA{1Whri)mSOu?uLAVum!&U~a z;2@m#2J&zrwB1fVf%(w$4*rGdf+Hbz`URGd^3VZCVJXZ*A62jjMqw44`w{Z69(Kbkpmqo4HFUs-p$k3_ zeehj4d?)F57xDRX;%gN9;LEU`_krE$0d9bU@a{dh4=>n@`~OBe{u9i@&9Dk?`V>9D zTR%e%-mL9P4#MZ44igi0C2hF((}}y1`S5~CyOLG#Wf+9@IlGeG@C_J+`IC8%e;Q#B z-U3JAl!JC99X-@%2k%O{;q|Z{9zA7OG6HXf-I%){_QOZv5FCcie9_k(bD?yh749>;zVdA}fCz#=%GJt6wAe<_T?6)*vV(2n_=VHM`?g+aI#cEe-X zM;9Ia=?!UGx*$a2TK{$ndDRg)OwB1F1h57Io&<&r2 z^>8QbggHkd4{wGs*bftM8?^t5_<&A$#8K!2&WC<@9gM&SVIQ3Lb@T__a1>qu^X?{I zU=iE_eQ-)1{)WfE9_WNoI3EtfrBM41+Lh1&?}0A375d;U)9^RcVK1EcEy4{;p$>!4 z)=PL`KD-0E;e)Uqz5zSo>SK_Hzkq{qBh=wmX!|wk_}hdV>c@NC!* zTi_793XZ}XVBS5H+pq}U53AtwFbK8pAPDlv zKpkqQ67K&b-@$zN5cI;W&<}@T1il0Np#OWg3vYm<@D7-FKkW`!1f#GDJ_m#F7$^RQ z`LG{;JQIDx&RO{T_kH|&A;!zg?R4#RCw+erSMjXXRGx?n!^ zLE9YS9iCl`zhMiE!48;!_d@%B5kBaI??5m72>Ri~(+M|pz&>~qj6n}fz??G(_aEpd z!6JA8tb&a&2v@^ycpL18LvRRApNrn03p)QuIy;ke2_5qYAB@2vsGWs7u*Ze{{W30& z|Dbar=^DmhJG7sJJWMRbf3T;Dc!k=9=;r~-ze|W$*auxO3aj8S^uq+~gxaO(8TzWR z2RbjqeYvkk{z1&GL=M^;k%Lhff!^Em z0>*xY+{2iM4&mMS3u^yCxS=2R!gd&ieZ9!TC`>@_M&jua!uJ6FgpP-aSLk{KJqx4Q zAI02O-ou_j{0Ae?QqDl%>*!+>e3N*C?XZaOM4%V;$aB~SyI~CWLH}F4$N%=X@wdps zP8ij(7uw_G1G$Hz!gtW;X8bpT{V)Nmgzut9sJ(~%Fao2{u^sB3lq=>ZI9tE=z#689!6k0?19~|5B9+*%-@PXKR_=qvID(9?}y|EnAk;n8NeUA z@h|LwRnWNy|H$)C@CS6kAsB@T7=yM!%zcU+?1M4blO+6)V}8PDau`N!qe=S{xO>QG z(hKc}jwX9x&lKJZ4;xL|{(?MoK!5IN(g&T+(PSU=7K|o!7%3c07ClM2f%#8ij{Ri3 zFarHhlf7l0hA!OOf;%uDI-mtVeG#*bWo02Ri5DALv_v`{>bG zihHn+eRYDOUl0CAe_mLHUV2~VbXGw*)<)uNdrv!>|YX zDo2x1=sI^anSk2G=qe6i=!d;90i)2jVwAacgy(Yn8N>Wa^aTBl=tV`#3Ld5ZdSLP7cEaw7me!cPI0q{p{UI7j!M%ovepi^X}vj z{8FVJCF{ zXm_#)#yard5OUDn1@c7w+(a91^a%yJJ}9num|>Z?oLLb_g{A> z?JpsBJK=$@U+hly!{Pe~&&!zW!(XudPsl@UkZ?dJOh6a(|AYJ2&;#_te(^Vq!3fl0 z57h8?AIyVM=!7xohQrVY6EFxJukTKFLl^9WUN{W>a1^#fJK^ks`LGZ6z!>a@2^fR+ zf8suLLQTR8ZTK^~eRneQD(~ONe&~RM&7izB~2OTg5T~Omph6rqj{jdiP!N^YR z|0i-EV-60FVotb+_=Ubt@y8q3ukA_pLf3>n$zj+&aZl3rCicL5n3%LD>4UB#_9REq zj~CisK_2EqKXk!%SOp`{4|`xI?1Mcp3j1LU#^5m2VFGICQ~TPUWFE9bCv-qJbV46= z!65X)e)QpoF&Ke5?1MfD$5h;f5$JmhcVH0OkKB`tLN6SGJuo5nM-h&M#m59e=_+*glQ$!XD^@v2PJRc@JagNjnBPXonj1J76AkLML=Vx3~)<&exFBwK(n`i@Q)e4tJpgwnOK4_9VNZ7xqCP9E1_rFaCrv*as8u@P0bs z9U*+s1*5PY#$Y=fhTYJ2Jod?RI4IBIFm#?k`goUcz&;o`iSWFK{m=(vFbETJza2fy z;2t_*1bSgF^g~_lPbNLR&pmX)2=u}}=!Y>FljlzSFD%@XbR>|QxhGi!?X$4&1MDwD zPdm_$o98eB{jl#`lda z+(+Z&H|~dFH?)u7Zy0-z_>ueVgbTKRNP3tEcjF)KBd`eeKrf8KdN?fioHys#i}}eD z_<)T*g`eVY)F$yhNqT?@SOotc&fW(uvbx^?A7;+3B#4ue zqLPh@M!kuDIcfN;a*iq-bblXk;j~k+I4(@@_^(MMhmR@}hB#jErn6 zGE(w#jf@O!^Ky%f<)7@H-}C)BXU_S|aL#PM?|D3S-!re*`}6+1Kkv`~&pBu43A}Dr zBL|QT$Pr{aava$sGJ|*gk<&rm_eWNS_}u{f7)M5s)5ucf9I_J`HuyaOWHEA|d|&sv zIfraO=HYK-J#szyyy11T5;=~nLpB^me#jQ&5VG%p)l0vHb1;vIkj>96>f9 zr;+W#^ZNxug7bR@)5tmG60-6*{LI8YGK#F^_X--2VSc}$2N^|<2#=gZ_8{kkKLJ1A zK-`d($jFKOMgp=2*-kkIkUhu|nW&M(#sKk<-X<0d`40a2n-7jv%X%}Q>_ko?2arq1ab%eM=Y&Uw3*nKS$iPv2e>?S!Y(Q2c zN6sKWWcBK=hG)$R1=w^pF)f$g}VR*?Bf`6L}8hLI&PV9FE4n($~!vWbu0` zKXTwa;)QG}!%i5z_rGq&k>M@y$T{Q^vS%y&8?ld!BFAIY2l-AT_aoH28d;6(xs-AsTRuQJk%21mL57hn{Z57|R0c7A!v-aS6LCO>Z^l1l965rVZa@zixCK8&ADPGZ zC^9pT`bS2P(Oa>Dj3cX&#UICx@W>%#Lo*LawDg^!A~YVvKSfu3i%@=$T%{JY(mD7dy(VF0c68hY2U*4P!44HYp zQ}4*iZ!jLq_iv#`K0V0&d>=ptBG^GjkkiOgWT20DAtT5JWE9zn9QY6XMD~0SKTn}P zkfq4z`d@-y;9 zb|S}-1IRh#G%{R3JfFrsa$p~RBFB-Lr@_BQT+j>rlei!w$R_y874kv$AonBZkbUTf zU#I;dqsU45zKS2GQ{Tu^WaJQW2QNl8i5{{OS&59mHz4bfoyZ~N2yz@bj@*x&Mh4zS ze#ksz*u-ySF|rBSX{?$($oRTdvmN~gWDl|hSqVOkEG{HHvH}?iubO+2EpJ*i_ai%z zfwvO}WCS^mj3P&lUp1>m=B=9J*cnIe7kkKn*hA(a11FF#dSPS_GJ+gJMv;@qII`gk z>?7NeffLa~hLJXBg5}N?u_b z9Ws9Usu{;_19Au%eH-yWKaQ+Gwjis|B0aJJIgM;bhR?=6a_+KKvkyCgo#cxQBPWp& zN6CS(tC4jH|I`Yh%>`VibI1y0&)2Xo^6S_|jvzac7m^$U5)=WD7F- zL*j+(L5?FM!`MSMAOr8g4l)nf^CQZK96?qHj*KHae@gj~1EZ7=Irj_7CEs~xJ+l;h zyuV(Ej3X_ja+-J9r;(L^!0vnTZyJA)@jv4)a^O|sA^0qI&%+;NA2RxX#0we! z8~(kI^86k9$R1?1eE$df$Z_NdGVo9GK~5tBW%xT!T#@6*sC-|do{{lY{Cz+9A`6jo z$Vz1R5Iiz+)IoC&*^qP4jGRxpqYs*K{11l@n(fF=WFCGEyz!tJMYbG!&}>3~TqOF_ z$WCM+_nr8DzsPZ93o^Wgd<5Tm&>TS)Uvkh4 zUqrshLS($^pxGziFF$DRM~)){<)o{|4`kp9{6%EkY)6hG`{et#4w_5y{l^E* zA+b9``H)d$Ch6nI24v^2sBiS9k(0<`{@``x7W9yH$nZ1785#L4yx_yZ0NH>H`~iJr1UZCkKu#k&k%1Wei2mVaELXIH!A;*zR$Z2GF z8}UOHA_Ft{iwq;HkrDn(S35F_>_NtnlgJTdU_0rNb;!B!A#(&7dE+5-64`@{TtdFc zX~`EkLb_?e;RDAWGAl&?q(kNsas*k5ekA{pS&b}4HXtjJL&)fx51IQ#o^goxF|k{E z$n50%_2(B9^!pT>?0${7L)vu<5{LTfQ%k%@;)Sfo?x1BWF@i% z*?`=OY(WknJCXa4Bgkpw9C8U6KG8J8mtzN6h-^Vdk&%;3vjN$2ifIO_v3IIz<{?Lr z#q#~Frdf>)7my!v06Bo{c^meT#b@Bx75Mp1llT0H%h}jN7Qf3hN06Nx$oES0EAboI z`2o{xM~+;LU&!c(;IG1N9Dk5=H(*!fH_5+-az2JWvUt=qC-HOcXQo*P-}!UOjhsdf ziT*y)p%?!J{(KO>krCtwGK!o=RwL(-4ao2>`5U*$2IK&806C6~{K_=vkd?^r)%cAp zL`KHQ7a2#kBgc__$Z6yVat=9(4E&n($S^YVL+B$T$WCM_as*k8oJKYwi=Uw!$S86E z*@GNMHvE=!aqMyBs{i@@g*$cxGMd5}CuJXz*$Gtup3lGWUA*hRoew$TO*wg6j?Vf- zW=r6L6W@2ny9!Q~q@q*KzXzV;w+RH;kQ3e=yy&R)!HckD@wLED!sqDx#fnzx+razb zkJ0&UF5e6OP#S&|z7u|%o<3ONCv; zya9jvdM$nM!PZddg>{ye)gBtr+xZKA146g+F*lzs_?zMV{1}99gg;VGztK%U0e?08 z2|8cp^7HW3@W<=?4wugjakdTbRZeN|CGb)BbM^GMxaq6lrF_*oAN+t)ko1l4_rhP3 z#9!_3UGSri956Q}@f#d|5dKlp`?aSD_+OI#C_TN^9RfvQRh0h+@IT|Tk)Q9jmyfm@ z9iiYS?It6sRl6xLsN3)HCpiU3w2NTW@uwXA7I?pS)WUxjzBVcShn)0n@V|n;F^Rv< z;d|ka8#rKY(D`OXEB{8}-vhr>=Yy9z>1W_?g7@>!SjQtWY4`&8FTuZ4w||41e>r>~ z{QGqNHkYr3|0#Sv_2R@YbbLrOq&>93|M))-nD5fl-|VLEg?|?Qy*l6M@}uzo3;!#f z4?e9F#QqHY1A_<5ktF_y4sXz3&wcEGd0P^1HE2m+0N;^@FNc50hc6&~Eqv+Y2h96) z`!}_Qf*-WXAh6`qf!OLx;dGyZxf&YAvdjvm00Pj~HCGgj!;j7?phyShaM{vxEcO(26LkG;CC-F}? zd>8z0;r;4!5We}p4w&cb>2FubRrx01AB4}-d29Hw$`5}({DRI0|Ka4H%e-CtvjgUd zI)9mKzXbm3G<+3&bsD}Aeh0kY_|*kp4u7hizui`(9Sp*6N|Sy9zBEnxdHD0vq|bc= z@4}@?Ujly?yx;s&1)rCOZ-fuR`^C2les$EFmv%k~zX1QT9-ph|Pd~HjNMMQ66ncZ? zbDFLfck6K#{t5UJo&TuI=TpFE;5X{LHtv_f&!k1S6Kc_J@*pd{qW+y@z-OL>N%**LR;p&z~--mjgE!QTNN)6+A5%F(~WBLD|YN;csRKIFOuWamq`DgYcj-Akp8DdFncfkjqIbePO z;qbxjDkI?s;Y;AX>O=Sm_;b?m^YF#+e(gP%h5s4we(TK=_!zuj9IN2Zh4-tcM)*P> zUfR<<^>iZqZay2|47=^Anlb(oYv7P_4r8au$Byt*@HfEU&u2G|dz?6~!cW2b?UVA^ zkUpQrei{5e_#)l@^;Ub3{A=JRe9}ufo8g~^pVrgYP{toyHUw7v3%xskLw&Gsamo>= zUF8QIMagdry}iHnkNYhAJ@AEMII)kp#`QOw1wfqF_%n3-*ShsL2LA*+!p+}4N0N3Fqx}8wLwq(q zbd=k#7$bw#ZokSsmhtI1|8cMceiQszdOja<{iuSkg7<4@jqo+_UVchFcfoImPnyr| z`Bus?2ww@mN6(-6K4_n52`qM|(0km+j_|ASL-2n4;{05OVR*lFM;ZJCykC9Sz&{1= zSD(%BBk+Fhu^aw7@Lq8c|A*oG;Uy+cd$W!etn$MTz@M-4+CFI&UdrcJ5BV&Z#J?&% zeb74Cll;rz=i&YQuYrFNerrE1Hwu8q;dbjF! zf;Tz&)WVl9@*BDO{1v)UOH+zj0~?Uh3a3e*?o|_=ukWRc`(THt*+OIsDP2_wrBrk<`zT z@So+garAn3-jz8^n|C`fa07am>wW~Sijp|?!+#Cl&yO+q9v?p>{Ve>0Y0_t(#5r%8 z^hNMp@U=<)x#!q1_(^!bc3KZV2JhF8I^dszKU24_?W6nQ$Kfk=K4{%2lJbqg^JCuT zJxTm$oN;6p{s#CTCh?Cud^Seb^V{A3mc(~Bd=Y&6ul?^!#New*Png|)rkxws!|zDL zcfiMdcxgx3_`eDMc0L>b7joOtPR@v}<(t|sl%Tg4y*otje>A;av^VV>bd~&GMelU< zob`itzbl^(J(tFxZt{`zUzU9C((;k@Pk+uFPdJnMQdce5rx{<(hu*CP@(57;;mn{)L|t>>FO!_ubd9KYGsHcZ(lVKYhRBKFd1n zR_S)xbcO!UaIISNT0RT6hkeSAsX!V0=nDtT&xqrR{Zz0;6-A22`9XTuD- z^>wu>_YOTj(VsSqD{hnQE55lufBRdG5q=%x^VXYsf8#RKM3 ze0Kf)k>hVY_SXOLfcYM=_a)ulc4coUBiUXV15wVOyzNPTHSh!Q(hlAHKJMfwcCkax?^2atJSD$=>^=Nv|9Ngq@`Hb;p5F~tJ5=R|AAuj$d3&=he0GHR%pBmI z9WJLntqrp9MezObA4=k_iAwkw{A?P&9=_;h|MVU3_3$6VmYctIfF}0);YZS>AA=9P z;(vZN3%>>aYSdi&)s|0#@b@G`!*ymg~Zl^^~kc)xW<41N}VgPvZyPgxJ&z&!1@ zZ|s2o8|g38(+8~uyDC5Y)ug8xyZ+hdkiw6_8-F=qUa#}PU8(^HKMNm&zcGoo?z5`# z^;E`9_+r|>TmDUq4KJ&+IY}mVO3>^1tN*^C3VveAe_U;Ze*xZap6IgE|4uS=+TplU zjzRc)hy&Ysm)D-Bn1FAFe}~Rn#Z>;!!?(kG-{VvQG8mvnl+Fj~|l02!1{d zAA|oJyy!ahW}goWRu3=hRKNT?;Ah||uA5%F&(IJ53cTOB%9x!$VRzHlXyYHeth4>{ z&t?Oa&c7mf@z1Y(G5F~;_UqwafcGn32fVZczw-6l`TLb`3|`{nSH4;JbpB4#nLvfuQJ(;&R;*LLgngLgUO;{^O|@VM*x zsNMIShi~?=FXhao0`7!=Sx@hAf4L03GWHXGe%8RB5AWwkGkkd(z8ijvkA3lT7(NDn zI6r65JCb#*pPvR3dN#bDp9S#8!26w(mBX*%M~NOU?LK-fe3KbWz3uXZhc+2CO55z>D|Pp{o~EP!8v_d7o*hnIbj zpZ!|+nKbs>;LqZ3L;2b7g^$4d*&l^J5#G=L8Ti^X_6-&aJJZ-NfUiu$m&0#K!`H%> z!&41z{beiQs2-M+{DfLZkV)8v!QChYMvd=dPQ)A$jC zf8<~AqY=Ga{^ploeRsjHhxd!uAbdCtKLLLNykETL;WOb67q9#?Ilo5Fuicfw*QMcW z;CI3MwaaGset54qNWFH$%il=*o?fqVw(x+prV&{B?3iRW1c;b-9e&e0~| zUw~)2cl(=mt}_om4ez&4&V`tRkLu~Q`MU%@9OSobqI89o<&OHz9G`K)gE^WpvG)nWJ@@O???zv0Y_Q}8dO$$u4o6yB@< zN%``*F(iL8(2H07llb+)%R0>X?>RTdDbH!tVrRYKABQ&hIiGyQk6!qfe0cGrfO1SE z{P>W+AG6pwCygK3=TK&Nukwl?MesR3y!g?N9|3q3kH7rgGajNhf!@{VwTk+0G(DNK z?B}IKPwMB1gx-Jp>lIM0xry&Y)J!R5Z2`*l9~Ncs|Z zzjBHngZLrkRQ=#Bnjb0SLNj)vY2w`te-8Zpx}QP!`K@92UU;v0UHqJa|1Lbs9XA%* z^I5C#PrxV5FWPxa{<-Y2;Qi{m4E}L=zxu9$?@N<^GraumR6qOO@Q=WIl~3Y43_k=v zt(Pz5`7w#Z40;Xgz1JF{MvowL3pWOKmRA- zx5NASKM!9D@8^H+`#6t*_w&C5J__&WUlsg$@EdghwfjJg@KXPN>AT=}rb#~tpRRr< z;H7^3@}GzAN|S$X8Sf{iNnZj#0Pk0SRq&%}>^H(c3GY{bUGV*B_(Avw;r;4o0=^gC zZ(f>*f53;A@wSopw8Iba+4$(o?ie9^IPH0rviI}cRoH*Ltbs3p_w%C}{{&4Ziy?}F_V-Fv%GW6tci~Fq`YT)mI_w%Z$dn*4|1Pfe5m6nrF2{;TjurpZ5_0W>>J`ZD;1T>tpiz)z>)o8f<%hVOsW-*N0~&sUehcfzy0c6seR_!{_!;l0|w z*p&L&3$Mo6cTT%DQpVX{>=aTDXOYJ7LwnwS6#iUzzkWCae?GjQAGO4x7+(4Dn?JgF zr1(*E5$o$Te#GFPN#jR7{PXaB{jtNg@5lGUe?}R^I=e6gI>*3qskJWkWwKlac>40xe z!}r5Cq~XWlYvJFl+t;2$o`v59AJKX3Ip6F}7Vj6IBKV!8KS58gou9?vE8+dp*Ta{? z=jrLS=P^6r%hK@u@FnnX)YEIv{fxo4F`ne>y!QObEPM-msm|Ny_L3%hvo#)_uJiVN z16i|3{X9haZ}ZvM|9f|w*rlFl-040YXzep=u-9AQpI<_~qnTDT&UnPFqlFIM?F3_r-zu$P9f3X!mzkOO6e2!241>{)+AAtY7 zp8rnOR_xOVtDUr=SBqY?u4g}}EOvU~yWw9k_>!3CFXyqmUmDin3oP|9hTfHDEcpJ; z(JXuuJky&G$Ahi@4}X7}^t12}!T(iHADnU5f7{vj7A=_dNxXH# zK;lybKM4P>r1+iX#4iTF@5}}B+NAW>gJ+Vy9zN%+1<&X2h3|kLfcKl<`{CtWk!jqm zzu*SP|1tQxN&nR({z1jdI4boMeCL9B7oUxq3D?Fgoa<=6x0ZVeV>fz!<4_6wE_lCw zS_NMZ|L3GQS-)=}eoWxU(>eU@Y{qkA`Z?E+kEqA~FO*ST^j6W!;T(dWats(VnqEC) z|EVhMs@_M*?>yEee*VtDN8uybbjCex-Dgx<{NIxN{i{>21@N-2Zqw5TKkdZ59R61L zh9q8owaJ>7YT=)P|8f#pH)6aWDKiY4}n2)8RjmWZ(V0h#B}R;r;rh zaVh7;@b@RBckimQD{eD+De4P3|O;2w>Zz=Uy3x6H_%R2AzJY@%Z1;y6=OQ)W+ z-$ChzZ-@8FN8&gJe=q#0dOq57GqdoW@P6Y*_73iIrKZ>J2NuCg{%7j;wfEEbfx^H8 z@KK%Do+qh?e;nScU#R{Mf5$og_1F*p2t32M+m5ySPh;>ez#pme_I+KchgtYh_`}_Q z%B3NFES!ft%5pIuY&$-k1dOB%imzC8_J1K$tdla&9Lo&1~Oi!S!RkJ}A@ zF1*(~TZGH`_}>Trv30bk`d_$Z2yRge=`rn%X3>wKKf8UwT;a3vSxvu6oyq)4Kfe?G zX7nGwWI??zY22*ot23NCbagea#uyl0L;rVrecovO{%Gi%s#;ZC8`108v0z@H>xIs9 z>b(p8)@uKLHV9t}e-1u63_L3jMFs>=3YJhbt*=7 zF4nrf482kGPSo}6=QJdK!_?oC@W;#kVGWBs0W_Zs(wf-hJx6gpr2eUP7=k5iulB=m#h z&iGIU{|fx;N$q>VY2P*QPwnzw4>!ZV1pnrw^m$JDZuseI7R+xY<^Oe+zmzAR@?2lL zVE&ZP#_2zIeY{M?_p_<-oyFb?`gbMSvkm~IyxCW?@4YtVyfV03@C-w9n zX76m*xxiwl3cdX6yyt20djh|Wot#V4{*5m_?fQL#-B&hSeMRg^z6O48p}neo@V{yL zDf7V?`QCPg|9miO`(G}G6ZNUBAF@A08=-uD>xUxvh59t-U+}NN`^}H_@H6mU{YA7~SDiu}UYdzVM-)L`d0_%4I|zNOju zw6vd4rJO@ZeHO$ySGh5z-h;O}{h%EFo(BJN*TOfa;oIPEhWA_F_rk~Fz2YYRjl%cg z-x+*%>eYT;PRdzM93F+=#AhR*m6N^k<#s0#z3dOOzC`ce`Rv${XNT`rMHN)F#}f3S z)Z_I6B-)YOE4J_DCG=|0YeDZ7T~F%rm&x|p&^!O81@nJ(y{pmN=jus0`_T*Dyx{x0 z(qr(0@En7=eg)m%ahioc=cE2{%-%&G_u(Zz9dXwG@GP4G#y&=!MA?av{(H7n*xBi0 zN6OI%UzvvQg5LsvD!NV{+J0^jJ_diT&TG#dOu+AgKSk%Y_rT}jYkl&Ua^_ycbN=uz z>*+ntYs%2er(K?=>uK-V*1(^drrkE%>HXSuH~ev=|A=m1doObsUiyV!znOyH0snSA zy>>rg6}~17pI;jYTnnG0r?;PTl{l5bSHbVmdFd}Hze8Ay-V^Bg#iJ9R&Au=b!m5xB#q| zI0kRA-#Zu{aoeoK!hWAc@~Owp)#!PhPYK@vUjgq|pZ)OX`S9XL5#=m`-_2(uI^z0~ z^4`HbcJ4v%1oWK#rQOHRy^b?kpM1p668PKF@Kx}2Y4}F?E7R~@@Gr8@EdeLwEL~i@Kx|7 zIsVhlZLN{zaQSOzB=HW;l0LNsgHj68{qxwa}2&Njs02p9q>uxtTs+&-#~rC z`_*R=d>q~@K2l%(#8>PO@!5Fphi;old5*3TJ1?Q5R-M<*Nvq&bz1{zut`Yu) zPx_A=UGP#quW?0u&c*-N;5YHv=zqd31M^K{JuBs$!cG`JevstnqiW(4eignC-f#TL zuV)Vre_K*|_xYhR_+#$y-d~9Q8u&c;yOYve2XMkS!`}hVv7}oD?Rk-I_%V2|I7s?o z_@{k%iBlQn8-Z8r)vo_?^B_+8deyjz_U2Jv$0N>yy94VFq6Ods+A2V?CRFGiw>zxgIb!hr z@P2;Q!#|S7eh2&@ykC9y+v)xIG59{xGt9a5q^*}{;a`LI8yB)aO03}DuBX@5%SG^i zOT)+D7vXdC^xAs49{v^hJvuLI#FX`N7kaT~|9TjN-vOUg57;QiLi^YB|z z(`)lUZiAKonYy3aeclrID@h;Kd3(Jq?X3#_4*2isyvzY9zgy9aUdE@q<0XBq8-5Nu ze(Uah%8^O>R&%`0QJ0SMV|Na>hCB{(2Goo$y|9 zlsLrT>);Q!u5Lsx=Pv(sWfy!4e39;lwyqq6?|}Ea4>|!q0`E6Y%)>tc@3$_`{TOp6 zyx+W70za3=eii(y@Lq9}dTfNBfcIO+b-_Oie}-Ou{ryjP@$VR&m(I_3u|EO-j1MpM zG!HNFndY-o&mQaQ{6_X!cOQOTU5?)UZT|CDE&PMcce+*3*QCr*B(aUd(zmS zffxV$>cjXr{R-Y|+?IG2z~2DxS6}7ub!qI^!ta1j8n5l~R_bGh`ly0e>*nLX@777m zy15@aGw7YA*PHhIz!>~%@P6xvS@;!rzk0}Kp*IWf7pEfl=i$X?r`>4l<{117@P6y& zdiW*yt$KQG-P{3R@EPxQb1rH6;YWVY^P7_1z62iy&m`SX6ChIXDexZjkJfN$L-XK! z!T*}U7j=eNo|D%a+ME*!J(rP_SCJFmkRyFbF0oUR2A?}JCvTJTXJZzB`X?t3cX4iW zR`5c;T%^8Sm}T1^6Mxzl%;#;}A|&4#@WRjWJ2{3+2)+tFvS-13$c5GUc5V~rQ1>#w zOAyL)!l8n7N9JT!WQ88iKyH!jlwKKn@dp;nKduA7vDV=BoM`AcGxUVky$tR^67Xv94@w5A{cK6Jp9_MC`m$}w z_)&{~`?nU%eNLQ0Uzdn(q$nluZSbYvWxeOrf1*8J>C|{dR`3z+i~61LVbT>p!u>jl zlZyZ5oOtK}l_c@MP&F9&R6#yc&RO(3zi+P#`7W3EXWT)50ROfCD&E1KL6?alZkYCG+`2aXC5iM0LTl1XynFGlX_))S(jKqR>B+b+cyDNr(Xnp#`qm>t?+Fr0 z)dyfzTqe-38(lE3mbh#arCm7#PNGn=v|@?9TrvI`+|bIcW~ld|0#+L#mB zV{FVR>{wTxQ@ne9c}{8T5nFP`GeXZ|pcHIFPT_?)kqZ-r-6ST(-zw}?{MxS1ijH+# zTaVZw4)0!naZdccVDQJ}f03QPjHPX&{|xma^?zleVB2#Vq@2M=(cY9L_0*4E^fwD; z%MpAjr>ft2gi{i!-!b9ezL+%L2|fc}3ZB{@R>6xs@Z4tF>*Ru&P1?jIc8b8m=pUN^ zk>bD9PagQc@!9w$qn_OsBf+bzrWngoaT!A|irsT4r*SWO6|F~9NiA-Z=vcA&J0+5l zqa0h^N92hDii%bEtt}55|`*#fmegS zJ4L@9yk%ysej9ib_>L6)Zt#)6BvR9FGlI!FV!4 za`D%=lm4=Q!8}Rq*_X7peDDVF#D2Op7`!$yE=amE_!0PUA`w!RAAAV>ZPK3YOYnN| z@xLyZS}_A<;BDahz&|5>g7WNbNx$Bl(-8U^ZKxC|rCVF`nAq!(`a49N zr2Q^@%N{FSn`*33HaCdP@|@0$;H>9Ru|f6cDeP66_VY+jVy`?W8r($(pyf(jx<5_- z3@n4GfC2zYYl}(Qhw40)-RfuNXOsSv99%qs~HD(ueXNJ;A7+@ zQ-ivseAz8Lf0(&wzAED^`K^hUI}UEn=?sSUFdw9|eFBC(xujhVw(xxQX^ZA&0n}LYaVuzimHu8rx${n0G!Ia2<4fe5 z7>_~|_S|@pivMa0>#?^kI_u%qU@XzRRs8esqP>#O4r#}3yG)+*&d$gwtk9-BROOO( zSws4{(-*D%v_dVs5xnqii{^lhiI8&5;`a#n3ZIR0@mp&T!uOM|r*P4FUzAlU{c&5u zVd2N%r{SOBbD$!pGT7kOu*78+zLRlKjc=@WYoJ+HHY3Wj7^-Db6u)!tW;{4!(M+@r zF(>JZz~kU;0uTkBZI+ZV{1>Wa@_k;I%;G^JsJ@6^;PH-7M5|{Wn58m#f zpH0QKfTzZ-0DLd?DZ@$P5<6wm5U9U5CP1X%Rp6Q6H>BY8;BoLbq~LAf)!^AFcsF>Z zhyEaVg@^ta`1mK+`ac7{&jVit4`WA$yTm2_=hAS+e_3WFF2ReWL4&8pryP8V_@v@B z;BoTR*Gpoj5xmX=?*MP`zc z{53TW?hdjzZw;XxI)}l~-cQEVI$i1~T(oEolh*hX`tF#w)tQTBOxlw&GRqLz2dm-re-i;zjdJ%E5ZxXkE8Gr+81WBNV*Y z87kEHhu-wri)IUI)|emMfr47yu|wiDSWMY5%1A zKP&%rt?PH@6yF=%6Y4O6zaoPRvu@{qHSJmLAN}f*MeBZ%_`)UiUJo7z=NQJh1aAZ1 z2d7L%9QthY*62&oKBA^6CPPw5 zzN_d*Z%=NY635(j`WJYF&&(stGapD~qsmcY^Y0SgzQkS(yn%G@lsMU!l%p1W62Jap z#gF~iRXLT3J)ByGT$J@`A}EzEcDm57zGKn+dBO-%?DT`ToV#e9lWg0q>LF^^gG@2y zS?+`<`cvpnW9Q>CfKzO{?QhPh4Bh3neYK1X)S{C8Ip(8JEt>bPm zrmP@SqQ?gD63QojHIh&Ddlt>6Blx2Br&qC@N(3bIemNVkk2%yj#Go8~=P#=FW{qz= zWY;bIIMEiau{tuwx@wn4j)So_EWz zA@x&-z59r(QDNEB*X&zm&CWOxinF3lTAOanDj@v?>4!F0>kuPCdbK`dND4k{?HBF* zyUD-v!nOJ562Erv|Drt^OJ7m((9a`OU#6CW2gsgvigO%67mbnsJa#k77tN6fU%cvB zjZumH{<5y?YQ9rLI*9l3KAI+aqFvlAdcV;1IIawH;KY7f@~i2f|K07KpYYA_;Z}dX8$Rm8iy!%v zXMp(KE$y&I^CNV>z0TjL*7-Bo$*c2U=htFK_-jJg*@zwL!fsD$54t&VKJ`>;d%iF$ zh9BkJ(A`ftA9d=HaeB=@Q?;jZ#-6Tp^;m_ydHh+rVbMIaUgG;@yKSg5sg%8|+Gk!S zyW@|i*^6OPjjOZx8Ti54b&7E>{uAfxMA5!v9L@)iwk5A0rQS-wOTimOciZkzD`z*6 zj$rUA+FB7%75rZKNoU+89@hE#Q^Az;b%|da`W2t0KT=++A9$5D(H}EH5BQC{Bo})V z*c;kIKgdjHPsMIaPD?O!5yzGu9o#uzD7X)MU$o~#Ov)wkDFYt?S8-6Ng;#+WKCo#0 zolqN>_F50#0)Cpo7d7T>VHx&AyRBZFC8}b#3%&LS7p=e3CLovK{ovDrOFOeK!AHSM zyJ;^PF7+@49(joUm7U*iSwC3y@F>m2Ui(=`0ODVEC;xqY(VP-HEEp=)oErKj4muk= zv0H-P&^H#X^Y3dpOA(NqHay9=!$=}=n;redpYw1eHp$h zw4TS{qg;}IBXMg2AIF~YxxMz9^U|E@3|Vxl!NrM(#H|0e@J z2K~JcEv?yytb&h_ZycS(CHlGdGd~V4nztlCWQ>1B;0@rNvTpI6uiSq16&5lc{YtG% z#9lM@BKXzk*YDl)CUx%qS?_+Y4!laRH-^3V4;Rh*FSPu#*UPFMY{?l|A9|c4L|F|G zGuBGZeKX?=tiKN~TF=XnR4$1_KKM8|)$3dm|1RQIafov=J{x-;ujP)sBl&le{~YOZ_?)-|9|YeIF2if$l6E)- zJ`MiaWBJ0dcrX-T!eUJrdb=zsRm&H>dGsodT{54Q_QQ;HlOltELpb@1UVaz@@^GXc_!dB2%%&zk2j~PFOPkhtKN#=!b5O z(jGeC<0meeyDs31SNqc2!<-SyKGw5+sj;CM6I0l0xnjv&=gb2sXSG}8{C7*@{P)}5 z&1-X3t!FkDW`$l2dbMwIw%Sk47g^tYc*%O7TcOrDS|fNN_#Xtb$BG*W1^4*wL8$vk z60dIbrqP>!BVRV>j0c04L#x{ws(lW_k9=&&I=>WKTv8ts;QPSec_d%#d4_53do%*4 z-Xz|u=#77B$s9hBFJAF>&$2h?v>2gvZ}JR;igzw1Vl?gX6A!GpA5aUvzbAPd6a8lJ zX>h$A3*H4j>4Eo){S;i{Gzz{C{1`r4<#o?-g`ctcEyCOJ{-nJwmi&x=XFMgnexFzH zeDFE&uS@%}FTqQ|+rPbJepUK~eF+`|A9%xZ(s(U+EqEVzYB`(1dpz(i@V($N{Ut83 z(+}PWF2iNw5_}ZA-2{JVi*pv*0}* zxWSFVz2Ha7_+?+BpAX)N|9YGRF9FZQPZ?$tm*6q*um@fXp67u#gGW5@F7Uz>T>5pt z*vFs8B~xwPeXANf1Y}LhzY-}wdLw)`j%ATU-?sPX%!T$nH8~LCfs&-{IU|p>gWLzn z|GWPEsl?`gg|5}#lIu`J%>^%H;i!K8|xA=`Vf*uh`jX%3&J|^pipRlR1 z>%6!l$gkEBa<&W-?@{utn^-a@WW0CBarYjZ9`BKi;EZR!YC2c;a=RH1UtBUjmRt^Z z@5!Qi_xg3k_Px4fzMS_j9 zk7IbWIkl#eIMkC*WoX&@-G*&)T2FVZv4&WQLkE1c#AEyeFZIBO!HYfc3GhO2ImS#} zVt*Dq;(;3+!R2}2`QTv>yaYTG+(;Nliv1XP09>0E6pDFNh5B+)YeI9uBS6NS`;8Je|;DtvoTlbso^+S`kekg~phEJWhYQQVO zi?9*cno}Gnjl`)Dybk<$!R<@cKX`+OonBl2RMF*5%uei-@o^Zu1^ouW=^yvXb4&K~ zF+7vCd)-Cy9LPtlL7t%q6}COr23XRsl74{nOcyG>zF(3xyuDA_l(oV7%#$+K;Doxw zrL2ec5ni_LPbBud$kl zmoe0D&bnL$R`@}9iH8?2^T7nX_@|yHRO6;PPjlxXcRrB2d9N{Qt)0^B6PyC@owY8V}oELlVBtGJ>yNTOgto|$QEWelW z0lm$lr}mNVb2cSF-Nd=&B=#x9#n`ml9z!mba}Az|;U47=oG~PEJImUilCC;`*?hO8 zdo$^jZMo0Dfq?8#X?v1?H~BZb*}FYS{`r(c_^o1Rj+^1sbw^OkpN9$UF)Z=8WuTsP zQa|k{FPj@VSTXil>Fj4dz1J43Cx3L5XLH<;Mb!M}e6q6Uzi-kWO4p8q&ER2hLlo^x z+I1IrriXq%cmO;*p^Oy$QShbrEU($`Oo7jN;Pc>xXHkB!!xAJIweAOJKTLlDKSOZ) z68i<>lx{{#%ZluzhQqW0| zSmGx2BYd&+o4?&{$Br?@ezq|2Ja_OXDWPKs5&ug1Xg}{>UUOa=10O$c?fFD4_&yK3 z8GIT$db<+;y1*yF|1HQDRjJb7^9OOYkD_&i5{_dEcO1^udo%n$~}kPmQhr4uRBp%5_%b<*V3hhVOZ3 zdCj>~m)P^b`^6r(9xt&o3f}I4Pl301;Pc>3;3tqaafzMm?|ADMfQ!CVN8%FwGVlfu zyb8R|1Fr{* z8F)_$E`C&j*L5$O^L%Ff<$1kJbLP~&)1d4b)cpd{llo~P{j+>F+M219)^%4}PxkFL zf}cUvdVZr9d!^J%1ijSf(PW$*Jq$l{7~c4vzkP{U0ld_Y-XFw&sUNA&oqRUtKIz8$ zMmOH#UoGjEDCc9cPT4F^xgW=Ql=TWw5m1}hj}kBDV{3nLHLn>ZZmNflV?CcVZVjSe zcj2-*f;!_(W$=gAcrykbz9<=&{Aa)`@DmS3Kce0-u(kuL{~7~Ud%9B!sQPcp^B3;E zY)ek(y3kv^&ui7$KnW(Qus8X2#z}i!W}hpt|71 zHqlgJ&%pnEeaq(M>-fC)4(~BW`RLwz{-F1XpS`QI_N%MpH~!salVQ-QyLj+xYMzj| z<$s^~>Je{V{OZQ9IQ4My8}aLuwSKwpgV@ima0`0Ud+c+bmyq~%k#FG#md&3@9O%Q& zdbmNo4+^3tvd|0M?6GF0m z9^_DtZ&>Nlz5~~JROm79Hjvn!tMzKlqgH(HC6B;1ep8b7DIo!Eu&AWU9IiXOd=l(6J90mVL z|D>IKO)|2}QM{X%!!Jd{X}I*$d}@&bx%2>qGC6_gy%TNV%b) z`h;XB?XZ{p3)`2?76I)2dYtF2SZ1g=kHWXZKV|XkVXk1jwI7WAvb$f35$EF1Et|hb z&-h}KY9IP@n-|&7xygx0(w2#_Li{Kiq&`VccuctwGt> zf8APqVW$kP5j#u$%jVzttgY{9qxQR`n>dwvXsr*TE^*GKyruUno6l#G&(T&n^fiau z@6>p}h?^1mwfA`7^aCkh_G9#)`F8-wA**~!S zPsIzsrM#(l8MwqJ6|Vx9c&6g@;1d5-ybWCHD;4hsm-^N55-BtO_kD-;HuHn=sgK*^ zJZGG{<=xm;BP5UD*#muIza#B?7JDP~JHP&$J%keZF>=W`!#J`{4n?>F%6Z6TR!5M2 zUV>gVde>Qc+WQz=?A~IXSJa@_^DpSNp|>ABwquen_O{7`cCxbhe8Qj_U(joKeA#-h zDCs?r?FlvOd=b4N^saa8CEgd=nxwaiUf>6Zw^#6A)DL>;>`8oM=yjr3F8SKy$H(m) zrJdHp$Nyv5`ukg=!&Sw<8S15!dilOVeGY$2)#trIegk4pXp?hhOf9so4?Sm}W-+O; zP-7zJeYtO0Bc%g5`=}}M>ls*1dap$MmEW5 zy^rB{&+nJbuZZ7U@w=iUv|~?D27GpJ!Odjq+$WND*G;~~e@HIB*ck*b1pkfYH}8{e zlON5vl&z&~nnNA9BhSXjCGje!ocmt1`=0DQW5DgVfClKeOx z2pFFszlsiH$DWXNb3x`(p1VqvRLa?g-KOc}@wg1U8@vVlB|dBGWOWX%*6I>9d-P{F zZA}Pv3(6TJNptl<>1wST{a)pCPKk$zyq_( z=KDpLx{_x`Vti}_F9iRHY#6Au`-1NM={0*)j!X8^o;~)6s;@}@9K~M6KbFmZ*!J}2 zIMjpl8I!ZDs8~rU1MNT&gv3N%_ja8&Ys-FIC`m;4g|Y z^Rsh)5fA<*(O@KfGkTHNxlb;7_9b{1csqD!0z^uC?gtO7E?d8EVDBv}gQL!Q%^3Uu zygJXZ_sNy)le>t!*qw!s9$Z@v+iuP5oVGvMt9md%n3zR=$EcO{+sX~$XL-cEH{nT}Jv#p<6k6qwPxykvKV5eX7DgReO2zT9Nx4WK<(5|F; zSe?g8{xhVj3#}xr>&4zGcpUuyuf39|nNQcRwHE^)0UtBG{A&nZpX8o(^dkPXk*+!` z*`CyEH+UuZ7x>KY*96sjhPy+-TBgrUSv!cXUH{_GVe}-QS@fdWD@pBGaDxM@3J*LV zywU?N0k1nY*^c-d0~h;4($A9ir{Bb5cV25mZ}O-W>vtSkttQU#W~q-ka9M{NZP%&x zsm{-CNWPyiNczGYyPeVA_1~>g;}hi+eoE}buwy;5Bx@vopih=a@?(1L{Rd+o{-8gM zzSXYiKfC4k5V`-_r+Se6RG&2tm!MyF^osL$3R{Enejw!&ydJzW z1(&$Bf%k#$5`EQwnXA-$ioueC$5+eCXd&=Wb6FaUOd#~KVDCWKPRoMnIC4w z9}nF4CH{Ee`QVk{>%~v|lJ!docsp^rKnkYTFJAlQSmM2^JpZ?(tof`Bdrilzm};MD z=Oc0L2A?Jl`n)6Udk{R6{`ZiKgKm3K@A96*Ij>z)s>4bB&!9hqox{yT*}q~vLwTJStdB92C2Ui^!m_?h+fLPCw^DiyzaN8s|O!Qldi+&Q`7Z=5Ba1MyQA=X znRl+?bD}*J2d{Aaoq^wD+c%QU?_nb7wzW&}| z=rt_4??|VV^ zJy`Aq{e>DTU3l|$l|`y1>Pu2}D>s&&?O=WKl|kM|6w#H}3trnj${w>slB<6-i% zbhNOmJO^yauZ{FWXD}Z~`ntq@e|edHv%FrTjx(&)5`7MpLG-JOR;=^Il=VFK5v|h{ zp0r51hiBhWlz7dPelO{RNAX3C-(LH4J6W$@)lO6&|`r|CTJ^^e4- zMCt=Rn|K;eS$3S?{)uS6qq{ll`s7}3%}2SvW&F92^w>&V($9*(Tfp`HS^{1U-UNQ7 zUH=_&cE4L*?vWKMHTeED+if+DHIuIAqP6|G3w$ql>iE_VUirQi>+fUB_$Dv@*$qSD zG6vs5x(J`W=A~JiPqk}2OL^0zE3o<0bY;}I`{OlWK(hswr<2-_K^!LKM^TQT?aX3`z&JQX@87gJyk6*B2{XK2^k^bBQ`)d35 zX=QD9^_r&^q&+p0J{(=K-tVVAFSh5mF7WDYYuiOXcqO>r{?zynUP$}Xe|JmbHw7N0 ze*VH|t2`IUdM5ZMZ9tav#surB@|88uq344KJn$0mCG37x?An*uiGjDEzaar41+N7k z0+-=AaS7fGJ^(J$K;ja-3%t)mzaP8@Tz-EwaY?<6ivC9LdaH8lO`VsC{dx4OH?LTK zN8L6g^_l%U*2mzdihVV%s&QPMwg7P{QZ#OuzpS`}2cuW0^Y+X@*uh;ne6;8X3 z1h26gBEO5I+CO>~u@&|AQH(}iPsTax_lV1}w~Ah%V#UlSK*opAQ*Df~dXM~uZHN5s zw*8Km{5;eRl(d-PpW83EjVgP#&Fc5IW+>O>#Vcl!lq+f7B?r;gqb?Gc?B^*zex1wb z#3gYl0B;9B*?(OS4Q22=Hd#Ayu?>jbTGAI@nLM6Jy)}bZZvWTnEg$`U^aI$5AX3LS ziPsqX^d&3ifOHTQE6!E*_u=Sc@_W(K8KK?l*ThPUTIxM7BV(q$n z5WEn4Rt(vf*c$_v_#7jc^2@o6r=GK#wfSf4dR+6qpdBA(tZ(@}XC;1>Owt}|Xb+N) zeMz}v;GN(n9l@6?c!be9($tsXYCLF^^w+GI?@J^`O8O4)0r2ajohtv;-K9(Hz^R@# z2sMb_QtgU)c{X2EJ=5Sl>zUv8PVEvKvqInZ>?xs>Jz#$1<2HUBD%A*ZCd=Sdm|LB@ z*MRuQCG}JPKlHCpdhh#%?|=_CubA(V1a|o&H(7(V#JwNB7(US!MNRNg@InuK3OwS0 z&x7ZI>+?t%cCugKzlN3n=X2s1>BlMGv6x9*($8zbC&9hu)ztA>;?RZu5PtkbjL7r! z+>c89!oTo?@O8JWSkJo&FF(I&zu_hP1bp7D-n_K4dHBLl9sWEZ|M!e1=pF7npd7ut zJH5vxsh?V#*W)67HiJjfr0cf%)O3U3g+A#d-V^ZqiO&b^e&nou2QuVGe)Mgwx*u;$ z;s3|}b^Q|bD;obb{c}T}>b) zl}q)1@F8%$od`Z<>#tLq)_;P}d+1AfvR}09d(9t`uE^$Zv`nf01uqBB`!x3vq&)T| z@gAl=dRkV@r}=FBtWwq<>}jvG{;q|bMh8Dn$F&wvqCbm%^sW_?WAK2{r}TLSO@7|c zewOtSA88F1Z8T3k9S4?h)J6DWPtCAl4e1k94gZ@m(n&*C4 zG*o#%L+Y$6V{CxKUrioYCI4FROz_lkyBU1ov&r+j)I%3|AGmzB);X6r?N00s+WgVN z+n4B$f%l|IH*52HJCSt8w3VM%y-S=5Z2me~z`JoudA7xQ_U0z8USq|dR4RVO{-XFus$?p^VG?yCyEi1G>F%*1AVa=Yy- zXSm+K#mT!2!O$R}~N1Qfr8x0L%!*-T6j6Cs}}gEph1k z+KPI<(`cuL)L75$uUo7YyBx7dyo&zJ`1G6PaaP)8Id}zlgwLt_65(s%hp_L}zl3kI z`BNml%KJl3e;2+Nejn*KIDGPcV-$V~{&4$^S@bGOrmWvpy{DWD zy6sXe%(IU0s(EqJny+iH*YZ2>^FAq8GyH%LUj@HPJ&t^1#mqQ^{v6n<_Z9WrU&Go#uMYVf%|4N--UFNoX6$^>~D*6HJL=dU%R`SVzh4uW4YvWV`z7IS# zPBGE{Z~MNm*yIvBwcz`~Q{&eRJ`EmLn$~}!-vvGizAgptx9#iYmU4{R`dss?&{o6;#`8>{;3s{+o{R+ih~2r zfNQrnResT*^Em$kp9T+#9s5${2cPu7`@zS-*C&*bqCX1W_lM+lg!Jbr@E&mWJCI)E zxZ9uATzGasl>;%=k`T?9-PkLVP%i|Huib7_}z@X&e>$Yr9QjB z+ri~?>iS2pL7VrgZ?QXJ^Xl&nhz%~Ow;1t=|7}J6{Tt&uo9(*e-j4OG(1>1lVkiHv ztpER>?4RHz;B_gu_!R?>gM0ZUe0>^T>~_G(W;Ne}&5 z@No~^coqA^Wn01sQk5S(LU~g067Xv9%oP0?cqRDhDR?co#Oo~@F8ytadXo75f9!n^ zoK)lf|2Z>rrm5Ywt+v{>EvrA%MzY9CLM2mDB$=E1OS&U;iJKMTCK;(@B_o8;9Z8pT zGm;Rpx`ZwnNk}rfq#H8QZtd^=InVpqnK`=^_wv2p`~B^_UNi6Wemc?a(`0T!~ZOfbAMLn zIff;@DhZluiK>DQxIN^aHqfKQojf~b)CNzl&8lNd+QJ`=^rKW_>u5! z2rv3+cXekS2$XQocIYGg@U-wjI4(r^5D9MxlIrj6bxQ5~lr8rKsDyQ_rR)uFu{Rd> zN?euIA4}s;*|W!wTK48y?xuA=bIBe-B;PAwue@`nKc&vDL-T_6A^&k4nj;n2dEW#Hf+-ZLc&dUOv zuLoh?b3JDH8FLib-AvUz$>&no$wxlV#b|aT-zgyJ z6z;(I(zCMGJghsyeJF=>-ZBW`Mjhd!5xxs{iXqk?u|E;vxpnwyHp1teR@;Az5MGY( zbpMH+RR~`X`|06Q4>lrP^1ogtO!)uPFq|j6#rRn-X4~SgD#+*csjR*u8zkkgRQ*n^ zb1^^a;2zbm&iZZl2$GLM-=aLo-vFs6{761VBYeQ=EdR-Jzvif#`MxxTDUc6`d}tGp zemMi&A7Tdu8`|zcxb(nRDM&qB1ikX}E7R7~Sl9AC1J^87OZ0w;8d9EW8rsbuOpG32L%4PU7qWb{{Bf^+IByQ*>T2&KXpM}(mxmR z$NizQ)_iq5!p9)I9dz_Z^k>weFaDcP{gI+PD0T0qzFxix@&&Lbr%`|G@*{j6!sqKi zpoH&4c#q2~s{u713D5o>{o@stwVprO5#hxMch0+eQ9rB3in2cp;rY;a&X2|-Jhu)z zQxNV$cyouHxztY&7k?~8xY#ceeaHQWB44*3xm|wB)9p(A%HE0dHL9|Dubgka{xRKa zxc(WCg+~_Zg^;Av3;H|Y$08ipm5*~NZz}BpYXf=ku%4kv{D~q*Ia(=sk!x2<-V5@% zA|F?&{!e80iT1vh{mkLP*kfa_*gp%eflKv}h=|W1eC7Pi3!yyds60o&BIwXQxSBc{SI`5iN=d~*~#D-i_sjffRsi^RN2%muPMrrLn5At&nUNj~1yh^#p zBfJ>lMPkEo{v_YCA)i`SS$$+<5W8Qp{~uKMIJwsCz5?Au9pi3IzqCd2cXMT}|NB-U zd?mtflzi~h9hjF?`MX2HGRLA*;c4|g`hi)awbMmS$~y@0CZSv-B!C|YAC2(U2){-L z0wsJR!b@(ctRCVBpN;S_2p{PPUxe_*2)Fw!%EZnp(GOSFdM?{WgpWhGvmNfF{xVs| z@*{S#e?6%*ED^yE>f+iUzXd0h|-|Y)ytzl<&e`$d)+e^cIMq%S$(18CG9@gffzlc9<6|U z2jnLxxq6;7{v#(;%Ciyj-1{>9BK`j`l)w0cO7%R~la6H_w4cqC@!S(RKa-$$1LAl( z*XRvKY1L*v!o@%RcH#UYANKV|)YtTPpSfG0VDj8X3`|lsso&$FzYF;qTgSXIwWr7Z zP|K90bT{;jyp9?$Xk5^U?lzPDT6^>JvvfK^Of61*kqBjM4 z%NAq&m;NK;I@X99SBu^v=#7h4Ru?KgTpLThhq4beC1vr)I_QnTd0Q=dcK?BKoA0wv z`NQ_F{8#$%{as&>dem_@`j4kG=bLigdm(%!!q?zf^%M3!yDZ>wXB~TF_MnpgH8@Wr zmsHySpY?oRTGKX)T=K_dRDKjd^k&2E@V{27_dl}UMjGf3{NnUrpo@$l3CwUC)Mm zJ>-ieJ&})voPHGfQpm?FtE@g&ADaE=2l5)cbyqOSi!J_+*Pl!xV|sP_LguF$p5*4qNTInc|m)xPAV*Qy_p z^s@Kh2ki?xgG}%08oBs&2K+v5Wo301=INeks8RcDTXy+zJ;LQa+*hYxYo13e^=k|4 z7Qa(jJsA1(oCdpi>`K@Q<_wwXn&G+G>q;UQy537Z@=%@uYb&b@M8Aj1NBZ2{zE@G6 zo)WJ$HOEXTW3sM?8+*LS-V1-fpSkW5zjQ?S0E9Qgu{sZ_`^tJDs2}C$u)kzpGVh!G zv*W%=jv)OIe+uG{SzlSbTPE1>Det3AJ^KW6N4alrrRnZ~YU-S$*&VLfSpz#opJM)T zU^~~N3$N2o9_-{*V}0;NrTX6lxO}9XT@hZCKt82ExAU307c(`Nbiar^X559TuOE&@ z{7v6fs{b>JQGDe5PeJ&Y?KuA)5H-J;>6Ygi$o%4Vk82*zzusRE{iV>K`dwvpSMj$! zKeOk>cpa7MMh9p0R|jZJgP^iS^nc*I#;&vWb-lXx?T5JL)LCO$Q_h9G?uKa$PgbT~ zAKs6>-tvTkI(mStwVQ;`5 ztb=*p4s@T#2X*&_b`LD}x|^oq^HkN`CzqZ-dwfm54l=~`k2-V59zg2V6xiDZd)QV@ zuU9xfyvNtB|E{+)Yn3Rg`m+l07g$x*k4gUqUH2In$S_4iV@JPnhW)GWTq=ahPUsgm zs8a7CK`T|SYm?Qqnm6XT;4jFJ0T+An3^W;+yCQrX!sUJ923}cgKhjg4-eFJj)CeX1 z83w)8zN+f`*&on9xNG`$Pimj8_}KyCxL4cV<@D6r3;w8#0dm!Dl#Jr&3LGZ6Q3&U$26%<3%M|Fj(9LRa=@Ref}X|2DxmH>5rtp z0^y7I5l`eBDQ_*2Y(J)+6D9Jh{m3QVLQC0~Ws3fE$3b_5FF?8%NIQU^XUP3F{J*sQ zybbv?VNuNj!S1@nA98-ywyjdn?OEA1)o-c`o$6uyS`&y zUh7^jJs0!2yVt$nZBMOw!9;cgobO>()mL&IS?hfQxP!>$9_Gqy&xnYR)QdrgpF5$d zdZ+{-Kk3&GF+Z^Xmv_A*viNZd;`Knh^!hE~a}i#G@N~aRxtAh*S+J`5!+rTNeGb0E zbT9SnyB`yK9v}LXYpSXbmj#UN$JBXAtrt0`U+i|jSGOPSd6?K6279|kR8?g;}DNsVvwVQZ!>))c=SSr4ik;4|W6#~rQIA-#?{B>wO-xOk zq`w&}FG|@*zJ@`*4fYnpUh90=`>L4dVn2I-cn9jL>^i-dF|Xf(bl2aMS-&Lz=fY2G z5&k-|<#`S1+4)a@_OvT#PadEv?PCV?$K702-4NrQXQ|3x`nedGv%~AY3X{-O-=`Me zh-;T08>GF%Rdrrhmh&=$@@7(RGWJ0RARB51EbS~0<>_&2Rdv@!$j5oehuybhx#^Zg zrTl>kdutsUszc^L+S4}JFS!%_CXV$-(j6`K5H98x z-7R`|L$6l-JG-X-N&dDW-QKgRsz2qr;bzyVvPA#8TP>-fq1sy>{y4kq?yBlT)OnES zfXc4bDLK7oc%+HozZk9s0GSYrFZ+pp1ogtUpnfF$T!imHxU*jykMPy2YKPB2_*&>o z_p3i*XTIpy5xxT9E9(efhwx>Nbj4qTQ2xaT&%*r3bB({IzEAS%|6IFvYKKX>g?M07 z`Td#wuhfI?2%m%Sy6S<%8wUBVS2N>@|JNY>Nr)H3v8M;px9ctHnREO{{AK&FFLsuS z9QOA&{!2bLLT@qre2@=B)&+YopmHZ+7=q;dj6*tZR2|QPYdFuJI z*a&g`LG|$B-=)x-06Q|x)gQZkqP&w3{|p3r8lgP)wH5i3be}AVw+-=DLY`hvC7uTp zm1PL8>wHSSIzpcRkNx{w>enKqUk*E4#AXCB)mmOXn@~M>2WMJsIQ4?gMA#kjR#o-4 z*&vSjg1v`>Ef1Ib@7azi1C%-cLHyheRn?d0sQ7h1vz_xF{Ez>UtbLz5@lSRx@`G}w zw^#8`M}!YRcwPRHc>O4c$7?==aI^yc9*KD8%KZP{4y<3PHCk#dZ|4#3qH}kVB?+c4 zm@Z*j2vxWRV|zb)ov;Y$jQe`u`B+2wc{RCE{nHkNFGIX9r9b0G@?C}S@^4Td(!z%! zd_4R*b$eCyMNsmXwey`?u?-YcuMtBj9>$)B| zAM!D-JvGnwtNT22KV+rby}a)I5IZkY?wzogkM!C|di+RuHU{325}wwu%P`JdjQ`DYq=ZOJtwJ|AC8B;t=H|TUX6KGu_2p6$V1FOFri z`(<1R$_T^QF70!bU-!2EHx8S!r#i{!z5!d*(%`UfQPbdfwE^cIS?Y*^X2FC#)wkj}txwbM zKeV@&B;7&KD|u*7_3x#Fwd;vpj?{jPT@Kb$+_adxpRq*h<6PJqvS3g3BpmCH^qWf& zz6{~^{|S*!y8qd4j&omaX4VxNkbLe${QQM`s!z=ZN#!%;Z+pz+dI$O3Sob>At}DY} zVm{7aer!+m9~!{lJr7E^=~&y+CN{Ef+|M<8$*S0`g58oA_Ef)$_UPH$F5PZw?>1F8 zF#R^&d+Kic_J3W(uJkuMTi|@YvZwk839#oNSLo%FUGMW+qCbMXK;-<$`RI!9wFpn^ z9@PAg`p)ok5xx@ohiW50u`?dw>+1-gf$$v&Phanf{(OY*LU?K?r8xskM^u}Ejg*uB+%mGK7qt}+?GThmW+_B*qoH|KAAs^5f~{)itIN&GkV zRG+Q`fns+R!lxp9frRsV=@87T5Yb(zU*eNEAnumY%28T zh&|3xOJpsCrAObaKdA#67Jv7H{x0Zmmx=p;8P-tMv7Ukd*Vzvn#MOwJ1SB8hp}*{H z^e3XvbzX1#e=zUYxCcjQ+pR;ryk`V+fNxfjFt&RK(;V5#q0U}r*nPjxr( zdq~gqrSDhsC{JsY_k%sv9V9aV4| z=jIF%*UL7(eGfNh@?#;I2)`LW?Wy*|kDgiR4II8n?d5YXXP)WaiZQy5)`6GX-d}g? z;0#IX_Y7RnT54(cBfC^@}d$D^i{4nX#z16c|*Yh@ZiEZ21LzEY@m$=rYTb6p% z6%U@-aoOHF_rt}ngCH+L`^L6wO}#F$lkJ0K)kH+j=XmJ(n(VFqRyO!;pW1soj(W{; za$Y0%p1M6}8yp4`9Z}w8r|h-wAN6!XIrd*i@E3Ep``fzf2xm)b{Fx}{WBA_c_fd~M z+559==e57oJ$c<~o#!9bdVJQR6H%4J=t z`a|4@aEaP95qUqzm%;9l>GDuYJ{t1%kdG3%eos2z10nIJKwkWZz3TpZJAE#8A(MR1 zhr9>meQ>Nly>L*7@{B|H^*Hvt-HP>>_u!OVSW|ubWnm4Rj~hvJBayiHR>AIK#82g0 z{=_jbOP)V1^1^l)?;*F(lbtWwfKpw#HnUgy+{0J{IA*2$$O$^+)VX zLAVd$>FaU{pNnt<;W8HJkAyEpcn^e28`dAm?;3;;LAca0b)NK9PgUM+kdK7CXdm+I zgOvP~8aZ~CS@|U0u8@}_KDxu2kEGiV;ZqSlR6Via4yH+opt8T~Nc-eKYgg2qPy2U|~>#?{y!MSw4_)d|L#O6WVs8f9Fg zjTAt0&9kg4-FJz_C(TB;n7ABo$UTMffyIWU)*p!$|BPKh$bZQbEBB5oW$ z?6&^wGyW=vTin+3KI4`KYfvZ@rq%ss0;hR_=S%n7jf@qIpplRth_c&b{O)gEZCs3# z1KzkjJa(pan`vCH0y_2UZx|8N`p#o)Hs6H3SKQWA%h=(*$S`iUVB}u;LCj7=7bA_S zZfm;7nD2(wH{9049%H-YXRZf7OXLTNP0xA&X6C!BnA>>Cb-T)9#u-dMoBKG!-Dk}5SdaOPS3Q4rf$Z{H&-#qd8}!BTr#_{dJAQ_V_ek6&6;4;w39)j{f&%Gu5PGh zZtLkr#{2G54dZc-^?D;?gXawos$xUy<3`5k4Y4d@?y!8B&E**Ch_de}5xWGeeSfyLdB?4zdjrpI{B zw4U%7)#fuM$SSmVkMWqth2ziJ%yR2+(7%>yw(Px~ZUv3YRH5s#d@ve5T3o4p29<^Q^8$5%l_~L^3*r^e+8KTSs^4zr^SJbnE{>+D%$w z;`c?i^+UE1Zmde!0^34+WqtxwFFDqJZ47WdYrSPm@>m-zqugU{w2XNkYqMo6_E=jiW2MJRSjKzo`fFvo zR{rY9M_w+{^Urbp(`BrZ-0o(Un-_pw)M=3^gCAan#}b|>*_&lrFZqlYO!v%&66v;v z#$L}K-|-nUymI`o_em4t?;8l2>T7}H1>)E@=-swCAg5VNOyg1FWiwQ+3Ed&2Y+baEiG#r%beE&d^wAQrmSCexbcGIp5O_by|S%lg4(Y}cZ#rggW=*kxMy z%Md0DlibEn6diWt;a_=-`^EM`cMc9$x~<)AW3AhI#ADzzF1JtPyB^~K-6yn!YNdOM zYnIpe#EWBOsh~Y@+=Jfjjg6TNaQJohjX3;?mGozv+OCK+1^uksc$1}UoQI$@t&5GD z=#(ZBfLY8s)A&LMiLbvmtvwjHSezy&T92E?RZVU-jpwO#=;P)#^d+0Ux0`dajLp8= z&DXPxyBfJ)$TAi*>i$HQv7=EDj-zt*6lE#t{ugYQ?e;xj-kxLJnRU0hwXyL|w!5;i zu_fC*D+f)l2*)cLx5sgkC2Y~nn&UQ(v9`L5g{~HO%=luK!Z+Ny0FBW$oOM>Yoarh0 zoS-b|z1N%8(=G$&=dUhf5k=XznC0d@E~A3HY1F+Te@US+vk;b6$`A6{_k8au zsR9~Z(r3MCJfUs0x4IjLLvo6e7Pki;)&xzWzq`UT2DZS_HO*I;#x&D%wv+7kRxeCR z4SQaIq}s+^_h7_(+GoAh$k^etmNzo~(a??K)g0-LXulCYTkdmDZ*OeyS-TE~o3ApA z=~?bC4u%ikX^GQxFzkgT6ZgswtTvT;e5iG;J?YhjI76l+Z&}v&ZH#K4`<*t%0}bVP zjr9J1Yh-OJFurPJEo@^{WXW+=wj0N>Tv6HD)cUNAF}0Z-|Fije@2)n+pJmWNN*6uW zs0bZj)^g819gNAjXtKuIrtYUY7%w)v%rIVS{;BzGd*fMYjIR`0?{_f16BpmqPBiX1 z7%}f{f7GrH#+Q=sSsn1RP=40R&-d~(y(4~*OhF0ospi(oB4b6qdu@^NuGG&rWk7Apgw^_4YAa9C)?~opHcCPhUF5UoQy^w3%)zo^R zspO{+UBq&iB!oX>xvT|lW3kIx=r$f@YFUT2c%RwjZ>I5qHY3&NGV3Z#A(hU7PSAl|nsZPNF73#e z3&+{1X1!sy_{ubHm6L!>~k`Lu5*8sjbR5HXB#~3<=Mt_-kIngKFhLjyeG?ouw3jvkSzg^WlKO@0)CVq@%=&8 ziS}}Ll;S^_ZLv@+H}miBX*}k#b__K(xUF}G8jpIc>5Yu9J=UV3#!u2cf1GXY8fv`R zIRER$#)r+U`DYs6p-; zjb%qX>G|_uqrB7#pJ_Z-+8)OrA7kCx(^%ZY`lyHTd|xZp-*~E@_0=F_Z$InfLB>}n zZ}%doYET=f-g}xDfBG~FNzXdnT6CuI*y$}^KHb=8AMZR}^81mjqkcTYnm*LHX{fbu zsPXww3q`u;Oo{r;nbw9gjg@CwRc9J&&y;X@BKKa?{h?{RB@Wl4fA;AhGH&S2fa&Hm z7rKE@*f4Xyak+kU8y^VO=dA0)fx?NHq|ul<%#uofb=ud z`pLrT*}B^@9&^j_Ix)G|<3_+vPEpbaFyBZF#}lA}jOY2Rccd!oy7mSww>@mix*r+Y&P^_d^Yg<&s3)vT*na7K{k+9)sg)5^IV4AX5Ii zhL1J--UnA+I`t-R^^t1Cdupw-6^u?vT%4e zCGB@W(QQnUf|k3j*&bt_+rn-37_aAej62vmoL!9Sgjzjl8jD!WrY)_TOk)_Vh)*U0 zk=Z6k0B4$3j3*R9{ZGX;zZYD0o6jC@{N$OIjpo$sMejR@8~3-l&756gyjSS{@^B-0 z&^_4en02@Xtp$f$2zf(B?#=RZONnrpYID1!eYfk(N8HA3lK(ll@x?7$DR$zA*?q_> zE^CU{_{eSHTIS6j>pshP!6U~XcqIHsDc^3M+1!6NbKjC@Jk(iuW1(zdwBdp2TI;2yMUn^eT;fS- zdM0GpSL{B{7^IHv9{ew6tG7+#Q|71;E8Gt}2I>VS!|Nq?TU`?HE>Cn|Rqn=|`#Kua z+e7q7duvg9#zY+0UEB!{?-vYrii>*1u z_SxwI`D*vaS#$G@a8n$A+|d-EOD~JfqDpP4=$XlR>U z$@sa9H;>$zo|BLBsrbfpmHv)$h4ZETbXt#7Q}d*C_7eUE)RmCrvs`PskOK$sl z@pp7n@q53k^oJ04{GIX1bBRtjEIwMrA7?-068po)sJlXkbXVxquf>mH`U92z$kP?( zk{1z6h_&MX9}2*A+M16m{buQ!(ET6$yYcsLyOJru_dqVM z@08rBuJ4r3Qm8Ywc1|YO;TlUAe+c6*cEm5gcmMH+Fn%ttPvz2%w!dS={^M)CePOx2 zenq=$9r-I_y8DX1nDNUQe}^OfJZJm?2k0*jAn$$3{^M^tfPB)x{m1Wp>i*@%paaPF z<*54bdJp^`_P{R3{RjU_QSqsP{m<2kJdg?}2&` z{IBuA$g}ppp4xN(`N-h@)GDt>|dT{s{XLv1N9!L_rU+G2hOYSpZ;eZUZ2`8@j%h}_4V_Y_^V#` zmw8~)1@-momwBvSyWRu!9;o*~y$Aj`cwptI`tj@6JP(^Ls`uxw>Ca!=mVV|>-f(rt zvF05d{4fVUhFo54ET8kp@yLGrGgY2ZkB@$e(|{hT9^fSy_GkFlB{s_Y^W>x7(fY&Q z>MMlrU`CV`yv^}K6@d5V*q^m$Db!C1dyeVrr&eiucm<68*?OXSPL#f{y5wpVF7NY{ z4_*OnfAGwF`!gKxI*^YJ&;7fyq#vs^;8j~}=zpK+^!8S({0~{H^l@9bT^?l(h2iF|@GSN~h@fqD=80uSU~tlIT2h*Gaw?}1;<0}Fc8UH@Vn|0;-aVuF|?dgW~% z__QSYiKWBN##1OHJ7$!!DQDTf(L5vd<#3a!xZ3~Oi7{dYF-}YnlSHq)Wk%8``iZ5)05M1m5zB~SVuTna#)uWfI59y?61`2B zKG9DsB?gE=Vu)Bq3=<>7C^1H?AjXLaVv^{UH{nS6iGE@!F+dCwL&P#-m>3~Oi7{dY zF-}YnlSHq)gh$dR`iZ5)05M1m5zB~SVuTna#)uWfI59y?61~lsKG9DsB?gE=Vu)Bq z3=<>7C^1H?AjXLaVv^{UHzrB>iGE@!F+dCwL&P#-m>3~Oi7{dYF-}YnlSHq)@k!Dr z`iZ5)05M1m5zB~SVuTna#)uWfI59y?620;oOG%&TCzcWe#2_(5EF*@A5n_}WBUTXO z!~`)(^vYYRBz>ZvSV{~KgTxTAj2I?Hh*4sUSV4>v6T~FZD=#~g^of3ADKS6{5<|o? zVwe~qMu{RPL@XnQi4kIy7$a5?`}(kJ?frNjU+NDL9n zh+$%c7$wGt6~s6(K}-_8ZJ9pNPb?({h(ThASVjyJBg7~%Myw#li3wto=#}@#N%@I> zVkt2|3=%`cGGdq*Ax4QYVg)fyOc0Yq??FtT=qHvE1H>RPL@XnQi4kIy7$a5?9W1Ke3b;AO?vcVi_?^j1Z&57_ovFCnktVqW55?PxKQ@i2-7e7$TMt!^8+N zN{kUJh;d?qm?V1TRfYB+)DHZVmA zeqt#xKnxN?#4=)-7$HW9F=7QVPD~J!MDL+YpXeu+5(C5_F+?mQhKUhklo%sc5aYxI zF-i1xW%@)vv6L7f28khJ88J+Z5TnExv4R*UCWuL*_b{eU^b<>o0b-CCB9;-u#0W7; zj1en{abkj)Bzn6seWIUON(>N##1OHJ7$!!DQDTf(L5vd<#3a#sIMXNkiKWBRPL@XnQi4kIy7$a5?3~Oi7{dYF-}YnlSFTKrcd+}ONjwukQgGC5yQj?F-nXP zD~NGof|w+Fk7oKrKe3b;AO?vcVi_?^j1Z&57_ovFCnktVqPLXk6aBo0b-CCB9;-u#0W7;j1en{ zabkj)Bzk)>eWIUON(>N##1OHJ7$!!DQDTf(L5vd<#3a#sJkuxoiKWBYB++{!(3~Oi7{dYF-}YnlSFS{rcd+}ONjwukQgGC5yQj?F-nXPD~NGo zf|w+FPh$E+Ke3b;AO?vcVi_?^j1Z&57_ovFCnktVqPHK@C;Ew{!~ii!3=zwSVPb?B zCB}#q#5gfQOcK2(Gkv0;SV{~KgTxTAj2I?Hh*4sUSV4>v6T~FZ8({iGKe3b;AO?vc zVi_?^j1Z&57_ovFCnktVqPIWOC;Ew{!~ii!3=zwSVPb?BCB}#q#5gfQOcK2Vm_E@@ zEF}hrL1KtlMhp`p#3(UFtRTjT31X7yJ%#BL{lrpYfEXl(h-JhuF+z+IW5fz#oR}ac ziQa)spXeu+5(C5_F+?mQhKUhklo%sc5aYxIF-i2E%JhkTVkt2|3=%`cGGdq*Ax4QY zVg)fyOc0Yq?;xg6^b<>o0b-CCB9;-u#0W7;j1en{abkj)BzgxkeWIUON(>N##1OHJ z7$!!DQDTf(L5vd<#3a#s8q+8GiKWBYB+)yB=@b3LQeuD@B!-A(#4s^Jj1ptS3Syj?ASQ|4 zGnhWnPb?({h(ThASVjyJBg7~%Myw#li3wto=pD-RiGE@!F+dCwL&P#-m>3~Oi7{dY zF-}YnlSJ>COrPi{mJ$QRATdNNBZi3)Vw4yoRuJRF1TjhU4rBU6Ke3b;AO?vcVi_?^ zj1Z&57_ovFCnktVqW3JOPxKQ@i2-7e7$TMt!^8+NN{kUJh;d?qm?V0GOrPi{mJ$QR zATdNNBZi3)Vw4yoRuJRF1TjhU{*LJr{lrpYfEXl(h-JhuF+z+IW5f!gzE88Pq@?6X z`-+45(cFoU_Le)o<=g0kM|<&ha1{x^L;j@iJXb;G4!+pIS30;h)c>TDdKML*HR|fi z$6tN;pi3^l@Tx0{x_2w>cGO`R@Uz$f8cC6AoN@*TpOvFv%>OOOIw|Ms1 z%Eve5s#IrQqWA!2B2KPLw1vDG>_raVY~Jo#PZI)0SA1?4Nq^}X+F$(vHX znVi`*z9XMadHAx-{J%}^r+g>5{^y5htkS=hH}BtgmEt|9A0yZCHd=eM7OpHKb;^V6?P+3Q4pDS3DD2gy$+-{O$xU!&q{`T68J z{w#-lJ$V<}b4^h32a*pW??66|T$g8>gU=_|=d+4j*Y})jmHke%*PUFSk07~j4`a!7 zdSQqD0`kLXFHYW@yybN&y_?DJBiH5I;^5t`&n*802Y-dU9qnx**Y-zGRPl9wZzR8j z`di7hKX#K3qC9Yeim&U_5ORHft|Kp`euVrjw+a}2lZyX2JLLg4D}E;R=aTFEFL&_u z!J6xJB95{YjKu+h0cBmHJy8@+A2t z%Hv^WuMhuRlz*Gz+TJ1L#nd0_kdJoAXE^v$a-E+|q>HcJ~oi+@o1|f{&(d1{N~P3_77otJ;`CD;C% zLayya$aQ;OMt(cv2WBe!T0Vwcj|UHuccT6(a$Vkc$#wa5kZb?#CfD{0?@;M=q`ltc zCy?JruJd0`K8*4$41AS+4Bok)KAc&liJhUT zWlyK~@6Jc&(w?5rY$3moIlA$$Dn0Gr8RXg@4?6f_2Y-cpDeaXlRrd5hFBXvN{^Kk1 ztEhkOGfID)O9iZXR`Gi&4=qz%*WYsTPL#(Sd?Wd3lpkomb;xtdz8-I!^RM2NYkv%N z=#O#m8_9Kjm_@GJ(+YAuKUznw?I#?37kOKj$2lKtxm@L6$1f&7i2D7>b$uK~uIqQq z5q~v#5#w(q*Y+AbuhP@@+LPZ({e|SeBmb@EtL6%oADzD-zCq&yQU%sPgFfObPiA=5G@DH1b9-D*fllE6DF8AO2G2`MS!%XE=D2{948@ zTB+h+M}8len0igUd~LvoLrA5FOuv2d?UHG?|LOOej)k$wErEsULSZ~ zRr-fg{@=DSnVTXL4gD-dRbq>CrT+crny_T6? zM{+&>2FUe%;d1hWd49?r@fSMyDsr9PCWm}CxlXUJLgh!N*N31jB=?BSm`r{mYnuE_L*XOT_yf^*VYjvjogXB6t6Ug=adoOt> z#_#wy6<_NI$iJYx>l>N!)5vxF@eY2ULw^Oiw)e=Jnf6wZYkOaj>-o=4^6tz}@fsEX zWb(_&b^D)0zDVc)Ev2u=hyVC`n)%V^KSZwAhil38c)r=8U**sby{*cp^(T;P`?JWk z{VIok&O0i;)-QJOz7Bpaxt`C29sDVBJ)eA$T+japtySsi_+<|M5V?;3B)N{?>+hN6 zJ&j!3o8aINlWTj6$+f)`-pwrka0kDNT>Eb$x%T&V@~2qe9(+&P)BVMAa-F{|8`g0k1Z`#{M-h;eky-H7~zlmI@ z@BL88b^68RI{g#Kb$XYR>-3%^*Xbq5_5MW94a&Z5|NY1ZGJiA4b${>*`2xy+?fsog zKg!I{cyfLI!wx=&T=%!_HfF{zCfD(MI`|-R9sgZN{EZI%?GA2ytkTo*!{mB@s?jG( zuK7#{Z}zE@>;0FmU*h1a96V00?d@>LU7J+?b$;_4 z-0$E$$hALKkn8$a;m}|2;9rqze~UA4~{3-`$w0O>-IH+T$eXW zuFJQ~5r2zAe=oUCulRG7{wC(fw?%Q?|CEyJ`P2F2I{!P!b$$!KQ1J)R-WYQ2zpKdg z{$%feD1E*DoK3Fn`@d3hZGR}aw*Mfxw!eT}+b`RmY5xs!y}sB=el+uYp#9Kx|5WyL ze>0R^kC$V~_4slfxz67da-IGoJ(bA1BxLH<4@md&#x^;%_ta+m~GL_e^ofA9Tn!Ipn(?@?PI%+7FUz`*X;3 z`PMk}6Xd#lJ00Bhy|S;%)0JGeuM-@62>CMIes-$(y1sTN*YN`mKHR}CCErAQ1AkEV z^!#APkBaN|xRhMmuW-n>lk5Bx>{9Wyepd%S!NG@+>-?1bl$oEaDl_wQAGx-_$RS@x zuKmB6T-PU~O4-x(tr5BI|GJXv_&v#W{NaxHqa5+4IO5N8#9!=)zuXajqeGr>@Es1m z+rd41RQYuNo004Mmyql7_axWlKbKtZUr!>}`{glm?f=!}x_(aDtJ3er`t>Bau1|4t z9e*pijz6zDGydD;I)0K|=ie~Ac1oHza_~F{Z%3~C_e;rjd1sQJ!2GXq$ags8-At8! z9`*Z@>;3wf4!*&mzum!UrUu61I-AQ#9PQ@*y~m}}>tHGs=YIWfz5n@J??)E9Rr$uy z1Lfp;|9Sy=bIMmZ_*w_wLaz6-T^?n>i1FK#>+@GiuIE2P9P-iR`HVl&!Do}}{el0s z{lNe9e#Ni7o;uKci>I*$HfBqED=hG^y)EGR%w~tWw3(_uJs9Ia*Uz?5KS=$)%~kv( z$j6iG_3M1{GRlAH{XhkI%D(RZi^+9=+ta}ZIrN>^??yP}V;u3XbMSxn`rZuM8_e== zAlLo7^M0o-l%6|%opQb3c_z6&AD5Hs z{VC`DXVaW=2Yh?|lI7e{gkF_8y|WN62p?@7PJn{p175b^RYtuJ6zKZ<~({@2tw# ziRHVI{0s8`^n7J>vC5y`&)Z6_^PAH}$@TiGgj}}|=lzb(>wN)7{4wN*vHTJ8-sA_m zzVmC(ui{K!*DvSwlI4f0^6UNfoUV%N_16e;J-$1yr#P>Nj;6lefBU8T;|H1#I`?;v zC{g+CO8=fuK8t(@`5okwj!^n~KIhy&UQGFB>O1#`XC0ZD-izdVyjx4YiSZX7rS$dw zjdMTxyQ7s{ub&G_71#Eh*N?kWuJwQG{m5aC{DjDLdvRWGb6!t#UJswj_jR!1D!pM$e>l0`kC;fV_amJ9AIm8}mGQmD zDtmgoW^fJ6z>WMa<0Fh>K0B{ObMpk>nj%o&&AVrcht^=g#%o9LmSgo^$>HV9|`!${SEB?~^Po4Lh)~`?1`RdK{eW3NJ^Zr8T{e#Z?#SU~opY#5<1KmIP z|NHv*K=+Fs=zcKg{Z@=DrwUVnTyr1X1J|3KFxn_aB*+tQx%|BxkPl>9N;`+)pa^7}4P za(zAHK-V7+v>ta}zjLlvf9v(4b3IphsVbk|Us*tYJip^YTx&eSxZ^TLZ1HhCD&qMb#ryr7_s{*- z^U>dWe}3{c${)IZ&vx)AxxQYrjQqc~{=e(U|27BrPEh_B&Wdq9xi0Sn2cJc*=aWmx z_5BN9ksnNZ+1D!j+Mb{M3oXA+$vct%r`zk1%#Y6RAO{bTU&8#ZCD-+3Gr7K>E&F;^ zKFyCN*Y^kXBiH}8ewSSPV;8yhcfmwuPhU@P?njnTuJwnK>-&2qllNx+Um@>7{%g;l zchmmOw149bD*yWasj1}JfA=}~BJwcfA9xJT*mA5y+y^}#P|tveg9VRR3+E<8x0}X_C`76(;R#Wxh~HN za@{`OAlK#F>d^m=T-W!!+f;sZ`FfM<{0t>u#_}|pru6mwQ$5Iac}9}!{9Q_}?M)=t z_dm@e*Y`htLay(3I%K*^FOTUvVXi$MpSQaq$K&4Af7zup|F4b5u9?aox;^~2%`Xcb z`7d?wA>?{|UEq+vLazIlPaN`Ht|nbJ>HHc*Z#bbT#vV-%T;_mzDy(6 z_7{Zq4*ny#?ti?qlzlxu&nDOY zTTZV1w~<_r&(8a$zjNs4-KFg7`=k4k_h!d1nfxj8BW5dooxk4Xzt#9Xf%f(IT}7_@ zL+{-xKia?f4t@xEnE78!uE*~;9Qqp_e7l1ik<9d(k?ZmMd~%(?G30u@F1=61pT+#F zCfDP|PV%2So)5TR+0*rL6uBPH=acL4e7!^eJ93@hDsnyE70gxk4`F`$k!ybk9efP= zCh8A(K*iVN^|Xf+*Zs#5a&2#wL%xk%`zL>%im&w#A=mluPOj@`UvgcZkq-S!$#wgg zL9WN=eh;hk^!R)gxz7K6I3H>H8hj_<@m#V4fj-Zo&W2(6?y{qLhasx_?B0gaYTX10 z@mUuFEZ-9RdL=Q-_ktXXdIO&wYaI?7in3d5e*@c=?=#Rw?g>|zM*iAA;W+F14W{AA z-)o+X@@1cf|1{@&Tw>1E!DwuXFdrFj17T-;b41H*B61_w9FK`izU8{Ck!eVXdAw+x zDjJfTZxCep&cLx(4x2VV&xJUhSNRO1*~O?UW?wl(GR;j9nWvaHL3b*?IqM)Wb@)*8 zUW7eW6W(M4q^Tbx&m7dpG|cl(M|=K4BCdw&x|I6Y2!qmUWX!zyktCJAfx=INJ-#KAD6OjqzTQzc> zNdGvL?wQNc0FaS=+^jLUv@j{096v z*j)5zRZ^pgd~?TCh z`C?@E%Y~?+cKq8QD^JN=npZDH{B5mJEzLh8{CSbtZA5uaYLj-~6MbOnr)yEA>=UsL zs$bNYQtHxvj8>*y*InkHa2eh{r`1r)vN9|~Yd!i8v!OZUR>P2ZW+!NL6)kmUTbUn= zLYBETYAS^QgoD!+Hj6@IbJDZ4a503Jrxfzd50{}_P0U_T1ExSwE<#m2yH4brpNK|N z^N!bGDGKS5S{l)5&}eRc@hLza@3^j(#yYXl!n}JnY{&zXk`9g5<^;oRWp*!QIdZ&) z(E?uY=`22uBP@pT4z$*0gY*lrpG(V6MuYYelk`Div{%N4<^QsP$T zZLc7A?agj001c5txrQjyLN>rw=C{KU+QIznEz@Wq3V(rcX}X0wXCP`P^QR|Fqp>Kw z4dI3w1yz$JQ5wi!R{c364(hoNJna^R@&>R8jxRi#Y1J5@vz^x_bAalvXfH3rAh0Gk~p)5^m zevtAft6=a`!5YV4x6ei=gOaP!^yEZ%z%Zm2N^h0|t3;XL!ip}PDKR;Cp4 z&D-*!Fv=YD5K?K13f~rAW~BgGK?a`a2+?RWzX24Fg7ieuP|i7CX}s|J_~W@`|1> zj5NbIV2+zU_&ri_9W(=Nrce@b9mzCYd3LYlI(F?UwzlPn_AMB-iniT$E!g#xNVz#BXVLNv;!*8-w7M2yZX4d&IWtW?R}llB>^~avG0; z@T6J_(jmD{`ayb|;Si3lr6B#0>*NcD!osx>-r`Vbf$qrFzx_wd;arFx6%|#&7U+#! zr^LV0<%i_ubm?`5>(ot+DP0fAr|Hsb4A+w7!ie-kt`S#nWM_3f z6mE4WwKSy*ag9C|!>&0O!X=`h&Vr){q3X3i>_LWKhuY?Ssj4|#b5kmp>n8Ji=ULY95_B(z>0^X3*=9(rpM!+JUyU!_DrH4oqp(IxkmWi_G+_ehX<{0JU)` z)s(T8<_(zjy8|(qCEWsz`%_xA44(5b432o~P8eJawTgYJs%3$DtbZvoEiU*Js$Zwn zTObS-QI-Yn@eg4%v6Vbn)aK%=yw-$DGF5UpEeqUteDDQl^nZkcy!k7qNOGu?lVySX?$_o~X$}+~s!>8pvMg}lpL0Lu%OHCx zT`rS#_aiNDX2I7(_NmBKO~^A}T?qNY!%j1e1yUJyLFQ>vlL;2*Gf`S{_H%|(Y72!f zwUlHjVc5xC428>UETK3u<9EM42yO2}zd7v!Y+K{R*U z9c7SBu92(awla_TJ(L=m(_ds#bD^=ImexW{_T8<`RR>Y)6==MdsijWBLFQ+$*!k27x>$swk)CZhB;lD9VYl%Nfd+aQ`(f-Rq4A2!XNf~8RFgZg3L zps;$7VYF^9hvfpid6Wara2CQ6Ke!bMnH_N$BxzAyd8p< zQ^L%CAk|mZb)=0PZ@voypQMb8loayJ@t7jF?spEzWs;*Gq2O+&^Vft*<8DOePkRDh zv+GkK6pBUZN{OO2K=RB>vHory^bE$N1xCz1P#9cGX$(ZI&mVcKX-t&3At+oWO13++ zC0i+U5XM8>(sU@?Q_GU{Fs-lf{Ml3)Ukrs6DND?_Y=*QRKkpzay$^-YYAH#t*ZSJN z=x}Wp?1qB3c}<>dOD)Z_%aQRL9y=15ZUbTGl!6TWh8lER&-~~$^U-5?7()53TEPPsutw6I26pt2V zRT*TOgoGb$3x#iwm5MMB!eB~aGAv->P}v*FwK7`*%(0M8PH9YqMw6N!=+3_h#=4si zpNPE8f!<&DrQ766*v7&p7oAe;YfW>5X&fq9cnc9eOhuAf1+5pcGHHF2xe}{LyRZEo z8oO(>pfD5tee0XerafpTuLZgRd{t4QAUiLuZ!t@D8!DZnA?%f|aM63PaI5+EB3cMS zcwV}K^u(=iGfzRr?VMf%;f?7Em%fK2rkhKUWm{nmg!5|@R0C~geuHkb^$c_OZA|Ay zXuMHN>zS6&nrZGhlm*@bjU6d1y5)J%nq|I%)uZi}M&K>+g3Q+>(ADWTo;x@jE=#yL?f=xUyb*a3WVB#w-8c6f2^i(R={X$5R@|K!ZbB!O8bnrqNdteFX|{JCs_Q-7yg?IAbw-6!UWkcV;Ry zp()RiDAoDXws62}+!{3m-<$zrSY<}d91B869ZjVpp>RUoN@FiT=W0)Ieg}n%Qc8A@ zo@Z{uQmx>sEbNb;DG5x3!p)+joJaZibJ0-58RlHb9<4EglFutecCT6aD5elNi{=W* zUQLg0%dh=%3lPx$PRM!}REvddyK6B` z>AKLjWZPYf%aqOueG3eiiv@|*#&^FQ&cjbu9wv8_3M_LCh_cYYlpe3fg3pv4HCKm` zMu$I+A8m9tj)fOGE-Ar@JHoz(*yjETD4V;{XQt6+?io1jbSpN3J-Ndhw>1oZ`6Pt+ zyM$0;qw`i+GCLoRS(RD*s_Y9F|1k%?>KuAQ!rw!GVRl{-#&4Gqf5LCWc7}1tyV%by z$$iFjwVOM|&X$?|Rssv_XU(f7t86|K$L8KL^E1q{T^)Rfu3Z9pzWIq1D9|6r&zV;t zC$0{~jm?$FYVPx<`49r4_~sPff^=|k(iW^V&1DFT*9e+)gSbg|{B(_=w&k8~CT~Jf zjl;}`4+eeRoH785IP)7s*jW?F=r*U5X-MV{UxFQ1*+9pq^EFbg&O0u~Z}IxI@_V#g zAne>xri`5*g3IBVFC@I5S3)cqlZ!h&B)=p3NXS!|4Vj&fLPpHa5ey?{m$rA}_i(J( z4tcSg_EP2COfOa3_jA282ky@B(rXA%{(d@si{Ftcda*dx?A+*T`F#kh2($D13-DX~ z`U9eQ*&jt``s4EZ&s!wqul z7Xn)%StU@O=?fk0nT1O-JTtO4sCgJ7bgzk|>Q61tY{I(A?2HRXDCrBAiwDl{At4Xn zF2A#|qA)veJ6NRS(aoEk&vuEi5*8fnw>lSD92;5@nsfYhpC|1c^tYev&$Q@K)RuQ zMxFV~KQcY@^IKB_+0O7xb676GH|N-|kXo8&x*~93jX>3z6QQF$^VpXeo@s>1g4?_h z5ysR++DDz)f*#ZCeBGZ=u40@P{GN7=ly@RlsAlIE&XnU5`iXSeU*&i-hDfux_+-)i zwxfhR^bUTzJR`A|cF3qRTd^_tuhkg?hB7>J7y`QEn={^nbkaN%K;Y;afvPjtK}UOL zg^7+O)f?Y>n|S7WM3`I?$tW>jLZ@$%9O>oXYamPL?)QQu?J${{3LF`PyUhd&Vk+7+ubc1D->SPJSfov97)z$Nus) z2=%{v7<})4=mZS2{;Qrd44?m*H!;xpXZA6SB7d-@X{?kP{o|M?S*tJk6qmt!!t!hw zxF6q~myVJYa?K7fZ2igX-+=cLJe?96?WZG;Jqiyh?}WQIMxrGZ9J(Xs5v+1ayg~!PV=<1N$tT{&H!d}-NA}qhzl|8|Z zSF)mJPj3J_L9v6Iy?|b;@I=MhH+vS>SqpnBn;n~N#Nc1pN6Ctt#lHdTt7Ki91x|zJ zN!!stFylGOlp+-R&8a9t&Q1iv-`!Wt#H*s)7D}-sCr8J?cO9ata;f3O$ zP}WLR(KA_LjxnFT0V>BFu?7xx<+^OmZ=mJ&YfXE7lln0j;PB=xii);ume~q&#-K;fQm2DxMU)$!-)aBg%+VrNz5)Ej!9|s6U*FB5MJ)abT|s zjxn$O9I1?Y?07qOUOUQ*Q2)je#g4bnAIS(xYTF8(bBdjO1KU=k&geGqRc=iACGCij zhgBdWf7p(V6Xe}zNA8b^7uOZpF1S=WUGNL@Orz};WB+QGqM;pm3L=)LB0sCLcrVJ| z_R7xEd|kPXY{kDo>BW?yT}WzQeGbh2G4i~von>o(1kEo~+L8&Qhxz>+n7w-HXT0sk zm78rV`_S(;!8hmhBTy`OXxVcxc+ETK*@bLu>vV;@ujtqnEzK`HL1$w^+jjPS4ecm7 zc9aXCJ}wo-t^xGooG+n0cj>Wqj+@xpw?nfcrR_M0wksV!wu-bdwY_gTXn*kvEtRyE9F)uy&-IWmqlJ7UG#wvE~MC);dO+iXvm9I`L7I?f?x2bm7J za+}$4E{FbYb;U_FjbqJIXQ2o^&1289BR01qK88rIry{2EYgeuG*pJ}qRNLR1mwaNM zg*-d<7l>)0bKr^FPwXe5)pmlJz1oi5!j9bmVJH2J*gef9Hz4gh%`>p9K#^P8vCm7z ztnp}CPk;rZsI_l})kRUe_R=L5{{1D>X!nQHaD@TAxVvy1CfV&SzY-?`t0s40@=jd& zy+YA!_y42pJ;0`#+mbAbEl5-NtQ8E&gBteo&5JW*lK?MOp zMFhnJVn9U%10cbSm;(kt5e3W{!}mK?)zvc#kKh00y1J=4_g$xQ=yQ5{%N`sHI=QbV zXNJmNcqQl*v+9^%alQp&KeB#^kY?e#~*8LRksQW?GK} zR)umhbb^(N#$V$MQK7tvWyU|_m{y^JiDkvtuxnSyHnB4CUzv~{Y@-0-Z+HT0Vb9muOhKQCYB%na}3PECe}K> zk#j_ap(e+k@pcP{U1VZ?))3KLCqk%}LY=p++eqT(Bbe3^+ZRq-tnoou2jRJ=Kptin_&QK-^t6%Sudbhlo++zo(>0t7As^aF7b~3N^GdU>w-wWW3c%@ax`ZyODK4-2k>U z8E+Bq4}m@A<5+k(*H^gZ04<>QB0ngYu7@dL3$^PF2rILCTR+1wKXD+E z&JYx`v((F&3`Yu6_H+qi-QwPSJ&vEp(y|+@W=NMmrTaUe%HCd&Nzz1QdO>=L`Ip^d zx9*8W8KJV*mu5(}H1VaxZ()VXZf$#t_||iX>!ToDMZ6scnCy0@W7lPb;?aJ@dl>$P zjCeVT_B7E4Gvfa~O6uMw`fx@|wVnE9cdYrm+0R4jAXWH;EBYYiQ?W<52U@CC_rmHl zexAqr4Mwqi$C5rX{ua%ztCrmjzgzLSfq>LQRf8J4gHWKAntlfb=+^IA#H~augn*Y~ z;UZ;H4D(VL+)MTnyOWyjCG*lgjfo_?+dgKF&h0iYExG;FOA0b>3%PCfl98K9QI$su zo#J&bg_oO2wvt(^zV?zCtb~$I&F-uIM6T+3O~ByS@_s6gte%tWMCK-K?jILe!(acJ zvR(AgE4C0_NYvXU1bBi4xnfkl7<}rpivs}}9I75zONZ-GgAz@e(To8jT2+4t7YoUhN16`O;n`@q zdO$HdBd>xm-)REhJB12e^X^cKuK~L^8UK>AYxcsA->^%{vtTbd+zjuNfi^c_Q zbq+%~C8VVJP)fZ|qh{aOY7|8cQmLq1NkuKC2CRT^@6pW=DgmD76QmKmTA#m>yk5>_ zHI)TlbpskGOx=T~K&4cdS5WoF=&2AU0bVTxlb1fX$qkG9*k@67aNwt~mO2Jc%(4y% zTd!0h)~J%SZ$htB;mCG?bP#_aNuy!ny4^s1(Unm%U#F8J(}C?PnscjseYVqxrhT)ZoA7=Af7vD7%#Ns9(srV&i!sCW`*42+)L%& z#VS`i_dHA-WpYCU@U!MVGy)$(Zf*1@ayPG%C*b8Q`Q>u&|AbRbZmw((xwo>9W#_JY z3R7KfEy_?a_hBp$m2%%~p#qfy6(?7~tB`YH+eRE7R+NHdH|0QlJdK_+wlPi18XeE$ z;GQ$i#0tk>yN1}MGDqZT|L^t0#>)tmr~P7$NHfMc>RigJQ+UHhcKn>ZM-MV=8VV*XFRdP=d&m7~)AsVxdV_TDFfl;ML`+R_ z-A%T9i@X$GZhDaJP47TSHh9SlX6w9PJ%xN1m#K3smzoFan+AD9z2O6O0b+7v0bf1@ zOJc=_(izf}4Q?Xt+0)9-N~gP;?PTL&wFu@bA>$cs!uxMrQAwa;e{xi1A_!Kot!e_$ z+JT>jbihwc)^L1c7iSmWarcZMr;O79Y%Gw2HS_g3CGd#Y-&I zU3Ksq33k6rq-s3Dp0df6P_@|rbw!Rfk zx->{a2YEA9hvgoQ45Uh|FhVgwsca&$PXx0G7O#srIlEY$GOe+t?5Ev|)fJw$rM$yQ zs91fo*`V&MHliOKsQ{AA( zfJ}2}tN}G;yk60r{8rXIWcS=95S9x`H$C?8=L_#UA|Qe5>eZ2!WPfK1NZN(xgW(ztn0v2SODgC21<9+7+k7 z+d7tIk!lLq#t|6jLz(`?cD*``jQb%Unv7*uCEY8FZzJ7Qt4sCy)IpYmY*{2w?%vw>?McCw30Ha>$NBeshe-69G`-IQ-D!gZIV&XyQ}SN zyQj6{{Sq$Q?q$@0_fU~g$A3jd4nQpdliHz-YRqUXwov`Vz)|f$`=&BXo0e9`Y4T#5 zRr`51r%BLe3DpdBUEfPO& zcnyWC^K|P^ex`t30fsuzS462~(h?Y<_ff_kj zSI=_R5BrDntZ;gO4;GH;6W!W&X?gI|Iabkh2=fXk^46axCh=OQXu2K3eFZdm>(6Jy z7`590cR7Mve+GUA_8#(2k}WnoovOt=2z zer56IU>7*tC~@o0x{*}kBG5|j{3yZcikXis^v9R<2#4~NzpRrE?t_RrctI#d# z)}Ox@!gvw%om7VD9Jl_Iec1N!x6u9+su}9K+HU>%_aR%JEM{vqS2D}3Kg$zj*$}j? zFibaVJ!O<#e`@cgl?Q-M@)^6SXVQdl>rdzLa2LQ^>T~trWc`ujWT5z+70EB&;#Fq1 zJwEE7IX=n^wZ}(cyW`_~X!}Go9+ahlo-@bCraaC+idg;1EeI5SU+|dpwnysI2gAb# zAtk`7`XoC>%<=K)dSx`VhR{n$Iww=bBgEbDamvlqa5R!DeU=nEcHFSc@$oIO&@4f+ zI+f*)kC%N5@tzA zHv$PJBBeY*@ue7N=z{K?)@&DW=n8~P7xWdWIl;@=bX_oz|g#0h;5M-pTn zj!YnJx(P}R6OlP0XhE>}^gH#od4Q)pdu$ip|GaHVS^s0(oZV0bM78=6-alN?cO@44 zn7i9HH=gpg%`zA8@+_BS>1D^;HXr|8wy>t4J%w>h>k)=&d);W>v3*V}*~~`6o9MK; zZL{AkqG&$A3I`^w65h6X1Dm-lAVKvAwC$->w{4bLAdELb-**gu+dPi!yJWfDHUphF z2XUEt7Th+=gVbE#p;<1e)YvT|IBxeEhfy z$iP<%!EY6g=@Z@B-nKd6b9}@?+63Y00*btCb4@LNcq^ngAsi~8$=f!co($m!z~3E# z!EKK1J^M4bi;-~_mnjCA*)~sCBVBdmO&w->$<9Z!ZO%T|R;CZEL5@j#nPYqQ)3%7y zz^-<9Oe=BQX8TLXYbEIV0t~lpt`6FE-vMK{uuQwVZS&vTQ1Jo47rqKY@@q7EZ2w^$ zmHiW05jr%f%}wXHZS%+X?6z42T3w-LGp!AUx&`z;pYeZfn@^X3y93^SpQ{I_U5Z#&u4OcY^*s?e3@hCTB$$Z&=nI-u z7M@s@s?Cv&n^yy9D%=cRNi#qPvn42|i9|$##m7I%dwzwwhq|#)b>!)^koHc>LRCTu zR;ah?5AR~GsF2)qXz4?M{RVOtmi|yzL6|S33?VVxO1=(0_`!RLtwz4#3=eYZP{VLrdOxI5-!P!1%<2e)uN^6HzPgkmD)ozqbm{D*r_MEzg(ET4 zq)RXnIoAtTyc#EOX8FVg2;vuWoGM>Vg48)KM~m|1&D$ywl23 zeTeFFvP2-TM@Y?(cJxV70!U_aewx~9O~a8+5t7cyEE|y?Ful!r#;vGY2xFDcl48fA zhGjPAMLX%Uhhc0>WueBH*IuiMn%4n8EI?pJNYzs|XX)XD?QQ9ca3n-#=_V+3OGL6n z@Dah{Ur|_|W=HpN+p_Tf=WSW)@*mrBlllBg3f1ZcGF-_OoglH;RPO$^yuvJb*uP-x z@L4hn*Z_?+Z2>0WpgIWpl`!ULJ;E@pE(L*WtZ5HiMXA)^@X~sEdAe=6-EaZV1*qvj zqeJKCZOiR&3+N%LIza1{N_E@viHMYH4Co}s@VDiwku6M?+iiIjvJFmNa9e%~WS2u@ z^QEo4ZFx7#s1#Fu1mUodbVGRC@}PtY$VgRx0EK&buvz)7HSJg}6_6pX%7IrGj_DI! zdv9Cb{T*M{5K>zR-3uu4w&nXsqBV_yFs*ZQip24Wq zJ^U=RmxOADx-PNXmgnKl(ySvezAeCV+w#E4)GLkglgX7@bGt1UTS1|6L7V%G|7%+w z(HCxSco+FxJvi+m#JX}0g%9g{A~FM3x)De)5xKz^jAFJ{oJrqgMk*KX%XYE35}x_m zQX|Q(_xD^;(Wcl2XCPPVFDLT1 z!4=4gw?7vnO`$_2`?2g@vyvV4b2&hecd+cfWke5~Xm+sd&?|`^y{5mQt%GHYv?lt6 zR4Z6%c(8-I<1XUIZrCczz$EgX#TET^Fqy}^G4>t|zPl-hnx&xYQyH;7sOIn{2GBy) z_>BX!r=h%;HVoxtLTXng@4vw0y;(|{0EWf=LwGNsmowzRgF7rI%^y~VOR!|3O;>}V`9m>h3a`BO0!Nsg0YTqP`B zB+~+=m1eC`#d&2;=Xe{8d(P1H{deekK&`vqj_hY)yi`C}8Ev93v`wAbPBVQ9`lZvu zPfYH_w#C^8QIL)`6|x;)ugj>JdaJCx;Vl)AF%T&JCpmJskdoUce;qVW{!&tVxDd8G zT=YTnAkjWdD(sybdOtIZUkV{s)3{wN_$a|+1G#&oK5yNEt64~^xoz-CdI)%ji(Mb` z%Nij)$L$Rv>72~sH(Atqhl|m>DF0CyKl>~xcI*nnGKY&zvtVT)DamDZ3CkTWzNiYJ z24KSi1m?9=J?U`4?_c4hiWk zZz4IVCZIip@uk)y4ATL+<-BvoU~JAoH45GYr_G%+u4Lm2s%rt3JJ9IR`FZDzjGsNL z`DSR(q*C2EV^~~rIsp2fWBBKcuaJG4EVt*3e~}d(=+(2}Iinm%b%(}INLzX5jI|r= zBGVQ^Cn4#E@Xi?*cI8L@G_x83G||CkiLvL5o4!#28U5-y@MXd=eWGjcoim0-_+`0} zHbU51K#_OOc<@d3Tp=BR@Nof6-Z|rs_aJ-^_?siRb4H_&!HN!I7IT?mfSGf~{7GQd zkT-Fd=_NZU%{k-mowhQ)VGVRlcg~pkoh{;2u(=NR7I*8l8;XfWtpHtDfZ@&=?=l*s zfz);wyM$%h-JLVGo@BDV4{+31pWUNt{9lvfd%yA}GIsU*qV3(R$wfGu#v&eW8%Zq211)E@E z`SBlCflV@1I4^!nX=0a|SmSt`{lq4lSo3&m##LmBiM5VDIUg-k_vp&Dr-2I59^r_z zO7%Yn(fB$Bgz3RK-0}Dr9(~?iQcYKU3JyNB-m?4&mZ zr499qUP-SD>UzpF;1_9AdZ|E_CbiF{ti0r;bv=)s1HLZFM>h@Zb2zP5Y5GmRW~XWP zNtlI(xe98w{!Nm;Nmisg#co}tSto2r^eg?W{9MYR!ml%lS5+W!t8x$O{0iyBD@eHUY>5|2mo!oradNNH_O)kp zei5ByKlHc#B)Tq*)!Kg{w$GTU0>>L@a)u`V4Dqxh^9q^fb;w+*0)H4@Va+Q$oI?PY zsW%zlTMB)hwozi*rikXW2JhuKx<$NZ=~#uDb$vxfC%-b(>`5?Z3EK=YUCj1s=6;CX zXU)~bVw$+zk(f%KWADqYc0Z!XR&H|Xx1j?}Ff4{;ss>IYihpthuaUO-$#QiyM}04r z7XOh|x~j2OU{ITV(2r#XLSLc3T2Gl56)(M#m8*JAY$W;uU-0YZD&{$g55un@mTO{Z z@wI=k5>z#@i2m7e^=c+oH2wr9@9Nb}EHl189cB%)uJGHa-C#8hRwlkLomifUm5o0! z3uY}7%Z_I~2Ugp}D#z>4IMwTzShe_I9>A*S8=ZOam)H%e+o!+$_+PBO)$P;YdGTAX zB39p|YaE|*Be4c1UGw-WjEm|GO{{hN8%WiyIkJ7A;=zY_M5^Ar$w-Ww=_B+Gpz14; zR&S%~B8>{faKv6pAhfZL3e+gqnP525lluk3xyAJDNPvIg$Y=!T?Z2E?@@iBIVUg=I z2GtUvw^Z4YYw@(?wSp6>v`7WZ-rN&?wM={|@g~26*WQgL`MFcDY;VqvHS%@VmDZ_X z2_>3qG*EA%;TTs`vQ}oDl))D3#Y(`swNGeGl@vz(#VzAvkL%X0i)g_bZLh!E?(2+Q z&8`8nwPVMQP!w|vl8{W~c_eH9@m@WO!#c@O=$E)8aQ^z7QlH=XCOv_QY0fp^w>nO2 z4y_Us<2LNEOVHRQhlPv@6xHlUVeUv}Lwu+MYP&sIT&s;~;s=nv@QKAQ(;5eS39(0a zwtqBcYNEOX2N;)aFiXtoPu6{gvOPg8u8B1uHS~$Hq_K2lOhjYf)07c=i;&}*+#lja zLT*_X6%?^sH+cO99M%d;XwGc#Yn?(kMNYsOkjbKoo-EC|8+?=F#KNW;nmFi+-db5n zO?(N`r>R7L8$tJu4peB!EfuuxQaZ_L=!HhPnp@qAq%AL6maTP{*2Kz?@_k~BJZjol zz5NQr;qBXUM?i_oXmT%z0~{IN7o*8}aX^Mq$wsIhwSR(O}3;+QOB z0N%Npw;s-Br_b#9mOT3XQ7W*!md-q($!|dX$SL*6M{l5vV}E6NkvWIvvYLDvVvxeQ zKH8p72`=s4N-Hd&jQq#NQ#M(Hg14{tA36HEuq{+CnR3Yhn(h zS_O#h)l}@EHI^>r*$iTiCZ1n_6sVFj2|rnl3Nrw5KR6CG_ZytT!Q5e+`5H)WvmKNm zkS?7aj?CwNUM_9hI-`+<|K*vhQzWB#=m{ci*T2R>)k20(+iABE)ITl^RLp*f9Wmpg zLr~(GG;_uku{5TxAUl}lU*z=e#NsW znJAxflON3-TEee@Y%DWga=0HW6F>5t&&-YwXQ9flC+TYOC)N?W+-S+~eDUasF4kE8 zQaEFV!CLEI3VX2&;@_Vp-CT42@2U6AjCrO)1N82jG2fJWi1$;>h-#2clX>UZvR6M! z5$zW~iiWx@r(Lu~B!h95(Z(b$!&kyNMP;-#uQitqmA!}`BW1KR(Q=`(BU%t`Z}QC! zmHh_0Wk!$rOftR%6D<3^M0+mM(fnXp`RQ*)FQd6}u%!V?%&*>pYB`K2e3qy)yG?3{&FoQXpD{?ufKe}# z;ystjSu$iyWeiqdf&A{!*vc!=IbjBxODN44qB1V!2R~f4Y>r`QIqF76e8$MVPpN>U zQ(5X|4$2t|vB{cstrKZ`N_xE@u~L*{Rm`|)__fTXQOKwGx;v9E(|0y!p^W8?vh*AZ z>Pp-UX{95=SO6?n|=0d#ZwkLE3VNEPCo|fRUEwMp*iNB7}l#<-ntPI5S09*S6=@wSABkb)N z8(ZILf4n#l!f;0de{3rX9^0_j;xobK3GTJmQP#PPr{*0bgO$kFyR@cGSt=yscKehy z*7?01!meZmi|Evh7dlE+-a~%GS76T*5l(Lz`?^vB7Oiw$*MA|EoZ#vzU8_6X%k%nn z=zRG&InR(@uMM?<&`qJU)Jnl$pNSt#4Zkpiy-C_wwdh z{ARF~$@s54Yh--fWSBjRJp%TW;9jFm;Fy^4`QYa%+bhW5b7{@q$LE^2Q@}6#+yUVP z;BN&8S*i=Ch>UOkI%S7(=0qNXxm*tN`>BlYmMTV)7(N>dW~T3M)9)+kkc^*~eQS)A zsuzR-jzksZhjkf$jN;@a15`}`n<2Q@gu`Y1`KRvH9K$lemw~PJ@iOZCD=9!&{XLWt zJOZ#?KvM$Uuch@5-7|`+$2QoX0KEg_V_!vSHK!XY;;Q`Jv@U~0{Q~%xPbi~et0_Zi zHMCrV5!Zb%R zvs5o)(h`BLO1|-!QAKsW-Tih+Z-ifbYUVTUyPF`qfJhO}hGP1~@T=9OzPH4tc%mRI*U zgtiNS^6E)Tx2^s+LH!gcaFaruo7%3Qf)ho*RMNJ>1;EX8er+OoEpr7n;Os*FoUt$uO_IhUNPNc^y2s(cZi zeQF*M-_Kylt7EVs?Ovub!Ais9vcu=u=iW=&Nm~Ugjcq55609`2ozy;9X@;(*{$_`K z_$05pD3K@AcqR_LydEaXM>;+$K^8qtl#g`Cw@>o)fgn_gk94efglHdwuI4*y%b0kE*NUsBu-vjVd7o9ts}LJPKi?+e-6Hl^kZ#FPWEC zew&$BVJibol&Mo*TKn6~yb8lEA-6OJO=^mJy4w_$1(Na^yodf8Ltceqv(TnRMji-# z7bd467eFswytWcImaH?@jrA5m`a4wifBErQDVazA_m9s$2=QmPpr~!+wTCO(Sz@uC z+?^Y%&x>Yp2&zwEeB-n9Aobi>oz55UQ(zjKJ6CkD)*}qF-bg`kE}7S5rpO>sdGP8B zSLf;6Sl7KSiaG%da$wS$<+-uCb99n^2&(DO=A}}d8*4qYDX4A(y~{CtH`XJ_o=TQm zH`YF6Z#%g={OO;p-Jrez`QD+i5mGbHjn!{~-S{%5W2ELX4dJ=5I&enIl$NOmbe@BC z^(<%oHSCaOh0_&$fN)Ho=+^e!Siio5dLd1LFh@v!gHssuX~5?lf#aEZU1oAyu(y$al#JQeWpb#S;*;$D||`xNCE3_7L&!@05QSGOD3H82(lOSgyr))O9?7&hoq+b6P)*D0YCAX9kJ)w{6lb=U<4R^ZH`c{N z$g)0YD`A+<(R!R4>*x+@ej(_1pCO|@X+pRke~jcXp{{{k>yS+cBgWPExN(%>y-@>Vf zmlwkHmVJ3a2hGb1GQI7~3zC(4c_H&k&VO9diqgq+yMF1h_xLa`kx~kk57u1pYJ$gP zD0rkk?Rm`pR7mm>vJpPX4lwg(WFS`=O|u{@7Lv}%v`>9e=e@k}n~Z>UFdp|=QtVh0 z!!j=~wAl`8AB?wBS*S5@M&|Q6kopSnrve1q$|)}|6hU>mG)N*MLH@k14$D0pk!}b_ zY74~#rLu`gD-ryxgR%qg9R%+DsXY-JfdmtgF`fY3TA$c95|Ozg7D2@Y{Mp%}g{xmZ zlc6{uP`D;XV%a!44-6E}GvTz(g93$XnK1q`Nl>_s+JlByxuTL%zEz>+4b>rJKRS6# zlKD4!?OGll3b*LRDAFhIBBUy()00rENF$V?}ZBS zImhb}TO_R`=BfM35xYUM4OYsEZ)(F(xY1yh<2%nMw%Ek-EIt$BP7rmMm? znON(1#uvnHen;nbLA)EgWZ_#(tY^F%dt>3HhB+Xfvya#^6B`o$vk5ue+DfMz9&g7J zOyT7wc1fV(Djo(|ms&l+Bu>44`<2V|NKc-~;y@%AMt)e9z;7q8r$ z#@cCOjY}xeUwF5gjs7KEQOQWfBoqB%NN?1={8DA)clnIR2+CBE$|WLOxu;98;;}md zf$4=myl5_V(6-oa3x8~?8Hg|Vl!_hlDt&neuun`Z63@Mw*rz5|G`{&gVxO5r&!*bx&e6MuFDI**!I*?50peqmzS@uD4xeQ9Eq<9Q3vdCbJB#p_6ud}U&J z@ea9YIc{S4@%BxLePd$h#kWWYpD?k;@l)(aJKO6*$`Yajo* z8nN$8?1Ffg9%%XA#Ja}s;1p2!2NUZVpZNgHA5E-peCHfuKbzQq_+?nc3jbnaL*l33 z0{hj(hR0jBCia_&T@wF+b}#(9iH(ilJd$*OnAn8)-m8fHX=0Q4!_aKxwXWJp5B18b zA%F3pS60oh`LEgwRp{etmql3_s^#1*_aSZMe!V>KRy%Q>+$VErQPm!JLGEK;mHQQ( zo>aBU9VC3JGT}flGwlJ66Fui+b*$a^BQok;yUF|Hz@L^6*XBvHkNlN~?94$MC{z4T zjs}^-eg>8Ylg@0(nL{+tzdOO7n z1{pQ_RTU6a^+OnwkOxh;z7QTHq-u&l5(2t|<6P#nNds&uS)fd+)&`pO{D(G`Nx{gM zKOGT{JO(pef_<-)?6Mkm;(;WHs*rp@h1L13*>>^%KdZ zXQHE#%66&c9aWKe9DTTqJT?IoaET=9s;U7raG-s{FsGxe9-n>9-(NtZ>JDR&u&xx< zu|cB3l6p6}h+pOjX&Qv9ebR74lG9OE|JBWu(X<-ELqgJpjIrhiVjpv3vz2pC)`-Vg z)YbDa4scnP)L2u=bPh{$)~HOL=66Y^$6yJMMg~tB$x3o1Ytf}LN2shT zJ{^gM8Za8Bvdl-)Km8}*2k4#>4770MLa6ByOlUzu3;1jcg-JxF3MfJBPF}F@IgnL} zA?2^d{w5ehlTUT7xt?AauO5W??>f-+5g0`QFkZKqW% z{26sFF}4WQ&{U>eiE$Okx%LB{I7L-aNp;bmfS1})%xh7@_a8`;F2O!kq_DARQxViI zIS}(ctl9}L(599-dHe?y=u=axIKBrJh`toPx>tXvk@%(&ybXf=RI9F6?DpsW{ zJuElV;*zT_r35JDE0EHqOnv9fg`U;$Vz%%zXNH!VnK2H6n;FICGhDf%^N=RZj4H_L zI(cj%s6R8>0`zcTftfMk5U(Rh$;ZN&F05suIyPNYcr#;J4SsJTq?;hz?vrL2l9?G# ze65V8Ef8K5k}l*~X2u8KqUr+}U;8Ynaq7%i_#8%J$utO*!DUM3X2!I&jFR%m>j-A@ z(pq$>yqWR$Y*_7K^h{-$UXkIXyGM_!aHK9h9*$fFHC=)UEl6lVIC6l(BqB=$lwdfr z$_w_D@yX06eH|l3u#}mx8`{fUQGt_Y#z)AGIeDxcs6R7)14u(+64_33MRfs6u?A)$ zQVDLl1jCUwy5us_5|O4NehI;ajkx7!c2)9fPQM$n*&E(e!lbCdJiWp6)>tr4ZybHp z2#CR&-?oR@Ps#ADDLOHP=)ooF9xy_~^Za>jg_n_!9}&4<-ngR!dn{GA~w#SRbz>6BSv= z0O5+xk(fsqqtbT=0`hl-RCU07AFU7KVnDkQW=0yK2RUA-;UGuY7g2)7^Z3Zt0^bZaY*ef~@)7sM8NCTaJyOk05Y!pK;KT$Q34$&)pC|)(*xgv{*t0Y7~iY4 zcjIu;<;Yyb=-_g7nYjeUZ|b3+ybh=b+C&(p7yB#CIIYswdOG@o4)%2nP}^A3Gyhdz zTts{5TxNip1|Ohmy-xN0x?4q*1k{3$ekf|uYt$gTYZR&P}~9!JvVKW@4zqy|Ho;L~J&nOR*+oo-DT^3o3S z_!3g{;oRc$>~y{6GAJ$5?sx!0uddfdC_7VWTAeu#^jA7Tx3rh9P=Qx;f{!8pAPMxe z)Wgl(^!cH`>Plm04o$1X8`&m@qKkQ$)*Ond z7a2mCWBL6HoC!`be>X@2mj=~bgts`r{N11xGJY*(Qc$f2-t1HEHt25AJU6Ib0C~-! zb|2$+Zkwpu1ECj~>KjR*jzRg+(PEE@lG5tZiLe$1I~6y71x^)Zs+ZuhbHB9uP*#T< zgGY;)7E-kU&l7^TNoc~dU{4;NrA1VCzzcm1=crMWE(v6=4t~?b^rE^9@CsjpC9Da4 z)xxx?S_-(z*HBs=lX-k^aKR6F_a%$R0k`=YEa8FRpU92~;Vl9m3c=f`DmS1On}YZA zXs0#&1So7*3r%=5cu!rcA?qggb}pyk<*O;f6TzP2t@*A2VDn^x{O~aI>ENS7c+HLN zTlE7RnoN+Vk<1;z&UI*NAzTSK*C!a8e&+VHj~W8509YrWZswTuAiecb5vuWh+PI;C zKn`2D+74r%&(gCH7k))pCBqvpunqn>jFV@uO8*V3R(MZK%SykQ9Jp+ba&$1WzqHEc zNhEW6_|XP-4Ah0z_H5KzDvyDb`D*x?%jI3CfpA8p^4O;}<-_pz7_~y`D&U(^DKW_! zC&)jtKoklUT}egnh4QFRlQWLTC=xp70F1q$2YrUtQQGJ@7C!Z^?UWNRe)Cy+6|gy# z4V`9-QpI?tEYD?|L2`;EXO|tidnvT@pmgwQy0wza{bP6|iNgg=N+vUAxk% zdq;GYO7F7Gw!wEWPM^VAAZu+i%my~cl1mw5T(%vyngOU;twN_iusJq^(NS0?N6YFV zt7^N@UCZsz8UbVC8M-v9V<`I}yKr0&WBD1nc5<}MygKb+7Tl`zh1v|`8DE#Jqh_s5 z`??<{CSkn|<1=5EWi_pUt}5w^82Q@T{|Af!6|&9-%jnA-zcI8{;ll!?(n=mwqBT_?RDF`P zySLFJ>gkXrZGiCDSxG0iQm%aB$*%cGLV0#%W*GKa!ti zH3?qMnAhD`l5HoK%a%&-1Da~Ki|CAC+m>Y69Lfc$G?dBK6RzYy#UJ+-HT__WbZWfLkj*F>2#tKyw#-#97M;P8Z6+EE-SVQHjrYKKL|7>~YF7DB z^&WOYy#(W(Gjz!|6Rj3nKggE;TNrK<;72}8 zLJPu?3<|^d-vyLlIC9Vn_H89&u*8t5cm3t9*yDsYnJG>d4qlgDNd^ev}# ziM4c~?X-$Dj#HZwV}}7)pF#(6);@*hQUg7T3s&kq^5^{z(xgkUPZud{Y?}P(V(mD1 zhkUh9K?hQN3TKA`eR^pX$IIMFednV`>g)Lw_U*Apzn=lZFrq?Ju}a+a&6HA9>*7j) z#w-tjaYa8vnlwokAY1C>u`faW zNwOZ`5eF8SBtK79fewIbKexAq^}VQ$y)7!dNpj*I73e9XliYsyNgo=LnIw0YvYLt` zt;l5xd6r4?@~d=pBN!L>EU9toBj=TXiU4jWMNN54CEm4?6X|qOp5wHxEEx|dhP{TK0Nor3uyD)3)1+WdqGC6 z=U$MR>A4r`@C@a-7aB;|x)+*B*t!?m5O(f`t}_CGy=0=stmP2I6@67=9$}2Cwwzxu zQcJZ6@D?E)v;^y3SUa6}ijk{_xIN|*oO@wscmAds8iMLo(6@wP@^J2joQ>jM_!{IF zhw8EByBEsO@swoV%}ZchMoCOs$agOkdrb1F58TS9NW-DYx);8p#-=!fpp5ou(x#sC z;2m`@hpWz2fEUM9xf^KT z6dl6&Ue)}TkxknN)n%YpBu~Oc#x+&o zlrHJ}pfTOx&b{!%RQ^1H%x(2^5@_8E-&OK*FTS3XsqTeqTY4GS7BJPl&=#A#DR-Bo zl-9k_98YP*O_kUT84MOZi7qO6y*@_;W91DZ1R$)43N~KF447rS(IqE?`G4J3)N+fbuXM~%X`NQ$-sQor%894S?$~l z$3B$;AA$3&&$H9jx)(at@`{;(xuSxYEcEJO_9DF@Nk1?xt$X2_i}42PVm5``QxfRu zpog2e*#y?TFzgF2hw+fFkp%xo4%WRe=4HOIpmSIQdCUKqgYRD01Lswz*z+CWUXUgE zTL;8$V$j5n$cpB>7Xlmj02Y@m)G32{?uGIoH63dAG3Q=*@Kb(#O9IsaN-sx?{Ub`8 zd*Rx$Dj>%vH6F%PVR=iubuXwPrsvfXz~xR28mxQaFYGSTB5E_>lfDM$UKrHdYIpU4xEIB&FtU~Kvc*8Ci`s2;(&qj6bg=!zktlkD^Pb$xM zFFdkOC?5l#Or^vmYtMO5C{%_5svt(Ys9dHw$5N>fX?w5l2a@>yX;Vz6J)m>$_AgNTPwNTKZd_3i?;1hUiE2d z8_^~=-@Wk5+t3a}Iqqn5v{-a-FYLM1tV=5RAa$3^)L)m|xfgoOw-cutjPrzLRy)hG z?uBD}Y#VfkG3X4IbuUz|ZimBk81sZ>ax5%`F0DNG!VWvx?|^Z?ugkK;R)c$C!E3hk zJ7K(bhAz$O80t?Q^}=xs#*b&{5?c-Kg>vj1-RKKdl$lV5E43vwYi-&=OqP9wRS!l> zVWqT$buW}zW#{k!7{eUPcnsd5p0&ljAP>UYy^viQiMSW^Gq1Q8Do`4o0hh?lscCCM|{r|=QN6Amz&UjmMo^kMZEXk?R@G?pu%=Tn$T z9(6@y4uo0-NY1BF>TMMmix$-pMt5N~(xq@dg^VS9@j(b<0WWiE81AySMfq)Dl|W#D z5N-fm>T7U5g_nCMqhTZ9hiL#VR}1S?c%-M*P#ds;5KLp2R@SHRVR8O!foSLf*e_Xw^(jnhU~Mmx0k2FZ zSf9eYRy_ZShGl@OlL^+RP?E(=6Se?8lT5Hah1tXTvrN+ZZv%cN1YOA31<0IF;n;3V z`W-^r=ChGbs69;LKBB1{gz7@ly=pW$pTfoYcBgCyqld5RBFWGB6dDh*17IACSw2fI z{+jB13hQnp%cW4(q|#7keG2iOwhgwz*zL1)6`fB(-i1;hfPU>WlJ^?xQ@Ah(+P_eW zJmQ)`M!fG+xP1q^Q4VM|$Dl0Mr_k+5TwKy&Z2>z8!5jM4r|{VySi6L9G2o@i1lfV` zDdaV@O|t-SsSuJn%=r{*H?b3BBaE$1jn^60r%>snZJ9S=96Ez#eG1>Vv2*EH7(pI6 zQ**RFg)X#-o|0u@R1;Q8_siabPvKC^mcA{F?!rnby=K)5J$$LvH5SHnVWsGjy#=4b zY+iuWJJ8KA?l?o2W(^3nu4{LoCt>U?pv&zU+PEa^?|^HjkpaN~-#{oy z2PPspNYZ7UsHxge!V3(j?RA3&>t|@>n*gZ#q2$@U;UAm`-a>;t&F;f)pewS4~kJ zi;4=*bovbEvBg5F3ZcGF$}%KlI(=ZBGMc(V7%C)P$g`ME4<2JeO@%SvXGx7yO{bGi zs=(!v=^CJWg{e#COs89mf^9?ovS21Jtwop0Go3y-guFh5@l7hrSWI8`Os5i{7l*OY z<4B-d=@Lw6K|%|{k#Q6z5y=%$g1pD=1^bSIjOp|(1my)wF`W)UdNEg2;3U)ObfWW| zJoW)W-*mc+*jfkLPOEr0Q}P-60)X`|j3;O9Ul@!zr%2?@Cs# zGe@45nvpjLf-~CZJi%<>impJKH1e7t>)_ypeGuLkk}l*~M&2#oF&a+7_}gbmjZ;V7 zk#+n?MoLx+s2rCmnHzbdi=d?*@^*rmytEcwDsSX%WouOfU|f>QGMyydrPm+bZ{f%k zJ@V#5O_yLo3lb3#gd;~OOd_&QKnaE;o4jCO>3>FE&8HZ7f~AbS_n>{k6%{yX5n^SyOd{K9uBa|RDIP;bBGL$Mx&-;ovM%`rB8X&TuD_DFnCr*w^3Cy;WeR5C#Aa^9jye|J{p$z=IHi zY8L1qlIrY&kvxJ)EMWgf`co zT*7a?bxHpM4Q=zPOkK1=|9f>+Im~RDQ6994Fub~0bNzvQui09Ic1+e`&Go;X_H>K{ z9p~$C=K2d?=cKE1SqN$x+?ngoALE(p?@a=&x&F(NUhX>uOf}aJd)dqQ69H4r_3BbD z<)29@t-1bDeq>;(UHTb6r8Uu+4|nd^Hcf!17q>kJjRRM&HofVQ;O zT>n%hue%l}rL^Yyf3OFbln*AQwC4IfSS-ze+v`#~bNw+I;WhFMsm}p_<+8)tH`nXK zf-~2D+l=2`>IB8N^L`7LP2ijBZ31hqfB82rhqjQr`w1+~n(JpyHG?gr#zC3o(`0^` zS?$dARjWyXm%+Kq=h^9M&GkPu^>W-9C{eQFf~4eN&Gk1l57->KKpr6p&YFX7uAc^HmQ(E6;xX4RL3oz~ zjKyLZtByzE*8qSrhc43f5Hn?;E; z*Pr;&n(NPnks~ZK_pLSl#^8PYs85E9Y6jTWsX>D^*S9QUT0{*2yx7;^%=OhSHf^lt z050$~ICH(~WO_}l1-#GK;LP>6U}aMJxD37x&8nuMr6Z!3C24iaA<|s#pm{n-a^{r-FYAa|x&qj6T`eK|sLuw41 zX{kKlTtBptignlUo<89E-e1_KH%=M@E zxxH@lKVXDkaFt9o*NnX1R0b`Y&B3UW&l262B0<9Z^W~vbL<4;LSL6@##}R>#n%=h%f~C5-iF=n^vs=K499dd6f^#~m>C3(J(t)={(8rv3h<3QQE%VHl@` zmC_Q{Twn55YnCiTrJ{0~N$#vE+FUQs$l6?=dxp7Qj@$oF1VF)=9c}BzwVDz1aA`JCg_B%tp@H|8PEAY;4 zsFwuRP%lp!XBz6If+>c2eM&HfdcCn4L%mEXYp9o1)f(z${d9)NfelorBPz~_=R$fm{1|1T_5M#KAnpC)V2gz2it zQ&z+8fd3|Iu!j2Xm)l+KoIQa+HkWHCYp8E@LUj?{G2zo@sevoeUUjA2aS<-q4o6kx*p%%Z#cWgz|J_v6KN%x7-SvG;vA(e(QYpB2N9bOWU zMj8fVywB2AbcXtc2^RcoKyURK$-9g-)W4BH(SuN)^l38UeM5bvS5fo|=t0MzEY?t; z&aNrH;#VgCe-wf@^sS-3?_a#~CWN94&=OpZAbSsn`dcvz=#gCuu!#_oI?NgBC#>i9 zSE8m5jA2fV*BRDO|Ik$1GBaUZcLvKE>W@ybIo=Ipldw{9w1)ccux#oa_rf@MhA!Dv zFw`IZ!Rk5zpg_Wk>lB4m-v+5?8yok2cgl&k~=Ayn-ZM*11IFT?rbg+{2M$ zzTkUJ{!Ij5>R^zmkZz>KBzPKW#WJ1Pj_cHU9YOqywwwX#N|1ddzOAp~Zyw5@gpjW! zHT@f`(X5vxmKl%L18dw*Nvur#Bcyejm{_&Y?!v^H?_&DIJGKZ0>a@5-D{LIE%i>z6 z!!xf)qOtL46=D|@dre}KLrb=yu!}ew;J5JM6ml7fKa6e zdFd{)<0>k!eh3GK{3=qic-uDoxT9M}SJ4@WzfaZkyI;*5(tqecVm(ZZKbR`X@~f$H zNtVwQmGmkmuz$m9xK3z|RU6Rmj%J^^TBzodU-P{F_Iz=%W5lEkNs1`!+myTFgJnoi zw~DmEz(GZEKDQbB3DqfEho-69b_wZa2QQ(7SGStlhTsKJDhb5G`GCl)t2dE-;^ekC zrPP?lpm}#*3HL|PKOBR7bnAWOkl(eOEovNvmAH&%^I5hbN2z_5s_+NQ^WHvgw}|Gj zx)oqPYnVUOfY~U1qt!VY*3?uc>aOL`P`BxfhI}o7RBADVRRu^bRBI`D%Pu8so(~rw z(0uc#OvQiiW?iXQLk7*jz$ciPTkiN(ny)Bhsa~sBNhQr!wiNb=dTqLYDbajdQOO?^Whyf;ME!A+Dz$rdy3+XsPj+Y=+?c zCB10D0bJ2NNR#{}TTv36O z{3Ydy)^PIJwFK!j`*pEq#4d24?X-&H|CD^jjsvisy6ebUd+HVw@avLXsn029BC?1y z=@RU_-i*AQH_tZmwA75esu0}BdzIvGNqJf#O&WPek$vanvG$<;$O{~x=3FLGfswc3 zU7Qf4RJkzf39E;wj@1(t-pG6Za($#!=Cyl(-L^n8j>|=ud$a{*|ZU@>Iyxo2~cVF5ytf|KW!<98=v7Yh*Thp1Lw<^E`FZpq{5r#;fP4lY#De>Mo`zo~Le{ zgsrFUG6`Ex-Q|Rxr>@iQG$xs-od@ZEu4rY6d4w_Qv3V+RlHAl`z~e%wVF}h#S2>Nh za*(UwTNr`3EWvr|>ixtwG$904Wzd?!FnKsn-IlrHUuz4}-Jvl(ew?T7@hQqG83*NZ zpC&Ejd+O3xOFm10SNjyJ$$IKO;nihRoF|~X;M1f{JwMz#D*X%g0dxn|M^Fwsn#cG+ zJ-nYkF|O&yFGefPGfqcv#9WF6L1H+Z9` zVRLX`-w4!duNN@YQ+G>OFXe`$l-5%>;uf#SyOL5`Pu=`FUTHr~ z05-oAoWT^Fbf3%^%d>!}OZ@VdN#fVQ;OQ}+wU1(ULOQcCNo z`*o|A@-mmwdFoonRp1Kp#QqJqj?471&cNLCVZnLo8vfuV*a7*VpTPIj*#y>8_ey;) z!AZ!!`w1+~dg`9ZH4Pq8CEg1JDs$O_NOzlA?L2j>qEg^ya60-tJ6)}(?%*OX*O5?W zq|&sy0^jZ0`dJ`wt!{|rkROr+dMNARW^VdRF8#glc6Hjtj|y~xJ&-^8j~uM0Zt;_R zy+tSZ1#*%1|F0Z;PhB}Um4#=fodxjJHAL9a0p@!p&16OMe^@gRc$7~$-=LnS?n;ma z4z)X&^VC%y&PP5-pw>d!=xDM2qQrUXHnp|i?b-w5RbhEcymrLh7(DQVX(9C`;7O+j z4c1fl^3A42RQd-Loy%%)p1Q4eu&JtmwS{0>!g=aSVf2wURTlvE@HIG3-2$G>Zx+Hh zz{$P_=c$|YF|Rxd;YL9DIijnDcEoK8W=*sjHUVx))}RTG2AlG*r8T?;_;#`e>#3VI zjM`<8#VNp_lL^*Schx1hC$b?#KjbA4E>{NYshiGIl_t~yZ0Hl5r*3FRQg;OyAfRrf znDiiRZ9R3JG0o0q3s+NN%=KA%7CKMe+_JXIR>RnE2FrTtLMtrmc^C(LmK+^oR-yIO zoxa=5L-jSZKhH*Wp1Kc5$gD2@5%w=GTM1F=d+JtjnhdG)fIFm8Vwz_xn|!zHvOlQk zU?^jJnw)WbPhAasP-+h74L(EbaGtu$de}C<7sjJLORoYpr?R0c_n>Dl=zBgxa*8Eq zmmOOA69qa6K1LW!{K!p9}3G1 zz@cUUT2I}UqIRnO1mj;{mt~0^6i;0Za+Fn7opXqtk}Fl0W_1jG`L5N~3Pu-UnbKQb zVh6=j7r32g9r{9zf-%L{W$UO}YtzzrsqlJXErzkm*JWAOQ`hi3Yu9)j#x}<)@F}jD zw3YVM;3;?#$FhX8M7sKzVF)=9xmd)tVf4KTMR@AO;$?qQBRtPjHyxfBs?PjOmn5*BIw|;> zpXrhcrg-Y~=4d>1dfPLeIvGyZQzz@P_0-Aw={$8=pHgJ5=vXn!C4Hu=7Q&VeFx%cF zI9}3+RS(d?K4YeUo~Q0@R@nujaXN%~1xU_Qw=2jSF0_KW1IBt`-Kb09JavJanG-_T z0l3?#vAY^SsoBHs`MwYi0Uq@=I8R+RzgyKB{sv6r++i!~Jav!F=XF}qP#&;~5WF(T zuR-}tSK0uctcB1D@O)o`^VIE)^3zx$3#19_#LkEp0bfZbSWn$ULB5|Q8omHLkxa0jx+h=bgO@@Gf6kA9xm-1^r|!HH ze3(jFKNql`5cG(M-HFV3>JDQ)*Q72G`k$3_LNz#~0{4ri$q=p*l5SC>$$9Dqvj*us z@-`Uv_^KY4{G6xmzzExY&%$`!XX#~MQ=O-7>#JmW6v}t0G?ZCS-O9SQkunam^>Zax z(Ru22EA-R^ZSFI4c5-7=v!1%*UqI^(;4$fs zm4Iu6;0-(LsT%{hPY7E9pGzjl-h-#^dzN)Qvfl?hDukpCbDp}1JO%3E{Wpw^BVImU zXIM|&6;tf!s02g)h+=A&Sx?>mQZ~m1 zgt1;&DY`U^pVZ(G(52r2W52LchLY?mcFSMVdehuU2U~?JDidR2RTnhNRLS-+OXe|>h z8Y&yPClIJ#XAtS+FE5r*qNsj7m0&bC_bf{_5BT~YapLMSCc@mb`1T;vCLn{Dy6C(fYory~TBs(>_|I^W0W!#F;@YQvtToZ(1ckZ@!-ebo1XxiGUD{&`Gx z@GS*CuBN5NupRhH%$@oVvvg1!NWV$6mqwao*nSq-OHLju2kINPKLj}DK-(FfOQkVC z9GL^C{^eGL!bGcy>R1s`;Tg8?XBaFJQe_DFKB>4N8N>GV1Ffb`5C#cJ7xFBI?a+kuD_|P+l+&ZoW%p zAkyJnQGt^T+f#_naq`%^1bxHy&BX3>pzXAZkJOiZ#y$&RT`G5zvv#T6N8s$0st-F6 z`IvjU1p96_BX2sraOTLqL2x6l{Bh1dT+wCHd7iwZYKW|@lgCzp`XjFoz;Fi^ z78rR!j>YtWZo13-DLW^m6yMgV; zB?~#K<^4$9DK9?K5UStu!h|lu875n4o~oV)EuKL{dbl~*c=7T{Bdzo064Aaoi-4yI zi%DhVN#CR*7?k`UOe$>4dL|X=jjl;04{5GRMT*@usYrWuO)ApRU6aZTRB=rzw}{`G zR2GWgnpEz@@0nEAU%^c(iKsHHdMn_P3nk3UsbpE)P5?73z?xKk`bjyj z3g8-ugM5HzQrX3Q>*D|dsu1c-L6|f=lgeV&$$S9=%4&}qk?dl>un#}&VDd9UwgB1T z!=!|KlSwL;)VL`;ISJwXJ6c8=HZ4x5fviBD*LtKwtu6>x zhJE!!xN=Zh-w(BW{6e3fwcPR7r3jep(ep zv?i5@v)vrLD#TcmN<+-6CgJ@;j5Voj8S8SMisG~;mAw;P&a%gSPHR%>n5(R|O`?d_ zr1HmWuC~3Rh}NW1Z6LS5I-hw$wAxye%31b?O_eW*;zlirk4JG@lge`p42JVf zkJB@$%x#e!#2Y4d{1ko+@Se>ltFn^Y`=HL09E$HUh; zg^qx``wSLlO)9VLF%2cCMgl4HVbZ@$ul7tTzc&(vmw`O)5j#PBW=)1oD0? zOp7b_@Y6pDybVjMc?9rjVbD!kH#hUA56ycfl@$%$6v~}oD8bo+5Jh5AuqKtaKXFs& z26(VATrdUSq%r|ap(oh2mtay^NaO<^!JGnLA|sk_QdtXmvk$r7P+gPCdrK7nqJXqu@5#pItLUmbKJ^-rRFU+hs+xM--W4+ET*Fb(1yUxH^+iIlez9)$RaFTpdZbe)7@TXfh0@hxA1 zXHqHi4pmS-s=;Vi_^uTi>oJ~=d4iPKRnpDP3 zu+a9vdR_?XnN+&=lU_X>%!F8+Z&JBvr$FXIULFgHNYbvsq(pE_DhtbJfxPU)WR2q@ z5`(jD1hEt90Ux1dcqWx!-?f!;5=7v4FOzx{@JuR+3y@PDY8@XTDMg}_s~X(I&V%X* zq_+>#r4_CBuc5b?JJd)Zg+A;84?o?~7HNxtEc0Mgv}|i(Qkly|_nBuQzU%>tJ^a*V zml=%I9uQv%%8W%icb-XQA?qUD?*0Z5|3`6@HL0xYY~4mt|41VTDPhZ<5u142UV`$}>QwV=KP@q?gZO2V2{J}GNAkmJZyBF=Vl?}WOxlE@ldn^cRYD zKR*1kCrJ zC3+5s{{KP{CY9$-dnOgZxh9qE;JEd0O)7inGWIQHvae-LDw50dAAXVy#+X#}^lMBi zdSW#u6=_b^q$1<8HL1w>>6uhUo#Oq+xMWc>+N3g@$RdwmroD||T-LSf5vb4lh^<0& zO)4vMSO|#3?ErQc19>KuX8YM*g{c0`-|vF@L~G%hRAxTSIaUEA|H)k-&Z=nv9n|0> z9Gn$EBZw^pU?g}Zm9sQYEulBW0loy!q>^5WlcXXcAL0~Wg0+|oRCPNjr;`Bgf_T3# z!857+FYH5FA z1jl&=Wlbvk=5ne_B(#FqAsS#!Du=GMfGmhZq5;;V@(V-80V(~d5N{QLZV{1hq*~pF zpI&XiATFSX06cX;(2uHcG;_3o-U9HkfOMT0NuEii`w}}xeh=agU(}zHo^Mi_Wg9@` zZ^x;Mvs&q4Uqd~Uio8}rwFGi$EDT}Rq_TdvErUTIa(tA|qGwWhi0x1{6Y8BlB6^mw zCY2d)0(%_D^FB;kyl+z3nh9b%)Q>y_x>%FS2)3JoQenp+{wx5u>A%RZz?V-xh*!?V z0!U!dl!EgBGWTFo$$r8XOKoJ{>DE16f>jz z7Ys9oJl?^JElD6=#x}lxAzm8`jrU*r5&zcUV-oR=_WmYb6MI&?e-ax!*N%DcisUmK zYrmMk2rZpQyXA8{;gl6y&VtY%@_phTwo+4%T}^vAR12I;E=`&cdiXjDN`HJkW!079 zeWL=gkBcmx+Zm7lNi~5$Aud_uDW|H5e@3Z=MBd{O%!e||s<$wlr9A%ttL+ZZ)U*6; z6wsTRyR6#X9s0&0SVXTB`bYeI8cpBR3Hr;2?@`W&!f_nhA3`^&msOhn#>dN))1PRS z45$Lm&?8q#0hCogO+v`K%b&p7Dngp^*VY5M^qo(E)k69~8{*MjAw`(0Q}*TWwIl2l z0P_T-a}wE&7fIij0d%0tF1s*UN$iuwK)O|YNu=kYs-=iS;T^=ri#I(iilm1>mk9Cp zD^rQmFFjxa_cf_Q%VOvmRJDh$xzzD>cry3~`3R4g##XF@Hc)6~)NA|k->9m?QwNtU zRVv%5I)0RDOI&v^ULWs?hEC%E@hCqSHzMVXc~rZSID$#XX1 zp)ozf7#0erqf5Ma({)6;jtGTsMw#?*Yaxm^6u!*$_J2XfzA}SK29#4-Xfa#!2^=hK>g1<=FF(nQoxd!)YiHFW&wynfCcy@IviV$C~!J5rEe|2g06>Oa6dZ zFTShFCvJupAK3-fZ=XvbJm?XNwa*XP$8HKyZQyUKpbm=Y$W{^Iw$JJX%DF^9pY!*f z4|>OdO#A%tB`fJHfCv<$Y!AB}t{~O47B<6MDLRz5+B}yy-fE36ThzEy|>a z_X$zFyhzXW_Lo*d`@AuZ_9?WO_L)rVMYv=kN43ukf=#{n$Y{KN`@D=$Z;xmz%~RF$ zpv5t?NDq$(8!z5a_+zd4Y>BwG2BxF835)4yH3jNEjUyP8{2xq5`3%19XKtj=x~8Ki zkmj0>q}W~4k+fIWbR-SkH63k071wn1viPm(Xsh_G>F6E&p6Tee`<1hnL{zU3^^Z$l zFCiB&O1=H6a;A|>H6G$k0@!Q;)^t>*C#SsxuoU8bKEN{_70~#<0uWH^p}r&tlZIzH z`uTC8?u2r{qv}@Xn~oMNCr_nO3>1ZppYh;{&dMa9meH!P$U{^+J3GN7Ro*ve8)Rf0KObs-L z+D;Ir2E6y?m1~a$S?A?is5eB*u%@Hkd9I8pP-jKUu%@Gz*!?v!9)P;qm*JU?UVIsI zw@&3Xs1aS@p6O`fSodk1FQSOnbaYi!w+;O%#8}f&<Q>wqv4*)^v2+(;P35b(mThMYN`)Kz+8qbv~bnO4FK-Zr#F} za7}zGiqo2o{=P<8&aa|4t?6hWs{q4!#^dx%N2hvoAXK`BDxbiNiL)KVHy!CEg=acy z*xhBg67Ue8!8aXQ25UMRv&LnZ2KY9g!NRQR=-FpYRRz^*AnSdYRJZBXp6Te<9o%ZD zcfow><7{`erlZ@gcT+t9B%aP|^QC7Y{ilyxd+*J=aTM!iT@cj(w-N^3Ep>A& zeACfU$iMlJJ%;L-bJSGQpp7_5IE&J~&@&xP`^FY{28gETp{(gB z;}O%jR1Xk0_$XOAM65t-I$Fr-AQ@j&A+QA(f_kQ-8W&5iei+Qtu{hs!l-^WEsy89; zj)g=dY1c4RB6xBn8T}rJydKYHRMt2yA~CrAYY>UatXOasp=EfcqYr6Xx>A~exWq^4 zQNS}D?TtrHKd8ffgrpRSPOfTj>TZf)8jwXkOqW))-oJ*1%>%X?$a)`kfv0gctO2$I z$j2Uxik9s=Oh;WwU6=Ux5dZK1#h%7l!toT{^&$~gs5m>?>D+myqt%bngpj9NfarW4 z%9@Ujv)isyydK0TL74{lqiKK|)iJoZnoV&Ih{e7vi;|5wOh>mdv};-a0`bCmvNWn| zFio;5t?EM%pPwgd>l}LSthn*m@OO#!zkxXC%d&aYsE6WCuHb!sg1Q)WYvE!`!kUhp zBX%37BM7*)NWKBmhE?d))jKH4h=n<575|><_ z;*2&Oy+Y&%9>Gj|m1Xn7vaVGJp?>cp>Il&_9c_J_vs@xEkcw<^T7E=>JkwE&OZm75 z5>#yvjRe(JYvGxWYO#pAP5@Uz?CpuMvl>t1+`gUXUgS<}&`3|mO|fq2wMX~jI#(U072tCyg@=OdzL8EZNkvliG_Kz{OJ(&By7(T{I| z2yj!Jfb*){nvNb~0`4FcRs&*P0k~CeO-J%!^8Nzo0s z%rhOec-l7aMIi3;#JH7VO-DmMwk7jCh*!@;$*htb3I00J_NBcbz7LtnkT`o)xD`i?>5Qc{9mS<|AJvUDFyQl zWw{w{trGt&0m*fXWFr2ot7ijM@i**NiNEZ-LH4D1nr0e{p2T0n^@N%dthf)OPvUQN z>r1eFuwsKz%1Qjar4CjNRxHi)*omhu)xp~4ePoG$%flk_KC+5gi{U*ZW|v@%1%Y72 z<+Py0vtlF&)>s+{UOQIkN*Ta%B9iU_5K!Ha7p$?0h+3$T7*d126_zzb9N`I=#CXLL zkcf4GU}GhjQ|d3W7Gkp@SxSqidyv3dSZIkQl`03NflvJg?uhs23|8INBQ;4WDInDa zU>^@`tE9a8^*u19)fomGH45^44-%0V32MVoL^L-($t7KLB_mE^s=8+*Tr1&t%;RF1 zxU?L^vZ^hrNExWtARhAoMnfSOU;nQ721)|jH$<{nUR9Y#7SmMnz3`ufx8%iMA;_!w zNM+@(Aj+vrkfew7njqTxC=Ll&l`Z~(&EU(c`0wnEO@FYHE`--=X#Ff_Kc(cFg!~HXr(G1uI;d~>2rbOQ8kHzWNa^xlnP$Pr1s6TThl4Q z$Xxj==F>s%k5XvKnSjJ9YQ$$&x4MXH87mUh=9@rORqa~Zy!Qq%G!|uEDpyW*Wq&)d zni{c{$%mRyHv^j=3q@djDNxl_7}JR^{M8^{j79mXga73i_!=tjAB+D4>^B#{1N{q= zZDLKepV3*1J`Jo?dTb#{2>@OBB+y#wi3Jv#39R*np_knWG()|Ja4oeju(20_nrF`h zg8c8^rr0voGdEeL`7kUm#$=(}Wjv{^f|QwU`d0FGX0sC7q z{4A6JnsOsr)Kwp{JkrooSmPSt?3kcijSwRKpXHSIJ0{jsx6o5GXIHrT#d0G5%GSuQ zuMTvws*eRR^*mHh?nM$CsKIU%x*Np9K1#Y9vQCU4#fIw3T~^jhAl^O?^|RDlBUR%8 z9u2*jHg*Wa-#$v`$ZONA7E;%CYI(XmN1pA#DtHFE(VVY{Fl>FxQUv#9aCZ$ zd>632WAUIax)Q0))ctJN%5#`17eu~?0xL zg}fHxn;yXQ=NBm)Q}g9je|lD8EA@E}U}ye4*( zc$*R1Pi~p8#-~?d+wDTuc$t#^gEf8~LSDorizh`A%c?>V67W zeGl=Z2e6YAOMxc7sa}#jKZYDvLr}a>`^hqs!ytRAGT)we7^EpM|1d~Z6tssyv<=@J z2FU;uJj?8y@-NwT_0EMXApTBVvWQlWe=cM-kIbf zdoE<%n+&x=Kf>R?qv_^c$O%?7-w8)Nf2D9Xb@yDzPVU=>3V#N)rXJlr(qYbpj9F%d zbO+Ga1979N={q0AdaQ-yK`Zp=t`KuB6*uBbY4ac*(0K8theZ+Y|0P1a{UVj6KEM5;x?7(=H)e!O(uaE*t3b7=3O$lN zhb7bxtXxu#UM=3|xgksWUe24CgFeSkBDRdWyC%`Us)6uk`jx36QvfIVI};7i?SYjgma+I60Lme`GR|sW&KwjZncb8sKpd&kIUtIFf{h$kL6X zftps*wu<*b>@9}Ut)lp8A*rYI@JXQYQl6o(LSVd!6|K_4sS+XHezGG;17R&-JA6z7 zsR7RG@keB@*ESG2s$(07G(6it$^rKp$TR|TaLFQDIer7Vo5+Vff-&%U4P+gJEk3a{ zyj}wtya$D$sZaSkAfSp`wAVl?1t@j_oaFCJG{82HtTfKP37}j}>L2GxunnZIYlv7zA|3lF|7H08GFo%QsY` z@=<}fdS1NAhX^gEwTO$&hs2PNYr)2gzn^^9l6=U)o#OeByt(<%pP7-*!;6Pc3b9Cn zYx@PbWSVoi^d`G-iO1*nbD1dTebis})P_^(0y+ec*!s^Q{$csy8| zzw1HQcxIbWI0>G3QMF$+(;t=-alwu)_dU_==qiAHaLK|ERg%L9PW0kU$9{;gDM_zm zi#XkmVq(y!G}!d;WBkVprr!xuoZ6-$#i<)WOmW7f1W)fi%XAEnKkx)gPyQk=RSriYi&97EyjfyRrf{bVPZ zhIy0-Tb!mTy5nT=;=CW=DoIE!3PvTY*UdBcb} z%k{?akgI7X_&EL8mM0opj#N&#d6i^#(_|;FMPtJ5{$ERVwh6YAno6juGk?8s$%0e% zzM_?itW{3)jGLCy^aCjYjm!fz-9zfB%*EW_xxRDbT;CLWRAegm<&opG{m9lEkkm?Du>(EoeJ~K+0x5A?>TgI)Kv|=4B$m(V zqHYYp(y$(;0a!wsrMd@~J|a=I*P<-%wrLEd_Pc}in~mhlKcR3BZlO7VjXz#?2SZ`m z*rQlA@$zXD?%P8s+!p2Yh$%qn7OxX_3%9Wns#41#K88#Fhiw5BQLX4OE^PzxuXr@4 zr5b=;yG6PZf$9_fzVwK;K3c2x7xCyt)pZXu>QKK@CmMYYWC}XiWO}xu! zX!R2XykySSiRNemy6XivOo4Y%?{U7UMa>%YR4H)Hl3fh0tA-*8GXAB9XF`pS4C65P zm?`#;&mWJHGP_?$;!O`oqd6g1@Dh)ynkLVTR^lHkf+2cEIa3ZKKg{aY8Kz0{& zAqmLFc@uUMYWC`OuQI!|G-r()17>10PEO<2>@Ck(FOhS$l$XXW1M|4xjM^+*OtYss z->?&ozNHd1I;7EWf;{M>MUsAU!}JuXJ2YCzc5==Bd)dphl^L&j&%#%-k(ZJM=WGXj zZNj zOl$Q+9}*o@C6Db5lW0keTLosV;B?tWzL4y+QvGKG9=z*rEih37-vzYa6R3ga0hU(k z`P)EeFI=b5Ng90$B&Gnjh$Tr%X~Q+>IqcV`?e2OYrIZHO1XxeNrhdDqTCac`-i}d_ z{3L5k7hjkRuF_Zs5Y_d>BJQ7Bri;Hr6PoD{gxzM^QkA2bwydgzs&41+K3uXiXLlfN zt*+<|q}I=uu)t?TlQyT(n*qJC1foKq8jbVqEXQ zc#_hp!gWN5s1~gWyG4+?W+siQqBr>owpC?yFSwPsWSush^XwDAswSQs_*r2c(~ajE?`h{uGbQg5Zc!Cx`GB5?r4I`RO&->2zD~T;>FARVFyVu7f6Kk zn~?T)oy1TXuF+m*i(@S)TJgv#t+5h{Qcr+ik4qM+iX7*k+0fA5B>r8GMsZAprA9|J zgE)1Fzn?s!R~&zq2GaTHSZ_8AX>=*_T^47Op;KwxWjRSaWqi3Vws?(e0j9m+{t|V- zO=aa&gWTf0d$o;f&HgOpXPfVcY#q#b7X_g_c@{$ z829XiquTB>8CQMoLYK~9`kb#X}UI7;z$GU|i5af)zXekD3icgjW|84eqrdl%kxLOmBKiD@1_>-Zod884iiNZm z>0y}%MlO(CWdP}c8+EcPUpkYda;9+7xevaasd%mx&on&O<8k8mU=@qsAM-c5Jd`D) zLz1fVnZ1gC4)KrRawUyGQBE%3)Z?0++eTlraxc}_-cDX3%r56)Dcit=Pg@SFk`YEzsiuP1O97S1)wRwYLnK%1WjA6booF>opI`8ZuR z;*qim+DnapLcTSr^i1k?f{+jZJknsjeXYZCtJ-Aw|YY1EU%NRYKNW>`OQ@|?NIarYu$ooKdZxKCh1TQ52TSvz8cFY3tHa&)`W3p= zMou4Gu9l822X&g+xkvOhEB9x8?VbClzIJoQs-lNEygKUkDP|e%3VYlN?G$jFr3f7N zWkqx@${9ao$OParwNm@E!FwUb*P#jK-OLpGgk^ihURS}s1;l$eUGd^E75{oOcpijj zi^cA=S0~6P-GQAwk0-Ag>A0}3Ej$}|m3COfaXJa{m?T8;yc>IPyKb?++Ur($`T-m2 z@`%UqB=qEb-*@!n5(fe|5xWSd+l+YBsEol(@noJ%pS+%m7)h)v^|n0Q6ytag0`V{7 zaz#d`FXvfTgT2|0RD`;ZtkD)VGS0oo5d^XCXF+xT{+%dUvN{ChmT0Dn@R0K6Y617TVYaLZc|%nQadrT z;B_nQti4KV51G_9NNVrfR7&NW)T&Wjq_xAJ4|^`u-jAK3d*$C-w~M7iG>YLXH`6=Ou_8o+AXLSqZaaM) zp4&xVvvYgu>mVnuB4S+5O;*ANB)ksbL!4GuYeOe<@=gMGVHZy_#a5P;&~c!rUATD2 zT{kDb`7}OyvS|+Ib=t~$DQTeL=xeW&h-=oF=U2xM%LO9yi>`k;saL^DuV=4&!1f0_ z8>f}3R>hQI;pV{{v8kZXZU%~m7dF40@;~nDUdZ&<9V8R?VV#_;}yM(PN#YZu)FaQSXVj zF%Bnn7j*(f+|y1~a#|@VOUlpHYqZrboai_!ML*4xWq8Kq-;+TaHk6Y;vWbLV)bg_P zUtwNJ%92JU(r?y>Hj{?A0w1=5a}d1W6Fkfn+@ciB!{msitR!w$tDYj9=Q0JaH>I`% z<~o%Ls7bSQQCZA5d#%m#>org0ELR`t&`GmQW^(dZ z4waCw(+u+GJ>b)_^RK>{&}0R7>E_Ri=@pWO?W6QhjD#R@|O6BBdjuM(Fz$}Ez0oSAlM7S$7 zG{_XZ6YeRJ?3|aAe|ii_J?Q4~3+|d+TL1j`?h-NycOzjr8kqFB zBG&L-TAW1^pW2|w;8d}ypN*n|-vrv{Ur69Fz`z7?a2Z!w0pVnpIi7%*T>-Z+*e1O!c8)+1kEJL%yqmPmW%|N0=fM1k$GpvDmN6n} zn_CSsL?mr9BZRbLIpCYL+ZAzYh;7G+`jLGV)4O(ys9@1gGslk}-UPG>9+O~GFL-!n z{-R~b-XlYWUR6!|0MUDvGJXV$w$99NBYpW(LtQsB|MY!;KQ+`{ODX+pgxjwlK3kO^f= z50<0NN#9GQx`kLb+o)DM!s{N{Mlpr?y{#8hmNt}w06F!XbW#Mkj5k^V3lMO#C*Wj^ z02|6Nbzwupo$2~ybW%V`iMnzc4mAoLL*60e73#4wpiF&knKfhda0eC>+&rrw-=<&R z^3A--Ns3dpJRH)HbJa;HN_2K*AGg?UDJ<{0xoMcTl=-AE z7vY3Wt5`FuV3d{ildHjm@e`e-RI5YpnFZq~IZ2#%q?p;qNz+=lZ$~SU42iVwv|vCD<@JK{-aA)J7-hCe-^zlS6r^>uoQ=HZcjh zp{&9QOSJ$uhkx0GdRZZo!*rtV@i0)hwd{tv74F-m z1xSLrmhb8q5P>pz$+Dp^_^p?K-18Jnv(opu8d2w0x^*sL0s=){3g0_`!fvorVaE+# zFj%x@mPvn{En;r9rt2g8Nz=3fZo=s!Oqq2n!|S~~1*TaA#^{dWhH?tiUqyjwHcK+X z$a(#wTeU=2QZFlU4HB#NaLer07>RBu2N80ZKWV8J;j+%LBEn@ExI7U{V??+i5h17Z zlU6A?neVdp9cjA*B2-UTi&a)c7o9IR)T!_kcPI!jt#jS18I#8Q!Bw*gGp|O)RkkEo z%qn=r>es_2GIOMp^oZLyXEGc;8r^pm{ebZ2lsp39YIX4_quma)yVKL|xft!-kk#(F zSnb^4s#yi|trlghP|@c3Xl>Rd z#ed@_$Y}AJO`{VZVp8=nuq3^$T)EYAOl}t-zh*DDF5Y&l6Nc06VE9nEz_ym*7!23I zFk|?b8-*@@xkKWJ!x_H!!?EHWWabl<#YF7#G`733-O~7GrSOiOI7%>b2f)tFxM2m4 zTj}L2a*kTLoaA>Yfiw7wE7))zV(3v4+N1u-79q>I$92MY^Yn$Utw7z~J=Vs(8#D{}DxSG9?RnZc$KKNpuPGNghgeBXn;;a-8e2>%PGWr`<8 zX0RtRh0m2$*UHR6=7+?8hRYQhx)~Lf#&ej^&p0hnJnS*cQ>~)~>+*N8a&{o+qP}bb z;c|sjHy(MS-9-$x$lB?A0s&M{oGvQynBr}V^gMZn-NjyZlO0;%nFwry%cIqytInD+ zWJsQq{HhX)Y`qqYx5>1(tTTrU8O`fLmAos!Y`4bCW8r!7FnJe?8Evn}NM=8RPQ@fc zPDo{nle{1x1X+a|5xp4@axLpa_Sy}zM5TTle8K75=`lhV#sPYT3;Wi>*8uMU^t$um zM_F|qwy^SrrX0eRxJ>}M(1q*qLQ9`Wt8`&ESa=Tbr+{ugAAU6h#b67&%U*W?{~YL1 z7p}(+E&U6+mk33H0(HMD!j2_qDG$H7usjPt4g6)GJ6yPUjF$4;Sf0FRWQ@h$X0L;)v;Pb1 zw9Dga>Ey{%X)bJyg>L~~X@GLt;B-N_N$A#;vQOf5p5zg=k@84lpa)T7ak^f_qjH7} z8S0cCRe&GwFua9$Iqs>bdfn#a8O6~Zh;-Ba)TUpNX1J30O}Jc6qGS6A+x<2A8*W%yj3_-Wv6fzEZ|cEtSedUdkgH`!}3y>l=V;iOUrx8A3+NOJM_D2o1z(5#os%DdknNqlIg@l{C{{rz3F|@e6Rd zB11;FJbBlli#TeL2S7dv;3!Vlj%|Ngru{XD)9RqtZGJNhPC1ZU`GfStv<;j~p zk6G&9_S!y^`R{s~JuX^2+Q?hJT-X&eY+C`|3TXdgaM32uNof}pg6t&3%gem-x&`Sa2Jxa3T&{?ck>+E4&35wSwRbM^#yPev)N!0P zpx5F20+Uso9%53Og!C(}SjAB!H#vj_sqOJQXBrV_W|`|^2y@gGH#00;s=1`#3fj*$ z)ZRA1IcjcwvXkW@c%GLbG*4c3Hr!&m-eP#Bquggm9dJXea{FeQ`k5Uk6xsDIm|$$}SvkIEdH7R^$uXEH#Q_$)T3&@_ME}jt;rn#9xK2P44*UhH! zpuHYI%^4{2RE(O8sf9yWMWs{>$_v97QwxVl*_fbS_U7H!i=#nS%FFiJzAi^Jk#y9R zCZ4E{|1q}>y5paMIq&ytnLaJ&K6_n(gi?cf<_f3lR6J1<>cgWY3>m=Cafa>oKzk5f zaelw&c89Pl@>eVRG@^5e&&TBolkVul8GT$tvw5au2i0SB3SbpZE1}n20v{>w3=cd@ z{98DkqIhCP8hNqyXkl$`#dWaPEr|V|_+N3kB10tJs^mqtE~K}GR-~O(9l~~mZVHir zegmyW%L{c~)G&*l4!W0zF5#i`9XP+&m|2ura)C0VSSKe>ULEXm z{cX8>H*lP1;C!VRH-nVC_SJ>majPlGb-)h*Etegem>n`ZxNV$#(#GAOOy~?@9pi*e z42yb^GE!bl5U5L3C!8*O@yP0i?()nSsGRw$O5s-|+STB3t4T^j+6(c8xLgq;!%K60 zWq6UdH9ujIo9%T19LoVbfr~CEsWW+tu!}ov@jJoq0c+|kJ)mFjD+^qCoXrKDwBW{# z_yh*v)S*_mc%+?c?#OXfj<9a%@*JEQX5>x5F8^n@nF3yloJ)W{AH>UrS>`gIBNgvFUC&XP?UkhIc{63(M zyKp_DnJz1@pLTJ>Ek30Qc?N6By^O7Xgv$f$F6a&mo&flFzybF7b=&fU=gDLBE^LE^ z?*v{0XcHGM9$E|cjq<4ZtxDd(?Sj9uOpTj5&Tw!>p8NhdcGMwp!sd5Wd6GA5eKM_cr7&{Ps5FEM6yGp81WJ zM|<_(=(mZSVAXoqUQeK&JoJAFE>|Q=?>(rm*}2E`m5e>jB4L%~n7hbitamduCg56( z^LufS!zN~i+iw>M?Az-p&JEL+Ms^F3(1S2Of%6A@XS4`&6S%`Bw2p+f6TcIeD@?j& z$y@ea#8!(;Y3?|`062%!D%oXMwlh+`z7Z%jf*W6)PEkBD(@RN|8ZE4@xcye_1jKd& z-3ON|GE7@N%>?H{j#=nVpz}fSq_6qX2zQeO&PDYkPPljx3w0nbvMD_vu!6|vaatXH zKN)?We+Lv-?5|dQ;})#{iT?tZE9|-`zHpfO+#`n6d z7Cj2ems|4Wdjlz!v#q_JKtczYu6HHahARUpb%37&e6Uzr(hZn`rYa%O4W==4u$(M>8+C8C3UId{=l01z(S_C$< zi43yWc_cQ0_=UJ!kxcF6*3sAO+~)d9Uy}FicpR4VFq}^T*o@O^>iO3+Gx?G5`v$iyl2E^eaMQ~hKMbo zes@LKaXf3B*;DLaP-u}W?A11lvPxdtA;O(Jc^|eb@GT3g*_Qq9(ezMUbc@I_w>F7E zxwR4YJo(VaHp{ikUgyEx4^H{Gj^_4m?D()Har(O_Bjuw#fm;aPjq|?Cp3GpG?bom;&m2hOO*ATm_G)xfk?p2;+_KLj-L=GT#N`T;t`zyek&9@v)Kto0ke>ng z8&|wi#yMpNn99f=_XR_xu9OzkY+K9R%U-*5;LzY0?gnvMhJpdKsDim0lQxIo>#5?VEv*8f&Q z)eY@-^+Z#ijhqs2q4n^zsq_tLikOl?LX~ATt&~n~G4l0eSRrR(?|0=*elsK{Sbh|1 zP=1Tlixg7Q2im%>5`tgZ_=%4VC%W-TrnrQllViYlsK+}G?Gw2g}ZB5 ziMRGMk3K1|<`lRSh%0gGF&Ohp1)SQgZ;_aAiC>8c#Knz1A)&anY=MzXfB1s~JF&mK z$G}2EL5IRG@*giLhQe=(cR7D0!eP05j!O`5P^A7FsiE)@f+d4fxNWMt^LG4+H}7Y% zuX|QqMJAJak)^tEx*~X9uapvET~cSJb?W1i1*Oc(I8xN45}-qYypr}|;Y$V4TM(iR z`tpwr!HE}d=`uG2oD`M$ZkR6%j>2H2E)_4ylu<%bSE}2jO#g7*B zBY;!qftIifqV5~YNT4&G5@cq>*_tS;rZJYOCz@=w^v2LyMbl^81pnISE68j2@%4r_ zKTK!H!dfTy zI)HaP5cKswBjoLN)hzuGv>!dXTQJv6N63erKej2w#j&2jMOBfD{ILhf&&ILYFC9%a z1l7Vrl3d(S=m%fC#L{~~yC$0cYxA;)v+g7X$YV@#J1Wyf1ZnM4BR6`lRe!g%BwF0QCi*kHj(rCvFE(MtygP z%ZE@uKM%1-WL%`~S%!?Cq5e}0aWSW!R5{hWqRmH{c-{|zvua+fczpL_wX>DYMN>#^ zqRBkeo35T?XwaGL11T$-Td_?2JpodoPcEkxzKM3#Rl_Z;d}XF9g1B4&W+>$C z%~{0OP+v2+B?(|X#FwHa$eaFDE%n#a?AQrlH^f68z_euZrax6zHCo9aEU3Rggi5%% zG^p~bLM=#5)w_v^Ooy5&2*1JcZt$LsA+=XanMc$mP_H}>acdW3bWtyHL#l>Ao$Mo| zgrWxU@@hyq#Pm?>S94heZna>|NO>_@M!Y{#{&E`v`>AbgPOBHez2?cKwH_TwY?j*f zn9bfkh=)930D3J0aD(dD*Udjf2X(y0DDSmU!_=^cNhJ+Jb&nXSf+{E=@3BzBReA0v zRcokS1Yrv2QiFK!Af%D%mXEkx2X*9mGQODyDMwXZ!DTws1%il?arZr>lB<5&2;w2A zPYJ>lNl!_of||@dg&Lz0Fkh)HKK}%v^3*1OBGAtNykLxRIX(OxQSt%-ye2{({*D(f zFZYDgdIb^E;D8D|$+nTpUkglPE3%%V-VI20lk`;ne!$M<$n7R#1eYG}C+LPKSXF%# z5XB67XW(Z1%=|!Z!WS>Na1m)P!eccq{m^fu5~xx{pQ$K`1e)430%i566lk+^o9%6{ z!}bm?S-{-Q=s_vauJf0+yB&gdB$_T`Qs9!=OoO_&o`V)&(&JClLsFn)yBwsY6Q3!x z6(ZXVvuS!n3Uq#7sfC#14Oc^6BM_6rix`apSANDKMpIvh@=i3Br|7$XRmxHiLOC2w<?>|ri ztY*Eklc6ZkH;tnYdL&ARR$b^i|CFtaM1g)Ck*)`#cF-=3=9hseaLsMs+8%a2v{4>C z@(87f5P2nS;JV2N>|iw;z#YXvX-bBW!0_&3nO_a@MFE&v5Y3}T5DT3uU+h*N06Y4h zpk@tMMoHre%u#=WJLh3paq9R*Dg`Ywa2HO_!tPbAfb{)OFq2f89!vudmHGqKMuDB^ z<8@h7(qn00&0Ov>)VyLu`kj9Jf%J<|SpL()@?1!~cuU{Hk|rg1u{@DcSt96B%z+Xc ztf+Pa+b`mTEQ@I!Urqfe?4{gzzYu+&i_KK!z}5D#$w+bwP)lp1+CaV9N1RtLlc%Cg z+jAeH!f;@deW))iP0d)qEzlL4WR-L~h*du7Jb~9AMBsHFGFYgMz~29lP;*-l9Fwtu z_9jJe80ZNfUV%6oqTCh)Cq2w;qCpACECO++)FKunOQqoS2WD7MLjY}kkm!gc4Z3x7 z2Mg*4V2BUWlFV&E@Xo#8*%kd10P_S?OEh$oliPyeJ#VkFpp^g~^FX8|w*|omlOMG7 zSD|f-rpsbI_(<9FW)FmrS47=UzhzLB$xM9$ZC^BfD7S0DujV~!mG}kP zpV9OWh5y)H4_JEX6b`lFVk>5^fPNXzMwre?O8}Q%81&cfO;*zN0ET%WG(BAhP0l?; zch^F0hBn`$o9vcTtwsPUsTRFvlUfbpne$LjvDgn@thQCLsO=#3#iC3lR8e0eDcC|y zy^5uSw6zqqn>jGpPTiVqrx=H5lU*5WM7MOkB;bSY+FuoVym&+5dak#0(mdX;6<6g- z_6;hY>%q21b@4I~1stfsCA(yDV2>8|)GD1=?pLL7tay@|wqS0vp;Z#?@hy_iUiSoUkrqpzMss^Be zfNl~NvjI|8<#PWWcWqox;t`^*0MPe5P!6QH!P)aUz9YPO015@9i^G+qK_ja$A8JWU z0jxMrl8i8Mi>ZJ_0TGBZHiDf*U zw4^jOa4Cw<_*YYsstU2b50Hu9F_UiGk}vNE&>7-nAMk&wF79ucCF1U1_MD9W2)Wl6 zq#H$=y5lkQeJ1f)08c}F!w1BsgiyXo4bg6q%P2pI!@SOv*Yk}IduxbSf|dcBWW3?kzFfqiTa!kVkq9nozixXu3w8_7pDH#R8@N^w(_ z+Rqp0M1@^2eCabus{-{JcP4Rj)K=~y^;r8Sh;tqaz!Jv$xLZ`|)>h2L7qNK9nXCek zotL;_|4VP0J(?BgzC+gV@e-GjhA7zW> z6+zvl-sJ947fXb2I?l?ns5b<4ubR8cqFNB{TntrSty=`@aW(rYYHk43v4SvtUHY17 zfQ-UY9ZhZmdq!RTm7U4wgMCEs{wU+WJktyn<@K8v;{t(mZAf4<;B7v`-KL?*{byWU zpyxvBXFt><=ON@CHZDGJnjL+08mc^6WtH4yWXK(ATsW|Sf>V`=s#^?U?my#728J#L z(cY)NA^iH3s3W=7cXRT-G^wO?J#(ao^B}~V2>B0%<)cA1LWWy+%8|-Q58n?lv2q>i zIquVdsF$Q?n!SPV@iWx`*&_UcOAl`s?+5%PE=05JxGyx!upA8h1wmNCa)T-XtDnAA zO(^e$OBZwqIGsY(8`Iw_PT0rJc`eaYCbo*7@>oD9Q}mQi(UnmG4b|u4ZjRF(mn=Lo z&*}KaO5H%@IFF#`xrlC37Scwk*^rBTh>S7@Vx@Ofk3fCaN3;iFr?SxHVl3<`iEan5 zyBH`a&g!MaeT_f5ieKR+PLBJ~a6D!*;?;y_lN{TyjqlY?Lu8$I!@TEi9-N zfXgln8Z(5!RWEP`0m$(|dPL`wH{7a)3KH2L&yob@09YU(Q+Sp>X%HPn54o$M$rEQr z9df>^CF&M#eUv2xwW!{Jwj-Kf)2IG8#!jeTLpv7DFQav6dNnq>w33Q}ULH2H^3&Aa z<)Pm?emJr#5no4WTDORu{N~gn1B>5037`YSt32k2oezee0Qmm2yL3V+%fH^L^>-loXx3i88TppUi*?(FC9eH2hdDFx@90l zzIYYdUU&_iN9aAEWqEYBdA-HbIrQEW^DQVJz>H!bGwFstti0B7BxxpH*^LYBUU>xF z9|irK&oS8KUWU5Rr+Xg)unpqQ^8hl^h4zjY#lD01ivUbL-f7FP9e~e&A`dE_m{gnv zJRpEdN=Cxa7n`agp@vV?+>Bh3<#auMrH3zt9B(4zKNRlgN0`xWI1$yQqjw6O6A4Lr zXi-XrF2S|m3SZLFR?6(yV;?T`hp7{_K<1ko6DJLKE_3G5bT_Ximv!y zQghKHP@{G!wRH-duPF5#5u0$yzaW!m=L})1Qt~|C5swf#1vzqtzxwym@Ty&{?!SYq z@{PCE)d+4^^SW_Ar_R6-hptvyL-jhzup%T%K5b#5lcflG&TV-u<%s5u*RwM#Tj=~U z3nkN;Cr0sKd*4p^Z$ZaWnKfl;nfWkPL$Q4)@m=C2Mqa3?YS(&L{9_G(2!p5W-RfJ`kdxEMH3|&1Y-j;8QZ~#%mz3Av76wPCb@GtJnRpxJt_^ZCnKw}|i=LGKpKq0z2GgL{S<4-~T30ou*qUzr z|1GxDC?8X7b&%W`m;4$sql@iQBC|b$DYk83++vG=EvDGAI}uccFwFFrykc8I)Pr91 ze=WAJxN}pPn5HO(SI0^53~ntkt7)Pt^DgdLROV0BggS|dL}d2RC5L;~jdxvd?pqOIICSnvW`4}>zi)|{A_jv@tyAJ3!`7Or zJ&nbt%ACMxsOr2Yw_t~>$26$t{)jD^|GgjfL{Lo0Oe10rF1ekoB%+40yNP_>BbWx& z8H`&pPyQBDG9_7#1l0~0KK7VQ$(+~K4$mW{%xSa8S8a!%s@tw$X<&XuF$bao*fr}*T zS7k^sG;J*Zuh)~9Lk;A=^&cpi`9cecpC*{h4gW~Y(X>*DB<_Rgp~wXOoF;Tp!9-dGoQ02pdCSGz zNhtCFe_+a%70i-~0nRdmIqG8mBoqlU1A;k9DmClPEg5ir5=>$(o7Sf#c~ScrqQGQP z<2CE;K+Y`)R*hUt=dxgynY1<}2xe>~;0zR<`?;7!5iq$%=j$p9=F{2%=M|Q7s?f!J zPAZW%h;lOD{+Eh$}JOU(>cA{orjaU~|d14qWv4~Wg!)qqx(@o)!b?2Lk! z94DNy@qNsM8B01lPSuQS(>QZ3_eD>#+AOhS^dat3`Xl)e0*>I4>$Z>-Ed9fC)J;>F zw9i3{C&A=3Y~_hRA0nev330_{}7j&&1h1;)lqUn+fQv! zlTd3}DFkZ7r9S-#y|s-AvB5}2>$f$?q|`-p()#UW{lKTtQ_HZ}so(x^JqeXh&2LNS z5<{z+`aC0G{SGEnE%jAK?)n`~sCw#)%aGa0$gG)q;0UzNhE_ZEvwsu1)X?guUeOEW zWdj>X3XPj7$wK`M^_ygC2$9r5^DRqwgKvY1k}c7s#U{elS*S>-ZmB+`TpP4dLRAej z9j6^GS#a(v*;}a>X8>u{> zUai#BZ%Jj?zb?_*#cP&2z_W_62-?q8ai0hzr&`v?>#x+wm(a2%Bj=v~F3U3ae+Naz z9%p+B-NTxBJ&e09#H=$Qjn2*ZP`Yb_@nc@lxk%8=Kg0Ns&%DK`ct81Qke~Uy2A0&o z@^x4Y;-X8)q9XyXEV>2QQe1u%^ok8_ zv=R}G{u5-Ay0Q85Q_)3P>`zmrkC{#6R%$?Nq;Bk+qot;3slAXm|NkUaC!$4bUE8Rd z%=8V?)un%Fv8A=x#}WC;e-i6hp1P`rEC~ZCsha0=@V{S($L|_#RQJ2cLR;158qHWn zGp5qDo8oNE`=xLdl^E5r+Nejc0X7(+Mt`Ymp{(Za4d;aaiThcUYcNG6?azG8k9hWc$OAV=A&^{M>MHH1OPd*{muuFgD7Rjgj71~*k-y~30{WuL!pZg}T zu_T~!=w2CTGQnokv+JM_9JUPwni1d8qeTSov{Oeo$=h(m7nNi&+Q*~HUdRtrODHVU zI_H9z@6z?wN%e0UQ4QhrU0_qc$YchpC|;RNn|@5Fk~F+Pjil5MSUZI)n@~#XA(pD) zDkfAmbwx8mRZXaT>Pb3exS9!7GzX!+L8RU2ZGZiJj#E{I>kecKB=t}yu-7t@=@kDh zp#dh8lG-|m)GQOKnp#Uj*O^e`)W1i8yxxR5r9Q;V6B=$p!&A3PXoLynq(0S>(5UU2Z$j!FcOx^$ z$efb;=G?)57-0ki)ebsd!XOCw~5^n{vFys(ezd~q2uk1yCJeP+Lc9YI?l>xADv?r z;X6O31XN?<+Y3$S!%PL2s5d?Wa8KF3)|%7DXXg7cG(iD-_7G{4q3~p);>DXDmjCvv zF|VzQOK1^fp<4M@UEhwXcz;v&UfW2V9*}m>{}L|Qu4`gJLa?IP7ZW;|@KVBeGD0PE zvNc6`6SqYPdMQX%5x$I0m~fe?*i{L^)Z}XkUv2P@C8So8U~dy#laPAuIk@|p;M#-^ z>Sgkm(6!!cWzj=1Ht=mgb8I*?TT;)fO!IP z)u?$R^nxwSgVH$EN@#Kh)zFO@6sv=PrnIBMh*b3^fR6-Z^pTrtRe8<`~;kGY6vO`KHv}PXNH1)FTn{|K|j1JiB^Z<}0 zps4XSe08aXWF6FwREC8&Qq1S6n~L!!DKse+7A zvnk(nJyM0jwIIYx1O{F4iZ!9uuF>3%H>y~bkvAi2AyYs`UL2L5QE4y(R>qhQm;^Fz znl88Ojo-qSl2QIrI5XC7<{mp^RG2X{V<`U#8J}=VQZl0p3zfu-OPDv4GEym=QW>jQ zxF=`yWcx0Xu~gsgcUZvj$BfIyvjv}V-4OK6IIxHM&iHvM$M-Uh@t>Bll2NW)M)N5g zy~vO^cU_$EuqrdF<%pPCGB zjk1y`K-Ey9ZEA+2GrI&5p?bL-Zfb_@R0?dlE}Nm1RZrheYX6V2HxIC}{Qv*Ybfv`Gt5Aw>zPBum=ULPZNgA=($I-{W;% z*L~gR44;1Q?;qEFuIu%DUaxCk?(22m_Zhd1gAl0-H3NJ$E=}rIwgytw`IFSc$es}S z`b7ElYAv!oPM)x3keo!N=FP?CbRc~tf9B{;cHsO>Of#lxsa5+(=+58Ywa+4_5!Zv> z9Rf6e`z{MrPJq7W04)E$X6$qHNR$`Jy;x1w06jEnjfDm!KyM!hdh~kEsdTLC6QKJm zk;A2v(k*nKgPOCb0zLg0`yU<4q{9$g3nx{ET{t4woRKpFfvo(E9ogi!h~yvo4!Gsl zqe$_P)I!V1cc?iewH=5pk+$A1bt-%9RT4U2LXlX%*9m=l8-`K3Ypb_3C!>TC?fIKj zwFXRrxU@SV@WBtg5a(}OmSMYG7qFyGx@{zttwxC0Hij(S`P*K*)OMTOyck}$krh9G z+kp@1HjjJJytul{ZM*y@8+VfzmyLq%ZQBOP0n|rcH1cO++&0(d?`JQDmzs%|+J;O< zsW~k+m@V@TC4Yro4QI+6y_=E;E;1GJo@(F&ivXf>;XG}@08SEX)|1ANs;ny?@bb>n zGOtg?j@0NW+J@O8SVIX}soUW$5N#4cMc1}tE-j(4nl05*fE5n(vl)=%(5Sxrg)q8PRM%It zXA`f(DR#q$DJOA5IXwpRO(5x3Jdzvy@=I^JYI&L@%pomu4J$g6a`c;tTI zRO6LC&hziSK*VkSy&Gkczlt3=Xihn=)n5F$&3>U+x!1&ktUxD4&WhKL-}AbzPCM;YB-(*~M(%$dI+vQ@Bsxf%G$tqbw)nEn9 zX{}ljy#p?-7X;Z%y><}!CB65t&LCF9xX6>kY5fI{cIE1kdc+_V7t$SE?)6En3`uU? zb9!d7!O)skL3mY2IwhU|=tyB+penx%v(H1UyXqqt2Yr@gJ9?#IT_gJXe#`u-{)7=m zYIO-qZu3`?^#K9uLS2X?w-BLrPrX5?S%)nceMr7;6ln@4RVpN|z2S)Q%QYMcODd5e zLNQ(`EPw7Rf;_y%YjGZ(m6gA>1&1*^sJEuMe9B6dt^qT7PnyitJu=S)jLR|uFbutxY(v(?aH;fWx+d$uO z40>kOhspAdY9F$LiSjBUpP_z57HsB~(@qOE)+|*5q?|*e-$-4RRFk@p-hH+9+C{rQ zgl0n06%i<|^Mv!42s zqhYP+F$gOQDYB&1*Ir>YZG-S(Ax#&kR>jHj`gWNN^+SNi9f5v6kcBDh^|uF+jbL+j zyf~8$uwr?{d+W}H#4C$D-(jYe?9lANQlE9G2&<7UOnX>e9h3UHVi8(?K6jbT;%Kmm z4v%Uj8LAVvwpk%HZyx!W4Z5%pBVDbKUe6=Ot!%wN2jeASnR?Gq?|+JlxH|G1D&7V7 z%vYgnG(**=H)hRLKND0ZKm#;rLYpvVGISmN*Jb@ZOMb%(X&^b+6?1X(1(16^!kJWk)cA| z4`zLy9>*!ZueT_#xg_UXq;*CcRdxB6$EZw!@zY{Kg=vQ=S z<+pC@<{$C?&-0J$g#KgxdAJhyb4(m+6gNH-aA{9UD7u2Hn}6zU_vW9uFdp<-y8XQQ z=aF497pw-|CJdR5%nD|zN;1N%VCJ9ddBXhy-hQXe%|A7Z3HS%VxpXRx)Ri~? zJov2bck3a%CL~=E-u&}3H{?%H6KXfm0SB9s+4*PCKbV$;a|-;N)=5=BI%fX)@&>CY z3qmy^`4#SwRz+PnSb8k@J%g7 zzS?1?rKNmi!OTCOv47B6coWw9jtOq&pWMS1KLYlP!=qY>n|~e~N+Hf;8+-xI_6W^z z^Utpb?W|A}MuD(Qy}S8m^oywI4A9qCq5H3!e@@SYaW&}8$qdstZvM$!X6Z zYTo9@&OiS?ZS%7k#yf>rZvI&iC&~SwKM2DNJzH`+|J2w;O|X(8#9 zOcCdyl>TV8kK^Z2!WfeBILnf3NAEQ(vwhqpM?CeBv`%KB#%v$2K1pJI0Y?-f*osQp zKFX#(9Fa*k9GL|_)p(^;@yJ6W7^%H7TZbcZjYpmru@Q(j9@*jviqGeChbH)|y=#K! zDPYJnLEvK71k$vw3Bs_8;?jyj@S7lVls9S6tSW-l5CHmYDVZiHBkH^+C^{2W_rX}^vn1Qm@`h!aV8m2dFT>c8%yLaI zwF}j-7w||S0!<)APiTU;{*X{OBI3Bdh9f&DP&kr7lBvckC5%TZi{LxF#V0w`^{O@qy3Mqt;tCpZ|lD z)FIHng>jG8BMejbk`cFT-q1`IGdX!IjWcPwW%JUzL{UC~*jH?Z@D*A%XR(;?K*~qs z0Y@fN-Ljc+t1za4&TtHW*}NB-{1>RrK?!A-&6UVDICdIR-ujA+& zi2Wbe--M(q!do_XkZI|!Dy<_kAugewEa&m(kMLOlYD?7yZz>$qCZd*f%(8jq*8!ub zH-uqA@+;gUtzJ}}UL=~PLAXOm37WiR^QCbR9sykH2y||sKW9o%9JS-oESpm=w1xQ>Rw_q>wyM2lGwUUr#d2U(9d4AkWwZ5g(rN+Pxe&uG zn-2tSy^n%%m9R{`yJhp=g{Zg{V7{+H*Qi@Ie|(I>E(3ijnW6hHZ<5(<`%jpcRE-8b|BNP@c;k`9o*-4uqrwp}JcJ|SuY7~7 z-etQ;|J%ZYkws>Hlobrf(VE%~{3R}JZ%Zih!W}0-MGmU(GJ=8eoIa{Q0RQy~7pf(- zA^fB^{s~wdl_q9XP81})*<34D%;PwzcIjTgxns~2$lWE+#^!cQlf$M*IbI6o-p_N9 zDY@5zh65pqP&=yv{G6Y73bJPO!tc9s1UtHZFc2*()g(u-KjafCCxF-w+WyP)li3C< z7F*0ir_me}DjB=2IHB@}nGxH?5m&UL!LnleE+AA{vKA~~A@(azf<|kYP$hFv8_kTP zOj=3F7w!`eYNMI`(52GIf;s;5V$>o3Iz|nF9wn~9jWr>fd3TU#9lU5>Tsd})W=G9cAPHmAF!%IyLYNMIA|3llX_o5lBgp!Jl)>1o> ze}GH-l?!jhsUMLmwbzO4d`VlLM3&lz!h|D(sfps{d777d!1g`eVkX}Ic`=g&|6?(` zi=O#HFY+{|8}EPP(l$ycx|yq6%%&6#>Ipii_-}{6BR)%-mu178L3O4%f@&@3PGP*Q z^$5d^JIRP!%(jJv`xU%HPMcfIR?|I#>TiJasacyLr-)q1wk2z1)!)3uEDzd6$yB$P zrE=gJR2PGGa}0km8-i?fqTDWKQ;^Mc^1_SR{UA#m8vRh}%3I97XNXE()g}mU2uW9j zx0v;%Y%`^1z5qJxU^8FZd%&p-xjDl57re+NNmbyjQ%|j+wzZ-P5NZm^uW*mF`U48D zHC+s$S0PQ_Vm7i2UGWOQ@s8jYvny(V%|t#o5i^Tf2ij0QfqbpQOiN3)$bwnSg3K5? z3-7@C$T7jqJz$JS(=~n!><@=WwGy|OoiBqctq1Er&h`k+aEsZ?JTtEAy$*~TEs4=8MR12PkBb4BAl(kW>>T!h1>M5kRx$O2yx{%%t$WEqKt?8sNiEdIdMO-54yc>|T)0FT6BzZnd zvK@Weu*?m}8`4`EBWa(^ayKAfFnH8Jz{?8}Y(*v9fP^Erz)6(~iED3MPs`zm%);Tw zVgZd;iW!fr7Qq$Tdy0(lR43PXWV?usK)mtDZeOrpyyGb)4_o0aKIR2pFDTY!+ojC- z?Krb8rXPBe8NY-Qtk@;0G+0GknvmRgKhpOCUfP%0QTM#2U~Po-wvZ@%DQwBb`aiXV zP(MT?1xr$J&O)pvgSTM;*9P62AlxY=tswd-UK)1(GDsu7XPYZ|R!fnta3q$tE6Ac! zFNsJi_m{Tglr9|k5F}N+@yK4!n{(4vvQ{I0UT-!a!#HHAQAWJ70g=vDqpW!dHbV4o zh!c*O1=9F)V5Z7*oW%!n9-VPfo$E!*C=SprDv*j0Evw!pS=8ny@*;PocPiDCh^A6Rk?gD(c5P=aRMNb$paoxi4h-qzU zi*RHcu~Lm!%EtM(2o~WjewfU%zo|6P?QewlKksj(EdQ~;X)q%Y5Y?(2S5XGt$``XorJ!@w}V$ zL)BG4y1e=d{HSnDo9J?RH|twYa1bt}l>SUNxP%HPGy0Bx^^-)=nkqx6E2IQX-u~v< zP4w*!fZZK|Zf$PXPh^3OL_RhVGy9u93)VLVre<@Psy$C2ah zpu2=&GG$9{_c!O?OQw#1{^K+Lul>!Co^VUj8?$g$o9>);5@KHYf-V!**Lb8MtW+Zq zZ#>e`7vwR=M$iWRT$4&vCV@;vKMLrNseMc*i)nld%X8*@t=Fi+Jop-Aj{o=z`b z+k}diP@<%Gu3CYTHMlgj)lbHAK+n!OSAf2_BSU1$36%Ff@ibev>6$fGcp z3F}o!4#LEe5N=jClvaWBP^vZqzT*g9Khvz+Rr{9!rLqpe_(@nM*U|>)k`Z2Pp1Sca z%PLAuW#AIamadBQC&hbI&1-l>Q&OxAqp7fTmP`#;)*@A$C-HTPeP9efL)Xa@=vuBG zTV{LqjWA{x(v_hN_r=z$;~S}_$3T}mJ-oyFFcvTNK8UtDv2FO;9Y;*jOJ)AjUHl;~ z1rHSeixk;hNY3r%LVL}2TyknR7s7U%i&BH>GPtyCDKHa_*^Y0x9!nC5s=8n;1kV#Z z8t3YfdhEJO1r7+QAB2%UNp}HnbMg9T{3(TyZh|mhNIE4m`PCM6-sWQD>*W7Q80&nN zWII~lu*~LS#r3e>hOs-Dk0{fbjn3eTEe4KlT~jmhe|2G78p`;A^k)=&0Lh5kXY_9&+&p+SgsanZ z`;6;Y_=2i6KraUx9XdU4pKYg?MdrW(4mDGZlCc9y+JBSO@lE*Sh@qUKDna%CKu7wF|7)LdJDp2SgLj9|)t%GMN6ag&=nY|gjYpnKb{b1qH?PQ14Snf`OQ9aUB$;xb`)iy%L9C)sEj;kl~eCk_7gSBJpn29`$WXm z%wx`h*rKw8s>>sxoCcIoLadpsra_z`8lUCDk${oss`*Y96$PeK2P*yaF061w)YC7x z=G;&Zn@Y*_Hls#VUDWM*ul~7>2!}WZZ;`#p=~2lxgZIBUYpi zp)w|v8T_}f3nek4-oBJp21hWn^z2zyV2*HD5gH5+gtF0D5g72U=NVY_3nWr$WejEB5C zKFV|E^^_=7Z*cj*fp!I`ubRz+Qh!)mJ|S8k77u!B_Kz^LE_cc37p3(@3Z`u;39nG- z>fZstEBE8O^RK}TYFtQOdGK57YJ#3FzAi~ew;1fw?MS`h_cb*;MYG4ioLPwNCof46 z?>MKlbsAl~Oy@YP<1Hc128s89Od3(0ihTMnDi@-(y_SqM37@BvO4U(5h5nnLl%L9{ zsPNwyA@cp@h}^8qQ#!qKbmS6OFh+2;A^gbAI4LB`Wo^h}%Xc>D^ddS+Tj-bgQFK}A ztHu99Y<=z&6?mM-m8ZL>NT%TvH2>n#_-P5yocdDAv|4f5?*ov`Yv8i zj?q;_b6x}gz;Seqc-7LbA|>nemJAxcyr9{~Vg4y>)5UZ)TdOHMAa=R_Mom0l6JvBz zL*fv01fRS~sas+cvfOOQ|7Muv znNUQ3Y^81`6Dk^8yAft(6Dk(lkqWa)2d#xS!nc4`HCRS$dn%!7CX^Xl%l^G?brZ^p zm3#%Ph6z=O$Xt$ zAWaj94i}C{Wrd!}XFFDA1>SJvd9D|~&LyfZk~-2I2RdX!& zzqm9>Sw*+EA%`V2R;sS*3^2?GrGG`Gt3^K)T0ONL6{Q*~$*7tFZ>HnAS?e-tw^Ym9 zAGKQ&dah)0C}L=NEX`oTQ_g*bCASpEz#{ zIW16qzJ=Je3&&3oi)rGGkY=Aj%6k|$7Pf5+myqc3;oUNVd zrWl&oZ_*`NSt(6y1F3&9(O*Q+{W3FVsR4JD)4DIvQ6@vbH8~2zJESfzyE{wkPS?c8 zA+7R>^IA~S`s$;%AP#QbQUydnjx#j*J&2z;GQ5K$NqOjJRH*b8c%?P(H#nz-XKJXv zdV@3kQp1m*;CPTe0PjN0E6d?p6`ZXB(ScG;9=Ur26JINxcwCb^LhLPMt<>yV>Z=2@ z$m!_cn0jP9qB&EOCqul+ktzDdn&jY$F3q&UGMcjpe2H-MSmREoNhNfRZ61QN9{GC? zi^@1Qi?@DYZr_;%OU;R`(uFUliPu89V*gxs6`trQ|@WGGaF`LWvcln$rgfg{ijVRo4!6Ay&NF5C^9ZuQGv;M2{RdA&@@m zuqBSTW}FM9#3pS*$yoV>uxwfP&f&DrhKj{X4faDBvHh?3%&gd8CaQFM6HqC(_Ax@& z8Z9+D4jVbvh3e~Xr=(9dSabdD6fe|1cJdVQZZx+p-SnE8ezPf1AH6cC&oH?j;C-AT zqUvT*W!^3}^QP5g(SGx+XsA;$>O~*soI4oBEllJL{+*@(T1)Aq!Sb1*%**-^Y-NIF zLYYIF5NvJI%?f3Hzm8znKN#hFIWd@dQi9!1>tM}brhE(~y}Qv|KbZM=UC>KRuyK&1 zmlcHD)%b~&7^NZgJq_?1E=`Z{s0cYWnv9V(y;qGE<~smERcs=+COFFyb!N3m_OY0) zru6d39}2445~GKUWf!v&O8QiKe>EKBT8Bnsx1jSoP77E#HDiF93A*Sk3`5ISv+42a zL$|%C0uoP^R6Bbhn8|Unnb)=x_g#svCnRQyGSx_V?%?T+rTxf%@O4Y>ltw0%1Wx zNj-*wx)4Q}GGaJWbT|u`Jku9`bF=1zG$$XtgX2U?P>Fh?GZ(2N;$6g~lK$vB=jwr+ zqT`Js&ICW+2`PPnYAnPj7OvF^gf($Kq(wflw6qfc%GHpZJlQA%;`4y7_ynCKUt(Zw zPk*NQ!=@S4rx5lz60_ZN>rn9AQuYTDLH!1HT5zwv4lvK9zj*V9V6jPTn{Wv|00klG zw;RVVvUYpyXEQvOw1eFfAtLN{raRQCz~?vyV4v4P-kgY8Phb^KkaRH5!QN5Os) zT<422>G+>kyV>GJuA}{N4*!iijr1=X46=K%s$jJR_sV=FTgddU`*Sm|+9B`Z;+nOO zzX{n$2EXm`5QNcy6AKYas*da;(!c-vxb4PsA>1n@FNFgIC^#`+(UYD={-R)}R(D8O zqX;xe`Y(6?V9r<7dk{WxByjoEK>D8}*m+66S3iLLD!5mLgJu5tr`AoBoGD4AO=e}m zSv*6vg`6H%rw5XQssIH7CbVn1{`60JQT5zX`%-jw7=3&d>FS2gsEDbu+_B5ZSJwbe z@d+6!`T%)IS5q4R-UaZmfF=#yyVKP=`ek}t{gY?A?~5=tITjy)%Xkt(j{0RODuTt% z(Y@<)2qzuMAE2gjI;%mM#Hpw{Jm}u$)(fGEvHF$AnL04>^rX>Qg})%mAT{DCw>v*q zC)EaeCl@8qMSs0Ly^4DMRTW@WlRTZLiB~w1*{qb4;mryxr42{!0L`nH4nG{Z7k?f3 z3{Rxqh2n3>2C8n1u(#lJ)steqvWNGW?i*C~)V<*K$}8ck&$t}IrO7tL|5W8C%b?`d zXJCajLH+kW(2lYrKqENl}|EsVTUwZJ~nNc@)1ljv|@cA@K`~ajne{w z7AXa_MnGtJYZdxRZK<}Fl~3c zvgJlW?zUg2<_mI6s8~!4kp&e@C@Z#jDj7VEM_q znEESb@+r82E}}&4T4Tk?MnP8-gq-F;>ttN1?AS!(R6B8cyaAR&;{iN4JWl*ylD0z=z?-jFrDidk9#qU#%}r} z7X{_cr;3yo8F?UdB1}pHwm~mmyoL&3fs=X0THw0krM*L$|I6F-3s^?}!veP_#2+xp zN>ld+x;idxhlHZPULGzC=&j)E@4 znbP?dxT?r%C(5k_t`)LwPVP2;`W^gPY6!?!hep4Yl6e-mOK-Ic-%JQ|g`_LOv%s}s zk2Y6o=1HLE9c(6WYk|9^fLDfvvlILi;g~kjwe4Bpe)|~pLiz#1UxgHT7Pxt>t)>z; z@%}$9QIltZ>&|9G)d6he2yD-c1#TP@r|O2hcOqt=^m&=ouS9->!%Qnlwx|zdfjhLw zW?><$M;sH}Jn8f2Hf0LC4s46Vqgsi3(&wY&1O?OT#aI)A2 zDyA_(rKDddGe~Z=g>u*YI7hT8xj%eQrR9!$o>!=HFKQ^C^4j?->vZnM-aJj2JE0XS z1I6!R*TZuc(`jD&+=cd<=PqP;+vhGMDfisPT#~w1vhyee|GA4X;Xq&{Vzr9P2Em^c zJSzR3zM&t^=+T4yX_M^dK{%ro)_jF3dJvOW9M-HLx}~CN(WL`WYR5 z=8#^!hx~JgneSjXQS!gU8Qs&~v77u8K0%U^$_OBeM`MXRqeLkXi}syEf^S`F?r{0jNO!DjMR+l!}xQrU=I?= zeeXi*CpVjM9Lzmch4GjB(sMGJpDr#R=DV>wqdCy=;?{wTncVeD%g1V7Mec5Y57qL7 zUaU5uJEV5>1Kni^&5~q;Wp5{Rw+Ri1{ndaJ?rEmu4UVf z@lhJ z6usbO=J<1D?M0iJc1m<8wM^8mxz?y{$c=OBj18S{xA}Y7Q>&Y4lZl!VTPDr)ifN`| zrkP$fSXQicDX`Z}s9LN-W2$ts3Dqy5M1RH>RTlmExHL&fMI{maL2a*Z?tHTX^5#CH z2VNOaQr>u^FQHWN<{Wy6a&IE^ zr3n>{t@@PES0+>}HePz!Hzrgv*0dR+{U($V+cX572TUk4)?1hdO(-i?v>l;uO{hYw z+O6n3WI~l<`BEi^O{iL|O)grFm{84F>xP8BH=#PQHPQ`^no#}Nan`?#Vw8Go42=-9lW#QW2Pu8eJ)M(8gS z8W-rE!g61K+Avz^lDsPNCtR20RsEBnO0QLj(%INlPZgRDgRocDwTgx=ci)Z-h3)go?$UdK-a&@bfsgN81#JkH#7eK4Q8r%dtE3x^Xkc;t?0jG%WEKYtKV+PYow*}p}D-q z@{cVgl$?O&wNVR+{s=DZ+&RSd}5Yh!?CI@Fp`mbZmv#WW%A84eErbZAt2}x%%%E}Ok ze$B=1j`D^)$JDQez_`X|Nr^R;h5ZI5?z|DjFeD9^MDGN;N0>TiXpxVSu8s3HRSu)G~k&gVijs8a+@z6Zw=~m&0{4GwZc;i|S*8*OA zA~W$wDXJ$`ynJEP^Y*F?S(P7f7(rRV=$d@ud=b-J`7x>^(o1k@0!yQ5`B*iK;MGnZ zJ&qUfnr3`lc7nQ@&|C-FM$0+xE6QAc^s@k=YZ!9nFV83C{N)#8wW>u4N+|jNz4GJL zn=n4cImjd)y@aasOPpBrim>C6pSh-rw`W}`Qtkx#i?94reR)Nd+~vnTPmAhi7xN!b zpl2hk;>cW7l>GypQY$5u{Hm?36rb_tLbIv5{(6`>E)$|ssb@s^@r9l zFICcgtI9V*vwJIML6 zp!|bo)kSQsvTFt#i~qn9{I!EE#lKJd7X{nnPgnDqe6okBz09J`Nkn}}N%r8<+DgbH zj8ds=B2SZ=`U&t)A#}2Y>oH`|Yup>ykUozGsaB+iw5{4sRwRhu(B9r>X3gkehFM`^~_YR;966s@B>XrDwKpK=bK zeNdfRscb$bfL@=dLo<%3+T5%e9ruAQO47kWclI&;W~6C>mq1@l(jknKYVo72H98-k zfqtE+V+!3X`*-#9&t3zZ0u3%mD2ryCQYni)9c4f(2*Y%hzG^*ldiKBS;APZ@PNfBC zR9ARkRed)Jgo3>$V5MSW530)&z+x={&k5#pLt;uWRX`bJfxb$EMS|5hel?kYKtLH- zfcut`W;Do_)5d%;A*KdP1dFZkV(v5Wd-ZAC{AN@kvn8OlcYOreXm6Kk~n_bL4`hoxK z&7o@LRp55g45^0!pU0WLrmMqT^v0);dVMq%^LZ$nTM-lC9mxCr2$Ef$XY<#8eboD< zXoH_aW3KcfoQ8bveJ%y7H}6?!k(3$Fo2Ck>3Q+3$G-+-#s;jG0&B;Txln?1jA=L>^ zAD?H3>n&G9X_E5La=!Me%QXSYtYn&2XSM@cCb+YwaK3tjE|fhwsA|BeD?Bs& zEpSCpwL{p)0p{OK2TK37l&ga33gAgTWwb%Jh~^uE>JE_m9BS7wUiaf{D|>n9H75B9 zL{O`tyzFSvDWW7@T`?Bc%;3ev%|8^YPhjj7mN&(JR)SP!2M-i6HKcw6Jnht=K@;u{ zcHPm`A3sTpg7oiv@Q!XEf@qi^<&46*2&(foi#{qI+ zl?p%8-d6b2FkU=^m3|sl_3+lFmi0c2uYHzm9n9!YS6MefofuwS*Y<(GpcQ%0WzMHo zSJmi9*>8t8Tr1B_<-nj^7K zmu9sKWpNgyhkZ8~1J2O3`4;-#O(`pxaC_1gY7&g;zAjrv&03uD-K8qfPgsj!Jmu@M ztcK;#RWbDrdcGdRTVU*TtU&(IR`w=VJ_{uG`}vD^$)omozM6vJlKp=E@2y#$nP>i= z$lNlR!=0K`qdwe8?MSo6BXtSKBXai;jzo}zBbNw6yzz+aAL5Z=B9Ps6JaUzf8HSMK zk=sPv3`VcPl)YxW&%;jy0{zxD;GM*qgog#cH@xW!;c+h#3dtQuy#IK*VW{|JAOqx# zR$JBL1Lf8u^uZydmq~d;a)%KgBqgr2p)NHWlG}{|UnbuNCo;pXL)YxS%-c+qQhg%>a`~w(X>@=8FEZ$BPuvyU>$^qsI!4%XIx~cUqTMf+t z+xZ&IDi-gn|0OGmb~OZWw6DPuhN>f5`AZ@pOb48msG$Na6d$7+ujV-Z>{^=~-5T;I-3j^L+{9gwN9J zfTo(|B0f3TvMEW1ALH2>oXxymDa^7Hza#iy%vMrW7zI8{7t!i@COBgjD?n$^%X~)S zvLhcri*F1b2|}9)D)Q@vXtur^(Pl&_^7Dg2@gq{%)}Gj~wwx$9)O#RUvpy z{?c#M&nLm`cQF17VGrO}i3C}U;@<{8`@>evpMc@VU72-h%wiP(CAj&pG6SR>jH<%Y z>3EGHi%~of8oJunOdA;8&tS#|+1&4g@!c7^WSNP#3DsavtQVsY^&iD0=S#Etgqps= zEL@fftqh~Cuo7ybhMLYyqEs8?mpBb}^X}FbeF!C!^M9;A|G{B7nN5qvBg;u4RVKc8 zWQ}-@RIcI38@^zZW_&Dy=e74M@fzv(;@yF?SFSl$ov~CF3a0%evxJtKV^#UHd3UT@ zot2;tF6}X-3CF5!kac(R=rU0MSam4C)ebClta^VnG6bmZ;Bv39o)^{TPv*U2)hgw9 zm03uuxNPuA`d{xov&4e?uwV;m7Z+K*OeW8AtlBgV>kk;`l9b27n|!Pqc#Y2mP+ckq zsIoA1&fKx;W)5>zQ{-I*(-jhxdW-5@dB>{1T@PzG;&I6=bDG+M=~cJ9cxc6ubhL2f zE~u&EjcY+%3&N2TWF{V2DWG`6k(WGguPdd4mLG5!zr=|}-$ZWWk=eva6>rbUQl#7oyF`hYB|al}+AN_xNoI+&LxG+*Y86K+ETdNL zLXXsnXO`H$)$Sexpv7@%LQ~OvuKHqfDXMiY#Y2@>0Zx@XvFQ`9h5j-woyHGG zK8Knr-nbUTwSecU$V@!)yMW>iM}kjTZ!hW445jG^$_kb=l&T}GgG&=QVJNjB*xkva zci{Dh(ojNIJJ2?o%c}E`i*sPbBlEbXikFArbXxeK+1Jg9ba{Zbev4QHXqenu=5zk;Y|JTxlB#T;NQ6lHJllw?Aw@@IwPh9gn401L ze?Zp>!&Hs6KkQXoJ1eW>L(n~mI;@4_U8>sX_!;!CL><;barYiCAEh`>&&1i<>!YlN zVk2vd(NO@}R2W`9K4mwBg<{s{JWZxspfBj)Bpt#ysjB|KgsT}-L8m9`uojAE*j5@H zkAN;s)L|_Y`=V?Jw2s$6xBEJrg`$2{wt%|E4uD2=g*ywykJoS(AY)qvR{Ef|P@E|5 zrCvtBWDCXgre4Ag1x&V3v^?pRy>~)PYoTb&X|~Do#DtjELa}NLn_r#VyAwcbp;$)O zFu9dSO1(6#g(5wV=h}75w-eH|7K(G&2b<t~dqb=ET=@cG? zyuy!QY1Tr~>Pb`KA+;UKZl5O2ZAP`TP#pSFGW-LazkHq@uGT_vadj`7rLcfh#o2NR zO{+6I181R-uTa(1*=!4WfJD&4L3cNEk%nU&TMNaYgI)^PL7w{`DOd}|sGWQcLZ|Q) zA3&nQ`|8hX|K{`$J2bs})3q?@|UIxw<`%i;<7K$n$1rD|A zn6pqk^(7|-FEXumhceL7qURyA_pewere~^vY@gJ1Fm4o3N1K?&~gR@ZdyToev9Pk@ogR@Xn=OH+$Q*{b3$Sm&iU@a8qKBodLgpdhX zUI^Yor3uS}V@mOtA3|sX*g8>zoXlXM7~V5rG+YKaB2j}TtPaj>tBi)50B0s@uoj92 z73|T?V}Q#O337CUg`z0Cy=^St>UF?36A9KrajLN;><9eLCpZhmnAg}({R>d!d9R33 zX+i4RS|~o8$0v|k!c|2WwS1Nyh0a2;>ZGmkjxc(k!Lk;L1&1wbJdEi+OSTSXx^NbX z_w00`7C~EeHmb8wRQg;-^;S3^B=dX=#k1Rmav1oJWJ*+$_UsSmgfhsWN?XH`8qSUY z+2eSOBB8ZBo2qJpHuf1>hqF-h;)GT=%B3)d`Yb&QI19yZn@DLg=q#ThDMb^L%L-*2 zCAmkTJm=GNZ6)UWr|`i{v~7p7+ou(y8KZLXEfl|g1noGKUmT5wmO~*d6kG2x^O8zi zOZjoO{5s#xLeX`G9XNGhG#8ec?JUb$C=PLFrR$&{jFD%stc9XNW!oKYhA~H2dW=Oc zFdfjdP;knshw3sIYkXanCC5EjC~ken=KdWRd(P0MS?xl-DWlf)6O4b(&?Uz`SSZS{ zdfiW3s0=2*3b^E&(5%HNA9CvXh_IT%=pd}5ny?m%jQi~v9u8xSV;Q4^Y{T=#LLs;Q z+CuRuuU6?3B7M&*77E#J>rV6mqEEB>XfdBd$oLSq{sVai3eY1HL4C;$1%u@ zHA{46!nj--tP5Z-A$VQinkByalhZCCTn#uWksvD&W{GO`Y}L#MTqJ~q26JYK8V&3K zSqEc_u#y_XnkC8~vo*69#*s5v)+}+7lS+T3@6(eDghnpHcr@(QbKB8;2Q&?RdNW{IghL#bDwhhQu_Lziat2{o@}SD?)> z-YKNZGfV76{+-icckFIK(I-zbIseC^^B){mi26jXT%-^0c1YEk7wlt|9yo1YwN?WW z>euB1-PFW~SPLul<8PPDyX&&RWYZzyksDy8%Dl;oiQ+X^yd{bVw7zDu`#fI3Aorg=Cgf!tOHjXUM$)nRi z{iE3W0Bsyt=qR@8RXl%1rqpFHt`OGkqB?qosPK+rH?Y4uETkC_?(#|F49OhDE`LlJ zO;17CAS9j1vmC{Kc!&Y|9*nPimXtX8DE6vjD)6Bs`Uk9kg{gDqj$+pp1uIFkia48= z)}nLe9mPI1fV3LIXq(J3C$M*NI-@&|cxc6^^*&?-)Ku}twICi50k5l)nRsNnfZ`2D z=6c>JqIFwi4%){4~g+_M#M=KZ?F2MfByN} z+4`rJn*RAO1lK>85d9fk+69|UQT0ng?bOT2b~t%76V&gYdjP(5V4?mQ|4s#_0jhtv zoJU$|d7?Uco~ZEp=XcyF+%BZ@5b}LeF+(!_^TX0sQ+o(~g`_iimi~Fy3Hr=cFmCc$ zQsU(Px&N_1V7w&y0MMht)H!qgb7T>;ynuY0U?wfCMd!-vpX*kl;d2;=l3Avaq)~Mv z>DCQLUM?s7E=;jf#T(axxEAo%0GWwLas(7F-@o^~y`-1WKUX0rD_Bzh?1OX=E=}Ns z{yC1|G$)U)#q0Oaxr82aplvjlRp%iWwPD308@Q&5Hyn9e=lm@ZT#|*6;B~@cBsltx zZzK@T|GSYu#;j)~IEgmTNFdej840AndPV~2=$?__IkMsz3D$|<8VNRu-x>+F;CDuX z-RJX>HWE<}yiWV$(*Bl^M;N7UjHtlY&4@MtZWcoDT|=-&f?M9%*oat&>9X*eUn-RyB-n7Br|C{8_xm)dQ_lqOvHJUY6*!-g2GtrU8ywAJ>`_Gqa)?aL1l7l&UkJlg zjWZI=rQ}A(Z=k0Wbyy=o5Oa7Kb&)Mr_pN`ym;sIG8lBxpOzGZIux0IiYW+frWYEd@+A5)9huB|J#LWFvuM z6KHzhw1k+}NU)l>BTTU$Oo(ZX1m_R&a=R`8v_^v2k26PWlg390pfwWQGg$?W=@vPe zkft>fyjb3AuJgC~xwS@ue>jCOF{=n@%V~`STc7h{wsSF^k>C)O(1p4UsiAg{_c3@FQ57H4;p@#&oujItt})pC-+1 zMzu2%v5ju37-L_cfS_iQkusV1Z9b9Wz3b-OsgEbOlW!nSBZGi7260DKnr+gLoyBtXz0z95buttJ$ zW$6e)IEUeyCe9So842d@2dn^4Q$Rh_N2LX+YilHU9~EzA!Ri3xQlF(qp)(RxsckEK z9E@pau&j|_#W%KL7s6QXvt;WKwF>QP49%uk>g&*UosH^@1n0B!45{zn{F==3jRXVR z38m;;JYRsb<HI z?P0XV-sXr5XNQC{63kj;oA4sQW{zN{J7*;L7PGQUMyfB25yCRFU9yqjpXIg=Zh~>= z87ylgxaA?6;*&6*7nbRObxjAfMuKOs=jjyRhOyh%Wm)?8zg1|{4Yt4h2;=k_x-_d@ z=*!Y};z(y3R~~0`Z*|Gx3r2z)j&b5fTc{>5E*6%_mo1}aEl&C4TWsjU8V2KPVI|c> zLxx>;#ne*w*u&6SFy=c}p>uz^lh#IpIrRz~31qwN&UCaz;s1vmNR81x@rc|R#3ORE z5RSaRS*{W4HC4R4CatffMIf8$c%*`l8HSMKkwzj;h0*JC6k#6d&e5zj4+zgQ4|IaZ zt;bo+0}{cS2jouUO!I&gFv&ciw-v@bpqD*k9*}9wng?W7wdMhtKb?8t7@7DPmo}d? z6U_tR_xNZ9&H%+Hb*0J!y~t-gE}&-~cx+W5uu?R3g3zZB$(aXUb04eorTaB zaB!jqO_->Pyl6FC4|q$W25TPZa;;s}9tM0OkzmaO1^fBRf+VpC@Qp-*H4ijqZPtW+ zfCm!^);#bUqv#c>{eJ+@`@kz^^bKiN&pe=ZSyFij`DY~^Rd;^MR3Mt#L+B|aT^~l1 zGY{;!(XNqK!MNU6^_isS%mW=7+UC0##*;ovPy3qc%mY{4O_DD|*^x{`nKchA{Fp~Y zrINmZaolI=B0BTH%s3N%=tKH4&h~ztoLpGcta;$QIEt!3spr$A$HR~p;CO4H{M#t% z1lq$f$cr@(q%wQmA$b`KI8g{*r?KXNo`3VohY;og-j_%y(qEeg?l~VrkPub_zAOYi zguQCktY3mxK8~$MSf9Z7#;NgG);#d^HMV9>!8m7^mm7~|%>xI<+Z3~5R2NoKiq<@E z;(0ru+QH~?hAvrEFb{n5qt!JQ#*{O3X;$sfa1I%D?iav#^bB3Hs$d>y^0-}lHo(|+ zhAz$O6I#R(mtK3mf^oEvF3&t5-;IjUil$_CukMx-ecB|GbFz6LX}S3i4$DbzB3EA0 zgCl>bI%6Iv(XI^tsl}$7e}6-mXdWoht{#6<@0$mj(~|MXB3P+1Z}R?wc#Tx9;mCSl zaE)f{6u~I%{aCz4`jvQZK$??rF%Jl2=D*L_h#hRnGmf>y%eoX>-%|xL>&Smw$Va6b zo(3zJ_KAdw#iF&r>eCSkWyC(;3D&@bDuuS3N2u{^wnnjbO@e{UCiS$!`mtI})|qWy zW_sZJ#<8@DgxW{^cU1rk|`rjrb)YXLe!(EA1x{}HyT5VjK#8**){R^j-j|r{5Y6aTO(QH3zq8dwj zjjQ!0>2rxb!ZD(fhXh4r_7k$6^Hc_Z64$Vz)LFlNMfv1+iz~jP_?h{=@VA^teAz*i zP{M0iNo_>%x+s+ha>BY?NaGf>Wjc2v|c^1gP!6 zq$+Jxa}keit9GDW9D|bGU4vw5ALD5PUHnmC6C55LD(XwBMU1*eb=NTQY0?}B5BMbR zS%ma!E~NVNzP1(lJcKRDB;7(V+s%jBsK!96?h9CllbL~m>d#{osntr>+RsoQQm2y{ zMi+JZIu+Kd=`1QEuin#8&$K6Msj=6rhT!ZqJ){M2Y1@$|*b~PfyUxj@?@0RY<5PD4 z+~+`B#nu$lb#n(5s0OH><+4#&yG3<$qp0xgHL;C+23$xVarw$8Z8juhuNm`!)$|91 zb3sfd&tk7x(GgW;VdVQPDRHvBX3iQO!IDJV19cUq&Y82@`^gt2ue}R=hNt{rFT9LLD4v8!czdUy{z~ zF#y({c#M>_(eNicepwO=wV!PA{u6Oh#oMd3>3QY%o~`F;sp)x@A-JCRF3~^6r8P&I z(DS}U_M?+W+k*N%FZcx|$C*fldfvUvEX#%IaGMcV|FhfW>lV|C9-&}~Q2Vgwyv!ukyJ#WNVp7M}Hx4_ydOr0~=^G@^w z`x5zyLRxgLyq?$pF<2=mFNU)@lC(@CNptB&((M+G$WJ(u51uOCxE92}h~P3OkM6_k_q>+~ZFQh+G?!K9Ar}K+ z#Ulr}rizz$ow7yniwI`nz4Q+X{j3ZveDQ@b^md%6Fonk51VQwW1w8;)1-!cOJV8*lFmHfhkT0FWG#jJcwpOTdJ)R& zK27S>vjcvtQV+5YpgXAcLOI}Q9%GMMxr4_Ube8@B4S$tTa%~6PtA1I+v;JB~7HFO@ zOv&8`&rW>g>1YXhaiR`uDeV7@r(-zim_!|#aYVKJjYBq_kC~uzlXR5ebnKXV;4QBO zo&sH+q(c}d)#ohagSC#gKtD{>VJ(FROL{tvf&QGR!&(Z@``Xiy_BH?igR?!sSqcXn z;*ejbQX4d?E8JNMYhLDkLab{7Xf1_Di+HJDDWJ8WX|PDJ=}OK>wAxt$CR+;c>g2^- zmJrig3Wwa~W%-SSnATD_Bj3yI*9oAt6wZ6t`#js}1khRvKbpirn9k6J-}t$;mcnoq zugMDpw7IpG!e7}gn3z2iVp>b#Z|l66<6TT=DQq57fyty9QgZ;Gz?r_5U@6p_1!pO& z_oEl#704g?5qwLbjbJT>Z(Za?_yO`?egsRimck9Wrouz26jqO1oXvM8!=YTCOw;NLeei4@UGr955%)n}ArbV9rMsKC9PSm6k#1in zy7+Z0t2)AV$b0`I1#2n1^95y7_#N{32mY@Vd`n?DIJv?z!`}i}3hN`h*a7B4FHK}d z^Is?G4?N1Jv^S_{DVzc_)1h_+bC$vigH@mh5!7Q)Ryta=uPAYr!WAvq@Xv*{9mc!D z@}_ueDSUsesUdY3@CT;`4c1b)bDpUY6*)*7;KHE6=> zU_)-Uw1)QpKS|VJErk;X*}JC`fWIXYtfg?;aQ=Tin>-ZzmiooHnzWX}iQH9bLM_1h zKEYWE2eu=27l3{O>Pm`A3sTqCQrLl`;r)`vL>M>wEIkUHrSQf~+hh;HSat@>S_(t= zTGnP5ANnlWIz+8PYbiYSs2PXqD73%NMs=3L&xXjTF2Q794rdD?Dt$}gz3&U99&o#4 zN>uZ#{qCI5)qhgZflw~@X|l)hErnIEfvKB7@AMg3hqDx3-PP9llQ5q5S$Y<5mcoip zpl1i@9-kp8MH7?D3e9ITqke$$uTRspm6-3J!lmCsTdBj0dYr9+vwZMu0#mAL45gK$ z(a>@Z%j-l9cH0^s2za?86#C#<#yT_IDfws7yM$$CJ6$^W!LtS5V|bx7>S-7+p24z~ z!aLU3?(ja0FN9?};2_fht)*~HQ9D$Bg`tkP6fH~6VR@aX3MtC0s^T#6gq5UAv)YBe z{lw~O0i*L7y5t-dOJU$aoPpoebfC|eDxha6{D@h0rf8f5VR|8wvlPA_3uYe9!Ytm_)f)ZMVuN&ES(Oq9F?~ zPY7Nfn2^(QpXxcp|}C3SW2!1ECPkIYtr1 zdBwDr!a78{UuwS+U>zao9ua*+n$@!uezU`pIz#AtR?<;bcdrUOC7P~*aHEiPQbv=r z6!vEh(re@cFqZnN)=GNLQuzK5+kCIWc;9E~X63rACqY)vzEg9YS~IE za-1Y^iA8jl!Yv9t)j^y3jKo#OS_+G^w@^Ky4EAZ#<9$ovj@MyK0=>a8$cwcUmRrpe zZ_*z311=VV*B;hVIEqpFrV!QxzLrRkwTBmpPO_QOJ^M4jZ-tQ1VD3etu^-v){V$9n zKX~bQjbSZ?lb9%V@2Ci)))_2q1B`}tTwqh|2&1>Kl2X*HvZ15T*daL{#tmoal2rvu zVeg?<*ZnY-oS{pzc##N$fF7K$z}R_)E?HHu6pmsD>$T?qj1y<*(yTtA9bdCCWq7%mQbRoacx!RB+okH(!^e2j3UMwBoU)ys@n_4a(9nL z!9}VI4>HCo4cbIL!;wot!jY}CQLhfO zVCL2P`zKk!*A)8joR*q{?I8PAcd)&T_^U*FY1zek@^Yg){XdT{0FF4Y z(7|?nUR=2eP$@EUJ}#|_sE(d5D!ha3WpsntLdu0u+b5MUBy+HRdta-mBZL7$(wRKV z!FGtAs>Z{Z?z5!C$p_mvT+VyMlIX)gPY6@z%pGiR>k0M}@;3!DX=yDwSKh(){K~NQ z!T2tjWzMtzV#Mq5Djr%!et7gesF!s~ejiqENlsmHji^ht9K$@IK)qE^#3 z2%ic`XYwpPZzwxsbrih^_!KnqH#>H#(p z!cCT7O)AGQ^1UX6-hh|+1ZPs&#hu=A2thRk^k!k0G@MCgF8k!5x*ueTL!(k$&OPlH z+TP4jR>`YS-tuWuL%vBR>0!tLC@xZoJlUALyb) z9oD4s`#WAfUIKkJQHM3DsN21K$cKKvPSR0=BZ*@whZZ+2a0)c|r&nak@~JRRs=n+% z*6Mte0j(emuPoN2a)O8NjgDrZZ4-6;f0VrooK@5R|G)Q{=5*ZVRH8IBGwC8kcan4= zx?*Hf5lxh7j-zIpnl8GRTZJO2bVDf=Nk~$INQB%&AClx2;uDhS|9r3YUi+Lg)93qt z{LbUC&RToDU+?#NulHJe-S^(QrSew9QyBxG4o=7jwp6khJw0erxfQB4c(A3CeT;kf z>ft1!ZmBHJcRAQ3#MCX7v)^$E?-XL{mdb{k9p_(3oVum*Nr~e;`A~vWw^Z84eATu^ z5>dBQe&6V{%}pZemP*~eOn*&2Zx*6zt6M7nvNmjsd|DExZmC?;(s3?N;?ymbr)U@~ z=jMPj*ixC;*7x2b%{2c@h`-~sT8laCzKR(v1Y0WSJ>wXv{LRuIP8kwgD$1Z+D*qng zmE$Ibj({&sFeps7R5pHSD@vL_7|7@ZOztmxR|i`v2bze&Gr=rK;PiIYEtLWDT&m9l zc{>$m#Fcya>hEKCB*3Wo9pHb3!Bk~a-Rz$^v>$A#EI8YxaLQo@7&tYAD3X$bZmGQX zo=c${;Cx{?Y6^)hm0@5;2ZG&x30o@DiChp6>?!n_(xN4{RGx&qJ^^{qQeWxBeakmw zwn6zcplS~mY^i+Pl>-Is< zOUe6kNV1~22)0zt{K(qa9}96xLPD^m66GMDl$yT~;?jhK zU`wU*a5lCDuo2>G2?@cL%88WpF9P@y;@)HlvbMyQ%G^G_mEir$Az)mP3j=s6)P)Le zB-Dl2NC37Ctl{gH%0;Zenp0~RLhPCh&@GjJTJnxJ8e9Jch_PgVZmAr(hdW0AQz1@I z0D>)*gPR~e1YwmBjhUlTf|QnSseF3}Lpl+$1;hsll(`FoEtOW|w8(w}@mB?uZmHBA zuc#BrdVQRxC_{&+3e+u?Aw>#p2ki2rL4z%o&R5D^eIuA*skp?J%1PS=awp{ZsgS57 z?KVs*r){W4pRy_a7|Z5lGJj%vdW~@88m2rSI?u0~wuw9p&MxDQ%E;50E(l zjDnVBEw)r9-GZ`hkv^EDZ)m%dagnKahe1S`Xr!WK z!HRFltnR3H>8T*j7L=`kYitEHsP<`%`{}LP1w>v#mZD_AiY=9%Y`hrlhkzJUL6$*v zPTPxx&22v$#F7fKWWkCpm37aWakS^J2l0ABmgdo*7FEi9gRIrVpu0fqOUP1`ZmGOi zT^EqUWaK}>q& zR${^u%#6rzAu}>ZB4jX~8F?r{vj_oaM%GF66cD{K$SPYZPe*tZ&VDjRaBfRwD>$Ye zZcF7;ZW(ClId)(QTDWN991lmP(7ye6I>b z{}=xL5Yz`oi(pG-{1a4E0aU5Pd#0L`+f-RNb$8zHe;8}Sn|0YY&EtTFMYOhu^-S@I_fuVFuWyfSrb%})YAa+Ow z=$6WtS1I6Xhy#)Vx~1|fO~w~u{aYa3E&x*_qI;xRPti}tyu|FlfR+GQc~sDk{>Vc5 zXp!_9fcFGs%EU?vwp6;`t$pN=ApT5HRd5HwV z(zazr-jJZiLQ9W)nuz$tfPavPJtp|O1Z}LxY&(32*gW}SQKasIXO88;5%aC%M;EbZ zTJ5{bvEi3hfk`*gtQl8}|CvrZ|HB&umzb~Ezg&ypvUD(M<~zsB<@29BtTUA8$NU1~ zhu|_qwD0BE_*K3?k;oYV!G2b>y8r6qRDh@FGsHdvn!k*{l>&Ofa98&~=nnna{sVZW ztI%KLZ(B0`!w%5b@426M1qsJD(Dn)4re57Q^q1eAO%q16pAM)h&eEgZ=pgA}_6AHwhx?`x61} z?8L^6nNiFpc1byqsS4#kV=vZDk8A=OmSAQ?6v>Qimk0^w$#>wYH0V9`I3y3K&QneO zcK0&Fr)on_=L>k(%2$bGKWxEjXnlotqQCJo!Z-M*z>|Z^kkXYkR1;s|HzV%CAl{tm ziHdy2h%dqE`#rhn9{>{TsLec)Pd=J^k}QF8F=##wzOYd9p39M%`1RcxoKe9>kcwc=Gzxn?VUx~44 zh9o1k(!~Ga`zI55YCy1W22!rS{1y<}Cy2A*r3`=ghBEx8RZhrz3#on|0R08D*odxS zt8~bJf>$6uD}d1uCnf_-oeuly^+R5n0Omt{C>dZX?Q#B}=^^iN5&9y;R|H_SuVHI- zHGgg6koU1j*a`8w0AOom4O^{i`L(iDObA)W-~utG-q-bWJrz?AVv_*i#F&bGy5A=) zWGih~5WNItG8|n^kWR?d?6dqiWXe?Sp+w(O4rQu#`IiPtk!42a0}YEk(<93yXk#UF znUUutLV|fx(zIIga*m3v))rtvRaq==VANJiUTbLU$Fdi}Xsab}`w3dDI-FstkIOLc z{qPd4);UC87!d4Rgj}n2LY{aDJM=e^hc6ww4(69tEBce!Vx_dm7vvE(NM2d!3w zi<5AcF}c+e`KHy9WKFA;5`*R);0p^iPhQPVtJR5>3R@FXTCFR<1yymcyhUGItve-X zTP=AxueMqj1J_ndK4=lNTF(%_9+x4>B)3}Ih};nn>_<<6R_l8RzbA;@;0;=>!dfA3 z5;Q-fDptT{^fID@R_l}oA@3#uG=X?dGC*6cMZdF-VBj&FT_Owz%@6fTG#S#Zl+?^f!GwFXlb<7st>@3`4r+e0lle zx=r1+TK85Bc`Jp#7}~gi?iw81YOOv#WQEKDurL4xt=2ivjgaS{y%Nx!5Zh{9*GkLw za{%88$mAq?4%!8+R%04b(`pgp9gj-}9kpo1+Ub!qfrcf>m-x(oTZxchp1j4zo=6b6HxsSaKdhIW3(eom-&+DY4zg@lo9RQypTk7G zt^mH_Z(lM%Tdm*dBpM4Kj7}%u0twn``OJ+^7NMs>JX-)(`=HgD${NarBB2Y!ya3>u z8*Q~3#Z}A@5F-LqqSadY7>6oE%smhv3;<4ywpz~}(OJZ^AYK-f$#Ar`SS4t+#vH4t z&p~`!4rQu#`Dug{S!N`Rl(5({JyKPIHdeIa{kIY!!CqG}3g`INi)_(UJicXO?I9Xj z;0_Ma41zt5%h&>&)Ng%*@i^k{4C142Lxrfvx8_4w9uT!|>-m_=Z}UT5JBWT6f7=AL zLqtbk77^|c%`!$>T?Ov)~ZThYXngQsQqHnlVV!NHJQuLo}nBgIWMWUUrd$ zl3TgRlNH<`KzYe^ruk2goJQK2kq=-COE5k1g$wqoE(_xI`Yq$=Tb9u1U=k0&A46;v zT!xUPj218rt9P?sm&>z)_~;V^A?j(Zc3gE2h+0Oc?w5C!)EgX!pr^HJk+M0h)wHEy zuNw);3$XzAC?Gb7@9ZC6i>?o6oRde66!=wA-v8bOT`(a~!}gsYAh zpC0md2xvHfi3!jE3$oSm9A1xOB+UcxxPXk3N2!kePr=HYKx|K-B*&@MvCF^ol#=N8 zp!N&WXckn*8Gk}chwWsXre&lUtz32NOz-cX3F6#Tlr1DFR8vT%bkid_ls0ERfrcfR zX(BRBM0(^ol*x>g2vLIRk?}6rOKJ)A^IsyegqBi2A0u`(E(p z)B5=ZgdYQ9qJJ#%%IiD@RA%H@xWf|UkfYH&QzD)xcvVCGP=8a2GpozH*uzGNfjsLULcDSFtJeLOxKFDLr8iS^2-T` zO42i3J`Jo@XD5*F5-_o;JF)ele@W$#cO9}rep;6A9g9<~`}l9R$G$uKAL(PdnS3>X z+E@_QG{Kp!iHstxjLuLmOO~N$y5=6|WE4UzN|vE#x>_?Zwlbzey*F8gp6N>e+gCkS zL0y|7<3u#w=Z~%7vivU8k5gm_V!yvE9P(~AdHEIU!DJbFrmH6nfi>HS*}hi`7uZA3 zbUmBpWVC|XRuI-6!I`e9jY8f~lS*HxQDgAnOxK!FNMBK1nnctyUD3Z>>h}pT^-R}x zvS*cFEyUC_U7Zd(&bN~|^-R|{)GEvQLlUQ+>H7Kvr)}k&gjhY(bqr$%>5)Tz{UoBE z={kH&$h*Mgv!f7G&vc!Kscp5nE{RjmboFH7X*q96;?y%;pV0PO&ba|+aHeZ_G~_KN z%{2cRh+A>Ce3BlMHzSDPOxH3d)Rtin;6n+9#F;K-&@){%FtcSisV-}oI88xedZw#~ z-l=JRTOgMvU{c)nt`5$0)#7$d^9O<{O5pT%)iYgVTe?)I19>PFX2g{{)3qD>K4A>8 z0r306V5*_1ZuUKLJiVHOQAJl9Ga9xVchmir1!)1-PX!95sc+ znXXH~Tp9>=2evrV)t|_sfM7Sb2TF^UIMX#5^4$r@P)l`Zx|Tp$6;QPY3(j;MIlxvj z4E`1%9|W-IL=h64={kdoZq9W51mb|8?0p-Y=~_ceCl>NE>aqTV(_3EwvqG~^v=;H3 zKs-kPRzh&5>%Yv*jf7l?y%Q3GGhLr>n~F{SVu+&>5`r^bchb!~FMxX?&PzxL&U9UP z$oF0qz%vlnCri*XUHw?mHWEIB_<6DfJ<~PxjF6S^JH*4u67)>hc6u_iDsXar->ZWQ z45eqfRx+|3K&S7Y3$a}?K+kk7<1RITJ`npS0Ku8At~8PU2ndseX!^;hlpv+0XSycQ zF`Y#h?mq}(c>-lBb#SKZ9ZJL){ACbtS3v2RuJjg)`WD2&1WJYu?(C4B>56Fk;#X_H z%Q|qXTml-L>B?sDIL&VZ=8{xg;!M|*%$3soYatIwg+xW3JF!(c?O3)${HZ`@CSWqg zafsv6ewG31qfpl*5JpCDrmL{7+I$;`9SM{%Sa7DR?qTHo4E0C?At^vfjU?FXNW-+XA^X0Xxc>t}7@d{{|qj07gN}zB*^R?q%dph_Zw%Md_KY1GEC>9{vo(R{^TrF)bN` zn=@SxFn3AaftTTSuuE?afc^h~z3>e*OPLXw8DvIevcMFGnDj_rV!{&4j7X=S8Hq`R z45l+9BN8-=5O8K>hD7%U(W^aKZJOP8`dNCWE4x^5_Domyu!Z1cf!I7IpM9gKXby5^ z7ntDoy}ZL>ur&HWT{iv z_$7med)d?c#_Solz-5R|a)iso-{<=m6M0oYu)W+YFphPjUjVfvfmk3!dxR_do8OKN zdCNuO3;=V>fovz1eUjgR7Udl>?XLmxf}mCzEo%63jwSmPe>pRqPX+J+#LtoeGLgxy z;Zs<>|9`b$>z)5Ft2n44|*iJ0FiC@Ne-vG{mctHYS`>5>J z{;j8lymTb{y&+zg43I7;yQ9B~Z4d((1#v<$K)RspxPKALN2dDDgSaFaAYD*)u|J#o zT}6^u5Ao$>fOJ9GrT#}uC=B3ph`SR2+XZFc>Yqi6;va-i=}cFaQL#TQQ;(0)@&Ug& zOXwHNot6dSj09?35^94#4SO1EbOO;UfigXYf!fA5`-p#syxI3AAR|*@Bq>LxvZJ9- z83r1yXMtFlK)otSs+?w_)0ji}&p_RrK$zsTb(XhLXSWTFWFYN-2IQ*%MoQ9DW_Jrc z#+b>Z^f$!Hja?~6O-iioAF>Shq5E66ga5upiG4I}G55Q{6wk_I(U4=l)|ViD ztRPDo)a?18Kj`aBgPM+!tKw4gXi$qnnT%Kr>P!&l3d-Dg))Hs?Pf3UAcP2hBkf6iV zL@O%qAqfu6rZ%t@NVJ=?FllDw0px|{hRuvTEI}J9|LKuu5)m6E_^N?zmEbypc~T$P z(s;WGEtxsUl(MDq88~S?%}J)c(tqfdhIHY&r6I!t-O_jmxNd3494FX_ZF{!wU4+Y! zWPC4ie54nV0|J7b2L~Im!yt@L5I=yIrqCWAd5+!7W1;yE@V7`nUl`HBmc~z1%LAz6 zuY=!hnQp}XKvs;H>md#a08WfK+G1D$#C=+g2>Y2BkM`b zpq?apeK}OHJRAh5A5vtjhyx9aJ$V{kf;LvP%8dLj5faRkmX3|PNlk-|JHb&u^tgef z%*I`C#-IhjHnpL z){e`3eB6D7+{^1&$8fbd3YY8|IW7sCL?z(m$(_PR_IJ(Qy_S4v@DgMNx7uRap3&ns zX0OO@WJ`Lwku6j5U?Y10@sHp#M6}#rZX^3yB3}*&cFn%P2;0>9r2tk7$mAq?gdmdap~2%>lrx~M z#C}u`6xfv!VHOd(kuA9YeLq|Tup2HzIFjy% zYq*RD@zDneCfyGrGxdH*i9y9wf;b0Qs z<#orle#0BhtmE=q?K{Yubfjr8xC$}ebypaM&-~+Ck&YxL_kRt)5>{#WAOAx7dAXE!&MK>U?JnTb5;8K!=h^5WwyffI_G~>nDT9UWq=vtgd?fKWOLax zh_@9c(WVF0L&RafqzWT3X!MRKbAz>^`F4}o(0rgtY$yjrj15y_yz2_phW@$O@EVd& zvEeq_1)=yGpu8c9bivfhHxa=@CGi22l3Ix1e4kUk!fzaz=kO?QW;^O zl|s9`q1KWg6JzXV`mYpAro?#HjZjN=Z;d6F!Iomlg{+4N#SimW4VQ6+Tt(%)RiZXl zW24oe8bfTIK*<3?bQ~9g_D6$tNpn_qhw+e?+mgdUu4LUo>p&WD6RL+Lic?Om`lX*_X7y| zE0LF0ZwV0%nEBO8_st6h>#ZPS?;cpf{*6ZF>QLI*zGTk#v)VBK#bvC4*N?8_pW%tn zvg-TiL%1SA{1)bD@aNs&cUgnb<9%Q3;|~TnA^__I>16-6H+g?a^M9@YF%9bD0U|12 zrZMAzsOW7&l1Fy#7t-})-FpACFl~b2^?->{!G$%Tz1(IuA0`0ne+liF^Mec+^@Ly* z^|}&zRm7XnR>@vXKYJ?K>+EODfj=AGGZXysR;Ggir-%$SrKLYIiN5dO6jDE^_B`to|*M6m&HKnKEdNINIuGRRp=P1uw{=WCI z$a_$CClE%M!sMGIS>aGm?pyyLkY;TI!$`^7S9?vufYICKuUyDn27g%L99C?y>V^if zW@2*H9dW%=MS@ya3aVk~d|Fh4Dh4q*6=lCUQp4~30+~HCG^h+~QWE|GU@KCg2n?S9 z>fBJo9R_;^#Ew){LUr)J@)S+h#i5)2RyBVEn|48J&Lvww|GFILm7&i_-RN2e*x5&i zE_@8=fY76ND6|W(zDI{%#EHJFp`qsyZlsm~yZb0m`)V?QpvpI|VYYFhRi(M!fT(7%IJ^|W>z&d2FZZmPmGlmJ@g2DErA z^meX7&jxl`IjE#*T1)$UV>fUjcO~ zU0>Gy{&lVjtp!n*K*{Zfto?CP+~$A5GvFr0&p_<0fcizsjqkNFf$V)7bi}Ty=M5Og zmV8Y=k2@=CLfWT;(d#d89^H}6I6GIprBTcCdwfqf9PD~ z2@2ifGw1UL)N^j+f%6Np+e49FtyNR5U0-;%FI3-;LmVZng7BleFGK@JyMy?90-AS@ z|8Fy1u~gp|f&Mc7)&xZDJkIr_D_MnZSUMBagsOxL@?B870;Fw(yGi|M?ccW4Teni<(hOjv^H5$PY(Bhp`{M_!pqsl3*oQfXK7BVu-liJ{q#{dtl2yHZ~jI?_3OzEhS?3vo8{o9 zfH1~dN;Na`9n`QGHZ$^H2^Mivg}v4bmeS7eSI>W@PoSMM2(_ZYeFf&bWSpF{Y>}Hq zi<5h;HJ!m7(}~6gr)n=ohPe-@-`8%3qvr|78Facqp9`{Q0xgoFrlm2rjuayr-N^{8 zMcyZj542pvhPMR12?<^W52mqfaaHYQJkw>>uWZ0e0IniPVVzKwV+`ge=m!#**8UF+JX`e3zDeFGVq_g_a3@i=b#d0V(Ou9G zm^Tsdb?@J21RiIA?EqaaKwH)VG-d$(^lhN??_6!r#~XAUw#eliT^g@iEE$Wdjt5f$D-#ZHfWLa@vJ=`2pR z&y?`5mr!GW;5t!bh3fm2AXLF+ya&pUM%X8!1+cUn;!g``)YuwS^7c8t2=p(2&@CVa zHTDvQ3+)^H!Vsi8(;um^27MFAVF8+)H+Y0^=$`gUS%6D3xck7&PsX+37Hxm}rjHq6 z(dr_vlEJ+Q=9L6)kpFoZxHEgP|FMcJfJ-;HF9S?ce}H|&RGATJ1kxjEFogeZC^vnE z1ck9>yK|YgcBpkC5hAcvYp$K`s;wCBdmU=aNW-j+3${a+e>u3Ta2ZAe>Bb%fcB(Hj z{5XH31EQL1kpJQ7u+}f2O5dstra{jMkkPj;rQ2B{J(K*2zJkb%yug3BdmGVuvji_H z5Zb#08(n-d31&uG6Vvh@ifl>MHlGupL1U5iK6fih`>pOwYQCx+`jSmB`J{nNEB$J> zQZ=exU@vF*)s}w|Q{c|Lbm_S|9RxM=E&x713=<3?~-B}Y+ zw`^s}PVeM2gZmQ9{s0%1ZB}lbk zT+G^mM996zqfi9945zt`G;1rJ&qLiYtpsHHf3`0a-|r9TCR~P4{pfQ3xwS0q7UCxd zG|W)~OSAU=ImG#M`CAqc19Kc?#Mi9jw>Jl!Yq~+d4)W~)&8=l{7Y#n%^G0?yw@ldJ zeg^Zq;MRyb;6|T;yo;MW>3QoUCRC-e!JW*=vkuOxO>5SYd#G9GLz4|AVlZu>cMmYp zRn%SEGq?6n_=ER_cipxwXwr@`9C6Sk!eLWC*Dqn()vSA`K1Rc14Q3|vhZ0iFFhPe| zHKwD(rH?b{L(k(3dLzg;6X=a%-gEs$=OFg-yT38O;|=gzKnD}R77TKnvis>(n_bcJ z6V?Ik?RSFVI0ac};I!nD$1C^q!megl-uSJKx@nCKM|aRY0}k|f=V27?HSceey{N$q zg?>wbi9RBOtxkS3YFM-0LkAgP6$6}|0J%Yo#AilUK`@1xZi0NOzN6IF%|y3sow^GLHg5|-?=lHqkC(T2>vn`Qe#_2c}F#$||diA3Y{kb9?%`%lK+BE+(8IUh7_Pm&iGds7rAPIX8{sRZkLi6R&ma*;4{z z2=pf4g})?;#9yHZyt~jQ_Obf)JMbL<;uqm!BA&!z&5WNPYh(OAv5SnK>&2_U>^S$R zgsDi_1mJDl&5}O}_@Z<8Z_P%djfZ`NX#nRsUzhFv}r|n z*UAaQ?NI|R1%3t4+Z^0j9F2xxtWLf}hi2su!C>y9&k&5}E^@8ShWej8j)u4Sr*RHj z>ZTJv{u!%Pr3*dpRb&k*6_kY1X04mxg)^#>>uJaGc?|{5P=6o{-vj#-XL2n8YpGdu z5%Cr9IP4;r%oC zz_G$g*V-KK0sc79%?>UB$v{!Dmv+xqF0d;dGX@CP5-Utah+|%^LOONgby-0FDKEq; z=nhZlI3@!p<4hfw0QX8?dZP(;6HwX`ng z^8o<9#~DK!(W3jPQC_9HwNey~8Xa8pDH=5ryltm|k=!8VyV@yrMC{ zW?ERJXbdpDs8Tcrm|oQM;v>+}>9*~8tK&d)JhmtMWVnQmX|wK_fPpK`ljyWr6DJf8 z)jYkae8UEMl^*<-CPXUWuoAD*LVK}c!mv?XEt0FytPaCQCoVb-8#QXai*3?fLhYDHnl`JZd55V)vtdE zuYe`~CR|K7rFDvTW5L!To>k;jkTU?Rz?pQ7Xy7HE^rB&(EAgg|o16S;Bs`~_pR2zI z3GaaVuDk?_Fnzhi8h(@W_u=2Ed}q91bKa@5=Vjz^@DrD;K_73pKa1snaKW@uc5;57 zwvNlxUkc|naE7E}27^hyIDhJU;flfT}8kJ>5Qi|SYE!gl~b-0u>W zfNh=5Xa&z+c$|{$RoQ{?ya;To<9URMk>QDl8}f!!6}?^k&A@*EdeFgxB;tQJVfLj` zd#Yc*D{tb%?5E+3DI{Pu8rl?%7B=@hhb>T^sqkD1>>9_@?gFRLOTY&!Y@GUgfR6<_ zts;D23tDi6-K&15ZhQg?=nD=m0jp8A*yu5M9QH-!SqjgW!2WhTPNR}v8Im3|3NocN z(2MV6+`B=UK2X0>cV2;i6;lM9F@Xdm!IG!y@wnjSjyWt_n(>WT|3l^6tNuVFTnAI! zNsxe5S=J&mBlRh$_!n?Gj)Tg%8P2(YAFaR{KLXsrPFim(Zv7rCFah0D9$xyxAH3b< zH{VRsC8NJn1znZ+N~^|HxYK*H$&51@m4H=K>U8|10=67ArAF%Sf#*D6oh$I1K8~{{ z{zT%NnVaT>>^BeFo5qh58I@%Uz6s&_MbUT21aVBjEkoNBo3Wd{2`c5ToM&df+U&h6RQ;c%@wH!?ITeApn zEg!x7CLaEgRQ$a_tmWGq%SSIC&T~xuKN2kfwzP#gdWD|>`$@Qrnf%GwfRi~*7rlCS zL*NaA_~>m6>!ZEUf^vHcDNeD>GaGHUMWa@E6_#3R2eVFDQA^!BM zwdNbqa*Oxn{Co6jiKojb`I1v2(W@o9p;`UBuw*{o;407Ct#{CG>aRoISpOTKwb zR<)!~q|MqszN8UL8dYzR^{cd5Z;UT)pn^(N(CF6hLLc`Ht(*+q##F!ACh(j39s98W zTQbJ0I?cA;9Y)W1k~OgD_Nvq9R~VsIogr)aX|rZd7@f@mN7cLJNJ84I@5UEjuTqw) zKdjKJdbhBq&00NyFM13gVpHon)cQ}k)a2=2Y}>`A_MpA$VN+XRQ=6-)EwriaA78vl zrTweEq_)VWwpLPmOH(82c{a5tY-&q1wUu8QOC20vd~%VM z@{0PB+A5nG13$0$9!({#mNqH9Xl3`YDQ&P<{cK7v*_2jjN*isy7(suglIl81q_oMV zw1JdpP%eCt8$oZ;9QBXCl8?WVL(`yCYqZ!Hl#bw9unyBkv2n0pfi(?EwMMQ%89Cqs z&vTf*irohG1a3Yf_r%VD+_7LCrbMxg^XT-z8o4KSc5(}v4yJTFL+FV!x1a>Lm9KzM zC>+C8!VdLkAZZlwlW;NNlp8M|Ev5rg#6IVPd>FuLoVlGOU~ebc5kLJso*D7wyw(N& z2Y=Fg6~*d>Jac~QLn1SF3tBq4Us}uJ$g^C=H}U7h`!CsI??IDx44a`fa3&cE*knXR zLDS)6@eJbH<4hKRN7>|7rm!}Y@mi+OslO7j`NS9EV#0137(qJ3PDLJ1`#6pG`;w9I zpGnps_9`+CaxJJ=a7I<5i7{Zc5e%gic0~Pcz`q9CD8C%M=!OAajX4r6O?-qVsKy+v z!6jwu5?6gnu74B5%=y+-xjZj?BCSune<_zG)_674Z`|ASE<@h%@=1-57*ZKA+W37& z1hRs?*LXd)*lVhw)6}1Vz{Rkvasnk_OC^F51x;D{3Y8J}7S5E41gLn2Ar!759MbY_ zqW(T4{!08ITueBP-Ch9RR1p(hjp)N_{{U9-aK_9=H1MKQuVy!iHIpeb8EbO8=Q+M( zH(H~tg#Q{)BOJfH*;RBe8syd7DzS$DN>~ey`-ptpLDX)X$%h2|TQ1~i`zej4Vd+~| z@tlNPgk5q*FKs(N4+NRN3SE zvY>c9o3gl=C_>j7yVv-6v4zIZjjb?#kKzW(^s4$3)*8a#37d=`FD@z%c*_v-i$^PA zjpO{t5C)2J@m!R9T?xH6StG{LYY93vyg>`W*ahWE!(SL3d zhj!Ws`{0>Y%O};}hPHjtv}ow{F(5K^6{b{DS;H3#dHpZ!Z%E1&2T<44+?r9GDU`w`Q!UW zW>q2^;*3lQq{y5}$51GIPS&F;b00E$5Z?Ybbx>AH&5&h8gn7k<-xgTy4V{i4sVWD5q5mg)2uT%~!t+iN6v5H!dbJ zM4~|k2u0@fL-RqLe!(e{KI$*}kupVmrv5~bmw>t+XPOEL$gN&7n8`z(u5R`jmVRl} zi`F6|!A!;_EaDXwaP5SSc-fj@7s4MQekCp@OvVIfU;=MFS9@^@6POkwtG+a^rp3_U zJSICf=oN|_S78s$vT1Z+z*qT3-tdEqiPW@ND<;G?o50cuv3E^i$%NQvCa_=vONgZJ zxVz7>Qr05nQY5^EGiETQBID4KTi3GZ(p(Po$|7RPsUWgi$W4_t>+txJA@k(Y98R9K ze|*V<)BZ zf--j$rt19NIMXR-y(}f2Hfztg5^1EfUbaTtHLhgpe7UsLo#RR_zlF=1POxRT30 zl*?DSN0>#7D|z5nEc~jamW?Yp?>o7aqtLABj+?{|6VrE(SGQ%oX60{~Fv)K!kqfI4 z`L;x|#5>vV$1~1ZReX6qHEq`Zag+V|JV};S)to~Q&FVDSf0UjptD0Wtjj8gW&1KpG z>)$_E&A$Dw1(K~L|eSz&@|ukZbQQCa#Gk%k(2i~Dy-5{ z3ttNSS)dQyl&ms!b$sa!o6z}YwfO4srPY^Em2WoHAZ^yl@ujD6FL5n-k|Lbsm!TyE z$E{xEFE#i2Oe*(&qx%xxw~#g5m)Ba`3Q)`w`dOv^F*PNkOez44&@HYyPx5n)HNw2C zv997x@^gu!>hQ>M)_9HWH`%Ywn;NnvX;qp?-P&{r#cuV(BrF>#ll|Mz0&$x!dF0;m zE|rs2J{`{OT*pGwJozZD6@&y%#_)a{;j5cT|$|yHillohH2IsKi?Ga z{_&Ijc2$UY#z;49)H>cCkoBzA>MoQ0LpfZ(?8{;r`Je1RC>3_IZ(da_71oQ(IrD!t zn`O&wcK4Cp)@1eZa@k!s!De@xtAZ1XGn8ec`cr%ve`dX_Ytln)32ZkxkrKLAaq9#8 z@S97#tPfPBd{IfB9C50&Sz%S`aXnuvL!DYfl1qS_uJk>*DZcjQ5fCZj?JBsnGO9w~ zI)x_t1=4K)q&F=I#&?sRODFueO>ZUXolja>LzB~!RjDC`1DnZHCekjZ&Dt#2%@fyU z<4f;nSvIS3NI1=1J7ybVDu?QsYwp?wLXU(Rnd=qQkO!zCk|;V5&1KFcf0wBypUB;HLdf39+o>i?cuiXn zAsxuE49Byohvf4#rr`?9BLQJ~DyDqM5Q4wBJW}Iq)I@ESa|4q+G?4dPB;THct*Po7 zQ<;qzd3vU)a`jh#BHYX1eDCPo4IQ_&v%Adq;_{G9z6z=Tge|sR2>T5|7ZoL|B0V1L z^6ZT*wWaLzD(5N6srBTn&^5ko5U2Pu&&g^MlBdXQ>n_jgxRhonUk9dl14(UrN{Zl3 zg6FFCd8Jz`QBvoI1jbTfX-t}db3-4Q%MQiotF&pU+ME~Cd7LV9zA8hlO_Wny9u9Kq z{HOw!pw{0A?^B#?2&dM?fm)w8ry^V&5*TU~FIM*NQ}yUvPLHnT^oYyzM*Ebf`$}6D z-XOO5ko);jRk$)x;Q$jf9!e6JsBlEZbX750FulsD(7U_}@*GnS<#|H=d{pp$TD%xmVpx|9}z&x;JRmd%FsqEuYRhUptg-Hn&;_`UcM1_B^{zOuLgp{Mh zkCyuMAa!Ga=`M9^p6P0y9>w!i+PA67+*MAQdy?fc0%m73T9-b9Lwq&>!H;R6zpt zLn5JY9e-|Ouu&%n`6Tfd@u5;C2*PP52=cJp*{Z}8^~*rk0~N<5*ZzEylg+A3ztXQ{ zF1R@)Fu5N+UTer@vAOJ0dfMd_$>xwuNTsK+ZL@TmJZ&R+xJdG_A~XZ|12~fh36O_U zyuz{kIo)?^9&!qKM*{J$<6^>T@*t1$O;z20RDUAKZvo_tJX#*YX*U|R`j!4!nW_;^ z6Bv0IGJL39H859Ql5~#ClYjeEcJI}CYmi2FpoJ-E$Y943P<XI~TeWoAdSvAh;oMt=nB@?voye`dlH zy@GP>N_-y96rKbqy!E|U*%Jm=XrWiMj^D%<9`RFfG2t|F28*0oTs?|Q$Vu8BE))hQ zq_zsnN7xqPx8q{MZfe3owlo~#S4EbA{1rfx(Q0O+Csnd^^Oc^LljaM7vM+9|48N#9 z#b?_zC*4e2LbI5%*j?~PQ1~~6q`hjhmIJjHVs3D0NWkt|yoEX9P0_28Vwqy&ufat_yqu@Hnff`XE#~J%bAZ1Np5=$I~BBt?htIj3r?;?qP#Q%a5E6yUNgAUPmmqN_@$+yokzoq*V{+{f(-r9rVf_=p8#vP}Nx&NUUMvuA#|fet zihWZ3e0Y8a7P+Myj~ID{GjjY#GT>M?DQg+5r^9xxW0inSZaJBWU&*k#OtHJw&l&1@ z*8&?^o+mZADU^U?`LD80gmo@#k2+Qf*yP$%8u1_DIiT2+N7!=S1kO5-1ev!Ie>W~BGDPN7zfzXR7cTwK5@Mdk8L1LTk^1XBNEObedM9;L z-z)aK&xzlIi-`htj?b}r?k6UFyh@coiqwr|NEJ>e?QE600;y+$Zi$PD z45Q}-ThQ}DqI%Pv?1kksmtpzZW}yghLXUmTmiu9ZzfJrXxR^*nZfuV6 z^S$_ssN<0Jm80JX&OZS-VPbi8;_@L&2fIY!8-Sk;w7Y{#Kw70C{rivd>YnB2a&30C zPPZ9NZ=A#m{+<{z74o ztG^TYhd_5bcwpoB)z9$|fxLJ{DE?o#0k5S~wbF)k*Oq)1LTK1H$sbsX}LavX-^UI0sQsp`b#D}4@D z`*mC9{YLR-2%uj$xCD}mdWgB3V@Dq@W96LeT&#rSJ-^@cLJXSbg6?& z!1jJGu`CyVl_tVr*D6ojF`oA(upN%av>K)u<Hmkfs!8-nFDrYBh zN{OF<`_cM`2lAql6Gwp69I9mn{G_>XWgkzot}R03af zbr5GHN+3m|e1f1*xSXWJDscf4*_824!^K2~bWm}5VX{NCeZ!VtmGPd}1=Jv%DQ=T{ zmZ?n3$jg+4!0NsimUk@2<;~iT^(qxngox>&<~b1(u$5lkHXN51$U5vO<=GC;CSW@q zj|39c=5+rnu1&R(cglw4m9p_lXL1HX`TteF=>+!wZ)1}Lmr&m<3QNn*`>=(=j@g9b zJCxukzMc)=SjikBBv(-fW$|^Z7^fF)3{X#kU8aC?6_kkNL=rZ+JlgC&&xKND6-&WT7${JYQ?)Djr8+GN|rVlGfGF%K5$e`;lcvNrRVTH(f|}mS{y&l*E+>6(N$F)s zza*HMAMWaTu~MtjBK2p&{3?v^IcBpWV$6C6YXA=RwZiuU{|%@&T{E75Kh~EAZ538? zq)jE4b;-Iwn>e^x9Wl~dagxlzu2uMI;JHArs|c@pJr6@E>|XV&-0pc3fZpZcW~IbP zU&w-jgMFg#BH&K~-B1yJ3O3rIFn^TQeLL{~0BtZMHLHC}22}UFoNKLF^GXIXjdxeM z#d}rC5%oC;pJU#EX;!`BH^LRt1bV37^bQ(W63Hu<5DSA(F+C4mPy9%nxkDt7(*5oN zQYfrFv^w0V{!GL!B>qucOk`NI-_Q6`5$~$MALJGQ;kz`aW>QaYZCbgyXH~jkrqsXO z;!(=*vij1pjP~lbP=Hj>1@|(9Qu1!~bMIvQhwN7667*NTh)GtDQ&u4$g=$7VruM=2-iwh}DRAp7=6c zOqh&aA7L%VA#PPFEG@b`0H_|E}J=*S18za%HK!* z{m7X@{0v-7m?YT(`JQcPK37lS>>WiQrPcWtNTF~!NyAiPE-m;+#D9T{i42h#zqBrg zOBM0C`l~@60nqL~&4bZ1sns!`1Et@Xstj+dAGA6aAg#{YEaqWK{#pGh_tE}|>~iu^ zM?QzAGZSb+yCV1`y_P66PC1FmJ_2*He zx(6x=MNVB7|EsK-$|_lB=J#hMTNYikY!2!*XZk+aDod!9?7@uw&Q$4QDw%IMTgewq zLK*in*uxoHNx;9UfBykqgMyZX30_a|Jc4Wo0}sn5PQvm!{6de&hN@DY`uoXMf8s~s zVj@{=SJU|Uv3ka*r8wm+J|UtUX`fhoc2jDYYq9IPM3PLeeVUV&OR^R0>e3|Jo zT~&xzexGee6@R+=t4YS2!(+}klZ=~O+Ua35O$cVTWM;TmGN(U7S$n8og*NLVP**q+ z60oJc<^%4F3o{tmDRzMRMevLScB|uYvtlp)?K0k%p|CsD-wymypxYf>0@7@nIe)_+ zKjIQ4xf<;?{P8n$MP;kc4Pfp9dn@QF>q;waR%X2F=-t-R41wF4qIXNBk@g8-#UqI0A(cBt(<0S120lKKtJZVzEtj9 zI;+TB8grb{$Mmns)lDd-x^+~R9qI?w?Q}B)4XWFBtVZloO!}u*$<-t?6hSjwGHzz= zs+$l@bu-iZmWT)|Ya{im%wzorRGAYY0bAYflNF4E)fjOp_5$^b;Moi8fa7sX0$#z4 z>LeJN$J<_T=AM^;s}zk0Yo$1gpckIPK)_at{V*1az;>F*&FXI_u`2<`aWRoBmEw5g z=f`RopGt8J>kdPd<4N_K(#zfj;02s11hr03DeSsKP$>k*5+jE!OvayPc%qW_sy`En zUxGU9B)Vafs}#1(s1$p1F_Che_nB5Hxa-Vk(vLIxxJm#2Ie$E;QqEN=sq@EC+b`$E z3AI8akU0%!Om5!xkbK5NQf#CAoz%~LkoTVuzZMr0cI?W>b*|v;d5XAO{na2p0`N61 zS#RJc0C%ug6kdgqSEUD;0^?HPcJ)CfyrjjuLl$Bq#}xbA+NcQTjxavpm~|bcPf2B7 z?UB>XGUpWy8Zt1r$}Rc*Z<6a~7e%@h?@&bst4y(256c**M!(*d-HtIfxjpJ{C)sr* z=`B#5by?#7p4zWe?%nFA7ES!bt6Be0(%HAz1e-3T>m-pTDr zxel%i8vnOm9hAFN{c?KULP9QqR}`|JgkB(#E#(qIuSdI3ObXkjelA-y-vO<(Q0*lF z(}T#nQcmsrMQ17Fd@p=_R|ZXonAU`9fM|>}HBVYzpId{iCZ(Rl zUn4Y;A=Px`Tn14NahoEmEN0IKfL)`Ah8i$(H{k04JJ4JO7Xf}Y09Ovc@!Mu`Qba*n zJFO1e0e=kmzc^E)b!aZT5k+3zJAAtw(!ncOKo=SE7cue2nVd=>C8s|wC#NFGNpGa7 zbXvj$2lU0bn8+~7w^_+bp(5I-zZB#!04}FnR%lK=zz)B2gs`4O;PI8&zP(2Q3otWMl9Us&<+M>zkzga^WLF=3J+ zOTn%zMARgz9?pm`=UKc$fgP)?cd5S(5uJ#?6c-aFBcetQBCg@;Mw}60j+%Id0=rvT ztA1&N9c-E#hh|&WMnJ^vw+SSNTxAa3O=bLSd_>qRv!*1|mNr z{zqI)gis8z6~@o^;>%egYOKh1>hFW&_=k9a2A6DMnv~Be5C_Xuc#mbwe}Q(b2!8;$ zgI%ximB3>_M^%Jpql|+MSNQSVnDc-xuK+Ljj1f-gS>oTq8M8>hndNz?UN~DuC&KIG z-KBEl$o-Z0(8HKTgos%-86UGueuC~%kxSIy21h;6&2Y)L7-o5nJJP|{D7-PvMNgpl z72(5xJJ@E0&j3CN=sgwThk!fS#|qyEd^OOG72pL!jv+JKh~JGfW|4q1OLwSV_?crd zi|{&mzo^_Ev`CRhc<(7LCPKt49~&RD>|&W zoegiU9si3er!gjvF6AsJE+$OoKCD@bKtrO=#~Be4NNG9?GBK=hZBR+Ct3LyY1Bj1_ z6B(v8T%FAcRz>Vke;>#P0Jx^}g4zl$1?)gSD7Xg|b#nl&9CG0JqB`ukDX8cxEh@m@ zNYcx+sC1PlXgck}K?f!eSsYeSuF2}>&_~sSvspQA3c9E+4}~bK`fi)pMBqJv-c=5+ zTM_Ntss!0&~h;2BUamruYOSviN-;3%w6 z{SK?>cz{~7W`?>MvoZsbZ*ImEG(-I*fTNG{##fxF)Dj3L+I4p{<A0Bi%N=*A@wwyVLynIsa-I75 zaI6Hd6=#%_fGB6O*6=I;9pw(o7a+|nZDe2Sj^p2>a>|h7Eq4}43*D|3DUc7XhBBbk z$C<21z_lO~p?YEY5^AAvJ8A!@)SRby)j9Fk;9?>~@>A3Jo~4c&Lwa@3*c3p zF`OwT*u8l6>ujP$&|hY}CwCWXdJZ&L!DWDN20ZO3ig5FvpC$x$DZOy3x4HQzZ{ZCy z$~sK_oHg`+pf)-Y5|Deq3x|Yf>{dqFif#YB)-!na0K4Y#|ll@C>f$KuUCE6C({LWGvYl4&g$&Hyc_6ZQW5A;6D zbx_P~^>?A%B&3$5C`Y$rS17hQ8O6EEaIgBh%KJ`wV&Cr&t(TMA@CU0?hiBOTLU!#Z zH1lo+#1+17oVvodmlX?t7Ok$6*;8dNL3UTh@Wl#%OHFOtk25i{3jQF zE5;7Vg)c}`_`83!BBDQ8zZHa_@P*41{$)zNUK0!o-yyuP**#l@a;1uSQ~exrIv%Mn zr6`wF_$s6LHf4B2{h;s@yV|GqV*OLe->E+l`ClOWkdtpt=Ww@}7ucQJw||~wBA=~2 z0*rU3-|-+iDSh0p|E~`8?O6oIBKCf`mt5dc{eQK$3)?`>TYy1Ca0+ z>j+tziJt1qyEVUq=?^DCHy-nOEPV#dm7Zkmi!&{|1X4zK-vTKVRwpj5V)GH(9&{I6 zOk_w)H1gZ}XrYKP>X(5W2f*wU%cqNVpHbpW^Ch1@9(CbyoL1=_x|hi1IHQdOQnc9z zvT!o7PWDtyBZoEBw~7B47ZVvGIKB?JLp-d=i6H+3aN<*1wh}M~m9F!&(xKDTpvRE& zc-vXLf>1fPslN*e=fQN9li-H`GzN6O!*z)z--|!Uo#ME>{kCd!c!B*7IB#{_dM8sH z;bkO!AMq=2#sCsXF~E2rg~IB@)l#ub5c>}CpWtF5!xYDH4cOgQL?iXR^~`lwYjMaY zd$l+u&J>4y|98}r5GaniM4p2)+L-0>cCMaQjd5bT!VTuN^8SvGXO8u0wotoXNWcQc5C^MWsSvb>iMovAYo4hxh@wn8+|C z(S(w4h>sQ7VFMd*0L+asJsOmR#F>(ap~k3#5GaW!h%CbyZOrafa!EW0#fjae;+G)) zE8>5^#f06IL<3|x#J`I4h&yf#hn;c85)w!%iJfH0ltd}Ocp6I_j5Qm(&;i1w zFvXk%9cTq5aRvn-A_~UbLtqrJDL9iEb1KX$6jmqhLKRzv*rmj;!o`HiWMOX|&vS?= zip-%n-T|-^XR=@xz64%STl(f7i2ogDQZ&c3yh6cFRsKclPejhi&oE-d#e~VEczQNn zvLe1ze;3FOpf1Ci6wNxBNwISoDfT120B2G(=cc?u!R}K2L+W?f#9A=%vv4tCGAZWg zc%DO?|C=@P5|C>El;KQ@W?9XoIG0Iy=pEue#hDc4@C5S}!M0WYtJL>U?-226Ye`X< zOp33uTHp{5C^8>peNfGDCPlM=VBl4mZO>KMHucMZUkP-8gX``;#eUW)Br}xwsW_vc z1XAv(Wk3pr)rs4yVsofFj}!k4E+#TWfst2oM>)g+MNS0y9RPDjed+~AS|m=G!Y|ik zckXun97pKC*0#Ig%y^cMKH*GGC6IIrw5uT!^1bjDk&s8`9cN>e&_P!Igxg8bIbCoI z*cny6H}VH&rjDzfaxZ~zERllxs6QL<0>CfeOle3!O2Z`8 z@MnJ`*QPispUXtk95vha2JNo$$J9T7oIOB)b8>kvRzRHvQvr`-p5`d-pA}F}CTIm*RF#u^DsR5}!%^u4)Y;-x3Z7RS*_(2A zu$2n`5cmP0t^x+-{(BW(NaR53w|tW`kuS3Og)`-@4>vNu+rixGLxt^De>U(=KzllP zaHumg(ucV4AVxa{PcoAT4d-$yuF3MQoH=NwouHX-MJ3(~i;%)=`E$~}!?p|#kjgW} zZ^i}eF%d|M7#nYVy4dwHb9tYuZ*iuJHB+19VWLQIQjb;Xd2i9OZ{Q(VTuj)dqm0ks z7_CDzR^(cc%|Ts-GsZDnfITJx z#bi$#ACq122+5?s#Ks@an9R&Ul1(NOoYd=8`iDqAAC6AAn6Mj@oxPmBJVi`ZzvbK9 z{{Zg98Izek_Jql%uHUQ67PjYNa3seIq9o4l>?-5%0@;&xPUz-0>xx|jE~7qV^$Gr4dzmu zF`1bxB%4emIH~JZdfq!6dLn)#E+*{8WPKUYI>b&zt_3+4zy_Q#nc1vQm~5=%lUi16 ze0Hq=KhDkrJgVY*|2w-zOGqLcNFb2VdzD@U>AiR9MJb|E6{Qy`B1J_|L=;5q zD1r(~v4NtfpjbgfK*fdy(f{Yn%)NIL)aU#A^Kfrw&il@pnKOOn-n;vxy1fDWeJ-6M zT`zs3M1!OCl+~W{HoxA;!a6UCwzUmvgh4?|&kHjcc?75*1_5XYinlWkl@XyI_6;;a4tgP&+Fh$*(Y7LKZ(O%1ULd zM1JLNeh`LBmw(loHWhlN9u_%22}FQVew>c>sy3FNiKQ3vQL({Ci$W4MI$Qsx`YcF8 za5KKeTsn_>q8(d(M1!OCDyzNQVfH_fZ|52&HH%uy5Ya1kj<+gR&0$Ui_X^QzTtcZ;qu zp{FPTw6(^^TFadu#lQIs)>_Ma&tDg2Z!T>uaX8i*fZJMY2u@%837H;#BR6fW@(7*u z9J1+Z@IKE1A>Y6?S~QEbn(4oTMz`00vDStr2r% zGVmGlGh8~EdNROIzv6eolRnnS%m~m^h`O1=HCh5`6&W%(mO@mCORLa>qi>YZoS;`& z75zS7Er`4)*Juf(Rs1L$N5k-q=h7Dn7}sbCBr3+vq?>RUqb+kf%)cO%VzryUo4DSW+tYLp zgKqqsoa*iUFZQrrw1Jn{zsFJ190i>nCC;vwZ|vU;lMd}IOK)(L6FR7C9eUnvwlQ{_ z&2|%JiA%}vVix77IB!+0Mb(R_dDBtl?0ovhmfOhYu%%U2wt%6ZgPOYE<~HwE>lnM$ zYGXEQ8)AM3!#OINSylbmR;h!Us~uJ1kd=`yelp|8*eVR^4)+clW*1?`KwIjBi5b$x z*k&k?F?JkNsUG5a^;BhEijaKup(GnEo0W(pOfox~pDTB>Zo2n~c)5(5^DnAF)toYYx7ByD{@Rg90eWi4CKcQd$W^~XurPJ$7d+VGK zNucbAYLZT-_a~|DzL`WHQrjD`P&r-C?;AZ(+I!xAGqZW=xE*8_-~LDb_=EDJ%7HD2 z3+75{;^Km%uAk)dhl0cL`BkW`rWJSJZ0zb;1xVTa05r*Qn z=1QRWZUhSSZo*pR$Yf!Mf`j=J3~l8eFVO@;V%2!2fW88uko;l#$j@7H3y9Wl(HabW zjQ5JbLkM4}i8eTfvhkN?4tm_8V4i#uMN$wm7636uL$h~M-cQ36skaS}}tC6H>Z zrop|PEAbEj=Tb)AMXf-_(Y=+2kAQkNUy5qil)BQtV>cf2mw*gxzC#}UD`b#fBPD9Y zh6|STHH4ooBb}%Z>H5b84emSxwa-G|WdTs)ml6DA%{ID|{J%SGdyUE3MO2c9Tm@`j+KUdVrD5KB1^0UI5Q zFM9&%*ITHe8lMHW(8E*JjcnShb7@pdwI2Dig6THmrP49qqfJru`xL5_HuNE=pSh|G zUD}T?P3gMsSGO|b(aq*}XhG(OF`8i=rT76uTFyKg!kgkqBPrkyc0q1h+7J!8Un(XO1k*+=!MzUJE4^8)j zZoQ1LX(5av>Z{NA^9typ%NR#QM^Ux%E_BElc zuT=b6{gvvSIyM)%K$T-*e!o7d9;a*2p<4pAkA-jcsp9Iv1RHu7&{z*nQw!*{R4G-N zEtZR7#kqiY2*GrPY3hewNVC-!2jR&m_AubKSPjb;gOpLfKg#D!gzy^R5tm@eYLTwmR|RUImNAZ~>Y$A-W6WuR zjuvW1ZT@rv9qlp1LNOh9x*EvLR<%=4J;0xt@Ky=e^puIDGVI=b)P=n$?5g$-fV&mm z)2?1>>(|4P_EPU|wAnidc*Io(p~GDe`m4rWocsg+;t|r-f^-Pis%zI1OCi#k#$}U| zLQ+V;qosj{s`LU7D}mM%hN-S~4C9SYfQGAC3__|SXy40pd^sCvq{>>$p9!Edgpo(b zij~ANTAky#O0580FAQUnW)e#=bz^-PV^zVf{CUy~KTJ?xNXB+iXvhCxNV{ovIO>HN9F|-$|L)Mej>wd{@f*#7>^xLrNow=Hn$^SAIIX-CnYqT$uOu}>(5{pJv>!+NePYX zk3?J26~xb#xLkCbZZ=i-NC{2flwzy~*zhufbVv!!f05p%3*dmu2+|)VTs^Q08g2l* zH6NiU-BCiTQcTx$3ReN&Clr&zqVz@ytv~qD$v?=>Sahl{q3!2|E&49Vu~_tGUqXA? z%+Q+8gZ%2DOm9FEx}+xCo=A>D)3{9jv90t(30)hbU3WxP!RiR^*j_rKgzj@s*cR3a zte=aAS7Sw#NI#U&=f>lc@DG~tokSz4$m`9Rv;Vnp%ME`lMsM??2Hg5+7uSdt1~c`1oU-2|gWF$RjX zaE5vf+S{T|V3|y7c}ev-vWu?V>xMm-!_8F*g*p4PxlkLoE)RWs)E^~ILkWtMa+jFleiGKGCVL1CYR%Tc%m+U|d)nq@)Z zu{ms26(r&67}T#kdKeiMQI-XTC#`2R(WJj1T#@MJ*pg(bRCv04L|BuuAyn~5l14OX z(wtF^Ea@5u-8_=kWR?Ymmwxz_ozY(hVTzE7NeaU@I$0JJUb*jnOS%)n-7blkWLZ%7 z-o$$?{uJ1bSX?ISg*T+mvKfCD?3m!DCZwoWw}5Y{)PapQDuVhE>@PRGDc}?(&kGlR zs`n0-970NC{hrNbQ)=@pOQFIq?EcQi)BwUYLeeognq+NIcuxu)hSoF~!bn#W*^wE4 z;REfMI{Q)g7iy z%-av>O#SQ4QPNPog@U7=l0Fhcikid}Ik81wJi{bKKR~#28A(1wn%Ln{tfuQzYQ*O& z#g#Zlf|w1E6g8UlcVdsY_Uy2rK-GuP>N3(u(LG?$Jbs^0!VZEkR!G_$jwVeSp2>Kq zHO+yr{4!0_!z7N2dx(z_h^8$NwtJdv?qoA0ank*nmh?7+k1r!hua`Kb86B?H^fLrs z5jRa*Q>yB{49Sd#s}ogGz>*$827aFzbQ70+dN+jHfTKOa|EaiG-!e)h-hJ2O(*L7m zk*7#kid40DBk6st&^8G718(;Sd1E3`GC(Bme6}-*dK20g9#wi5J%4j1aU04*Jv6@$ zS}#DmikMQJwcIRMkKDH7JRv3SjM6!jSi1&r^r9tcFg2J!1*d6DKZEtx34nFadCKEMfF}M6pOc zg?df66L6hN2cO(6wSkI=yTB6QZuo?ao#u<-g&9YNicdA!d zJ!-SW;ZG8oY3-J^MD8qu)T=o^V}=xERF53d&>(<#BanMAG{F-{ck2u}QW(+D62L+w%5fB)_`Y9~m!LC;QqzdV2PM1I(~ zNw`#*3MgN*EdEw7jZPT@Vg& z0X@#?skB3>r__zWb3IB0G#HB2-dL>$eb8f6gJFlV@YSn>JlQOf?t<`IK2oZx$wV;R z`3ZUy^$Fm2c?n^wDvslm@PLIU?SNO{N=5{(#Ac${B*x4f!^3OTvZRU->i#on>_9qK zJ;CV=p}$AcJ$i~d$5Jgku@L*??InVnAj}YwF`mUI^`oJPG1Mxs`&=dD{QlY`_vYOX zGKHYj)ON5JW5a8F%Gt4YK>Yyhli2XmTZgBYWTQ(b@&ec;4^LGqXl3C!3g7qrLOW%h z0%4A)MUzt1m^F|d_>Lk}_W*A4w1{08c5a+PG!K995rmz92RwouJ7ts$Z!2}4bQ}jf z;S#W-%qYU!Z&|}POvK86f`y`PPHoMQ4m!rC^>L*cUBRC zHwA0&;!gFFHAnc3P4g^iIE0D$NM_ItA1twzLqthVs_yH;@7;Hbw6B4^(F@Vl{p>B1k5qt2_308a@)*Rk+yYrpysj-4Y9>LOqPq?WK$2*s83gyE03 zXQ3h819fP6F3ECK_g~Ra9pHE)kb5w6jVCa@U2g=XmXnw!;lD*gg6>+BlCF!sB|&#B zekGj~eG7^giUtW44XqUCJ=_YVFu9u<4yyfljD`YAdOTM{NXd?xKYNfb`-VwFeU*K4 zNqy<3sN~2|Wk0uSGQV0>;@25ESt{Y+ zDUJZ2QwOJ+WIoHGRPytx0m<-Zhbp}D6y5>qsAQ;RE8IKOSW@E8E?ZdbhLgNgsk;%} z&y_ffsX6N~1MF7nDTMF1KzIRgcqzAvtEg?s9aU%I4EQRk2TI~Spk`k~pP;@bz;|vS zU*$Drlur^@mpyQwFvr{=oJE`E{{0-0RGJD}ZYzs#)jTVY zWeRQk|Fz6klAXsg#}Irjd0CClSj+r~Fo|dlU@UVV9LF+2`lFcoGpGq(l}muiZXi>C zF0;(%tgBQm2S?=e#p}fa1L}(8fji`WCo2k-d#kr z7w_f-skbT~1^%Rf4)T-Gv5ryhu{{^zuINovjlYWOsN!_E3WRCug_Dej50W(<&I!_| z?X5aUPzMEfCow|4(WI6QR`GV+h|9X>z5WUtlyl-nA zeF3fO6ZBmAZ(TNUxBVpKy6@yX&7Ty~fs1AHu^+C>%%n3eMdD<9a0(mFogU z6x2Zyb&%@Nn|ncY4X{>R^EK?X&(zZ?4r}%xn0I^Ze1)h@neV14(#FibMNQSSE?S@M zGE!?z(ptBp@%#UiRvn2}t^NT5YmcTbKbqo9mygVZ)SH+0xJXlOj4y zQ~3StP)<+p^NI!7YLb3*J3mJuW{E=Pt73i<*GCD1yY`>Ls#`ex)zP;3782A ztyCJ*hOCrQ(j{gbewlO1>q=asJG(%}ct+2Z>nBiqnGOXqE-Yu<9cR1=fsDf=LC2TY z+S3iNCzJmeP0$eXwq3SAjJZygUg7QIke-Z_$mh zMe?cofDL!UoAjlqvr{2;UOk=(s*rAlFxMrqzS;H!c<*cXl7M@WKkQ;*;rr^UQ#?GD zGVEif909e%MP>TkMRF8coF%honTnVCvI+%IG+MJPTlyKF2(N8 zPKdn4I9#-Z@g+q*D}pc6_);QkYv9W=zVyfinqtwC#+PAE-CLm2?kd#lyV~c=Qbo(} zq{>A;YXY~2**EY-z7=0j<4cOv4WPA`@nuEi@v5SIjIV0sj}b8Y8efyhme0WYn;1Jq zn$N~J!1%gF()QyUXnegQFRdWlwNf?AGY#xqpw5fX2BMsT)Dmq56K=w=(=^@^+#yeX@4pXO#UT3`X zRpd+YUT?gMRb-=(#~JT36?sa$EadqwzKPw_k~0PXZ|_{LN{Esm;ZRf$aMW1|o?)@OL!)jRhmc z#oNhvA1N65n=^paF2=jHV14xh`Acn8;UzPY2h=)tUAAx~-bngXcp7(KeYN^QSgps* zbXa>~eB`mD%*+<5<~LBw*TZk0d<(zNMR@fK)G(_Wicn3uhXl0maXaFKiim~ab3)9W z&&yc&RYid$gu$I)uQ4vEYn)(C*ymXFq_*Er%h6$nIAMwHr_Pd)QBR?AsuPUZOo-ea zHpD$n2q!iZY$dH$ZFhnhtca3AP3@)*AV0)q3`OPF@*e6lWPiJI9mw3o=4L8-92YI% z;5Vdgz+Z3JM5I?@6PU{?Oi>>QKCs4D)+BYo8pq-~{NUj%q~1rL>IF7X@Y|&1(67T^ z`y`{V#wUZ_>fxy>`3v+9jdE9aA%93PQ|e+yligI6y`Aiit}M%^7hvr7SjQ=KqB+hM zVCwiH5jz+B48kcPImswJ1bpJIMZA+Q3HuwYP-O?#wFV`cG`T(%MzpHZ5UL8vq(@8# z>5FM-y0uqf+ag;-=;Uew-^X~KdfWT`Ej|itd@TMIv)0tPA0M(^$^x*JE^exNiu&>i zNb^VeZFaUnctJ=p?IBfth*47)HXcS&-v<2HBj}{2s$O?Nc<{ty5Y7WCavr0>$#u&u z#Pxa(y{UBgsu-*sVQSNv1f{CBZ=mYX@QD!W1Ge*2=^2~c*hCvinWY}?{VA;eF2m>3 z{g5PG_f!G;s4uZ^RQFWD&^&;65tJIw61_=U_baP2jNX;X(TN?Ne33CkpEik#fb8AANo8Ik9|2fN<*Dw@`w*6S@+ zP7+uZtxA21=^xU1?O`IJDvDSLwtq7Ibo%>r}di7 zrk;*%mJ`~ zAB#XSh58=+0#~BgRt8Bib=pm;Ks97?m5!B9Rhh_Ixbm36Q&JKZ%bT0EOaF1iHg{w@ zTZIM^($ua7>akCVXwk16Me5o$H3m937--r4cP+Fs20F75Xk}wYd>!hE7^vY>K=+Jz z%0h3(KyQ8vw0>%;g-*pltILwYjW?xPNReHW!bU30P?om&er5tXE+eLnX2OYIOyy*9 z$-UI@xjtW3+6&JyGi)46JJlVy$>$@8@swDhN$4BYoDysMA`ePgeAvB0ARZR6 zEesj<()PXF!&aLgoDfd6k+Cmr--*Lio5JKpi=D8#lI|PzqYYbDaN8twZQD0cHenh& z!JJCEZ_XVyeFL2kPHZMv{M96KniI@mHqQstV&rSMOrFD+$hohoF~}kHkOzcnks7(N zr?jFUd)n!>r7*;l)$hRX>?vhTjprb~{-|DJ;*h_Y60%Z1!TnpbNdOgI|0a5hXe_;% zNOWCjtmR1&*t1KQJNxO-N^CP2C7Y*Aun&q^~V!CLAv z!>_d@JNlL>8GBY#*HQ}?60Xff=7q=c6E>j3K0&xQ|2u4R_2oIjwww5~4i~4xo%F)& zkqD^FA`gbjQ!S#Q05QiKr_}LiD8&;PaTyUT&SFo!?*a6N8uqWv9Pi|7^y=-j^Nct< zTrW~J24^Sf=!>Yz3<9ARY9ztOaV1WLAoGEjPa^Nq^Aq0ULagRX6N(nv#+b!Vts24kew^e%)GLeeqmRvca=%v4owC(K^=3_#UyFbX2IEJ=2F zxnWHdeZ9Y;V^k%Ol+VkOHR@K9-p`iNTb>r z3>mlFDFV_G49yjaaY|;Rq17U2hcmevo2gj^s(i!JI^zI#D^N{%bSZ(1BNShO8fKV_ z3uJ75gx;&B@v^b-HroybYDwl85(60@Z^BzgdN;f*dSfW}b(1WCNC4Miy z@Gsn%ZD(S%0xhp&<*U`I>M$C4ED`#yR^_*mjyBs{p;~nV9W4xBebFNfbCZO?ZOTYh zp!+NI#C|ms-aJke+WV#!_dJWo@_S3GXdi^b`4m~w<2R1Bn$AGDkWW*pYMxArpKp~x_f&{|%Ltb>M5^kK zwF>Ncb0EpcMP4};OUfnO8;e#Et~v5tIcCnb>ReTD1IB zaFb2q9bk96cvve*SM6Ax6$q#$OGwA#pgZ$1($u3;>v<%rxwZTIFpdk$*gajn{Q)YX z>huLv{0Q)ur$SpaUDc&F@@wEf;Z-SA{4!iIHaCTnrcPt>0*|Q{Gi^+bp|usNsp>k# zX{zW3qT8*ukULSYhQW|CmsnQ1N-lt|chu7#!k7oTLKvo)ZO;As(Q{l~+zn$h=*u2M z#`u^9k*)%Z;C`j1G^a$~hxdiY)s@rsO7tshsaHXLkA^P7iZ=prMnefyWGx7^?aJp- zqZ#;)BoJ}uJk`gK+g!{W35LR##E9JxBsccQiU<20cPVeak~9a)g%Fn15|dw z7;`)Q&%2mm7drjw8fe|}Qr-UN)3(z8j0T}}S=cgx-Fn*{%fkF)(*i>=TM?Em`FTRN*oGkE)!ZBr{ zt?l$bpU$v~u7=QANS?t-jP9f!fBJf=k!TtX;U*!)Xma|W&jwO!7XjYs5*TMq|I_<3 zFgYUI7K@qw=T-KP)T_vkxR@y=$sb8D{m(Jx4>}3o!ur`|y8Tbi*A_3_h+K2oBx)sY z|8xJfWTFaa{d^3!|M`VZTetV_F!~A0*xl`aMm~#*i2%2FDzru2{^!zM7=W&EVutz5hcn3ROBLDd2??2pUV5Nayih( z9%C2wjcE{W|I=m+-0tw?7Bc!5N#fDuI$a;D5P`Te)CASj+p7=i3fPd zMo7shD8*%BGFf~YzdL=Lu!J1eL2`}9l4OT>7?znnz8eRtKax>-S?=_4+<79q1#n?L zf;Cj0>7&fXgCXg3gQ0Ek&1o_h{$?5gUOxqoJ=ILGrTIBreo2 zvzc22jKIEtDS|R0H8Xgrn{E-5Z_09uE3p~`uLweCp(9ppxb+acj^N=6+}$F0(Mo`b2oxIH8!9g``7X2Nu4@CnjNUV!nY$C6}+uQ4oB1jDAm z`W(i&yezi}rggv!iXer#Y-FOwM-fQYV~QZEKfDkOi8!k7!O*!TV(f+lh&N8jVKmf1 z1c^kMJn3FNY~J6}9X5scKM$Ldl>Znur`6_*I;d8!!h4%5ag+GMTe-W#=9X`rVe=ap zzj!Rk2m_RvwmfRRgH83+wDT)AlD%^D!ym^aLLw98)IR z+Rm^!_H(w@g)|+){CtX>VRLOI9)%Us0}vj|r^y*MpBoS16~NbB0+rhgo1J=6xj#kz zRV-$P&5LCT_XqMqY{$eTF>KqT88)XCvzaLktAfkKUS`^!^_)#&3$RWuZj`vgW{aW3 zH5_zeK88DNuJK#DFNU!~Sh@o8IFp^W|Gf$on*pBnRA`I3!{!h7li4>xkLP8W!f}Vq zA3w0e<^^be%HCFWoo#p6JodI_Wxyz#kL3=VUtK|>8iBSEhAC#PCtdmX>uGyjQxY`@ z^d^t-Z^PzuMc^)mx5ne@%4xeI`jxKKhM>MjLr=kqHv(}+L$7**xmm)K{iL!pWZ;g! zl{y^^eI<-u+Ie1_vNI74i8Fc3Gkg=q-{CzL?-{LFoci?vo%B;hlwkfYDi^E3B`HSZ8+Qz^y8NuDDzX-Fwy9@PjD{CmO#L&kE(EyuX=^0Yy6|3~<8VzHX@ zMau}fm11?o5TfO=H}Sa->UC?yCx`0kE{|i2O*6r+GR&mN^M}Cd8()eqIXa&_h8pf{ z?T*c23_CVU{_NN+8FI(w{UqQZSK&e%NpPE_?kGQwj?vcsPmmKmGp@21SA zBblF<<&Mp7RY1*sfSdCXXb_V1JY%zzFl$-F!H|?iF!Uaw;*C@C77d*g!4{m!Uz1oC zv$Z?8qq6X%w*OC?X_A-!7?tbI;w>RmtKO8TJY$jAKz!k5+`UoxF4N;N{=rz}v2b~# z@@)2g8UK(yCye%5k1&kYB_WKJW;5;K>7+^>1U({L9j7}gHyoGq0c;ua2VBgQl5L4*RQ~3eO~MPX_P9)vXh!Av3~f4zAAy~6@vv6nj>@MiVvavS zL+#y6Xofo~H!EXDwp>mRZKX zjmm?&!7T-^vd7hx({@7iE8kGBg8I%wXRzXpK%CJ~Z%j9K$Y7z!RGy>?R5!kaB1)75a?}o#?B+@oZG4noO-8QN zTdv3(28SX`Zc&V-vj6y3o#^&%TZ!h+W&S|i{*3+0aeQICS^kXvH{(6gxr?Ap{27Is z;5aGS@@Eh7U#;%B57(&$+oc<5Bt^%SxW5OHyLIdX7<^4m<}`yqC*);>vr*0LPWC_j zWmVb1(B?r|k(b5`ld_%epQhU0WGl#HFrE?CTM`|FNhuI!su`TzrlV9H0{qA&IQ2}k z=BaC#uWDoc48w;VY^rsoP17yhzeL@#)Ut}f$njXVHWunjjCZQ46Ul+Z*aSv9Vd*3p z3#2K{TC0+I#6ZV59LB`Ube;bmT@S1KH`$uK7{;1>y3+Lyz5jXj?F*P`8|bsH9zHjD zFI!v8eGt9tifzHSXgh3*9x5wud{_CT4)~J)AVww^l5%@=r=4cuFDbQ?3t_vHi|o!E zf^j8Qkqpz(=y^kz9aH&!Dv_$@U>yaoC3v_TcZbyV-KEO+gOEl-nBugOdyXli z=?)0%grs9KonI4C=S(h!?;-t9!`SPwB-!DXhGixfk4}Yk48~V^S?=WGWG;k10OJW} zBNH{U@RzK|OfG_<5^&;08r9BdNZib)$yG2^UqIuOY(_)vL{I?L$rmg6WS+5(s%j7I zg!ezsGbBC#G0*7qAYaRtRtJ;E>rpbg{9Gy1Zx;a9cbH4v_j)17DB%)sYYT>yr-pwXe@bLJTZe|9#_ zXFyw!m+G$m2Sy~O^`M(vhBwc64%thway!p>8`*JJo`0V4Ey(XK8r~_ka^@N9Hrh@m z(v3}EE@KF1p3%J>zm0$aRW+c7E^N9OJI}b|3?C5}PIvIZ!ZBr{bMMSE28MXXUPx0R z%+06BnP)um4r8v6)3DCY?@!%Z8K8}RymjH&NHTbZa?ox44>>(8*KhJudI$8hHv@BeJ=z7WQ8 zVd)C!t^T*4qp>~=@U*8wThyIr3=9*=>!2UyWthTo=NZ{=+L(TZ=A-OwRo8uyyZTRm z$M(j>VC3Xux$}&YOgmKr&})QYidpM%SO0q-gE0VflE?VBdB!{{ms$vKmB-bU)AmR7 zD>57h^*tJT0#>{ch%*}6;|V_3ozuG_5ND~LoIxf9dS~=>rW}36cJ7p;pKK1ut7Ll0 z(ck#&lw*MLCHP8R^AH&g4E|P>OkU4yWQf_D^hL_mV$2w7e4$9^#`uN_jh-tqu>s8C z21}3p!7)x?q*0j_nX?GyDB~*~dH4v}XyYpzSxfN*#u#74NLB{eSmUc2`C&EK^(G57 zBTLipjWfQwk){XmjW@mqktWouzy#xK5_x78S|+}vGur|~eu#nCC?}6t@V>_>i`gt(%4cE}f5%M%#smE>^^W@JT_5YtPlh7enDC6439+nq+vH*j28 zSQMCg=qvlQJi5;%(ei`1!+R%fa43^r4IKh*I12)R5Xr6sm8z{o#VPcdVrvFM(2b2+L>v^dFBY zX?C&m&J8iCSON|_q-#4S7#Eqaq&lVdTPl2nytK%EM zlsww(tsOePkPb2)`gAXd&Py$|?r(@K3Qpmdq3QX_PeDz-58_6b%tK+CcXiS-<$K8R zuF$-FaNZK0&Npd&Fcp2RpC`rWDx^8zfdAogv_%}Vv?@c++PxvQlXvGdJB_-R&1KD^ zli6HNIRLT4)LS&MuqHNeNj_hx(KpjiWRz^*kM`p`$uF;!F{>6|BybnL9OH|NtoxHW zQLgcY^c$`jWsNT(@-*|@jB>`86gdzNv%G1=yo~b-SOtTnNA}0#t7v=~k*BA^tYmyy zk(3v~DjQ$vNEK3?QN{SmM*1$tSJmjO70f)CXls{t$3yzYZh79a1^RV%22+zWk!8wAdupOfmAZSK&uy0GTF4E~PG3Gc)zVcANCJ#sM` z+m@tvp;jkq_O~#9&&!6m`D)a*e})I4Aci$DbpW-Q%i5viD6O&AR}edPpgbWaX<}nY zZ7(C1WLzoUwLfD9#AHnz32Bl?l-`W?T<|(HcDqO#DKH^NG6JuJhn^J8`2_qMmlJMovZ0B6Zt9|y71hM}fmB~En_nS% zeLK2$(vcPKw=`4hPSru`LBBe05Qy`|mIIb&Y29g>crB#sJz^T8G&z6o4TytUG-DNy zfE1@|@=}PaTr#|q!-@IYV;EFw3%n~e?>RUx3C~!lmU{J0ctgKsQYv)-UNO!449;0s zpBacPdH9FJc+1{I9@XT8L5%8LMyW$Sv4E70yg>INZ4S*Dnp_WJ6PHZZ<+1$YqdPR# zSud_R{lSL{M>i)X=MBrE>$)ZZI8%@>b+NFtRWqjQ>YJ*zN>iKiWgJm%g!Y6-m1fK| zd=ir4w_Lr=KBE0P-gmgHMN-tXCx~m-i}jT6JE=wAfSniIq@|`>Jf83i7ah~-Euqs} zm<(RYmABfr$412$M;_Ce&(y@)keXdayor;H;!BRxw_v3#O&kbmOg>_BHId!N;>(t? z5`tJ#6KCfm`O1{Mo>QsfncD$!j-G~^bA}UGf6hQA)`6V*JNbZ#FJ1~e7}~?VS`M~t z5?4pu4XMAaLvalPKj3Ndz*|roO7&@S!z!HmZ8l%2tk>B6j2lqwS_Z2m%p5mRD0HW7 zuD|hG*B9q2RUP7>xS?kuwi!PD24CEWr09h z9pw4aBVWGgF|#6r=&0iCytQoP>HG2BXtY#qGi3O6uCK0sH8pOs!J6n-Qyt$mk@FV` zcZ->Achci#+)R_9UV8M6n`Khn&w2MRq^f6OGG}s`aqHtG(SA%KA<*_PrqlZm1qY$H zsR^7O$WV2lH8al;X9O|^^upWRc#8)z1~s(>x?f5~9ft9P#}c6#ZSuMp%pNEAaeb6j7*${>O^VCtcJ~dWPQ~?AWk71XX!t!^ zPI${iG#62t(NDDk?f(x9Lo2BkQsd*U-S@2WNjR0FUhj%vE<2#6UzV_Pr!<8jWO)uONlKYyffe<&WdRj*i)Wpt^`g_FI zQc8Sb`zliMQ2lg>69I4W2s%n$bYpCf+tTD-Q;cdggmo^7-tLL*D0pJyK8rsG_LAU^ zy-v{2#XUPy=Kb#>|4cAbPizDMskbjoSZj}(e}nLMtb+MB5y8u?Br7SHEsM)4u=9x! zv$weY?e^)s#_PN`gw)j|O3~^9Hf;y$i7(9Xrqf&C=7W3;i% zI^sU>`x0pjji3Q=**xn?#wR~tAc0?Xy$3=$z*_kTDXJ~Ah`2LBJg*dM)+Nt2j1R1D?J>t&J3+kxi888cT**v$`Ut)_ZulDdJ_LE|FKG&j&6!YUn`c(~e7kG(m zC46-cw}-hBW%liT1L*xtP;#q^jExG-+>7UZml^(rCTdz>b5#@@l_+jcy_@z-KlQMZ7JT*?gA3FA-s83k}N)@tIdUaO({M zk7dT0*=Co-eYYrYtCdGqa%z!TQWgrbeYb~RA+wb6B}L{i%g-!rd|8ood+|A+tc*M* zzOn{u5?L%MFE1MX*`4&~9y0BUx|?2?XWCVBugC!^OJ)_r?ANpaDf4F!ipU6`Y1h3& zn~JUc*&~~ZQT*BCn@aBe*^`?}HuXm$9j-j0ILbH93KQlAjk8(aD;$0$k zLKM5w&XIq1LKxh7Yvu&A zuRvyIZlF8YA+B{onAke%*Z(s!3r|H`OiaGO_d#OnHy3(xa%CllM$*sNL!+b#V$uKc z;goI@h5WB?dL0e$i&Ie41>*8wN86e&zVH(6?x9iFS54>OR~azMdaO2LQ|HjAbxS$x zX$0C$7ngVnm4`X927Q|JngIH!b&_owD9k@L-x{VRCk8l=(uM&th;(`=-UUOeWOJ@ZR*ex^l|HDfC*tGKq9hadE|@2g#|pN>zwgV z^4qLAHLjxFRA5Yyc>!W2pS+qX_;A6)Qtus7*A}nQ=Lu;AxAh*$RxtA%qA!PU zlnUv2Zm$bT$7Jj?LDV^q3j8WH;8Pgidn`$I_-4a0j|wzpf~(??Bym|?y6wO^wR{9?N_f_q73>=)`WK}foxHf%! zS(S{NLo5l9RYmy;P>?H8Ldqv0w7j+|hPSFK4@)rbMycJ-j3TRHXKIn2dAEkz$D_ZB zQ`2GIQ4r?U9gEss&KrQHx=ad87W!FjeqtkDEk%B>i|O+h-&IO}V<@Y0;#+o-|Aa@7 zXvAoHw2kEBXYt}J#V$7=`Rp}uk}*b~7-RH}F@`<<47KU$%d&@`2{vZ~3!Jt&%SK5} zu0+wM!jri>IV(XlStG-3?T>r32kPcB`3{QC*>%@3?5bg|-2C(fi9SSfqoG>>;>B5N zT_?Y9WY*+`?EIC9J4Z{+nz|n_XEep@%Q;jG`{b0Q9s6@GmZ$yYJokjO=FQ3c&}Ysq zooUU!HmzIuvgWeHlah~AWd|*5-cnS^32&r2zWHJu*`C@|9Nz+o)}Ngcd9*22VWGiF zM|QWwx5)UaMmjHLHN4mutwCf4TUS|k7+;e}!ISuw9MbV!6KRjOtfj`+Dbk*?F>9G& z_KK9;k8ip0^^5$$kE>?g*;t1g6lu;1CToT94fU0}iZx}6tR3Z8kn8;Hbn>Hfu*;+? z&g9@llY=CagO?1J6=_ivjV~Kt#YpJ}#J1b`>K0L=KkF6s2WBor9ElQ<3QHvVBYsY? zz5ZHhEp&17rF6j zuuqIH6v??2->1fx5P9qae4iO#Qe=V@z!%1s5^2;J-mI|BCNh<7*Om_D+1?8DERYH)ZjCZ+zE8+IB?CdE;vrxrbpi>j&fO6q)ic z%pZ-fTV(ePd_NmsugEyIl(K#?zJ8I5?}A-0zCn>jP4N9{d_yBYVE3%wjBjLQ$+d+0 z-T1~v_D#q4hw+W~b&6voEHynknb%ZHmY2^?cP?4s1b@oDT!u0(J1&u?Rkq}Mx%X=- z_j#M;es&IbpFb&1K10}P7F%-Jb!(xdOLo1(g!cL4f|Xf@b(PO(XC?Rf8z}Mz<7V=} z?|^02-iGlixt|7lcECBP2OMdCBX5B=*!Yqn4{gJDt?{J?T1cS&!6~wW=~@?L*zh-% zPf+zFx3IVzXzaWKJV7qdTLOs-=pN=e$v0fz%ZB<|ARVfafu_E6%!V={sMYdq?qH}8 zk;aR&+Xbq#Dp`BuRC*fuUU$iQVmJLBLdp7CD&PJn*=xi-eXCQ zHI+zb&|j4tmc+CxL-aKVY9maYGCKh&Ic9BXD$hXV;|0?O32QAnRc3xs@}^HYRZw$a zEYHjGwHVlKyst17%XLsZ;tz(NfEq8(s21=*5CSF`BqkaowevXb9iswBui#1)SPD(cuTxRHxvo5XD^9?Pjg_zT4XQ4_t6k6*TB$2O zBhRHr4hINKq&bxybtN%Zez-MnisA6`5}T<{NMjnAF5q=e;W zQYn$?REh&*mVp#6Y3lZ;X&Eog_@|bkrKV-l<(ll7>VLY0bWlBY=lP(@zuYw`@6AZlpHC~)iEr@CXAJ`!=y#FkqID?@d9cMSG zpR|mLbjKwG%hNK7BQ4F9C~!>6sD-zwD-Tb`>9ve5_y)S5Ei^Z&u7gy_uO%@5gBveS zo+c(SQC-vc{Ra`hf}ndfZdH@psqG7SYH>jpW5YX2m?YI-Q4cU(H0H0U2ac|47es%B z?^?j@p``j&kk`4Bdn)NODpaV3yRUi+QiZ=x;O?iy_!WK=cYh_dw!)XIaSu|`94kD@ z8acU&Uw-MK!dj+8$yNOY#eL#I+|~VIaepH28vdfV)6_D$mEFN;9v#9s zuhy-n0I|JajRBn)t7FPy7{98`KRE?(2k2d~IyB>=id*OCcpP-Qr=yp8o<2SKZ*_72 z_Rto44>YU|-b+>bkO%_)?yO6sWB04`FeNR4Eq0I~o!WIV zpq>Y2`bQ;k2CnnDGbTrdnCoBvv9ck5i3zE}3jP<*J0T;poP73F zcMruvy8{)o`8*0G7*Le}n{(L)BIeLG3F|3MPqk+xhWRK^k_ChbFaYu-FMt?VTi6Nk zc2Q#ZDKKWN6JROid%XZwZ>~&_Lvgd%YmlM}sO?Y=cr+<))2b`+vwNhWV%%YtCIR&+ zoHHKJHrLz6L1`Fw&%+$_>3jue)9-S{^bcl0($j&SN(X2k_xerDA9R4)klRTB-5hjv zGdCNc9mY=XAD2DJ$=3+TGyWq69pJjSQcRRg3~L~7`_~u>t5;iKl97J38_ogYnU2o_ zqy6d_!ZR*lekSL8slS$TytN0Gw`Olb=1gh?jO&Hvbn(ZecUb5@QOHf8Eg7RGkI<(bJHoPDwj{ z&_DYJcK0L-`K(A0E^A9mc-a33{ZvCCR06Ci1Sc1zYmtjb{hL_YX$>6!yT@wKgvb3G z7<09Taez0)YIyxt((tsu(-^zAwG41|EJ5CZOMcG(ct3tev^Z&a67cz0f~-c8clz5@ zQHJm?;4zP2HoTKxi2JBEp}z;XD4?z`VJSgu{ZS#ZaXxNTf0{uFSVbw^l3bRhTOsG$ zrC=2e%1hMJY*c+1tuAAwU4m69xVMpI4Tdq%W69LPwEi@eg_h(=!N+UaI9 z`sg|5{2w$ED|w1Ls%GS+PA zYwNRZU}GE)W4f?R1xz*-P_r5bE*`Zpu7a__(`8v5rB`hpxNn86TDxGpc9|~CY8A-Z zY&(uGVSIO)uHDQ8l5dUM+M1e9S*Q@5UkaB^m(8PQt&97n2U`cistn^QVdb&JRhj52 z6F;AtueZXx!RYI^d6qQ3w_@3?WBD zX(B!hxm%?YRDhgbNy~k{-cQ$4zMNZy$M+I?vM+smS$M2P0s&cZ$NO^DsMkou+gyo~NagEmI^baGao9Re

    XxOA5&2wTyE)mr}k^zKWu;EQFf*NNGwIDmfKYS9-8<#GyLC=q{}4Iu&LV%c-TV zd7iI}31J-IO|BX{%;hvvPZeMZB!p#vt33^76w7I)>O9Qr+d_B}@Oe*zC3I5H@3b1; z1w7_yFr!#bZ&kepUltGzKLN^+W=&-Y*Q(Qdm2ayMQtqJmx!hdHD3&uuHF#VZ4YdFp z2*DUTO=-d;75$5KnrP?&*gsZ-40Aaf)WbXyubartfVadFWSGl&Sp77VLvYcs25@~W zL58`Ut!hDvGK3v~yJHFRg@&9LRc$t88;bQm0z4%Ioyc%=WWFoq3#>U`s^~GcxWvih)n3sk!8M<=j`|pleBfSXYb&sX9X!UII&sx9;@EPcN zj}bfU$QMs@UhtpxLyKp}Gs0zUB{kj-B{_TjEiRFuvY=I525FHQUd};(gCE%9kpgQC z*hvUZ)qm~+_Icl5@-0sLgfJR#LM%ZBqnxk&$9}V>Sp>LR2r&g_2BVyx{ky+brhz;O z<3(4EQy4NB<@f^EK5i}ZA&e83v1FLZ2?v(GYFpza7zLN*k5RKq1j==^4JsQ(6=CHm zei>$R$_5_jV^iN6M)%8fX;$^X-0n8@<6um?OqUEZIadcNGbh%A(MlK(T&7F2dIcK2 z%Dh}E+)fw=^67Gi553PM{qKJaG5^6~#K@q~qM;0`LcH{C(NL~9trS5pRM!)9(2Uk1 zXs(^z#A&1h#n~HaH~(akU9$FXvNpTyOhHS{&gowe+?~@61mDb+Sd?);X6N(;Wb)+- zBM(PGy`9q!0ZzJLzMa$66)6Njb%|R+;!4aB)!~Ao!r3`3pQ(Ivg;WYcWsej#B(rn6 zVx=;gT0!U~B%R2A*g0(!Mb&jMZt+->4mAVj=}gUFUxG0)}Zd_k{1W1D1Uezm2Aa}GpYqqEeM8&l9*_yq=4cK zhAKMFZuKCub9xX#3BmI0oc2UIfGbhpn4Qycc&EAY@OwDDol|)q;BFVRg;uKkX>wC~ zobMUIJ~^XW~v(OXy_RCcyV^US`u642KmWOeQ6l57ZWBRN3uLtKehA&qGypCLQz%EL`Sy+-mUKtYy4CQ!ac^7D8; zF9|`Ff>BvmZAEpsvZ!zx$=MCc_o$FsLFnp{Y8sMhB?#nyvH95l>?6#C-39yy9k1z1tcaKYAK*NVLQ%lQdMarhY^$zEKehuj&v4R zqQEhYNmBoZ;{~a*&hdhDAI|YYF|;|y3u0F1ctL8dbG#re(>Y!!mxE6~3dx)jHk)JshjU9xrTp z+%elZ(4S&;*yDvy!piDMyoaCZKFss zDVbe3rL3C;_#envBAuX5BcIuGD?)6e@j~5Csi8aMlM?jleeS(nduXVi>vRh0@ z4OZ|E`P>OP!42siFEn~l`6d%*KrIH`z-8*1Ia!cc!g_Y&9xq&Zn-kzg$nSXpyyFEM zz#cE0ZN|qZbPV4?{=*AkY4&)b`9sFw0abJ@^KmYl5Giics@>y-Q=dwL8^USr@oaOo z#|y11ImsLfWollUR%d1g?(xEoA)E&4WUhq#s07eGmacB*CIv@3w#N$tPdYK|hkX1$ zVz9>xBVJcFhF>8UzVF{+@QxQU;p7O8iT%K zj~AwZ%ym&aj=9GRk9^8wRRmD?L)q%m!o5X_d%SRa1`pz3615-3L18&vyggn}{Y=TL zuK~Yv)u6#1FZ{{Ai`ZO+)=|b>R)c%I(5H*lP!6!F5R4_<n0fbYj@ zu*VDaO51&x?*T8w672Cp0<*n4OAtlUdhE;PTGAdbTx?(o)d1^y1owDh%*)KDIso($ zP#Y;MC5Wx<@xtLHK3~&J;+O(|A z`a>Dz(PWO}9WOl1u`@3y7%;%LU{|LyFrK}PWset1m$TL3 zZ5SU5%T&N&rUE+03p;IN{{@C(@?m4NEZM8!cwzQiHuX^$xx&h$OS4)9dXh)o?3==9 zf0-`XtKoQ|INfY3jI2h$xWUt9^Qc+t;tn@gzV^bp1IFE+F3YmV3+bzE8-5ywOr2~K z)muJ?D4fc2ydZOMeY`Lw3x^yp=ryk#FUWNJ|3v0UfnFyXl9fR;B#VV$=y%4#V5mBh zcyUHUGF^yf@Cw#nSvhr&6$E8Ud@?;R4RL>AbqPnQ;>exJyXco$o!Nm zaXfLxo+;Eq*wO{e;CB-oC+Jqy6Lg5jxJ^LkOkv789{CfE(;>{yM{>^;Qr}a)SFwWH z0AsVT?$oJp&lC!>g?~f{uL8c|sOk>>z^iY3@Hg`#w3 znoxKXrNrfC)1E0z8>D>qiS;W3UL^!wBf<|#u{vi8r(Ut7t`G+PBk8Q#OC#PUnkGY- zEhKGGqscu}7*f@alFp&Yagk~wH9&J~+Q_e^2a9Q4!xZQ(Iu#~OR4(7hzIK2U~xG^z34nZn&W8I7ic z&T<)~#hxj&e}*G2DX{whHwwY2cF$d4V0z#G+3)Oj3E?HceX#@?fjCpBSlgQBGr+S# zh$%4lOhJCoPB)O?BlOl>c?-jyDP*6smZ<=v&Sflnrf{C8!E|fv45PoW^2BJ*6xu#! zW4sy0tjl!C*ut5@@vu$(eK0m(rc1M`2eyv3x?Y9x_GP+cY~f5{8V^9~5$GEjzg(tE zvw8)ZRI?*cm{N*z#ahB0GxX+?^uPZxuKWjwL0~k2%NFY8_wj*%@f2V*G#yF2^mEbB zJaHPS+=HPto?wG!Y!<<4?R-X@M*6ZiA4A$LaWZwHWbIy$(w|>;zM!RM>vRAFck9%@ zgeexTrl6(X@%>VgperJAI2zQ%@x(*QKG`xI^Ds1 z?39phhp@yWjWZ;(b^7rA%4m8R!t+AXiTsDH)5E7|PzPar>airpdACll|9_ml2YeL8 z|Nnn;mpcv!xo`vsBuGfPP($y%BVC%HAU#y+AV^gK5fA|t8ww~YiUm=Mf{047AYelj zY#`WBv3LDF-!rqjm!SSX-+vyD+3d{g^?uLHd+NS-Z}*(?9hFRfhV_>)b;(@U>Gnjh zQix>}Y+hQ6E|udt-87KA8pCK`kYzlk16bH~FOU;jQT}lw0cuE2c`Ld;N8GLjgbk-X`d9+^WI>5U)b|>s_A*hA-Fwn z4&v7llD;7|uIJrC+IlxV@*}9%^PT|M0J>$9Sg+n3#kM4RIhmO1c zWwbf&dNI4>u9yDmxa*~(JMQ|n6vc7ZUo7XRnSc2;Ko2>$?)tu*yYBjTO0YT?)tO6c=;&l>PZgIcm&s7|ILdGKGOZ_ZH^~} zVe)X@^yZ(ESzg;vU)y1b~e+@9ZjiaRe7Uq9~Q4$dgdG7j>Ux=pWz!!TItI4|S zpT5e`Gy=*bk0v&Cobhj|Kb~M6K(}8lgRyOlO%yt*(z41D%yZ-0j9Uaet z?(=lG?)tv3vD4KS`xrE$4eq+@JB)JN^?${I)?I%FU!18y8na{}cm3d(os1g^D6VPm z*8pm)BiT1j(z@#(=SK#n+Ed~rt-HR&P^Yvv#evpczjTA+u74yBwC?)VGnH?@uII~f zd0KbALIBVuV~;FrbyZ-B@JUpod#zVf=6Y$*iR=~RJU;f$2;cmzec>#qO4iIZz7EeDVAm;8PNR zaRKA8I43ij=dLfdjbFeLY_)$j=nL%_xBMEQGDv+FwJVtGu744ih9B>m>H+0)mlg?= zX0Pk`HNcnOS$F+(7;}W>O!3xTe}9hYDrybj-L4umSa*Gk;>IFs2jCu0gX^xZJlxn= z9S8i-)8M-6)y1aO)USZP?QvzWzXrIey7IN8Syg$!NJeOb{f(!P{u7|+4yTF{X+dml-StOMad`%;EEqLCmL7$! zyS{22Yw(L<^u2&(-SwM4whcQG#sZHeTZf2MXnzgRa+amu32pN~QC)X^33i?V^#Yv3 z1$mykeh|+E2Gkkgp9)eUlC|TEFA^9NVf&f5lN5p-0kX$&7{voWmVl85+QegM9j?3n ztNyl8`oI|CvGgq9y6eZ?hDm3DUhgp^r$~Hu8G*zMvb!6~V;)UgE56*{1?%LaZ6B1k zJ=#CG>-XP^3ASa*Ht)z&RJ48|CjRmcM`dvNWppO3iDNs!HSTKG>7GYlc8g;QvX(1(!wT!|ta z^(CHn9reO<9Q8Ty{@GD40@hJ41;5ZyFBL4{sMos$R}qdQ`iOq1T;gs=G*VSS$5FqYmA}4d%z;q55Xp7a z@8MElJb9=tFnS5AsV;@q=Nj-OJhA>efTx9^3mNGu&FVPn)f<-d2ZZpRe+u81p=qp7u4>b<~etMV7Zf zSznNbGV7>c^A-;Yh>@Owalm8gD!PvP#c53VCqcjR81bu&b<`hDLs8&4Rv&^byYzU^ zQJ?iHigG}!y9~-=9rYnr&7o434uIW+;BQ|TGkx(Hl z0lY;BaSi4=>c?+TW`H~f;~7_t(-_uK|Iid`nYUnkbOFmc>Q7I$IsOJCw6}1M)=~cr zmxg*sX27T}tOCt1s|t?#kH59LI>6{9tOBLitU7@ai)`t~!t!)BnioU)EY zclKd9uP5Iqkhdf?`4g;RJ&h$tBXz(U^;CkTM&FYQ(Z(iLIq*U;V$I~&3DJ(t{l47h z&ykrwt5LKzlWT7KR$9gAXi^TbPF;0uQegQ`6n2rD4be5X19bgC3(X8n?FZ0JDi{6b zMoznzKq8Q}i8rlP033$u#nf zsIIR%vQY}w+Cm0mW_jPT)>aQ*Q-Uc6ybz-}Sf?R8{o^j)w5)jp;autR%qNHDl+~KQ z{S1k^6DgvVNYD~1VBc9#0`|;R15o zn;c zy1|wmIf^30lC;9PW?73d2%)vHW;mI&icYv+;@FuD@?H_EL%27s*+U8-tft^W_ zp*4u{d6@rKga`LfdejBOS2Cu9x`FuqJDBbd!SHp{Bw49*hb0*(4F=-VjXGC6K9(g{OgZ@4j-#2@Sa#TAs zfcc1*)@iLDq46hAYe6|*TQ%H|NM5y4S|q4NBIq_16bngGS~!ceP&X#MkbLAoANcIx zP$9GsNKVtj@&@%_xco3V_9eMvyM|b{e0w>UFG$sCLEN!y8zrbx*8;8}B+0wvRixx= z)Y-xAA?bb>V^W(w0pE0IB?{Fp4llW&ZH)SA4$hPEUC(6W|G|VZX=(Q7FwYA+oeUIX zt2W!w^4&YFvG4bl*TVy=k}t9QA-FubA6CBSMJ)AKbl3V4G_Nt7&cZXrzC~I}nv1Vu z3_6NLuM)*IJE+;CU|#F7MN>qNE8W7oMXtWOfgN=DKJT#elmtp1(z5p<_qZo($)gWK z?w5YQeYH6s4bbGH5Kk5&*HhUkn5}>3AGB88H0oDKKH9{TpHgrB1kPncO6#6bR4c0h zp6zk!t1m7g(}5Mod0z$4y!LP|5uUcKd6`~4)n@_ZE8e(SD=e;w6CllZ6>6e31KB^p z^+ow1H*C@DM9p3cbCbswdts%gSkTK4`;Lo8u^m<_p~){pJSt?CVna3F@m3 ztdCW4zG=>{0sHIx{F*%o<_MQf*>mp0wVeCHUY8fpyhU)9$Mc$83$My^$M|l2uGW{J zd5^+*%Hs`IC-%at*0-|q-SMjC1vT$=mlHSfP}$E(4{c-=r|Hkm1;f8d!thF5-L`1R zJCLiE|C(!6oXYnz`R)X# zmD`u0)1-xey_9;~L}RTFG&xB6Z-=;l`w=6JLaRDA#7#ZsW2DVa(tq?<2^KBmq`8Um zRe}fK!fDvTMCGdlbhtoE6XmM}_gq7?m5JW2%=bz4=aB+gYgH*F1qifL{mFbVAxTPs zA4}C}M0z(R1yj>WyVeEWnM=OT5tu%oUeww2Y`p$io$E>kT=6lv~%6AQ^HKl;Uzy#GNGWZVSx zX~$_ymEm&DZal(obqE*9L2iw=QGzJd1^%UkB>fG`$el+~?qH)xpWtGcV=5x$TB=Oa z)ItucT+lVgFYHdrwf^)<<@?$6m7r#Ch55A0W>9Hf+tG>m3|gU$X;bswgY&WQ^rtf6 z&8mvN_B9{FtxVD2712EZVVvLuQ*36UdL7_({Owvj6NNP=2Hw!+M9S5td+If}zAEt( zo`s7K?R2N3qFSOq?7<>oa<8YRmW9_vz7|W)#WZIQ_>G>{_>ZENT}BzYJ~3CMIj*0*|DP>g%|FFkP)$s`N1FOm&_k?#xDQl%PsI19(6rA4IW=JSyrP>=^0q zyBOW=QoQ%o(v&Dv-*fPx)d;%XtyyU{{TW-!_R~y={e5QHCSzzhO0KXr}b8|UDE6n zlqIdzmi4*=nN}yMcIZ>dw1S*VtJd)m_cD!rMy3^&plUFO@q{EPoR{f%micm-%@%u^ zYW58-Qx7qzq?jidz84@Q0AuYQRtBHJ! z_aZrw$twEC4G7t9>ngvxR2g>M|qc z>QEwIcrphmLD88~K&mSR<1Gv%@pF9)FqA3F=YNCvFN9$~bu=ex_)MSb^(RTgXK~_x zlas4CDZ+^_bU4i6tpbM;`{1q^!vzX|$L#-R*ro;&-3cQl5C5vsBTwr8Lq?v_|ND>p zTL16q%dbn`r^Xr$-`W3b(J&F|xr9+tI5|D)Wi1>b zQjVs>R^uc(LdCb}Mud@~LyD@I4&w*QJPPw-SiRzz`Le=0jKFwP%3AMp3jo$N1Z@L3 zF*cCZJzv)O1k0T}#mKBg=0Ru=abe)e1XdlNH|ESkvJ;TmC$Q@1yfKwo1_HBX%@3@4 zY2Mfzt7xiKG_KJR@VVc!x(8M*nLj?|O4~s8|IoMb*G#?I7g#F$5C5uGV(`nncVI&v92b!wI;XQZEkm)+|JJ%`<&JGm;Eof-D7flN^*PE=2Bv^ z$*noY({+2u=@oz-$ex2SN8tT@q28FW;ebXn$LJ@`pSJ2X$Lv`h?*_eF*ED+cJRvn?df)qL@| zZnDaD+5hKJ`UTX`yVe}KB%<_09oCS#l8#cNCSN?TyRGCA`@iSM)E`!-3pD&7&d_?2 z?r9LW>`^Ou+Wy~yh6%8iUZ7#pO3F}Q(mf60tNp}Essv-#) zG0kc|m=SCsqs6~!;FzVQB&IK3SrN3M^2NF9w^}pp|4C?1dXF341l^fk8@0ZJ8a9-4 z|EdvVei1*UjSU&o@+oq*v4JM%hVOL{CV5Gw`Qj0F@@Qc5I!azwqi@XxdEJO_CD_Q6 zc7!iqT*8h}4=Y^jH17aL@Z$@FbyXW%VN;mK#tcJz`Qk9{X;qA{|5u{Q&%${TpmoJ`WN5w5xRnJf8 z7pQsR0#)n(K$X1dPuqUmGg!yQhKzYoJj=~RMq68kK)!gQ9j*6U?OV|P8LXcQYxfP6 z+bO;T=70!6Po}!neItaM;5Yp)!~Rb`!;=v38WTo}kj!*L<)#Zad-&`p!BY{pX&E5` zj*|XX*(8+BC4Dhrq=<_$&2$*^Eb}PL2O(^UXHJsaISwP&4wPDF`Bew3F^^!GPz`oeMtVQONYSB<)2|CBBZ$o+XpM4GKw~rZ6C*^*(KN(rO!$;n z0Fu6mFj91AjeB}?vYptg1g%j{3TWKe4~-(_Xu8^J9D&AfN&k&7Qgn#M{NJgy!&qjS z`(UQAx>X_QfgvYmy5E5X@`ty>V`sUK+5g#G_w;}^rm)O}3BDqm%zDO9`jrYeBF|aT zg@`Ui>~=>~PE2;&s7(IQKD_MEa!=X+pCGdb+VR3N1+!a43pgU*ThVr(vmr*T$cMIe za$>UUMr-8%ip&p|TV}dx=Z(nJfY!0FOo8l1@0HzQw*OLC;|aQfKuX2v!s7R7%4h* zqgSHQ$IdWSyT|_D2Q&F2W@S)Bpmw{EzN0g%m!+j%WpY^v zeFD@u4qcA~t-WnmHXN2V$o~HX`rS}BUr4V=54ytAR@?vW&aokc`kq7Aqe5%nOy_ZE z?^yaq=)XfP%A%~R>d{+Znd6qGW}31me1+Q<>J*1=Ez^I@&=k7SAgYU5`-~Ye8$Xea z^&ETFYWds#XV+Y0u%V8pmo1ao#%9pf{vSa`H{OkOXP5#@TdHMX&|kL>?;-*Dj!RetQDn_W(1 z;7^z|ZHg~EAb^bCgVkEm+E!K0MFR}8_`e?p`MNgIf>J-u9MYp5aIlNm+-uf zl{{|$C!FUMxCpIwG{{MuhCjp&AbZi8z36aHPsW*4UpkFaGv;~L@>|AJw$PDrxBYbd8;o+4pw zrNf+Rk5WLieudUxn7xm$SYYNv+^k3Eb6$M*dt7#@zf?MSV)m{Ew?}+Qv?C(q^eNhd;VztuPtjMh)F8hv*`K>7 z%#$~xE}{l)nAaV5XM)9Jkww;6qSLu`6PJX+p?#|yf)ri_Dn zFc*F(f-gWl?9tDV2I(bA;vaSIPnLv(!}t9Kq|;3yO?Z4P??w*B6HPbZ zEAh`*!*ZiZwIT3WQUOwFHDV$yKCdo4L3gfx5QYiqyy%VCGL`0`NB_bhF)qI;qnZuj zT9-slkH3n6mY)C1;&*}F8;?)kf&8kO$89FNzz({&lS#*8kZxW3r6qj?;oJqJ6*b7| zwxKO;oq~*nM1pOJ6m@j~B@fizY4IGe>hbv88OT5KM0sT%Cu$GYRd8KhYBKTw_!I9i zXK*`}FJ^+xaB*Ey*`-T6EjSHxTlTZIxHrMNs~{87?Rd8RyZh9)>YjqI%O!ztWh(RU zZ(7OXZ-IT};*Mc1<414)*IMH^)7JkLLa_v=%%)7Xoxbb}^VkGt1U+qJ!K&&q$u40i z`1?DYyL)ZHI>+M=Jr8~=dx*V}G#qSfJic-Z#r^bQdZ^Za9oSM2FQcYEh5Wg)bW634 z^lgIaG2)fdG2iCasQPslT}m7JFw_rSRfaC(hX*}%U-zr|`08{&{uNq~6(LSDtm8~J z{-Ubq^}M%0x^6`nF=3gOEvw!aLUHxk1H2?b2(17+#uH8np@fp3hG@c2z|kHdRlU2D z+C@~eC#c>$fTaSO>ghg_sy+}#Np;hH^sfhfxbRL$DPsr)K&5<Ks^HQNmnnu_0xP5^;d6fwAFhJ@GVyvgzmRM z7^GUV|Iq9F*ML8Igj6Lr;QhnYuyqu>IOQx$utiCsC=_6GHU$`=Qj1W48la7ZVY+KW z!+7O=bmXh+ScFs$(918-acUuq(JEstjLD#Lg;7Aq&9{=vSaoh2jGIB%3B#DAjpR~Z zO>YWgyei7pQ9a?wj}+7wmbG0J+VwvemgyiZ{2oam8C7XE;Y&#nEExXDI~7Jyll{v7 zP+f@_`SNHl-jJ#%`(O4;brbbc{;J=u<>+lrYDjo#;ZDNNqktLy!+t54VITER;+&Nq z$~ewK!V51Z&jp;=5|_M(~{|@qo<@m%ci5zmRyYd2}!F&x0zJ_@uS+zSm;0p}MYlx8{#bj)PCrc1a6_->(? z8kS}@3S4~bJE#62yW&x9^mO@%`{G*m4Ul)^(W`ucZnc;M4+Sope$q}> z(;-|_h*U<&6cQNGMV@(F1Nev#Oe;vq<7N;`o%Q3NnEQEXC;yFV_HdMM9Z zxLkIeI(?Z6Qpz;KKWArYYgBb89siAHvMQq|)4)9?exzsv;mX4-R;{*01wEGrHeJi5 zg_>0eWZW$$DJ0_}7?xvN_--emO0Nq(x&|SW+hleLRxZ zWG)L5ZhGg8-O*nOVV01}O9>-3JGm@KxOM+}OIi)#4wpnua#@gYSJGV;-wO70JT9B{ zgnP?eXDj{&*t>$8o{*wmd>H)U8r_xeUOIyM4(u;i-n2=I`dCO?2RzLshmgv0NuEWp zCAD>yOQD2k_I_=1Y6hW`kaSLtCb>39cs_**Lu(oeVYI7>>d1~i;b2$xxOyLc4cLt? z?%1Sc2S|rM`^1tSfbghGLdh;E?%SuCRAr%32f$v7$A@ycmhjQS`)nc3f_)W_zb5jZ zt-jOZAqGv9P_SX%5z@C4n^~JwgV6AwNx#0i-D>Iy;Zm1GN&l!qN&dcv;jYaw32csw zo9dQT4M##Mrk3roS*?L_?**)f+3Y8jQ~N4f)@~TD6=a!4sHi?hQvwglb!OB_UrSbR zvIZtJRf~q$CFVz0Q05vbTbkYyq}lV*h=n9M7|w7`OC~PlzDclR3;YJ@e|H7Tlv5_6 zKq)0yFs3en+@Fx7oeRDUlU_}!u_VrLfk+<&nR>KTJ#{_6E)Og?59mt$>%mddTpdEe zaZkx*l7smLXt3SoL`D+Sw-ElkfHY|yh3~!@tLgq!ChGHL5|YM=h;e|VsIgps2m2*- zW0^vMY6_v_1tj_XV(^L~*DIgg#Zp5cj2DtNhoec8@+-0)YE6qEthzvx%rL=;3HK{g z@P{F6_cYnsi8CZPZGA;cIs)Ou1tgjEg0tE%;c6570Kr$vEtA$%Mh#d=!RJ0$heDSI ztmF}7;pg>EvOWh_d~gSZ27qHd!vCqcxV~kT2;Ona<1+uFWSOT(cZxD<`9{k7Xz|A& ztOwlg5enu+p=5yw?%H+g?f0&WoZ2g+Mg~JUzd!R;M*I@ z)>N$?uAm#avzhWZM|4=xMB3g-LZb*f||t0t*5Z_Ou|szMOYOK_2@^&7tF4&I>* z`if~ZxLo~qgUx3rjC~idwv~akLY=Q>EBpbBFFckt%PwK9Rxfb%sLhfcP*kH*22mW>S zE$E-ZFooP~bjTHIFzkN{!>LjvRV2hS%=Krmn1AR>7_~igyU6?W<)SFmS99FU4@*;~ z>6IfbJOm(Q666>RPxcbbb*5QJOamQuY)9PR>oozq)shtgQ7>A;IU zN;NbXiq+my-3EG}$EXd%E@h$iw*{52nPj>f!b^onWmG*jf}u;cFr%pV0lzLth*(t# z+!qO5vGfzW;1wyyiaJvW zs)eQ$$3NapGME8ju8@rJEIv(s{U^pyYryVyl~D8b4Jhtad+%clL940lV9&`xCbqi#+GUo>$9x}z)t7ZFU^B6jh+rWzHv@r9ot z)CFuQ1Y;|^9*p=I!tFPFhS~c74)HYT`6Na4VCo9p{moLlWt|0Kk*7tI%BXR-L)!2) zO{ne!e8AHpc466>K8tJ~JoX-hU4ZhlQd>~FcFHOjdMxuiHL{)-NSxCCJD9OGEB?qtS%T`(fJbNw0DWkn{p*Qb7OWALSz0s5CZE7!5UFhw1?t$<$;Qk8; zGSh|LnMj{k?*X0_g6?CHh1PyeA-sEzI;h_Pi;!vwHwmGFl9@1cVtWP}Qaw;hGjmCm z)Aan67H$X}G6`}FhC6u)X0{tZLgp$8(<=10Xh_ski&8RmF}Eb@sfF)zGdcOQYN2?k zXb`Ei@U3!sCx_xGZ0;6>g6aSfqoIhB8PC-aR^n0fXASXXO`SHv*VK1D)91_HT8q7U zZG8_hw#vl%rMtI6wN%3h(4ONBagT5WZ?V;L}XMp!cZKy=_pjz08IYE7jz}K#jFYopo<&(nI z+=|ClT*Lh3UM2O)JwJ+L<>N=?Sf2r-aV;QdHRpoXeNeRlDTsdc*9EY@) zl*ic(soc60MCGnw8BtX#tdb*FY*qKQr^1-`>Ic}j1?rV43ep_)Y3^x%Ae!k(DS}5)5EQ)=)T(WnN}X#Eq;ca9RXZYXmyE zLjN+dD%~XYt+7UGy82SFz_#C{zSq7Y>3x^T`S<8gec%2%@$RJoIw zwp5i@fgSI?(jm3{oF%H6M$`pzjO>Cg6-^A_y{-T9=PpL#&j zr)=j~OMP0!?@Oo%#d&;oVa5ZYYS{!kMp*n#SNRI<-F!N~jT%EChBhs)OHG^xln< zJd5N-grsTsk?f6@6!j4MhN3Tx`H&y9=Tg{vAlxsc=Jg<<;N!L^_@P2O6g)%vfkFyW z)%VRHgjDm^FiwJgb^)Vm8yHFIq!i*W&|=vI3sF|}6h;L#jDPd0lW#VRYA%Z_uB*tu zXs)`x6)IW-baTPTOax#&MgB$k);G3M!$Burz_?WyUDW|Bq85R!@)&wAn5t5wDwn7> zlFNgjPZna7RavxL(fO)l5&NXUYcSptmN8eVIwS>MsMbg^z5w{iQ^8hS3VMPk?2E2c zCwa_RCDI#G3Gq!*UcD+NzgI=u!>C#a^<^$&C)KD@#iSSx)FF)KN)1nEHh`NmL`@N-NC)yO0A5}?C8m}V66>SIeLt-TB(h}sz*C?huL;KEyb>@ zu97NLim4D)NSY$;&2w?PSMamd%yg-il%)Q4;)%r>6>M%AsMq$gudA;FRjoO67g6Ck zzXfclcFcv+u=XK3F+arA%yF=;ahc}!iZr#k+Oi^z*Mv~R4^XwpJ zc_vL~m7wL0A#=`?lZxw}SwQ5nE;8%*lY?5MXf9X%1XB-FIxVMrV?#CTG`S3Wu(>W> zNQ*RsKCY06TOp&NP*fE9tgigaFV@)?(YltPXVZV{vci21P>?IX#(6{8!&-Phf@l6o zSXV$gom26lDaw~QQC?q+a8WJnXWmVcpc^pqgel@3G)(5?Tw)N5X<{`<%{-#6nq^PF z9JN!|?9%MwnmqvKNRKUr@HJB3-;UbpOFp)b{_sO@OyhJrS9kj5D;My8TnwYoBVYOB~Vc;#FAW z2=P6@%SD^A&_Saz#vHAeHbU#RUZb_vWUX~58t?o+Y1Nr%)pF)*tg^Z4&P-Ene${GA zYPCC2dHCPdIx-+khLIc*?6R6FG*ONFYQa)kFbARbo}gz1 zY1O!a)mYuj9kR@kYRm_^6;ibHa3rt$pQImyl{r%-zNDo~Yv~Q7J^w#QH&I*XlJ_cg z370lhxr~-R;Yqp{jVmx0twPHz%N0&WR;Eme>GB(stSgUp)3bOWebO?b6DCtpuG|9Y zKds`%;6xKm45Yt48g$YzO->G^_q_^qvYB;L@s)|*te6_ferPfwNitBzhh0j&JQZ@T zx)$Ij7qma7E~Aky)Cd<9Pr;uwOE4_EFP@r7m!o(PGEdc{8M4#P zz>S_@|C60Ar?QyVIYLZ7xa`kLj2>e9mwl0RL*6kL{gACk}=@)SW%p#QI0~+>G2XX&`^r!01a7 z8*XAlqC4sl8)0H2qI)Ga(!@qbAI2A$J!-d>n-rB#&1a7`I%h^7$|p9~big^$=AB`V z6D*LmKt=mWbi9c!RMFSz+1Xc`=n@q@CD92c%By2G3VEW5^6Hqa5}jnCygH^CgDiWB zlqitJt7C%GiB1y}$g5+bX%d}oqK~NPZd^*)v&6=Mtld1aAy&_>p=Rgt{4XJC4v0Lm zq0^hHn@M}jO)tETN)hP67d?p1Ih)8s64XKXhehUEtt&+h0m)uaq=6j)pMrfIkGH%P ze9=3#t;4hkVo4Gl`Gzwn#=fvojK1JR^@#CsV2#-h;*676ZCn~FyNejMpuCi+Ox7U~)5m(#J@9TL)g3(1s66qD1(vmwpzU&4;a-ykR!3pc0zlc~@(Zx6C~d9X_H_!;)DIg3vm zwo^(IunsP6x_XK_wFT0WF@9T}!4Sp?DQ-NJQSV^XoTV*CQh)`3%RPcFY8lo476|v9 zeiXt6z^xuZjNsI|!^7nDa*WwjCVcfOtapT|O=k*JMs;}wRfqGZKsX2Zr>9Eq`t# z(=68i23CaFxC9zMR^bXJtl0QN%rmhWbA(gtMee!AQrjRI+qx4sbZk_ZtIpU^jzwdy zvu`gJYsW^Vc&s_=W@0RgaZ1G2vvE&~b;ErYiLHE9yfQ78uzQKMov3`#*kyx#zEZK1 zZ_(bdZ)R~bKlT~NGO@dv<;uqD;ag9Q1^V;btJp(B`IS^G5B+JeM{iTU^w`Zz`4wUh zysvy0#bPWE6=SPe$1-B;x6u(|H7G-7>=7JES+S$dncIDtlPYp&Bi46sLpBe$l%b|} zQT9d0Vf5H&oS!mBN2{}OkBu?0V$nm_5F0CFL^dyfZV(Gev&+?fiH68sDGR4RD?PgN z8?Xr`R^7~svHpiHwgY-M7LK14WBs3J`=s8KWYKPC#aRFDK|4i!??@Qj%!;x8>+%qb zG_Ychtjuw-{&OnY+^PzGi>R%mzQ2TW^-sirsU)MKP=lk`{P)2~(sNc+-FkJ~axNg`r- zbFg+9L|=(59^KUroDj;)n5v~7eV>e${rsAJQnykZ^x9CMl?UFiP_sDbi;Y0Hwq&29 zN8+V%Q1h)ocaGX>p(%0Dt6u@FyBc?*mbx(xx~(!L+&H7Gg*LfROBG=Ok3F=W{g0M1 z1!o8zfD@8o7YxfWGk>wqml1pBipF%(aO~_Kz^y+TMUH313a!JRqvotw+ZVl0+WM5( zRCd0PO6;_Wg`<}}PwdR?Tq@9A+q|zisil-?kL^}1v26!J(mfEkzoUJkvHcIE+AcQ~ z%;`4b6OHZ9M}wLv$+j`XiyGViTtC}wZg(V{ZezqwzfQM#$`Ny9b(h;e<~u8U#F2G6 z>HfjufI91lIh}O>q8n}bLRd$a&&f@9(*2?K6f#pV-GOvTZJiIQx}>)xm^w!`QghzR zrVVmfb@hP90U~n1pLX*=W~$r<(imdO`Zp4H{AuY|hj3Ik9U~JYZ_sY5gsjw^a32tD zBA_CFvO+Qt1j}usb^z>gK_|VPIzrkBH$B2DE_rB2jZP zUv8%_OOrGHI?YTY-v$I*0P#~t^x*)Bky4_%ky^SGxz4|{8$L-rkqv0sOQB5pZ`pS0 z)H!6kPWeI0C1|;2o=io_fX*!G!SL&Jo3!x5z#(%geLO9^%S$lHha^EREK6R_1+*&P zJfRsYj(oDRd{=$?g`9RTEvaf8r#)qPE2Z*S`pUOc5pIu{AtY6TAiJRFJ|Vr=rSB`> zXJ}S6!I}!5D|jT0qeJQ)h4j9V`al@sks^kq-@e-?ot=T!Gz-E~A?cj-D2~(-W*Jpw z7fVzBJLwO+a+>X+$C6@48X49Umag&x&M+~m{V-lH$dc>xM=1J0Ukt)o!0!qXYWML; z)oa#c??mJKlCg3zREH!rO`itC=3I_60d)(8YY4@hN@df+EhOQ4PD|Ftk(^Pw=E_!h zQ4V6a(zS)hl)@)g*ld-qYnHi$K>96UC`=1eZ(c`cgUOm_Yi82Z%P5*^MLJp$#HUx4 z^y}2~q#btC?Rd6QH>eLmzI4&ZqtulCDqkrneQWKLcC}4t!BZ9lV+dbqHFTP<^qom; zb)@U6ETEb$Y}OmY+0cttmNB3@g7+4VX%k)h6eW-OmfrMh2dij2gqejDS<>Uv$68IR zAlzL@QyJB^BqiS2F`emYE8x>Efqp)SsiE}quMVadhe>}s9!t(e?v-V0ko$u4-(AeK zk{z18S))szEzUBcE0fZavJh-z^WgJZw0vLm0b9g+V69v{qLrkou3VFr4yY9?C`Uig zVTBlF)n@7SJUQFe+Ix88{Aoqlh979E#`s^oE+yQXEr$SrQeDkdIV)Z>ywF~r6 zL569Zvg$KTUiwkhZh_6|EVS>0YPz~EaamRRUb5S(9;SApUM03-drXLDrK*xe&~;Qj z`3{Uc&?dq#&1`G#KY*T->i4}cdV=PA4C(c810q!gxR5J-M$KwVi_C$y#N+DDX=f$o zmA3RNE-X0mNItBPNsv?Cn&~72y7cC??`ba*FM0Myc08qPCbxIzA36P>=O5X^{Kx!r z7Z)VsI#9*Bty%vGNs}cOxr(DZ|1>z@%s&HQjPzK#{hayd?l)vEm<_s07}sh&!Z4+v1N)~V*z}qeuXKrWyd4r~xmhh`@p#5Hu>drqObdmX|B-dkd zO=fE6%|BI0s}-Ma=bzT3b$8PX&p(4f#<^%@iP*}Sf9`n9_Pd1;mI+B4!kK@*=Sq4T zmQeQrJ?_G$i`)5U@L${$63#*JH-%%`L|faLe?FLN6`h0dOCd$h{PW}lZt9Dsl8nv@ zgm_KP{PW>pdTkxR#xB8~e+GOA)}8de@tB!^Uc_sr#*#kU#Y`(n{ji6bf8J&Ppo?$| zth-z$xS4-qpIZDWFnPh1EuvQ9&OhsiQHf)qrwTFL`R7L_Z84Dg14f{oYj=148NCg# z96*kMaTaywpFbDFXbRf3Aj33{JO89VVp}*L+7zLhuC7b$&Od)YWXrQ0#_fez?)-Ce z8d*LD`iwA4p={0V{FApID<1_t>oNXq{^>jp?jP{N%n(+a?wrg&vXS(ayepIZ$~SLI zkG0!JeQLIkGD7Y4QP}SGu{+xOipGm&NYip=``CmF`CO9K1P)gV-b3(+w6;U)-5Zxf zx{z+>u+AgdK4P|yr#Gg4Ly`A7}eG@jRL30M;%p$QJKTeD5@02K_FCO9OiW(O~w*=>T?5kF2yIu5~Wg7BBT zdY)wUEr&k^|3L7_8ywvxc;SBKTPLJ4q-GKxv$FAxZ2!hv)@gk=y!m`i`@dbiYS%Yw%@>FZkEj$v^oW;?y{M>P?U87?cp-KWpfB= zqvF%;vN@BqMQ(cGWpfS4y)GIVA+~as&8zU>N?Fw|2rmdp8^T#O4^n99uj)OZvo36A zX1i=Y@fn}R7S3Pb#ZYG3MAVXx*|v}W$Y&H~kz7+qp1~c`<7;d1HFnX|2|^zsnbze@ z#(~+k@0bK(3`vt*0+`vh_q>$Oy@>SX@t9dQf3J+(2GX~>m}zM{9?h~jyS%N;tFYd1 znH141n;AQ75x)fc*~KGTiMwpJ8$n(ry6}oFf~|yRxXb44erxx-Fq#O<*xg+=|6YTN zo&W*G$es|0+n|DKdNT|m0wmf#*{_YXWdJ)Ev zLM(ULJX4H9odNw;7^ZP-&F!+8(3(OOp@&r+BysJif4dR*N(?Nr3P@*BN@ z&#`b!3lD%5G6`~;79Q&)gv5~)49gvZU|7y8&z03XG#_&X_1ipx;oF4VUnkrvr{bjG zQh?KvBuv(jrHuu9gGJSfHg79p5^eeN0JgiGRyQ1 zYO6J!g7CeNbWUahSt?9tnVz{CRbf)f5iCoJ9a(8uW|>~Hmp02IrAa{+YRob%58$XC zfR`5{FgB#>1(s=P;WXRY(iXw+BBVm*RO*%%ULy$uIW74qg=K;Mthc*B3-5nkprtPV zu|PMzj;DlCt%~>L9vLC&Yl%gE;OH&Tx0uP#uWG|+?y;m7xC`_`+`xX-8+42?{?>Yg zVXQ6%aTn+Z=TIs&AKqeDo4Y`_9U|abfJa@>=+OB&3v^rVD3}HMAhb6NQr!jm%dnK{ zbI|iH!&{)$C0qm$Osz?`3v@ZsVs3ij1-ceYS@3Ntajaz&8uWw27|0vp~P_4Ics!(mn`B3n_B0Ywt%y zYx*3*kA*Zj3-n{V>D$G6(bWjn5Y7VqO$Jzu^cwM)S)lt*25UolZx=JIWJjV|pg(`t z7GXTBsV)2jA$|EP%9Gc-S&~0+;0{s?@6T&if zcNgeZ$0_c&0DpQav_;(odJ`@{Rf=w#O^CC(X&iTfo{80U3%7vQS*WI~+w#~2dI7hz zG;0KmNrhPM0zF_7^;!(NS{SC8ZO!chU4n-J)Fx1QVYFrZ+X6kb58SuledKX<=d_a$ z^U7TmKB$i@*04e*K~B@c#p%d4;ZsIy<}BJKxkUDIlB17i@sp4|sgW!f10uxa9pc0i zq8qtMQ$ifd#KO_5d6cX~9TQ6|r9?@Im>P$YDTE}^rdS4NlCIP|H_2ND%aB&GU3s5x zLE_2V`Z4WYb1N(AN3xY5Z-4rMRYX5F(F}k3psR?U4zS|+vs(Gni?<^BiB!vp`{t0o$`%!00TjI9;iF*Ppmkef11x8Ui}X)x%e_?!wE( z-iM@xZnACo+FeG@(o1FD#y8lE(MrCOzmX%G3$c~;0q9fX1CWy1&4sYt&BfbjJ}KHi z785)BhF(u!jT4n*^`jhsl0FqYa)P5n>ixz|%6FgOTS1n)x%ea(!Xtn?3lSLCQuVma zMKF96PDoPI^l4gH&e=~>t6*5Z1QRl+Qca$`m4v4`E%|#5pX@Vw(pByKJK_D$`wXep zf9x}Q-lu$`T1{n~&L<@G(?f6|M|YnwhB2>a7Qi`MyV~4+##JnQew8qQdlCd&AXky=2q^l4<3Fznt!Y83yU!RL zm7FdC?e8+Yea0BlCdH@Qea1DUt#H!|?=#kcYy8lN875?K;O8qnPTidjKmp~X)NRzYA`1KfsDS)$F0zKR~0vetGTS5A*@tE0XTsHyiVbXWGm}zM{D9t|O z&%L%XZ^1g@GAW|jXUzJ>7V!r#-{o#)wGwxqF$k}aDg&BXh~e%t-ljK5A5qOcF}1CLy?=K-ol7-?*U97R z&S~c(<`r3vgZh{j9tJC9667>3Jk?8B&1emV7fOPhW?ste$m9|O4wGQE9G6Sh?v`Vq zxCq=W#~>54TaGJCEYX+Q>3)hM)7&0Be%|^(b$1n8vR>i%rd!UxS{Nbdgf#Stqn@CKedO z3Yl9$ZmwoFAiLz;io>tKYClgSxw?5M$roMAqaC?5*zDhP`Uji*YrPOHj+bhRkV^ zE00N3MCT&!i;2hqkq$i1TD5twn9eGsMSMe8^9dJJG6NOfgOmv0RuSQr6*lSoifG~H z2=@LbVR@}EB3H1%uiEC&(>lMf7MTQnjwhn)(n#I&H^g>DXDQ#8Wi+{{Cf^Nlqf6## zGtFzCyi)o8FuY=#w;#?S;puvl@qJ~`ckxb2jBSc*&gbC2xg2c~$1ELls9D!nq<8Xz zM9nTs-^(Icv*=>BQ?m|2?0)q;O)Q~_&0LbtmpS$-W}Rx4x(#Fe_&(v2syQcpGGctu zz%9gLCYBJr=MR2RooixY{j=d}l}#)$`XsyNYE?`uIeIVzv#OaB_-)e*VATwk8a)sq zR^7zXqfcH9vxbRfL{pvx%QLa;XiZ97t)_`pj$Y2iQ?*(~XZ7ey%;eSVm0PXoAIzK8 z?3G)+=;}Gd>KeI5(YZ^B=?_@QZ1oC_Rjq;1(klAJDKP6wZ0E~-{UL=Rnq7qoD zv{j?zEwG%3>hxjv@biG`bK%HWu>I*PxQwY@!^Bq-Z~O~*-flF>&z1b?z1a6vucfoj zTCaGMx@fM>FPevQ)k8>OVfB)EzqCsC#t@&3O*| zsLP4$!YUDQOv4_%9F1KnF}u*KlQjD)n7`o5#^8vl-*L=#^;f^E+jv!Gs*u z{q+Dkx&NZt(i`|5z(5r8!T7?{yWzDgGs#{>jXA=t_rX7RIgw5ibu~2c zvKhU!veKFu8p$OO!PZxZ-c#e~-qoH84ZNwM)?G%6G=|>3pa{ezV#_O5WoX@HHE|fE z2_CUgA~kKK-h2h(kalf&djJWPI8~Exg1E*d!}}zkoQJ)OL8Z6AE2nuo;Or5eu}~xR z;%ay!zWRneGJODEdCmI}&X=w}vk+Ty{yQU;Z%vZUJWZ1m$t#s$lse?oH&D{iKQXr?_+ZiKeQqslO5>oaW#gn8{Bv(J9N4B@Ddj73t^>@DPV-Ls9AudDQ; z&%w^SN+|Dg9B&7ppYSBTh7$y*kxuUyG>6~s!KxUdk(ms4p1_qeK8+zt>s{u$KR7u?$Q#|E=a z55$`8;wLn|kTiBM{5;2cF>Ko^(ooKu(|<1xN16q`CDMAsAxzs`x=-t=YdFwIbuF&mF4R^VfrvPmf*{*193=X#Fr2|=TDmIi;OZWg0J()DU;k- zLUaZV6S-1e2PZzjlgrsZ*jRG3^bjwW8a?%_$IOThVWNuIU2x^-lk161H(F|S9-e=t z8*8M0=^L48uvYq)zD}%D^!)G0%`^)ISVPvlgJ zdYRp8WN{Iy&>21IdSq9Kyq=JlDJoPa=NpGy%UHUP^v4A=_3jLx;X9kXP~_%@DG0M+ z*OfQ~=}ngi=Vr!xWX;D5G$)`r=fR7QbCqqth(hPym!r$I)k7lUIJ;5M|@CPi7zZPp(OV=O@%lGaGpodS@OF<*7nH5t?n|- zsBVLBk4s{<+p--6TQ=^u_zti=f;;v)%{&*`w%~O#c$4%GU0JiiNKpalx6e%G;#xYZ z`US$@@d}pAAcN;RN>x(E`+OM$Yj8awH&kJEZ;=CCDFFr#>AE(D)Y~IU)9MCy^1Qw+ z2`_&}&a0)>$3vYebW`XQb*td7&EjUJ#+QTL9FJ@HH$rV~uXzOQNx^kTz$jY&SoH-K zKLqw>JpL0G0Fe`o2iv{aIk4{qcZ@ckT}R}j%lA;WFfPRuLVPFVmCw&mz%#w?gir;r zej!4N>cTD}^2Hxt*>2n&LSG>{Ih<~Yf^SwTdeT_ZX9#Ax@owpARDlMG{IKe4`+KCD zAgpmo;PS(`$gd;Wc}c%lkArO&+%e%0nScJOJ>UM6?FiU04^LGcuA%@z_2(c;a1P)X z0Zj>XyOz~IRF5R8EgS7mc%nGl$`Nc9W!2nnsEDeI)-enj`Km5p6OWLpBDYh9vTAl? zz@7jD1vGi+-d$F0r(Z_W)L*%_`_6zd*Jbh6k<|MkWU3!FqQakCME9<{AUxrcyaB4u zd|lPxbYyZ==R4fr9_fWpy@|{xBByQSjc!DOClDE|Ms9L<=S6i^Ar{OM1Y75B`c0gX zs_J=u*#3mrop<19Vl|g!HY<K~oRE3=Yj8!e-w%|z!M6C1CuER*J&*d%=|nRJbbO^fywIlBtZj27!iY@xyCMECP{ ztE45;BLecKhz3%$8w3nw@urA_yooDmsfqHYh=^pl%tV)~==XS+l9rq3N-p!H#z`ww zKWd!xI<+$|H;YI`BT^&nRgk_fFFQ;6p(It+ZmDGmtQH}$BTuQQ6e&fH8jU`+3E*iL z^j0)(O1&xh4^$H=q+C|0H=(^J)YY}<^biJ0@dvASsiP+R0QkE{NL9soO<2+hwFaIl zNuyODm{ORsmQ_DX3%sHpf++P+4Pmr!S$v-81!=JN)gFqhdb)tEDn2ig>ZR6U$5o@e zoEJq&{U~u~`_V%$ku@&*^thSK{HlSv1-wR<6298RVH+VyI+gdDt+yY5l3R=QURFWP zd;`L1ml>H(4>j{~J5@Rzc9ru?v#oq3>PUYC6ubx?@!z*Wm_ev zQVjsw5R$YpB5CF5nhw^B^Z_o$K4SpwS0qh|LN$@Y92d0vjE4G+b44;L%DdpGhGyOY z>waOzP_82KB066?{pPtMS=jJ#H&NZ_`E1>Qr3dF?bT@6O0;@4y$&6L>sVQ+b_tBhmT}QQk!>kKUR~awRju zebMJx@$xcFjJW^@L|(RuWkm1UN6dL0cXX@7DjTd-bh(tgs%Vs1L$;TB)?3s^&kT9i zBh){7kclv_reO|ja~ga3vxY=v_nK#YIwRVMt^8S|+lW#8S(DmG?fqFZ+ekI_EFmxD z$?Gmk#Oo4G=0Wbp!-TOK3Y+n~4eDo6Pha9+hz z*VuLNj%myjx1gC{^2!f@^D0IL(hasq@@`3XB+An}Btac@Bn<9|{dpJIIY-QqmER5L zRou?7(XvJ89ZqiY1K_-hgGZ3tMUrfDGZOc9w-PNJ34{04zlqPQSc0o$<6bxEzQ8v@ zavC@cddZS`N^Y;p8ftH^p5v62;D7shWG%K(|8aZuc!1AtK~Zmz*9U~85fY1x<>=mC z?fs%z`26Y@7zu3oEK7G%=l1Hw9ptWPdC*$In6C8*!>pxJ5cl@#WX6GCb%58+)#lz_ zUG$nL8V)ec1>@FZ=P|DCTo#C#{b~iYI}1|X+p8P;31bWB4wvEGUVVwQBk}3>_UcEZ zedVUR7dHAwl{curK#H+LvR0TaHFIvS_FHH-by*Oq3P~HnxxLz+>yN5pnKnS(UD#|+ z?CsTS8gktvoP6*p!ZB^4t?k@i{pl^#3uzgI+l1s9oWkgPu#c~3XEkksu)B~Z=l1F) zY_!$ufX7_|mmcQ!>Lff(>MPQJh{x<>T)W6!-tbYL5Ld*A6pJF5+pA~S+9K42)x>3j zo7=0u?pLO=y}<^%xKZNXUVZZ`$}t`EnnDcs_G;ZKc5@~#?Y>u7#_sOz)n{LzxH|#% zc`CF;-P^0z42SU^=$8cUSBoA5??Uun^0=y*hj# zS#|>*APm#YT2HF7w^vW^qUIAp7kLcn^>G8j{dwdtHp=QQcn^A9-8s3v`VNz|FNf`l zFCkK1W{_C*HR2K4z%7P^*wX^H7ZpZ~IVr1z#Eq9788NUsS2LX{>(K@>!!SU_o_hy}%psHh0oyP_Z>iXwubQbbV% zzyC8cyL*@L`o3R&zuC;r^Pgw>%YxUk5hO>$3$<5Ys!b3HcVZu@&v50s>5#yI*C?d_k_wNNUUMVckze_+e zsbc|Wz76SPEHYMtO@Me~k(=Fsn7(@mMP%PD7FjOAaywCBZW*q@QmU`GiLRLCq}1eg zPZo|Y*E=b-j6bPMA19@@@nfKs2q|^del+}uOO}}O9TgqkSp7j*QG!f(RHFF@TJ09D zC{kKoOE1!!1(iV?`}i8X8i%~I5ai|EF19=P-4ONiNNQR(u~NF6>Pk)L5nV zN`5~v<=W&A><#QfACP3E(pHh#SY$nCVewYLg5#v5WL-1ER7Rh;%D5q}GVFr_kuJTR z6#JM!QCqSB7ag`G`xmV#C`uM>D%z8yTe32eOm_4t`@?0`5!LfZF|A9AaCe@v%$yD7!=mh$ zbWC|E1gy*Rid!CCf~_WBNu~s^ni8a#61-+)NtYvEEpPc<-&f2EFu#~f3%~{9PBh@(j z&75^ky{a2pj+?WtsrR#trkpTm-BYJ-fIMl=dZuopgQom$&e*wl3i7l$>zjJ^Gh~05 zvw^9t+j91&IUAaKf_hImW6rWu7Y!!fU*>F7>YF!l_P043>s*_}N?7-%D0dD$O4ry^ zO8(XSfq&IruS^?P%j5o6RV%+nj(yw7@iw{tt#8^xIODBKOIsoqt7WsseiMcW(@chv0Tk}VI9lp zs|CHU!8@=EjEu`{dQ`?BbC#02o;#q7!RD-Fu%krk_ZMV6bzM^=!-l`l)d}ZnJ%_0H zT+yi8F5(GF5p5HZ_z>OCHBiQcFj~{;xw%>>-R;{W3_^rz6^F-!dP`KBFZx@kN3;ISn*wd; z@R1K~l61^-x}|$BZ^0)$1p0}?8G&>rqg)m`(Jwf#LdnHK=|N936RKjwErYX^lvtza zo54I*dRPj(Mk%7N38L0Q>YUjNlhU~>E75tbBYddHOj=rt&Xu|DD1GDp!DyHYacd&w z|9FA-D+V-AF*+L0KY)hC8`A+X9l%pmWF{7QLxkcDMLux7nI(W#tnV_W>M|muYx3>Y zmA4TgSN#cg9+xa)X*3-^T17dH;Y@gR1zv>X+fa=YR4vY$c|zN06$*b#nPb^~5Cq3F z%wjp0kaC?3S8|)n%`egA7j$Cd)I^BcI8S5~soD$5E3xOHFrSjcSY!=x!s6{&R*F<| zg8cSJ9eH4vy(_0q%=NUZZ5H+a5IH?7YZZr^-Ab)Ij2@|#G$p?VR`Td;bL>^Y#Yn5* zk_A)I4PEI6axl4+RCO-JLoV9@g(Xj!duD@|ZoFsSg~pE#HRESLfH!__A^Lnt>@=Zq zeZ%31P+?kKMURLIcl<1=p`76Y1qe+R zXQ1B2$hzbngpAYSQAo{|*`!Z%hZobU-N5 zk<7#*is}iAHxw!AdNZXLGkz8lP)1}41C*gmIZ3*<>fl{C19ZDuN@(KDe1m7lU{F-OP z-%m-et@-_Z_y;N(jy0d*)+D2DKz;+O=E_R=>jesl|A&Y0HwZ+<|Bd)B3tWspLoFuf z8AH@QX3=9LqGsIADu7EqDQ7M)LWQ?8@58Fq2-gd6#sbs&faR*oUg2?6!qw{>-tvJg zwF=Wt##lAyG+mGIfI7hOun;DV+N$bah>7as7iDkiUnE85yV9r>*U3`Xay^wXRizGN z>s%|T0@A?8q=xu~t+(H%IJc{7evx#pM4ag(R@2>Fx@SD5%GGhRGZy3~ACo#I!S~vr zX_s1ho{8gb(RLrmY7cXXJ!&tj@_uS2pk6|{O$bvpS!&!dbnH{xO1e6}M*4lc4o!Tg z#LQ}RoI{$lAWp}ZU!&uoI=hiOah;E{NUI28YA;J^;;?E!Pc%B(A?=)?qXasRsbx&d zrt*d$9hsm*h~sMY8hW#?-dm9_jMp)BA;h2Ru~TjXY(V-{ybevARY|K|9q%Ij#Mg1X z+QOWk@vl1ApZd_L{DL&9EBty@dp8LL1DO-pVqszrsKR&n!j$$1FACJfB}oq8;7bJ`g9= zxs3%nzNBn!x5Nqc)neH|P6}_s=$`R~2yJe)uwvlK;cmA%85dJuF;)$%`C8eSQL5dI zsf9HIuO4?}))JvEXO>zqlp5L=tW}YRzNy=w>V&W#&h!(FnS;LY$x?4*Q!#sk<+=SZ z5vBky@*_xgb;?m2;bV3bGEN0^N4XIm1Af7eV6m!l5gkdI!%l@XRZx8ba=^!=xy`7q zt1Egs*PHV|S|#1TfiHS$b!9;sC1P5gxg5w+I>OaS@7}1K zHabFg;NcQM4@=$M%t2p2WT~!Hc1FLXiWA*(-3)x+f25!zj83X>B_CbTDLf1O&i|M~ zF|~s(l#v}!dtnZEiuo}wEf^V4rwB}1lm*#vLTYOA^1A_$`V1{05ZbEqLoES29H5N%?n(~&W2nwshc5g7s{RDzbXN? zAn-#GQ$uPU!pA%{XwbltKzDAdrAE{agzxzpE>XkA40SS=2Yzm5T2UQDc+}Tmft7)u zTA4akAuj%l;=DW@l5zY{VD1T?Zj~geAgnEbyHIIhL*Q?EQEve{A-pDDL#0NP;)%c` z*C?YQ8)06&1`TWqtYgj98s;Nh9IxTsS>)llK=)j`Gxj*bXW{{Q*EHkBz^1h zdLQ9u@qpa3WV{mSQdb$^7{XINV7ALMUQXKEnAn9D^Aa4+j$mm)>UwVxj>nU7`Y~s* zgsZv`EqqFkLZ1An0CjQb@y@owGa&{Qpfb)u)eh}!ZK>%H3w=s19n9#@Q02J0&zKn6 z)X4UMN5EdZ5L#Q+q9bLzA9`t$JR$!%8G4+_OML=zz{gg0MVlPRynKu&qiXQfT(Cbu z&U+XQEpG{DoC|fuJR>uoD#5&bOrshu5#N1E)1a7op5-XQ^vCp({On)fQU^ zLm|c%pytY4+k(vno8kh9dxg?tELziaKuxs?p50?pd>Ue_ugg;1WLE7ET*WG)bN?m8 z_XTums#CDsV|L>B2O>fgn|rHk8#^HxvywJ4;g+W@R0W7SLYaKoGHPmd(h=@ms|wW_ zqNlIRQq9Yvt8(~udcNLB9|JMTqntW}JJ_4po!4=Fqc9b({*1c`9*eB=?NqifnIP-@ z*^%X$%kBR!m|F(3xwDVd^yW_ZPv+%V>itCHN?CW^Kw|FFmUU+jV`OYsO34vxLK--J7kITiU~MFA@yO9Y^{N z)lWJ>QRw;sVy4iVa4${UnBjPwCg;%YB3iK?L7W~ASt*JHWMNMESe zLD`>5zf&f@pxkey-z5`uP;NKU7t4ftgBm?(tdqW6eNQHi;F2Yi%IRyuA5`irfil*O z!2H~2Js3CYMpYVVb)RS@t_$T0MIaw?G0sj_?^@gIUGW`HjU5*vtiZAK_=d z1`BjoTVAmmjv+kdYsgTtiltw#8eGO(1EQhWy_64UtI7g{)#06dQ%rz52pb9DmO@ss z^jy_)lQJ5*A?y{eK?4(2>^%2rqG2q;$?+OwnM+@%Ht@2D9wJK+E{_LfnM>cGP7UQH z0MYO)!k6L!S?1C=s`+XBT8;ppBitJghzULYRn?en+ul<9zaw<$Wwzn_NwZ!eA3aY0 zUcDH!&?NwsF9;n~yKZuvY|+#jpo>7dKB8JvhU)qy>4gHL*E3dRZWszN)>kz_(z8^v zz$CWjbn`8Mc)+LhI-pUrT%=D4v~P{FXFy&}#84(nSNiRN6{)t8c0>H&Q#xZ-&*OnP z^H~A@LRxsaR|)aUj(n{w{pG;n09ZMYT0SN{-YzBSI|Ch=*Hn9?S9%0_kt@9P4+AYv zu*Dff%%oQfKG?_Reh5Tf0bQDE5S*83b3Y&Ao&vhIu^6Ra9;{QsE=HRmUMZkU zQ(3{*J9wp5I@}i!2lDCimJhwpB=hfoEHVGVuwpc((PELtbcL|YZLvr@@!C)VLXjSR zK(;1^NI*aB9V1>7I#s+A2+iC-n{1bEoVrrh0%rCE%YzOzJEtW9yq(jnMBjl+u1jd# z&gm|~zVpJPjga~~r(#(;?+NqmoZeT9MnI@C9-#ek$!$e-w4$hRcTQ`RRnA(0S^{+T zq3Q-QJEzO;QAX1sfbjz9OkQB;v~>(sw?QoTDJgN{&Z+ad<1COwpMlyUq|TYQbGnWF zTJ<5}`}1khxpH?-|Ck1K3gX{H%50eSaCc6{Ln~fJUkXLake9G{V>%$F145CRWF{7A zAwuznB3HQH%x2ODV|{-jpp3{8c236;It7<3;<%mD`JCS4g-3tE>+hUC!r614&^B6y z8iy%OEPEFMYk6ox%G$heP)eYCasEPG1s#i=;usch&&wsVB`3(QW^2R2N2IH53fhxk zQ@F6m>3Nk_arjPDlsSV=DX(i&cx$J<^vgjy4VNq!kIZw_2a`)tt+Oj0Dsvg)u;eKg zSuI`(&OA7qn57#xS#zO5qC?FfX$9a7k^@9Pj7#oGXxt$Ai?GmYH$2)0sXs{45mfYq z`3A}FW0mtVu~kcm&O!|n)zQwP!W|?>*D2>sfd&DL_MvMGWCqEabgO9|zA;mr&mbsdMHHl1u6$J4twus5ULFMd!*LB%!xSt0Y9F zM9MUf^eo*{x{HM(*Orm?>Hr!RZ%ha9^?CwAk%!1kEHY4p;tfS|U2mpzRR+mX0?LRi zVUXNQ=qg;Yh~oyyQ=Go+g-1`|^#{rOobB<1w$Z$-dLD8y7Ah9`lVe!Cp~xVebLn)k zNb*{O4-?RT*1S+x{MNkCNc`5k&;q|_Ug$c7=Mzap?V}_=;F8csN@%o_S&C)ynEe!?O@sl0OCih)^ReQXB5z0ft`KfMG;v(j{FMn;m*pVR zqwzYddEs%c35||0w~fVco(^kX_$I2Xj%rBj3Ssi$nHQSYRL)?XN>`*&UE!X2;lz05 z$V4AdIdMX3Uiht|oBBKvCYl#+Y3(NbkO&ja3+>sHH~HQc7t@*-TCx>wiY;TqjcLsb zPv$x{w|~b8t$E>*=eY*axy^Xkk7>;d8C7`@Mwhdp2ouc<7jY45n(NxQnAW_|Xp9?k zOk7NBUKsM78}kk?re|Jg{VFdGl4ejnf^aL&v`?IQL0{c?=7mdcb|dTt{>6{rn-^>Z zYhF0oo>z`^3K4GB(r`8fi&^tRhxMkygQ_k_TOX6=Hlx}zFC5x08SV`;#OLgAwdRE@ zYrEN;337KLrq!7%1JAth(h#hHI-8q--;@Zt8|v<64$^RpV{2X*aL`TRJK#V5BL!<- z81b&MDHMN%n+V*6Q}E3T&0yLJXNH|`Ug$yK5Kj;dknd=3nb9nQd0`Ubn|)-kk-FxE zWk}X~QoD|M=7mT1^Z8UFsFy+B^04RxQR0~wZYiZ4xqMRJLHs0?JH=b`g6eBpUMaRu zA~;(P&%E%@MW)VG1%%ZFFd97bLZ2R1LkEOi1TZz>nHOsF)S9%K8j3L2*I>3)FfSB( znqLwS;8uhSeGL}a5Xillw><@T1mTnM8mxI?Xit9CK!CRqeiX04niu9>p^S#Z2!D&$ zV9g87D%pLPLXYxj6V9tBYhEbI)!tH;Z&d?f{dmBd7tXe{z*Pu)_<(0#$bFsbscZxj zMW`z&DlJHBS@XiDi&#p^lExy4`+Z7}LeISLkL+}zLXUBmjkB5aQO~?kZLf^#+Az%$Ip4hS)LVjdM?5GIiHbhgcyLj$BpFnb zLFV|FT;sSzk>GQeQ(-HRuJ;M8!!s{r_NI{1D6d1j?^Ajf@XQN;Y=t<0^rTNnO40b_ z$^}avCArAs?1ACps~|q#CqoBIp{*`RTOXTBGe+g$n-@-h4%Q2#pNG-VvR8w7Vdqja zFR950=Xijb?mY8Cw>fs;tb%wTQ?!)q)nHzj`+?1UBZziFCFs&rr(kc&sE7Rx5F-lclD!(t z3#GZj?L=Fsn<4J>b=fj%YIV}5Y*}6{)CP#>d|j5Z=7o~?*)jYf#4e9A76Z8quOsFK zxe?aph20eh5%Yq+=N0pUTyE?Aq5muFgnO-(dj+{Oh(+XPArvV=NGQ^kkg#}T5xHE5 zMfyp=JnhZ)Wrh$qq;GIzky}OB1upYC3XDx*=ChtnL1@>ea4#G;Ag)b8a%^o162aOO zPsvne!wlIv4k@&eL~w<&ZZ zaG)nJi{D}xH|j<;4(SY^ctC`%O=0S49{CfE_X4cT2YEJy^w0U7NoqlDh1em~Mx6`K zrch`hA3GJ`8-xcvH4H;p{IDrZtju?y1UQc{^pvN;vnjmWO&JYk5mphv6x6dR?737K z4Q&y2@-=uig+`w;GoW1!LYVDq@N5ceC-C!?0^EXde!K>2Q+TSo)$kC)$Ky3vo5ELY z>uU`=5xyU^9v0Ngl$RxIDpmHEC@M7k_SnstD`E1JB(QCo=sux0+I}Ii&-3JGq0Bi&!&({JLpQP3DLx- zbP+w9f;_3Ju14D5C*s!{Yg5Q94>l2GwvS1V_iYL*UST!57wIaGpkUUfa5c9mpGn7k z5#ehBxLx1c6u$k7-7W$4ApABSkQE4LIxVVpRcMvbJDT*cY|A ze-UCw0bQDE5ZpM@>iP!aNC924wqR43&I6Eo1qxFCQCwoaG?f)>Ti>og)gc-Q6;~79 znxQwBWd8k+b>%-87J<1$u2v+A_xeMT1vDVPe?drC=DAqpLGhYUIff$7`T<)tu|oo$ z(cX{5YeK&g@7siC{ydvLQM&PX`cFaof(|uXr&9pDtzdmLdcYw3^7NjwW2yYM^w05r!R3m<{(omIXvn^^9^LS zPB*MoM$;Prp9!Qhd4a9dPY*Gmeu6mTQ&Qr@t{QIFmDP>vVHbWVH!z zEi#jq)}nLeZk;~bm$a^f7?4Pr9n(w0cI#9;wBq$F^cWIA!{X(ANqv-nP-H)u;l~O@ zDBe&+wkNbVa{w4yr=4D4>r`Z14)||2dfBCz&_VWh0>3mc^bx<}_P)Dxr;i(E&Xuy`|%o1S-U^M!hz4mCaRB!JiR z?j`yv$xopdO(E<%HBS-tvKJnWBK3RT`v~@U!hAh1c0@UO2-OJ==Y+acR7cN|tk?67 zP?^&NN++}e&O$*+$9<>f(@U(T764rZ(wV$K&%5h4dcz=y@jfLbPV9N#ujO?aN%Rgx zONG=q^LpO!B52t__!g0ww6qqTE4SxuW|XTBA-+naOe0Bi>DJQi#x^|d7>b+$4U0FX z17bRW?}m_>Sma{L92RdVBEKM}y_wSf^t`nMlo44%&%27y9=K!?$Mw7+oaTAq(MRz5 zJ#RK=cX~qGXkJ!554ore#qaxZ42w4unXYsGssseev0XoobJ?!nzr)|I7lus!e{R>y zICQt`e?XhNT`$${Zr4kHb+_xKqr2Pn9mtBiU4Nzc?RI@P@!ReCO#I$<{qABcQY518 z*h2f`l7Evk7Z{;tM!0;Ulxicw=L9%y0lQs)sE2YI5w1Suu*(O$?RrsIns9#qmg65n zm^8fY`kd*qU0>`aF4}NL8kOSu+x64gD>O~?+f53Y{dNE-@aYR`KcU=VL)ntXIa+ABdv37Yzt zI<^p-zHWhWNT(#|5aPJHsWjVcnplSP{&*dByZ+;PZneFDbZfj0yIue1Sy#tyr2Bmx z-gbTFhg|9ERL&xe>I(O^>#rE$Zr7J&Kfo2*?fM@tc2jR8!o=?q z%#=MZE~eeC-^5D>rq~PPV%qKcVuRe=J{Bjm+w}_`bhqo@iWA!H`lVBp^R4a~Kg6YJ z-v)T0qT5{Z*%ddpcDw#O`vE3qX%X6T+U@$C>{yzHZtlhOw(Ad33GJxcpvpv;i?icM zs>AHr>x%_%yZ+Y}%0`$6ywZ>0Z`a!hcDw%FKiw2w1m59Cu$bMhpNiQ`9G%MZ`U7&`OQ=8?#1&qfO?Ih<809b zYpJ3zGlq+>U0(@tJs&A ze;35PLb+4C-L79>*>n~4G{P4>HE7Vll0fSsrbg7K2>19JyzTmGLrfj3lL-IvHF(?g z>PpjUs>JK;E8x65*tY@hs->LksdUv4VG9AwH0W*D-uy4Euy&L~Tp!#WE z5)$A>gfrqbXkb%d3>{o+xDVm#cnx;DzFc{`)wc!V>+yiyu0L5 z{n#?BB?A17P;K*y>225F`90wo2r7zD7cnX=NL}0Q`j1g@Lpi8c5Lfz?9);d^eT@dT z!iPZQ6`<^P{Syal!_J4e->2l#A!-%c?fN!TE&4pzn-@a8?fPO|c?Q)!n8S&jzg^#t z=K_Q3U&JYIc;(co%E8@?zbKd!*+v-y zG0ms+EZ}X|=iWz^E=KyGPe@A9_~gn3i$!%8EP;bZTmrf^RWwT*T4Ay z+CtlT5*p`qXxS`byMF#k+k{mRHt>La+x0(U;FZZpb%n?h%FK3lliF_ApWk5XU_8Xk z0+ijZzxjTf;&OSAEahs29%NsBZ&z z;f;EUU^nXJPNU#Py%aEEqh4QDn2mb9?3s;vna1o!z09h1qh97uZ=?QOG9iYdjfrZ|51!kkZ8H^isqq-Dn6`$xRLU*HnExUEyL}MF(tMWnKM*VBt3d|!NH4I{u zP?(HtOHY#10_9282)f8oZ7A@0rE4hIbHt>}&8g>PKOf z)EbT;Jnn1oHtLJ!a%U|`6oxF0vsLA7)W7nBa&`z%6JY}Z+*0U$_+0h+JY_U=MR;Aj z1`SM9MP9HPMkAaUufcBAUo*+BYKsuw6A##p`X=8i=Sj)KCWM>g0lQJ(lC@a_pCH^F z57>?R*BdKmpw#{egy#g%Jt8_>n$_K?SD#rZ{cZL?a0Q{G>W(jYXGb)(0O%x;t`DQh z+o<0&)2@+&AV&MDZj$u8jruOlZS&m*vD~LRlw;c0sJBr+atTR31@dwthBEu`|Gm3- zNI)uS7sPiyrHklo)X$4C;s1g3qIbOV>Ez_VqGmVhKZ>EKG)Q$HlOFGH)K`2TMQxB? z;SuD;Zq$caHK$8n1|l3GfZJ*8Mt#qJc;rohn-Sg~56IfXM*UK@1$56|hwv!@;u_4` zs2}wppXU-a??CMG)VPgdH|if7Z)@gPh`$R^cBB4>aW=&?Ze+^g5>vDr^}n&7u2XCd zafMI`%`dA88}$cHSX~1lMitPdsRqHJx7ys#gIHQXm)?TEJlN_%yY_5^*it~3rm})7 z>)EyEGl>29ba|_V-cXYHH*uprVMX~5h83eWk*hs)o!+RwjGB){+7J?!c`g>|B3=_J z$57-3KVX<9MoB;)?VT)M6MBny#}Znhe)?R&}Gaf9VguASos!c#cT(U%v9nK9B zUR_;ISPw7UW+z>ZXo|Gf1CwD#ARXfotfQOPlR~|&rEOMkL$=(Ln-8{q`Xi-JQ)T~x zZ20+MyF@$#wLKqs-yuz&r~%m|b%E9SHPlauB-j{RSBDB`FsG?cUr3N-!+cYv|$bDG<}?Jl+&>Fy<|36swjP_VVkzZk_(_x>EjW# ztA1Ec>rtB$tzm679rmgx$f?rvBCMm9BUtYV6RNafy_L(DdS6ERhDT7cC3Q%q z!7=RW`bE0E$PRh(XbVxFrdBeF8a8^CiAO{K0u&*6n}^{rK&Pt!HC^}h=@%vlkw1gOo`28%k#pL_T&S*(!D|b=$fqXAOWV z4^dmFE}}YGTU5A~y406>fKQ++0DAb)Wd<^qy4+8!rd)uV1k#zjfW732t5CHBVx3P( zi4*N53!hca-IC}lP}_ynIrHo#AKXjl*iHE1d|Gs_Tzg5OU(j$4q7Vt#97$TnOfsQd zoQIZ?^H8K3^00XM{Z4(9fKcRiG82njE<*8!BHdkY=2S53B_{|dBQl1AZ>gJ3=qEuJu6 z&%65zE=Uoo2RLjHYNx1YRB!@3%h4t|ff1$V^&Vi_VqX^KMuRH5p<~ zB4rv$noD1R=ynT50MoV1s3ORFu5$fsL${9o{RWF471XyDM zYpJW0#8Wu}Oh!1<2Rut%gHw+4Hb6kFK)O~4lZI!hdv>PS*Iq=j!;?m(xW1+CnQ_W0 z*$?uwk4X*rmbx$(cILju((_jn`oe!8Rf4mM&99HfBV1Hfb<1eHRx3XS7?29$a-*a0ahO~kZrUmS)H^?iHQNdZbZZ;hv?gUVryXSli=- z)>3!0h@1MiB22W@wcf~YL}|7Eh%nJocUM<8<|VuRnATD^=q@+QjYViZirEV$A3Qw_XhQm_#1c6&Uf%#s^(=wy^FV=j7c(0GVVx-$UGKuru zu4734@}zbJ^DK3h2J(>)BB&C3dG!xxOZI^%@ho*uw71{wY6j6(D0hmtmb#ChGc~08 zAROeWL4&o_y}QWNh?a3-%IX7EcLpy|><26`I z-Gl-5?rAW>oOr-m>TViJeU~E-a}X|w2dt%TB6n39co^XmKHypE`gJ1q8wfrWq3MUx zg4DIO)OBHNb`ndt`U&EcPw7$US?Xq%vQ1WOAJ;!PtIJZ>QYRmTl&-HXgXri}a_JDY zsI}CcU1P?f>JOH8A=InwA~J}!pAP~-L45tscI9*W)GvGWw#VdU9;V`#y>&0 z&jZYK=e<}{aDxDANHy zGab-c>YgoXhiW#&L|>PsWFHhuT@6yyU274<{RMPss#EaCFRZTTA+{CJCHtUQ>YNq) z!U%1l_Cm+I@{G5VbwZ7~kYFTpQme zP*>Vg_d^A{uPWcM(%>EFyOXv54F(gd(E|2}RZu5*BYPB8z@3 zB5PMzE~feZw=Xk%IN7Kw_?a$=U@di0%7UNi zk^&}J>h$7hEOmNeHI_Q*PS#Q<^Rl(n$^7YA>gIpP_pflt9k}p|x74j8@HtOlmc1)s z+^8GXPNbjsL{AaAmb%ZGWe14HBLJuKL7t`VjR5t7P(=@51jZ!~)4A|0by5j;92UPp2Op`qG1`r`+W_br7kIp zJ8J=+NBD}b!L!u8nar!P0(^mRU%UousoT2HYWM@;xp)oMQuoT$T&#(PjPJP|!g=*z zEp;mw+7ZzdVViisTIwDP@ck^&a6Q6-@qo3|J^umsyaG%^cyl~pEp-i#^0h3f{Ra?k z5I|RT^hUxwOWlFDEwl~bg9}1ORik|ja?$i7zzKnLs~Sz7rS1miAiYKw`GE-pXVY6K z>3NpAj|bW2s}IrMr}VV1QO{B*oAW9QWN0FWGHa>3r@pPEnGg$nN*B?y)NNPjS&Q@; zpU}z4!MD^EKM3|V$mc#LJ>Iv}z5NEn5v0dGg1lHuUD-{1;^I4i!sroQUXxo(-3Zo- z76Q~n*dQK|wFgVxajq-c3D6Z`mH=@L=2_}SGvVm&Jsx7Fr^amzYpJ`DiBk8DUDIp(OKf;%B-NR+Rr> zSTS}Jx%$3lSn8y9nyR-irGcA0(VSo7EJSPZleR*r0KyWuWNi@z4cu7%=N3lpZkg&|A{Qi-6O{g4s@ZJxIYT_mdNYdWh#A`yA ziuY1N`3(s2SiIy!exIRHRWXrhYf7UU#+t$s){l9$QLW*QEMbvgsUdP&+ng2+mWr&y zbWyhv@#LoyODIv)sDb(e{pmkZX0eJG(~Gu3n1lS*sQJOs5^6~{3NBMsfg5@e?5$I} zIzAtDjfUTbk}Hw+@d*9vR^}(J(pA-up&GyOGS_c;5VJ2#4Y~%Z$s-k@?tysFr=&^P zWS#dJK-2F#kl1E~A0z^C*1a_K%?{8OW8dN@9*C-b1U=^Atc?dn-m)>1(o+@w8(AmvE~ohN4zne=aB-V7AX6C!mbTxIFX?Hw_7GflC%~ z-1d1_PP4r5=+k)p?eiSYZuEq<(JDN3nWU3_9|CK*SwYI$aI*%FUzYenB|~%l%P}n8 z%*f3sDc!i+u?zJ)9cp@BCV3J7Lt)|rgn*`FCyg<(z%yy32 z3GszbNr@AC-lDl|vq_@ALY)>;=gjMQH%~=Ym}oJaO-pOhxpI46gI^i)^&na%Ql^ol zxpX7xb_+%1AJ2b)hQ-Uz_~@eq@N?;8CKj0@Lh*(ob6jtxv_CyBh<&n*$P#+qQ(!OP zl0_WX^WGxtGcP`W!3YLi`$|2{xPw`;tfSM={%Q{fW{Tr*e`Te?C1+W{8g7mq zLG061D@gLGj>#F0|ZnLq}K~!((nv7ckUCz%~&KidD5s9*Eig}!{TR@+z0ZI zk4X*rhMS~MMbpcO-|`Ww$r^5g*SOg^0P>5ENu9c8nO$lHw^T#W9Z-?q7&JJWYx|Qd zd(=@KK?*@E?$Q<-2BEP z_C`m^<7@)sy!x<)oA)Dpsz~c-jHhr&27;WzFKRz zIsKZO+v;&bYq%+YJvV~7oL7j@=GGc+&a(q;ntVuHOl!Egp`jadc3ezrxRL3^#9ZaY z^b9w%TPo*a(hRCC2tUG^_K7px=!*rxb!5? zKjUl)7PE$%*LInX5>)L#dia<$w;9!*;pX?clHnYfNj_(Xt2NvVTH&U;803*eOsmWH ziq+Xdj`Ot6<{QAfC4%mTy1SW!el*`R+^nqQrf?ECa>^^0WF#R4`-;_@pSmej1a2k~ zE|`LExVZ|Zho{)J%3!z|O5h|8Zr^~^)+~gn`lX^;YNfrd<~xArqe`BT$03n2v-Z> zE>!jhS4y1ay%zztAbec_w-nZJvpkF6k{94Bgx|$$u!ft?ba1WVZ-nY}oCa&S>A>Z# zzCn&5tPl@a!_B#d%K45_s#+rK5D!?x&A)e%v;h4O4)p=gaC7E$gwqhr6QM3*R9cYM zvWAbp_N1)(+JUq=%1P;1#Pm&C!+(lILOMTQ<)y+}y%HJ!a-3yvGCb zy<*kzGcy^fO%SgLW#%IL`jIu<%;&mD_q#734iuoQ;pXXfc9folxaf>m4|kXjXbm^D z`r4sd9-_8TCPhohwit$+9z|{LJ3(AmK$oUE1rJffdg2%jF|~j$*%rfav*iUU08%Z3 zSmW!mWz^K_r0(x1=K-N!f_T%{Whra8`83ULQ-2F_$fNSTH6_>J+Hi9Og^3Tu%jLHB z(7d+t{4cN*&Suu(Q~1;(-^NEFUu+;G6zNY$SiG@_TrR{SVy6tt#dIt(&6gQM;8;f5!Ua1$#=GmD0<2(R-sc!rxAt@-_10Y)R7 z=xgu{H>Yn>P89(bA-pGEgSN}$s;!hlYuJQvbG!x(OjPgp;9^ZQe1dRyyasEy>AlOY zY9|n$i3hCVX3s6Ww;&o)|G~_H^J>x>Zochhfy)p!j|Z&b<^)s5i&FdYZqGmgbVWs9 zm1cEcv3j*Olej=r0dBn@bW}~wVT~4OHNfKn=~gwGJj2aZi|iV?6XFwJ)#s9)Z@8Id zJHXEnXMIXf`x^BOH+x?s$>QhO|H0YJ>xIEH+&nwf)h4_=qKQxmjbRNpMMJh`u7&7VfU<_0 zp7m^slOg5^71u?)Z=o%V+5xo+;;{m{WL3d%vp8tS|HH(mxFR zNEb?;dbk@S<=daZWErVnpR+ZO&0(JZ`5nA#^-sRPaVg&Q`(c9mM}arUZ)NgIP#(dL zskTh{op8ybS~=xR_>)Rq&)G0fV19!$P3^!Ym+{Q~vN|DCGdbKU&{7>cO?`e9@)rgS zB1q(`IjoPD?`n(u<%9PqXO+Zw4cVI_H>sy7Eq~+VyLs@PV6~sa&z?Nmg~7!Fb8I3? z-d+9(-`El*K@Np+o)RtpQFw^{VW zqPi#6QxoC5u6Rg(Uea{MpH_=k|KRiy-4%7O{FR?Mr2xw+(G^ds_c{3tmn^!KQ_h6{ zq0~VFk9z|16TmhW6%kZUF`S7N9ZXyr?q}ZQ&p3CEh5KP5swx1r1sbhYXPAB*Q1`N8 zEE1p-!fWCI-I2rUm*hUv?fs%oRGnol5hdlajM?#$)Y#>cQEh?)}!&v}5WM)&6GYBQZp-}`2eYDJtW zaC9bKbm{I~TTLr$sa6DEnUC_ivFD*DOFP9P*`Q&mPhKbzuL+f0#UfJ7uy}ixr-RV7 zQ$k+XmIkL&*sg8PB3^&qPRw_4$r2;3Kkp^%s23hhN2(8|gNhd2Wv!>alMq4{=M$IT zU}vQCl;4f7mvM`HLAgvldMlYxscH99CAZ4R4OA?rZxQqlIJ&>&==7A25L1w^{DR0& z`S=Bq?`1MZy@K2UxD=Nxzy1_gkcS9+-V4`vhEY*!3L-jnK|~#%`c6U!MfesrEYhCx z12vRGz7~=-cCJY*hrCW4Uykbl`{0u0`;c+v$R+G1 zFWi(vl;+E|s7ow|giwwRuwn7{%q2&Z<9h<~mqW_tmP3CPL&_l@r{@M)x=Rk%zpmNs zR%L!~vt4ao!DjlZQy|3Y|D=v^NZo!B=}2PI?inhn0S_bmtlr?CNK^+7-Ehf^i?OrvtGCv4^==+WqZ9})amL^2q8x+h#QO4B1Tx4PBm*P zr&?+yc`D@R!c>rWq=HJ#;VtXb*0ZPu8Y0+138+*K5hvl21y<4H9GSXBmR45HLvWuj zl!rT_XN732rnd<=JdIr+sd|#b%N}M|pr)$ROHA2oZoMMlbSDarssuFsHRSgm%>yuD zZq(8?1jwGA;{qu`%>}VZq~UDNCCKZcYxe*&$bHbK1UQ~QL{hhTBM z1Js%p^u6YLS_d3aKvziC%D?xb$aR$j#Ug(YrYk)Z88Cwz)-FUST7(zaAX521I5L2T z!4xqM{p>)40lw zi%sv;DN@#3QwnntYTgsC#Gf#T-@Ya>ibX+iS3L%Hvq29wb(Y z`R5sHe6}H2>MA*1Fnp$*a<{dS0bSw_ISp1^shCJ45vAmj^4BB>l8}n_Bc4chui6g-U6De3{_vqY!1pi z8rD%w7F|PDF}$RSG}y&cr&E>ck#Mem5roAX(%w#Q4j}C&CC3mviI!^gI_GYW>Yzlb z)B^}Nh{E$3l4=sh6RyRL>_x&~^JElEDx*nEi9)rD!vRm|O_MDzrVEsNdJR8M(cE-I zO$SK71kNV&eiLd-4vgz(-a=`G7l>hcSx5EWNfN45k$FXWnT|3f zAFlf&l`)%69E;qHG<@}7ZdT`Ui>(hl)ILJ0Z>5OD8;kUwBmtLZ%kepaJ9TVAC04&& z{5_de8nx!!uSAh5^&P@vxa21}sAwJ=!&IV?{XdL6ZNn?0ovWpUh>JkK1JfT;K zH0LVoAdqA4o#pP34z?a0ym7l_w$ z_m^H{hIL$(!u=1qhr zGV?rf5T?(-i>aMJN+GRmI`Uh5rm6b*S`zJBHdncmcVW#v1hYvvUANIMq&Q7f&)LBJ zKU=017SZ4bK;L)@HK?lr`k8sq1Lr@j>7ttc8!}9{u?3gf58>`7LnOU;k1$vNoVENpnTWTq@3_&SLuYHn^IZ)p+fOV7QRx>UxanUv6PL5gvY+ zQ5=iNSms085|CVlCudtTpQJRqv>ySYs!>zU-6}|Z6#HbeQgZR3FJpymRz|IWTZ>E9 zX)`#_KLS=ki4L`y!wyeq2j>8_t2$9Dji5U&w=Ayj`W?Phd(0igi?*$-t|)WXT2Vv#Q;c@T-+%OnuJbJ5T7%T%oVgJZToa$oA}jrun5> zCxT1vuT?Qmu+9{l{%%8W6b3a{9dUDyi*BWKQJI{a(&`Cj!(tzlUr%4UN(h~)XbxVf zM2Q`W4CO2=-dNIwlaMS{pT+F!eo$-#npL9cLI3)!O|u+FK1nnoePc%D|aq7*v|; zkX@A2uF!)ethuHzZG`(rvI94@hV+%XPthSV2w}$5oXmJ5e0@z+!z z_A)Tz4)SpI;~RAzifB4QG173hdLxv9X>)aB)OK6+qXvs=us%?GADjW`X7)HYK-I2o zxSK~e%p;jB}?Y~L`Si{Rjbf)o}Z|uzw=1l zx1^9Vx~av>&Vw-6*G zIvb`lEkHV`Hp*~j4kz#;XW!s_JtL<$fgTbxaw?wh#WM}hPk5a0E|TyM*`jb!j!EoG`@hl& zCh<$T%E9G`dJ@ZdL;oL`^Pc{nmGim&-`&aOKF%v{`x2)3bJ5UEV&g_h`NX48Gwenu zFmntifh7Z-@Nvn@j~sFbqr{Co!74e3lDk3I9l6!m0s3h{yhakw zxmfJdG?T@L!B2uZv3yx{azj*yTNejyog|%dobsS`3*uG4UF;8w%X5C+LHifPJAu1c zWTdJ2o#3-T?<|NPhj8;;&E~z*@9Y(VZY_vMDV>WoxA;&Z|0f!5ay*S@%6Fq4ECt;~x zO!x|1jzp4H93DeYU;}4g;(Qg%cforlL(F&9Lsm=(`OqFGTU5E@Ez^#>p(OJs;pNJb zj3_3VoM-g^fjKYh|5-UZ^#ATTAL##`o#8J^HtG*t9MTr}EgH>`6C7GZ@@+)z2zon+!%1OD{%*Y+Nrke}8v;aQ5ElC8{ z68;2E*OYju@oO@uaf$G#P4kHT|1iovC44U~M`8w+WI4lM5j}@FJCF1Aj2XX%b-tAZ zI^jN|Qlh!}dcfu{=^wrW!k$kfT#hI~WzI?cpJi|ls#jX_cl&=RF?vCd$LU(sxu#L_ zbb=ivT-T$dnOnXD<`bL!zAxB?0S(KcViodf7&c{!6I$es!YNa|ldNG=rg{O$D@ zit%|2F1dZyuyIakg#-te%$_wi&z9*u8*kiDC-i_^69t!SnKf>L6Ix|Xw$2(ig|pRi z7Fg1D+*JRhBzv6Hfjt>T59ukbb%2_1Yhc(GJ8GzjD=2PezM9xF%gL>q<~VM@ z*n6qz@$xj*jj+`#*_soN3NCq6*W8IZoCTMxoi#R+Zun1Zyzz~>+zg#EdF?#D`#E~= z@2_zk6sb$}G4de7LJa>lxn^;X}+948b|U37hSpE%M9h3rYsiMdWF zY)`T#q9me>mcGE@Tq+_g_OapBO43&C$ZuDi9$4aGfL1QWXu1sla9c-XcuDllv;T zi_Nt7PVj8d8(myH<`Sj7B=HS#T=okarxNwJ66~FPaXOD(V2Sta|8e7-@Qih`sx0Y_ zvNo5ph}!CY!R?|bJA$H6mHZ{%ok?>omvCKTv7+TZf`-jD=GXTBK{V8ax;(!IMtgXJ zgzETukjQri_StwfUNVEEqf$;T)YN?OnVzrbzAA7V;VW^v^~Iw`RO!zThS1^2;QJui z67@@4=Hybg@lm^-@b_^!qC@(VCS9VTC6fZ!0RZIF#vVCTEm^}I;D`lN%s#ifq^@_b z6o}NYDkhpeG!v?a4Hz&Me5)Qa1DzWiRAf)kCUBkozmqrviIaD(c)%$%;cm@lJ2zep z>oTJ)TPes3d9cIAP8<(w^kzG`Lt)2QW`X@b7xqcmcX4`I$?HnpNUy!T3OBIp_UVL} zT_Ybugr8u$GWS;WJYvi8iv52OJ*OdpZ0l-0;xV1ERYT&eCytxuBR1`hNlaH@m%DMi zv_I!YxX|xz+PQB@f;Q52`~P7g4=3WB{E;U&A4bN*c5WH!c>Bc&4V-F?v_ryG&Kem%w6WqlvDQ&vbPVnN@xd+B2)bZp|*!l`p zRU*(GU2KZESEJ%m8?}S|Unz_+3Tj*d756cH7wV)$;H$_(MMoPo&;Fl_iu<6RFQ8(V zsOYLf^kGqvyM)+dZLA0E|AWN-f|w@@#Qp-?c%f_k*v}DrtL+t^*#8|bVqRn?vpg=b zcjWE@UuhHBZ2vzD-X3&-i@P0T@+Q`wLUZjRLfig9Y&X_tHg-~kmk5cuszB^j>@O5r z?6+;n%DmrXWBqFX4<+_%#QeHI>{@e4dz~Nq1;&C~zyr3RJBj@dF$>qU1r?7O1~S5O zzaWmAQlyOO9+e95wS2IyZXEIGA^0IxTiA}@fll}ok*ohG7UTsG_4F)Lr1Dcdz#v0h z-AG_mCI+5YnRvf)id3%L30Ci^b8T<~VmHaEHtD$}y_s-5s}!m1%_^eGW!hQxAnf;q z>sh5pWp7sbkqP5_Tl|x5dlzOVs70^G>Gl?nsfIhQ=0mk3da*6AFHnWh7C1dUizi`v zp3;};Ih{~f>%3eu>pzV4L4=RQ<%kY_JuZfez!c8z#A%JAmm@m#gfFB^{BFr9klzq~D4xs}yNF8!N10sifxM`;axTW{IuMVk1F?zZighH( zvNOh;IP!Q$3$Rvo zU-lFtcY%ce5Q*0iq0SB&l~lhRgm*4L!; zs!8clo6>8hT-?L#wVKMinn>w&lhRgFVwkk&0_CENz}57IES!H8<77(@X>UhnfBSzq zy=N-nx8QOllJw%?SB|C17jyPDPOA`)8ncvHKY7tU(iwA{XH$|F$>q?P+gN#%7s*UB zrdC_=%BtXmKb1=*(d(u)w5*xD&XDFWgs0adO-Y3`bMDvwhvux;|Fd$Q*8jWbyrTcJ zO)#E3xf-TgOn0s>B%ct zW4+UXT*xe+&LaB~DqU4ut;&*&rk7CnwyRP+X2eP=xqFG@vY*&EQ;72m!m|b9k#drWO`5P~>;U{wFBhQ1qi_?8%^9U+G?qWGxl+3g}b+i3{h6H{l{1h%n zqU&i>NSD}W$*dIYfDQP16V4-ZH;v?y-V%rG|1FTMp}OL94e6YS;@r={UF=_rmn_c5 z2|=IDj}IF%h)+FBFxNDBkscU7@3rGHZ`&6CEGuvDd#s!H%0LJ#>FIHg%5BV{zb(OL`~M8uP7y~n zOw`6u?*(4ZW^cCrpH)IR6+m0&!*$|ayz9`(M6G7?d$;|+g{b|AHn~95!A{Dx5-OLl zCZ~sp@5Xz(f+=^&G%gIG-gM)ON9vqA&XfV~apIMGfK0-=+}F%t3hc=tH-&>+=u0M= z%Ab_JEgd#1w#w$8`=yOQZTZDK0s(Lcr!%Y5m+Bhkq`WJkIh0}cUb-vsZhxn$C)pNJ~pM`O~FDmXX zpl|IzylmLYXc(IJ!pmHI+OvUq8@P@x-b&)gm10;P#m<$-eck#|l}xU;p#5d2cU0g^lN>nRfa1{& zSfYp5fF*jgB6N)Wj#!Bv`jOJGJa}muRMZA+1|PKlr)01bPL#R098phVIr7L?V9C&& z^7?;PPA&bvyE9y#Tn#McYy-~EMEvY7iq=`>6)T(C*pop`5dJAHN1{vRWeZu!5?$>7 zrkJ)*5`NYvnXcs_SeKY!$>orxno=D&-5%3kez6w z_pWNPcBUld2VH|RYDgJ1o%6JsArj7Z@7TFEUZ#yVevv$dJA9Q)tV|Q8hKI}h1J1KV znbyqKk8bxd8|gM_W#z4bF`vH9`c+om9hf#<-U>?7&m>GA*$Zzq*(IC4=QGDitKJ<= z)4y(jw}$q<%EQKKHTN-6r%M-4tEIitSJN73uXNP3%e1%M3cO9EcTGRT=QY!sYVR*R z(Vo^qF36_KSWoLH&oxh%YqPYgbrN#%mUgZ5m+8sE_Q>M8iHYE03gmXr{)J4vWnpN4 zfI_xzPLoQBgG89_h@FA7Y_1SkbXY4ofnKO=P&+J(`hU+E<@Eoo88!9){xcfu{{v>U5;YiG{rZ9KDP z4A!14vu2Fep4m*D!{y}-rz@GAiqkz;w~XI&r%l)OGgjA+u8AAvGFIk6Vz|YArm!jg zmP>dLlJGZiIii*xGj@@!n~@fpF-Qx#&lsiuXIWj(TJawHzvQLNiV(lytSHZH`%pvz%Ocqrp{w zsHiF29+H_%63-jXR zEM}B9jVWgric?$0mqC<|J#Ev!-lF3lVkDwA` z;kao{N;XA0Lz)}Vvm+r*S(^0t-C~xDfljWxl5?YtG~fQuDurQ|hSzsfrvj4XbxjYeD6^J}`F^&GY7g=7}S#2You>VVzre70rbH2z~d3pxgYa(|y zJ!Y?254-BsHf^t2Z99+MVs-sy|Bu&$=o=YCvT8ZG@*dAgD-6qHApA`s;oT&9Dqq6c zd3WYgH_XXgPPRnh(bo!#uRv}{-s5=nrNKoXMBks=_WBTYJ?7wG{BRhocw z>4G3Cc0@%~uplZb`U+UUUO-TgrXtvT40HUI%F_)O-3K~MtdK>8eP#05rZCasH`@P`Cw75+!4B)>On&&|2z3rf zHRfgdBn0odMEIz>=<}zYOguX`dz82 zWYUDw6(pV_6|@r27!l+MPqm5sN+KOW_r#4A8B#$r3fMs{)75(o;TbqBQ#?gvE(SD4 z_#9c;R%U)0Hih^HaAQS=uJq?`;rdEDNxI(t-wpCr0B3Nz0>vY0nJ{F?3{Qn+-gBCp z>AFl=1A}-Je7uo&j+XzLEMqv5*t3so#o-@ZM2?tm1QmEHJgb9Gmy+xDEs~tG_HQm(2o%a6>lDQ5+i=AY2XVsSLb(xKnpL0pFuN+ElkZYdEX8ECZIcZ33O`|0L!RzmrI?jV*Pg3fkSoj-Rd7 z&+Y#iz-s`V?!d)E1M8q0SmNjY*@R^pKh-jvi8PBsPvVz;`7J$@in)bdIbDCwKVQQc zzXIQ{=OG{035>5qUjN#}XG<+_*&3!*9wzavF#HD>X_ap44*7(jmm<1hUxkQR%UZ|& zZ_FE=FG2m{h!79?XNlQaI>Sg0Z)q&Ht^L0Vo=Ry6XNipSU*x#FYX&qYjltvV;# z|G&c19oTG#M?AvAi{lxdq_5@^B&URC5?ZW7v{_Mb=%iX}w8zQ(XQuo)JfpTqu72i{%dwBD^@```J>v)t3||6=)S%9O!L;AIQhO+wR1 zWMQ#{$k$|ETRE^37M_&L`+uN&9k_UOmy$CR75i;#CzUtU6F3ZWK@fA|w4`Tp>~t6j zXJHz7RdoH!t2#ZZCC-l#ioB~U{KhuIr!6ZjV1_4gfzv`vgIH*T`Gs4uO$t3MeD0ew zxcOnFr4OBZ87pHqNc%CCu3+aHj?TSfYN@OJf0#_JARD(jnG}z)HosD)g7H}8XKgZN zb4{|1Ycdl8cHZG}tnzh37%dW0eD!t1&bw|n!-Wm%_kIP1>#&hlN`L!*6Vl3d#0KDW z1BmJ-1)jvFJ|W1$FpxtJEEv6-V^NlMg#G_3BD#SZ?1*p+QSdtO8MdtV*#G&pxVIMQ zDhKYQ=ouxq^>}Y5ekV>_B=M+gTQSQ^{B0M0PeAU;2@K~kMg%-*4W(l^cO(25@fUDo zMUq&c`}O~!o`PX4-<(|6tz*=g#5=FpPBcthL;*7U(WWP{uD=EPl-UpMX1a&4AoWYz zJ8K#dZ`3mXhe4RzPPE=iGl|*?OVu{S$~L{Z3vww;z6;>`8w~68HvC#}>QU1=me~I@ z$l6oLG!`r5eP^jOdJYwp0_=b`S@2=NCtYv}7hF*9Mvj$QP~~GLg~oL#LTBYk#YGBj zMs`N-Wy%=GJWs)8{J3lLLc{f}{l6XVmT(SoxWyCIIlFhYopUD41=IV|hArn|`@amY zpccY(mm@(uQ4${I{DJP?pTS(P68rn@agzt{3G;tE686FLo+H7wBD8Y>xKq1>tkw?# z_jGYo>GLM*KEhxWvx?cC1$}G(=hkCY1b84WT03^=xY98U)C(hp6O>sIJ*GvBurVvL z-F_4aID+TZHEm%f2`m8h{68l!xM%`S&?Yd%O<35&UPo zo`Bqx6p#y%^ka;qKHui(G5h~KIZI)-b~$dWNS6Ndf&M>q>;!NE7pV_9I%`bc$F_^!Jr6MjOPxq|b=~+&) zFWBVA18)Y@bi-utr@9-`cI5US2lTcD9|SxI@GM8Rc%)@(?xe5PJi@wZ%e6te?-%4U zeR24A)Hh|$<<-soK;zk%i{w#GPn&GK;*)HMT_;SJb;1u?Gxds3IQ5C*FKyNyvZCjX zn}~@z;4>RSLm1v>c@p37+4&GvCkCk?K`O#>e0RBRw`A%H#6DOoQ?JUHif#NcMkv0U z_RcMQ-LigeS_nKJvm`Ik!c@jN-8Og-*I(gcQDRT@!ysgah zAV;9^{=_`L@ zlIUUoAB1NQu-6?PJJt^62Q#cpyoZUufYY5)JViDg)&m(Mtd6+xR%|Y>3AjeZlY$#7 zGPFXTNaIkmMa;7QSAy&gio2o;^&M6$Ehc+XawJZe0&)-547pJ7vcBF?M9#+P+~~zc z zDQV4Lpi77Ipp~#43BjJqQymxSVkBsK)KohNa^UxEjEGZfqipS!;k`l+I8DpAsLY5$ z%aB|49MCeSssT>{yw*v|R<*GTi8YiEv{jHR_X?IVZE~iF*V$>)K}75V^@=0Hoi-JG z#w>A%g*AWIG??6`YzzVY;ZnF<@aHTrohG~zcziFa6{mGkG=nvj5F#0r8w;JXy*pUbhcJ6tCp|KauSzs76T~d8aI@Gu!x&A@iUk z*BR-}{H(N3=4Zk_eJ&l?;rhvPZ-@IgI88MrMmlh5Y{}0S^k^ev9LlhDUa>c4TX4}W zLPlOjwwX!@4DEB`GTBDcxu0!Y2}`lSS*Glxj$qckL%_|)>4q;JXG~s<-;T-4@p=Ms zTbmh^8k_Q*fb$%H zUvauTdYIN-Y7t6%{}0nvPTK!@Y=d9M8`DgjhPxB_ozYt~+?N z0TBs~)KXTuhmG$~h(C)PE9|l4kFhgWyiflUv_$My0qen7?5ED7VBm;t(*Rj zQT_=b1#@UN&d}q`EA}F(JIq5INlpv(6geNQQt(DX~8VAr9iowlZN8&+eX;2t% z8T#1&X3%`oZ$|1d84-i0Xrj)Dfp23IBZ2)HiK`{_pYRwPgR7`1!c8!lY{^ z7Nt5_@i#HZyFuOqU>~k{&0OoL)YsI=&}knaRWegB7$E`6T+#mbw4xCp;73P@c%*tg zfdI{T-ZPUpymYykCZ#5CZp#e{jkgmh>8sW>#D9LUbZ-_zd?yo`Wg~;k<~_~&Q3@up z3vOY5v`QU9O3m9+j>F%nM&7*jcR;CXDZLgGNHdfh)Yf{;p=Nk3Fo*xKmE@HcB1-uP zRF*lAQaYiB5UuYg@OvhAdyOHw(XA5Wt24T;i+!P6 z6#u)NZ^g|-T`JJ!d;WR-G6D8&OZRxvGbJxEG5)dFPW5<${!xVZFjglGEAgL?nSwne zum&j1-)B!mqz&VrKPXBJNHYH5 z)8Z8^mI&%HzKK_t(I-+bAk`l{N?a-545q2-ZF#j=diKX`*Q>u39gSBji6|&WYmhrA z$|@m}7nK09Do$R`ajagF^TesCB?$Pv1*Pl-IE@5Bb;CkRpM&uSSvGs*77kCj@`E_8 z<;|4e*M&z{rUb3TOETq^ki1tZmiL|oxLCQrfhsZaJ=A*Q9&+PDa`i&w;fYtBY1H09 zSNHOGjtk?;D<{dkLXOkyePhYVU;{EVi41~0Nl@3bo z!f;C$GYtACPctRZ^w!WiM$;d93Hr%uLx~ptYoLvbrmx*Wc0b=n3)S?6(3VH&71XpR z;Xj{9vs8Bx|CG>l%|vqPsPEyHi27|NO-gI#O`ykJQ3fvkhwF58TlcDYn0npVe*-30 zc0@@Abr@sgEvdRKWlkeaw+e_1L7AFORG$c-wEAKzr(^_>2T|_kZ~-R;P*%;yI%&W# zh+`svBz0srr3P~}39=u|FKT%3`p8l>2A1Or$ZoGr&?imNm(Q*Sr2rI5F^vN!3H zxm+VzJ%(w}g=`0@OEmd9kGGP#uZ-m$32A(UoTzTZXnE6Atv#G16fG`+xJm$~1175P z^3h_t`s@$|lu_&fh>u1~ko(5H)zxngGxZX{s}SFJ0jABH`^LT5s`efB5}&U@{9X)| zq$*Y?v3lyY(j*pFf-gklqMJpM>QaZ)nyIxij?{xHSCkY*EN+90HtLy%#QEX2Wj)cZ4|7rl(Cd0XpG@w}X4al}l^=d=!H6)w^44 z@eV&*ZLsTMt)@;7^)yTjImBeC1 z)r8ta5T>~{GKkkdA(2sPA%l>*8tQ;cWSo@A#Tb>k8N?*0*9)SEjP)BxWt=+y6o~au z?-GPjNh?XEqMFte#CTPb4ScmT!aq`|o}i5FBG8Wi{-BtHCPfnQ)w5}MU)$6)>x9ZIpaXTYhT0+xyVu8XA`_Hp$m~KEt5ytv^EhBSNpBO_Hxg(=kYkD@FRa zSh;;g88cf!TO?o0H>gHc7h>~E0Ai4Qt$z}0(*xq*O8{bzd~Juw&dL;sa_voY5($_i zU;8wsYdVJ;AC7#uD6 zTPVLos7!C5_OgBGbVv7Mh9=*0l1+UsDcs`;v3OP76BU}%I!K zAE9OrS6)fu^4*{=fcw$KGUL?oE0mvH$}KtnD8qqmRJlOf|2LRPs)9DAzB|kQMAim^ zm3t4ZSgngn+LrnrT)@&o%`8Tw->oDnApOE0lxK4A4kx1ALS`&+F_+18IhBP*kK#g0 ziH%87uL6^sabkrmlW84aRh=O24>vwyh9f=)o2kl_*b&X|+`?sBI#M zOX_7B3!|7TE*>Ha{eX>&KqJB`sOy)p25Gm8S(2IuVnYOViNFD$Ah7?Tn-I7S*xvsN zHOqpS@flBIQpmVE0`yD-F4yhQ5M@~qGxaV;6Ak(sK&e=_#1frX`q92E}Zv$txc@zOTNA_P5J# zDmY$!whbYV_j`sVhkz1Uxu@f7PHmZGDHQYU-mh&+%>Z-|kWR^wBx{41m*O!PTGB88 zV_ZoTM`rvn2Rbvy)vKTzpsjN0j!w$81N7z>r!8nJfJa;qLY|ZCesBt-Dg%|;5A9Gi zeHhENm=lZcvza&x?LsvDknn%8?lwyg&}qWBq80OzfWDj9%<3cuK%;*K{r282E2$fR zzAlKI{#k>ZT)dO+uGLWpZH`Mf#Z6R=Mgl6OR=i-7+6dy_OHkXG?8jWDUa4YHdq5m2 ziZYc@MSX^(n9J47j&xyZYjNs5#=w}SYVlAz#Qfwkimj2naic#?JK6dZU<*jJKbY!x z%avKgPu%=fu4LaJE;FHDc- zYM_=vkZYz4moCM>eKka=B1H%40*D`76oA#(d;daJ zuCWypo4_eqoGB^**?I9VR&{>&m~?7GY#0r=<~<}VRdQ*Z&PX?ieWL+liTyXKtH`(p zOoBKg8ZhoXl31Z0C(9bJ4&t3IAf#JoqPl4dRtcP)}6=wOW0fV+;H# zh;tE?Rm*dNTBlxS^{CYnLpTm+E7+o564XYu;BJe`Cfu+XDoO2F0qTA=zaur*8R~FB zn7%H3%``x)uvACg>0tj-SD&yW`5dsf2tHzEA{W9NQ(;!9ey{gp6B2j?@G}vHWh6l3 zk@crP#@ppaYWOXvM=wFh8rC21{>e7H`VQ(}f-sqU*vOC-sz2y`62+Bh32K zU&=ddEr_}i>Mr5;=;fja)T=qU16ZmuS&tma!J!ZWCPJS6;G{@|S!bHzM=B#ZxEf;V z$~8Dp?EkOtf+E)H$^va~ z@pFns65Rvf)ncFussR(hK=&P36!i(juZsdgR+M~QD=>KZX*=MRxQr127c2LvDU%s9 za}12Cf4K$a0%-itpz%X6u6lyg9l)RnNLzHi7|BvCFu64Q<6R_y=>V=5kWrqcPaQ}{ z5oM^2(C%=BQ1ZJQlHKd}-p3SzT2s5AJs-`l=`+6?ZwJ&5p?wm~FV;FRrz#s=I+H&` z`zu1Ppw=frUp#RHvcn7lm2p<}cJR9)hXSm6`DXz2A<89jR#$dB81V~$O*ejl+IvA9 z8j+ywNxZrm(-pYmo8@-OIupR+h!hQ~pb9nty60=EP~8SmZjy^?Bn&&#W|GVUAAStr zIf!yqoCVmiQ%1SKqiNrgk7E!|xd5~%Gm5~jxtnz zD(Ky~zB6>@(Wb?##5j4=>mYc!ND!{%;0E#D#-lW!ck|2-_|<*_ zMnVZC7SELsRI;PyO&{t>pE7lXr=_P&I`0i1ufup%SHDB7e)|l{<}39XgXiY%c&jgE z6F4R%zeFXr_t(xRCZonEO6fHp_06^&h&6%9;|3t};ixF7fYSFI489B|K~N zpT|=^i<|u}`?+;eo>Jb*;dMG&s?4FY7}BTJ7i&y5pW>xd%5GJ6r38aH@@e#x!AdR# zEYq$%{%4f@dc~WbRaWgKt0~VZbt@5f<6`ebCMT;6VXsn;6Zy7F2yKBJ+QuVyBdsmv zYSoT3eV&@?o~i^7s6`#H3F>ngzIK^BwKi2(9?4wo$Jud}4Rro8uak0Remk0H*5SA1 zc{v?MWmc0ZW9D6`9L=znS6OWW662RKIjj0z@*LVyVjg2Qq%!N15tX@-VMNuabdx+; zv1Pwd%hA%LZAG=z?7@GlrFE#gh?ZU?Vm~hSFJwk*=`fK$yM&PMVYF0|hohyv4;0Z- zJY$Mal_j6?I4ezSNitVNOTV$GR+&Gn;F}1ozr&_|$!Dad{J*(;(DR0ex#b@sEE)p0k(=s?0*nma6f(ERf_&@KL?#FR++G*XI2D-gJU& z7tu^vB*)`oZ~T?iqBN61WE+=Y+RPd-j%I%OsfcDuFuJ@MbiFS=Fc$Sz>& zsMo7{Jymi-jl7=A=;rDhGNDhIRv{G1=E0SUi&F(triRzEU7B8bh765)oKWa_9$-F) zS|w*eDX-_&)nFPqm~=MxLfeS)WbS)Fa@GA6$etQKKjhyEMvdwjSlyVC)0V)IvGyRb z8SmEQ9azR)S2FHoOn%1W31&R?25)>aR=4zcQZxEg;1^1gq}(T4a>|d)vG*We-Gcyg z(_=k-(__gg`5eAbyCqrx%n1~CJe0h5i$otH`Uo!eRraRr%bR%h5Oa}|uZ}&=m3Hjb zs_y~(CZL-d07AfLToG3C$4cDgpkkRmRK!IKNK!v=*$CIHHkbP->p*RG2_m}{2(D6< zO!R;{xELZ)$wv`OR#Le4(!Y=Cf&OAH-^0mPG}&;6&3 z(2aT;>VGalY!F0ewI7YBBT(fld$uTgewn1=r6}E1D@o-Ks3oYZXhfn)r{+q|Q|(LG z(+e_Z&JvVSSCTp?8C|3{N;a;9&@m#Sqtr-}I?DYoa``Bi%BZ1G$43xY5P6yThN%2r z6_ziO&Mijuq^)3f);Oce@C-I(hhiZz8VMVHJY2IHp~jMoH$5i&@V&IICMFaNldvb_ z3WF>YUO}7BXsS=ar^kiMrx0q^iEhbvGQ*RuAk^H@Qo}nxCUm6ZLTTZr zd4HUdXJl3jA3F=JrJ-eoKfFMwm7(Q^+jRxmdM`D_Os>9?B4lK!{uCj0ztlJP9Pe4p zDe24N$vwRP{Y^Ec;7>mPKsvk+UIFqcCiqU-8@Z?4Kq~N+` z7Gde%Nh}#3y3;I!fKQ3A=!|JT-5MLInWso)_yf&#?gE-+E$|nMvA6~Lr_7pHv{u%r z0axkdOK4fgkn`vNmL<92^H{z1laUEuvmr#@gPQp=%yAQ(se`DLbpfQ&IRzgU&%Al! z_$PEJN^0glFb!wWRTg__i1aZ>YTw34 zeX7S8Ej3O{eF}+R|9?rtn^bp}OBA_+=B^##bTt~4 zVHUyyOG{+cl$w<$CNV`W70a4Xt*f@;zLY{14_VhvqM)n>eJMZR#1J#l1k3nR-Wdb6 zFk6H9#&PfKpiVMYH;Mf>k(-sFo*@_eBqx%9GW+7?)oW7#XQ~e&oN|e=9Z5+>`YR4V zt+8PRp3MjLI!Rleyd9h3EtCG zogL)$WQ{z^ip!^VyHweI=uV0JL79DV5+_BTvMZ5xvNqLFBe_XU2GgUNOwv-sD}!mh zw+QJI)86zl;e$*mYgCq|z?Y@N$C-ZCsA59#;m!34rJ7Ju_-8s~jjAS;VvZhNg-E-V z+HAlrC{ESL-dmd#kLQ8yBb&UE;spuyHKDk0V;@rUO(->7T|)g$s80Cz(I5wyP+oW& zbGI6UOp4vYtrrm*Y(l-liJ0yhLrf??{K9(phD!x`(+7rMmC!XNG&KBl141KAXhe9g zghrasnD93C7i*aB5~LS~SFT6q7$b8=_@PmR#+e2Xo7sX^l=Hwq6$%bxwILbtj1)?kuRMum-?p>oGL1i zuXl%&B{7t3=R++kUJZp(V}6N-wg)sNx>Yp2#Rlk$KdNgtVFy4P z9!+mFojfkD(}6sfL;h@N3nFxOt~tn1W6fJ=K;1(8eL~aaFhfCe_0pRFHpKU^?@x9| zm_5P6bOr&tZy=;i`h&-a3Wzs3D9>j1@Iq@xO!npDnEY4%oMOuCE9F*p!?T-6oHj_W z(*LrX@6k1}tfVhxDIF>MN)uj7cnuaRJI~e>;a!&z)>A>Mig0V}Uv_I#v3HmBg=6~= zzS`iolnhsrU^f$duw?k+V{rE{!R;llRL@er?Djb?nDN}F?qehGFpViq?_>>x>=89cX^f3Np*499Nwqd`pNFHpPr+6$2h#6dg_PnWW3AR#}PTt zVIwuek;%$XbKK={IH?)74fI;|oWo{l<&{)wb}x01`1f!|Q8a!X-$$J$E~cInubIq4 zbgtW$X<+f{(3j+G@ZYc7OjLrYn#)KJ`B3OX>YuSHX%4MTG+px#8}%rYa#7hJXd{Ha zL~73AAHI{ZSkteEwkSfcpvrxQ{1M4K)vd&D6Pl@YQHm*U1(m*w;*P5&dq^*Wcq4-P zj9Mp|W4s5+E-W9mGs4pVz7mj=4Zb1j$)3E2aZnnQiov|c;S6238iZ)jjHWagk*aC{ zxLiOcKcYH7pUpBg&*I{+;k>$Sys0>Fy`is}y))JG^adwGkIr1Cz*6A^&UY6X>lGl2U}Jp$k- zhyh9-CBZ3myKSWPS_als48E!YDo2o7btXd!N!N!A<4S7R6cCf=jbyJKmdw8DW%DHsfw4?y(tN*pdrntkt_RS1#ixJQ=Mga<5lL{~^2^%sBQw z^_}s}OlFQ5U+}DuaR*i|F{8l@mi!sMe17nl@z5}S^_fu%`N~42Fj)8S5CwQZw#;iW4RoHOWI-#&$NX(lg#}&J9DJw8AP(t8#kBH)is1a|M)d z2W3yV0Hx=QAzo~BIG2fg&R7#F6+UfhjWb*RYJ%kFR+GVvbmj>rdkb%>io)X^u z4YX@bDA!oUocx1V*$y4o5Ea}EBX&wYERvJ|64NJ@DbXU`TE(3Fu6}DG+B+PE?y%ie z3$|+9LH`aHE4r1bfv7rXy7D%nDdJ+QM90rk6^U!%#z##VBqt%! zym?r?45F>%EE&_;cAWljnm$!WJ@N?&t@!1TbNV-mbZ8i)wfo<-q_t6`b6X&7Xu&*3 z_r!;zNX;LIbld31Eopxg>5U7J?wZARqUQQ6igZgBIovWm(USgjNiCFo`8emHyP5xJ zE|YP(U`2`$}?@$5|1Y}=h?@b&`5(hXS+ded15pvo)s;$41S52v!ZQJ_&%xY zlcH0Z`930{QzjG)_kW4dne!|aXs)g5YD`jjCDL>DsP%+z!^M6NfOkfEPc&!W)+F2H zo`P1Sk?tEsQPe?+wv{2fs5$#y>|>kFd56PkHo9%^JM|9DCP-Oyw8N_#>AtbwTi$e` z+b*G7+rA;P0d;X&)C^moEt#C|uo;>y^8vM#`1Lqb=FqQ{+*98u z!5z{&8+YsSHu&<*Nug`)Mh&0_@H=9Y0D`9Q3wU0#@p4u)m8m zVNju|HLwchH7&Q5DotD%XNXRG8idPL$hF&2svQ9(#Dg6A+lm4OmwP5$ilMR02a_HwRwIs zMx4{H(ib{w?>X^y9V@Y_0B<)L-pZ?541K9>)HSe=!^KVmAhVzsPZQsx?w92#+=5v@uzr^0Zt=Oh&RmM3eBDk!aDy9tfW#LKH{f@l&!X+zgmWi#Ea*l|~TQc_n# z9Vv)Ev>ZX0YLJY0+Nzd}R26%_j3xG}+29tq(jba*D-P<7sr0H%5FT=gMutxBO1;ri zanv2m8TTO5tNsJ*t)ftbNmW*y@C^G1UUdfQc^5&;%(aH%2Hl3c{A>0L>0L)~L`w9N-FL_k^*o&+^)s;A;@u}pQO>8k4> zEp*9dyfK)2dQi*K2h{D*9}tYG6J2_9bhzS!zqPZ1_5wIqOppaVHf@}hbOyk8#Uxcw zt;><)-R)B_Pk|Op192uP+W8nk?GcO~&xyEIcvwrloe zjIMaLG{cB4%otD;T_pM%w;3rvl-z2wxD49OEeb|98`NFJ5Q*wx zY4x1OZEf}bHi(Y|W%Qn;-ue&`$?A)r5pe;+ZxIn%qe-eUt+C<~^#ef_%A-3}KuuHEIZjjw_mbRRwT;q=cr_Hn_+qFeRjvfG-d0b11Y!Zy z)q*h9Y)kIlkDO!bkG&waKz%lXkX9enA(E7jg&lA7?U*1)bV3U%$zr=7(9jD$MgMMUh+ z^~5cTj<@z_19A7d@x|@W6Hs1ssi9+{E64ua`lxMphXEWHkXD3ae|}&kU6S!b{Q}8H zpNZ0w#oROGZ^Q{E8G5E*Or2#d+X0G*2oa_r9&*D~6Rq>%t76_e!HpW{Pl zwM!tbasjUW>31C3y~IBhO*8iAKaW9sf%vyvnyDozANnx%=Lqu$orNzzed8is`;+mx zr3c%fTf@%++b>Yl)OC(s`*ZOjo1YUP&KEVhqQ||UO(o1cA3oX`8AGOy^AEk%d z>7$_C>Epdfdq^bSAzhl9Gt^pMoH1M1n6Er&t@ea_>D2*|b( zGkrXDk6btns0;!s;Y>=VH9bn$ojy)lO$qA}(>j8ZY=@pSC^LP0SN3M|i5XE8*=P7}~L0MjEN$pIi!1>svcZ7iTQ0PYr$PRUe3b3r;Y_%cgCJq2Qa1SQ!H zwKgbI1tVvJItt?RqA0ftW;0t;e?knxW)l-JT-&C{?Wih94l*r8wW5(^{ba|Ey!wNU zVF(znl#n+J5>XPV<)+@Qht1nNyThj7{`IgaS@|Es=In-i+z8R?1#qw9V(*bq=mDPY zu(|DmGi;s)@ofa94Y@OH?)+7Tu)tO16BqlqmLmwGd#w{^+J1ct8O-E5{3e3cX}ZH^ zpEV-rY6wGJqLHD~bB4_u8O+VFISbg5qEL6(Oj;zuHbcG7MMQ?pCy9G5I^GVO2Z=l4 z#upzp&q4XwrG|EkuAE`>IyQtQoBF4I74R8FIK$=vGA->@)q-?|OV-76hRvN{aNaA^2RaoI9J2k<44bnn+QL);mEj`EqM5d*K5etu z0$L}RZiKkQW}6YDH4N&6VhDHG+~l=-UkYNiptL?X%4MhR7dIke3xpjJ5oBIYnb~Rk zcXw0R{ZKzDiZGSq4x8V9Xot=3fc+&Bo9oYDV>d)=xmk1w^AvI0SvbgZB}- zmZ(`mD{bqLg(<(@YZexH1ZrxTk@=S6Z@hI^0ZUq$f8nj zNR$?CyFVpY#QB3~cm~9q9Q@Ytrp@C;Z(LS#<*w}fUBkpGtCDyrb66%BS(VL+l_2at zX(2{)#@`TRKn`7$8^jtksaAv4B4spl%vy~^5hCT0Hwd}s6??Vkp2jBH`tb&1>wIWp zOvKWMcfSd(sR_k<$|WzOjH%6Ey4oG4MHzOOmh#zQS_= z)P+BI1g?PbO4*Ww=OkhW-g2LlS=P19dbtC%;QsXhEoJ#119X#x95q0+8q$rsC2_H> zBoykvGcrKmY>b~*Ee632_YO*00YjnLS6k$hLH7Zu&kLfbmLmwGb;$@=v#<8R9CD@P zV-_E~(%b>M^-v*x3qf@+l9aKO&H&w-*Is6TP6n1)6zUGpUj-#s&7rn&5s?A9H*o`_ zgK z?yH@x$@i`WBd;Sa3dYol*0wW1zx<8I2ukX~tAAXS!pV#t#UHyL7A>hcfU5))CCM3} zAKgRS9t?4$3vdVMZ&IPnBL0SGni-(;Cqdgt`~xn{)U@r1W`O?kh|R)YPzPKjSu_Lm zGS&n-izlF+cj+N5#2ui&$VDCAo>EG;5E|hQ(5p0eV<3uvy?5M6kMXS|fyA`G(B<^^?IGRKP@t zH#s;Y644YJlQxsOiHoatg6Qxg=?p+JtJK3qzYw81$8;zryrl^^*-(ZS4A0^yS)Bfo zDyQ|zD=j2Ly@-(gxLA?KXN=Sgge&!~8x28_rFnMz>x zyea!{BKVmJrg~EbT}SX#Uq(D{dY(6>bRNOeQY>%!P;Xmx+Z}|@-ndK5K%3tDKo}Q$ za3G1hZR|r3+$k#4n^92Z7o$;#Pz@POO_hbRRMs$HtAN~E6voDf?5u}ot4`Bx19<|( zvx0h8k^?X`9>9EcJuh)9BUHT)@q`O-+L=ZzRUMeRYGwTnB7h!jo^+#4)IB`3TFqT! zQK=wuBPiP%OAjE$b*j!}4v|TU?LhPpl+KdTK%&y9&8i%y4Rng*LCm;B*0j8E5 zR@<`Ifw;4ntR%fzAKI-hJd2v1g!-H-$J1Kf&Mp^oAEFMs(YE62b{feK(ikLaZF!dq zvuOjKa=()zlMBhY-G-2|M;#Y;zMOVHGM9$N&YQ!>V{orrTL7o%Px z|IdJUJ%W;KhdLXSnOrbmtjk>GRscs0$!|i=cFqcjg(n6G%yg`tjBi7yF!+BM4IgS~1Q% zV}R_OEBQE8E5YhC-Fe1!418Xd4`HlJG%|F0&OD>!kIw%2LSSo(Lfv`Bkg%k5Kh*6m zA~Mf-p14<{gHv*F0w$?ZmL~b#ZJI|=f zv{SW$+EoyynzbBvBjA-sK#YJoD}vbLb}Cx{`~GezjZ3Wsw>g5e*H`i z?gAAs5#mh_9*9Jo)yCM6%S*&>i%)afb5AQQ4v zj=?5W#*^0Jetzj2H%z{r9G-C(0~KDMEwr znnXeqO{j6W_sSjG6W_<;SW0!s%8Xs2v6!psQNK2uygn&L1u)83bLCywiQmj zsjvMh>-fR+wVQ$3vxVW*=SW8_l;}MY?Qjf2j6|sW91iCol^oj&ru)Pqm-&j>Rj#9ICxbiqvuqs;~XDB;*Nyh3aZQ_RAPkMg5r} z*4_~Y?@do_wFnXXtUF%KCF`|!e#2AmD}6=$_qf<3fP9l&^^jy9Z_&ZhOOORiBXcuA zmYdq2oToPLFwC7PX|I_n^^;ihw&WsB$ek(mL{5K^H4;E%rsN;s_2d$*rtp|2^a7!W zhVXP}O0hk?o~i=c#A8bY)YE{>Hq8BeDO^i>9>ALd(kYoicDf*)nNmAcrcQzQF@ln8 zhvpcRnJL|P6{wQLB;c$pLAf)f#nJ|{iD_62fMt@R7nvz_1rv~1mO^;_LF1RFKbSy1 zxc^BY#w&$Q4la<0MtIAWK;z7p-XH1Cmjw5(=S!09|1n?s^lGn1M5|xG`G!;4k0lg3 z!PA{Dy@fh-2UnFq)QF&T({tua$LWP$)dFg7L42j<2*Ol@)}J$9x=0iAsseD6U1{!o zX~ZMMG+UF#!;bB zIyaT$&X@LLk#r4b18XQy)6{j2-TBhZ^ahRU24Y|_lsjK~omy0rq0SYAsb*VpyD#$~ zqk*~^>b3|%T76W9aL+rHrs1f);0{Kxx^Y^ogk4!myW;3J&*b1)PyrJm-sIpfPK0kP zW;(Z$oP|nj_yP*atuks9J>r+CMCY0_#GdeGPGaWPlw+H0$COtB%&n^O0Jg`)PUgX< z%}soU>gC3TM1WDMC+qt|p!`7*?+=#XnfU=TB4TFXPrHdKNv*x$1BSH@6UKUKZ|$Ze zHIJ{ugc)uqj?DyhpBnQ14C9A!1rb9m{bh$0x zsM*q2O+oaTWR!OPWEr&_epl%1c zy%>BF1bzj)S@g5zR`TFeFBF4B?iHnp9fcSW9r%NyAAeB%$-(cPXx|fb@7miWHYoEa zar$>javh{hf&9VBLBwJMTVPSFAyd`m*+&y^HxZu2!gmuYQ6Zg*+-Mk*2Q2NTk+J6fQaY)C zX1N#m%aNoasoa8yNSR^2r3%a~Dm|#vE1{W>!}!xbF?(uLC5_bJwq&u@!Dn=OLCq4T zQY+)EB6L|At2-|OY*TWk@(kxa3R)|v!7Tu`bHV&}LF3xSt>r6?23JbsMuWLlaJt+i zd|w6RUA3DWBdfH=tbo4R#b}K9$muKn0$J09Qp54jL#t&%)xx#O zaoyS`locMpR(#z$MrLmKRrUqy+V=o;!hhZm&Ata{5MDQjP<_MKIDGwbLi$T=-t=bS z*QuF2-cPz^+h|8Fh@umoC;dCWFyny;e)_vO7F9D2*<~hFB`jN|sU?JEF@+@0t%= zo1^=5)ADPU=D^#yEVSxBPmt?&9argAT~=d;L7(hmLW9ssNQMm1V^$)uQ&p@BtvXht z*MPjeC>r2HZ4uk$NzUs73~AtQK(9oAgXd_8`DXxL-Ibj!fN>i58K4W70IT*T>7Ij_ z(f}-{fu$z0;KSMSi=ClAmz;paUVo5BJyYP?6Af+z@Ja#i&O!uP?9v5XpZw3X!15Y1 z0QzuOAeho$fys}<(vfJq#>|7h!o`Hn&D6!v!2Z*FXkiH&_#mJciUQ5g55>SE`#B6* zy@6}0XxSAs%TeH;7i9ssOmsQ;rc^CEQ3GRmT^NV6C4Vf9meg3i_d39#ZCdfoR3gZ6 zk_OiW*w_VwJB_igH~a_+m97TvGL4gWkV6G$G}KuAXC1f^7rx+F+XEoq|YHaMT3t5Jn4cd`m=S&!MLt1 zw7^Ola}l~60y0HsvD2LTtT!Rg2PT>Lx-Kmwebwv(>E>HOZI`Y#^JEN3wgc890+nto zv(TXc=C*y*{*tf&z+?d#jl`?jJ4kEc^G%fJKhla;KwIYuA-^lhT)pKhj_CYW*7iEGy~ zWdc}L12c+&Jk_gS%ZaIaRq`QZ9R31m#<~5x`^Xsb2sdD4G<}XA7kL6w+5X@)JR4+C z%DnhS;y+G9?-Y!0=37so$@;)bLOYRlMC(%?dwpH=$`pN}bNvjGEwv8tZ#w;%69Ip1wE633Uj6 z`v-h;%}#JPJ#NO&HwDVqqi_5|lk0)b#T-F(c`7P%CYLGm9wUqPzPB>IE>qBp-s>qz zJBx2=n3H@dsu8eO(n$Hiw=ZQdKTVHsZGx42DZ`o*Y-7?*^`)HS4R-w1e^sO2(zCoN z-%79>A66q+$D1M-!Nhkrk{f$d?ztRl4-;(WWoPDL!tHB)FZbxl{i$81a`X)st9y7z zBH2}%!I`!A-nCk?CnL3@rhr%~}e?79%w0-ELm!K}x4#&7&= zzQ*`8W*ziLTudklC7N+q#A@}xS0AGif7ij1x+BMEzSrUTFv7P=O5aE|6X3lYpU?^T zHSh;O7bC#RQcHXT>u?y6W zEzA#uLG^<+ROpVrPGRTbpPK&;v}wfOAT*;dn}AQ+?X#0M+hdTo0k|hxz%l~yFSeJW z?85u9&}>69^NAp{xA^^?%?u@=%X%EpPZ6M0t*&sR$9T20H8NlOf|S=wt;b%+CNR!s zI$muM`k|R!X|Y1D1?}=^y5@g3(Au_|uF!f5UFQp>X#Nj#=Ue)<(56Mxe`Wy?f3(RE zI~Q9GZG+GqrHyCS5r1L;do5}k@w;4JGxqUOl4r@_nVz=+cmv``#Q^cD6SIi;bAMj2 z&G=gYzX-@l;Z!38e6v>3lFH2BKnl)kb&sj{4OB?{k2ig7URSHS02;d>iYV7C#Q!$( zj4eWUX!$}n3B;?RVt@XwJI`K>FbUd>2t7%)BR5>X{MR6Iuo}W`LX4`{M1Ad1d>OT4 zi~T|PlOUdph)7h|cR@s0Rc0YAJzsqQ@mK_qq(Ym>L!z491mgD){uW|X<4aV#XqWNH z>hDb3e3KZUs^Dx*Hc?6U14vUpZb5`Mu7qw~%>nduL8g~VV>Xr3RSijjr@HERtNTlK zJrL?k?3W0i)={K)d%7zBQCNnkkq^4F^O8EL2Z2B4vUsl6cg4qNtCzSYX{YozZdBC3 zLoUcnR;o$&W(1bf24sH8P6*F#4HIFK(LSv?myvENUl>1|VRkK7mzJL_WnlCSf6Z;J z<);dso~zjXGg&q;ZkhBm0x6NbHe+$E4BPG8OHRzV+|#1Hww|0 z&b?y?xYxD(auej<3=Jm0xLsYgy(=iOa86zcOQteV5Xit8zn9(2$f! z?!A@iHaKFVtpNHtkC6Z-SR({LlyeXUKeP+gf4oPLxS_92xZh) zY}Bc75T?6ClLQyiN;#^lG2}?CgnCB=A^A0SDoIaW%Xd}>)ne8t@auKO=x7Rhm0(%a2eS!Kv^Z)~z^G2q&NQ*=s95 zRt;c_PBnmLDJxaIw;6BX`1nuoXyVow39*$ZF(!08YEe(0S%IMvZM$ zLJH^_-!e{s_G$EA5v1HU%Ldyb;OR*{Q~DTYSg25PGy??AW;$*swrHu{?6 z66r6YYbk*SzUYcGHzlKOiT4M8rxm6>yqjN?HK>$7pE`?aP}j#sOUp&sR7O3SPqeJ@ z7hb)ABIG7%LcWJ1xDE8l{FYTZKyG>rBp1FkxU!{?13idqAx*rcTsr-Ws%Z$XCr1@^}_&4La_Tv~LyRowV@q2DUF6R5b>~6Ml&SwLzK*VQL10 zt7bx};X7X;=paP%e>dpy$&1w!@nrCD_wYH*sgVTv^kg%E=q-Fnb&0W%Ox@230}> zX$CtbdJhTm62Nd&yv!~y-*Gq$-Q2{~pvqsj)9NlbY!0uSmS|9A7u`mLso?xbYCm+B zj0_n;YE>lKre-+qWhSIKS~whrZca-ys8SY_TI95Z?;AfU4ZH?;xpK9XyxW!`+MWfx zfR};h-`(X=SFFN+zsuvWk2j7oNqdj9j^koSN+?vo(|xzy^FL->^{U@M_|djS=|<|j z+rFxu9N|lbT2~O$wH!g1p;|J+8|RjBin}}}vBTn3?ZI_*rMd667atNqBOpw3iBZG7 z^KQE1IUf) zB9zh#TrJFzk~#0T`%pPjXjKhBj)1fxoOj!8S>EJ`W?DnK+9jL0k39=`1Cz@}f*B2c zieOBgXl*<1wts#f@d8>2U{f(c&b#f^ZLFl70G=-<$$7Wkoq4=^7vd2Yz{G(XyX|WRl4Mt?{RLsFS<7+H z0-kz~k{3c<5Jjt zHyAM)U!S92XB6(_D@GahuV5{i@!AW_Ix?Q^%bUH7DXp1$c*?C|!N9quRBFqf0M}k~ zu1UJLJ=Y{jx#ya47PBXYi)}8IOtqU6;01p6xrkPsc=Q!|YoUjvDL9~>ZP=mujjXCd z0COTB+rZ4ZCQk+hfTlL^*eW2MlF?6B5$Bw1`bAp6b07{zP?GIXFM~4Ynp(0pRG)#k zP!xq2bB|M<71W3qmRNBnF>TzemW!Ng$^a7(g(L^X>kk^gJpDnb27mA>ff%n8HaXZ| zB0{8|9F!4&eL$XkKT4uagm^jsViAY;i+3P8jP~*0x?C|At zcQ@mi3>=;Nc@lDsKc;hkPeM)O=XioJB-B>Nk#H6lE1YuapN?;+ej%@}G zwtyK$Li6slB3W^$44{o7@VoJ9ILK8cLAJd*fhCm!*$q-(7m222k1V0%54^)teAkvtKTLL$g99K0#G7^}hatu!%ou$meK+Pj4LxDjeGoIoF$eKvyeY4uGpf>$ zy%~RG)BiG_-XXpDp>lGc=iKh}W>4p<+ISL{i~=re(>iQECoCP02zg%_u19E@Xh&A6 zTPqQ|QIhqh$A=$gd6cl+(5i*^GRIC>VM2An-Pf?;v(hN7S@`#XPTfg)o^#5hOR&e}E5?-Ic~gQoQ-T)^Ej8RG0f{e~P;R&yYqo^FCe*mR68Q-) ztB+9g7r0nSNQER3vpBHT_S&n}i2p5uC<9K~n$%BnFia>Q-n6sqEKN-~^6Ux*h*o=$ zebf|_;o?&YeawVn!qeJ9`^1ET;f#5NJ~g2-;YU6sblimE!jq%|J~N^C@Rh986Hb~? zQh3iWWS%milyF}`o;IP>a2eLp31>{GS~zzRGS8Y&R=BpPY7C*0-= zLg!4VLHP0IAipx9#^DPL4GHH>s9Cu8FN9>OOtZ-gKedj~*Cx~^{ACuQZ%n8|xYN~0 z`PPIwhi_vTP591)x`k&x0P=ei>J{FLc})1xgxDBiH#XrX6B-!)<6US!o6ykkm3f4I zF`*IR@6da~uO>7mym~l%znReZ@V+^Oem9{)PmdTz!prBxtz<7ME&Fha{L4ATzpNLl zQ^#2oW9eF1RqvALz?Sk{D(l~@uNKR*kd0uK^}vhr9P@@er!)Pa8^*;vkjYD}h3s-S zY@ChoUJaYPgH(?<#$Su&S#SAvUTRAJA0dT*XFN?A@-<|c&39xROBtvMeY@fv+6j#G z%P}mRQihpOT=;%gKqjDV@%DL-X0Fm2%GaKJ@{zu@ zCZbRMv-7m3I`;Idbc$wo0VuClU5CG|Y7KiwTc$zz+K4v1*;$ter!(PS{E=LGa09&bfJJ0uk~gg)TG2qlw+v|&52gen%^DmaUh5^E^(uE&n0jg;5KEWEiFao%FH{`rhhsd39~>fDT*>*;F7Ov=}&Qqhw3Ry zL-Pmk2O1D>vW`gB5&oc`%p?b27NU6l!9$L>PkF$q>cE>RSY@HnH2F}#W=4go1?pE| z7jdydmP*s{6I2|*6r70<-G&$9~=^6|S` z3H>~tN#w3pvg2u4(+ukWgXHO5U5ohQinVCve&mQ&;+1?3x6)THEVQ$N3Q#j~u>w<} zKRVM6F0oku8GnpJxDeH+JkANK1jby2&WQ-8|J;FUv~&mYX8#<~9kXh6KlIwDy|_=9c9 zOmfhRdII95w>jQE(u(OntB9y9v?BedF|jRhu|kgOKivopbmK$o@kaX31VXc1qOCMH ztFDJ!gh4U?=NS;MKiE{~Tv}RkaEC;{Ohn(hJnE!$R`1-&OQ#!Cv2|}NL6TK(t{#SZ zXqq=y4=+8{M*zJ!U$+6-M@=GcIr0ORl)g$VOHNK*`~%eIfO7smg@2$D<>&k={y|Dw zZO+MC@DEke9dmY0#9!O%tBij$6RMOt-jd=!bszqE-jMh|5r2Je0{%p`7UPq0jXGAy zn(R*WHg`Rv050|i2|0k#D!}?qzUiv&g1A)xzgfVn{$#yC)n_f8MZDU}<3I$^Pu;aC|`Z_0BsN1t(q8j|9A`l;^Br&4CB@JJRK zT1Y04`Vp9Dh)>KOI6!fhsje3!osN+EL?Bku%}m`>9#W~boa{^ja(x6QIwir^TOjFu zweD}$(szlpO+fB)VGiQ3`j}DqIGXXQXQ93%2&0;Q|Btfs43MJe7IxPRGYn}57ZBDV zEJ*>$k|pOPB9bM8u&^v?mng7+ilV5X74nWHt!3j?+jZw>v=MimqdxqT){ zsLvLwgeI2uyuG?r-%mTNagC3 z{RnTDBZZ&B*^~VUn}D|k5v<dfiD5TzqrROF3W+}fohTmn2nBIseM zyPNsZ=MO_vZz{Xu@FLZDw#1~c1o)1BNkK=*DN>EoDU-qzz;FDIDU?z#(}gN#h1AC| zhn-@+W~&90Lh2NOk=3r~_fsG7;*3QfnG#av5myh8az?sSG%pOPrbs$Esa?l-4+k3} z6*q)mWRlM$f*J;r<*@jA(iVwUz9L4r0zqw z$*Dnu23Cgpa#<}kqFzDxR-hq6T|Q-;SMiR}w=GR8sv`)G3t%QO3#dOMHH{l*a_;@lPFGi{OROr!Ryj_^(TkS^pUNRup zEES&%^~8Xxf$tEW3IMZRUh&x?2bvMP_?=t~;q1VX7No8Zl%NQrEU5-nF0!e+t?+>mV+v8_|Awj;d8MtT=0n^NP;%;EMt^ygnGc#5d9;Xym*7woyhy8n?RlmutNDh8QH|-rQQWO9AGC{+~V>>=H-R&70(O*bQRcdApbawhL)Gr zRQx;A`#W3X8Fx{Bob3)e-_DU1vvoJ#FjYa){}LsHiDy1e` zRY6zH=(T^_F+3GwmZQA-V>;Q3Sb3L~T<_OkyH|O)aRpOfZV}cOy1#a2dFFKc{|n}l z!EEk)LTY+*C;A)nJg)-gm<@wUa#0~$d_12mgm@D%Ie$pRN>lSuIlE5865=&7^DA&7 z)>wj%0}rfMnJbXQ;PW5gGpJ9rY@uv~E@E}Kp_44*Xu$uQZM z)kdboaJlpdzjKt(5mMf;tlo){QsP?AFo~+LTxKM$*Q=#mWh9pCbx`)F5;w@a7MAOc z#7#2IhUIc2u|lTgVJc_zG%s<7`hrY+i%XMCDsQ+6zelOR2rRYE7ntweH-hn_ZdR3% z)(ME#B4lfcbuRID+0T{NO*D1_xVQjRUde?@;(T=}GuU;cqb5R36Y3(J3$uzPnyT(k z^DbWju0y!esjJq9*J%PwM>r>0gDi82d({S>MbXRL%?MW~1G3B|HmILC<$O#uJc01pWI&d= z#AdauEVlv*un*zK$$-4JFR@)UW7~GH)c(&1)xCZ(K%>h*r<0(3Q(r0scT*g3)5yTCX_% zvLmn7O*|X=n#*HV6{KE(NsqTnN#d1IXXZ84329G9kQX__OZ+#~`bV~Sq&>zV%of1! zG*A6P#q1AN-Ob&;0$h!7c`_i2QQ}DGqu*@RtVj5`0D1`f)vT#gp&ef-GeCAjeCX8p zlq^OGFFfW^TQesiP8XtNnMuUMH@$2}V}<*9|06CnMNL%>*S^>esJ0M2g-U6DS!NQo z!uJfdxgQ5Ht&lEFH4ZNwU~_*R#BGIi?O04zbqUumV;7?>5YHFVrK!Q;wl8zB&V;Pq zhd5k7ms>vcK9kJ9|FXpV3&V=hoJLE;n$s1cGPfmS9mQ)y35dil4FV==Vw?nw(B7%y zHKFswn@8xt&#oui)tZ%IE-P$#(4l7MGy}lxoNg!jE4Z|VgeL8r?kDVX7anhhG}t*k ziQpe6EU=X3}AwQ3LHpB2!ebLH=x z{xT2h6of|tHb;_{*)WYTgX)$S53P6seJK*Ff;=kTgbqmP0A46fW)iX1A{1{V*3I`0 zY$<)P>aec~s4TLSozoeFij6Q$#7R4+*Kv583y*(~H`qDdz|mGGw2fA+&et+QW$i~` zEf4KTS(_IcW>5lG7Uvk2!XDDqHU;fTu_>HcQJboF{V33qYP{Roe43bmRl=mF5 zRU3#NLX8*I@gAbWA0)@_Ro-g?jRBYvKo=Xx43fLgwwkU1xI-YF$ukU+H{PPDABK1# zprpj9gQP!3)Gdt#Rl`;(^JxjNg z?qYm*oyO;_>!4BbCUihT2Sj4`lbJ+pvW;?hK% zG)Nxh@HrPAKZ!ROB)d8K$O&zuxvV-5xtI=>i2cTIRJ@VcXq|KEbbSBsA%edqV9+3b z#Jte(sldD-Bw77Gm=~nW`sM|hK78{+Q?&W!1*v@Bydb^SH!sM@^vw&ktKhfhg$Clc z=7px>x8{Wl@jLTE?>XF`NFwSJO7bNxt%Dr-zyww67QTi{xH`>GWHUfF3t02Q+C0y@ zMt~{^&kX=)Uf9ux@0J0CR0pKpg)nJ2^Fq~4VqO@DB-=^jQry72PE68bw`NW5+E9*mB zU9OCWJueeytHzlZUb#qF9Ty_)D1<4wB@U_oQq@MsaHQjsby)MlN-pM2KJt++P1a$} z3(s2fv|q0Ox|FBIh@)-+eYq?p#c&~%C)b81pdYhD<8 z$d9?)#dPL{w%d6wku<|<1H$b%(>^+D=0~61IP*frVn4!%z~2WE0`r26V9g81I`U+r zPN5j1tQ^j!U@>c6==6Z8@UUtK(jma4xy`6{=7po5N`?o+j0-qBT&;PbM?F8A`5?EZ zVp^R!GjQgGXU1X;)Y;qu{F+42-B5Qo^CJz%IJV}6kze{Ld=C8UzocNz3lrW@Hih)Z z*m%L6IfcNy& zXfXRO6*q*k%ki}X0X86fBw2$sFO2K&84a%^d^=f#H7_jfs*Hwj5S~cZV9g6HYuJ64 z;!kjE6V7GQniooPws$kjw>lqT<7B{^7yfK*f!+u&4FG3e$bOOYsfh??icnWlTw0LU zvgU<%Z=^4=gsYn%?hGhB3Y~f3;S;vPpM-d+5M|8^w|r%(k0Fi+l$<)mtwL*F*kh*) z6=mitkF%KzP-kAKbwEaSeVA6MTwq>!CTxKF22$ZoV5^}gfg?8E?s$L%?n4lveI?%3dB2wC~ID*QQLNhZy|mW%5=a* zrUUxs1-3}_P%XWUa|fJF(NeNkgL&bq-8T2lAUX<_qDxcV!hi{C3Se$>rs2GWHA@wNzko5I|+e7Z+8-VShI0m#`D&VEmMpHd5IJH#tO9n!gQ zHicr#`PiudpCUZs)G!QX@x!K&SJU(U5a1t#(Px|nXH$6NVr4XBB0Nt3Q&4A9`0yNM zG;~1NJ<#B63QgbT78tavF$gCH8k|jGT`s$%0$hpkx?~O3rtnB#tKoix4<&1`HieJQ zqA;T2RfM~fHCUU%l%{s?DHU)WJOZ7oIG9Z%I8f#M+P!((@$l?H#9v|2gRzJsTbUV_uj-X)Hrf?Ap*?ZD) z#isS50Dgm6o5E+mv)d)WM+grk1F`~PQ>fd_R?Qy>qb!ig4Q5uL#HmpImUe(-Lev#1 zr7^5cq55%KGhHG26{4(7;RJVs>CreDVvbNrU8KCSHiceXpXwobGsN0Lx@2v^rf@KB zbN@8ND}{7vs&RPpB&+LFh;Iw&lC=e!!WG;AsaK#P)PHGQYQ8izINZLGU4iOAG!rVR zCfu5#HUfbE+2RRSK@-VmcFYC=ni_jN)C9=o1y zRISBitt7J1gwGI}u8_FaqI2c%wr(6oTGv3_ zl1iCP)*0*&>y9HHT5(7f`F$KTD&B++Naz6WnkF-e*xMo$ZzOiW_YNEh%x>!yJJ@X% zS;}r}gwT?>G!ZB5wpQY>whNCh#vAOmw&JLp6WT_r_IYVZCo2nqHA!4f%Gx9`-kBr{ z7V0yy$;+yV6BX~kA5G88+f;p-DaOFk#=j@OUSrLC^aK zLCKf=NCkRc;v41N2cT*~G!m+hsE#)h6@Jf?>&iz2>IpC~fSMb~^t^W|y4ExmV39yN zlV|98H~m0wxD{f3KuL*Hd*0!7mO|yzwQ_@-gAZ3uw`~@_XL4&1g_4 zFNL!?lC(^RljhPrPq$knmQ6cGVs(*6#hcIp2^|oLEhjU4|5=3Mjl}x<-htBo^t^op zR2ErE&&wxtDK1UKNj>j&4)1f}@dJ2+p0|~wmz>Zxn#-#5kc%NuiP#~2qvDOkuFyIE zQ367l%v94kmL2}|w}TyiVgCPj_+>QuJN)I*=I`)Jh59@E(qH`@e(C7`4u2=I;_vYH z5Wn5wzgYZshkpQmx5NKIDLzt4BI?DLX@6W=bvg2Z32I@CGcHn7hY)@xKy3@y9sZ;J zlsA!ZrMQZW;Vj^G_ zFsY$nhySc^Mbq_&Zx0Zw$?ot!GuziBZ+v+nz@$$7{ri3Dug6#i&>d1AfgEy}Pkg9K z4EMZDU9LZohF(o7xqX1(2BbzuC8RZkFeP_8{Iw_hI@%%anyka_@TYy@>llqRD_Mu# z;U7I;*?e4y^tu!sT%@qWe|)*JE${%+%_%yBIHBfO;$^D3EW42IN!DR^_}}Jq*|g#} zNKYi|usi&}{^{!|!TwD;&h`Yi!$07^yzNA%(g0~(SGe2Z?>fQX;qRR!EKR%f0Kt)R ze(DoNX!p#uutaF&8-Bt|MVPw7uO|61?@NklclaNz#1*H`(2k^-c89;zXg{}~Bnj;f z|8@8HJN$nn3GEL5&2yN5wA%8!g5262{wJ&Z&DBJNHn(<%|1?_&CgvqcG3^fjD{OL_ z4mZWcbUXY-iFs-J#A?y=qup9XIg>I^=Jef~b7Q(542Dih1 zbrD9S0Lu`rNYYc;|PCB z2J8<1$p*^X%<`>Dy~TMQ&ef#d;h$ES`B#AY2%83g+u^_AFv4C428mEtQe0Y)y0$y~ zZ=>R}OsMG)3j#`yLbt+$zk>X9muTw3}@doQlLXXZPKUh9|~3{TvE1KEOJO zCQFnE|IDr4YCh6y148R?JN)1A9KWvfdm$bPC_M{UJr%>*w^OCBAl)Ajl2SZ5xy*3M zOp-eW@>hWA+Dgv%$w=ezXiI0gtB$iZaE2ZJSMNkyOOW;sqoHMgg&qE7Yitt^ML6C8 z1$Ow4U=x*1>v+#|u$*hkx;ZY>K-fJ`~Dyz+t8X+8zE) z7~^z`@(G^Pfi6qQ&IvpG&o8k3r2_lPHE^lAG}SHqX@;FR+Cuac%H-balARNF_!k`a zywS9U8V4~g&}GZ0skKFZJHlhwLR|-OTcFEQc89;*&2}eq3&c~7DzIrU*OhvQe+|~p z)SVbP-FCY*+8pq|z+SW^?Zc~3s6`%-CWn#OFFWP80U=TGCStPaCt~d-Ku)F;v0j19 z5CSJ+V9r<$W%B_yXa#$$;J4Z_V1Qfg*dk6CUS^Y4`SDY(^6AqoF3kMgr&_5idoU z+uK)rEz}cW;2EJ~>Uv^S5KU77t`JDqsL|y1_CH)`*T`ET?g>;?m-O7;e$Q66`JRK= z9Z)jk$2DsAIBDkVj`xBtUqc0f&mm{&-btSap7fBvJ@wF+WgAzhkk93FSI&Hb|w zuNBgzckR1`+i;;bn#NIwAdVN(rK!Q;H4W|B6Qz~Xamh8|RtvqMB=hgTtSJA&uwslR za_#&0(wLIkvERAvRw-e>RlAhHQ)U#iv~RUxs{I^GibBkkOQSugE0JN*1gMbP2xy$6-{a)8<`o z*8H{)qE9~6E(JI!M;Du;l4X=cW3)FT zT5nvM#8+_<2S037t`n?<8jf_5!|Y{V8`WCUYh8DcJ*CNaL|pQaq=?M^K)$POtiV^j zTGo_0xNK-i&uiJ?s$&$VVgstCWyg)gmy?DvO1PG_)II_}7NrtFHdQxBcx`o@u-{#{ z&Cc0sLJOpI@0<;rMuc)W8?&t1_5dj~?9D!tem1Q>vUW~xUMn|;VM`CKg5j}cllQ*1 ztI}Yoi3P}#CpGzF9mwYLiaD)w3Dk|LB!z+IY^4j2A4Q7LzUk>+1dlqQtzv6^xp+rU<#k1< zUgu|@P(O<5_&!nLn`qLXWp7KM@A&yWfDRbQm}s)!v6|8et&TI9JcEhmpYOU#&y1y)su-Ej~TjmQ`d!JE>m z5h`E%OB1m)ntfARD-OH5@c3H12<@BF25~gb32mcQ%l<>s$+{YWH4f&JvNjH0jpxjT z`ipEPV)qj#D&B#Ao1WL^(=+uv9cp@BCji&;z9RbflAoc3CiT332rKc4A08itH0XI1 z5!80V0zGdPYv>MQtBw$Tgvu7x@jjx$?|C20`hP)Zaj+=aoCIjHcxPcL}63 zd4`_%`8lY19OC7Gk`kx(yvtd8pOi!oLVY2m&YA0ZKMY0o8{x%>YSYqMbgulKciB3q z$`Ex@Dbq;OT>6|xw;OjaaLoIEL8IbL=l~3Y1VmyFl9@zoya>h1<2Sx{U_LNC??(bE zi!7z*ts(S2T$+fJdfrwJcewEQuXux=_bx}DI-zYemsRH>7qg%evA_9^iZ>FwRp&hI zGXg4BWiRh~j>S0GfW>yOeY==2Wb*&;_|J55aE$8XHzB%%&dk}q&+?d8Y^Ca5io_<}9r>TiCE z90KTS0c#wrQ3R{30F@Ee3;<^wY|JV(1t6r_Bkd-HNy8ZjA73aYy%9(zIcZ#qizUv! zUF@;x+{mt#Tn(}^z@&x(<6!g-NoOPCtpQ>+S>xa*++b}qy$$klfJvSDroVkE`X%cC zx*#To~TAM$n7LfSwG(^Z^taM)39_tvTOMjF=@?u>&C zNBHmSnwTWC#=&DH{M46TJ3!zOf?SP#96Xw?j1=nt#NSlO@5X?Ns4KW zgI6~2bNfe<&>9DCywiUdTKO-6G_7&)y;;l!IzvrFXme|ggONIZlV6e)(;5eV?&Zgv zk`&V#2Y=b-$GqOfbjHE<={#6Knqjpb;qy4tK1s$weX`(;gUx>QBYXh-T@WEK4%!IT zIQZrTeuUVUtXepmg2k+H@R@T>g@;uGkoEy4&22`tGY;OKCK(+yJ;@rZaga+iqv30WKO}3g#=+c?_UftFS8NF2Tt!*q z;QVns$DK(Y>L6^C3|Qk}9#>Tw=!LLf0662|@NUG;LXamy-Cg3+g0z-34)$a>cxF|o z8zKG^P?lN8<6wA|r4B$G3n)2th+Bo$IQZw?W*n->*Sz`+XEPU| z&N%qdXc^V@U|ObffpKsZn=N707xCy+Brf`V(_hi>)ZZ!SY>+DhOwMt9qC~h3W-qlG z=>q|wbvWbT)QfGMzX{DW05MW_ZOMVF?!g^%pFx-Ns5Ae70y)g@c67ze%87y@VuwHV@tK$k6} zrq&iI!hMX3h1vk|M4-!3t*W4_X0%xoyRY$Ih<%PS_C7fc*Y-X+2iL~I=GF0}yj@IA zxAk`K{}uM41F45ZOs)(PF}YZX#L5uD+cgM@ikD}D^zU#9kdx^|EGv*1Lf}L!UxIr= z47>(K7zbs?%f3uZINvz90!}un3cpNDB3R>~l(O*4#H4^J#zDO}8snf|SdDQ|x|1~y z%DiligE9j<<6uKJiJIfmo+iy?<6sX0hdO~-_FjPTqi$B&NM{Gc8zS_LgYPlR?h}nG z0M-uB_3lE<-pb(BO=NucqNu#@B+eD1@QA=je~2J+Y#{@!lTK6H4Z)) zQr>APh4(${AI@p8#=)(-xl2HRst9W(1J*bw7imYN_B$f%BY^G^@nh1g{)0cC@3PPY zfZQ`e$5hjU%KJq$EeE(mAYB@x$r%SPV-C`5$Gsj-X)HI9TOTjGfXRk0E?o0KdttaZq-c4hygs;YZ1UtUVY9 zPcR4Qp8XTTe*{QsFlQXhdCzw5j1ye?<5C;L8V6@hx4oksM6W`WH4g4N+opIq#B`xj zQnbdwW1H-dydL8ALb_yC!8kZ*jMeoR#P&kEG{u8I7zFg-`~c#MLb_yC;lZB?3}LcL781GkLB1KJq;@*1 ze_DjRv)jDHFJJg9B~o<{KWUOkvZ-lSc{&gA#T1l?y@E6{NLpuA$m0{X7oH~u4{aN{u#R|T1*$llS@OcV<4GSIS-9d@ zIjm<6ONJ}P?!{8xV3USRV@MH27dBSe=)WG9CN>UZNHG>9iKxGCYCdvWMy%Y%5Jo0(+$xD@x@URah8W?7&zzoy# zXIb^JIHWwIr9;hTcwYdw8GefRe~R`AgeGlGR+$X_Hj5Hu>@gbqmPfJkf`nZYn4Lh&;Geeb|qfY}VM@(Y{cB4elpW|#-T zw&2o4oU|GK5@G*!;qjVCgU#?y5gc}wsCWm;GuHIHSAIQH&(oo%=e-HwdfpVG&%~vDPH0lkTT0l?EiB+9;rG1eigz{%^gTa+1klF@GCi+o+-fRAXbqgnYTZrw|FkHe8N|VOjk%;Ytgy#dtT%38S)Q6 zJeEqCMv~^zjilQx5|h73>>bdkczJi8{*{18tRb06#J&@ucq6gjeD6SMe|p{=EC-cE zmeTX86IutCCgP-?cOi$}TzGsT-k|3V=IC-Kw2kJn>OAD)Z*q}{T?HEzZzT4p&hxDj z(5xC}m;V)CJkqXx#6IgVU8gA(MfeL3(PRD zv-lY$B{9!dz!@cRsiD9OQ{-LI)By2?0U{NLCToTX_wlnc5M)e%NuByemVIjVVD244 zcStP&xyoTa@uB+au<~Bf<+>Z`dLc~JI5SKmHW`eLmyo`mtV2J=bx5^e%mdO?Anlu?Lx>Y< zh@62?_aT*ybVjlcYliuOd-RQt8<4I_)?v*sZ^h^YTF0YEw*@+!8K!bQE_ZZk-$NSL z74FP1Rf_q~Xq`wBS~JYuqx=$-`iq#UW|;bn9+Pk#5vH19p3m`Pc1wzB%`hM2`Z32P z#k6Lac9WFN?cyY%HN*V;f}h*9Ny1B8P@7dkRfllUp$NV`drZvOJbYfzr|LvF4nPC>SR$d0R&;BREPB=S2q&kc(MxQJ=Gfc}T{0Jj} z^MVM08OBDiW|-6eaLKGwxC!{qAcDoL8Rmt3rlW+_HjrHbCe3X|wKKzjLw%+2bb%8V8~qxBc! z7*%hJ{f&|OW|(u3oadx=1#@PYuXyt56cJPhkc%7^|3j2GGfboo=KvcS2@@cu2<1=l z)(n$PXP1^&*CM>hsX>DVR)$tDQM%66g9x_-8k`yC{Qahm)td<44Kz42OuT~Ca17ze zK!Y>Gbj#x;Lh?{jR(G782AvtE46{ZX0qP-aB7k2CYlgXFFpr80&pR_6AiO;pux6OQn<(!Pqf|YH@abg0nqmIAiRXO<*o*L^0B~lQ z-(E!c1A;$AsMpE3v>fILk3wgLX}Z8R*@Y0@3Q^V!Q+1)G zMnlX9C^>bATZPsPGi91ZmxJAPCe)c>x?L)xdMnJ1R4y>XlzT^z4-kKyio_*p-^fxl z{5-~GbsD62$Q4x1aeSggIDafeCepeAp>;Sj%*i)wqjZJn7f^Z@aAuein0po9WAf$( zgrpQtPA)UN?GtMLCXjUjrfVxX-zOt4vv#O$AiDzW49{p?*$Qo+fPCpN8d|o(FvBe2 zPmj9O2#beZ`E|aX8K(1IGa0EG5DkSgvz?`^8D<&hMTex{^@JE$h_YswEgkGAodz*q zDANHwZbT(t)(lg3m>sIOLEIbYvXpFcVTS2f(&qkoh}R40(p0zbQEFHwYjqgn`$D>Q zEM`5;FY@%0ynho?#TW@?aW-GJjG9_or0?r|6+o!^5UqqtsR?U_dAF?HbnXvvnWG9k zb|vTF+6>diH^aEM<;dx_yX#)tZ2lM6i+;knKq4kr28ozlEJR}eAtVxekC3Q%6EQhm zNW{LB06CdX#C`~5h7dRri_#R)cYz1qgCfi@{}iVf=9@0U`DU2%aIy(z%`kF(Vc)+d z`&!lvBN;FJjFuEI#SEhtePf2v3#&21NO!Vk7@1YA8Aj$$XNGx-OuT?glT0R?VcsF| zb0;v%UIZ(eA9b@jiS%?plop|HhPf+?3L-$2k1DS^&ghS8$eCd-IH0@{Xi#k+Itx`* z;@CxtZ@Mgeh}XpmFaqJ_PK^(=RU?jala2uS2$u?AG&nQN>BT%QEWkR18w4-~b!M1E zDR$BYcnRU_fd*@38KUa6Ro)5#4kP>~(BRB4KhLLA3lJ{KB!F|J@XaukLTjjj@O%MG z9?C0ghIy+WCu^di3&P&X8mt*+&_27WjYpW13|KSFhfBEsOEg@A@Wy1onqfX0Xn~Cg zA58|V8Rkc(jJi_$Zy?++fX-yRF=5UOvz@C04Sf&r#~GnxYW76dXwg(Aro1XRQy)f? zGsE<{(XNp#A-V`<((5ki1!kCh+W|&GObaMI?Q7JTVGcaSys{MJ=2Q%2_8G0m$JsjA z4Dob8=^{Ea%-S!|vj^#C0g=4Q*k`mB>;(H6L~&7M^DaF;FvILP528HM%8no})(mrb z8(#4$4b}o-I|2NzZ_O~f>1h)M7=mzAG9YUYW|&dyZPm;}xKx0o26JYZwqxx8SqHJ% zsqq`bnqf*tY|Xp|v9}Oq%`p8N+7ypN{3cXNiq;Hs3)^3MK&3OIRK}$?zpN^lVOE6g zxNHH@S*R3Unra+Ahpi8-YXrokLb`S^xG}@be^{Bd=PHO5g>-3ZaJb?X3^FEUwFzQd z0bOpj&>KoJ|E4~pm9nDz3&V;bkAx&*CFlxKncEVvv&Cye35dkb3j*3`qJ;!B*4|Fy zHKBdP+nvw>@&%(<#WkuF51Z(Z5wDle(WifXF-z}fBf(@DY1D|LyEiec^k?QPuG62H zf9V`TAGj1ItUpA&;iHwZxwdgC!4Ik@34b1!CaRT}X~G{?Y7c=2oWOkdv#fe~6Xy+& z{fATRImpyc{QMzMQ60OidaoDqCr6G}-jyOR!}-NII49rN9{ICh-m1KGiE#n4Rw6g4 zmsMK+(%Y+;!X*Bs$VNJOyeA7J3(WC6l)Q1rdMZGa%mK)EkS~8{6RcKp2eSK}+*h)4 zIZ8g9{(+rVw*$N(kS9AjV>ut#NskIq1!{wVoVh>xh1=$dhl~FGoz&}<^ zAkGwAnzXL$q3ZAnDxa_wE?nOS6c_zoC$*iJO0DDIVFv{JsEs_)PdOU%4I=F+5JJvB zBwkdc1LOtFv5H?DjQc(DhehtVx z3ApK%C*<|-Wz;P-AWo`YXU34LddRCG8tNcy<^a>6d)%1lJq9eZrSz3@a6w;@myOuIvRS;QuXI9# z?JLE=ZC^Q;mDlx^*@Q2|rAac$ePsoKYn;HmY|8bOhY>sz2-Aq``byKxkk~sid8co;z~yaeWkBw)!c>fK?nG1Y+o51w!PqGh_{8(1&-H| zT5)~lHovcY1MzbKO81q5FJqJ@OT@~eB`WpF_piijLZxur*d_tu9U!v;E8G{%xP@1^ z4q&dU++D*>E9>NgTc&?J&=kh5aPo-=x5C{{_*z_=s7_wtwh$;=7e-({J>jo#HJL7k zB2)YMIVg|}7_MvW3U^DrkaxMrf9B_}WVu=42K>#Qp2R4}Peq(f-CyBuJ}cx+llV=M zb#QXiF8&I)rDVt`8457kL1aQV|2xf)YbEoLEp>8ViCN)BG_`GeH^4&z>5|0%z>6lc z!qqKjp;rifrvP-uX+Ub5M~XqC;!VUPBZ(Lqy{LExT)-I%E8Oh_*cDDbzC|P26;9r8 z8?105b1PgA;`GI(N$V!9aH9#E;llN6aN?q0)~-gLsKC?M6U~J~$lP79QIQUiX@$<# z_v|xuwnxB%&L;1MwWm|^!d2VZ?uD_PP2N`KI$M!)$}53O6V=I`trCH?oxr>W&F^fb zDuujVC{!H*dI&U7$M!qhH|Zg7ugJ$Bo0u#&ovq5*A#b$ASb}Vs$W7{gXZwQI{Y2v5 zi|i36_xp)CojOv@D%l0F$3d>MJ&0T@`3l)jPVOr)o$a>Y?3q$YvQq(PN)n%d*LAkH zD6Zb1ZA56B0+8-(1?Lf|?MQ4GXjHt3m}Ddo%aH)_4v_cQ(AkQV{~tP=yuaXo=xp0i zvRyJEt((-@_7L`&3pbrj^cUz_qB*s*NeG!M4jUE!0QtN$XG~#kY&pX!n1FM=?WlYN z+^&Lmi`T4z`sCf5F~z~%(l>*HxwtgZoxJp2PvGrN5dVxbem~alY9oTJfv^~HX&ZBz z^fy}_y^yK@^0QB%vRbuU`flSIyQu)*^Ye2uV3)p=jIZ_rh_T>ooYP>JKE-8i6;av{ zVRHdY?%mRN6?fAqTF$;g)iZ;SPWWG+@CL}6bBVR)46$VV__6f6 zsU((oyaDnVZbnM=bKFRg&J|3{<|yXo;{B*Uh)a_gNyFni!cM#Jcx|Nm#|#G1LbWvZ ztf!IhF(FikWILg+kOrJzNf+dDR1_?})T&<){Yh^rh%r}D~;FR_rCaQwipSm z-=QA&|8g-?zfg!b@?jm}s49^l9Z5{8xx6aUSb3GcRWI=;67?FAy|}cqOY6Wg)ZFG|AQPCsDDwXrzh7U5<-qD!X{#m@*9XTb)BIQk`4TlTw{`u_TE^mE)%>E^U+?nUBA^>P*kD)P)GU1(g1@ zkgi3YsMM=?$Z$RWBC+wHQOW9n7frVHOWGvcy0@ofJ0-*$`KrzKS(V6kHhNOBz55Sd zhmS<_uXg&=r-e_V}q= z$jdBWP437YU6qW8M>5h$iA1Shkb`h(B31DT{4#%wETf9bLNGTF%AK_F8A3EuCxsZG zsv%W3@w3KZ_Hw_E>h=tqxe@i~ATA7u!;QfqjlTf;s>8iLD$2HaMhP{)k6o=prNbKh z3g|Zn#^v7O_0l&Z(@tb8)sf`gY?!>UTD;GU}?ghq?qJn(hwS zzYu-bgV0UXi0+P#YI+vrl0tN+o1j~((}NvdRMYoEKATFL8*lZnXrW58S(=gaT#!gi zNBfv4zXZ_)jt4*a6rR!_d6l?hRppCZn#FYF3RRR>17}NbQ`*J0T*j6G0~}mj!(9Le zrouXd=+9$i&6unj22o1rD09HC3ZmHDe9Z+~h6?rLRZ)^6?OamR>mi>C=*P&qN#JaK zyLiS8U3$|4cS9TwsDnc3pYU0DTd2D)40+{SY^R|`0m{>~@^B{h51c6~cVTtsWl|Y) zRX%TRn| zlbB)k4>8VR7}{n|tum8T7xjEEO7MHlizPxs;MPF|QSOaWEqXwFqE=|+;y^3~)`LxE zZ>em~f061z5Q&Yt*7HX9M8TDWje%Ik|Jc~bidq=piydX1m=aB0FRJ8d*q@y%rR+*vEkjG@UBf&&>+pI4cas}|~(S5R1c zH#P;S2D(RB$EXHv9<4$hv`h%$r_we^kTt{@2JbqWVzG5x$62l`8a>~ z5Rwj+E~2&0LF0{q*3@`B1u-^6l=|m$sY;ZHjpxMD9kyl%oWImF(u zxhsd)%VD_s8WrxOBoU=*qrWLGO%mb-L;Nzki>yLF)s>@Rflx{v-z^m&X)?tx6Ksfj zk`kyHaQTjPZPm9U$cShM(qeYk|RwGN=Hx`mo~G$q_!_|eTn2` z6l@S@N^KHK6sleb20NiGSPRv<9CpRbEq5#LWGmAVH9Z&dI!DK=w4k=+hk5F;*HBvR z#0=hfz_D~h9pfSBm(CEw^s>(CO&*A7Q=>W~QhJ$=a-aaN`y-XHk50_@pOHp?n9O~~ z*DSR^iP%_@rsrxJx~1wVH=p{vCC^!EC_kFe2xgse*s(ew+DuL}Jm z3Gh-m)o3PMpYFFQPv#Y=I?Wx0`7W80Ti)yUt^6ZzY3gt4OLJ-Ga(#xg*J3LoNttNs?OHI)HqRIr$LJ6mU!)N@;j4-~$4i_U)`{J_k4M!bX}&)65Hj zGKnjl^<9E`oVcDHjJ65!KV6G%`Yp$PH*KcM(@ooEDv_!ph|j{MNq6>Fj~1#croU|D>fk*j|slR_k7^FX4Hx0JkJE#9J3bR@O{Z>=s|eW*n2 zugfXNO*GcJ(yi7I{x$=>@=-<_nO04gB~3l)e|&}otMx&8K)Cv~D*bBOyL20KxLl=g z*oU;OIb5OA*U;fgw=;*URQlS*9JV)ycc}DCu6IgzFo$b+21zndy0fZB;!SXAk_)V1 zs$L7iFH({*)swJ6PUvQ?$j4}&nNKgWJv*f7Igt56@8?Hmu4Qb{l)mDPCTzsuF49lb_$_06+eVmDp6wdu0oEY;!VV=4VP*@E&(!bBHG&{ zkEt?NueGceW4LgxEFN=FClaMH&*%OcT$)H#Jd0meLnCWVcqb>LI&z6pubujpG}I6T zcJA#+@mntgv*uez|AGCdR-bk z;(2o=gc(zFAHaMX=xeT;bcO5o#}duNH1j9&l676t%3etK)C*(_Rf=bT>h;+Dw408K z=@|8(n@9|kdUKV_IaIw~od@e27T3%r$j1a)^}23P1Iu4e9xmFnS?8gIrt=}M59oZU z-sWm;Gt^#u;}H#()Zj*-X9DmPpr6?jT$0wiq{#=|-E4+mDIMbg^syjD@(ISR+#_4> z((zx}eQz#=bc~WHErT;{O+NPAONIxm{!91E4+@x_Pb9TLR#V;jnT9;#g!fK|zo=CQ9DUqtD z`FRzWCROIo+2hnU$?^Fk``VpP=4?$L7IKn4p9|`NME@YXN%Sj8w37IxI88l{gGA3| zd!SwwB~n!nvAj_yO)?iGI+^vYUbWUsgG4nw$dPgBTT)0FU6I%{1X0PC2}r~iOMu7{ zvE|~eO+opl7+&l@{5JVy6*o>ctPy1z^>CHNqtEmITE;fyc`Q^iAEwW|h8uNjP1C{( z>0dDOG?X`2BCBz^I*5*j=PS{tPV$qs2+l7A35m`oXEQCv8deg&sA*c7j4&>CiTtrFCQrpG!mURF+Wz1VbqBnQRjNCqjcWGtd{k%-AU zkci!ZI4YMk5$zqX7PjT2|L31L^_Nm@O^@=+qGSI@b!7XCC==!a>0+;(>}5@ox;aYl zkGP4ybmK`dJSg510&KKGaN@<%NbzXlUgqx)*uLsZ)d(YLqeY&navE z4-r4w2rDs8#}|*1GDlBHoCq2AbNi*ub^Fc?1hDRf;^dqQ?qk1Ld>!~i(AkCYZs0x^ zn`G+7>!Q3nK-U+>vmpF}FSivi3VavnVIS8GOaZ3SHgRQo!ZeK(6xo}wncd@ zjP0La+W+=Ux-WvB^6}(ycUBTi%TJ|W`Uiuj(l`BszNTwV)AtgE=BhCR&E~3Ktqlg7 z{;`f^I$S^@W;OD_#2a4ubpF&?jpeYbKHQS;MP-vs|K!|Rj91~$neIiGUyReXI6Fuu+KkgFT(-p2#d%xwR3fN1F3>}9id415v7UK;$ZYHJ zCW)$nwivhA|IFUp0#EpDxNK1@#W_#^kIHVS{|9Hc)c<|6JL>=LUQYis&-44ptgWU4 zFGAB(0Po^-#}$um{OMkio8H$^nefk%@fhbPXD&+o$Q!JZLn!$Rv^ZBbDN4MY&!{QC za!QvolR*26cmx2nWg$GPJxPSR5#A4{Yf3!SX&+9GCrN~jHqCGB|2mY-A$&0|TVjS* z4)(I16FqXF^#Cr=Gkpd-XOT7%=tYN$N{Qy@>rR_LEDhdUgdfCZixO03uh#!8n;)Wj zjU`Xn|53#F8z6&AI9&lc*EGruonU7P*9)hlnNzh4PgC0L4|~$I!wxjGgW6e8!-P3= zyvU9ID4a9b9Soi@XP!IgJ7F%^O$O^eVJ?_GXg^^tm_6_&%mZ6tu-JroVD_N&gn3~0 zpn{h(i9Gsw+x?WuW9G%m`-1%KYMETh@XBlRCrtMut0g$Ra#4QnR9mJuZM?j3UgS<$ zIc2KP%k?66nSaL_q#UU1MoZ#KEU+pN94^JbH4d(by;Ho3M3 z{qv-%)){PYo>Y}R7?vkhWe-N>N$uQYuyJ`(JN6(ePwK!POs0qQm)826n(%Aj@~7>n zp(ehgxPKL>iKp|uoCa)N`2FI*Ii|-Sg0Iwy8_RIIe~3qgS8mib_v3z!!YkM1=f=)9 z{5v+@%x0XPMt(AR?LM>b-}K&7FK{9iUb!WIR<5Pzmp8GlMU7PNZ?>kqTwn5l)yHEg zk&x<1Q-oIboju8mMC?KT+1XwsY7Yj_MoG+`>kI>qW>XPSF>z+qszBVYN$4k>9$4aG zfYz+YXp+|?kGFNS!v44K%ec6Zx9Q-rC8nMdmx`W-1a-v)dh`H|wv#|F+DKGNG`||l zCrm-tp>i_e3vk(@M5e!1`hS#{b04ZJSaOK{_by@n2Y42z8$jpUAE41L60QfRq?vP9 z2Im|$=4AUn3Jr&#8oZqC;6Ap{;yb|Ot!Z_f#>Hb!Q94QzpAg4q_uDv`{n!El zn_3`F_uT6&@uvOHo9;yy+$*cfO0G_G+F?octNTg6i=u1=iZ=VoT!}vzKy%$8;kv|f zs+F@I4clzYkL~{X) zQv1JyI7Qo%rN6nUwOB6K#yV4T?}7E19Lr`>`xn4Yn3gvK*67Xha-N2rVwvmg|03A_ zu+wn524C(?-AJ$PaxO1hyZ4|@h}ktZ3nE$v18L4j=vi;e@|^uYgq}4Jn|wXuF`aQ` z6XN_%96!zVHtqHUnXbT&`*B>_?{VQ=?3AB&&N=KH`jK|p$m@t)s-5!c;8HR^uhr#b zJZk3_uA^EL+mH3BjqMHM7Cd5R6^eZm7QJF=LF^I4_G6u}u}2Ym88L4!7~9Lq2lugz zN~SyQ0Dl^Ee?ffSWNd@Q&Ql`L9bIgYIrpIA92>Qh{m&fCbMR0V+7~SC?M&arx+xI^ zDqcoKXB%~@{a=KNwosQ9Qn61|^j7|G%@MQJG#l$q`+tbo^NG2-Q0)EOrBLjWAa>E3 zn2v0(c*p*?AHuvy%-8+cu6N|r0$*bj*=GOOfqw%U?NG3^kFx1h>?*s6(6&8^?Z?_{ zV|zoDcOEf27m9rscI9F#g0`JZY(LibHuflDUrx*=g<{veinQ+yVmDzd_yzpj7IX)( z?<3}8er)lWVIU(cr$2H0lwy@l_sG0Vc^`oN=-ha5$u4YZS&&hm}jEDIV`$?W>lU_v9!wJ{3N{O0o zRuNS`)4{TbV3!fDXO$8){aK~W8;vBPEo2fS)u8_V?PDLPU^t3qPS< z{2avTiCH`;6SG8{^b9`@?KOR#{ck^vxa|Lwz-5aLJuwUE6aVpd0U+x_HBBaKzuup` zUQdvzyi$pGhuF#+N?`Ig-AX0aAX3vMSc>Xhpd@msN@^iNXR6amP)vqm2`aOJ#Bl+*GeUU+JU z$w~Xah&X!@9`fUe$He&z{EFvzoH~9m^fRHw+4<6?7f(uW**%P9{0NAzb!m1)YQ;N* z_J+_caoM6nU$==tEYyvlVK}W(JSiH*GBrtJ`I`1vjr~V5F%W(|E?acy{wJhQoU-Ir z$jyX5nM~#kLa|STC!1WB9mNR<)R#D2Z{jg^Ahxy~vAPwp?1C94P9AZJv-?((EuY zaMJ$2LLzy&^Ssj6nKSzKGnZq!Dt)~<>O6BN=b)vR%bf(_l`HaRR{4s<8#24g;nxdu z$5<^J?0?=wuk?))Rjw_##?PB#QtL6*{5NLnPNycXd7^H+o7Ce;-|>1>HkWKxfr*6VN7DpJ`>;CZjPW!RiU< ztXlpAG&g%cd&HI*V*gjcuJHAycXN8>qnJLEYuQt<^2JN7H@%y$Hxk=PU{t=cnIj*~ z^k)>=8c{D`FxuVkoj63B+ zt&nuV=^?ML1-wZ@ceLx<2>V}lEEkxBPsL?RBpKsb$L7%?7jU!{r&WkYO~09Qr!qGl zq!p&0;Eu2|H_AoD^lLbOEpwx+*VF5^7q6UKdC|SdCW&4@t#MV%G@VD92M7=MBuz<0 zrs-?+|G4a%_5a}PyYzqG?2Y=rJ9F{srPN^AD|jiNt%W=6|3389L01c$t_|^+8k8h* znh?iNd#=qxlX2t=;bcF~k-6qdfU_2GU$r;XWO)_%4WOF};DhH)Tfv=nCG80zyIHe{ zJ<&lKUr^>}VZO~u|I0ZsW>@rFoGz`+ zIs1{%g8OMcZ`0li-VJnskGsmr`54^C-m!Su@w@^H^s2)6U*JCWr^WNY9{}Cy<9;>H zyOjmI%(&o0x$=C^^NX;-7G)o?zaXZ^c4u-?vgWnnT&~Q-Aa;9V|7FuWE7P<|lL391Wf^=1t6nx5*$4t?chbE3g{o?3~46u9-8-+yAl?v45fO znu1Bqkq}auvt0iVp5t`6I}vl1GF&QHMd#Unxoz)pqU`V$ipPw@Qe+})4+A*#9$}y2 zbgPJmx$!^OFjKsWKeXLsv4Q>HhsGjomH$utTcQ5z#}|)O_l$La z@s{p3ri#bSc=B1Sb@ph~j164bp511z);`#a%KPi1^2ADxJP)zaPKM9e|5GIK8)%f1 zO`S#Ym{BykD&2D1Vn$voxihe0OOv@V_P_rWu5ExPOdT@`M0TRcnU^IuhKG6~n1$1| zE*@R$75ceauh8!bLZ{2;tt<4?cZNshW^&UCqBc~+BzKSf-%4`#5H4rM*`l7rvIpq@ zaoHpFKPEu^-`C5M8_+}VaC8J0WFl#Ya*`;z*D9}G(*%b=yFw~$r_gE zY5(&e8$z`VNak3%m)$3FEx8YJDAX*Ru3_=$MwA_@3L~!IP_dFYY z(0L|nO{P(P&`+EivWJ@PGqjqq5{?xn_bMB2fQ>ivM!A`O{Mx0`Jfmzs&yr`eyc0zE zuWZN4g|BY+>6__08CB$otm*H*$i{yac`j?g!tYuWTvN`u@)Uy>ecd(NTKN!ZgWar$1OJ7S3&fx3fI) zz>q#nDg8dXw2i6ERnxEpQ1Y$p{ANova7i^k`w#6oG(S6nhzq{?i&SZP^Y#TPE>?}S?-0J$+IIq9H|<+Qgnsx!D|;_i!?maHVwI&m{THiT?HRmS zE!3V7i`6pi8M#=k!ox)$n(j6}G;Pwpjrg9_z7z8os~y@W*Lzv=K%KXf^8A1cS~TeK z3l{3i8ZIZ%ra{L@gHl6M3x3Uf)YjC{DQc)R`_64}*`k(G=Wesrce8~Ss}HnoeS6{Zh$xzuDR1`^cqT`++ncS3Q?2%2z9@%7aZ89^e z$rE5!*5AvKC)E7J`q@PDNOT+tt|^qLY>a2zAibZxqZ#=!SnQFR&NFT>%Q~fz=em4_ zA9XaP*@xooD2=fh9+XDxlQXpDn?-YY<^B0awLM&yua}C9n?-kcpb}_0}p(+nG zarVEHvwdy8(e;$c$yNELMV}I7Vxczqw9>y8=GL}Z`@!m+*_FN0jAwp{3C_-mo-dx2 z`9fQ1|7-DgJDY6G%;SN_j1P@`Oa9C$a`=%PGM|!U&N#J?wyi% zsfHUkN6Pr!R)d!#Pq6xt_S?w)^EgQ+;@v5cr3rH9TjWjqzeL@~Dv?oC$;>C&CqMF( z>-$#zLpPJ3t*G3Ax@v6ir`F{>Jx`ZVazY@rH&0L2yzL1xypr9PZ>_5Dtg0nS*Iy|m z6^Mm$i8>{HJKbhs1zFI>S#Kabc;iFse4*r&!)t966e@_g+a8|yjyzmM3j5cBgwvE{OvXK&3p5xr5Kw|(Bm z8rIX~yvZykIZO<>xa1mqI)9#C(^}ga+>$>}_wClo^vBKl^K{Q|txR{_n4kN;RXxKis9wR!?}J=mfC2m$k8ft^H@rbq%L(I8> zgN(&%(A4l!s}2-r2Qi&dECap_QF;Z@0;vZ6hvGQ)L89vA{TTCy&JXdav(m z^!K05{g3DlV+{!OvlF^to<4P$tK{4vymH5aMXEi^=n_?71g&s|n#^fE7Y0j|uGaZV zPEF{T3zw*&Y>{UyP-Y~)vtV{ko|myu{qd9@#|vj?ahR{(e_Ia(a9xRubtTGNH>*Y; zle0DU|5I|eM78UO(z}#ATC2B4b6Z?&ur2m~iCV}L!x;}N{p2q9xX757M|_vtk}kc( zM0lMN*Pyh!3zYb`h4ZwA7p#U83m2(ry2J-$;Ox-B%q2_IEO|C|r!}!r1N(UJHsfVA zWVF;s_uPXv!Lc?$?)S*}f1JGsd{jmE$9-p0SO{jrCM1Ck5Yp(qH|f1sgLI@x2)!eU zfQX`i3WACVihu-Eds*sywUbkmQU`4-qMz25mvi5={dAs`12aQG+yeYyIh)Sp`4vS=y$!p6W*jQ<;^49NT_FB%WpRQ>2uqk7T-K2rI!)0$BLS-0uAWyCv8hOMP0veiMDgfMqDOB+oUgDvq;1* zyrNy|oZj4uy63rDrrctMcJYLM&5=y0ix#o_mig*}l*h@rFX$Y5fgs!jOcvZdB z4>sIpzPeTF??)T%FkeMUgZ;^dS?4?X@*ew}HpL?Lq2z>F^lh~AWC6|4?`MyyMX8i; zJDeEW3Dbv-lc3o#=rZMVD<{UvnXi`BA-yP{nJA27*7ssZICmrW9h{!^i6?UFDRw>i z8Y@XxwJYv+_CAqp{Y3oVxIB@8Wntyi6N$x!@a`i{OB7E5iLLq|QMg=5L#@OkNNfwb z8!k^|Xo>s!BXJ<1NjNQ0JOv~^IS`4$ z*8seS)8-D>Zb;rRtvU}zzp(c_)co6UX~*7XVna9LiltUcy1 z{=;^y%PJm|+=~<@fAsZ^^Qy(3w)buDi~x3XVV;7?t)d28mY*zZ!cEK;VB6xdipM0^ zo7%{~0?*GDn>@|zK1_t?Ltx(*<|&ZeoCEMDWcmI96&z+ONIV59=#*5s2y%s|+eD6# zNJG#qad{#`Drn9t954pD`FavL3a2YwJOyNa3TUkGxw0x-nKkEPdx>9(%M%&8(ret{ zI4{^;i?{53Imn#=_ThA;i^r(t+mWbcFFbEs?7#MY8J-KkqB+&jJmL`^QOh%KrN@3I z{4YQ1IJtHqJ=flQ+|2$zEbU!>@d*EfAwy<5p~b!~g!O`6wl!i0bICuxo;8={zoDYF zm&ln6^w|P(WDAdhm7RK#H#82%$T;LYVDCpj-Uwh3POD!$VfB6GTcWv#I2zW3Ec^)Yg+SN4aPfF0LXjH@>k`S=J!9qL zp84|e((#smnZ4Isz#I+eXNBcB`Du(CW2c*Pt+n^%!2beTl=C5-OFe|@1}tNM3p-=s zmw{IX+VE=lOFYea*1}R}m{fW!R8D`Oqg}WjPPO!oz1Ul|utD~|4ftZ9_g@XqW*8c5 zVfWg5!fiYX19ZO&*F&q8zMT=sg?(b-6M>%t`t#NBMrh`kg{he)??-@_E>bhO zljW1or3V>f*=O#RkK17db(1SXJQRTK`mT?YtbDiJ#kRFP+u(T=*fy6(JkmRORi0yw{D1gj zl&jAPR<8+**(m_#aI&SdDjwnCvDleTnQvnVl2byn2o=*I^3a&&vQdI)B7es^j$*Bm zx?t}Ukz5n}wYUOGaPs9-y$JqN3;6s4Uap7*}bw<*TNxW8BDn%J1UkCRsCF&WR zHdEqJ#l^lRS1$1sWi9hWDP(Lvs7 zeIJ_ln7*^OHi_Z>e#>#x-k0COFvy8pTU=y8b7#xH)`S}QWDu6gyB_@;`2PPxZAX-@2YPl;YyNR4kMmC8GK@aTw1;7LMjK5^KpSxq+`u`ix20yuq_r| z^DdtC;&@Mg0khmD$Duh+cFI+eINh`4Lw@-!-f^5hM@>RepP2h{IBSBMh|_A*Du^tO zP;_xdTGqeq-7U_vHwqM|_+iIcWEK33yZ1=OmHog%YB5wqks9VKXg!BJfo}Pr7hBzWwifwXodN?Y&UGmXVN~!0Q%rgoK>& z>`~)%eTE0p1DuYzuu~RZa~V&90PXC;#iI?Yycdw(|KD~}w?m!SsvXdHQ3e&)p6sb& zMv>)6m;}?0t^{obgj@3MfQ^Hr(25n=3zv7Y%m9^|8E@0)t+X788DX6gh^{c&0^;xS$Q4@#Av z&+z<$P3W4cCgC2-*%t>k%jI#0=h;J;Hl(FR)zt>B#q8nC8*ET-&E-#en6c7Ix!&Hl zA?-mV?J6Wq%q4cCNt6&Uz~~xFoImCPo?)`ABkVol9?nfced~(w3X%U7@R_!(>+O9a z@ZuAh(%^KNT?6fmk#7?FDiVJ!PLE9DQFa2|8b9wnGr5SBj}ng+0ngb1(;YyMApAz+ zXXEljl8i*P^?j(5Kl~wPJ2uy~Y8rLcyq7;`0uY=OnH^au>LDntR!j@@DGNn3GTk98 zNd3s^+G<9`Tk=Laze|W=Gg{Q%N^^>yub0lT0s7M!($+5cp> z5Jke^MF)7q%7QN1`$E9=J#fI6sLeQ%y8w1U&gZ5OX93^ffs1(H{O=fwm!34Bb@tw7 zCF>u+_u_Pky`eaN#5Nwr`NqI=E|~iU;LifRSO{+C5!Xgf&}EjH3DX8QDC(ozG>;ZG z8BO(II_odg;tK9%6NtWFIq95pnYs=6uGR9GC-r3b9c~B0#r8e|a7(~>IGuU%Xp3m3 zniC0zr|9{YK67042eF(iD#vM2X^&jKF}^wC0aug-ev*5uWh33_#A)JBv4 zoVMo5O#8~D(PlN90myZ$D_x7Cy5wW`S$5Z;oxN`Wd>L?Y&dhYa#S@{~5(KqosT(dCcDTAwkXrFS`=N6CuF| zk1k_9In$7@9bdM&^_?<#$$F3-&*^9nr}JP(0($#J;I4%pWDVy+;5~tw8i?|x>2Z!4 zh*?cju%OHKeira#z*`E*_L_oS1|Up#Ula72g0SiCtCwh_Nx&6+OD$v0+dRbnFR1t# z1v76G80^j;OagAuCNL!0O<;_CJ>8dvkY+et@8WS+W3BMp)mVGHPON-qJyt%at}kOH z^?5c&&)EA0a+Xj0B3zzGmd22y??dxy={s+k%D;N~RuFm;r_&XW+uk04>cq<5ZjBW& zM{Uhra@*S)-hU+iOI)4^ktEjYJMHZ_!|XPjnR{y+b&Y_-#~D^FT)3{~V9`ulKC{E@ zx?9Y=#SL>Fo*zSF$gypvp}p@zUN2+~Eg+92 zY^$d3WKNNvEHz~?pk(&ko#AmT)in%VsJ%{J{0 zW@`Mq+tTN&4-YZ1`6D`;rRfFxU;8^~1o+06QJ;pQRLnJ<6w z@T1K@>H4M&(T^yn2hhPTT+b7A?GLB+U078M9|3#`P^0!lpQ(Lh%O6k_KWMB`U3=dL z_-Vi|TqQeS{uaZP*~iMxTE{EVK)-R};-RrH`pREL_RJk1L7|c z|2r;E*mXsYM5c>))FPuFW&h_UUUtN3O^8PiBGMx=rl;L)2a%o9oWDVrF6Y};!U!Y` zfN7>H!5u_QpPFhXvO}F&UAHoW{LR!v>EF$LAKZ__X<9~VAkb`R+Q?2Y&^xb&%OAS9 zTduAdSP1+npl`bHf*Gu)gb>c4{6mdfwwG-g&m!U?s2mRCbQ!I6%AIMq^rx({$i4PH zU(MK$IZsmZhc6=B$>~b)>F5eWde0$96Whz+%5< z|6+{%HHq&Jkfk}r)AmC=?&PK%eml9z!t2C72HZ?;6t-qUSr>GTnySKKjcvm(%v%@Cnv` zKwop=-mXT-e~`G?AY=EK0b;Jt5c~;OeG`W-HA+X??SRBPu_9#b+gx1f&fg}r)ufVf zD{ngEJoY>hDCPQI-x(D~iy3SQrXNo0QQOH#J1i1hsl}}H-;q9p_<6WIVb`T?bPs2V z7E#sSbDw1I7{Gp75_^XRsIz7N7YC)(C? zu3O*0rvlwk2yTuR(%yFWU#28khJN;LrZw-zn7I@ic=-ouAFkM&EUMwt%>NPnWg+oo zzByx+3wy!BR|EHPwpkUYGhc9^%d-RBlLF?TAAL2`kjRGh@Xnf6DD2f0jkT*N{oHQBzFt;AHW`5;W{7hWL#(Jdg#oLkt>}44+cd*0kklqv6v8ibf4=8qgV@ z_Gm?BL!C|JP#fu|$WE<=^jJ>q)%;cTj&j-fm0F-Slwc=2-AG)Z?t2(od6(AbHbNPO zcAMH*n|ahsp9`&mCsBWQK*SV_B2-r9s!HkPHXvVrBQ?gE*5eQxvkg{AOjN_swRA?E zPkurXoHjB@tDV=<;${r+Ib(;=?+X1A+Br^pPP=?6w(F1Fd@-s!Q|joL8^=#|eEyhG z;C;&9S<{NV@fo6?V3w9pR}-R({I-E=^B4J1Zqd;0R8lc1&+0UhJZgDNqqsvsH*LNa!O zs2G0>{ITLKkvPZ)PladwFpVw?sFiq0CQ%7VbyRGlI;~kaboEZl_iRcR0bD5va*^M50eN(Mf7{MeqaCLl z&MRH?FzBD}YG&yTp*4@BKk*v$(^*4_md20^ZAc`2`8Hy|ev%fd=`*3-5~e4sY0ts` zT?)-otswqMq3J$iG$*aeRo_!B5%tF`nv|}HH-LWRi865MKTe9$ZQZAC!OZJAzXkh)BYY}}Q7446WlvF`3m{INXYQ*3^&mEl1e_MYHEP~2E1@66L193u z`gAwt3aF;rxyie`w+PV`Pq&Fw^@SixsAc<+v=Zw2s}LLS1d*t|I>~Jp)Hkj|d?YeT zs+CMI)TdBodp9zbQfj87QdC_QOu8I0Q;ClC3R+6>&FfO?NCR66`L0%GBzd-@Lh2bz zgXV4mNnY`>YAU5>II4_#thnWthbD)G$tmiN*U4Rms=k+fRZ;UCi1P(tOks-pA(z-p z_2oN^`~p}5@v%q=^2e1bTm8Z8=WhYL1o4muFfG~qaiyxPYH%W`QD;D0DuhZ^rLz%G zTOEo+WDG{W1TLb%IjO2^O-N1Ea>fx=0cxGA5Vy5KMjN%KKDUlghlCNLp$G$>s)nQ> zrikc~Jc5kiace;f7+g1-I@dD;CT5XgP zo3#AGcDF;&jzrSMCM7nT$0(o?FYhv~`MBqcU)G6rce#c2Pyc=?F7GG;beTcpI6 zZ%H-gK&*WgKnzl1>tDp$w1?RHDuCFd#I{3vAz=)}sf7R~F-M8*GmhIFE`fZnKuifs zVvQ0z9{tfRKa_2e)Y(pA=Tp~M>Om;)Mp9=uiCt@AaCF(fg7RIM%Jc?GVz1;9))K|U zQEfO=esn9AD6w~Qq-#Tz4XvusUEPZzO63K_163RN#k;!;~{TR!Mi{|3&W#J=!PiE zf~2XBFq&x4PXMl51(K;!(oGM}wV>2^$H~H3wMZUm(i(Kzjn`UGGXNdKAf23979=hE z!cGFeZ0G^Y`*ePgd*3Ltr!n^)VF3P@!?J@sV#sm9*CU&U5T7rSxa}_OlqQT z8)}D`3m&7`8p&HoPYFWSUktWbiH`A?biE~tFXWk2U%5K$8>C(7f(gnHFNP>8Q3=hL zquK%Pii>XzMLFpvzKT*qh|Kc{fsT+dJ({box(ULzFtMN=(1rT17gtC#^%?@+2@B~i zDI}?>Op$$U1`v=B&#Q9)e!L1a@n$mL?J2aT+f!VSB@-@wsIZs~kR&yh^|!BIbXUg_ zYo=-fXnGZB46=QLhu+S%obdJqFib#N9j+t|8dZ+*P)nK(V9`~Q#KQO{L_f}#Pejrq z0GIj1s;FRy-s2A0hL?f^?%uR(EY6zgyzA0$2(0 zsW6~mN@Pj~2;Ym(_asxV0y`RpzE7t0{LP)jJz5#)yNjbJmt^q@|8-CukkuP@C< zokZ8kD(4fjaI$_Hfz%}IKh8D=S+J4tV`TvR(1_YrjUcuS112GXg~MMhNG?Ssb5jGL zP6{JtfCzXOup4egSY5TgIeEJs+@t>u8yJOb7B&eOCH^c%ea4xKWMMB1Z-$wqRe^e$ zm5GlJoUn=%ZK%^AzVT21mSXSOt}fBgiis-8b|KCb6@cu#_-<1*|6~aw>108y5(&8B zLnPd;-cPp@+CuCS2@p%{yF+!HWF?G(m>&rk`yojzQ9BT?leit?eI6j7+j)xm9y98@ zOZ|C=O=k;;Jy)TgPX@JAU9Msa{2_>wVU$(Ni-NjWz0T@UtK|<6F~r#lwy4(xb-$Xw z&Z5c@u2Kk80vV;c$t`d>E-kR7Pp~d)mZfY~p820c2oH z`?xQ`3X)G>W=+O9fkstT)l(g(9xh&ZWSrCSHI-^lWUfch0mhY>j->`)ffc2x{dbV#Dx0lZWQl&tD95sd07FE*+VAf71*2v||koS8%o zzVoad@cstnFGXn@h+vZ$Gjog@Ri~Z>l?PDmKZC{%!MN%PPCEd-!XRzYlhk)C)uJZH zu|F>V{GjpxOcsz)o~2J6$aF=Np_V|q*Aqg?*VQMxGhTg+DFn5qo`SX`l3&wjeLKz$ zsBc00Ad+9Kb<|De+33=l{1)1eVS2Kv#aO!%{RTS>>$;wEiMh zsFp!|C@e+v!muM_XVj*np8?ngac>x4$4(jLqPAvSCLixZJmvw=qRc3wcHX?2GdI!l z577Sc=x)mpgB|tq7qoimASyY;U!&qoX%UiD79j^`^ko$x^!m_Rd30CE8%&*}4sX2O zf(8H>T?k|b-KclUKFwo)lAUC2>!Ln<_#An^8}tKVjt-{uV(Owk{$wqHtq@XQkyX7wJ#;{woaEHKOJuL*!pzoQK5GQ_{bfQ14mqr?(M9p9ObglmY2`!#*QUj%#5iGF5PXYB5U!B_ zPVp||5|_l}ZeCQ3dXa#UP(+Ev^Cb9{?5O!NhdP;4_@ALV&Kz=|wWB5v^w-j7h$SD& zr)<&1zT{2RHLR?h?Av1rC+Gf+$eiW#h{>tM%!222&Lc@xsKKmCReVGCg)2^pM^_a_ z9hUeHu@|bs-bGw1U4IML-^(~oMA z)z>s${#LWfksSmFt9PV8?b_qtqlO{Kms#-|_3BJGUsP%-5i4==)yW>86E%camD)t) zevc5S3pvo3OV#^nZOPr$-#1aiPBpc@Ji&u%VF&6{oq*wt$K+IBoz0_Ua~-F~4t88+ zYn)$&8B(qamq&B0c&XFOg)EseR(J%JqZ!uns$!d1iHVUhxnlMsavj=IVxD0( zq$<=QBdWsv3?r&inR~dFEr*s~uI_3{(E%g1^!CdCtCnsrTS!aK5%D4}{%&MOYUv#! zzx4=#`ydA%;Nohj2WduVDTy&9O8LlVQJj^gwIrDdFeKZsWuyGrKeeZtA^vOKpRb9GAz4E(n&|+>)y%dn1vE3X1woYtL#D@M+Rs&*ImMbvRp8)= zlD;%vG%&cK#H_ztuJ^K{P!+x_FVv}+c~xQZPKiG&E3OJ7yAtD6>V1^JQ4%u${}40f zXJ#AQ9U|8e8Mp(VQ%nDOM$D94KKrS5NwfesB6ypRoW(3u_rszN5g%WsJ&b0}>0~Uy z<~2+yw}oyI9D117GaATzi*^{SmPM#xa~+BfKJ_R|hejsk4>ALFQW_g%@!*mSXicQQ z_%aiMiS*x;ruXMaC^a~#F`;ILmLA;x8KG-UsC@7x+D1xq6Uqqg;#4N3g^`&RJb|f5 zX=!K`gGaw7)XLDR2HSN5**dPGq)@ZAk|Lz!sK+TndZHQLix+_U6_H?2DRQs|NOhLMi!%(={SQl8=*2l zn|YCCX>@-q0(=Qknxz@=-2cYn@)he(Qq8{#>7=4H-!ynct2QYqcp!zM6=1o(^DUYs zMzd@N{&JW_XH4_yIYfOm>kO$3-_%U!E>^P~2VN}GOT{Zop`t|uMIg%2vPKQ)sFN?E zWmP~<`~NM=GWR(^M)EJpA)PP5ubD@{xbQzQ>jFrXxCI}UB=1a)dsdgCsAgUd)4SLOUjdYF!8vP{5GhuYW1j2hB5k3u(K4vyU>Z|J-BK7%RW3Qp<`NMh5Q(0w-@$@AG zHO~_88~+nexN9_2o$sXxja8$*nlVu`?t|%Um@%A7-LxXPA7w8)b)>rS3tbCIn%kG- zI2pLe&ZtFP#l4kTcIr%3{7ubWQggR}Qy%X5f8%bXd+Lx6;yc$)jgs$pvkK7L8z5h zvJs+ML+$P%412QL$_$?`6yHs0M?lQ;0IVjO7bo53OR>San=OR4MCiAWQFh;ze4xHm zn?8&!Qckr2+BT2hB#@-Ooeikxs);~GW8Tg9$A3Rz>@J?fO zjwjMejXYjPhWeCsN{1GL4IZz+o>ZE6WiYM% z9-%VQYJ8c+gKsm$mo95U3Bi+zgvyyvQgBTjLg^-y8vKaH$|)=D^^a61u^Jh6Z=lB{af>Mg(7#&`1*+ z6MT|Yd+E{JHQ&VGUH2h#jFCAr_yjGp^jOmXZwfYJ|EzSL(4sQusbD_|jx)i9D)>Gv zyL7$@E>^+Q5*%-Wcd6h80Z%Z&EyCdn%S3W_h zJJ?f+1JK?H)7cN=c(C-c_d1dD)5KpCnl6VK3Yx0d-UYBSsh8cAj3Qq)bB;fgCMaNU zUr*X(jK2a=vEmK+<=SLD+r-0%LtGsN+^C)$ZBK#>u-B12h;4QBF%h;;NKy}QU=c1CT zvOd9Cl+>Booz-|VNe^``akFD4>1}~VPSQhN`^`uCK#7)u+G%~L>!QVck(RK!$>lI~ zGq(?QeUs5it#;X5-d!xHLR}Bgb2RU>E-y=hpL&wg@5h1SXEb+ex&D6T6(G)jXW$vW7W2?)`tXOrn4saG#m0Bm66XO6(Obpr?VGRKF z1>|NU>jvnP_bzc9X&kCMv;iL7tisqm6VS{iG#HVprUIBJAd??a9VvY|2hc6K*VrEU z0DyI#B1mYS27`5nmn_SqR8?zTt@Av-#)D{onINA;gT3f0p zY*cOZ8`734#{UU~Sc%A(SdQJew7xgiW*A+O%p}SVPfjq89o@tjZKN?M4$S z7JU0wLSv=1$h!BR^@Q?70kZDBrU88UGKBat(}KG%K^t#ERgHZ}%YB>mlQ651HPK1L zB0eqmH6{}3CW#h+wGU~z-C}HKS>tjTy0H&wxsOzbZMVzj@=9+{%e{&HLY>-&F0Zu@ zX}QIR!FIuAv-Tk^w-WdjI`GF5C>8l9Rg$A}%EEGZO0 zdh2^gkIYWCr1}x0RTatMhUsjEYJojH(zPnUP?q+@I%WczWYVFHP5={og2u`F6I?S! zEpnXnv=@rhMW_C>bB{xAacVRvo)ay!@PC7tbE0i0_?Xo7Y0;_7I=4vZj0yRJ*S|*S ztCsb2b8WduV^R~9NKf0V&J(_bi*FBrJxTp%&}sWOrrIV~jCpB+M!J7g1AyfvTC(AB zywcA$o0cwz+ic|DUDNiTd7ox8$YpbRbtBz>9ndwo%Bt>X$Gf7eYWT>@3|kkS9{h z)R)Q-Ro19{_K0qL z8#R--gUwX8aW9_hi^-gGCNlqxewGy4;hdRKy#TO z1*;^Y8>l<)gs;Z~&_?Zs{S{pNVE{58c;zhdy{`M5_h5-u$GDso`VpZA_HlJVy@P-j3Fsd# zMWI;GZUd6lXP{3SW2BapL2MlX>6COY4jdO`va0kV$lM19BdP;2{lh59cHm2cnk@4A ze}!RGq0WCiZCRSoY+8g6Hez{Tw z6pQ7nK#W%k8}ffG5o_?4sKu6QdVGyW9E+tLL~rr61cyn9O8ZD`L>;jmr$TBS7zJg zP+EMud{(|%teOvEX&5DuJdag*D}0@H(v*E_1JoA;(L>7-gsBF}2-ud4RPlXZ#}fPW z%Nw6~(jba*;|KM{RQlBS5dQUuMutwWnci}UAN4RzS*)E;r7{*};cVV*uB0mC^Y^f# z_Nm5DTY3muW|fD4->iBO*FQ48vcxY?V~LyL#oPXDx$aPlp{($zfqtT^BsIMo>8-5A z;z}~0wg7leKw1$_Ni}S$6aQd5rwGz?)!UGcd1N!*7|i-!)Uxyebs75Kf-!ZX%ax?$ z(X{x@f3&lLO0w@*9v7i-GNVDyOdD$@H3ra5KoOFXRqGPucz63W%+mmf!#x1)e2}RA zwYP?ljTyw>97#*40N>#y_rrG|@f$pvsU_Prd+$KPxj2RqU6_|Z?emaiaqJqT{8V(K z&En_KzVYY*EhJTSVRaTCrIs!wA6KBpvCm`+p%E$SDQWdQ?bX`qJsU(-K^eWLs`ri( z2&wbGBBB+9ZebBxqp7MPtucO)`l%C$5m2WUM3~A+QRh*4{1(+_o=s^Pu!jU{n!3$T z$w!HKRXs`RbUSz+#A}66sj5T~WF1k@enOI;Ks_S}Q#rQez5~RZP=CD&;t!|+TA4*i ztB>dqsVZs-w6D~x*3?KgxLRSXZk*OCVOPGRUB&2Y$ln=MtcehB$Uo4Hi0<5*FOG!9 z5iW7=7iK*1HTF;#Yk$Q1f3`m|h4~-$=ONY%Ni8Yj3DP=`i!UvqKsr~?{?tF<+8(puXlI!uIC_;y#UxxAx}(ald)-h3${O8A`)hEz}ZS zx%TIQt+w4&15j5$S`n`O`Dq(-eKeuEK+5&VriokoGvr^sq%4?;&~Fk&{=RJ9m^a6kb0*a92+Mkm{Xtl>7p7sEq{po)a+Hb`F8%ZFwLe#$u=%M6qGchJXMgSsk>qtyWw+SsP|HbG*8WuAkCtaaT^2_CH~Z5m5A5UM zwuiC0abkaDBI%TPh_xuw$M0Hr(?{(!(?{u{cKRr2Z~FKf(*6~RKf)HCJ~qC@Ap+4V zh3HIN{O>{!NNrQSdXCwIrdBAplh%MUSY0kbgZ9F@A{->1&L?DOrs1-wki9@k$9p{ z6x{!L*pw3ek7098eclE{v`S>!Qw|sZtAql7bM=PJC%<=x%|;;FhEY-w1}HOa-~PLd zb_1YJ5=0SZ@#cvXqkGASH*C&rE`!DFjGOz@sQ}tOxx3U*(|Prw$7smv=DFDY%_wic0zr<5W*Wa zSNp8qPk=ZhD5H08*t~K-BL097L(`7bs5fl>u#UoppjIu2FqPvCn?D}4!)7~Ry##8S zy3VmTY<~KlMU4Y7vk=M~Hsu{%wG`@uf-u!=OKykF=$2$^8`J|~#D5z$cO`;70q%Sl zs~e{^Mc9?cXbmy?8uI&Sx3MNdydi(08xbozLNWe1>2ei+#kn$i$4;eT$M_oytgH66 z74Im#ymgMZMBa0JbEZhQiXAXk?OCA~(Wi7`tP+*biu6)9fm@7=7m)YDRmus7{rcZ% zm9`$hW&u?f5Vp4DJJ1JgevHsd#2>m!KoP39$k6?4RO@}$(*Q1d0s@T?Lz7#+5zxpB zG-}DSDne|$IFm{{HI^(YRa&BS?rg`W%sr45DG4Hne|T6>|(Hk5PQQY$#$TQL74%1@vGF?`yf6qi1G&Lx2quL zM~MFx0?;d@=miF7so{{VZK;bGe?=0DHC`!O$lpjJuHY^4HJN2-Uee7Qng#cN9-5^r z|6^!ww18CtqSaOsd;u4KkAwoNxQ2)36~^rO)JGsrg;9F2aEIoFYykVzuTYD3M$V&J zjv$QIB_rO@yy+%#r82-(60A3V_%yt|Hu_ z`T7w37!|3qkScp*WBu)l_FOfLkziUu?iC%W|R(EK{<2`y+efGLFpxkK~gNYRq+ z0$oafM#uW)Gnn%J4F1ENSYa%b0)1pdH>j}bCvn{zDny=wNTy=&zER6VXL-VjcU}u0^5XS1pX^jweK&a;XIusq0EmeOl z6Y>XV^Ej2iwh0waR3gNmqv8=#5*IJh_^Pa$NxV|!y{PaoxQA?%Xj7Ue8H$`}+!M2R z>q%go`gP$pM&}1Yn+;%kgbKLRBWj8XmxHXBu_8>cFH`E2|@jzJfBj){Qnr z@0k}_s%~CpQ4>JS38QRlj2l3T_o|wcc}h%DTnS>mpmdgu22zwptx+X-bWErCB8Y=m z$+~don_SF9@+~5Lp%mDiH}u*w zo5x9rR;#&e5c-`$58TYv1@-=58BJ3_FL5~(2I(f?PA*>ilz$Wu&}lAmSZq=<#&4yF zb0-(0UL*g0VoKpGO0pez$e_&R;;Gr7suR<=Aj+FuoUH($JH!En0Q74qdc@=+#ywnBMdOXJa ze~4Dey)i7f_&+2RxWd(&XWU4i*A_-K1<@gl(oNo-XH?B6B{dl8R6!KeU0D#O0wg2e zJY#_DVyHX8-Q!8~<{2{>_8N2xG2* zeg@$5Ehx#IXZ&##KuL&c9>AMtG&l~e7V!-uX=a|WU_7+0#1Hmprj~4{H1mvqUbTgh zH%V{ykm$>70nEB&v$zV{V;NN- zUqk*F+HI_f5O2tz9FC|*Z{_)4i4bqbb!(U(`}Scrp`GY-??H?&HELU)HQ;?$!Ej9Qj zXF2{cMr3;Mwk05MG@-2ErjMYFHKB^ZHB#4kCR8<;o(6543Dpe#unO9EQ-r#~WhsOv zm{7xD%Y%d_no!eVi=PQiGNBg1=N2Gk^0T_IZBS5E^bzA1tyKE+dXzt%JeN^Zd1Ehj z%BYsSpLZh>@e-@dlS-hw5sJQ%5wJ`dIX2Cx|1z_=GUd(@9sF%7(N)dkMow@I4{emG zCQo?q@KK@?V43pjRe%R^@jr4=Jl>?^bJRy(TtEbvR_j#!@f}bxei0wzznyD^kL5Tl z#{avHk$2VFZ)0Tlr`Hkx!2uljJxSPo1ge!1s!|Ogw#LOrb5Vh+AE5-7)|;s7JsM9n zb$*0FtG*I}Y9g1p9?{y;2CDf|APsM5$8b>_6i+s3^jeVbc<6}71*HnK4$b3&4JD|{ zDZPQWttRzUPI{y2rO7K#I%!!Kkn>kqmZYOuK$l|epWgUFO^uG$=+x_Z>IY{FsL}cX ze|?dp;QO9IB)v&TwvtFCM)UQ6XO!?YKqV@m`Q+;b0lC1^ZWZm+Z3He-G8X%7uDc&T0jMy(F4zsXH1tVyVm9m08W;-`K_Sc4byKcrSY}^oI@{YpRTjmFO`^!x1eW5uG-CE!wZ@fQiantbA!pS*B!EGvVcg z8~qNw`gSDAD>=TjUd-zk|Y{JD$(#mvdX#s(rjI2BSsuhE!R(0hBBz_n;4AREu1$J~X)&gD@N65};`BFLKxq5(e97O`EQ zE1|^(H1GjHkB5PE^0dUkadu!IJF3+T5nQ0xr- zxoAET`}{>7$%BA{8k{vS!%}{LO+a z02hlc2j7#fWv6K1SAc#911GTaW#qSr0`oWV!C@{fAbr)0sk-?ltEZ)_%{m=Tk`;i}2}7kDGijfSfQ*~lZnaN! zcLC5_Kt>};YR)#&TJTaM<#d!*G!EJnPYC(FYa;x2F8NgFx2(?Za_DP3Ou#n#t_K0$ z72Ki=Urqz}0NQ^Qa60E68B0%KThLOv2A&3Vu@JDenp_o$%a_wn0hZUmBIwpul1|pi zEacjhqk_)AzS!xMoyC#F`MkoLFGV)Yn>c)+aj)k_+O==cl5_K zjhafJ#d?Y#*G#Iu#gzN;>KEXgjC88rA2;}6Ai)IG95+NDnA1+1Lwaorc7K)w{>OS>$=9*cFbrY}uiPmSwoBscV> zt*-~QmkBoYvA6IP;r7*kbey~4h*H%@u>XUL*F8KSk?f1i zsHgq|!obR_J8AK8!}mY09N|+*>QHYY7O`Jy>{_vr>@VTswLxOhU#2Q4-#v6beJO|d z+Cnqs7Uj}?=P(zFyRSi#?n6FZi0**;c|b7tVLapR|8kzjL}|VdBgMkVf%w~OkI9Ig4Df@fElZ@84czG^DKNAG`DClI579|1ZQ25yjA;(OnX$;snQ zQUU$~QIRoQ9H}6z*=ff1xF=gYWM8l=4WPUSg1&7h0=8|~Z|RMpwG_ImuQS-Wxaa2~ zP4y#wxW{YCl%%4h-M%nsjXjv217LonfW^~E;Fb1LlvTt(78YRV6MklIaR<7P1B_Oz zF6*m+j)s9!wYtLHH08mXxI^bjd5qNhC7{0w++;dQtrYq@v)Fyq^uTCTh4bi||AW}p zw$;>tR$u74A)pk^f3)g6OYaV?UnKok765U_8x3*yKcGz)x~sHtJ)oZ&@G^N@Li{R^ z*NlC9fb<12_*L%*0Xz+HcOgKM>dY)6?!w>S+h+VefMWu3Q#jKA0hg95TGIE#{}C3j z-PHR^DkSdbdoG#{L=_yv_>c37D6hQ5{V|f6mo!jS8(JfwyDA(i_UGSPw>ai`gI>`3 zhv})R-3&4iqy8C04kkdDBSh1YbiJnNm$BoDt8E+X%Q-7StO<)qQFFT@BB;tf;yBXt z)lP^ng#oE5u$nxis5y-wehA^D5KS7ob*HGE+~Y#(-wL+*{sF>akg~;Ws8SyXkfDCw zfCyhg5#74V0;ubOOfMCArgFNdA!+brt4s_&ds#UfMen|ZVj8&B1DVOnlW#(01eVgq%KS3M|324l z^;2MyfjpyGYoD{a*u-DPGR!V-?sJMwmNGEn1TVHCG=2Rz3HgJ+fGajbKIklErQ{p{c>X z!e>XpnZaW12`x0Vn}Yk>5?U-RLVpdRzGUqVAx35LHH3pr3EpXfd<`KWNiH!#zJ~A< zyGzCHGQs66^Q6SZma0!Far`DqXa3V5AO#IbiS(|5*t{p6lsvE#q>-Be?D3F+9tSCel-FskO40~3D_zDm zf{xPY55h?K?h~6@gDHVOIz@6Q1*w}$*v(}tB~+z~LrBHN>!Jo4ehi~at4MqekH*m5 z9~DQ3ln7L9A@uTycId9JdQgSY>E)<%DTYQ)05wODtr4yQWh&|t%pm#b%-7Jhlt2Sl zc;fW;V5C(`e2o7%TFH27Hz(v-WvWfU=tXDMItIAK!pc0hURz95i%S3C)td%FZuFaw z*YhAimVQ2{MY#@;n`rGd_h((3oDVs+7jey{+FQsc7P4B1Al^sKYF$srFOy(a8%-`F z=pV}X*@X}hHTfC%rbg$Gx1B$id)bQ&l48iPnyh6&NVSczt3nNWIg?LI>8 z_f~^DBvjGRS_JQsoL3f!(h+6GmSs0!`smJGi=wXrQJYEYIb3{W2?bhk^-d&vzhTA_pL!R>XJM3Xr0$7i$98g% zco}Le%g*@DT8<#h@FW>=+;<5lf%2&|aG8SDX+o4I?c)dC_KpZ@1fi2hj2PnF6UlDO zv_-2vH3Hbgf>4CXv2uL=dU}&jErNQthX|iYt|jjA$as4qxs$jzym)V|px;2eLwyA0 zlt&Hpl#;nmKJ{B@=ShD6a3;Bma8D%LGNpG!GpUfWJhB<@?TO^AOsI+rrYZCef-!ZX zwe6lr{wmwg0vZM&zmOpJL~>~xD`^pcdkaZ&Pb7OXcU7ApZuJ1(iR45!Z`2#aAC9Ei zC!by<^^?S3_GqS-BwOgioJgKqW3y0nG6yd>TiNc3^C1~|LdO!>Do_zZ7 zd-Bm4>UD(>-ic(LN_M_83B*i6=>`~n^6915Nn|O62g4$?M!gfsTWN>~XiR6#zwjC&X>ovGYly@R|!$6YEgjz!orkZWZ?UPSuUZmu0 zp$-Tmwxi#O4&j|h4rlJECV`t9#_Gn&iR2c{v6CH-fr^eREfyrF>ix3GvYuW0=$wle z82WN1Zs)IgbLuqa0hgRZtQh<`FI>m7J2_KW!xVE$EbEH+K(k+_vMpoYBiCN@9Ex;r z`y7fSt?SszOf{dO(_j3+mnGO?F-d)D}R`FvvDA z^N_2Pql_duiku@Los!W{rigQ&L-|cwz;Y1l!zjsipprqE=TKU*9#T6&yj~E67%@+Q zfi-!uOML?IOd){Pa)IYi{sI##3JLke%lGEAU#>BJsfHMTSyGQRUMXzIUqd3!YOjm{ zF@Cv*{Ou&#M2I)!zs`*a=?Qs^U$(+R{_zqmGxUswWqnTZ>`D_@_IAp3va65*88|xi zcd|w0_@g^r?_^gqe$G6FA-jfp4hb*f;)PQ_I-=w2tG9_e?ZpR#EqtNY=Cjt!Zq}1l zB(rSw7trEJFk%AJ@M<{7yNiNs+r6aS6wiiK)kC6b*%!+0^b_YcswMGVJ(`(VH&yZn zS=l|~-?nSQ;bDLzBTAb>>LLFeLb2k_;84U#$j;50VU%%wgfa$1D8rtu`#W9dWZRSV z;M0g0 z*)JPfdazANXs?)1)nFFOoa|Rks9~ZK`Pr|l$C1BNaw7?;fFxpO#Wuf(-pnHYU>NZk zUQu#A?jipvuCe0HIL9`^)a*|e&tfImicR9|<5tbVgPSKpPP_BDF5}I z{e=k?4{kY1=%fiH1Sc`O&;HVcl7iQ=EXzJ^LaD*M!;mSxkYc9=uM^~16G{&jXYH5$ zl?i19t1d+5ITNZFtRX7-+JveG+p>VkK5s%bgKZiUx?n2Ub|Frjh5 z{WlT%(}X5EJ);={D%^B{8tRo(Sw0rtE2qjaZWUk2rj9F4h^Nn0EdPjH2ey>!?N7+{ z+uOK0zJ%ya3^F|zuyt9n;VFdluGr`R+>S3graJ47KJxMN^yKTGoJ|Y(lK~@n$Qfd= zI?icHM)&34cZ2>rs~}g%E(b~krBdb zAeVsnT++DPi?Denq!~gIAEXC6!8K)kuI0K{NSfM{PEAY;Yb zcRd%CQ@{I73~}<6^_)hcH~n@;P7@s~!(mR-z5o){-E@SUw(1W_ehz(V9I;|Vb$okO zg19nXd|)zEh<6E77gZfX6OU-;oo39;>3;GX{(k|fst<^vf|@I$14BiG1@&q)nAbA| zGz-9OVbCZ8k})&qy46jTk+c@TGXm0?46sCV0*AR^f@L(!8MbX1qV|FKIE<1KYbc4% zWoIg9WCC;DgOcb)P`?OL=gf}0IeBZc(0(!4LO7e2mZEcI2G*SEUod>Bnjo4ML^*AS z^qJ`R%J43@>!Eri9OEAVG*-O4W2LVW5#xW6%!K?ig(%(_{{q+B*AGlp8kjYg!*!w2 zH2Egwn%jA(C{Jw#_B<|L$Wm!KK3^Rm?gKAAP#G%3$<6t=_!M;p!ex(WD=nkgNy=Pl zObMXTlj%;CZj3L(n~s}0(m(Ko%Mw|r#fZWF!xJmsK1m=|M%{ST7Ur?eJv{xBlS*5e}OO;YktC6&K@d4V0!HbRh3cE<}$1v<5-hUH>%DXHpQ ziU(yL0Te5F>buGGj2mzHPd!7&nw~KMfY&n;>F=d+@r#I!=owXrYv9EP?t&Wb866<> z^@xRf#<&yw|EA=8JP3JqC4QBN4$Kx2ZqK-j}-IrKRXxxjo~b zIiNa$=vNSBYDJopt{&a4V*GOBk1m16iZ`SqLOLSG|1p{2|1X6o-WdPGuD7qWPkKg~ zd9)Ov73djn0(%b^FXV`xaf-O_y!b#S)Ns%E2SPDo43n)iFRPx1Ts#Ug*j+3I??`8CIHCkeR()0V0Mkp;d{yNdNLzQo~42#l@+oJ$QxmpXo!FRICzla zELPpVmvlaZd@c;Jl2-IY(i1AZx|(#zCDDDMKSpsk_GU0=Jg26za-I8Ap#J zWQD+3TOzmxgbm}<|>W&OGU4BWn2$+SXf4XwHuqBd_|odj6QTK zH$ycF@2{$TLIP2~zAP)nu=~_Q5yXU65R3R~u#7Mz*eyiqWKMsjiE+NF{oI5<7NT@4 zh@WpD&47=IqUHQCf>RR{eF;ywoPmX5PMzBnU!aYf+o};no!gMF%^qcQ+cAQu=Yi#X zHzsfftjjq{h&H#HnCa^{%563aA~^M2u!8TA$`akg2DIUs9r2&=0Sq90j&a=z#UP)5; zDJpNA%g`8byD)>5TS2DB{^$iPve)U13aK{Mn>%bU?Ah1P)k3&Vd*;TrWu8&opJr}Dr|_5}0i zG@3Bhrxp^q(j%BZH+oRouZ4`~{TIm3h9Qp|>gyu;W}n&*w~&WteLWbU_5M*4h^-<4@@8T3F5fc)F?cjmYgpESfY7R&ZQd^(JQH;ycHx6RA`v2kVJm9M+y1&13 zZ*I7>+z>(t+z>(sLzmvGpi&huD$)s|cLk)0fC7r3h#dh7AgCZn5foI4g(8T83W^|z z9T8C<+xtB;v%5EmkDurN=9Af-ne#hm&h(ixdw0`8?Em=*9ZB4KxJS@t>eIRCO9s%DbU$ z6XoMleZdURjbonHkdHza*og(zEXWV!hD0Q3Oyhsa08t=V*0 z0_0jBrb{bU?~9@57`#+}Ame;k%MM7B3(Cv85>u)Kf0_;KZXox0Fe+Mp?V0jts1qj( zyJt%NA-?PZ%y4H>h2o!i!gicPAU+Y48H;r8N~$g$kd+dD?N(a`KZ8&U@}g$TSlcxC z^;nop^L%S&UV-r7wZG1w^&y7`AFt1lI^(n z&Jo*3@*5{RjLg20sXg zbJ2OcH>;8T$2ge}tMT`;3C1Oek~|k;;#Vkj50OuJ1Tzo54#s6&r(S^iijUYYL>@zC zp3D3*`E%tQ6N&Ew_$&{oq>_zFW~REH5v(*s^&1ywAzGZ&T9|1rv%c!M6`TM{Lo6o% zqoxJ4P%jl=3nYN15Zm|?%q*7KK{Z@OmIcro;y_=51$0wew_6F*AkOwBm{~0IMpgGp z$LS;zmO*^RmtX+{)cM`Yxj_IsA?}TpAhTHJaMkQZWh9(}_+_jF4Va*!f3Z&!2?`5Z z80VFPOmmql)hd2Epr^U=5Ua%kWSYxdrG6UZIITrOTZq@h0%V%YT&LzGD+3q=ad<2s zrx;4Usv2OBJujs{2jXG@=%S8%FV$K~UT&LtT5Snh&~pGb|0C!db(F^Wn@BnY;1dDq zS~ZeNs!ku0UMMi~89QnI3_>mP(u-r1V#L*`#(|0KjCA!yK~(oqdLGbFGhJj(3bbi~ zoHjtZ&Z64+NUAc#24cU4r<#0Nkd(H{EfhZENBpM2mn7nQ?fqN4CbkegAwCWf zJ)dW`<4obHC3a-bb*7+WjpcL=0MByT8TKBygk8kOSWX8MH`a@f?1k!EPG>>5&m-os zoIX^YN`R$=`PMER3G9;3r!bDL`%_Hxt7z*Q$WoI zu_!mn7)-0uc67~)hgy_dDEuPOc=1McL{vwF!V#2-hW86mynO$}_4cd@7|ZD-*3s!g z%VjwY5L*zJAmkX!X=#F$z4*vruEOKz zB{owhP%|2y4Ntsydo&ScuNc3d2z_usA2MeO+LP-{;h#xPk5*d5`ShjacOG&izwVjB z-raWT_a6v_K_m!FMXGVt7o(+!)>?{(!mJ26UUcI52k}aD&yA*&yu|`3|G}G%HJ#)j z0I!pbgMBhC;ViK+on$_7OTGBWH&FdfvI@c`kC>;ETpFXCYayxwTs{)iWf2|uNJO}u zkPwpBa$pBu}PTNhOJ`iZe?7LnnFrU8=e{h%P=#a-6%9^x$~3l_WX@ z(kMY{&Ad)hsur|6iC-c#T_6!HMQi1DlF&ZVS_9(c+$d8)(z0|-=_VEm%PkZ>3N&84 zJeZ=d62WWxP$n9dANvxjggob)VTWOxEo(C-ysA%|ZuJPgxg?nk8rO`#hPfGMjB6@Y=BF786p7xIy1c|Eu z!|{SNS@(EBh7b36VGq*W;{_>v_jo~Ct$Vy6J<~m2NM{e_9xqfBzdc^KLj3l4p*DW+ zc%joIUeZemSi(EGQ0PlEV zR~LTMj)Z_Z4E4AmOd8(tLb>PUc;N>qzk5{O*8Jmzbap#NNXnx;EP^vaB2q&B@j}t{ zl1^jD?R|(89Fpwu!k6UONa_b6peShu)DLeGTw!HBvyt!UN}He8yVk0y%a0M9xp6D?&=YFjCBppmR^>!#|y8l zP@+12;zdu{GI`qvJa?71nEQC44K{hBclQ`hd%VyLQ?yZeR1Bv*UU+^uFQ?MlE{Gx8 z~>~lj=6T+B;r2_o*m+9?T^lXS=ICUbwo3t7c>wTOgcG zRnJBGBK1JGw8snE267sx3!)X^Uc#WegKlo-Vj1l5Lft9l^#|uN=<}GhJ zg_VG}{?`=zQ_aKN+ffyigHJ z9gk|~G4FU`^{2}D3kLm~mm54-B#zy--F$MqFe^>3kU6Rp_T$$^-oamc%kaY(yLzs^GVCpv{_Xv>Ze3&k+SiLWXzDPsbE+B_}SRp!HL@xgE!q4vm`x40a9*l|>iw?&N zyYDySk_taX{&6<{T5s=oq3fNtA@QHU(z7EO=1d{7);m)Ww0ovd1sod?_e?=F zwr2{$V9yjJul7tqGHK5gB%8U;6lChRX9`kd_Dn%KmOWFDvDKa_$T;ksDeOaugSdn! zX~v!@oFei^k6>IY~nO)q`DB@Glj{^c;rtcRsnEj9*}pYkn+BAMv;c< z45Ejinrkh*GlhcK*=7h}6vT<17(2IRwonr)InI0m+y`-~FTp!gc)P1I64pc9;!E(( z6poixM#5o;$9)OjnL_=;JOU$0T!i?WFTp!gSUz4kYXwkz70*B7yj<8bg%`S63H2a0 z6@V%1lFFVbd{m70bc=+Z5PQc;uxARR>Ra2(tq`Zh0_>T>%$Dr`M8ZQ5m&F3?nL-H$ zGY!}Zac3;Ro+;ekkJnyF>3;;LOyL4ggX!M*2Z-=BwXjY~5A{>!}bFBm3)5-?XSoW)PlL*XbD$XB(AiI;IM z8m=o|6D!wHxUC=2StEK#L>ukxD_#>jOuSjd_S`m^Hc`1jkW$WXI@PhpbXpLAXF7cz z_D#5i3}RzUr+bJy?8QeaL-kFkry=~{5%ZW%Ge@xqfvCdk81-=pbwqR|Swy&|(`~HB z77M5bfW|(kv;i5@>8j;?R8~OO0T?JCt>izLP7j}>LrnrP&qqm)bDK^_eaqK!MBYkJ zYXqq^^Gv6ki$Hsg_(MW7X=y21E7x?ox;JTk0pdb#l(Cq0VPe;d_2MI+ z;`L3Z4-tCWBic$U|9PUMld}hcJzuzql=b;SKRkY3Vl&kYbTs@0*Ld;v+-X|gG;B@z zTb_bMUdt1^Lrq-5qr}Fvyq3gW>%~WwL-ku;ZwNy@VxE>4{YvqZW`xb+vQSWK zMRa7Lh;UopS1(~Q6VNIy8-36c12Qe|a49QkKY)`0(n|hA%e(IfTEj&ULHI37a-6&6 zonFq5WGE?>2C0G|wPs$+%Px$RM#Nt&G?SK=qP22c-eww{>H}g}Zj`AcsV-efy52%z zxrM^>fX0hAsw1L0A{72g*Wj~46mKZJ!S(i(`lsd9Sx?IoTCSFN0@xW`f{zLs^>wA&4`JHn}dxPZzw!QYu-g7e!<%-n~Rw1N3-p7e+?iQ zl>9%M>!mlk=K2XpbItWq?5??9+N*1>mxk_|>l)?8n0ge&85s87Ypu;%)NGp>x+pzev4Va@gZ`AwzK;}p~{bIB;K z&Gp~jqio>?Habp0oUH*&{(`umrk26Xrt?w}YNjCEyjXMnq1tY-T?MtXAWSWKzXtf_ zcUMLZ)X}~S&s^X004rUc$~{m`fqUlqtA@Dd`ZX~`Ypy?wEzVT`ULoc-*Y|zfP56uu zbDQhcFqhL|`Ra07bN!3_$iQT~j1VoSHP;vI?`qp5hG@<8^H;d$`Ws@1)?9!8B;}0J z`J51wrZv~UT*0lb#W9@LT>lsL0K@r045u~M@5W+jD*9cI(=*qfqY#deW>B4j_y^85 zYu{Y27Ym-b{`;o4Evkbnu-ZEHo{oB8|DRczf!)LHCYp$Qnv5QnyP>lvM z(}zj_GQHX}*H@`3xQDPF3wdVStnz*UH2IOdNm=pJ zly!467j4S&ehtw6b2o(yzzu{!w`?O^v~g3g=K6Wf_~?XAp*!Fq|1|~QTt6AiOi!?D zi^p7lKao#)1Y@yyNJcc@T>moU*L}!JLw%zi{gz(?ybtA+N3}DUXRdz}lg9HfsQ&8LK-X&i5sF=6ZFtsWtU9#I?Qz&s=|Bb>)0bp{qR*_xln&bN!q+-gYQ}a}d9a zl^_-iehpCVXU9k=u$3H$bEi5Dcrh^Q7b~GE#99Jy%fXuKGs;<0-_;Pi#R9Ck{$efV ztYG?9!yt~01z2OUL2ApI>klEKTL!3uAU^g{ zx)*xp`YY<%0>1>p+2+ZzC~K}?`?;;y(jYQ@lq?-07HZA)Ehk%Odtkl(3F?{ai?Z?z zs*zwO=f?Tw`dfG|FsK$mUXdFTk)&N?e1YK52+PkcK;HCWjbadmgFhDq@e$OsK0?dz z%=O=8*-H5vMB!JwqR^v&XRaUq5Jg%JYF!^8DMjSsDwGi{l0kAEf!yfBbZN!veKAxw z8)>6~%=BUZV6NZu7}AykdBTHH(PAvYTtDw|TZLO7zUcwXVC0$W&vL*kgONH3;wwSv zM(d)ix&E(JwhV&U+9SB!C~L02<58PpH4ya$Wg6f%(*Uix{y9$8bc$U;-0aJ;C^3Uz zuHP}uwwH+@?#L%gqdEjXEoBFe$3U#gCrivAnCqu~OOvA-)axJ)__FMgghnlk`}Hig zU_pHe;wN90MOkxwiTkZtvM8BK#@SBpSyQyRUe@5+Tt5MUxy>rF-2Oj-o%p5HPc$q$ zgJ@Vb3!(7!#Dv245EC!nXjmqFzW*i>vY3vBSNk-B5O6fSQ=;dC=s5t*Fw}2-!!y(i z&NbA(2kxH@^}=8c^^(i{hI+|hEfIXZWf-%DdKs6kpC6w0QV`=UiU6E`XB| zzlfEf0TWc=m#u`qAcl5&xhScup}xyRJFAt2SUDD84fPFAE2o7d(F$URSb#OuH)C$r zfc_A3Vgc4rzq5gIew5Om1#zJObc=|{Td+Jsy*gq+s{m~LN6W3{R$(BH_%?(4C zHPkOX%0mKDNP|I)^-(&Do}qqjlmY)Ps1N%Hot#{lWvrq8U=%?w0C~lSNsIRl^%dSl z(0fpic?fi|hWdDB%_5@9j}U(qfZOz~p}xl-Jn|-hq}M5boClD(2Sfe+MHvGGa3#c+ z0*I+F&rm;Ng)$xFMi7HNF>Ym8L;ad@wq$02Sdb584fSWn+7zDwu|ZI|QnZHpA2!$y z^)85G`DDqgf}#HNAFZq(LHwCdmPXYL4w_@NFGN!r>& zIo0cxyG26bq$YntYxtR_B_>7cLTl7s2`x40V>Y7I8=FwoxHk$BYPRnl1a@d1aH=;S zrkNTg$*1M2xBo_ma*`4%5$gDh4vmSsXDb4)mBWUlr4K{s^rR+CiW|=l{;GGD%q9JL zFWxR&Ap|R|R%G_*!XFV`WpyfDgn04){iKfn5r5Uay(zv9CvOfowQE#) zcsG3!mo67Fs?x5$CE(PkowQGa8Nsw(60DP|gH?lVl<+Ba4d`CDgmefhQjsfGMWGcf zqlQ436Do!!}-6S9?7XQk3#eVbM^% z$>kkk%=nTJxOjSMk-81R=^t?MN@0!r2FxEG&U}7pY)Q0isD3;T$Caa-dK__@qs$%# zL7b6nzSY!F{niz5y~)1#kOp4^uvb3t6Keq1pWeii9IwH*0lYIGSbj-Xq(QQ;Mga|e z8sICr!REbwl0CFf9LU(#@OnRuux67l`CRtd1gt;IV=fb5h4<_pcpHU$-h!I9B(rn{ zoXxpSXkTgcYrNJ67t-K%0DI;Jo7e3%R1@ezMVi#`ISOlzTS3qAIjk<{`8{xvX44ya zWmQCjp8~ka2S1D6MtlSHH`pT0U*}3|D5}wiL4N6@MYJib;ZoIo)RUBMk(M2}iXhk$ zG+P`k%r+pW>aEfpLSbojq41w{kWg5fXEb~TG4bLJg;R;{+Y%A-7VUmST*bYAxNleG z)Yp9SWvC7fviY7^&9c3Sk&o=ut4-K_?RI_jR~^Q^ib|+z9+#!K1pP4{+x#1-$U5cJ ztbFStt!h9cH-g&jAtR!LzEGPFpjypp`$L$6P3D4{<1FZOk~gv=6*^ds$ZHK;pM0;y zh?)d2va~Xn!d1C^n}sC4+x8ZEWbVI_@q?GlX{k*CcK4;`=HtEO0|T(s%q*^1LYifm z2bUt0sAzaPaq;pUtay1ty1qp9Tl7QWM}#CVy^n@#j24b3@Q1?diSE#@AthV3z4+zJ zSoK;Ec1yO65~@-sA%2BRkay&($ecrD#ijj5l*71eXuQyT;wWAKa*Yy!Dg{CXk7z5S zp_+=ZqimxYT>ae^BE_fEgc)lk=;x-O`zw zH+IqT;xujvm}dlM)Sic;rh*%&Ti%1?x}w;YNIj&{Z-6}MqeW6gnzpIU4fxP#9xL9m zJ&v(bln8j^HSb^W6?(@@$%1qC0q&LdjC}_;A4AaKOn?pZfE%ca$rM}GHJ7whT{Wr) zpqo7)jc4r_U~cMHLbrs1TG%A$Gki=#^>ud=?Ok@b|Fr{+TMlNO;B?uVm)|u|J!S&# zbL0Unu&@Tc4d`P}pa$w%FhpCv17t!cnKn7_xwuq&?D5XtIz-0$qT+8~- zlu}U*t_Uzwz@~oNs!Hsn%MNN~W7_$`gjbsB4McUguz+VQYDL8_UxljoHDR}z z)>kEIrnNGZP}O`c58)D|IlJEiXsE902Bgvt&3VX}o+xcjqqhRu>7miR(o-1ds=Tqw z!v!_&6qqk#aZP4{tG4q)9?Gw(<;7`S808{3lRD$%C%eF9_N=O$q6alDq;b_fjA>tP zX4?@TFQ1WO`9)t2g?mcG^W|8Z4!AksyjQS*yuQEp0R|%R$g(1-I>T(ig64Y@;iNLG zDhd`dp^izXgjQHW`YrTBg;+$|XRyLss*MtvO1(-NZ;L`AS49SJWyvA5f(hzl2;ca` zlH}IBG}U~VpkV4e8RaR@n*gaWyvewPky=z4(6k)+FhRkxKS*M%A~diL^yUIIX^L29 zfa)(0O;=q!qPvC(g@qCg=Rk=UZ%BKuY|)V4W7jS{o@goKdW{IXZ6j&*bmi1elZltr zWpO3g+Ue>=u$v_TT`7!Oe?1GVyb>8|KbMa@qD{SzI$90ZibLq9t=S(-jy3wShm6$y zfU+qgvw~biKS4yprO+zAKt1tR6z^TMKpv08TeW=(y(t==O3an_(TbOcn=~bU6eD1| zd?Od7RlRvJW3u^HZL`CO*EKq40Ue{c3G!WmRYw`lTbQ7HSAd=vZfSyiS76y41Y4Ql z!^(WVR(}sGSmAM=v=9Zt?bLo0cpsM_S}+Z(8jXnWtVA*O6_?8%(Hqj`b1b}ikM3o= zd_bd1NP*%?2+uyF|4NpOhYYDlVhl^|=cM%!2d6V#3rit+Wa?g-m z&n!Jehc)I==xaSpWGMQW#YjU{^fE<9h6aG2B^sPPOR>DRV1<7Od^ zxd2_!kZghJ@6*~PPRRx6(D^wQTVb^w&+ z10MzGDtn>DOm}X>Cv}Q8mX}&@Xu$=y7l* z3io{EcU`a%jX4DU6Au$9bQFPYRUM3S={JlXtbvIdc*zIp>^mLy^rflQNtG5Rjj7&F z!tQ9)MhR7^nh=}d5~2uJk#Zv5rCmdOcaKJMyP+sQOOGnuc85Ti;1Rv%)~p1-tjSpa zq}SZ|d_966PW~R!FvP!7xGcMoa z5~|0D>7&M;0g`c5S-&hax*#Bfj0~+y)8OKi~id)(erU*LsG#4pBW3uj<)jx+E! zk@F;>Jvd*^kV!mZDN#cv<9SCsQ}7(Zed2wXVSB=(`bPa?6OiBDlKkS*d# zEPIW<_sf1s-?Or}>w7mRr*44qON!U(wkdAz$C1zw?(Vpul0We%#0~>0`$Zz zt>&sK1&xKu6+eBWse-K}b33wzQ%-Z0_=1bK&T!&?O{Ce>FGeB@iF*X6t6MxYo3+?UJ|xuic&wZulO{QVdXkeNlO}tPgBNkxq7KSspVIek* z$Lve`-YWYq?ot%lVbHt|#q;R!5uveWcEoLyPp6SHgUd#W>Vy=3!MLhs}J;uNGxHLd(7UCqug)A7y1b0M2IN2Pv2?t2N37Rtf$`-^ydw&=SBSGEeN)V6kHA9_1wk$paiwE)ar|_o~ z=dlc1%e`MVwf-yo&%;vt<2)J+lbT&9wSxk~q;hQ_YuF^}$OgI%lPbQ?z&Z|-TDE~! z!zKf>0cV)h^&$fc50mP)fy7}`fZ0H*lOs>b?cZW_8@$!rvoCPq|#-`F~^e~Z-ZCk)1dmn-1n*}U1;iRiL1G7ZV zI70UcNu~}hXUG62*jO?$WS|plB6)BI3*!;1X3`L&?tX->C;n|*wunJ!_EdfEmpw<{ z831pWM2->q4(BJLM}}ZaiR2?nX(SSAuwyRO+xv zPOy((rwv8Ij?x_P+fu$_o9TC*I2?K#rem%It3#HP^C$4yHlbtoz7F`WK&yUgRkjH( znlZkWg&el`2}4KS>I8R5;|VTaK7)h2AyLw?)JKP!92D86oNR=RSug!~5DhnYs5RH> zC`><7UehPB&6^!F>YGUtMnT z2=}N1O#@E6O`2tzeD^fxZbY9RW*XB)d(YUxe&G~HjX0gYctnB|U$Y|*u@vggm%~m3 zS`*s~r)xqyxoRSM12s{HSXb)Y;U<-tNS{jl99*`@(2Ezb-UJ>Xv>K-+iYJ#uF{2C? zE?3e)EAbK%4-$V2mn|}M-3rn}SY(e^Y5&Bl&ts4|VjQ|;5y25g%S|B5gQ|_wWgs3? z24Wb>5ff3I#ZDV%c#>b^MN`1C*kkxS!Ntd?k2nGG^x=c=+inEN{EjBI$4sb`N$qiy+QT-rCroM=rjOrgrTt~^lG-wp+NK#i6#1@ArRZ3b+P7|M zYmEGECbj2GsE0{ytx0XUO>JEpT~fbJAD=SDNO{BFCAH^GYOJ@N@%PzOM%a?prMTV5 z&N3$)>fvYP{ zH*N7SQ_-~RO7f{a2uss;;>C;}FIMy%v8q?J0&?tq34*48eb^Nw`9jd@8Aec9$&#LM z2JRn*g3p3GiPKpZj~aQud;xmlVTyR5P<{ zak^~wVh7SgMUH$?`VR{$mSGa!1biyc`T5`jCk#T3hlzh4r*qtR0HR_hxWU3T-8Q++ z_MZGY;~(+IaM{AH$3H>3h!buj1^FxS>Rb#mr|w`D78Y^N-j9MT52`j!XG&`#f^&KS zcVT~9c)d563V|-o3m-PHKkpipXqG~w!q>^02Wq%kmviLP?5S2z6??ygz@lHW z8NlhRipLD~@)7rtex@R4C0@#EST6~!)uAjWULInImxoqz?_&6h|L-`~eKZ1k?5-&v~BS4V`6R3;8 z;@+d?7nhJeFT)I?3o1t*nh98`}&-b{Yexq7$ zB4tbKZBlMntAij(OA^hwOj>Rl4QyJMNUJ~crsYfPUe39TG&0(0SooTltuERvTMpqfBE{4E>xOc@U?Y6*0)(HzDdP#Du=io9C3OI&#L?AHDx2$@3Z?c~T4JFbW&R@4MUjYZ6we4>{BfvDzI zk5MnPq;^C7My+DOTBNz~=+f40SDx^3r9NY&A4U2hP$%W_YW8GL(2HUY=|lEaI!*94`^h%3I96 z9#6+ygT(2$Y)OYD*0k)Owdd5dY=`LJ;uF)xoN7;FD568_XG|-pJr}02shK1S-a~jB zPLKIoL4VA*N;Q^QZt8cUR12Bq&_~jA_4v7u(Ps(zd`x`kTl5jJfyEuiAF;~5U_sMX zXhOGX>+~IITGnMtb}f3BkX0EuwR~BuND|v2v^i1N;k3fyiJhe4FJFa3;i^6%B$_%` z*?W(-`P2&Wci^%`hD;~}*ItX~K0;69v_$dblDL?)>|o(?CH1osHzDyI;@`(*iwrHX zcn>_E6S|Dk62+5C;%~i>C|s_jDOO@K^HAD%?Ei4tB10tRTuZK9!~%<)0P-qOJ#c!+ z6pxuW3NS+CY=q|?i+#b~kHRwr*pj?F!$vs?tIf=X;Xt40PvaYZ)lMg7T*bf|5;Ic)AuJo~O*|6Vg zvbN0LCxC1U>S~;>blv(j{7>rJg`KhRqris&os=J5ghKzq!cuQDsnk2j`(S~ta^bos zXz34A-Y)DG3ts~KEubIfhflbkHLr!;Z||3Y{{l30!RoGig_iF0U3sBy;GtTZOioE^;&1S zPrFib>vgMCo+Z`1-6VLFgnE(4pgako*J5hJg-x>XdWV%W2j~G8ZfoP;^=f6gZ?*S4 z<@G5Exe2^sAxlW;dlLC0PeSMw#VFvyPFeUR;AJlIz89Qs;o^~wuWeV68?SFI-J_oq ze+SGtJFdonb*CwSSM0sV5#{uS>2_Cwcw!`6q8n-nY1bg3)O9@MY&nnH`z9o;faz6N zf_P#ibnk8@%!c_kc`B=5fxrguCu$*$zyZ{t~HVS zZDe>BlxYZ>;Y^?P5KkzU9Y;W^=}#BqX_*WoZu$dHKq+S_J?0Q7Zzwa>vvpBsQosT; zDa1l$4kHs0g@OdqWre7ebM6;%v;uEpr;l4x0ef~mO^7S-%hSq<8(TEsBsH2O&~Sl^ z#028vhSKi>;kb2Ggg?Fq{Bbw7;!(Y$1{UfMnnQK2@sgWRc#C-N-Iv z>UT&Dg+C!!C~nedU_2MvPBozrTZQzVTI!z?a>kjDFrJq?zbpSNa11g~g zjh^7B=~vPcPLRCn1z>=HE{KK^t5b>UNSfWRGA0B8-40-u2O^~x-z9ebg}*HQF=#7e z>0`IRzj)Gdo5*%(`#idvNQVyrJ^1)H7IX^0xA{N|Ymm}I{b@(K2t)LQA~;(U$!bav zA*|&%&SxS4M3qdS7)P>t*37~f&6gPjkcXv0Ck0jB)Pc$&`)k@Zs~2IT@y=R^E&j? z75mvI?*>8}7E52W9(BKbjut8%S=|Y3zE4k46FD|j-UI~e%#fyA7DQ!1 znVK!BP70u~I{&OPfL0JY!~#wWps1S3=%gj|hnV97Qq@Nstf`1$(E>kk)c6n@+wH3W68HUs*HN7h~*v(X@pNM zspc_gsq(5Or!l`vG0%l~uK>(YSW^9%MQjE2IZI+y5br98FT_e%d=HdL>bJGbnF4qV z;!zJ^+I&g%RdG;Ps9H}jNeJqD5dX=8N>!yRL8`0XE(|!a0Jd;kY_mvJoohpCrWP@e zsJc*FLfb($b@$#~#FQW>Vc<*^0z0MsW1VTz=Uq*7W6m(4#%uojdqL@Ly7Z`(|nIFh-eDQ({&n3;7c&x_7mN7jimMA-y zK9eSil&EXd2qf!KsYK)VcH7>z3AXLH1Oc;R(SuTnrma7<-R&r}Ph#mZCY5MDlW9=* z)=SWS_vtBmNGj2?X%5m73z0r9VX??I!)%HkkxI0FSE{iN#OC<`G9Z;``?HKT*Fo%) z4c#`*Ji-ck}p8{#iz2ofl}hSlwx)yN-Rt#z?uA0wlWfxxV|OQ^*~e` zT0^0`WiJC!iJo)M*dEpmT5pdYd5BU(h>SxeZkl+)4ptKZ+>r;AqGSjuG3Z*RU9}YA zIsuqk$TNai=;WXOq_|%PcH+N5%^I$_lEziy4)qbE9>p9eu_eq7Q^fu5#rwms?{l$LRFR_mBm-w; zM1pLw+yd0nYN?t~+xdum^)hiX$~5`=04m%FY?u%Ag{7!zck`x~t2WCjX$FV~eN;Yy zH}eEe%1s9rBk(z3yZ$TGYztCGRAy^d5XIF;K+pQ{2yrw-*%qWsc#_#fgZ=_gD8b9I z1<6t=W$L5TET{s2T0Tg0M3M&08QQ{vIs)k7gR~^GEl9af4jc8Fb0mPt0+L6CRKzAH z+k%t__bj)d`vE-Sfk;WV1u2guJZ9-HLE9Efm&JO@%9J~8#*aYzNa&^|BJ2mWuj7hp&f{&_x}w3Q?sA4N}PlCT`c{8@Snf`QA>}f(8k+pQjP9=KW1vm-=q9@*Rl~u63aJIJ*`$_&SeXy? z9E<&wQfhZui`oI=KyH+>F>$B&F0>ldqu*OIu4+?=uIcG*xr@*(v5{k5R@N(JiW% z1X1fR0b9I8hr$`Iw^)(c9CHWCw!m(X_ID?Spz`8nAPN>&LJL$@-2rFe62!QmoD376 zsnjqcZ}kX~9*`M&G*>-!7liFTG50v2Gxc9Du8`(xKLU>XLT-{2%)5UA?QSM8STy<( zz@Pa*W2U2gm$j6dZciymj#D0&Am?b-0FtbRvHuSAitCJp1p%rlfDZXU^5&XApMG~K z=T_nE2VjJNba5C{O0v?R?6S;2a-`QFu4r_t}cR00G#5UPFhlmx^WSTPg_+NrAt68=L2No=f%D5kzuXCH*Dv!3v%OmC{fts`4>Z_^d%1feOit z|2W$iWWz?nPn7}iV`FIu?I3pZ0aKB{#^Lu?h%Bj6xT$QYQ+>oN5E1VJ_UStiR!^;H ziEj6Ud;Y&+BiYDiW0T0B6qu~k$I7WBD(r*deV<8M6{y$PnFQ`oyVylaX{hf&T=Gx= z7Bb!k?o`DZSuqJESc2h9Rso3RB``TrgY&<)}Zu>cu~ z1M}3?W37a-5GTa~hP_V`3)D-9*Gb$DahV5*=+;?MeaA2wxJUhGo=s;fh~4>6FQp^$5cs<>2|N#Y zo6m5!X=t+l48#RG&!c`0LH#5jLiVtM_`n|+*wv3v{}hB#a;=deJJdipu!(|G#fd75 zi$$3IXP{7^{~{1|eClT5cl35q1nS+K`~*y@GOA||UegUB-bBbX6qaXmY=qfon(0R> zBN|=^v2c1dez6_+ARy`$(KF4lz^C|`YJhAIe!)e&-zDhsxM zD8#QSB+(rJ-pT_?QT12|2D`6kL{TRpexDlJ-H18DTmpb>o;T=fE{JAhk!kRH*K)wgWbg5wHfAMY#)+zMctfK1_8`h?yr zSEMl1QfN@6uBTW+P-|*4v{z&KHGT3oBS2Aa>O*KJWBFyY4o)qHp-U@y z8QPydJw-i`3VqJ#LGUIq38dqUZV@~A-H}NK?tSAjfGZ)k6o4r!J0A@C1;E4e&Qt6? zAolYm=tora{ z0NWwT%Z99?cJ7o}F8D(E3+QnI;u#M>Dawi>xOw`+j%h!CKnq7b0k&nxfE|48Q(C=r z5LFI9RRQVTBBWwELiXL(lU;<+TSM#Y(cR`HKhFui^Xy#~lnr299*~)Ig9p;r@vCF0 z^b~E43%>uvIdp#*^wU1a^(OZ+)CE5{whX{Fh*6A45DR0NutSvu*h` z1@O_gi3aaGwCmC>aTZpKQ)RLaI;H+>Bh3WnM#|ukuTicoQMlP`INXVMe~|#oeZ~t_Wyf5u)oz-> zHJHxX$Pw(hwNqbKf%I93LM>I~z&VycTU3@TtI6og97?5bRr{t$Fr4|`O9cC<)KP5ml|sV!4*3 zlwPapmeS`B=PspnOaIqWx}W0CRZ2UF*o#Y$uO`Qq(s3d$dxXe%$dSoh+)}DdnlYu6 z%$yQbMbR@EXQk;<66JE0(r;|4Rh6F>aIJbsmgrS4QLw5?p^0*Rl3j$V^1*7ZRrft1 z$l>D!vtW%}f0!dNHE0H^+B!Dhs%=KDl3BX`|F>k;p?0p4`G|;9l9%!uNG+!QTqH7) zWDUWTOjR&$$t-#ySIP8iMNn0Np{B=V+E2ccImNz8RpH=>oW43rN}x|8iCJ;4T<>Q` zp{jgaPN)+Y=2ew(nP1F+?g1s+Vvk2m_f^}RGD@g7n=AMiB?{;pV-PrYOqGD z{A3GyZsl>?94B1)<#(}}S6R=(cIRsGlZ-{A6zs);I-8o3eF+aA)GX=V9fR&AE0@zQw2@IEHZat^qv z;0n*f;_}I>DoVFJ8`Vk0X})xL>iK+<@yIT+mW$=4YiDSdkY?!)e2CAY71Mlrh0{Py zK0_)4RyEh!#cP(?z&GY$@iO#J%9>_rWo6%dwNAc(mh~QTF8sSJ(Z=ERXnRp)iSOlpZ}|qs~P^&3p}vy?kay6iMX~DyH<2{4StkEk#KJTM-cWJ18VhSle@opw`i9mD_4L%6)0|9?` zfLM~>x($K19lAwlvZ%&fgdS#Q&zDJCK{qlvmtOK{LCun&Stx@pC7uf)<`daxS$sjh`&&Ak@RcmF5u7uW-oo}`MrrMXLJ?yul1$k1Xl z`d`y-tX`T%+KW|pmPlxxqPZ*hoL-5>j07xx1y;T!E2WHRc^MMZ4)0V>bma9{>%lIV zHiiX5bW}F2l@(wx?ebz4xuZ?6NHFbi4%9I>YH(sOt>zz)z-|;+Nc^K7Eh2cQi8{yJ8Xf!ztE`|}=TT+H(VpCd!m?iA^gT_k zvJ)wPx)#-t7Ohc@$@G&dJfoi`UYShm9wJmmDnC%6NYZ{5AZh6)l$i8caYAKHC^_lz zD+y(oP-@a;I%HZo6G}6W8#G6xHK#Pa`5~4dD(#9*?2?l{YX!EKF_<_>-%02O6G}{K z6hvy431uWzlF&^iR6FTELqOhaLamaX`wZGGCdF<^ZD$keV?sTW9q&o z8z2=FsL(sJb`bLW7caNocSM7ECWnPX&5N?Jq9 zOdDnz;MAn%*MJ-@v|xpqDyf$QN0{Jjm2{Yvoi@@0?^a2tB{<3id1v3#0v>IGytD5m z363#A-r3iTPL?)KGzwPWoqeH+1Sd!l$UFOzq7s~Fg6mY$4z{LglckJ<6?Sm+E2W-R zL%m6Fe+QSa8;TtL>iDMW6XGs=@iDWR*Mn)n>8p@Abv0>-PAYHeG=cdwpD) z`h99++4)k}x1-V?!2(vMvBc>C=`H$SndUomP262Dn06N(sZ0wKUPSmlMyN8aY)ui~ zT#B$>3Q|>s+g1kO)>Q2Bg2AMOUWB_E{L=-K%1E%A39c@f^f!keWv(;9bp@NNSIA$P z4wD+4;(V-ed3&3t3%5l%_;q|Qb)2|gy?D)JE>h;YZJ7p^tPXsIZhiiG$0|{*CR-w$6_~6(6nft) z&)OoX1FcakUGw+Peu0&j6j^s@Swf#8HAfHA`~x;H7i;=hXp?+;iYoRw@&`q^s(XoF zCNxv)QYa?7DXPL|vOBD%>>D?N*y*D_pw>y|1h&sIV~Qu)72$CJp9#oSqvAm5<8~}? z9BCZtS7>pyT)H`Iz_ur#Nlj@mB2|?EP)$HaA1OLg`uui4GqQ@>9@z%K)t)5id&ZKX zJ3hF@(g#2r8cRRR+O^EwPY&84WfruB9^EwcWOaHypu2|#Y<5-w*eIZw{*a=MQK)6+ zw;YVBZ$Uij1GK6sDr*UVr_MYN;46s#@c~i@ZmzF-jEY1|2Q7A=S z`wpTGW{(3<4`O=(7-jUjO)gjubEva2hj088R4)&~dRxXJLFY7 zgm{T4FCYGFmEJRnxi@J^3Zs>so}8rNB%hvxIYCCNr0OhT(}$W+p``tH5E>?}MfSaa zt{^mA3PAR~MH|95Ql^kVg|wutKR_F0Leyt&wNxn(q|&CTg#n@|>A{xF_?l}?3`xEzn*QjJmn>;_4C&qPAU!!H#gaaYAw5(T z4WGUhQ>_;GACJ^RMVQLc*DPlxph-q?+GQ$55iV>lsjNDmm(Up#3Mbw4I-#>)*VoOpbuEoaEv`g* z`VO_2@WZ%-3jnZ~YI|1to@Y~SliLU_S0mk%-4NhA5^XC(EMVz-cJ{K(=4+S3Z8l;C zOW$+mFwG{Oyy$3`S2xl^h$YpaI>7F_FTK%$I4mUN!7T+Ev zC%9~eX7jvH%^`j<&g40AnVdUyO@SO#%Y1@rfHrc$vh+Z2Y=31NNM%S-*1MOmYgtO0 z63-CUbpMS~#Nj|2C19n#1^cT=69yI8a0ofYHLYwLRgkzuoFTgL?NmA9YIyOH9l}&! z<)o3oRZ3Dq-;Bv3fCks6?lB)~4J_%4Q0X@s*B_Gt^fMoYstVbGi zq?Yt9fD;1JDd}DunJvf^Rc$-StVjDG>PHX(Vl7J4j?6cxaU$==vkZ*9bD!t`a-(FY zx(?NQi^)XEYuMZ60krF(=eSz+SVd%$ZX%`J8%(?uNK|`6VdIx8Re&yRUj<^klG$i@ zkwmn|TdYnx8`;EKr#ZAs+ef)2))5>-3ZJWE086}5MjOn+!L&82=??Ww5c9$zj1P(R zC38%P!L(1FCD>3#H|E5kc_u8e=_Cd$5v@Xu=f!Xd=Oq;Ro-3>EvJ_h4RU_H?YOyL4 zL_;4Xk-U5GiWku1n$0xjfa(l&pdfzJas*+jK@Oa9rd^CYG4r#h-BBVP!vYBrTX2o^Xvh)G<2=r$JW9mfb-aI&$xcaxNtf1Eb zypu^FsRCMnwaEhv!q`n!EmBZK%Vv9!c0 z@V&EODSXX{@9fb`E!nPl{YywVSD0x;XC@oeNDoPQ4SO6ZKNWn|syG+g{T@A{g`}!Z z?9LK{YT-ikSPgYk9z;pCR$4vJqP4Zcvst$dKh^RV$84=$=_{A5YOVoTh zE^)5<=^7A4smyd-OqrX?DXGp=lQM8x4n=*@(DnuV>JSmLOd0+|P7{#99MddE<|G z|L5^XmN5S^{yfH>;nmh;aSmxM#wENdp~%}@z452PUU&Ri3u23p()H(#KTjNyvETsI zGlDp(qoY?`QykMpjQ%%sS{n=?)dZRG%KhDfNKQg7dXnu z)4ho=ZXBhIq=5iN=aJ-&KcDrb)y{^vzyo;W&yAl!TTc9{SehAs-o$>Sb`XESqnTQg z{Goywe?DUUpfht0)OQ}z8-FT)Y3cD~F9~NetA%*u&+-8jM^&gYy~ZNE@#kj-ZD@|_ z!nLQMOu2jGPtMB_WlwsW5MxTz8-MTbe7AHKFGEavwS?WLK#Vg5D>+gluQ=a5vDzw<>T0e zB-%uXHyS?WMig805Xu#6p2~b_tAH8Ui8ED@F0p0> zPm}Shph6p-QNbl#0l=?<@Hf0B1j(u`w5~$0E%Zo5u3i1J1c+=*? z0bA~KK-?oJ-2i#0$u8UfUW$m75MJ;_=o0m&%^#PO+1*e-$c-?S<4v0vKeW^455RsG zsA=jt+upSK(IJZ}LF*`oi$!_U=Gj6h)evf1L6~aRa=d9Xt~E;C2z9iN_;1tZmf~RN zfLrWib>p-{5#vfHT0=-*qv5rn;!T8jdH&yxh!<;8C_FbquHvscO=j=-88mEc3|uQ! zsuFPG%9Tp)$Rl;bnzNt|8$!a{;U-=EZ$PrCMdm!g3H4GJ%`j13u?d*6#p5?5T?>QkRUcAw8S=U>B24|#+(P(EPk_NI8 zi=A~&BJrWHDLLaGEK=log<`j`X-zF(?^Tg9gt{%?Pzpk%JpV2s z?@_-V9eA&9V?A7Q-e4et}J_o!6x_?Yu7ev-7%S z$XiZX0 zQWr(Q8bjQwsc5AFoj8`mnKZo_y=^}smW5E;BN`bxJ$FWL%UOb%(XRp4D>u}e(Z30c zRwJN}_YnS!KAX4&vGI0Bf1J2AUVPpe{S_#CJ!<4`DJyqIe}fTN)Ks4VI42-o5blhA zQ&c(9Qq^CO3eihr%E_J4&(%vqJi2u-|nOd?v(ah*yePmVm z0n}v=NqLzW{ce^7TE$2g+C9!@RtxcF^z+rpX&tD|^B}w#y-g)Mqu&6ckDyGsdoy~g zUkrUyaRBErq%&H$vx%Uu0TC+$5@7*YNAW4hYmVb*-^CqtE<*l)VRd zRK@rIe`hxv76RF@v`8o+0TKj4uOc1k9i(>%AwZ-PK*5e!K@l4QHb6lIJBo@3Dpo*1 zP*jQ_A_^k*_J5t3x%X}oKmNbJeV*AnGv|HInLcyR%)R$=+YY`4@na#BH=_@c)l_i= z%F9Lz=G@*0ms(DuYC~=3BmUQnK4t*eLEy&uSlu}7AjG&*g{~RW|0&_CK*gH~@$&qi zACXIMO`AvEB!#O-`Y>HQna*+QEXlV_7egY1>L1pjxagypc*A0Wh8B*_=M+}Bp$U~N zqeMu!rurV)Kj9KZ8gHak`NS)w2$?8<8oUo!>5dhtsbYsK_G8$)=5A)xBeM2Dcc9W+ z%LpDd!PG#d5pxM1zp=ki+XgBnv?chJWGj$9I?zeo{~+O$OJ0y+U?$oYiN-$$p*-TY zu>&A@1)r>k?uNRyAR;mt(X0%`c3Lb`WsU*1705dUVKfj~(-&Kyy3er<Q` zo-3$XWdU5Ru431>Cqh-QFQX&Q0Ni$_QHxa<*1Ec|YJq4XD3fa4Xe($_SFzjG!aFRg zH;7?A%C^RYVQ9Ql)t`Z>P&Cd4agCsKl1vFyP#U#TmF9SY*7yL3bwy;IJBzG!YRy{P zvflvlK_OYm+PYutCH39Q6w`62r#(4*it_=?Vyu0LDn`Yc4B3kB*nPr0Jym8sx|h35 z+JIB~cQmrNkd)iSh4vbwfuz(fE(Gl@E(Rlclt>>h8FtqV{kF_^oCZXzeE#HxoQb(Y zkBsEs1@+&12QQNq(1ZLv?t^p_a2FSE9O5$*0@}{s#{$xt%-}a$#JNU;>^DgNDGQ?xfFEPmG0 zq#zWYCPd?vY^H>-k%(4!OaD>Vk#)w$^bBh`5ZwQHogoSSk99_$N0cL?)z2sl3?QF} zbQk=Re{Y>Ji9WAK7*z>GrjOE1-nAUmnTiC}8tMQ+oYry#VJbkEoV(5#CdLny3vRk6 z&0A;8W#S8{#SrfGh(?Ci=dLq~UvLfX&j5R^AkrZ6t&8RG{YmCA;ucq zZ#%6VY5nSE=qm(c>O|+>U1y96bEr;0PXlQ|{h6Q#a; z)vV=smV+Hng18In<38eltuq$WxYX<5-t)1#aoX{SaYd$MOalC;ginBqHxc6HWjB6A zIfji;xES+eym-?Fv45Eq9@3Wxv*Z{iW#=t9hA+|~yW|*QLUze9(u7JnXoEhbIV(kt;f*707HuOE#Z_&oLrXqxx&`lT4_( z`51hz31ymZ!A~}!I_BH&Q%tCS^oM)Ukk>{hx^eW53WTmOq2|$cZxfnkLam~0X;)YF#-P!uqX@5@6M8Y7M}3xWv8u zaazyB*Hq7WaS;(z8Y{-B?46+2qQeA9ZQ?3Hn#(5 zJ`T&9oPv`BQ5wAv9gp(G*heo0obwlJf%OoO@4}NutN(dhBFn-@iUF< zl(bYiFYeRnD4}tgVCo4@=bN-XQXY9-Un0fGO3;`d&_{R}T_SF=bgn_pdb}&GlV|lb zdOpY-1#Oy`PG$!+?`?p+<}cL1QX070136Aw?p#Kd>eV)lp#L~uVW+Nfm~xPzDabuq z^_nIW7hUxyHtGx$3hO6ot7n=}$>_7JimTT$p`_^B@gOfYeV)gDwnM9JXvxvH;tAC; zp-Rzb=YyHaW3y7S3AKoVFErGREk{I*>OYT=>dU&_rdxF>jY)&v z$iqacj6GJEMS#@?p}PMF<_v(PHSj$^pZGu-XXwwxry_B{AEc2A6L3_6e+BrD zfDcQbB#AwHg1db1Q7y2H##9Rsu@Gy}LxsDW!1`eIm zPYWxjfs+6&DhTw)c35OLtH$skF~~yh+M((L7d`V{PCAcag?b9OF3EaJGb+sWUw+zl^Lb@@F_F1C=EbR1@Jq%t4KqCQ}Hd9tD*o3a@UTvYAuca0BfY#p= zLV9nV2LH{s9Mb8nqSHGK`js9gVw-)>w*lT7eNtz>ss`Q%=&>TeIqZAXxcx9=3#F8* zf!hInSP0lb&A?V!W9d@vn*dhRz^@B|oEp{g*u$z(^&+aX=D|}yYo2DWH&AoblRVB> z^O9E>HnGh?WkZMmMl~thwh7I|zb2Qh&u~Jk-~a+`A7boExKygX?aUQ;^>cGhTIxG2 zClf|q1tgk8F(;U>)ucP!@@9|qLUB%7Lx7_b#`hY}ajNWTGo6HqGA1+bcAGF`niqiYDm~zq9isGXY+|Dp32P>&&z}ibA<(ZverICXPb}+%p!AfH;CD_sE zO$}B$jZHD3cQra$AU!is>6`@n)YQTHflBgJYeHWmxp|<{LrtLeGr?8?YzrF*cg{M` zn}Xm7s>BJ{e{hMqhesq5yGTB}hzSF;+L;Hs0;(~H0X|B^nc1eGkIC$5a-T3%NrO?j zaLo0%>||C(Nt?p*cN3KRJZfaZEM&HtgJg>suAYFp?OzZER!!YZi%%H4^Lbv52A?Xc zcCmU*xDk7)8P`t3`-AZ70f~{Kave0^Hu_rnl5FfoaW>z23~QXfOPS@2qdgHdbP#`HKspN@}RpF)`~*Z1D*MkGJ>xWgG$2c_lxU}9H;qif#)8d zuf62HscI#_hgUqS6@)bKIY8TDfKp4m#JnXbdF+y8fcqgH^#NKXkJKGO(i3eTu+QcF z4nR$GlgVhe=>-IAdUU6ySAcCWmQnx?aR}-d6vei zh5;BGE8r$_l<<0I$;w>fuk!`y0lBFPvwBN-s|P7y(2Cc2T?6O^A1GC;E8Nw&xC1hG zokDXLNa`b?2Lx^sT~^&K^bh8-^`Yr!q5T|7*Zh0qJJ?ne$)PB5rtT;d&3~ZI)s|il zTGLqi&s9nCXDvp#_77;63*9ZWDXcmYjtqN^v`r>{uE%TUKHjSOG6_7<|9$|sLcF&S zpsec7Dk9?u3$R)1&s8p4lL-^hH!qSM@|hR8?8cOM2<~Y6ZjxeL%8`+)ElNs0A$` zJ`3S>AsQXJbyrX?&@K~F)ZZDl`5pps#6vmFRq|s1($ob^mb9*7x^?{xplq%uO7d?; zGVwV*)Tm1E)KJ~-^BzXh6QODfPiNuNmEiYoSVEt{GD=NY@2$>@YgLngPxDxup892X z2^Xt3UQ^CyDR*8Eqk*@3AhTHM@~)(X?J@?@cv)YD!khW;)wBXkvVKUrv_rtTx5Tvl zlNrR8$`_w!NSVkz;rG0^sl=RXrb;Lr{Rv!&x$=exu{7PliMCdf+^BBJsZ6XYcdKVn@fajOX~8&G-;dP1JJeHPe;g)kyv(;}WHw z{FgfIUkfCoK8=rB4`}2~0PgdUk?-HJEz#+q%2fhg>l|Yv=%7YF<0IvDQ8dPp_am;2RC`-_GebsO-NPYwD2HXg?Q1B^=%~q+h1|&{cWo@>DcqoBblWPr z?-SwOweaZOY>8!5Go8kXzQH7tk!C`4FK(?fs+&-1bkz<*?n`8&&qyfK(Aq|Cm6TsB z5~U-`iY>z$UZ$l>koBVU2^(NS3tW>_=H_;ylOf%KeqQYeA+ zY3(HUf%N=#l1<(5e-8?{^ zQS~ntDe7UD&E=J6b2F;GK(`TL>Q$H5K0uyPb<}vY?Q_}ev$+{n?f6huJ%2`)I@)d}&bjTq-g-0*=2x(LF>9x-N$b9W?rvC@`O4XBR5`V@pBOtzJi zrapAJAhMxO^$`A!f>9k}HUN#EbXt74(CPOVo2vwt3WuyjGi`-kfE={Cc}i zIt1W|fOJ8)JCdDP(jTED)US}@X1HXt7_&Q)*RY^EBbZ9iGX-PnM3=U^Bl+__#0#h$ zfS!c}xjT}#ceIk^wGlH4Npg22`?7Xbiy_|b0a(qOv&_@lLwkhyCt_*#YRs!ZcaY^wo{qR7N5!aADqps7UG?J`uIE2Q5$NrLI`h1 zvQaI&-suZsu%Jx2dpnY^ZYQ~U5a##7D#>bk1=!mH zHBDWo*xQjjpK9B|Q4rr1LU}uqj{uEj zDpq~LjqtI$adsTw+{Q5M)JSB2ic6>{BS_6UE5yk15LWxRn%|#h>Z>_zvvT5VHfqWJ zQ_Wr6F@$TrJczT2HD`9fS`kd@iFG75?5Wtpl zfpaLIfr*y_NePQL6gGbO=c6a&jaNDg#CRpMDd7moiQl2UG6V1)4E|HXH6_|ah&LrH zueQ<=ypW!CMJOz$u#|8wiI#}8>#GEul9{!7&&8@W*vYKDh{6z?)(|JNj`7EJ8|q}% zHGcLyg(0(^T8@MVaEZbx?<&#pP1Q!?wtMjrVe|i}wQE^XWM0~rR-|v#J_CBjhYv)U zhJ(DVILJ=D%UPp%2vSL$Rajozg)+PS*n^U;Mtoh5W){}1lzjCovv1=2_MWi44-hp{ z82!hUc6~7 zx%cjvx#c-Ybk~kf<}1TY6-J{C5wle?CNHI3TbaUO$p1JvE#*? zb`mqftjt3>ENG(bF%oBfW{Wv`{TIw-hiySeXLo}3xe0}%H5U>3!h}jjpFBY5OA|_p zPG@zWdDMi;Mq6`RmU+yClA~M4AoI8hRf-N0#qtD+- z=zA0D82yI(j?A+r)Fs-zH&V`-P><;S%paLQm{6bSymcVYo6vyhwyOwTFd^=OF}-E} zWJ1HEf9!?!vk8rkwr)%47ZVyE{eg1N{MCeVqPLHQ?>7^g65V+vq2Entn$tIqDd6HO z*HT0MYF&J=l3Z#Z=aTt)4eB`aibVQcX0_GwKfIm%FMeG9zrBHfCy*4kj!CBPb(k(| zH{XVk{_MyyqB_2_`hmE=y!c2zs1R=zrXDKs zO8OJdFxhpdnKNtk{_-1M!UCsi45F=|Mu_N0TM=PF{aTFV@eBbC0WiS_U1mTsXVw~Y z?DdE9F6mKXz&h-u~15DK!9!I0AA~c#Nud-aZm=~~5R<{GY z8|tHd?_HS9Cjs4=1x|M>uFcl%t!x0at74UB2GPl zh$`jyll<}tY37f*-@bO8ozQNCa1Sm~U@CGkHU|A?QYl(>9f*g*+yp3I(ll_f=^0(G z{0hylh>^I6tx);FX0@8{6m!5I(dqlkk;v*j= zIWE{UZhX~o-VmiS!N`PQQs(uHnX70eaj=!cSzTI+PLsP}(Ow<1Zqr2(3WRSWoQJxI`hx z^o(r;-}mApK}<1z&-fg|X^&_t%}c81Ar;qxN(mQ-J6^nWY@KpxX({1UiQZ1c8lLB~fzyKymRO ze*}NSKt%kXi@#Bz9R3PwDZ@(gICYruaRf@#_vGX!T;ezhxqyi(o?DZO#H+})jJ>$T zNft1lgO16QRU>W#?-f9Oh|PS!VD%t|{^V)ux}SJb1VBLbgE~YIMn_$h@hON|>Z2FM ztTGMCl^!)B*>wi1zO0Cn=c(ufzVxDn+ymqhA0{QlCr#ddo9x`AdVME)UWWXZ53!P# z_eIjpzPknxrJW23U^SPJ!?SQ#2| zN;SN}mGKPJEd^whLB<(%*AO?$`=EYSK!zaBsa30a%vz`8XQ+S0%9wX6h+ov>Ke`nl z&)`?ZdF7!If2g=su8fvY+X=#y#}M@rV|wyG>Z_5Iht@I@YD5?K5LNdR6a)hUu|&w| z9#9Knh)L}s77NtlHo{c@y+V{u<_uAqm=LIQxvThjAxg)B`1zygj09LHTF$*OoSIlB zkhH<&JR8HQQ(GYr>FB1mBqi*M)u~Mhblk#PRj0OA3{kHGs|F?|v3sENd6^JxYBe!E z&^6m_HsfMA^;$3^u=+D)Ij@f4)Wq6>SI@be4|<$~)qUeBp>4rB>B@N&ok8^y#1C<% zessFcpI*`oR&V4`FrNmiaRXr(z5)D?&mhUwX^vQikGL65{xLXtipx;(MvOE#tHHuD zo&pw*yN;V|sj8rA2c(}5lj=6Tx~}@8EorC|w})Gkpqd0`wvX!yj(&K}6+kYHyMG;D zyVBy80$E!Srp1}%fMw_zw`&fswAKu70RBW6bTib=&HPElp`izbojf8gowL?P!+F4A z#zmViNk{<=nqg{O8Ve<(AsuiFVfa@KrPP}=q2!!^>JFx#C)lxs+<+QS%zSuNh z+OLJ=@%#(qyL^beO%v*Nk-RXV9)t3XN44`953+GDpS&*kI+Ud_sQ2+4^k9({BBX-K zoeJv4K-bddi%;r2h~EUIvjgCej1D&kjwhHBQe|#pGQiocZvo2!eYi1}5>bsIULpV^ z;UYC5Z@iOyZ{TzbQ;TXK#NoaK3s@QW`chM-Y7WG!da;9Ra)q@%2~<)tiuu4S}`X+Gz=gARdX8paD+@9%jzf5`KrMmUy|Spmr@H z4bKMpOtway6o_fD0I{$qzZiIWxZ_M=`c|zVc8CSY-AM8)fo}Db0gQk+-Uk>EsOQOu)F74dX#&|e7dL4H3lFAnwFbmSAEkRC=K#_`l?y%5#TNKmAodnP zRrm{3-O!HK7Ig;1Up`8f4yN~4P^l~plV^pVZerU&g`2q}$JxaB(7LJ)4JrA((3aWq z#jG}9x);PTPix4b&^c~zf@&<}nFS#ck;lWFf6D+-ELiexsR7LzlAKVA_OXco(A!Xpv+igQN21Nt9*R-muwmA2XV9r>UtS#FA1K0$7=io zL^1l4)wt3$K#gh>{Nte2SPev7K^ct})mui@4#5ZSvQ4Wqi2g-nX;kN6Di$0)a7+au z>xhD~wvqkhMR6Oua^8x%PsF~eZF$PNO$NR=x!=gTLx$Nnx!uTG zDg){;HFeB1z6_`O-%i?aiIPa=3^(x)DK&-2t2~042Ok3CvToF``n=yqY!o8LkeTPQ z{wjNvM^Z%MvjAQ%1gfCqMkTAZ>dy%FJEfowfjAtVHyM+bBl2`pug4d)eDVtBHhkh!@8KWSYy`sFsvf2G9{= z_gH|u05a=U)f9v5J5u@+AWj#6ZV{0WiE}QJcj9IpQ!fTB=w<*b{uT7C+K1ilkVtwO zz$*gMbz&q{P(2QyFBF*i7=4BQq4t9~>WlhH^jTDkz-(>?b@lxLqU16!ReB!KP%~X* z9MS`A%`m%>0EwaMP`XJEi2TVND^!GvhOaN}vfAMFsus=}k zeTE;Y(Vrmx84HlfDC=%Clro!^KvZnT)b71h#$6Ynnt%D-c}-RiH9tGRks- zW1qGqGZsW%5tK|bS&`r!Z`$5?6Nu%4ifJMhltxtv*6M9L)Kef{E+R{&nXJs!L+ZVnF!XfJ=q z1*8-CFP78RDWHA@Q5=4Yk{lPboI0mAqv zFqYH7E3ljjt$^k97_e_}i9(LCoc=ECM49-=NW8w~v;v{(9?@1>+Qp~HO`V)h5bT~p z8#L=Zg}!+Fyu@Z|D|%AG*4DQHi-x-okS|4woSbk`zI z{f&q!llYVTx_b(5?XXL~Pa%AZOB9%j6layA|4b@Hv`(dXD9kv>@scLaKZsYN2i|2m z$@+W$t&`|j(@CBJ;B}IIun)l{?j$y*ljIUN$BU1=2i5N+iyr`UOB3ib=*!MG}3A zh|34@C)*2aSjf2B3xXu6|A*}bX|nG2f(#$-_QGRGbGH|y@ZIeNX|?Y5g7i#xd!ZKh zQ113ZJ@MP^g(l*++Y6WA_qG>$E)We5KnF6!h3y)B$+mRhm z6M^J;Fc)!9UB>+Il+M=@s7nQ5ipJYs*wIs285^KJ6Dz}RFML2z8yO!!-4`pvZZ9l5 z=%(W=)SqKz*zJXvALgi=PDkmLtT%C9Iu4W};*46tE{@4^Bd9F}VQOHo(ui}a_V*09 zTE;-A!((OG?S&^;6B-$Fp)QP-VYe4Pk0>kSKB#Ma8Q%6n^V+<_NNaf&YD5>fx4rPg z4CTl`A5fph5bgHD*>qR?FG4K1y>M-7S8>?~Ar{95^bhp&a&HPygyS*^#D_28b zz!U#NgWX=3xQn;EX${u`zW0A>@V6J90JGT>?D*RYZxXrBBSdD>Xd>^(h~{rEoP>Pd zhkR_P?)F058qSsCOl8}7%-ddA{{>I*!k}scY39KqUx^TJd*Rwj%8})h>I-79pxhz; zkc=NU2h?y=^J)gfc>-`J2@O~l_!GN}l!&?u;{Cn^Z+l^AKP%xmh_Cn(yzPa$oIBGJ z_Cq}EOYpWAif`hby`ti0h=2JKyzPa_<+z~}K!t}`CE&bV*zJY!1DLS|&>UhL0l2xa z+Y2{dhJ8{1Lm-Zhm0-6QT2!}om-!H{i3Qm0g_5lH?yQ1@2OvHi3$WV@f3&iItq|Yz z0p9k)FH81AEF=@793?e@ZlcDPV;fGz$vsJFe4`6*J>DlktJ#QEC`PrW6OHz4mV z2#JVlck`fFFqs6ZQ$Q~GFj?cch=ky?ohYypSTf7wY*A<#-uA-4L42S{Dy2S%Rz6CP z0^at*&s#zCgF4Pfh^9!ay3}Cux2T&3_QVSC~F_igIef_SEg zERE_M97G;Sr}<&``oNL{G&ApZ7c**t30s<=IvEPDz{o|dhSD_9bC zdm;HA+lO0&=;Wcyj=_giPL^yh$QoR4FU(8DBijr5o>#UPWVx;FL;qJWTM7*8DPg%Y zND0f$LMVJaF`@9Q#Kem?B`nK@l<b*;6>X z!P`?1w7aKJY%S|4e@{VDZ1)s|!R{$YUhSTOWYX>_NHz=XDaa&j_Y|bY?4E)&D!Zp3 zW2@a$kWtjzQ&>kLp28*mfzH@Hg>6Lc@d#$}QyWR6W!S9l!_^rI`Q~I)I9u2il-*M}RGRm6i-aZ+TM57|2fL?`*TmXhE{8ZG z7GU=ju5QEqpGcSsabYaL?kSXGFw=m0A+C-E*gb^>qd843rN0H@P66l^5y>LX+fz8X z-GaUVaQa_C->MyS;uaz)_&8$`&g8~O^7a(Q)weTcEf7rvW%P9vecqlz^P#o@^ae57 zN9n;|L%ltPHS9jCIY6#02t%0NQ;1Rzx(rr=Sns2B7QH=%wKpK=HK-r?h}gNt?kNnc z2J8foAAFd!cz;jfzE_xyiakNj#F_r(?J4x+7Nvt!SSG}J0&uI`?kRlv8`drXbcNU_ z79cYadkS@$+M>yYI7a|673S?JWVNszWGRT1o*1_>?4CmU8CxCF^HKx;V0C=X;+hAXgOLU%s+l}w69wTnE7axg->YGltL-@!eCNjdnYOSKZYv-{D zfv8ULcR^64MReo>YF$vjEv(0;3#b&a7vU`EcLOq}({*e3l!$;D65ByQI+2ll1Qj%$ z?m0<^8Vq8RkCGf~sAoFOJENRoBJWyAO9ZJ?=9x}kC<$#9@lOlQ=+aVjs$A3Q`r+u> z0b+MSl(Co&VPe;^gjS&CZ3XrwE>XxaEpH!jN4)q*1*m?@`vJn=9?@2smsHO~Dpr6>30H#k@V9oU> z`|%c80knqL$p?7m`m=BHI6r`Z8Vz-#AdC*rTt8`nnCllpx!I#eB)b^l?9%`X+Pgv? z1G3qNNeTJp`qHOG(mRm%`4B6~n(MdBbtRnz@`n$TGIfpd`zR0Q0c7+2*JpWAG0vvi zdm12N1nXLzujWwO2*MPNXRg1EoEsTKp^k}_Va@fmrnoY$gnC`93~R1WJnqU^1@*C5 z8P;4s=1OJLu?_0m1!R}Sk62~Gh0q5n#n(IHR z?-pB4sC5P5%CP48U;c1qbb;F2m*JV~2Y$dxS8JI9HKGgLGuK}>(KXjEi6L5Z{RwPw zrVWXm+%M>JeX-VD zfAd4GxxQHp(VFY;%vVkyozDS6v|9w$T>pH!TV2y*IIX$ z{mL`fC*&ySHJz`I0G|*B-7R%>11>jB+ z)?D8@!IX$<53#E+!86xqjx%Mf#zD;WC3xm~)z#FRx*p;!z68%)e@7kVyi1|0#~^O> zC3xog8{&A|p#a{3_(7}$ZH?a$sP&U$Bzz6=`&bDY@N^*W7b_vWg^I^{fnXKVOfMWcpU!Aoh&~Saba}tXmo|8R85d;F;@hI|lbn5S9y37jr~vklM25 z`i~GXEEUvKAYS%Sx)*xp`imRd0^bMXND-7Z*Kas#EB1E~2`_sZW$6&H0Pv!*rH196F< zj7EzRGYIDTtykIhG7!X=BC<59bMT9c?7*=A#Nr~d#0-MD{;D&Gpf1!yAfEJP6*SlX zdO|r91@$(Fk9}DdWzF^F?zCpf??7DeP=ze;vIf`Y`b7vVXjYNswr6_Lw*CJfuoFLr z`bi1Pok2=CfItrS5fcheAtqkDDPfuP`TmDBXr@Un)423wxm*5%dOHSs_T2w56c&#tNGt|FwTse&euoB`Uu@bZ$ezJP~ zMqYX$fL9^zh?SrLvsA+KR>Bt$PsB>FhWcK!?X30>#Q1GqHqF=bIQ-x2m~yI!id2Xh zu>fnRZ^hiK0qr1mi3M0g{p(GYvqwsQEW|tk=z@xTBGu|1{#Sb~Xfc4h{uT7Cy5)f5 z91}?!0lXw2U8_ctXQ)58(9V&2L44th`cCwDhWc(TZT0;MqWBwLs`Rk0p`M{$&g-kH zKx!9+AZ%kppp9nSIN5sxD)=>Xp3W9D2a=#Cg7VjJC z)89kTCa5oZ2-0E?|Hm_Ho{^@%2jW2ixJ}<0>IeME=pczb5AnBHfXqD@>hHuXpj&pC z?KFK{Y=wD-`Y8`#Xb~|jKy(sRfy%Ik`p0M3k{JbJauJj@)E}R2HQoSXnV@2thso|9HCSu}coJ$G6 zB3=_K|Do{ve#8Nd_*^31)813!HL*X6_b9Px$z5qL_3AylgJsZH?b+mMAYSH?=t~0> zA2n1XB@~Xf{0myM(K{uS6pb{5*1V6BP;&HBZba*~Frm!2?Ij4clBW}*o%uFay-T}k zfz6{07+mXhnxaMIL=$Te>XNTR)8cM@34z^Zvmv_TUI;xFX{P+RnU_Q8DVdA@dK=ze z_d*D!uUBMtXFeHtXgDwJELB5N7H!{7Ii-4j-q~c}lef94l2@|m3>=nFZxiB+sKQn% zQ#r7e$0Z8CiU`^N!)mxjV9iwq)W#mn-gC85twdj|I)m)`qN|69NE%`Uk=QMyJ7aw^ zeK-`(2AJ{BYBYwzGw|1XYdH107GGtRIx^rS-qC`8b)U#<{GB9B9@XN;a~IK>rTRa@ zBqOeh{E1Dp(%j|&r_>mEfo~u^HP~JWP^m8va9V_HeMf|B=btCOZ)($ ze)SqJKYm9LnL0r#4M;r?X0u+NZ}R|YdtB6XgxcLh@Xr2!NKE902S-2)B$bkEsT}AF zJ&a#6<^xe9)apw}|Huu9qq_@RqGo%*W1)}^w?Lreq?zi>%}dGpn~0EB2RtApp+4kq zzp#Au4Iyyx3~D7CHUnp#bxR6r+|OW&(H;!We5vZn3Mg)-emDh3qbo>`<%rW9nV=gN zCpq=esr8ZX{Z_*cfak!^s;JHST~A$vZf!=rk0co<(OEZ?>2+%%ijK>ey0 zh>=eOHLg$CeQ9_T^>+hS+trm&RmLvJxJ3OaA=?R>s>nv=)UP>bDF~XNM)n0Y)eqTdgsqM+96`--9q6q-$NQwruuW{{`s8afCayf`jL19BBhO{>XFpVT z**m18_WMH^TzEyEmU;+@XML#!`FJP!xBx6!waaLhkY))Z+hkBmNTO20m57VqG=e|* z^o0IP(cb_Fg_{XUUfIvP&!!2-Rro{UUPO29*o=}*>m>fO?^ATG3A-iRUI|sH1rQhG z66Fp5Dw4j3LUC#L5VgvqF(S>*bDXqpN(8Fs_qp_bJx(tRES0& z1Nn`hvrr&oLIW1RX}!9v@IFuw)VLDwaS9ga;biwMtxuI7SeeqzrC>F#A(#$=Gs#{~ zs&&;c?v2a<#bCZ zu7#DS&MMc;(%|g?cL~_kZwFNa zTSwaXOB!fQqQ)Hah3URXGyRFE&gX7n)z~0K{PIn!#-|Cp&9sTCKr?NSs)VXCAveJ# zN^^Fqa)gH_?KK|Z1Z~FlZ5}SDaSOrR5Q}ShEx1~* zA5e~TZ)tNHw-(HkK5m5iY#X@R16jXp_(@niwi?Nbp@kn0|g@2TY z%hNcdICfaT*d4_Q%&M^+TkIxIXb|#Qh2qIeWJScF z`YS0_Ye7CE=mg2F`K&@y{aJ z=y>slw6{@fM&G1{6-yH>W!$(qVYh8W*DvH-td(SLVr^VT3ASMs)f3zRT%xWNMys)<|SRD z`cu1?njl|AShtViytN6+R}tum;Wj47R}ofSL$Iw0-mA>VclFo2g6S)Hx1}T?+)?H3 zW>*uJD5+2sPTl6j_f(QFwHU&3kLV5Q@-dn4>_v1h+vNiq{XEF6f{toY44^El!wYsb z_J*gR#(fUvdk?2a+lc<0Ol7r!X(If7wa3u?k05lSB9)ORg(%#-_nJ_=czMQfu>9AO z2pLd9+S_>+b4WO~)#{HqtB9*2f6{l_E1@Vg0{kRg;@W-aiEQMb8P3q=5ij48GBk=~ zCM>CKRAb`Q3jQAPh+c90%Bm=}-Pco&(I ze1ZiR=md@43i2Hv{iYOeQ?-hur1riY%P_!_8h8TG&pxpEem}A2dV}uU_!B-3V2ZSq z=BPkTX5wtk>4eB1g?2a1CAEL{*Vcl@or>n@3c8QSK{`Hsm;?{J?+=~5h{jBXKF`BM z){_oaVhu1UrVhGdf(9mO;GI557pl{F=O~(5qhx7e(wG{*PS_od+AEjv4SmHFx@e)Z-KIm@ zn-VV3N;>5(q8l|#rDvzs6u(q-<2r=hl4_z(O``TPl~C26{1pe1C@sgG(?_Tmq~dCi z>SJ%}8Id)*rXZi<&wlk;XBnlfiE0%8wJ5DDeyP>Q4q;zu%~L3?s)VYh^S2O}D2elx zPGS9%n%3$@U#Uhv;30JvlT1qS@cc7`cuALuND1$h2%)8fcZ*j(ogC8Ml<-j^8hyT; zCY@fr8?%XgJGzQ^^hE#X5pWy6+KA@mgtPgR6con}bF}ZVi-_QlkI@*apCuupsU(PvFP_e9G z&a~GH2&s6G_JS)Q#L0<(bYU$me87I?bOk!7C_D?e3+rLw&jHT|dSg*|>tcSve`PD6 z>;dJh1A5qn>l!0RlPTbHMo*@|-N4|<6uKMeW6FGr`s4`)$s1Khabq-c#V>r; zRKYCNTyzL?HRW`p5?^rHON*TNU}-A3Eq{SJ#5Kd|>J|^prdI`;O%?p>pEF{T9wy?iI=AFoaLX`PrN*FCq_IDv?h7P$@Y{KvFrA zxCiWYIf=W6`1QDK5h973ps%#~gNR;fkr&)69J>IV!0G0yD~A@6rxkXTc$$dOnKLCy z|FQ+~p}h_`$a{zw>uTV%1o7xzGsy{L%i=SzY&>UINpnuMGOX2YEf0U*)cSMqcZcOe zm)}i6uGH-9QadCdS1Q*A2IuBeM>fzWSE~391M8A2wQK`zbLRoG0Vh}LdZ~ehbEUd% zASrh~FdImAa*mS5_g^$=oA8pkmOZ4Lv!w6u0%_EZ{EEN8yJc}=w5g9-;N^~BTH78} z995u3B_m45$r{Ep|cRsE_iPFCUw=0R(RU+Lh z=QILb#$IEMfG(dZXBDU||0dv0Pe4vmd0stYc>?1M?|OJYh3}_-<6YtL&S;9>83C6| zjW^t3InMAo7J8hY^x(2hi<~LyO-7Nxy1-xDo^tQ+xI70eZw|au;hQ{FP~wvUmOQTu zNS?Kn_}Y~mSJZQXos?+}O2HMeC)*_B9YnpXMKy2&&skZU7EPYo&=0O(A+#6q6LHxh2BFy%^>uW1y1p_1-Y80D6S@WGE72oEu#H4I z@eL&1BIeVIMs$S~b3KKM&BSlVWs49|u}EJ>J2{UaI@uzJ*lU;1m2(`xKR8{Lx@g>y zA=pXcbu$#5Io~6}%}%`>qjNnHYJBN9?QmLxc$8FXZoU&7>DOs{k?`O}9L=!0r`T)w z3pNU2n(az()8OQ^smMz|Y^6MJuQ|Y10DYz~Jnxf%oS?eb?KwGOfw1PGjluxZm|%otB634YX$|7H{pV@6wV%$VI1?sG0%O0Hr56ZSh{f2vS= z)-1}MeNK2*Aht3RD;Z70 zk0|F);zLJiN+LtLfJVBA#um91WKB@@Vv$$8lgi50BKq5FrK3F311j&Y(kw=2vR2ko zuQ(3Y#Z0x>E5R-Xn>%gR46s`*Hs^P+Yb|EGy&eX;9_&t>uBA6v*2&~Fr{x545U&nv z?(t4erD}8z%k_o5wmPPqlW+!)73RK!4>g4neeTw9ADCgv=e)hHgu6PN?TT=J!d_iy zp3glR?v<4d_Y3y=C){J2x-5uUBo{ls6xOsm5}JtJpd^j^zr@tuD8CB;R=- zToQ2NZJ{x(%eQTFa=LI#B-eC<^Y*$G3CCbM=SmQdNO0m4yJC(z-Isfe!+{Vt92If8 z4T+~f8~S4qZRjT$U8y%tHd-ourJS~)yW+A%hF;={jVmyS&=j1OD4qfm#n?1KxLipe zT8T@Mcqj1>;Ic)AZk2*`5f?1-9LTN2?~Fy}hzZR_1gDr(_Q4Wz64V8pZav~LWgzCW z95JNDS?pCa49_NbDzYt5>0~TVaM{6yc_$thQ=7Ec;IiEd^D;q(7l=_Uxa^&UGiz8u zGp(Tf<{v@7Dw7HdF1u;bys}em1=;I9l+2nr-wEGrT0-0WTd_ukZ!w{c`PJq-KN(Tv^S~zp8m9oxWXH9a#w+pMDWu1Am@{G2wSD0)26IR>(Mt&Eg z?Ew?&VYIC@+U~X59yHp{Eu8tfmG-y2indio+jEOB?7U~Sl$vg|ZF03eZshkd+MY0> z0Y=*fqiv1VwlPhY)UOL?mY-&%Y`0g@_N39qU5PXE4y$E~EoohfuNc{bji#+8G~8%< z)o5C8HN9r?b@if|pIS-PTuEqp-Duj1Cc4S5Q)nU;0(EE&&2auu>r9Xq(%$yhk@lK& zl2^?WKL(dAOwx+S$yPw%3PMY9T7-Di)bmUa#S`zwKeejtBWN!#x&$6CI|36#OeH%( zth3i?sCb3=eYk89ii+%c`Z_xMdVOWelMROTmLq*~yyV5%4d+h)%6x5`ws@G&Y1$1% zeX_hRM4Gk}FPjbV@(Jf0*?XvN1?1RkecEDcu)|$JIy=E->lYb8RV7P$svNg*G6~ED z_Yh8JT|8>)o${6M+hz2gdX7zx61U5AHFa@o@yeJswN6{{>NQuqeCKd{vX9 zr6lBS;?Lo-MT?ZhEPWlHy+~gNXWy)^eX{S?*Dg+ud@bFTFwaUlhosV{IQ@mwL&e%$ zJ5=PzSHu6bu+phUai3F+e?WT`fsY$7fn*FPemYL)_@Z%$ikX@x2-iZ};7Mb)7;~()mW05)0Y?ee8anfF=fjkN70#0X2r$hwjGzIR${;}}g zz{`EZDh^iwo;z-gldwXfSuo~>`*C`Hh3#N@+g|cRgY(9|%gy8pGbs;X&z!+A=emj1 z@=VjEE7)uO(|kk&d20)+nlCYEnZH3_2haCq&7n!kPJB*hswUYA%COg^2;2jUe5p;R zT|8!}Z$KhK`Y=e&lW$?c37RTgYOm+uOgPOfh|`?n(W_i1Ue40w$f+6^yv{Q9`Ih@;zBU8|B}s3LRn|Zc_5dmw`D#Db1xY4i!ke4wy?}5F)d69 zjCOM5v``-_V!XZf`Cd8qA?EoaqRMBI%a(?jbjZOWm+4B&yb0z5Fgo8A&O~+t3Z>O% zUG}4M=Zu*`$P~(OCr1vaxr^T5OjD^zXL-XpV(Ph~#AEuC9779*7w)7aZ{jb`a#XR` zX>bk$JlEwEk8tK?jFRJhZb`<=>ArENk>K2nZv#$`mRix&jVyB`sd6xH>g&VAI}99O zRRp!q&O+U%*!G9Q_lZA&%N9{$G+VB(eX>{UYY%5!NiymDNGSFDSVjJ@yx>Zih$8i6 zBD(UsR(PApM1)ci+`}qcJ=G|!e@;2=kTeCCEn)-9y3D-Nf(BdARbi-sWqqzHqpyRl ztTmSWmc1@T)@>kG__7$G<=~-<7;0}x&VhUp)QPjUf^}grgI_uGGb^l@h30?Dlpbj> zhMM5AZ42{5+_OZwno+w)emSZl(#?eW(;BBcz1zt1*8GWp8;pSQdC$Mh@MuG$^VUhzyuplW zn02;vq%3+MVGK^UVDZGx_wlP4ekO>LILFSpw{l z!aTWoPSSc)!7}O=)8Ubok!uaL|Wa^=qH23>1+~4;KoFM!=PRkTe0h!^h z$P_+T*2PxlG-Rg!$iZV=w#d+xUXe=Aonx}L%3gPa>;`HuPFK2a{TjZO`gUQ*Exi8E zybl@Z;-c^~-C0{$Sn^z>WhwCWKwog-x+iGq`INT{8)4z+fPVt?L{azvy1+;ayVG9# z{6hb~z@bT;PP^_ETKW+hj|=<6!Z!hL0<=R>cr!}opoOV?llG)vl`|gbMi*{NW^mq^ zvTXf~FpYaa-uMN49^Hoe%sgqO{9~`&{3eYu&?&UC>t(dD3VPVTjWq~|Mp-3|OtpdEj*xwd8c-|5$o2B3D7y0;910Zwl)XYyU!uNZ0fM zj^o1eEqp2P@@G5g9;2Q3i!sjRtn7v@@H$ffFWc)TB;>(#vnxS7F%tIC z4YhfQo5wyrzcpfNKWJYfCbj35KB~+`$j~R2ok6wYfhz{f68I=cP=z%v{f&( zX6gFLxPX&8iX~E^Umr@b9&68litj0dUm&D zgo7@nln|pNxdg=WxI{rIb9g&R%_;^u6qpQEmth@2v=oG-MoKaiZi_!&yrs*qtV=4B z@hoe==)@|RliG_HHD#2L%5+uJz|O@bz6n9zPNd`eshfyf<;6#KLG}N5;I&6Pz$1Fo zW#znxdJ*WGK3o=^fZpj2XyU^(P7PvT%)xYGbww=b_$7eyp3YSUqyjw3gfj`!I+3&l z3u~D z_l%($b)J3)py&d&Cd#V$L4>SrfYC+1Dy$_R|tpl1^agPJoT@SmwbvsBB8 ze?n-wkC>8^#_JZ}hIWYhZ5~ZZ7xbGz_j#fWT>1}>!RodiP>c54I{hBl?*%1;I+%~V z;;PSL9vP6PTb3y*1!wbKL47WO1a)dH2TBCc1Y)aLz%c=oQdhrdC0q`1gbzqohh8Fg z5!Grl*%PzeA|aaW={Aw9z7Rxdb;nNR-wpMlB8as&gD9g;up6pgg!*O?#6FQxPTjp6 z8Hb>rD1^93N0OGX*FhgMl^}}FFFOF{UT2RM9oGpY(RuyZYtfAVK zKxu{;zb!wlqacSE!?Wgp^Rs0G_NyRX|z~ z^~^&^n+@(3!J3gW$P^s${?Poz4&?S%JJ_*S4}n|n$)&Y^osFQuYVV^qd)p!I@`M5C zwH&|*)rNJC$v?!?J|J12i!U=)ja^N$9nx76XOmK#q>unP2VZ8qN-jnM(x7Gu!Zg=9 z2J!CaD9KjWeF&l>)ILRI9J?Mwj!In#A{*)qK@^a2*WGBzRcD?DaTC<#f-ptWOte%~ zvo8TLMHOewq1O8RLxt*uWo{RNcK#2AWjII)e?(Ng^r{paaYQ1777Bmsdj%2F;D8D| z-bez5KZ5jxW@J67%&vfBx1^rR-wW8e9JvjNjTc->_)%p|_s#4rIs=i=H_;_6wmGxL! zcKx;7PpG^?MEcz|M8!+L2!-W8C48qFQTjSoD@o-pI-kVZbfM9scz8%+%T-dZ0^1?t zgv@AT;;X6s#GUiv{bAVmx!4S)O0ibQ85xmZk>nPj)>2QULv7(Biqy;Oc_gOgKOc~U zUcg5AP+wSibrmc8a+kfpDoM=(akGyqB5)YT>dFoMU>O2e1AG2|Ld|W#|Hs*TfJsqo zkK0o-v%@Ul4h*mh&ay1Ku)E}(bCxJMX8{o;ibN3h39aea=%nzbQrVHs}!#4;I!9QEm&0 zOcm6CGz9e(vY*`Wrh<#AFE*iMN1tc741?SOD-9R0!5U_ zQgc*m;Eo(AEs!W*rtz@wDN*byCD0s_L za<#-@zK@mKvL6n4pkAE@`0)~G{LLi3(`HIdx2FP8Zkaez^rPIy08&(q;{H3eXRxEs zC!?9F3efNpXe7E*2M(U6eDW;3>H#oBAYB}eCJl`!#eAqWO$V5Ji6$9gQpW`!Qzqf7 z0XBP@Z0^Juk~(QkDGR*}@XjTWjC!flnls?)BKR8Mmy4iO)n^F_pSiv|iOyeyOAec8 znfS2>$^4wU__GxN6%Y>cfd5lxF;{~3Ct z2PDQsqGWo;c+_i%a8x99go>shcLUDQ`v_m|WU*7Crx zl&eZrIUkXP&ugdSC|;EDpTjl=xnU#XM@jFX~72<(w z-b2GYbvV;%XoavtJRl=+>H^hvg4Hkr;h1<})O$p+NbNwqj$$6dyImln+j*Kg$1s|D zhx&bijpuQQXD*?hPK8>m&R4J*eh=bvkFv$GN2q1$MeZJTvHS*+grBWoOYIkGxw>_Y zrApzha1m8pZCeEOn3~;=nrnu%mk_3}OJ6e$u!*U(YLj9AQdb|hGx-GAJB0T}89hLF zCz^)5xt;3w|5J|$9tPg(1(<0Xn%sY;2K^luP(LptediKF?qO3y{y+23aT@85LYPFZ zF*@W9H8t#iih@&Nyoz$f6XyOiHNStz5{Mj6x>>^e^zEW3)OU08qM=k}OwSy#a1R6_ z;~{6h?&Nux`%E+aNM*#ra}XBDD96WFQa|uZ@(Svi<|F@mTr<^xtdsD<#lqX=awn$( z3rN}E)T0_RK|b}LL?A)Ja)T-kn?8N3`jh7_JdsBVo2F%5NqHQv&17WAKv{v^e@ktGdbUVQF7eT42CJVu|F54JU)Vl~zCIS(wD#&I?+Q5Zh z+6nJZsBj5#qu)a?i7_k3v=KFGS*SEXrOQLt4`OiD3!K&fT|G#T=tb4H+^VHbEP#Dn z-U3mh0VWD$3eU+?lri!y^FO5I*MtcJ7o}E^TYpdD3wh;m0mODawi>ZRgGR^Jx?*^W3!l;IrGu!{7+<>KFu6rZnGBR1oYI542$9!D*4&jlO5`Q5wAa_ovrs>P zYcGP#q?`6u#ulGX8YPpijCE=6J$Rb5-wD0K3vrdny$p3}AAIx>z*dCMUINHSm-f*( zTC+NY@TdT~jYX!}@@oL_$+zS|ok#em2izt=NhKp;+R>evXt)BO_|S}8lI55lzhdEv zh(pFh&Pm}$o`)IjI^mJEl*BYm`$yt0sD~D%WawgSDX51QKR>;$#}*XN5)Be67G5Zq zcX29El*Qfbv?R3$htZHv$%yA_2rIFu`LhT6vTv9)%varaqBJX(9aVWSqnh4BEdIb4 z@)peh1+VR`;?Bxfc3uc~a_>J;nX_azJ~`!BS@6r8XV9c_tFWq4c`wmjRNf6KlvVDC z*Tw%m#tW7E++5D(`p)9~pOQXb`FFABR!x3d`7`>kj3!yC;9I8|Yj>$CH<@HU&8AfH zZuQVqafU0rvjgWq^_FC)bsMgqQA1GV&(6C-?So0)qts$N?&U~1g-$*qXaxI|T94-e zR}eXiIPwFhipyzj$ycii5%gB;3cQr*$$#5^P@>+((CrReyyt1q1Jh++oJi%&6 z<<=k}Dt9^4h$>fdDd&t*l+p{8ol@GpJh7DK-1EPd(!7j|O6e&)_Hd-MypK5JO6e^; z&$@z0JH(OBoSah1N1Sn`RFpX-p!}pWnZs(+r6h?&E%Kcyi=e&at3OV`)VHRza^Y^!lPo?Qd%WdK2Th+}>D48)^|NoZET9Td6 ze%{981If#8=!`F!ukcJFS|cze^AC(uGS@O5#g)w9rZ`nP0kYjdru|$}GRL{6Qn|cl zPfnj7DCvj3UZX97bSDW;KjcGG81_D4G0Bi2+rc z0FB&0zN%_39ayQ3c=dI??UySq-=My{jR3jRXGy{M_)~eErbuDj#0{FteZHGqH*P7? z-A~H(?>s-Ma=W~Yw3=#!qdgy zvnf{&LmJbtELqG-(FUovJcJs)X`_Q&4L<6>1#!aV??Y5gPQ`RoK^<-$VIK6tNya1P z$XY^>zU`&C_zNZJAkTuo;|0+P)8X{0iqANmB$lD;8|l=AbdYo4>1F;)hAzsVaf(9u zB$VhH(XXwJKA+ZA4?TVUU6&2q{S^X_`HmY;(jL}Wc zQs*LB2Y!-(d%eKxOcGZVCYA}g+clV9gU5i*d7v&KOW)WJwKpu^qv-;g&de!3sEH_m4fAs%F)poZ%JHWv7uGx$K7nvet(M z!Ik%{Ox8hCbdbg1tGyt)1=v!&|10QKPu0_jh-msb$X`40`z`R7dry zi`J*Rj?`KUX|2&5zT3-j*;XH?OIMY5(yDb@>!~u_Fo!LQ|q%~ z%ByUdPW*+UI?RLcyDt~U>l*b``(pEj5*s^$*2=0gkbYq)3+r*l zSul`(cqG#Cw`jOfAic*Fq!Y}jTb%oR(HqNAsd>b~ks=W&V}Iid(Ki6+su~EIxNeZ7~qGiXQ`7Wk!in2~rp&HU-%VDEObCoYW zT`pxZt$qlX{&1i_yI}N9X5;h>X-G0*e$E`9Udp(NMpxCqm1$hXqZjCq>7|V;-8|y3 z4wcq~)36__*-VvQzGOvW{Jbe_&sI!-65}~>^)jwP(YgV&_BO7}XjyUfHLj}B->-%2 zXIxFAn?6S--y}p!=V*)Da1AuB?$NYYa1Ao9-q9ECCfrb|Ab)oM=&Rzo#<&JYch$r- z%(#X{_law`agB^_!j6%C?RFh*eDsdH(K*uSoEqIo%S<0-8sJUQMpzWnM~f_wJzGV4 zit~EoyiG+9)3VdY80UNyJt5Aq#>v+x9~F30F9pW5soP3S4VOg9LB}IX3zDAjJ zBhE=u1oAb?XiS_p8s`=jeU97V^l4JYf$ZnlZkAF{=U0tb`_CDNHEZnI zjcjkcyv}6OxUlL~cAw^BWS@I-EM#n$rr&j_9V!1Ae;?7Be3+?#jik2$?k(EY+G&dk zU=rsG*P;nZrd>;?w8^A!J-kA4iFJ~5!?hUBw*^bqI#`w6`eQ^Qi}&;uSlvq26F)s5 zy-NQp*=RdbzA2gjjohYgpKU5#@~a%1%@`77C`!V6|Tr%WnwJI;~v5$RKrPdWP< ztNR{-YCC$iL*+m;^e8D7W3SeHHMMj#e8<8!^MWejRWH!U0hiS4H@l920m5Zf^) z7_pfUxzE@Te>x$Y*i5i{>9wkOWt&JN<0lcQ)RNs*IsB_~n1Z75YyY0A8Gb`te;vr2 zq|CkL0zKfZuSwg$zqz;4$(~N2Tik%iKNR_(8mDZLtVFgpUarFrksl96g-<<;Y`@4) zO3gXphi+#s*776BzVPI!s_+-+9~R@RF5sW9ijx^H(M%HAJIU^-%5txo4w2_kjj45_ zIflKp=Yu+=^XL>Ays`up_W|OWH?%?A#CIUI;p9u_dNiQ$S+Z=t_ZL304W3~ z*R3}Z*K0Y9rZV8Gn-I+xQWu>`P^xPGI;!3tF%jTFgj)qL#iG}3a>8Oc@;T0j`+Nqq z*Cl*DJq`)2N2&m0R7=V?rbnuz@Ye`J;*mAJ6l<7_9y6GGqxYmTTG{Ez7adLX86z=a z$Y>R<$PzZ=I^)V8ee)Jvqono9H2&9GT%)A`E5W(t-OeiBO zsx~hqw($p8mFia31$l3d6e(MoB&Db`Cadf48!!HIj0qO0OW_vMkoM<=IQ(KW89sfsX_Wo%r-NscyA(b8T_IW{MY4qCMj|^*e4=lM3krz~-8s#4--7D{h-y zIYn@C(0=J}xd4*%adOr9fy$hohE zDUi2SK8o84Mj?pEi5tPY`}2%$soGK*Qk1ps#O+v?(x->89yWNTj}&p(UsVaLR1er8 zqD=y*$P6YnI)cbbHCGc6Oml^fe@nFxzvZrfWUd6NtwwUQQL43)*wq$J&$xuW@v5VS zPXM{Y^kWOs}?RKT)RJ510BXq*nkczAMLKhVH1D3 zur1YzZwcFB;?FuEGi7?*`z4O9 zy*^dGNAOnPaJnG!6C#g%$k~CqMS<=YD1vW{!$PkcNbWvUx~DToYE3oqZ6%P7N%!K& zIU!S3xjm4*R}Mr~UwlS;lq5Uylc6SxzCNcI7}aci?ntEMPIU{~`}=YL)*^iTBA|MA zpJcsCO_mxXh_?`>d;lgSzI^nV%cQWmmNQjA-ne}g#9T^dW8vS#V=I@1t6@^j3|DF2 zklFtr(^^m?b>LcftZtlkRAOBDn`%wc z=U8|ERLFS9Wh^|_@d&nOmn$=NGw#Bte__QFuJT4xcl?pd|9Sk8CCtB!KM&-w*Wa8h zen(utbEH%hSEM>;cl@dSiZlKcZA4-?ETyyWj6V;)D`P=zq#cB4r1c14ib@jVjz5(! z8v4~xxa(YP?)X!+kO*fXSmFxfirX1~-bJ?=e>Q>bOhn!B=d<=Q{=A9wJ(uvtpD*z{ z8}Dz&pFiH7Bss1$(n8A08Glx6we7A6Kx=_?K{(^jPup1QQxa+*qEW8c zG;urr4Eh^et}wSEUo4EN6J6TQ`19FJt7tvIlLC1K?v6iCj#Wm}n*bkQq{$h7J|9G@ zJ%{jT7jVa)KA$5?CgMUICK<@g`12C>BUKjv+OEvhlH`vhnDOTm)(<)}S3~u5Nq79o z`O3=2A)DdKBU*_&{;U~FaV$mp;6;Qx{`|tAjm)QZaehH4Q||8gGxBMK?;|)a!nhK3 z$DhCELR>(auW15dD#smv(zn1hMe?IOw@f9{SE<#kAJ z6v8CR=G=}yl@CzLi;%AMi2pYJv>Oe(3+^S4)s2(!M;4O4!VhE-UrM9Do4LzJeQB1D z(nIa?QD}Ghm<(NrBPA$Znwm4q$NJpJpCBSt4p}Xc=NEZIYTJRjb;CCMkwBdQ`g)LU zBWC${axGt-73cqAU37ia-}Q6A#hRWPFy#c&P6aTftp0bMYD1s@Bq#Um*!-Z6dVM-xdV zzvM#Lkhzo`@?&k{F`mo9lPFcDP5)Kyv?<*GJZ(yj{$<*nQJYx>)v9buOfMWMVR1!L zIJ?v4rgP4;*&d>oM@dGQpvats_sR!))njQS!V6_Gkg$F zm}ih55XRJr&b>2jUVq$Y6nzHp%|(iwW&5g1{KTqg3bdvgIN~)q)8?-60A&zXZ~+>( zS+;lXMdNOYf17xjnKu8(BV2#{$G9?6OSV6nX>-PvHZyaf?sQ4Y%PiY7ciAMaL$P4jTy-G{`w`p@%5!mnGe)m}2IPFlxxbifuAxWQO;i9zLknxbqSh%d`aiX+vVi?Ms zDHC^6xVZ>B(z27n9p!Qamoa@=c=S_zd&l3YYFmb=Hr$u`^_cJ1Z_kO$-<79TSp;*W z2xPy!Q&goLL)fzq_t(11Yy{XQP;G%|gvH)M-fzPrxDMcd_!0&As8s*p1DL0^we=f- z3$B7lGt|(~maGFB{tZo8(ySu*rgGR=TB}hcQK>BP(y6oEos9NIS5mkkl8{`+!fl+( ztXXVv7K+7g#3OnQ3#nL1xg^g~SyaR_%(EI{f_K25GSekzuJ05r^0-0a0o-#IFJ1GL zXt|cEDP2bjLbN>o1}^tWz3y%J9%(&2+OcD?ZZ@*|hAb4_{Wh`&##Pi;I5wX=rZg(v z-kp}EH0`u3`LolqWXPSCv$QDkw-E(Q?PpZ)a~0M z7$OB42{6fnBn3cbTHaOOYPu8PA%S#EX27T=q%$o~U52VBAzt<Ae;;-B z3B;*H%AJ|+c5k3)!#^qvX_#wN$U~9l)5er$BwrCCQ_x!!&MVj$LUVUEe4CQ4T9dT(CEJF&ITP|@G$5_%9)L9$X>umytV_nF8J$66+vq;mRXgi8~>msYp)yART@Y z;ZDfS%i0Nf7Q|ekOu4%ga?_7V?kWTuJQcb`-3fUECO`E8(nE=asT_Ago=SD=8vYvW z7eP%^*C}=<ZLB!sDEn{zuMU%@uG>W1_>kN9sB@{sPZ zv)~qatZtlk5Mo?uO_NE|=UDhLsF3lH%UF1)=dp}oBWoIUQz%fTPG_cz$Fq5}p|a#i zri(riTvZQiS1|f0_TWG@;|fQoFG5z`xC$0gq9nlce<&%*ks{iZueF+rzf$E~FK-&$ zPcjO(ywc~J?LXGME5qI`_Y&)ISvnB6KmC=ZTzp}inf~+vQ*fT#+D)WQ{pkgoa`B~P z%bz{i-%71~kgL-RcFHjD0I{u?7_)m5x!cA*gy5@vvYdGy>D!4!WHzdKT3t+^{ydd8 z1nf(Y^NAR5`HCgoKSQ;jY#T`aE@XrwrJO_uFsUfOY&DZj+Z$1;Dj=-m0!};A)I4<+ zOI2N1T_6SsWm2shZJM@}^ZRBu-({&O5OX}rw#EYeh;f;!IuTQe#P}e@Mxk_)ObMhZ zO|4Red0jI`=HaRDjxxa+s9!Qo{pS zwUo-jtBUJwE53UB;nVa~S^3d-*$$-*_zM3{j4UoB<@TOmUz&S97asCg3bC_J5*`rf&fL z5J<;l2EPYIowK+Yv7hu8!lyKcr6k#rM+{{a7n`R;)yAiJBIPbFzRU&ah47k-0Q$9L zJ#KN46rKSS65p7aH^e zMJ1*`kp_A=x%1W;Me&Qp``dL!Mf~J3b5j}@uQS>q>FG)%#igvAb;d)F+CgRFvy^3Az+Gq5If|?v{!Qa$W}Pu-EV3T>k8owCmTadq z>x{ql+04v>n(LC3m$~tu_PtHwYGj*Txih%i{kj1x)zyBaZ(T&V>x>U*4N^erD~Rue zGUe{BGj@JUXARQS3vtAksJqS>6d`yH(mIKRsT_Bmk^P2^sSDTuK}}QF*>=|%#ow`` z@f3(T7g6pyqcqD-wF2p5LYQjSdWtK%&UpE8h&@OTd&G9PQ|TsAT-p7)c{DEd72HoA zs~e{sj~G{EI_4R7&ava~jd+(4gcc$g(eKZ)91 za`d01U3SSaz_{#^W1w*r^krT37!ObehP3O0lBug%ja*~QlD=rUTJ+Ch#ubisL3d!d zV2oVRi47q~7+LY?@9f|NMjDlw(c2e6UT0ioqU+yB#t#KbxV-2p+I(QNaaD|FrX#!F zxT;2fxDVM_lZBemyV7utGp@SPW(RSNH?D@!ra$AFU|db3Pt8Hg#3ywOEh(Uylt)rn zN+oz5b6TmAvi+G=`vqEAsZ#qSpTADRyP|n)$QND3!xyD0$&(s9L{vlxSgN#I3AmOc zMSkR*@9P`?9JST;i--c#4t;q)z6F&O7WGNtA)IqRkZrA`@VnaQOU`Y!F;|DPYRL84 z{%mJ#lDYe&t}#_riBze=eOdZ(qU>K3=0&RsUHH6py~t*zO;OUZhbP(tg7`w9Se^XV{K~4V%c||`rgPQhUosy^scaFZ0)u1iLA!13= z;mQ-Hsf1fik+2exSVq%E^oby?d50jYQBr;#RY(UJ06x=;%8TVORCswN@O`BS+@$0N z9bY~jcqIY1T`q9Sd7Z?8EXlK)zxj-gFRX*S1^$T_MCYZhdgvd(mdVrj4bJbh{$vgR z4yb4arlNTsOmnRYEx`zFxcr*Sf+;7Q&Npd&Bo%#acavhurhsNzBk$!h3B}T;EII4& zy0lJSp40Rs$k{@hCZ?0wQcXJu*lGIB8oWY-D_n>eM@?az$S%EU0R6}JB|k@B_Auoj zgH7NbTsg)Sj6U=yZ!PB0&dn}oT!o?sLy+Z7FXla*7m-ykvf|NK zLbxg#S95!F-D>GX3d1RH1t4y>CDbB89TzS!cOL0{-Ix9wBW$ewi_gYn>e=^c# z+k35=(PcN`s$s&_jm}(%OMf2TpWQI}I+c|zJI>^D$gJ_Nr7!F7Mnyq1e4m2I zkZw#7s2WOqvzw_m@l6qtl5s!^E4Zl&Kh|0D6qkJel=D@8aEj=Y#E!2TNWVUKBi5oa zd9|5TzZ;5bxe(RqLmy%lQ1J+Xcws~N(-(8&QKph{FTq{!KgcU@N0Yo-<4^C(O07&) zi8_$IM)`{<(OjmM8ci&>aHL4o%5-XJ0g-pbYF1mlB3OMTiBb1)demjz!DJvMSf=^B z)pi!8L23E`2*^#WPTV5e?n|G|L0GjM5r= zp8~wPlXOadp+Xv51+?K3uyik??lyoq1F*0L4*(tZKpAJ~&&gxZ*!>UENE!r=YWPRM z-vr)!249lcu_Ij1-d|{iMKqH-m`Q-cp#Wnmb;7=|L_a!#}GDGF(eVPysu7u`_4q@HHVN0m4dTANluyYLB z(gxtJ)LcWDtAsNRT6CaP!y`T#&duy84aYQm9pH_wQZsAURVNpa(vcS!UZl^VIbFlc z0UvZ>vi>ZKgEFH!HPKlwshMYy?-xeL&f>gL9=gUf4ZwVe|F^CzB7N1&sk-^5sx8vh zrkw~9r6S%dIBX`Q8?y|bG#KFKR$J}U**O4}1Tt-=sG6~jxaK@xkH-V06}3jz(N#iv z?-)<`g^NDX>CMpT9ff?d%S3Fm?|2aKj_Bh$^QAO+H_+-!z{%`nlv#X?v4v8~)ZlYK zuU-VUR1>j2mRYidehOGxgI`<(`O20a%dS+JQbnlFoR1|3Ip47P>dzU(!a9)CU=PEl zFC>+n6wcsWGl#Nm8muGND{1I$!@-7uPB@yceG{~iRDJUsmUF3JWb zXd#L@XnvyHIh2f% z&o0SpDaY<0`PNk^T5PcADjq%Yyhmn62QyFw?YcED`s5m1HySNf+g&qajO(ha-%1Tm zHL|AqtyIT#RrLHHguB_Swma*2GdNrF?9cA4XW!r)lj{D?Yky%?E0ZE~7MJO>o*;?# zYZ3(m?JH9*+WwGCI}0{5fr|&yRUNSA=JDb5K>EPmI9nKJ$w2y$MmSrVcryd(-(V#S zULB;9v9R~2pBHE6WbLf#PnXwBgI$c~y8iUFwUBl-&W3)h1)FiVsr(~tnh*gM9!|68 zNYOn!BA!?}rm`;>>`}QH!>i<0Rfg!~QQ~Q4o5U+7vnR-Xu&!ZwU8Dc9D3ksem;h9s;GL6)oXAr7Em*; zeM#7}5?&8Tj1(m+67!vdZ>2BEwr4>On{Pda)loB83kC14Q&jgMzs^KCpsFrN7rz@v zaQPRrH51TGN4!S5Or+E)vLYJINy>dm-gIj@~^}w=3Kz2TSusIT!_(b+fEd0 zd-Q;n7rmD8pTjM$lZUu&_7aJNa03uLT5phD zi?v18S>#S5yPjoY@OZx$hLGj_!80O^YkX;HCyg)|Q-9~$ z=KCJR5triA8pR(2$WlK)iVA0+Wo_QgW^PW&kH=7M!JKMy0Gi)co@GaMDf8y#{^C;K1&X-d!y;bG zUTuzkgrm7Up_9`<$JZ>J(|Es#LtXJ}BJ1tu^6q<1Q&Gf=f;laYi}(d1%xS5`V!zF4 z<%rwaptt!E^)6A-+K?d)M4MdXUDFQ^k<|TMQ#*{_Md~ znc;KneebXqQda)#ku9W9{MqAMNbddFQ*}1=_aWpX8#$dsiQJh+3$cBcbG32uK?wQG zMowqr{;_POm_w!9Hd6zM#)QMZ{SaBuw760~QPN_(L>baVD zZzn?gzGP0RD@)ilau+9rk(*a^b4vZitfR&_!JM%2_G3<|oisF2rsg|g?c0wzr3MWn zw$)BB`}Si_sfQWPb%?!A2&3_8{pNp8sVlgXP}q}lA2l(Oyi0U?$&tY(+oDx^$EN6GqsM||saPX^X5Vw1jZlunp zQQOwC*Yg0!wA)n4&R=-UT6&XTRYO|WCA>|ew)l09_qUryL+~5x`n!ui{c6|( zH4DiiR~q?Ka^`Fr^}Nkae2)Tb7DyL_vuV_dHQHt=nU@e9a>ZrMpRdX@}z_T zSe}`uMaMTsHWvRI<7M{Yls&}05dQ~UnW-g77D+IhMyFTVBs>MR$0d=QO{3oq@C(qA zkN1%scjXbS#Cq1F0#g43Cyj=1H;rnPvlCc4M7B_-+}%y1=U*g}dI(y1Ds+ju zn?|=VW2t^fuTLaQ<+z(hTMOBk=7KE~)HHRSVt3Q%$4uJ}wm|H@h;lcLuIW#dZzDY- zgsB{xbGvDDat}E_k2FNDx5ReJH?Bjtn?^&Kyi__|p2zCO$)=G^w!X3{3{b(~l`?|l zR9r51&1*5k26MjqhRHf-{C0jmHm62?X5XCGSOSJ~p6$iUMmaaM;8|;5;k!DbKBdtb zYRf(WinP9KTMJMzAv%%cL$ zSm3H5_>4)UP-EWEsLI1P>Q;n{F9K{SCp;>!4kjdJ&&PJSQJVbz6qtS1`BS zmDr8i_4egfKp+zbyK%V{&2^CdpWI63noTSTkXuC!!eazSiiDJ}L1_QlY6^aLy8aQa zeBOy#yOo=V+(un!MY51q>i~9ncqYm;4tZxXWUH%-Su3af;O9p!NlD9%er~&;FvP2G z@&Au2)B7*JMoNCmDYr`sb{rkm73empjYu?77#W0#g>!I)73A!L_zb2Do31tZIhwk(EhuW?n3mf=V0bN3ln-6Bf#=f0>qqkjlT zibSL$5{dqNos-_zUM++FM31A%8Tk?$LcSas6yuy`$r>rR4r%T>Ybeyo>CDaSe_(Zi?$y;~EzI zfpX84UP8)7Mi&ny+;7Hpee}RhxPCV-zBU_V3dp-@CN2CY;W5uuGMzdmjqBmaF#)n)r#} zq{`fjbdzs(XD0U@GL6>oJCjH9pp*D80tMSKXeamAf?l1t9K4(0Vj~@SGuRO0DinQe zE3To&RXo^I0u8tpZPiq_x=4nPctiO_s*2zlkt;`Z{k(jiK6M_~l9|C8jh78GN_YR^nQadz*=}tZl9;qi~s2|3UG|;~C?Tbjm zf&fL-om04OrM3}#7e`7qzA~U{|2FDX{N8u{Bju1Hyh8$YP^S?5=nCx`)Xblet3Usm zuMi+q1*Y@<3r9*#Q5{JW6&C7RZy-Ozq;*lXTnkF9(Ts4p7&S)j?30}{UB4VjD?LS7%#JRxrk9@%; z!ii0kFaHf{C9d_Z&{kSj{?EyC{*kXD2u`GH<-ab4m@BVuOaI`)%S(Kwnn1_GUvUn} zWw)Y|*n&66x8N%m>qA`;uyV|~XjaM0P5&bDb-PllICBdsGQLHpX@S)18UG+CIMWGqQO~&k7{5OYpvpp26RMM_j#LvBPS03cUir2P z)DEDh2h}l<=^0Oc&8K4o8V4|2Af3p|^o)L;83sNCJ%@7M8=NyttUft0tmzEX_|0>?Q@aU1lscLcuReTXuxFD0c;TmxL=&$fyOURx|nr{VpojJLelF_0)Q=bD-IqcJM&eia}v)|#1DFi)pSo6G;LIwm7V1526@@Tq)dtM z^(JU~UoHEaPgtYduRaGk?P3n`u{y$ho1^oku=s^J+?-GN79GdbzT%FKY^3FdFgfp~ zG;v(raXoj5T1P9S9pZI-coZF9sz0{y-6NfjYmttP*P)3ss`~AYjs-}UBY>#>-!(cNZy|j@UdOaMAbwRFe{w3|d!!fQb!g%b6@19iQTSGj zKpeI_daK=x>B;}7F9%W{I+j{UBf7wQt4bdcLBQXGyGR+>{i8+Vx;V^9FKK$I{Ua%u zBZ1P~Oqc-sfIsvCNOEdbPWm(l?` z249=3eDidG`+>Jg06ie-=4MWM{m@HwpsW-_a&yIDHIz`p#}4x)-|v?Xh)Ef%iU?~6 zU`oOQtNdRzGG(edBJA#INK>b!A3x&1?FSxl5DjAy-sowtzkEOzmhtz%b=@pFv9Cyzzlbm${%{{LECZWLM#)?jCMMA zX{u8jbft#c@3v*I1!DIl)NL}>HVAz4s*Ukoh|h#F4e$oj05#Pl@W;nC#{WPB7rHT8 z>S`HPTLd1w+cvEXi1I=u=+ac1K;}j}aI}Qze2K1oEHjd41-G>2wqKh3D2U0PE}KV9 zJrw-9Cm){|Y6-+DPnV_YmqJ(B(EPt_AKnS^yi55i4{c#@Vqfk??NalVA9`2$4wdHO z^JzZ)qi2F7+aPuc zb&pPknZ-i2)K$Crx|RTk5q|8dvC~|rvD%T3TOa{`MEIMh!OUWzHmc5gzVszPkvkdx zIc!EP&{^%?V>Q%7*gya$4KmGz`l#wPs4_IG9tit;8q72o8mi8`%y(Y}n2c~{yat)Y zLZel~Cm4MNxDVk&@ftKRNyYvqS^;(=+#9b!rn%6=YCX?|>wSz*5FU>QWSR@DS3eD7 z6GXE4J3_TME*CP*g|?^#Mfr&d0b&TV;sMzS4n41GV~|}frQZNq6+B93(dyac zpR<4&pc&Gx9uYt7)Xk$npY@;dgN+24^wgue+8S7Bx{3jOTg z_mwgoq{tH9KjTQO44I5VzQE8YY{}GvXmtrC(@ZE5xa%d`8wWv*7Ahe|O=SeiU2Qwm z?GQ^Z(IwMNC@-+KuTA}Ch+UWH(p2@p+#WXdhao<_MAtqhqfo0rW!A)cGWr!FKpiBe zOH;iAjbGvcnG6cFBt$u(;+my9eP}zAjKBXf#rzAyjBzuS77O1@1R)vQV&MgHX?^iX z3a|7$)@2f~9kSH|>Vzf~6MRjDfsBkQ&6aiZnax0me#iS#!pA7Ya-*K)e= zIy!4H{BuNR;?i1lsvOJdh3QZYAlf8S#$cL9+tD>I7u2Hs30bJ zaD}$gvdW(!H~B}VgW5fXn#8R46k2oPVlFsK{u_i6xJ_r|`UENV z2u8cYi#o~A6V`e%qF!dpsmoY+aavpxDN#icS3l@(H_%6+3_jO8=#r0^opkX-Wd8+{fJUR%^PxIu(+nG}A~x$G`Yl}=KF z)ozB!q|vw=Z=Zpk;z$v3Tqn7JpC2#dAF0Qs*GY=t%5;Uc(%huF7o=i0YWP+sY)CGX z!aa4GrP0O0J;nP|JbHBCB-;y99`Uvpge0l|!}fwSS!a7eh7V_Z;U=^>+Y3_o&h~<| zT4#GfdZx3zAiu}#Y%i3NYrDNrUasx-LRGHa?FHGNzLiK+nfoC)Qs#@x0j^bfcPpR# zys~PAu!8`LEnv479-72cnF5SJIK~6q?S*}v_@*_0U(H8)mk=fncYC4qCfQzChh&E< zjYxLA?S+h)j*_=PKJhRqA#Z!(ift0ldBlHuh}C4b7rvV6Xi8hbqkkMGIT0ySXY=5F z^$7iE1-kvJF-R*HbBK>sYvzaBb-o58y;cZQGx*%SM-ClT$qBc4n zMY=g&huvOS`mvLaSCGCHufuLHJo_*Y+3IwhLHd1yjw0Mrf2$U-i(_ga|4JSa=CC!; zOMNKBc~#*%23)P9BGMW{IC-(#3!7LI8XcXG_K4SEw--K*D63;U(kY$}cYC331?AhM zW4Q;ZDR6gt;fIOJCj-4-ZI2V$?S=2No!H+Np*7gs?S)$#I}x81VdC~eb8PY^-Qfqk zkal~aA*N`P?Xn`YA?^0UaFvrcXEIHBEMSoaib5S`jVaYDPjkd~`_Q+3Fj;^MU1 z3;9^Yn(A5+7t(Go)EeuA+!+_rZZBMO+zI)f8`9lgX#BkL9U;zu`VL`ml~c!Y+Y5Si z<8CjMxWx%j3b>XRz}sH10qpj|+2%ZVs$=L3+}{geF}uCc;xSX;0W}3=zK2QwGQHZ} zUO4@kBzQHh&06_8_zm{w<22JZI4GuN;isFV3C@D&d_O<6ZLbCQaq zAKUGPL0>vCJW6d{?ovcfj_-N<25a z0{g?{GNO6g3(q5d%|kXBsk6Os6v-J^YUeR`dtt+8%J(z@l>Z@eC5Oq`9#P_MFWj20 ze6oB}c@R~Ea)x-ld$75YK@JUaDySqrZn(`e{O4KG*m@cM*ycB?Dj&vGS=?W1!3=az-})TWVJUhgD55< zoE8t*?S(%YTHtPkD?Py7UKqWX_0%>5&xz2~mee3+eWZX4)xpEqG-{V3jt?PDc$Dsi z?)Jjt=WT)i2@zi7>avvGUby=!OJzaS@F-b2L@a8z7v8qRh3W`4@N%fTy^wcAdi9Mk zwC%c%_m4?mrlV~N z$b1jmPc=s5C!crrZn|X@GvIJ z=0bfB@rS3&Qg(Zx_Y9JZ5dlg~?3PG#9%kTtm8UihFi7qY#e?|Ef=L6+P9 zCzve-Mx9t#?hImKxmidG_roVCd=EY$xr~Knxxn{7#X}a;eE;8*8A9MBeS;edza_$D zaNVyW!|W-%veDgB5Zc*O_zW&?PvIr9XZI8&fZbD&yxKhl$)w#=kZdOGDaZt1_Y|bY z?4E)&D!Zp3W2@a$ka5`EQ@Ht2)~6gP?-FPHp2B^2Zg2%=^7|OZ3A#l+gYTYi>}!p#r>)@Nm2ay=5?3ZS8C|oJII!yao+SQlAv|84U&3F$i+F{H~uM$8P zR3vE=)#~gioPNFPJOIjJ$k(phx(6xQ92 zo_mq5^N9Gl#_lQfVC+%PfxPNr(&D{6g%x|4jXpzq$|XpP-BalJ6kA+UVgDcuZEy++ z!0su0{u^V50GSAL;{ln0*i)!j+ZIhTgdGKlt1x#@p>jRjL9T_k!Byi_hTT)h{??Yv zoe(Q7q3oW*d7cK-z41wiy+S3#X!jJ_KW=0E1me^sx@2x)PvKa^rv4v@0+d^#E=^Sr z$h+aXdzXc%CR9RGlDUOFg&8~msb`?}5WOzZrK#S5rq%2WGy!7fMY`NMLmQW5{QZ}C zwLo!zU!;TrB*xTpC|FCxw6aJc61iK>H82x1}YdRf9@X;J8AK@EkI=u32hbOnNS zuJ9t$X@#*YLJ+FGoZb-XjHr&hAu1fx=`*ayt`g`=PUk)7uz`%}bp0A-G$rGEC5K7m zWlX1sPt&2QKs5Cz$#J6TbnLgvS6w3QgJ`gjI%TfubZ0?iH{w56WV%2iT8mDVV>;c? zpST`?Sf5B4i)kk&cHIi(f?AY+Y$Sk& z!CZKGiO^{o0yqa4t*YdQlX?gVl+?Mwl!B0tgy5Jkv@-E=#XQVLx zkzPo>mRAHprYpRt<;A|{C1XOXdJwII8Y-$Itwe>>^1j}I$xNVu0HZvpy@5>2J6ytQ zngei;Ksu3^X?b^jPixo+@vKKljuTtni8Z_=Bayxbbwo&=GPmW8D1esl@%Itb#-+9B zR5>kgr)Ve!Q96+_l_b@rD@oT|Qds^ag`0wgjPJ4E6q)+dqFD3K*hp8a}LR6 zQh2;hc@jp<(63zf7{N)*^*P+kIBx?8^M5zjOK)_{^%cAnOVLY!AOmBh@ZiK9qQ z#Otu;`a@NnV*3kekg>|mi#6B(`iG;V6w(|aOjB{q^*!EVrK@9Ufi$8E+%?y?zSc3< z4~`RBbNwl7aV7^dMVM%=AM~0N@k$XUn(NglC*-cUkk(xP1TPtwY`-5D(wgh97~-V% zhd7}%*DqY_nCnxX^y0MU`ejpj<5lOgf(UJDt-1c`Y^S=eiVJDY^?zdzFd>J>g|z1S zm$6uyioVqi>6+_LQwR%)GoT(s_#}s^pEz^9UM#rg`tKU>-lY!kHt?5T0MA@+16XtY zYri@%`~zHon*kex#jLr0+CvQuY!JT0GdYtX9)?EKneJ9o% zK^7%qTAgD|w{HU!7^!^s>U_zT%5xGxH$&ar%qh`a-|7n|hL3>H{YwniT)&{9&&Cjb znyHB6@-cYk`l>K>gfrdW3NY8V#j~#~FcynWGNO6r`s)!-^^iVB`eIA^EpG!XL~@@i zwKJG&u73%W#xMe??I6#)SY(taan1E-f3)WMk03r1${FIVx&E=Trm3j^ApFNwg9dA^ zZ(P8Xh$^v@RS<{O;F|06t}$h->LY9>fGG*rT(8=iT2uWH4)rv+=K8xTD&JbFRo#Se zj;Fyj*WVuGC$9x~5aFZo8niWjv%lOge860Q7Z4tZ*PwwX{9|e0TEpiEPseMp=K9Ri z*3{?Q#V>(!xCLd+^*>f2kxbvJG{U@iz?$pFW8Km~bA)X@z%|$3d4kY`5R4X~E~JRm zAZ2aM^@mW=ITPx3h@~E-d!cKtFJIjj_-2S*mr&MRzxfMWv4+Yq zI1W)D@XHktOOUSe2(804*Pr8cdtK%`Azt*TM05S<`zX?nk$&wF5>q5Ty39bqOrrY- zq|h^oMG&9vACsz&KwAz-9S^&Vx&FWdXzK{l-NmSAF_vJiUx1NX252=F;dB>p4Dp)E zA3DVbuMBtU9*8wUnbFP~sja#G@Ab9}o`rbj63UwEZ&_($JPz@#P^JNnHx1C5>o>8p zreh2}%d0;eHbzT{83c3vb2DvwsR&V5s03Y_Y7_XZgdI4#LJYh_mzY5?*U$WxH8pji zrb682>9Tp$)I-7loKn92LOler$zi~{FW z#k(0q_n~AJL;bk@uAyEy$51~H?(&9u31AKNlJH9n^^(B^L%lRYYp9ocw}yJ@Qr1u} zqpCI3%lPRU>T{o?s5nw)5NEuhzA2tvT!ESPZh>)vZc#&#j`fH;MCcgm*Kj*}pJ<#1 zaQ8)!Yp8#LTYVQA>&P0*HUFt4uJISwsEu_jyP_3Mm~T&!cn}T|@oc7z2J|q*r@{j!r8xs{kJU ze>;Yv;UE({Oj^8WsLy@_Me~p@b_vpA4fP>r&6gxC8xTGrfYa=(p}zZ{Jn|;MYY5+o z2V_>kP`?bbfNt5}AiN+zT!p!Y`s>#!(?JUDwb=bkGea)i<)ZknY#TWEuljK7J7`h*$fUl?YL8ws5E zNH=Y$pFsu2!t?M6$v77aFOy5-E9a!}Bc8|Ons`b)9@dw8<D2QdaS{yarXi z%EA|!*uTW$Qofp8GLJ-ecUQjhHRVSGPD+ExR!7Auy&1%rj*5X)dlP&e6lro$8Hq1m(7Og z^7|2V=&7-(!5exa=qQpS$ljpH?2^gsIms`Zu!pe(@7xW==^{ztRa|HN zvzqa@LV1axkMC3EtI#<1kxZ5aiMK+Nr?h&UsS^=3n}0x(Q8iFRNw5l))c45$;7F11 zDk5@hh<}T)vMPvQ2@WH)cVMaN+PbK!x{8NgRb`~LT!LwAX=P;9zhw_rzjW0JSzlKk zSt;s^s#TPDg<3mkq#C*bV3r5cMKw%UvK8fGCP0E$h&;^%N-V_|=IDp5*k}66X zX)S^DYs6W}I12{S!w=IqtK6eYxe%o+iju0U9xwBnH%E#TfGK4ip*dA4$Dk}HN`C1` z6x2|2f$w$$xFvsn0qSavn1_-LNS|?uxZh4nRk??tYVUuR`gt4T^UG61IziQ0mj(4R zgpZWj&6dZ-jJeGvppF#a)>^hH|ROt;uj;~{Zi_#`}nDlk=iv6+GSh9 z&YSkN`yT+_{s-YtiS{n|#_xaNCtn3M{*hit31q((Rs=z&E3}niw>GY>E4vniR`noS z2{lwyM_P#rXa8dz&EQ3W1_F%op!Nnb`yccASWR;P?h!~Q@-q7$fv-`u5#m{ok{l=Q zf6Tm2`L;-;??D|AQm4$_|2WVc+4uPS2x{ZfT6C(M{f{NIOH~Y_bRuQ8Jvx7G_dn!< zni-iX=cb?`xr}KK_CN4o|AWM^{~mT_Qsno*;(DP?F+A{akuIyBs9Y>4@eCQpe2K&ueERTZa2uk(sbGi;k72 zpUr-xVR#nA&P0?cBq>x~TDo*YkvZ9-cZY$7#hRrZ_#hSzs4bDniu@%)v4$cMa!OkV ziI$+Bi*TqWvIPBXj%!;?nuz1{vp2UxeD~;5tTFwZz}-w=Xba7cs&63{2Fc~n6!`N&I62BH?86mCZtlW zM0k$?KC=M3K6m`Ma?ZzHJa1>Y5>j);55AePCl&jtE=(J2CQMGPi+>aD&VPdpruaHJ{hWqPt)ysJ6bIv<4p&nlKKGxOz1Th(C$#HxHHOih>vX;q7p7gGJHvy8De`aQ zeA@N75iLBQp?$G*+V#1osJO;wO%dvJ`s;HG+VhoKazCItARLG>dJ?xjr-u~&`rJkT z@;sCRzCPw5wmxS)*!8(HfAikC4&i>l8)6PeVGI-2mr_2VEVsx|u&cV>`rq zon}pr7s6G5Z~Y%3^x^Tp%;ezicfAng(CU}}k0Hd?=k|m7$S3v|-&mjfH;$)$ftjfM zQChUv`dliZRl(R~%MsW}z4bXc)}*yBwLO@>KKD&eK7P-GsFD*#M*6U5S={V&4qxjE zU0`;LtE)iF6O`A)+x58;lwC?*twwmiPXmKppSx?J(s{0)N4O)#;IGd${J`X~`UK&Z zF$RBqF3Q8Sl$!bjq5EE39PHP+y3cT&P69X&VJ!i89hC+=>Q?%LEuRADfUrwEgI%9n zJ(OL|0vLsGTs(tapX-5wYlisvNZUYoCMHB78I+VAtpVYN4DLvk77+!q?*g zc75*eWgHSAfFlV19Rv95bH8mz_&0)b?|Vs%N(qwJpOllPI{3{Z-i)9nP<22wjiGcc z^w;NFUSo@_H;5r;q3rrxjd>O|4aCA2N`?+mOK8{UN~c=r8emWS6VzXy>poCw^{Zg^ zC*or3b5fTB>KnwrB|@SSw72?}64;i`z%q@g&#D+(17wWjA<6~jj|I^LY5N#LbNK6X zC*QDzG8n{|7)rMSX6Cfad4Y0^;F*PVaSS0LMdO3Z4s7|1oWCE)rWj1;R(!lqhF+oX zP_F^`CmN`<^=N59&wJwdyQx#*=uj6e|Wy7NBy5h6|kt-K-`8$VA8fB#1L-ap{$}`N6Hv(k@dLstS!?ZA@ZLXw-ed{;%_{ zi=ZwB(MwPXIbql5-p#NxRD~c)d{oksn><(Q^|{-QU`cqLMuyw|jH_Os`@evl@DGdy z*!fCeSrK_y;0R<~IQIgVuvoJqGF)K)pE$^1IxF&bOlA-Q&WfBvQG~w)Jm@ZnSf6Wz zLfVgW3C>%es|Sup5AWk#GTmlhq>wPFhvFJ}2#`zdpBzNW6ndlSsy|&mG3`XJ25ty=GuMuN#$n5N~3%*JuY3dh2ud zPGHNLFxCUmJPG8l&o%!1IG1vmOBHSJiuj-2WKiQ304@9WBM` zy-4#CPX`)w20+t{`y?+rM8dk3F7h?)l3P`U!U7I z-zvZq5DQ``-Rx_qzdrZLa|F2x$b*S6$n5&u(}gwdv@cGLq=4{45%ATD-&Zd?b)87l?W17SY_c&cyL=k|t` zGg|-?5l)Qc|AYi>rkN&s;M=C99POy8?3$R-fmd>XGX?D|}4$mWbZuO2xI zW!L8hHL)T72_nLjL1Kt@eeU+Ctxz>V#Rer zvH{c+Pz&ulL%rV{`Lnx5yUr$&=OXJKFF%lr{Dt`iuG3L`kiRJY z7a&{W%cC8sdGtQVXF&2scOs!l)&bb)gFN~E3dl9dZe;KJa*sp~b}Dl)m5_9s`yGH^ z1*B6F?Mm!m`gbKjhb9zSP!!iJOgu=dLh|&tzba=?2LKw^nv+EG92Ri=#78M&*$*U$tNqXY}_cIVmSq>u(d)2QpuQ zkID0nQQ&Xdid7$g@NccaT9<#6uq&zCYZK;4^$<6YW733M6j;0es?;_dU-t!OlFRz~ zU44w;XiV4^zZCa(M=9>Vc8_tLtC6WQ{Dr=Rx~rznG}`Z~EhtTq0IDOb8xPRxA6CDj zdea1ui?DkMh;XS7Fv^>0YCu)Bh?r`c z^&p<|QFK7MiqufO0ce^x5PskTJQ`gG8mI+SS6vBy0`Z5Sbb_OUC08;{C1|Y5z@<@@ zajt=hNBv_hkaA+V3usvKGZg79R^uwM%8KNPgIEXNUxUP^7U^MrKi0zaSiVzZUh+pb zbIx*cMy}Hyj;R#dv}y(Lh$3d1GiJV1EvT|0QM-`5gGnndcV;2dqJC5($z_fD7R0F- zN5ew?^{W#cqEP5KN$C6>xW54oV25=}QO?<>v z-ih4K@!g~AutqoVXKJHx>iQ{kx_&0O5Thz!vvh-#71@kEEXYwEA=t^?Xb^k2=0`^N z;~P8JLXlQIP|a3F99`O|`bW6@@-D$ zPNTY4F2{`{ku|affUZ7LtD4cbHcA%p8#UM)qCF;NaxAj;Q3U$_n2#pJ%y`@1+OyqV z?Ad+?7?snLqvto^@3mntwN~AD=4{k(FN?;o1~uz8fbYdv6a8^M^H>)zISpyy@e&V-sz-5yqtr8PNQqpR58 z`-Yson0qg0n<$YgH40%dCQXjAR?#26BPpJ24o=tlGN+ZASxT+zrG!x3$=}1i(6;1l z)YUbVQ=`w(+RVX_g;F3Iy&L3SLH|Yo%4wsTvJtRG-yW;%@uC!i#{B^1R6I^rI&1W= z_A^suj58!-HLfxbs&z3o+KY*`Dd5&>6y!k=a`cl?18Ut zh4LD_4&X)soAT|V>bwZ9uw7G~<}{7j9V3%QLDcjhPTf!3LciQNOYGafMNPls-c!?7 zDibwroUKHv$|0_TNfUMU8h|#cTYn&Re(Io{gVaRPIgP#uWUh}U|LQzMM%CN3!^Z_Q zt^mx0cwF0s;2LcIkhM&zx9FV4Ee5kZhAU8??f}>D^7_h|`EQL2Y1|V&Ca&QjvAb~( zt5H%_r7njeABw~FnylSlOe0evr|PFT2vy5A+Nv2K$taB;f>~y5|uWUV?{U68V2^(Scm^N1fe4p{RXRKqWBI)j&K(i zE8pB7D*wNTgVdXlwsxOEQyIx_Kk*005mQb6q>F5#M50u^@0tI?q)q*iaH3c8PeX2G zm*C#ZmysRQ@siz9ogoaBk6^Md^t0o)ia+$9rInX>H! z8_lN1Z2|L=;I5VEfSY{*d|fYmlF1lxp~cj=&%qpx@wHYhx`FF{nnffq5sh(=GuFn~ zq|GHhrq6Ao%Kz#(***7e^_!zI+D8k}?Zk%(y|tR239fe+au(LI8Z#96#2D+1%{|uE zD)ScNaOvZWD?pdi=o>-a7DL}E+1py(M^v)=EoI0KFjWJe0<Gg|A;jaI2Z`|Icm1K0 z7uA^7$S?6R(JP1t1CFNM0S=imP6I1wU|tNQ2Qp6g-J?;p3#*8Ri88g^&b`+fHBll} zY8Ao<#piVptLS2(_he7w{=6?k-G-Fs2%sz_glZpuhkT*0ZtW{O&V|{V?)TNr)#$$j zNgQl2@p-fPHArj9Y1x|zoBR)G9~Xk|`VT&g#&l6{o+O~!waREOLG5K!65M1%NGo4f z{8Gz8*%UDR4euEL`tu|5~+HPzxOd|qB&mI zRiL&=!8IIBGb!ymiEuUggdk_>oQ)-!KqEM{2-Ep-w4vCgR9ngzAr@#|+UxADW_)rd0JQ{{VN*anhm5a zcWc!iqYlAQv!N0`dw5R1tJ>5_}2a}HYUHCGrv*W;%Ru(pi3 zV}1fF4$hl=^fBqaH%2(JEbur{s8*E*4FhX9>30>(^+}Jlt=>l!$k& z&4Tn0hb*$o-@HzS`{sCLQ7UbQhd5@D4}*LU)M1R)OdS&;E@}eYgZ*vcL7E!%AI`DB zB*4dwEpURX#F@rpa%2E?V3p0T$vYShd3Qr6k9m{&v+7-~o`all^`q38YsPas-4sx! zy%rMGB=~Mi4ysUG2&M2&eH~ipbNRCoMV*RyGP6YW?DbU$U&6~<9-&xF#m$gNG~CTT zldHl~LeA~>T3fl!&%pln{Dcl$KSjNPue7jr_If?=Y=(e27@a*acnR=FENrX2ehs`I z(2-}sC&)TYc&IxW$wG`)60yW9Nm$msip8@>_?{*1;=0ay+&5!NghL8+!sokKzNqHx zS0ELS+0#v4^s?87A^i*YwEsdXB#@T8rLXzU1bIg& zrIu3-VRKB3Jg(_47Ox)Na!VTwxXvKlM`B9EyR`b#<*lNW1|Fu~3=@@EU>5*+2cz>> zM?bJ)>-^GtEnS9%PMbKxNogo6;Ix9JPg&_9d!17DLHHZ%B?W>*`Q#;~l;-uV?`8IS zkN|%su*Sc|2k5ToFF$(PaO&hZ)8!qfly=Ll_{y0kJ#B(a zRzv+x0)1e``uXD~7B;!^T`{`!VJj}NVx9VnCH2yD zmp*UB7ka*R>~l@*`xAyUUEZ%s>Fq_V;7Sw0)kN@TBDeAP`1A)>thN#CZ6df*ZkyrX z+%BJAy4Z#^+!C1#xzuDxu8DnLFZSy!c(4WQ*!MHBUpv3_IV-N}aqW?`UuL*^lpaVH z>%1MB6iIV#VTL3X7!XcEC{?!M|xj5xuG^1D&81G`tQ7pbZrhLm-B~1OteI%wtI5cC{ zmjzj(EG&^C}h- zTsny?a|(3Fp&j1Zumfe=)0y(FG)ygaT>}s91P<)R2H<%LfBos3`)ZiiOS>^tQL-{k7MJx&Ny6a8iB_2Jp@GRTJ zmvx=ypxa|gghR(mHch*|a2k!#@e)e{qs;sli!YC9lx18E;|;hk#gqt#beKi5i_AmJ zvdGkOuJaUtmoQpYb>bxgMY3hggWYD~lYoB?^!V9u*#_Xjp0V(~z{~&5u1t((7mKJD zPm;6PB9OzaJV}OS`#@NB4;0D12G9FJ zWapR%D>uim_bKl>X*|*P!^E;zI>(u#N0-RKk0Ox=t=89o$xN@_0S|j zHe(gZPOnspX=<+<31%ilw_PSJH;P?;-DMZV8oQ`21MU-;bV z`POZ{)`4g@w#-@BSN1vy_z|Ed&W2~u#C&aGRjx9j>;+y?DW^I{XMt|_HTzmx7Y{bl z!W%_hCl_env*A|{LVqpnHhWzHd zgS*EunnElIO^LjASS-H!Sf(O-odn~4+&{*Y2#3yFc`wF8?6b(dAWs8m6R?@3+be1* zs!nBZ9Mtb$t>|Am%X-*puW0&gr%ZDzXZTShZ-MQ%(j)fTDBX3233U=ZEtS0V;lawy zwe=eKBA~01;IxDChDWM}wY1mcz~y+=-DkmPZJ>4cV3$~UpGu?^sK0@O2JH%`Ttjh_ z3<}G3vLe|%-^KcP*IqZ`Gn-18gVEK&%O$5sHW$8UVgI$))C`{gfKKw@UVEc6l~X}Q zpqo(LILLO&->lcFSDT!e1jTKj)_N3Tk=D}*%kIOX6k0_Od!hBS7eB87JK*{88g8d( z^-5kt_{h|cMfTdLvg`Z@X!Vdylvwlmz$ zVWrohkWBcpQXnh~C*QB;=o;3JYlrz@^IEjGV z6b=l)BsKVV4PyLnVYBRYFYu;7XM1qlg8%P$ z0nvaozJ%Piu*3Gc1o#_3k9u&iXq}!q;|eEj*tpJ;+4(Fp;Ca%A+1&jGA`r2fr^kOz z@prg+1$fOhrbZrzx;D7Rm=f_Mm2r~1oA0*6slP`dmV{PXUSKa4U-K-}B75y~uIpTh z`+Q7^a7ZIGOWr5-5O-VTMvxl;m_|A3>K8o)>;U#b7Mxnubw2jNDL%MJ-eBHnLCxmb zb_Vciz?o%ixm)$@K~PhjGK-XH|8t#5vUAq01FRiJS5rNpqi)hqJntpr_A<%e&AXY^8K>L?mx|>5NYCqcmLmIn*SQtcJsyQvM29&q)4{vD@7u2?s>@f7aAXj@lgZx zDoiXFWJqk9v8Ew;OGk#pr1MIrOw*7c^-@Oe0z)zRT63L&U`{v2US&FKPm&p>8?A7M z4R6lEMkHpa4{*Y=Pq9ee0X$$K^{+F0xz$`}8=R*TqUJT(W%ha;rC(c*b*)D;f_W!o zG+ah7ulC}To7b5J@dbNb3w>6qa#~|_%Ec1bqWmdOx6-22?hQi?%E0q^&@wpHU1ubo zW_t``iDMWxz%nes^Q4+G>{|ljPE2gr=M>N5-b-_5n}mF*x8lANQzD*3ONy#9_VEzc zS>z6oM*y6_=w#@YPQ&E`3)frNR(s9PX8g};dUcG3TOG`ICdr3a+{ULlZVlJ@62M;=ogT61GLU92dZm2GN0*{}d8bIe7vcG=eZ5h$wJ_95 zQ%){MGuVc5f@vscD5FOCPLaG;?)lnceLFQ>rvRU8l6>1?_Ql>X8!|@K-mNskG#VX) z;*IHUGwzusp9b)VkJte63E&-2_@Ft?a`ij=GJhZ&f<4eF3*G_vC%~yun-;N1ZfM`B zKdOq{>+F!7#HQ-WtH+-I@C_zUvTM0cYoJ{{9>1k3lCK4Luwxd!0C*A54?MWeLYd_^ zv3@lmv6hK#?&*BI`}MX_c{LzD11p$1u5Ky6u-7@oQ)p231nkT+ReO$8=BBpqskg|a;V_Z<1KNod;>%SQX^8|a*{PsN0xNdRD|K!(Ue32(35C4=uPwVCrak%1 zE6O?V)9;u0Js68pu~Wtg$#75FNiR-Izhn!8CG2mnxwTzq8KK_m#Ys2tqTI9OgAyKW zjD@cS{w7e9i35`5y4^XK@!DrDO46Pg{6C@TzRls*llXFBVjV z2Z63=)}+aL{DWIJjIOzQ{KJ5UdyizBCEEenc-*IAO4{+K>+2kH#6!Gkk=b=!X9WQH z>Qa3BGl2~m>u}Q_#F->tb8>fb`!2@+U{kD3ii*1v7Lww}`SaMnwV^B^6epdpkYIf8 zB|=EVO5V~}T0HkPf~gLs1xB;$)+4@k5(ba;q-8%0`{lTg!jy=2o!S;?g@?#kY!oWD zp6kp9@DN6)R_7sbo|kBy3gk0RRL4U3Xp&_8Ecuj)@7a>9g=9YjMhgP2{yK?( z7Bs+Ko%*c#`QXf$%E-rXJW$!2P4w~sS7YyZe@uMSC(RQTV73wg&C}d$I4bRLSud&pai-9F?k#Y&M$yCZJ~gyqeE;>&ULV$;UP>Hx8N z2KToyCBiIaHd$ZuOJ?aS&EFCpPdy*`)@O?buJa>+KQTHzc4m@Em$#)KD4W6L5hhmD zOm~Cz{1;oEmGHCz*AY`9o}_?h$wz2B#MKsg3gjdJCd2+#rfjI8+t7UvwAO+LUBLJc z@I9FL><0b`n&`nkxA13xZv%SFgC}-vCAMpueABDSiIxaT*IqrIk}rOFJPmF!rJd2x zbyC?M-UO4ZjHOO=h*84)LYivLR5Tot3#{jh?R5qumq9SvBN2=AFiu#$^>y|0(;O$e zWk)EKnzE*=aVmc{uDz=fe~fSYR4Rx@+>)YT-- z`8=1|Lbc^$HaXOp;5x1XKR|Fo}$$oRmv2IPnDNNN{64O*jZo!C}Oq!hy*`6A2Y?2}LAJ z!jgngWTRLmPf{W}YhJ;s_l*UF^#@o(5hfy?vcXw&j}`aNz+P@H@2CeWo>47GPHNvw z-uDga9AV#Fc_qS%L|GmV*l*3dTKp-!zuc*yW~6`)xg|(-9ySt0TR}){$Ory&v4_Q4 zvC>G_sgPdpU*u`}_-g!h7AwJ2QX)$4siuOx3X}GVUf zq@47T{g^H|AReCs`brG`32uO1?+s}DgTGqPApqZ=1^TKTpwg#`nKTn7MSsAoyp50! z6Q;$N0lIS47nVsnjb=%p%Bpb63@3eFbBbSURBr%71awq*qc%>J$+7h7^XobWG!?*A zK8TQ>qB%&v`NSD3Uykg~c=>WZQhX7fAOH0o}3Ydkgviz?Wx%mNq7& zI}0dAo$%8D6ji{MM24EfoM`$ZO}AQkRb(~d<=0$^|BaigGWa7?Ra<18M6Q!dO2)m0 zeDg<_u}N0s!;zKvavjsCH`L zL9)AD4J&^G*$2Md%b4L;L-KZ~eKw>Y0sNf^@{r&60r_DmuUKh4uM*@F;21x3!2;x; zJ=ej?+aT*0FMn(&@*}nL?RN2@$VSJ@mv17v-#m_nYW`Ws=EvmcsF}~;|9B>9saE3t zxX5%JF*zsN{o&n4t?RCu&#Z+m^B;koPGkmka29-J zRR5beP+e3vgU8`4j7@u{`b+@j)VGf)189k`eLUcZ0LrTc&sm1S2uH>MRn*5@NnKR6 z-%Rpk57&GVn&fGnsG>d>L`Ai1Hxal4=>umW9=RDrC3W-*IG#iL%2|j5!cke>u@a7t zkseJ#oU3Lz>6xmK}?*f7VjcWy;bW=I-& zOq{~;35ZLZ5L$b+oPI>rL)!c-#0_2G=%Su)MPz#-9UVhR4#hR#Rn+KA*!rlaAAoHp zxLX8kTFO8fu>Kz*fBq`G1J$dez&-$Oz0Zrbep3X|Q1#x!HhH@czTuMr=(`fYNY!zG zmwtrb#Q;_GYc}a))R_B;wnIEqF*Yh?hzb#q*J{!WRTY^@u8A~95Jp`a8N{2P5lE4` z?i~VFA}PG=Z*fuCMT{?1_WNJU|1jy+YRs4^{~NaRpMBLF{%iJf1eXwYDF9lj+^%rAHvMUvqxzw8>zNN#rHRd}m$ z+YszEo;{5{d*Pene)%G?|MC(4HJZ^SsqEDFJSV`sZ%vQdOT1rTFVAAdYpy=ecQ>NtyM80Rw2hQqA{$3FIJtB`T z38vjBcR{-D}%&@q({5aM+A9}YVab+p{X~5 zs)oyjF_c6*y3wGn5WZpK&}h{Km;Q+;XrA0i)br-{B^$;eoR$P=G)NBwE@&}UIq0%e zfr|0~*HA=qBuoE?B2qON|Km4otdhd4$kXC*1=fl)$kptW3xgGDr1p?mDNO~35(jb) zpuQ>1h0U!M4CFkvUO6c(%xxr)vu``MEhR;6tqOshPwCrJTI-3cT2%t(6Idzj=C+at z2a;H?JncUwt*qQdEAa1JsH&4wDcv6b!Hj8Kbt#BpF_eVGn_Cw=Nj!RO{*92-6r?u@ zB1`iK!sNX~1Z*d!s8TM!rXvqW>KI1TMwpf1A3J^G=kH1m4Pw{1@lx%$*_%sa1 z=JGV5qp%3nG9O8P71M8~{F42gjpBM_&-n7FCaI$OEQBPWx)c)Dn@B%QLS(89qV?yf z)$|HF-%o(}ub@o6S5f;ugd$7*EiGmF3VbFE6Q2*}lbISLZrG-?5eB}u3%sv@0L%6@f}wq8Am^hrUO zVzw!l3Cfg1D%gogy^8dc7-BQ}6;~musK6~?kE-XG&r&DA{Tah*<+M!^?aFg#LrDMg z2|yGnY#hYO*mZO7P}+XKg8X$xbHlRAcZ1y^LO)< zpyzZx0dUMGh&F`=wOalNpmE=!xDsdeH-In_8%k4EOca$$7bhJ%Te(SS51^q)BP3z5 zW<^?i)`}xhvML!Zmf?^-{t|*|ElD8F=})}HT^n;3OdrJHA>*RWS{6xvWC60aMphwx zD%V3}Iu+CxA(B%^I#2-535XWa(X zNL)%|D2aCTs6m^%(EAqWKY{pvg8zM``*`bQxaSHDLx#N_y{Ev?FqU$&)9%_}J!Av+N?Gm|*_T)d- zajrCtlB;e6aa#-}T0j?NI?n55tD0Jm^kqQ|(maANxh@d_+evqvk6ulz)B$jx`fLbI z$9YM<2!BT4R`w(06A>#ZAz?wpg51%xvJbxK*k>nC;?3Fuq^bp#a4a1Zpvbne~jF*{?bLcc=cjCU@mzk2bHPLjO|7H`jj>1k*ulq=%XgbbC zU9J2}WIy=ws3!3{&Tku$h(IQ~gt02B5q`(nnP~!@?+rjS5tPYyzvIkhW>R%SFd#-D z9(anDuT0W$u0IK40@B%u2vazI$2qH?4e54Z_Y2hIyp50TI2R1Idhk4m-AO3F;~X}X zbbX5S8$p<=XH#xF&hktWsK1a_Ldz^-GqE;VZ4+QS&VoT;8-QyW!)oQUjS%h13A7=k z|Fa_fK!uHiSb6@9Ikcy?Hk(b^R0!1m66f?MYO#2bBjHJRF)YemlXvx9F#Ta3PXkTO zT_k@mA=%t+s%1x1(q+(ZMK^;@+xk>8hV~cbKRVBxmdoIWVyBS-6ra8rkC7fi?>KK(Dhu- z!NjD!olW4rj(rG%^#vJrj7K^v5fQxrYP3YgI&OVczW~@$Aa^Iin9z}-vpZMyzS1hl zGaz0R)cX<~fEgJ87N~2^W%mlC>H~yd`T$SQH0mbR<2i(qS$}{?As=k4b(v@CX24yl z<}I_R8Xy|SP*xk|`=#z}s>u~hMM#Lj*`g%^ZinHjjGt6-JBBQWDv8@;yUpY zT#u@?Jb_6Z)a@YdPvWYgN8|2R^}`Ef)3Zpo`8-Sy+{0{?QhRaw*mt%C->CPv*}AK2 z@bG)ASrQGW;%P!;a3L|b&*s|tojj)Zm6+PWg`oYx#RXX`mtoRcNrGu;%(MCPbI?Pa zRWJSqi@d$aqfPktKm*@frkvl1nVJG%ZVaSVz#Clb{1^pCrdIN|PCz;&QzN?zoj15B z+DZIh0P$7~CDD#vYEWiyv0)CV!yt|)qWrEhb+b!>$3fEhT#66#~Biz|1r+!|B!No zTD?wy2QX6J?~OAWO(rB&;e4j1FlpN~k049|=#25k z86!FgwmrB@1gpdJ#~D}A@wsXkf?{77*Q|Quj54Rp=T%&FJ+S48P=A~;ng-KVk05=* zN5sY%FXOg5-rbHfKE&-S-#vMpaSDmU>ZHx9U8EFEH4o_bJ!~79a{*)vXd7ZS2bc%+ z%ULB7rB!VZb@9cfiLv91Tfbv|Q80PPCkV!riOy|roH06rehKJW0JkO)c@OAv?uTZ2 z1i;ftOx`#{PU=v55WeFB{BcI>Pmz6v`*-m&GtRiK6xrXnSE!y4Mbj>4C^OFZYllrt z15izTq(9D>&3H*iu_v<2eYw}T+XwWKJqW7==~YPxf1L3F+R%}5P%A*J7L>_%f1I)9 zIF5n&3)A7|9!k*uSH^arpM3fHQ-Zj1Z}^eX#pYg_|F z<0Ox@g7$|Tc{B8# z9de8`cXr4z%G{+o&3dfkp)XKyN=RniPh&mSOdmSw4O-F(6q>t8`ekqj#tDp;EB%W0 zAd8Hwiupj>1VfpfuD{R5+x>#9Z9dOdZ0_otud|hyyGG_~Y?I7glk}hOB!p6vgcj+` z7{&#rn7cOVo%V1y)!emD&ppN6G;^1m{>*j6<%)ml@VbzZpJz*UO0I-MHN{$v|K@cW zx8??0i~Xhsd zs&wWU|1Rh>YX&esSlF_byWs-JgP zA-!^b?5;}sk(Xk~?DYI4+}WhpPyg3i?q(X6CauO6P4@5Fq|38xEg;AH`W0dd9?|MY1 zf+N%vBny0Lw4@1~otwd2Noho$T7mS@e?S;mTXl0Ik~(HLOFiOGWvDlZeegyG(WX^< z7rzI^|LeHRyxIAU2>I6hg|sa{;Qo7zTQb*ar{=OQ9lX7D25>$SrW0{a9aiKpCWFA- z&TLt5)t3u2CZI8Gkzej(qVE%&ZfVV*|w-@4TPuE5W{n7uKikLTWFH`IIy;9DO= zzqM%#1e+e-ZRM&il^5gZ*H;(e|Jenwsq=AfATpyTHh_TW?F-XrQT04yX8=9p2^L*R z0NcAuQbyrk93v1sX^lJv!E1ep0htokX}t;1y)mE^tuAnH%ZGfCDEP*=gxpt3eGAZ+ z1a1mBL){_rw`cctjQm4npT*0y|M$X|SgrXL*2QT`ZT{%duj z{OLubZKv1@SqG7ON;Zi{oZ#URFB7)`xR3JvYHgs{Zg_zR9vyf$fawV5Cjl~4?*TA; z_va5*jaLJ>UqD_6U$utdr{xMwdIonnn8FszW-?WhK!F5Lt@zQ5D%HmT4*MYF8<-dl z{yy%gO~UWUocewM87g1epEFJ8+g$_aBFm1+tEg^Q5rL5UYa}sfg`l$tjbi9>%~U&? z!VRXXO>DvwRZ)2$#>OZz)iq3+2h&xx``H;q%~#hTygmk~qN1x|;Bc*r5Z;a85fR2I zU#8jub1+MtA@(|q9U%7jD5t%uvJOB^b?RX#_!6epuA=~CJ;qW=y*G`RZUH)|(TpmB zbyTmrY{dCGruHY_sLjEcLWtFFr-MEnjet^ld%6d+{W%VA2+Zl1B^2L9OI6MHij?$^OOdE_fS7$)SNaahi z;BEOb0aos!#pjE-t0(T+R>YGQL*7eb+wv|U@2$zx@8B`Aat+x#A>*l?)UnDn&0U4` z8%BYvZSJzu?|YRy`-#FP=}*gDeIv_FUm`J=WAF}K2BJ<`jKmG z&AXgA`{-hrola^7lgX88xy~OijxqF3j z%S0R6E1q9M`{go;$ml{s`^57`XvW8bG>#IyI_>!|jGe8w@^g@BC*w|Q6C$L%YN%hu ziaAQ2;-%KwW%l)0|DT`Yk2e+Y|8bf9V1Ug&(ylKhth+I3*>V@H%fJ5=KkyY()m-%q zh#fJMR#NXNz9*}YuKEz^aX~cIJc2N_S0ci*btk=AFl`F4QZ5q|WiTd8gl4ti23c-X z)e$uDg>fx__Y~ikfr#X)t9k(&oCt-?tQI^#ZF1Elq|<#w>?!_w+-`|?w@>l1KK+>Q z?hmE(;{0Ou0+QE!X|%QEmG=}s_tL#(! zwe&Y91yd7wj$llg=-l?6;(t8=y@0v{7??!lJ;g8WVwolZn3crjJ;h%}*RF0wxY7ss zPw`VbBYO<@P4P0jTJR#F@5cQ@UuH^4qD6j~r}$%QY!rS1^{bCWZdMC^->pnyqZjfZ ziLr^*B>rl_`#%tmrbs&^A^fNK<_&CjFa*RXL79B_pWZbzHV>XM)aS~W#FX2o z_^)0hTK(IeCh|oo3jnmPP{=3|5sEqr`BJDfHz#d`j`!xm#^D zbGK5x?cA*d<-(g{Q(pRNQY$dr;JohZ|?TLq5)TexG9E`Xh)+4W#(=>F7h#~A~OY95l$O&!ZMb*BuHtWbM<`gyQEzpdkDLv zHN1^Wjj1z9V~t0*^Y8F*^eB3B$#p!eWwyBsaM#R>7J%X zX>=em`d(bD|$;gB2|@fjEc<@O}Z(C9aJJ}A|kONlGCCi(@PmOYhS&6UyY4u&dVQLU&aSn zC>tt6ktra7eW>+B=iQ3StY(gdcWohyR6YfD-??JE04)7s14(@N@A zG9s<3S`XP%LYRfCWTJNOu6E$I*LRQBK#FjQcl76p;SVNI!p0(#Y zz*L#M-*KodGO2%+)S8>=Y>cC{lMQD z0qIEogMNNl6;vhs*2Y+rq&QJO$D!Eg2ww+8T?DCP=IiHA!;uZcy;x)>EX|^0<>}{$ zwV>vMxFr!~3P}o87m_Yrc5+eLoM#L)EY>XTz-c!)pteMYvyDY4)==a<&)QS81pOS) zmNbbhK|lWj7DSRJ;yC@R%xw+dJvtO?Oh21(*U=Z+Li3~QTZo0cUXT?T1vV_!P~l-4s+im(nl?)`{=zmn;v<;5)6@a>-Lf!dVs1*lj+vg-St3~EjM+3?1E&l zlJ2UGY@&}0QBqs$$N()eLfrvd9XSg#lBXow>-;A6kxKNn&XGH@=POb4I-93pztEMJ zBI>NEjlGHcf!M!#2zxX4Q?Y+0_U7)F*fZ5~s&!iHX61qnoTXh->D(jJgI4=`SB zTELssq*9GSI8FeMTELv)M7>1S4m!>^0+^5R#u%WFx|a#1$W+zr7suHLz*P?*T`vd| zMm<&U6A&}h)AQu{bUTu_d}&mY>-16b8ggW|+RT)SAvp%*WDF)b#48tj_K=)KD!f|4 zDbt?uKgNXPF|E7|rpMH0+dZZxK-$M(lBWdtCXXVK11kJAA3%WHRYQP`@?jq0pxU@c zIrr&w%|^OF5GHH-sA=zRvJC#v?6_=g^2hRN2EG$6}<*V;q;Ntr zGwLp5jAIn1h6t@sEv)1gu$RU7yg1IMj%}uU9nY91wj<(%I<{Hv(t8*+>DbPS6Y9}- zb@%-%9cP7(&>eAMYGExmbb(joPsjPxBk+3ee;8C4pZnr`YGFh7R~E`lK_B;h_EC2g zl0!QJx#`OJg)jpu1qD7IW3^whL+6Qk+ozA(If0D%B+%+-&x7n~?i=$US)}vH^RTZn zA^Z|}v$^MCBH)=Z4|=H5N7a*ul1T9Rx+cQ|YB`VxVlXLgQy1&0KXQpfqoBMR5l~yf zyc)yVihu1CARU75F7iVC0?2<7VVcei|NAKI;nLuiFL*ClXGDcu_P=0Eb?V%IkA>u*T4nwXxyLb9HF=u~AZge*=Cne8FsuPGFg7TX9kEQ*%+1>XqlS66@!ihc& z3>vV)ePgM~5p^BHn_~>-RQt$kcZ*dv^)SK>F$N1*Zt~$g%g4f4S2~+Xt&+gwx^yvf(K5oO^Yl;%jrn;TD9q#RKGNAo8L+gB2$Y*og37 zF@Tvei@XpV*&W|+AoxIpMh~R~$?H#O10yGby>3*_HxkBAApVG*83s(*skQ;jN; z$hSft7f7vM3g+%a9R0M0d>mT2PavBS?@EM3C1|$MoRJ11B{1c8LOclM>ljSNI3A*0 z;DSeafI5vdOpUOK)Et?H<5*})Kbz;-AR5I`x>DPa&I{Ce5T4FR2gVQ*QZzoe?7;G0 zh|okJb7C-^Tk-Ke89MhJ*p>r%AO>qqcM+98A}{Y_Md}5n)1<2BfV}L(C}`P`8u=@9 z(MLAN49?SMorsy@%@C9jPW0v8aX)|XWv9z2Unqq+x< zeqgz_fq4Bat{vB+dwg2qE~>o5{s@R4V_dofGnGc&7YvpozXTN_x*3?noM>Aet~%jX zE$oy=4v3aM%4skL9V()58oWA?gO4x6a^HJ=)`(}924Bo}bOYJozg_r}Aj9qdUtlJn zs5e;=c{0d~$iqS?G6R=T{4vFeGQ(5<3QL3z9gEt7URC{Gum<O->l@LHJ;d!E{=oVJbM3Cu;$0 zL-h9SI;%B74`3T}t%n&E^wp;xv_PI)Vr1Lm&F2*nN=YA!BK5)l>#`=T+nj>r*50Jhm zbkse;U`p4GK?w5&5LaNP?+Kl9C%&DaY?Tdsvj6K#&V_8)>XqKa%ohvz(%IHb>(aW zqKlvsR7rZ3P}jhCs<7^RMu8|ki%X-12KF4Lw<}AAUJqh<5?6h-Fa?oXi~AEkgB`2; zU5TD;lE(RebT|J4LwE8go@*Ssh>t&nBC?8+6-h&9!qNz4Ma~tgah3m2HugYph=oKQ@w&pMO;-_>^cht z&<)|G@qqVx0|=|kaeUWL0OJvs#sdz}0z}HGlM`L%Dj{8jaG3y1>@$@Hq^oBDJR}T{ zA$-;cc&p*ZXFyX`P4j5>f%wozQM)yuhHCE7oIv=e5AbN@!$Oe;YB15&OE>2brJ5L% z;OI42;rcf#JCVj}3E84i?Q!mrgwooUytp7mmK7NfG%WcUid-R9<0^^Eid-iSV(lg+ z9f_=I#bCfjG-6a`tzI_L`mt^i7^5GL%5yl&a8qD>Onry@ z&zLl!7X8rfPbd}W&lnqH1ZK7&!xZu6tNF^w6L?bf0bD4c_S$!b(k1+CTRxkzRpdR8 z^^2G5@_XSALNT(!vDY1h|m+hf_UeRXaS_=~o`p2S`+~)l! zpkc9QMI<7;|0E7#?Iz>J3aLX<7!#+sCwF8Ja{E_Q0XGtossYm7Z}o%5;M$xLYebHthGt|4z5RrA04Sq@Mx$ z-Jr}PHDj0+Vnu%@X!^>O+c6B&4Q{=|KAdSTRY3r)|3>IkRKexW(+qBA2bw`Y%iGSq(+r5m(t_niY|qqoGJ4b~-nlFYm%Gt4KyyvEMkD z-7FV#FT9fF^_58Z_QN3he@vR}NLA7OL$qQUSq|cVdMP1Py%7xcg;whZ ztE+3U;ik_~I;loz0DE#>jh+p1fuKJn0Obr;O=p7Z+k>@TNiDd5#ytRLeLPOq^fLNa z`Lszg#Txekm@fsV^VTfE zw^M@_03P+;?V7Nh2A%;FMG*g{uc7^-lQhY!qb> zt{$s*^7%^G@5g;Tra(C4BhF)_RNO7xy@k?8z5j9+P)MdZaN&z~X)yQy?4? zRgLrz-U;awK*~m}+87_1Cxz}Iyff5a2iXSN6r>e8gi=lKhh&rly{&QL#HL*$F*7bTye-h4P8j+-8LhWfaKGt|fJ zqWuUgk=9SX&p*zbp)PN}$rJ44-s=AEH#Lfc?MTWdqxcuMEgZ}SS1 z&rp}p;?7VnOg=+hhxDRJ$xsuLcZRwN=_L~q#~tf*y=>C8V18lp8R`;J!Wrsg7RaTVZs$h$X&U!ZP2IUlCV#X_#Og=RA9T9rirj z$6*SDL-KIcfEKjL=Q}gGUx3k^Vxbu< z&UWq(U}8*hO>4e*@o3gsx<%0a2lq3W0`V@b>IB(`8LsbPhAc6O`4emnCcvj+v^MCt z%9-AU8!cT=3mwl}%;APIH6(|b6uxW40Z%+-OtBMgtRHsB2&P13UuU?*P%B?zuX%iB z{B}aymJlK-9x<^HIQmO`3rA?S7KV-3%O22hTaUxN)x>@qTwlP`YIJ<;X_hosTf^05 z>{Cn)gxktyP&t;R@O~Q;$FhvSVjL-JugCu@rs!mLkXb%C!^xQ-drHIIyb$YKKj$^) z2uMO*nH2I+9db7l@}RKZZX1colaF;IAKHC2e(Eqc+!3Rr==n(uPQF`~d}#L} zyyoMr)blD96P$e7Do?&amV9V;`_`_r64;Z;eiDKkC7*oa(C(K(y^qlaB$k8%l25ke z3sLf+-D?Qscii2v6p(O80gVbXWOe(x={VNIXil*taLVWA^2J~Bq1}JNc`5FLF$Kb* z)o6jV6ouSP!DvR^h45s=z1LT?vb8O*jq5DO{Vq&_coK?<@*QOPTJz&LY{zI8u_VMx zKD(SR9zC-DmUJ7WM{)lVQy?5VUPp4V{K;L#Ldz(Y1V&lL&KF-E(|XHz9<$}GLFZx$ zghP6eylOodsawP@dtDB)0MrzW)*YRA9RZn;cCW$xc8pGvSX8l`=ok5YHFhT~Q^8@G zkk25GHsFZqnC$Cr_3hJ>+lJNB_32a{|B_Ok#BMWU|+TRb6KK zk4?aRTdb05K8ViF*bfPFSYJ!!k*nCv)7M|IU`DLOYIt0y@*<(J7T& z$dfs94>s1qrvhIE^kEO~1?%L=%2uI;&9m42z;^?E--G*koF}V_9&GG#lc*-`UFQ_g zmPPS-Ag3CVsuEdu6p1_y6fUzNKG7V7e3Ev(RD7TfD`f{_LE zSqZ^-dBT2P6UsLc&<6zaRZ>8V z5*A6L_cQK)Vsx9M8$Bmqu&1m7q^$_k_AnXT$#u@3$m&0)Ks-rKjFDaOZVQ}xVl;(V z6537KOP?>kJf`}VaVm^caG!-K5DuNUvf0x^tgy)aAnyY35k?n9{e>;6CX-UiODsyrV(XP;!;5Jb#O01-7pgb*;9Gx;DvNXW+o!X#nLgqVbs$(flm zGbhZKXU>EKl~NK=DW!m)e`*D}{3y2t^?LbROoCcV{S%~?T8mWqw_Z)qi(X0-P-?Bc z&$HHg_u6ZpwaO?X}ikpYM9#XT8h(#Sq;My1EHRp|_FRe3uEm-~4S{ z5oBIP(seuB@kWn7^OLlV3rszplz?8!hG^ zHPOCg{+_Z5HUdPQc5Py0t4f76odI@AB1d4KdGtB+cL+)35o?(w!4H^{a5Esy;M?AS z`A6dZi+Sd0JX1upVR=TTvCOuo=7T`EYpUvQgXV8zGvpsc{jx;ohiKND_LINFR}>PJ zv^z8HCr_wv$esuL>PYQUzqZi`cEl8*;Ul`D??B2gBL0be=KZB0dOm%YxO#m~r5&_8 z1#bbg6hEq?^Fwx!H&73$Hz<^EmS&x8ltwp0ifi&+~off@*e>HLHrb$ zGFrEAuKK&Z(4_vNN0E54!aQ-4`P;fW$UKM$-^NdTPTs8N;mNxZ>(BAyOaSVQ z!SU3&w?ZVq?3uhl{b@Y?ES{V>V4gPXMD4jYd4qaluB9X7AwX zkEA<+_u;3&hd5bu@IYK}J-+=RepC|t;H)A%HMX5k{nDgV_c60BT@hsdC-5)hr@%DW zlLmN*Lt>n6Vh$nZPY^*b8gB^H83{(_SrLge$3%V_kxw6z$ghhcZ{x8ciS&6Bxe-^r zEkWc>_=$JV%aPR(j}+C#LG2?s$JqFs+4^``v5X#^tN!{0<`rjCq&?MzCNKWMVK zAKBas{QtsFfr)U&7*Kz=XSVUc&66hPbLQ`qwL#`vi12;<#0!Ro=UF3(_M(a2h3MJ$ zV(X8eM0B2Ul4zNa>#Bbo(HjwUX?1j-LXv3HP4rpof=oN2_E$$In^>YLd+sI~Pl@JlboLID{nr7P01yj#E2 zs`Wu;Y8efLA6p095a_ukKUEzJ!G-|k*qI6QQyEiP8}9prPU3GqssC<9z!0xF4_By% zSlF(U|A!7d%j7q7(*@Y!ZH^+C1)gVF7MUndn7{XR+_#Gs`j2BBb(dgLoR zA?j<{6h6ioTCGb1JdY#^zicv?a%GTt{jhZUHwWsV5I3{r>Pw`{|46?;7b4F^On!FjCTSgFI|5e$^QY8{y!yoeuzy%4@~FVY|qqv z6Ay2r$6&e%-`UlpGXS)5KDo+g;ff4E8Ou@OfbQ(5aWc38JS9w&1`=On7ng` zd4;`5dJf{v$4`L|u}^K|wN4V_|1dERA?8NJ>cEexB{ey!=sXB{zlrv&`Mc`fL1qu4 z-YL;dkKLZ>-~s929^jAQM@=34;7pP{R=u5%N^(a`viBp|?*jiJehN&31-OQsnUmfV z9L4u=#H6XDnz+uKk4Q4VG|5fb5M<876HWLj@NxA%Jbf-P&iIt+B#7CDScCXcug?#v z4LCENypzY|RU7bx{5GEJlqXl26dp$kAHzdmkQ9vUPpt#y){2>1w`aDI4I@u&GEdKH z3o?I)Cts4M`GNW4>0Oy=FJ@oCcU1t=XtZqo-W8b1&GWtH?_Q+y=A9ty;77ejG?Q%O zIXa1U`5)`oK7{C3AnKPSdR(5uO#gU}LyPj1ehc~jpqW%2&+*9|t~u}eJyU|^Cg~ww za~?+5oMSLukMlA)vjdWM_lbLJI)t-fH#am5+Uod~~N129^ z>+eaKB3;k`k6KE!$4&GpR|T2RBC2Y=u-;5i7r zd-#bQ9@x3!4a75bOl12b_$8@tH@U2O52|1{C=>XJ9xpIK6s+*~>Mv#@`qv1~L!71f zQK_p@9iKIrf~2~`q<%kA$HJ89#ZQ5ctGA{90f}*&i8*C+kohnoJd7Xpwn`jCbZi(f zYZU0b0E2cboeofd-1ZGrnLNDeGiK^RBHu&;nd{@-9s3~Nd3I+Rfc5abPjAIC%`3~p z_nFD06_vy@;T_A`5TzdR7T`y{DL=@rZwWq|UEflC1lu%#OQrxyr1t_H{n^HZC zQgs3U0DcNgnKk=$=w)%_rA@ft7xZ6CrcnkD@i0}}8RHZ1%k##u0bJ7y+Art+R zi2e_Vs^9iMvbsA%W%CKP-j5J+1V6U*GTRwjp8ldq{c2o+j#%H9^kQ9R06s5tSJ}SxNwkydGP9OIC1W1mC4Z4f_Wh85@uS{> zAGlg%>gds;{3VEwZ!%Yw7kOp*n-+ft>79@Zm%agiVcm{jS$>iM!Et=6T&OY8_bpE6<%3>hFn=*=9T4de#_tLhj?ZAo8`*# z>>IQ1IJtgW?&LS0{Ko8t>{WHApsIsenQ7CO0>oT=Y9@E`Mbq9jZB0E02L=ye)PDn_ z5UV>U!#}U%cTDKn>>6Ctjn{iSVD9HnJO{Z>tIy_6o;D5XOl9Cnuh)rAT~ogp;?L{n zW|y6$a+!MZNnPsklc(bG1=uORfghkqv{62I>B(#A84q@sK$4xtWT%^CQ7$H1A3ZZo zl5Mb1lnkGoq41FJ>ENe2@g!YnX{tSQPp_%l59>@1#1R9 zUbjEocua9>`<&SbK{+$$*5kv)Xsg+Q`EVZF<>Hh0{G2H5sVwLDraPhKq0+Hm81~Mn zysW6EsL|%mL$ZuNuTgzC6LA}L+yy5|E$5?$<-M4D6CMru=zJTj>uy0*u4!*kJ#Hau zoYl!*x5!3ci*U*0LJOmWYp1O{(S|K{!q(Kgp-ZArzMC6{)8DbSvtb~RMj?DDT_Z51 zsa`*oot5u+i4#eN#?l08t8zB|mYMoz~^SSaLUTYdJjdRtc;1Lx~i(N{J1Z89~f z=03i{d!j7$E7;1~> zhtbKg*^7^+Gk_C3H=D12V|IG>(mEXx>b3k1Z}mdN0!>prefvI6^4SIcvUsyX_m-4~)@W(y3RfC}_#?{* zw>fLAG?Xsya1B`ROx$q^m2ywC&ZrvH(ok#k1k26I^4)Q1XoHo8+N?CRF%k&WP_p8W z`nt)LhTfBuhI}%QUfH)qg|TuHUu&x?4LPEZeo_lQMnDp2=y#&zbe|Dv=$febN}g#K zd1gE1nSzyPI+9XTXOy5LHCefb#g<%R5|66yxHJU8N7j5R4fVvOA&Njo8mb`xnYA5D zB;USwQpL?&!JY`q18D`>EG^#}D>8iHrjfk)X z3YdDrl;ApBTsHA8BR@p4*KQ+f7}*Pw57T5+SfwRvNIh`Ollg#+3nrf}XeRT!3yiEt znMR(nh5Nm%7N~BDi4c72J^aqzWD2{tO1!yQo`}SgTa z?$$|D=HexGCTG%C9iwL}{eG@0W=*|*nDH-m5~c2hsH>IHSW+P2g1SuBc0P2eSq;^c zyR%$&l@&n#tMxA;O8gE*iEFGVVHGR7$HiN8yKQS3 zIS@nQ!axUCJgpk(#K%ZA0>Q&ojTA*SqBJXdol9s}xV-fy7u%9uQW?HO7X54O!b-f) zF2enGm1T&C7iP5{lto{uRP1^SX@dF-$`VF+&|COn?(8cDom@HXti&l}a^?KZT{)HH zua^c~h@=e_O?JE^SO>;dPrVpT8ZYclAFF133B{@@vj?aOvV@uy(=MUE(UuFVSeV?l zix8LGwmZWpEu`r%hwTo2nq6z{{#{SJcD=%SDyuD5xm0^aavjEcs!bHI zRY(G(+AB;{v*qN9YSu_?sEF;hhh%+zue%Dz)>RgF*e=&xTVwlKyD4{f;Z>%Igh2#m z2`QAVBy7#GDYr|y+LUvd$F^M80=MKWzIiol$|V)O{NJdy&T;F4#wWMVlUwKCVCn+5 z&XWQ_VxK%-_JU?A{MQHo&I-e={N)fm%NmT&$^ANHP~p0*bld@*0#Zz$BRXperX} zhaIC9#V!9a_5!xtR-A~5271#SD>?ZKF+pRel_0J|2qT&`9LF#NC)tp(p{wUBR$vV_WKyJvs+1F> zo?~O`1+7Y$pVZqg;6yHZ`$Bo{eZ?z^}E>g65`09QTVEz5mOUNF*vUJUgF8c7UXsbd-heucykUxs1yk4+)* z)n8fvIbDz&5K|^75yD-wp-$j-oyr8YhN@Y6nG!b2jQOsq@zNQsLbd3iqE3rP^_l!x zB&n-ilA{qNth50!LSyfvXz+d;&!bhq8|tTl2S!`+BQZNJC#0?Yj$mQ+*x38)U8|2b5Z@R_XC1kU`q_A+S`4`M%0@c2*=LFa z!Veg<8)xE%H$Y8Xk~v__1KH;LZies@G?0+%m<^6ZZQYd(!Uw z=wYd7R`UhI;d^IQFx2+OK8jAQ?W6M&k!%qfoe+zg^L?UNY>M7n*<-5}`L2~&`8VLW zWo0aKP0km_b^eR(N@F$h(e8#XdQrlnOpS-TY};v)@vUawUF;cVH|ttbbf2_3`ebM| zbDk9ouLVx!=^kPT^kx!gX;;Rr->a8z7joOw$$dLRSX-J9plqKaQfn4~f#h&o?BJd?l)pQABUPLYvdwMd zHg}`l=7KP9HZI0B#-_x}x^46xC)9@F9y=#QD`&PiSX?K)Ro2I=?flPm2|NI?AsZF| zmm@KFLrw46klQ5`Tlb`jy&x)fEZuf}Bx^oq*6xz^vFNUk-BtnJW0o_FC1;I}FNrvq z=PrrV)thXpHTCZLC@Z#E^agAVuoDa-A=Ta-$wTh?I8F}z!>7U7Pv&Om_p{l5JNfna zorOj{gP-iYk>T>ZzQN8y-@MX5XWvLyabCwrUth5@Z*6IySSYV6RC+Tik_302fBw7$ za~EmQ`{W9hz{s8H!N36AgCw%)=}ad^~RSM44s^p`q^k?Fv2 zrCcZtRN4mnb{5OtmzdX4s+cqruQ#u_tKvLjaxQhu>*?&Aw`=jD_C*Wc*;g7E+4atz zff3e-RG{8)1E+Tpqlxb$pLUwJ9I` z@77i97=h#bj>@KDXJxQFe{L`PR!8OCBZaQ_43@iM-z&xP0Q!VR28!3AUm{}kLRWU| zKoSUr^QsuE8XxEsqL&wjd)F0)B+-rKQemK{uefHQdr-qF*2djK#V*?k5F0Kkmbb21 zRj3s31^;vnwUzqySA@;&9D*}k=CQo5)H6`*(#2U`E*Ey|?1n3S?foim3?_c*9vSGY z=od0brCcl`viUYtD3$fMDADD8Y;M$(PO=dDiic1q?Q!UJ-~tWqj8g1EhsJYo%{5%< z>MC~Q^9d|)8%A)!q}Wlxs4bUv&EFNZ#Kv-AV7Pm*%y&i8pi_1Z4s@4#@D+1!M@2?v zkx5|T>!_?*#YSCKE?lP{K^B!l=e4Tvf~+eHl)4A|x>^Tysj%dBR9cJW;nHxWIDk^< zU_@6Twgb182Y0bXRZdakFYoIaESD<1ETjs#663b7Ff>#e=xIegt}Jx+vLaMiTM_Nv zSGr!6SoJoW{F(uDv+hEtiHw>ml=-Ttsf#;CN_~}gmImOsQPp8-5CN!8_O=1Mp_wk& zn-G9LgUT^;3c7M1`!bwip)pmn$8%D!o@|o+uDGkSIK*zk?yg1)l7ZVbm7?vD8;j^^ zrGaP=poID}s|e#l_cNe2{qzvzfPd<>oQY80s;YAP`a00S2zFZqd7-0>lnW+%cVw?B07cUI+YX!GD@T zF;74-r@RiZTm_o@`%HFkkB&}UF7eELFPnWL6HLk09l`H_zj8;y&B1ae5F(=7&6#@& z#ZwW3xzqRQgcvS2a;os)40$ZNe)E+~cFz_YU9Q;7{TnL(=)>V9=D(%kXI0`4u@u22 z(^-zq{8cyd%E&#z-1@@|xJ!keeG2|$>-N<>6||fhKCHe}Kes1rP!H~p9t?k=qTa#h zW{mB*1AI6*tG@bA_)jLW@J(Y*O&5Q*F1{|ti0V;OPC!k{y^*xw2UH$&#`%A(!bkyT=H17wapvCraiU1RRAfL~#8xpgu3PeIgPCnEXTaI~O$^ulb| zd*?l-!!hI<33)t|JrFFf52i71hI~;%e#DTqCS)2yPTFEpyD0k@ZaiTtszwgyvVtr4 zHKlILl#_DT&21UUoje!KuHpo<*dMZWE&LteQfB;Nf5?Wc(d;F;-TQKH4CjVD!3Fh; z4hQe3U-)o%C)+(+SE&no!g;w<<_5FtQOMl1x#5=Jy!zZpbHjtdA{|>jk~?AU!)WM5 z;oF0A>ly!{Y<;jY_WvdI!KLzlu^!RC6P&Hms}Ihp&z*>`&Go@fBEgb+lsuT*z>H3u zi@}a>NYwuk@#m=cjfhbRFHsLw!aaB>cTxpu2NxsYp>Q7FKyo#iqlPZhS=9#%k#jeG ztDNftBz8i#Dbj+64~GXYIy=ATJB>lp^k7ND^T9jo!{@`T;Z4t|O6so5J@fuMa(|i& z&dbidB4j(Vwa%!R*7_eo_K@x>uLmqw{pD`TW)JAOa|&^}urGrys8J}qPye+a+#g;04FoKfG&5oj3v&Ma)n&(uQ|1< zA$Bt0InY3=q49}qc7Jd(YmM+Kfgi}l;cEmwkjsXrg}tcwpe{I9b?jgv|KwEv-(1&% zMm-w5E=tebU6uRb)a=n<24U8=Txpg2b|!oCp8XG-C4xb6eO2zy(Lmv|@ivmHsyt80 zwN##`c!P zn^PJ4jes8%7;?bT;4PBKGXg(~>27IoffW2yP}Ecj4^PX!66EWTVxHS$D^~8BVdaNs z^Tqe_SNJHKpw4Lnxh*Ey25cX>8fFa1$mK4{WTqn-xydE>EZ)sb8LSGq*(J9xmwht0 zto}bRg{zKVkHD_?n>Rc{!6<6z8wCEdF#EH{@ZiyK9^dH$f1zKV$^KZP{3IuhO86H7 z@2ktgN&CB`Dp$itp{mN8*#}hLWb{^nKQR^Uq#A_q^#Z@j<~v0a`MAIjotOXTPTdn8;8L-A24>=?!pAIlo&i4-ek53U>V91%%)9IN zOi6zgX2YAqdEvaRSn@DO;@4wG!;x2*Yi>B$na#cNNN|-AKl$Y4d(4x6gm=FrSjJ+r zW#oE`c*_u%ODp0y8|7I^=LM%xjtKnq9HiC#M~~`iY`_x>_L`i(5zU?~&{BbKpAv7Q zR)KGE;0}R5h}l!E|8;uO%+{%OKAiU{JEnguk$>hkzrY7jdAsIeoz>#Qi(f&ni(37* zn@w>aV)Lr8%;G*E@DH6d9~JoSDTqCjwaTgMkih>R*8pxL)YSDefxq&)Z0-d3-{u;? zSw9!fWXlEbVn>-mWGdyNsdY>FTP+q-!_TPCl$xf>Fk#7_xy2OtpHIk!pJ1P8Y1{)* z1@W?V-S{1FkwC^y&Jh@bz=3d! zS(2Ig1_`;#X|67Tv1f80xJ^QSiM1&>Q!;);;G3d)Wb)q^_&MEV=TtQrXU?HpO{vw) z`8G-OUV)#TmJOGw>Ig2<15*8w0olUEDI1*q#<17++M9mgqzUQPtoba^Z34d#V3MB2 ztT-yZDzKfZW&r-Kz;m)Un@VGOe=P7bQQ90RM+C-}>4=^0PPxsLR*An&;3p_%#CyeF3Hg=NjXo~$gIo{Q!pApxRNx2dvQLHw@!z}kM#dk~67x;PXarCHU<9$oum!f)SbG#(5owo@8Lg4RX zVZFpQ)0uy0O8L($<>{;>M!!^G%$H`z6K)P?+WF=NiSTz$UELw@lhd-VhWDUKF0q~S zkObP!$-G_^82t*3+p|>!0tQ}mhbiA7Y{-L?SUyTL>jnOf%;#tG9)`?A(Ea_!DeNbt zXO2{W)>bfHeZMH_MpcPR#NQ?hLDIM}QHA~Jn&r_{`l1sSm9f&*dsW6NB89<2m6NxM+Ukaa8BN z8&3aJmVmJsP^`&9EF$XBsMp6WA}XXxX|F9J=Ba_s!p@@8o5pG-kp!v?Am}ANTZig! z9$N>Zr`bAQ6HA6FUR9+;mJGKxy+bLg>rpHjDyg_716AM}lW5nt>kAn5_?LS^#7cm# zjj;m>e@b%uO9+~d73GkG+``Sz9;i{3W|;Po8~$%o#ILi6YF|Y7Hi1>i)oz6Frv-kJ zu_O5N0>dIaDyCh+aq?90J@$X4y?7_{>dlPxrj2cWgpAvC@`C?W629#XQhQivX* zi2RT?qA=DA66+73H2-lp0t1dww=s0v|1_z85}}P@12o9%>*fC$!Hq#Izo-7(#Qp1R z_RGQVOCf34>3-A%oeyn?60(WjAt;oL2V|ehfG%da1 zpF0V-$FN5D)P1IMP##H!8nfAgzZK1>l$Jyz7#_|V)9y)xsE;zrzXi*sNPbD7A zQRvn^!TF{qaVzCBD-s`*S&@6nT4qItd(4W2eP%`ClV-)hXI7*pFMGgrgL9>G5Sz@emQE7@Sc0_*$)fNU0iz9ukhPyBwkVXb@TUc?1NvI2j2y| z=Q=H48&XqUHH*(89wa^?+j+m$U*m>{n7sYx#jzy8Q+HLYY%@X zygGM5cro-K%P<*jQHh3g>yCzJyI*Go`G&AZ1;g~)sXiR43$8c~xuk~tNJTqR2g~tz zKIU4&>A6KSzW~GU&Tv_9>5P%^aOTaE@-%zzoEw6~|HCs=c;C@s(9^c;lUb$iiF;oBC69*>9DOoaQ~%^EmmbFT$qWwO!4!=BJbd`kaK-cC zh-!=|NR=`?{Ag}kcrgtWv+9Eds&VT=-GZt)mC;@OLQYI_|fg{$u zhLJrZ;r@|3_v}=WO-EFmfKWlyYoFV&CAaGkI?D;+#V@z$#Q!yx_}Z5FudE9{6W)`1 zeI@+Px)x@&s2-ex@SelyetR%vbyMh< zS#~&RoDn_`8+&;4b79Xqd_22;T}wWkhmYaGbuG)hpY}82Y(!iZUc!j``DqWqvj8sF z;KN7<-`4^?5956q^ZXH1xFeT_hjW(%^Rm0}R_6w*v%7L99}3=G|5&)Eho$KaTI=r% zOMe|)+HhZRcEf$)wZY>0UHE-r{VtU5`kVC>^JdH(o4;b_rbrt&g>cyq-&PHuiP#Sa zJlDt<%D5363GWCRsdnTPHS?<`qu&p*2gA32N!2D8J--U?)rwz6x;qx>F|GN23*fH` zjNQVMMh<7b-xXZ)4KAGyP3y(X^KA&<`4=Wn7$J>4ku&xk0)H+G_${ji zDSnnbh=cY49|408_y`!peFO~RJ^}`DF9CxAJ^}`DF9CxAJ^}`DF9CycTr~lMQl*E0 z@pizCQbCppK==xQJtlvK-zVYjV+RCId92}a(;V(&a|QN1#<6pYgj<#f;d}k?K0o|z zfgg#O1bmYh1-7PWrhVdHnUY%G0b|b+*xFGDuNK&`)iGp1LT-i-so4%p{tkivl6G+= z4HEuSf!#7bF0fn1?+fgf@fQNSWjyoi=8dY#xJp9YGIk5>mhnb`EjNcnzgu9p=#L2O z7X4{~-J-uBuv_$#{#RPj7f6U(^i2ZWqI32d5*V9nQ|oM_TLpG|<^2MCdL>i)rG$TP z3XFVUxGE!2JA@D}QEfo-AA zLZMy|_%EsOh?a$y1$GHuoIYniWzzq1Dup6~7lQ^Q=wqM<8&Vzd8wI}`*3$5fjj**+6V{&3&ekokpL)b7PfHX_Jz|1C5ZF!dmjb6J*!@k@C~ktg z1a=d=OW^bbe<@LHf-LySe`E5o{5it2{qPDuyiMRZg@DQ2A_105H4E_P1hxbT#{ROv z9!3De*FJ5^n#^XW1i0DUBe0vzX9Z5l=HkCK*;sBMb6+oTGWT5);O71rf!*9cFK|lk zOTSgsAnZw-1$G<0EO2_mKPOS#hJR7uUxFqxBUsFRon@wK>Ik*sQ$S2roD9~%r~l3r z&Mu9F_X+$*F$xI-4oSc?dlyE$+ z^?iBBeXY8GFlo83HCtf&S}gxkf!*>C2%ISYX9c(A=QR7gz%CIrI7gp?h?uBUIbZZ$ zQ@%IF7s6G7{?z3NGxggg>~JRgd`~zMTcy4xK~U3$SF=+q25c}a8HcCarEiRMS!S6= zmu1)(>9UNPMwg{T;G@f)3w+1-O#N6&61zx6U`wSWe2c)AN=f*W0*^+eWR7or&YRN7ULdd~rxIQ&uw`BnZWY+F!w7c>Y}u%UD+0S&-Y&44<-G#CS$;uaH_OKb zcC&m&U^mN`1a`9wzHjQp&9XsYH_LMbcC%b8aI#6*VGl^4+kL(+u-ko}71-@QF9<~(}KHi z`=G$D<=gIjG39N!3O*@;u|p%oe=PXlDZ}((y^1r$cbI{=?=S=F^R54EvbSt*ir57kGWpfjLN?^AnnU_of-IAOkuv?PZ0=p$? z64)(CtH5qat{2!X$!7(2OY(%kZb_aI*e%KT1$ImFD}ilE*bKA(MOr7)*R!ft2<#p; z;S+l$2xM!c;pY>d7P$I}?@N&T#4iM{e&XUI-coH6*nNW8e^P?n8huJ&w?>~A*w!e! z)5`**>dc{FrX3tLrLk2<_yU3L;Q+!*1-86=!mR?2@5}%n4PQ3-yNk&Jfo=X=kyZujo>>UChuN8)QUGa)3@G)*gnbvJTH)%P?Vi@v>gxF&-gugDZJ^VuWMS?Zzsf!)OS z2^>qDZ}gnt_NWNq=l$?Ye)t#FFl%MXzne;Q3qD<7x8RKey9K{U;8?+#_%^}qc^Ve{ zMu9P5N9SoitwjJn_C*PIr?@8s9^Vwl_5H?Q$y++=rq2poC6hiQA#M?VEb#b?aPNP3 zi||c>og%Q7ekLJqt7qsLhzwyDKG6?1_~Ew-jI~{#GP=`N{|*UsTkUp%9jry$>=}ZXLrhsWJK9 zidf=`U4OjXkeRbeuZ>T!TFDJY>y^H?>_3$swn2X37rCygDdmogWua&(leX5 zSo6o$N1f8$+$H^_MeiUdI(Psg;n!@`qd&^2S@n?{9E4fZ+Pix=?%*j7jOu&}CHs*YeI*K8crq2D~fX&4Gh~XGciXSl* zV!NiCno&7LEf+sEqe7|2bHYA?IdLDsoVbr*J{9=voRMATVMo7>_CBI_2%3iz z0A+6_`kZFNd!|&Ar@uBn=E{mz!zqpu;?N|7iS^7 zMa5_pcu72Rm!P1lPq&fZFYv`Ihhn?%1wShAQkedf_c|U}f+1Q9tZ&WU6rR<%FFXr& zJa~TFS9igI@RQ-Zz1sO(c&M(V0`LKp-rf6fIz}D6c^%U5u_cN7*pkG3Y)Rriwj^;c zTap1jwj^;cTap1jwj^;cTaqKbnk~us$HSInDk-cT2Bole7?i@=VNeQdhe0W<9R{Va zb{I4oYlm^tSUU_GqY;-;(~P(b8>11IQPYgLJPqeF;u7~Msfl}()E}G4J;qlt299Bm zk&wm5AxKB-ut-)Dd3L;;7LjH~%}XNwHu+K*)9xvK|C8tn^CDLaZL#C!RXdJj7u+G* z57L7xy!ck=7Z)ybNAuMX^*uRKZd@`9z?Xspjk+IF55@&OwKu8WAYqg_a&UZe)XP<9 z`A)cRF30yz*0Vr$gi-fXj%@7iW&DD)aVDVlI-~m{Ks4iv0H2aFJ%rzA+lFmTv~7b7 z9N%Oq*8?*6)wW9c8yJgsfuyeub%fpPYeR)pZ>v;JQ7?#Zt5ispsIRwGDr~IVDw9R^ zwhCRL+VisNHr3lIz0*~0-tB${eH>}nZPTxX=VkR)RrMBak=zPTZoSk_GinZJ>!pI6 zy%mzG-by_(9R*x z(W>~>o}(3<;ye0`22<>hi}Ps}d$z!zbUaO8Bry2gG2aMl1-{QoB*j^Sa!kEd9$Acp z>bMP|XxS_1MUp(x>jk|yj(WU0FtW$117VL>2f`^{9d45xUxl`LC!BSgb5MNbyApO| zHhZ&fOu{KnxVaTOBv0^My*jxB98P7%Nx8_pe%m?OaqeL-@s@?gQx zv3jsz+!`J%UX~)f1VTWPCanDI_UR9yhv6Zv;0H(l&hov zjo45N7V!L~9&7Z4ctRaLAD)0?Ci+i<`tv8atpuoY=6!KKV@ZMrUNrc}i|PJYGTQ zaASc)R{R9DohIDoz-kN;9uW95+3b^Mj1u?x79oDC#6OydFE|cG#nbtk;D6xa|0wvU zaNZ^6bL1t#AHcCo@teYo&v=WegRdt7R!P7&=(EzC_vaHs67X~)z~={r4}3}<*pthC zHdYs36#Nh2VI+osOYqNFoSscQo<|73DACa{;@g=HOv1OCH={QZ)m}u;jiai$=)J_J zyCgm)-6b8G)Y4rt+@rfB?9*KmpVVD?b(b8pE2IHW#gx*(xr}}ruMrdzdhQM3zTi9A z1|!fgxa)1EFJO4>F=wQSUoZIm@Y-~iET#;3P(r>3=a|Ng4)Ftm|D%gPE%*;(qk<3o zQUVUr6|kOsh)`~4V_9$lw`;@c9eaczlKIJTr9DBWgFkq>? z23F|Pu=c>a!r5G@a{AAd@Cd$4Rln=h@7Jl{N`4GQXkR^O{v)^v2@o9{H zmA`V(U_@0Vu&TVK#`F59JOo!u;pv`IYY!1q^`CgTLsj|{>^qzoPuG9b1B>~@S*Dmc zv|*g2h?^7!&pq1&{{=*adGJL5!95JY*)xK7!EJ}Cb?zVFLq%U+k>{7-o$wctdqZ$ZHuvt$xzmp1)*iuCD&ZXm zo|a4XU@BfLbr@ql}bQuImtIC-Kjd^R_*FV~>mJMXK@^}#1eL)e|`y9po;dhXrQ z6n-Q;0JkAOLV@6`2JRy+tH+9{U*Vkk{9!nifZK(0>%$r03MHQ8!=5eqpTnC-!+~%w z9FnwbS@xAJ%O2aZ4C!4GKDlMtlUwG)gTXm)VqPDv-I5Pmc%1>>tGh1j4O{MYzQF&) zJL>P1-w2hD8diWt*TRj;4*qXW@vw!0S*D}#vYwux6V6@C(#+8NBoq{3xRD6|SdR$$ zk?7SX2gaK94wD9A8M%k>6#~O8StKGbpdtZ3Pyvr|54q-a{ys+?j>GL4c*7t#k3L;; z8~7`?OO22zxfAFfXG-q6;Os0uz%vVePvwTOZgXAktIldt%E@+whjiR*g6kp%*S$`NdM(YowrdfaJyT)hzVd0;V_a4^`4t&yc8kz9E^G%b+ zE_NV(@&yKu9rqxoGu{jJ6*uUJ;z@OPg!gVnLG-}z|9h93DeBt z{Q~<4(~RI@h7;Z=&m{@d46IvX3KDUm2WFF)a49T{lf;DBwbj}lJV{LG(6@Le>CL}g z!~|GS!BtRKI}8+}yB`!Ap>3$QSdN_KE68_Ig9;cMzaizS2bDtdss{xg4?;w1xzt~S z4iO7}Ey)m;<&efuPtcTq+sP2CI(G8z3uW)Oyo>l9B$LF5@=A0Xb0zg}7%?Jzk6EqZ zaObgLYrU}olc(_OKy#=_@oo>m7M@0Z0E>2pSk3S3HYv`(@^-Zk$z>Jf5lj*z zCW#SayxL=u7{PHoNsLegAM4M7WPnLxgf@5lh7cnfH=EV75e%9ql?i8`@wY+yMa2di zOA>7zcME!kFfWLHDUK@U1<`K{dM1v=gik&kw#1C>jay9aOCmB0jnqE22JtbmHE2z( z#nxcBhpj=_$JQV|$=2|)HE4dWzHNnQ^=&J(NqcTvA?&$rh42dL8}J8wz)(GiZxj-$*>FrQ zigQc?bvp{UC|JP)-p>;}AG~7*2pz%P({u0LoV)r+Zh_*MoCTM^F2f|wHc{)J;+XX9 z%bgl=Om=`{aw<3`J8l99cFBHlBbvZ-=?fM#kW6w;FFt@4awopz!)N(TF;JdIQA6C2 zQjaT6$VBOlNGOc53{>HV=i}mOaAq235CJLW4BRmkKKwH%CXAM_=M@l0&S_v|&^@aEgm(pv z4dDu=hvZ)gOX27E`B|`V9z*OrZ}!u?ml?q_WCLQ&!v|5^HT8#|--|no=4r-9uz_?i zbJNqe?5(&7tnU ziL%MH&dr^9aqbNl&u+=R`w(tT+Ln78F51DRK8j8bica!29}=?l-BY+`ho4ai{1X;b zE?3k&-I6Qs!#z-QO$tFi_I@po=1#(eLGP$Py#Mfz!%IOUYE-14J!A%{U$+Dw%bphW z&-f8YLW&$@ex;Lwb~1+kWr#o=Iq5_ohK^1IVk{34h_IIk#DM=CA`lJFJ|Ylt9}$SS zj|fEEM+747B?2+PM+747B?2+PM+747B?3`ctR@0cboCH{n94qxHDh<-5PwQ=-i3p% zqvZvf;5^hJ!V{tn(eU~!$?0FfoYj|A5^lKKOxzY`Hl7P57<=rOo-nrO(i6fdSDSb) z)?ndj#Qed#UF`p4%FDt&Hck2F4z@e}6vYxp#tDc{EV=s0@0$11ZSgSo*d08~y|Vy&n0w69!`vh6@f1wh<0+U8?eP@M*rE7Uwyagc z9-qxj#N)G>u{|6@!X6GGVK0Y}0kt@U4EJyd38!!f8RX#*683Ni2~Uti$OiRr2$`av zL&y*hhmhUK!y#nH@NftT`#6M5+~ahXu*V%PVGrYwa4O@FfgZ*o3sjSF$OsmZU zAp@%!hsEh+9JXQ;b_|TeF}cr)oLq?GlTkepMNhyLQD0wan4WHW3q!?mxM~&7;HY^? z#M)kuOftV!&RvtvjV9u%6>eV=?pD_oD&^9y`Mc(8w?!S5jpf3?aQ9%jUw|stMllza z5j##fWp#T8o>!hzMkV;ESgVTNg^|8$KS~{yIFnCP33m?_yBuFM@H|oF&FHf7;K)E% zYhPiYXi7OMNiU6G7r7F`=!{$mDK|x~U#Za?NyS|cDGx=Fe^=#tRmP)oM5Mf#PQ($B z@@eFCM5ID2Ax`|es+^*xi#sAxAyp1_v?C%FHdaSOCW~rEM9R6440-YIsv5c45s`vD z{#}uV3IDFu9ZWgN;^-I{u9OR< zflB1|RlR3a$4TEq?%;8J52>K4CWxqes$w12L_n%t6IHt(!Wxv~d=nJSI`i{AUH#zMQl3IYE2gR{Vs#_VxI0CM!vqRvG#{>0qS@X2&HGz@)2%7N?pK6g+naf!bmZ&Br*hM_4gXBhNNN$}gy z3oC;~IFqlZ&cWw`Kh93CJ3R6z5S+g~WZ8z#Z#VVv2RT@+??Z(~uAuHNn4mkWg4TDK zppR7r1)V172#h^92aDbqT=>RdVMCCw*Pb|7)@+xF^C!F!d0)I0pOK(Pre?!SgIlw2 zgyWibnV*Z`l}3Jo)%Dg#Q?)-E(iXqfZL)!r)@3jZ=~q+!lFl$8aZfi4Nb_{Vu<1SK zA)J!_S+EjsRsU_i8IF%D@+RY?c%)%aW3PGqu`CW*&kJsdmH#^u_Egr~H%wbTBIF@dq_KkeWV@YlcXIlX@}jT+QkalYG>{+-R<=plOr?qKw`*)5^`D= zM&tJw7gG$Gb**{kt(aGu%-EyTo*J|p2K(qW#C=>9diANnRbjA)t3uerRUz!-su1^a zRfzkzDkR5MJG3TR?a-QNwL@#7)efzRRy(vN>TzgI*yGTeaJ55gq8=Y2gsUA|6ZJT> zChXyV5UzG;P4?dfVn#eO8_a@75l{+VQOj1aQCrm?4i+~A@1O-fTlWNKL-ngJR78&8 zDq84sb;^r~Vt8ch)J5&#&ft>zTxIjW=7x{triXVt`$Tx`#E#$$l6vX7$7h`;?z2u4 z_gSZj`>fN%z1C?4_^i{!z1C?4_^i{!z1C^Yiq+O>&e0z0G*d~jgEA<^4$7buJ1B!v z?4S%vv4b)w#SY4#(d?j%lV%5H*cdHfjGATvW7rriV2qk(0V7GkX8|MbGXfCz838ye z_nKMxbW&#EsAtY}L+NGULs6jW@b9aqqUn8@#wQg`{iV*~NkvmJ+L&s!+N7eXH!}`J z)5c<%oBc=?hJ9>D>wr?=8wD)x1maB=DlZI}DRq*@B~bzId_(64kBc1Guqm45NJ zT2(cvlfpVUsgs)2N&Pp{NqIapQ-|brxBOe9!+JoxBFDTdQ@7>wu1x%yvQcNi#g2F^ zp45fi#a%>j_9^&-yQu1(3R+H84#=~0ye=RJF5y-_N2levx; z59VZZr{joDOE@>Tbmn8>oj4bDI9w|SIeCJ@r+y>uQ@;`Sso#kE)NjPS>Nf`X)NjPS z>Nf`X)NjO(UH!&XQq*q@N>RTtC`J9opcM5RgHqIQ3`$YIF=#aP8{?#@-xxMV^&6w6 zsoxkjM)ez`rm5d}YT2iLBkohb5kDU4w+9=jexsq%uYOA?Uuy8B)|Li}g);a%y)_~w zU6e(tp79d6lB5Q|s>t4hop_IVNw$(H^J~N48WRuBsvM$98AnB?`+BR9xiDQuxrF;T zT&vCN=Wq)h6j6oY-gSi`kg*h%MBK2g8R#C=u+olH-xdc2m~C=Ajeqt+H?TEqAZxGK z$?Nat)>dVq0I_S}kVc$-gRjQX89pWMhck$|9}eHVL@gwrr2b%(Mcgg$wIc2o$XBu3 zyH&+lTAcbCqjJgjO0hh^mozmQC(fxTapD|+IN1y2A>6lC8XhWCz@9222}Rs-=v^ue zTp-wa?eac!A)C!Wse7=mt91~3B7py8^e$CCJ7(hU)KckPN{cF;Ug%xQ-B>lfOTiv` z7t(O(U6#v*{w-WC(7F=rEN}lzCupgXM)Lq3?k@F=lnbg?_hu%3FSnPV<#HPF;?;~T z&z(i2*!VaX#K*+BpcbGO=YruL&IMr~=Yseo=OUGJQG>z2ZK#LAK-j}zAnao>5ce?{ zi2E1})N9;yo!O}H);q<9Bl=N6-xWt65cCqD(G6ga3i_RlTrsB%%CZA`OZLct{f*!F z^Do~W_8)|io|l?s>+Y!gXZ1InUKgBu+Wwov20BT&bIZ*~Td);ioS-gL+Yt3TR{=6* zbKP2VB>#@Oqq*I@X#(f_r`P3949?HCT&HdsM_$bf&jPp~D`?HgopEfjc8_U2f3SS9cS zb=fDwgZOV=cyPbINQdqCEeW@`iV%KPV0)_w^FHJKCU1MI2o*}6gQ$$%D6#D^P->Jm z2yE{^V3s!t9J@Y*seDcFTk6o$X0t=HjmEgIX4JHOHN(cZuV&P=eKpl#zI`{852pmzFTk z?+b1(Eg}4Zz^}4|r?9FB*Zr;({KRay!Fci03umyJZ>ugy!}__79)rNQTXyQ6@IbJn zK3L5wOP>lKv*39K{7m?fVBx7|EHIOA-()gLdgo^g`!poPeHs!@2($N?#Nf8yTujS6 zRtWrcUZuDH=uzA5dnM=v`mLSCS7$=C}Eb(>;acg6T!1g8+rt^M*?d2Fu^ib=EMCr zR1Q`t_8e-NR^tu!?JSn93JQ8VD44vOD=3JnYRagos*e5Xlb1>Z=$!deNc@=Wq)JJt z0RFpC7k({OO2O@B*{}*BZeT8z)#S|Vz5`kxG;jb1Ka4^MSG{(cHVQ5}eg86S#O{O# z%6To=62Qe}&)SweTxjMG@6q2c2^;YRE;Vy1#=LC!O8Ta5^rP~P3;h!827f-?M+)Aaw+Q@&@ zIwVF-(;+czj5;JnP17N92j$Ztu_AU!;gdQfsvmwSfp$B{XX-v? z>cQ%e2%j#n)gcj{Bk*WCBu4(cM7BC4!cPipbx4Gt6WHpI2)`(>)gckieB2b<>W~Oe z7dWOvB7TkFR)<8mSK!y`DqCi<=x$TgRMiP%Jt48I>V)vi0w*<1><2zg6LFuWiBr(! ze`HExHBHQ;Ltt0a#Gv~n$ZDFH(6a*Dxs2oXh`?6UqzV#wVRVs$?(+Cu`nul+@VtxAZozbmj$CBz7)-)D-IR0%P#O9CU6 zP`QYW?QpTZ1U5{eGFZMCoSKU+YTwY&UMUxoFbO*schVcq%)Y^a9{p=%V7SyXQ0$rs zKFb9&?H+l~(wX=#Vx(sX%;L%EVjp7s6SV>xycAV^6WdZF{-YRa`&PujwpnR9%5OG~B#X7i+PU zYRwK?d|zqWD*49twj%je`Qgf%wgv6Y?#lycUfkZ+UgmMb=2pay(rzCZ>?*c*6o!kL zk)f_arKsM*snUEt<~GYsI8mz$(cHsDWbUoeMJU#CRpl*hm8SXfcI~R|qrMWadE1!H z&0R&*ORTTBJtS7bIi}(pJ1WA@T7U}Qs;jl73Hb6p)wyELwx-m)xU(=+=tMi4h*6gs z`}^nTBct|+u!e+sz~?G-^c7bX3n0JkR8*nN5LsH8{`R54;S#w+ij;Ka!18Kn1slTF zLVgj_7qy&vN|!a?h&MINvqD?*hL(JjdU*rIT61@6zR`{*Y0TZu5ZSGVNIpL@g#O;% zK@VxsXi2HQ{9;h$68fxWRTLzK_Zk@Kx7ltOyl$9fLN|!|q1(sfJ&xUJ^zL0<^~nr& zM}r8Ju#krx`-k{yisM=<6J0wTLyO8C#h%iDsdS{_v_*c=aIvCV<*MOgncT_dRyCCI zo@#a)N98Z>a-*jok3gnc##@8ZicVI4SzOc~MRmRMS z)EnDLIn++|BE>Ko%JSOSPE5+So^IxR<1m|>?#+gpTU%McC;>gLO0BKzEY(it5a5{= zOX#&rR6bxgn!dz3Y-L}z97y%m5+K!A%b7$^>xu}Jnb-`|H&|A0;-s~>t6aE_1Zj*I zWNpZuZB6a^f8A~EysU?jzsK4!TB|4NrHDPL_DsnMe5IZ#Jr$e35VJs3*{k~sJzO$? z>3ZjCleqz_p)Rj)s^@rW?=KCM`bYYkTU**>QZ{R7^@1l8g?BAoD1)NAJlM}nopBu> zc1@^$-yO}h>dcP5C?95#HV-YJZ^}|(pr@~>Mj#gYl4|*?(Yml)B$s$)Z=sA1S1dQH zUYVer)_k4#R64d-Sk%6*y@=UVO$$vZQkC{zJMEi)p)On^co?Iw0xtrkfgUvn=prX3 zhUAbyZKch#~iVhTBw7k>YzJV)^ z&VEe7MRhN4ZdOwP<-)6!EHu2aw=}%ET<9-?1+T^x%CdZ*XQZ#7rjwLTSi(Y~`WEID z-TBb(t^FrIzq^FH&`Z~&?~M#x+uX{zlb>2!I!n=tVdt6n2%6x+3efLng^;B1BeT0# z3|xTDYQ?{JTOWsh*_20zLOZpu=Po2JIO}?{gCM>I8t=5VU>IXfD#4%R1p4Y?&gE*q z!wr>ZPU6_8)uF1Mk=>LlCt|m{*wjoBA|H%fNH=BX$tRb;1;f`BhMG%i7Mg$97j7u*-iTUi-mxJj*J633z&jtlhIUml!#eh=^~?K;1AIJ@@d7v}9vH?JwYag= z50wYzG+ADcrS%t-qp8dl>@Q^5Rt!Qf6PuSIh+|uT3W<(Q0U1yK&o_1zqrqeJDif4) z^;p+qV8WU#PqXuNtgfL-*Cb=fD|+Yi#rKXB`r6S{J=n!?)lq%#xa!+3nAtHn*axl3 zx^^Y$V_&3Zg|(&rl2X34csHQvc|2AKO;~c<*}{G2aHUX=graC|^lS|C^E*aLeO*@+ zItM!-*mE9l?=F>xRo3&d!;H23p>b#W^a(S?y8kkgmc-tVCEQSo6(bkW}oke z0hdsjH!Xz56env7eGsab4-KIuyVmp%jr2j=+^wF8uMzotS25adVLhR+6fGdD`vwb@ zRfS4HJys=NP_3pL-gfQdB34k+<<_Qu5bLs8iTqiNSG>(Pi6q)y7}B972^#8D?blVM_8MqioO6jTg{u7eycVL*uOcfCA9Ra1a?ZS4|`)Va_3|YHd)1>dJ zL>KBr(`u?}48+tIT&dAtCc1Z2yN?ZRi)jK-l;u?r@-pq0t-W%^^0n>l!y_H-Yua&e zTloZFzjWrd{9??~R}K{iE?e6+(xGMI=GJb`-K|jC^=EGIE#NgruT%SD+YcMUQo6E$Ctm~h{o3B!kL`J@GY?FNYVzXQ7Z|~-0UTsS{9`D>= z*wyaW8ytt!^OW}-MVj=g_Hsu%Ov9z_-E7Gw?B`uEWhJJu4!D1~aHu@kNh40HGBMjo zN(RVmQ2IyRMVJs<-W5NL`a2Rik`jm-jc93WSzI{WS1b>)pxBh@Ro7>DO0oLrO+aG0 zqsDgUP^COK(&4Qx^k$G}M{BcQg&B%`hUE`ZalWHdeh4wr8bC8{jxKfif)}4`IxUR;+J}@#kGHf{;%jrKwkyGMBjDqt8 zGxLi^42b}uXkutlt$bC<=u}g;UK22NB+TvFm=Uj}xEMO#&M#VAq*~lns+jFXW&~pO z{HAuji;t8LHgV}sUgg8WV*ik^CF13bH)dK#9a~=-eaN;$jZi6dVlFkkS!oj53jTAP89iTC^o$iF-QC5qa>N6h zqS|*xH+>Cfzz|qh*u@d&sr0 zjC*N_^t!E@G6IQ#OaQEBT<7BU3{`zrv3VgBm_3!=CbKoM0pNed)+^<4Yt5?6>g8=4 z+gDz>e&zB_&F$-&+b(Z!-EigREgQGAs;yDHC&x#eE4bH?b=Wfv?bg;(kAu{tJ(v{=Z#~KR7HGFwaKJaT=hOEA~3C7-r9E6+UEAQ%a^w{ z$NEbFjIKg?17@01WrP|-cFmOZl~q_tl%TpOgG{`u#b5r|Ce5VHMlU2|+EK>a8ayE} zw9urPNzY8h`uotM6Sk3vb5`s` z%j_(YbOyU=3$#eZKF-6k-B(5tNC?W7Jtj@IHOGODaui|7pOCNw^gTIr&e5MXCfm#l=&5+xhst|quVFcB2Gv5#OytS;>;cCCOSRMo{3vG&0-^hHdAytkLSaiI4mVj0=~N<5^@f!-ekRdR)~T3HzxN zl#r#yKlwKm3|TQ^BI@xVoai_wONrL;Q4#MQp1xRPeu(uFj)6|BXhqd4QkUH0JR-?Y ziqm9Mr~qxNB6?D-4j3EYn%N{{G+m;D3eh2-fXdziEn@ODohlx`5^QY5uXvjtYp)&y zw<7ALX~VUqxUxvAUpOWgp}MqsQkhZ8s|U*vIWxT_y+2RZrSob@E={dD&8}wF+^6+o zY09E@oQifLbI zW!=k-BQ1}IUKuaOaj4pSioO=5@?`Glo127gMdO|nPitM;s2edf?f%0$4mLZ9HUgSMH{TZz^* ztLr2sBCZFEDW&r~A%(iRYB=t_#&qJe+8OVt&nNBW(Se26%+i!X$UAOtlxp))YwKu-)SNVeWiYs5Zo)x=#iktGAnlP%{$L@_6Cax}*6ctO#XAO^b7ruipGoa`#1u(h>b{3U}HC`}Buo(9`u~1Z7 zsVo#0FEzi3$%xfwAFx1q_II+kh-tD{X`No8OvkcvDXGfngUklYUmB7oRuwx&dg6NY z;m$%|v5R$-Ds+x_esF9)Tss|8Wq*lsz1jsiIXd0o7@Eb|@*xLryTp#9OmNfZr~{mX zdwPc_tFucOuesDG^l0vo&o_~TD|>a%z}LgyOae9A^B70J>bet?hif0L!y)9%%GK@b zucQfJy) zW2)S$yEywTB?>l=z)G{Fbwl%pZYam7AH$iIk-n}Cu;C5%W6Pzbl`G3#Q0H+ArmdC7 zd$P3?>nN&KR((XY&(B{)E92m9A>&ZtC~u@+7}XPrbIQV!Z$g~N)}mX>yJREUxKMgiVYWCwcw^TMAg|3V=F>;U$v%f`3l%CHmzy9YWdnVTbtXjTyaJ7%8eOC=}7i< zXOy>M_T;9BD11MlxT`sma>9k|sZFo<8AMdU~9bc!C zzxB$eha|Kwg?_bTNXsv6;Ehd1q>e_#d1sn*&vlLLvzFp+jIB-{8(fKVCz*B2H*-d7 z+qhx*n)MsoRgIzpMf9HK?3vLwBUcNaQ~`Me&iiU^mKVQ{{7csOxF z+H;!Y*k-`=Q;q18>Z}2~2E-(8e&$^nDIlMLP~S?1mckq zBx;{g7Oz>!a|;O`uQ_3m_8Jr5PPsHvEWpu>7qj|v8m(q%=9@~xt%H5LdyCl3_UY3e z$FXFiJJNzSsxRuN(NSI!M?pf-<-sBty^u47kGsXIT~5(CjM!rooh!1*$2qS_C2)-O zYV`4mlLa-`e6jseR30?WcH*yiYzwL)xQx-b@AJ5(wh56;V-^vgCVZeEPLfQ z01-WYp1iw*CxXdS$WZ-E=CnOA1!<2?QZ_}_(%2cIv?`Rh^^;TM$FC`<%uhKo&;-XF z;QN#Z3tdAv_6Y8GUteh$)I6`VoXDngOzL-graj(m;`Y^L@>O=(u`w5UwC1oWNN*4~{FR|GS=;D@kM zoC%i%a$1hutL1t=tTG1DZAs!hrydnHpC#QR*I&PTYq312g}-3#6sAwbBTRQxndvU~=NU)#G!s&D$CW+l2O^_N8d|G*T&>DEww@4gyD_-~ zifhPRGM0D(k~2Cae z_@p^eJ-aI1a7>ZbeNusYNY`1l$Dzbn9AidcW;NSk)^L9Q-( zUfq#HX5u(b=(yC}oL}PccHmv!6Plh{lg9XGR9bUr9Ko^_t$v-9ym3sOB2%F}M{&#B zhH#rV_O;8)RCVBY)A23Gm-u*dlzHMN-iQ;zFleuOvLp<-8ig|2BgHp52cnE#yf zcP+Jsl2u1l?Um#72<3jUzr9@S!;z$>l{`bO4?w8ZcHAcu9fEzHdoF#ZD&DTgXF_${ zt9r(lSWsc<+tj?d+Is5ODY>%@M(*hDv?E3+dRWRhOVevE7J?$%y}iRYqcq-nth|YY zW4y9_Q}>8IH^w{b^hPfw-6=fgYi>kIzF?V*#W~}UgW7>>ElZnI|J(mcfwMWlv|umAD8iJO=PiEW&Dnd zA|b=+(-T;*Q#x0*!M3@|h=jVG_#EY&sXYE&!!#liPJ2P0$vfdC)XpOD&YC8W)oN?I zXjQWrxi|Anac!11m+}fFw@I{zWoO&F1p6y{jzb&=(Pv4dRHJqZE-Ex*!O%F24lq6k zNYC<0o6*L}s9tU7tXiEU9j{0!vcdq)Pn(moeD&&uHow@Mb2Mu$?~%~>5}NTE@gt$>s{Ur6m4NGwyXQ^5L%b5lD{t54Fj^;WcBCFlZsQ)C{ZLJ#+Tf0l zG!txUMgOd}zmao|s)JEubRB`dAKl!7c7yVnb(>I(Eu>;hZ>?Jk73Dw2YEmstojmpK z%nepIp_^&ELtT3UfFH9OBW1je?C3gZ$4qSC@=fMO9z}r1n2l2jm8=67b;=>Z@=eP( zE?0-mF{zIC)uN-jtYgpWpnAL2T&{<9aA%Qr#bKTpG5VR>Zkvw7a30<2isGj%7-^EK z824?ZrLA!?eS4Pyk48YBqf*-))nTMflJZ{7be;a;Y$D@>eWDxGxP+f34X0Jd*p~dU ziK)(u9fyumb#N%L0Y4sfm(0VEfY-s@eg>w{5>F4K-R*>s$0n2qxC~9Wb&2BtM#_hj zep|(7vUDpbF_1ycy>gXsC5Ooqc76JnkEy0rf3@q1(;{(8M~!WymHNgsYHPklN+n7;S${7Fif|)wE_)=Qa52|NIZ;reO$+|5sbv&211ha6$Tc$+kOlj4aR>0Nu zfn&I-*js|dfGZH!5}F3LNRawx-UZ)EpfFON@`>F`cCIMUk1Z_eCV43ynb! zr8UP`BYuOL5bPEtz8#lk#=HAi7`tk$2YyA#%cS?{nmRq*Q6{vk`St$P1(A^q8`v7# zmen($KItfaRM;7+w@FQn@Tb7LPayRvoh0{3^rGmPP9Ye^s|=RBajnkrYU5;shpTK= z+Er&$Uhmox!Cr$Eb}Pxf8CMmu{a=HQ2V)>Y&4TTSO6nERY@l6-HS=h&tOwTSP`42Y|vE^hjp)w$rVnBrXd z{d3P9#RRn_ZNhp}6KfYw6*uny)y?JNIMaT7s;$)-W17#gTr#7NG_MAmjn1PorQyzA z+=Bs~h1y-{Gj%i|sX0!oHn<&EQYFa0#(B*RPUqlzRJ%x6xYD}rOC52^*|FA}S_u$+ z0+i4(_+{GIyn#oTstDqVia&mXHGS2M4*#@MeFfh@yGE3GfxkBM*B1WTn(PzDuV`bg zG|25TV%XW`q9B%RLIc&Mv!wc#qCiUrA#E#{uWeq{zH!5vD zbjd-eNU|Omc`;!*)eJ@vXT2%KCFToeCZ|ErqRQ&VO#fvzNkJrer42U@sC4D-#F;eJ zX-_r5Qe~orOsj8*FJmI4rRW%{F8bj}_L(wEK2O_9Nj{-2k)Y=}w$QOS8>>=<*P1tC zGvxSeLv*BSjG~ucwN}oR+D_QtejU7J;j{+s?;hyUCu-SXqwgl7y^_)+D2aF6oDr*H zYu`Qc8crMjld7s;y89lUnOVNGQ0n9Iwhq4H%k=3&jVf0SnCo{Lsk$%_^WHPq*G3mu zOfRM0Jmxb|viU`Ib=^vTdr#kBN1<T7R! z31zWsSVRC8+e~p6yR(^+Fk`w1H?;cJ9=Wq8x-@lc!v3^s+R4uK!>Ixf*TYf^=#B-mB2b)qD&=s%xOoKA?SXCDmD0S!RVp?G;s= zqE3-JTlZ$we7oPb@QIl-=SD@|8*$>qd7q{J4tlPjL5@kQrQJzg>b`pt zn+DX|Rvr-NxW-BL3MWf(&!)5H*RJ+VKG+~Itek@+ zY7;W8#YK!)6`waO$5@*vanvOotg>sC{yKZ_q)w7r_ev9UR&9->;lLEh!Y12JBNm#| z=W&UtYKbkR(U^c>?0`4B2l{11%nd}S5e1gJo?|PN3WYK%Xd}M2<{`_Cr+JDJYRZxig>mnqb;fu+ ztJJaDAw3AY?H^nkj%=f{S(|@Ev=*D4&ST%DaMF0azcZlMhU>K9&M5a7c7@Xp=O{B( zYNb#pCsb>e)C(`chj0R+` zHvieh0v!+a=bds-n7_~7Zs>lz>(VLcoBi=6Z|SshhJ%`zvG@sjIt} zbUJ)7*w4uGe(tHD*Is{Q^Lr@oFTMhMm%4U{5;8=EiyCoBgVDq_AvgA{SkmsCgo}T; zim##YC9c�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
    _Fk@|>kYh>g>;(|Q@zMJ?3WLH zP%edr+>T1s9a4|>Jmuw@94Yerf$zcHy1zA^8*FZmOai3hny0ak4_Q-$Fb}CUMPRFW?Yk|ebPkOOa^y4s}w7hw;zWt|AccQU@qEp8eLFTJjT1k zG><``2p6YK9ooaYT+Q{c117#1ySdWe>90_QL_<^l!0DZ6O2ne);I^5NwbI2C&C~Tm zx+(FStRyg{2O?p@o>t0?v_agL&gSZZp;6wig_!id%~oQ1nlX-Zb62jxOncsRU%!ON zVn~a)i9)}c{(em%N8@hw_{Y-v9val|Z_!bdqiXB*0b|^{>@mJuw4!GS^h|-C?Y7e0 zPQj67W|Xvnl#2v85v-{xMcs4!!mb}5hcDITj@~sn6>mj#j8(cDLD)Xv!S;|qLm$}f zQMcXDjv0~@W+GE|*DBk($BN^_m~%4R-ZRxa8n2p>$QPGvT^=I1l6GSfaXJ+1=N^Rd z8r_A?Dfyf55q+MfY|TazE&^E44=>1WGU$xRVQQLBT4><|)A`NW8~4xOztp?*(2be7 z*^5iP2j&;An}G4=cVpSyz!8CBIJSDLF)+?XGG~?Z2I~=eYTHU6!(OgYO$>;uICoSu zw9Nn_N=PV!<`q^OB4NomMaY&ze*vnq1-@{nlHx1Qq3sR#moBM?V|wZnA19a}l7M%N zvM!t5n4d&Omy(QB^Nz5w`(X@Y#BHred%{ z&u*F9YO%?`biFMqg-_zwYv}pyleb6P`^Iw4L2FiHho9$BP!_#li43=HXQ&lV9GyQ{CeMn?YGBs5`NX(uxBkH3_-pRH;g;ON)Zp4~ry}dYe>F zPc!UrI$22cnYqCjm5pKMF;bA-RKlTj(&~5{4wJ1_gqERO!S&gTvqrF{x=ThBfU*1L z%;L?Skq1Bo4-k)ekpA&df*y>q(DqFuVySiKDB2E6*;x7exEDPrCL=6S6~d$ImCAaz z7W)U(d>Y~K^r5-X&3mOdc}ag7TZJDIxvPd^maEo^geN7jD8cm`NEeMSNX;o+p##@A z6(6m$Q`#q&U>2|iZXt4chQ?`ewRnt}g-nR#5@ZU5ZjfzgZ^iPLHAFaty(6G%J?B#{6z5A z8ET4aEHSQdD=DcEpu+gCipA0=xaw9?W@h8jaY9YPA#`4Z8@Om}Llc&EOzN*bz(-?E zhq7wqRIR%jjJaRUUH|pg!n&;&mrO@ivh~8zwGU~C2v`52CX0}H*P;x_&M2@3ADV4U zmo2l_D%aYj_wZ!cK6?emI@_0TdptCe4QP=8HV$r74t|{V=h`}_gCfQY&b{3M&k*A< zxQwsN+_@KGmpl>|&%*ZhhNYbhJBbZvkisc`>BjcfEZXFm6jX#v+erdz4R@%Z5arv{ z(rMlFlSzJE`DZFpUe@+(-v`cQ3XMS2Y{>Xdaq`$shb28Wt{^#8G^x(AZtuG@m|Mu? z6@zAoL-5z(#_IF?E8ELxh%9#cySOsu-QdFrknD~|+oQ$7DsEmj3xZlx>5e{5$P=4u zq=2_Rny4)SvaZ;t3xd8re}5bkjvs5X7}TC=dxc~SYXWgEnyRtG_kCSI1rFNmrFP5w zOY0jt%)W9?eU(;5^Q6}v0sO}0Yz%vng?5guc-;l^Y*K?sNca;fkxJWC;SkOK3Tb!C zP;yVw6ajsbr}sfeqSLOdw_sLmZR`-K6r_5)n>)r==R#MEq1?QEj$m;KeA%lkfPil$LmlgaDCaIu_Ri_i_tjG91#@O0y)|CDkUw(EL`S| zhOWglTrrnsmo6@LZ*~)om@17YG8!=*<|T6q3<|1YfeeGd5qR2$Ta=nCVd?s|N&lgf>Ycx)c@*x`L3eEpHEQXa6O*pity#)94=Ujb~+YAO}}O^0V=X@sRXZHO0yR!dNvS-rZ$b3^mVYFJ?^?DRSj<;iwGCi z5<>D0Xb-R8+tO_Pg{dS{3Vwy)xR~+c`oJ zj8Zgb8s!$|W^Y`Ze_-j_ zESS~h%kXa9xES}AxOlmD@#@Ut%tdsA>djwxe)r-{`oiPqVI^t%Y|o0aF_WMe`?9&k zSzO{UQ``M#Z3M4g8(m@T=J=DTS;i61MqAtexqg`6|MtE2n|h5VKL^o1qwXW{GOm%? zkeYS0b}3VTuyz+oC#HTxZ?}It{IA;86v99(VH4DJnHC^(d6Cv&N!XLLzgb+Qa-e>+ z+pF{?o5QU>Y$4@157=z3kS(7nbKeIze(824%B(;QB}y5IXM)!I9e*iY|`ir{FY^>J$#4mgw662AQzTlJE} zBoiw^Pn$BHdpSy%Ov@alyM%+~VZI0dQ!EQFccB{X!2a0qxKYZN3@gYlbj|62@ycTOx+9J{IT1z9z za0vQEt5Z_%O->Pn>fOPep!}fb^hY~0qz@gbe?;?RT3)}Z?P*FC9B}G%CcRGjMx1Kb zBe9CT+Lf1Yf(6u~GI0>!9`z?C0DP{uKIo%P1N~gy_-m3veDxy=m2d)4=4RuIu@uBQ zBq3vdXRvkU`qJLA&99=((pobmC&qZvb@xqmFF(ts@u^EWIA*Jubw-!P4}~$7C>w^=xJlWh(ltu z%EarGG~-OA~KOq zO4WzaLg%*=^<{3kSQ+Scs=S+`ZUv%3B@w%X=gl5jQRtt>`xF|N+Z|Id>|lc;&_{<^ zm`evilg825gYEka*ZF9$j5o15b`!PR_WD3p{SJgv2)$&{sk|5y>wj)%dj}We%A;(s zk(S);Q$cFjES8-FgxPDM#OzB*kvawII2_zFg%jW}3_|jl`@Ae#Q zKbA0Z>lm4(tMOO(`%IaQ~0qP0%a_%2ojg>?&++dIAO zwKdRtMBJJPn_n%;b9S6xF-23nDfhs8wBeuW?^#hr4$o1KetvoMvLB6Y$8Iki|5R{4 zV&q)0lTuJPxeHC@WqY(d&4C_Fr#%Wi?j8&mhQkGN3Ao$U>YOzlkT$Z=P+uZO%~TT@ zQZnZL_Gn|(wveG^DS5YTj^i1ZJ_WX3dQLICh@@~>E>#`1rXcGEn^dX~MA^wzlbf_{ z-51!oZo?VGtL{luMg3NC2+{Y6%LGnm71g&$(v5hdef=K%O${q^!qy41(@Ec(-SqX^ zY;6uUU3s4R!c-V40V}gH_T~1qeGWx=E)CXD)qJpO8aVVRG|j|!k5*du-tsnw4ug&;v`- zKI7wE1}1Q<-MKkBfCymm@bfJM(kuz7PENSFx#JAZSlTL5ir5W{W=Y~w@$pNQ{ed$Y zf-4t8jiah5Jo{Ryh%&^fc$0wlulTD#bL{AzugMqacCO_S!I$NZS=r}Ax}>q_GxaAH zy^_hq26~8ti^JPPlPy)g5%n@0?c!=^toL&JIku5G6WJluSyd9tYYW#%U07H@7!Oy* z#{Izw$Wsx1l$n_zuF4}-_0l@avjL$f+avx8)RLiXbve}}YibK>$`BhRD;ChTL_4jq zhFP>VDP#`Euv-qX%M46L6P({cw{fd{N^qYNhMb%1rtP}nWTguAG|PTMTVWI+ht1J@ zqZiM=P1VkL)$=H&==3}2Lq9F=qkcf9NlUN4cL%Ru;R}O{Zff41;C@))l0ZY@J5nSG zMuKv%{qsnmLM%2?b}4zs6&=RL1Q&Cg%0kSp4or*FnCkVS9gS0}UI!V~zJg|^J#h7G z3ROSc+*Hy$`}=r*-9n~>UT{ZAsvcnK^F3y6vzWj1OLk`< zGgWzM)A|qBDHq$acwjT*tx^PurQ*);Do2*rc6T@ou+f*6{9BEd)~gg&M5lu|pylu+ai}uYNrdqcW=gMRdbvj^>rYmAd>0Q%hEEf=3X7b8JpV@|k zu3c)I3)F0>z45su#vHylVLUf@(mG@V3JM#duoTG%^twTrHqRhq3Eni!T{>+nD$PD2 zs`F;PBz-v@g^{*TQ9v5CuQ&DFNb`p#n7DhaW%sZfg)=0`7~@tef43aS#nI?Q2+K&F zURAljH)T4~NB)2s0hx=W;<<#h!=neMCdrKEqM-(&f57@?}*S>T>D$;a!(TAOuHvOs)C#?6jDsyaS$4ZmA8{K@8 zrFCV?IE=w583_#qC^-q$<+oId{&tm+U0Q%{%4kq&*(sX^aCwysI;Ed5Ng`hGOH&hz zHuX0xkY6Q#9IgbX3|rm9RZlF*zIk;AUNljhQBIGNzE(|CGT2InE2OPQ>A@TmR3!=? zSn>BFNy4T0xtv6#B(9E^xh~BvBA*D-*HVSjRobkea(>lYssoVV$Nro*AZ%wMvjS=} zHlD9_QIa*wi5KY=&6h^M=Ptvb?@IrjNdT%iJqOBn5LG`u^wJExX^mKU*^iqhPGR^} zR|%P!Ez3$z5^Q3LxK=q;VTf`7?w)8sA3=Q%FI`bW4HP`fs~b!QMg~VJHnO4$hMg9) zm|v3WgP`Tun(Az5=g#X92Z7RX;B@A?@0z=lx=tRn+uVrCLW>*jP1y_;#MAh?E7jO; zq`p=q?js#f8nQ&XRn4s`)nGN!f_(Jsp$EE@6y504PLm43#;R$llLeG1wi!Raxwn~* zfktURu^3X_93#Uy&e33rN-@99ZUqxsq7%DQg(D%!o`=2-4FrDU#!RHlSsQ$sc5c|1 zEw+2*M2&#ARvz?&t_d_-fm}G+MyvH8^e`0}nYqu%a@B)7mHG;AuSIE#>A%X~o?-|~ z-yQ9fs2#F5U_0!>)rWeQ=I_67y*Y2s%LBcKw{Dli5T>9ioi|fSRrC>;XCLfdGKFT& zooksg&DI7x<=RHs8;z;fa%w)p8BQ&dw1l6+t)wi-&a1S&{K!lT|Dal&n5nJkMaQ@% zOxxXsn+WN0@a{?->Xn=GpO{6jZZGX@40r97A*PB%86$TF zr?~JSm#9>{#Km7Uv1`(2Z+G5adM63G{W18iQl!^ z_rk6k$XLojfg_(&NSeJD1%l|#AacAB_Pg0bO#&n~UqE|CBIF}*ILPJ_7MJvuYSN%$ z`LkOW4v>Oif40FI1!}eYU8u5^&YtBEa2b=2Z?StF&8(5rMEy}v$)iIdH^-p>U70` z^u_4~mqXt=y3J8I({Yk1|F*fDm2{NRnaw!#@+-Z9hT-Jbqo8h>;}4H%JxBzqHabW~ za~y6Vpkdcms^}R5f>F)kePU5g{7#gg*O=v&tQuwR+D|p3Jj^ZR9oUsOU7qzR?wQ{Z zV=*#1?e+PYn?^{ypDLI+R+lE<96h8*bEPJ9p&E`M0PGHeZdCM3vAeuY<$*EY)V_Bu zs@z2}715b$+$c;1CnPZ(bL-?UE|7L)k1oe-c5KPDx}N)N6E^y)`d%`1p;o)#YVE!; zD%oW{A{|-dyJRt0ZN9>Dl3Zc`aTG1HiPVI({@w=F;#_%Dj27Y!F6TnA_qE}+dX2+p zS)>VB1cGU|%yxSjfNJMiPkqMl#@No2X{DGBuu_QIc7QOq_=sn|YpyoZh+M?tFe6W0tC0vn9 z?8c=gIB=!95bjfAm@RV3nMNzjMhBzI8-2=oQ&MD3qFUa4cre;_#r-%gqg*|C63D9IFNgl#b+RnUvJwnvbNe#mf_dWrB$-Qb{Wu zX#z?XI--qB-1HQ0;Yk!LXjN_#>CuvkKhIj(G2uH{pY;0YRx^kiCixSJXn$+Cw!L9n zVpwu&u;$L{Mdpjp4U=Aq(Bsl{5v%GZHKUaJ`7UshN8Hk#>}WA-nw%5F#P4HBPCJweo?-PZIr|t0zSc)3mbjLMM6t{K zI+bpsXhsK+i z)d+YK$ZL#GLsc#9+J&+XzDxD#Nm(!dnb$s&Ql6R9C?Cx#1t9p#<_TB1Ibe&T2yR!7}H{00}TyA;-6R`D-<>g zRs$XFmQusjm*r&+BaYeT3cIOPk;5)#P7-O#(8)S>l?P7Hvdq&D%>?!!sY!X&zx$ zs|-8d3U(hbH|HRnj+9e7<-QlSoKmV)Q=^b}kkyh%6LfDx(Ndm*@i#lZBRQ8#-37E3 zxoM*3%14lrX%1mIhmqIe5}92cn3W!eaTfP832Pi*(9CYZd2ElH+&EL&JzvErqgUJa zt;uilr_$@8wKlMFBBLx+Dr^Ud66%L=O`TEj%CS46Ir69CMoi?~GWPSl)J;4* z&oGhjAmZo&DGG^wm7(jjoyp!QVD za&P;uPC4(nEWV}bHenh&ED1$#sz{cB$I?1Q4wI!o9ed+Jcc;IA*1za_Kz$o!n%2rX zx;~n^ZT22-vg{P17zAcRUXP@I9io_4UX*DKWN3}{E-}zv@uqOREP=U|VTD;A3~#Ty znSTPAmD-=yf9AP>GkA17KShhMI%w^#4_rKLd5X?yoB3{wn)NrNx7QdYrWbuV zHM{~c9CBl$H@o)=^-={FF#nDocc|^WeIvu$Y%iOx`n^S}?&~Wo#xtCj8C?7NTLaW@ zM!O3=OY~={Zpt7d)5k#d$7?Cr_&BK37kHlZ0u8s}yu6DaWj&1HxU(|uf@_wJ!qVj( zY5UoHj97Phc{wrEFM_%9t3UmW{JIPE=weFj&xIsuosFodyKr6v!&3L3@H5ZJ50Mpc zFxMZC^_#7k;tIi^P>*Y}6@p+MS4$tSjbFj!cDrfdtlHSNRbrzl=%?t5@l&{VM^vs9 zCA{zlW~A{*2bUYFP@^UG%IeboUB6{ zW`aiJBX?g$ee}$+y=@BY?!j!z-$s9GD!NLcMRV2Kaz8u>A7V&oc~_0XJC#NS={RV% zy}D|8iBtcmtwDcuslT}c8;kS`T6*!QHD2%U3`m|_L;-~1?jCoPZU(=h&(a<)z-WYDd*}BmhnSII3)j=^_iZ-A? zBb+M~z!>ZAbq6ute^bAWe+r{a=z|o}O)NdOQSN7!g=mA~sZX86D+Q!u&X-J1wsqY@ zmTX}!M%;ypkdu2pF@5{2`C>=SY}y3Q5vaW!TGVjVd`7UV>O`hr-pJpYj@+y%LfRcs z*D(ym$^{o`Y&J=O(yI3qP=BqQ@}9a8uQaH*0Xns$wdl9$Ku# zF~?iN9YX7F`ERgF6});AqBpqT>=vox{nnQ18<5zmQ>IEF88UHU8uQ2K zarlxX5SIRc{p|K|-QPxQW)4NnDh%HbUmSd& zqk$49$zPOZQA6JoXYiH*HweiLr)!&-{t~raXzBB3gd!Ygd`9BOy#y1;L+Y0!#RYz* z5`_`%$c@&a^AWEyWYqZQJD!WUZ(~x>Qiwb6_DAK~BkZLCu81M-YkWC1AH?<$!WOkOy_)?3J1s4*JKN!Jcv4O76Rm3S2h}P|nN5P(f!Nqv z5ZzkpE-Fb{uHk`}$9U0lLIlyGafhpgPMzGvkT2q@Ft=Gm-`Gw2gx?Yw;=3j^CR~xU zR)arAH%PBTAj0a75y;JviT5lPM?(58^9Dz9@mtf5h0AUQIsAc<)9^f_wG%o>yuL{0 zFJCUFzq7M(aFO!u`x{2%A)CnZWS7bl&KaUNT`N55^c=Dbtc2X`Cnd1-@rBWF(<{%p zkb=ycTUW$IY{VF`fR;Y+jr4*y;N5JW96}1U4R`EYwom%ss}zR}sX<5f--^JC(e@*# z-;ZxLWh1o6@QB%TJ-KJnoKE1Hun-8URznS;Ys2coo4SPjuE7_ExG$nj5y7v3O)G;o(^f6m}wc7 zM|%WHzJU}MSzxQDsFPU#KHEk{EcFNve$8xsvrox(ASb5MY^ri#R&XFZiwWdFx*q~k zJwqiM=jH-RB{%;i>R{WtMA}*OH|>-3M<%`p4Sm$DZ|}#Zyul}&41J1w$dk@Sw@>iG zw9#RR3IdUD&MncaH(S$yPfc3a2V1vy*JHAo%7&`wPO12p_E2pDeHjMy0aop~V_7!U zdNhl#{;*v`V$;J<1t$-N(TBT>^SxUrn>W8m0cKV{Gb$X2+nY3E8o9U_EV&i_)lYTK zS6(z|{1mB`%I4gBr^KrO$FAL=#5;F`cP6@~V;0367(p@Q6u9~vYxWmqaKPHO{D{c3{^0+LSK#_^_lRHq{xD4dK@I#-6ovHoV}fQbe0=T)H~3R{)s(1Ycwh0BNl@Ub@*YTJ1wici<;f$&oC{ z#+4z=Hoar6+RO?GFDd@ky#oQW)cbmAczX-|u+5W-o1Qx*n1%Sdc5g=&t;Rd#{y+RY8ExN%>= zW?##pTrpEV$I57ME3Fx+so~MkWx_}pyJ&;p)K=COZI@eSg2fi;>k-v>IkKdx8c$+| zbSXZl#5U4)5<}f^D77}_G-zJaJ}10JxOR6T7u$e%KZ^IAH9}LfJyRm6S&g|l^Zo%% zhEi`R_Bws9C9fM$8qJknDQld8uo{k^SdK|CkZ`UT<*mG&wXB0BQ^HxNbb|brdgeQ= z3~#J9jmX3}2McI8 zw+VG_Mg~!>aQQLGwnsR1{8Os`R7f%%&5^?uENy5_%eh(5#sU~zAXMNIrABb;E4h{Q zCbL!~29i49f}E5MwWT^ESyP<51HgVkGIM=o2;4b!=Ty6mxj5dgJL$GhqprBAwqu7- z9E@ojODs0{OX9MRN58^nCVrzjuC~n{)YqMLv8~ z{_RgG8LDjyY$IYoDmDVcl$)(`{p%m=C26tL=t~u0;b;X_fwIJC;;<>DSaD{vCU=$7 zCc+YiDn_#zTaH>Ds}-to7NS4b4COGke&`=38E^Dg#Ch!&m6sVW;EOK>eNAmTwM%`j z#jc~DO`g4a$2gixk;V!DM+u4>1bqAy;qw9`)|t)ZdxQcRGsqdoT@WFgvlm{D^BWHq8`` zM5Nrumzl&NJi-;~pKiqrwSUdQfvPN!(Zod1;f84xJkkAuM2MfgqckJ zgP*-!jbZqm9#=5@UcpTYhTkW+cz%BNel>>S4|rU`@LvjUQZW2s!Nv3Qv%gYf82*UI z6%2peBX&KX)S46wpAcL;KR^3;HHP7T=y3(ZHw8B-7`|U{@%*>kvj@}|h9CC0g5j?d z+@xUm>jf9j&(FR=jbZqkJg#8)I|Mf=82(Pd#q)ocd-mOG48z~&aRtL~7Tly@_$LGx z&;J(p>?hS2hTrOO1;hVIaFc@J|17w8etz~})EI_;)#D0=-y^t5!SL@0E}s8)-Lv7Cb2WzH4|`m}@XVv0{u#a?xcw6hf0f`Sg<=;5Hz^qYkAjQ8iJ$!^HHP6|@wkHFKNsAjVE8Wt7thbn{!)!$_^&;# z5O~9{*^?an(SnQTf3kb_F=`CMCp@lT_)ABAeuiHnxOo1@-LsdfF$}-V;|hk~D7Z<% z@Q(^Eo}Zt+NsVFn%^p`U{4T*w3Wnb;xOjek_M2)9!|(C9g5mcIZc;G(dxDGS=V!mK z#xVSc9#=5@cY>P~4F5lZi|22R?S6ff`#0Um3_sc93Wh&faFc@JrwA^d|5MzvPgP?W z{&bHk82%i=O$vrTS8(zCpXZ)EU5#P*9*-*+excwd1;bw~xOjek)>C5`UiP?x;Wr8n z^y%Oq67KNx|@< z;Ntn8>VEsv)H^Wzzj|E3@ZEx&6bwH@aPj>7+e_*l7{29k1;bw~xJkiqPjK=4{Om<) z48toPS1|ku5Bv3J_!9-Ue}du97F>Mi@U#C-#_XS9`13rjV0c|{lY-%);NoxMXOE~c z3~zc|!SL$@Hz^o?z2M^c`Pm!P7>2*y;|hVl(68B(9Q@IOi|6NOPgY|X{y2{-7~T}z zq+obUaPj>7Y+H?Cc;s;f!{0BsNx|?B2rizVpZ%a3!|)G#T*2^@zsRo-!yhBKcz%BN zv1$y%AMbGm!_N`iq+s~Df{W+pXU|h(82$o}D;VAp+@xUm#e$3H=Vv1|hT%PrD;R#g z;3fsbZxCEOKR^3cHHP8u@VJ8EcM5J&F#ImT#q;yCcdIcB|F*{!41c)i_m|U#U+v5s` zpV{~C&+xMZ7thbno~_0(-0`@A;XfAKq+s|@1Q*ZG&;C@6VfaHHS1`P??BAc^Rl&vc z^Rs~(!|=Mt6%4;aaFc@JcM2|^pP#);jbZq=Jg#7Pe#O5(!wZ6o=jUfHP-7Ur>2U?a zza_Xy!SHVjE}oyCy+@5<_`M!iF#MUT{{0#LEWyR|^Rv%ZV;KHik1H775ghoNgI_GT zcz%91Qezn2^SFZH-xS=WVEDHL7thbnep`)U_;)?7VECy6zdj6qn&9I3`PrwdF${l( z#}y3E32ss_d_!>Y{QPWQjbV7v;|hlVncyY`!(S%2cz%BNGBt+buk^Tr;TNp=^7Y)Oq__?E{N41daPKR?5tD!6!le)d!~hT(tWaRtNg6&&oC4t}5D;`#a6`_&kR zKj3i%!%tiH@6YgO3ND_XpM91Z!|>;LT*2^p!A%N=pCh<2U?aUBOKXhA#^)o}ZsxQDYc>zQ+{|_XIa77=Dr9;`#Ym zUyWgS)#D0=4+J+U7=BD}@%;SkOVk*KANRO|;jb3lq+s~vf{W*Wg?si&HHP6=dtAZr zzY*M|VEFq57thbnen5?3_=h~MVECs5Hz^qYX~D(wztuf^n;OIL&v{(I@b3t2QZW3x zf{W+pXYW;G82&wvD;WNe;3fsbe=fLq{=aa~{!)!$_^&;#VEB{vJbz&LlLZ&g&(EHs z#xVR;k1H7d48ctbhVK$wJU>5sni|9KXM0@1@Y4l1DHy(6aPj>7>=|kd!_V@#g5isT zn-mOR5?nk#KkKS73}5xQg5ehm4mK?Zf3e`=`T1E-jbV7%;|hi^O#J>bd{J=m{FmIb zt{TJeRgWteUKbqf8x9@{E}s7p_v}$MhT$!bD;WM3!A%N=UnjVDet!0PHHP7D^SFZH z-xb`XVEDa)i|2ozd-i@chT#u*T*2^D_Wk-Z{3(Kq=jUgis>U$<=^j@w{6&JB6b!#m zaPj1WUu3-3U1ve=e{yM?M^YgQ>S7R7{jmH%X|GMBN1;cL_Ts;48xM%NB zV;Fw7#}y2>?)dd*_@e|D&;KO%?4#8fhCkNh3Wl!R_>%<} z&(F`EqQ)@%RF5kd{yzjaDH#5jf{W*Wt$X&(Y7E1#^SFZH_X-X=v4h_yxOjek_I@>n z;SYFR!SFM`#IFy-&k|fbKRGQa)|uLv%lf7Lx3s4)z$dtAZrhd4q9|3|^?pJ4a{f{S$ye)b14X8#1kAN06_;lB|a?gR&aL~!vp z@w2~GV;KHBk1H5{`B!?HV)zw;i|6NOuT*0geznIH41b5<5YOx2?-X1-|981(->t?l z{Cyr*F#IOLO$vs8OmOl1{Orfo7>3{CaRtNg6&z$z2ft5n@%;Sk{b~%uAMm(>;lC6d z;>{iWVZp`o^RvHFV;KI3#}y3!+E@AgW%$1waaRtLK5FBFX9K0yFcz%Aiq{c9O z%i{`$R|GdH7+w`zJU>4hs4)z$dtAZr%LO+n7=DG|;`#a6E7cf=U+r-P!#^yzNx|@s z2rizVpS@9yVfe>9u3-4L1qYqO!S4}VJU>7C9W{pG_jz2w@YYv*`eb-paPj;*?%9jg z7>0K}u3-3efXuIXWy#EF#H`JS1|l#FZb`y@XG`j&(F`kT#aG)t30k? z_~n8F{W$m)f{W+pXRlOa7=E?K6%7Bh;3fsbZxviTKR7>|JUM!@uQm1;f8DxJkkA2Lu<-&(HoqjbZqM9#=5@XM%&w=->|tE}oyC{ka;$ z@P|FFVE7-s!qX4Kh2Y}(`Pu)h#xVSkJ+5H*yxDo}ZunxEjOo zTRg5{_|n&ST4A^=xOo1{?%5SJhT-RXT*2^d!A%N=*98~P&(DTx48t29S1|l7f`jkX z!LJisJU>5sy&A*tw|QK_@XrWtQZW3pf{W+>Irr@6)fk5VoyQdn{};hc3Wk40aPj>7 z?7ylp4F9^v6%7BW;3fsb|4nf5{QT_C)EI{U!s7~t|3+}o`5gQa!Nv3Qv%ghi82&qt zD;WN?S9$tm_|pX!&(F{Pi5kQ3T^?63`~`xW6b%1U!Nv3Qvl%sp;Y%J@F#Hn1!OrX8 z#|0P9&(B_}#xVRck1H5{mEa}?!><-xJU>7CS~Z5@Z}7N+;r9v-I;Df(C%AZie)fJf zhT#u*T*2@k3l6c<4*nCt#q;yCKUHHG{*cEN44-?oryqvT3of4jIqunW)fk5F^SFZH zIl&<|)xkFe7thbn=G7R67d@_E__pA{KOMX-xOje!J8Td6yZ28peA?p*hW7;rKahj( z2rizVpB<<%41cM|6%4;ZaFc@JR|+nk|LcCpzW3L=e^Wjg!>{qUg5hr#+@xUmUkNUr z|L0ku;|hk~COG(s z9sDzbi|6NOKdZ(t{0kmeFueC8et#LB2rizVpY5wL3_s>^1;gJZxJkkAcMC3_|9jlC z?^R;a?J5JU>7CWi^K3|Lk!E!>d2$=Vy2zxOo0G_w2SB!|)>>S1|l4!9l)q z@T&zE&(F`kR*hl!8$7OH_(udcDHwjE;Ntmz)IEEX8pH6LJ+5H*oq|K|p@ZKgxOo0| zyJx?t#xVRIk1H5{`j7kdXZUWx#q)ptBX&I3RiQhGVXmt}_Y1>ZSA}ZOF#P{!jTQd3 zXQ*#v_*ouTFnpijCI!P^Ah>vap6D7b|J42VjCu!#FL_+S@CyV7pM!%J1sA_RKU-2` z7{29k1;cBCn-mP+7F<04x_dTMV;J7>xPsv?72Kp?_$7ji=YQNid#M`3@XI`|VEAhV zhuC8Wf1Tjs`T5z`t1%3}#^VZx-z+%P0CMn82ri!gE$-P*sxb_|)#D0=e?@SUg5m!v zxOo0wb-&z`Qv zFno{46%1b%+@xUmis0h;`Po%9hT&@-S1|k{!A%N=`+|$-Uv|${)EI`>Jg#8)jeR!!e_wF$`8fCkf{W+p zXMdo^F#JJ}D;WORpYZh0@W%-*o}ZtcP-7VW2Od{2e3#%R1;bAhTs;40x@VuI#xVRj z9#=5@HG-QI48KZns1NAi?-g7e2lIXI+5ahH_D?YU{T^2^+&GloA(aPc?&eciKG zi))>coX0TNHcQzl_!-waqcIF~tuvA%8RlANG(W>!+blIdKjT_wG=^cRb%yx`-tc?= z|Ao3|LT`%hp5)+<@wkHF&k!7PART;{;9{EPXHQdO82)UJD;Pd6IQU*2{2al>^YgRk zsxb`T=WzwY4+?HlF#M3<;`#a6!)gq}FZ8&A;gR4b1;b;(#q;mFXM1W4!*@KcVEFBV zL%gShe?xHb{QT@4Y7E2g_PB!KKN8%eVEBWAi|6NOf2_tZ{NFsTV7T>@p8gsBD8a?^ z|9xG)R*P%zrT7m&<63+)hGDM72i*T}>+(Ix(bh*R8e{llJ+5H*S%RAs3_n|NF@2tN z&)RAX!>2v2VECnin-mQHGr`64^Rq8gV;KGlk1H7d_@DCUi{bxCaPj>7>>sEx41c1> z6%7BJ;3fsbKQFj={$Fs8K_}_b6!SJo0_V3T|1A>d^XCK#4`MMb1@VJ8Ee>7eX; zy30L#nvB^$!SH8$T*2_a6x^g>__czIzlooHvl_$j>pZSt_@@Pjct8igRdDhA{OoON z48uR?aRtNg5FFwG9sEwg#q;yCcd0Q9|CYxU4DY_puQkJaf{W+p^YR1g+%Wt@9#=5@ zAHLSl&+sn^ZvOv+{Yn^j{NzV2}a!{7LNKR?5-5#0U>hJRRa@j6c2 zzV562W%x0VD;R#2;NaJA@T&zEf76e+-+rUK!~O||f6U_whR?mhe-p#!1sBi%9QW+G zY7E2od0fHp_X`d+GadW`g4;jA@Xre_UbA0t&wf$H?4Mxx-+Nra@QrWv-^B2|;Py{2 zJP=&`n``dbZ5gwFg5gIzu3-4>-|l~t;olJ4{t1Sk{6E-x@3_mxtN;H@!A+1AB+(+0 zU}hK$MuITWlPC!yT9g>QL`2#55WR=dMYL#96G3#NL??+J24gT7J;oSAbl>ZI&w78> z^}W~p@;tBaFJ9lr^PIod`+Bc+ud~lS`;>d1eXi@gsOx*YlbcR8<(g0Do^S@=Dc2Z$ zmt21A$lYDlz<&*A@Pik`w!#m|_4dFY$>sg{vFAQfO>d9*Li+bwf9F5TmDh6TTjcV6 zB6n+51K$zO;AJo3Hp~CF&dbT={^Y)0)xaad8T`h@(I1{H*V_Y6|NE%xdmNCPK{dTS z@J!(hUQDihW_Dg&F5jnNo?D`-frp1PcyqZjm$LH~a=HIcJ-20518*J9;BWjP_659v zT<%Y9!Kwxx9M0gQj;uS*~2$;rxnR?*FRiUaM;0N#P9s?xnGR;P1)h{^Y)2 z)xc|oGx!#{#^77!a{t>rcY9R>-xbc_SLMp_@BErv?*9+Zyo1?SW4UXYfsOjlnm|<^GHLZ7*JJ1H5E7gAbBx3_e&c_vg0%Tx|n0rXReQ();U8So2RPB2%Zqm;C{Eo z{t?UN?eFio0aXn=eK>>Xk!uW|S1$J__m!#!oTjgBO!4pRb%3m&^UT^TxJX%nduOxj_o;>e+dp=9^#t!q>jwPzs5O{bvgTF7=7`%pDe*Gc0W>o|KAe_O6 z%a!*>=Og5Ld*E~B^8fkdey5t=9{7TA2Hzmp7<{8#zE9+Cs%qd{!WsOYT=~75^ZRnW zJ@6cNa17=9MDB~K>Ft5%3}^77a*e@@$>sY*ZtpHCLR^mdp2v+&NVZd|o(%ua_(HGdYiu%l*mSP}RUUhco!^a*e@{ z$mRaz9<6HN$HN)?x?K5Pobx2P+@IVVRSi5PoWV2R8OJ9)lU(jk?sHWQJZm_EzaiHc zyntNpPj11g1|A&F;ML^HocPYG%jN#$zFXD6YlJiSXL4oDC+A({a({9^uWI1k!Wn#w zT)8gI`B=H!|2WSbU)8`Tg){hKxyIn%%jN#${!rDxmxeR=cDcsjJLGbIa(7lW@IB!S zenzg$wcG?!2m8?oV#Dss{dEID@yAYYg5-F8ANobK6xl@Q&dO-e0aBh zF83$*P*npz63*aPoBGH1H;d2+cwx$~qukHNqLZ@L#!4W$jt#MdWh-p`Kf`s)2`vGk9&eGS`Ij59D%x zazCtU;Pt{8yqjFP#@Tsyx!ivb&+S>&z@x$$e2QF|lim4Lx!nIW&z)Y?z-NXt_y)Q1 zzrXX1a=Aabo2nZ4mT(52{kM30;dA72|8qU}yQ&7hAe_Os%aza6&UeV={^ahgYT$dq z8T_(b`M%Nl6}jC1RnNUv)xeX&8T^)9`HhA1RJq)r+}l+R{BAgd2i+U{A08~1`;!|| z)xbl;8N9PxWAM-9a{paC_w%X--YuNL`^lB>lb!dM%l!}V+<{dMd`LKh7r8I?4?I*Z z_b0b#RRa$TXYd+wjlpZm<^J7ulv*v;N}AU9735eusa*rl+sk9w+g(Q~_C?QUY8@qi zZmeBBN8okB8N7{LWAL_e`T0d|yQ&7>F`U8o%QXf+AeZ|;=(&fg8u*cL20trTKC?SN zCztz^d%miHUkqpP2Xc+UAIjzaJxAok1RSmpjID>oT z%I9_W4!E(7jxgk{zJT#oaE6FtmuPm4QlUt># zfmaV_@K5B*T&d2R%H{s#HmhpjpN2E|5V^+SL*;V+!#sC*RRbRx&frVs$~D{0m&xV+ zhE6-o&%j9zZ%RTp}ss_F)oWaXK9FH%&f?V!D z!gJrLYT%W_8N8ufWAH|Dxj(s$s~ULIa0dTEuKY&Oc{jP-pWNa@WgNi4}2oFAD&Jw_n+Q#GgLM3OyLY3 zBv<}Favm&~`;!||)xbl;8N9q)WAF-cx&H{yeW$8{R}N?J&T{4at@F?1a{paC_w%X- z-YuNLf0Qe83^-pZm-~~utg3;p2xssMa%HYO=NIL2e{wHXHSnw93|?kj96#`~a=HI< zp8IxH1CI!2@G5fUniS_%<#K;=t5r4d_re)`v|MBGF><*-xnrvu_=Io<-zrz;B6hw_ zF83#QdsPG970%!to{aqu?>H7LvGKi1|Aj8;6vrgn&r-i$>sj!4zFt9Bf}Z|8@a~dQ{-}ga;H`` z@EPF@9xy(hU+_S=-X3^9xqQtCxv#3Gw+H@uID-etmG?~N!E*UNksDIgz(d0sysTXL zUAgmea=AabZ&x+&h;Rn4DOW!8I*RWS;D_b%V?yrl zs_E^4$A&ZbNxAa7Md$Hy`96_*s;Yq}gfsYcx$=Lq^CY?4pWGW&4Ll{B!Jo)A2DhH# z*v|dQ^{Z;&f#D3^Nv>S)@4T~Ix!<FuDAgkULy8<$8bTBf}Zo^EBJv7(Am~zE3lG z?sHWQJZm_EN6VFUMx2k9%l(h>+_6;+d_p*b?U~qq_zQBm|7@O{y{dt~6wcs<<;t}~ z&Wp(9{zE;tXjKCb3uo{Oa%H__=Mi$bKe_KzHSo&e4E~{9Sufdn9l6|}+`3f_ynZ-? zx0EaEB|DFl%l*l1Rn@@ThBJ6~x$@rXyoX%wPj1hu1|Aj8;L&pB_;fy6F84pibH`RS z@Co4zK1;6rp2qoXx!j-JIaLjOUO0pQB-a>xgyKD2_wVny z0aXn=eK><>mun23LoW9x_r@m3(7SHFC>@ylN(gkzzc^n_*-&~!OO_y{^XXe zYT)I=89YX=%){?|gIw-^qvvj_YT#SK8GNT)nRChcF1g&F+}%|T{MT>>KPFe^mvw$z zF83$*L{$Ti4`=Wza^?2~&acYl{^VY(YT!xX4F2)6as0y@$o2NXyUOLyEaZNnn%*9G zk8lPbDAyQ#kX*h`8u9ZS>t#+h=Y`}Ng9pjw{)0U?q^g03hBJ7EiQHymaF1N>Pj1Gl2A(;b z!Ar|E27gm7_b2zQss>&zoWYyPH3n}km;003qN;&MhBNpLxw1B_^JKZ)pWK^O4LmiR z!SlQj`yZZHF83$*m8u4wKb*na$(6M+owt|E{mJc6)xbN4Gx!&B<@*J^m8u$e)o=!%DAyQ#l3eaj?$=cfd`dWj7ko9gA6`f<_a`@~ zs(}{{XYjgmW$h{F_2hDYazCnS;0?kV{9C!QcB1o{a=Aabv#J{S+;9e8DAyQ#kzDRi z?&7Kjz9gK%drXS`5AP|L`!}BJt!m)C!x{V+xyInX%H{s#{#Mn%_lGn1CAqS8jq}TL zxj(sAsv7to;S8Sljo3f%SLAa4GY;<5|JGys`vmyxa0Xv5SFSg49wV3gle?j+fo~3H z@MCi2GrRNSa=HI}e&4=Y-ADNA;S63^t~|e-*OSZr$^EFRfj0|2A?aJ`;+@! zRRdoT&fvevH3r`+m-~~uud0C`3}^5sa^*a=b89lsx!j*zzp4fv7|!6i^Ez_5 zKe=_Q8hHJ12JaO4Sa7ngCCVE=M_>(QKFl*|3ey;Rk}uZA=DExGc0ap$RWxj(tLs~Y&-a0d5#D~=zrT<+iBa|5ax zc=~V#FCy0%JX9|CC%0%-0}l&l@CtI}J6q=wa=Aab?^HGL%Ha(Dp&^oWZxqmHEM)Z&r zoWZNfl{rM5SC`BE$$ht~f!7FU@P=~bH!98>$>sj!Hm+*mO~VcgmIT`JC^P%l*mSUDd#U4QKG{a^>12=Sgz8Ke;!m8hA=LgXelT_CGwg zT<%Y9o~j0(FPy=P$d%Vr=b>`BKeGWgmBShQL%H&r z>b#Cz?oV#rss>&^oWYB~7yBO`CYSq@TcWCghlewG*AJpU{0q6czVUe&-&ID=1> zEA#R>pC*_4lRLetfzJ$Q@E_zFgD;WG{mK2Ys(~*LXYk+U%Dk`6kI3cz&|`;*(Ms)4r+XYj#t<(#PVA#%AtxkIZO_=s=@A1_ztuy8&> zF83#QVpRj59M0g&XDq0p~Gtxj(rZsv7v_a0WjqSFUY# z9xs>slY6SFfhUAB_yxK0KcDl9a=Aabm#P~0)o=#CAy>Y0cAhMk`;&XKs)475Gx$BZ za!$heeYxD9+y_++{Bbyg2Yke9Wn=I_x!j-JbX5)96VBi-$TbGfCYSq@o4u-mzZA~k z#pN1j_>gc0UoF=de2rZ0Pwv{P1|Ad6;Jf9@IdA8CHSj;e8NAUa@tD9H%k}oaXUpZsgxoo* z>Ft5f3uo|sa*e_F%jNq-?t!WXemI=LZ_70Xzay9Xllx~?1HT{6;7{br=V0enYx@6v z`e|CfH6+)ss(}ZFGk8Y1@;TUfCb_)*X|tC7i)W%az{>J0ByL`;$Ais)0`k zXYk+T%DH#vd*yO}a`#m=@PpwDenYN&PI8_sm-~}@v#NoohBJ84ejMv%O&RCK&?oWY~z%I|5MkCw~*kMZ2GRSkSXID;RTYYcuu zF83ejxhJa{_~~#4zb;qK(>YI)%l*l{QPsdx!WrDJe>}cox!nJl9XjtJ$9inP2Er$V zGx$-t@}B8DRxbB{ZpTjl=RLOj!!L$2_)WRS;3;ysKe@N68u*=X2CuYJyl28I%k}oa zhsovlOmc^-ru+ud`N(hv-zQhzGoA03%lC=g162+Da5#hCk}Kb*IZu_#{mH#u)xhtD zGx5%`&-yzLkjwoCdTzR^2JQ)G@IJdme|TTH+27gJeG5E`Jx&NG=o2#mU=M87@LUQHz1kQuxa{s{tI_yW1c;0xt)|BF0#aa99f63*Z;a^*K{&Ns;A{x^E= zrm6y6 z*BJamx!ivp&#hb4!0U%Icq_Ta;H~9ye{$PYHSqS~4F08DWAHw5xj(sms~Y%#a0Z_! zSAK8de3D%5Pwv-M4SY&CgU^#IzgKfUUoQ6_=%4qdt3LO^J>d-gs$666{BpTJxvy0< z@B-ls-cYW5_u;&eT<%Y9Cztz^+rO%T4+>}S`*LOeYv&K-dVAnO zdTq&{8M|vZch_((pEK-=JvyJAZuZz-gBt#`Ts~%R@!YLd4SYwq?i$W}^1sAqYYpe_ znkn5iQ`)Z&C--)a-?1LsuMhBJa{2Y)anC(b)xhJ!8QdDh^Q632Iro#x{rh`vKve@z zAI{)4<;whG&TGl#{@pnb|9j7Q_*wsr!ehR(ao<^FqkZqKR)9u>~ubLAR?e<#K;=L#i5hXgGtHl`GfFI4>uc`;+^2RRfO*XYiVG z<^9)rExFvE+}c$QyiPcSHe0`%_f|Ulq>aTjk1};m)_o<^DW2M^}##d|Wt#AD1iNLpwhqm-~=!e z{B$^jpO-7oFXxGJxj(P1Gghy$@XX;1USF=Pqwf4;x!j-Iexce1_~md0ea(^EC+pA*$zAK!;dtMd)f5DAh?oY0_s)6?oXYd7b ze41Qi@ab~7{~4b9ZB+xG9nRplW4YXa6VLsms)08TXYfvPWeyPLa(z61;f3XL|FORB9;@~tJT9EUv&`*Yh%SK9zD6VBlE zTfeG-HwP?&nnvyjwVfeTtau-%L@bAMJe5+jf|HAn;x!j-J?NtqYS2%;8 zl4}fpS}yk|_e@m-KNrs6H{{B7%+8bLa({AfRyFX{a0bu$m3V!C=aS3)=l0w@RSi5} zID=P~YYbjRF85#6bE{P~@b|(Qyo+38@XzIP|6M)zi>e0RBb>pf$(7Hy&Zo=e{x|w_ zq+@F2-P_+-?N5UCAL9Q|QS-ISw+kT_k26#$1gJ+m8 zo?mc}T<%Y9#;OLMIh?@@$(3t1od?O~{^SN%HSi+g3|>*LF?c1p+`oIBdaK2?>Fw{F zVXj4QpD*k?M-Mr!O>fu0T$^6p|Jdu)SN7v=mFl>IR}W|KW^!fTZ|BYB^8P2cMO6cj z3}^6GUybK9ytQ2JPi~v42HrlL!K36FgZGll{rC3VFRL1OziUr{GeR!Pwt_r27V-*!SBnJ>lB?okjwo) z^xQ{P4cwZaW2M(%lWPqAf?V!Do9AY)YTz%0GkAHqvTlX*3UaxB_je$z7QgkF*6TAl ze*4j`f%)x6`}G;-w;%1-fB3)i??C$B)H#PSz+-#=z|)5_crm%g;Kk+g@j1ee-S1S# zFuZa&gBSW5&$;rM$a#=l?!Wo&o$cSkV|)AIk>L!!TCRMicD_a~_aEl>ZHekW!o$NE zyuVzTL&5m~x!ixS-?t&veT0XGGx$Wga-F^NNpiVAxnEZ`@G0R8zU%9;|KYpka)0*S zwbed^$AmL@&OPFs89bL_QQ+H<^GF#Zt76Ib<^DYO2Uf=bd`LKhXS_M~4?L4x?*D23j^)$-9SHmG&1xUQQ^OhDS|A=@xSw3! zKNtCLL@us=D*|5<&fwSO%Kxm+ljL&${tI-rXMo55{rc%VeK>>9mTL??M=tk2*K@zC zYTygP8T|DHWBPn_b0bzRRjMZoWZ-vm21|VcbCik z_wd}FRSi5UoWUCmiv0s`D3|;5*uOE5zw7ORr-Ue0+oGz0M}{-_ z@|mJP{3p5G{|e7tS=GSTgfsXtxw7tt^W$>4Ke;EW8hCs-ga0Yl82qkW?oaN$ss{cr zoWU>59Qy};Q7-o<_fk~@zZ%Zq9cGFC@Q!l1Ke?T%8hDp*20tNJzO!{6Cztz^d$Ov5 zpAKj69<#>w!+Xl*{*C8)s~ULka0VYC*BJaOx!nIq&mC3Oz{i9$_zbzm;NQyS{%3mb ztf~e+H=MzfE3`)~%oDAySLl3ad%z3jPHsv7to;S8R6NIZYxS>$s6Sv~jpss^4doWYCB zl{sXchsovs;!u{SWUL&fxpy$~;8Q56I>I z4|?vQss?@}oWak^l{xyIpOee|yT57v@BN!*j@`$qV;CM6&fx17iPvZNdbxc3EdNmF z_+PbcKXHSlcV4Bl9- z{HD-(6S>@<+)t_+c=K=uZzWgenR4D*F83eh`);plAHw^DGx%(|a(>(S9J$>8Dt~Xd zx_Xa*uM21J19Ij10cYN$+Q&xU^AFs&ZL0eSZy(O!VZ-9_g_n@a{r7mXbA0aUvAqrO zsBi`!D%Ti%m|X5p?(nJxJ~EuazmY5Ff1FQ|%l*lnTGha3gfn=+_|E-pf4+qW%JufZ z^U39Tpg!yKAWVLyvk%_%*nZ66so@OnHzD?!SS~*%9B)fj#~r+MIDoWaL08T$u5K`!@S$d9c-)iDMy z9M0fx$u$NqBbWPg+b34r0G}Mr;G5(cgKw70{mK2gs)26{XYd1ZzlFt@Z55_Ke>6T8hE~N1}`F4*1d8bDwq4ue0S&db{3EA*Js$m z8N8HS`5lz=aJk%{+g`NV26$LFgMTE~7`(n*?mwTeC;wHgG2hz*e?6SR>&i6-uP2xL zllxIs18)${;GN{k?--qTmdpLg{j92icMWIoUUFrg2!Wn$9Tv@lv z`4G9>pWLBU4SYm6gU^v`3_e#b_b2zess_FwoWXySE9)&d-z%5z9Q!Wq1c zTx0OIa=Aab?W!7h$8ZK8F4q`*gk0{=|7$<2{%?TS3uka6*BIO@m-}Dtxj$7k@Kxaq zUjE_u{06Tem-}oxta(%S=13TN==^jgyx%xl=R{-GkB_8WANK@x&J$!`)5@HzaP%vZNC-o zU+{Kv<$Rm-rE>Xy8giGZrnd*aBAmfb%9Z)@oyW`N`$X=kss^4A&fo#d#C?JX%H{su zwK`iZ*5jPkbB-MAbGB<>*5@ql|9Y)XK97B|`dkLj8P4DZ787oJWoZ~ye3o1vSv z@eecKWBWW2%>0PcIzB(^b3gWM*m=BW^w_?S@XX;1-d(OScn`U}|GRT1wpz@OIIZJ{ z9P=f%YhdO}Ebjk$?nEA&J*&qE9u>~uqvXoman7UV^5Z+V&p9#?7njS&&nCWKep2lpc=K@GxgW3Of4T15kM(zD-MJrI zE#_aG*859$?#EV(`Jbk>f4Xx&wpz@;IIaEDo%^xXV*bKu?Vs-4kF8dB?#JHl+>bF2 zU{81M$M}TOo%^xXVt&VIy?&DWe9RNq1J4$&JNIMki=OV>kMaEK&i&YGF~8%qo?qmc z@3CD2Gv8xz-MJrQ9=)FK+>i16>dyVxYBB%fw4PtxxgT3C=69Ud{vpSFkL?w!eRY|JB@&!~ERh64g0Icz8I2cb6;QUpVg}m(Nd<+q0^HM};%^RJq3B)8ul0 za;H}{@R{KZzD}+&_sj!zFpP8Bf=TH zkz84i!g*u4+@IVgRSmpZID>bSD|0J3?=F}7^L$^WdfvmUhckE!xyIn1%H{s#wybL4 zt-~37kX&Q%!E(9(XMOJ3L;SuSTHQzZh;Rn~My~w!$N3bwynjCJxox@aQ>$%&&j@Gm zCvuI!txb5J%iI5H&z;L{_p7!69vIHxU&@thnwwP(2D3|yDr#<&?cW&P9+`R42KlA!Ls0(R6)H1iN^B}o=e0JyNZMB$Rw*A>M z&ZcyzJ2!8u)t#HS_rL7iyr1^mxfl6++r`y;9DGSQgRhe-=RBORm&?zud6(^c_WFv) z_Hz)PKb*l^$~6X$l*|3QbLX~N%#S;**Ee#^m)ov^nJ>4v|FU!E^4M=x9Ru*T;S4@> z1wQMSxe=TXlgq~sxx=d(_{eYuKRzP*!%xWN{^LCNWK{z{9nRoS!>`;+^8RRhl!&fv+b zMSu8Bx!iw>=iaJn;CI3q{PWeLKfJ44?oaL)RSmpHID;RNE9-?iKPs2|kM-PRRSi5Y zoWYa68`}@RA(#74_S~CQ4LmiR!ApKG`ol}f<^IDxw{%qlFB8t-My~u$)wx$L_aEiC zy{Z~`pKu0`kt^#xI^Q6d``_rfo2nZ4mT(6DWR2KA@TPLPKe^4S8u+K-3_et@y#6~M zCYSq@JG`oaj|^w1fX#t(x8* z__%Ne|9suJO?X$i-X8ccxqO@C4p&WY4}4@egU890b#r}^IDJb|Eq7P{=bHA4rlORKxx?hj81XYh>LXN|!#$>sj!K3CPivxYPH8*+`o3&`dE zm=R?nZRMo((2jcS;Jd0do@T_vV|FFk9J(lp;-hOy^ID?;-YYcuyF86O9?DX&T z*zOPS9nRo0>NF?cPx+<(01o~ml#3E>QWU9POP?mS5@_b2y8RRd26XYeO-<$4_F)>C}W z$o-G;H5-nt)^31L2xstFa*e@f%jNzjz0$euUwdpnzVIpG3|{b6wzbUh>b#I#?oVz| zRRb>^&fs&fN*BmMK(R@LV+c-wFWA1+ts{dPV=F84p}ubumQy2tkZfzJ$Q z@C|Z}!8gj~{(JaivuE`f!K1<%JX)?X_-MJ@f2ijct!m(5;S63ut}%FoT<*X5#LoWN z!ee{?z$3#M{Dxdvx5as~T<%Zq&8h~T8qVN(UWnrpo>wmSU%<~-FX*wo{qW#$2CpVp z&gnX@E|>ey=KF5;Y9GR13TN=ba*e@@$mRasb&Fap)*fj;c75NIml)PL*T-5#?HZW1 zii+#5TeL)+6YZ{B6h{&Bm$Oz;`}l!btEheaz^ql&{>%k;*DdPpu3Hpq6!mo1EsEz? zcio~^i?xZ`uPw1>Iz*1OirO_WYZbL$e_+-sYQO%#tW7kn{^VGzs9giIR#Ce@%vwe5 z{xEA3O{+gS)+%b(z^ql&?hmt8QM*6P+C$)ne%YD+@IXiRSmpMID=P{E1%DuSC`BE z$$ht~f!7FU@P=|_4HD;#v1McipSr?z&g8##K*u-K$oMwU64bmwn&!yX#*4 zzg_og?8lw=w8uQQA0v2NID=o3YYcu_EEdDaS!$@a=NFJ@5;1`M0+(dhR9F^!C87 zhBNroE#o%f)8z7FLhkgc20k;K!E29<{_qdva({9^tZLx(!WrCetLQJ5%l-R%Za`H7 zPan?U*4EJ!{29K4?{mDI6)xhJz8T{b3vHkEva=HJuevEIY zW4&Cv>%3z)gO8PK3_eaS_kY-L`|s5@z+=N1{Dtje`{CK-a{qC2cj}+?*nUpKPlx+2 zyA}=iZT9Lu!e0t!@M7D?{(%>l%ll`%KQ>QQj}bf}oWVn`kJmhSVY%FYnBVpi)i%Jx z!x=nQt}*yAx!j-J<5dm(WH^I+cZmH1kCN-{flrgmuc_otS53Kg#re!|2G6}?+$KDa zT)t0Z=jqfx=COUu!sEgjJd4&jDc7?*vqnt&Z~LAHA;+3A?Hc&sv3|^O--e~NUA;Z< zGT{tfPp&ceM{;@l$+4zOd;8%HPawCA{;szN-aeecqvRTc_ma!o-<^NC)f&GWpPlmlA@@{O15XHN@C$N{!7s|? z{^VY&YT#GH8T_$aWAG<(xqr*&Httu=aSRU(XYiNg8iT(qm;2A@xw)zum^qiras7Wi z|MK7go#)FCkL~9OJT#oa$I6xebDWQp%iB-x_^JjzDV)I<$d%VO=L_X>|BF0#aa99f z63*Z;a%KKF=Nsg5{~JAbQ&j`s63*cJw(Vp>PH-E!P(234j*IRbe|yAd)b1RAaptT$$5VHXr}pc^$-SND$5@Z;@226$s)5Ic zGq^R1=V3Yj?A%W-_wVny0aXn=eK>>Hlq$7wB z+O1x@#Y}@4xUXa{2ki|9)Jr)&3t4=6bF6`#a3_TJ8QY*EhBQHa;14sC(^J ztHt$A)7n4XYqwf0uGebsAGmw%R&V#(t*tp%Rj%`J=6bF6YZA=$TJ6^)xO?qZ@Bi3q zw>I%>fqvq#{kj5g9?syMY&CXn3Hm%PYs{Xc}C+KFD} zH&o6m%k}oahsovZVaXk?nleA5^O4~UzE7_F?!)>e?_h_cs{w@ z{}KOQ@X_k~LHO}-2CuPmY(KoFT<*V?=hm)j;B~?oeCE%hKYW&4?tixD&Z%nP^THW? zr(9$3U2?fUxx1?x_^;s%-dK-$WAG+&xj(s|R5kGC;S7F6uB?6T{HR>+-@Uf5du?I+ z^I>=WVE%9Jt{+_gkI}uhuzPJ``}LuFZDG7VoW6I5&-B>dKk)N%W!@p@iE{bexJJLgeyxj(tRsv3Boa0cHhSH2T)zD+Lo zCwF^Q1K$8b`^CY-?s$~6Y_x-+f!gzkC3?s>p+Ty)O^c7J0$&F_hMKmEI2 zS9*KkvEj<^O*^lfugNtA|3fanzL9&qs(~kmGkCgD@%ju;FPHn1o1v7%lxqP3shtdv2Dh2DWep50h&QUP3PS z?|ygC{qCUsnc{!ycLz)Qb7QIMIRbw(oWX0#mEYAmuO*kCU*y)VYT$Lk8N7{LWAL_e zxj(t>sv3C5a0cHmSLRi7en2kwf6#LeRWHIml+<#`z%~I9C7S7<|a*e@D%jN#$zFF14%Z4*}Wx2-SRpfI2RXw*_RRe!7oWT#u zmEZU|KO~p?KkT``S2gh1a0b64*BJayx!nI<&%IaGz#oP)c&>fo@rCD>%l*mCQ`Nxp zg)?|DxyInd<#PW|dmZ~>e%nh_+W-#_XYjgmjlt{5-xbc__v9Lb-pa({AvtZLxP!x{YL{bK*abISGhz)Q;I|LMssrJCLz_?zJjUPG=i zcul!{pVso++Eop_PB?=%lWPp#TrT$~w?$P0j|^w<&*d6}ca_Wi$^D|Lf%gb!@PTsW zJhk&da=AabgR2_&uy6*SC|Bk>bv{Wh_b2!3ss=tKoWak?mFrEMC&=ag_h?lE zKOWBDK?g^Fc(7dV|5?A@hx<09x{vVCa0ag=SAIk5ys}*0Kjc=aYT(tw8GMjjWAMRp zx&I-aJG82Sj|gY*wQ}XVW9RGSa({ByS2ggB;S7FAu6%dw{IFc^Pwwwk4LmlS!B5JS zYcrh3%jN#$o~ml#3E>QWPp*6>b$(wi_b2y3RRez<&fsqx63;Jq0lD0t+=5jNJUE=e zSId=aW1O#%%l*k+Th+j0!WsOmTsddp{G43wPwx4u27WP|!Eecx-*Y=pmCOCfyDHYYe_oF83#QQ&j`s63*bi$TbH4RWA1@_qVDB zzCWD7FUgg4yq#Z`%l*l{Qq{o!2xst{a%Bz?=P7czKe@N68u*=X2G9Phcz(fi$mRaz zzF5`3bA~hcJ93S|E6U~mB!iReXo}!_c_({_Q11-Gx%F_jls*v<@-c#*{TL!KAgc@$TbH4R4(@?w`ElW zZynCy9poB=ca+Qh$?a6tz`KMq_?L2JeGBJ(&xoWU!|H3pB6%l*68 z=$H9_W3HX#og)V)T()nZ+>XN8w2>i^O|e@ zkLkPy5AfLDKk)S744y}>F?e3N{F=I=zuvA?z3#%RhBJ6$xiW8n^Coh+Ke?Y&HSp%) z3_et@G59dK-X8dDxqNP%+&QZ0?San=XYdB2<9!a^P%hu6jXbw;RReDt&fufu8iPm6 z<^JT3u4>@p!WrD}=-7U-T<+iBa|5axc=~V#50YyP9xRvplN(aiz(d0se6d_(@bBev ze{z4QYT!%58QjwGUyc>$esZ~g_Zsx>HR$d4obFr{{KmUG7e)QQIPa%lsa`|i`NJ8! zv|L$d()pWm`Spj~x2hU=xo`&mP_CSNbY4d;_b0b*RRgad&fufv8iS9K>+OLrlFRSO zDME7#CC-zJyu6S>=~8u+eo20tZN{&#kMS}yk|_e@m-KNrs6f66rm zzblvflY6hKfj;Df>$Jo32M|L|6Fx&PLl+or04w-0CV z5ps>ezmm)SkM!J8RSkShID`KnSFUk!zCfn1gJ(HDUfscPV%;S4@bt}*y{x!nH*&z)G+z$b?@_;+%R!RN{4{^ZWD zYT%2)8GNr?dHr<0PcHYr-*XRCHSojX41PzhT;uNiPr2Nm+`Cl`{6RQ_2c8he4?LY* z?mxZfW~gf5nZg--f?S!4!udqG-2Wuc{kp1wPYGx6b#jft*URPpV?1|5RRiA~&fq8I z%Jn$T@XI;~^N5%hq@H*iP-bJo4_~&xD{}jLNx2kP` z-w9{%>?g+Y1J5Cs`;+@(RRhl%&fpd08iQAo%l%jO+$vQKym~l;50op{lR6(Hm-~}D zxT=8<3uo}KlVbnCOUUK^z;HASEJVLH9_&ajB|B9Ylsj7ij4QFt#T=|W$^C-F8 zzxx}8|K7i0;IZGUItJi%l*kMQq{nVg){iqa*e?!%k}oam&@gI zLgfCWn%*Axs&EG1Bi9)G7rA_&{_45ERWyX6{#?~%*>$^E6Of$t4x@LO`_8e-?Ea=Aabx2qcX-Eanf_w?95@b~0$|Ihkw zB)D(iukItfRyc#Vlq=WxI**jg`-j|CRSmptID^lXYYhIKT<(9K=gzNc;ETc;{Fq#0 z@Z)m1Ke;EW8hCs-gWr@Z*RVQIk<0zby;aq~?}Rh>1G&cF59M-yavxPSaO(_?_41j* zc`mue;JM{;e{%CwHSm1l3|>X9%oXIks$A|*Zndfg{$4nPe=OG+yn$TqPj17i2Hqr` z!Q07|*JtPL<#K;=J5)9B&fyIH?r(Wa8iT(lm;00ZepLgn70%!z&WirbK*FzuRCZn zxz$wD+XH_uoWZ}4YYg5^F5f3|yH_=E6VBjM<;rjIolld?{mGqP)xc+lGx!g3<$Fr! zOXPBYa(}F9;LF1qe6?Kp-JkO{a=AabYpWV~OgMv|kZTMcCztz^d$Ov5pAKj6m(Pu3 z1)ftb_a`@3RRhl(&ft-9<$HSPt>kk5tv$C*RReDy&fs3Tavsomlw9tA^v0d@)6;Fz ziC^%zfXBYim(50Z>aOv4i^qXScYNRanZ5tfJ9P5LcpTd&PV_PH9Ul{Wd@TUtkA1v> zM}EsdWbJ?pJb#178$CYQCqCK8^^=gQ$FGFNK7$R%C z5VzW=bN{yXxL=?6l8;~Z_$iJzVBn==tDdGiRb(H0*}}Ai4%QH ze8CQkG*agvXT z%O2P1znsS(^oiU1xbNqUub$BPyNiC^iC1}C^W@IBZ~f7yb^PeFI`LGGS9OWb3;2E91BfS2{9yj>^=>Pq*JM|ZMyu#z19{X<3vFCK^@BLjTKIw7bd7W|J`j@=^ z?*C-{y61NKoa*&&{s;Xx^ZEn-ll33@cHVhG=XM_P_>srH+yCS9J9W4GC+l~;s8c`j z;!b?aC|uP@obNM z>p9L(xS~@}Jj2KTe?L#tXQKBb?ssM9_K2f>Ogz)a#LIn5yv@hN=BiFV;)OoG$m1&> zU-h`@)xLi`-g|9lOx)(W&Ujmo$MuO<`}i7Kl3H`gZsqq`k1(- zk4JjErcb=b$HbR?Oq}6{&g~Pw=Hst>yx8OKJ@&h?Q~zoIzs2p$@3%)>&d0=!eN5cl z$9s5uyifdxkBR+m>fE1C`~SQCemjeM9Om(WK5?d-JKICN)5mvt-0;tx{6-#k>k~)& zn0SGYiC?{?^Y`<6JgrZ>#mB^PJ|^yYYv=D9kH__iH~W}4-p9oLw{`xWIIoY1Z~AzO z#{su@>IZsU+~a5M|J`A}-D~uT=lYm$6lJGVz%z{kYZeN5cN$HZfOe4NMM_lbA-m^i`5#P@wnocFHI_7GR~F>xCoZ|m`Z zKJhdk6R+|y@j)LGU-dC@=DRz$PaN)J;*Wj2fyZ6@#3Ox7JkQ6(4}DBr{+`b55jXHL zag>jVAN!d2jlXpMegTiG_lb-AwUZy}@dth4?mphbJxwa_fEevJ&x%UpZD=Zj|-0N)Gy?5{XTKPW1aj!k3&2z>~XC=aZ4XFH~kSl zCSL2~>pZ^OCk}hOb9=;Rd_2M9bWe2h(|a7;C$8Y*5gvc$aTkx5_K7e0n7Hh?PXFaR zuG%La<747&J|^z?Wasby-RCFiyNCBD9_C}>DLy97H@>qy#KAr$F6U$7T0SN|>|^41 z9}_3}nAm!%b9=B>EvhgxQNH09!K-d;B(#OO-d`vvr z$H#a)yHC8r$HY5)OdRWD;u}7m?6LoZ&h``M@G)^A9}}1HG4Tc;-{|qKKJjrM6JPZ) zao1-%w@*CC$HY0F>*R?m_?WnZk9YJqx=%dc#}|0Ku1}okW8z0X{@CN7=R3DQ*kjMc z&Y1X39}_qCF>$hwiSxeD`FrB_J|^zwW8!yS>C~_2@uWU+p;tS3;(9(Np6O%aMLs6( zIjQsajmN+Ci7)$@_?0(0_5acN{Q10Yy*_bg9~1ZXG4T)|6VLTA@m?PjTa!E6L!8^k z#KAr$F6m?9IzA@u?PKDlJ|^DdW8zpJ6DRnX__2?PgWv3IFL7lb6A$+BAs)}{6QA+% z1ds3ciQk^m>A$?k4f@32`1ll$_x6b|`j|M?$He|`b@~&B`j|Mv$HaAfOyqnaaro3u zKjP{>CT`?o;*LHhuJLx~?}|^5lJ|+(QsB`~_v-y}f%*Vv#d`#Tb$HW7COuWX&#Cv>9 z$iJa=w~)|0kWlC%)rjVyo4;u7)_1kBM{mm^h!0i97n3c#MyU z_xhMP*~i4i`gLxfxU!FlNBj5~k570U=W$Y>*uOvb=l?uof4uuC9zXUtXu!1V2lmPL zJ)i$+pCA3S&sPri`+Z!Wc%hFk@_2*C8$CYY@j;Kzdz|R8-@wlP?Czww|^YuBe&*%Kl>+}Dd{d%#w z-_Lbl>sr?u?{%+xEy~5p>Uy7rUvvFe@9RviXAQmI!f9MjC%lXBZo+ysRo>Ro*}6Fk zZQY!OwrfokI-MQ`FC!A zCtT}=+qt$d%e94d4^n&U5%wZHhHwgDKH)8d{`=lr;ZJzsCax{~mTUigtnu;<)gB95 zaBX1^uK(5je^25W=7pmVR{Jcxfa{rrE4*+G*A}L^w(xhZ{~)XuRsGcok0Sh6k4OCX zr`?ISMI*Jx*3H^FS^xcNOXRNe!j~HB{dS+NuiXG|*F^u`o-j*j?``cptv_Dz$0K%M ziKeQrB;g%|cM>*frhjirc$^nb<9a&bX)RR#f7|$GFm_)|IE!#pOHI$ed;BvRJ3b@) zoUlqOwXZ5+%nN&S?XM5^-!Jw-ZoC&>&-D$2TL|sFQgQE-{-?)l7VlGSG`;@&nbq(r zZSe=;P%j+Kwg3LcfB$N79b>BRpPi5YtMR2jpKS4*NqoZyvtD>fN3|zO_%NYAUtI`a ze2B{X^U=ni!fBt(Hyk2MhyM=AJ_TN_bgx?n<|Ia?ZH6Xp^PE&jS+2^p#zL`aEarP%X6esQ-C>Q~%iacK_F( z-(u9W>0Y>mYYU&^+QPTE-b~nGh}PE_VNb$;_4DC>cm1r{nZRBPFSm4f&z<%hYR{cl zAa@g?aeE#$9t>6g_|K=tFXHd^+-lFM7TR;Fh4#E^_bums|M~U*`tz#)e7XWZJw^C` z{rPk?et4DeHNriFfA#!oay3rZ@?Dd#6`{Yr@}FG~>#u+H*MI)A>v{e4yZ?Fq)_k+) z;JoNWHcYn1$($)>ydcnV1kNJQ7`Twuh-~HA4I)D9|tz)uvOBUL?C4W7p zzdqVuALp;P`>XX={`zfy{oa4(JG6el;Y>nbzAf?%u*wpOOztMyUTR95_<1Ei5@ouPrPw zTCXkK!nK7P$Linx_q&_m)yL`I|LT3O$#tMy_}{n2;O}^$l@|-^Pt^GS>izCtz0dXE zkNWRB|JBc{{`<@Zq-#0h3c@C5X?mLyjwke=KmF&;|6f1<{b&7@&L{o5_80nhKfnA> zkH`ONyl3^`0qTQ=o4EG-i+^?hwV8O|o~rfrKmC#V!TKQ!tsk<``XLLgAF|N;Aq)Ri z{gJ;O$zN~u@9wXbdFzO5U6HLL+CsV8MfjioP1|GJr_Ms#r_RFv@_u!tv^@WBSs!fW zpwu+AyEI`#!vAgSXa3W_X+9R$zm2*||GtKBJz>Rp%KiQ@N;$afeEqw>9`av3{{2_K zkNA7KNZ)mY_Yf{4T;+wExc=W(Kg{m0vERb7GcJG1nHZ^j>_i+CPhMt`{!h+QJ98w(yWy zdcTGJxgJ0`%nS3mw(v5pExe9v3o~3>_$AjCmc2ydxA3jY^m;R4%ggopubxj#t|#&q zUe5IugsZ%86W11Q# zl4}d+ac$wFTwAz?YYSiD+QQGdws05M7S^O+voOxJg(q=sq4j?jcBMbGFu}Ej6S=nV zBCah=ac$vtt}SdeU;WjZusfmO|K65Txt|GxJM`N2dH3bx=qbUO;Q#;DUza3Z4G90Y z^}l9!XY98yk82B8aBZQTUvHtEH*cYx4{xEJ=Wbz7&M3Fg&QiB?)9rk73+=3OJD1$f z7PoW6?YwUb?d)zlr`yij{&)A^cCN9VKWw3$7i^)O{cGp^+IhSd+S$5xj;@_|YoVQ8 zYv0`G*$Td4(3*`GOYO*?$(=IevC#pPj8|p`C?ip`Bf4p`A5np`8t9 zp`GPsp`FWSXRz5>X%^bqW)|96UVqi!o1C4^Wucw3WoK&H*;f|sx<%W43+-$v3+vsg zf49)iZnDtMTC&j2MzYY(GP2OlC9*S!?5rRQ?Q9+kWJ^6DEyrH(_)TUX33yZG6yv^aYdUP7S9| z)xVrKX6m#FQzqwJ441!69W!Z!yMce@PnsUIpD=lX{D1nG8S?+Jav^`4GJ3@H5kdPg zIQ6b2OMZ zN^W)PT->5Lv~$GS6Gn-eDH5anuYG8SMmcht+&XH?*=LWLEPot5X5_i!MDK{nGubxqJ4xKQFD4 z78dF4fwSNJXZC}G(Qwlj*{Jth*zX0EwD|3QOaEl={=wI|Sc1U9*ty|l=%b4APyhZI z!kkaEDGh?T6?AggLW@VWXd3L_E}SO+?R$TU`z?$O+*djXB3xQH%ey~)n#OP8j7)_b z1$LjoE4=&rbv+>blZ91HkWjtz4>(W$>FhWEC%E6jOuK)`x_?D;FN4K$z3=_;u^PXH zlj6BI`0=N_`wN%p{T7yvI_>}XS^gQhPyVrQ{43Y1hb(-omPu;p$G=9f^O2RW!C%Ef z!NFgt9zXy6_&12Oi{I|g=l*=|_w&oY|4r}yB=;x(i}!Ew?l0i}0`B+Y^RM6c?oV-l z%I-g21ortw_xZQ`=jZaDt2>td6)jt2r}sz3>HRn5-v0OcYq*RU z?{r!Ei@1LU_qVKKk{U*HFN2D5ze~TCx_|u9?jQ6I6#mP}x}SwLxL@f%{{IK@N6-8R zbN{mYj5aRj{su2<`XlGNR`VY}|Ni#H+~4-d2H{P6`u^iy_b>ncBa6Ae^%Z*mx8MH1 z@9)R`zW?e>J1D&Iu8G#NsUC~p!jp@M|LG474sUq(^!?v&Rt+oW{%a3!9Euc-G)WCD zUZc*-R(6cJu*t1@|0M4Q?=tjfu7#>4vRv=)+D`9iCU~O!)5^WIYp!?MU;Ojg60Td8xq0J-NJeVB?uwUM8?{N-i%O*!UxtmkVrM zk;}{feY}v%EBt*tkjpCu*1zZSN`dv;xx8{<{c$d@5?DW*%c};~f9CQ70_zuZc_gs@ zE|*setUt@;)dTCNa(Ruw`k!20Gq8Rom)8oczsThWO8c+vXfCfESo@yK>jc(r=kmIN zwa2-SP)#RU- zf9%h1ZoK2<^S*IUeL+y5L2!s9(DBTV3KsVa{~TN@yhKnhh)>q?Y~z*%$j6qd2Yz%3 zm0uCu+5waQLiqmd`3?P<>8juSSy`Ih&>o%#hO7FZjqv^HIaGLwpl(oye6i=56VPLa zSoT5B)KI=&5RBJ&t^b^jd~AZ2!+yv=9?Dk<3h=Xy=U#$e=kfQ@GXp&~49^Pxf7#!% z82jxIA+z7?nRK{5FZlN4dwfqZ@tU5`J$Xyl*B-Abo#p?_{#Y^g+a_zi{Y{V9zx^#e ze(+z!+qIZ@ZF2xW-ZPHef4m8gw=X7M^V!qszde&Ye(GQ7Nqh2U z&t{KL`3pVeyYJtg${xR>7(J#>&b6mpHI?`Me2wrDfh6J>Ejd#(xj~8Q%9HTR;B(;7-nsI>!c%aQzgRM8 zf93qfV)%o_@U_BSdQ-)%bJ{F?X;ejIkT7Z*7BV7|($wL$PaJmT@=Wq#JlN8#t7 zr->BQFkbj%`0wz@f?RtxNC61-z|Ec|b(QDC&7R&eba3+Ng52_)g=al}xeU#nd}L9s z`~fnMbv)+rLU^9XPnIFOlh5~fM275+7kK(S(PDxdGk?-B0g{rb45 zy~-DO^8Gs~FZ6gh$q474w8tM7?)3ZhYp5hMY~T86jk`tNAN&eW!Eb}#bco8wk5&0O z@J5F!&%hVLAAu*2Q~4+1XLUkPf8|fXTO5Wx1C-wbe^dDW+Q}b^;nh0tU%t6;=ZAti z(oxE9wDjxlH?|o0D~jRw7Q@rU@JuoM_hNX(F8F7V`oZc~4S3Sy2MOPwf4T~H=}k=1 z^xj7OdJG=qE7w?pps{r5PCf!R`DO6JX}R(Z4_Emj_-hQ{Zig4l$d#|zP31EeD3@+4 z{9OePX6Et|N2q+%TUgqmg(HxmTy0*hJ@Tu^VAe13g2IO zc()k-O)+d^SPQFGy(o_8~ zeTe$O^w)<^@_2LM`}0pX;mvHCjq6>5LWrgst9q{s{;&CdUM&9ye z3OsU=>iMjM8v2uPrzhJg*Z-&W-+#Pogopk6nd-)lHv|LHoc7(S>NK1sMsZ)|RE zdfyZ7>`Zy-?RC7$$C0=67Q$m!sh%gvm+k{qPeI$<^sW%Tzj$k%py`bc)AWu*&n3e5 zSKn_hh8GsY-ztWGQ4BvIPwmWZ)O3}^o}KVuQ!an{M3s-gTOxn$N%#$Z0DREN%JbmX zpVpEWx~}{edF6jPJOj^AuQ!HV+8^>uy8G~V%_-{tZ2MgQAAjop?Wua2`ad~bEqoe1 zuL<9u|92L{e=mj~IC%ehIu^r^D~6vUJglc(D~A@IN&T7$k9Jc&se&e88N8sE@-<}S zNASEp%1^+b6^5w()UnEsE2nzez_WSEPa@t6;d!H#S0aO-5FXCgO;i6{JGL7hFrTlj zeGnWubpQT2z8Ib;hF@L`zq1(rWHJ2RV)!26&j0y`R0$np<@v7DwY){Y%k95-oaNegyw?#m>s3lm}gM)4Nc( zv(wjKZM3F0GfHEeg`UO2_m|!$is3I8!!yP3AB*87rK5LtMxWR8x_MsryAmE>ue_!_ zH@e^3!uMzAPr_Y&8AQD(t>Qt|vHO>ACOj-xmsAZU)q6qEQ@EQyDHxYq?@mI#0Qq|8 zpNxFclfMZ0LgYzSun1n{@nz^qczT|J=X?Au;rsK$*XU0sHC;zyXG7@_U3!b)H^R?` zCoWZazKIJy6z=>G_2T_KK_??7T7d!Lr zDjQl@f_8G4@W#UPzt@KON9?~DZksYTgKrn!NXC;9-mgXAyU-umUOpsNf4fgm{q`|H zb>wdl?(8XiOrJaMg1;!dnv}OrlsC)_(#S7h6Yt%~SDL7L(k)fb58B)ZGle&j_A0}? zwAJf}guC?G<^g(F5Nr|d?8%HN7izwVi0hoCJpXZ3JePP+5bpHEnfI`EW`c0%pTdDk z>L5QGJ+`UH`S9iFnZ8C#vQ+2r_ZHj^CpP;BPEvb{8dV78rjg!@ggble5W$A%SqHbx zuKK}u3U_v98ONHPCC*kob{KXm>LULI@~L&2E|c#tS@qjt z-o_Wg?W3lh=y?^MT2Lt@TDpSZJKl_k6DX!{7rJC|`wqk#J{E!Nsb74SWwg7E}MM*5Va(J4efBx?OJnGF-UJ z$I=T`zxn?$xE(@Ba)VkjapB}s^Hlz0;=LAbhYU1>SDmKv_dTuhGAs;#3E|HE)FtZA z9RvBI-sZYxvFRMNR9VA_(8&*{Elmsqb4{Np6sXkHTEEwik_uawLLr;JuhXJ@jM+Hdl&B42cY`k^oJ{)&9+4b89lj8~gqpmr8q zk(=FcxyLG&s6>P@pW6|rwVuW7xh&Sn4Rq;`2_Xa{M=Ev zi+8o>pM2yCH)}a@>l@tfapA5!M=NT*wszo6^b}pIez5ZV1@h@^EWF>!f6a^4p7;x@ z|9BeoBZND9y1%FPcL?taf+=u6AGZq+`}f~fe;wqr$QQhr>xV;SK<@P0Av)%V0^!b| zv8GxM*P&-K@^%RQdAfH&S={5gshG(kf`mJJ8 z?I|py_N+(GVZxpM0-i4{e@_zf(`)Hk1GhuV4@3TU^h8e8^iG5yahd8_eYxtfcHlzcVY=e#8RNGJw>&~c z7(5!v%X)_DS`IDW-$#G;{3@ZG`T1{fJB+l12c4PK zAE0M1JpP=v4{w*zKeUwuIz4l|`aTIB&_9+%&&}`{?S}Dpgu8gN{j{8%gZwYZ+ef+P z=S!|s`Q&q2o`)d+m2fxC&*MEsY532=ot-N#P{Z578_dNITa>qlpA0Yb`uBYJB=ng7 z?=yK0#nw~=!I#2ax)Noy+#W_b8F7`yYlk^me%&iPls`mE+9BAp7M{LI_1HM-H}u%1 z7M70_=4rmCgWU4GK)CaR9lCAtZiH8!sX5Y&cw5d_c{}91CHxZMu70IPsGW`AcZXcw zyD`7f75<8Fm#zrod8g z&mLPP)KCFEmkM`wj{H#lVEMQM`2ja5|DEzv;u@9zc9Zgl(Q|}wm#*jwYNz|2$Ni?j zV`a4dc2OMM0na>9H6&k^)IWSG+}ZQ_eATboWDcW%^j@ZxOYsYTP2jd!SZjEH;ZD!I z8LG$pe+%-dQ_6>uBahY_zCwQVRVr`gt@$F=V~3~IM1LRQF1`8htA*Cip9xQv)qHso z`J3TI%T@nO`1A0_vf8k52-`cAxi7%jZk*M%QY3Q=?SFo8;Fd;bDHQR{IY|z5rgtIMDpRR=BIb z`OGI6&xE{IkgVS^)KG+;AA~zUCwZTH0KDRL$}=ZvKE6$P8!Ft{W1AxkLjGO29nxX# zM&s*M-Zp`%j{G9{j5jo0X6Ng|ojrNfQ?uu1aD(d4^TtbY;ZD!4-kP&A zJPUs#kZ=2|>M?unMBb10Rpjl^)2Gq11Noq-);sl*^iem`J}~cX?d0LYEiP1q!TG|S zKeO0hgFhC8@=|sV&~h?ci&1dYO)6i&I8aj&1n0x;kmVlexkkA2Lzec|%IEL!yqJ3U zMC2RZtoj4&p%@0I!i$KP<|=qgxYM70NHy2c<|Y`pMD^GvX0^~iN4P7Wu|67a9r&Hd z+a?-T9<~a1`cu3oIuQATZz0~FwEq76{Sn+Yhd+-5q=Y*^+acO3(X$4ge=PRHH^bAl zRR2Wy$Xiv9Z8l?eE`eXcH~}{Vn~OP`Ebj}{_w~EEmzVEhQ9>7{0`OM9=-@}n=Ky$e;A$^ zq6M>^stYRJuK5!GLP45#;{^CT=1;7gUo71D;p5*m-iGL3k9>BN>aq9lB~vPIo5jg6 zGW=Ztw?m$+TswcCk^`rr5`#t%|1lkDN|_mIo_AHK_oC=L#|L-nMXf3tjSEZmjP zNMUaOJ5#tzSN^eDeiqQdY=_T#Nz-fPr_G)C?MBVnCS=%R;m-aP&&3w+eaOdnerbiB zk-JpSLj|gTKneXrQ{iE~#BbOyw=^= z@3q?FzNY?s z0DJBdeutEYW5#HCP-}x=7xKsbr1Cv5=*)XnfAU*x_j;mdp>XHV#2RgvEZ#@q6S1=~ z^6#K0Q%mKo{rnD|$GqGz$k)72<1P4A{c}C_YoKr!Z={pfU$@TQ{mvEc{1&aO`Pfx) zun;}znH56P8~!Qs3Cdwhc=`KPf0XwT6X6}>ZL3U~PuZCfdn z>w)}(@Yo3D=C_}OhyG-I7)AbI$vDS1FfKLT8E%_zRYZP~a2M|`+W(sH)xupnkm0++ z7Vw?I-Sd8mbuy*lKOmnvQOn8U@YsW@zv)m-ulX}B+}UY|vD}3G6y&2?kjiJ6hq3(XDBQ*Sr}R|GDT9)e}X}0i^dfcoFZ5@5DhR z9wpw1)T63;!?D7h9|CXQW*)qHR8!Oj{j1TFy-Cy6wv_&12RuGk^;buJZ^*gWCph>q z>}Nj2-5_uajmiGXW_0q z=Q9savlP^PT)t*u4c}TePLx%p# z+TnMEyYxnRj-HA97jWCu)9OppRcg=V)3w}M``H1$VUYUgXfpB?c%0{^`slwyxQllI z^Dv#@dy$Xksr`*;XWBfa@-+CZG^k@KFj-YYd4M-?(_$=V^-f!LB1!? zJLdlf;L%IfKPLaGa5sKv>y00(uF-hkW!~QE(Qx=~-uu{i;6eChAE_S}ldg)-sGS++ zrPEZ58-=@cZDHOxj{GjTZ7y#1w|W+T-mdmfC4bL=$9Nt$`ANc^{(SGf%yr1ujBCDh zC*IfL{(JMEgh!FtHz@s_>d)+yJdmIHvjg1kH-`y#`PGg2w4YISmhdS5-Z!`eJ^piL zA$;yT>gNvJ^g*b9Uk&>2?~so%zC9F?ql(mi+sxDQ>uGp~@_!BTou7C1|M_>UaOdX) z@2_hhG8`Ujm0Ry_3-w6*wn_QD$iD-Ru#Vc|`Vk(@)Aq0w1D%m;UAt5zNPF{jN#V|( zrQZAT>xDc2N2;ivO~ku9)FbOHy>;3RUQj(P8K)hLd>44VgVg?3@L9s0{@8BnR|);Y zo$yC1s(f?gR|$9RYRa46_zC&acWeHNdEu}6I2k?j-QfqW7DY+3&H4%{|(xAIo`CDlJO ztNN{fIY+q5uk`n^P(uVgmkW3Kp7r|8+u-@#HNB@I|B~=KWPF|+-!UYrEeL)?J`&Y& zOMT>fZ%}*e(2uV01U%}ki<>3f*^{?U<844b-iCa`?{d>s>Se7*1xINMX6dR8&$9lI z;bG89xbuIuwALeQ_j(C;@eXFf#{4!7dD}r!tqOwG$Ok;<+IZ$; zMRPDtyyqdmf%0R1dkAia8T3HD*=yt%>yf^L$A!Ci_i)&zmCvE@to+UWdLe&tsE3Pv zf*X-fF^>`DZ_kACq9duCJ?|@!Kkg#M*%eg*!Ww3)LR;&uj3z znXem+o)T}Mhk30iyt#0vCx2IkkXSwK1Ghtt8zX-uypZvsmBWXHyL?P|&y|~nyYf(f zjHc^Q^lV3uZOUwZKH*K3Pd=#f6Of-K+}Rm_O1a6WgjbXG#sgSyY~^z`^5sv{6iq_U zoA5mE{bt*=>bFhhExi-qJG}S8w+VOY@}Eae*r+_)vq~6a9`T+7A6%&R$7mmJfCsZQ zAAdpqec>*>yJ&B(gICz3`pbCpfwe-8&^|#2;ZD!hf%?J5U6;UZlk+*;^9$S#YqRI3 zgWl431L{jD{YACq^`Czl! zGhmYHcl#x}Uu}5NyIQ}t!H*X1?95-SE#Xl3xyWbfFV?}oh8M8TM{8dYw0m3QO)_s> zU84<-74FJ^hWXyP@QK1*ytWzrZy?eG}WfBY8JA7!3rJo4j&JN+4N zeaLL&0%WAsF8bqucy`QzSDUfOxqhm3>QdxvteKs~lw zvmxjX&*#0r+h5fE<_UN9$Es_-m>)L4)1}luX6H}niG5W*ykGw>>k8jhJy&@1MH7U( ze2F(!`!|Gl1wj&?s;9gTe6jHT`C)m;D+OQQul090^4o+v`;%qV{`=t--cvqgjmq2e zQ4@G#wAOdCzlU(wp4_)k(|a0v&OyGA_ipBg1;SmrB77$vL4F1D4Yz5$YL$G$u~qFU zPkVAa@{NSMcq868svA7PcfRJ6lh9MhxYzP)8a&N+$Cj?!;C84}SK_VwzS^^t3B_jc zOW<}GQ9bw*!rk+7)O%k3L%8!pp|?)*kZqc-{MWP`9zb~;Bi!ZJr`|l$kN;4 z1J#q|`KT1__UXc1yhSx~%g-d?PJdxv?N7}=SD+{VD&+@~u1DaRW3<2ckcKs~UG-#H z_iOpy8*YauEk@5;c%j7YeqG=@g}eOCwpVWHYV)D$FZ-UB6YK9T5boqNL)FeN(epm? zr&4~7g8za1j&Z7|JG^>E^>@S14dEl;DeAkW>vnj{PgIXwhQHtCAI_iMs7D9GYks75 zj!LNftMKN+o&2}IC~pf-33v1JMc#LjtA)FKj8cAL$Y;@0$h@)E${?uqvBn$o*I5a7 zdNSU6;NBsZ=jD^MBs4((81w|qa@&E$@XWIs{R)6-neU; zaA!|~`RXbqG=i&h>eJudg#3@w)qazI0r?E`*!tHX_yzgQGF4EL zc-wuh@y3}yEDN6q@8&(HTnyhcR3&R6zaIYi6&ju@zbu63%RTOA^?JE*S1;nM|LljJwaD9{B{ku7rNMFWw)M)%xp4nI=@Q}A_n{&T zUKJjeE4SgE{H)&9{7UsFA60Jt?*+F*(fWsX1;H)Cot}VsF!R+K5~sCe))JVXCz<-Ejq`2RrFz*&$%AK^}q9WvP*J;RWX{i^aC;I|@ghl&n{ ze+w__uYNuNUNNiso1UeX90TtQPqRORmGhCpogd~LrSkSXavnT$iss9uv~M>FckNP= z??5Rg!7B6zUiht+okeP{4JNy5$^m@^pxtq2zx$2K3ZP6xIO%p{Xyjmc~4pe-e0)0XE)Iw?1kO@_9d~J*&`D;z!kEhcTL-GvPD6_VZlfPJjN-u~386)7z2v-%~#) z+@&|UT61s>9n$acEc=$!z@9okIr%^TP7&_Xo236T`Ex^gnFrfZA-w4&ZcQVf_TIDX zf@c@1pG{AtpH+W>H*Rk!JoKlxZl^c$%Xq(LHs2xKr8l)z>&uyxs~6$^y4-E(NqX__ zfwyKprxxjI{fpW;p7$5+;Dh0#57u&S^0VMc*3U$dzYFelmS$>yI@yH&p(PHORX7w+;sbx6lhLqGJKjQmXOw0`s6P+ry< zGLEf{{5s@c+ogV}2j3_>tQYOI-0rNSe>mWG^>fH_Sf`sZZdy3E#<2~|)q-(_ARDYtW*01{TmV4Bmj5nX$LwIP< zi&`(N{k#yKW<6L_?7s^=c9>)<_-^9u_fW(arrwRy1e(~0*Q;jUc8z5e1Q zg!@YhW}hW^Ac+5()4o)3{PVE(Wg z{D4xb=QZYyt^CY@k6oWz-`B!3yhpeYJ==sk|D^d|`+fM&@WkDkU-!YIr8VBTS5Eo~ z5A{q`|GbQRKJr~zFL62inNXgKeS&w8AFxgBpTpmVmeF|q?>laQFFs%8dn5k}Jmbw{ zl#&n3!*b%SB`Ql8fyNQg18!aJJePGD*Hmf2lL!*?Rn>N zswcyD6IPyY6Ykg-xGv8d!nrKH2X)u?NIH8#Ctb<;`?g9$^VLe|GSBX6*S%g-d_*L&({cd z`BLD0f4UO+bT6&H`NaE&a5p|rd-FvH%EYy$9nmm|33uu8_W>9RPyC?$9cQ-(H-~yE z1)a{<@;?w|FCl*t?~ASd`5yUzc_*y}LD0UE#%qT)Tf2R!aF^a}8EqdT=)Vb`WZtqR z`~~#bp}y_lU&HP2ZcF=*@ZDZHY$FR2T)thfp+PJ8vaHoG6?Gvd{(H1))l2Mme(5OT&Yn2u2v~a06z=k6&RN=C+4yz_ z+z!#U^7FWGXHS-mA~w-pm8+rcPn`JyrhkG1g}Zno9diB9S-6WgT29+@{lDx31Fz|= zCrrcR-aJD&>6n~7b(zn975_98?(`o*zS#4~S;!Zy)N;E9`Agxkt8?qulfqqp5$&Zt z&Vk5pM84V#txOar`FkjfWurKmAh4S*0 z=GE(mk#GBomLDr8S>ew9$PHR<+mo(twN-y?tXgjE-e~w5-q)Bti{JtC!&d$ufp_-4 zPj4U(T+aT@-nxrk@Y3wZ(uQ6T@IE@^&b^<@@9CSuND?o!s;* ze1|t5(ncQ8T)g9Vs^O+*o^Y40pNFZQ=IFTx9=%!9dl~)UdU!tlJFm5Zx()EpXVPZL zkH_y|2t0at`H)L>4u4DFnep0h_J21k#VrTTsN8VpIxE1-5Ub(8(Q1uUZKot*1Ph7aupW3UuJ^UKDzpvE8@I2m+nEh|S zGruu@U|zcP!Kyz_zh?3+;3>YZSFZ-avBF(G7V+F3-meSU<%N;@MxfVI5sb6*OYj@e&ihC&d=E$>i@Rr-vMvANYga|KB$@M$-iIA z`HQqCi{SqH*!zV${Y8}X<>*-t&-eDnXy07r=XTb3t-hZl-1)6)FXf*Q?~TY;+^+W9 z^LUjOs^>DEL#>@00{7P^Plj*vo-fu4cjdf@eW+|4xE=YV_rAVtOSQ9zb&@Se?+oFt z+(!AH+VspvzF@kh>r>>{!Q&;g9e$T~wPGvPlVsdG9^O*8^G_lD*EaM_h2MFm>OUFz zg~DCF9CL?qYxg#yKl@`W)L?dgjh^%__2gRgcWzC(qPgS41X+`Uk^OIPGt ztzVDRk8Fk)bW{)YAYI?V1Lk9GoLpN5Y|hTAyw_-q{BU^5wYl+LE!@SM?4k{c&F8<3 zyuZGpY6sPSH}!Wg`iH?|%!?iazgV~{|9OApmaChEyLR$!?>pAVggbjq8lrY;D;EUM zh8(5)1RK$x@W!`aqbJo*$3H(&4(rC$et(~zF7Pz_?`iG_!DRR>`jOL!`x^NAXVuO{ z@KwT{{R!R|jDx?2{ATuZ(9uy4^zEqf>6^4XkHO9h;1RxGI}ANH33vIM&vUfK9t2zA z-M#%=jyy!=mp!MF7ocaLaA#+~hjRJ($Pb&L95uL_RO5Ys zcE;M_?ZQLgS)D{%~yXU+}WA`wdzkGU!k+=*)&$= zUL8-cQ#f1mlAhJc-6Mb2f%L>?(!wwMaxy1 z37{cIsDCov_hs{hJO7kK|Ly4cQn=HTV4qkU|5rIui zE*2i<7wg7t{BWIc7jNcneU7N0$q4qMXWgrs;my!L@+h@ug|{Aiv2drSppnM-6!IS- z-;I4;Z2sY}?yAS%PxS=&0&l(CIl`U({N38)bf@5^k^l8V1?Gq9N2~m<6P3SByO9v? z{J)xUNHy$SB0QXrVt)pE-?0fj@ADkgfPOy%kF#F)dh{F@SN&Npzh(*#$E(bDHL!R? zF7v3&16#h_FWjX!eTn*WHu9gM|Di6LE*l?q=%Mo2)|!u9G~0q(gu8h2PSf#;J?lLZ zav4pO(Dv#k^lwJb){&~P|gCpJ;jYvsR#aOa0S_V;Lw{9NRhdEfOvf_$Qq>ap~0MLr+>Z=t9BF{(d!OYNMm zLC^;t9iijB^C>^)33q<*_siW0|B?D)<)?OUl}|JOX63CrJfC$wHhvx^+@<%^%4*0J z*f|^dsP~?Ft#DVb^Lf8xDo!U_6WB*b5Izx>FfOP=U)%u&dvhfZ`wF^O(-wpxDc0{(Jdd$j5ju-vK>Mk5m2r`2v^0=X{_w)SkO{!9S*5wQ?BkuX@t2tGxOA z61cy9>?Yx1eLPOv;Yxa2P-%erA?ckX6BX|AYYX3FYOM@{-ol-p-~{b(tUtXH`MmSA z9lMzH-UDCBxYy<%w!!`P#Rng+`lAap-)Exd6yeUEe4bnFxoo*`*G?wbzwQv^KR~`R z{Yxu&$AOyO1n+%pTyd;$r{CWP`&@XmMsE9d4}2i={8mm%oS=F>O=$U9NxaR4JHMq^ zhtme$5BUZ3`^Up4!w2(xVb2Q>p(oDw9p@sy8TrM$uWW1j^EBSb5N!{eQNLCQcj;Zt zc)LIHWlvQ3{K}f%M;K2I67J;RVE)Sdc`w|5|MDh!qKu0)H)UPD9=sU_Uz0jdpA`EAUP zS^IpvaA#-q3H8IX_;VKW{`Xd|!wbCk{=3mrv|8J9ma7J*4b^z_%c=f5NN<5~H!oD+ zy^mgr{N~Hl4}*~Jc)IG@!2`6}-xuC(L2kKvTzHtSX{x6+dOm;`HrDc-fY&)g?MZs` z`OSnoKgUi~4}VX^INSI;3as8O5bolQd*8)B66&uT?g**Kxv5wvRbF1*Mem$@DUrG7d1kb-h^L;72 z{us@dIQs&b{w~6uo+$6fX>Nm2!d<-n`=&lB$I zOM-RC*6tM|U+DEO8;yJKi+6>3r2SzZU2A6|6V#qF{-!zGlz8)myY?!1q&_KYX%B)C z@Jya^E1z?OyZmZ;zv>x}p7p}**#{H`zak&7Zr`2@4xgy@>|$J@xfTRNg@@&t2?Mi# zIz0WjN?Lx+M^BvZQ>;B%4UaM}Vde7&xW8Vv)>#^FQC#)kMk1~g9_AzajCG(~{UY4? zE#P~3tB+MCseGO5HAdqX33usA4AO#A1wA*xZ)cy<(ZqWPdUh}$co2Lu+~23@TX@M) z8m}z-4}X=#5y4AMT&aaHnur zo(m7qe%!`sFTu0BVqtt%&bJA7@n-1PtUPp{tbU6;sOgGpb0gmyD^KzLMOzZ_1U&YQ z3KqfB!o&WEcs2GQ*ol0!mOhU>PQKKhg8mNbH=+$%z=Qef2U|yav~XwtR^Iz`C*JvR z|9hF|g*$r!-aF4l{yp?3-&GHopR?$>lXY~hk)M#S@g~@xnPxtCP# zslWrLYP@-TuQ3TdbA&rT``@pvgm-41&Dxo*@bn(_!&~U7GEMcwqspzEw}2xH{`3urg29BvD_Ja4k@ z*V6R^dgkz6;4JLvc&_>(&OE%8^Pcdu_ug}|aF?#U-?e~fEenF%g}Ze5`>6kno}#^4 zqx%tWa zSN$pcZ{=+U{Ef3TznWwJweYC7f5mg~ii}UJ9PSnF@+<#jO{tat1~bS5_;k(CC#w^L-f>P9i#cb_63w%-nVM*1i@*- zUA*y{nxe7j`55^K`c2Pnc!C3LkEh+PGn4Y>m4}YP!+OdG**Bm+5z5PYC(e(v=Y_?> zojrMsZ!O+O;EBt%y|VGf=kRQQZQm?^OJAt*X75!0oJqV<;ZFbVi!|Q{z-J+U#ly)7!Xu<*-{4N+VL8MFN^ShM z8u=~sYu3M1nWK9Aa(I;Ru%Gq5(;SJszmMEK@B+Tuwf1uj{2|JDHPV}fFPW+NejL2f zm1=+Ta&2$FSGNZD3wQb0@j6YH)uRvLg?rUMwhpt}T$T6d>jnvT{z+F?#e8-WtU|sM z>z1wkDSeg7=OwkjXpWt|g*$uv?*S*n{dVkO;jVvAouK7GM>}#%GxGDi`Kw0rRR4;D zHN7>7x1VrlzrU_>lyH|{$xb?+v2j!qJ!_s)KU=wd1n%$O{v!GdFV%X{pLom9S9{`X z)H6|dL*b!6Z&3LkDWAiU|C;YNtv!4hp14%=cM*E}FHrq4uV21IxYM6`R^zpGK@Yk@_&=Xszdi?XP1`2onPx66?mCrHAmt?$j9C`|byLkQYwwA&3Dr>wp4tXuqFRdou z&szTeivB#xmDSVHSF4??F4z1u|ICHQ57hM9_~C$S)Sk$vS`Pc+=XSzfIn3w%m$j3l zkdHEcUPM25qj2Yk?D1L-ZC+v(dS+ahTOW5JpBSm~_3=-&0<|alqSm9v=x-(5*^`>5 z>9TRibm6XiX4ogw`h|j!OTA#++XDShqbJHaj053Y;Ql!vwHK-Wl(%lDn{bzpQTE|i zuLi+D;m*$35Vh0tZNZ@0@`tLe&btL5Qb{NGb}Xpgtw<5|L;J!`!7n`uMZi4XWRNzuzC89H)8?L;f7$&Tkd@ z&cen&ZwYsPPH=vljX%E(x!8GTZvCosqv|=(`>wxK(-(OT& zqWYtqRP(Xe-&(lSllImD#*r^tu6|g-K=2yj&JStU;WWVhBIFZE^}{*nuXGFXvfrAP zE?MUz-03Os_N^Tw+?A`MmfDXOpl25HyQZo=)!?_F-#^!23*6ra=@)p4?#nYzx0qxXYJVq4q46zmFlG^7adQ3m$mmgwIXS-?Y8jgFlt8-Ve`czd|6h==w^Y;Xe}5N;m*qR44DwG459=xOjit%= z?Z_8;`-%Nx^4|9pb#7NZ+2^#J*nDqac>GfJkJXE*!d*G}gXi%$_S^^`$@`Zc@B>mR z|0v^0%daFn$$B}fU$+W38B~P9Qz4gp->!b^NWuLKJxjdz&Ta0{c%$UIjjwtLcYez- zUu5x4LB0Xs1rH$d&G03IwVWRe{|cU1srJZYVEBvNspTX}JKPod7Q&t1Ml+vm?ejpm z|6TuVc(zGy{kj8Q$J^iLP2nzG{y7@InSS1vS$b>SrS{~pzG8(&6C~g*`GB=I_FpU9 z=}*%y9}a&E`JegTa25QZyV1}3JsovOJ0slHqk#1`)}9PTzKDGq&CY4UUA)KA6v`79j;m$uv=EJT0+=YD48meDg;~-dr z{@^sN5GSIi_Hz7oq1IokQ(c9-c+(yAd7&@zQ{eu2SnGv5dm`TYnNQH~w+~fUsDA%@ z^C&z^d0==L41o{hJ)PP41biy>(a!Jdd9UhU$9#^hmslp;<>UI4=8HX-y@H6PG;v)=ocLxj6{zva23KlaZR?)+24b2Qy=@F+a}h>rhnp}y}l z{Y}*WmaZ}ns{S8&-(mhd3ZCWsR^!9r`Mh_w@_(anH}2ZYxXa}46YlJcR#pf9fc+Og zr17p{pB61eL9kM|^M8tc-crcFf&87UcQSt-^RVi9ca4@?n^&1A+{K%EP2+8bgXSaO z{7aR$aZ#B<)f4f)`xq(Q*%Pg*ezWqtM7Yx*DXr~;3`@da20cL;Z6B=P+zt2lkLvh{ z>PfI~>Q$t7ws7aqeBSq2d0v5higj7GKIdilNn= zD|-$aC)}lLzz@aDA^g+#G`%My{|Nk$nd)aNhozoUJ#*M+&-`}2aA!}lr>2Wxa_|%K(OSyyL;oeK zRnK_lV=aI079RT3`z~@TJjppGR(`${9{PdvWFJBQ_@~j+K=Y*texY#Zhntw6v2oP1 z!kwOkx4!oic>Esqa|OzCvo)&cUG`}){|pr#mbby$k~bmVONBfAk$&oj8{s#g=ML(T z^^a+|zYpyX@OjMBTD-lUQT=m{)BIYD{_(2rib_J7Vk#n{rv_%74GsYUQ)|*SM-#9UgM2Fq&3d^!8Y(%D=krd)lITXnQTUr77oi)~dXJPTcYE=nO4aHIaWzxbs7ndFGMm-va-3gvNUw z{BwAM{Ss|l(dz|`H}7JVZ-xBz!kzy7^_rlz#Jkqy`Hr4!4}L|y=uVZNj-Er;sXrr} zH(}-Kc(^=xgp$TD6Yl)BgYQAC-rWS>&4B}#qrc>fYUg>J3vc~SH+UZ3?Vf}Dbofx_ zwJwA|3@?0D`%|<3J$P)R=I{62^oDlpHC-v@&CLEj!kyoW25FD*9{LxVytgk?p>UU8 ze_in_=<(ah?~uQU`TREMZ}gJJ8)v@=Yu{!HclwjwIOHASuACRKzxQDDe207i^Gi{9 zxeZRfN)ToK)5d$PgbL&Hd#3Qv544jezY2NZpWnb!-uI*jq*YJkdbPX^30NT9m0N$m<)y-1{YtW5oXtN! zik|E#<*_7t)|uss(qNB%gz z|LTLD7m-iS)cR=t`2`;J`h_~1G~U84s`(`JbP?|2_4m!5CEWQT&i7E(t}a1Og6D|8 z+XK%}Y5#Zz3Hu2Bh2H%09(dBrujX%&@4rbMke}^mH9>gT?(rVq-UH4>K0-TS<$s6i zS)}FG{QSFcm)?A@9X@ok#v5l{x_UJTP8J^Ki?{A;4)Xr_+V>%!@}6h2@Mn3>T8RJq zzwOc`?SIqU{x>1q#rrYOBdw5s0zQ!aL##dd7G5-5(`)6Y!4^$dUSsv=2aF%a3wQbp zymZ};e3o;`>yq)+-%?Z*Kk35$~z~ z2;ZTY{injyPv^FWQ-!;H%ws)()t3drojrNHN9&-s1@EC}rnf$75AvBuRM7hL+FMmm zqN(z;aKt#_VS6=NbKLA-h`j%u-Ce?6zOQAyhxMnM;Qn{<)!$eBv7=SL)vq?fUAi*E zwLLWdkAVB@elHO2;`PtDSOR}ysrt#_gy z|64seM!2&-&3YIc&kqys{5g1&+G+B$(BtouupIfuPpkZu#QQ2d;CbBg_Z#@tTUEXj z@=ZR~c>Vo^j}Y$slUl9mI-``{kU+l3TMxDv9{CEl-0Kl2{ep4a(I z?eWjun<(7XyTYGhp$6+mW(jw82Ang}4*gG}$3G9N!sn{LfPJN`9jGVV=_$BK%lRe} z&>#7^j90CG&46dwpTX+&Bk0NFyJJh&>+oQgNi zXXn=LN}8i*Hu4Q7DxVKuiM+pG;z!75IagGBu^=e*rP{OlEiEUl&~pSl?(NS!OnB(G z8?_#FqStslzo1hA^#qFvaEkId)j`jcK&#U`rq>X zGT}~7(dn9A({n#O!uvk+LlJt)UZQ&Jy>s7hRDX>30v7LC!kr%qr)xc}hyUjxf8;LB zNAtsd$fpOZpVyGC9dQ3U&_Cdpj!``uk+1x%+VjR<}AO3f2|{mC$RHdovk%dgI>y)tixzP_K1#7X(#zX}V%%v|M!|-Z(tL z{wjI!@$h699luq_&+iI%`I5I-}_eNi;C1vdtN^HN9<(W+ZsJf;Y)s3{g%J=ep2~v+j9AJ z!d-a?NLLg+Pa*GrPf_M))w5)Rmd{I(ZwU9-6LuHw^ygip{yYWwvyqSeruOu}pC1Z$ z{!Fp2vh|xkBVV5Jd0X^M_(km*eW~h^VO98hNqE?9Gj3^&{5Qz|O8?juKH^u^^Yd)g zlYws)9tpnRyMldkz`>`&&9}x}c-U{MrzQEKsh0g5;QseDGvI-@kHpQwL%%i7_1hZc zSI}?Txb8Q2Pu9a&I}q8e_W0+^^n#zkJcjj~ONBeXrD*qTJpZ(CXHOyT0goinn}xgn zXtcLa(MO>knGf;4_x}k!AC6K#AA_C>($Kl`|0&Op7VmiYtfy4oo(HcN9{PuUs(Ya4 zIkmX&BIAWSdt%3GJ8$jP6~gb3^v1_`3}cKF?^DP}Jozo~ zmaMOvg!~uq(L85azj@x@)XoUsv!96kUBaC`Q>oY1e|-&K@QeD#c>6uHORWFdfS%qV zm-X%Jhi~aRL%7qQWFLb!kiQ5$1-o;{u}e*V4fTW7)2D@3^#}5a6Lnl+>8%%( z4CDQT^_f=33*cM!sGp5jE}`~?eHSzyR2PJ!wbFd$4@D(@fN(N@gB;2*UiG6{b_HW?Q!AOS7Krqyd&J%>CZDX zE2BLBquhKM4qwB3;7*jSfLCSxVRQI%@ELrccsaavS!bubN8mkOQ}{{3ojp;;Et)!c zZ)MzDZ}2EQCil3X`SUg5uAHRPS`N=b|2N22WdV+jhntntc(csIo1R|6!}7L7+pC6D z!X?6;p9`s{=GzyMPma`h&n4cHrWpL?)+TpbS-a|U#mj?XFFd(Pr)jcZ-&S&;m)2U=j~d%UA~gq zb2saj&qKbEa2N0Tv$dpMM?LC|{2cE+#cbhWeznMLpKpezcu#HZ_LJz3-=*UXmS+VO zD{H*@KPo>HKaUme^hdvsg%+AW&lT?KMVfV_nma*oH}XYZKe8J6xcB}j3*W(WeGl66 zE>+YXe?R|`!ks-aFI`FDVY|V1%~AY$Biug^u4Gl!A7>w!E0B*059>Si4s(K2;N3se z{I#lAw8?7L{beFmPz5BB`~HGC`k0N8x>K{eFQ zj*JKFIcSk^XJ?Fg#jD7)LU@YtmCfJ&gr3suZ#)S388ubE{~U3RaMuq;j#3M2BYz(} zpLK(lFYARndkWfWOMU_s=CoR>-(Sza0G{^t2Yy+2_&m~87kZM=GoaHq##r+PQ?{`%@akZ;XFl!sG(s?921S?);p`I)58iJOht=`x|UVPxfc^PgC0Gnhn$s*~hhh z^(EeZ!kwR^^t0yYnaC&U2UVMVp9|lxMDx+wlL`l^{*jD}Y@B}%d@;}Ct%!Fid=>L5 zad;pfM7w-x&-%$CcrD?s-udSwwnaYKKrQ68M=%+A|2)%YguC=+Sa*?!{!Qrd_r0uf zu-a3^{_xfg9}eHzQ~l5hJ;Q`MI}3QO&&P2agu8q!V4qd%M?OG)75g%oKifuC&mM2S z?r!)D)=`^3_rPP`_b-zhsr{KoT0YOm&gH_Lo&NjHr{G1bN3weT5qyBRPQFfK)f0b5 z$9pE<6Yjsi8w-yN&~ms4doG0g>*!vApSM!m2W^dm;4}Ck_{ZAeE=@GOO-8HyK=k*6 zC)hv4#t$zDcYc`8b6+#$4``}-{O{K~2zT=7bJd^r9CSQ@PYcL4)wQ6GxCddx$5m8XatXY&r>G|cY2bqtDVhhPsSqepX)RW zKAq=?4*1~)c$)7DY2Jco;Qt?YZvrQ0R@Ms_h=2+>D9Qy<0tljvL%-EK2xhBHnk-Xv z^@Je`mFlkQ?n5(PuI}D4;6~s8Af(S%FMb?q~38$#wKVtT|T;EX3~_cQwZyE^_>?_U00$ItJUeZ5F0n*0%& z-}kH50cZZJarm#-bv{SO`|&fs0XVJ4?=$ix9sfrfxAQSN|60ABhyJLHKcMu%@Tv+p?W>@2rpd$WI{v|) zUGXalKjG=WkGM|ef1ziee+J-;CmlKGkLdc}qvOB*rE)&kDg0k;ywb@hD}2{uWu9w( zS;iaR*$+6KL;0n00zaqc_G}%$>m5RWepTUruH#$ZC-WGd|BKC|@koE7-+lC$e7F1| zndfT?-v{{p3lA!s^W>;y!0Em&Xj~jlmj8J+;Iz(9>-ihMxLx6A)qZ8?aPL6Adx!S9 ze!I@|Qow1R+x7f675>1Yz;}E4-H$8W?^E_-g}+Jd6(-kx3~;6=|0NXZpw9ol0H=Gr z@J>00qQZBN%XdHia5>M0!j}|2c2BvNw<-Lm6<+r8qyI?ZuT#2beDHx2^4*I{SAR$E z@u0%5d#6y^8+HCO3NL?aoDN?EoX+hIPfxl3q|ATfld{h9vW>z`fb+Zfrkukr{cam@ zn#b?+_&kNbL*)T`*T1gtJ3RZ+=K$yP{NKWPKd0;eXN8yN<(!|Y@Ow+`AyJxJm2*LluXsRtBg@68};JNMhEr1jLjA{JyKkItFa_|ek7+_DBS1AfO6J#F0Z^&tdFKaxf$v3RO4 zoU_aZznH>5(~F<;TLGu_oYQ*yf28~RqKtvYTmTb zrMCgjc%pev)4KjoD*OjD9>&)BLnRsC`$bu&z4xlZPpEul<9`ltTK_JMYnssYd`icc zz5LvNSGX@HJnn#e_m0~|LNl-yTjAR|IFss{HbT__-{F==b-hbIa_oB$?;@tL4N#t>a&>@DtiE*uMLFfYbUxD;RUH3csqkBsk1yzYzU{EgbK>K|7mWXQ0H=8#;??)~HNZ*E z->q`Ko#zL1p7WoQc|Ig)QFzP|ng8PbL>@DH#j^mX`A=#d(8F~-p97rk_jawDVR&_~ zqq<)`pU3JutpHB*_pTQF;eSEx z2D^0q$925l7yB6s|1G6UKd9sXLg8a7f7-qO8{mY81*P*w5ARzR`0Wj$8;9h$3!8xR zIcWaxX+57e>G-pMD0uZbh5x^R)B3OR`aA!Vj(@bqyFORf`QRt(dVWhj_%nL(k5~BP z-Xav^6FUEk0H^scj>YB7p9h@QSyX;)`1WOme^l!W8Nc|kc^TiOv%o)gKF1X9_bdM` z!0Fu1sh|B(y8ch<_-i!YL!V3G-W8eu)9R0Sq>e8u{HSNw{dK@;{&H9F`Bgg6=XLzu zz4ezCWPU$Ba2ar#XV*^&efSam?pt*HNA%s9Jae}jWuC?7%Q?SL$8RXS_hEsXT>1gP zY5qI@{@y(Dt%@h#eoWwg|LzjtbT5DLV4)jU2mWaa|2M6ZZ0o$B@OP-5ZtwIyPm%f0 zK2-4SZMx1M1DxhBd-?2jg`ZP>N2q$CaGS#YxRlS>JYN5Tiwb|hPssZ5GWnn4O@fDK zwGZ-)!k-E_zZcKX^}7o9`*nU1aK10KHyYo0&{JieF)v=|DGK-NWxZ12_j-T)zTOSE z;k+)9|L>xXfBom;_r7*q*YifXSd-^J2srKQyyEREbg~Eigun}b6`$v)0cU*vf8@U4 zPU3&wW8+m`wYA;-Cw2Twh5o!==br$azB~3!Ie)vy8x?*|`-wkRo^j#DHjh`w`yC2D zaZKKY&HoPy|G+_+|D4j9M?6i|b5Z*an_Z~Ea9y19f6vkJXV1z)OwavYg`d~>#=ZJG ze+oG5>uw*AbF=aPr0@$Wml|EV@6%;Hem|E-0#5X>t9=8Fp6}uD&I0v6S9G2W_m*{j zSmD10IIX9v^)2nYAJ_5M^yFUFggh0VRh9A2&^Q6p-~SkJTF(V9zv=G)Cww^fUYTH7 zzx$&n^nO?6{C`#9bAU6QQM<>Y!f(;>yA>ah{=@&g$Kc9mdl%19_(1EdK1#oP4sgbkN5=W)hjjd5&yMt`fYbWN z?jtj+`?>H9gKHkWXeH<`S(o{Dd-m;X0jGI({~x*c3%aka!tc2V<#2<62NJm_i8-`dh2P=%3!bnn z^ZRkC&jFm~DSL6<=M?@LwdXus=l@HcXY5h(?#y5R11oyYUSGT!z-j(F)UNwVou{Ml z4RwGUUw)OspR0D2-8%lOI{&$!6uf=B!v9U-yEV_z@aKD1^}C+D_jrY$9~b=GqxAe& z75-?|myMo3yeacMPVGg)1rWEX@cV4aJhuMR3isUHXqhOGm9G>E_dG@OB>#C3;B;TNd++)< zkB9!XOHSY(is#Q%xL=q4mjGw^R_pp2J^#4Q|MB<9J?_#a{I$XnkjW6^*AHyTddBp- zcE5qbUwBI9IjHj-R(MzAK;*Owg;NS&Rr+9if1biWqWAk2o#*|4(>b4bkL>rD!v7cG zq<`(!etBl=`$wJU?AL`a+xYvf$@(`g$U1*m=V=2@^Iv$j+~8vr{w9TgL*v+ycE|sG zR^iv&B?MYYkZE$w?73q-Pc8pXRvj?TF3kSO@0$_evi+Sd;c9hpT9S_%C}~3x%Orq z{}Q>!U(oS2z-hnVwIUe!{dx}1)$#vYl@l1(@jt8M?>HpxBw` zXkW(Pp>a5GQuvDir}IDYWSRd*75-kpX`L^Bx158m^OHP}4s!nQD?0x9YTq_{_2fXl z+x?Q9+Y|Jh*8r#a{rcfA*70Y5Pws0`$G=bEWvw@5`1yA_&%?D&`vY`M-?J{?-PMv4 zGrBYdIDPl5)`fVij(?8AU-K@R+4#t76@H;8_jQMkf53*G{|jV(d)Ipar}_WO>x*}b z!awTeN&SJ&b3yBY+r3YpmU;Yo_(uSz`zmOEXT$Rv;Diqa%_lPYc240Zv<`#q_k9ZY z^@UF={2JA}|4{e)pMdkZDgD`{@Lgx`tb2LF)Ge?jBWY%dSI zMZW9zsc9&Dui7UcrdxkA;Pl;(yhHYDeB?t4KkNB5{#@Z-eW#2+Wk>i^^4(iYvQG0q z-V8X+f8n9>j$Wqrt81SjQLTAiQ^=cjO_XYU4!pleGJg?X9{)f)vzl-~ymHE$|k#)XS$Ik;!=it}reUXm8 zM(ZnnT*to;aDI>4cfi*9XFAV*^(Q`3$A9m0Wd5`2*SNRBk0|_}vvQ9{&)*6-ox_;c zv-&k1{}F|s*FF?-3x&dg=gRzk{6+_Gn#a#)e~*qIQ@e!m_wRn5>}!|iQy86@1)S#D zrTG*#{slH(k0@WKs3HxBE5@Ap!f=Z|ic_h|2TS>a#w>Ww@XaKW!08+gzCqS+-@V(*1^%Wl z$M0nYaGK|KwO-TZ{0fqbhJ1T&) zex!WI?4>7l{9pdG?90~nalrXJZxi_c(DnR_!q0zR&duyI4|}DIAA7po`;Y2=p9VOc zo6kpHt?*@)mzp|%;Z-uvZmmc9Foi!1a6W&1j}?W#TF0ON8=+vf{VTV?*$H_CqR(D}cj@bl`&m!F~z=&NfljeyrjDGXbadJno## z^D0{{C)qo+dxs{ig+fyBGI92DqJxPQm}TkKw@o&x+jjDiLQ3UsCwldkfya zR^c;0BlFKIJvaIDX$rqbOV+98$ik}?UjBx_@6eC`x1ZH}SG~sMsA<4yUvJiW6vn4s z1UQ|8U$^1Y3cq!)y!SuWcYWyfGS7ADH++(Q_qhu9>%6@daEg~WsPPgyP2p`ej~B1< zr+^dw?9#j>yRWb4_={hV^ECMP{&!i=U#j2asIF%U@U(k5s^ic3`ObjTckicpp!P2Q zK*#(2I3DtI^4&4bA9=HWcNuUx&#`}%bF+N&j{wf^(d*0euR71yKO*;Ndd-i#LFWGt zSgi-};k+KVZB3&mSxNqQ+6YO4sw9Zz79C8{|@!v8D2f$=VkuA`d$v{_?s2J@%J*1#oPQF;B?OCH6Gsf`<-u+dCqGd zmVNgJ0jG6#za$d=FDQLmR`{;p5xz6f@BV_$bHK}k{(XgCSb96#nO@Wu70_^LaPme4d|-@9SG`lllF+rUwA0@fUA{ z%?STIP3KwE@qYfoFDcx&=YJ4z!k=B*PtEw?pXmJE6LOD#r{{d%Uy}8lP(O&Q7G=Hw zr}e!2ZL+Vbtw+cE{hFU?^ZchE_;2ZZxlQNs`*%O$&9crD+P~QN=3&73+|J24{G`sa z3OM1zS=IMns_S`y&U4-dNLvaIuV zjlVU$@(F;`Ixl=x&hus+-(a}@#reN8I(}naPWUVOv)|zP?_0P-`Ki5&-v^xbJErxh zZJmE*N^$Q)p#m< zFZcRYIS0RA)k6TM_4{$ElM46irMy<*eqV`?0Z#Z_(0U!VuP^9$zmL@u-XiPq`=C8t z;Rkhga zbokz(Hx>iDw8oqn%=_X|4z*_X@vI-m;weSb~9TRtz8?b-US#}$6N z+OK{{=lNy8X}>2m&PQ&)Q1~X`w9XS+2hZf9?|Pfe-#jkoGo|x96mS~9TjkG3D*Pbe zH2?E8j?2#NEjrJI56Tz6q~pK!*Jb`YG(PQD6g~$y&ExlvcnRRl-?gvYK^^~#I^M5a z`xiQYS@q@fI{sd7m-*lLJ#tefr#)2R4_0~4@ca!5zul`(@(IA1UY(VDv3>o}J7oUr z)jw-^vJY@Nw|`K7li49}1f1sCeZRQewWjd19~Ssib^V`J_%6-Awsn60J7u0R^}iV1 zIIi&Bx5)XwSMlVvfU~@z{c((6yo=$G4;2p|rr-TDo#)nXll44N@h~_q-@T~)3hlc` z0jK$I{T9(LjD9WyPWS8Qt$)VGd-8*2Y~xUT02;B=m4l_%|eHFW&E+6@lt z_)qEhG1c#EzkkQ@?`=y`9@@ zb^NYt<=pn@JRb&}&fzcA?qv9IQOB2mQ}9#8=)xo3E#LjB`Y&vry@1m^f2;K0-t{vT zzDw<;CU3t%=eekMhUL4-g8oY3yEPB@Y07`^{~notmluDy4{$n%bI%w0b6g4E^8shP z^5pRM>pXYUy0!mP&*5_lzvIt^&KNy;>~HEhzgl(#vdsTHA8^|5K?h5pdeq2~Xd@=Wok+zklvY!0Eg9)OanE4{z1+ z|D^Qii~5c}tm98;9bMgS;eYFRzYoawy;r{L_W_v${JRR@R(SEZ$$9E_3pX(QI|{cw zO)kpf%1-J$e&4s-0H^()Reyoe+YjnI7r#T~w0Zr&H*}th8dqTW_UPY{b=K7%XY_Cd za5|q`HLg;mDY)Hr{0F{8)@k(QlL~*Orw0Y^lllGnS7pFy{u3TO?CW^HF8ym2{%Ng0 zVC(!O;6!I`_v#CMLFXU)gsi--=kTrXm+zh(mlypag`WbP@XF7>eh1)m&bu_vMW{`o z@KK%Tyym5TLg)Fcj^C~MTrXDmMV;U8Ykcny(0Y>pd>`Pnp1)LnZF)_W$3q|V`XjtR z;pb-L-mg_cbN3I*Jbqp7hb!E#o3UHrUq31M`8r)%8*n}cdz7y8pB4USFK+7IAC~pJS?v!dFEthZ>uS$8K60DF|JzIC-0V*O6L318bN?ti z`iOq_;O%mr1+52e@Ao+1G~UlYeIDS155J@FqK5x((D8oU!e1!-;ztF~$MrzJ>vv_I zFKgVRt^Y|1zo`1xOLU#D2b|V(_VXe~omKc(75>pT%YLVoAl~mIGTyhZKE~i)9fJkH zX!v1A^^$&2ZPw4w-^L5e zz1mu%T3=sV+qCbLj_&8r9GKs8q*S%P(P!+xqpvK5Us)XN>$DpSr<;BHkN%)nYqkg1 zEp@wv>hYt&UB#raktm$UN<>O(-tv4<*UWtL4)<9E`7&@z-Xnu@6UaDmhpDH};h0>^F!KK!)mQvuhtv5*YzbDTpepRd5YrRh3e584d#ugv0o3}DoUft}=y7=#VHfneT4xrp?t~r0bzSmiA*UPP1yWv0=8a=`~2NIzG z?H;?v%J~B_#se-6u5Yv(z2?%?{?2mrtNaU#gG%G(^+ubHWNxjy-s(H}RUvfi@wn>o z>yI5jIu3jvIzA|_GzJHnXBv!*rH#^bzq(9+#VKC$6nIFR-A3Kpg{+RS!TV|cTDJ5H zi-Y~m{!$OmZU1Jww$@zgKc&-a)%6s^$ET-tcxJub#KF$h3;bpVwI!c^V8X?X!QNh{ zR`0IX`VF1w1{`^-*6jk_%e7{2Uu|hsenh8NoLL+kto2tL^|WEZ>{6>yYva+K**wt0 z1Hte2OJ&+-^cntXIVkdey0rnO@0E@Q)BE^W`HQXAVr}Wv{$gnZSGItAzg(Y9`6?qx z{`bbGdyTcuM#DRTK9FL7cR~k8Cotm1XXbe_IcwQ@FwyOGmKy!OegX7#Dt3f8r8~nq zN4}w*Jh33F@ zEKms}7ptA&FNt9S78`e_%4)6KfIV#fXr&rV&(}8R8~ydxU>{6|q=1%6M-K&)hdVH- z&9#?1d+PN@uNX|U8;v@2J+=CzYI!X4#XfZ<7oA-5WUXG8gOVMVc*hgGwQ$>|#XH%u zRfNBa*FTHHAtY<`^42olVawl>*BiY}MMogoINMz|8fO^GeEgiOj*Op^jGx6Zm=`dc zhoZ}+qvOTBy=Hx-vCxC*6mLPsE!AK!Rz#ldHM&rY4>kvQCywd&df3It+L(I6ccoob z$L=!wIuyvW3n|Ja5tOTZNr}Cr6PjrzG%o&T)0#Wkj_$HIN&N+lHRmbk!>$}RUi$tKSypV)l0_(YYNOg1wR>4MnXQxQPA zyvRHI%JW|9)m?iECr_owS9g_1{bd>=!?Av~-ue*Xo!G~ncXfi0S8;t2*}lpLm7tN? z>$$pbU^M!eex-NzmFJ=3)m^(!c#zAmzp-4S7!8ZRfLC$3xw78lY#NOsDXnz}o8gE( zt(8u%IapoOpB|~To6DV6T|DUwq*N*dhQxmokTVn0Q|d&ygRHB#^BieZlBE<(V_C=) z(sZA>KGJ9En5wp-xhwc-7fB8c`FG~J4q_hp3FNpHgCm<{642;;8y5tc>_9&&X*|M}`E=+J%KY54?lg+27-_Re zs>7ch+VbUDL%8=tnVX;0i`mm^+2v9;&raX&gz&pheNbj9W{%KYw*K4je{ zISMYvm1d9+5*R2$Y)5I;HotXg*O>EB3L3vc8{FwHWs!Z;A@a6%xz00ZkC*nz5jJ~e zpT^~Rio>=EG5AWMD@QqJJ&jAd%$)a#4PME6L?mgg+h1=rBKgdThmHf+x|G5lhqb+5 zq&U)pNO1Q?0Xo-4tZTdG{6rJ4al|46*$DC)Q(`5;uX&nave!VM^b&{qu}gWQ6a>|J z6JX1NNA~p&%wsEwR!=GS(@Pv4%iCJ-Qn;%tfR-y`)h6l^nD9G2HWU3P$?y9%TM(%m zy=YPulgB5gZRGgm3`QPoG*?y!%gsisu8Hx{?<@{(=nk4|&0COrzOfn#(!oUh2a{aw zpj0j*Mwki<)NzO;e)HKb*OnTK?%G9?oPF{-iVo1sBqy6ZWeHSDCng=Ilxf4f}e;dUaD8Nh_)X!@eIEPnrrc_22 zg@uyu0A{4_cGM-XmHLtwF$6nz>|*ne-I0*N$GT%XNuAv`K$fv9a3^f^z4Y&- zZUwZz+-Ys1_C>GO5@r}ter1#Rv_EE>jB-b23N25R=%hxW3YVeb8ZXiEGx$)*!7@2j zah#Yw7aXFE?(MA)8V5SPC1hkdi6#NrLdNAJWHfA8DZJ~_Ka=?tM)OObKW7`puP*0D zhSETYIh4`E+0xjN3?BE%lMaxEo494H{?mpa{~Y_v56^^iTk_ zx8Dwb99)7aEtopcY=QNn=#Zv!Il|tKe=hkoemFb+9oX9w+p-6AB|bLvA*nn=4{68O zlid52JLKqLU5Rb6t~O}4*E{P}9tj#|=>E{Bq)=olD&YE)r%K&g85P4&>y9+X{f+Km z)hPvra$+Y>QMn|~+i|4XKGiwhKh@0nT~b}fK~RQ_4T{9oFb{vbG*8xyW1U{7-D$$n zgQ|aLWIc&APv~lXrss6k<%F}<$}CbpG2h(&#^UXr zxYnpQ5vMJls^VB573qkR&(*158dT6;e~)=g{(rTry?6CprTGpkGt~+*ZuzO-Rc|Zw zpWJ0PAWVjf2@ap_Eje>?; zV1hM}x!6}qcu`nOv)zY|lDQTb=XhKIYPME8QzwBco~F^9m#VYDasvf9G0{e&ZwrZi zFl$x#M5*Z%5}ul(FHR3S-FoMA+osC;?bs(uv=k8N?f!OYqIRZ9MRzZC2Dd_~;znq( zHuFBN2<{D()rAQ^6m9*G9mL__&yXK`((FD|mnKh6=5Lue-Cn|FWsEX$cgWac5E^k7 znrn?4mQjfpK~JekfpDTg!X=CkEBa6=i*ho43YAF$_6C_ctnp7yVG>7^C8Bh7mN|5l zgi6e_uFm>~A7e17kvewLrE+9^Q?vZlJKy2!x5yC{4X(~H-}TYJWAS&^V|3m*>;Z9F zNiU5Ie&O2P5y6zAc}VRpnL<&Oru|f;e-st_&bF{nOTLN=OH*_s+Edx1`tDU+VW_fR z%{7SD$$@HD4!b?%1{*WCz!iF4$pu{1*X_{9D~JpJAsBIE4_rve;$)D=kX+|_=;YGO zy{HWr*chtU>Dy3?s;nGE7lMRf+Av;1UzoEV6b(w(4l$Cy=G!le)e2RhqgEqg znibP$ai%XcvoFO2$3v6q{^s&>Y0=RIilhs8ix|KDNrz@i8@1Lt?3)OzrwWYT6mATR zJKL=9h~?e}ttPiD2=%ks6$s|*h-BKcK(=D4;@8J7szSwv)|y4iLsOxaC+^QQ&0tN` zqOm^z!h!WRy2fB|q?sM)H5xj$OewX8XZr-Qk#x3+A>;_>`RpU~d%-lm!OC9jQ^Ayh z!)XnHDAb9x1bAGnN50R3eK7_u_o0+ zr&U;?7nW>*LBCoVjIY(YbDL#)Tc+>v8>|c_TBxNkw^^#x=J1y;FnI0|HP*pNOe`Z( ztu&8g!6XY6LNV?-BIivLlMm8X6ZQ<6f$~q9T2LyZ+lKxQMrlhS0!4q5fwIV%>ilAL z0HmHf87}2yIS8EQGNsBO7^_xb++QONN<+V@JnDQRcQS z;V+q{&xlUpep5n8>334E#_x{ATfwzsRmp}h!MLO?>Ai}G?6sw#O0OJ`_qW>133@1u)f>p?}OpC7&5tX-4Io)V*YDE zXm+Og9{se139U4Ge^M6KJY&Q@BNAa6l>I2$&B<98g^;H^-GeF6*QJ<|FGb#i$VWx7 ziSXh0$!QPKG8m(OJCv$2C`Nd@M2y6FEw+ag<_5H&>&|~>Ttvw77iXINxptqPm@5;K zClx$2q6C-7o`Rs&Io;@07s>33Bj<-jOga^{Rhh_Kz--uwEsyv_%rTe%cLX&DC#w<> zpc4|b&cbGxL(pRnebeR}%T2@_HR8u(@?A#gLUBfFz@ar>AF{D@10?Q80%V_2X}i99TZ8ZA-+L9A+emC zH$g(tKBZLA{@kwzQzZm;3^pNxK$smg8~wZuM#vL#uKcglbrnHn%}mU(+fH;_Fagnl zfsH!Ft^o&0x^y7HMET%Tt0bh=dL&Z}n~{Co5bRDh>hc|)YcGzgR4%X1H|PBcfwg#e z^l$u`sIrKiK`9&(L$%RO-YKoE2_cNGGMKG21}b1TxU^aut;LS)MqwbQih$T2@kr% zjQv;V4uOp%F{VTclaScSDuPZ5;pX?WR}iV&v(BKjfmx_d?e*%?nKQw7yK%Y-$umY1gQDALGMEV$K#0>g0x{E#4qj$yG*imeM1jDM^y$1CLq}#=}^QNg*Z1trvlk}Dua|P8`^)dn4UpzTS2*Y>MW|MH}Luu zXNZGxz;gvXEupR4(%6fBvPd1me<|kW9BM+=vtv%>l;PIXgY}5>6Ry!ih3p-+f^{R# zgo&ioX_*AiCWY0^BZ8%&1g4@D+_|q*IS{JDi({pdtv-g&0YxrI)FT=i zi~S&}1_ZMpz55%$Qg+C9+9cl0|h9 ze9dq)EYmSThC5wzf~!m(K!?(@=!*C_~;vdMIuuxl{KxvLxL+At<^TXK!(g zQlr5*wqmx8m;@AJx_D_wO?vr69J+ zR>;WZs>w{j^o1_W;a8}s+YuNQ^*^y+VqnpBmpe?e--pBx`+UU{F z;E47yiVGaZj3|#>1UC&TvT{(N-3aCiR;I}lW51QdVS&ZXX8F*@a&wW@f=Z@`kd8lR zq9Q%`8~cs@&DvTAiTLY__2vfmhv%L*%$21L2-S#k3Q>g=*L~m8Htebv;o|**q(Qub zCCCUU6P_Vv`|5FE2O8f)sRZ%wcb4bCGlvtDQh5OkX^ItPk^ ztg_Q{?QRRRi6|TQ5fu8(_EM+6ynFZchv)Y0s}`>-UN=dlk$cid61t&$meh8Mtach!4+%Q0N}qZ1_v9NNLVH$hN#GE(Rg>(<-{o15gGqd; z4g*!Mvnl4A6e(ttd0IA+f&gy38I0GfKX#cA>_A_+X~q2sQV)Ho`EFtX$q;YmmtfX=i4bnQEgq`~vMJqsYu0 zpJu%=3#tYG8KS9^b@5R`Cd)E0ijjf%XQ*TZL7zP5TzXK9w=p>^c2iq-+`=EW{pU`O zWiMe5r+;yOhquTHJrU4_DjccLvKL+7Nrcp_~o7k9=(pLjL}3wM)hB{C8= zk|kz*3e1=-G4Qi8c)ko!8DEE8$}S2Qg1X0<}zb5H&<3RNKaWx){&SJ1u4;axHsv_ zRMGM0nJOdGEM{iAN`|BxOf132g!cpYBch&2_8@K?x_5AJ0y$C}^qObJ&y0&CkM)hD z5ID;%b-S_@{z7P`494&VukY11;Ea}^lhQ4iz$ytIlI$ScX@O0ONo9Gt>AQKwV7 z3#;v!D&qUXx(~Qy?lW&l%D?5-Aq>4w$@z-YYATaEiEC<{l%d9B?r1L|+8J$_kCNCz zcH?xhC75h#<+nX`7Ozvi*%~dAN7vh@ODw(+fyfBLWP=iW2u+oVjBzoE+d&1KcFbc( z@6%zO%h1rKJ{Wl;WHpz9}Ly0gQc+xk{AO4m$J9q?IG?74mL+;U9ux}so_tPbWoO$No-{mTI;+}b z@zkAnJ-=MpTSeX){?IPyYEq(-qm~l^#b89md&oeo4AbSlYULB zCm%WDc}@isEJNP#BTYJ^#u7XeDjd=g#jYtRQvCQTavYXG_cBf6Vvg};WMSjvbGb~K z(Rg@ zs;A(mqXtv+hS)LdiX9WPi#1e%Xw+d|)WFc|f#VWh4vU6pV^2X#mCibzSC2xl%8p#m z#g=L6VEXzV1=Dh>o5tV8WNH@wJuW+5?@*@|c`Uv?)tqD`vRJ}Lc&MT79ZXkFBT@k_ zk)7-6I1L?aUrl$1(#u5HYH^Zhn49TOm5xv2Xf_!@WQh^6~RQi z(Ws-~oW8bHiIovlB*&Bp_h4LlUmvJ7TkE|r_XTe_)RF8KO>#*m3~W6ny*IKRlfJ7w z#R*Nb=`v!xf^n#0tF<)=)Gnqb%n@s3t&yHat;bo2CCi-S{krRiezv{%xL9!KL?~+| z%D&PUnY4wPd0MpUz98-KBr;$!ZNSX0!b`zbyL;@bFCgQYZCSn@$sI}lJUMMAMXop@ zvA|-PskJzX5JiD{eORO%`2)YWFvssOhrT(n4fG|bK*Z^z0{B!Ukl>sg=-`-)jUhci zF!R8V91C(qObVCKuWdS(Y@#YC^-YY7{?qfL#wISShQgl&9m||RIVc^U!?RQWUf|D!&NE!pRd)M z>v;Aw6+1r6!Wp3i9-3p~NIuZ<+0(VwDONiu;Vyi;9F0$w=L5Ya+=?y4sb)Oa@<8JC zL>ml~_cMH}`y~Q{l0sL9PfPAxqB7%4EWd??Lh z3RWFc*eL+R4Ll(V9)@)f^*X63)cyRW7>8pK#-5W(S&O(Dvl#^8Vy0Chp-;G`2*UlC zI%pF2A^M3SC?7ehN+9oWeT|=hYLl5{WLC1x<_}gRvh+~KJ+ku$lwM>^7aOhgW~u3O z%N$&!gK+OTns{n!*v*wgfz!E`@Vih{ZOXWRNjWb;o zDJY$!>~gA>G2X8nL+U;v%O?8=C}!m(c*|IIrhgFKEpI^(TWO+MTpLg9_|hLjK;f&g zXfG0Hv+_z@|4`B=pPQX(B5;O|y;+i|C5i1LnZ*sGHKjP2x)lV-szVg~zEvdnb9F%w zRA6(g=Z|BAf$y<~dKr{}S1Wn4nSWEbm|(orUZN~YCmV@ae8SF8S0iYjumS|*Bw~d8 zUKEy4e^FazP%V>kfPg=*2qq?8IF=u3NCbh(Q(8(bS*=R-6(}~&YZ4>=S}P{XNg6D! zWNT3^6a6q9ilP~jo!kX{f``zX6TPB?VLgz;(0M{5nWKe$V#a~|Gk$_ShHGR-xI z4TsPFQVUuHoFmSbi}4n7G@LB@6{&xDM#U&r;gW(s>7AwK z-YTvX5r-cOMpVuix8kI|k=Rk9Kv}wDhn-{jMoqL;fN{Ywb8rYLI55P#C{l#*A}@F^ z*TiLVP0TbEOhGZ!7%9ke|2;zHOzPW6WOpv-GEU8}CF z*LwA8Z3!i|dX3$?_uX{Up1pI`;5rr-hpIPWR@?}&C8>`aydCmly4yreWoh9Y6f?%U zg_|r6QY&S*z#g*7DjS{3%IyxOFtg8qMl977Slk8kCM0*P!&yOcxYclCyoq{yu!A`3 zDQ+iDfK2@OXl5=%q#@?9IC__AYuDpHkXmMK;g&ZC1kcT(8;`#KF1nQ6*8o zNCq2hkF(o_P~*8Qtb*38cAx@?%RHe1#91hFSveyUUOVkzasW#RPu*;jJ3R9Bh9+oK z@|F$f&}IvJ6l6v_}~=8`C~ zZAMifB@`mX5S?Zx;C;G9H`o*jng??fh~6lQD z(>C8y!bhNm2>>T6NRuiqg{o}^S2N8ZzIxzzj=UBNGnxj46Rp48>En|y@345B*>!px z&7m|ELIVFxELHb{$TLoU#ELKR2<~gd?!o53G;)ouQy*#c)*|hA2MCybEW=o>v_4@c zW9thPs*|iBaxIt`ZgV7fd3pXMY-4Nnq-|`Nzi1laY^}yJlCyEq;f7<@z#Ry~bL`u3 zWFEFWuJAA>jn2%sn5*0-bM2EFH4eU%bbsu}a zXV{6W;TM`HAwm*cJaYsY(4lZ7BsoH zg2-%e#ajy1Cv8;cQ4Hy zsFH=nWfv(T5&i&KAyF$Vk^R6g0me~da$%!YdtaIQ&5rkwz*59}o?6s_7Rq+_uq@Oq z!pQRj*a*untsW}dkLPl2v3!WEJXyd48%ixqKgBLdLWY#k>2_Ki(!dc|VP1-VQ~U)Y zs%~^4=#|T(c}%QcoZcZ-Pja8#&&ndI5HYgT`d>-h<0)Zh#?L^GV!S1Ud+SJ@od2j(+M+$pPn z>eTf!_vy-GwlD8RGY*JfUxtGtn*t0~UN5sC~F-Hin?7{P^p7Tdn--jAu8J0Q0QDHRqS$#QKEIx&4`WNm*t>oJPC=PG| zLA$kPTa-%d2(ZL0g*H{IP#d7sdPo3Rr2}yiO>GSOJ+WqOg)#0y8AlS)dqr)WUayvQVg^iR!vr z^!>?j4+)zYjt|ca&41-^F?g&xONA9&Un4A*0ahE=@sgvcoB@COO@%roTp5wOIvDpj>ZwRi(flZq08M@s+C()IEb7k$St1|a zm9stdK=VwazPD4?>|FQMTs0*UgGN&noZPR>>L*Dy6F z)hg;#SyI!0N(mvGh%!{d7d6a=P(ZG3NXBCZBlqTG#B8+7AF0ZT6FwYFfg;OFR4zqL z?Z~$hOT6O@G_z&0)^J06FHvNmKDlZ3A`Rt~>!cy38_CMu!?-ZBQHO@OSXGQ|ntQ3V zQLlrPBeAc7vZPs;Ot$iPUCE72#Z{#JE*Bq5vHMEVvP?ylgp@m_Bd!RlAoMDvUS1x1 zM0Aq=lauB^p^c|T1{BB1$;}0}iID8=AzCPrS|Y|LLJ&$^A5!p?UzVc;7C@s1NQUez z*K3;*U6$f|qj>pK-}>wlD_D>?U@ay`Sy+=H!q-cDpj*p6Vbwmal>}^5X-d&UeyKi< z=lEL|y4Yu=J_XkG%g77G3zdfwc$vt^CDOtwK6ht!#c^1NVH%X*HfbRJ#ZM-kci%9zA%py6$lB6Gi$AqIP~JOud$MtLK@71Pd8T3>ZhUA@u~NM z(lS>w9aTjhuGd@+OB9>a(hFW{K-{s$Y7_NoB*2uE;Ewcraw}dY-nFnmM9o1#upe?X zodi&ERu9o@mpfl7sz-tEG2u;BgKWE@U9Y>AOOqqr;=Pb}L35O6;s4a4LYps+MFE9G zxU?vos4_S^mXou3dh-Ms>Zq!e;HWDa4J5z|%yPKzaE*C+W-SPiEb?M>sutYZga{v(-) zwi%1*=4LAgYpvzdnE@2jK4oZY+7b&l2??p*vPz;}a#lPNCP--i#Uf|_Hqb9f`Ks9h z`0T-X^q@U;M$&guk_YM6@{9(KF6Z0&vTz>}xgqAjLSqJa7X2fS7O$5i8pk>X8l$`n zKX6kFOerJTCDq(-8pk0@Ny+Ht5I@_UBUAY`{xr_c{hUjo9cG)OTSr!=@MAeKf%eHE z4=Zl0w8ykPS3lAYW8Quws%^1!5;+fwV|5DO(g?vlT^P_|y>S)B&=p!i@6p%J2rG%c6Qr)orZTJFHgi&sk zq-J>S*(1q0*%}5{g`qkol|iEm;kphes3R ztuw8c=R%?bC2ptJ6)R4uV+s~Yk1bQv)g%vL8)kIFbd_Yaj4X3_F>bIzVgLGCR|_G+ z^f`d`fl@^DYp(wbND5pAo%{Ul zH;sz8(U10v@}1C}21W`wEro7m*CV`Sx)GCD>F_eV)>dyGhPc$O%*@hE10;S^l*ogf zYyReyf1Z}|&-t2UNf&3WtfdVkvr#TgY%s$dBQemcTaA zJpc5Hl+zA|q#C{n4~Rh`QxO0ctx>N@Vo``@#=>QSF&Hq1*}pOatVhZ+j5Zi(oYzP} z?)fr^k>gNakEJ7TRdb81S!>|5ouz~wA{dJ#s$deb!d^$jlC|V%>Y;nzWgAh+x`Z$8 zxISqZu~H3aM4-1929)sCl)N~gEP9x*ljJc@SJpui4k|V<_sosFGg{;x5n0llOxKef zFcn7DL9t~{g?Er@-Yo{2?`$Q{)E<+TjFmf4Fd>CH^qr^;JnzDDOf&BOh|M#?!Ngu# zL#HiUh7c6_clfSNI2K=Mj?+{_;6|z`in7{7yn1H8&33RkMqY_%Aoh+0!+w=@1H2um zBdJAL@nOz-uW|xVtoyBcvNGp&JQE={T;i>OFvgPQ$x^20sQP;lERklN*}2A5`&sLX z2p^q8GO{q31Yc$20kr@Qy-1la(BbN%J-!h#HDI5O#hKDd6Hh%D2a|}Z27oaWyADr2 zrGKn!7zdCrnvCiz%3{8BvdAojCs8^prUe>~!j{O&@0u|uS;+wQ1D8`>u!}KUmlS$| zP;Z()2NZ7FqKJzpOOkM4pqST5U!ijZ+L=7X$+L8DJBI)!8K%V}+0SUH$-;}AuQ@^> zGvs|QdB&)eo6X_Bq}fgvzGfth&9#?6qhXgvVhsy5!KAgj!Lig<8ogQAsH99UD-x7q zC}dI72z@dL@){QJw9k%`{17fXVb`DB7xlnQK4P+5v+d7&6pl|qiyHWnB8S7$ug1i| z*vm>zLPRFC+IyxQA~L?AIu!U*x?sl2ZD%4~f-w4@AhTTf49JQEK*5We?b+!qpaL_BIpI;ptf4e_sx4n9j@b^Q^6oJ(+3C2ewQ31bb$7BEm=FOm zVc9g?h_=wrm0~e*B>|UK7+G*R7%+00bNB|uA(X`dpuY_CjH<2Ers${9ZxK~Ve4HM# z_zVnj`qm2^V3%h;2Th^~QctLj&pwZv<^LRf@SV#Fz;#9zGWXJ{SC zI1wk`YinkX7-mLFFjI2vro=&N!4i(>@jY0Kn|9}!DiY@~XV~VqZLm-(38ew#1_T~~ z{>ANQpBCyUtSxAj}pgB!#9B-T%P~V7D#WBl- z3PpnDUHU>Q0vJ!pkagtLB(h2nhU+|r{1b@i`4>ZeVZm9Wcu#4ctS-9o{O=(P*l)}|LSCt;8aEub;idtl3|>3C|5BdMlaVmKp-{J{+PvwwzE#|k|@G*C1o*8s>nbAmdjmgS#we6uu;N1 z$v%{-Gu>NZSMUr6pjWdvm|Ej@dkdY?daKd9>8Z!%^@O!Cou|XZf>z&MZS;gBfQ^wP zFub^bMn-dXRYFz;P&0Y0R&S_&?mS|#9c3MYg#bbU1Dyn!0Tt6yFMI>JQLE&N4V&Jx z(JW+I8p08BGqFdju~XT_Y@@xtM!|p>%z=y)ut|UC!cx{kTYdT|{`xK2Bb>V^jx5)K z@iA%7P)2ZUIBKIBvAElOi7z#Uz=Gd6nrB!IEaPuMS}*Epji>Mqmaf!&!#fw~fo#7c zRS-i_yyF1`S-2NBrI^@cEsG=i;N$_#wjt!efDFS1elUaYmK#~E@}s-ru=-G)~leO7}Hr;Et1d*b}%MHxA1vYq=z4r0X-hD$%Df z#)yIGY@oQFQk&-EhQE9Z00gd+ayC=$Z4>5eJkHwOLZq># z>crfDSMBQT>x!9+pzt!IC^}wF5|pItG{s!B@w=K@G`GKWlIvc(Se9-tvbT|1AAEFY zWV)$o8zR20M{N6{B*?~K+%YPBk{sCV!(xwm@MbHv(i5RIn9w1U@DcxYT%_&OYh{)T zw(_2EtC&W_i6omKeDmE|xWLR}A>~ofJ8tofWnGDWZM7V^0KXVG=)t&MshC|LHx|p= zShT|MNn>vjIiIn@kYQv9=&Dl>l1QFg`83KwO3kl|B_3_PY0G7jLZjd&+71j|VIMKO z;fTWkqA9B+R%FMUj!#Qyjb}qbcR?8F!ED+qkhRaC(GtlRkx7n$9;IT+2CdMLJ{F#4 zhM`QqX8NOds{7!fVe)vpwP9Dz~B1eO$wN|yit+6{%i52-82 zS!ph%w?;nJG6>fsT)1+&(LkXTZHlh0f#HRAC*cTFt(A4xyh^*o)s3UDjc1(dUm`R- zx8;zmG(DM!XgFS`9F{GfbXMF3E6+yA!_p{j1%>G_i*fIIXA`w~H%ljlH{f?|q4EW{ zItW?PeWK)>@}jiMk*w7T!G)YK`S$8L$_LI8p9wpX+F3A-0<-b6ig5{<&3FL6mrz=8 ziC-`_=$JtZ>qH^yumzv|QuGkXBBHstM&%v88;s!wG|SRw(tL>&_wPM@yJg-Y9=+WY z=_}Nkd-TGHZUv^2b~my*C~Q#nE2%~OQ#$R&h@I*wc5nr$-l*t$luv?kVBqa^o`P2W zbvKsGq8Q!W;;N>uvoyu22n>rAF>@j;qLhSqjgC>$ZQRHhx(+S$bfAagQH^#3P6~3Z z(gkLqxXIXwXOZi}B9?>K8X5ffEytVIGTAAL3zow%5~WYXPFP7b>@d!`d^+kL1dijD zsgiqSsE-XPu`2X-G$5Hq=r z6;Ak+@h4R^-cwb%S0emecjoAJ@zI=qMauC_?r=`(<)v@b+Z@8_NN9^~4x$dMFgP3X z3B>}mx#nY9B@8qANJ?S+)mgyCf%W!M=!s4>4Dl?;%IhyDtOi@rI9*y7!|BL)quF<9 zGCzKsQ*cvL>5wsF&AW0GiAW17#Udl|E0Ol^ItLQgu+gHjy?B!#X^}FmCo{Ms*QgQ9 zcGLQB(fcu>%w!t({orL7-A>5IS`c89y`b_!}Xr``@4y`jOv8_Oe0*ibZZ@*&mdp_nsZ1 zFByYj5YOP8*!4vS7~K{c7E=$*KHTAbv^t@$oBKJ^w8=I?MTa&ZezlSMtG3zDYe+{o zV%=-{K=er5SCsoc>;$40kf!%~Cz95Ji=@<}sKG8=kfLPbYfs*wEz>0= zF%`hQsXQVQN&jK3k<^GYC=870c%Zg@3Et3*7NP~py7y4NTMZGjbCC`I@JT2oer#{l zVAhQywF@GdAzoT&rlvZk|4!z!V^wLTIvE+{BqQ$e|SB z1Kw?+hAu!wkA+DpffxsQ+H@@-(h?y1fCIzyA^#5FF#obkfO(K>y$BC7Zmlvz+(Fb) z5(+|*9j_<#8HrhXk^34Ln)ka#8mLu;V^jb_QL~^WQZ%Zxb9q18AXlR{J)y$J=((}h zg_C2cE+#;!X`HkOgUE))Zn-C-h>#lu@K?5ql94Pgu%m zP8EHe)4kdzS$(_!h}cU2Nu~~Fu|N|?u*AnrPlOL(bUiWCw!KXuDpo@y6wl&Cd$KNU z8(y2yddcCKL*maKonT55M@4StFr+l?gQx?agBzaD0s{YpvDG{sF*=^L!!4s^^vdHJ zq4JB7o_m^DUMh9Fn%L#qXOcB?7nj*I<8H_mwX^7X-iwQpkR2ix+nzo8ZK^5GDMw-H zF>99*^=*D2#WWbY<>09YGm0#_G1p*{hq9#u^pFDenZpVh7XA~kV*lbDJZ95f3aX* zM?DaQXMuybQ=Lz|I4n0!bq4B;o+`?you=o7&r5jk-9#e+(h*oIT&R$ilo#+V z8>I*dhlmbyA}1|fjEo7_l}TXp*$0?%=tp)N}Kg)yuXvvaz=Oe~X$NPVmF5j)=D zNj*6&PepV~Zkf~2&A7+mWg-bV1ekDPWp?D9vx1K_gY0*h`XeUxV?i+>rO4cGalB(i2FiV zatKAWm~aO30)(>^f1#**Ma!KgRhjPW(2~ZeX9s?=1B-iR^9zc^@r1v@Hj`>%^Nd=A z)Far2jX%nzwG)m#NsovK{|$@Cmq1`l(v}qZhwc2sI}UZQAQ?k$-*+FGtC%|+K8J!u zTDj2)-4Eypv*mV8H3`8{(CTy}8Mk8D4}ZVoj@w7s2mQkJ4P+{y!vy?u%WIvwr>9cj zkkAp|ctn>vlI7i&9%^r~6gNAlIHocg7^T=koEmcFIdg)k+7+*yZYA=Cxx;;2DqC0z z)Z_GgD5V@RYpr{iDZZ8p25Oj6J~XnUNJT@E2HJ9`(~_f% z9l*}X&=XOsu!s{FT14+8y+hDRYY`NYN=N83!jeiQ-P9d7+AoFLl5Ct3pa@50N{C{5 z>QaEit+r5_Vo+V9G;)X|RKkvBUc*?|ZR_!Q2rDsqjRGwEXXILWP4ZKSbuy2whOxn( zRA^X~L0BR@xa%f~-k5JywHwFu-$*7p)lx~bs-bj{UB$KVvf3zGjVo=%4fAUAQVR?s5lKJN zTq@rAb{?2<$xP22)r4N_Y&74GWa1op3rgQ$CrT03jBvQk~GA` zk#r=(TAn8j<~2r~OPa*aUG&!nu)bp z&M;Qv2Nc2NwUgUs2SJjTsHcHH-U9lF-8xJKIQR zcblEfX#yU3f<~v@Zhh2P!79^#Sgi&vj?9M6J*{1N%@w6`9D zG$EaVl%{xxT~-7RB!5J>3gyr&!?GP~x=h;W)%p!$&1q*crOsE^UWhbMOB_?A z-BU(XVsQ!$K6{P1eyi55Td06_2Z&eSvqX|@mj`t@uwNTAW;=>GA~*&zMd5FT;a_AM z5&NCQCKYF3SAolQiE=f(LOve)Q(y(zIU^d&E~>tG!1|2kK+vsPj69Qto9IzQC)bnf z{Q*g;)MqU;CTQoF_?h!bc(<8#AQ{%aNV{673?m>(Ge)U^g31mnB%Ob_P!B>gYFtSg zMa6RxvnB+stax`fh)hX|6pc?<+a$jM?*QVSV|e6;k!6A>y$su|3{Z^$ku#)?gkF$E zUK?I9=Z0pyRBox3Vi)jRt4TaTTKSM7GI2S;$6|vhikhUG4hqye2umnze}+T|X+(po z5Ye%4udM92s6t3zIB1m54e^z;rTP>A6CL)Ov~1!*j?*ZFL8p` zq+SS&$V}qZ;7gtii;AOr9fk6_tUl>aOuxjM5?+ zo^AA{TXjOSBv~jsV!AjXp=06G4!sbidCKrj!i9ZDt=ThJE}dGYQoGIO97+3%(GtU= zykJfeBb;pGxIcKf!?IG{;Cz>?zCFC*ZAkzz{wu-?xG2QX3@Mwwq*CNo6fJJnl5XaU z(NC)R7!p(ewsDBdWiL@RO~`aa3R><+!KX%(KAMamPSU%k=GsE7kmMGhmKT4(7@ zdA7>P%MZq)4>+2AC;T+Sm_e3A4y{5Io7{$C8l9RBa6u31RKt0zrK$bHSMx;aFrl<+0PM_Sp`WVvu zEVkGb!wC?Xv~kazLVt}*6N+NQq0J~;Lg6bY*3fh#@{_7yJ4s)T7byxg^V~$SF(Z12 z$i!%o(_sNC>@8d2phJsG53Gu($CCsT?M9=HfGg$Rsd@645z1gp=awm_HK_o1mWWhg zWq9X=>M%wDiFu%3UidxjnMjbX=V)he1f(UoD8rY$)M&8esBU{0acexDTtu#^|I*Df z?2-=M9NcjTSwbFtO_70S@aQO2qoECTfWTJintUsgyy;i!-7Z@(DTqvp*{Yn4a<6?S zXx1n(w)rcw4lJI!pNj4fYg1xt@|-jd#c#tm57%$x7fm|S(ps$yRjSw_Mkub4b>WNk z8Mx5Q436en0`r(;T`0&?d8_26>}BQk)^#`sSGJgIQw(Sg?Li}h8ZAFlpRkX( z_!ZOD{nwed$4C%}_uv|#XolfAEfky$y8fUMs}{nIujFP>ghZ1dfoym^K9n|`Lau|! zC8l2$s=8sJ@~meORTD#BJeY+nlZeSmr}L7ViwgqnIPOf>aJxo8+nXhxU* zD(n+jTjW9@6y5DF&;HIjtQ9C1>;&0gxb1bXG%2tWp;U z7$74t{G?w`x7==8aDexQ89&)}aw7^naiS_b@M6_V$iAbc&bY#4A`06mQY_{w#(K9- z`g6^tj(ifF(TzFga(ebrbe0#VTMR1e-7eC2DF*--ufhXij7pd~R`y&=gOzH?JA;Lzs)e(o~f}^q7ZHg{2rc`>i-pF;q z&83}Rbu4zmk8trRWm2Yfy9;rr$2|hQ~IMam>x^yze=kS-Y>SX@_F~F0MhQ_Kh z{ezue^A>o)Xr7E%v=Adn#E8XrVM{SpYz5@p?8sp@uBNJd-mrjwLz}^bS_9lbHX$YK4^(GSk8>Q05{GkO6 zI<_#1G-cClE~#;@j_EW_-LfrZo#v(8nDOvfLH2o6UhYZtypXBq+5C-eXC)N`MY5?ZNljtWDLmmML(bTv{Fi&Sz~_>vQj0&Ob7lKFT;Ncsp0_l;Ev zPil+JjR4Nl>QbxL?^g%#w{q%QY4`4ZH{G;n?_4#wZk+Z>FFd{|M!wNvQskf_CyV>s z!UrED8YmlSij{si4qKH-@w6nC?ukFMK3W_DGO;ahu8xkM&E+OiU-xQfnwY_Q3ze#m zx<;2+a%$P6J z+H0T*cppl9{5jE;nY5dg&}3ZBcRU#7@`B%iVxqT5&jdfAJMxm#ea`uc1YIXYtLQ#s zUIT{%uJ8{;2NkLs@cm+#Q&C zFfrzqBbrBN60gXv+z$IDGHXPD#FSLYEFkkF?5_*8{;58f%v#{eM5)<}jNGoM#!Uxd z&tbKF1wmAedT2R-qo2gO@b63_Mj>2uP$Sh)0!7ER9AEROcNA*LY4#?raO6go##usI z4KY3!ibim)$)HS)fw*Jf=tv8KCpuwvZ{e2qY}{aa*k&=RM=^YCeM~K)NeAInzm`gx zMm4f8f2NNnxrabI(M_|tL=E+%0z9P?hFmSQUt}uk+KnSF;JF4Uab@`YmoEAs+``HZ z<1#;;sgm89wc43_qdQpj3J4lHhT&9<%vLV}5`RK+Wzsx?(6>j0K2LN+v@D02bMa5J zXfavAQa~ERBeOcPyh2Ap4`%kScUx@#48!{%*?}{p75kD&onI%w+!pL7Bc-(>a~v2Z zjLxM>F%G`HP@9NLruD_-!$~?!?3cI+s%uy|PQT!;Fvd`}PB&w5W|4VAV!G7*mSKa4 zW%Zj10>@DHMaCBH9&Og|(zayUtzg&-$z*Lr$E8O{hCBFwH3oeGJKpIJg=FVXQc?yr-;qAU!F zl-|6fjo51BS|BZ(MSOeeT+17}OxR-FC~cZ=Z3GJ#Kk0P#T&y9*a%fS9tvS^$YnBKR zdG}~cq*YoTOm-C27CPPiP`Xs+$nx*$ucemLV9Nx_Z}Sz{bJnv-eacUj4G5^MTG zUJM6SyboJ0hZQcRyoop^)a)jy$M)dVQ5ADo7y|7S@}@ieq9;JDpE%CYwe*lL9watd zw{didEXFWz!mh;DG7=*i9|tEQWlro2Kq5W9`Oaw-N4?xYGRBH&+-uN5+aMpBS}c-g zyO9W4CTY&nsUS8D_Yye)=Lsjr&{ad<)kWJ@gn;6z) z$WVBmmH=hA#|pQlHCUiw#;+5faU~j)!aVnoDgSOD${Mo@m~P^niik!QhG&w391Yz; z^hmml6@o@40X={w!s4Sg>TITT0~U)plW>*)<8f7ZrT%ha z>5RFvG^tHRrLcznG{r}g4HMCikYCNxObgCWp9y9lbb6*r_~>wQkpZ+!5tJq{3<=3E zLeGbZ$(zyk=PGU)?kLCPp7chEykew)(PbMwaK-Ftu2`cQN|>P9W!I3ZW1|$~W_MfS zi$<+-0|HG5_pFMh!DMCfCf4g5dS-L+ijtvZ?_{oS%N zu(ByKa;do)VGz%9&yyiH_jMW^6`vUl29xS&?3Nt>Y&Fb8Y zoF8T5rSka!L|z_QHcM-C(l% zs&VJlrXyykWHXc+6N4ifzvF=!i`pxW1h>X=4PE@4fGIPPbKqQpa%X9Q&3J1yc}K3S z0`ei|8j|Pi1%-GP-mraL+INOOXH76j_7qPTIb5@SWRc24%g87@N}Puqa06Yyk)NZM zp7}d;U00VEhf`5!2%RZX2{n^Y?e?8Q>=IR|l1_02LJpDh_EZ3k z7N-V@j69zqj{}PxW&lZ(ppYGxt@(@+208DZ;&qCkZ(vrJEy@H^qbK(FOsiA|gWA)Z-hRn&pjt-z%Jgq630>M5|aT z48z(f6Za&xKzb^uaTpZjYB#9YF9E6f#L$Q?jmj=eYI5qf5GtKm$Hk{Ia*WuH%zXml zUJ0Url|1>B4;Mv5aHQr@Q@s94+aYC` zWHge)WVqwp*5tnUp>Db?T4HzXP8K5{NlubONh7g12pTu9*IHEs7_Xp=h-xn*>1ej3 zA>x6W;1IwOsRq7som5{rMFn>v(QPL8g`f0&Zty$-HyKkTWZaYxzDs&E^mz;LiiH77 zZGJbp8Y&iANdI z5!sYtN9R#+J{1J+_~Gb$W%y;5F*4?MD&V>=BIa6l)wi6t5INgM3hM$c;EWR)->Dh4 zS*NXgqr;)Oc*905Bx1dZ=h$kf0m-m`1kdl#)Fir;LnK6|Brt(4N99~`I|$at4kF_g zfsTz7kijFj5N?>MI}~S{6jM+A=zz_wMrF|GM(!@HRt20jc8KEy(Qqpa7(3rNG}&_S zK~7+it&Za$oK(=8><4r*sSm^kq#34Wn*F(U-*0Zj>@H8Xfc2nRZld>XS(35GlD+yJT(#7E;23G0hJeIgp6K6K-t*$S9iayCT>&(oWb&$Dbf z$r;P{(gRBF9!&q224av~9GQsj(Z!({ZP>1?I)R`U(JUp4Cl=lnDkfr1rkY2g*-dMz zLB8=B8u!pbejx=7oAJ(Wn_f(6HVef$n@QwyHshiNR0b&tz-H$S#$W*@{)kHOL9nN_ z*69yQB+uj4D^kcJ%f}hY8@M##nr`)-q7eD|iZqkKYi!qgR4$3yj#a8t;vOkc7$yB( zQs^l;PU=H4I*H%SPFf}$j)>v)gfW_dvC)w68bEjL@AK0ecYAg@<8M6A4Ir%o( zC}nNL8qQb2e{;O%NJa^XWbVLG!d!5Pm@M6CwT-cyOIYzd?&eV{;*&SY?LgpPt99p6q99`y?=T0FqWI9W z&o&gp^Nm7oo1Rl1)FeDZImwWY(I&TPz>QECdrMX-Nz=Eu zfGgq@!%PlA7HHY7gR+Q(^B%;8Iz-u}3X=H-1F#t;bO_-hsT&&thDr}{l#poE_3?y8 zEXfk;iFH7;u|~=g!crphyz5i5%gbQLr1iLaAZMs61H#zmDjWQuMzRo0NcKHtgm;+> z9_Te2?RsmI4`vRGx`hgg;M&~f22w{_SlX59k+~&QLJ=9IX&^WdXN;qTX`6(bv9}UE zsLX`U5w)zy1r!gxF;ybTBk}rG%d-C3P@!Cle6iN;wl??I)<`B2gUjVve9Zb5mV<~_ zdd~OUpjJ>6-f;aYWMMZI5aBl1z9(gwR!NUmFJETT z@Nsy>{>|)#1T>__EH3hoElW8(Y^aM3A0w+wUl`@wEHIR+BJgF z=v;UF@33HrZ={~45IZDMA09}3vt7IBE(u-43&z$28cMTpP#IoPnZ=|`^aK%+{TPrz zAXN8G*^s?j%r{H0rdRVZJPv0AInQG1KlEHM<8JUUk!=4}H-on5+0AZSP$jm$6rCCR zo}TkHjkuRmj5=^@l#g+8?sMVbVVHcP$k+;$oK)s7-$Mf@7J4eG}j<%=M%EJ*7_`is5<|B%BJpFl?5WWuQv8Deh{p?d&rOZ2V|mA zzXE31TD(F};xTUtfkeB42k@zB-czN}Xwr{SynrX;3X1mGPdtVqb)m#ksZi$R`0zk? zfca$049|&%^5+aIA%>khNuJh2@c+QKC2HL3<>b*#KtmI^O-O0TgSVXiwBR0?9QAIu z7!$+Ut+O+*1eu*0)(8Xmd#K~|Gz^hLGo&j0FE)Wz@H#M9a42B{sB>B5M4~oFyhO|U zQxqzRyp}wdizo5F>ODb8SB>){2n;2KH4GrhkdxJ~2xR^yp#2>tu{zTLFf3|yLi|$g zj^TzUM^!5)BWic-v0Hr)7OECr1dfk7%mRw8{itq86rL-Zx9HrsL(golKFNlC;i%-R zamn6B2&)g_%?}{XY9mmDpygNGNtwd`TV5nYDM#>^$-z zwbYK9c}nxBlo16}Vx*};AAo>Y(B``EyE)#KhJog6f~nzemdo{I@VMDdA7CQrHhnP@ z@45JrnvE_lDko$GY7rTxC#ifa<0+fx%T9`&X;o=IfA16L^V+!3m3p=Bv&0<8u8#l#1vL0UIDSDtASMZ{{MN z8J5q&8ppy^SPehWK0k_LTDP41M8TaMVP$6>XL%;*-n5(J`2BIXwp6Q8C?n8nMB2%f z8-cyrt*65ub9AhX?$Zg_R$;9bY;S|?7G0Or7Jr`^(Gza@WP&MCMAKp0=x)#CAS|<; zETlDlGF1r!WKkrf$w2;y#M3wc%&!mS{i7wV%2dX+wDmE#_U8QU?qTJ2Zj#PP6hbd# z@MZ0-xM5J3Oj35;+bKEs-3nU)Fzg&$rda2ybvU1Rg-7f6Jtji~tm&ZToE>N%sLee> zrqtWNe&qOCA6Xi}amd{4ChQAb90Q4dgrL0FhbPu*Xg=+5gKLs3Id2M^Gi;gvLd{gv z2L;zdxYw|uxl~}CVks6FU}QQy8_Tn^WcFD};LSNz{8LCHDW%~Rgth*}dIp}jMHH(# zOkpz$CXH<-&9D(T%Ju3h>rav30Gg@hPhY=UoX-8MiW(R1=eJf?1=(h<=W=n5Q3-;RFDm){Ya!L?mEezD`4l%f+&i-kk1SMDe$=S~X?$8^rD zC&5`{7M^vt|B5GUQJ)*NN9)-~u_T*QNL3O|^X#+`aI+>-xA%>-tUL39s3tBhmJIE_ zyhk7HDb~e@qDgHqOKPbn9nT^tK1~&!IVc~arrGH}>x)p(dx7sQ{JL7XU+r*7RTd*=fy$tmMr+#d;dJbdixZi@X% z52N*WfXeXM;W4~a)647|prs1-%B~ICzZ9*KlI$gQJbOm zX)EBx1mOr$c(I8!m2nY6ZL*iY--5jH(fF%}!sju6eg7Q5?Z1{wR`rYfR;zfmKr)r- z41Bqs&ZrR(4@j_vuf4_M&NHH<+uMhYZ5sv|@m~#|t9P-UegV8RUHdPZG6$$H``+LM zL;yhyRppdYv0mOy>458n-sbY_Xaimcc&5|IEm3}vs|od>wW8(XdNX{B+J+0a;JrdK znQ%uC1CG8-*Xh7#Jzo|_>rCJq($vi>>_M(gBO>d}kAO!Tih&fIY=bEsa`E>)xm;;E zEFSj`@rpY3EICEZNVl4>YDd~I+w>ssbFjbGG#?dq4H}v)@Y}0XP`8~;Y2_KZfc#8= zPz7aGFi1wrX=(Et7JPnG4t$~Uqcsioqyc6#mWiR79=_hqpg03$ARnhcMJuX|+~yR@ z27cAUXfh=?#Xo`*8~l5{mHtA?+xeWdR-q@=aGS%L$)5U~>c~QM`lppwo5lx0>z2Ns zNlK%g?@^8H%0p~ylqRD)^bs(zp!C}hnBq}jRzM~9WdSwEHT^eX3*z)6f=L|wa=?T8 zl4@`CHG)scKDtI^y+$_3>;qa&(7do5Y^CM;6C5;AG4aV-2w5RKc3CsnG!8_i4=WAF zoc9BH>tibn@OoFV;XU4ZEOx!c{E0DRYnm?zou^_1hz3Jyy~6ff>KQ|Mc<@nk8$S1Ec> zNziY|5H|I8tePCbi8VciAcmveFX(rr7U>#NSipTh#r&5njTjVA$Ng0S$^|KkZ3kIL z*r&+3QunB|G_EgTj2^Blgs*yqN4}?IFp)2;$7Js4mqI$~GnQ!LQw@`Nlp2kw1l)9B zkVGVG&bD~28>Bg%;=sz2uT6%OFCOO80$%pkAPt-qO^XVFpGZJWx*z*@ylm_P*QRCE z4!khO^<=S-bzvXj8Et?u5q}h^qI}8@TL$kM_E9{590MOZv16X&s}#S&XLwOL3R5&$ z2DuN4$W#Dqcheq3E_VF{MOMbR9s5n6Xc-4@7{^eIr~so4uRp|4DdGuwFAgjm6w+Rv zt3i2bVbkyO4b&Wdzx;^>oOiTkvUK{i6$Dzts$LC0RUfZ7HlRHMcy(6yBCAx*sSq5a zwVynCvqkK{AZ_``NO+oyK<`G~6RP}(bq4-1TAK|Hn;6j@L&cEKr*drA7(b~RqO$lQ z(|$;pWmGAFz(%|~|HHXps^4eYovZ&8W25s81yHb;E@B1eg92b@K!r&|Eq5e20xBy| zA(cARxLwW7jjH)N!u&`Ej^lD$LJR4=2VHWoyBl(E9R^g;FKCg@sWaWN(77Xyv2>zO z2WPJqy{(c?lo2uFyEQM1`_V@EP3@}8dwXY8^lMEks!`>_x!Q&jPKe9n(%f`HPj9+2 zIiThU)_5{~rt~mDciPSGC%(QXO3jgj%qwUI{Skjm*EJMjg>06bjMb!Ei!*3b;&gVY zQv;T#@#jYzPQVoO=SV~J0B6!p>TdmN#f|N^mZ~r~teqHVq^tKu=FXPOA06y@3_tVYhI*YKW5=NjvZaDp_Utx7VJd$i;w(bJIIJnxZ^ha5fxq4}ZHwSlKj+8jrPjTMDsyXP`mT&hNh$V;^Qoccbe)NaUa8P|lf+ zJ{3jfEUUR#4Hvad0-jdx4VVXt5-Tf>&*hoH^icI0`sEB=BV5_ck#(KpuU$@HGV$EK zc93_4#}krQ{~J9|msX^9NBi$=qI$TO0=qwDd2Iojam@@adcmM~$S}}&M$?<|MC2yS zH)SxRe1KJ-?|DP@J5(>2VLht_ZP(YEo?FwztZX=rZdC1DJnr8ipXGS4k1X##JEiZ^ zvC!s1-ZnR;S1pb?r20B@VsyQ2|6*DR|DbTl4T6pa^0Km(T{?$(?656VGXg>arW^SK@9 zLl-^V_huy4HUyRpO*|AEbF}aCy4f71 zQdX#%O)kcFaZ2SaTdWEXGUkx&0i-sEuBlzl0yc4Ng>1bK;H@vp1 z@fWa&W54&)c2f`UHk;vQ3#tlU9Cq|-czZY8Vj_#q`5P@J!!;%aV+7}TdPl&BPb5M; zjS!2$ur+(Qiy_n$n3@1xM-(BKsyUPy2W}qHXT2x=Im)gJEGnNz=5d4Em_2U2^np3a z0zH@LC!r}*{mja*ZIQQJVp7uT1C`0}oRA+B3=qEoz%$=D?zS+^UwmP%8fFutgAd<@ z{_6NeUu4K9{Amavlf6kC6Yo}nQ6rFc2zIe)k)f$%@jbdyr5>2CZtI9U7p6OmXn$?c zCxwItWO+fj(3D-B3Hz~jK_+?tfs)U$-D1)qQR$1IgR2Mk`k-_+l>O3N7X~#a)3pnh zA&a<4FPu#S2cm0%`adwF3KQ2CTlBd3Z{hpO@;Y5WtsE|)>o|1M>-SNLpwEH}inv%K zbKxwB88KLej}Z{xVo284h_K@awe?m%0m?))K1ArZO609E%uFr> zz9=+I0SQwqcudjKH^kBO#_AXfE)kXA8i=CggEPS76|HQV1xSUMAuYIvY0}ihpOURV z=Zo*lpPTRVo9SY@m3fbEr>pH(F=u)|76Uy&F^uN^$_Qs`)@{I&Dd$&$B-`gS7=lB* zL*hiN2Ct35+sX<0FI-zZuPEJ>-yIT;ggNuX5be-6-Wwk|zCfm~%|1ND2Zf53WmO)u zL%c`OG!UZsVz=CF!~yt{6M2wyh5`N}Q-4V>?ik|2{LLp34?bP*9g6be3z89{o4%cb z05Jc-HD6YR-YfiJw3aNq2@F-_Tq~?-qvFKf-JQ5{s~LNFNj=@EM|J3Qeh>Kpf8M0d zJ__{3&^&L7N(~{*hn;g2yy}1>TW$TFfFuvA%ue`+NOc$jLbea4A3=dD`BP<5Plj*H z6k(fFbd;T#{ z>uwk_9eMf0krvUget#;+3G5-!4_gsBp2scH@1fY7vplt#laiNL@tOg}uRx|GE9ngS z;)_35LoO#QVElbJ{`!458_hAj;Qb%huip%N|2W+vvrOLKJwW6=f$7JK)$->od_?ab zXY?T*^y7Clti1m$36wAYv=XROO`zmk@T{2B;;NCC*L+&wiqb38Kt)fW&g2KGo1HR@ ze3=Di2B=-WKbxQ=KM7&FdNE#Z+Q%Oyk(6ru1&nu&u6{!cpjYR01rab#Z*IQn0;LO{ z{LeUR0_Ha-GOXp3-M`@5vD%ShNE9p!-OUV!JEY%1)Sw6?;=d!MevKtHU%<*5E#@<9 z8w>!Z(2MQ-9@B<|eanmSd^Nh~i7Qw^xtU?q3Pvr*D3B?6@CmdH>#?S$e!33D4*FH} zo8osOKFF3U{gU}(O#gcGN=AC&cz}gPOGxNL_BR#Sct?$OWbI(?>g@O&vMhDtC|;!K zp+qEwy`#&`b$ako#5bRN%-`hKRcE=O&8C4gv*VAYYg?lzEaV}+clio!uTxY*muLfQ zjs7jVl(yxlL?$77%PfFt%RgsK7``3mR|%K~ljJkX0Qe4}5i)h7fc)lQUrvS$mfO9S zSU5$!g0k6t>|c%9^I(Hy|K{;lwgV>S0%pWvj1Z=@Ld{BbC<|_HLUp{FExhaaVbyY~ zHR5Y?3F3<~B~k2{(;h7@!D0{@f{c9wcCCHzZ7wNDS=&8}ran%_8?fYHk!rerb5oM@&_!MG1{?CUsS3!l=8GwCx*&4DCX5fgYkLW3cV7h_*o z;1AC=5QAZtc$Z=dH=;nntKG+?qC8t9yqOt4p1bOob0%!yo{UR5DQSf@gpA96V9J;D0iFNzDgX1cWd6B!)!qWvhTi2kqkga~Wp}Z%qe` zLJYxCxACy8G*TXPA{x`($Oe|g`tvghY+-z zvX<}=uZaYNf>2)AK1dra9ChN|{GJAQz*F&zRi2xW{SqBoF_)(xGY+*%gJpQ_Ob~DZ z{P)dJf^v~axaZP`)d+>~Mtq|0VopjqrIuOpJ|TMKdWAneO4;vuey;comSxU_tOwF> z-#aMBk=f~lLL)rRj1#PZszIFY7W^4`UOUHw&c$x$;ZlgL4C_)-=S#OGx)VIAeMCleS3nO4f^O-YC76_|Sblh&0tmiW~(70smNjQDtJAh+DC}2)&nL zm{J>l6tV|EgnGD{pJB&AC5G2UGQ>R9JE_ZMWE5{ChVaf2V*#quc8q za-U#o$a~V4F(wF^E+||5{*T)apN6vHlAE0D<dp;FrI9r*D`a-o%zc)*<*jP!vtlT#-v~E zSpG4YSRYHI8L=A_^By`~7kBySy#UHF3K|tSdz6N~0ex_~{%b}X5`8vF!4HB>|7ZF& zlp8~WCQ!DCif+M#$3TGsU`>NTaQE!MH@*4I3^T z^Y@^J>K8hp6V1yFF>-k!^8e$u<0Nw@VJixJbIQDR>Gq%taNvG5Ea6G(E_tVw!W1n; zYeZ?<2&s|7t36PtYjJ&PM;HImGa?kwDJVAT*5FejYz;nLQ8Sqi)bW7&GO0scrm&!|ceW3M=;0=VFGe_u9b)tB=Xf zTEVX_=N@$0^jIZ=1m6a}jx$Rqml4dx+%g&olX*2EJ7uYEw8IcpRkUllid1d&pe@~S za!ke{`>}9KF@r97uGY=gxs18BtT9OlJ*nDu+Zb!Tqq9T9Vg>FD22A4J`}DdFgj85FkBp*u04HBGpO2#&_oP_|{=sy#bKFS%TdpWjNgsnL`6#FTL^G#<)hn-akZb|1kklvwoyK3`hhpFKUepE7N z04fo@NII$fgyn)Yff$+2`o~)Irk5F=g?1%qFSKiP{Yg87<)^E%fJ@XN(j2<>Y0hIJ z5O}|Rd;$E(?-^3cM*FGi`CA#>GFF~q@_hS*vsSB1&CWi$%gU-dLsNjC z)6mOd%!%0cKwKjAB7=`U{6jSi$Q1q|0d8If$YC^~C?P69(YFX!$reX@w157eqx)I^ z*A{BBp;1&8`Yvz)IL22vCPMP3Yl%M(2-ouqEsCa@l9TBwG^X}v(%%^3W|#x6Nezg# zPorh}-we|b05zvGozj96Y(L=i&C};xP7t{-^`CE(hzP#|*TC5lGCwR%&`?+| z0}_G13YAP;g+2RXUQBI?WR(YKN=c(Z`-0MV&K2<}gJ)^6hy%=t6grFz%no4EgtsGY z^0jV4g-ZCSM({%iLpohiGxwU6gocUXtKD+-a`t@J-@wr_i^=H!y8IYa=m}F?SQ!RZi)$e z`eInFA7<3xL>6`Yfj&HB5&d~GU$lg@H5ceNBEGI@(HK?=7!IUa!56J2CQd(?BpyMh zFcw*we~FwGkSwsbw03S!l5ZTnh14SEk5_aFTtr7E5+iE^#0W*VNq4O#5Gr+HF4#xb z;AGe2{y3$EM!Waa4un$SJkyTn13DINQJC4#(tahODt{*v-3<8vd`SA#-9l0RVS^XzKf*DFMX(V6BeKp~1+Mh=ya4R0AplE)-OS)*pN z-jdy}*|$*hRAsfF9+}JonWdeUNERGG!pMtx3oOV*7kR}qIRDyhH)t{XYsPas4^9Ne#Lw;_9 z5ivxZp#@ewT?_BKhk1Gm^tTmkWg!3PcOS~hkJKbLI!tVjm9XQ@KyaLYXHz=oP=L-M_CUyyZ%^lVy2UqddY{&h@0Him|8|2y-F2AzPCr!GrRN-t zJ-1_MrZJomB>?YF7X@$}QCEm4*jdufOL@{PM{*vK5nJffu?lkzytGYb^iaVqrLaoX zHz{I3SBjC$-y6cDs1p9?e7we1VmQxu*gw4uzVf0`n9h!TZQ{BMu) zS}%xSRGfzAHtm%m5jq=+S-UZw-Sy{2aU#VAIxwfg0|(l!{zqn7o}I&bRW^WLv8hYHJJ*gmAmz&C=(ai?T7hdA&rl4yy6<5!Xm=LKrA~CLNe48?!g8D~owC=3XjSY+D%7Y$%z#}C~dtnHoc%EB)?&mA2 zUN=``{1=U)di7<5rNmoa#BGxWL3rdv^<$O`&Yj{q9kpcK9#HxwhfaMG!8G^IK!}h< ze+D5CoM zL{f?myPQbnzGwZy&4(G_6Z+?b{(URWWHM;?42ZYl@$59helQ_g|hL-fi8M}5G00V04Uvq&`qY@4%jw~3iJRk*Y z-cKExpcY^T?wS%~OTU5&vOCo5PkHY}z@Urai$d%lGLOowfv~6aS=N?Dc#)qF;0r?f zt(}xMTbi+4kIz9%+30eiDL3XueN{=@ql~qq!t0bV5*4u}1lr`FV>OSOh;h|&z=$K| z+Zs$U#u~+BylY`FU5#j%;NlC9NGXJ2J*vPV3iKfa1!f_{=i{l(e$;0y72|rRNFlRZ zeIoP;zXwTdgp1R!Zg;6SJ!uDXY&#ylP8#Ie8UP z?!MWICpX!KBC$73&P*}ZE2*|-LmVa2gYJdu6G#Q=YZ;!m(zdr5#AJB*#6rsyn-^Qx z{$IVf<}~IzXTl>qsZvW@n5O~>DZdnZ68lnWh*xQ;X`pmAR(Uu7>djXO?HJZZ=+LiR z0SkYjP)k5H3`(WXkp!q#)`Pc0#%_vjDR#x8dcx8W$dn5k5&?a`E#8oU=HV}3=F|xJJ%-TT zGPm|l_@>s>bD${x#GY*gI~g6Too=X`@CcyVp5kzwRiGy8#1*U|d!`wgi;<`@SCq+; zcS@7C%qKJ#!1#Rb!v;U8A$TWH2&eeD5hhneq#p z=9bH!qx+_Jc`-(|Hd;^n_oUk7OtQ@hUW_@36TIn<>1d{@W}$75KeGx^X~sm;V#_mE zIxT~Aav3^&`TA!3^1szorA} zKh$)d*F&J;`vFrS7-KSZ5*HYeccOY4+%#xIlExK0`Qm4vM-Xt;$Hwh?Z%hj}+(lULO?|J*Fv7h;s2IGa>>+}w>Zti<6Qf{(U?eZ8vC8Sob&(m3*`3q%AM*zwkWVB>ha@<4a@Bmql-ZB% zk-IH!Xmz0UUcSfncfyH>ppK8HLxl6-;EJHahg7Dl(e%@#ychM+g7J^}x({OU)h~sh zwn6(Wv4-JLwE^=R!%2`?Dku6DcD1>Z8WZrUo|lcHvuiRvHp1laojx}(wf^xB#0TyT z*-|Q&s~>y5`HH!~-yM~ry}R)A03VqT_=edHaS}{_R?LFpr?h6A z)e5Pix8k87M&V6$F1U=J@37Pa(O9M_j9W-D;Fy%M>qF?-vp%cx!C^$tRt`I2f+`XWm*md>Bu5!L9miIQzY#ESORwB=}+p{LCVeDC+yJ*g?HMg z6JwwTkeBA%tnQeSC)e*v`%p;_ViJIAJcZ!Wm15v7;^Yvmh4!W(E(@=Pa_ldj8;z5P zA>z$8yi1-D4wC@-o3U?IHNIVEJw@FJ>B(aA=os~U~K*B@X zYO}GD0M~RSpi13PZrC_8kubcygYY`v)S1aHIRrNpw|}WSurGR)lonmF2+?j`wonPf zVS-U7{qSQpcc5NQ!u9Pr5`>SFlKY{lXD2YKRqn)tBGbv61#Lx0clY*At`#X6azp>{ z4f@ilAn@bGXoF2*t-;eD>U-_>&fBOlWc0G@zruYN)*8W|6VgZPit^hn5ZcF5iZf!b z!i*Bta>=$Rz!9Q0(k>2v=cY90NAsJ(+{M1!heod{!4fU2Mp4xOB$ZwxGP+U zX!Rxik9)>KT9v#~|8%@uJ(7&dd|1wAya;jzK!5ss#mefY3Z;c8HhdR8FF?}IGg;N! zSnWHWneh&jFH&ZnzPd-!J^%*1+iaH)jx&1m?gkY0{>{4|1J_a$)h;^^>7ciCp6jV| zfBB|rxsP$3$7Tyr(h=E28DaK`DbksskuMWJq~a)nvzDCjg#w9RL$3Wp0Q?p%d{_a! zuxvi7Nc3=fiI5E`Bc76)yM!(xDpA7)ioB3C6e5Z}8-av5tU&Vq$LpQp@%+Ji%!SuJ zhA*C-BDLp^+Kq)-bO9ta&%!Ic^8X`oREWUoce#>IbaHyt`A{tjPR{UQR z0xa+$Fn2`Ikgt+0W~yXBJ%l+)tU0ze^tlAx4z`&AolaKdQX(znOEKYB6qVTCidxJS z@)M?}VKdKHQ$H?wa}^_m02vHSmb+pe9}zY~n#8Zk+#AY()i(GD*Xcwl5Z7>8H*LV% zf#ggiU)!yhu0=!@^;wMrGzEumyu{H&kcm|n+bPwU9AOJV0T3&mRoC!-2F97c>_%&# zuy>eokRr`Bqf!MMw1kjBI}0{%3o+lJ|z@aPM{LY7KYeG>;N+uNia~_3n|+Ji&~;jtLbOK{9yu3USt8) z`oSZEOSTWe7^u0nK}e)*Z5_bxFO{B*#yxFwI>EenC{-NK11OxSecHXWBFkoh(s!VA zWDE9if$eTvQlN5eh(<{eE|)-iwDWX}4gG{gA*@+Psfu1&ZjG-qvTAav8;X_msyNPV zal353Vlj!DTeeWhpF_UrV+No;Uh60)k$vv>R}Qfc*L?-xKH_LnbZJut+^)oG;b(f_ zc8;O>>v!wrgPA7MXIQ?=)TQGsxq=Vu6oO(M9!)J3fbkkIg-g`Y%}Q#odqd?Y<~N0@ zRQLjC>o6>4AS5cQ2L_LHRw*8_{E6&;_U9b^;Zb}0?99M;IYhjY9F!fFW639Kf9erVTMhG3~S;{R-8nqO8 z8)&!F&Ngr6gd2~^sgj8xFw?8YO9LMl{;S}U~4GIT!1g0o41DFGzxcgLyS7!glDdWG`R*h9aD7~XX0#Q}I zA+z=P8u7#KXx+81LF&9_759qoQ*ke=rAOtUC?135*=CWsRZ!$Z2~uw^z2=Es0$CJ( z3U?eg=j|KR8!R)(-1=MTm*$2rUCkE`9)a79aYb<;E-C1Rm5%bsY3q}YiNfX5-I_4$kkaOMV)IVsbW|OR%!zr zLxz##^g8yyHW&5>uNNTQ_HRD|%+R^e3CO@jyacpKA2qBMAd!!nhAGy0N;b__7uaUJ z;p3Pd8hAS_hF-G9Tcy7tE#>o6@6Isg_7iL*z%m_|UFo6nE57&N33$0YVwzl&xbX)>t?S+5YK529i56 zPHcUM&5w;?>690DtNyj)t&Tat=XA&_-{fAlA3Q6J8pd{QU3Z#&-RH*mgW-?S{SE{# zLfiteTKWsAc9t!LQQV;Yx)EO6oX7$op`mYNtU#0;!M-aiv4hC;pgw>qom#1V1tqiK z-3oE9gl4Ix^v*$*hUceX{feh5SJ%_fz8ify$MCJ;6C`9tW0~v`22_qTUFxCgmCd%B& z9AEDjReoJaSRvDBUe4x=2}hl+*$^>FiiM0ntq}KRGB_Xfxf-7fxN{x{XWt2G0)R~q z;lrj#T-3+ZBBugobIx^4d@(3;H!5@07?S}jui+eRGu07}Kz9g_ahDoA8b zQ+rWUl7O3B3G58=z$0aK1379XnZ61@n3%Z8e%NOW(iaPyQYUfUZ$msPI$Y`#ry3E z-%nA#n80$Q(M!Tb*1(lA|Ji9ldTGEum9>7g$VW4zwY zX45s}Ig)z!Yz@Zc-Ix(nHfc0=;DUBeEhd~|36fK@0w$K}WCBRI4PGBrWDyS_-S05E z8SjALC)e~#k4o>CHz_g-K}Pxh*J!-F!xT4xv;3bH+x4SGY;Xs14R8gxh9H0B%xvL_ zezU=+LvHQy4m=iT4=!#BJ`#*)ZA__u!`ezIs|~SEfi>p=GAKU1 zovyZDk>HFsG(w()t%Qq`PA2-BbHEMTSJE5oVKNm=yIKBe_z zL85EV6`Yt_uj-^*N}yAW6n~NNW^^-MDw@stN~&+(NQoHuKZ?VWt_@O<`DR7UtJAg6 z%d+Fd^`8u(o~^5uQP!y+6*M|nNR zTzveh`vHo~HSP&&bF6hfghR&xz!g^o6ea8^N-jK|~N&n{6`SjNcb9XSS zA35vE`~UiIvKf3PvhT~`*@lh4H!eV5ZvMGk&;Nsd{r>5^c{r(^$W!C6j(z4NW40|i zwC$N4UVx)xFYuz$Eove|%JbAqzGfBZU~V0EWP5iwG4Kd9rmQ0@{(o0@aWc2!#pW19gz z&6g{CfGj;H3+4u%!vB$fk`cBRyq-3)g?DH!JUh$Nvh3_fKAScPPR&qEByDP5NXS(-+jMaCGWd@N5u@kO)Tjwhn+x*G7{f^5QL;6#6iI z7_S~fe`#~d4{YFUva3>5?YZd@uNITH08iG-N1U}&*gnsZfZIm+;$Br>F+Cs;Q65%W zs|639VUqOS>jY~SX&-)_Z70j^e_FQ{5m9Udok2F}oq`+GsIin_Jw3^Z7q>?i+siD3 zDk3ZC7pmcvo>0Cj31x+1SDTkhf-3eqnj!6_lHnfCiKHdzlK9rV*-Vi&v_50!T@z*Cl(ts9>8JrR^WeXQ2c9mynJzl~ zR_Ke!fSF0bwxJyxpH6fc2*=6}UxuMaPnjQi+?;GM;E*P`QS-^h%{{K>PY{h3R`uNO zxI_6NZSevp&f7-vR=y0O$^v&TJiLd|3MU6tA4jsUWJX6^ETbQAw5i@3)bnFO zC?(U=hl+(oK5hB zWcs|6e@W}!Ft2F2Mp}V?qgMp~N53Tk4MJoRSx&35&&$@6Y$H>*loJhMM<}Nh$`kwp z9KJdS5g^;mXDA&O#gkL}%uD1g!HsG(r&r+7a=OdVjO_-HD0lOn% zvtW_@-B21k@J-zTT}jgaNx^H1ZNpy7=d;(@6sLorwa^OFRaB2XFrIxXW zHq3Ta^lWda8dX%iv%%@H0}zA4Mc|@;4(43BL&EyTF56FG!7HGdiR$9y-VB_Q*j#?A z$Cc^c+W z!^J>!qhHvi&CErh2&5xoq4LDger>`;VH-LCz6|1xwFe4~R`*k~d=eFfPijtFR^|Xp z?jY>oph|Nr$Y=Uc*Pn)3%hW8MG}O9u{~i-VcB>T{{KbVD%+abVUtRHKL&KM_IKta@ zpF^P85QW!K)ObFbdKCBF{c?l`63P_p_wZl872Ys-*IlA4i!~B%^>8o9sZTc3xA#pG zC1)KG_`K-2-icJZTw@TqM}K9EM%YG&Ddsl-8Rxosg6rC+1A;cYr3FRp?Tp7r&pI_W z96}@?c#|xIqK)GWDwtRA3dmaA6!Mw zI^9W8I+^|&siZ?%AIwPaWp3V``~B0xhEcS&XKk2j^%l+EUoOTw%;7 z^W1y`2{#W}lcj+S*DhATi{ST;yw zAigZ76NvwIg!#ek93`>tNLiA?9ZFWiOImG%#B0;B&XUFncW!|VmS=q+`mBr5VnP+Y zAZaQz#7G>zwdJYwD7?oMt2KPF`S*I;o`6`BCYO1q5A3NumhVs=%Hr;=3rcOhEXpH) z&91SKV7wJ-M50+wqb-%hQ6G+iG&c){FQ8%uXW_9yOw zp^UM?O=%quddlC3TXMu{8XKy(Qm%vzoh1L0NI3m5CZniKgj`%fAl|6)X1QEX<_ox6 z8r4iQJscWIKUb>G=tZSAPw%N-!)z{5drrhx)HMl;^-!$!7CK8amdXw<_{t4}A(zu@ z@Xi4+@^Bx$S&$fwaEL(Pf1J~TRDnTZ!`#o~e_Y{F{qo*IwAw^_$69^$@l$vRb?Mn4 Il&$ao0a;-%hyVZp literal 2528521 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]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 z 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 z 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

      y18jo)!GFYHErn^%DI3F&kkh{Szhdw$g&A-v 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�OPN?jwhJ#5dY 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�poPEvPGP;V-gXamro$mOtOW_Y>#BS@Rshy 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≶(@&(Uoc^-`X*TUU6 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 J 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 Date: Sat, 7 Jul 2012 00:02:45 +0100 Subject: [PATCH 500/547] Remove redundant SetScene() function in Scene.AddSceneObject() This is always done later on in SceneGraph.AddSceneObject() if the call hasn't failed due to sanity checks. There's no other purpose for this method to exist and it's dangerous/pointless to call in other conditions. --- OpenSim/Data/Tests/RegionTests.cs | 2 +- OpenSim/Region/Framework/Scenes/Scene.cs | 2 -- OpenSim/Region/Framework/Scenes/SceneGraph.cs | 6 ++--- .../Framework/Scenes/SceneObjectGroup.cs | 10 -------- .../Shared/Tests/OSSL_ApiAppearanceTest.cs | 14 +++++------ .../Shared/Tests/OSSL_ApiNpcTests.cs | 6 ++--- OpenSim/Tests/Common/Helpers/SceneHelpers.cs | 23 ++++++++++++++++--- 7 files changed, 34 insertions(+), 29 deletions(-) diff --git a/OpenSim/Data/Tests/RegionTests.cs b/OpenSim/Data/Tests/RegionTests.cs index 474609bb08..55b9b4d6fb 100644 --- a/OpenSim/Data/Tests/RegionTests.cs +++ b/OpenSim/Data/Tests/RegionTests.cs @@ -1081,7 +1081,7 @@ namespace OpenSim.Data.Tests sop.Shape = PrimitiveBaseShape.Default; SceneObjectGroup sog = new SceneObjectGroup(sop); - sog.SetScene(scene); +// sog.SetScene(scene); return sog; } diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 5c7bca029e..ec911a52d4 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -2554,8 +2554,6 @@ namespace OpenSim.Region.Framework.Scenes /// True if the SceneObjectGroup was added, False if it was not public bool AddSceneObject(SceneObjectGroup sceneObject) { - sceneObject.SetScene(this); - // Force allocation of new LocalId // SceneObjectPart[] parts = sceneObject.Parts; diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs index bc9a585982..2be5364a93 100644 --- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs +++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs @@ -355,9 +355,9 @@ namespace OpenSim.Region.Framework.Scenes if (Entities.ContainsKey(sceneObject.UUID)) { -// m_log.DebugFormat( -// "[SCENEGRAPH]: Scene graph for {0} already contains object {1} in AddSceneObject()", -// m_parentScene.RegionInfo.RegionName, sceneObject.UUID); + m_log.DebugFormat( + "[SCENEGRAPH]: Scene graph for {0} already contains object {1} in AddSceneObject()", + m_parentScene.RegionInfo.RegionName, sceneObject.UUID); return false; } diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs index 96cc3766be..4e0e183b5f 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs @@ -1055,16 +1055,6 @@ namespace OpenSim.Region.Framework.Scenes { return Utils.FloatToUInt16(m_scene.TimeDilation, 0.0f, 1.0f); } - - ///

      - /// Added as a way for the storage provider to reset the scene, - /// most likely a better way to do this sort of thing but for now... - /// - /// - public void SetScene(Scene scene) - { - m_scene = scene; - } /// /// Set a part to act as the root part for this scene object diff --git a/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiAppearanceTest.cs b/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiAppearanceTest.cs index 3965734435..c8718d9603 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiAppearanceTest.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiAppearanceTest.cs @@ -79,7 +79,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests /// Test creation of an NPC where the appearance data comes from a notecard /// [Test] - public void TestOsNpcCreateFromNotecard() + public void TestOsNpcCreateUsingAppearanceFromNotecard() { TestHelpers.InMethod(); // log4net.Config.XmlConfigurator.Configure(); @@ -90,7 +90,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests ScenePresence sp = SceneHelpers.AddScenePresence(m_scene, userId); sp.Appearance.AvatarHeight = newHeight; - SceneObjectGroup so = SceneHelpers.CreateSceneObject(1, userId); + SceneObjectGroup so = SceneHelpers.CreateSceneObject(1, userId, 0x10); SceneObjectPart part = so.RootPart; m_scene.AddSceneObject(so); @@ -114,10 +114,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests /// Test creation of an NPC where the appearance data comes from an avatar already in the region. ///

    niC`8M^ZQ9C`t?f%Ul|tm#2nGOoGz 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 HZTWuy@i=v@ diff --git a/bin/lib64/libBulletSim.so b/bin/lib64/libBulletSim.so index 06770a4e69054a7eb096f42938ce3e107da4b5f8..891c956bc788d0ff96831ebc2c9e2b8079f10f3e 100755 GIT binary patch literal 2529000 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 z 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%0DnE}u|D=Y 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%0A<-(p zZDR4(-b816dyC9BEl^=%x6{W5Bvn)u-`?S>gX5K1 z)vUNuQKX6g%}Bp~5ivon^b*R6l*gmY=~n>s0ubAil}g>LRH-f^Fig@f1hp?wDJq9V zkxL#-#cJ+#wMPksL#ok1E|eL`(14QprU<*|R8%U7y26_bK?jc+K+t-b@KZH?mIJIA zKY=qsh|I#`JxH)??H06D7D-J@H_IeQZx@K>BubvS zO>N;P-!jkAovwGnThwPkZ9b^|eLl09u!A06Q?J@G8=@G9n-iB)iRnx6Mwk)*z>N9K zD^b26ykWY__CQdJ=4e|FL3%0mG+n!a-!=TB-VzsWvTSW)>|PPkxa}cQa!7i_sG|^trrrN#dGy zE^K`-L6T+EM|WUhA&;xblG{oaNuqO%Byt56fuxz2t*opSO@|L%8I0}?&K)mX0gur+ zof=N3(W~J_u05>}2ep#?oUfmxgb#-~j|XwB8P}GCj|+3wYCI+6_i16q5s!wsKBk2>ffpg9f0s6hj8n|RPvzHCLT^A%Hm0{$$!G9g&7e*xcX*LXXuDvI2n&c z_5WZhiF=%ziQAqrYN>Mp=)$2VoZ?!Ix=M4nIchUL)*ZPTY84h;!Nv{Nd3NaKB3_us zZ@E%0=O~45i|<&_oI9kJHH*4bm$X9oK|Q`Bi4MP0tLI6h6oYXmd4dBGZB+OUH&2ha0ec^*qJ^x7HY78_-Uxc7W~@pbKOv3i=oqxkkv?l8k|q zr5+wLR?m~_1;QFW*QTZ^8XnFbs{-})u5@3}`5kA(w6!Jg;)DhT+g{d#mHR!B0KQOs zn5qx|MUihKM!(IEw^0$1+?L87VTpJc(aGl9kwqV#QmuE%{H$bee!SCD#Ml6_6(D(~ z%OgS|4FkabvmUEK+4-1E5p2}!3qZuQglN)?VWav?;)^=gj7>_db(SdG+OAHuOjQl@ z#CYlFgWAV1B)9UviGN(~zZJ;0sSCGBkT`gRUKxrK$Bk4-6A;t`4-JxO;ftC={?Rd^ zdKjf5b(%OKq;cRLs(;CZ>j#ZNz=ns(ns(b#R-2p!vVr^?mEw?-v8L(y5w#>RVFNU5 z!{DKYZU#&mV_6BP>>x2s3j3@YunOlbQtuPUUa0^rUnykel?#7;t#JlpC}>D?nNmy~ zT$dj|)~WJV4Zw-<2LSFAu}>ODUbxsm(rHT#q#qk!C#Ay!T$LZ+Yyc<$k86gRIH6Is zye)XA)DtI`9-k7-SxNMI`VANCBPe?&EmJjdLJKQxCF@VA5_v@kAO@oogy5?>7JNm) zkvtlBkOVQplyWuF6JUI(G2eHFD}2npdbW;I?oh$gYV+9FMFBb#mp_U zF`iH+8@0?Tk?TXPgYzIFzCwC=t=`Q0x8H)ZjA60e6XQoxGI7EPg404O!LbCQdo=`8 zA8F#>s*Qw-DkMQNPi%0U43X%Vzp8FnlQQO{?4w3GD&^;V&JZ!PNK<&5BS~s)qLesT z^gSiXd*TR@<`<3$!rvI1h)2O?p0Nt`ycO{l)nRNVaD2%v4Z9vdKAWH<#@7j>jlf#q zV1$c2r178|Ii6a_$9Bk|+-2vtlLj)7k#9^_2 z7=I=!e_OR0itBKCs;6`J+2%wFFSdCAHBYAl!!!#}Pkn#SVDuBGHV30O1l=Ei7g$Z) z4I4bwbLAJ?tx)3PFD@p)Vp!quqxI$Aaibb@-xy;@vYWc@4VqRlT1`K)q<&Py6OUJ2 zc!qkG8Azi_gAdh|} z=)T$N{6vO#Ysx3iR0=a3T5=u1$E#-X1pMk?vJCN^))2KuJrs=Is{X3_Tm-f1Q-Z3N zybzo-7UTiA&)&rK|GRu23ustXrC#^6MM&yP@At|NcxMZX>m&@MU$S+_>qmaGpxJu4}F)6TN((&=Vg6AWsJP37#PAy$-}0H9Pq z`^&&F+~dS|fIA~uUpUqQBWPYrm5l-R_qmmhJwEf!KuVF@d*{eehewVLl7`&Fr@dpN z3u_Suim3gyn_Sr{@mdH6y>3 zsbT2PvkpNWo;9I*^#Z>xZR-`Cw{J&Z6Su&vUv!#m>wQY9=ceVDH~UKsXahiXzPnOu z`20zYo!=&VmcV6c0vI&+>gDQ`VwtEm>leMMd1C7-tQKiiH^W!pCY#-mZUgQ*O58NY z!E2MU>ozcyL>-3Lk98?wcRc|>y+!2hOBBgeb+P@n-9F1@YTK&fR=X?SwqmAB!DIrz zr7pYMO@o&GBW$jDJ*Ijq-stuGV6LPeBFY?6QvOVN!ad$RRWdg1J`$uc%~K`c0Y*eL zabFQN+RQ54mgcfIC$bG?*aettRQfDHR{>~)UJzO4g3NS1(l`O!EQ`U)a+$AqgR3)W zz1~PeIY*-)(XAeY)VPg#NlV>gbD1ec3!Vg*0zaJi4EUt=!4wu|;oN z$-q#;IClG+j(Ul!E9m@G_RodY-!+!aD1mn>&9qUeZM!I3=M#NqB~F*#$FXYLI*vT5 zKSLJy>u`vAN)3+_lJFPvD4QIHQ)g3acw#%4m`MzU!{cgs96gtwe^iMFo9!{4Azpr) zb>J%tDm-f>Wo&i*lgc&C%<3%^k~tNgTJN&oCpsE2H6D&1!)w~0p4g(`eN1{E5k&JL z$|z-GMsZAa$}vi&4?cj$BXr(Vior}zA5oX@ZiE;n85DR{1DCU20@00Z|R9cTt zLl*Da3Xe8h@F~TAJEiJe?isE$u~TOfH17#XgxqW#0FnyOkW&(tHC*Vg>m?(CrnM5c zIv`sroH||aj|sx7s>VecQV=f@$*n`joI5VZ3|Gubkj;1$KoipW?#WS`c|RnjE}Bjc zoIMk8mzm6ISv^RcKZ|_%?io>Tm~^(qw8t@Qck^21rdt&N$v)rP>1_gx$zuM~Q_XC_ zTtl(%CL^|#of!TfO$QNqYWcdc;6Woqd-2{6WOarg1F&%<;cr$_-TlUW zXxcMa6$#AH;u$$wqX1vtp6pP@!i$8aS5*=DRz2 z>M!4Yu@8au)twe|Z4?9AD=sEVRXrsr_)im;nS!N@uU@Dm`f~~SX>RNF^IcwF^|gAl zs!6+Sv3nbeanGRqAjUO*Oc=s~Hl={{yvD+i(e5bx?YKJM_ z^CL_hM8nh|;{J;e?Gq7|E}P!d0rH(Egv4pUG)z#`t}aLf_nA9UrNpO3P;$%Ff4kKw z{#n_9-kunsUIarRTCjw?n>mU zNu!T5!}-N`Wb47x;ORc)``c_YGgoeT6njrQ059v^vLv!k*f01Nmclk!3eHxkX#a58 zoKS;+ZMN$G88DoRVRve6Dzl2ccx$T*A831f2e;2KTIBiXIj&MOO5N5kQf77?mN~w1 zSYz%dvq*00dNSy|yfpd}%}$!S9&SIy=iL7_jaJ_}%AK6>k^T~nKNltqh{w{g(d|Hs z4>}LQYV~Ex@$R@gDfEJ_bU!pik~xY%Q?26wd3wjxO{fM?nf&6Tgkeh zIKT2%Rg0%p(7D;V%@HNvy-^79m+yWm4sD7)nm-bhj!eVB#kytAZPBP z`M}MY(>j+k_0pI$9|y%6DUixGC+kx^xAan^xu+3OJ#4^C^-Ly~`QOJmQz0DI0gKA- z;-{pBeXIsaT`nVG$mOIi@YfGj!w5(=L=7wFxf<5H8hXoX_%90OE?QtUNX&9MDV?3v zAmJIJhNG!L{Pk?1>PYcd(A7m_J##%<*b2QBDGJ29S)a7XIlIG7Ek~|iKw(QNWDd9Q z+%)RDh?Dj4r(0%#FkilDR*a&v&#Fg4J)oo+CLh8Mb3pMMcJQw*g!nP_kialf!u0S#ZI893uMUVG8(;exiLHGg8o}=i&dlY zH(UNT%RhE!`ClyNmjRH=Ot<{?JIg;3l$c}H57I~dr%#ogTJ(qHb~BO9PN+}i#?vVi zQvA{>6I%GCHzuHn$0Iuvrt^#BOqj_pVl-hkzhn5Fo67By%650q_*Cv7AaqNw5d=uL z3;=?_v7wA0pt={iSfF)lv>+CM-7=O40<&9YODebfjuv1%du0E=vOC$&@A&Fp_JM}U z6SEt%lRKKj6&@XDyPI{oF57>P6l~%7$6O znNe}l*f_~XoP4G(PO6VX@pzCqBaZ7J^uW4xU(IJaE$-5B`Hb9i6@2I=pPB1IEAp8I z783CP~ z1WM~IBq$pQIg~cWaZkmeJ`1VrIu}RiGV;DRYHdb-AnY|iVZKPBg#jAgU{j}(Y4f-0C~$?OD4ID>vS~`wzR^6ztmhy+ zvqp0j!T6Rf3LG_Dc6>Z_zNJGo3^9Re(ju9gJ>MXOptqe(V5Vqg&L%LE#scdRCIImS zddismIJZa=&13FdBycvFh@&EV-{#O)NaePl~1Ud8$JMTU+Q zHhAQmELb@qogdf6(_ouY6^KQO2wLwn#Dm1)vw6|1`Wx-}akDIUkQg^NKkf_*YvK$z zn~XTBxXH*ZMiW1`xziB!v*+(m2jC4xP39`!z&f;viX)qws9fXfE}J(W$&5Pj{h5X9 zbXwW$dVP46^St})dz^-mJeDcr#NLG$I8tZhYr~W#jYpHRYZ#9nuuES4YU58lG=1}6 z8;ABjwsaigSR&xY)$_}UIgT;63Ap1JbDJ1@#xdqLG470;&M#xmIL6#2#+z}BxlN3Z zwCS|Kr&IKaO=UX#9VD9P^`B;e?Y0>W$6Elv%{5IyU zP4@BIl>Jlg_}ZrTJri_3&b+3nYje<5fehm@sZKEqtRYWDaMO~c4V+z@sbx&+*grP+ z9H1kwOa{*!rb=s@a{tkoJz#ND?&Qkx*#nk0_srRaAwowO*iT)#)UAo5!9Ta{XuKw* zaE~m|gQ;5Ktz2w*EA^)A%U#jvbt&$Rc6N}2y9J}iR|dKHjQE-y)~0qnysoM1kJ_~z zBzD0|fdMbDB#awFq1?gyW~+nF4)RlaFaAG31JUpY*XU6fbnQV2bUd5167SC)oYbA7 zX)p71x%pgMlF?vRa&~iWMsjX* zZb`BOY=qT(`@JhEo5g<(bv65+zF$K_?L*@={ckXh^nRTc0?nPwZ@?sstzq{P47JEz z01j>iiY1o@JhN@5$r%gfc^p(3)IOnQJqn$_ltKjBCd%ontq)McQm&q*6s-x7&H2sA z_RRxWh|n5N8{S>K+OsWF+sR{yW*cvjcPYH5_p8j}YIqBgdlksM1*dP}q=T46AmrbbSylWnH0 z&h9h?70Sg;1uTVWl}k%XZFaU%D--EIV}NR}R{BK(uPE>|0d{h*#R+WMz=S7gP@`LU z(VhxGlJj+$YXapA&70(zB;E`%w-HzCRBddNG;*!6CbhAkq)j61GjYvfn-T!ExqB-$ zvCmu0wY`j@d)qTwpR^qwP$i`@qAZJOglzpzyDFhmy-MK=Wd~X#a9~na>u9PaHzqOq zSkRu_u|h6Z@rbkMZ2v<0p~%5{qB+kxo-$Z*0M~Xg7C8xN5z02tM%6%2tA>hW$ihMh z@-vGybl4TGP*1mfuII?=id=JYOk=K{bS<&BWJfF}wK21D7Uu~e?Q@5J)4bX! z8#Yi(eKeQ~LWvQJy)GVZcvLR!|IXk2evYn_3B}qNRU9i|%I(4ua(@>Y7MR}Ukl-Ay z0bq|w_;Knz4swUuLKYr@+6(tgF_4T5K0PW~7;TrK@D>593u;FtDKfqqVW!0i^r$K7 z@xy)3EG8nAJ7PH9Y)Y^H{d82(UlojAdCK0VC8Z(v3c8=M2Dqhwe!V#TMzdKaNbJ@B zr@vW0Gm1DJ+Ifeylfi{HX?*FwksK82go#mzT^o2UA0Zel&UUz*RfG?3OWTF)qm-qpSWYx*fP!EKg_Uhw6RFls?n~}v-?j3fp~vJ(LTW4RWuM%J>Bh0 z*~{z%jYhfK<*6_qD$CCe*$or3znhd@J1P4>u&i4Si>}v#E}hDdAGe0zTuy$3RFAnQ ztX#0n+z9Mm>iTyq31$2gzqyMvyCiux=Q(rZKxIm1|4RO~r%jwSI72VuPy&TTLySb9XsYVBQ+h-qw|3XL*LrMl@S3 zeh(BFUP=L3)uj}WXJ~QdocHCLDzoM=`d=c$a!`j1{qMtx?ELP_zVgpB=6$7&Sumh6 z3ribwF)#m1joAX~YRul|LFcQF&`zGM{^hcT7BoynLK==hMjECdB@L62nb@=JK3|{f zo(X!ejyWTu;g8?x=CEr_&Y<%d|AMaD;jLiVWl6Gka<9Wp5}V8{-juitzrnJLxo>`AeR>WYb}Ug_XL^?y@F^BjxZOL;Tm zQ!T5R|I;)-X^hc4mVnN;b@q90i>@=4sWg_E5m-!wH7XHh7IZyNE{JU- zW&g`gUk=QZq7UOdlkGHR2Q7^$5WyP8GHaY~4_kA!d~S5_Utvq8jgFCXd-eZh!23Pc zjAHtg(R*X=3fUq1_iC%e#l8Ivh9>R3^JPfCe{a_g#ojKP(d4=@my?cB{(F^j78RB5 zCpD9b)kJS+-KR~V7zZ1RZW!FU&J&Y)IXyA^dUN(gXHXUP|8lfi{upCSJn-MA7icfl zRJfZLPePdi(M`WYNpM#&D35q=g7iq2k;$xh(i@bP=Y*K z`hB)o(u(jAO=cnKgB)>io*7A)YKk~5B2HSwnGSJgx^bZJSu($S(BA`*E!ULN2QJYZ z$WMlJJV8h5LQQyvIFR=@JW8bQF{fF3m9(+RcG%&mn5MhHD8m*_&Av4;)a*+8@>+MZ zsIf%h3ln&z()GOQq7kcvSz(%thpw`1{&!m?cG{40Bg&>*{FrTrv#a%-Y3paxYe||d zFmvUw2g zV@XNF8$i^Nm=Lw8tRA_-Ts?kIHNBCTkdk*3$B(~o!(2_cyb=@Cz6ou5%qmGwc?=R$ zTMYST0o9cp5r9Tz_*+SY4)_V@#MH@FqJChBF#}83d7L*@B5k}!n~L!3=y7-K+G8yD zj2xK>_S}k`;9XXrabN*+ds%@Q9-;CA;xAtVZZq4NTu>C-s1j3WvTSLa%H^?w>7zBt z$IRzOE_oT5cN6~#QF4eGW!%0=T}D97WFq?acohF4n6rVYJ6&2g>O?3p6V7nJ;cfLf zDR{9t&IC|9i?spB&k>!@E3HqD7h#H*$;7@$&M%SC7C|>ClQ_+Md#WQXfB4jPLWv1; zd4@Ah)TWQ54BkZ^Zz?ujt0!kmd8SOr>PHExomW2tmL((GRm15ak8}->77!0-*1Jr0 zb`ya$Q9T1bHn?m>mhBJBgzXy+rhcv|g?v&+JKZJ(klgdVQeK_ z6SsFdpa4t!`X;G_&Z#B3 zuM`UWF7dy2>30D3F*u4F_6`kO9ySsf_N7=D_Hi+`w#E%Lrr0Jf(q%NX+{EIqB@rp& z#SMw`7a30IBT2@(k}M_}rDaSqtjx7h8Pri(850gy1}1z(l^Dl!VMF44c^lwm?b(J~ zb$ZJ|5j^fVueH%Z*6(KeL@l1843mBPImUnv-GST5=)?1bu$8j>K`c zyc$blwY#fUPj-MEGoB?l+y1q?eY-W@&s+G~{_M?ds%ITO*VLFD*O+T!ZJj0d=IprU zTvH3{@wukS*>RI|O=;HTb4_j8ac#M#>8#7=nr39j&B!&)WNkjzG%Gu9R<3C_>+`v$ z_UyR!T+>|E=yOeHWXGM6>*}D*Zp&G&OCprb=$Y%9Z(%)iU6R*qM$cT=0t@Sz>k`vu zGkWH_#FcJaTCPiSkj?0s>sn-CJ#$^+r));gT$i}SZCA^6NnWxUJ#$^^YqxbR*QI{R zX7tQ;sc+o&v|N|uDx1+W*Cj_|HnY{jb1l5d!ZvlythcaDZ8NiO#a<8;W)<^r}Z%QPTb znw?lOCuqq2o@qf-c1@w?W6os9ak%TmY=2Xh#oYd)eLqqb`|Q|upJ}!`QPW}V#_V5r zw3w&xpDmmc^nbSSm_mC4@+hbOKb%9Pva1W@$*t+lGgI&jmYvUQI6^x#A8nXi;zZj@ z=j0{~m)lgX=dRwfzM3fvYj|z^SPap#M+RNH)9d(nI;!^X<%n&St#kH_*gaLXh;B)J zX=^HXZU>>com<8@4y!3pv zpZA5D{h%8cB<(%DP_FoV$Bei{!eF55e93VBbSn`qXtUo$1Y!Od4^cBHL3CFnr5Dy& ze8QJY#O0KaT};CozVv8tzBWVWjvtHxPtX6Xkitsvw|NnuTF=; zluP?^(<|nDjJ#<@uN^mChzA? z$^Rqi9&&2q$uT1dV8Ml2#%x_?x&*Vgp$*M~Ef-$u^q0+U^`0QtrB2hNS?CT=!aQqT z=2VhJ-0UjC5_JF$O_Je4gUht8k9j)hb;F4@#GdQn2=1Y^%I4uH;zExkQ)vg+Bl3!S zcQ;v!$Viw2Yqy}K`#3Fj>W2Yv!Nnx%`dU0QiHVc9?CtfrIav~iLbA4eFcs@Myr;$J z5nei(-(a*|2TAmg(t6D;LF&QnS^i%l_R>a2yyui7<-)W|S6i56zKP%U;OMW7P5;W# zBYmC2-(9Ci+2S>KLBi)r_&lxJ6wrF;0X$ln`=$Neu<1*^roYN-`smJBAD{5?CB1&k z$YAu%GpzyPh1N>?_J?XF7~J97x5lx`9wWZ2*`aopu-Av(0}lmL*YUDZ^rb;|W!aB? zr|6wVr!Vx4JJ&bPrzd=T!pDafI--T=dV=}#t?m+K+S&-fi76fp^#bb~damaOch`B4 z@bL*BpRjn0xDJ|tUi$*-fX^0mvHiAW|A1X!QR1)bzrR*H^5XL_P~s$*A(kHw(3eoq zB*~xGzRtD2ZKaOXLr8bYA>@HaB}jzUDc;Epfgf2%5pcH-6R^z!T(!DE^V_Wyb9Wk2 zQitQi??hsk5HOpC$t5BwWBTM%kxOIm#_CC zN7|i-lavQsp7@`Uo(H}3{Qe97FO?p?#{jFet?g%R!`<`JHOk3Rygz1uJpF-;CGyjM zdR3V`*>$qvyoC};ZfwqJX_($Wt%ZSl{(pQ%;nJb%q>za3j9_x-rEJ-BQ%{mI^T7OS zhTdTqKU@*A`0HjW9(KEGwhvs|?gOVWmZc*p`@8b|Xs!pcL2vQsW@1+Kv2w?nxt-t; zbAjGrRU->>Z`dehgPBzW8fd^0F*7WDwpw`mLaWk6Tc<c7X04twl# zfEf5M!PNd>s>U{_s%a%!s`bzOBXp4-SIaHF!0#sh*F&G1eH*<_Pyf=07o>k?Ee#Sr zJ>laMKHjN)8vsoApXnf{?XW6I%aD} zr%)HlLS0QWeV~oMX*(GsZ=2(+AiS>LD5mTQ&y@+sjSN=t5PeLY3frAk4=bdds*c@) zgyTpcx<-Va*+K7^k^Nl1qjRZ2*E5*t`rMAQw}UP|uvapE*==bh_u=&4$h^CZ!4KlbZDl*oEkUAq4*h2nq3HYytSkGOE1iML~t82ztx=b zj9+M-gd%R&XaDXReWoPb{(EN z_L;(|Y;a1=djk`@;?#q6W_0CCVQT;Nih}=7{fdjKR#fJV@YK(`_e%F(dFqGV`!4Q% zms3BW_lI8M^|%FiB3|EiWOjXY9}%6qPhXvcNsDXCgGvpa9svOB73(JX4s? zZ3or!`1;sX(Dc%4^Q?^a2reRbGbboy!!+lvOm^7s65HuS(ZpW*@(#bOm^RVGO!}?l1Qw#)c=qrL+qiLHsmPac(Az`jissc9n{@|8(ey1%BZU)ICz z?6r;aTGb(@zR}>Mg3jshlQE^WtT*TqmY3`X4)jlWo4e|rwN{9$u3;;1*rUBERJ@UJ z*BFJ_>rHO1(F|Hw^RJ#($KELZgX(C?u&3U_n5zE0*1f}Otv?y*!d)rTd~`iE*SWY? zNdI|_h0|IHAPti&Xzg*fed|x0woGsp5j_e$61rh1F^!8@pA=tGzipk>y^b`Rb?3P0 z(`ovd)waS>Q2W*dwVG~;4yftyPTzJdV$cF@x(;)`>01cz*ZMiFMXTjuCL+VuVCt4& z>VE}OS#_~XhQXKB!=Uw+5?bUuEufRpCg*9PiO)5j78y?q7D&Q7JuR>YT5s^Qc#*QC zrN!(yPm60JTBM?T3!z3M)Htplmcm?aKN)DJK%ek9zC9uNqss6s4JF}c^f(CS;Zy*Z ze6qw3Nlbc8vbX}xuH(|C@HP!Q*5kJIJ|&vAP8U11)~CQpecZ=?kBk8Nfw^z{=~Q$A ziQy?M*^7L~)r&~+0Yk%KTaIH>qZ6IL%7h`mM@( zI^jiyW*Q39g#x^qUc-OJ>=2Qe)+Lh@b2z_|u3*|G?vD+5P4SD`OB~mx9Fdd+wJ$;( zHPcB?EHPqks6#W2Izj87D0_rN)P{Fkzm@K3!x(52b!<<*RL=Nn9tTULLono-f)G0K zp$l=vqq;6r%eTSQ)zr;_3|pHuRj17z2twkBQ3MKwq!utuC(h4YPhY9AXL_M|B|$yPnUFohj9Q(hnCr;t_OiJtD(I15&*vTIM5X| zO8Wu0cijxp^xblGLhBow-EUWl-=K393nr@i3RSJZMZRJP$T~U^IjcDcYxKg$FQ{oV z2$`f}CGl#S{W&%GJ`ECfSDa>uT>kDzo4&9}TY#5E!)U(svG)lZhsM%~rIGkwef+41RyTtj`smpW{g@uOp~VH#d* z7+V>1p5yHNFg4fdZZp&p2Tu+k&%x>0->jFwq=O334^5o)vDwi^CqmM739vwfha zUAc3cr~ryfmD;Wam^!@C=>-%qsB6KPtr$ibQ&6tEke~EzHBOh_ozyS;1Z+1xT;UVK z+q}|%cM>iWO4SqyOYlB(tKF$8g~8!B_3#)6^tJ=sZ%>{5CVYIt$0vMzc~hkbI@K^* zaYKK%L{zyUqRKUnDtFk-uJu)^G>MF-4IHga5v{LDz3^+t zt55-USjMS=_|6hOz2-vDqG+81zK}X*|z?PivMc*K7E5D zPwVSM{VkZvev0%hj#9R%z$d5g^i=a{iRk@^mLhlP^o=pdoWtB_7G6SH*?`rm3j&xE zru(U*Pwxs7wdH%x{>_h{49AJaWqf8zFL6W*aNB=Hu^XM3ggs7daI;Zcj|5bKOPpY) zZL~K5gP_#rB21n+jOa$#R&*MYYB&73`G`walbk8 z-;_Ia6eu0s1{!iUuGCdmri z(V)={ZY{0W-9(BebV4U|3c(hdNWkv4Vph7^r3pkSB`}$$!?y#~f~|s57ZhB;#ic^A zC~0XkEsv!<6=Z3FDl>#ac`8Mz`M*Ese!nx5^0W``??10L-}`*ez4zR6&pr3ta}!vK zs`HN2%Q?|`m}*_haSvFL;38Wc@e*PZ3rTb04Y09;gUZ3Vu!k^t1pS!rTi5Ji_Q*PI3Y@+Ou zrsUJ*UTPNc*=aThu8nwodK1Y%t}{7M7GK3vt?Vs#l6I?gQY2apUyoq>P5|uKC*vyCnn!Pn}_3> zvES!;-->G^*;v#NrR#&qK~6LGf*>~wL9($jM?_2Q0}D}l4?vV@Aj%6P5hZejb?VoI zD6@qq->&A*Z)`C`f^KV>7x`DWl)YvHVgyMDqkS;=3zzl_g8s0+)C7ur z>dzlnfo=z~-g8t{GE-JO{tOVs`G+JG+H$siFId;p0qzA)3r2(RXb>K?aJ>P6I5@yP zaoyh&rg^hB2BrQmSlidbA=`OW@Z>0!+aVRm7d{{=D5Ajwh`~c!#m7YLovnPAC|S1A zP^v`UHX4GM=M{OVVvNdDqmh4?(7!K{OLDpbef<7N`uG|8e?XmX0a9o1$l`8}|+#;-x->3rSmh^CVOb z_BwupOD$SDn>2&cT!P$ttY1~HO9re>k=))-N>k}3rHHRWZ>W-`iB0s9W7AW<6oj`V zv*k?<52ve^bl=o;^!(bfUgjE-Q+pi(!{dUwIB%cYQ(DPbt0Z@sRWQ9LD1Gt;$EGJY zsL0sSrr0;VCq4Fp?hTYS-jzg|)1BPW45Yn9k;ht*{@NnUBTF40_bpNd-)g<&&m6yZ zBNwJt(?3Bi+q_Hu8DDWcT+`6l$b5qE80t?wEJBONhw{-Df6;DRjd&0YL1-CP=|U5q z!>tn==GXR||M*+WP_=r|z4Xt!$x-9nwK4goKQ)0i2x==AUq;puGT9+77*~X`r0qI~ z0k*D?fVL={g^)INh6^gUn?>Z}v-D!C_J}QQCc8zfi}+SzT~qsxrZ1&7Z}wp|<21FS z-xH6;7sa344evG4E2ZdGijO_@q#gk;+?@+$!BPghfV6bEhAu!JFQa=s0V*Cpx4gat z()y$SY2JAc4E-+P!@%E@-53o;g$E_2oHykiN_eCMf-q0+8z|xll7@#DZ7dFO6BC)q z)RWr1__LFC2lf8H7~jsn3FOzs@%=UZGID%BFk*bYz7?+L{##=#0nCUo9yz{^A9>UG z9&?20*D$z4DU**k89lO_uqV%ygjI^UTn;>DI+=~pg@_=W;kHH$a+DC65*Z2aLQBc- zTKu^WyuP22=hnrHbUwyBPsE`yjmF_hV|OA}BN5k{;1%|{T34*#p65ZJ#@3Q8&g{}n zsfqro9K|&?bkvS*@@DXt*?EG7&&{u(j2ML{($9;pZp4W)Bvt4}QjKVy;HXy(R5MT2 za4BfTk$)LxJ~#Yl_iedzsv(DHB{TU-aT`U)(-Z@4zdD{%7Nbwe=jwZpX`cESEe*E= z8C_G4FZapk_e+5?#R|yGsp>vXmsV?t{S2|(gsUN~zO})(F8GeuH}`9gdNLJ%IaaEw z8|#buWHK@vp_E<3OxiX{2T}}{{e_Fc%?#)7xZG4;wf6PzE z^2vPRUlsFNM#Uy`RlY;(+Hyd)0;=)}{1kAeKuDu$^%bx-?w6yUoz3n2TiyTGdf0UG zqyb6bK@F5ES(@yoycNOK)%m)WKd-hEzwLF{5{=)Ra^iL`mfM>Qo!ezJG_^aP#?+`8 z4V9_UoYyx4;S~Eea0d^v0~j0^BjJHt$tj-+3AbxAYGPNDGb4X9!60wg+e4bsj}d?& zp}xqh9UNw)tC=`E$DNDnveY{0A!~ zR?NX&nauZ(5|obRoy6I)(t-wkInIrwc#Q8ZWPqxJVD;7Zk~f7O7c7$e+7?554HNs> zqk3%jC3cLSUdNv^*nUPOWY8^Hn(l<~1tGniSD0puA9j}cR#@3-pdt^4SySLHj!#PrR&h7y@!GMAj3r7_W2ipE5Wr-I-kCt2l}b3j1o4r}LNU{i=QymU3nHmjx!o2* zrxZ>!4lD-;@+@vY0?FwT69WW)w7*#I_5Dem5(=@v1y^JHRaOb3ZRL9Hmj`t{M=mB^ z>}6ASJczNpHcn1Wij^ZH3@|=BVF62>6v~1TWJOI9Jp@Rh5Gq zt^gM=NWA1OP3!&yHtfU_#Qbk0Vn=_YwI%&XOZwhK=G$?v?`NXq{+Vr9WIz@)WA3g* z`gJbfOwW{G&9a+FZ_~a%UbabxwVPE&x|w?u&(GimFSw6t1rMkQJS-%kDVM;m%Z(Pp zQuYlR!SeDyH0shzF9lGqln3U{j z;+fWA*`Jx;v~DaRP3es+=ijeDM?k6+>CNmDTl{X8_eFr(X`WOc~jo~g)1b_q8WlHMd7X@y@E>!xLu#QdcQL-oe|$7r(nAy@i{ za!F+6x+-$t#Ec9DS;1E7+ZFj4;j806W#Ib_cZ1}D=eE;`gn#o=mfpC(WVt?o&8`Z= zCom&>mjuW80E{9=i`V>cc*2h@lwLA(cE27uVmz?$;Pv&hFv0k&)qr{vF4Vw!Kic5M zHpq_AH;MEwTSYadz~WupM1WXHjK*Ov#;Lh@nZG5pWv-5XQmX}0rkuMg;A*C$qSBi% zwe_rrn&CmKnvaIBosj_}y}meEW@y^Q()%R&q^sGG0d^BjscM;<4L5ErWrLFj0@a4N z7u#BB4`W?u3|3v@>8;p9Is`z(FELUJ;%pxKs$ED=JmWMR;u*(ix1@h!-JvQIgbk=~ zs2VP{ul8>9%z{NGy2oH^NpE)(i)hWIM0#%`{fx%8Qh(~jCMrQ=ZZ8HVnrMzO`8`eP zQ#$>V*tHR*VXxo2p{DE5-g6g$y5nK!=(989dpCfSk-4#~8C0iqNZ)@#)+5*&dj(Pk zgJaLKN-ZlgowOa&t8FXCf$24lfh@C{-bcBTk^JI za3#LtqhnCW>A!&C5PvwU;_v03P?59XV-Y!#UJTqW@*waG9?$)ZyQ_cLma588$)_T^ zq7OtSqrKKL(?F0 zr)-86*JipilK-0`d~PqXn_&fkbnF%&kw9V`4(mHqI1%~O_4aj`6er-+7^s!CkyaH> z_9=`J=D-p}W;O~n-Ro3pOBEBao=YyrQPih}D*wH6TPHWr2Bc$YF?-5F#zJtvtvARE95AV30#7fDXwEt90(M zDxS9=F>pt0Uc0dNaLxx|jt1m; zmc-U^W>+hPtXS?EU>4O!3=A);sFw~LiV@>P0pSo7$E7&4Be`Z|cX3E{&)#FFa6I=> zI?q-n)qH7C^D@2%)+}WD-_?BAp`gQclA)V?p=Is{<60!^ZWLz{1K;Y6J^7d4?;nn7 zIcedBq1F}&d8_h*wJ6WEy5(DLVHd3&*4tdQyJtl>B62cOlp7A5$)3gIpx| zwKF*xgN7h)n~}cP)Ed(dVKn|_xMfKf>_R;9n41r-gmb>Wc7cUq=2pDcxZIjQNW2D7 z&i3XQ1O4!gi66>f3TZmwG{K0sD?aa%?~GATU8}VzK9^(b*d}+M6-KISOjh8G$~MB^A&$R8_XaCt4MW{e zX{uCGcP#yHD%87p!uu#X(=3Q4?Mh^(Y^o%9=y3Fb2LPthJ^h6l!bHP<9spBuT@wwe z7JtfwczP&4dX+%vJ%8M&uDf-{kbYvgwTAYP*=6hAYL!anR_T9rJP~!VhNsV;ecs8j zhJT#sE&IDFamnAUXF;C(dp)N#QMX*HE^k_^g)dgNlPkQv6}nS8X<$a#>$=2i{f5?P zyka#;;^~JI4Q%Ds+r8al3;%JvcX5>FG$nVl@Lwb_Y2yi*@w?T=a4poYIC~=Kpsx3vp#Z!GCI48~HG1%nQP~ScTV)YEd!cBZ%)K_j zpJ$JqrJUJgTlI;jzY4$o&7N5L_<6xDt-0Z##oySwfvwjgzgtZbukTwRWjyoUvcZE! zHQs!s!PYmAup)gb*8coK265jBBjO#j$>+-jaQ<_OGrB0|NV6FlQV~C>l6M&j(=-`Q z(|Bf$nM>q-m2lc5!|BRe)L6y#$ZxFSeV9UYVdf?aGdCH|T((OO(yEqBb0llFV)2a1 zro!5?ri`XAZLEYAq^!xN!Wy%wLN%$d8l~K0Db4ytHdUxK71o+aUtha3D0Gy_*RgeR zj9CgH^uxK2PaXf8(q=ZpKen7wB}#0`Sb!?2bY2ZCwA)#zR(QmPYnZ2lj|!@`O2*=< z!)32d)d@Ev{y{>#mzk}c)U@y}eG6~<@oHLcg@jmFY1b&nkL5rxkMnv52HU^_eN`#+(La9y}uiS*iDK4hrp|AO-P1%s=d{{k%# zi3Zq}NP3FEa5})!8pX^I$L1zjHHC%94^6CUs^ez1%S5T^Mwbh|)cMtPNXHe^&^yMi8XhF0xi22bL;*FMpM2-n0>kM72ZvNPFq^<-T2rHqG z)cSZt?%#%^VviNM`jIieNb%^rx+a(!h)KLn_HCMGvP!haB_ib>8p(YDp!sz;u9g`* z$ONsGGINk5Z0$?Mps=+P6G&w3n)cgpq@{Qp1cj|Nc#CG7ejT>OBTJVGlM!`G5jwg+>gn7-gv*Z$mDR-wIc!jAELN-9*R{FXaZ`u;{w(nS z*!)yt>gksi3TSmDwTDWePVJMz_5lNG)9u&I2~s$rxo(-!&Ni-?$173|UL2e2H8C;KvSj{Fr0J%HhMFH6FtM z>iqP-slcX&#~1zG;>oe2|8aqL$u$t4gnw2~p^$*zeN#DbQQi4~L%d#KrRU5SmpEnd z7vU0bG@$NxK&>qW>g~%LQh6|l#viK4#UF(YOy6(k$Nu-!v~>A}Fq35so6dh8iSptP zYgbV@X#o8SF4qN-h?mdbBL??lL2Qs;P!y7EI)8U=t&Z9+*eIk%c2Xi@nY2wD|HH2s z6A{2$Ui5)0{Hp%+q3SOxC~p`%|5?doK4D|lyLL5+k<9F;Br74Fy-@k} zvlN59t8wzWjp0<<&@BH`c4#IjGAP6@35w^#G7Jj!Gf)Kl*So?oKyu*tYFGwvs0952 zI0kSE4h6^3hFbX>LO^z@I~Fs90%VmH!tRdx<9<)iq=CYI?QP-sxV66bH@%b&9FJ3! z)f>+?_9)1r2QTc!2@q$&$o}Jkye^wc?IyL0)ArOBRX?!!DEJ+->|@N14ACIh=9~gK z85@)P<7I>Kiq#a8Xc*95VVA4M?=izLAL;FBr22m&J{XQ;>v6**ZXIlFq~@M_X4u61 zte1oRo7!C#wEGeRnyF(0u-&pf8_fT0U1(laW#a`*s00&orI@f&^^BH1}u3ulbi5)|R;&9iZXy&ZMx&mUPxXc6|Q*WD16E?OIhZ zfnvjeRSLL_V!{CRWd35yVgkVL_T-l+JxVh5uhI)B$!z7MCwTS_X>!FcUOAF|mY!W@ z;BHrb4OVsUx}7)~r(bEXvu5B;0daqwpx_Zp{$l&45W%CDgy_dZW6lwlG$5~+%DR%2 zT|Y`%#b+=%z+aUVM(~a&A^K%a*d|v1(`vc7Z0$-?cKtYa>*1kKTq-6Es{9?ub0yOd=BV($YQ0+2QeE7v9 zM;Lwz>~#g!pWFx{h}al8RraGV-wl2>7xB%`@hMvo@Fwwd3B|)gEDd$fVsuT9`_M7lpA_L>(S6}hJH3wqQ9Hhd+8;9;eYNCaXost z_*+c5Qfq@|kMb8U6z0Vp%em@2;&-5*dGwuP`uyPs7FaUhe)V#pT;^M)mJr5!Z11`V z&QaaXV6X!98%!!pI30!nF0aLcw)$n0qk@Ds?D^MrqT3eGo6FHN8(Kqh*KLmz~snwcC<_?5*SxiFmVan4sgcNZEhLGA&MQ%lv&KL^ZvWVn?x z(`ICqGjc+)D~T!VUYx_O*GwLaZk=TDuIZJww$q?^b4 z7iz#+@W04{k7&ZFl5?|#I{gl^!{2%nwx9h`Z^A;g>6`0rmPFdN-hVNN>in|vwvA z3;0E+Z>Epqk5)YYoCdOe%wO!Qy?^w?a{k0>>mSwseLHsU-B{lJ+J8R!sGj(fV%QYS z?SFTghVs{BLdbW{MAQm?iu>$J3a+@^ii#dWDYFTPeyxf>-{81nW1KYQkoh z(=o3pRRd#o8GCQ1qS<2u0Mzc1xG!UHt~9#Q z`lW+1hyGP{e+5@OJw>es&fM(#g(~KqU7r6M4KLUaA;mNr+di$@*?$Q-!($>pTJc^3 zwqu$b)^~36=T+|$&$>2$m^R;u+qHQku99|CtSR`-WWt!M@zeHc<+)#OWwE$<1U++u z;|Wf{XalNlOa88d@HqiAgR~k1B+3;HxE(;B$7KMWv0V668+r?sDC_$O%^hw4mGCb* z=7+?P;KXv7OY|rQa!@iqA|LbW?s&A~zPvR`xE!mk16}GyqRV)S;C7GD<-0f!zl!ui zh0}rb65I~bw1sXy3v`YgzFHnG8gg4D4Z_IIP8Xy5s5INrU(t*?*uasz$)YBR(F&vT zCo%A9@8qD+bwj@ZR7xK62||S7mWyJL?rU1rho;0$o|OJs%eqEnn{U$J`pZ z(AKtFB%719;VN4tC9f&}AW{j|$UC#W*K1wmm+if=;965~tu452E4T&1f=Q6i-)eh^4K9a2>Pz zPmMjpJC}#_n9W^pFO44FY5aojN4;Zwe?-j)`6s`>)>;+%<9@%m3*Gwk%lDu^d!U~e zVD`u=_dd`d!? zGx?_qukXhSU%pF!f2F^1e_FLJOwnO7`n%bm)Rdm+Pr^2EB2$j--^zx2k`>S_7EhkFRtFMoLebk{usICUb)hc*NqI)v8R9l7_2*FaqGQ^c0b z9l!hrBXH#(4;f|mN?5EQDOI`qH%h7S(psB<+ZLatv-RCW!96Ldn%Uua!$aq_wQxAv zY6CW|Zf|lY{W7{6HFhmms;K(*km-=`-^83`7RHP5Yab|9R8sDuYlSOLoSL77ZmfV$ z*mp;6*FH75(eyV=c_W_QPa|IW!y)h{7d+=A{ML*^X@-B9YlL^PjNNm5PD>Izh}4)L zjbG&eO;Y&EQZ?Ys9`+_=Wl;PyVxe0ct95X+rMF~Fmr=TjlJM&|>`us~w`4L2sXk5h zxgWv_a${~Y-H`05{D60f-VuaviasTF?7RgDzq<|ti-y*5aJ)XAxy_v$$E4TR`{grW z6UUW}(&uC1pG~qqvoVogQ`<|SdQN-}U#1;zQR7+QJhSv-Ls6@=C+6Q&r9mP8L`4W7 zdFo*ef3{0|)eTT#sBZ4HErPfrvhzsfqHFAc7tv#Fgu~wLWYV5X;gu>av&;^0;n2h5 zZYQC5L1(#JNvS6rqzTKThWNZ&S}VO<8V@~#Fy!ccrlxiVwT_EtX0r9~v(gl?iqzqG zu>7k7e~oIze{JBe3;deJO7Dn3sCwR4D>1y%4+Qazf!{U1&mO+wR%l7xQ|X32JBKE` zT5eb8)Ec>6eN&-CVO>)v%B^~G`|l1=TO8h)qnoKIE7zj9q&D_k;X=rS1Ii{T)*y=!y0riZ3+t^ICICO8dM@dmq%#t&_PADBeAER&qiklJYvr)9T&t z*)4@TDEZ58SM$BUvzk9NqUKx4KXfZ44eipO7e?62(;VHY^)kmgr+XTEq^YCDv(CRn zoWs$V^zv8B=ahth-BP*du18~GlUAiJ6sqcYXU4hicsO~a_~pwJgc7Yge==Na$g%DGkSPd+%F z{v3VEDlL|3U-wQ{4vTVvD#!o%kRVS^qmvrtY5#tlNlaa#XW}-fEYCeua{D;`6>^1%T2s=>Xq$80Nj<40h{_X6g^=WH&#R5}+LnQYs- zs#<^pq#)yzek1aQhBbls}X7rTf#{w|KX2%YXeILXH2jn?f_)9Kndd z(QZb(&3t&j=EIoWHIKj59JpKff8hSAI29xQY>8`FOR1(!)eMa}V|if;o!8vL`2^@R zr7nE#nurH=J+`-hr#TR6h$$sg?xt%6!z@qIg5kC`cd<5tGz-L z%)gzQe-Lw19$lU#44}U1Z68`yR5a0;s8zZN7~tl9RT%eobxZdT)!rnCUjss6^*iLrPbZ<)|0?#zO(EUO z#~N~8WWv>ht;`fV0hjB-Mbn8&~JaJC1;nwtxs6c$;L$HuE~0+0%>0p`EOlSAct<>>!&%5<&vyy}*tXMq__L(fQbjMV zUE>^A*iAi^qnXdwEa;J!{i61c=)$gb5ldFvR~O`X?b0j?ob-TQ#raJIaP#mbcZ$6U zpE~7HgmoXFq{9-pIE28|w8arraSTC->Tn+Z@IyHJ6Ex7yE0D2Gq&gYFlO?Dq*oJF; zPWVD{i?w?_H#s;W>kMEN=Uo9?;v7xVOtq8r^N*p#an)JBT#fj874$RBew_jSSK1u~nxns*op9 zXT+Wze`JRM%N(R+h-C!;D1-+ce{@$z(F<+cV@PO1V4v^SA2foa5m z0|Z9XG{)UirlY2wesuaCyh2F*aB5l9PwWtzyk49XDfnbAL2{XU!A!624X=(=v4|JYP~5NQv3HTZ+(T=^15H zdzw=f3jpju(*36R2^^;Q+JPw#*$u#i1DzzJ7tt#Mn4uJX0Pn^r>Td1HbiCbN>yUAG zGm)GFw=T8Yn8LVPQ&Y!|3Z*fG(W`4$s{=?2jz+IH(Fl$!YOhwXGDw&r`JjJ=NpRv^ zVA@HLtOe!ld%fKQkhP$F=D)3W6yv}KS!A$8K1<)Z{)+^3LgQGV6&iH~v{$UvOmesQ zHqhRV0iZM7adg9IO8#~fTLU>IC%c-}%;V?zkIC(upNA2%d2LZEvur&GeTLZK8D+c5 zhVx^Q7cAGT-Mm$G$(Hp=o4pBJyo=0qm<*>dac0ifKrve)Q(GBR3!C01kY>(dM5cDi zIX$674*;+Y>s|R3lx-&7xqwEt65{CyXLLUI(r(NdZNo|FMe68iDc99n^PiDon5Kk^ z$@RMQI6;y8XJoZOFRpSEO&5OW=rCjfN!b#?MRww{GF26Bqmj`P%KAB#MgyUhR8NG? zO~@r`8i$3Ts0dl5t4c!!pLiP2P8S-1Q+`dJAihHC&}!=RX8XXIqKvWTA}1K~)%!(04Fz5m_upF;*acu+9!5WmcW)OkwQw?!0HNm;&6b8MPAUt=jS%J&z`$sFEHEUrd2GB`N9CU{_zQBFyMB(G^Uu&7SMKj%nhY;)BHZ^i<)4#730H_FJy$Kw7kjeaBa*S(I&?|H)XCvx17ItZ)QgW~1 zsDhovu!F~0|4l4OD^`J(H^xIk+#7L2A|4@k0jzxP@y+xmlDSwqCyI)A(%~7ctmxgM zbvQC6!55BEt(*m;AGEP!xH^qQ*-(`ukHcw6nHb1*m3q4pexVV z#nWjBi_&;K!+sEo4$s=Zai~X^iJl|TrQlHZ5U=pos=1x=045}++i3Yt%S&{#^7xW zysMqpjt_~w)_FUFSjhxQyddzdbzVIXuA&BR)^#_Oey8fRIS27$|6n&p8vsC`x7 zUF~952i~CeYXfgk`;CD&sC{kV9dLOE0%AxgAKWu*QVDD+W)|wqeCQ@pSB;&7yVR_ zo}7r@R@+LfK%^=$yk@TqB{dSf0rs{H$n|FkfDF5}{Ru$(YTL--GS70Z$hx~Jl)XTf zcn)Iu+hN;uCN<39ME(|;K?-HFLKQfe8=E&w9!tkf*X4{cV6ehL3rEM#Gcg!BY=1;IFbiq1uWvuT*giY6RW zi{5lPJsMW_CYQSWSMbq~{9+08vm6Wf>zd3XQbgc&%;<`(E{W@jD{6Bt^702Qn7z<) z3n=Zs=$hJ{F7W!=T{yyK-X#2Nx|I+WpQxP=5WU4l^c9^;17{-RQY8GZ^pJR25Uf*h zS3~4egIpO`|2QzL?P#8Y$^4H8-qpY<>JWH? z8Q2zhgBds{@CGxmGw=?$ybA)aoBuCV2lMbNcEivh0n!!f7QUBDIl|4ttM=if!Bt^{ zi^NL6CNfuD%ZEJv8kg`5b*kztlCl4zW^lAGN<}?Vk`ELE@Rd8C`T?JGsfiPb!?y?M z@U3>fSDa5BNZdYr4qLTp164~Vq9!58LpxajgbOtk%L2`0t9W9Q#(kNUO@hz&Y+C{nU<;F5$O2rsS18WgWC(SQ(Lhi$6!o4G z6k4hT2og4vO}Bj8c0lj;DZy&W0t{KBqryKaD3~9sEU04#!XSkP(`2MRA&0044#av+`ySKiE~}Wd@}^ z#)B{?AX9xI0dt`7QUraDgoomAfZI42+mK9B?24{ndiL=3COqKvzwkjh9`pLY^&#s8 zQ52o70*?9^Ff~c#)l9+re>4>-c`dlAinKc59SFQyW$X@r%SLXRVg);^39=SOQ6`erCfFX?!f2IX(H@e>HkloL03hsDt4CCh zte~0zQ5Fx#u7iR&45>+RpHRr-cv|a)G1hagpdBi9U5ARLkUyyq7t|UA*@gVeXBm88 zzB*1l(dYo7Q0CiJG3N`i&Iz*W1>g1+^PI0u;%E}UZan3BPb)p8F;AaR-CG5tgm5g> zLPlj4qlWn|GCqdOy?>@4wYbf!8o2NfSbCaLS04bQ%p?Z|7-&|21r;Qr1o>(Ny%P$M zRZr5jyCAPvXN{4-b-?Oqf1C`r;ndG&=SJsnvzZTbmd(WW+p&Oz@viS$j@cSPJr z#5!w;$RgdaCO9B!zs{f_WLY4;r5j0WZE+Ijs~lW(iMrTpL#|Fgh^pgQW8}+AE%Y>( z7GfC1gjJzlm@Y1JikBO|PP<{JA6BFfPOq;>Ao^-|QmV~keMz4S{En!yf(HH@gZO=c z-_cOkV!B!R2ZDI*Rpl3XG}eCycWr4OOqVS)k&5sC?hyD0*f&z-PDcE3hW9XMvv!@A ztt39KEN0Uu|eiuS?#&EI70)7(j8Pon%-*X?Jv=q=nT0d441m%R>vi z_A4Cno0MM%O%Qrlzs$9?EekZ|+CmHjCtO3oNwqcqc>oLKsnB>rq`}ve++U++DTT&N zOGnrlh@LPw#uWL?CfDC|JaAOh{8oGR_KI5XIpAWb*J0@3yZC5Mz}dZZ&7Vv52XI2 z0rKhxQ>Q%;AsfSxfZZo(a}b2{?!d_&sA=ye4x3xq?P{5$UyGG&B^8PF(J!GR%dq?h zgTQb*LAvch5YEQ~C*|k4@y*H>)402JO=~3NC32ls#$a934vxY3>#u9|R`9#8YjLHc z-~Y<%n%D=eEhXz(A_#Kpn$~}#mEpQ3<5mC?tZR+V7p!aA=DX5Z8dit{5moskn7$+~8sSpjq+OFz{AYH&ttm_4%yQjA#FT)TN$RE@yyjWypV_I#Lc}u)3#LU{`$zhO2v*u?qxxcL+<4UAE*!__aX;KfZV;#7a;c)K~~4Kt#-b@ z3UV8qZ-Lw)up^N>gs}v<4YapGZZ+aSPX) z#T<~c%M(!HBB&L4fU;R8B}`kH)5>S-9;GQlKbBa0YSJh!(BRY_L_eI`cIbyQ+#}&! zZDAHFni^zNhv`Rxkh0=bcj$*x+_!!>)ty1MaI-+DwhH>;-0WO(7B&n}vnj5%S2en? ziKFA=q1PdQba~9hbdDoXyy%=N5hHpi4mm9Fptd0u|Jf?WN3Ugz^NDoU5G0;ck8+0m zkg=JzacqTmD(rONGX-xj#t!0=0ftq_CjJ`h*Ws@$fY+e@hLSXr80{`m3Ul;g=w2Ge?_=T?W*9U$fs{BGYl|K;p zrh?um2SMY4AWHhws2g>LX~aj+iTJ2JLKJJYBR(J56`r#Pe0{iq4R+rL z%pIh_HfF|tk?lpl;p?qx;Yn$K;Nok^Iw4wy*vE*H9VMIq*w3S z-uyMP4Op-zfar+#D{V~@j^i_ZGM$!%~VrUX9C z^XltiIXKM2efZLAjkX*Xd?lI+&h?BEIPrj+65>2ozlQJpso}*F12wvsaLM%OK);@X3SISqDs+#T z5??!-OmVb3PO|TgT>dvD`Z{mY@8HfJ7ln8P>f#hl4m9RIh>}U4y4~bvElIoidfqoc zs_GN`DK$;ujiD!7{6iAy;qZE_jqH2lbNARQC+e+}YPgm_qImkT7XNHk@8RKAE^wfQ zxM4qLcHrCGd3Q{%=pH%0cT*U?3ML&%BsaiTfcec*bolM>cE}4I+iNrPWXe*G^ zwQw29!7$v4rqrA2-Wb;1CEJu#-b&@FdFqKLpt`leu+=J$HT+tYp8pfHcY>RRrjnxD zsU`L+bf1FTgn>N=ZaZ?#300YR`nBQKMt7GexAZCv0QCKd-0q)Nm!z zq*^v9oc>tyxd^IDM_%Rb=l0&-1t3rbo=QFs7y5RU`f#NbLl=h(lhy)q0~Fr7u3L$_ zQ1V`JPa7u7=kl0n(^qojR&f*Ug>5m~$B zq9oXj4->oVwxi_jo=;+B)sJrd+|`&1OezXXnmbD3vZg+$R7K@NcR$)$56tgmVq>DC znyg{J%bkn=7!|@Z5LU9U${meoC{vg(xxZE9WGIo-)5?8Re(CW9{`bn?Ym&~xR%*lp z%XH4Vzz1??TBQ=~W1wz=F0g0T<V z!g~tgsjI_swvNPa=`-e5UP-L%0iOQdH|hVn`@X1$-NVxhru`@@B(Gkf@+!_)O@p}X ztWM>JQ|q99IJE@omo)>GKlDb z{@!zUf^-|rb@wq@(}co91#W-I#`XYHoQFPg)ot12gG$8Dne6=058FxiIR0|FC!5@f zODjz_xr@KO{Ew$chX_=}thdCT&@w_({5$XO zrLWSQ7)*+0mAS;Lm3W~`?Deh07x%}E{xPWG&+Np!ZzUmgP-g^pwcOdp8hyA*r=U7> zr+H5~4bASXA8c%+0~=cvoNbJ`Ph6kD#va88IAZ3xPp3YEy}~vkdqV`w_Vy`)U$%Ft za{z-`lPFUBJC?f^h{u-+ z&~+*e?e}=DeX-sdx=O1TCQP0qxVhn#MF)GANdEx~0}8T z4lpLRHv0>!(i?^!iu=Ag#&!~EREW)XQ|_it^{RDQ%x|6-^Dk3TJR28*4LZd?IW}o8 zSMJNPYu!3&3#^fxGZw(G^LSjyC!B|gfYa)!GXa-UgB!gnZY1NVlS8qUvGiDsd2;xN ze!WJ-T5^0>Jm#MkZ%+N*Tl&R!8Ho1;c=TT!hiP5SG5=)7VVk#fhc)};w;hLr(f{@T z>-}#-oLNdY=_#J2(o>B4mubSk-9T4Tz9o38A>I`XQ*jV=*yvC1glxfdO948!AC4b# z5iiwQw*E-?8C9G=2Z|s$KPE(_ax6v_h@G!{z5Z+O-BVWX5&7t7; zQ=_??AM~pw^Fto8t=1PZvxj{P}qcg6utHe@SDKZC>EA zi&{IkvUghcJ$5q7!2MSJ=a|diu2Phj>a*M_Md&w}QaEK4LMSGsZqP4(2wl(kj;Q~0 z?^=J(_RMcxzes9HZSPXQm^#&8+I`moSlDH6-F>oI&K@VVE0*5F`vRnAzW-ek!?bD4 z&rA-?&oJnYvdHcRb^vBXuq{s#y)qCOpV=cj0LC*19Qr7rrxSl-AQU*_kdsLpp0Paa zAwK^Pj6!a~_hC)-yi@KBTn^9jzoS*TQ;Poi@*h|9a|vcR_jg6VtP12lUG)Ej_z^~J zzB*q^-6nT=C-14c*S<%^ZMd{;{n1Lr@5p@)V+7crPM_0LYH}I_atHV;Ze7JvYU}7B z*v!0T_WO93B6Uh-*L%HNjyv>>)U+z^vH>g;x?jQZHvUNiVM>?a-Td!X-n+%G)hbp} z<$>v86`EF-v=9H51N^rh;QvL@pa1c<)QKfO@~2DU&wGpb`+rcVFMrxw#J7~>Kjtms z*O%n~@!4;#|EI*ejf2_R&wYn9w%geA&p7-K#{Co9Fi+W4>)kT#eP^VOtL*wnIFenU z{rL;x>3bo^*yyMq-g)5oXh(kZv^K<57586u$f&NF&O~8(_wfXcd7dD?Uz@|9*|ivZ z<$Gcc((w~H`{|f1<(d<4wV#5^9*~-iW=+TJY6bB}#_R4ns|wqa1$svT$4%_x#$I$9 zJn^*Fu1{m}2$pWzM84QYo5pf{9Q@9-M!s08m?q1)F+09Hoth%wqNYfkS|Y7F(&7}o zT`HAlP+Mey&a+TvYwy%~7AIE`y+nmdWZ)54x|7?c^DORCM;6eO_E-2nhoYk=)@P?p z0lR2%n;yE-ZELh2qq8UT=W7%5bD40^tAoinvI&3tu1y%x{{O$*ak|l^)Y`M zOw`H|Ow{ZG6Ln6JiJD$uqFN!C3I9|^>|F3HWTH;x6>`Ti!APANGE%3qHE~Roe`YMX zf7JQ#IsSB+%Ut?lts4H!*7)3eUVA8HWO+#aNXN*A{1XY@ijVcroR^&nf^f-=f_xXF@1-!P}Jj-h$pPN#3&D>(mw5sq@03PwG0+-TD*vEq)~K+oP>-Q$c}0af#ld zie1^Hs?ZM>ss7Z{WS=GB`&z#9SFP>7dphkW__zN4Net%;oL0jQyqJ8 zvt>yJL|zs!zM^|ViCkjP#1fQI zkW^4iL4c9hP1#(VkBH|kw;txE%hQ{S@lkv7Un<4Ep9^t0U%ETI;_xh67h%zj5@URXXy_~eA>Bv{H?{PwAoIQHkl9~Jxg4CfSc@Mr} zy?5z=O80IaXe!&3puQt9UHiTROaIP8e!of{y2t319^IL=8*aEV`JGsqckxDc2@)Dd zL3V#(3>j@aGrci}Fsfq+;z++wWdi&K^xvmjrIp9~i(X}`S>Hn2_!nz=$QXDL9#}lx^5V!w&IFBaqQf;YyJ)J(WtQ z#`B+NjDz_V!+=w)VbIHblrR}>8u0oSW(doCujbJMKznqjD6L*V{b?wmkpe`Jk%oQz14XCl8Kg{x*(Qb*qJ}Nv_B@lC)V(ymyw-a^~c_>3-Ysy@nUUv z`z!i@o=Z@@e7dLPhxvr?1h=GR^0$0*&?QyK&Vh<9*+7@?AFhaK3#VuL?)waONAWp|NvppieG z2~=Fa5iryVhkJlcm1ymof%VjqdNlc1?VgOK$76Y8L~T|{eu@pZhL{dwlE!nNUJ?$0 zgw^ru~pt)B(8bG7!p)iv{Hw87Pu~&B}8i32^z2VK?PSRlb#t-SXx6 z%aPiJ%mH6xJpVWEr%b2vlJ`>r2{;{Jam3OB-^{7OoAKvY>YgJ0XhjQgs2EyYLyN1B z+fUn+l%4Hxy%Y5soLXG}g0($Z1eJ-!vTam%B3x8~@zsm;c2aSj4Oop}v30ws@a-h) z|JV$R2b2c{{QKcckcgN{|fzo+5e#bXO;AScRJ{QokTfS=k13e zzhjP=j9%&-m3!bq`uUjRINX6BIx_UH!MNPy{Q1-0ZYaJ_g8%kV98<{TA9kzoyEqiz z=g4QoP}rFKujkj$1#g~T|C{-G`Cqxb=_AW)nw{Ppi092>0_JFp{z9$FwceL)P58}` z#N21o>tmU(mhpD@==J%Jmu-e~DZhVTeANtp3Xd2}tDC`F%`t!JE{59X-HDmWbuf)h znNx>j>3e7RpZ1oD)soFl-gV}FPsjy&OY`J`Be~>GzG5xb|8X=qzcY5|Z15x2a9<*G z%0A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

[Test] - public void TestOsNpcCreateFromAvatar() + public void TestOsNpcCreateUsingAppearanceFromAvatar() { TestHelpers.InMethod(); -// log4net.Config.XmlConfigurator.Configure(); +// TestHelpers.EnableLogging(); // Store an avatar with a different height from default in a notecard. UUID userId = TestHelpers.ParseTail(0x1); @@ -125,7 +125,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests ScenePresence sp = SceneHelpers.AddScenePresence(m_scene, userId); sp.Appearance.AvatarHeight = newHeight; - SceneObjectGroup so = SceneHelpers.CreateSceneObject(1, userId); + SceneObjectGroup so = SceneHelpers.CreateSceneObject(1, userId, 0x10); SceneObjectPart part = so.RootPart; m_scene.AddSceneObject(so); @@ -156,7 +156,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests ScenePresence sp = SceneHelpers.AddScenePresence(m_scene, userId); sp.Appearance.AvatarHeight = newHeight; - SceneObjectGroup so = SceneHelpers.CreateSceneObject(1, userId); + SceneObjectGroup so = SceneHelpers.CreateSceneObject(1, userId, 0x10); SceneObjectPart part = so.RootPart; m_scene.AddSceneObject(so); @@ -197,7 +197,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests ScenePresence sp = SceneHelpers.AddScenePresence(m_scene, nonOwnerId); sp.Appearance.AvatarHeight = newHeight; - SceneObjectGroup so = SceneHelpers.CreateSceneObject(1, ownerId); + SceneObjectGroup so = SceneHelpers.CreateSceneObject(1, ownerId, 0x10); SceneObjectPart part = so.RootPart; m_scene.AddSceneObject(so); diff --git a/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiNpcTests.cs b/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiNpcTests.cs index 813e53b954..25679a65c0 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiNpcTests.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiNpcTests.cs @@ -97,11 +97,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests ScenePresence sp = SceneHelpers.AddScenePresence(m_scene, userId); sp.Appearance.AvatarHeight = newHeight; - SceneObjectGroup so = SceneHelpers.CreateSceneObject(1, userId); + SceneObjectGroup so = SceneHelpers.CreateSceneObject(1, userId, 0x10); SceneObjectPart part = so.RootPart; m_scene.AddSceneObject(so); - SceneObjectGroup otherSo = SceneHelpers.CreateSceneObject(1, otherUserId); + SceneObjectGroup otherSo = SceneHelpers.CreateSceneObject(1, otherUserId, 0x20); SceneObjectPart otherPart = otherSo.RootPart; m_scene.AddSceneObject(otherSo); @@ -148,7 +148,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests ScenePresence sp = SceneHelpers.AddScenePresence(m_scene, userId); sp.Appearance.AvatarHeight = newHeight; - SceneObjectGroup so = SceneHelpers.CreateSceneObject(1, userId); + SceneObjectGroup so = SceneHelpers.CreateSceneObject(1, userId, 0x10); SceneObjectPart part = so.RootPart; m_scene.AddSceneObject(so); diff --git a/OpenSim/Tests/Common/Helpers/SceneHelpers.cs b/OpenSim/Tests/Common/Helpers/SceneHelpers.cs index 3a2e42082e..d5354cbcac 100644 --- a/OpenSim/Tests/Common/Helpers/SceneHelpers.cs +++ b/OpenSim/Tests/Common/Helpers/SceneHelpers.cs @@ -601,19 +601,36 @@ namespace OpenSim.Tests.Common ownerId, PrimitiveBaseShape.Default, Vector3.Zero, Quaternion.Identity, Vector3.Zero) { Name = name, UUID = id, Scale = new Vector3(1, 1, 1) }; } - + /// /// Create a scene object but do not add it to the scene. /// /// - /// UUID always starts at 00000000-0000-0000-0000-000000000001 + /// UUID always starts at 00000000-0000-0000-0000-000000000001. For some purposes, (e.g. serializing direct + /// to another object's inventory) we do not need a scene unique ID. So it would be better to add the + /// UUID when we actually add an object to a scene rather than on creation. /// /// The number of parts that should be in the scene object /// /// public static SceneObjectGroup CreateSceneObject(int parts, UUID ownerId) { - return CreateSceneObject(parts, ownerId, "", 0x1); + return CreateSceneObject(parts, ownerId, 0x1); + } + + /// + /// Create a scene object but do not add it to the scene. + /// + /// The number of parts that should be in the scene object + /// + /// + /// The hexadecimal last part of the UUID for parts created. A UUID of the form "00000000-0000-0000-0000-{0:XD12}" + /// will be given to the root part, and incremented for each part thereafter. + /// + /// + public static SceneObjectGroup CreateSceneObject(int parts, UUID ownerId, int uuidTail) + { + return CreateSceneObject(parts, ownerId, "", uuidTail); } /// From 3bd134474bead7c211b84413275a6bdcc7dc7dea Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Sat, 7 Jul 2012 00:09:12 +0100 Subject: [PATCH 501/547] minor: Get RegionReady module to shout initialization complete status to draw the eye --- .../Scripting/RegionReadyModule/RegionReadyModule.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/OpenSim/Region/OptionalModules/Scripting/RegionReadyModule/RegionReadyModule.cs b/OpenSim/Region/OptionalModules/Scripting/RegionReadyModule/RegionReadyModule.cs index 0b9f875e89..db2cbeb59f 100644 --- a/OpenSim/Region/OptionalModules/Scripting/RegionReadyModule/RegionReadyModule.cs +++ b/OpenSim/Region/OptionalModules/Scripting/RegionReadyModule/RegionReadyModule.cs @@ -228,7 +228,9 @@ namespace OpenSim.Region.OptionalModules.Scripting.RegionReady // m_log.InfoFormat("[RegionReady]: Logins enabled for {0}, Oar {1}", // m_scene.RegionInfo.RegionName, m_oarFileLoading.ToString()); - m_log.InfoFormat("[RegionReady]: Initialization complete - logins enabled for {0}", m_scene.RegionInfo.RegionName); + m_log.InfoFormat( + "[RegionReady]: INITIALIZATION COMPLETE - LOGINS ENABLED FOR {0}", + m_scene.RegionInfo.RegionName); if ( m_uri != string.Empty ) { From a85741ac37ef04e5c33e8aa30113cccd0291962f Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Sat, 7 Jul 2012 00:14:16 +0100 Subject: [PATCH 502/547] minor: Make WORLD MAP category log lines consistent --- .../Region/CoreModules/World/WorldMap/WorldMapModule.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs b/OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs index c1c6b49705..724533b0cb 100644 --- a/OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs +++ b/OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs @@ -730,7 +730,7 @@ namespace OpenSim.Region.CoreModules.World.WorldMap { if (Environment.TickCount > (m_blacklistedregions[regionhandle] + blacklistTimeout)) { - m_log.DebugFormat("[WORLDMAP]: Unblock blacklisted region {0}", regionhandle); + m_log.DebugFormat("[WORLD MAP]: Unblock blacklisted region {0}", regionhandle); m_blacklistedregions.Remove(regionhandle); } @@ -781,7 +781,7 @@ namespace OpenSim.Region.CoreModules.World.WorldMap { if (Environment.TickCount > (m_blacklistedurls[httpserver] + blacklistTimeout)) { - m_log.DebugFormat("[WORLDMAP]: Unblock blacklisted URL {0}", httpserver); + m_log.DebugFormat("[WORLD MAP]: Unblock blacklisted URL {0}", httpserver); m_blacklistedurls.Remove(httpserver); } @@ -1343,7 +1343,7 @@ namespace OpenSim.Region.CoreModules.World.WorldMap if (terrain == null) return; - m_log.DebugFormat("[WORLDMAP]: Generating map image for {0}", m_scene.RegionInfo.RegionName); + m_log.DebugFormat("[WORLD MAP]: Generating map image for {0}", m_scene.RegionInfo.RegionName); byte[] data = terrain.WriteJpeg2000Image(); if (data == null) @@ -1365,7 +1365,7 @@ namespace OpenSim.Region.CoreModules.World.WorldMap asset.Flags = AssetFlags.Maptile; // Store the new one - m_log.DebugFormat("[WORLDMAP]: Storing map tile {0} for {1}", asset.ID, m_scene.RegionInfo.RegionName); + m_log.DebugFormat("[WORLD MAP]: Storing map tile {0} for {1}", asset.ID, m_scene.RegionInfo.RegionName); m_scene.AssetService.Store(asset); From 1201307c73da77f6f3f0725ce8c985af179f54bd Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Sat, 7 Jul 2012 00:26:25 +0100 Subject: [PATCH 503/547] Remove duplicate Warp3DImageModule entry in CoreModulePlugin.addin.xml This was causing 2 copies of the module to be created for each scene. Probably no bad consequences other than a small waste of memory (both for the module and for the warp3D renderer it loaded) --- OpenSim/Region/CoreModules/Resources/CoreModulePlugin.addin.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/OpenSim/Region/CoreModules/Resources/CoreModulePlugin.addin.xml b/OpenSim/Region/CoreModules/Resources/CoreModulePlugin.addin.xml index dc6efed1e1..424e0ab384 100644 --- a/OpenSim/Region/CoreModules/Resources/CoreModulePlugin.addin.xml +++ b/OpenSim/Region/CoreModules/Resources/CoreModulePlugin.addin.xml @@ -79,7 +79,6 @@ \ \ - \ From 16d5b79d57602b6c28e958c98de18e18927fa7a3 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Sat, 7 Jul 2012 00:36:01 +0100 Subject: [PATCH 504/547] minor: remove some recent mono compiler warnings --- OpenSim/Data/Tests/RegionTests.cs | 2 -- .../Region/ScriptEngine/Shared/Tests/OSSL_ApiAttachmentTests.cs | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/OpenSim/Data/Tests/RegionTests.cs b/OpenSim/Data/Tests/RegionTests.cs index 55b9b4d6fb..dbed8f65d7 100644 --- a/OpenSim/Data/Tests/RegionTests.cs +++ b/OpenSim/Data/Tests/RegionTests.cs @@ -1069,8 +1069,6 @@ namespace OpenSim.Data.Tests regionInfo.RegionLocX = 0; regionInfo.RegionLocY = 0; - Scene scene = new Scene(regionInfo); - SceneObjectPart sop = new SceneObjectPart(); sop.Name = name; sop.Description = name; diff --git a/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiAttachmentTests.cs b/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiAttachmentTests.cs index 537b8aa0e5..78db2c6a48 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiAttachmentTests.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiAttachmentTests.cs @@ -158,7 +158,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests { osslApi.osForceAttachToAvatarFromInventory(taskInvObjItemName, (int)attachPoint); } - catch (Exception e) + catch (Exception) { exceptionCaught = true; } From 112cddc9ca839579cc2710df5e2ea0906110dd8e Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Sat, 7 Jul 2012 00:53:17 +0100 Subject: [PATCH 505/547] minor: rearrange INITIALIZATION COMPLETE log message so that it's clear init is only complete for a particular region at a time --- .../Scripting/RegionReadyModule/RegionReadyModule.cs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/OpenSim/Region/OptionalModules/Scripting/RegionReadyModule/RegionReadyModule.cs b/OpenSim/Region/OptionalModules/Scripting/RegionReadyModule/RegionReadyModule.cs index db2cbeb59f..600cafb7c4 100644 --- a/OpenSim/Region/OptionalModules/Scripting/RegionReadyModule/RegionReadyModule.cs +++ b/OpenSim/Region/OptionalModules/Scripting/RegionReadyModule/RegionReadyModule.cs @@ -229,10 +229,9 @@ namespace OpenSim.Region.OptionalModules.Scripting.RegionReady // m_scene.RegionInfo.RegionName, m_oarFileLoading.ToString()); m_log.InfoFormat( - "[RegionReady]: INITIALIZATION COMPLETE - LOGINS ENABLED FOR {0}", - m_scene.RegionInfo.RegionName); + "[RegionReady]: INITIALIZATION COMPLETE FOR {0} - LOGINS ENABLED", m_scene.Name); - if ( m_uri != string.Empty ) + if (m_uri != string.Empty) { RRAlert("enabled"); } From 57094bd0177e656ce1ed08df87b19657a6043c68 Mon Sep 17 00:00:00 2001 From: BlueWall Date: Sun, 8 Jul 2012 13:02:02 -0400 Subject: [PATCH 506/547] Add more automation keys to OpenSim.ini.example --- bin/OpenSim.ini.example | 40 ++++++++++++++++++++++++++++++++++------ 1 file changed, 34 insertions(+), 6 deletions(-) diff --git a/bin/OpenSim.ini.example b/bin/OpenSim.ini.example index c07e1abeea..ce571ee2d9 100644 --- a/bin/OpenSim.ini.example +++ b/bin/OpenSim.ini.example @@ -61,17 +61,20 @@ ;; Place to create a PID file ; PIDFile = "/tmp/my.pid" + ;# {region_info_source} {} {Where to load region from?} {filesystem web} filesystem ;; Determine where OpenSimulator looks for the files which tell it ;; which regions to server ;; Default is "filesystem" ; region_info_source = "filesystem" ; region_info_source = "web" - + + ;# {regionload_regionsdir} {region_info_source} {Location of file?} {} Regions ;; Determines where the region XML files are stored if you are loading ;; these from the filesystem. ;; Defaults to bin/Regions in your OpenSimulator installation directory ; regionload_regionsdir="C:\somewhere\xmlfiles\" + ;# {regionload_webserver_url} {region_info_source} {URL to load region from?} {} ;; Determines the page from which regions xml is retrieved if you are ;; loading these from the web. ;; The XML here has the same format as it does on the filesystem @@ -92,6 +95,7 @@ ;; Maximum size where a prim can be physical. Affects resizing of existing prims. This can be overriden in the region config file. ; PhysicalPrimMax = 10 + ;# {ClampPrimSize} {} {Clamp viewer rezzed prims to max sizes?} {true false} false ;; If a viewer attempts to rez a prim larger than the non-physical or physical prim max, clamp the dimensions to the appropriate maximum ;; This can be overriden in the region config file. ; ClampPrimSize = false @@ -117,6 +121,7 @@ ;; This will likely break them ; CombineContiguousRegions = false + ;# {InworldRestartShutsDown} {} {Shutdown instance on region restart?} {true false} false ;; If you have only one region in an instance, or to avoid the many bugs ;; that you can trigger in modules by restarting a region, set this to ;; true to make the entire instance exit instead of restarting the region. @@ -131,14 +136,17 @@ ;; If both of these values are set to zero then persistence of all changed ;; objects will happen on every sweep. + ;# {MinimumTimeBeforePersistenceConsidered} {} {Time before un-changed object may be persisted} {} 60 ;; Objects will be considered for persistance in the next sweep when they ;; have not changed for this number of seconds. ; MinimumTimeBeforePersistenceConsidered = 60 + ;# {MaximumTimeBeforePersistenceConsidered} {} {Time before changed objects may be persisted?} {} 600 ;; Objects will always be considered for persistance in the next sweep ;; if the first change occurred this number of seconds ago. ; MaximumTimeBeforePersistenceConsidered = 600 + ;# {see_into_this_sim_from_neighbor} {} {Should avatars in neighbor sims see objects in this sim?} {true false} true ;; Should avatars in neighbor sims see objects in this sim? ; see_into_this_sim_from_neighbor = true @@ -153,6 +161,7 @@ ;; Note that only the ODE physics engine currently deals with meshed ;; prims in a satisfactory way. + ;# {meshing} {} {Select mesher} {Meshmerizer ZeroMesher} Meshmerizer ;; ZeroMesher is faster but leaves the physics engine to model the mesh ;; using the basic shapes that it supports. ;; Usually this is only a box. @@ -161,6 +170,7 @@ ; meshing = ZeroMesher ;; Choose one of the physics engines below + ;# {physics} {} {Select physics engine} {OpenDynamicsEngine BulletSim basicphysics POS} OpenDynamicsEngine ;; OpenDynamicsEngine is by some distance the most developed physics engine ;; BulletSim is incomplete and experimental but in active development ;; basicphysics effectively does not model physics at all, making all objects phantom @@ -184,38 +194,52 @@ ;; If set to true, then all permissions checks are carried out ; serverside_object_permissions = true + ;# {allow_grid_gods} {} {Allow grid gods?} {true false} false ;; This allows users with a UserLevel of 200 or more to assume god ;; powers in the regions in this simulator. ; allow_grid_gods = false ;; This allows some control over permissions ;; please note that this still doesn't duplicate SL, and is not intended to + ;# {region_owner_is_god} {} {Allow region owner gods} {true false} true + ;; Allow region owners to assume god powers in their regions ; region_owner_is_god = true + + ;# {region_manager_is_god} {} {Allow region manager gods} {true false} false + ;; Allow region managers to assume god powers in regions they manage ; region_manager_is_god = false + + ;# {parcel_owner_is_god} {} {Allow parcel owner gods} {true false} true + ;; Allow parcel owners to assume god powers in their parcels ; parcel_owner_is_god = true + ;# {simple_build_permissions} {} {Allow building in parcel by access list (no groups)} {true false} false ;; More control over permissions ;; This is definitely not SL! - ; Provides a simple control for land owners to give build rights to specific avatars - ; in publicly accessible parcels that disallow object creation in general. - ; Owners specific avatars by adding them to the Access List of the parcel - ; without having to use the Groups feature + ;; Provides a simple control for land owners to give build rights to specific avatars + ;; in publicly accessible parcels that disallow object creation in general. + ;; Owners specific avatars by adding them to the Access List of the parcel + ;; without having to use the Groups feature ; simple_build_permissions = false + ;# {DefaultScriptEngine} {} {Default script engine} {XEngine} XEngine ;; Default script engine to use. Currently, we only have XEngine ; DefaultScriptEngine = "XEngine" + ;# {GenerateMaptiles} {} {Generate map tiles?} {true false} true ;; Map tile options. You can choose to generate no map tiles at all, ;; generate normal maptiles, or nominate an uploaded texture to ;; be the map tile ; GenerateMaptiles = true + ;# {MaptileRefresh} {GenerateMaptiles} {Maptile refresh period?} {} 0 ;; If desired, a running region can update the map tiles periodically ;; to reflect building activity. This names no sense of you don't have ;; prims on maptiles. Value is in seconds. ; MaptileRefresh = 0 + ;# {MaptileStaticUUID} {} {Asset ID for static map texture} {} 00000000-0000-0000-0000-000000000000 ;; If not generating maptiles, use this static texture asset ID ; MaptileStaticUUID = "00000000-0000-0000-0000-000000000000" @@ -228,9 +252,11 @@ ;; got a large number of objects, so you can turn it off here if you'd like. ; DrawPrimOnMapTile = true + ;# {HttpProxy} {} {Proxy URL for llHTTPRequest and dynamic texture loading} {} http://proxy.com:8080 ;; Http proxy setting for llHTTPRequest and dynamic texture loading, if required ; HttpProxy = "http://proxy.com:8080" + ;# {HttpProxyExceptions} {HttpProxy} {Set of regular expressions defining URL that should not be proxied} {} ;; If you're using HttpProxy, then you can set HttpProxyExceptions to a list of regular expressions for URLs that you don't want to go through the proxy ;; For example, servers inside your firewall. ;; Separate patterns with a ';' @@ -254,7 +280,8 @@ ;; default is false ; TelehubAllowLandmark = false - ;# Comma separated list of viewers which may gain access to the regions. + ;# {AllowedViewerList} {} {Comma separated list of allowed viewers} {} + ;; Comma separated list of viewers which may gain access to the regions. ;; One can use a Substring of the viewer name to enable only certain subversions ;; Example: Agent uses the viewer "Imprudence 1.3.2.0" ;; - "Imprudence" has access @@ -262,6 +289,7 @@ ;; - "Imprudence 1.3.1" has no access ;; AllowedViewerList = + ;# {BannedViewerList} {} {Comma separated list of banned viewers} {} ;# Comma separated list of viewers which may not gain access to the regions. ;; One can use a Substring of the viewer name to disable only certain subversions ;; Example: Agent uses the viewer "Imprudence 1.3.2.0" From a96ac7330291c3041729fac08b06d0098469f4d7 Mon Sep 17 00:00:00 2001 From: BlueWall Date: Sun, 8 Jul 2012 13:44:04 -0400 Subject: [PATCH 507/547] Add more keys for OpenSim.ini.defaults automation --- bin/OpenSim.ini.example | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/bin/OpenSim.ini.example b/bin/OpenSim.ini.example index ce571ee2d9..661abc0f71 100644 --- a/bin/OpenSim.ini.example +++ b/bin/OpenSim.ini.example @@ -304,16 +304,30 @@ ; If these values are uncommented then they will be used to create a default estate as necessary. ; New regions will be automatically assigned to that default estate. + ;# {DefaultEstateName} {} {Default name for estate?} {} My Estate + ;; Name for the default estate ; DefaultEstateName = My Estate - ; DefaultEstateOwnerName = FirstName LastName - - ; The following parameters will only be used on a standalone system to create an estate owner that does not already exist - ; If DefaultEstateOwnerUUID is left at UUID.Zero (as below) then a random UUID will be assigned. - ; This is normally what you want + ;# {DefaultEstateOwnerName} {} {Default estate owner name?} {} FirstName LastName + ;; Name for default estate owner + ; DefaultEstateOwnerName = FirstName LastName + + + ; ** Standalone Estate Settings ** + ; The following parameters will only be used on a standalone system to + ; create an estate owner that does not already exist + + ;# {DefaultEstateOwnerUUID} {} {Default estate owner UUID?} {} 00000000-0000-0000-0000-000000000000 + ;; If DefaultEstateOwnerUUID is left at UUID.Zero (as below) then a random + ;; UUID will be assigned. This is normally what you want ; DefaultEstateOwnerUUID = 00000000-0000-0000-0000-000000000000 + ;# {DefaultEstateOwnerEMail} {} {Default estate owner email?} {} + ;; Email address for the default estate owner ; DefaultEstateOwnerEMail = owner@domain.com + + ;# {DefaultEstateOwnerPassword} {} {Default estate owner password} {} + ;; Password for the default estate owner ; DefaultEstateOwnerPassword = password From 1a2ab7bc691192f4a263d3d57e2d83bb05f8c69c Mon Sep 17 00:00:00 2001 From: BlueWall Date: Sun, 8 Jul 2012 22:49:36 -0400 Subject: [PATCH 508/547] More keys for automated ini processing --- bin/OpenSim.ini.example | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/bin/OpenSim.ini.example b/bin/OpenSim.ini.example index 661abc0f71..33eaccb8dd 100644 --- a/bin/OpenSim.ini.example +++ b/bin/OpenSim.ini.example @@ -364,10 +364,14 @@ ; SMTP_SERVER_PASSWORD = "" [Network] + + ;# {ConsoleUser} {} {User name for console account} {} ;; Configure the remote console user here. This will not actually be used ;; unless you use -console=rest at startup. ; ConsoleUser = "Test" + ;# {ConsolePass} {} {Password for console account} {} ; ConsolePass = "secret" + ;# {console_port} {} {Port for console connections} {} 0 ; console_port = 0 ;# {http_listener_port} {} {TCP Port for this simulator to listen on? (This must be unique to the simulator!)} {} 9000 @@ -431,11 +435,14 @@ [SimulatorFeatures] + + ;# {MapImageServerURI} {} {URL for the map server} {} ; Experimental new information sent in SimulatorFeatures cap for Kokua viewers ; meant to override the MapImage and search server url given at login, and varying ; on a sim-basis. ; Viewers that don't understand it, will ignore it ;MapImageServerURI = "http://127.0.0.1:9000/" + ;# {SearchServerURI} {} {URL of the search server} {} ;SearchServerURI = "http://127.0.0.1:9000/" @@ -629,6 +636,7 @@ [Economy] + ;# {SellEnabled} {} {Enable selling for 0?} {true false} true ; The default economy module only implements just enough to allow free actions (transfer of objects, etc). ; There is no intention to implement anything further in core OpenSimulator. ; This functionality has to be provided by third party modules. @@ -636,9 +644,11 @@ ;; Enables selling things for $0. Default is true. ; SellEnabled = true + ;# {PriceUpload} {} {Price for uploading?} {} 0 ;; Money Unit fee to upload textures, animations etc. Default is 0. ; PriceUpload = 0 + ;# {PriceGroupCreate} {} {Fee for group creation} {} 0 ;; Money Unit fee to create groups. Default is 0. ; PriceGroupCreate = 0 @@ -748,32 +758,41 @@ ; If both Allow_ and Creators_ are given, effective permissions ; are the union of the two. + ;# {EventLimit} {} {Amount of time a script can spend in an event handler} {} 30 ;; Time a script can spend in an event handler before it is interrupted ; EventLimit = 30 + ;# {KillTimedOutScripts} {} {Kill script in case of event time overruns?} {true false} false ;; If a script overruns it's event limit, kill the script? ; KillTimedOutScripts = false + ;# {ScriptDelayFactor} {} {Multiplier for scripting delays} {} 1.0 ;; Sets the multiplier for the scripting delays ; ScriptDelayFactor = 1.0 + ;# {ScriptDistanceLimitFactor} {} {Multiplier for 10.0m distance limits?} {} ;; The factor the 10 m distances limits are multiplied by ; ScriptDistanceLimitFactor = 1.0 + ;# {NotecardLineReadCharsMax} {} {Maximum length of notecard line?} {} 255 ;; Maximum length of notecard line read ;; Increasing this to large values potentially opens ;; up the system to malicious scripters ; NotecardLineReadCharsMax = 255 + ;# {SensorMaxRange} {} {Sensor range} {} 96.0 ;; Sensor settings ; SensorMaxRange = 96.0 + ;# {SensorMaxResults} {} {Max sensor results returned?} {} ; SensorMaxResults = 16 + ;# {DisableUndergroundMovement} {} {Disable underground movement of prims} {true false} true ;; Disable underground movement of prims (default true); set to ;; false to allow script controlled underground positioning of ;; prims ; DisableUndergroundMovement = true + ;# {ScriptEnginesPath} {} {Path to script assemblies} {} ScriptEngines ;; Path to script engine assemblies ;; Default is ./bin/ScriptEngines ; ScriptEnginesPath = "ScriptEngines" From 2eaa6d5ace738cf1848f82ce7a0b435928b6846f Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Mon, 9 Jul 2012 21:24:32 +0100 Subject: [PATCH 509/547] Do not allow a script to attach a prim if its being sat upon. This prevents a stack overflow where a get position on the avatar will refer to the attachment which will in turn refer back to the avatar. This required recording of all sitting avatars on a prim which is done separately from recording the sit target avatar. Recording HashSet is null if there are no sitting avatars in order to save memory. --- .../Avatar/Attachments/AttachmentsModule.cs | 9 ++ .../Tests/AttachmentsModuleTests.cs | 32 +++++- .../Framework/Scenes/SceneObjectGroup.cs | 14 +++ .../Framework/Scenes/SceneObjectPart.cs | 98 +++++++++++++++++-- .../Region/Framework/Scenes/ScenePresence.cs | 18 +++- OpenSim/Tests/Common/Helpers/SceneHelpers.cs | 71 +++++++++++--- .../Common/Helpers/UserAccountHelpers.cs | 9 ++ 7 files changed, 227 insertions(+), 24 deletions(-) diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs index 9eb0e383c0..eccf7a6977 100644 --- a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs @@ -251,6 +251,15 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments // m_log.DebugFormat( // "[ATTACHMENTS MODULE]: Attaching object {0} {1} to {2} point {3} from ground (silent = {4})", // group.Name, group.LocalId, sp.Name, attachmentPt, silent); + + if (group.GetSittingAvatarsCount() != 0) + { +// m_log.WarnFormat( +// "[ATTACHMENTS MODULE]: Ignoring request to attach {0} {1} to {2} on {3} since {4} avatars are still sitting on it", +// group.Name, group.LocalId, sp.Name, attachmentPt, group.GetSittingAvatarsCount()); + + return false; + } if (sp.GetAttachments(attachmentPt).Contains(group)) { diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs index 5dcbd28f59..3e06900648 100644 --- a/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs +++ b/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs @@ -118,7 +118,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests Scene scene = CreateDefaultTestScene(); UserAccount ua1 = UserAccountHelpers.CreateUserWithInventory(scene, 0x1); - ScenePresence sp = SceneHelpers.AddScenePresence(scene, ua1.PrincipalID); + ScenePresence sp = SceneHelpers.AddScenePresence(scene, ua1); string attName = "att"; @@ -154,6 +154,36 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests // TestHelpers.DisableLogging(); } + /// + /// Test that we do not attempt to attach an in-world object that someone else is sitting on. + /// + [Test] + public void TestAddSatOnAttachmentFromGround() + { + TestHelpers.InMethod(); +// TestHelpers.EnableLogging(); + + Scene scene = CreateDefaultTestScene(); + UserAccount ua1 = UserAccountHelpers.CreateUserWithInventory(scene, 0x1); + ScenePresence sp = SceneHelpers.AddScenePresence(scene, ua1); + + string attName = "att"; + + SceneObjectGroup so = SceneHelpers.AddSceneObject(scene, attName, sp.UUID); + + UserAccount ua2 = UserAccountHelpers.CreateUserWithInventory(scene, 0x2); + ScenePresence sp2 = SceneHelpers.AddScenePresence(scene, ua2); + + // Put avatar within 10m of the prim so that sit doesn't fail. + sp2.AbsolutePosition = new Vector3(0, 0, 0); + sp2.HandleAgentRequestSit(sp2.ControllingClient, sp2.UUID, so.UUID, Vector3.Zero); + + scene.AttachmentsModule.AttachObject(sp, so, (uint)AttachmentPoint.Chest, false); + + Assert.That(sp.HasAttachments(), Is.False); + Assert.That(scene.GetSceneObjectGroups().Count, Is.EqualTo(1)); + } + [Test] public void TestAddAttachmentFromInventory() { diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs index 4e0e183b5f..fc0476157f 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs @@ -3401,6 +3401,20 @@ namespace OpenSim.Region.Framework.Scenes return count; } + /// + /// Gets the number of sitting avatars. + /// + /// This applies to all sitting avatars whether there is a sit target set or not. + /// + public int GetSittingAvatarsCount() + { + int count = 0; + + Array.ForEach(m_parts.GetArray(), p => count += p.GetSittingAvatarsCount()); + + return count; + } + public override string ToString() { return String.Format("{0} {1} ({2})", Name, UUID, AbsolutePosition); diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index 3d8135826b..6518b84e49 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs @@ -374,7 +374,6 @@ namespace OpenSim.Region.Framework.Scenes private uint _category; private Int32 _creationDate; private uint _parentID = 0; - private UUID m_sitTargetAvatar = UUID.Zero; private uint _baseMask = (uint)PermissionMask.All; private uint _ownerMask = (uint)PermissionMask.All; private uint _groupMask = (uint)PermissionMask.None; @@ -1233,13 +1232,20 @@ namespace OpenSim.Region.Framework.Scenes } /// - /// ID of the avatar that is sat on us. If there is no such avatar then is UUID.Zero + /// ID of the avatar that is sat on us if we have a sit target. If there is no such avatar then is UUID.Zero /// - public UUID SitTargetAvatar - { - get { return m_sitTargetAvatar; } - set { m_sitTargetAvatar = value; } - } + public UUID SitTargetAvatar { get; set; } + + /// + /// IDs of all avatars start on this object part. + /// + /// + /// We need to track this so that we can stop sat upon prims from being attached. + /// + /// + /// null if there are no sitting avatars. This is to save us create a hashset for every prim in a scene. + /// + private HashSet m_sittingAvatars; public virtual UUID RegionID { @@ -4493,5 +4499,83 @@ namespace OpenSim.Region.Framework.Scenes Color color = Color; return new Color4(color.R, color.G, color.B, (byte)(0xFF - color.A)); } + + /// + /// Record an avatar sitting on this part. + /// + /// This is called for all the sitting avatars whether there is a sit target set or not. + /// + /// true if the avatar was not already recorded, false otherwise. + /// + /// + protected internal bool AddSittingAvatar(UUID avatarId) + { + HashSet sittingAvatars = m_sittingAvatars; + + if (sittingAvatars == null) + sittingAvatars = new HashSet(); + + lock (sittingAvatars) + { + m_sittingAvatars = sittingAvatars; + return m_sittingAvatars.Add(avatarId); + } + } + + /// + /// Remove an avatar recorded as sitting on this part. + /// + /// This applies to all sitting avatars whether there is a sit target set or not. + /// + /// true if the avatar was present and removed, false if it was not present. + /// + /// + protected internal bool RemoveSittingAvatar(UUID avatarId) + { + HashSet sittingAvatars = m_sittingAvatars; + + // This can occur under a race condition where another thread + if (sittingAvatars == null) + return false; + + lock (sittingAvatars) + { + if (sittingAvatars.Remove(avatarId)) + { + if (sittingAvatars.Count == 0) + m_sittingAvatars = null; + + return true; + } + } + + return false; + } + + /// + /// Get a copy of the list of sitting avatars. + /// + /// This applies to all sitting avatars whether there is a sit target set or not. + /// + public HashSet GetSittingAvatars() + { + return new HashSet(m_sittingAvatars); + } + + /// + /// Gets the number of sitting avatars. + /// + /// This applies to all sitting avatars whether there is a sit target set or not. + /// + public int GetSittingAvatarsCount() + { + HashSet sittingAvatars = m_sittingAvatars; + + if (sittingAvatars == null) + return 0; + + lock (sittingAvatars) + return sittingAvatars.Count; + } } } diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index c7a670f2c2..c6a2a032dc 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs @@ -577,6 +577,12 @@ namespace OpenSim.Region.Framework.Scenes /// public uint ParentID { get; set; } + /// + /// Are we sitting on an object? + /// + /// A more readable way of testing presence sit status than ParentID == 0 + public bool IsSatOnObject { get { return ParentID != 0; } } + /// /// If the avatar is sitting, the prim that it's sitting on. If not sitting then null. /// @@ -1808,6 +1814,8 @@ namespace OpenSim.Region.Framework.Scenes SendAvatarDataToAllAgents(); m_requestedSitTargetID = 0; + part.RemoveSittingAvatar(UUID); + if (part != null) part.ParentGroup.TriggerScriptChangedEvent(Changed.LINK); } @@ -1887,7 +1895,7 @@ namespace OpenSim.Region.Framework.Scenes ) )); -// m_log.DebugFormat("[SCENE PRESENCE]: {0} {1}", SitTargetisSet, SitTargetUnOccupied); + m_log.DebugFormat("[SCENE PRESENCE]: {0} {1}", SitTargetisSet, SitTargetUnOccupied); if (PhysicsActor != null) m_sitAvatarHeight = PhysicsActor.Size.Z; @@ -1920,6 +1928,12 @@ namespace OpenSim.Region.Framework.Scenes AbsolutePosition = pos + new Vector3(0.0f, 0.0f, m_sitAvatarHeight); canSit = true; } +// else +// { +// m_log.DebugFormat( +// "[SCENE PRESENCE]: Ignoring sit request of {0} on {1} {2} because sit target is unset and outside 10m", +// Name, part.Name, part.LocalId); +// } } if (canSit) @@ -1930,6 +1944,8 @@ namespace OpenSim.Region.Framework.Scenes RemoveFromPhysicalScene(); } + part.AddSittingAvatar(UUID); + cameraAtOffset = part.GetCameraAtOffset(); cameraEyeOffset = part.GetCameraEyeOffset(); forceMouselook = part.GetForceMouselook(); diff --git a/OpenSim/Tests/Common/Helpers/SceneHelpers.cs b/OpenSim/Tests/Common/Helpers/SceneHelpers.cs index d5354cbcac..769de83c9c 100644 --- a/OpenSim/Tests/Common/Helpers/SceneHelpers.cs +++ b/OpenSim/Tests/Common/Helpers/SceneHelpers.cs @@ -412,26 +412,49 @@ namespace OpenSim.Tests.Common /// public static AgentCircuitData GenerateAgentData(UUID agentId) { - string firstName = "testfirstname"; + AgentCircuitData acd = GenerateCommonAgentData(); - AgentCircuitData agentData = new AgentCircuitData(); - agentData.AgentID = agentId; - agentData.firstname = firstName; - agentData.lastname = "testlastname"; + acd.AgentID = agentId; + acd.firstname = "testfirstname"; + acd.lastname = "testlastname"; + acd.ServiceURLs = new Dictionary(); + + return acd; + } + + /// + /// Generate some standard agent connection data. + /// + /// + /// + public static AgentCircuitData GenerateAgentData(UserAccount ua) + { + AgentCircuitData acd = GenerateCommonAgentData(); + + acd.AgentID = ua.PrincipalID; + acd.firstname = ua.FirstName; + acd.lastname = ua.LastName; + acd.ServiceURLs = ua.ServiceURLs; + + return acd; + } + + private static AgentCircuitData GenerateCommonAgentData() + { + AgentCircuitData acd = new AgentCircuitData(); // XXX: Sessions must be unique, otherwise one presence can overwrite another in NullPresenceData. - agentData.SessionID = UUID.Random(); - agentData.SecureSessionID = UUID.Random(); + acd.SessionID = UUID.Random(); + acd.SecureSessionID = UUID.Random(); - agentData.circuitcode = 123; - agentData.BaseFolder = UUID.Zero; - agentData.InventoryFolder = UUID.Zero; - agentData.startpos = Vector3.Zero; - agentData.CapsPath = "http://wibble.com"; - agentData.ServiceURLs = new Dictionary(); - agentData.Appearance = new AvatarAppearance(); + acd.circuitcode = 123; + acd.BaseFolder = UUID.Zero; + acd.InventoryFolder = UUID.Zero; + acd.startpos = Vector3.Zero; + acd.CapsPath = "http://wibble.com"; + acd.Appearance = new AvatarAppearance(); - return agentData; + return acd; } /// @@ -440,6 +463,9 @@ namespace OpenSim.Tests.Common /// /// This can be used for tests where there is only one region or where there are multiple non-neighbour regions /// and teleport doesn't take place. + /// + /// XXX: Use the version of this method that takes the UserAccount structure wherever possible - this will + /// make the agent circuit data (e.g. first, lastname) consistent with the user account data. /// /// /// @@ -452,6 +478,10 @@ namespace OpenSim.Tests.Common /// /// Add a root agent where the details of the agent connection (apart from the id) are unimportant for the test /// + /// + /// XXX: Use the version of this method that takes the UserAccount structure wherever possible - this will + /// make the agent circuit data (e.g. first, lastname) consistent with the user account data. + /// /// /// /// @@ -461,6 +491,17 @@ namespace OpenSim.Tests.Common return AddScenePresence(scene, GenerateAgentData(agentId), sceneManager); } + /// + /// Add a root agent. + /// + /// + /// + /// + public static ScenePresence AddScenePresence(Scene scene, UserAccount ua) + { + return AddScenePresence(scene, GenerateAgentData(ua)); + } + /// /// Add a root agent. /// diff --git a/OpenSim/Tests/Common/Helpers/UserAccountHelpers.cs b/OpenSim/Tests/Common/Helpers/UserAccountHelpers.cs index 3d3e65c58c..2fbebc4ea9 100644 --- a/OpenSim/Tests/Common/Helpers/UserAccountHelpers.cs +++ b/OpenSim/Tests/Common/Helpers/UserAccountHelpers.cs @@ -138,6 +138,15 @@ namespace OpenSim.Tests.Common CreateUserWithInventory(scene, ua, pw); return ua; } + + public static UserAccount CreateUserWithInventory( + Scene scene, string firstName, string lastName, int userId, string pw) + { + UserAccount ua + = new UserAccount(TestHelpers.ParseTail(userId)) { FirstName = firstName, LastName = lastName }; + CreateUserWithInventory(scene, ua, pw); + return ua; + } public static void CreateUserWithInventory(Scene scene, UserAccount ua, string pw) { From d6f563794efb857210f4c773ef5218855c9a4ea4 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Mon, 9 Jul 2012 21:43:44 +0100 Subject: [PATCH 510/547] Don't allow a prim to be sat upon if its part of an attachment --- OpenSim/Region/Framework/Scenes/ScenePresence.cs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index c6a2a032dc..51ca9bdeaa 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs @@ -2219,6 +2219,15 @@ namespace OpenSim.Region.Framework.Scenes if (part != null) { + if (part.ParentGroup.IsAttachment) + { + m_log.WarnFormat( + "[SCENE PRESENCE]: Avatar {0} tried to sit on part {1} from object {2} in {3} but this is an attachment for avatar id {4}", + Name, part.Name, part.ParentGroup.Name, Scene.Name, part.ParentGroup.AttachedAvatar); + + return; + } + if (part.SitTargetAvatar == UUID) { Vector3 sitTargetPos = part.SitTargetPosition; From c8af20f966e005fb512869299d80be6b83cb70bf Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Mon, 9 Jul 2012 23:08:41 +0100 Subject: [PATCH 511/547] This script allows an object to be attached directly from prim inventory to another avatar in the scene. Very useful in serious game/environment scenarios where its only allowed for trusted creators. Threat level Severe --- .../Shared/Api/Implementation/OSSL_Api.cs | 25 +++++++-- .../Shared/Api/Interface/IOSSL_Api.cs | 18 ++++++- .../Shared/Api/Runtime/OSSL_Stub.cs | 5 ++ .../Shared/Tests/OSSL_ApiAttachmentTests.cs | 53 +++++++++++++++++++ 4 files changed, 96 insertions(+), 5 deletions(-) diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs index 61394afe91..e90f57754e 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs @@ -3190,13 +3190,32 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api { CheckThreatLevel(ThreatLevel.High, "osForceAttachToAvatarFromInventory"); + m_host.AddScriptLPS(1); + + ForceAttachToAvatarFromInventory(m_host.OwnerID, itemName, attachmentPoint); + } + + public void osForceAttachToOtherAvatarFromInventory(string rawAvatarId, string itemName, int attachmentPoint) + { + CheckThreatLevel(ThreatLevel.Severe, "osForceAttachToOtherAvatarFromInventory"); + + m_host.AddScriptLPS(1); + + UUID avatarId; + + if (!UUID.TryParse(rawAvatarId, out avatarId)) + return; + + ForceAttachToAvatarFromInventory(avatarId, itemName, attachmentPoint); + } + + public void ForceAttachToAvatarFromInventory(UUID avatarId, string itemName, int attachmentPoint) + { IAttachmentsModule attachmentsModule = m_ScriptEngine.World.AttachmentsModule; if (attachmentsModule == null) return; - m_host.AddScriptLPS(1); - InitLSL(); TaskInventoryItem item = m_host.Inventory.GetInventoryItem(itemName); @@ -3219,7 +3238,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api return; } - ScenePresence sp = World.GetScenePresence(m_host.OwnerID); + ScenePresence sp = World.GetScenePresence(avatarId); if (sp == null) return; diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs index d38709e2b9..b5416c8b0e 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs @@ -101,18 +101,32 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces // Attachment commands /// - /// Attach the object containing this script to the avatar that owns it without checking for PERMISSION_ATTACH + /// Attach the object containing this script to the avatar that owns it without asking for PERMISSION_ATTACH /// /// The attachment point. For example, ATTACH_CHEST void osForceAttachToAvatar(int attachment); /// - /// Attach the inventory item in the object containing this script to the avatar that owns it without checking for PERMISSION_ATTACH + /// Attach an inventory item in the object containing this script to the avatar that owns it without asking for PERMISSION_ATTACH /// + /// + /// Nothing happens if the owner is not in the region. + /// /// Tha name of the item. If this is not found then a warning is said to the owner /// The attachment point. For example, ATTACH_CHEST void osForceAttachToAvatarFromInventory(string itemName, int attachment); + /// + /// Attach an inventory item in the object containing this script to any avatar in the region without asking for PERMISSION_ATTACH + /// + /// + /// Nothing happens if the avatar is not in the region. + /// + /// The UUID of the avatar to which to attach. Nothing happens if this is not a UUID + /// The name of the item. If this is not found then a warning is said to the owner + /// The attachment point. For example, ATTACH_CHEST + void osForceAttachToOtherAvatarFromInventory(string rawAvatarId, string itemName, int attachmentPoint); + /// /// Detach the object containing this script from the avatar it is attached to without checking for PERMISSION_ATTACH /// diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs index 692bb0a510..b40bdf0b17 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs @@ -301,6 +301,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase m_OSSL_Functions.osForceAttachToAvatarFromInventory(itemName, attachmentPoint); } + public void osForceAttachToOtherAvatarFromInventory(string rawAvatarId, string itemName, int attachmentPoint) + { + m_OSSL_Functions.osForceAttachToOtherAvatarFromInventory(rawAvatarId, itemName, attachmentPoint); + } + public void osForceDetachFromAvatar() { m_OSSL_Functions.osForceDetachFromAvatar(); diff --git a/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiAttachmentTests.cs b/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiAttachmentTests.cs index 78db2c6a48..f5aa51843f 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiAttachmentTests.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiAttachmentTests.cs @@ -174,5 +174,58 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests List attachmentsInAppearance = sp.Appearance.GetAttachments(); Assert.That(attachmentsInAppearance.Count, Is.EqualTo(0)); } + + [Test] + public void TestOsForceAttachToOtherAvatarFromInventory() + { + TestHelpers.InMethod(); + TestHelpers.EnableLogging(); + + string taskInvObjItemName = "sphere"; + UUID taskInvObjItemId = UUID.Parse("00000000-0000-0000-0000-100000000000"); + AttachmentPoint attachPoint = AttachmentPoint.Chin; + + UserAccount ua1 = UserAccountHelpers.CreateUserWithInventory(m_scene, "user", "one", 0x1, "pass"); + UserAccount ua2 = UserAccountHelpers.CreateUserWithInventory(m_scene, "user", "two", 0x2, "pass"); + + ScenePresence sp = SceneHelpers.AddScenePresence(m_scene, ua1); + SceneObjectGroup inWorldObj = SceneHelpers.AddSceneObject(m_scene, "inWorldObj", ua1.PrincipalID); + TaskInventoryItem scriptItem = TaskInventoryHelpers.AddScript(m_scene, inWorldObj.RootPart); + + new LSL_Api().Initialize(m_engine, inWorldObj.RootPart, scriptItem); + OSSL_Api osslApi = new OSSL_Api(); + osslApi.Initialize(m_engine, inWorldObj.RootPart, scriptItem); + + // Create an object embedded inside the first + TaskInventoryHelpers.AddSceneObject(m_scene, inWorldObj.RootPart, taskInvObjItemName, taskInvObjItemId, ua1.PrincipalID); + + ScenePresence sp2 = SceneHelpers.AddScenePresence(m_scene, ua2); + + osslApi.osForceAttachToOtherAvatarFromInventory(sp2.UUID.ToString(), taskInvObjItemName, (int)attachPoint); + + // Check scene presence status + Assert.That(sp.HasAttachments(), Is.False); + List attachments = sp.GetAttachments(); + Assert.That(attachments.Count, Is.EqualTo(0)); + + Assert.That(sp2.HasAttachments(), Is.True); + List attachments2 = sp2.GetAttachments(); + Assert.That(attachments2.Count, Is.EqualTo(1)); + SceneObjectGroup attSo = attachments2[0]; + Assert.That(attSo.Name, Is.EqualTo(taskInvObjItemName)); + Assert.That(attSo.OwnerID, Is.EqualTo(ua2.PrincipalID)); + Assert.That(attSo.AttachmentPoint, Is.EqualTo((uint)attachPoint)); + Assert.That(attSo.IsAttachment); + Assert.That(attSo.UsesPhysics, Is.False); + Assert.That(attSo.IsTemporary, Is.False); + + // Check appearance status + List attachmentsInAppearance = sp.Appearance.GetAttachments(); + Assert.That(attachmentsInAppearance.Count, Is.EqualTo(0)); + + List attachmentsInAppearance2 = sp2.Appearance.GetAttachments(); + Assert.That(attachmentsInAppearance2.Count, Is.EqualTo(1)); + Assert.That(sp2.Appearance.GetAttachpoint(attachmentsInAppearance2[0].ItemID), Is.EqualTo((uint)attachPoint)); + } } } \ No newline at end of file From eb5ec4a78698a3b1fd6d581c800ac985d5d946fa Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Tue, 10 Jul 2012 21:42:51 +0100 Subject: [PATCH 512/547] If a script is being stopped manually, then give the scriptpool thread 1 second to finish normally before forcibly aborting. This is to avoid the worst of the problems in mono 2.6, 2.10 where an aborted thread does not always release all its locks. This very short grace period is identical to the existing behaviour when a script is removed from the scene. --- OpenSim/Region/ScriptEngine/XEngine/XEngine.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs index 7f3bd765f0..efcae94c8d 100644 --- a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs +++ b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs @@ -1574,7 +1574,11 @@ namespace OpenSim.Region.ScriptEngine.XEngine { IScriptInstance instance = GetInstance(itemID); if (instance != null) - instance.Stop(0); + { + // Give the script some time to finish processing its last event. Simply aborting the script thread can + // cause issues on mono 2.6, 2.10 and possibly later where locks are not released properly on abort. + instance.Stop(1000); + } } public DetectParams GetDetectParams(UUID itemID, int idx) From f3134b5cf688af9b824880e0221072b24d22f33e Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Tue, 10 Jul 2012 22:41:11 +0100 Subject: [PATCH 513/547] When an attachment is detached to inv or derezzed, stop the scripts, update the known item with script state still in the script engine and then remove the scripts. This is to fix a regression starting from 5301648 where attachments had to start being deleted before persistence in order to avoid race conditions with hud update threads. --- .../Avatar/Attachments/AttachmentsModule.cs | 20 +++++-- .../Framework/Interfaces/IEntityInventory.cs | 15 ++++- OpenSim/Region/Framework/Scenes/Scene.cs | 19 +++++- .../Scenes/SceneObjectGroup.Inventory.cs | 10 +++- .../Scenes/SceneObjectPartInventory.cs | 59 ++++++++++++++++++- 5 files changed, 110 insertions(+), 13 deletions(-) diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs index eccf7a6977..efab6ed5ff 100644 --- a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs @@ -211,16 +211,20 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments lock (sp.AttachmentsSyncLock) { - foreach (SceneObjectGroup grp in sp.GetAttachments()) + foreach (SceneObjectGroup so in sp.GetAttachments()) { - grp.Scene.DeleteSceneObject(grp, false); + // We can only remove the script instances from the script engine after we've retrieved their xml state + // when we update the attachment item. + m_scene.DeleteSceneObject(so, false, false); if (saveChanged || saveAllScripted) { - grp.IsAttachment = false; - grp.AbsolutePosition = grp.RootPart.AttachedPos; - UpdateKnownItem(sp, grp, saveAllScripted); + so.IsAttachment = false; + so.AbsolutePosition = so.RootPart.AttachedPos; + UpdateKnownItem(sp, so, saveAllScripted); } + + so.RemoveScriptInstances(true); } sp.ClearAttachments(); @@ -682,7 +686,10 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments m_scene.EventManager.TriggerOnAttach(so.LocalId, so.FromItemID, UUID.Zero); sp.RemoveAttachment(so); - m_scene.DeleteSceneObject(so, false); + + // We can only remove the script instances from the script engine after we've retrieved their xml state + // when we update the attachment item. + m_scene.DeleteSceneObject(so, false, false); // Prepare sog for storage so.AttachedAvatar = UUID.Zero; @@ -691,6 +698,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments so.AbsolutePosition = so.RootPart.AttachedPos; UpdateKnownItem(sp, so, true); + so.RemoveScriptInstances(true); } private SceneObjectGroup RezSingleAttachmentFromInventoryInternal( diff --git a/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs b/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs index 1c9bdce832..8d6284739b 100644 --- a/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs +++ b/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs @@ -92,7 +92,7 @@ namespace OpenSim.Region.Framework.Interfaces void ResumeScripts(); /// - /// Stop all the scripts in this entity. + /// Stop and remove all the scripts in this entity from the scene. /// /// /// Should be true if these scripts are being removed because the scene @@ -100,6 +100,11 @@ namespace OpenSim.Region.Framework.Interfaces /// void RemoveScriptInstances(bool sceneObjectBeingDeleted); + /// + /// Stop all the scripts in this entity. + /// + void StopScriptInstances(); + /// /// Start a script which is in this entity's inventory. /// @@ -129,7 +134,7 @@ namespace OpenSim.Region.Framework.Interfaces bool CreateScriptInstance(UUID itemId, int startParam, bool postOnRez, string engine, int stateSource); /// - /// Stop a script which is in this prim's inventory. + /// Stop and remove a script which is in this prim's inventory from the scene. /// /// /// @@ -138,6 +143,12 @@ namespace OpenSim.Region.Framework.Interfaces /// void RemoveScriptInstance(UUID itemId, bool sceneObjectBeingDeleted); + /// + /// Stop a script which is in this prim's inventory. + /// + /// + void StopScriptInstance(UUID itemId); + /// /// Add an item to this entity's inventory. If an item with the same name already exists, then an alternative /// name is chosen. diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index ec911a52d4..25223b95b3 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -2183,13 +2183,30 @@ namespace OpenSim.Region.Framework.Scenes /// /// Synchronously delete the given object from the scene. /// + /// + /// Scripts are also removed. + /// /// Object Id /// Suppress broadcasting changes to other clients. public void DeleteSceneObject(SceneObjectGroup group, bool silent) + { + DeleteSceneObject(group, silent, true); + } + + /// + /// Synchronously delete the given object from the scene. + /// + /// Object Id + /// Suppress broadcasting changes to other clients. + /// If true, then scripts are removed. If false, then they are only stopped. + public void DeleteSceneObject(SceneObjectGroup group, bool silent, bool removeScripts) { // m_log.DebugFormat("[SCENE]: Deleting scene object {0} {1}", group.Name, group.UUID); - group.RemoveScriptInstances(true); + if (removeScripts) + group.RemoveScriptInstances(true); + else + group.StopScriptInstances(); SceneObjectPart[] partList = group.Parts; diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs index 2866b546eb..ddf5da0ba4 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs @@ -79,7 +79,7 @@ namespace OpenSim.Region.Framework.Scenes } /// - /// Stop the scripts contained in all the prims in this group + /// Stop and remove the scripts contained in all the prims in this group /// /// /// Should be true if these scripts are being removed because the scene @@ -92,6 +92,14 @@ namespace OpenSim.Region.Framework.Scenes parts[i].Inventory.RemoveScriptInstances(sceneObjectBeingDeleted); } + /// + /// Stop the scripts contained in all the prims in this group + /// + public void StopScriptInstances() + { + Array.ForEach(m_parts.GetArray(), p => p.Inventory.StopScriptInstances()); + } + /// /// Add an inventory item from a user's inventory to a prim in this scene object. /// diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs index 866311a298..cf2ed1a802 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs @@ -280,7 +280,7 @@ namespace OpenSim.Region.Framework.Scenes } /// - /// Stop all the scripts in this prim. + /// Stop and remove all the scripts in this prim. /// /// /// Should be true if these scripts are being removed because the scene @@ -293,6 +293,14 @@ namespace OpenSim.Region.Framework.Scenes RemoveScriptInstance(item.ItemID, sceneObjectBeingDeleted); } + /// + /// Stop all the scripts in this prim. + /// + public void StopScriptInstances() + { + GetInventoryItems(InventoryType.LSL).ForEach(i => StopScriptInstance(i)); + } + /// /// Start a script which is in this prim's inventory. /// @@ -443,7 +451,7 @@ namespace OpenSim.Region.Framework.Scenes } /// - /// Stop a script which is in this prim's inventory. + /// Stop and remove a script which is in this prim's inventory. /// /// /// @@ -470,7 +478,7 @@ namespace OpenSim.Region.Framework.Scenes } else { - m_log.ErrorFormat( + m_log.WarnFormat( "[PRIM INVENTORY]: " + "Couldn't stop script with ID {0} since it couldn't be found for prim {1}, {2} at {3} in {4}", itemId, m_part.Name, m_part.UUID, @@ -478,6 +486,51 @@ namespace OpenSim.Region.Framework.Scenes } } + /// + /// Stop a script which is in this prim's inventory. + /// + /// + /// + /// Should be true if this script is being removed because the scene + /// object is being deleted. This will prevent spurious updates to the client. + /// + public void StopScriptInstance(UUID itemId) + { + TaskInventoryItem scriptItem; + + lock (m_items) + m_items.TryGetValue(itemId, out scriptItem); + + if (scriptItem != null) + { + StopScriptInstance(scriptItem); + } + else + { + m_log.WarnFormat( + "[PRIM INVENTORY]: " + + "Couldn't stop script with ID {0} since it couldn't be found for prim {1}, {2} at {3} in {4}", + itemId, m_part.Name, m_part.UUID, + m_part.AbsolutePosition, m_part.ParentGroup.Scene.RegionInfo.RegionName); + } + } + + /// + /// Stop a script which is in this prim's inventory. + /// + /// + /// + /// Should be true if this script is being removed because the scene + /// object is being deleted. This will prevent spurious updates to the client. + /// + public void StopScriptInstance(TaskInventoryItem item) + { + m_part.ParentGroup.Scene.EventManager.TriggerStopScript(m_part.LocalId, item.ItemID); + + // At the moment, even stopped scripts are counted as active, which is probably wrong. +// m_part.ParentGroup.AddActiveScriptCount(-1); + } + /// /// Check if the inventory holds an item with a given name. /// From 58869e5aa09a292dc2159c73bada2c487151dda0 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Tue, 10 Jul 2012 23:03:52 +0100 Subject: [PATCH 514/547] Fix recent SOP.GetSittingAvatars() to return null if there are no sitting avatars rather than throwing an exception. Extends sitting avatar regression tests to test new sitters information --- .../Framework/Scenes/SceneObjectPart.cs | 14 +++++++++-- .../Scenes/Tests/ScenePresenceSitTests.cs | 24 +++++++++++++++---- prebuild.xml | 1 + 3 files changed, 33 insertions(+), 6 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index 6518b84e49..6677daeb30 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs @@ -4556,10 +4556,20 @@ namespace OpenSim.Region.Framework.Scenes /// Get a copy of the list of sitting avatars. /// /// This applies to all sitting avatars whether there is a sit target set or not. - /// + /// A hashset of the sitting avatars. Returns null if there are no sitting avatars. public HashSet GetSittingAvatars() { - return new HashSet(m_sittingAvatars); + HashSet sittingAvatars = m_sittingAvatars; + + if (sittingAvatars == null) + { + return null; + } + else + { + lock (sittingAvatars) + return new HashSet(sittingAvatars); + } } /// diff --git a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceSitTests.cs b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceSitTests.cs index ed39be1fec..493ab70883 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceSitTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceSitTests.cs @@ -26,6 +26,7 @@ */ using System; +using System.Collections.Generic; using System.Reflection; using Nini.Config; using NUnit.Framework; @@ -69,6 +70,8 @@ namespace OpenSim.Region.Framework.Scenes.Tests m_sp.HandleAgentRequestSit(m_sp.ControllingClient, m_sp.UUID, part.UUID, Vector3.Zero); Assert.That(part.SitTargetAvatar, Is.EqualTo(UUID.Zero)); + Assert.That(part.GetSittingAvatarsCount(), Is.EqualTo(0)); + Assert.That(part.GetSittingAvatars(), Is.Null); Assert.That(m_sp.ParentID, Is.EqualTo(0)); } @@ -86,7 +89,13 @@ namespace OpenSim.Region.Framework.Scenes.Tests m_sp.HandleAgentRequestSit(m_sp.ControllingClient, m_sp.UUID, part.UUID, Vector3.Zero); + Assert.That(m_sp.PhysicsActor, Is.Null); + Assert.That(part.SitTargetAvatar, Is.EqualTo(UUID.Zero)); + Assert.That(part.GetSittingAvatarsCount(), Is.EqualTo(1)); + HashSet sittingAvatars = part.GetSittingAvatars(); + Assert.That(sittingAvatars.Count, Is.EqualTo(1)); + Assert.That(sittingAvatars.Contains(m_sp.UUID)); Assert.That(m_sp.ParentID, Is.EqualTo(part.LocalId)); } @@ -104,10 +113,6 @@ namespace OpenSim.Region.Framework.Scenes.Tests m_sp.HandleAgentRequestSit(m_sp.ControllingClient, m_sp.UUID, part.UUID, Vector3.Zero); - Assert.That(part.SitTargetAvatar, Is.EqualTo(UUID.Zero)); - Assert.That(m_sp.ParentID, Is.EqualTo(part.LocalId)); - Assert.That(m_sp.PhysicsActor, Is.Null); - // FIXME: This is different for live avatars - z position is adjusted. This is half the height of the // default avatar. // Curiously, Vector3.ToString() will not display the last two places of the float. For example, @@ -119,6 +124,8 @@ namespace OpenSim.Region.Framework.Scenes.Tests m_sp.StandUp(); Assert.That(part.SitTargetAvatar, Is.EqualTo(UUID.Zero)); + Assert.That(part.GetSittingAvatarsCount(), Is.EqualTo(0)); + Assert.That(part.GetSittingAvatars(), Is.Null); Assert.That(m_sp.ParentID, Is.EqualTo(0)); Assert.That(m_sp.PhysicsActor, Is.Not.Null); } @@ -145,11 +152,20 @@ namespace OpenSim.Region.Framework.Scenes.Tests Is.EqualTo(part.AbsolutePosition + part.SitTargetPosition + ScenePresence.SIT_TARGET_ADJUSTMENT)); Assert.That(m_sp.PhysicsActor, Is.Null); + Assert.That(part.GetSittingAvatarsCount(), Is.EqualTo(1)); + HashSet sittingAvatars = part.GetSittingAvatars(); + Assert.That(sittingAvatars.Count, Is.EqualTo(1)); + Assert.That(sittingAvatars.Contains(m_sp.UUID)); + m_sp.StandUp(); Assert.That(part.SitTargetAvatar, Is.EqualTo(UUID.Zero)); Assert.That(m_sp.ParentID, Is.EqualTo(0)); Assert.That(m_sp.PhysicsActor, Is.Not.Null); + + Assert.That(part.SitTargetAvatar, Is.EqualTo(UUID.Zero)); + Assert.That(part.GetSittingAvatarsCount(), Is.EqualTo(0)); + Assert.That(part.GetSittingAvatars(), Is.Null); } [Test] diff --git a/prebuild.xml b/prebuild.xml index 45f58c7e7c..3419119ef6 100644 --- a/prebuild.xml +++ b/prebuild.xml @@ -3042,6 +3042,7 @@ ../../../bin/ + From 9f01c3d4087266a8aa9a372a87ff78cae971d0c5 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Tue, 10 Jul 2012 23:04:44 +0100 Subject: [PATCH 515/547] Disable logging in regression test in OSSL_ApiAttachmentTests --- .../Region/ScriptEngine/Shared/Tests/OSSL_ApiAttachmentTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiAttachmentTests.cs b/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiAttachmentTests.cs index f5aa51843f..5ed1f3d2cf 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiAttachmentTests.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiAttachmentTests.cs @@ -179,7 +179,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests public void TestOsForceAttachToOtherAvatarFromInventory() { TestHelpers.InMethod(); - TestHelpers.EnableLogging(); +// TestHelpers.EnableLogging(); string taskInvObjItemName = "sphere"; UUID taskInvObjItemId = UUID.Parse("00000000-0000-0000-0000-100000000000"); From 506437b68449ab521f0ccf467ad642ad5e442d73 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Tue, 10 Jul 2012 23:06:34 +0100 Subject: [PATCH 516/547] Remove log line accidentally left in SP.SendSitResponse() --- OpenSim/Region/Framework/Scenes/ScenePresence.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index 51ca9bdeaa..c71bae9bc1 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs @@ -1895,7 +1895,7 @@ namespace OpenSim.Region.Framework.Scenes ) )); - m_log.DebugFormat("[SCENE PRESENCE]: {0} {1}", SitTargetisSet, SitTargetUnOccupied); +// m_log.DebugFormat("[SCENE PRESENCE]: {0} {1}", SitTargetisSet, SitTargetUnOccupied); if (PhysicsActor != null) m_sitAvatarHeight = PhysicsActor.Size.Z; From e8347b70957273421ee567577e2d9a6139af0621 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Tue, 10 Jul 2012 23:19:52 +0100 Subject: [PATCH 517/547] Move common code to detect whether a part has a valid sit target into a SOP property rather than being repeated in SP. This also makes the detection in SP.FindNextAvailableSitTarget() and SendSitResponse() identical. Previously they varied slightly (SendSitResponse didn't check for an older type of invalid quaternion) but the practical effect is most probably zero. --- .../Framework/Scenes/SceneObjectPart.cs | 15 ++++++++ .../Region/Framework/Scenes/ScenePresence.cs | 35 +++---------------- 2 files changed, 20 insertions(+), 30 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index 6677daeb30..dcec7e9681 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs @@ -135,6 +135,21 @@ namespace OpenSim.Region.Framework.Scenes get { return ParentGroup.RootPart == this; } } + /// + /// Is an explicit sit target set for this part? + /// + public bool IsSitTargetSet + { + get + { + return + !(SitTargetPosition == Vector3.Zero + && (SitTargetOrientation == Quaternion.Identity // Valid Zero Rotation quaternion + || SitTargetOrientation.X == 0f && SitTargetOrientation.Y == 0f && SitTargetOrientation.Z == 1f && SitTargetOrientation.W == 0f // W-Z Mapping was invalid at one point + || SitTargetOrientation.X == 0f && SitTargetOrientation.Y == 0f && SitTargetOrientation.Z == 0f && SitTargetOrientation.W == 0f)); // Invalid Quaternion + } + } + #region Fields public bool AllowedDrop; diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index c71bae9bc1..c644ea5914 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs @@ -1846,15 +1846,7 @@ namespace OpenSim.Region.Framework.Scenes //look for prims with explicit sit targets that are available foreach (SceneObjectPart part in partArray) { - // Is a sit target available? - Vector3 avSitOffset = part.SitTargetPosition; - Quaternion avSitOrientation = part.SitTargetOrientation; - UUID avOnTargetAlready = part.SitTargetAvatar; - - bool SitTargetUnOccupied = avOnTargetAlready == UUID.Zero; - bool SitTargetisSet = avSitOffset != Vector3.Zero || avSitOrientation != Quaternion.Identity; - - if (SitTargetisSet && SitTargetUnOccupied) + if (part.IsSitTargetSet && part.SitTargetAvatar == UUID.Zero) { //switch the target to this prim return part; @@ -1880,40 +1872,23 @@ namespace OpenSim.Region.Framework.Scenes // TODO: determine position to sit at based on scene geometry; don't trust offset from client // see http://wiki.secondlife.com/wiki/User:Andrew_Linden/Office_Hours/2007_11_06 for details on how LL does it - // Is a sit target available? - Vector3 avSitOffSet = part.SitTargetPosition; - Quaternion avSitOrientation = part.SitTargetOrientation; - UUID avOnTargetAlready = part.SitTargetAvatar; - - bool SitTargetUnOccupied = (!(avOnTargetAlready != UUID.Zero)); - bool SitTargetisSet = - (!(avSitOffSet == Vector3.Zero && - ( - avSitOrientation == Quaternion.Identity // Valid Zero Rotation quaternion - || avSitOrientation.X == 0f && avSitOrientation.Y == 0f && avSitOrientation.Z == 1f && avSitOrientation.W == 0f // W-Z Mapping was invalid at one point - || avSitOrientation.X == 0f && avSitOrientation.Y == 0f && avSitOrientation.Z == 0f && avSitOrientation.W == 0f // Invalid Quaternion - ) - )); - -// m_log.DebugFormat("[SCENE PRESENCE]: {0} {1}", SitTargetisSet, SitTargetUnOccupied); - if (PhysicsActor != null) m_sitAvatarHeight = PhysicsActor.Size.Z; bool canSit = false; pos = part.AbsolutePosition + offset; - if (SitTargetisSet) + if (part.IsSitTargetSet) { - if (SitTargetUnOccupied) + if (part.SitTargetAvatar == UUID.Zero) { // m_log.DebugFormat( // "[SCENE PRESENCE]: Sitting {0} on {1} {2} because sit target is set and unoccupied", // Name, part.Name, part.LocalId); part.SitTargetAvatar = UUID; - offset = new Vector3(avSitOffSet.X, avSitOffSet.Y, avSitOffSet.Z); - sitOrientation = avSitOrientation; + offset = part.SitTargetPosition; + sitOrientation = part.SitTargetOrientation; canSit = true; } } From 69a6f6e3cd5cf1146a2d11d1393df0851c051e67 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Tue, 10 Jul 2012 23:26:40 +0100 Subject: [PATCH 518/547] refactor: use sit orientation argument passed in to SP.SendSitResponse() rather than creating a new copy There are no issues with side-effects since this is a struct. --- OpenSim/Region/Framework/Scenes/ScenePresence.cs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index c644ea5914..a8c98edbdc 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs @@ -1857,10 +1857,8 @@ namespace OpenSim.Region.Framework.Scenes return targetPart; } - private void SendSitResponse(UUID targetID, Vector3 offset, Quaternion pSitOrientation) + private void SendSitResponse(UUID targetID, Vector3 offset, Quaternion sitOrientation) { - Vector3 pos = new Vector3(); - Quaternion sitOrientation = pSitOrientation; Vector3 cameraEyeOffset = Vector3.Zero; Vector3 cameraAtOffset = Vector3.Zero; bool forceMouselook = false; @@ -1876,7 +1874,7 @@ namespace OpenSim.Region.Framework.Scenes m_sitAvatarHeight = PhysicsActor.Size.Z; bool canSit = false; - pos = part.AbsolutePosition + offset; + Vector3 pos = part.AbsolutePosition + offset; if (part.IsSitTargetSet) { From c8f0d476d2f775ba4d7afca12eeff527b46bb8e2 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Tue, 10 Jul 2012 23:34:40 +0100 Subject: [PATCH 519/547] refactor: Add SOP.IsSitTargetOccupied to improve readability --- OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 7 ++++++- OpenSim/Region/Framework/Scenes/ScenePresence.cs | 4 ++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index dcec7e9681..937f43e1e8 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs @@ -135,6 +135,11 @@ namespace OpenSim.Region.Framework.Scenes get { return ParentGroup.RootPart == this; } } + /// + /// Is the sit target of this part occupied? + /// + public bool IsSitTargetOccupied { get { return SitTargetAvatar != UUID.Zero; } } + /// /// Is an explicit sit target set for this part? /// @@ -736,7 +741,7 @@ namespace OpenSim.Region.Framework.Scenes } // TODO if we decide to do sitting in a more SL compatible way (multiple avatars per prim), this has to be fixed, too - if (SitTargetAvatar != UUID.Zero) + if (IsSitTargetOccupied) { ScenePresence avatar; if (ParentGroup.Scene.TryGetScenePresence(SitTargetAvatar, out avatar)) diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index a8c98edbdc..c824e56796 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs @@ -1846,7 +1846,7 @@ namespace OpenSim.Region.Framework.Scenes //look for prims with explicit sit targets that are available foreach (SceneObjectPart part in partArray) { - if (part.IsSitTargetSet && part.SitTargetAvatar == UUID.Zero) + if (part.IsSitTargetSet && !part.IsSitTargetOccupied) { //switch the target to this prim return part; @@ -1878,7 +1878,7 @@ namespace OpenSim.Region.Framework.Scenes if (part.IsSitTargetSet) { - if (part.SitTargetAvatar == UUID.Zero) + if (!part.IsSitTargetOccupied) { // m_log.DebugFormat( // "[SCENE PRESENCE]: Sitting {0} on {1} {2} because sit target is set and unoccupied", From 11e0ad6dc8663756154652465750c1ebaaf3124f Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Tue, 10 Jul 2012 23:39:05 +0100 Subject: [PATCH 520/547] Revert "refactor: Add SOP.IsSitTargetOccupied to improve readability" This reverts commit c8f0d476d2f775ba4d7afca12eeff527b46bb8e2. On reconsideration, I think this is less readable since immediately following code still sets SitTargetAvatar directly --- OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 7 +------ OpenSim/Region/Framework/Scenes/ScenePresence.cs | 4 ++-- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index 937f43e1e8..dcec7e9681 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs @@ -135,11 +135,6 @@ namespace OpenSim.Region.Framework.Scenes get { return ParentGroup.RootPart == this; } } - /// - /// Is the sit target of this part occupied? - /// - public bool IsSitTargetOccupied { get { return SitTargetAvatar != UUID.Zero; } } - /// /// Is an explicit sit target set for this part? /// @@ -741,7 +736,7 @@ namespace OpenSim.Region.Framework.Scenes } // TODO if we decide to do sitting in a more SL compatible way (multiple avatars per prim), this has to be fixed, too - if (IsSitTargetOccupied) + if (SitTargetAvatar != UUID.Zero) { ScenePresence avatar; if (ParentGroup.Scene.TryGetScenePresence(SitTargetAvatar, out avatar)) diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index c824e56796..a8c98edbdc 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs @@ -1846,7 +1846,7 @@ namespace OpenSim.Region.Framework.Scenes //look for prims with explicit sit targets that are available foreach (SceneObjectPart part in partArray) { - if (part.IsSitTargetSet && !part.IsSitTargetOccupied) + if (part.IsSitTargetSet && part.SitTargetAvatar == UUID.Zero) { //switch the target to this prim return part; @@ -1878,7 +1878,7 @@ namespace OpenSim.Region.Framework.Scenes if (part.IsSitTargetSet) { - if (!part.IsSitTargetOccupied) + if (part.SitTargetAvatar == UUID.Zero) { // m_log.DebugFormat( // "[SCENE PRESENCE]: Sitting {0} on {1} {2} because sit target is set and unoccupied", From cdea572d2ea0256423a4cd72f132346d88a93e92 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Tue, 10 Jul 2012 23:50:04 +0100 Subject: [PATCH 521/547] refactor: move management of SOP.SitTargetAvatar into SOP.AddSittingAvatar() and SOP.RemoveSittingAvatar() --- OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 6 ++++++ OpenSim/Region/Framework/Scenes/ScenePresence.cs | 5 ----- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index dcec7e9681..b3f11a756e 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs @@ -4525,6 +4525,9 @@ namespace OpenSim.Region.Framework.Scenes /// protected internal bool AddSittingAvatar(UUID avatarId) { + if (IsSitTargetSet && SitTargetAvatar == UUID.Zero) + SitTargetAvatar = avatarId; + HashSet sittingAvatars = m_sittingAvatars; if (sittingAvatars == null) @@ -4547,6 +4550,9 @@ namespace OpenSim.Region.Framework.Scenes /// protected internal bool RemoveSittingAvatar(UUID avatarId) { + if (SitTargetAvatar == avatarId) + SitTargetAvatar = UUID.Zero; + HashSet sittingAvatars = m_sittingAvatars; // This can occur under a race condition where another thread diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index a8c98edbdc..514c314ec3 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs @@ -1799,10 +1799,6 @@ namespace OpenSim.Region.Framework.Scenes } } - // Reset sit target. - if (part.SitTargetAvatar == UUID) - part.SitTargetAvatar = UUID.Zero; - ParentPosition = part.GetWorldPosition(); ControllingClient.SendClearFollowCamProperties(part.ParentUUID); @@ -1884,7 +1880,6 @@ namespace OpenSim.Region.Framework.Scenes // "[SCENE PRESENCE]: Sitting {0} on {1} {2} because sit target is set and unoccupied", // Name, part.Name, part.LocalId); - part.SitTargetAvatar = UUID; offset = part.SitTargetPosition; sitOrientation = part.SitTargetOrientation; canSit = true; From 337ea019bd0fa617df00d7bee10b869e73a50075 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Tue, 10 Jul 2012 23:55:22 +0100 Subject: [PATCH 522/547] If a part has a sit target and an avatar is already sitting, allow another avatar to sit in the position given if no sit target was set. Previous behave was that the second avatar could not sit. This matches behaviour observed on the LL grid. --- OpenSim/Region/Framework/Scenes/ScenePresence.cs | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index 514c314ec3..0e7f2e5dd6 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs @@ -1872,18 +1872,15 @@ namespace OpenSim.Region.Framework.Scenes bool canSit = false; Vector3 pos = part.AbsolutePosition + offset; - if (part.IsSitTargetSet) + if (part.IsSitTargetSet && part.SitTargetAvatar == UUID.Zero) { - if (part.SitTargetAvatar == UUID.Zero) - { // m_log.DebugFormat( // "[SCENE PRESENCE]: Sitting {0} on {1} {2} because sit target is set and unoccupied", // Name, part.Name, part.LocalId); - offset = part.SitTargetPosition; - sitOrientation = part.SitTargetOrientation; - canSit = true; - } + offset = part.SitTargetPosition; + sitOrientation = part.SitTargetOrientation; + canSit = true; } else { From 14d05dc2a907fcb304e622ab85150049b43f4fd5 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Wed, 11 Jul 2012 19:54:40 +0100 Subject: [PATCH 523/547] Add regression TestRezScriptedAttachmentsFromInventory() though this currently only checks for the presence of script items, not for started scripts --- .../Tests/AttachmentsModuleTests.cs | 27 ++++++- .../Common/Helpers/TaskInventoryHelpers.cs | 3 +- .../Common/Helpers/UserInventoryHelpers.cs | 78 ++++++++++++++----- 3 files changed, 85 insertions(+), 23 deletions(-) diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs index 3e06900648..416aa6f980 100644 --- a/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs +++ b/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs @@ -185,7 +185,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests } [Test] - public void TestAddAttachmentFromInventory() + public void TestRezAttachmentFromInventory() { TestHelpers.InMethod(); // log4net.Config.XmlConfigurator.Configure(); @@ -217,6 +217,31 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests Assert.That(scene.GetSceneObjectGroups().Count, Is.EqualTo(1)); } + /// + /// Test specific conditions associated with rezzing a scripted attachment from inventory. + /// + [Test] + public void TestRezScriptedAttachmentFromInventory() + { + TestHelpers.InMethod(); + + Scene scene = CreateDefaultTestScene(); + UserAccount ua1 = UserAccountHelpers.CreateUserWithInventory(scene, 0x1); + ScenePresence sp = SceneHelpers.AddScenePresence(scene, ua1.PrincipalID); + + SceneObjectGroup so = SceneHelpers.CreateSceneObject(1, sp.UUID, "att-name", 0x10); + TaskInventoryHelpers.AddScript(scene, so.RootPart); + InventoryItemBase userItem = UserInventoryHelpers.AddInventoryItem(scene, so, 0x100, 0x1000); + + scene.AttachmentsModule.RezSingleAttachmentFromInventory(sp, userItem.ID, (uint)AttachmentPoint.Chest); + + // TODO: Need to have a test that checks the script is actually started but this involves a lot more + // plumbing of the script engine and either pausing for events or more infrastructure to turn off various + // script engine delays/asychronicity that isn't helpful in an automated regression testing context. + SceneObjectGroup attSo = scene.GetSceneObjectGroup(so.Name); + Assert.That(attSo.ContainsScripts(), Is.True); + } + [Test] public void TestDetachAttachmentToGround() { diff --git a/OpenSim/Tests/Common/Helpers/TaskInventoryHelpers.cs b/OpenSim/Tests/Common/Helpers/TaskInventoryHelpers.cs index 9607f1fc69..c4e29e2358 100644 --- a/OpenSim/Tests/Common/Helpers/TaskInventoryHelpers.cs +++ b/OpenSim/Tests/Common/Helpers/TaskInventoryHelpers.cs @@ -69,7 +69,7 @@ namespace OpenSim.Tests.Common } /// - /// Add a blank script to the given part. + /// Add a simple script to the given part. /// /// /// TODO: Accept input for item and asset IDs to avoid mysterious script failures that try to use any of these @@ -81,6 +81,7 @@ namespace OpenSim.Tests.Common public static TaskInventoryItem AddScript(Scene scene, SceneObjectPart part) { AssetScriptText ast = new AssetScriptText(); + ast.Source = "default { state_entry() {} }"; ast.Encode(); UUID assetUuid = new UUID("00000000-0000-0000-1000-000000000000"); diff --git a/OpenSim/Tests/Common/Helpers/UserInventoryHelpers.cs b/OpenSim/Tests/Common/Helpers/UserInventoryHelpers.cs index fdc60d8f39..b3a7c9eec3 100644 --- a/OpenSim/Tests/Common/Helpers/UserInventoryHelpers.cs +++ b/OpenSim/Tests/Common/Helpers/UserInventoryHelpers.cs @@ -42,6 +42,57 @@ namespace OpenSim.Tests.Common { public static readonly string PATH_DELIMITER = "/"; + /// + /// Add an existing scene object as an item in the user's inventory. + /// + /// + /// + /// + /// + /// The inventory item created. + public static InventoryItemBase AddInventoryItem( + Scene scene, SceneObjectGroup so, int inventoryIdTail, int assetIdTail) + { + return AddInventoryItem( + scene, + so.Name, + TestHelpers.ParseTail(inventoryIdTail), + InventoryType.Object, + AssetHelpers.CreateAsset(TestHelpers.ParseTail(assetIdTail), so), + so.OwnerID); + } + + /// + /// Creates a notecard in the objects folder and specify an item id. + /// + /// + /// + /// + /// + /// The serialized asset for this item + /// + /// + private static InventoryItemBase AddInventoryItem( + Scene scene, string itemName, UUID itemId, InventoryType itemType, AssetBase asset, UUID userId) + { + scene.AssetService.Store(asset); + + InventoryItemBase item = new InventoryItemBase(); + item.Name = itemName; + item.AssetID = asset.FullID; + item.ID = itemId; + item.Owner = userId; + item.AssetType = asset.Type; + item.InvType = (int)itemType; + + InventoryFolderBase folder = scene.InventoryService.GetFolderForType(userId, (AssetType)asset.Type); + + item.Folder = folder.ID; + scene.AddInventoryItem(item); + + return item; + } + /// /// Creates a notecard in the objects folder and specify an item id. /// @@ -81,42 +132,27 @@ namespace OpenSim.Tests.Common /// Type of item to create /// public static InventoryItemBase CreateInventoryItem( - Scene scene, string itemName, UUID itemId, UUID assetId, UUID userId, InventoryType type) + Scene scene, string itemName, UUID itemId, UUID assetId, UUID userId, InventoryType itemType) { AssetBase asset = null; - if (type == InventoryType.Notecard) + if (itemType == InventoryType.Notecard) { asset = AssetHelpers.CreateNotecardAsset(); asset.CreatorID = userId.ToString(); } - else if (type == InventoryType.Object) + else if (itemType == InventoryType.Object) { asset = AssetHelpers.CreateAsset(assetId, SceneHelpers.CreateSceneObject(1, userId)); } else { - throw new Exception(string.Format("Inventory type {0} not supported", type)); + throw new Exception(string.Format("Inventory type {0} not supported", itemType)); } - scene.AssetService.Store(asset); - - InventoryItemBase item = new InventoryItemBase(); - item.Name = itemName; - item.AssetID = asset.FullID; - item.ID = itemId; - item.Owner = userId; - item.AssetType = asset.Type; - item.InvType = (int)type; - - InventoryFolderBase folder = scene.InventoryService.GetFolderForType(userId, AssetType.Notecard); - - item.Folder = folder.ID; - scene.AddInventoryItem(item); - - return item; + return AddInventoryItem(scene, itemName, itemId, itemType, asset, userId); } - + /// /// Create inventory folders starting from the user's root folder. /// From fc2456320646df66b95a06d4cd292c3b2385a8ea Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Wed, 11 Jul 2012 21:43:35 +0100 Subject: [PATCH 524/547] Add regression TestDetachScriptedAttachmentToInventory() This currently only does a relatively crude check for a ScriptState node in the serialized xml --- .../Avatar/Attachments/AttachmentsModule.cs | 16 ++- .../Tests/AttachmentsModuleTests.cs | 131 ++++++++++++++++-- .../Interfaces/IAttachmentsModule.cs | 2 +- .../Scenes/SceneObjectPartInventory.cs | 4 + .../Api/Implementation/AsyncCommandManager.cs | 15 +- .../Api/Implementation/Plugins/Listener.cs | 8 +- .../Region/ScriptEngine/XEngine/XEngine.cs | 4 +- .../Common/Helpers/TaskInventoryHelpers.cs | 2 +- prebuild.xml | 1 + 9 files changed, 151 insertions(+), 32 deletions(-) diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs index efab6ed5ff..64ee7e44b8 100644 --- a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs @@ -339,7 +339,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments ShowAttachInUserInventory(sp, attachmentPt, newAttachmentItemID, group); } - public ISceneEntity RezSingleAttachmentFromInventory(IScenePresence sp, UUID itemID, uint AttachmentPt) + public SceneObjectGroup RezSingleAttachmentFromInventory(IScenePresence sp, UUID itemID, uint AttachmentPt) { if (!Enabled) return null; @@ -527,6 +527,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments /// /// /// + /// private void UpdateKnownItem(IScenePresence sp, SceneObjectGroup grp, bool saveAllScripted) { // Saving attachments for NPCs messes them up for the real owner! @@ -720,18 +721,23 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments null, assetID, Vector3.Zero, Vector3.Zero, UUID.Zero, (byte)1, true, false, false, sp.UUID, true); - // m_log.DebugFormat( - // "[ATTACHMENTS MODULE]: Retrieved single object {0} for attachment to {1} on point {2}", - // objatt.Name, remoteClient.Name, AttachmentPt); - if (objatt != null) { +// m_log.DebugFormat( +// "[ATTACHMENTS MODULE]: Rezzed single object {0} for attachment to {1} on point {2} in {3}", +// objatt.Name, sp.Name, attachmentPt, m_scene.Name); + // HasGroupChanged is being set from within RezObject. Ideally it would be set by the caller. objatt.HasGroupChanged = false; bool tainted = false; if (attachmentPt != 0 && attachmentPt != objatt.AttachmentPoint) tainted = true; + // FIXME: Detect whether it's really likely for AttachObject to throw an exception in the normal + // course of events. If not, then it's probably not worth trying to recover the situation + // since this is more likely to trigger further exceptions and confuse later debugging. If + // exceptions can be thrown in expected error conditions (not NREs) then make this consistent + // since other normal error conditions will simply return false instead. // This will throw if the attachment fails try { diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs index 416aa6f980..81e889d0e1 100644 --- a/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs +++ b/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs @@ -31,6 +31,7 @@ using System.Reflection; using System.Text; using System.Threading; using System.Timers; +using System.Xml; using Timer=System.Timers.Timer; using Nini.Config; using NUnit.Framework; @@ -41,10 +42,12 @@ using OpenSim.Region.CoreModules.Avatar.Attachments; using OpenSim.Region.CoreModules.Framework; using OpenSim.Region.CoreModules.Framework.EntityTransfer; using OpenSim.Region.CoreModules.Framework.InventoryAccess; -using OpenSim.Region.CoreModules.World.Serialiser; +using OpenSim.Region.CoreModules.Scripting.WorldComm; using OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation; +using OpenSim.Region.CoreModules.World.Serialiser; using OpenSim.Region.Framework.Scenes; using OpenSim.Region.Framework.Interfaces; +using OpenSim.Region.ScriptEngine.XEngine; using OpenSim.Services.Interfaces; using OpenSim.Tests.Common; using OpenSim.Tests.Common.Mock; @@ -57,6 +60,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests [TestFixture] public class AttachmentsModuleTests : OpenSimTestCase { + private AutoResetEvent m_chatEvent = new AutoResetEvent(false); + private OSChatMessage m_osChatMessageReceived; + [TestFixtureSetUp] public void FixtureInit() { @@ -72,16 +78,73 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests Util.FireAndForgetMethod = Util.DefaultFireAndForgetMethod; } - private Scene CreateDefaultTestScene() + private void OnChatFromWorld(object sender, OSChatMessage oscm) + { +// Console.WriteLine("Got chat [{0}]", oscm.Message); + + m_osChatMessageReceived = oscm; + m_chatEvent.Set(); + } + + private Scene CreateTestScene() { IConfigSource config = new IniConfigSource(); + List modules = new List(); + + AddCommonConfig(config, modules); + + Scene scene + = new SceneHelpers().SetupScene( + "attachments-test-scene", TestHelpers.ParseTail(999), 1000, 1000, config); + SceneHelpers.SetupSceneModules(scene, config, modules.ToArray()); + + return scene; + } + + private Scene CreateScriptingEnabledTestScene() + { + IConfigSource config = new IniConfigSource(); + List modules = new List(); + + AddCommonConfig(config, modules); + AddScriptingConfig(config, modules); + + Scene scene + = new SceneHelpers().SetupScene( + "attachments-test-scene", TestHelpers.ParseTail(999), 1000, 1000, config); + SceneHelpers.SetupSceneModules(scene, config, modules.ToArray()); + + scene.StartScripts(); + + return scene; + } + + private void AddCommonConfig(IConfigSource config, List modules) + { config.AddConfig("Modules"); config.Configs["Modules"].Set("InventoryAccessModule", "BasicInventoryAccessModule"); - Scene scene = new SceneHelpers().SetupScene(); - SceneHelpers.SetupSceneModules(scene, config, new AttachmentsModule(), new BasicInventoryAccessModule()); + modules.Add(new AttachmentsModule()); + modules.Add(new BasicInventoryAccessModule()); + } - return scene; + private void AddScriptingConfig(IConfigSource config, List modules) + { + IConfig startupConfig = config.AddConfig("Startup"); + startupConfig.Set("DefaultScriptEngine", "XEngine"); + + IConfig xEngineConfig = config.AddConfig("XEngine"); + xEngineConfig.Set("Enabled", "true"); + + // These tests will not run with AppDomainLoading = true, at least on mono. For unknown reasons, the call + // to AssemblyResolver.OnAssemblyResolve fails. + xEngineConfig.Set("AppDomainLoading", "false"); + + modules.Add(new XEngine()); + + // Necessary to stop serialization complaining + // FIXME: Stop this being necessary if at all possible +// modules.Add(new WorldCommModule()); } /// @@ -116,7 +179,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests TestHelpers.InMethod(); // TestHelpers.EnableLogging(); - Scene scene = CreateDefaultTestScene(); + Scene scene = CreateTestScene(); UserAccount ua1 = UserAccountHelpers.CreateUserWithInventory(scene, 0x1); ScenePresence sp = SceneHelpers.AddScenePresence(scene, ua1); @@ -163,7 +226,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests TestHelpers.InMethod(); // TestHelpers.EnableLogging(); - Scene scene = CreateDefaultTestScene(); + Scene scene = CreateTestScene(); UserAccount ua1 = UserAccountHelpers.CreateUserWithInventory(scene, 0x1); ScenePresence sp = SceneHelpers.AddScenePresence(scene, ua1); @@ -190,7 +253,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests TestHelpers.InMethod(); // log4net.Config.XmlConfigurator.Configure(); - Scene scene = CreateDefaultTestScene(); + Scene scene = CreateTestScene(); UserAccount ua1 = UserAccountHelpers.CreateUserWithInventory(scene, 0x1); ScenePresence sp = SceneHelpers.AddScenePresence(scene, ua1.PrincipalID); @@ -225,7 +288,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests { TestHelpers.InMethod(); - Scene scene = CreateDefaultTestScene(); + Scene scene = CreateTestScene(); UserAccount ua1 = UserAccountHelpers.CreateUserWithInventory(scene, 0x1); ScenePresence sp = SceneHelpers.AddScenePresence(scene, ua1.PrincipalID); @@ -248,7 +311,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests TestHelpers.InMethod(); // log4net.Config.XmlConfigurator.Configure(); - Scene scene = CreateDefaultTestScene(); + Scene scene = CreateTestScene(); UserAccount ua1 = UserAccountHelpers.CreateUserWithInventory(scene, 0x1); ScenePresence sp = SceneHelpers.AddScenePresence(scene, ua1.PrincipalID); @@ -278,9 +341,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests public void TestDetachAttachmentToInventory() { TestHelpers.InMethod(); -// log4net.Config.XmlConfigurator.Configure(); - Scene scene = CreateDefaultTestScene(); + Scene scene = CreateTestScene(); UserAccount ua1 = UserAccountHelpers.CreateUserWithInventory(scene, 0x1); ScenePresence sp = SceneHelpers.AddScenePresence(scene, ua1.PrincipalID); @@ -302,6 +364,45 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests Assert.That(scene.GetSceneObjectGroups().Count, Is.EqualTo(0)); } + /// + /// Test specific conditions associated with detaching a scripted attachment from inventory. + /// + [Test] + public void TestDetachScriptedAttachmentToInventory() + { + TestHelpers.InMethod(); + TestHelpers.EnableLogging(); + + Scene scene = CreateScriptingEnabledTestScene(); + UserAccount ua1 = UserAccountHelpers.CreateUserWithInventory(scene, 0x1); + ScenePresence sp = SceneHelpers.AddScenePresence(scene, ua1); + + SceneObjectGroup so = SceneHelpers.CreateSceneObject(1, sp.UUID, "att-name", 0x10); + TaskInventoryHelpers.AddScript(scene, so.RootPart); + InventoryItemBase userItem = UserInventoryHelpers.AddInventoryItem(scene, so, 0x100, 0x1000); + + // FIXME: Right now, we have to do a tricksy chat listen to make sure we know when the script is running. + // In the future, we need to be able to do this programatically more predicably. + scene.EventManager.OnChatFromWorld += OnChatFromWorld; + + SceneObjectGroup soRezzed + = scene.AttachmentsModule.RezSingleAttachmentFromInventory(sp, userItem.ID, (uint)AttachmentPoint.Chest); + + // Wait for chat to signal rezzed script has been started. + m_chatEvent.WaitOne(60000); + + scene.AttachmentsModule.DetachSingleAttachmentToInv(sp, soRezzed); + + InventoryItemBase userItemUpdated = scene.InventoryService.GetItem(userItem); + AssetBase asset = scene.AssetService.Get(userItemUpdated.AssetID.ToString()); + + XmlDocument soXml = new XmlDocument(); + soXml.LoadXml(Encoding.UTF8.GetString(asset.Data)); + + XmlNodeList scriptStateNodes = soXml.GetElementsByTagName("ScriptState"); + Assert.That(scriptStateNodes.Count, Is.EqualTo(1)); + } + /// /// Test that attachments don't hang about in the scene when the agent is closed /// @@ -311,7 +412,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests TestHelpers.InMethod(); // log4net.Config.XmlConfigurator.Configure(); - Scene scene = CreateDefaultTestScene(); + Scene scene = CreateTestScene(); UserAccount ua1 = UserAccountHelpers.CreateUserWithInventory(scene, 0x1); InventoryItemBase attItem = CreateAttachmentItem(scene, ua1.PrincipalID, "att", 0x10, 0x20); @@ -334,7 +435,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests TestHelpers.InMethod(); // log4net.Config.XmlConfigurator.Configure(); - Scene scene = CreateDefaultTestScene(); + Scene scene = CreateTestScene(); UserAccount ua1 = UserAccountHelpers.CreateUserWithInventory(scene, 0x1); InventoryItemBase attItem = CreateAttachmentItem(scene, ua1.PrincipalID, "att", 0x10, 0x20); @@ -370,7 +471,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests { TestHelpers.InMethod(); - Scene scene = CreateDefaultTestScene(); + Scene scene = CreateTestScene(); UserAccount ua1 = UserAccountHelpers.CreateUserWithInventory(scene, 0x1); InventoryItemBase attItem = CreateAttachmentItem(scene, ua1.PrincipalID, "att", 0x10, 0x20); diff --git a/OpenSim/Region/Framework/Interfaces/IAttachmentsModule.cs b/OpenSim/Region/Framework/Interfaces/IAttachmentsModule.cs index ba35a41046..351e60341d 100644 --- a/OpenSim/Region/Framework/Interfaces/IAttachmentsModule.cs +++ b/OpenSim/Region/Framework/Interfaces/IAttachmentsModule.cs @@ -92,7 +92,7 @@ namespace OpenSim.Region.Framework.Interfaces /// /// /// The scene object that was attached. Null if the scene object could not be found - ISceneEntity RezSingleAttachmentFromInventory(IScenePresence sp, UUID itemID, uint AttachmentPt); + SceneObjectGroup RezSingleAttachmentFromInventory(IScenePresence sp, UUID itemID, uint AttachmentPt); /// /// Rez multiple attachments from a user's inventory diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs index cf2ed1a802..821fd81d1f 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs @@ -1295,6 +1295,10 @@ namespace OpenSim.Region.Framework.Scenes { if (e != null) { +// m_log.DebugFormat( +// "[PRIM INVENTORY]: Getting script state from engine {0} for {1} in part {2} in group {3} in {4}", +// e.Name, item.Name, m_part.Name, m_part.ParentGroup.Name, m_part.ParentGroup.Scene.Name); + string n = e.GetXMLState(item.ItemID); if (n != String.Empty) { diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/AsyncCommandManager.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/AsyncCommandManager.cs index 993d10f909..5b22860f72 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/AsyncCommandManager.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/AsyncCommandManager.cs @@ -233,17 +233,20 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api m_Timer[engine].UnSetTimerEvents(localID, itemID); // Remove from: HttpRequest - IHttpRequestModule iHttpReq = - engine.World.RequestModuleInterface(); - iHttpReq.StopHttpRequest(localID, itemID); + IHttpRequestModule iHttpReq = engine.World.RequestModuleInterface(); + if (iHttpReq != null) + iHttpReq.StopHttpRequest(localID, itemID); IWorldComm comms = engine.World.RequestModuleInterface(); if (comms != null) comms.DeleteListener(itemID); IXMLRPC xmlrpc = engine.World.RequestModuleInterface(); - xmlrpc.DeleteChannels(itemID); - xmlrpc.CancelSRDRequests(itemID); + if (xmlrpc != null) + { + xmlrpc.DeleteChannels(itemID); + xmlrpc.CancelSRDRequests(itemID); + } // Remove Sensors m_SensorRepeat[engine].UnSetSenseRepeaterEvents(localID, itemID); @@ -305,7 +308,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api { List data = new List(); - Object[] listeners=m_Listener[engine].GetSerializationData(itemID); + Object[] listeners = m_Listener[engine].GetSerializationData(itemID); if (listeners.Length > 0) { data.Add("listener"); diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/Listener.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/Listener.cs index 93e0261da6..efa86fc0e0 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/Listener.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/Listener.cs @@ -88,13 +88,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins public Object[] GetSerializationData(UUID itemID) { - return m_commsPlugin.GetSerializationData(itemID); + if (m_commsPlugin != null) + return m_commsPlugin.GetSerializationData(itemID); + else + return new Object[]{}; } public void CreateFromData(uint localID, UUID itemID, UUID hostID, Object[] data) { - m_commsPlugin.CreateFromData(localID, itemID, hostID, data); + if (m_commsPlugin != null) + m_commsPlugin.CreateFromData(localID, itemID, hostID, data); } } } \ No newline at end of file diff --git a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs index efcae94c8d..e07ae1c13d 100644 --- a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs +++ b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs @@ -1676,12 +1676,12 @@ namespace OpenSim.Region.ScriptEngine.XEngine public string GetXMLState(UUID itemID) { -// m_log.DebugFormat("[XEngine]: Getting XML state for {0}", itemID); +// m_log.DebugFormat("[XEngine]: Getting XML state for script instance {0}", itemID); IScriptInstance instance = GetInstance(itemID); if (instance == null) { -// m_log.DebugFormat("[XEngine]: Found no script for {0}, returning empty string", itemID); +// m_log.DebugFormat("[XEngine]: Found no script instance for {0}, returning empty string", itemID); return ""; } diff --git a/OpenSim/Tests/Common/Helpers/TaskInventoryHelpers.cs b/OpenSim/Tests/Common/Helpers/TaskInventoryHelpers.cs index c4e29e2358..fba03abcf0 100644 --- a/OpenSim/Tests/Common/Helpers/TaskInventoryHelpers.cs +++ b/OpenSim/Tests/Common/Helpers/TaskInventoryHelpers.cs @@ -81,7 +81,7 @@ namespace OpenSim.Tests.Common public static TaskInventoryItem AddScript(Scene scene, SceneObjectPart part) { AssetScriptText ast = new AssetScriptText(); - ast.Source = "default { state_entry() {} }"; + ast.Source = "default { state_entry() { llSay(0, \"Hello World\"); } }"; ast.Encode(); UUID assetUuid = new UUID("00000000-0000-0000-1000-000000000000"); diff --git a/prebuild.xml b/prebuild.xml index 3419119ef6..ba8cdfbf4a 100644 --- a/prebuild.xml +++ b/prebuild.xml @@ -2929,6 +2929,7 @@ + From 0e611c47d322e1596d4636e283b9b855c7e58b60 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Wed, 11 Jul 2012 21:46:46 +0100 Subject: [PATCH 525/547] Remove WorldComm module from the regression TestCompileAndStartScript() since the infrastructure no longer fails if this module isn't present, at least on the tested codepaths --- OpenSim/Region/ScriptEngine/XEngine/Tests/XEngineTest.cs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/OpenSim/Region/ScriptEngine/XEngine/Tests/XEngineTest.cs b/OpenSim/Region/ScriptEngine/XEngine/Tests/XEngineTest.cs index a3f848cfd4..fe4b0fab05 100644 --- a/OpenSim/Region/ScriptEngine/XEngine/Tests/XEngineTest.cs +++ b/OpenSim/Region/ScriptEngine/XEngine/Tests/XEngineTest.cs @@ -58,9 +58,6 @@ namespace OpenSim.Region.ScriptEngine.XEngine.Tests // Console.WriteLine(AppDomain.CurrentDomain.BaseDirectory); m_xEngine = new XEngine(); - // Necessary to stop serialization complaining - WorldCommModule wcModule = new WorldCommModule(); - IniConfigSource configSource = new IniConfigSource(); IConfig startupConfig = configSource.AddConfig("Startup"); @@ -74,7 +71,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine.Tests xEngineConfig.Set("AppDomainLoading", "false"); m_scene = new SceneHelpers().SetupScene("My Test", UUID.Random(), 1000, 1000, configSource); - SceneHelpers.SetupSceneModules(m_scene, configSource, m_xEngine, wcModule); + SceneHelpers.SetupSceneModules(m_scene, configSource, m_xEngine); m_scene.StartScripts(); } From 33cff9b9d7c9d742b1cb7064ed78677e3f030e72 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Wed, 11 Jul 2012 21:55:18 +0100 Subject: [PATCH 526/547] Allow XEngine StartDelay to be configured in the [XEngine] config section. This is only currently meant for use by regression tests that don't have any issues if XEngine is started up quickly, since no other operations will be occuring simultaneously. Therefore, this is not yet documented externally. --- .../Attachments/Tests/AttachmentsModuleTests.cs | 3 ++- .../Region/ScriptEngine/XEngine/Tests/XEngineTest.cs | 1 + OpenSim/Region/ScriptEngine/XEngine/XEngine.cs | 11 +++++++++-- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs index 81e889d0e1..b021a478c8 100644 --- a/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs +++ b/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs @@ -135,6 +135,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests IConfig xEngineConfig = config.AddConfig("XEngine"); xEngineConfig.Set("Enabled", "true"); + xEngineConfig.Set("StartDelay", "0"); // These tests will not run with AppDomainLoading = true, at least on mono. For unknown reasons, the call // to AssemblyResolver.OnAssemblyResolve fails. @@ -371,7 +372,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests public void TestDetachScriptedAttachmentToInventory() { TestHelpers.InMethod(); - TestHelpers.EnableLogging(); +// TestHelpers.EnableLogging(); Scene scene = CreateScriptingEnabledTestScene(); UserAccount ua1 = UserAccountHelpers.CreateUserWithInventory(scene, 0x1); diff --git a/OpenSim/Region/ScriptEngine/XEngine/Tests/XEngineTest.cs b/OpenSim/Region/ScriptEngine/XEngine/Tests/XEngineTest.cs index fe4b0fab05..f247a0be42 100644 --- a/OpenSim/Region/ScriptEngine/XEngine/Tests/XEngineTest.cs +++ b/OpenSim/Region/ScriptEngine/XEngine/Tests/XEngineTest.cs @@ -65,6 +65,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine.Tests IConfig xEngineConfig = configSource.AddConfig("XEngine"); xEngineConfig.Set("Enabled", "true"); + xEngineConfig.Set("StartDelay", "0"); // These tests will not run with AppDomainLoading = true, at least on mono. For unknown reasons, the call // to AssemblyResolver.OnAssemblyResolve fails. diff --git a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs index e07ae1c13d..f768cf2d03 100644 --- a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs +++ b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs @@ -77,7 +77,13 @@ namespace OpenSim.Region.ScriptEngine.XEngine private IConfigSource m_ConfigSource = null; private ICompiler m_Compiler; private int m_MinThreads; - private int m_MaxThreads ; + private int m_MaxThreads; + + /// + /// Amount of time to delay before starting. + /// + private int m_StartDelay; + private int m_IdleTimeout; private int m_StackSize; private int m_SleepTime; @@ -231,6 +237,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine m_MaxThreads = m_ScriptConfig.GetInt("MaxThreads", 100); m_IdleTimeout = m_ScriptConfig.GetInt("IdleTimeout", 60); string priority = m_ScriptConfig.GetString("Priority", "BelowNormal"); + m_StartDelay = m_ScriptConfig.GetInt("StartDelay", 15000); m_MaxScriptQueue = m_ScriptConfig.GetInt("MaxScriptEventQueue",300); m_StackSize = m_ScriptConfig.GetInt("ThreadStackSize", 262144); m_SleepTime = m_ScriptConfig.GetInt("MaintenanceInterval", 10) * 1000; @@ -886,7 +893,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine { // This delay exists to stop mono problems where script compilation and startup would stop the sim // working properly for the session. - System.Threading.Thread.Sleep(15000); + System.Threading.Thread.Sleep(m_StartDelay); } object[] o; From 9c89ad9154952ca895e7a305ba259c02b98e46c4 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Wed, 11 Jul 2012 22:15:53 +0100 Subject: [PATCH 527/547] Fix build break for windows with missing package for IScriptEngine in prebuild.xml for OpenSim.Region.CoreModules.Tests.dll --- prebuild.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/prebuild.xml b/prebuild.xml index ba8cdfbf4a..b06aa1c1b3 100644 --- a/prebuild.xml +++ b/prebuild.xml @@ -2929,6 +2929,7 @@ + From 916e3bf886ee622e2f18d6eb74f90fee8c630471 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Wed, 11 Jul 2012 22:54:22 +0100 Subject: [PATCH 528/547] Where possible, use the system Encoding.ASCII and Encoding.UTF8 rather than constructing fresh copies. The encodings are thread-safe and already used in such a manner in other places. This isn't done where Byte Order Mark output is suppressed, since Encoding.UTF8 is constructed to output the BOM. --- OpenSim/ConsoleClient/Requester.cs | 2 +- .../External/LandDataSerializer.cs | 4 +--- .../External/RegionSettingsSerializer.cs | 4 +--- .../Serialization/TarArchiveReader.cs | 8 +++---- .../Serialization/TarArchiveWriter.cs | 23 +++++++++---------- .../Framework/Servers/BaseOpenSimServer.cs | 4 ++-- OpenSim/Framework/Util.cs | 3 +-- .../World/Archiver/AssetsDearchiver.cs | 2 -- .../World/Terrain/FileLoaders/Terragen.cs | 2 +- .../FreeSwitchVoice/FreeSwitchVoiceModule.cs | 3 +-- .../XmlRpcGroupsServicesConnectorModule.cs | 3 +-- .../JsonStore/JsonStoreScriptModule.cs | 7 +++--- .../Scripting/Minimodule/MRMModule.cs | 5 +--- .../Shared/Api/Implementation/LSL_Api.cs | 8 ++----- .../Shared/Api/Implementation/OSSL_Api.cs | 3 +-- .../ScriptEngine/Shared/CodeTools/Compiler.cs | 8 +++---- .../Shared/Instance/ScriptInstance.cs | 21 ++++++++--------- .../Region/ScriptEngine/XEngine/XEngine.cs | 2 +- OpenSim/Server/Base/ServicesServerBase.cs | 8 +++---- OpenSim/Tools/Compiler/Program.cs | 13 ++++------- 20 files changed, 52 insertions(+), 81 deletions(-) diff --git a/OpenSim/ConsoleClient/Requester.cs b/OpenSim/ConsoleClient/Requester.cs index fefe9690f1..aabb02cbb3 100644 --- a/OpenSim/ConsoleClient/Requester.cs +++ b/OpenSim/ConsoleClient/Requester.cs @@ -50,7 +50,7 @@ namespace OpenSim.ConsoleClient request.ContentType = "application/x-www-form-urlencoded"; - byte[] buffer = new System.Text.ASCIIEncoding().GetBytes(data); + byte[] buffer = Encoding.ASCII.GetBytes(data); int length = (int) buffer.Length; request.ContentLength = length; diff --git a/OpenSim/Framework/Serialization/External/LandDataSerializer.cs b/OpenSim/Framework/Serialization/External/LandDataSerializer.cs index e8d82d3820..a64f01ce71 100644 --- a/OpenSim/Framework/Serialization/External/LandDataSerializer.cs +++ b/OpenSim/Framework/Serialization/External/LandDataSerializer.cs @@ -44,8 +44,6 @@ namespace OpenSim.Framework.Serialization.External { // private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - protected static UTF8Encoding m_utf8Encoding = new UTF8Encoding(); - private static Dictionary> m_ldProcessors = new Dictionary>(); @@ -163,7 +161,7 @@ namespace OpenSim.Framework.Serialization.External /// public static LandData Deserialize(byte[] serializedLandData) { - return Deserialize(m_utf8Encoding.GetString(serializedLandData, 0, serializedLandData.Length)); + return Deserialize(Encoding.UTF8.GetString(serializedLandData, 0, serializedLandData.Length)); } /// diff --git a/OpenSim/Framework/Serialization/External/RegionSettingsSerializer.cs b/OpenSim/Framework/Serialization/External/RegionSettingsSerializer.cs index f18435d308..19468c3b2a 100644 --- a/OpenSim/Framework/Serialization/External/RegionSettingsSerializer.cs +++ b/OpenSim/Framework/Serialization/External/RegionSettingsSerializer.cs @@ -40,8 +40,6 @@ namespace OpenSim.Framework.Serialization.External /// public class RegionSettingsSerializer { - protected static ASCIIEncoding m_asciiEncoding = new ASCIIEncoding(); - /// /// Deserialize settings /// @@ -50,7 +48,7 @@ namespace OpenSim.Framework.Serialization.External /// public static RegionSettings Deserialize(byte[] serializedSettings) { - return Deserialize(m_asciiEncoding.GetString(serializedSettings, 0, serializedSettings.Length)); + return Deserialize(Encoding.ASCII.GetString(serializedSettings, 0, serializedSettings.Length)); } /// diff --git a/OpenSim/Framework/Serialization/TarArchiveReader.cs b/OpenSim/Framework/Serialization/TarArchiveReader.cs index 77c29f8cac..339a37ad11 100644 --- a/OpenSim/Framework/Serialization/TarArchiveReader.cs +++ b/OpenSim/Framework/Serialization/TarArchiveReader.cs @@ -53,8 +53,6 @@ namespace OpenSim.Framework.Serialization TYPE_CONTIGUOUS_FILE = 8, } - protected static ASCIIEncoding m_asciiEncoding = new ASCIIEncoding(); - /// /// Binary reader for the underlying stream /// @@ -120,13 +118,13 @@ namespace OpenSim.Framework.Serialization if (header[156] == (byte)'L') { int longNameLength = ConvertOctalBytesToDecimal(header, 124, 11); - tarHeader.FilePath = m_asciiEncoding.GetString(ReadData(longNameLength)); + tarHeader.FilePath = Encoding.ASCII.GetString(ReadData(longNameLength)); //m_log.DebugFormat("[TAR ARCHIVE READER]: Got long file name {0}", tarHeader.FilePath); header = m_br.ReadBytes(512); } else { - tarHeader.FilePath = m_asciiEncoding.GetString(header, 0, 100); + tarHeader.FilePath = Encoding.ASCII.GetString(header, 0, 100); tarHeader.FilePath = tarHeader.FilePath.Trim(m_nullCharArray); //m_log.DebugFormat("[TAR ARCHIVE READER]: Got short file name {0}", tarHeader.FilePath); } @@ -205,7 +203,7 @@ namespace OpenSim.Framework.Serialization { // Trim leading white space: ancient tars do that instead // of leading 0s :-( don't ask. really. - string oString = m_asciiEncoding.GetString(bytes, startIndex, count).TrimStart(m_spaceCharArray); + string oString = Encoding.ASCII.GetString(bytes, startIndex, count).TrimStart(m_spaceCharArray); int d = 0; diff --git a/OpenSim/Framework/Serialization/TarArchiveWriter.cs b/OpenSim/Framework/Serialization/TarArchiveWriter.cs index fca909f2d8..122fa8e39a 100644 --- a/OpenSim/Framework/Serialization/TarArchiveWriter.cs +++ b/OpenSim/Framework/Serialization/TarArchiveWriter.cs @@ -41,7 +41,6 @@ namespace OpenSim.Framework.Serialization { // private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - protected static ASCIIEncoding m_asciiEncoding = new ASCIIEncoding(); protected static UTF8Encoding m_utf8Encoding = new UTF8Encoding(); /// @@ -85,7 +84,7 @@ namespace OpenSim.Framework.Serialization public void WriteFile(string filePath, byte[] data) { if (filePath.Length > 100) - WriteEntry("././@LongLink", m_asciiEncoding.GetBytes(filePath), 'L'); + WriteEntry("././@LongLink", Encoding.ASCII.GetBytes(filePath), 'L'); char fileType; @@ -137,7 +136,7 @@ namespace OpenSim.Framework.Serialization oString = "0" + oString; } - byte[] oBytes = m_asciiEncoding.GetBytes(oString); + byte[] oBytes = Encoding.ASCII.GetBytes(oString); return oBytes; } @@ -156,20 +155,20 @@ namespace OpenSim.Framework.Serialization byte[] header = new byte[512]; // file path field (100) - byte[] nameBytes = m_asciiEncoding.GetBytes(filePath); + byte[] nameBytes = Encoding.ASCII.GetBytes(filePath); int nameSize = (nameBytes.Length >= 100) ? 100 : nameBytes.Length; Array.Copy(nameBytes, header, nameSize); // file mode (8) - byte[] modeBytes = m_asciiEncoding.GetBytes("0000777"); + byte[] modeBytes = Encoding.ASCII.GetBytes("0000777"); Array.Copy(modeBytes, 0, header, 100, 7); // owner user id (8) - byte[] ownerIdBytes = m_asciiEncoding.GetBytes("0000764"); + byte[] ownerIdBytes = Encoding.ASCII.GetBytes("0000764"); Array.Copy(ownerIdBytes, 0, header, 108, 7); // group user id (8) - byte[] groupIdBytes = m_asciiEncoding.GetBytes("0000764"); + byte[] groupIdBytes = Encoding.ASCII.GetBytes("0000764"); Array.Copy(groupIdBytes, 0, header, 116, 7); // file size in bytes (12) @@ -181,17 +180,17 @@ namespace OpenSim.Framework.Serialization Array.Copy(fileSizeBytes, 0, header, 124, 11); // last modification time (12) - byte[] lastModTimeBytes = m_asciiEncoding.GetBytes("11017037332"); + byte[] lastModTimeBytes = Encoding.ASCII.GetBytes("11017037332"); Array.Copy(lastModTimeBytes, 0, header, 136, 11); // entry type indicator (1) - header[156] = m_asciiEncoding.GetBytes(new char[] { fileType })[0]; + header[156] = Encoding.ASCII.GetBytes(new char[] { fileType })[0]; - Array.Copy(m_asciiEncoding.GetBytes("0000000"), 0, header, 329, 7); - Array.Copy(m_asciiEncoding.GetBytes("0000000"), 0, header, 337, 7); + Array.Copy(Encoding.ASCII.GetBytes("0000000"), 0, header, 329, 7); + Array.Copy(Encoding.ASCII.GetBytes("0000000"), 0, header, 337, 7); // check sum for header block (8) [calculated last] - Array.Copy(m_asciiEncoding.GetBytes(" "), 0, header, 148, 8); + Array.Copy(Encoding.ASCII.GetBytes(" "), 0, header, 148, 8); int checksum = 0; foreach (byte b in header) diff --git a/OpenSim/Framework/Servers/BaseOpenSimServer.cs b/OpenSim/Framework/Servers/BaseOpenSimServer.cs index 9459f76a5e..14d8b0caae 100644 --- a/OpenSim/Framework/Servers/BaseOpenSimServer.cs +++ b/OpenSim/Framework/Servers/BaseOpenSimServer.cs @@ -591,8 +591,8 @@ namespace OpenSim.Framework.Servers { string pidstring = System.Diagnostics.Process.GetCurrentProcess().Id.ToString(); FileStream fs = File.Create(path); - System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding(); - Byte[] buf = enc.GetBytes(pidstring); + + Byte[] buf = Encoding.ASCII.GetBytes(pidstring); fs.Write(buf, 0, buf.Length); fs.Close(); m_pidFile = path; diff --git a/OpenSim/Framework/Util.cs b/OpenSim/Framework/Util.cs index e03bb7491c..fd9586ca21 100644 --- a/OpenSim/Framework/Util.cs +++ b/OpenSim/Framework/Util.cs @@ -1236,8 +1236,7 @@ namespace OpenSim.Framework public static string Base64ToString(string str) { - UTF8Encoding encoder = new UTF8Encoding(); - Decoder utf8Decode = encoder.GetDecoder(); + Decoder utf8Decode = Encoding.UTF8.GetDecoder(); byte[] todecode_byte = Convert.FromBase64String(str); int charCount = utf8Decode.GetCharCount(todecode_byte, 0, todecode_byte.Length); diff --git a/OpenSim/Region/CoreModules/World/Archiver/AssetsDearchiver.cs b/OpenSim/Region/CoreModules/World/Archiver/AssetsDearchiver.cs index 2c040081e0..8c0ef880d4 100644 --- a/OpenSim/Region/CoreModules/World/Archiver/AssetsDearchiver.cs +++ b/OpenSim/Region/CoreModules/World/Archiver/AssetsDearchiver.cs @@ -46,8 +46,6 @@ namespace OpenSim.Region.CoreModules.World.Archiver { private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - protected static ASCIIEncoding m_asciiEncoding = new ASCIIEncoding(); - /// /// Store for asset data we received before we get the metadata /// diff --git a/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/Terragen.cs b/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/Terragen.cs index 7a0db2664c..b5c7d336cb 100644 --- a/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/Terragen.cs +++ b/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/Terragen.cs @@ -252,7 +252,7 @@ namespace OpenSim.Region.CoreModules.World.Terrain.FileLoaders if (horizontalScale < 0.01d) horizontalScale = 0.01d; - System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding(); + Encoding enc = Encoding.ASCII; bs.Write(enc.GetBytes("TERRAGENTERRAIN ")); diff --git a/OpenSim/Region/OptionalModules/Avatar/Voice/FreeSwitchVoice/FreeSwitchVoiceModule.cs b/OpenSim/Region/OptionalModules/Avatar/Voice/FreeSwitchVoice/FreeSwitchVoiceModule.cs index be8873dc1e..7fafdc6190 100644 --- a/OpenSim/Region/OptionalModules/Avatar/Voice/FreeSwitchVoice/FreeSwitchVoiceModule.cs +++ b/OpenSim/Region/OptionalModules/Avatar/Voice/FreeSwitchVoice/FreeSwitchVoiceModule.cs @@ -823,11 +823,10 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.FreeSwitchVoice m_log.DebugFormat("[FreeSwitchVoice]: Region:Parcel \"{0}\": parcel id {1}: using channel name {2}", landName, land.LocalID, landUUID); } - System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding(); // slvoice handles the sip address differently if it begins with confctl, hiding it from the user in the friends list. however it also disables // the personal speech indicators as well unless some siren14-3d codec magic happens. we dont have siren143d so we'll settle for the personal speech indicator. - channelUri = String.Format("sip:conf-{0}@{1}", "x" + Convert.ToBase64String(encoding.GetBytes(landUUID)), m_freeSwitchRealm); + channelUri = String.Format("sip:conf-{0}@{1}", "x" + Convert.ToBase64String(Encoding.ASCII.GetBytes(landUUID)), m_freeSwitchRealm); lock (m_ParcelAddress) { diff --git a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/XmlRpcGroupsServicesConnectorModule.cs b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/XmlRpcGroupsServicesConnectorModule.cs index 52fc27dcf5..61aaf04bd2 100644 --- a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/XmlRpcGroupsServicesConnectorModule.cs +++ b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/XmlRpcGroupsServicesConnectorModule.cs @@ -1120,7 +1120,6 @@ namespace Nwc.XmlRpc /// Class supporting the request side of an XML-RPC transaction. public class ConfigurableKeepAliveXmlRpcRequest : XmlRpcRequest { - private Encoding _encoding = new ASCIIEncoding(); private XmlRpcRequestSerializer _serializer = new XmlRpcRequestSerializer(); private XmlRpcResponseDeserializer _deserializer = new XmlRpcResponseDeserializer(); private bool _disableKeepAlive = true; @@ -1153,7 +1152,7 @@ namespace Nwc.XmlRpc request.KeepAlive = !_disableKeepAlive; Stream stream = request.GetRequestStream(); - XmlTextWriter xml = new XmlTextWriter(stream, _encoding); + XmlTextWriter xml = new XmlTextWriter(stream, Encoding.ASCII); _serializer.Serialize(xml, this); xml.Flush(); xml.Close(); diff --git a/OpenSim/Region/OptionalModules/Scripting/JsonStore/JsonStoreScriptModule.cs b/OpenSim/Region/OptionalModules/Scripting/JsonStore/JsonStoreScriptModule.cs index 4949097632..eaba816179 100644 --- a/OpenSim/Region/OptionalModules/Scripting/JsonStore/JsonStoreScriptModule.cs +++ b/OpenSim/Region/OptionalModules/Scripting/JsonStore/JsonStoreScriptModule.cs @@ -425,10 +425,9 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore try { - System.Text.UTF8Encoding enc = new System.Text.UTF8Encoding(); - string jsondata = SLUtil.ParseNotecardToString(enc.GetString(a.Data)); - int result = m_store.SetValue(storeID,path,jsondata,true) ? 1 : 0; - m_comms.DispatchReply(scriptID,result,"",reqID.ToString()); + string jsondata = SLUtil.ParseNotecardToString(Encoding.UTF8.GetString(a.Data)); + int result = m_store.SetValue(storeID, path, jsondata,true) ? 1 : 0; + m_comms.DispatchReply(scriptID,result, "", reqID.ToString()); return; } catch (Exception e) diff --git a/OpenSim/Region/OptionalModules/Scripting/Minimodule/MRMModule.cs b/OpenSim/Region/OptionalModules/Scripting/Minimodule/MRMModule.cs index 74f52087fe..03481d2d29 100644 --- a/OpenSim/Region/OptionalModules/Scripting/Minimodule/MRMModule.cs +++ b/OpenSim/Region/OptionalModules/Scripting/Minimodule/MRMModule.cs @@ -482,10 +482,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule // Convert to base64 // string filetext = Convert.ToBase64String(data); - - ASCIIEncoding enc = new ASCIIEncoding(); - - Byte[] buf = enc.GetBytes(filetext); + Byte[] buf = Encoding.ASCII.GetBytes(filetext); m_log.Info("MRM 9"); diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index 0a25454242..0ebcd8dbe6 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -10536,9 +10536,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api return; } - System.Text.UTF8Encoding enc = - new System.Text.UTF8Encoding(); - string data = enc.GetString(a.Data); + string data = Encoding.UTF8.GetString(a.Data); //m_log.Debug(data); NotecardCache.Cache(id, data); AsyncCommands. @@ -10591,9 +10589,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api return; } - System.Text.UTF8Encoding enc = - new System.Text.UTF8Encoding(); - string data = enc.GetString(a.Data); + string data = Encoding.UTF8.GetString(a.Data); //m_log.Debug(data); NotecardCache.Cache(id, data); AsyncCommands.DataserverPlugin.DataserverReply(id.ToString(), diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs index e90f57754e..cfa08c20e1 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs @@ -1811,8 +1811,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api if (a == null) return UUID.Zero; - System.Text.UTF8Encoding enc = new System.Text.UTF8Encoding(); - string data = enc.GetString(a.Data); + string data = Encoding.UTF8.GetString(a.Data); NotecardCache.Cache(assetID, data); }; diff --git a/OpenSim/Region/ScriptEngine/Shared/CodeTools/Compiler.cs b/OpenSim/Region/ScriptEngine/Shared/CodeTools/Compiler.cs index 8f2ec49cf4..17a0d69838 100644 --- a/OpenSim/Region/ScriptEngine/Shared/CodeTools/Compiler.cs +++ b/OpenSim/Region/ScriptEngine/Shared/CodeTools/Compiler.cs @@ -31,6 +31,7 @@ using System.Collections.Generic; using System.Globalization; using System.Reflection; using System.IO; +using System.Text; using Microsoft.CSharp; //using Microsoft.JScript; using Microsoft.VisualBasic; @@ -711,9 +712,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools // string filetext = System.Convert.ToBase64String(data); - System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding(); - - Byte[] buf = enc.GetBytes(filetext); + Byte[] buf = Encoding.ASCII.GetBytes(filetext); FileStream sfs = File.Create(assembly + ".text"); sfs.Write(buf, 0, buf.Length); @@ -804,8 +803,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools mapstring += String.Format("{0},{1},{2},{3}\n", k.Key, k.Value, v.Key, v.Value); } - System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding(); - Byte[] mapbytes = enc.GetBytes(mapstring); + Byte[] mapbytes = Encoding.ASCII.GetBytes(mapstring); FileStream mfs = File.Create(filename); mfs.Write(mapbytes, 0, mapbytes.Length); mfs.Close(); diff --git a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs index 306090e60c..1c0cac78a0 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs @@ -26,15 +26,16 @@ */ using System; -using System.IO; -using System.Runtime.Remoting; -using System.Runtime.Remoting.Lifetime; -using System.Threading; using System.Collections; using System.Collections.Generic; -using System.Security.Policy; -using System.Reflection; using System.Globalization; +using System.IO; +using System.Reflection; +using System.Runtime.Remoting; +using System.Runtime.Remoting.Lifetime; +using System.Security.Policy; +using System.Text; +using System.Threading; using System.Xml; using OpenMetaverse; using log4net; @@ -298,13 +299,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance using (FileStream fs = File.Open(savedState, FileMode.Open, FileAccess.Read, FileShare.None)) { - System.Text.UTF8Encoding enc = - new System.Text.UTF8Encoding(); - Byte[] data = new Byte[size]; fs.Read(data, 0, size); - xml = enc.GetString(data); + xml = Encoding.UTF8.GetString(data); ScriptSerializer.Deserialize(xml, this); @@ -954,8 +952,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance try { FileStream fs = File.Create(Path.Combine(Path.GetDirectoryName(assembly), ItemID.ToString() + ".state")); - System.Text.UTF8Encoding enc = new System.Text.UTF8Encoding(); - Byte[] buf = enc.GetBytes(xml); + Byte[] buf = (new UTF8Encoding()).GetBytes(xml); fs.Write(buf, 0, buf.Length); fs.Close(); } diff --git a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs index f768cf2d03..20fad05b72 100644 --- a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs +++ b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs @@ -1763,7 +1763,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine tfs.Read(tdata, 0, tdata.Length); } - assem = new System.Text.ASCIIEncoding().GetString(tdata); + assem = Encoding.ASCII.GetString(tdata); } catch (Exception e) { diff --git a/OpenSim/Server/Base/ServicesServerBase.cs b/OpenSim/Server/Base/ServicesServerBase.cs index 36c48e63c1..b137c05889 100644 --- a/OpenSim/Server/Base/ServicesServerBase.cs +++ b/OpenSim/Server/Base/ServicesServerBase.cs @@ -27,9 +27,10 @@ using System; using System.IO; -using System.Xml; -using System.Threading; using System.Reflection; +using System.Threading; +using System.Text; +using System.Xml; using OpenSim.Framework; using OpenSim.Framework.Console; using log4net; @@ -335,8 +336,7 @@ namespace OpenSim.Server.Base { string pidstring = System.Diagnostics.Process.GetCurrentProcess().Id.ToString(); FileStream fs = File.Create(path); - System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding(); - Byte[] buf = enc.GetBytes(pidstring); + Byte[] buf = Encoding.ASCII.GetBytes(pidstring); fs.Write(buf, 0, buf.Length); fs.Close(); m_pidFile = path; diff --git a/OpenSim/Tools/Compiler/Program.cs b/OpenSim/Tools/Compiler/Program.cs index 249e18b402..6c59c313a6 100644 --- a/OpenSim/Tools/Compiler/Program.cs +++ b/OpenSim/Tools/Compiler/Program.cs @@ -28,6 +28,7 @@ using System; using System.Collections.Generic; using System.IO; +using System.Text; using Microsoft.CSharp; using OpenSim.Region.ScriptEngine.Shared.CodeTools; using System.CodeDom.Compiler; @@ -201,12 +202,8 @@ namespace OpenSim.Tools.LSL.Compiler // Convert to base64 // string filetext = System.Convert.ToBase64String(data); - - System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding(); - - Byte[] buf = enc.GetBytes(filetext); - - FileStream sfs = File.Create(OutFile+".text"); + Byte[] buf = Encoding.ASCII.GetBytes(filetext); + FileStream sfs = File.Create(OutFile + ".text"); sfs.Write(buf, 0, buf.Length); sfs.Close(); @@ -222,9 +219,9 @@ namespace OpenSim.Tools.LSL.Compiler // } // } - buf = enc.GetBytes(posmap); + buf = Encoding.ASCII.GetBytes(posmap); - FileStream mfs = File.Create(OutFile+".map"); + FileStream mfs = File.Create(OutFile + ".map"); mfs.Write(buf, 0, buf.Length); mfs.Close(); From 743437262ed645204d9040e1705a41902860a648 Mon Sep 17 00:00:00 2001 From: Robert Adams Date: Wed, 11 Jul 2012 16:07:14 -0700 Subject: [PATCH 529/547] Many explanitory comments added to the link and delink code in SOG and SOP. Should have no functionality changes. --- .../Framework/Scenes/SceneObjectGroup.cs | 94 +++++++++++++++---- .../Framework/Scenes/SceneObjectPart.cs | 28 ++++-- 2 files changed, 96 insertions(+), 26 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs index fc0476157f..52469a2302 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs @@ -451,6 +451,8 @@ namespace OpenSim.Region.Framework.Scenes } } + // Restuff the new GroupPosition into each SOP of the linkset. + // This has the affect of resetting and tainting the physics actors. SceneObjectPart[] parts = m_parts.GetArray(); for (int i = 0; i < parts.Length; i++) parts[i].GroupPosition = val; @@ -1133,6 +1135,9 @@ namespace OpenSim.Region.Framework.Scenes public void ResetChildPrimPhysicsPositions() { + // Setting this SOG's absolute position also loops through and sets the positions + // of the SOP's in this SOG's linkset. This has the side affect of making sure + // the physics world matches the simulated world. AbsolutePosition = AbsolutePosition; // could someone in the know please explain how this works? // teravus: AbsolutePosition is NOT a normal property! @@ -1987,6 +1992,8 @@ namespace OpenSim.Region.Framework.Scenes LinkToGroup(objectGroup, false); } + // Link an existing group to this group. + // The group being linked need not be a linkset -- it can have just one prim. public void LinkToGroup(SceneObjectGroup objectGroup, bool insert) { // m_log.DebugFormat( @@ -1997,35 +2004,51 @@ namespace OpenSim.Region.Framework.Scenes if (objectGroup == this) return; + // 'linkPart' == the root of the group being linked into this group SceneObjectPart linkPart = objectGroup.m_rootPart; // physics flags from group to be applied to linked parts bool grpusephys = UsesPhysics; bool grptemporary = IsTemporary; + // Remember where the group being linked thought it was Vector3 oldGroupPosition = linkPart.GroupPosition; Quaternion oldRootRotation = linkPart.RotationOffset; - linkPart.OffsetPosition = linkPart.GroupPosition - AbsolutePosition; - linkPart.ParentID = m_rootPart.LocalId; - linkPart.GroupPosition = AbsolutePosition; - Vector3 axPos = linkPart.OffsetPosition; + // A linked SOP remembers its location and rotation relative to the root of a group. + // Convert the root of the group being linked to be relative to the + // root of the group being linked to. + // Note: Some of the assignments have complex side effects. + // First move the new group's root SOP's position to be relative to ours + // (radams1: Not sure if the multiple setting of OffsetPosition is required. If not, + // this code can be reordered to have a more logical flow.) + linkPart.OffsetPosition = linkPart.GroupPosition - AbsolutePosition; + // Assign the new parent to the root of the old group + linkPart.ParentID = m_rootPart.LocalId; + // Now that it's a child, it's group position is our root position + linkPart.GroupPosition = AbsolutePosition; + + Vector3 axPos = linkPart.OffsetPosition; + // Rotate the linking root SOP's position to be relative to the new root prim Quaternion parentRot = m_rootPart.RotationOffset; axPos *= Quaternion.Inverse(parentRot); - linkPart.OffsetPosition = axPos; + + // Make the linking root SOP's rotation relative to the new root prim Quaternion oldRot = linkPart.RotationOffset; Quaternion newRot = Quaternion.Inverse(parentRot) * oldRot; linkPart.RotationOffset = newRot; - linkPart.ParentID = m_rootPart.LocalId; - + // If there is only one SOP in a SOG, the LinkNum is zero. I.e., not a linkset. + // Now that we know this SOG has at least two SOPs in it, the new root + // SOP becomes the first in the linkset. if (m_rootPart.LinkNum == 0) m_rootPart.LinkNum = 1; lock (m_parts.SyncRoot) { + // Calculate the new link number for the old root SOP int linkNum; if (insert) { @@ -2041,6 +2064,7 @@ namespace OpenSim.Region.Framework.Scenes linkNum = PrimCount + 1; } + // Add the old root SOP as a part in our group's list m_parts.Add(linkPart.UUID, linkPart); linkPart.SetParent(this); @@ -2048,6 +2072,8 @@ namespace OpenSim.Region.Framework.Scenes // let physics know preserve part volume dtc messy since UpdatePrimFlags doesn't look to parent changes for now linkPart.UpdatePrimFlags(grpusephys, grptemporary, (IsPhantom || (linkPart.Flags & PrimFlags.Phantom) != 0), linkPart.VolumeDetectActive); + + // If the added SOP is physical, also tell the physics engine about the link relationship. if (linkPart.PhysActor != null && m_rootPart.PhysActor != null && m_rootPart.PhysActor.IsPhysical) { linkPart.PhysActor.link(m_rootPart.PhysActor); @@ -2056,20 +2082,26 @@ namespace OpenSim.Region.Framework.Scenes linkPart.LinkNum = linkNum++; + // Get a list of the SOP's in the old group in order of their linknum's. SceneObjectPart[] ogParts = objectGroup.Parts; Array.Sort(ogParts, delegate(SceneObjectPart a, SceneObjectPart b) { return a.LinkNum - b.LinkNum; }); + // Add each of the SOP's from the old linkset to our linkset for (int i = 0; i < ogParts.Length; i++) { SceneObjectPart part = ogParts[i]; if (part.UUID != objectGroup.m_rootPart.UUID) { LinkNonRootPart(part, oldGroupPosition, oldRootRotation, linkNum++); - // let physics know + + // Update the physics flags for the newly added SOP + // (Is this necessary? LinkNonRootPart() has already called UpdatePrimFlags but with different flags!??) part.UpdatePrimFlags(grpusephys, grptemporary, (IsPhantom || (part.Flags & PrimFlags.Phantom) != 0), part.VolumeDetectActive); + + // If the added SOP is physical, also tell the physics engine about the link relationship. if (part.PhysActor != null && m_rootPart.PhysActor != null && m_rootPart.PhysActor.IsPhysical) { part.PhysActor.link(m_rootPart.PhysActor); @@ -2080,6 +2112,7 @@ namespace OpenSim.Region.Framework.Scenes } } + // Now that we've aquired all of the old SOG's parts, remove the old SOG from the scene. m_scene.UnlinkSceneObject(objectGroup, true); objectGroup.IsDeleted = true; @@ -2152,7 +2185,7 @@ namespace OpenSim.Region.Framework.Scenes /// /// FIXME: This method should not be called directly since it bypasses update locking, allowing a potential race /// condition. But currently there is no - /// alternative method that does take a lonk to delink a single prim. + /// alternative method that does take a lock to delink a single prim. /// /// /// @@ -2165,6 +2198,7 @@ namespace OpenSim.Region.Framework.Scenes linkPart.ClearUndoState(); + Vector3 worldPos = linkPart.GetWorldPosition(); Quaternion worldRot = linkPart.GetWorldRotation(); // Remove the part from this object @@ -2174,6 +2208,7 @@ namespace OpenSim.Region.Framework.Scenes SceneObjectPart[] parts = m_parts.GetArray(); + // Rejigger the linknum's of the remaining SOP's to fill any gap if (parts.Length == 1 && RootPart != null) { // Single prim left @@ -2195,22 +2230,31 @@ namespace OpenSim.Region.Framework.Scenes PhysicsActor linkPartPa = linkPart.PhysActor; + // Remove the SOP from the physical scene. + // If the new SOG is physical, it is re-created later. + // (There is a problem here in that we have not yet told the physics + // engine about the delink. Someday, linksets should be made first + // class objects in the physics engine interface). if (linkPartPa != null) m_scene.PhysicsScene.RemovePrim(linkPartPa); // We need to reset the child part's position // ready for life as a separate object after being a part of another object + + /* This commented out code seems to recompute what GetWorldPosition already does. + * Replace with a call to GetWorldPosition (before unlinking) Quaternion parentRot = m_rootPart.RotationOffset; - Vector3 axPos = linkPart.OffsetPosition; - axPos *= parentRot; linkPart.OffsetPosition = new Vector3(axPos.X, axPos.Y, axPos.Z); linkPart.GroupPosition = AbsolutePosition + linkPart.OffsetPosition; linkPart.OffsetPosition = new Vector3(0, 0, 0); - + */ + linkPart.GroupPosition = worldPos; + linkPart.OffsetPosition = Vector3.Zero; linkPart.RotationOffset = worldRot; + // Create a new SOG to go around this unlinked and unattached SOP SceneObjectGroup objectGroup = new SceneObjectGroup(linkPart); m_scene.AddNewSceneObject(objectGroup, true); @@ -2239,42 +2283,56 @@ namespace OpenSim.Region.Framework.Scenes m_isBackedUp = false; } + // This links an SOP from a previous linkset into my linkset. + // The trick is that the SOP's position and rotation are relative to the old root SOP's + // so we are passed in the position and rotation of the old linkset so this can + // unjigger this SOP's position and rotation from the previous linkset and + // then make them relative to my linkset root. private void LinkNonRootPart(SceneObjectPart part, Vector3 oldGroupPosition, Quaternion oldGroupRotation, int linkNum) { Quaternion parentRot = oldGroupRotation; Quaternion oldRot = part.RotationOffset; - Quaternion worldRot = parentRot * oldRot; - - parentRot = oldGroupRotation; + // Move our position to not be relative to the old parent Vector3 axPos = part.OffsetPosition; - axPos *= parentRot; part.OffsetPosition = axPos; part.GroupPosition = oldGroupPosition + part.OffsetPosition; part.OffsetPosition = Vector3.Zero; + + // Compution our rotation to be not relative to the old parent + Quaternion worldRot = parentRot * oldRot; part.RotationOffset = worldRot; + // Add this SOP to our linkset part.SetParent(this); part.ParentID = m_rootPart.LocalId; - m_parts.Add(part.UUID, part); part.LinkNum = linkNum; + // Compute the new position of this SOP relative to the group position part.OffsetPosition = part.GroupPosition - AbsolutePosition; - Quaternion rootRotation = m_rootPart.RotationOffset; + // (radams1 20120711: I don't know why part.OffsetPosition is set multiple times. + // It would have the affect of setting the physics engine position multiple + // times. In theory, that is not necessary but I don't have a good linkset + // test to know that cleaning up this code wouldn't break things.) + // Rotate the relative position by the rotation of the group + Quaternion rootRotation = m_rootPart.RotationOffset; Vector3 pos = part.OffsetPosition; pos *= Quaternion.Inverse(rootRotation); part.OffsetPosition = pos; + // Compute the SOP's rotation relative to the rotation of the group. parentRot = m_rootPart.RotationOffset; oldRot = part.RotationOffset; Quaternion newRot = Quaternion.Inverse(parentRot) * oldRot; part.RotationOffset = newRot; + // Since this SOP's state has changed, push those changes into the physics engine + // and the simulator. part.UpdatePrimFlags(UsesPhysics, IsTemporary, IsPhantom, IsVolumeDetect); } diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index b3f11a756e..4b2fedead8 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs @@ -693,9 +693,11 @@ namespace OpenSim.Region.Framework.Scenes { // If this is a linkset, we don't want the physics engine mucking up our group position here. PhysicsActor actor = PhysActor; + // If physical and the root prim of a linkset, the position of the group is what physics thinks. if (actor != null && ParentID == 0) m_groupPosition = actor.Position; + // If I'm an attachment, my position is reported as the position of who I'm attached to if (ParentGroup.IsAttachment) { ScenePresence sp = ParentGroup.Scene.GetScenePresence(ParentGroup.AttachedAvatar); @@ -721,7 +723,7 @@ namespace OpenSim.Region.Framework.Scenes } else { - // To move the child prim in respect to the group position and rotation we have to calculate + // The physics engine always sees all objects (root or linked) in world coordinates. actor.Position = GetWorldPosition(); actor.Orientation = GetWorldRotation(); } @@ -795,6 +797,8 @@ namespace OpenSim.Region.Framework.Scenes { // We don't want the physics engine mucking up the rotations in a linkset PhysicsActor actor = PhysActor; + // If this is a root of a linkset, the real rotation is what the physics engine thinks. + // If not a root prim, the offset rotation is computed by SOG and is relative to the root. if (ParentID == 0 && (Shape.PCode != 9 || Shape.State == 0) && actor != null) { if (actor.Orientation.X != 0f || actor.Orientation.Y != 0f @@ -1980,14 +1984,20 @@ namespace OpenSim.Region.Framework.Scenes /// A Linked Child Prim objects position in world public Vector3 GetWorldPosition() { - Quaternion parentRot = ParentGroup.RootPart.RotationOffset; - Vector3 axPos = OffsetPosition; - axPos *= parentRot; - Vector3 translationOffsetPosition = axPos; - if(_parentID == 0) - return GroupPosition; + Vector3 ret; + if (_parentID == 0) + // if a root SOP, my position is what it is + ret = GroupPosition; else - return ParentGroup.AbsolutePosition + translationOffsetPosition; + { + // If a child SOP, my position is relative to the root SOP so take + // my info and add the root's position and rotation to + // get my world position. + Quaternion parentRot = ParentGroup.RootPart.RotationOffset; + Vector3 translationOffsetPosition = OffsetPosition * parentRot; + ret = ParentGroup.AbsolutePosition + translationOffsetPosition; + } + return ret; } /// @@ -2004,6 +2014,8 @@ namespace OpenSim.Region.Framework.Scenes } else { + // A child SOP's rotation is relative to the root SOP's rotation. + // Combine them to get my absolute rotation. Quaternion parentRot = ParentGroup.RootPart.RotationOffset; Quaternion oldRot = RotationOffset; newRot = parentRot * oldRot; From ca412032e89939146a05cf708a4b9df93f74c4ac Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 12 Jul 2012 21:36:33 +0100 Subject: [PATCH 530/547] Put output for "show connections" command into standard table format. Also moves into own method. --- OpenSim/Region/Application/OpenSim.cs | 35 ++++++++++++--------------- 1 file changed, 16 insertions(+), 19 deletions(-) diff --git a/OpenSim/Region/Application/OpenSim.cs b/OpenSim/Region/Application/OpenSim.cs index 56ad5c9e47..f3e4a2da0c 100644 --- a/OpenSim/Region/Application/OpenSim.cs +++ b/OpenSim/Region/Application/OpenSim.cs @@ -996,25 +996,7 @@ namespace OpenSim break; case "connections": - System.Text.StringBuilder connections = new System.Text.StringBuilder("Connections:\n"); - m_sceneManager.ForEachScene( - delegate(Scene scene) { - scene.ForEachClient( - delegate(IClientAPI client) { - connections.AppendFormat( - "{0}: {1} ({2}) from {3} on circuit {4}\n", - scene.RegionInfo.RegionName, - client.Name, - client.AgentId, - client.RemoteEndPoint, - client.CircuitCode - ); - } - ); - } - ); - - MainConsole.Instance.Output(connections.ToString()); + HandleShowConnections(); break; case "circuits": @@ -1138,6 +1120,21 @@ namespace OpenSim } } + private void HandleShowConnections() + { + ConsoleDisplayTable cdt = new ConsoleDisplayTable(); + cdt.AddColumn("Region", 20); + cdt.AddColumn("Avatar name", 25); + cdt.AddColumn("Remote endpoint", 23); + cdt.AddColumn("Circuit number", 14); + + m_sceneManager.ForEachScene( + s => s.ForEachClient( + c => cdt.AddRow(s.RegionInfo.RegionName, c.Name, c.RemoteEndPoint.ToString(), c.CircuitCode.ToString()))); + + MainConsole.Instance.Output(cdt.ToString()); + } + /// /// Use XML2 format to serialize data to a file /// From 6a0de355e09c264ce3f9e2c7db0b69919794e30c Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 12 Jul 2012 22:37:48 +0100 Subject: [PATCH 531/547] Add active status to "show connections" --- OpenSim/Region/Application/OpenSim.cs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/OpenSim/Region/Application/OpenSim.cs b/OpenSim/Region/Application/OpenSim.cs index f3e4a2da0c..e9807166fe 100644 --- a/OpenSim/Region/Application/OpenSim.cs +++ b/OpenSim/Region/Application/OpenSim.cs @@ -1127,10 +1127,16 @@ namespace OpenSim cdt.AddColumn("Avatar name", 25); cdt.AddColumn("Remote endpoint", 23); cdt.AddColumn("Circuit number", 14); + cdt.AddColumn("Active?", 7); m_sceneManager.ForEachScene( s => s.ForEachClient( - c => cdt.AddRow(s.RegionInfo.RegionName, c.Name, c.RemoteEndPoint.ToString(), c.CircuitCode.ToString()))); + c => cdt.AddRow( + s.RegionInfo.RegionName, + c.Name, + c.RemoteEndPoint.ToString(), + c.CircuitCode.ToString(), + c.IsActive.ToString()))); MainConsole.Instance.Output(cdt.ToString()); } From 15283d35f1c567d6b33d0ba2884c1a73c83c6ce6 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 12 Jul 2012 23:09:36 +0100 Subject: [PATCH 532/547] Extend "show circuits" to show circuit code, ip and viewer name. Also change to use standard table formatting "show circuits" and "show connections" console commands are very similar but access different data structures. --- OpenSim/Framework/AgentCircuitData.cs | 5 +++ OpenSim/Region/Application/OpenSim.cs | 51 ++++++++++++++++----------- 2 files changed, 36 insertions(+), 20 deletions(-) diff --git a/OpenSim/Framework/AgentCircuitData.cs b/OpenSim/Framework/AgentCircuitData.cs index 57fb808dc1..ffcc5840e8 100644 --- a/OpenSim/Framework/AgentCircuitData.cs +++ b/OpenSim/Framework/AgentCircuitData.cs @@ -98,6 +98,11 @@ namespace OpenSim.Framework /// public string lastname; + /// + /// Agent's full name. + /// + public string Name { get { return string.Format("{0} {1}", firstname, lastname); } } + /// /// Random Unique GUID for this session. Client gets this at login and it's /// only supposed to be disclosed over secure channels diff --git a/OpenSim/Region/Application/OpenSim.cs b/OpenSim/Region/Application/OpenSim.cs index e9807166fe..230af8edbf 100644 --- a/OpenSim/Region/Application/OpenSim.cs +++ b/OpenSim/Region/Application/OpenSim.cs @@ -1000,22 +1000,7 @@ namespace OpenSim break; case "circuits": - System.Text.StringBuilder acd = new System.Text.StringBuilder("Agent Circuits:\n"); - m_sceneManager.ForEachScene( - delegate(Scene scene) { - //this.HttpServer. - acd.AppendFormat("{0}:\n", scene.RegionInfo.RegionName); - foreach (AgentCircuitData aCircuit in scene.AuthenticateHandler.GetAgentCircuits().Values) - acd.AppendFormat( - "\t{0} {1} ({2})\n", - aCircuit.firstname, - aCircuit.lastname, - (aCircuit.child ? "Child" : "Root") - ); - } - ); - - MainConsole.Instance.Output(acd.ToString()); + HandleShowCircuits(); break; case "http-handlers": @@ -1120,19 +1105,45 @@ namespace OpenSim } } + private void HandleShowCircuits() + { + ConsoleDisplayTable cdt = new ConsoleDisplayTable(); + cdt.AddColumn("Region", 20); + cdt.AddColumn("Avatar name", 24); + cdt.AddColumn("Type", 5); + cdt.AddColumn("Code", 10); + cdt.AddColumn("IP", 16); + cdt.AddColumn("Viewer Name", 24); + + m_sceneManager.ForEachScene( + s => + { + foreach (AgentCircuitData aCircuit in s.AuthenticateHandler.GetAgentCircuits().Values) + cdt.AddRow( + s.Name, + aCircuit.Name, + aCircuit.child ? "child" : "root", + aCircuit.circuitcode.ToString(), + aCircuit.IPAddress.ToString(), + aCircuit.Viewer); + }); + + MainConsole.Instance.Output(cdt.ToString()); + } + private void HandleShowConnections() { ConsoleDisplayTable cdt = new ConsoleDisplayTable(); cdt.AddColumn("Region", 20); - cdt.AddColumn("Avatar name", 25); - cdt.AddColumn("Remote endpoint", 23); - cdt.AddColumn("Circuit number", 14); + cdt.AddColumn("Avatar name", 24); + cdt.AddColumn("Circuit code", 12); + cdt.AddColumn("Endpoint", 23); cdt.AddColumn("Active?", 7); m_sceneManager.ForEachScene( s => s.ForEachClient( c => cdt.AddRow( - s.RegionInfo.RegionName, + s.Name, c.Name, c.RemoteEndPoint.ToString(), c.CircuitCode.ToString(), From 75ab9b4b882feb8645ccc2904b11aebb9ae06e64 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 12 Jul 2012 23:18:30 +0100 Subject: [PATCH 533/547] Change very recent AllowedViewerList and BannedViewerList config setting names in OpenSim.ini.example to AllowedClients and BannedClients to match long-existing settings in [LoginService] Also changes separator from comma to bar to match existing [LoginService] config features. Divergence of config names for identical facilities in different places makes for an unnecessarily confusing user experience. --- OpenSim/Region/Framework/Scenes/Scene.cs | 8 ++++---- bin/OpenSim.ini.example | 14 +++++++------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 25223b95b3..3e9583cb43 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -782,19 +782,19 @@ namespace OpenSim.Region.Framework.Scenes } } - string grant = startupConfig.GetString("AllowedViewerList", String.Empty); + string grant = startupConfig.GetString("AllowedClients", String.Empty); if (grant.Length > 0) { - foreach (string viewer in grant.Split(',')) + foreach (string viewer in grant.Split('|')) { m_AllowedViewers.Add(viewer.Trim().ToLower()); } } - grant = startupConfig.GetString("BannedViewerList", String.Empty); + grant = startupConfig.GetString("BannedClients", String.Empty); if (grant.Length > 0) { - foreach (string viewer in grant.Split(',')) + foreach (string viewer in grant.Split('|')) { m_BannedViewers.Add(viewer.Trim().ToLower()); } diff --git a/bin/OpenSim.ini.example b/bin/OpenSim.ini.example index 33eaccb8dd..9c68b6546c 100644 --- a/bin/OpenSim.ini.example +++ b/bin/OpenSim.ini.example @@ -280,18 +280,18 @@ ;; default is false ; TelehubAllowLandmark = false - ;# {AllowedViewerList} {} {Comma separated list of allowed viewers} {} - ;; Comma separated list of viewers which may gain access to the regions. - ;; One can use a Substring of the viewer name to enable only certain subversions + ;# {AllowedClients} {} {Bar (|) separated list of allowed clients} {} + ;; Bar (|) separated list of viewers which may gain access to the regions. + ;; One can use a substring of the viewer name to enable only certain versions ;; Example: Agent uses the viewer "Imprudence 1.3.2.0" ;; - "Imprudence" has access ;; - "Imprudence 1.3" has access ;; - "Imprudence 1.3.1" has no access - ;; AllowedViewerList = + ; AllowedViewerList = - ;# {BannedViewerList} {} {Comma separated list of banned viewers} {} - ;# Comma separated list of viewers which may not gain access to the regions. - ;; One can use a Substring of the viewer name to disable only certain subversions + ;# {BannedClients} {} {Bar (|) separated list of banned clients} {} + ;# Bar (|) separated list of viewers which may not gain access to the regions. + ;; One can use a Substring of the viewer name to disable only certain versions ;; Example: Agent uses the viewer "Imprudence 1.3.2.0" ;; - "Imprudence" has no access ;; - "Imprudence 1.3" has no access From 3b3d9967b18335c28ce2dfc269e47bac0ede075a Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 12 Jul 2012 23:29:57 +0100 Subject: [PATCH 534/547] Remove IClientAPI.GetClientEP() in favour of existing identical IClientAPI.RemoteEndpoint. --- OpenSim/Framework/IClientAPI.cs | 1 - OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs | 5 ----- .../Agent/InternetRelayClientView/Server/IRCClientView.cs | 5 ----- OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs | 5 ----- .../ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs | 8 ++------ OpenSim/Tests/Common/Mock/TestClient.cs | 5 ----- 6 files changed, 2 insertions(+), 27 deletions(-) diff --git a/OpenSim/Framework/IClientAPI.cs b/OpenSim/Framework/IClientAPI.cs index 4cc2e2c9c3..d5952c4b4c 100644 --- a/OpenSim/Framework/IClientAPI.cs +++ b/OpenSim/Framework/IClientAPI.cs @@ -1353,7 +1353,6 @@ namespace OpenSim.Framework void SendBlueBoxMessage(UUID FromAvatarID, String FromAvatarName, String Message); void SendLogoutPacket(); - EndPoint GetClientEP(); // WARNING WARNING WARNING // diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs index 8874585625..0457fe6f1b 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs @@ -11845,11 +11845,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP m_udpClient.SetClientInfo(info); } - public EndPoint GetClientEP() - { - return m_userEndPoint; - } - #region Media Parcel Members public void SendParcelMediaCommand(uint flags, ParcelMediaCommandEnum command, float time) diff --git a/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs b/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs index 3a3252853d..363a1b89f5 100644 --- a/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs +++ b/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs @@ -1431,11 +1431,6 @@ namespace OpenSim.Region.OptionalModules.Agent.InternetRelayClientView.Server Disconnect(); } - public EndPoint GetClientEP() - { - return null; - } - public ClientInfo GetClientInfo() { return new ClientInfo(); diff --git a/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs b/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs index 9b3400da78..67989ba752 100644 --- a/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs +++ b/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs @@ -945,11 +945,6 @@ namespace OpenSim.Region.OptionalModules.World.NPC { } - public EndPoint GetClientEP() - { - return null; - } - public ClientInfo GetClientInfo() { return null; diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs index cfa08c20e1..3654106427 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs @@ -874,13 +874,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api if (World.Entities.ContainsKey((UUID)agent) && World.Entities[avatarID] is ScenePresence) { ScenePresence target = (ScenePresence)World.Entities[avatarID]; - EndPoint ep = target.ControllingClient.GetClientEP(); - if (ep is IPEndPoint) - { - IPEndPoint ip = (IPEndPoint)ep; - return ip.Address.ToString(); - } + return target.ControllingClient.RemoteEndPoint.Address.ToString(); } + // fall through case, just return nothing return ""; } diff --git a/OpenSim/Tests/Common/Mock/TestClient.cs b/OpenSim/Tests/Common/Mock/TestClient.cs index 376465c053..89c4f110db 100644 --- a/OpenSim/Tests/Common/Mock/TestClient.cs +++ b/OpenSim/Tests/Common/Mock/TestClient.cs @@ -963,11 +963,6 @@ namespace OpenSim.Tests.Common.Mock { } - public EndPoint GetClientEP() - { - return null; - } - public ClientInfo GetClientInfo() { return null; From dda999a22c5f36d1d413f2f5f29ce8782af85b0b Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 12 Jul 2012 23:43:02 +0100 Subject: [PATCH 535/547] Remove IClientIPEndpoint client interface for now. This may well come back in the future when this subinterface is actually used but it currently isn't and I feel the name was poor. Everything uses IClientAPI.RemoveEndPoint which also returned the full endpoint rather than just the ip address. --- .../ClientStack/Linden/UDP/LLClientView.cs | 21 +------------------ .../Server/IRCClientView.cs | 11 +--------- 2 files changed, 2 insertions(+), 30 deletions(-) diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs index 0457fe6f1b..bc5315b88c 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs @@ -59,7 +59,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP /// Handles new client connections /// Constructor takes a single Packet and authenticates everything /// - public class LLClientView : IClientAPI, IClientCore, IClientIM, IClientChat, IClientInventory, IClientIPEndpoint, IStatsCollector + public class LLClientView : IClientAPI, IClientCore, IClientIM, IClientChat, IClientInventory, IStatsCollector { /// /// Debug packet level. See OpenSim.RegisterConsoleCommands() for more details. @@ -450,7 +450,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP RegisterInterface(this); RegisterInterface(this); RegisterInterface(this); - RegisterInterface(this); m_scene = scene; m_entityUpdates = new PriorityQueue(m_scene.Entities.Count); @@ -12114,24 +12113,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP return numPackets; } - #region IClientIPEndpoint Members - - public IPAddress EndPoint - { - get - { - if (m_userEndPoint is IPEndPoint) - { - IPEndPoint ep = (IPEndPoint)m_userEndPoint; - - return ep.Address; - } - return null; - } - } - - #endregion - public void SendRebakeAvatarTextures(UUID textureID) { RebakeAvatarTexturesPacket pack = diff --git a/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs b/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs index 363a1b89f5..5043208277 100644 --- a/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs +++ b/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs @@ -44,7 +44,7 @@ namespace OpenSim.Region.OptionalModules.Agent.InternetRelayClientView.Server { public delegate void OnIRCClientReadyDelegate(IRCClientView cv); - public class IRCClientView : IClientAPI, IClientCore, IClientIPEndpoint + public class IRCClientView : IClientAPI, IClientCore { public event OnIRCClientReadyDelegate OnIRCReady; @@ -1628,15 +1628,6 @@ namespace OpenSim.Region.OptionalModules.Agent.InternetRelayClientView.Server #endregion - #region Implementation of IClientIPEndpoint - - public IPAddress EndPoint - { - get { return ((IPEndPoint) m_client.Client.RemoteEndPoint).Address; } - } - - #endregion - public void SendRebakeAvatarTextures(UUID textureID) { } From d6f54b25cd8e3d7a465e9875d2e00dd414a1b019 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 12 Jul 2012 23:48:42 +0100 Subject: [PATCH 536/547] Stop redundantly passing in the endpoint to the LLClientView constructor. This can always be retrieved via the LLUDPClient and is so done in various places already. --- OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs | 5 +---- OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs | 2 +- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs index bc5315b88c..73cdec30fb 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs @@ -357,7 +357,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP protected string m_lastName; protected Thread m_clientThread; protected Vector3 m_startpos; - protected EndPoint m_userEndPoint; protected UUID m_activeGroupID; protected string m_activeGroupName = String.Empty; protected ulong m_activeGroupPowers; @@ -442,7 +441,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP /// /// Constructor /// - public LLClientView(EndPoint remoteEP, Scene scene, LLUDPServer udpServer, LLUDPClient udpClient, AuthenticateResponse sessionInfo, + public LLClientView(Scene scene, LLUDPServer udpServer, LLUDPClient udpClient, AuthenticateResponse sessionInfo, UUID agentId, UUID sessionId, uint circuitCode) { // DebugPacketLevel = 1; @@ -466,7 +465,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP m_sessionId = sessionId; m_secureSessionId = sessionInfo.LoginInfo.SecureSession; m_circuitCode = circuitCode; - m_userEndPoint = remoteEP; m_firstName = sessionInfo.LoginInfo.First; m_lastName = sessionInfo.LoginInfo.Last; m_startpos = sessionInfo.LoginInfo.StartPos; @@ -11832,7 +11830,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP { ClientInfo info = m_udpClient.GetClientInfo(); - info.userEP = m_userEndPoint; info.proxyEP = null; info.agentcircuit = RequestClientInfo(); diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs index 468d5246ef..097f1098eb 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs @@ -1103,7 +1103,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP { LLUDPClient udpClient = new LLUDPClient(this, ThrottleRates, m_throttle, circuitCode, agentID, remoteEndPoint, m_defaultRTO, m_maxRTO); - client = new LLClientView(remoteEndPoint, m_scene, this, udpClient, sessionInfo, agentID, sessionID, circuitCode); + client = new LLClientView(m_scene, this, udpClient, sessionInfo, agentID, sessionID, circuitCode); client.OnLogout += LogoutHandler; ((LLClientView)client).DisableFacelights = m_disableFacelights; From 9ccb5787211f81c1c2059aa4b889f68cd460b539 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 13 Jul 2012 00:44:00 +0100 Subject: [PATCH 537/547] Don't cache regions data on the other unused LocalGridServiceConnector that the module code still sets up even if we're using one directly instantiated from the RemoteGridServiceConnector. Also improves log messages to indicate which regions are sending/receiving various neighbour protocol messages. --- .../Grid/LocalGridServiceConnector.cs | 35 +++++++++++-------- .../ServiceConnectorsOut/Grid/RegionCache.cs | 1 + .../LocalNeighbourServiceConnector.cs | 6 ++-- .../Scenes/SceneCommunicationService.cs | 22 +++++++++--- 4 files changed, 42 insertions(+), 22 deletions(-) diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/LocalGridServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/LocalGridServiceConnector.cs index 540f33a9c0..01be339685 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/LocalGridServiceConnector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/LocalGridServiceConnector.cs @@ -41,8 +41,7 @@ using OpenMetaverse; namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid { - public class LocalGridServicesConnector : - ISharedRegionModule, IGridService + public class LocalGridServicesConnector : ISharedRegionModule, IGridService { private static readonly ILog m_log = LogManager.GetLogger( @@ -51,7 +50,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid private IGridService m_GridService; private Dictionary m_LocalCache = new Dictionary(); - private bool m_Enabled = false; + private bool m_Enabled; public LocalGridServicesConnector() { @@ -59,7 +58,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid public LocalGridServicesConnector(IConfigSource source) { - m_log.Debug("[LOCAL GRID CONNECTOR]: LocalGridServicesConnector instantiated"); + m_log.Debug("[LOCAL GRID SERVICE CONNECTOR]: LocalGridServicesConnector instantiated directly."); InitialiseService(source); } @@ -84,8 +83,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid if (name == Name) { InitialiseService(source); - m_Enabled = true; - m_log.Info("[LOCAL GRID CONNECTOR]: Local grid connector enabled"); + m_log.Info("[LOCAL GRID SERVICE CONNECTOR]: Local grid connector enabled"); } } } @@ -95,7 +93,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid IConfig assetConfig = source.Configs["GridService"]; if (assetConfig == null) { - m_log.Error("[LOCAL GRID CONNECTOR]: GridService missing from OpenSim.ini"); + m_log.Error("[LOCAL GRID SERVICE CONNECTOR]: GridService missing from OpenSim.ini"); return; } @@ -104,7 +102,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid if (serviceDll == String.Empty) { - m_log.Error("[LOCAL GRID CONNECTOR]: No LocalServiceModule named in section GridService"); + m_log.Error("[LOCAL GRID SERVICE CONNECTOR]: No LocalServiceModule named in section GridService"); return; } @@ -115,16 +113,20 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid if (m_GridService == null) { - m_log.Error("[LOCAL GRID CONNECTOR]: Can't load grid service"); + m_log.Error("[LOCAL GRID SERVICE CONNECTOR]: Can't load grid service"); return; } + + m_Enabled = true; } public void PostInitialise() { + // FIXME: We will still add this command even if we aren't enabled since RemoteGridServiceConnector + // will have instantiated us directly. MainConsole.Instance.Commands.AddCommand("Regions", false, "show neighbours", "show neighbours", - "Shows the local regions' neighbours", NeighboursCommand); + "Shows the local regions' neighbours", HandleShowNeighboursCommand); } public void Close() @@ -133,17 +135,22 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid public void AddRegion(Scene scene) { - if (m_Enabled) - scene.RegisterModuleInterface(this); + if (!m_Enabled) + return; + + scene.RegisterModuleInterface(this); if (m_LocalCache.ContainsKey(scene.RegionInfo.RegionID)) - m_log.ErrorFormat("[LOCAL GRID CONNECTOR]: simulator seems to have more than one region with the same UUID. Please correct this!"); + m_log.ErrorFormat("[LOCAL GRID SERVICE CONNECTOR]: simulator seems to have more than one region with the same UUID. Please correct this!"); else m_LocalCache.Add(scene.RegionInfo.RegionID, new RegionCache(scene)); } public void RemoveRegion(Scene scene) { + if (!m_Enabled) + return; + m_LocalCache[scene.RegionInfo.RegionID].Clear(); m_LocalCache.Remove(scene.RegionInfo.RegionID); } @@ -232,7 +239,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid #endregion - public void NeighboursCommand(string module, string[] cmdparams) + public void HandleShowNeighboursCommand(string module, string[] cmdparams) { System.Text.StringBuilder caps = new System.Text.StringBuilder(); diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/RegionCache.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/RegionCache.cs index 9172536742..8d83fb64e7 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/RegionCache.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/RegionCache.cs @@ -55,6 +55,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid public RegionCache(Scene s) { + Util.PrintCallStack(); m_scene = s; m_scene.EventManager.OnRegionUp += OnRegionUp; } diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Neighbour/LocalNeighbourServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Neighbour/LocalNeighbourServiceConnector.cs index 40cc536916..7a90686839 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Neighbour/LocalNeighbourServiceConnector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Neighbour/LocalNeighbourServiceConnector.cs @@ -125,13 +125,13 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Neighbour uint x, y; Utils.LongToUInts(regionHandle, out x, out y); - m_log.DebugFormat("[NEIGHBOUR CONNECTOR]: HelloNeighbour from region {0} to region at {1}-{2}", - thisRegion.RegionName, x / Constants.RegionSize, y / Constants.RegionSize); - foreach (Scene s in m_Scenes) { if (s.RegionInfo.RegionHandle == regionHandle) { + m_log.DebugFormat("[LOCAL NEIGHBOUR SERVICE CONNECTOR]: HelloNeighbour from region {0} to neighbour {1} at {2}-{3}", + thisRegion.RegionName, s.Name, x / Constants.RegionSize, y / Constants.RegionSize); + //m_log.Debug("[NEIGHBOUR CONNECTOR]: Found region to SendHelloNeighbour"); return s.IncomingHelloNeighbour(thisRegion); } diff --git a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs index eff635b30f..661e03c9be 100644 --- a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs +++ b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs @@ -84,16 +84,23 @@ namespace OpenSim.Region.Framework.Scenes if (neighbourService != null) neighbour = neighbourService.HelloNeighbour(regionhandle, region); else - m_log.DebugFormat("[SCENE COMMUNICATION SERVICE]: No neighbour service provided for informing neigbhours of this region"); + m_log.DebugFormat( + "[SCENE COMMUNICATION SERVICE]: No neighbour service provided for region {0} to inform neigbhours of status", + m_scene.Name); if (neighbour != null) { - m_log.DebugFormat("[SCENE COMMUNICATION SERVICE]: Successfully informed neighbour {0}-{1} that I'm here", x / Constants.RegionSize, y / Constants.RegionSize); + m_log.DebugFormat( + "[SCENE COMMUNICATION SERVICE]: Region {0} successfully informed neighbour {1} at {2}-{3} that it is up", + m_scene.Name, neighbour.RegionName, x / Constants.RegionSize, y / Constants.RegionSize); + m_scene.EventManager.TriggerOnRegionUp(neighbour); } else { - m_log.InfoFormat("[SCENE COMMUNICATION SERVICE]: Failed to inform neighbour {0}-{1} that I'm here.", x / Constants.RegionSize, y / Constants.RegionSize); + m_log.WarnFormat( + "[SCENE COMMUNICATION SERVICE]: Region {0} failed to inform neighbour at {1}-{2} that it is up.", + x / Constants.RegionSize, y / Constants.RegionSize); } } @@ -101,8 +108,13 @@ namespace OpenSim.Region.Framework.Scenes { //m_log.Info("[INTER]: " + debugRegionName + ": SceneCommunicationService: Sending InterRegion Notification that region is up " + region.RegionName); - List neighbours = m_scene.GridService.GetNeighbours(m_scene.RegionInfo.ScopeID, m_scene.RegionInfo.RegionID); - m_log.DebugFormat("[SCENE COMMUNICATION SERVICE]: Informing {0} neighbours that this region is up", neighbours.Count); + List neighbours + = m_scene.GridService.GetNeighbours(m_scene.RegionInfo.ScopeID, m_scene.RegionInfo.RegionID); + + m_log.DebugFormat( + "[SCENE COMMUNICATION SERVICE]: Informing {0} neighbours that region {1} is up", + neighbours.Count, m_scene.Name); + foreach (GridRegion n in neighbours) { InformNeighbourThatRegionUpDelegate d = InformNeighboursThatRegionIsUpAsync; From 884d603cac6c3fe0cdbd199e13e1514146ff82bc Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 13 Jul 2012 01:03:28 +0100 Subject: [PATCH 538/547] Rather than instantiating a UTF8 encoding everywhere when we want to supress the BOM, use a single Util.UTF8NoBomEncoding. This class is thread-safe (as evidenced by the provision of the system-wide Encoding.UTF8 which does not suppress BOM on output). --- OpenSim/Capabilities/LLSDStreamHandler.cs | 4 +- .../Serialization/TarArchiveWriter.cs | 4 +- OpenSim/Framework/Util.cs | 1 + .../Grid/LocalGridServiceConnector.cs | 2 +- .../Shared/Instance/ScriptInstance.cs | 2 +- .../AuthenticationServerPostHandler.cs | 3 +- .../Avatar/AvatarServerPostHandler.cs | 3 +- .../Friends/FriendsServerPostHandler.cs | 5 +- .../Handlers/Grid/GridServerPostHandler.cs | 42 ++++++++--------- .../GridUser/GridUserServerPostHandler.cs | 13 ++--- .../Hypergrid/HGFriendsServerPostHandler.cs | 6 +-- .../Inventory/XInventoryInConnector.cs | 47 +++++++++---------- .../Presence/PresenceServerPostHandler.cs | 9 ++-- .../UserAccountServerPostHandler.cs | 9 ++-- .../Neighbour/NeighbourServicesConnector.cs | 3 +- 15 files changed, 68 insertions(+), 85 deletions(-) diff --git a/OpenSim/Capabilities/LLSDStreamHandler.cs b/OpenSim/Capabilities/LLSDStreamHandler.cs index f5c728ce91..5df24b2cc1 100644 --- a/OpenSim/Capabilities/LLSDStreamHandler.cs +++ b/OpenSim/Capabilities/LLSDStreamHandler.cs @@ -66,9 +66,7 @@ namespace OpenSim.Framework.Capabilities TResponse response = m_method(llsdRequest); - Encoding encoding = new UTF8Encoding(false); - - return encoding.GetBytes(LLSDHelpers.SerialiseLLSDReply(response)); + return Util.UTF8NoBomEncoding.GetBytes(LLSDHelpers.SerialiseLLSDReply(response)); } } } diff --git a/OpenSim/Framework/Serialization/TarArchiveWriter.cs b/OpenSim/Framework/Serialization/TarArchiveWriter.cs index 122fa8e39a..2a3bc4805d 100644 --- a/OpenSim/Framework/Serialization/TarArchiveWriter.cs +++ b/OpenSim/Framework/Serialization/TarArchiveWriter.cs @@ -41,8 +41,6 @@ namespace OpenSim.Framework.Serialization { // private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - protected static UTF8Encoding m_utf8Encoding = new UTF8Encoding(); - /// /// Binary writer for the underlying stream /// @@ -73,7 +71,7 @@ namespace OpenSim.Framework.Serialization /// public void WriteFile(string filePath, string data) { - WriteFile(filePath, m_utf8Encoding.GetBytes(data)); + WriteFile(filePath, Util.UTF8NoBomEncoding.GetBytes(data)); } /// diff --git a/OpenSim/Framework/Util.cs b/OpenSim/Framework/Util.cs index fd9586ca21..8cc29eed36 100644 --- a/OpenSim/Framework/Util.cs +++ b/OpenSim/Framework/Util.cs @@ -148,6 +148,7 @@ namespace OpenSim.Framework } public static Encoding UTF8 = Encoding.UTF8; + public static Encoding UTF8NoBomEncoding = new UTF8Encoding(false); /// /// Well known UUID for the blank texture used in the Linden SL viewer version 1.20 (and hopefully onwards) diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/LocalGridServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/LocalGridServiceConnector.cs index 01be339685..3c6e38127f 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/LocalGridServiceConnector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/LocalGridServiceConnector.cs @@ -150,7 +150,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid { if (!m_Enabled) return; - + m_LocalCache[scene.RegionInfo.RegionID].Clear(); m_LocalCache.Remove(scene.RegionInfo.RegionID); } diff --git a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs index 1c0cac78a0..f1abd4b746 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs @@ -952,7 +952,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance try { FileStream fs = File.Create(Path.Combine(Path.GetDirectoryName(assembly), ItemID.ToString() + ".state")); - Byte[] buf = (new UTF8Encoding()).GetBytes(xml); + Byte[] buf = Util.UTF8NoBomEncoding.GetBytes(xml); fs.Write(buf, 0, buf.Length); fs.Close(); } diff --git a/OpenSim/Server/Handlers/Authentication/AuthenticationServerPostHandler.cs b/OpenSim/Server/Handlers/Authentication/AuthenticationServerPostHandler.cs index a19b5993bf..6b93cd9035 100644 --- a/OpenSim/Server/Handlers/Authentication/AuthenticationServerPostHandler.cs +++ b/OpenSim/Server/Handlers/Authentication/AuthenticationServerPostHandler.cs @@ -321,8 +321,7 @@ namespace OpenSim.Server.Handlers.Authentication private byte[] ResultToBytes(Dictionary result) { string xmlString = ServerUtils.BuildXmlResponse(result); - UTF8Encoding encoding = new UTF8Encoding(); - return encoding.GetBytes(xmlString); + return Util.UTF8NoBomEncoding.GetBytes(xmlString); } } } diff --git a/OpenSim/Server/Handlers/Avatar/AvatarServerPostHandler.cs b/OpenSim/Server/Handlers/Avatar/AvatarServerPostHandler.cs index 3ee405c509..393584e932 100644 --- a/OpenSim/Server/Handlers/Avatar/AvatarServerPostHandler.cs +++ b/OpenSim/Server/Handlers/Avatar/AvatarServerPostHandler.cs @@ -121,8 +121,7 @@ namespace OpenSim.Server.Handlers.Avatar string xmlString = ServerUtils.BuildXmlResponse(result); - UTF8Encoding encoding = new UTF8Encoding(); - return encoding.GetBytes(xmlString); + return Util.UTF8NoBomEncoding.GetBytes(xmlString); } return FailureResult(); diff --git a/OpenSim/Server/Handlers/Friends/FriendsServerPostHandler.cs b/OpenSim/Server/Handlers/Friends/FriendsServerPostHandler.cs index ef9b96fa54..47a85581af 100644 --- a/OpenSim/Server/Handlers/Friends/FriendsServerPostHandler.cs +++ b/OpenSim/Server/Handlers/Friends/FriendsServerPostHandler.cs @@ -152,10 +152,9 @@ namespace OpenSim.Server.Handlers.Friends } string xmlString = ServerUtils.BuildXmlResponse(result); - //m_log.DebugFormat("[FRIENDS HANDLER]: resp string: {0}", xmlString); - UTF8Encoding encoding = new UTF8Encoding(); - return encoding.GetBytes(xmlString); + //m_log.DebugFormat("[FRIENDS HANDLER]: resp string: {0}", xmlString); + return Util.UTF8NoBomEncoding.GetBytes(xmlString); } byte[] StoreFriend(Dictionary request) diff --git a/OpenSim/Server/Handlers/Grid/GridServerPostHandler.cs b/OpenSim/Server/Handlers/Grid/GridServerPostHandler.cs index 91d14cbeab..ef5f33e173 100644 --- a/OpenSim/Server/Handlers/Grid/GridServerPostHandler.cs +++ b/OpenSim/Server/Handlers/Grid/GridServerPostHandler.cs @@ -226,10 +226,9 @@ namespace OpenSim.Server.Handlers.Grid } string xmlString = ServerUtils.BuildXmlResponse(result); - //m_log.DebugFormat("[GRID HANDLER]: resp string: {0}", xmlString); - UTF8Encoding encoding = new UTF8Encoding(); - return encoding.GetBytes(xmlString); + //m_log.DebugFormat("[GRID HANDLER]: resp string: {0}", xmlString); + return Util.UTF8NoBomEncoding.GetBytes(xmlString); } byte[] GetRegionByUUID(Dictionary request) @@ -256,9 +255,9 @@ namespace OpenSim.Server.Handlers.Grid result["result"] = rinfo.ToKeyValuePairs(); string xmlString = ServerUtils.BuildXmlResponse(result); + //m_log.DebugFormat("[GRID HANDLER]: resp string: {0}", xmlString); - UTF8Encoding encoding = new UTF8Encoding(); - return encoding.GetBytes(xmlString); + return Util.UTF8NoBomEncoding.GetBytes(xmlString); } byte[] GetRegionByPosition(Dictionary request) @@ -289,9 +288,9 @@ namespace OpenSim.Server.Handlers.Grid result["result"] = rinfo.ToKeyValuePairs(); string xmlString = ServerUtils.BuildXmlResponse(result); + //m_log.DebugFormat("[GRID HANDLER]: resp string: {0}", xmlString); - UTF8Encoding encoding = new UTF8Encoding(); - return encoding.GetBytes(xmlString); + return Util.UTF8NoBomEncoding.GetBytes(xmlString); } byte[] GetRegionByName(Dictionary request) @@ -318,9 +317,9 @@ namespace OpenSim.Server.Handlers.Grid result["result"] = rinfo.ToKeyValuePairs(); string xmlString = ServerUtils.BuildXmlResponse(result); + //m_log.DebugFormat("[GRID HANDLER]: resp string: {0}", xmlString); - UTF8Encoding encoding = new UTF8Encoding(); - return encoding.GetBytes(xmlString); + return Util.UTF8NoBomEncoding.GetBytes(xmlString); } byte[] GetRegionsByName(Dictionary request) @@ -361,9 +360,9 @@ namespace OpenSim.Server.Handlers.Grid } string xmlString = ServerUtils.BuildXmlResponse(result); + //m_log.DebugFormat("[GRID HANDLER]: resp string: {0}", xmlString); - UTF8Encoding encoding = new UTF8Encoding(); - return encoding.GetBytes(xmlString); + return Util.UTF8NoBomEncoding.GetBytes(xmlString); } byte[] GetRegionRange(Dictionary request) @@ -410,9 +409,9 @@ namespace OpenSim.Server.Handlers.Grid } } string xmlString = ServerUtils.BuildXmlResponse(result); + //m_log.DebugFormat("[GRID HANDLER]: resp string: {0}", xmlString); - UTF8Encoding encoding = new UTF8Encoding(); - return encoding.GetBytes(xmlString); + return Util.UTF8NoBomEncoding.GetBytes(xmlString); } byte[] GetDefaultRegions(Dictionary request) @@ -440,9 +439,9 @@ namespace OpenSim.Server.Handlers.Grid } } string xmlString = ServerUtils.BuildXmlResponse(result); + //m_log.DebugFormat("[GRID HANDLER]: resp string: {0}", xmlString); - UTF8Encoding encoding = new UTF8Encoding(); - return encoding.GetBytes(xmlString); + return Util.UTF8NoBomEncoding.GetBytes(xmlString); } byte[] GetFallbackRegions(Dictionary request) @@ -481,9 +480,9 @@ namespace OpenSim.Server.Handlers.Grid } } string xmlString = ServerUtils.BuildXmlResponse(result); + //m_log.DebugFormat("[GRID HANDLER]: resp string: {0}", xmlString); - UTF8Encoding encoding = new UTF8Encoding(); - return encoding.GetBytes(xmlString); + return Util.UTF8NoBomEncoding.GetBytes(xmlString); } byte[] GetHyperlinks(Dictionary request) @@ -511,9 +510,9 @@ namespace OpenSim.Server.Handlers.Grid } } string xmlString = ServerUtils.BuildXmlResponse(result); + //m_log.DebugFormat("[GRID HANDLER]: resp string: {0}", xmlString); - UTF8Encoding encoding = new UTF8Encoding(); - return encoding.GetBytes(xmlString); + return Util.UTF8NoBomEncoding.GetBytes(xmlString); } byte[] GetRegionFlags(Dictionary request) @@ -537,12 +536,11 @@ namespace OpenSim.Server.Handlers.Grid result["result"] = flags.ToString(); string xmlString = ServerUtils.BuildXmlResponse(result); + //m_log.DebugFormat("[GRID HANDLER]: resp string: {0}", xmlString); - UTF8Encoding encoding = new UTF8Encoding(); - return encoding.GetBytes(xmlString); + return Util.UTF8NoBomEncoding.GetBytes(xmlString); } - #endregion #region Misc diff --git a/OpenSim/Server/Handlers/GridUser/GridUserServerPostHandler.cs b/OpenSim/Server/Handlers/GridUser/GridUserServerPostHandler.cs index bf212554c7..687cf8ddb1 100644 --- a/OpenSim/Server/Handlers/GridUser/GridUserServerPostHandler.cs +++ b/OpenSim/Server/Handlers/GridUser/GridUserServerPostHandler.cs @@ -117,10 +117,9 @@ namespace OpenSim.Server.Handlers.GridUser result["result"] = guinfo.ToKeyValuePairs(); string xmlString = ServerUtils.BuildXmlResponse(result); - //m_log.DebugFormat("[GRID USER HANDLER]: resp string: {0}", xmlString); - UTF8Encoding encoding = new UTF8Encoding(); - return encoding.GetBytes(xmlString); + //m_log.DebugFormat("[GRID USER HANDLER]: resp string: {0}", xmlString); + return Util.UTF8NoBomEncoding.GetBytes(xmlString); } byte[] LoggedOut(Dictionary request) @@ -189,10 +188,9 @@ namespace OpenSim.Server.Handlers.GridUser result["result"] = guinfo.ToKeyValuePairs(); string xmlString = ServerUtils.BuildXmlResponse(result); - //m_log.DebugFormat("[GRID USER HANDLER]: resp string: {0}", xmlString); - UTF8Encoding encoding = new UTF8Encoding(); - return encoding.GetBytes(xmlString); + //m_log.DebugFormat("[GRID USER HANDLER]: resp string: {0}", xmlString); + return Util.UTF8NoBomEncoding.GetBytes(xmlString); } byte[] GetGridUserInfos(Dictionary request) @@ -231,8 +229,7 @@ namespace OpenSim.Server.Handlers.GridUser } string xmlString = ServerUtils.BuildXmlResponse(result); - UTF8Encoding encoding = new UTF8Encoding(); - return encoding.GetBytes(xmlString); + return Util.UTF8NoBomEncoding.GetBytes(xmlString); } private bool UnpackArgs(Dictionary request, out string user, out UUID region, out Vector3 position, out Vector3 lookAt) diff --git a/OpenSim/Server/Handlers/Hypergrid/HGFriendsServerPostHandler.cs b/OpenSim/Server/Handlers/Hypergrid/HGFriendsServerPostHandler.cs index c2f127c213..0aa272973f 100644 --- a/OpenSim/Server/Handlers/Hypergrid/HGFriendsServerPostHandler.cs +++ b/OpenSim/Server/Handlers/Hypergrid/HGFriendsServerPostHandler.cs @@ -279,13 +279,11 @@ namespace OpenSim.Server.Handlers.Hypergrid } string xmlString = ServerUtils.BuildXmlResponse(result); + //m_log.DebugFormat("[GRID HANDLER]: resp string: {0}", xmlString); - UTF8Encoding encoding = new UTF8Encoding(); - return encoding.GetBytes(xmlString); - + return Util.UTF8NoBomEncoding.GetBytes(xmlString); } - #endregion #region Misc diff --git a/OpenSim/Server/Handlers/Inventory/XInventoryInConnector.cs b/OpenSim/Server/Handlers/Inventory/XInventoryInConnector.cs index cb9b65da77..64127c20af 100644 --- a/OpenSim/Server/Handlers/Inventory/XInventoryInConnector.cs +++ b/OpenSim/Server/Handlers/Inventory/XInventoryInConnector.cs @@ -217,9 +217,9 @@ namespace OpenSim.Server.Handlers.Asset result["RESULT"] = "False"; string xmlString = ServerUtils.BuildXmlResponse(result); + //m_log.DebugFormat("[XXX]: resp string: {0}", xmlString); - UTF8Encoding encoding = new UTF8Encoding(); - return encoding.GetBytes(xmlString); + return Util.UTF8NoBomEncoding.GetBytes(xmlString); } byte[] HandleGetInventorySkeleton(Dictionary request) @@ -245,9 +245,9 @@ namespace OpenSim.Server.Handlers.Asset result["FOLDERS"] = sfolders; string xmlString = ServerUtils.BuildXmlResponse(result); + //m_log.DebugFormat("[XXX]: resp string: {0}", xmlString); - UTF8Encoding encoding = new UTF8Encoding(); - return encoding.GetBytes(xmlString); + return Util.UTF8NoBomEncoding.GetBytes(xmlString); } byte[] HandleGetUserInventory(Dictionary request) @@ -284,9 +284,9 @@ namespace OpenSim.Server.Handlers.Asset } string xmlString = ServerUtils.BuildXmlResponse(result); + //m_log.DebugFormat("[XXX]: resp string: {0}", xmlString); - UTF8Encoding encoding = new UTF8Encoding(); - return encoding.GetBytes(xmlString); + return Util.UTF8NoBomEncoding.GetBytes(xmlString); } byte[] HandleGetRootFolder(Dictionary request) @@ -300,9 +300,9 @@ namespace OpenSim.Server.Handlers.Asset result["folder"] = EncodeFolder(rfolder); string xmlString = ServerUtils.BuildXmlResponse(result); + //m_log.DebugFormat("[XXX]: resp string: {0}", xmlString); - UTF8Encoding encoding = new UTF8Encoding(); - return encoding.GetBytes(xmlString); + return Util.UTF8NoBomEncoding.GetBytes(xmlString); } byte[] HandleGetFolderForType(Dictionary request) @@ -317,9 +317,9 @@ namespace OpenSim.Server.Handlers.Asset result["folder"] = EncodeFolder(folder); string xmlString = ServerUtils.BuildXmlResponse(result); + //m_log.DebugFormat("[XXX]: resp string: {0}", xmlString); - UTF8Encoding encoding = new UTF8Encoding(); - return encoding.GetBytes(xmlString); + return Util.UTF8NoBomEncoding.GetBytes(xmlString); } byte[] HandleGetFolderContent(Dictionary request) @@ -358,9 +358,9 @@ namespace OpenSim.Server.Handlers.Asset } string xmlString = ServerUtils.BuildXmlResponse(result); + //m_log.DebugFormat("[XXX]: resp string: {0}", xmlString); - UTF8Encoding encoding = new UTF8Encoding(); - return encoding.GetBytes(xmlString); + return Util.UTF8NoBomEncoding.GetBytes(xmlString); } byte[] HandleGetFolderItems(Dictionary request) @@ -386,9 +386,9 @@ namespace OpenSim.Server.Handlers.Asset result["ITEMS"] = sitems; string xmlString = ServerUtils.BuildXmlResponse(result); + //m_log.DebugFormat("[XXX]: resp string: {0}", xmlString); - UTF8Encoding encoding = new UTF8Encoding(); - return encoding.GetBytes(xmlString); + return Util.UTF8NoBomEncoding.GetBytes(xmlString); } byte[] HandleAddFolder(Dictionary request) @@ -550,9 +550,9 @@ namespace OpenSim.Server.Handlers.Asset result["item"] = EncodeItem(item); string xmlString = ServerUtils.BuildXmlResponse(result); + //m_log.DebugFormat("[XXX]: resp string: {0}", xmlString); - UTF8Encoding encoding = new UTF8Encoding(); - return encoding.GetBytes(xmlString); + return Util.UTF8NoBomEncoding.GetBytes(xmlString); } byte[] HandleGetFolder(Dictionary request) @@ -567,9 +567,9 @@ namespace OpenSim.Server.Handlers.Asset result["folder"] = EncodeFolder(folder); string xmlString = ServerUtils.BuildXmlResponse(result); + //m_log.DebugFormat("[XXX]: resp string: {0}", xmlString); - UTF8Encoding encoding = new UTF8Encoding(); - return encoding.GetBytes(xmlString); + return Util.UTF8NoBomEncoding.GetBytes(xmlString); } byte[] HandleGetActiveGestures(Dictionary request) @@ -592,9 +592,9 @@ namespace OpenSim.Server.Handlers.Asset result["ITEMS"] = items; string xmlString = ServerUtils.BuildXmlResponse(result); + //m_log.DebugFormat("[XXX]: resp string: {0}", xmlString); - UTF8Encoding encoding = new UTF8Encoding(); - return encoding.GetBytes(xmlString); + return Util.UTF8NoBomEncoding.GetBytes(xmlString); } byte[] HandleGetAssetPermissions(Dictionary request) @@ -609,11 +609,10 @@ namespace OpenSim.Server.Handlers.Asset result["RESULT"] = perms.ToString(); string xmlString = ServerUtils.BuildXmlResponse(result); - //m_log.DebugFormat("[XXX]: resp string: {0}", xmlString); - UTF8Encoding encoding = new UTF8Encoding(); - return encoding.GetBytes(xmlString); - } + //m_log.DebugFormat("[XXX]: resp string: {0}", xmlString); + return Util.UTF8NoBomEncoding.GetBytes(xmlString); + } private Dictionary EncodeFolder(InventoryFolderBase f) { diff --git a/OpenSim/Server/Handlers/Presence/PresenceServerPostHandler.cs b/OpenSim/Server/Handlers/Presence/PresenceServerPostHandler.cs index 6b6a552448..2d67c6db0c 100644 --- a/OpenSim/Server/Handlers/Presence/PresenceServerPostHandler.cs +++ b/OpenSim/Server/Handlers/Presence/PresenceServerPostHandler.cs @@ -199,9 +199,9 @@ namespace OpenSim.Server.Handlers.Presence result["result"] = pinfo.ToKeyValuePairs(); string xmlString = ServerUtils.BuildXmlResponse(result); + //m_log.DebugFormat("[GRID HANDLER]: resp string: {0}", xmlString); - UTF8Encoding encoding = new UTF8Encoding(); - return encoding.GetBytes(xmlString); + return Util.UTF8NoBomEncoding.GetBytes(xmlString); } byte[] GetAgents(Dictionary request) @@ -240,12 +240,11 @@ namespace OpenSim.Server.Handlers.Presence } string xmlString = ServerUtils.BuildXmlResponse(result); + //m_log.DebugFormat("[GRID HANDLER]: resp string: {0}", xmlString); - UTF8Encoding encoding = new UTF8Encoding(); - return encoding.GetBytes(xmlString); + return Util.UTF8NoBomEncoding.GetBytes(xmlString); } - private byte[] SuccessResult() { XmlDocument doc = new XmlDocument(); diff --git a/OpenSim/Server/Handlers/UserAccounts/UserAccountServerPostHandler.cs b/OpenSim/Server/Handlers/UserAccounts/UserAccountServerPostHandler.cs index 3fd69aed50..72551ef404 100644 --- a/OpenSim/Server/Handlers/UserAccounts/UserAccountServerPostHandler.cs +++ b/OpenSim/Server/Handlers/UserAccounts/UserAccountServerPostHandler.cs @@ -195,9 +195,9 @@ namespace OpenSim.Server.Handlers.UserAccounts } string xmlString = ServerUtils.BuildXmlResponse(result); + //m_log.DebugFormat("[GRID HANDLER]: resp string: {0}", xmlString); - UTF8Encoding encoding = new UTF8Encoding(); - return encoding.GetBytes(xmlString); + return Util.UTF8NoBomEncoding.GetBytes(xmlString); } byte[] StoreAccount(Dictionary request) @@ -353,8 +353,7 @@ namespace OpenSim.Server.Handlers.UserAccounts private byte[] ResultToBytes(Dictionary result) { string xmlString = ServerUtils.BuildXmlResponse(result); - UTF8Encoding encoding = new UTF8Encoding(); - return encoding.GetBytes(xmlString); + return Util.UTF8NoBomEncoding.GetBytes(xmlString); } } -} +} \ No newline at end of file diff --git a/OpenSim/Services/Connectors/Neighbour/NeighbourServicesConnector.cs b/OpenSim/Services/Connectors/Neighbour/NeighbourServicesConnector.cs index 888b072013..7429293c3c 100644 --- a/OpenSim/Services/Connectors/Neighbour/NeighbourServicesConnector.cs +++ b/OpenSim/Services/Connectors/Neighbour/NeighbourServicesConnector.cs @@ -132,8 +132,7 @@ namespace OpenSim.Services.Connectors try { strBuffer = OSDParser.SerializeJsonString(args); - UTF8Encoding str = new UTF8Encoding(); - buffer = str.GetBytes(strBuffer); + buffer = Util.UTF8NoBomEncoding.GetBytes(strBuffer); } catch (Exception e) { From 2954ceccae906927932df6cedeb6c75479d0fe5c Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 13 Jul 2012 01:08:49 +0100 Subject: [PATCH 539/547] Remove a callstack print out I accidentally left in 2 commits ago in 9ccb578 --- .../Region/CoreModules/ServiceConnectorsOut/Grid/RegionCache.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/RegionCache.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/RegionCache.cs index 8d83fb64e7..9172536742 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/RegionCache.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/RegionCache.cs @@ -55,7 +55,6 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid public RegionCache(Scene s) { - Util.PrintCallStack(); m_scene = s; m_scene.EventManager.OnRegionUp += OnRegionUp; } From ec6a195e40ad570a6e812c952f0505e76e7323d1 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Sat, 14 Jul 2012 01:11:30 +0100 Subject: [PATCH 540/547] When generating a Warp3D texture, set the detailTexture[i] variable on resize from the JPEG2000 original rather than only saving it to disk. This appears to be the cause of the warp 3d exception seen when starting a new region for the first time. Subsequent starts were okay because resized saved bitmap was correctly retrieved from disk. Should fix http://opensimulator.org/mantis/view.php?id=5204 and http://opensimulator.org/mantis/view.php?id=5272 --- .../World/Warp3DMap/TerrainSplat.cs | 21 ++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/OpenSim/Region/CoreModules/World/Warp3DMap/TerrainSplat.cs b/OpenSim/Region/CoreModules/World/Warp3DMap/TerrainSplat.cs index 91252f7396..df5ac92bb4 100644 --- a/OpenSim/Region/CoreModules/World/Warp3DMap/TerrainSplat.cs +++ b/OpenSim/Region/CoreModules/World/Warp3DMap/TerrainSplat.cs @@ -111,6 +111,9 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap asset = assetService.GetCached(cacheID.ToString()); if (asset != null) { +// m_log.DebugFormat( +// "[TERRAIN SPLAT]: Got asset service cached terrain texture {0} {1}", i, asset.ID); + try { using (System.IO.MemoryStream stream = new System.IO.MemoryStream(asset.Data)) @@ -129,6 +132,9 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap asset = assetService.Get(textureIDs[i].ToString()); if (asset != null) { +// m_log.DebugFormat( +// "[TERRAIN SPLAT]: Got cached original JPEG2000 terrain texture {0} {1}", i, asset.ID); + try { detailTexture[i] = (Bitmap)CSJ2K.J2kImage.FromBytes(asset.Data); } catch (Exception ex) { @@ -137,15 +143,13 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap } if (detailTexture[i] != null) - { - Bitmap bitmap = detailTexture[i]; - + { // Make sure this texture is the correct size, otherwise resize - if (bitmap.Width != 256 || bitmap.Height != 256) + if (detailTexture[i].Width != 256 || detailTexture[i].Height != 256) { - using (Bitmap origBitmap = bitmap) + using (Bitmap origBitmap = detailTexture[i]) { - bitmap = ImageUtils.ResizeImage(origBitmap, 256, 256); + detailTexture[i] = ImageUtils.ResizeImage(origBitmap, 256, 256); } } @@ -153,7 +157,7 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap byte[] data; using (System.IO.MemoryStream stream = new System.IO.MemoryStream()) { - bitmap.Save(stream, ImageFormat.Png); + detailTexture[i].Save(stream, ImageFormat.Png); data = stream.ToArray(); } @@ -185,6 +189,9 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap { if (detailTexture[i] == null) { +// m_log.DebugFormat( +// "[TERRAIN SPLAT]: Generating solid colour for missing texture {0}", i); + // Create a solid color texture for this layer detailTexture[i] = new Bitmap(256, 256, PixelFormat.Format24bppRgb); using (Graphics gfx = Graphics.FromImage(detailTexture[i])) From 8d59385eeaa26feab8b19905ad6491065e4e4bf9 Mon Sep 17 00:00:00 2001 From: SignpostMarv Date: Thu, 12 Jul 2012 12:25:08 +0100 Subject: [PATCH 541/547] Implementation of llSetRegionPos(). Does not implement failure on object entry/prim limit/access restrictions. Signed-off-by: SignpostMarv --- .../Shared/Api/Implementation/LSL_Api.cs | 43 +++++++++++++++++-- .../Shared/Api/Interface/ILSL_Api.cs | 1 + .../Shared/Api/Runtime/LSL_Stub.cs | 5 +++ 3 files changed, 45 insertions(+), 4 deletions(-) diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index 0ebcd8dbe6..b209e23a23 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -1917,11 +1917,40 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api { m_host.AddScriptLPS(1); - SetPos(m_host, pos); + SetPos(m_host, pos, true); ScriptSleep(200); } + /// + /// Tries to move the entire object so that the root prim is within 0.1m of position. http://wiki.secondlife.com/wiki/LlSetRegionPos + /// Documentation indicates that the use of x/y coordinates up to 10 meters outside the bounds of a region will work but do not specify what happens if there is no adjacent region for the object to move into. + /// Uses the RegionSize constant here rather than hard-coding 266.0 to alert any developer modifying OpenSim to support variable-sized regions that this method will need tweaking. + /// + /// + /// 1 if successful, 0 otherwise. + public LSL_Integer llSetRegionPos(LSL_Vector pos) + { + m_host.AddScriptLPS(1); + if ( + llGetStatus((int)PrimFlags.Physics) == 1 || // return FALSE if physical. + m_host.ParentGroup.IsAttachment || // return FALSE if attachment + ( + pos.x < -10.0 || // return FALSE if more than 10 meters into a west-adjacent region. + pos.x > (Constants.RegionSize + 10) || // return FALSE if more than 10 meters into a east-adjacent region. + pos.y < -10.0 || // return FALSE if more than 10 meters into a south-adjacent region. + pos.y > (Constants.RegionSize + 10) || // return FALSE if more than 10 meters into a north-adjacent region. + pos.z > 4096 // return FALSE if altitude than 4096m + ) + ){ + return 0; + } + + SetPos(m_host.ParentGroup.RootPart, pos, false); + + return llVecDist(pos, llGetRootPosition()) <= 0.1 ? 1 : 0; + } + // Capped movemment if distance > 10m (http://wiki.secondlife.com/wiki/LlSetPos) // note linked setpos is capped "differently" private LSL_Vector SetPosAdjust(LSL_Vector start, LSL_Vector end) @@ -1953,7 +1982,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api return real_vec; } - protected void SetPos(SceneObjectPart part, LSL_Vector targetPos) + /// + /// set object position, optionally capping the distance. + /// + /// + /// + /// if TRUE, will cap the distance to 10m. + protected void SetPos(SceneObjectPart part, LSL_Vector targetPos, bool adjust) { // Capped movemment if distance > 10m (http://wiki.secondlife.com/wiki/LlSetPos) LSL_Vector currentPos = GetPartLocalPos(part); @@ -1966,12 +2001,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api if ((targetPos.z < ground) && disable_underground_movement && m_host.ParentGroup.AttachmentPoint == 0) targetPos.z = ground; SceneObjectGroup parent = part.ParentGroup; - LSL_Vector real_vec = SetPosAdjust(currentPos, targetPos); + LSL_Vector real_vec = !adjust ? targetPos : SetPosAdjust(currentPos, targetPos); parent.UpdateGroupPosition(new Vector3((float)real_vec.x, (float)real_vec.y, (float)real_vec.z)); } else { - LSL_Vector rel_vec = SetPosAdjust(currentPos, targetPos); + LSL_Vector rel_vec = !adjust ? targetPos : SetPosAdjust(currentPos, targetPos); part.OffsetPosition = new Vector3((float)rel_vec.x, (float)rel_vec.y, (float)rel_vec.z); SceneObjectGroup parent = part.ParentGroup; parent.HasGroupChanged = true; diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs index d39b20454c..3fb463b766 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs @@ -359,6 +359,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces void llSetPrimitiveParams(LSL_List rules); void llSetLinkPrimitiveParamsFast(int linknum, LSL_List rules); void llSetPrimURL(string url); + LSL_Integer llSetRegionPos(LSL_Vector pos); void llSetRemoteScriptAccessPin(int pin); void llSetRot(LSL_Rotation rot); void llSetScale(LSL_Vector scale); diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs index a0b3bc8d4c..c4578804c2 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs @@ -1618,6 +1618,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase m_LSL_Functions.llSetPrimURL(url); } + public LSL_Integer llSetRegionPos(LSL_Vector pos) + { + return m_LSL_Functions.llSetRegionPos(pos); + } + public void llSetRemoteScriptAccessPin(int pin) { m_LSL_Functions.llSetRemoteScriptAccessPin(pin); From b6cd3b625ebffb45febf922a941fae337e3c1652 Mon Sep 17 00:00:00 2001 From: SignpostMarv Date: Thu, 12 Jul 2012 15:57:22 +0100 Subject: [PATCH 542/547] adding workaround for silent failure if position is outside the bounds of a region, implementing parcel prim count check. Signed-off-by: SignpostMarv --- .../Shared/Api/Implementation/LSL_Api.cs | 54 ++++++++++++++----- 1 file changed, 41 insertions(+), 13 deletions(-) diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index b209e23a23..81632677a4 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -1932,23 +1932,51 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public LSL_Integer llSetRegionPos(LSL_Vector pos) { m_host.AddScriptLPS(1); - if ( - llGetStatus((int)PrimFlags.Physics) == 1 || // return FALSE if physical. - m_host.ParentGroup.IsAttachment || // return FALSE if attachment - ( - pos.x < -10.0 || // return FALSE if more than 10 meters into a west-adjacent region. - pos.x > (Constants.RegionSize + 10) || // return FALSE if more than 10 meters into a east-adjacent region. - pos.y < -10.0 || // return FALSE if more than 10 meters into a south-adjacent region. - pos.y > (Constants.RegionSize + 10) || // return FALSE if more than 10 meters into a north-adjacent region. - pos.z > 4096 // return FALSE if altitude than 4096m - ) - ){ + + // BEGIN WORKAROUND + // IF YOU GET REGION CROSSINGS WORKING WITH THIS FUNCTION, REPLACE THE WORKAROUND. + // + // This workaround is to prevent silent failure of this function. + // According to the specification on the SL Wiki, providing a position outside of the + if (pos.x < 0 || pos.x > Constants.RegionSize || pos.y < 0 || pos.y > Constants.RegionSize) + { return 0; } + // END WORK AROUND + else{ + LSL_List parcelID = new LSL_List(ScriptBaseClass.PARCEL_DETAILS_ID); + Vector3 objectPos = m_host.ParentGroup.RootPart.AbsolutePosition; + bool sameParcel = + llGetParcelDetails(new LSL_Vector(pos.x, pos.y, pos.z), parcelID).Data[0] == + llGetParcelDetails(pos, parcelID).Data[0] + ; + if ( + llGetStatus((int)PrimFlags.Physics) == 1 || // return FALSE if physical. + m_host.ParentGroup.IsAttachment || // return FALSE if attachment + ( + pos.x < -10.0 || // return FALSE if more than 10 meters into a west-adjacent region. + pos.x > (Constants.RegionSize + 10) || // return FALSE if more than 10 meters into a east-adjacent region. + pos.y < -10.0 || // return FALSE if more than 10 meters into a south-adjacent region. + pos.y > (Constants.RegionSize + 10) || // return FALSE if more than 10 meters into a north-adjacent region. + pos.z > 4096 // return FALSE if altitude than 4096m + ) || + // BEGIN RELIANCE ON WORK AROUND + // this check will only work if pos is within the region bounds. + ( + !sameParcel && // if it's moving within the same parcel we do not need to check if the destination parcel will exceed capacity if the object is moved. + (llGetParcelPrimCount(pos, ScriptBaseClass.PARCEL_COUNT_TOTAL, 0) + m_host.ParentGroup.PrimCount) > llGetParcelMaxPrims(pos, 0) + ) + // END RELIANCE ON WORK-AROUND + ){ + return 0; + } - SetPos(m_host.ParentGroup.RootPart, pos, false); + SetPos(m_host.ParentGroup.RootPart, pos, false); - return llVecDist(pos, llGetRootPosition()) <= 0.1 ? 1 : 0; + return llVecDist(pos, llGetRootPosition()) <= 0.1 ? 1 : 0; + } + + return 0; } // Capped movemment if distance > 10m (http://wiki.secondlife.com/wiki/LlSetPos) From e3453dd9ca1d08664a38205f05340623118a9880 Mon Sep 17 00:00:00 2001 From: SignpostMarv Date: Thu, 12 Jul 2012 17:22:43 +0100 Subject: [PATCH 543/547] added in some extra variables, it sometimes thinks it is on the same parcel :( Signed-off-by: SignpostMarv --- .../Shared/Api/Implementation/LSL_Api.cs | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index 81632677a4..ca240f532e 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -1946,10 +1946,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api else{ LSL_List parcelID = new LSL_List(ScriptBaseClass.PARCEL_DETAILS_ID); Vector3 objectPos = m_host.ParentGroup.RootPart.AbsolutePosition; - bool sameParcel = - llGetParcelDetails(new LSL_Vector(pos.x, pos.y, pos.z), parcelID).Data[0] == - llGetParcelDetails(pos, parcelID).Data[0] - ; + string parcelA = llGetParcelDetails(new LSL_Vector(objectPos.X, objectPos.X, objectPos.X), parcelID).Data[0].ToString(); + string parcelB = llGetParcelDetails(pos, parcelID).Data[0].ToString(); + bool sameParcel = parcelA == parcelB; + int objectPrimCount = m_host.ParentGroup.PrimCount; + LSL_Integer destParcelPrimCount = llGetParcelPrimCount(pos, ScriptBaseClass.PARCEL_COUNT_TOTAL, 0); + LSL_Integer max = llGetParcelMaxPrims(pos, 0); if ( llGetStatus((int)PrimFlags.Physics) == 1 || // return FALSE if physical. m_host.ParentGroup.IsAttachment || // return FALSE if attachment @@ -1964,7 +1966,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api // this check will only work if pos is within the region bounds. ( !sameParcel && // if it's moving within the same parcel we do not need to check if the destination parcel will exceed capacity if the object is moved. - (llGetParcelPrimCount(pos, ScriptBaseClass.PARCEL_COUNT_TOTAL, 0) + m_host.ParentGroup.PrimCount) > llGetParcelMaxPrims(pos, 0) + (destParcelPrimCount + objectPrimCount) > max ) // END RELIANCE ON WORK-AROUND ){ From 423101b425d84e98f88b9c438559fc3321297c51 Mon Sep 17 00:00:00 2001 From: SignpostMarv Date: Sat, 14 Jul 2012 01:14:00 +0100 Subject: [PATCH 544/547] acting on feedback from justincc --- .../Shared/Api/Implementation/LSL_Api.cs | 85 ++++++++++--------- 1 file changed, 44 insertions(+), 41 deletions(-) diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index ca240f532e..cfcbae38f7 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -421,15 +421,20 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api return LSL_Vector.Norm(v); } - public LSL_Float llVecDist(LSL_Vector a, LSL_Vector b) + private double vecDist(LSL_Vector a, LSL_Vector b) { - m_host.AddScriptLPS(1); double dx = a.x - b.x; double dy = a.y - b.y; double dz = a.z - b.z; return Math.Sqrt(dx * dx + dy * dy + dz * dz); } + public LSL_Float llVecDist(LSL_Vector a, LSL_Vector b) + { + m_host.AddScriptLPS(1); + return vecDist(a, b); + } + //Now we start getting into quaternions which means sin/cos, matrices and vectors. ckrinke /// @@ -1242,6 +1247,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api } } + private bool isPhysical(){ + return ((m_host.GetEffectiveObjectFlags() & (uint)PrimFlags.Physics) == (uint)PrimFlags.Physics); + } + public LSL_Integer llGetStatus(int status) { m_host.AddScriptLPS(1); @@ -1249,11 +1258,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api switch (status) { case ScriptBaseClass.STATUS_PHYSICS: - if ((m_host.GetEffectiveObjectFlags() & (uint)PrimFlags.Physics) == (uint)PrimFlags.Physics) - { - return 1; - } - return 0; + return isPhysical() ? 1 : 0; case ScriptBaseClass.STATUS_PHANTOM: if ((m_host.GetEffectiveObjectFlags() & (uint)PrimFlags.Phantom) == (uint)PrimFlags.Phantom) @@ -1943,42 +1948,40 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api return 0; } // END WORK AROUND - else{ - LSL_List parcelID = new LSL_List(ScriptBaseClass.PARCEL_DETAILS_ID); - Vector3 objectPos = m_host.ParentGroup.RootPart.AbsolutePosition; - string parcelA = llGetParcelDetails(new LSL_Vector(objectPos.X, objectPos.X, objectPos.X), parcelID).Data[0].ToString(); - string parcelB = llGetParcelDetails(pos, parcelID).Data[0].ToString(); - bool sameParcel = parcelA == parcelB; - int objectPrimCount = m_host.ParentGroup.PrimCount; - LSL_Integer destParcelPrimCount = llGetParcelPrimCount(pos, ScriptBaseClass.PARCEL_COUNT_TOTAL, 0); - LSL_Integer max = llGetParcelMaxPrims(pos, 0); - if ( - llGetStatus((int)PrimFlags.Physics) == 1 || // return FALSE if physical. - m_host.ParentGroup.IsAttachment || // return FALSE if attachment - ( - pos.x < -10.0 || // return FALSE if more than 10 meters into a west-adjacent region. - pos.x > (Constants.RegionSize + 10) || // return FALSE if more than 10 meters into a east-adjacent region. - pos.y < -10.0 || // return FALSE if more than 10 meters into a south-adjacent region. - pos.y > (Constants.RegionSize + 10) || // return FALSE if more than 10 meters into a north-adjacent region. - pos.z > 4096 // return FALSE if altitude than 4096m - ) || - // BEGIN RELIANCE ON WORK AROUND - // this check will only work if pos is within the region bounds. - ( - !sameParcel && // if it's moving within the same parcel we do not need to check if the destination parcel will exceed capacity if the object is moved. - (destParcelPrimCount + objectPrimCount) > max - ) - // END RELIANCE ON WORK-AROUND - ){ - return 0; - } - - SetPos(m_host.ParentGroup.RootPart, pos, false); - - return llVecDist(pos, llGetRootPosition()) <= 0.1 ? 1 : 0; + else if ( // this is not part of the workaround if-block because it's not related to the workaround. + isPhysical() || + m_host.ParentGroup.IsAttachment || // return FALSE if attachment + ( + pos.x < -10.0 || // return FALSE if more than 10 meters into a west-adjacent region. + pos.x > (Constants.RegionSize + 10) || // return FALSE if more than 10 meters into a east-adjacent region. + pos.y < -10.0 || // return FALSE if more than 10 meters into a south-adjacent region. + pos.y > (Constants.RegionSize + 10) || // return FALSE if more than 10 meters into a north-adjacent region. + pos.z > 4096 // return FALSE if altitude than 4096m + ) + ) + { + return 0; } - return 0; + // if we reach this point, then the object is not physical, it's not an attachment, and the destination is within the valid range. + // this could possibly be done in the above else-if block, but we're doing the check here to keep the code easier to read. + + Vector3 objectPos = m_host.ParentGroup.RootPart.AbsolutePosition; + LandData here = World.GetLandData((float)objectPos.X, (float)objectPos.Y); + LandData there = World.GetLandData((float)pos.x, (float)pos.y); + + // we're only checking prim limits if it's moving to a different parcel under the assumption that if the object got onto the parcel without exceeding the prim limits. + + bool sameParcel = here.GlobalID == there.GlobalID; + + if (!sameParcel && !World.Permissions.CanRezObject(m_host.ParentGroup.PrimCount, m_host.ParentGroup.OwnerID, new Vector3((float)pos.x, (float)pos.y, (float)pos.z))) + { + return 0; + } + + SetPos(m_host.ParentGroup.RootPart, pos, false); + + return vecDist(pos, llGetRootPosition()) <= 0.1 ? 1 : 0; } // Capped movemment if distance > 10m (http://wiki.secondlife.com/wiki/LlSetPos) From 84b7ae25738c15737e70a680d1992cfbeb6cc806 Mon Sep 17 00:00:00 2001 From: SignpostMarv Date: Sat, 14 Jul 2012 01:41:51 +0100 Subject: [PATCH 545/547] acting on feedback from justincc --- .../Shared/Api/Implementation/LSL_Api.cs | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index cfcbae38f7..f88338d3c6 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -421,7 +421,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api return LSL_Vector.Norm(v); } - private double vecDist(LSL_Vector a, LSL_Vector b) + private double VecDist(LSL_Vector a, LSL_Vector b) { double dx = a.x - b.x; double dy = a.y - b.y; @@ -432,7 +432,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public LSL_Float llVecDist(LSL_Vector a, LSL_Vector b) { m_host.AddScriptLPS(1); - return vecDist(a, b); + return VecDist(a, b); } //Now we start getting into quaternions which means sin/cos, matrices and vectors. ckrinke @@ -1247,7 +1247,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api } } - private bool isPhysical(){ + private bool IsPhysical() + { return ((m_host.GetEffectiveObjectFlags() & (uint)PrimFlags.Physics) == (uint)PrimFlags.Physics); } @@ -1258,7 +1259,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api switch (status) { case ScriptBaseClass.STATUS_PHYSICS: - return isPhysical() ? 1 : 0; + return IsPhysical() ? 1 : 0; case ScriptBaseClass.STATUS_PHANTOM: if ((m_host.GetEffectiveObjectFlags() & (uint)PrimFlags.Phantom) == (uint)PrimFlags.Phantom) @@ -1949,7 +1950,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api } // END WORK AROUND else if ( // this is not part of the workaround if-block because it's not related to the workaround. - isPhysical() || + IsPhysical() || m_host.ParentGroup.IsAttachment || // return FALSE if attachment ( pos.x < -10.0 || // return FALSE if more than 10 meters into a west-adjacent region. @@ -1981,7 +1982,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api SetPos(m_host.ParentGroup.RootPart, pos, false); - return vecDist(pos, llGetRootPosition()) <= 0.1 ? 1 : 0; + return VecDist(pos, llGetRootPosition()) <= 0.1 ? 1 : 0; } // Capped movemment if distance > 10m (http://wiki.secondlife.com/wiki/LlSetPos) From 5d3723a47f7ddb32964055561ecf2a601f6b19f2 Mon Sep 17 00:00:00 2001 From: dahlia Date: Fri, 13 Jul 2012 21:22:15 -0700 Subject: [PATCH 546/547] update PrimMesher.cs to dll version r72 which fixes some path errors in sliced linear prims. Addresses Mantis #6085 --- OpenSim/Region/Physics/Meshing/PrimMesher.cs | 326 +++++++++++-------- 1 file changed, 183 insertions(+), 143 deletions(-) diff --git a/OpenSim/Region/Physics/Meshing/PrimMesher.cs b/OpenSim/Region/Physics/Meshing/PrimMesher.cs index 53022ad6b4..4049ee1598 100644 --- a/OpenSim/Region/Physics/Meshing/PrimMesher.cs +++ b/OpenSim/Region/Physics/Meshing/PrimMesher.cs @@ -236,6 +236,13 @@ namespace PrimMesher this.U = u; this.V = v; } + + public UVCoord Flip() + { + this.U = 1.0f - this.U; + this.V = 1.0f - this.V; + return this; + } } public struct Face @@ -603,40 +610,40 @@ namespace PrimMesher /// /// generates a profile for extrusion /// - internal class Profile + public class Profile { private const float twoPi = 2.0f * (float)Math.PI; - internal string errorMessage = null; + public string errorMessage = null; - internal List coords; - internal List faces; - internal List vertexNormals; - internal List us; - internal List faceUVs; - internal List faceNumbers; + public List coords; + public List faces; + public List vertexNormals; + public List us; + public List faceUVs; + public List faceNumbers; // use these for making individual meshes for each prim face - internal List outerCoordIndices = null; - internal List hollowCoordIndices = null; - internal List cut1CoordIndices = null; - internal List cut2CoordIndices = null; + public List outerCoordIndices = null; + public List hollowCoordIndices = null; + public List cut1CoordIndices = null; + public List cut2CoordIndices = null; - internal Coord faceNormal = new Coord(0.0f, 0.0f, 1.0f); - internal Coord cutNormal1 = new Coord(); - internal Coord cutNormal2 = new Coord(); + public Coord faceNormal = new Coord(0.0f, 0.0f, 1.0f); + public Coord cutNormal1 = new Coord(); + public Coord cutNormal2 = new Coord(); - internal int numOuterVerts = 0; - internal int numHollowVerts = 0; + public int numOuterVerts = 0; + public int numHollowVerts = 0; - internal int outerFaceNumber = -1; - internal int hollowFaceNumber = -1; + public int outerFaceNumber = -1; + public int hollowFaceNumber = -1; - internal bool calcVertexNormals = false; - internal int bottomFaceNumber = 0; - internal int numPrimFaces = 0; + public bool calcVertexNormals = false; + public int bottomFaceNumber = 0; + public int numPrimFaces = 0; - internal Profile() + public Profile() { this.coords = new List(); this.faces = new List(); @@ -646,7 +653,7 @@ namespace PrimMesher this.faceNumbers = new List(); } - internal Profile(int sides, float profileStart, float profileEnd, float hollow, int hollowSides, bool createFaces, bool calcVertexNormals) + public Profile(int sides, float profileStart, float profileEnd, float hollow, int hollowSides, bool createFaces, bool calcVertexNormals) { this.calcVertexNormals = calcVertexNormals; this.coords = new List(); @@ -657,7 +664,6 @@ namespace PrimMesher this.faceNumbers = new List(); Coord center = new Coord(0.0f, 0.0f, 0.0f); - //bool hasCenter = false; List hollowCoords = new List(); List hollowNormals = new List(); @@ -682,8 +688,8 @@ namespace PrimMesher float yScale = 0.5f; if (sides == 4) // corners of a square are sqrt(2) from center { - xScale = 0.707f; - yScale = 0.707f; + xScale = 0.707107f; + yScale = 0.707107f; } float startAngle = profileStart * twoPi; @@ -724,7 +730,6 @@ namespace PrimMesher else if (!simpleFace) { this.coords.Add(center); - //hasCenter = true; if (this.calcVertexNormals) this.vertexNormals.Add(new Coord(0.0f, 0.0f, 1.0f)); this.us.Add(0.0f); @@ -752,7 +757,10 @@ namespace PrimMesher else hollowNormals.Add(new Coord(-angle.X, -angle.Y, 0.0f)); - hollowUs.Add(angle.angle * hollow); + if (hollowSides == 4) + hollowUs.Add(angle.angle * hollow * 0.707107f); + else + hollowUs.Add(angle.angle * hollow); } } } @@ -829,9 +837,6 @@ namespace PrimMesher if (createFaces) { - //int numOuterVerts = this.coords.Count; - //numOuterVerts = this.coords.Count; - //int numHollowVerts = hollowCoords.Count; int numTotalVerts = this.numOuterVerts + this.numHollowVerts; if (this.numOuterVerts == this.numHollowVerts) @@ -993,11 +998,7 @@ namespace PrimMesher if (startVert > 0) this.faceNumbers.Add(-1); for (int i = 0; i < this.numOuterVerts - 1; i++) - //this.faceNumbers.Add(sides < 5 ? faceNum++ : faceNum); - this.faceNumbers.Add(sides < 5 && i < sides ? faceNum++ : faceNum); - - //if (!hasHollow && !hasProfileCut) - // this.bottomFaceNumber = faceNum++; + this.faceNumbers.Add(sides < 5 && i <= sides ? faceNum++ : faceNum); this.faceNumbers.Add(hasProfileCut ? -1 : faceNum++); @@ -1014,8 +1015,7 @@ namespace PrimMesher this.hollowFaceNumber = faceNum++; } - //if (hasProfileCut || hasHollow) - // this.bottomFaceNumber = faceNum++; + this.bottomFaceNumber = faceNum++; if (hasHollow && hasProfileCut) @@ -1030,19 +1030,19 @@ namespace PrimMesher } - internal void MakeFaceUVs() + public void MakeFaceUVs() { this.faceUVs = new List(); foreach (Coord c in this.coords) - this.faceUVs.Add(new UVCoord(0.5f + c.X, 0.5f - c.Y)); + this.faceUVs.Add(new UVCoord(1.0f - (0.5f + c.X), 1.0f - (0.5f - c.Y))); } - internal Profile Copy() + public Profile Copy() { return this.Copy(true); } - internal Profile Copy(bool needFaces) + public Profile Copy(bool needFaces) { Profile copy = new Profile(); @@ -1071,12 +1071,12 @@ namespace PrimMesher return copy; } - internal void AddPos(Coord v) + public void AddPos(Coord v) { this.AddPos(v.X, v.Y, v.Z); } - internal void AddPos(float x, float y, float z) + public void AddPos(float x, float y, float z) { int i; int numVerts = this.coords.Count; @@ -1092,7 +1092,7 @@ namespace PrimMesher } } - internal void AddRot(Quat q) + public void AddRot(Quat q) { int i; int numVerts = this.coords.Count; @@ -1113,7 +1113,7 @@ namespace PrimMesher } } - internal void Scale(float x, float y) + public void Scale(float x, float y) { int i; int numVerts = this.coords.Count; @@ -1131,7 +1131,7 @@ namespace PrimMesher /// /// Changes order of the vertex indices and negates the center vertex normal. Does not alter vertex normals of radial vertices /// - internal void FlipNormals() + public void FlipNormals() { int i; int numFaces = this.faces.Count; @@ -1171,7 +1171,7 @@ namespace PrimMesher } } - internal void AddValue2FaceVertexIndices(int num) + public void AddValue2FaceVertexIndices(int num) { int numFaces = this.faces.Count; Face tmpFace; @@ -1186,7 +1186,7 @@ namespace PrimMesher } } - internal void AddValue2FaceNormalIndices(int num) + public void AddValue2FaceNormalIndices(int num) { if (this.calcVertexNormals) { @@ -1204,7 +1204,7 @@ namespace PrimMesher } } - internal void DumpRaw(String path, String name, String title) + public void DumpRaw(String path, String name, String title) { if (path == null) return; @@ -1261,6 +1261,15 @@ namespace PrimMesher public void Create(PathType pathType, int steps) { + if (this.taperX > 0.999f) + this.taperX = 0.999f; + if (this.taperX < -0.999f) + this.taperX = -0.999f; + if (this.taperY > 0.999f) + this.taperY = 0.999f; + if (this.taperY < -0.999f) + this.taperY = -0.999f; + if (pathType == PathType.Linear || pathType == PathType.Flexible) { int step = 0; @@ -1273,12 +1282,12 @@ namespace PrimMesher float start = -0.5f; float stepSize = length / (float)steps; - float percentOfPathMultiplier = stepSize; - float xOffset = 0.0f; - float yOffset = 0.0f; + float percentOfPathMultiplier = stepSize * 0.999999f; + float xOffset = this.topShearX * this.pathCutBegin; + float yOffset = this.topShearY * this.pathCutBegin; float zOffset = start; - float xOffsetStepIncrement = this.topShearX / steps; - float yOffsetStepIncrement = this.topShearY / steps; + float xOffsetStepIncrement = this.topShearX * length / steps; + float yOffsetStepIncrement = this.topShearY * length / steps; float percentOfPath = this.pathCutBegin; zOffset += percentOfPath; @@ -1573,13 +1582,6 @@ namespace PrimMesher this.hollow = 0.99f; if (hollow < 0.0f) this.hollow = 0.0f; - - //if (sphereMode) - // this.hasProfileCut = this.profileEnd - this.profileStart < 0.4999f; - //else - // //this.hasProfileCut = (this.profileStart > 0.0f || this.profileEnd < 1.0f); - // this.hasProfileCut = this.profileEnd - this.profileStart < 0.9999f; - //this.hasHollow = (this.hollow > 0.001f); } /// @@ -1614,10 +1616,9 @@ namespace PrimMesher steps = (int)(steps * 4.5 * length); } - if (sphereMode) + if (this.sphereMode) this.hasProfileCut = this.profileEnd - this.profileStart < 0.4999f; else - //this.hasProfileCut = (this.profileStart > 0.0f || this.profileEnd < 1.0f); this.hasProfileCut = this.profileEnd - this.profileStart < 0.9999f; this.hasHollow = (this.hollow > 0.001f); @@ -1630,6 +1631,22 @@ namespace PrimMesher float hollow = this.hollow; + if (pathType == PathType.Circular) + { + needEndFaces = false; + if (this.pathCutBegin != 0.0f || this.pathCutEnd != 1.0f) + needEndFaces = true; + else if (this.taperX != 0.0f || this.taperY != 0.0f) + needEndFaces = true; + else if (this.skew != 0.0f) + needEndFaces = true; + else if (twistTotal != 0.0f) + needEndFaces = true; + else if (this.radius != 0.0f) + needEndFaces = true; + } + else needEndFaces = true; + // sanity checks float initialProfileRot = 0.0f; if (pathType == PathType.Circular) @@ -1689,20 +1706,13 @@ namespace PrimMesher this.numPrimFaces = profile.numPrimFaces; - //profileOuterFaceNumber = profile.faceNumbers[0]; - //if (!needEndFaces) - // profileOuterFaceNumber--; - //profileOuterFaceNumber = needEndFaces ? 1 : 0; - - - //if (hasHollow) - //{ - // if (needEndFaces) - // profileHollowFaceNumber = profile.faceNumbers[profile.numOuterVerts + 1]; - // else - // profileHollowFaceNumber = profile.faceNumbers[profile.numOuterVerts] - 1; - //} - + int cut1FaceNumber = profile.bottomFaceNumber + 1; + int cut2FaceNumber = cut1FaceNumber + 1; + if (!needEndFaces) + { + cut1FaceNumber -= 2; + cut2FaceNumber -= 2; + } profileOuterFaceNumber = profile.outerFaceNumber; if (!needEndFaces) @@ -1732,7 +1742,8 @@ namespace PrimMesher Coord lastCutNormal1 = new Coord(); Coord lastCutNormal2 = new Coord(); - float lastV = 1.0f; + float thisV = 0.0f; + float lastV = 0.0f; Path path = new Path(); path.twistBegin = twistBegin; @@ -1754,23 +1765,6 @@ namespace PrimMesher path.Create(pathType, steps); - - if (pathType == PathType.Circular) - { - needEndFaces = false; - if (this.pathCutBegin != 0.0f || this.pathCutEnd != 1.0f) - needEndFaces = true; - else if (this.taperX != 0.0f || this.taperY != 0.0f) - needEndFaces = true; - else if (this.skew != 0.0f) - needEndFaces = true; - else if (twistTotal != 0.0f) - needEndFaces = true; - else if (this.radius != 0.0f) - needEndFaces = true; - } - else needEndFaces = true; - for (int nodeIndex = 0; nodeIndex < path.pathNodes.Count; nodeIndex++) { PathNode node = path.pathNodes[nodeIndex]; @@ -1784,7 +1778,7 @@ namespace PrimMesher { newLayer.FlipNormals(); - // add the top faces to the viewerFaces list here + // add the bottom faces to the viewerFaces list if (this.viewerMode) { Coord faceNormal = newLayer.faceNormal; @@ -1811,6 +1805,13 @@ namespace PrimMesher newViewerFace.uv2 = newLayer.faceUVs[face.v2]; newViewerFace.uv3 = newLayer.faceUVs[face.v3]; + if (pathType == PathType.Linear) + { + newViewerFace.uv1.Flip(); + newViewerFace.uv2.Flip(); + newViewerFace.uv3.Flip(); + } + this.viewerFaces.Add(newViewerFace); } } @@ -1835,7 +1836,10 @@ namespace PrimMesher // fill faces between layers int numVerts = newLayer.coords.Count; - Face newFace = new Face(); + Face newFace1 = new Face(); + Face newFace2 = new Face(); + + thisV = 1.0f - node.percentOfPath; if (nodeIndex > 0) { @@ -1853,14 +1857,23 @@ namespace PrimMesher int whichVert = i - startVert; - newFace.v1 = i; - newFace.v2 = i - numVerts; - newFace.v3 = iNext - numVerts; - this.faces.Add(newFace); + newFace1.v1 = i; + newFace1.v2 = i - numVerts; + newFace1.v3 = iNext; - newFace.v2 = iNext - numVerts; - newFace.v3 = iNext; - this.faces.Add(newFace); + newFace1.n1 = newFace1.v1; + newFace1.n2 = newFace1.v2; + newFace1.n3 = newFace1.v3; + this.faces.Add(newFace1); + + newFace2.v1 = iNext; + newFace2.v2 = i - numVerts; + newFace2.v3 = iNext - numVerts; + + newFace2.n1 = newFace2.v1; + newFace2.n2 = newFace2.v2; + newFace2.n3 = newFace2.v3; + this.faces.Add(newFace2); if (this.viewerMode) { @@ -1873,10 +1886,16 @@ namespace PrimMesher ViewerFace newViewerFace1 = new ViewerFace(primFaceNum); ViewerFace newViewerFace2 = new ViewerFace(primFaceNum); - float u1 = newLayer.us[whichVert]; + int uIndex = whichVert; + if (!hasHollow && sides > 4 && uIndex < newLayer.us.Count - 1) + { + uIndex++; + } + + float u1 = newLayer.us[uIndex]; float u2 = 1.0f; - if (whichVert < newLayer.us.Count - 1) - u2 = newLayer.us[whichVert + 1]; + if (uIndex < (int)newLayer.us.Count - 1) + u2 = newLayer.us[uIndex + 1]; if (whichVert == cut1Vert || whichVert == cut2Vert) { @@ -1894,13 +1913,22 @@ namespace PrimMesher u1 -= (int)u1; if (u2 < 0.1f) u2 = 1.0f; - //this.profileOuterFaceNumber = primFaceNum; } - else if (whichVert > profile.coords.Count - profile.numHollowVerts - 1) + } + + if (this.sphereMode) + { + if (whichVert != cut1Vert && whichVert != cut2Vert) { - u1 *= 2.0f; - u2 *= 2.0f; - //this.profileHollowFaceNumber = primFaceNum; + u1 = u1 * 2.0f - 1.0f; + u2 = u2 * 2.0f - 1.0f; + + if (whichVert >= newLayer.numOuterVerts) + { + u1 -= hollow; + u2 -= hollow; + } + } } @@ -1908,37 +1936,39 @@ namespace PrimMesher newViewerFace1.uv2.U = u1; newViewerFace1.uv3.U = u2; - newViewerFace1.uv1.V = 1.0f - node.percentOfPath; + newViewerFace1.uv1.V = thisV; newViewerFace1.uv2.V = lastV; - newViewerFace1.uv3.V = lastV; + newViewerFace1.uv3.V = thisV; - newViewerFace2.uv1.U = u1; - newViewerFace2.uv2.U = u2; + newViewerFace2.uv1.U = u2; + newViewerFace2.uv2.U = u1; newViewerFace2.uv3.U = u2; - newViewerFace2.uv1.V = 1.0f - node.percentOfPath; + newViewerFace2.uv1.V = thisV; newViewerFace2.uv2.V = lastV; - newViewerFace2.uv3.V = 1.0f - node.percentOfPath; + newViewerFace2.uv3.V = lastV; - newViewerFace1.v1 = this.coords[i]; - newViewerFace1.v2 = this.coords[i - numVerts]; - newViewerFace1.v3 = this.coords[iNext - numVerts]; + newViewerFace1.v1 = this.coords[newFace1.v1]; + newViewerFace1.v2 = this.coords[newFace1.v2]; + newViewerFace1.v3 = this.coords[newFace1.v3]; - newViewerFace2.v1 = this.coords[i]; - newViewerFace2.v2 = this.coords[iNext - numVerts]; - newViewerFace2.v3 = this.coords[iNext]; + newViewerFace2.v1 = this.coords[newFace2.v1]; + newViewerFace2.v2 = this.coords[newFace2.v2]; + newViewerFace2.v3 = this.coords[newFace2.v3]; - newViewerFace1.coordIndex1 = i; - newViewerFace1.coordIndex2 = i - numVerts; - newViewerFace1.coordIndex3 = iNext - numVerts; + newViewerFace1.coordIndex1 = newFace1.v1; + newViewerFace1.coordIndex2 = newFace1.v2; + newViewerFace1.coordIndex3 = newFace1.v3; - newViewerFace2.coordIndex1 = i; - newViewerFace2.coordIndex2 = iNext - numVerts; - newViewerFace2.coordIndex3 = iNext; + newViewerFace2.coordIndex1 = newFace2.v1; + newViewerFace2.coordIndex2 = newFace2.v2; + newViewerFace2.coordIndex3 = newFace2.v3; // profile cut faces if (whichVert == cut1Vert) { + newViewerFace1.primFaceNumber = cut1FaceNumber; + newViewerFace2.primFaceNumber = cut1FaceNumber; newViewerFace1.n1 = newLayer.cutNormal1; newViewerFace1.n2 = newViewerFace1.n3 = lastCutNormal1; @@ -1947,10 +1977,14 @@ namespace PrimMesher } else if (whichVert == cut2Vert) { + newViewerFace1.primFaceNumber = cut2FaceNumber; + newViewerFace2.primFaceNumber = cut2FaceNumber; newViewerFace1.n1 = newLayer.cutNormal2; - newViewerFace1.n2 = newViewerFace1.n3 = lastCutNormal2; + newViewerFace1.n2 = lastCutNormal2; + newViewerFace1.n3 = lastCutNormal2; - newViewerFace2.n1 = newViewerFace2.n3 = newLayer.cutNormal2; + newViewerFace2.n1 = newLayer.cutNormal2; + newViewerFace2.n3 = newLayer.cutNormal2; newViewerFace2.n2 = lastCutNormal2; } @@ -1963,13 +1997,13 @@ namespace PrimMesher } else { - newViewerFace1.n1 = this.normals[i]; - newViewerFace1.n2 = this.normals[i - numVerts]; - newViewerFace1.n3 = this.normals[iNext - numVerts]; + newViewerFace1.n1 = this.normals[newFace1.n1]; + newViewerFace1.n2 = this.normals[newFace1.n2]; + newViewerFace1.n3 = this.normals[newFace1.n3]; - newViewerFace2.n1 = this.normals[i]; - newViewerFace2.n2 = this.normals[iNext - numVerts]; - newViewerFace2.n3 = this.normals[iNext]; + newViewerFace2.n1 = this.normals[newFace2.n1]; + newViewerFace2.n2 = this.normals[newFace2.n2]; + newViewerFace2.n3 = this.normals[newFace2.n3]; } } @@ -1982,14 +2016,13 @@ namespace PrimMesher lastCutNormal1 = newLayer.cutNormal1; lastCutNormal2 = newLayer.cutNormal2; - lastV = 1.0f - node.percentOfPath; + lastV = thisV; if (needEndFaces && nodeIndex == path.pathNodes.Count - 1 && viewerMode) { // add the top faces to the viewerFaces list here Coord faceNormal = newLayer.faceNormal; - ViewerFace newViewerFace = new ViewerFace(); - newViewerFace.primFaceNumber = 0; + ViewerFace newViewerFace = new ViewerFace(0); int numFaces = newLayer.faces.Count; List faces = newLayer.faces; @@ -2012,6 +2045,13 @@ namespace PrimMesher newViewerFace.uv2 = newLayer.faceUVs[face.v2 - coordsLen]; newViewerFace.uv3 = newLayer.faceUVs[face.v3 - coordsLen]; + if (pathType == PathType.Linear) + { + newViewerFace.uv1.Flip(); + newViewerFace.uv2.Flip(); + newViewerFace.uv3.Flip(); + } + this.viewerFaces.Add(newViewerFace); } } From ee7478fa16b95352db22e0eba5c4cb90d47dabd5 Mon Sep 17 00:00:00 2001 From: SignpostMarv Date: Mon, 16 Jul 2012 14:47:03 +0100 Subject: [PATCH 547/547] sending more user-friendly messages to the script error window rather than the thrown exceptions. Signed-off-by: Melanie --- .../Shared/Api/Implementation/OSSL_Api.cs | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs index 3654106427..413739776f 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs @@ -1664,9 +1664,22 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api CheckThreatLevel(ThreatLevel.Low, "osMessageObject"); m_host.AddScriptLPS(1); + UUID objUUID; + if (!UUID.TryParse(objectUUID, out objUUID)) // prior to patching, a thrown exception regarding invalid GUID format would be shouted instead. + { + OSSLShoutError("osMessageObject() cannot send messages to objects with invalid UUIDs"); + return; + } + object[] resobj = new object[] { new LSL_Types.LSLString(m_host.UUID.ToString()), new LSL_Types.LSLString(message) }; - SceneObjectPart sceneOP = World.GetSceneObjectPart(new UUID(objectUUID)); + SceneObjectPart sceneOP = World.GetSceneObjectPart(objUUID); + + if (sceneOP == null) // prior to patching, PostObjectEvent() would cause a throw exception to be shouted instead. + { + OSSLShoutError("osMessageObject() cannot send message to " + objUUID.ToString() + ", object was not found in scene."); + return; + } m_ScriptEngine.PostObjectEvent( sceneOP.LocalId, new EventParams(